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',
|
||||
'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 { Container } from '../../components/Container'
|
||||
import { Eyebrow, SectionHeader, P, CT, CP } from '../../components/Texts'
|
||||
|
||||
const items = [
|
||||
{
|
||||
title: 'FungiStor',
|
||||
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.',
|
||||
video: '/videos/fungistor.mp4',
|
||||
},
|
||||
{
|
||||
title: 'HeroDB',
|
||||
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.',
|
||||
video: '/videos/herodb.mp4',
|
||||
},
|
||||
{
|
||||
title: 'MOS Sandboxes',
|
||||
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.',
|
||||
video: '/videos/sandbox.mp4',
|
||||
},
|
||||
{
|
||||
title: 'Mycelium Mesh',
|
||||
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.',
|
||||
video: '/videos/mesh.mp4',
|
||||
},
|
||||
{
|
||||
title: 'Deterministic Deployment',
|
||||
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.',
|
||||
video: '/videos/deterministic.mp4',
|
||||
},
|
||||
{
|
||||
title: 'Agent Coordination',
|
||||
subtitle: 'Sovereign Workflow Management',
|
||||
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 }}
|
||||
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
|
||||
</h2>
|
||||
<p className="mt-6 text-lg text-gray-400">
|
||||
</SectionHeader>
|
||||
<P className="mt-6" color="lightSecondary">
|
||||
A complete infrastructure for building and deploying AI agents with enterprise-grade security and performance.
|
||||
</p>
|
||||
</P>
|
||||
</motion.div>
|
||||
|
||||
<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 }}
|
||||
viewport={{ once: true }}
|
||||
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>
|
||||
<p className="mt-2 text-sm font-medium text-cyan-500">{item.subtitle}</p>
|
||||
<p className="mt-3 text-sm text-gray-400">{item.description}</p>
|
||||
<video
|
||||
src={item.video}
|
||||
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>
|
||||
))}
|
||||
</div>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
'use client'
|
||||
|
||||
import React, { useRef } from 'react'
|
||||
import { useRef } from 'react'
|
||||
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'
|
||||
|
||||
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"
|
||||
>
|
||||
<feature.icon className="h-8 w-8 mb-4 text-white" />
|
||||
<FeatureTitle as="span" className="font-semibold" color="light">{feature.name}</FeatureTitle>
|
||||
<FeatureDescription className="mt-2 text-sm" color="light">{feature.description}</FeatureDescription>
|
||||
<CT as="span" className="font-semibold text-left" color="light">{feature.name}</CT>
|
||||
<CP className="mt-2 text-sm text-left" color="light">{feature.description}</CP>
|
||||
</motion.li>
|
||||
))}
|
||||
</motion.ul>
|
||||
|
||||
@@ -5,7 +5,7 @@ import { useResponsiveCarousel } from '@/hooks/useResponsiveCarousel';
|
||||
import { motion, AnimatePresence } from 'framer-motion'
|
||||
import { wrap } from 'popmotion'
|
||||
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 { FadeIn } from '@/components/FadeIn';
|
||||
|
||||
@@ -139,7 +139,7 @@ export function GallerySection() {
|
||||
{/* 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="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
|
||||
key={active}
|
||||
sequence={[galleryItems[active].text]}
|
||||
@@ -147,7 +147,7 @@ export function GallerySection() {
|
||||
speed={50}
|
||||
repeat={0}
|
||||
/>
|
||||
</P>
|
||||
</CP>
|
||||
<Button href="#" color="cyan" className="text-sm px-4 py-2 lg:text-base whitespace-nowrap">
|
||||
Start
|
||||
</Button>
|
||||
@@ -158,7 +158,7 @@ export function GallerySection() {
|
||||
{/* Text box (Mobile) */}
|
||||
<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">
|
||||
<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
|
||||
key={active}
|
||||
sequence={[galleryItems[active].text]}
|
||||
@@ -166,7 +166,7 @@ export function GallerySection() {
|
||||
speed={50}
|
||||
repeat={0}
|
||||
/>
|
||||
</P>
|
||||
</CP>
|
||||
<Button href="#" color="cyan" className="text-xs px-3 py-1.5 whitespace-nowrap">
|
||||
Start
|
||||
</Button>
|
||||
|
||||
Reference in New Issue
Block a user