feat: add video previews and text components to agent showcase sections
This commit is contained in:
@@ -145,3 +145,6 @@ export const DownloadCardDescription = createTextComponent(
|
|||||||
'dd',
|
'dd',
|
||||||
'text-base/7 leading-normal tracking-normal'
|
'text-base/7 leading-normal tracking-normal'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
export const CT = createTextComponent('span', 'text-lg lg:text-xl font-semibold')
|
||||||
|
export const CP = createTextComponent('p', 'text-sm lg:text-sm leading-[1.525] font-light')
|
||||||
|
|||||||
@@ -1,36 +1,43 @@
|
|||||||
import { motion } from 'framer-motion'
|
import { motion } from 'framer-motion'
|
||||||
import { Container } from '../../components/Container'
|
import { Container } from '../../components/Container'
|
||||||
|
import { Eyebrow, SectionHeader, P, CT, CP } from '../../components/Texts'
|
||||||
|
|
||||||
const items = [
|
const items = [
|
||||||
{
|
{
|
||||||
title: 'FungiStor',
|
title: 'FungiStor',
|
||||||
subtitle: 'Long-Term AI Memory',
|
subtitle: 'Long-Term AI Memory',
|
||||||
description: 'Erasure coding + compression slash storage bloat by up to 10× vs basic replication. Source-encrypted shards are geo-dispersed—lose pieces, rebuild perfectly from a quorum.',
|
description: 'Erasure coding + compression slash storage bloat by up to 10× vs basic replication. Source-encrypted shards are geo-dispersed—lose pieces, rebuild perfectly from a quorum.',
|
||||||
|
video: '/videos/fungistor.mp4',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'HeroDB',
|
title: 'HeroDB',
|
||||||
subtitle: 'Active AI Memory',
|
subtitle: 'Active AI Memory',
|
||||||
description: 'Multimodal vector+keyword retrieval makes RAG feel instant across text, image, audio. Time-aware, policy-guarded context keeps results fresh while access stays governed.',
|
description: 'Multimodal vector+keyword retrieval makes RAG feel instant across text, image, audio. Time-aware, policy-guarded context keeps results fresh while access stays governed.',
|
||||||
|
video: '/videos/herodb.mp4',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'MOS Sandboxes',
|
title: 'MOS Sandboxes',
|
||||||
subtitle: 'Secure Agent Workspaces',
|
subtitle: 'Secure Agent Workspaces',
|
||||||
description: 'Attested, signed workspaces spin up ≈5s worldwide—ready to execute. Hardware isolation and scoped egress: run hard, tear down clean, zero residue.',
|
description: 'Attested, signed workspaces spin up ≈5s worldwide—ready to execute. Hardware isolation and scoped egress: run hard, tear down clean, zero residue.',
|
||||||
|
video: '/videos/sandbox.mp4',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Mycelium Mesh',
|
title: 'Mycelium Mesh',
|
||||||
subtitle: 'Secure Communication Network',
|
subtitle: 'Secure Communication Network',
|
||||||
description: 'A private, public-key fabric with self-healing multi-path routing. Glides through NATs and firewalls—direct, low-latency, no middlemen.',
|
description: 'A private, public-key fabric with self-healing multi-path routing. Glides through NATs and firewalls—direct, low-latency, no middlemen.',
|
||||||
|
video: '/videos/mesh.mp4',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Deterministic Deployment',
|
title: 'Deterministic Deployment',
|
||||||
subtitle: 'Verifiable Code Execution',
|
subtitle: 'Verifiable Code Execution',
|
||||||
description: 'Declare intent, get a hash; remote attestation proves that is what runs. Reproducible builds, signed artifacts, immutable logs—supply chain, sealed.',
|
description: 'Declare intent, get a hash; remote attestation proves that is what runs. Reproducible builds, signed artifacts, immutable logs—supply chain, sealed.',
|
||||||
|
video: '/videos/deterministic.mp4',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Agent Coordination',
|
title: 'Agent Coordination',
|
||||||
subtitle: 'Sovereign Workflow Management',
|
subtitle: 'Sovereign Workflow Management',
|
||||||
description: 'Your private agent conducts swarms of specialists in parallel. Policies fan out work; human checkpoints keep you in command.',
|
description: 'Your private agent conducts swarms of specialists in parallel. Policies fan out work; human checkpoints keep you in command.',
|
||||||
|
video: '/videos/agent.mp4',
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -45,12 +52,13 @@ export function BentoSection() {
|
|||||||
transition={{ duration: 0.8 }}
|
transition={{ duration: 0.8 }}
|
||||||
className="mx-auto max-w-3xl text-center mb-16"
|
className="mx-auto max-w-3xl text-center mb-16"
|
||||||
>
|
>
|
||||||
<h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-50">
|
<Eyebrow color="accent">Components</Eyebrow>
|
||||||
|
<SectionHeader color="light">
|
||||||
Augmented Intelligence Fabric
|
Augmented Intelligence Fabric
|
||||||
</h2>
|
</SectionHeader>
|
||||||
<p className="mt-6 text-lg text-gray-400">
|
<P className="mt-6" color="lightSecondary">
|
||||||
A complete infrastructure for building and deploying AI agents with enterprise-grade security and performance.
|
A complete infrastructure for building and deploying AI agents with enterprise-grade security and performance.
|
||||||
</p>
|
</P>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||||
@@ -61,11 +69,19 @@ export function BentoSection() {
|
|||||||
whileInView={{ opacity: 1, y: 0 }}
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
viewport={{ once: true }}
|
viewport={{ once: true }}
|
||||||
transition={{ duration: 0.5, delay: index * 0.1 }}
|
transition={{ duration: 0.5, delay: index * 0.1 }}
|
||||||
className="rounded-2xl bg-gray-900 border border-gray-800 p-6 hover:border-cyan-500 hover:shadow-lg transition-all duration-300 hover:scale-105"
|
className="rounded-2xl bg-gray-900 border border-gray-800 p-6 hover:border-cyan-500 hover:shadow-lg transition-all duration-300 hover:scale-105 overflow-hidden"
|
||||||
>
|
>
|
||||||
<h3 className="text-xl font-semibold text-gray-50">{item.title}</h3>
|
<video
|
||||||
<p className="mt-2 text-sm font-medium text-cyan-500">{item.subtitle}</p>
|
src={item.video}
|
||||||
<p className="mt-3 text-sm text-gray-400">{item.description}</p>
|
autoPlay
|
||||||
|
loop
|
||||||
|
muted
|
||||||
|
playsInline
|
||||||
|
className="w-full h-40 object-cover mb-4 rounded-lg"
|
||||||
|
/>
|
||||||
|
<p className="text-sm font-medium text-cyan-500">{item.subtitle}</p>
|
||||||
|
<CT as="h3" className="mt-2" color="light">{item.title}</CT>
|
||||||
|
<CP className="mt-3" color="lightSecondary">{item.description}</CP>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import React, { useRef } from 'react'
|
import { useRef } from 'react'
|
||||||
import { motion, useInView } from 'framer-motion'
|
import { motion, useInView } from 'framer-motion'
|
||||||
import { SectionHeader, P, Eyebrow, FeatureTitle, FeatureDescription } from '@/components/Texts'
|
import { SectionHeader, P, Eyebrow, CT, CP } from '@/components/Texts'
|
||||||
import { TbCircleNumber1Filled, TbCircleNumber2Filled, TbCircleNumber3Filled } from 'react-icons/tb'
|
import { TbCircleNumber1Filled, TbCircleNumber2Filled, TbCircleNumber3Filled } from 'react-icons/tb'
|
||||||
|
|
||||||
const features = [
|
const features = [
|
||||||
@@ -61,8 +61,8 @@ export function DeploySection() {
|
|||||||
className="rounded-2xl border border-gray-300 p-8 transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20 bg-white/5 backdrop-blur-md"
|
className="rounded-2xl border border-gray-300 p-8 transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20 bg-white/5 backdrop-blur-md"
|
||||||
>
|
>
|
||||||
<feature.icon className="h-8 w-8 mb-4 text-white" />
|
<feature.icon className="h-8 w-8 mb-4 text-white" />
|
||||||
<FeatureTitle as="span" className="font-semibold" color="light">{feature.name}</FeatureTitle>
|
<CT as="span" className="font-semibold text-left" color="light">{feature.name}</CT>
|
||||||
<FeatureDescription className="mt-2 text-sm" color="light">{feature.description}</FeatureDescription>
|
<CP className="mt-2 text-sm text-left" color="light">{feature.description}</CP>
|
||||||
</motion.li>
|
</motion.li>
|
||||||
))}
|
))}
|
||||||
</motion.ul>
|
</motion.ul>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { useResponsiveCarousel } from '@/hooks/useResponsiveCarousel';
|
|||||||
import { motion, AnimatePresence } from 'framer-motion'
|
import { motion, AnimatePresence } from 'framer-motion'
|
||||||
import { wrap } from 'popmotion'
|
import { wrap } from 'popmotion'
|
||||||
import { Button } from '@/components/Button';
|
import { Button } from '@/components/Button';
|
||||||
import { SectionHeader, P, Eyebrow } from '@/components/Texts';
|
import { SectionHeader, P, Eyebrow, CP } from '@/components/Texts';
|
||||||
import { TypeAnimation } from 'react-type-animation'
|
import { TypeAnimation } from 'react-type-animation'
|
||||||
import { FadeIn } from '@/components/FadeIn';
|
import { FadeIn } from '@/components/FadeIn';
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ export function GallerySection() {
|
|||||||
{/* Foreground pill (Desktop) */}
|
{/* Foreground pill (Desktop) */}
|
||||||
<div className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-[60] hidden md:block">
|
<div className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-[60] hidden md:block">
|
||||||
<div className="flex items-center justify-between w-[1040px] gap-6 rounded-2xl bg-gray-100/80 shadow-[0_8px_40px_rgba(0,0,0,0.15)] px-12 backdrop-blur">
|
<div className="flex items-center justify-between w-[1040px] gap-6 rounded-2xl bg-gray-100/80 shadow-[0_8px_40px_rgba(0,0,0,0.15)] px-12 backdrop-blur">
|
||||||
<P as="h4" className="max-w-[820px] h-[72px] flex items-center" color="dark">
|
<CP as="h4" className="max-w-[820px] h-[72px] flex items-center" color="dark">
|
||||||
<TypeAnimation
|
<TypeAnimation
|
||||||
key={active}
|
key={active}
|
||||||
sequence={[galleryItems[active].text]}
|
sequence={[galleryItems[active].text]}
|
||||||
@@ -147,7 +147,7 @@ export function GallerySection() {
|
|||||||
speed={50}
|
speed={50}
|
||||||
repeat={0}
|
repeat={0}
|
||||||
/>
|
/>
|
||||||
</P>
|
</CP>
|
||||||
<Button href="#" color="cyan" className="text-sm px-4 py-2 lg:text-base whitespace-nowrap">
|
<Button href="#" color="cyan" className="text-sm px-4 py-2 lg:text-base whitespace-nowrap">
|
||||||
Start
|
Start
|
||||||
</Button>
|
</Button>
|
||||||
@@ -158,7 +158,7 @@ export function GallerySection() {
|
|||||||
{/* Text box (Mobile) */}
|
{/* Text box (Mobile) */}
|
||||||
<div className="md:hidden w-full px-4 -mt-12 mb-16">
|
<div className="md:hidden w-full px-4 -mt-12 mb-16">
|
||||||
<div className="flex flex-row items-center justify-between w-full gap-x-4 rounded-2xl bg-gray-100/80 p-4 backdrop-blur-md">
|
<div className="flex flex-row items-center justify-between w-full gap-x-4 rounded-2xl bg-gray-100/80 p-4 backdrop-blur-md">
|
||||||
<P as="h4" className="w-full text-left h-[72px] leading-tight flex items-center" color="dark">
|
<CP as="h4" className="w-full text-left h-[72px] leading-tight flex items-center" color="dark">
|
||||||
<TypeAnimation
|
<TypeAnimation
|
||||||
key={active}
|
key={active}
|
||||||
sequence={[galleryItems[active].text]}
|
sequence={[galleryItems[active].text]}
|
||||||
@@ -166,7 +166,7 @@ export function GallerySection() {
|
|||||||
speed={50}
|
speed={50}
|
||||||
repeat={0}
|
repeat={0}
|
||||||
/>
|
/>
|
||||||
</P>
|
</CP>
|
||||||
<Button href="#" color="cyan" className="text-xs px-3 py-1.5 whitespace-nowrap">
|
<Button href="#" color="cyan" className="text-xs px-3 py-1.5 whitespace-nowrap">
|
||||||
Start
|
Start
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
Reference in New Issue
Block a user