32 Commits

Author SHA1 Message Date
46d02fca47 feat: improve carousel scroll behavior to align fourth card with viewport edge 2025-11-07 13:55:44 +01:00
6779218da6 refactor: redesign ComputeDesign component layout
- Converted feature list to stats-style cards with centered content and icon-first layout
- Replaced vertical Container layout with full-width bordered grid design
- Simplified text content to value/name pairs and updated icons
2025-11-07 13:49:18 +01:00
04b94367a9 feat: improve cloud hosting page layout and spacing
- Restructured grid from 2-column to 5-column layout for better content distribution
- Adjusted spacing and margins throughout for improved visual hierarchy
- Updated heading component from h3 to H4 for consistent typography
2025-11-07 13:28:05 +01:00
cdd6e3104b feat: add horizontal scrolling capabilities section for compute page
- Created new ComputeCapabilitiesNew component with card-based slider showcasing containers, VMs, and native Linux workloads
- Implemented smooth horizontal scroll navigation with arrow controls and snap-to-card behavior
- Added intro card with overview text and navigation controls, followed by capability cards with icons and descriptions
2025-11-07 13:19:13 +01:00
8d1e2f4c7d feat: add mobile navigation menu to header
- Implemented responsive mobile menu using Headless UI Dialog component with hamburger toggle
- Refactored hero sections to use consistent boxed layout with background images and improved spacing
- Standardized button styling across hero components with arrow indicators for secondary actions
2025-11-06 23:43:28 +01:00
0f2f6df299 feat: redesign compute capabilities section with dark theme
- Updated ComputeCapabilities component with dark background, bordered container layout, and improved visual hierarchy
- Replaced icon components with technology-specific images (Kubernetes, VM, Linux)
- Standardized button color scheme across components (gray to white outline variant)
2025-11-06 23:03:36 +01:00
c56f67ae2e refactor: redesign ComputeHero component layout and styling
- Restructured hero section with boxed container and background image positioning
- Added onGetStartedClick callback prop for interactive button handling
- Updated button variants and added tagline about network compatibility
2025-11-06 23:03:25 +01:00
39b748cdac feat: update Explore Docs button color to white 2025-11-06 22:46:49 +01:00
6d186c2304 refactor: remove redundant height constraint from phone frame image 2025-11-06 22:45:10 +01:00
681a7606d5 feat: update outline button styles for cleaner appearance
- Changed background from white/90 to transparent for better visual consistency
- Removed hover state from cyan outline variant to simplify interaction design
2025-11-06 22:45:04 +01:00
0e8de7e7fe refactor: remove unused imports across cloud page components
- Cleaned up unused component imports (CircleBackground, Button, Texts components)
- Removed unused utility function classNames
- Changed button color prop from "dark" to "white" in CallToAction component
2025-11-06 22:42:24 +01:00
3919b72b0c feat: redesign cloud page sections with improved layout and branding
- Added logo assets for featured applications (CryptPad, Gitea, Matrix, Nextcloud, Stalwart, LifeKit)
- Restructured CallToAction, CloudBluePrint, and CloudUseCases components with consistent boxed layouts and border styling
- Enhanced hover effects on architecture layers and use case cards with scale transforms
- Updated button styling and improved responsive grid layouts for better visual hierarchy
2025-11-06 22:39:22 +01:00
f796ec1218 feat: redesign CloudArchitecture section with dark theme and animated icons
- Added animated icon components (MeshNetworkIcon, SovereignComputer, DeterministicOrchestration) to architecture cards
- Updated styling to match dark theme with bordered container layout consistent with HomeHosting section
- Improved card layout with better spacing, hover effects, and visual hierarchy
2025-11-06 22:08:00 +01:00
5af349ad4a refactor: adjust CloudFeaturesLight layout and remove duplicate CloudFeatures section
- Changed vertical alignment from items-start to items-center in desktop grid
- Reduced top margins for better spacing consistency (mt-20→mt-12, mt-16→mt-12)
- Removed redundant CloudFeatures section from CloudPage
2025-11-06 21:49:42 +01:00
6485e1e3ce refactor: remove unused icon components and simplify feature layout
- Removed DeviceUserIcon, DeviceNotificationIcon, and DeviceTouchIcon components that were no longer being used
- Cleaned up unused useId import
- Adjusted spacing in feature titles and tab list padding
2025-11-06 21:48:20 +01:00
e7b33b75c9 feat: add animated transitions to cloud features tabs
- Implemented slide and fade animations when switching between feature tabs using Framer Motion
- Added animated background indicator that follows the selected tab
- Enhanced hover states with scale transitions and outline effects for better interactivity
2025-11-06 21:40:26 +01:00
2e22ed9683 feat: add light-themed cloud features section with boxed layout
- Created CloudFeaturesLight component with desktop/mobile responsive views
- Implemented tabbed interface for feature showcase with hover effects
- Added bordered container layout matching CloudHeroNew design system
2025-11-06 21:39:14 +01:00
15e81cb5cd refactor: adjust CloudHostingNew layout spacing and styling
- Changed image width from full-width to fixed 600px
- Replaced H3 component with native h3 element with responsive text sizing
- Reduced top margin on details section from mt-12 to mt-8
2025-11-06 21:30:17 +01:00
0e6ecedf85 refactor: remove duplicate CloudHosting component from CloudPage 2025-11-06 21:28:42 +01:00
75dd7dfbc5 feat: redesign cloud hero section with new layout and capabilities component
- Updated CloudHeroNew with boxed container layout and improved visual hierarchy
- Added new CloudHostingNew component featuring accordion-style capabilities section with dark theme
- Included new cloud hosting images in webp and png formats
2025-11-06 21:26:48 +01:00
d8ce04252a fix: adjust spacing in bento card grid layout
- Increased gap between cards from 4 to 6 for better visual separation
- Added bottom padding to card content area for improved spacing
2025-11-06 20:50:44 +01:00
c14c0e92d4 chore: remove saved HTML file from images directory 2025-11-06 20:48:43 +01:00
9730129506 feat: add Project Mycelium landing page HTML 2025-11-06 20:39:31 +01:00
8b4e0defb9 refactor: extract bento cards into data-driven component
- Replaced hardcoded card markup with array-based configuration for maintainability
- Added Link components to enable navigation to individual product pages
- Implemented hover animation for improved user interaction
2025-11-06 20:28:13 +01:00
15cc1f70e3 feat: update home page bento grid with custom images
- Replaced placeholder images with custom bento grid assets
- Adjusted image styling and object positioning for better visual presentation
2025-11-06 20:23:35 +01:00
ae3e78f75a refactor: standardize vertical spacing across feature sections
- Reduced py-10 to py-8 for consistent spacing in feature grids and carousels
- Restructured HomeHosting and HomeTab sections with full-width border layout pattern
- Replaced HomeTab card grid with bento-style component showcase layout
2025-11-06 19:46:09 +01:00
7ee6da68fe feat: update homepage layout and color scheme
- Changed background colors from transparent/white to off-white (#fdfdfd) for softer appearance
- Removed HomeBenefits section from homepage to streamline content
- Updated header and hero section backgrounds to use consistent white color
2025-11-06 17:51:49 +01:00
6e2ea7c87c feat: update Explore Docs button color to gray 2025-11-06 15:50:29 +01:00
5f0c749f94 feat: add consistent border styling and improve layout spacing
- Applied border-gray-200 borders to main sections for visual consistency
- Restructured HomeTab component with full-width card grid layout
- Refined spacing and padding across hero, benefits, and hosting sections
2025-11-06 15:45:15 +01:00
b3836062a3 refactor: consolidate cloud and agents page components
- Removed duplicate hero component variations (AgentsHero/AgentsHeroAlt, CloudHero/CloudHeroAlt)
- Deleted unused CloudCTA, CloudGettingStarted, and CloudDesign components
- Cleaned up empty files and legacy page structure
2025-11-06 15:00:37 +01:00
b1c59a9b5a feat: redesign home page with new hero and layout
- Replaced abstract aurora background with hero section featuring image background and call-to-action
- Reorganized page sections with new components (HomeHostingDark, HomeBenefits, StackSectionLight)
- Changed layout background from #FAFAFA to white and removed conditional aurora rendering
2025-11-06 14:06:44 +01:00
db92f1271e refactor: remove unused imports from HomePage component 2025-11-06 03:53:03 +01:00
132 changed files with 1874 additions and 674 deletions

BIN
public/images/agents.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 895 KiB

BIN
public/images/bento-gpu.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
public/images/linux.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
public/images/testpic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
public/images/vm.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View File

@@ -5,7 +5,7 @@ const baseStyles = {
solid: solid:
'inline-flex justify-center rounded-full py-2 px-5 text-base font-semibold transition-colors', 'inline-flex justify-center rounded-full py-2 px-5 text-base font-semibold transition-colors',
outline: outline:
'inline-flex justify-center bg-white/90 hover:bg-[#fafafa] rounded-full border py-[calc(--spacing(2)-1px)] px-[calc(--spacing(5)-1px)] text-base transition-colors', 'inline-flex justify-center bg-transparent rounded-full border py-[calc(--spacing(2)-1px)] px-[calc(--spacing(5)-1px)] text-base transition-colors',
} }
const variantStyles = { const variantStyles = {
@@ -17,7 +17,7 @@ const variantStyles = {
green: 'bg-green-500 text-white hover:bg-green-600', green: 'bg-green-500 text-white hover:bg-green-600',
}, },
outline: { outline: {
cyan: 'border-cyan-500 text-cyan-500 hover:bg-cyan-50', cyan: 'border-cyan-500 text-cyan-500',
gray: 'border-gray-300 text-gray-700 hover:border-cyan-500 active:border-cyan-500', gray: 'border-gray-300 text-gray-700 hover:border-cyan-500 active:border-cyan-500',
white: 'border-gray-300 text-white hover:border-cyan-500 active:border-cyan-500', white: 'border-gray-300 text-white hover:border-cyan-500 active:border-cyan-500',
}, },

View File

@@ -1,10 +1,12 @@
import { useState } from 'react'
import { Link, useLocation } from 'react-router-dom' import { Link, useLocation } from 'react-router-dom'
import { Dropdown } from './ui/Dropdown' import { Dropdown } from './ui/Dropdown'
import { ChevronDownIcon } from '@heroicons/react/20/solid' import { ChevronDownIcon } from '@heroicons/react/20/solid'
import { Container } from './Container' import { Container } from './Container'
import { Button } from './Button' import { Button } from './Button'
import pmyceliumLogo from '../images/logos/logo_1.png' import pmyceliumLogo from '../images/logos/logo_1.png'
import { Dialog } from '@headlessui/react'
import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'
const cloudNavItems = [ const cloudNavItems = [
{ name: 'Cloud', href: '/cloud' }, { name: 'Cloud', href: '/cloud' },
@@ -15,6 +17,7 @@ const cloudNavItems = [
export function Header() { export function Header() {
const location = useLocation() const location = useLocation()
const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
const getCurrentPageName = () => { const getCurrentPageName = () => {
const currentPath = location.pathname; const currentPath = location.pathname;
@@ -26,9 +29,9 @@ export function Header() {
}; };
return ( return (
<header className="bg-transparent"> <header className="bg-white">
<nav> <nav className="border-b border-gray-200">
<Container className="flex bg-transparent justify-between py-4"> <Container className="flex bg-transparent justify-between py-4">
<div className="relative z-10 flex items-center gap-16"> <div className="relative z-10 flex items-center gap-16">
<Link to="/" aria-label="Home"> <Link to="/" aria-label="Home">
<img src={pmyceliumLogo} alt="Mycelium" className="h-8 w-auto" /> <img src={pmyceliumLogo} alt="Mycelium" className="h-8 w-auto" />
@@ -72,9 +75,84 @@ export function Header() {
Get Mycelium Connector Get Mycelium Connector
</Button> </Button>
</div> </div>
<div className="lg:hidden">
<button
type="button"
className="-m-2.5 inline-flex items-center justify-center rounded-md p-2.5 text-gray-700 hover:text-cyan-500 transition-colors"
onClick={() => setMobileMenuOpen(true)}
>
<span className="sr-only">Open main menu</span>
<Bars3Icon className="h-6 w-6" aria-hidden="true" />
</button>
</div>
</div> </div>
</Container> </Container>
</nav> </nav>
<Dialog as="div" className="lg:hidden" open={mobileMenuOpen} onClose={setMobileMenuOpen}>
<div className="fixed inset-0 z-10" />
<Dialog.Panel className="fixed inset-y-0 right-0 z-10 w-full overflow-y-auto bg-white px-6 py-6 sm:max-w-sm sm:ring-1 sm:ring-gray-900/10">
<div className="flex items-center justify-between">
<Link to="#" className="-m-1.5 p-1.5">
<span className="sr-only">Mycelium</span>
<img
className="h-8 w-auto"
src={pmyceliumLogo}
alt=""
/>
</Link>
<button
type="button"
className="-m-2.5 rounded-md p-2.5 text-gray-700 hover:text-cyan-500 transition-colors"
onClick={() => setMobileMenuOpen(false)}
>
<span className="sr-only">Close menu</span>
<XMarkIcon className="h-6 w-6" aria-hidden="true" />
</button>
</div>
<div className="mt-6 flow-root">
<div className="-my-6 divide-y divide-gray-500/10">
<div className="space-y-2 py-6">
{cloudNavItems.map((item) => (
<Link
key={item.name}
to={item.href}
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
>
{item.name}
</Link>
))}
<Link
to="/network"
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
>
Network
</Link>
<Link
to="/agents"
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
>
Agents
</Link>
</div>
<div className="py-6">
<Button
to="https://myceliumcloud.tf"
variant="outline"
as="a"
target="_blank"
rel="noopener noreferrer"
className="w-full"
>
Start Deployment
</Button>
<Button to="/download" variant="solid" color="cyan" className="mt-4 w-full">
Get Mycelium Connector
</Button>
</div>
</div>
</div>
</Dialog.Panel>
</Dialog>
</header> </header>
) )
} }

View File

@@ -1,15 +1,11 @@
import { Outlet, useLocation } from 'react-router-dom' import { Outlet } from 'react-router-dom'
import { Footer } from './Footer' import { Footer } from './Footer'
import { Header } from './Header' import { Header } from './Header'
import { HomeAurora } from '../pages/home/HomeAurora'
export function Layout() { export function Layout() {
const location = useLocation()
const isHomePage = location.pathname === '/'
return ( return (
<div className="bg-[#FAFAFA] antialiased relative" style={{ fontFamily: 'var(--font-inter)' }}> <div className="bg-[#fdfdfd] antialiased relative" style={{ fontFamily: 'var(--font-inter)' }}>
{isHomePage && <HomeAurora />}
<div className="relative z-10"> <div className="relative z-10">
<Header /> <Header />
<main> <main>

View File

@@ -59,7 +59,7 @@ export default function FeaturesSectionDemo() {
}, },
]; ];
return ( return (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 relative z-10 py-10 max-w-7xl mx-auto"> <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 relative z-10 py-8 max-w-7xl mx-auto">
{features.map((feature, index) => ( {features.map((feature, index) => (
<Feature key={feature.title} {...feature} index={index} /> <Feature key={feature.title} {...feature} index={index} />
))} ))}
@@ -81,7 +81,7 @@ const Feature = ({
return ( return (
<div <div
className={cn( className={cn(
"flex flex-col lg:border-r py-10 relative group/feature dark:border-neutral-800", "flex flex-col lg:border-r py-8 relative group/feature dark:border-neutral-800",
(index === 0 || index === 4) && "lg:border-l dark:border-neutral-800", (index === 0 || index === 4) && "lg:border-l dark:border-neutral-800",
index < 4 && "lg:border-b dark:border-neutral-800" index < 4 && "lg:border-b dark:border-neutral-800"
)} )}

View File

@@ -40,7 +40,7 @@ export default function FeaturesSectionDemo() {
}, },
]; ];
return ( return (
<div className="relative z-20 py-10 lg:py-40 max-w-7xl mx-auto"> <div className="relative z-20 py-8 lg:py-40 max-w-7xl mx-auto">
<div className="px-8"> <div className="px-8">
<h4 className="text-3xl lg:text-5xl lg:leading-tight max-w-5xl mx-auto text-center tracking-tight font-medium text-black dark:text-white"> <h4 className="text-3xl lg:text-5xl lg:leading-tight max-w-5xl mx-auto text-center tracking-tight font-medium text-black dark:text-white">
Packed with thousands of features Packed with thousands of features

View File

@@ -62,7 +62,7 @@ export const Carousel = ({ items, initialScroll = 0 }: CarouselProps) => {
return ( return (
<div className="relative w-full"> <div className="relative w-full">
<div <div
className="flex w-full overflow-x-scroll overscroll-x-auto scroll-smooth py-10 [scrollbar-width:none] md:py-20" className="flex w-full overflow-x-scroll overscroll-x-auto scroll-smooth py-8 [scrollbar-width:none] md:py-20"
ref={carouselRef} ref={carouselRef}
onScroll={checkScrollability} onScroll={checkScrollability}
> >
@@ -135,7 +135,7 @@ export const Card = ({
layoutId={layout ? `card-${card.title}` : undefined} layoutId={layout ? `card-${card.title}` : undefined}
className="relative z-10 flex h-104 w-80 flex-col justify-between overflow-hidden rounded-3xl p-8 md:h-120 md:w-96" className="relative z-10 flex h-104 w-80 flex-col justify-between overflow-hidden rounded-3xl p-8 md:h-120 md:w-96"
> >
<div className="flex h-2/5 flex-col justify-center py-6 px-4"> <div className="flex h-2/5 flex-col justify-center py-4 px-4">
<motion.p <motion.p
layoutId={layout ? `category-${card.category}` : undefined} layoutId={layout ? `category-${card.category}` : undefined}
className="text-left font-sans font-semibold text-cyan-500 uppercase tracking-wider text-xs md:text-sm" className="text-left font-sans font-semibold text-cyan-500 uppercase tracking-wider text-xs md:text-sm"

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1002 KiB

BIN
src/images/bento-gpu.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
src/images/cloudhosting.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

View File

@@ -1,6 +1,6 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader } from '../../components/Texts' import { Eyebrow, SectionHeader } from '@/components/Texts'
const components = [ const components = [
{ {

View File

@@ -1,40 +1,43 @@
'use client' 'use client'
import { Button } from '../../components/Button' import { Button } from '@/components/Button'
import { Eyebrow, P, H3 } from '../../components/Texts' import { Eyebrow, H3 } from '@/components/Texts'
export function AgentHeroAlt() { export function AgentHeroAlt() {
return ( return (
<div className="relative bg-white lg:mt-10 mt-0"> <div className="">
<div className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-2/3"> {/* Boxed container */}
<img <div
alt="" className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-200 bg-white overflow-hidden bg-contain bg-right bg-no-repeat"
src="/images/agents.png" style={{ backgroundImage: "url('/images/agents.webp')", backgroundSize: "contain" }}
className="size-full object-cover" >
/> {/* Inner padding */}
<div className="px-6 py-16 lg:py-16">
</div> <div className="max-w-2xl lg:pl-6">
<div className="relative mx-auto max-w-7xl py-24 sm:py-32 lg:px-8"> <Eyebrow>MYCELIUM AGENTS</Eyebrow>
<div className="pr-6 pl-6 md:mr-auto md:w-2/3 md:pr-16 lg:w-1/2 lg:pl-0 lg:pr-24 xl:pr-32"> <H3 as="h1" className="mt-4">
<Eyebrow className="text-base/7 font-semibold text-cyan-500">MYCELIUM AGENTS</Eyebrow> Sovereign AI Agents, Coming Soon.
<H3 as="h1" className="mt-2 text-gray-900">Sovereign AI Agents, Coming Soon.</H3> </H3>
<P className="mt-6 text-gray-600"> <p className="mt-6 text-lg">
The Agent layer will allow you to run autonomous, policy-governed AI that operates on infrastructure you control, with private memory, verifiable execution, and coordination across your personal or organizational environment. The Agent layer will allow you to run autonomous, policy-governed AI that operates on infrastructure you control, with private memory, verifiable execution, and coordination across your personal or organizational environment.
</P> </p>
<P className="mt-6 text-gray-600"> <p className="mt-4 lg:text-base italic text-gray-600 text-sm">
Works Alone. Works Together. Works Alone. Works Together. Use Agents on top of any Mycelium Cloud deployment or pair them with the Mycelium Network for private, encrypted collaboration across users and systems.
Use Agents on top of any Mycelium Cloud deployment or pair them with the Mycelium Network for private, encrypted collaboration across users and systems. </p>
</P> <div className="mt-10 flex items-center gap-x-6">
<div className="mt-8"> <Button href="#" variant="solid" color="cyan">
<Button href="#" variant="solid" color="cyan"> Follow Deployment
Follow Deployment </Button>
</Button> <Button href="#" variant="outline">
<Button href="#" variant="outline" color="white"> Explore Docs <span aria-hidden="true"></span>
Explore Docs </Button>
</Button> </div>
</div> </div>
</div> </div>
</div> </div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-200" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
</div> </div>
) )
} }

View File

@@ -1,6 +1,6 @@
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' import { Eyebrow, SectionHeader, P, CT, CP } from '@/components/Texts'
const items = [ const items = [
{ {
@@ -19,7 +19,7 @@ const items = [
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', video: '/videos/herodb.mp4',
}, },
{ {
title: 'Mycelium Mesh', title: 'Mycelium Mesh',

View File

@@ -1,6 +1,6 @@
import { CircleBackground } from '../../components/CircleBackground' import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Button } from '../../components/Button' import { Button } from '@/components/Button'
export function CallToAction() { export function CallToAction() {
return ( return (

View File

@@ -2,9 +2,9 @@
import { useId, useState } from 'react' import { useId, useState } from 'react'
import { Button } from '../../components/Button' import { Button } from '@/components/Button'
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import ContactForm from '../../components/ContactForm' import ContactForm from '../../../components/ContactForm'
function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) { function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) {
const id = useId() const id = useId()

View File

@@ -1,55 +1,55 @@
import { CircleBackground } from '../../components/CircleBackground' "use client";
import { Container } from '../../components/Container'
import { Button } from '../../components/Button' import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
export function CallToAction() { export function CallToAction() {
return ( return (
<section <section className="relative overflow-hidden bg-gray-900">
id="get-started" {/* ✅ Top horizontal line with spacing */}
className="relative overflow-hidden bg-gray-900 py-24 lg:py-32" <div className="max-w-7xl bg-[#090909] mx-auto py-6 border border-t-0 border-b-0 border-gray-700"></div>
> <div className="w-full border-t border-l border-r border-gray-700" />
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
<CircleBackground color="#06b6d4" className="animate-spin-slower" />
</div>
<Container className="relative"> {/* ✅ Main boxed area */}
<div className="mx-auto max-w-xl text-center"> <div
<h2 className="text-3xl font-medium tracking-tight text-white sm:text-4xl lg:text-4xl"> id="get-started"
Choose How You Want to Start className="relative py-18 max-w-7xl mx-auto bg-[#090909] border border-t-0 border-b-0 border-gray-700"
</h2> >
<p className="mt-6 text-lg text-gray-300">
Host your own node to contribute capacity or deploy workloads using the Mycelium Cloud.
</p>
<div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4"> <Container className="relative">
<div className="flex flex-col items-center text-center"> <div className="mx-auto max-w-3xl text-center">
<h3 className="text-lg font-semibold text-white">Host a Node</h3> <h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
<p className="mt-2 text-gray-300"> Choose How You Want to Start
Add compute to the network and run your own environment. </h2>
</p>
<Button to="/host" variant="solid" color="cyan" className="mt-4">
Host a Node
</Button>
</div>
<div className="flex flex-col items-center text-center"> <p className="mt-6 text-lg text-gray-300">
<h3 className="text-lg font-semibold text-white">Deploy Workloads</h3> Host your own node to contribute capacity or deploy workloads using the Mycelium Cloud.
<p className="mt-2 text-gray-300"> You dont need to host before deploying, and you dont need to deploy before hosting.
Run Kubernetes clusters, agents, and services on the Mycelium Cloud.
</p> </p>
<Button to="/cloud" variant="outline" color="white" className="mt-4">
Start Deploying {/* ✅ Two cards, stacked center with spacing */}
</Button> <div className="mt-10 flex flex-wrap justify-center gap-x-10 gap-y-8">
<div className="flex flex-col items-center text-center max-w-xs">
<Button to="/host" variant="solid" color="cyan" className="mt-4">
Host a Node
</Button>
</div>
<div className="flex flex-col items-center text-center max-w-xs">
<Button to="/cloud" variant="outline" color="white" className="mt-4">
Start Deploying
</Button>
</div>
</div> </div>
</div> </div>
</Container>
</div>
<p className="mt-10 text-gray-300 text-lg max-w-md mx-auto"> {/* ✅ Bottom horizontal line with spacing */}
You dont need to host before deploying, and you dont need to deploy before hosting. <div className="w-full border-b border-gray-700" />
Start wherever it makes sense for you. <div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-700 bg-transparent" />
</p>
</div>
</Container>
</section> </section>
) );
} }

View File

@@ -1,65 +1,90 @@
import { Container } from '../../components/Container' 'use client';
import { Eyebrow, H3, P } from '../../components/Texts'
import { Button } from '../../components/Button' import { Container } from '@/components/Container'
import { Eyebrow, H3, P } from '@/components/Texts'
import { Button } from '@/components/Button'
import { MeshNetworkIcon } from './animations/MeshNetworkIcon'
import { SovereignComputer } from './animations/SovereignComputer'
import { DeterministicOrchestration } from './animations/DeterministicOrchestration'
const architecture = [ const architecture = [
{ {
title: 'Mesh Networking Layer', title: 'Mesh Networking Layer',
description: description:
'Every node receives a cryptographic network identity and secure routing path.', 'Every node receives a cryptographic network identity and secure routing path.',
icon: <MeshNetworkIcon className="mb-4" />, // ✅ stored as const JSX
}, },
{ {
title: 'Sovereign Compute Layer', title: 'Sovereign Compute Layer',
description: description:
'Workloads run on hardware you authorize, no shared control, no exposed surfaces.', 'Workloads run on hardware you authorize, no shared control, no exposed surfaces.',
icon: <SovereignComputer className="mb-4" />,
}, },
{ {
title: 'Deterministic Orchestration', title: 'Deterministic Orchestration',
description: description:
'K3s clusters deploy predictably, verifiably, and remain drift-free.', 'K3s clusters deploy predictably, verifiably, and remain drift-free.',
icon: <DeterministicOrchestration className="mb-4" />,
}, },
] ]
export function CloudArchitecture() { export function CloudArchitecture() {
return ( return (
<section className="bg-white py-24 lg:py-32"> <section className="bg-[#121212] w-full max-w-8xl mx-auto">
<Container>
<div className="mx-auto max-w-4xl text-center">
<Eyebrow>ARCHITECTURE</Eyebrow>
<H3 className="mt-6 text-gray-900">
How Mycelium Cloud Works
</H3>
<P className="mt-6 text-gray-600">
Mycelium Cloud runs Kubernetes on a global encrypted mesh, with
identity, routing, and state verified at the protocol level.
</P>
</div>
<div className="mx-auto mt-16 max-w-4xl space-y-6 lg:space-y-0 lg:grid lg:grid-cols-3 lg:gap-8"> {/* ✅ Top horizontal spacer like HomeHosting */}
{architecture.map((layer) => ( <div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
<div <div className="w-full border-t border-l border-r border-gray-800" />
key={layer.title}
className="rounded-3xl border border-slate-200 bg-gray-50/40 p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg"
>
<h3 className="text-xl font-semibold text-gray-900">
{layer.title}
</h3>
<p className="mt-3 text-sm leading-relaxed text-gray-600">
{layer.description}
</p>
</div>
))}
</div>
<div className="mx-auto mt-16 flex justify-center gap-4"> {/* ✅ Boxed container with matching spacing */}
<Button variant="solid" color="cyan" href="/start"> <div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-800 bg-[#111111] py-12">
Get Started <Container>
</Button> <div className="mx-auto max-w-4xl sm:text-center">
<Button variant="outline" color="gray" href="/docs"> <Eyebrow className="text-cyan-400">ARCHITECTURE</Eyebrow>
Explore Docs
</Button> <H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-white">
</div> How Mycelium Cloud Works
</Container> </H3>
<P className="mt-6 text-lg text-gray-300">
Mycelium Cloud runs Kubernetes on a global encrypted mesh, with
identity, routing, and state verified at the protocol level.
</P>
</div>
{/* ✅ Card layout spacing & grid match HomeHosting */}
<ul
role="list"
className="mx-auto mt-12 grid max-w-2xl grid-cols-1 gap-6 text-sm
sm:grid-cols-2 lg:max-w-none lg:grid-cols-3 md:gap-y-10 "
>
{architecture.map((layer) => (
<li
key={layer.title}
className="rounded-xl border border-gray-800 bg-[#111]/60 p-6 hover:transform-[scale(1.05)]"
>
{layer.icon} {/* ✅ this now works */}
<h3 className="text-lg font-semibold text-white">{layer.title}</h3>
<p className="mt-2 text-gray-400 leading-snug">{layer.description}</p>
</li>
))}
</ul>
{/* ✅ Matching button spacing and layout */}
<div className="mx-auto mt-12 flex justify-center gap-6">
<Button variant="solid" color="cyan" href="/start">
Get Started
</Button>
<Button variant="outline" color="white" href="/docs">
Explore Docs
</Button>
</div>
</Container>
</div>
{/* ✅ bottom border + bottom spacer to match */}
<div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
</section> </section>
) )
} }

View File

@@ -1,52 +1,61 @@
import { H3, P, Eyebrow } from '../../components/Texts' "use client";
import { Container } from "@/components/Container";
import { H3, P, Eyebrow } from "@/components/Texts";
export function CloudBluePrint() { export function CloudBluePrint() {
const logos = [
{ src: '/images/logo/cryptpad.png', href: 'https://cryptpad.fr' },
{ src: '/images/logo/gitea.png', href: 'https://about.gitea.com' },
{ src: '/images/logo/lifekit.png', href: '#' }, // No link available
{ src: '/images/logo/matrix.png', href: 'https://matrix.org' },
{ src: '/images/logo/nextcloud.png', href: 'https://nextcloud.com' },
{ src: '/images/logo/stalwart.png', href: 'https://stalw.art' },
];
return ( return (
<div className="bg-white py-24 sm:py-32"> <section className="w-full max-w-8xl mx-auto bg-transparent">
<div className="mx-auto max-w-7xl px-6 lg:px-8">
<Eyebrow color="accent">Featured Blueprint</Eyebrow> {/* ✅ Boxed container */}
<H3 color="primary">Your Personal Sovereign Cloud Workspace</H3> <div className="max-w-7xl bg-white mx-auto pb-12 border border-t-0 border-b-0 border-gray-200">
<P color="primary">Digital Me is an example environment built to demonstrate whats possible on top of the Mycelium Stack, a full personal cloud you can deploy, customize, or extend. <Container>
Your files, communication, apps, and optional AI agent, all running privately on infrastructure you choose.</P> <div className="mx-auto max-w-4xl sm:text-center">
<div className="mx-auto mt-10 grid max-w-lg grid-cols-4 items-center gap-x-8 gap-y-10 sm:max-w-xl sm:grid-cols-6 sm:gap-x-10 lg:mx-0 lg:max-w-none lg:grid-cols-5"> <Eyebrow className="text-cyan-500">Featured Blueprint</Eyebrow>
<img
alt="Transistor" <H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-900 mt-2">
src="https://tailwindcss.com/plus-assets/img/logos/158x48/transistor-logo-gray-900.svg" Your Personal Sovereign Cloud Workspace
width={158} </H3>
height={48}
className="col-span-2 max-h-12 w-full object-contain lg:col-span-1" <P className="mt-6 text-lg text-gray-600">
/> Digital Me is an example environment built to demonstrate whats possible on top of the Mycelium Stack a full personal cloud you can deploy, customize, or extend. Your files, communication, apps, and optional AI agent, all running privately on infrastructure you choose.
<img </P>
alt="Reform" </div>
src="https://tailwindcss.com/plus-assets/img/logos/158x48/reform-logo-gray-900.svg"
width={158} {/* ✅ 3x2 logo grid */}
height={48} <div className="mt-12 grid grid-cols-3 gap-x-8 gap-y-12">
className="col-span-2 max-h-12 w-full object-contain lg:col-span-1" {logos.map((logo, i) => (
/> <div key={i} className="flex justify-center">
<img <a
alt="Tuple" href={logo.href}
src="https://tailwindcss.com/plus-assets/img/logos/158x48/tuple-logo-gray-900.svg" target="_blank"
width={158} rel="noopener noreferrer"
height={48} className="transition-transform duration-300 hover:scale-105"
className="col-span-2 max-h-12 w-full object-contain lg:col-span-1" >
/> <img
<img src={logo.src}
alt="SavvyCal" alt={`Logo ${i + 1}`}
src="https://tailwindcss.com/plus-assets/img/logos/158x48/savvycal-logo-gray-900.svg" className="max-h-12 w-auto object-contain"
width={158} />
height={48} </a>
className="col-span-2 max-h-12 w-full object-contain sm:col-start-2 lg:col-span-1" </div>
/> ))}
<img </div>
alt="Statamic" </Container>
src="https://tailwindcss.com/plus-assets/img/logos/158x48/statamic-logo-gray-900.svg"
width={158}
height={48}
className="col-span-2 col-start-2 max-h-12 w-full object-contain sm:col-start-auto lg:col-span-1"
/>
</div>
</div> </div>
</div>
) {/* ✅ Bottom line + bottom spacer */}
<div className="w-full border-b border-gray-200" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-200 bg-transparent" />
</section>
);
} }

View File

@@ -354,7 +354,7 @@ function CloudFeaturesMobile() {
> >
<div <div
className={clsx( className={clsx(
'relative transform overflow-hidden rounded-2xl bg-gray-800 px-5 py-6 outline-2 transition-colors', 'relative transform overflow-hidden rounded-2xl bg-gray-800 px-5 py-4 outline-2 transition-colors',
activeIndex === featureIndex activeIndex === featureIndex
? 'outline-transparent' // Remove outline for active mobile slide ? 'outline-transparent' // Remove outline for active mobile slide
: 'outline-transparent hover:outline-cyan-500', : 'outline-transparent hover:outline-cyan-500',

View File

@@ -0,0 +1,283 @@
'use client'
import { Fragment, useEffect, useRef, useState } from 'react'
import { Tab, TabGroup, TabList, TabPanel, TabPanels } from '@headlessui/react'
import clsx from 'clsx'
import {
type MotionProps,
type Variant,
AnimatePresence,
motion,
} from 'framer-motion'
import { useDebouncedCallback } from 'use-debounce'
import {
Eyebrow,
FeatureDescription,
FeatureTitle,
MobileFeatureTitle,
P,
SectionHeader,
} from '@/components/Texts'
import { Container } from '@/components/Container'
import reservenodeimg from '/images/cloud/reserve.png'
import billingImg from '/images/cloud/billing.png'
import kubeconfigImg from '/images/cloud/kubeconfig.png'
/* Feature Data */
const features = [
{
name: 'Decentralized Kubernetes',
description:
"Reserve a node and deploy sovereign Kubernetes clusters on decentralized infrastructure.",
screen: () => (
<img
src={reservenodeimg}
className="rounded-xl shadow-xl ring-1 ring-gray-300"
/>
),
},
{
name: 'Manage Your Cluster',
description:
'Manage your cluster with ease, with a simple and intuitive interface.',
screen: () => (
<img
src={kubeconfigImg}
className="rounded-xl shadow-xl ring-1 ring-gray-300"
/>
),
},
{
name: 'Personalised Billings & Accounts',
description:
'Easily manage your cluster billing and accounts with personalised configurations.',
screen: () => (
<img
src={billingImg}
className="rounded-xl shadow-xl ring-1 ring-gray-300"
/>
),
},
]
interface CustomAnimationProps {
isForwards: boolean
changeCount: number
}
const maxZIndex = 2147483647
const bodyVariantBackwards: Variant = {
opacity: 0.4,
scale: 0.8,
zIndex: 0,
filter: 'blur(4px)',
transition: { duration: 0.4 },
}
const bodyAnimation: MotionProps = {
initial: 'initial',
animate: 'animate',
exit: 'exit',
variants: {
initial: (custom: CustomAnimationProps) =>
custom.isForwards
? {
y: '100%',
zIndex: maxZIndex - custom.changeCount,
transition: { duration: 0.4 },
}
: bodyVariantBackwards,
animate: (custom: CustomAnimationProps) => ({
y: '0%',
opacity: 1,
scale: 1,
zIndex: maxZIndex / 2 - custom.changeCount,
filter: 'blur(0px)',
transition: { duration: 0.4 },
}),
exit: (custom: CustomAnimationProps) =>
custom.isForwards
? bodyVariantBackwards
: {
y: '100%',
zIndex: maxZIndex - custom.changeCount,
transition: { duration: 0.4 },
},
},
}
function usePrevious<T>(value: T) {
const ref = useRef<T>()
useEffect(() => {
ref.current = value
}, [value])
return ref.current
}
/* Desktop Component */
function CloudFeaturesDesktop() {
let [changeCount, setChangeCount] = useState(0)
let [selectedIndex, setSelectedIndex] = useState(0)
let prevIndex = usePrevious(selectedIndex)
let isForwards = prevIndex === undefined ? true : selectedIndex > prevIndex
let onChange = useDebouncedCallback(
(selectedIndex: number) => {
setSelectedIndex(selectedIndex)
setChangeCount((changeCount) => changeCount + 1)
},
100,
{ leading: true },
)
return (
<TabGroup
vertical
className="grid grid-cols-12 items-center gap-10"
selectedIndex={selectedIndex}
onChange={onChange}
>
<TabList className="col-span-6 space-y-6 pl-4 lg:pl-6">
{features.map((feature, featureIndex) => (
<div
key={feature.name}
className={clsx(
'relative rounded-2xl outline-2 transition-all duration-300 ease-in-out hover:scale-105 hover:bg-gray-100',
selectedIndex === featureIndex
? 'outline-cyan-500'
: 'outline-transparent hover:outline-cyan-500',
)}
>
{featureIndex === selectedIndex && (
<motion.div
layoutId="activeBackground"
className="absolute inset-0 bg-white shadow"
initial={{ borderRadius: 16 }}
/>
)}
<div className="relative z-10 p-8">
<FeatureTitle as="h3" className="text-gray-900">
<Tab className="text-left data-selected:not-data-focus:outline-hidden">
<span className="absolute inset-0 rounded-2xl" />
{feature.name}
</Tab>
</FeatureTitle>
<FeatureDescription className="mt-2 text-gray-600">
{feature.description}
</FeatureDescription>
</div>
</div>
))}
</TabList>
<div className="relative col-span-6">
<TabPanels as={Fragment}>
<AnimatePresence
initial={false}
custom={{ isForwards, changeCount }}
>
{features.map((feature, featureIndex) =>
selectedIndex === featureIndex ? (
<TabPanel
static
key={feature.name + changeCount}
className="col-start-1 row-start-1 flex focus:outline-offset-32 data-selected:not-data-focus:outline-hidden"
>
<motion.div
{...bodyAnimation}
custom={{ isForwards, changeCount }}
className="w-full flex justify-center"
>
<feature.screen />
</motion.div>
</TabPanel>
) : null,
)}
</AnimatePresence>
</TabPanels>
</div>
</TabGroup>
)
}
/* Mobile Version */
function CloudFeaturesMobile() {
return (
<>
<div className="flex snap-x overflow-x-auto space-x-4 pb-4 scrollbar-hide">
{features.map((feature, i) => (
<div key={i} className="w-full flex-none snap-center px-4">
<div className="rounded-2xl bg-white shadow ring-1 ring-gray-200 p-6">
<div className="w-full max-w-[366px] mx-auto">
<feature.screen />
</div>
<div className="mt-6">
<MobileFeatureTitle className="text-gray-900">
{feature.name}
</MobileFeatureTitle>
<FeatureDescription className="mt-2 text-gray-600">
{feature.description}
</FeatureDescription>
</div>
</div>
</div>
))}
</div>
</>
)
}
/* ✅ FINAL LIGHT MODE EXPORT — BOXED CONTAINER + BORDERS MATCHING CloudHeroNew */
export function CloudFeaturesLight() {
return (
<div className="">
{/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
<div className="w-full border-t border-l border-r border-gray-200" />
{/* ✅ Boxed container (border-x only) */}
<div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-200 bg-white">
<section className="px-6 py-16 lg:py-16">
<Container>
<div className="max-w-4xl mx-auto items-center text-center">
<Eyebrow color="accent">Platform Overview</Eyebrow>
<SectionHeader className="mt-2 text-gray-900">
A Decentralized Cloud that Operates Itself
</SectionHeader>
<P className="mt-6 text-gray-600">
Mycelium Cloud runs Kubernetes on a sovereign, self-healing network
with compute, storage, and networking built in so you dont need
external cloud dependencies.
</P>
</div>
</Container>
<div className="hidden md:block mt-12">
<CloudFeaturesDesktop />
</div>
<div className="md:hidden mt-12">
<CloudFeaturesMobile />
</div>
</section>
</div>
{/* ✅ Bottom horizontal line */}
<div className="w-full border-b border-gray-200" />
{/* ✅ Bottom spacer matching hero */}
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
</div>
)
}

View File

@@ -1,47 +1,51 @@
import { H3, H5, Eyebrow } from "../../components/Texts" import { H3, Eyebrow } from "@/components/Texts"
import { Button } from "../../components/Button" import { Button } from "@/components/Button"
export function CloudHeroNew({ onGetStartedClick = () => {} }: { onGetStartedClick?: () => void }) {
export function CloudHeroNew() {
return ( return (
<div <div className="">
className="relative bg-cover lg:bg-contain bg-right bg-no-repeat" {/* Boxed container */}
style={{ backgroundImage: "url('/images/cloudhero4.webp')" }} <div
> className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-200 bg-white overflow-hidden bg-contain bg-right bg-no-repeat"
<div className="mx-auto max-w-7xl lg:px-8"> style={{ backgroundImage: "url('/images/cloudhero4.webp')", backgroundSize: "contain" }}
<div className="px-6 pt-12 pb-24 sm:pb-32 lg:col-span-5 lg:px-0 lg:pt-40 lg:pb-48 xl:col-span-5"> >
<div className="mx-auto max-w-2xl lg:mx-0"> {/* Inner padding */}
<div className="px-6 py-16 lg:py-16">
<div className="max-w-2xl lg:pl-6">
<Eyebrow> <Eyebrow>
Mycelium Cloud Mycelium Cloud
</Eyebrow> </Eyebrow>
<H3 className="mt-4"> <H3 className="mt-4">
Run Kubernetes on the Sovereign Agentic Cloud Run Kubernetes on the Sovereign Agentic Cloud
</H3> </H3>
<H5 className="mt-4 text-lg text-gray-600"> <p className="mt-6 text-lg">
Deploy K3s clusters on a global, self-healing mesh network. Deploy K3s clusters on a global, self-healing mesh network.
Your workloads run on sovereign, encrypted infrastructure, without centralized cloud control. Your workloads run on sovereign, encrypted infrastructure, without centralized cloud control.
</H5> </p>
<H5 className="mt-4 text-sm text-gray-600"> <p className="mt-4 lg:text-base italic text-gray-600 text-sm">
Works Alone. Works Together. Works Alone. Works Together.
Mycelium Cloud can run on any network fabric, or pair with Mycelium Network Mycelium Cloud can run on any network fabric, or pair with Mycelium Network
for sovereign connectivity. for sovereign connectivity.
</H5> </p>
<div className="mt-10 flex items-center gap-x-6"> <div className="mt-10 flex items-center gap-x-6">
<Button <Button
to="#" onClick={onGetStartedClick}
variant="solid" variant="solid"
className=""
color="cyan" color="cyan"
> >
Get started Get started
</Button> </Button>
<Button to="#" variant="outline"> <Button to="#" variant="outline">
Documentation <span aria-hidden="true"> </span> Documentation <span aria-hidden="true"></span>
</Button> </Button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-200" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
</div> </div>
) )
} }

View File

@@ -4,7 +4,7 @@ import {
ServerIcon, ServerIcon,
ShieldCheckIcon, ShieldCheckIcon,
} from '@heroicons/react/24/outline' } from '@heroicons/react/24/outline'
import { CP, CT, Eyebrow, H3 } from '../../components/Texts' import { CP, CT, Eyebrow, H3 } from '@/components/Texts'
const features = [ const features = [
{ {

View File

@@ -0,0 +1,105 @@
'use client'
import {
Disclosure,
DisclosureButton,
DisclosurePanel,
} from '@headlessui/react'
import { MinusIcon, PlusIcon } from '@heroicons/react/24/outline'
import { Eyebrow, H3, H4 } from "@/components/Texts"
const product = {
subtitle: 'capabilities',
name: 'What You Can Run on Mycelium Cloud',
description: '<p>Host nodes, deploy workloads, or build private AI systems, all on infrastructure you own and control.</p>',
details: [
{
name: 'Kubernetes Clusters',
description: 'Deterministic K3s workloads across sovereign hardware.',
},
{
name: 'Encrypted Mesh Networking',
description: 'No public ingress, no exposed attack surface, zero-trust routing.',
},
{
name: 'S3-Compatible Storage',
description: 'Distributed storage with erasure coding and residency control.',
},
{
name: 'GPU-Ready',
description: 'Scale inference & training on demand.',
},
],
}
// ✅ keep your product + relatedProducts data above here …
export function CloudHostingNew() {
return (
<div className="bg-[#121212] text-white">
{/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-[#111111] mx-auto py-6 border border-t-0 border-b-0 border-gray-600"></div>
<div className="w-full border-t border-l border-r border-gray-600" />
{/* ✅ MAIN CONTENT */}
<main className="mx-auto max-w-7xl px-6 lg:px-12 py-12 border border-t-0 border-b-0 border-gray-600">
<div className="mx-auto max-w-2xl lg:max-w-none">
{/* ✅ Product Section */}
<div className="lg:grid lg:grid-cols-5 lg:items-start lg:gap-x-8">
{/* ✅ Image */}
<div className="lg:col-span-2 lg:mt-8 mt-2">
<img alt="Mycelium Cloud" src="/images/cloudhosting.webp" className="aspect-square w-full object-cover" />
</div>
{/* ✅ Product info */}
<div className="mt-8 px-4 sm:px-0 lg:mt-0 lg:col-span-3">
<Eyebrow>{product.subtitle}</Eyebrow>
<H4 className=" text-white">{product.name}</H4>
<div className="mt-4 text-gray-300 text-xl"
dangerouslySetInnerHTML={{ __html: product.description }}
/>
{/* ✅ Details accordion */}
<section className="mt-6">
<div className="divide-y divide-gray-800 border-t border-cyan-500">
{product.details.map((detail) => (
<Disclosure key={detail.name} as="div">
<H3>
<DisclosureButton className="group flex w-full items-center justify-between py-6 text-left">
<span className="text-lg tracking-normal font-medium text-white">
{detail.name}
</span>
<span className="ml-6 flex items-center">
<PlusIcon className="block h-6 w-6 text-gray-500 group-open:hidden" />
<MinusIcon className="hidden h-6 w-6 text-indigo-400 group-open:block" />
</span>
</DisclosureButton>
</H3>
<DisclosurePanel className="pb-6">
<p className="text-gray-400 text-base tracking-normal">{detail.description}</p>
</DisclosurePanel>
</Disclosure>
))}
</div>
</section>
</div>
</div>
</div>
</main>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-600" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-600"></div>
</div>
)
}

View File

@@ -1,11 +1,12 @@
import { AnimatedSection } from '../../components/AnimatedSection' import { AnimatedSection } from '../../components/AnimatedSection'
import { CloudArchitecture } from './CloudArchitecture' import { CloudArchitecture } from './CloudArchitecture'
import { CloudFeatures } from './CloudFeatures'
import { CloudUseCases } from './CloudUseCases' import { CloudUseCases } from './CloudUseCases'
import { CloudHeroNew } from './CloudHeroNew' import { CloudHeroNew } from './CloudHeroNew'
import { CloudHosting } from './CloudHosting'
import { CloudBluePrint } from './CloudBluePrint' import { CloudBluePrint } from './CloudBluePrint'
import { CallToAction } from './CalltoAction' import { CallToAction } from './CalltoAction'
import { CloudHostingNew } from './CloudHostingNew'
import { CloudFeaturesLight } from './CloudFeaturesLight'
export default function CloudPage() { export default function CloudPage() {
return ( return (
@@ -16,11 +17,11 @@ export default function CloudPage() {
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<CloudHosting /> <CloudHostingNew />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<CloudFeatures /> <CloudFeaturesLight />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>

View File

@@ -1,5 +1,7 @@
import { Container } from '../../components/Container' "use client";
import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts'
import { Container } from '@/components/Container'
import { Eyebrow, H3, P, Small } from '@/components/Texts'
const useCases = [ const useCases = [
{ {
@@ -36,53 +38,74 @@ const useCases = [
export function CloudUseCases() { export function CloudUseCases() {
return ( return (
<section className="bg-white py-24 sm:py-32"> <section className="w-full max-w-8xl mx-auto bg-transparent">
<Container>
<div className="mx-auto max-w-3xl text-center"> {/* ✅ Top horizontal line with spacing */}
<Eyebrow> <div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
Use Cases <div className="w-full border-t border-l border-r border-gray-200" />
</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900"> {/* ✅ Inner boxed container */}
Built for intelligent workloads across every edge. <div className="max-w-7xl bg-white mx-auto py-12 border border-t-0 border-b-0 border-gray-200">
</SectionHeader> <Container>
<P className="mt-6 text-gray-600"> <div className="mx-auto max-w-4xl sm:text-center">
Mycelium Cloud unifies compute, storage, and networking so teams can <Eyebrow className="text-cyan-500">USE CASES</Eyebrow>
launch anything from GPU inference farms to global collaboration
suites with deterministic outcomes. <H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-900">
</P> Built for intelligent workloads across every edge.
</div> </H3>
<div className="mt-16 grid gap-8 lg:grid-cols-2">
{useCases.map((useCase) => ( <P className="mt-6 text-lg text-gray-600">
<div Mycelium Cloud unifies compute, storage, and networking so teams can
key={useCase.title} launch anything from GPU inference farms to global collaboration suites
className="flex h-full flex-col rounded-3xl border border-slate-200 bg-white p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg" with deterministic outcomes.
> </P>
<div className="flex items-center justify-between"> </div>
<h3 className="text-xl font-semibold text-gray-900">
{useCase.title} {/* ✅ 3 columns on desktop */}
</h3> <ul
<Small className="text-xs uppercase tracking-[0.3em] text-cyan-500"> role="list"
Scenario className="mx-auto mt-12 grid max-w-2xl grid-cols-1 gap-6
</Small> sm:grid-cols-2 lg:max-w-none lg:grid-cols-3 md:gap-y-10"
</div> >
<p className="mt-4 text-sm leading-relaxed text-gray-600"> {useCases.map((useCase) => (
{useCase.description} <li
</p> key={useCase.title}
<ul className="mt-6 space-y-3 text-sm text-gray-600"> className="rounded-md border border-gray-200 bg-white p-6 transition-all duration-300
{useCase.bullets.map((bullet) => ( hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20 flex flex-col"
<li >
key={bullet} <div className="flex items-center justify-between">
className="flex items-start gap-3 rounded-2xl border border-cyan-100 bg-cyan-50/60 p-3 leading-relaxed" <h3 className="font-semibold text-gray-900">
> {useCase.title}
<span className="mt-1 inline-block size-2 rounded-full bg-cyan-500" /> </h3>
<span>{bullet}</span> <Small className="uppercase tracking-[0.25em] text-cyan-500">
</li> Scenario
))} </Small>
</ul> </div>
</div>
))} <p className="mt-4 text-gray-700 leading-snug">
</div> {useCase.description}
</Container> </p>
<ul className="mt-6 space-y-3 text-sm text-gray-600">
{useCase.bullets.map((bullet) => (
<li
key={bullet}
className="flex items-start gap-3 rounded-2xl border border-cyan-100 bg-cyan-50/60 p-3 leading-relaxed"
>
<span className="mt-1 inline-block size-2 rounded-full bg-cyan-500" />
<span>{bullet}</span>
</li>
))}
</ul>
</li>
))}
</ul>
</Container>
</div>
{/* ✅ Bottom horizontal line + spacing */}
<div className="w-full border-b border-gray-200" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
</section> </section>
) )
} }

View File

@@ -0,0 +1,103 @@
"use client";
import { motion, useReducedMotion } from "framer-motion";
import clsx from "clsx";
export function DeterministicOrchestration({ className }: { className?: string }) {
const prefersReducedMotion = useReducedMotion();
// Hex coordinates (simple honeycomb layout)
const hexes = [
{ x: 60, y: 25 },
{ x: 100, y: 25 },
{ x: 140, y: 25 },
{ x: 40, y: 65 },
{ x: 80, y: 65 },
{ x: 120, y: 65 },
{ x: 160, y: 65 },
{ x: 60, y: 105 },
{ x: 100, y: 105 },
{ x: 140, y: 105 },
];
// simple hex path generator
const hexPath = (cx: number, cy: number, r = 14) => {
const p = (a: number) => ({
x: cx + r * Math.cos((Math.PI / 180) * a),
y: cy + r * Math.sin((Math.PI / 180) * a),
});
const pts = [30, 90, 150, 210, 270, 330].map((a) => p(a));
return `M ${pts[0].x} ${pts[0].y} L ${pts[1].x} ${pts[1].y} L ${pts[2].x} ${pts[2].y}
L ${pts[3].x} ${pts[3].y} L ${pts[4].x} ${pts[4].y} L ${pts[5].x} ${pts[5].y} Z`;
};
return (
<div
className={clsx(
"w-full h-24 flex items-center justify-center bg-[#0a0a0a]",
className
)}
aria-hidden="true"
role="img"
>
<svg viewBox="0 0 200 140" className="w-full h-full" fill="none">
{/* Hex outlines */}
{hexes.map((h, i) => (
<motion.path
key={i}
d={hexPath(h.x, h.y)}
stroke="#4B5563" // gray-600
strokeWidth={1.6}
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.6, delay: 0.03 * i }}
/>
))}
{/* Deterministic sequence highlight — hexes fill in predictable order */}
{hexes.map((h, i) => (
<motion.path
key={`fill-${i}`}
d={hexPath(h.x, h.y)}
fill="#00b8db"
initial={{ opacity: 0 }}
animate={{
opacity:
prefersReducedMotion
? 1
: [0, 1, 1, 0], // flash on, stay, fade
}}
transition={{
duration: 1.2,
delay: i * 0.12,
repeat: prefersReducedMotion ? 0 : Infinity,
repeatDelay: 0.6,
ease: "easeInOut",
}}
/>
))}
{/* Optional center stability indicator */}
<motion.circle
cx={100}
cy={65}
r={5}
fill="#00b8db"
initial={{ scale: 0.8, opacity: 0 }}
animate={{
opacity: 1,
scale: prefersReducedMotion ? 1 : [1, 1.15, 1],
}}
transition={{
duration: 1.6,
repeat: prefersReducedMotion ? 0 : Infinity,
repeatType: "mirror",
ease: [0.22, 1, 0.36, 1],
}}
/>
</svg>
</div>
);
}

View File

@@ -0,0 +1,112 @@
"use client";
import { motion, useReducedMotion } from "framer-motion";
import clsx from "clsx";
export function MeshNetworkIcon({ className }: { className?: string }) {
const prefersReducedMotion = useReducedMotion();
const nodes = [
{ x: 50, y: 25 },
{ x: 120, y: 25 },
{ x: 150, y: 65 },
{ x: 120, y: 100 },
{ x: 60, y: 100 },
{ x: 30, y: 65 },
{ x: 90, y: 55 }, // center-ish node
];
// Lines between nodes (pairs of indices)
const links: [number, number][] = [
[0, 6], [6, 1],
[1, 2], [2, 3],
[3, 6], [6, 4],
[4, 5], [5, 0],
];
return (
<div
className={clsx(
"w-full h-24 flex items-center justify-center bg-[#0a0a0a]",
className
)}
aria-hidden="true"
role="img"
>
<svg
viewBox="0 0 180 120"
className="w-full h-full"
fill="none"
>
{/* Lines */}
{links.map(([a, b], i) => (
<motion.line
key={i}
x1={nodes[a].x}
y1={nodes[a].y}
x2={nodes[b].x}
y2={nodes[b].y}
stroke="#4B5563" /* gray-600 */
strokeWidth={1.5}
initial={{ pathLength: 0, opacity: 0 }}
animate={{ pathLength: 1, opacity: 1 }}
transition={{
delay: 0.1 * i,
duration: 0.5,
ease: [0.22, 1, 0.36, 1],
}}
/>
))}
{/* Nodes */}
{nodes.map((n, i) => (
<motion.circle
key={i}
cx={n.x}
cy={n.y}
r={6}
fill="#00b8db" // cyan nodes
initial={{ scale: 0.8, opacity: 0 }}
animate={{
opacity: 1,
scale:
!prefersReducedMotion && i !== 6 // central node pulses more
? [1, 1.12, 1]
: 1,
}}
transition={{
duration: 1.4,
repeat: i !== 6 && !prefersReducedMotion ? Infinity : 0,
repeatType: "mirror",
ease: [0.22, 1, 0.36, 1],
delay: 0.05 * i,
}}
/>
))}
{/* Center node extra pulse */}
<motion.circle
cx={nodes[6].x}
cy={nodes[6].y}
r={10}
stroke="#00b8db"
strokeWidth={1}
fill="none"
initial={{ scale: 0 }}
animate={{
scale:
prefersReducedMotion
? 0
: [0.6, 1.3, 0.6],
opacity: [0.3, 0.8, 0.3],
}}
transition={{
duration: 1.8,
repeat: prefersReducedMotion ? 0 : Infinity,
repeatType: "mirror",
}}
/>
</svg>
</div>
);
}

View File

@@ -0,0 +1,113 @@
"use client";
import { motion, useReducedMotion } from "framer-motion";
import clsx from "clsx";
export function SovereignComputer({ className }: { className?: string }) {
const prefersReducedMotion = useReducedMotion();
return (
<div
className={clsx(
"w-full h-24 flex items-center justify-center bg-[#0a0a0a]",
className
)}
aria-hidden="true"
role="img"
>
<svg viewBox="0 0 180 120" className="w-full h-full" fill="none">
{/* Outer secure boundary (shield / isolation) */}
<motion.rect
x={40}
y={20}
width={100}
height={80}
rx={14}
stroke="#4B5563"
strokeWidth={2}
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.6 }}
/>
{/* Inner compute chip */}
<motion.rect
x={70}
y={45}
width={40}
height={30}
rx={4}
fill="#00b8db"
initial={{ scale: 0.8, opacity: 0 }}
animate={{
opacity: 1,
scale:
!prefersReducedMotion
? [1, 1.12, 1]
: 1,
}}
transition={{
duration: 1.6,
repeat: prefersReducedMotion ? 0 : Infinity,
repeatType: "mirror",
ease: [0.22, 1, 0.36, 1],
}}
/>
{/* Compute lines out → show isolation of data paths */}
{[
[90, 45, 90, 20],
[90, 75, 90, 100],
[70, 60, 40, 60],
[110, 60, 140, 60],
].map(([x1, y1, x2, y2], i) => (
<motion.line
key={i}
x1={x1}
y1={y1}
x2={x2}
y2={y2}
stroke="#4B5563"
strokeWidth={2}
initial={{ pathLength: 0, opacity: 0 }}
animate={{ pathLength: 1, opacity: 1 }}
transition={{
delay: 0.1 * i,
duration: 0.6,
ease: [0.22, 1, 0.36, 1],
}}
/>
))}
{/* Cyan data pulses traveling outward */}
{[
[90, 45, 90, 20],
[90, 75, 90, 100],
[70, 60, 40, 60],
[110, 60, 140, 60],
].map(([x1, y1, x2, y2], i) => (
<motion.circle
key={`pulse-${i}`}
cx={x1}
cy={y1}
r={3}
fill="#00b8db"
initial={{ opacity: 0 }}
animate={{
opacity: [0, 1, 0],
cx: [x1, x2],
cy: [y1, y2],
}}
transition={{
delay: 0.15 * i,
duration: 1.4,
repeat: prefersReducedMotion ? 0 : Infinity,
repeatType: "loop",
ease: "linear",
}}
/>
))}
</svg>
</div>
);
}

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Button } from '../../components/Button' import { Button } from '@/components/Button'
export function CloudCTA() { export function CloudCTA() {
return ( return (

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts' import { Eyebrow, SectionHeader, P, Small } from '@/components/Texts'
type Step = { type Step = {
number: string number: string

View File

@@ -1,8 +1,8 @@
import { useId } from 'react' import { useId } from 'react'
import { Button } from '../../components/Button' import { Button } from '@/components/Button'
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, H2, P, H5 } from '../../components/Texts' import { Eyebrow, H2, P, H5 } from '@/components/Texts'
function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) { function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) {
const id = useId() const id = useId()

View File

@@ -1,6 +1,6 @@
'use client' 'use client'
import { Button } from '../../components/Button' import { Button } from '@/components/Button'
export function CloudHeroAlt() { export function CloudHeroAlt() {
return ( return (

View File

@@ -1,6 +1,6 @@
import { CircleBackground } from '../../components/CircleBackground' import { CircleBackground } from '@/components/CircleBackground'
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts' import { Eyebrow, SectionHeader, P, Small } from '@/components/Texts'
const focusAreas = [ const focusAreas = [
{ {

View File

@@ -1,4 +1,4 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
const computeFeatures = [ const computeFeatures = [
{ {

View File

@@ -1,6 +1,6 @@
import { CircleBackground } from '../../components/CircleBackground' import { CircleBackground } from '@/components/CircleBackground'
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts' import { Eyebrow, SectionHeader, P, Small } from '@/components/Texts'
const differentiators = [ const differentiators = [
{ {

View File

@@ -1,6 +1,6 @@
import { CircleBackground } from '../../components/CircleBackground' import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Button } from '../../components/Button' import { Button } from '@/components/Button'
export function CallToAction() { export function CallToAction() {
return ( return (

View File

@@ -3,8 +3,8 @@ import {
CpuChipIcon, CpuChipIcon,
AdjustmentsHorizontalIcon, AdjustmentsHorizontalIcon,
} from '@heroicons/react/24/solid' } from '@heroicons/react/24/solid'
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, H3, CT, CP } from '../../components/Texts' import { Eyebrow, H3, CT, CP } from '@/components/Texts'
const architecture = [ const architecture = [
{ {

View File

@@ -1,58 +1,95 @@
import { 'use client';
CpuChipIcon,
CubeIcon, import { Container } from '@/components/Container'
ServerIcon, import { Eyebrow, H3, P } from '@/components/Texts'
} from '@heroicons/react/24/solid' import { Button } from '@/components/Button'
import { Eyebrow, H3, P, CT, CP } from '../../components/Texts'
import { Container } from '../../components/Container'
const capabilities = [ const capabilities = [
{ {
name: 'Containers', title: 'Containers & K3s',
description: 'Services, web apps, APIs. Fully compatible with Kubernetes.', description:
icon: CubeIcon, 'Deploy services, web apps, and APIs with full Kubernetes compatibility.',
icon: (
<div className=" flex items-center justify-center">
<img src="/images/kubernetes.webp" alt="Kubernetes" className="h-full w-full object-cover" />
</div>
),
}, },
{ {
name: 'Virtual Machines', title: 'Virtual Machines',
description: description:
'Legacy apps and specialized runtime stacks. Secure boot + attestation included.', 'Run legacy apps and specialized stacks with secure boot and attestation.',
icon: ServerIcon, icon: (
<div className="flex items-center justify-center">
<img src="/images/vm.webp" alt="Virtual Machines" className="h-full w-full object-cover" />
</div>
),
}, },
{ {
name: 'Native Linux Workloads', title: 'Native Linux Workloads',
description: description:
'Agents, batch jobs, tooling. Runs statelessly anywhere.', 'Execute agents, batch jobs, and custom tooling statelessly across the grid.',
icon: CpuChipIcon, icon: (
<div className="flex items-center justify-center">
<img src="/images/linux.png" alt="Linux" className="h-full w-full object-cover" />
</div>
),
}, },
] ]
export function ComputeCapabilities() { export function ComputeCapabilities() {
return ( return (
<section className="bg-white py-24 sm:py-32"> <section className="bg-[#121212] w-full max-w-8xl mx-auto">
<Container> {/* Top horizontal spacer */}
<div className="mx-auto max-w-3xl text-center"> <div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
<Eyebrow>CAPABILITIES</Eyebrow> <div className="w-full border-t border-l border-r border-gray-800" />
<H3 className="mt-4 text-gray-900">What You Can Run</H3>
<P className="mt-6 text-gray-600">
Mycelium Compute supports multiple workload types on a single
execution fabric.
</P>
</div>
<div className="mx-auto mt-16 max-w-5xl"> {/* Boxed container */}
<dl className="grid grid-cols-1 gap-12 sm:grid-cols-2 lg:grid-cols-3"> <div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-800 bg-[#111111] py-12">
{capabilities.map((feature) => ( <Container>
<div key={feature.name} className="flex flex-col text-center"> <div className="mx-auto max-w-4xl sm:text-center">
<div className="mx-auto flex size-12 items-center justify-center rounded-xl bg-cyan-50"> <Eyebrow className="text-cyan-400">CAPABILITIES</Eyebrow>
<feature.icon aria-hidden="true" className="size-6 text-cyan-600" /> <H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-white">
</div> What You Can Run
<CT className="mt-6 text-gray-900">{feature.name}</CT> </H3>
<CP className="mt-2 text-gray-600">{feature.description}</CP> <P className="mt-6 text-lg text-gray-300">
</div> Mycelium Compute supports multiple workload types on a single execution
fabric, from legacy VMs to modern Kubernetes clusters.
</P>
</div>
{/* Card layout */}
<ul
role="list"
className="mx-auto mt-12 grid max-w-2xl grid-cols-1 gap-6 text-sm sm:grid-cols-2 lg:max-w-none lg:grid-cols-3 md:gap-y-10"
>
{capabilities.map((capability) => (
<li
key={capability.title}
className="rounded-xl border border-gray-800 bg-[#111]/60 p-6 text-center lg:text-left"
>
{capability.icon}
<h3 className="text-lg font-semibold text-white">{capability.title}</h3>
<p className="mt-2 text-gray-400 leading-snug">{capability.description}</p>
</li>
))} ))}
</dl> </ul>
</div>
</Container> {/* Button section */}
<div className="mx-auto mt-12 flex justify-center gap-6">
<Button variant="solid" color="cyan" href="#">
Get Started
</Button>
<Button variant="outline" color="white" href="#">
Explore Docs
</Button>
</div>
</Container>
</div>
{/* Bottom border + spacer */}
<div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
</section> </section>
) )
} }

View File

@@ -0,0 +1,118 @@
"use client";
import { useRef } from "react";
import { Eyebrow, CP, CT, H5 } from "@/components/Texts";
import { IoArrowBackOutline, IoArrowForwardOutline } from "react-icons/io5";
const capabilities = [
{
isIntro: true,
eyebrow: "CAPABILITIES",
title: "What You Can Run",
description:
"Mycelium Compute supports multiple workload types on a single execution fabric, from legacy VMs to modern Kubernetes clusters.",
},
{
title: "Containers & K3s",
description:
"Deploy services, web apps, and APIs with full Kubernetes compatibility.",
icon: (
<div className="flex items-center justify-center">
<img src="/images/kubernetes.webp" alt="Kubernetes" className="h-full w-full object-cover mb-2" />
</div>
),
},
{
title: "Virtual Machines",
description:
"Run legacy apps and specialized stacks with secure boot and attestation.",
icon: (
<div className="flex items-center justify-center">
<img src="/images/vm.webp" alt="Virtual Machines" className="h-full w-full object-cover mb-2" />
</div>
),
},
{
title: "Native Linux Workloads",
description:
"Execute agents, batch jobs, and custom tooling statelessly across the grid.",
icon: (
<div className="flex items-center justify-center">
<img src="/images/linux.png" alt="Linux" className="h-full w-full object-cover mb-2" />
</div>
),
},
];
export function ComputeCapabilitiesNew() {
const sliderRef = useRef<HTMLUListElement>(null);
const scrollLeft = () => sliderRef.current?.scrollBy({ left: -400, behavior: "smooth" });
const scrollRight = () => sliderRef.current?.scrollBy({ left: 400, behavior: "smooth" });
return (
<section className="bg-[#121212] w-full max-w-8xl mx-auto">
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800" />
<div className="w-full border-t border-l border-r border-gray-800" />
<div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-800 bg-[#111111] overflow-hidden">
{/* Horizontal Slider — shows part of next card */}
<ul
ref={sliderRef}
className="flex overflow-x-auto snap-x snap-mandatory scroll-smooth no-scrollbar"
>
{capabilities.map((item, idx) => (
<li
key={idx}
className={`snap-start shrink-0 w-[85%] sm:w-[50%] lg:w-[33%] border border-gray-800 p-10 relative ${item.isIntro ? 'bg-[#1b1b1b]' : 'bg-[#111]/60'}`}
>
{/* First card with arrows */}
{item.isIntro ? (
<div className="flex flex-col justify-between h-full ">
<div>
<Eyebrow className="">{item.eyebrow}</Eyebrow>
<H5 className="text-white mt-4 lg:text-2xl text-xl">{item.title}</H5>
<p className="mt-4 text-gray-400 lg:text-lg text-sm leading-relaxed">{item.description}</p>
</div>
{/* Arrows inside first card */}
<div className="flex items-center gap-x-4 mt-2">
<a
href="#"
className="inline-flex items-center gap-1 text-cyan-400 hover:text-cyan-300 text-sm font-medium mr-auto"
>
Learn more
</a>
<button
onClick={scrollLeft}
className="h-8 w-8 flex items-center justify-center border border-gray-700 rounded-md hover:border-cyan-500 transition-colors"
>
<IoArrowBackOutline className="text-gray-300" size={16} />
</button>
<button
onClick={scrollRight}
className="h-8 w-8 flex items-center justify-center border border-gray-700 rounded-md hover:border-cyan-500 transition-colors"
>
<IoArrowForwardOutline className="text-gray-300" size={16} />
</button>
</div>
</div>
) : (
<>
{item.icon}
<CT className="text-lg font-semibold text-white mt-4">{item.title}</CT>
<CP className="mt-2 text-gray-400 leading-snug">{item.description}</CP>
</>
)}
</li>
))}
</ul>
</div>
<div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800" />
</section>
);
}

View File

@@ -1,56 +1,54 @@
import { Eyebrow, H3, P, CP, CT } from '@/components/Texts'
import { import {
ShieldCheckIcon,
ArrowPathIcon, ArrowPathIcon,
RocketLaunchIcon, GlobeAltIcon,
ShieldCheckIcon,
} from '@heroicons/react/24/solid' } from '@heroicons/react/24/solid'
import { Container } from '../../components/Container'
import { Eyebrow, H3, P, CT, CP } from '../../components/Texts'
const features = [ const stats = [
{ {
id: 1,
name: 'Cryptographically verified deployments', name: 'Cryptographically verified deployments',
description: 'Every cluster state is signed and checksummed to guarantee truth.', value: 'Signed & Checksummed',
icon: ShieldCheckIcon, icon: ShieldCheckIcon,
}, },
{ {
id: 2,
name: 'Stateless execution that scales anywhere', name: 'Stateless execution that scales anywhere',
description: 'Run workloads on any node, region, or edge without manual orchestration.', value: 'Global Scaling',
icon: RocketLaunchIcon, icon: GlobeAltIcon,
}, },
{ {
id: 3,
name: 'Automatic healing and recovery', name: 'Automatic healing and recovery',
description: 'Self-repairing processes ensure workloads stay available and consistent.', value: 'Self-Repairing',
icon: ArrowPathIcon, icon: ArrowPathIcon,
}, },
] ]
export function ComputeDesign() { export function ComputeDesign() {
return ( return (
<section className="bg-white py-24 sm:py-32"> <div className="">
<Container>
<div className="mx-auto max-w-3xl sm:text-center">
<Eyebrow>CORE VALUE</Eyebrow>
<H3 className="mt-4 text-gray-900">Deterministic by Design</H3>
<P className="mt-6 text-gray-600">
Every workload runs exactly as declared: no drift, no hidden state, no surprises.
</P>
</div>
<div className="mx-auto mt-16 max-w-5xl"> {/* ✅ Top horizontal line with spacing */}
<dl className="grid grid-cols-1 gap-12 text-gray-600 sm:grid-cols-2 lg:grid-cols-3"> <div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
{features.map((feature) => ( <div className="w-full border-t border-l border-r border-gray-200" />
<div key={feature.name} className="relative pl-12">
<feature.icon {/* ✅ Top horizontal line with spacing */}
aria-hidden="true" <div className="mx-auto max-w-7xl border-gray-200">
className="absolute left-0 top-1 size-6 text-cyan-600" <dl className="grid grid-cols-1 gap-4 lg:gap-14 overflow-hidden text-center lg:grid-cols-3">
/> {stats.map((stat) => (
<CT className="font-semibold text-gray-900">{feature.name}</CT> <div key={stat.id} className="flex flex-col items-center bg-gray-400/5 py-8 px-12 border border-gray-200 lg:border-t-0 lg:border-b-0">
<CP className="mt-1 text-gray-600">{feature.description}</CP> <stat.icon className="h-8 w-8 fill-cyan-500 mb-4" aria-hidden="true" />
<CT className="">{stat.value}</CT>
<CP className="mt-1">{stat.name}</CP>
</div> </div>
))} ))}
</dl> </dl>
</div> </div>
</Container> {/* ✅ Bottom horizontal line + spacing */}
</section> <div className="w-full border-b border-gray-200" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
</div>
) )
} }

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts' import { Eyebrow, SectionHeader, P, Small } from '@/components/Texts'
const featureGroups = [ const featureGroups = [
{ {

View File

@@ -1,35 +1,51 @@
'use client' import { H3, Eyebrow } from "@/components/Texts"
import { Button } from "@/components/Button"
import { Button } from '../../components/Button' export function ComputeHero({ onGetStartedClick = () => {} }: { onGetStartedClick?: () => void }) {
import { Eyebrow, P, H3 } from '../../components/Texts'
export function ComputeHero() {
return ( return (
<div className="relative bg-white"> <div className="">
<div className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-1/2"> {/* Boxed container */}
<img <div
alt="" className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-200 bg-white overflow-hidden bg-contain bg-right bg-no-repeat"
src="/images/computehero.webp" style={{ backgroundImage: "url('/images/computehero.webp')", backgroundSize: "contain" }}
className="size-full object-contain" >
/> {/* Inner padding */}
<div className="px-6 py-16 lg:py-16">
</div> <div className="max-w-xl lg:pl-6">
<div className="relative mx-auto max-w-7xl py-12 lg:py-24 lg:px-8"> <Eyebrow>
<div className="max-w-2xl pr-6 pl-6 md:mr-auto md:w-2/3 md:pr-16 lg:w-1/2 lg:pl-0 lg:pr-24"> Mycelium Compute
<Eyebrow className="text-base/7 font-semibold text-cyan-500">COMPUTE</Eyebrow> </Eyebrow>
<H3 className="mt-2 text-gray-900">Deterministic Compute You Control</H3> <H3 className="mt-4">
<P className="mt-6 text-gray-600"> Deterministic Compute You Control
Run workloads on sovereign, self-verifying infrastructure. </H3>
Mycelium Compute delivers predictable execution, zero drift, and automatic healing, whether youre running containers, VMs, agents, or full Kubernetes clusters. <p className="mt-6 text-lg">
</P> Run workloads on sovereign, self-verifying infrastructure.
<div className="mt-12"> Mycelium Compute delivers predictable execution, zero drift, and automatic healing, whether youre running containers, VMs, agents, or full Kubernetes clusters.
<Button href="#" variant="solid" color="cyan"> </p>
How it works <p className="mt-4 lg:text-base italic text-gray-600 text-sm">
</Button> Works Alone. Works Together.
<Button href="#" variant="outline" color="cyan">Explore Docs</Button> Mycelium Compute can run on any network fabric, or pair with Mycelium Network
for sovereign connectivity.
</p>
<div className="mt-10 flex items-center gap-x-6">
<Button
onClick={onGetStartedClick}
variant="solid"
color="cyan"
>
Get started
</Button>
<Button to="#" variant="outline">
Documentation <span aria-hidden="true"></span>
</Button>
</div>
</div> </div>
</div> </div>
</div> </div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-200" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
</div> </div>
) )
} }

View File

@@ -1,6 +1,6 @@
import { CircleBackground } from '../../components/CircleBackground' import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts' import { Eyebrow, SectionHeader, P } from '@/components/Texts'
const overviewCards = [ const overviewCards = [
{ {

View File

@@ -4,9 +4,9 @@ import { ComputeFeatures } from './ComputeFeatures'
import { ComputeArchitecture } from './ComputeArchitecture' import { ComputeArchitecture } from './ComputeArchitecture'
import { ComputeUseCases } from './ComputeUseCases' import { ComputeUseCases } from './ComputeUseCases'
import { CallToAction } from './CallToAction' import { CallToAction } from './CallToAction'
import { ComputeCapabilities } from './ComputeCapabilities'
import { ComputeDesign } from './ComputeDesign' import { ComputeDesign } from './ComputeDesign'
import { ComputeOverview } from './ComputeOverview' import { ComputeOverview } from './ComputeOverview'
import { ComputeCapabilitiesNew } from './ComputeCapabilitiesNew'
export default function ComputePage() { export default function ComputePage() {
@@ -17,7 +17,7 @@ export default function ComputePage() {
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<ComputeCapabilities /> <ComputeCapabilitiesNew />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader } from '../../components/Texts' import { Eyebrow, SectionHeader } from '@/components/Texts'
const useCases = [ const useCases = [
{ {

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts' import { Eyebrow, SectionHeader, P } from '@/components/Texts'
const codeSamples = [ const codeSamples = [
{ {

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts' import { Eyebrow, SectionHeader, P } from '@/components/Texts'
const differentiators = [ const differentiators = [
{ {

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts' import { Eyebrow, SectionHeader, P } from '@/components/Texts'
const primaryUseCases = [ const primaryUseCases = [
{ {
@@ -112,7 +112,7 @@ export function ComputeUseCases() {
{computeSpecific.map((useCase) => ( {computeSpecific.map((useCase) => (
<div <div
key={useCase.title} key={useCase.title}
className="rounded-3xl border border-cyan-400/20 bg-gradient-to-br from-cyan-500/10 via-cyan-500/5 to-transparent p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-200/40 hover:from-cyan-400/20 hover:via-cyan-400/10" className="rounded-3xl border border-cyan-400/20 bg-linear-to-br from-cyan-500/10 via-cyan-500/5 to-transparent p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-200/40 hover:from-cyan-400/20 hover:via-cyan-400/10"
> >
<h3 className="text-xl font-semibold text-white"> <h3 className="text-xl font-semibold text-white">
{useCase.title} {useCase.title}

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts' import { Eyebrow, SectionHeader, P } from '@/components/Texts'
const zeroImageBenefits = [ const zeroImageBenefits = [
'Metadata-only artifacts replace heavy images for ultra-fast delivery.', 'Metadata-only artifacts replace heavy images for ultra-fast delivery.',
@@ -10,11 +10,11 @@ const zeroImageBenefits = [
export function ComputeZeroImage() { export function ComputeZeroImage() {
return ( return (
<section className="relative overflow-hidden bg-gradient-to-b from-cyan-950 via-gray-950 to-gray-950 py-24 sm:py-32"> <section className="relative overflow-hidden bg-linear-to-b from-cyan-950 via-gray-950 to-gray-950 py-24 sm:py-32">
<div className="pointer-events-none absolute inset-0"> <div className="pointer-events-none absolute inset-0">
<div className="absolute -top-32 right-1/4 h-72 w-72 rounded-full bg-cyan-500/30 blur-[120px]" /> <div className="absolute -top-32 right-1/4 h-72 w-72 rounded-full bg-cyan-500/30 blur-[120px]" />
<div className="absolute bottom-0 left-1/3 h-96 w-96 rounded-full bg-cyan-400/10 blur-[140px]" /> <div className="absolute bottom-0 left-1/3 h-96 w-96 rounded-full bg-cyan-400/10 blur-[140px]" />
<div className="absolute inset-0 bg-[radial-gradient(circle_at_left,_rgba(8,145,178,0.18),_transparent_55%)]" /> <div className="absolute inset-0 bg-[radial-gradient(circle_at_left,rgba(8,145,178,0.18),transparent_55%)]" />
</div> </div>
<Container className="relative"> <Container className="relative">
<div className="grid items-center gap-12 lg:grid-cols-[0.85fr_1.15fr]"> <div className="grid items-center gap-12 lg:grid-cols-[0.85fr_1.15fr]">

View File

@@ -1,6 +1,6 @@
import { CircleBackground } from '../../components/CircleBackground' import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Button } from '../../components/Button' import { Button } from '@/components/Button'
export function CallToAction() { export function CallToAction() {
return ( return (

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader } from '../../components/Texts' import { Eyebrow, SectionHeader } from '@/components/Texts'
const architecture = [ const architecture = [
{ {

View File

@@ -4,8 +4,8 @@ import {
CubeTransparentIcon, CubeTransparentIcon,
CpuChipIcon, CpuChipIcon,
} from '@heroicons/react/24/solid' } from '@heroicons/react/24/solid'
import { Eyebrow, H3, CT, CP } from '../../components/Texts' import { Eyebrow, H3, CT, CP } from '@/components/Texts'
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
const capabilities = [ const capabilities = [
{ {

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, H3, CT } from '../../components/Texts' import { Eyebrow, H3, CT } from '@/components/Texts'
import { import {
BoltIcon, BoltIcon,
BanknotesIcon, BanknotesIcon,

View File

@@ -1,42 +1,40 @@
'use client' 'use client'
import { Button } from '../../components/Button' import { Button } from '@/components/Button'
import { Eyebrow, SectionHeader, P } from '../../components/Texts' import { Eyebrow, H3 } from '@/components/Texts'
export function GpuHero() { export function GpuHero() {
return ( return (
<div className="relative bg-white"> <div className="">
<div className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-1/2"> {/* Boxed container */}
<img <div
alt="Mycelium GPU nebula illustration" className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-200 bg-white overflow-hidden bg-contain bg-right bg-no-repeat"
src="/images/gpuhero2.png" style={{ backgroundImage: "url('/images/gpuhero2.png')", backgroundSize: "contain" }}
className="size-full object-contain" >
/> {/* Inner padding */}
</div> <div className="px-6 py-16 lg:py-16">
<div className="relative mx-auto max-w-7xl py-24 lg:py-32 lg:px-8"> <div className="max-w-2xl lg:pl-6">
<div className="pr-6 pl-6 md:mr-auto md:w-2/3 md:pr-16 lg:w-1/2 lg:pl-0 lg:pr-24 "> <Eyebrow>Mycelium GPU</Eyebrow>
<Eyebrow className="tracking-[0.35em] uppercase text-cyan-500"> <H3 as="h1" className="mt-4">
Mycelium GPU Sovereign GPU Acceleration for AI and High-Performance Compute
</Eyebrow> </H3>
<SectionHeader as="h1" className="mt-4 text-gray-900"> <p className="mt-6 text-lg">
Sovereign GPU Acceleration for AI and High-Performance Compute Access GPUs across the Mycelium mesh without waitlists, inflated pricing, or centralized control. Run inference, training, and compute workloads where they make sense: cloud, edge, or on your own hardware.
</SectionHeader> </p>
<P className="mt-6 text-gray-600"> <div className="mt-10 flex items-center gap-x-6">
Access GPUs across the Mycelium mesh without waitlists, <Button to="#gpu-getting-started" as="a" variant="solid" color="cyan">
inflated pricing, or centralized control. How it works
Run inference, training, and compute workloads where they make sense: </Button>
cloud, edge, or on your own hardware. <Button to="#gpu-architecture" as="a" variant="outline">
</P> Explore Docs <span aria-hidden="true"></span>
<div className="mt-10 flex flex-wrap gap-4"> </Button>
<Button to="#gpu-getting-started" as="a" variant="solid" color="cyan"> </div>
How it works
</Button>
<Button to="#gpu-architecture" as="a" variant="outline" color="cyan">
Explore Docs
</Button>
</div> </div>
</div> </div>
</div> </div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-200" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
</div> </div>
) )
} }

View File

@@ -4,8 +4,8 @@ import {
BanknotesIcon, BanknotesIcon,
} from '@heroicons/react/24/outline' } from '@heroicons/react/24/outline'
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts' import { Eyebrow, SectionHeader, P } from '@/components/Texts'
const coreFeatures = [ const coreFeatures = [
{ {

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts' import { Eyebrow, SectionHeader, P } from '@/components/Texts'
const gpuUseCases = [ const gpuUseCases = [
{ {

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts' import { Eyebrow, SectionHeader, P } from '@/components/Texts'
const architectureSections = [ const architectureSections = [
{ {

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts' import { Eyebrow, SectionHeader, P } from '@/components/Texts'
const differentiators = [ const differentiators = [
{ {
@@ -52,7 +52,7 @@ export function GpuDifferentiators() {
{differentiators.map((item) => ( {differentiators.map((item) => (
<div <div
key={item.title} key={item.title}
className="rounded-3xl border border-white/10 bg-white/[0.04] p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/[0.08]" className="rounded-3xl border border-white/10 bg-white/4 p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/8"
> >
<h3 className="text-lg font-semibold text-white">{item.title}</h3> <h3 className="text-lg font-semibold text-white">{item.title}</h3>
<p className="mt-4 text-sm leading-relaxed text-gray-300"> <p className="mt-4 text-sm leading-relaxed text-gray-300">
@@ -61,7 +61,7 @@ export function GpuDifferentiators() {
</div> </div>
))} ))}
</div> </div>
<div className="mt-16 rounded-3xl border border-white/10 bg-white/[0.03] p-8 text-left backdrop-blur-sm"> <div className="mt-16 rounded-3xl border border-white/10 bg-white/3 p-8 text-left backdrop-blur-sm">
<h3 className="text-xl font-semibold text-white">Cost Efficiency</h3> <h3 className="text-xl font-semibold text-white">Cost Efficiency</h3>
<p className="mt-4 text-sm leading-relaxed text-gray-300"> <p className="mt-4 text-sm leading-relaxed text-gray-300">
Transparent economics makes capacity planning simple while keeping Transparent economics makes capacity planning simple while keeping

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts' import { Eyebrow, SectionHeader, P, Small } from '@/components/Texts'
const steps = [ const steps = [
{ {
@@ -44,7 +44,7 @@ export function GpuGettingStarted() {
id="gpu-getting-started" id="gpu-getting-started"
className="relative overflow-hidden bg-gray-900 py-24 sm:py-32" className="relative overflow-hidden bg-gray-900 py-24 sm:py-32"
> >
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top,_rgba(34,211,238,0.12),_transparent_60%)]" /> <div className="absolute inset-0 bg-[radial-gradient(circle_at_top,rgba(34,211,238,0.12),transparent_60%)]" />
<Container className="relative"> <Container className="relative">
<div className="mx-auto max-w-3xl text-center"> <div className="mx-auto max-w-3xl text-center">
<Eyebrow className="tracking-[0.32em] uppercase text-cyan-300"> <Eyebrow className="tracking-[0.32em] uppercase text-cyan-300">
@@ -63,7 +63,7 @@ export function GpuGettingStarted() {
{steps.map((step) => ( {steps.map((step) => (
<div <div
key={step.title} key={step.title}
className="flex h-full flex-col rounded-3xl border border-white/10 bg-white/[0.03] p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/[0.06]" className="flex h-full flex-col rounded-3xl border border-white/10 bg-white/3 p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/6"
> >
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<Small className="text-xs uppercase tracking-[0.4em] text-cyan-300"> <Small className="text-xs uppercase tracking-[0.4em] text-cyan-300">
@@ -91,7 +91,7 @@ export function GpuGettingStarted() {
</div> </div>
))} ))}
</div> </div>
<div className="mt-16 rounded-3xl border border-white/10 bg-white/[0.03] p-6 text-center backdrop-blur-sm"> <div className="mt-16 rounded-3xl border border-white/10 bg-white/3 p-6 text-center backdrop-blur-sm">
<p className="text-sm font-medium uppercase tracking-[0.3em] text-cyan-200"> <p className="text-sm font-medium uppercase tracking-[0.3em] text-cyan-200">
Basic Workflow Basic Workflow
</p> </p>

View File

@@ -1,5 +1,5 @@
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts' import { Eyebrow, SectionHeader, P } from '@/components/Texts'
const integrationPoints = [ const integrationPoints = [
'Unified Mycelium networking provides secure access to GPU nodes.', 'Unified Mycelium networking provides secure access to GPU nodes.',
@@ -50,7 +50,7 @@ export function GpuIntegration() {
</P> </P>
</div> </div>
<div className="mt-16 grid gap-10 lg:grid-cols-2"> <div className="mt-16 grid gap-10 lg:grid-cols-2">
<div className="space-y-4 rounded-3xl border border-white/10 bg-white/[0.04] p-8 text-left backdrop-blur-sm"> <div className="space-y-4 rounded-3xl border border-white/10 bg-white/4 p-8 text-left backdrop-blur-sm">
<h3 className="text-lg font-semibold text-white"> <h3 className="text-lg font-semibold text-white">
Platform alignment Platform alignment
</h3> </h3>
@@ -66,7 +66,7 @@ export function GpuIntegration() {
))} ))}
</ul> </ul>
</div> </div>
<div className="rounded-3xl border border-white/10 bg-white/[0.04] p-8 backdrop-blur-sm"> <div className="rounded-3xl border border-white/10 bg-white/4 p-8 backdrop-blur-sm">
<h3 className="text-lg font-semibold text-white"> <h3 className="text-lg font-semibold text-white">
Kubernetes deployment example Kubernetes deployment example
</h3> </h3>

View File

@@ -1,18 +1,18 @@
import { CircleBackground } from '../../components/CircleBackground' import { Container } from '@/components/Container'
import { Container } from '../../components/Container' import { Button } from '@/components/Button'
import { Button } from '../../components/Button'
export function CallToAction() { export function CallToAction() {
return ( return (
<section <section className='relative overflow-hidden bg-gray-900'>
{/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-[#111111] mx-auto py-6 border border-t-0 border-b-0 border-gray-600"></div>
{/* === Content === */}
<div className="w-full border-t border-l border-r border-gray-600 " />
<div
id="get-started" id="get-started"
className="relative overflow-hidden bg-gray-900 lg:py-32 py-24" className="py-18 max-w-7xl mx-auto border-t-0 border-b-0 border bg-[#111111] border-gray-600">
>
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
<CircleBackground color="#06b6d4" className="animate-spin-slower" />
</div>
<Container className="relative"> <Container className="relative">
<div className="mx-auto max-w-xl text-center"> <div className="mx-auto max-w-2xl text-center ">
<h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl"> <h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
Use the Mycelium Stack Your Way Use the Mycelium Stack Your Way
</h2> </h2>
@@ -38,6 +38,11 @@ export function CallToAction() {
</div> </div>
</div> </div>
</Container> </Container>
</div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-600" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-600"></div>
</section> </section>
) )
} }

View File

@@ -1,41 +1,49 @@
export function HomeAurora() { import { H1, H5 } from "@/components/Texts"
return ( import { Button } from "@/components/Button"
<div
className="absolute inset-0 -z-10 h-full w-full"
style={{
backgroundImage: "url('/images/cloud.png')",
backgroundSize: "cover",
backgroundPosition: "center",
backgroundRepeat: "no-repeat",
}}
>
<div className="relative isolate px-6 lg:px-8">
{/* Top cyan soft blob */}
<div
aria-hidden="true"
className="absolute inset-x-0 -top-40 -z-10 transform-gpu overflow-hidden blur-3xl sm:-top-80"
>
<div
style={{
clipPath:
'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)',
}}
className="relative left-[calc(50%-11rem)] aspect-1155/678 w-144.5 -translate-x-1/2 rotate-30 bg-linear-to-tr from-[#00eaff] to-[#009dff] opacity-10 sm:left-[calc(50%-30rem)] sm:w-288.75"
/>
</div>
{/* Bottom cyan soft blob */} export function HomeAurora({ onGetStartedClick }: { onGetStartedClick: () => void }) {
<div return (
aria-hidden="true" <div className="px-4">
className="absolute inset-x-0 top-[calc(100%-13rem)] -z-10 transform-gpu overflow-hidden blur-3xl lg:top-[calc(100%-30rem)]" {/* Boxed container */}
> <div
<div className="relative mx-auto max-w-7xl border border-t-0 border-gray-200 bg-white overflow-hidden bg-contain bg-right bg-no-repeat"
style={{ style={{ backgroundImage: "url('/images/hero11.webp')" }}
clipPath: >
'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)', {/* Inner padding */}
}} <div className="px-6 py-16 lg:py-32 ">
className="relative left-[calc(50%+3rem)] aspect-1155/678 w-144.5 -translate-x-1/2 bg-linear-to-tr from-[#00eaff] to-[#009dff] opacity-10 lg:left-[calc(50%+36rem)] lg:w-288.75" <div className="max-w-2xl lg:pl-6">
/> <div className="hidden sm:flex">
<div className="relative rounded-full px-3 py-1 text-sm/6 text-gray-500 ring-1 ring-gray-900/10 hover:ring-gray-900/20">
Deploying at scale?{' '}
<a href="#" className="font-semibold whitespace-nowrap text-cyan-600">
<span aria-hidden="true" className="absolute inset-0" />
Book a call <span>&rarr;</span>
</a>
</div>
</div>
<H1 className="mt-8">
The Sovereign Agentic Cloud
</H1>
<H5 className="mt-8 text-lg text-gray-600">
Host nodes, deploy workloads, or build private AI systems,
all on infrastructure you own and control.
</H5>
<div className="mt-10 flex items-center gap-x-6">
<Button
variant="solid"
color="cyan"
onClick={onGetStartedClick}
>
Start Hosting
</Button>
<Button to="#" variant="outline">
Deploy in Cloud
</Button>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -34,7 +34,7 @@ export function HomeBenefits() {
}, },
]; ];
return ( return (
<div className="relative z-20 py-10 lg:py-24 max-w-7xl mx-auto"> <div className="relative z-20 bg-blackpy-6 lg:py-24 max-w-7xl mx-auto border border-t-0 border-gray-200">
<div className="px-12"> <div className="px-12">
<Eyebrow className="text-center text-cyan-500"> <Eyebrow className="text-center text-cyan-500">
Benefits Benefits
@@ -44,7 +44,7 @@ export function HomeBenefits() {
</H2> </H2>
</div> </div>
<div className="mt-10 grid grid-cols-1 gap-4 sm:mt-16 lg:grid-cols-7 lg:grid-rows-2 lg:px-12 px-6"> <div className="mt-10 grid grid-cols-1 gap-4 lg:grid-cols-7 lg:grid-rows-2 lg:px-12 px-6">
<div className="flex p-px lg:col-span-4"> <div className="flex p-px lg:col-span-4">
<div className="w-full overflow-hidden rounded-lg bg-white/40 dark:bg-black/40 shadow-sm border border-transparent transition-all duration-300 hover:scale-105 hover:shadow-lg hover:shadow-cyan-500/50 hover:border-cyan-500 max-lg:rounded-t-4xl lg:rounded-tl-4xl"> <div className="w-full overflow-hidden rounded-lg bg-white/40 dark:bg-black/40 shadow-sm border border-transparent transition-all duration-300 hover:scale-105 hover:shadow-lg hover:shadow-cyan-500/50 hover:border-cyan-500 max-lg:rounded-t-4xl lg:rounded-tl-4xl">
<div className="flex items-center"> <div className="flex items-center">
@@ -129,7 +129,7 @@ export function HomeBenefits() {
export const SkeletonOne = () => { export const SkeletonOne = () => {
return ( return (
<div className="relative flex py-8 px-2 gap-10 h-full"> <div className="relative flex py-6 px-2 gap-10 h-full">
<div className="w-full p-5 mx-auto bg-white dark:bg-neutral-900 shadow-2xl group h-full"> <div className="w-full p-5 mx-auto bg-white dark:bg-neutral-900 shadow-2xl group h-full">
<div className="flex flex-1 w-full h-full flex-col space-y-2 "> <div className="flex flex-1 w-full h-full flex-col space-y-2 ">
{/* TODO */} {/* TODO */}
@@ -207,7 +207,7 @@ export const SkeletonTwo = () => {
}} }}
whileHover="whileHover" whileHover="whileHover"
whileTap="whileTap" whileTap="whileTap"
className="rounded-xl -mr-4 mt-4 p-1 bg-white dark:bg-neutral-800 dark:border-neutral-700 border border-neutral-100 shrink-0 overflow-hidden" className="rounded-xl -mr-4 mt-4 p-1 bg-black s border-neutral-100 shrink-0 overflow-hidden"
> >
<img <img
src={image} src={image}

View File

@@ -1,8 +1,9 @@
"use client";
import { Container } from '../../components/Container' import { Container } from '@/components/Container'
import {Eyebrow, H3, P } from '../../components/Texts' import { Eyebrow, H3, P } from '@/components/Texts'
/* ✅ Custom Icons */ /* ✅ Custom Icons (unchanged) */
function KubernetesIcon(props: React.ComponentPropsWithoutRef<'svg'>) { function KubernetesIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
return ( return (
@@ -82,8 +83,6 @@ function VPNIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
) )
} }
/* ✅ Updated Feature List */
const features = [ const features = [
{ {
name: 'Kubernetes Clusters', name: 'Kubernetes Clusters',
@@ -107,52 +106,53 @@ const features = [
}, },
] ]
/* ✅ Component */
export function HomeHosting() { export function HomeHosting() {
return ( return (
<section <section className="w-full max-w-8xl mx-auto bg-transparent">
id="comingsoon"
aria-label="Features"
className="py-20 sm:py-32 relative isolate overflow-hidden"
style={{
backgroundImage: "url('/images/bg2.jpg')",
backgroundSize: 'cover',
backgroundPosition: 'center',
backgroundRepeat: 'no-repeat',
}}
>
{/* ✅ Soft overlay for readable text */}
<div className="absolute inset-0 bg-white/60 backdrop-blur-[1px]" />
<Container className="relative z-10"> {/* ✅ Top horizontal line with spacing */}
<div className="mx-auto max-w-4xl sm:text-center"> <div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
<Eyebrow className="text-cyan-500">IN ACTIVE EVOLUTION</Eyebrow> <div className="w-full border-t border-l border-r border-gray-200" />
<H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-900">
Expanding the Network Layer
</H3>
<P className="mt-6 text-lg text-gray-600">
The Mycelium Network is evolving to support richer data movement, identity, and application connectivity across the mesh.
These enhancements deepen autonomy and improve real-world usability.
</P>
</div>
<ul
role="list" {/* ✅ Inner content container */}
className="mx-auto mt-12 grid max-w-2xl grid-cols-1 gap-6 text-sm sm:grid-cols-2 md:gap-y-10 lg:max-w-none lg:grid-cols-4" <div className="max-w-7xl bg-white mx-auto py-12 border border-t-0 border-b-0 border-gray-200">
> <Container>
{features.map((feature) => ( <div className="mx-auto max-w-4xl sm:text-center">
<li <Eyebrow className="text-cyan-500">IN ACTIVE EVOLUTION</Eyebrow>
key={feature.name} <H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-900">
className="rounded-2xl border border-gray-200 px-8 py-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/70 backdrop-blur-sm" Expanding the Network Layer
</H3>
<P className="mt-6 text-lg text-gray-600">
The Mycelium Network is evolving to support richer data movement, identity,
and application connectivity across the mesh. These enhancements deepen autonomy
and improve real-world usability.
</P>
</div>
<ul
role="list"
className="mx-auto mt-12 grid max-w-2xl grid-cols-1 gap-6 text-sm
sm:grid-cols-2 lg:max-w-none lg:grid-cols-4 md:gap-y-10"
> >
<feature.icon className="h-12 w-12" /> {features.map((feature) => (
<p className="mt-6 font-semibold text-gray-900 text-sm lg:text-base leading-tight">{feature.name}</p> <li
<p className="mt-2 text-gray-700 leading-tight">{feature.description}</p> key={feature.name}
</li> className="rounded-md border border-gray-200 p-6 transition-all duration-300 ease-in-out
))} hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20 bg-white"
</ul> >
</Container> <feature.icon className="h-14 w-14" />
<h3 className="mt-4 font-semibold text-gray-900">{feature.name}</h3>
<p className="mt-2 text-gray-700 leading-snug">{feature.description}</p>
</li>
))}
</ul>
</Container>
</div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-200" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
</section> </section>
) )
} }

View File

@@ -1,63 +1,45 @@
import { useRef } from 'react'
import { AnimatedSection } from '../../components/AnimatedSection' import { AnimatedSection } from '../../components/AnimatedSection'
import { HomeHero } from './HomeHero'
import { StackSectionDark } from './StackSectionDark' import { StackSectionDark } from './StackSectionDark'
import { WorldMap } from './HomeGlobe' import { WorldMap } from './HomeGlobe'
import { HomeBenefits } from './HomeBenefits'
import { CallToAction } from './CallToAction' import { CallToAction } from './CallToAction'
import { HomeSlider } from './HomeSlider'
import { HomeHosting } from './HomeHosting' import { HomeHosting } from './HomeHosting'
import { HomeGlobeNew } from './HomeGlobeNew' import { HomeAurora } from './HomeAurora'
import { HomeStat } from './HomeStat' import { HomeTab } from './HomeTab'
import { HomeApplication } from './HomeTabs'
import { HomeStack } from './HomeStack'
import { HomeUniverse } from './HomeUniverse'
import { HomeProductsA } from './HomeProductsA'
import { HomeWhy } from './HomeWhy'
import { HomeCTA } from './HomeCTA'
export default function HomePage() { export default function HomePage() {
const sliderRef = useRef<HTMLDivElement>(null)
const handleScrollToSlider = () => {
sliderRef.current?.scrollIntoView({ behavior: 'smooth' })
}
return ( return (
<div> <div>
<AnimatedSection> <AnimatedSection>
<HomeHero /> <HomeAurora onGetStartedClick={handleScrollToSlider} />
</AnimatedSection>
<AnimatedSection id="next-section">
<WorldMap />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<HomeGlobeNew /> <HomeHosting />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<HomeStat /> <StackSectionDark />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<HomeApplication /> <HomeTab />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<HomeStack /> <CallToAction />
</AnimatedSection>
<AnimatedSection>
<HomeUniverse />
</AnimatedSection>
<AnimatedSection>
<HomeProductsA />
</AnimatedSection>
<AnimatedSection>
<HomeWhy />
</AnimatedSection>
<AnimatedSection>
<HomeCTA />
</AnimatedSection> </AnimatedSection>
</div> </div>
) )

127
src/pages/home/HomeTab.tsx Normal file
View File

@@ -0,0 +1,127 @@
"use client";
import { Link } from "react-router-dom";
import { Eyebrow, H3, P } from "@/components/Texts";
const bentoCards = [
{
id: 'network',
title: 'Mycelium Network',
eyebrow: 'Network',
description: 'Encrypted peer-to-peer mesh networking across the globe.',
image: '/images/bento-network.png',
link: '/network',
colSpan: 'lg:col-span-3',
rowSpan: 'lg:row-span-1',
rounded: 'lg:rounded-tl-4xl max-lg:rounded-t-4xl',
innerRounded: 'lg:rounded-tl-[calc(2rem+1px)] max-lg:rounded-t-[calc(2rem+1px)]'
},
{
id: 'agents',
title: 'Mycelium Agents',
eyebrow: 'Agents',
description: 'Private, programmable AI systems that run on your hardware.',
image: '/images/bento-agent.jpg',
link: '/agents',
colSpan: 'lg:col-span-3',
rowSpan: 'lg:row-span-1',
rounded: 'lg:rounded-tr-4xl',
innerRounded: 'lg:rounded-tr-[calc(2rem+1px)]'
},
{
id: 'cloud',
title: 'Mycelium Cloud',
eyebrow: 'Cloud',
description: 'Deploy Kubernetes clusters on sovereign infrastructure.',
image: '/images/bento-cloud.jpg',
link: '/cloud',
colSpan: 'lg:col-span-6',
rowSpan: 'lg:row-span-1',
rounded: 'rounded-lg',
innerRounded: 'rounded-[calc(var(--radius-lg)+1px)]'
},
{
id: 'compute',
title: 'Mycelium Compute',
eyebrow: 'Compute',
description: 'The Compute resource layers powering the stack.',
image: '/images/bento-compute.png',
link: '/compute',
colSpan: 'lg:col-span-2',
rowSpan: 'lg:row-span-1',
rounded: 'lg:rounded-bl-4xl',
innerRounded: 'lg:rounded-bl-[calc(2rem+1px)]'
},
{
id: 'storage',
title: 'Mycelium Storage',
eyebrow: 'Storage',
description: 'The Storage resource layers powering the stack.',
image: '/images/bento-storage.png',
link: '/storage',
colSpan: 'lg:col-span-2',
rowSpan: 'lg:row-span-1',
rounded: 'rounded-lg',
innerRounded: 'rounded-[calc(var(--radius-lg)+1px)]'
},
{
id: 'gpu',
title: 'Mycelium GPU',
eyebrow: 'GPU',
description: 'The GPU resource layers powering the stack.',
image: '/images/bento-gpu.jpg',
link: '/gpu',
colSpan: 'lg:col-span-2',
rowSpan: 'lg:row-span-1',
rounded: 'lg:rounded-br-4xl max-lg:rounded-b-4xl',
innerRounded: 'lg:rounded-br-[calc(2rem+1px)] max-lg:rounded-b-[calc(2rem+1px)]'
},
];
export function HomeTab() {
return (
<section className="w-full max-w-8xl mx-auto bg-transparent">
{/* ✅ Top spacer + full-width line */}
<div className="max-w-7xl mx-auto py-6 border-x border-gray-200 bg-white border-t-0 border-b-0" />
<div className="w-full border-t border-l border-r border-gray-200" />
{/* ✅ Section with vertical borders */}
<div className="mx-auto bg-white max-w-2xl px-6 lg:max-w-7xl lg:px-10 border border-t-0 border-b-0 border-gray-200">
<Eyebrow className="pt-12 ">Deploy faster</Eyebrow>
<H3 className="mt-2">Mycelium Components</H3>
<P className="mt-6 max-w-lg">
Each component can be used on its own or combined into a fully sovereign cloud.
</P>
<div className="mt-8 grid grid-cols-1 gap-6 sm:mt-10 lg:grid-cols-6 lg:grid-rows-3 pb-12">
{bentoCards.map((card) => (
<Link to={card.link} key={card.id} className={`relative ${card.colSpan} ${card.rowSpan} transition-transform duration-300 hover:scale-102 cursor-pointer`}>
<div className={`absolute inset-0 rounded-md bg-white ${card.rounded}`} />
<div className={`relative flex h-full flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)] ${card.innerRounded}`}>
<img
alt={card.title}
src={card.image}
className="h-50 object-cover object-center"
/>
<div className="px-8 pt-4 pb-6">
<h3 className="text-sm/4 font-semibold text-cyan-500">{card.eyebrow}</h3>
<p className="mt-2 text-lg font-medium lg:text-xl tracking-tight text-gray-950">{card.title}</p>
<p className="mt-1 max-w-lg text-sm/6 text-gray-600">
{card.description}
</p>
</div>
</div>
<div className={`pointer-events-none absolute inset-0 rounded-lg shadow-sm outline outline-black/5 ${card.rounded}`} />
</Link>
))}
</div>
</div>
{/* ✅ Bottom full-width line + spacer */}
<div className="w-full border-b border-gray-200" />
<div className="max-w-7xl mx-auto py-6 border-x border-gray-200 border-t-0 border-b-0" />
</section>
);
}

View File

@@ -7,9 +7,12 @@ import { FadeIn } from "@/components/ui/FadeIn";
export function StackSectionDark() { export function StackSectionDark() {
return ( return (
<section className="relative w-full bg-[#121212] overflow-hidden py-24 isolate"> <section className="relative w-full bg-[#171717] overflow-hidden">
{/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-[#111111] mx-auto py-6 border border-t-0 border-b-0 border-gray-600"></div>
<div className="w-full border-t border-l border-r border-gray-600" />
{/* === Background Layer === */} {/* === Background Layer === */}
<div className="absolute inset-0 z-0 bg-transparent"> <div className="absolute inset-0 z-0 bg-transparent border-t-0 border-b-0 border-gray-600">
{/* Central main aura */} {/* Central main aura */}
<motion.div <motion.div
className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[1200px] h-[1200px] rounded-full pointer-events-none" className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[1200px] h-[1200px] rounded-full pointer-events-none"
@@ -51,7 +54,7 @@ export function StackSectionDark() {
</div> </div>
{/* === Content === */} {/* === Content === */}
<div className="relative mx-auto max-w-7xl px-6 lg:px-8 grid grid-cols-1 lg:grid-cols-3 gap-16 items-center pt-12"> <div className="relative mx-auto max-w-7xl px-6 lg:px-12 border border-t-0 border-b-0 border-gray-600 grid grid-cols-1 lg:grid-cols-3 gap-16 items-center py-24 ">
{/* Left Column - Text */} {/* Left Column - Text */}
<div className="text-center lg:text-left z-10"> <div className="text-center lg:text-left z-10">
<FadeIn> <FadeIn>
@@ -69,7 +72,7 @@ export function StackSectionDark() {
</div> </div>
{/* Right Column - Animated Stack */} {/* Right Column - Animated Stack */}
<div className="lg:col-span-2 flex items-center justify-center lg:justify-start relative z-10"> <div className="lg:col-span-2 flex items-center justify-center lg:justify-start relative z-10 pt-10">
<motion.div <motion.div
initial={{ y: 30, opacity: 0 }} initial={{ y: 30, opacity: 0 }}
whileInView={{ y: 0, opacity: 1 }} whileInView={{ y: 0, opacity: 1 }}
@@ -93,6 +96,9 @@ export function StackSectionDark() {
</motion.div> </motion.div>
</div> </div>
</div> </div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-600" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-600"></div>
</section> </section>
); );
} }

View File

@@ -0,0 +1,43 @@
export function HomeAurora() {
return (
<div
className="absolute inset-0 -z-10 h-full w-full"
style={{
backgroundImage: "url('/images/cloud.png')",
backgroundSize: "cover",
backgroundPosition: "center",
backgroundRepeat: "no-repeat",
}}
>
<div className="relative isolate px-6 lg:px-8">
{/* Top cyan soft blob */}
<div
aria-hidden="true"
className="absolute inset-x-0 -top-40 -z-10 transform-gpu overflow-hidden blur-3xl sm:-top-80"
>
<div
style={{
clipPath:
'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)',
}}
className="relative left-[calc(50%-11rem)] aspect-1155/678 w-144.5 -translate-x-1/2 rotate-30 bg-linear-to-tr from-[#00eaff] to-[#009dff] opacity-10 sm:left-[calc(50%-30rem)] sm:w-288.75"
/>
</div>
{/* Bottom cyan soft blob */}
<div
aria-hidden="true"
className="absolute inset-x-0 top-[calc(100%-13rem)] -z-10 transform-gpu overflow-hidden blur-3xl lg:top-[calc(100%-30rem)]"
>
<div
style={{
clipPath:
'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)',
}}
className="relative left-[calc(50%+3rem)] aspect-1155/678 w-144.5 -translate-x-1/2 bg-linear-to-tr from-[#00eaff] to-[#009dff] opacity-10 lg:left-[calc(50%+36rem)] lg:w-288.75"
/>
</div>
</div>
</div>
)
}

Some files were not shown because too many files have changed in this diff Show More