98 Commits

Author SHA1 Message Date
d16d4e02e0 refactor: standardize Tailwind class syntax and component usage
- Replaced arbitrary CSS values with standard Tailwind utilities (e.g., `bottom-[-18rem]` → `-bottom-72`, `mt-[-2rem]` → `-mt-8`)
- Fixed invalid gradient syntax by removing `bg-` prefix from gradient utilities
- Consolidated text styling by replacing inline elements with CT/CP text components
- Adjusted CT component typography from semibold to medium for better visual hierarchy
2025-11-10 15:28:17 +01:00
2865b1e1fd refactor: replace wrapper div with React fragment in ComputePage 2025-11-08 01:11:43 +01:00
b723f889cb fix: remove duplicate lg:bg-transparent class in mobile menu 2025-11-08 01:07:13 +01:00
2752c690d6 chore: remove archived image assets 2025-11-08 01:03:09 +01:00
a7dd803da2 refactor: standardize background color to #121212
- Replaced inconsistent gray-900 and #171717 background colors with unified #121212 across all pages
- Removed unused imports from multiple component files
- Cleaned up trailing spaces in className attributes
2025-11-08 01:02:42 +01:00
22e2e4b80c feat: replace static icons with animated SVG components in GPU capabilities
- Replaced Heroicons with custom animated SVG components for each GPU capability card
- Added four new animation components: InterferenceAnimation, KubernetesAcceleration, RenderingSimulation, and RAGPipeline
- Updated card layout to accommodate full-width animations above text content
2025-11-08 00:56:07 +01:00
5ab909bd12 feat: add breadcrumb navigation and redesign GPU page sections
- Implemented breadcrumb-style navigation in header dropdown showing "Cloud > [Section]" for compute, storage, and GPU pages
- Redesigned GPU page components with dark theme, horizontal card sliders, and improved visual hierarchy
- Updated CallToAction components across multiple pages with consistent background colors and border styling
2025-11-08 00:40:33 +01:00
61cbaae7e0 refactor: simplify infinite-moving-cards and redesign agents page layout
- Removed getDirection callback in favor of inline style calculation for cleaner animation control
- Replaced BentoSection and AgentComponents with unified AgentBento component featuring video backgrounds and updated card structure
- Standardized border styling across CallToAction components (gray-700 → gray-800) for consistent visual hierarchy
2025-11-07 23:56:54 +01:00
f46482e0f4 feat: redesign CallToAction section with bordered card layout
- Replaced animated circle background with bordered container design using gray-700 borders
- Updated background colors to darker theme (#121212 and #090909) for improved contrast
- Changed button styling from white to cyan for primary action
2025-11-07 23:37:44 +01:00
ee6b5458de feat: convert network use cases to horizontal carousel with icons
- Replaced static grid layout with scrollable carousel supporting touch/mouse navigation
- Added hero icons to each use case card for visual hierarchy
- Introduced intro card with navigation controls and updated styling for better mobile experience
2025-11-07 23:34:27 +01:00
100cae988c refactor: adjust network page styling and typography
- Changed heading levels from H3 to H4 in NetworkCapabilities for better hierarchy
- Updated PrimaryFeatures section with darker background and consistent border styling
- Removed text-lg class from paragraph for standard sizing
2025-11-07 23:21:55 +01:00
716915b19e refactor: update background colors in ComputeUseCases component 2025-11-07 23:21:45 +01:00
f04a7eb3cf feat: redesign network page with improved layout and typography
- Replaced hardcoded text elements with reusable typography components (H2, H3, P, Eyebrow, CT, CP)
- Updated NetworkCapabilities section with dark theme, two-column layout, and visual separators
- Added consistent border styling and spacing across Features and Hero sections
2025-11-07 23:13:40 +01:00
de89539de1 feat: redesign storage use cases section with tabbed layout
- Replaced StorageUseCases with StorageUseCasesNew component featuring interactive tabs
- Implemented two-column layout with tab content on left and image on right
- Added three use case categories: distributed storage, data sovereignty, and content distribution
2025-11-07 23:13:27 +01:00
1851c2d6fb refactor: adjust spacing and styling in compute pages
- Reduced vertical spacing between header and content sections for tighter layout
- Changed border radius from rounded-3xl to rounded-md for consistent styling
- Added hover effect with gradient background to architecture cards
2025-11-07 23:13:18 +01:00
451c1f5c56 feat: redesign storage page with interactive components and dark theme
- Added interactive architecture section with tabbed navigation and smooth transitions
- Implemented horizontal scrolling capabilities carousel with image backgrounds
- Updated call-to-action section with bordered container layout and improved button styling
- Replaced core value section with animated self-healing storage features
- Applied consistent dark theme (#111111, #121212) with cyan accents across all storage components
2025-11-07 22:28:03 +01:00
0b6bcfedd0 chore: archive unused images and add storage feature components
- Moved 35 legacy image assets to archive directory for cleanup
- Created StorageCoreValue component showcasing Digital Me blueprint with logo grid
- Added Encrypted animation component visualizing secure storage with data movement
2025-11-07 20:53:56 +01:00
9bccc89309 feat: make mobile menu background transparent on large screens 2025-11-07 20:49:31 +01:00
73abd593e3 fix: update spacing and border radius for consistent styling
- Changed CloudBluePrint container from pb-12 to py-12 for balanced vertical padding
- Reduced ComputeOverview card border radius from rounded-3xl to rounded-md for uniformity
2025-11-07 20:30:49 +01:00
1f267b057d fix: update navigation links to use clean URLs and close mobile menu on click
- Removed hash-based routing (/#/) in favor of clean URL paths across all navigation links
- Added onClick handlers to close mobile menu when navigation items are clicked
2025-11-07 17:49:20 +01:00
2b5f20f1e9 fix: update navigation links to use hash-based routing 2025-11-07 17:46:07 +01:00
aca13e275b style: lighten border colors from gray-200 to gray-100 2025-11-07 17:28:33 +01:00
e8c424539e fix: correct GitHub icon path to use public directory 2025-11-07 17:17:28 +01:00
912ea4436a feat: update deployment button text to "Deploy Now" 2025-11-07 17:15:54 +01:00
53fd05e6b7 fix: correct logomark image path in footer 2025-11-07 17:13:55 +01:00
5a023651b5 fix: switch from BrowserRouter to HashRouter for static hosting compatibility 2025-11-07 17:10:52 +01:00
b9ba2bab06 refactor: remove unused imports and standardize color prop values
- Removed unused Container, SectionHeader, Small, CT, and CP imports from component files
- Changed color prop from "darkSecondary" to "secondary" for consistency with design system
2025-11-07 17:01:17 +01:00
852d9bfc3e feat: convert ComputeOverview section to light mode theme
- Updated background colors from dark (gray-950) to white with subtle accents
- Modified text colors from light/white to dark gray for improved readability
- Added horizontal border lines and adjusted card styling with light shadows and hover effects
2025-11-07 16:58:50 +01:00
cd3ce54a40 feat: update compute code tabs color scheme from indigo to cyan 2025-11-07 16:54:47 +01:00
6f4f451144 feat: redesign compute page sections with interactive code examples
- Replaced static use cases section with tabbed interface showing AI/ML, application hosting, and edge compute capabilities
- Added ComputeCodeTabs component with interactive code examples (train.py, deploy.yaml, edge.ts)
- Updated CallToAction section with new bordered layout and restructured CTA buttons for hosting and deploying
2025-11-07 16:54:04 +01:00
4b6c8d8327 refactor: simplify benefits section layout and styling
- Replaced complex grid layout with centered 4-column design
- Switched from images to Heroicons for consistent iconography
- Removed unused animation components and dependencies (cobe, motion)
2025-11-07 16:25:43 +01:00
a61267944d refactor: redesign compute architecture section with animated mesh topology
- Replaced simple icon-based architecture cards with interactive animated grid layout
- Added three new SVG animations (MeshNetworking, Deterministic, SovereignCompute) to visualize system concepts
- Updated border colors from gray-600 to gray-800 for consistent dark theme across cloud hosting page
2025-11-07 15:58:11 +01:00
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
6dc318704a fix: add semi-transparent white background to buttons for better visibility 2025-11-06 03:48:06 +01:00
6304f8fc1d feat: adjust outline button background opacity 2025-11-06 03:47:57 +01:00
d7769a5ecd feat: redesign homepage with new sections and layout
- Added new component sections including globe visualization, statistics dashboard, interactive stack explorer, and product showcase
- Replaced existing homepage sections with updated components featuring improved visual hierarchy and user engagement
- Removed footer border and adjusted hero section spacing for cleaner visual flow
2025-11-06 03:41:26 +01:00
005d8c35d4 feat: redesign hero section with card-based layout
- Updated hero to use bordered card container with subtle shadow for visual hierarchy
- Reduced font sizes and adjusted spacing for better readability and modern aesthetic
- Enhanced button styling with larger padding and improved outline variant hover state
2025-11-06 01:32:55 +01:00
a73608ce6c refactor: extract hero content from aurora background component
- Separated HomeAurora into pure background component and new HomeHero for content
- Converted aurora to absolute positioned background layer in Layout for homepage
- Removed z-index conflicts and cleaned up background color declarations
2025-11-06 01:13:36 +01:00
ef7dc12bc2 feat: update UI styling and add new overview sections
- Changed DarkCard border radius from rounded-3xl to rounded-xl for more subtle styling
- Added ComputeOverview section to compute page
- Replaced StackSectionLight with new StackSectionDark component featuring enhanced aurora effects and improved visual hierarchy
2025-11-06 00:33:57 +01:00
2d856a5858 feat: redesign hero section with cloud background and decorative blobs
- Replaced hero background image with cloud.png and added cyan gradient blobs for visual depth
- Centered hero content with larger typography and improved spacing
- Removed onGetStartedClick callback in favor of direct href navigation
2025-11-05 16:29:20 +01:00
8fac6f8edd refactor: clean up unused imports and fix component naming
- Removed unused component imports across multiple page files
- Fixed component name casing inconsistencies (CalltoAction → CallToAction, NetworkUseCases → NetworkUsecases)
- Changed AgentComponents from default to named export
- Removed stray character in NetworkPage.tsx
2025-11-05 13:10:45 +01:00
560ec7dcd0 feat: add agent components section and update agents page content
- Created AgentComponents table showcasing building blocks of sovereign agents
- Added CallToAction section with deployment and documentation links
- Updated hero and deployment sections to clarify agent layer timeline and current capabilities
2025-11-05 13:02:43 +01:00
aaf02d0a7c feat: update network page messaging and structure
- Revised call-to-action copy to emphasize dual paths: using the network vs hosting nodes
- Reorganized page sections to introduce new NetworkCapabilities and NetworkUsecases components
- Updated roadmap section to reflect active evolution rather than future-focused messaging
2025-11-05 12:52:40 +01:00
b767bdbcb4 refactor: simplify product section content and layout
- Condensed GPU Architecture section from detailed bullet points to concise three-pillar overview
- Removed redundant descriptive paragraphs from Capabilities and Design sections
- Streamlined Network Hero messaging and added standalone/integrated positioning
- Created new NetworkCapabilities component with four-column grid layout
2025-11-05 12:47:18 +01:00
c25f6aaba6 refactor: reorder compute page sections and simplify use cases heading
- Moved ComputeArchitecture and ComputeUseCases sections earlier in the page flow
- Updated use cases section heading to be more concise
- Removed descriptive paragraph from use cases section
2025-11-05 12:20:49 +01:00
2bd3026bac feat: simplify cloud and compute architecture sections
- Condensed architecture explanations to focus on core capabilities rather than implementation details
- Replaced detailed bullet lists with concise descriptions for better readability
- Added new CallToAction component with dual-path user journey (host vs deploy)
2025-11-05 12:17:22 +01:00
88d6a90f60 refactor: streamline home page content and reorder ecosystem components
- Removed comparison table section from home page
- Removed descriptive paragraph from benefits section
- Reordered ecosystem slider to show Cloud, Network, and Agent before Compute resources
2025-11-05 12:08:16 +01:00
8d9f02a846 refactor: clean up unused imports and component exports
- Removed unused component imports across multiple pages (AgentHeroAlt, ComputeHero, CloudPage, GpuPage, StoragePage)
- Changed ComputeDesign export from default to named export for consistency
- Removed CloudDesign section from CloudPage layout
2025-11-04 17:15:07 +01:00
e16456bb94 feat: update GPU CTA section copy and button labels
- Changed heading from "Bring sovereign GPU acceleration to production" to "Choose How You Want to Start"
- Updated description to emphasize dual options: using Mycelium Cloud or contributing GPU nodes
- Renamed buttons to "Deploy GPU Workloads" and "Host A GPU Node" for clearer action paths
2025-11-04 17:03:50 +01:00
388654fcbd refactor: remove unused GPU page sections 2025-11-04 16:50:20 +01:00
865252274c feat: restructure GPU page layout and simplify content presentation
- Reordered sections to improve information flow (Capabilities → Design → Architecture → Overview)
- Simplified use cases and overview sections by removing redundant bullet points
- Added new GpuCapabilities and GpuDesign components with cleaner, more focused messaging
2025-11-04 16:50:15 +01:00
8b892c9432 feat: simplify GPU hero section messaging
- Replaced technical jargon with clearer value proposition focused on accessibility and control
- Streamlined copy to emphasize practical benefits (no waitlists, transparent pricing, flexible deployment)
- Updated CTA button labels for better clarity ("How it works" and "Explore Docs")
2025-11-04 16:43:37 +01:00
7f9023c631 feat: simplify storage page messaging and structure
- Streamlined call-to-action to focus on cloud vs. self-hosted options
- Condensed architecture and use cases sections to remove excessive detail
- Reorganized page component order and added new capability/design sections
2025-11-04 16:23:57 +01:00
f3456eb470 feat: update storage hero section messaging and CTAs
- Simplified headline to emphasize sovereignty, self-healing, and multi-protocol access
- Streamlined description to focus on core value proposition of encrypted, quantum-safe storage
- Updated button labels for clearer user navigation (Features → How It Works, Developer Flow → Explore Docs)
2025-11-04 16:12:07 +01:00
46272e939d feat: simplify compute and cloud page content
- Streamlined ComputeFeatures and ComputeUseCases to focus on high-level benefits rather than detailed bullet points
- Updated ComputeHero messaging to emphasize deterministic control and self-verification
- Revised CallToAction to clarify deployment vs hosting options
- Added CloudDesign and ComputeCapabilities/ComputeDesign sections to page layouts
2025-11-04 16:06:13 +01:00
0daabe56f5 feat: replace SecurityPillars with CloudBluePrint component and reorder sections
- Removed CloudGettingStarted section from the page
- Replaced SecurityPillars with new CloudBluePrint component
- Adjusted section ordering to improve page flow
2025-11-04 15:16:50 +01:00
85afc05c35 feat: update cloud use cases with enterprise and edge focus
- Reframed use cases to emphasize sovereignty, workload ownership, and distributed deployment
- Replaced AI/ML training and DigitalMe Blueprint sections with enterprise Kubernetes and AI/agent workloads
- Updated descriptions and feature bullets to highlight compliance, mesh networking, and autonomous capabilities
2025-11-04 15:16:43 +01:00
866e1df042 feat: add Cloud Blueprint landing section with logo showcase 2025-11-04 15:16:32 +01:00
28ea2ab49d feat: clarify cloud infrastructure independence in features section 2025-11-04 14:06:29 +01:00
1f11ca5319 feat: update cloud hosting capabilities section with audience-focused messaging
- Reorganized features to target specific user personas (DevOps, Security, Data, AI/ML teams)
- Updated feature descriptions to emphasize technical benefits and security posture
- Changed section eyebrow from "DEPLOY" to "CAPABILITIES" for clearer positioning
2025-11-04 14:05:27 +01:00
3e99e85e48 feat: enhance CloudHero messaging and formatting
- Added tagline "Works Alone. Works Together." with explanation of Mycelium Cloud's flexibility
- Simplified "Explore Docs" button text to "Documentation"
- Fixed indentation for improved code readability
2025-11-04 14:01:17 +01:00
b39694ea24 feat: update CTA button text from "Start Deployment" to "Get Started" 2025-11-04 13:35:53 +01:00
363b822d8b feat: refine benefits section messaging and ordering
- Reordered features to lead with "Unbreakable by Design" for stronger impact
- Simplified benefit descriptions for clarity and conciseness
- Updated section heading from "Why It Changes Everything" to "Why It Matters"
2025-11-04 13:35:22 +01:00
00802c7064 feat: reorder slider items and update ecosystem messaging
- Moved Compute/Storage/GPU to first position in slider
- Updated heading from "Mycelium Products" to "Mycelium Components"
- Changed description to emphasize Agents instead of "intelligent automation"
2025-11-04 13:33:53 +01:00
e45ca7c86f feat: reorder HomeSlider section before HomeBenefits 2025-11-04 13:33:47 +01:00
664897ee19 refactor: simplify StackSection description text 2025-11-04 13:31:29 +01:00
91d249f097 feat: update homepage content and section ordering
- Revised hosting section description to emphasize decentralized grid and user control
- Swapped order of StackSectionLight and HomeHostingDark sections
- Enhanced Kubernetes feature description with additional context
2025-11-04 13:29:37 +01:00
200 changed files with 7054 additions and 1830 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 497 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

BIN
public/images/agents.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 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: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

BIN
public/images/cloud.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 878 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 938 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

BIN
public/images/encrypted.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 888 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 KiB

4
public/images/github.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" aria-label="GitHub" viewBox="0 0 512 512" id="github">
<rect width="512" height="512" fill="#1B1817" rx="15%"></rect>
<path fill="#fff" d="M335 499c14 0 12 17 12 17H165s-2-17 12-17c13 0 16-6 16-12l-1-50c-71 16-86-28-86-28-12-30-28-37-28-37-24-16 1-16 1-16 26 2 40 26 40 26 22 39 59 28 74 22 2-17 9-28 16-35-57-6-116-28-116-126 0-28 10-51 26-69-3-6-11-32 3-67 0 0 21-7 70 26 42-12 86-12 128 0 49-33 70-26 70-26 14 35 6 61 3 67 16 18 26 41 26 69 0 98-60 120-117 126 10 8 18 24 18 48l-1 70c0 6 3 12 16 12z"></path>
</svg>

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

BIN
public/images/ipfs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 834 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/pods.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
public/images/s3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1007 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

@@ -1,4 +1,4 @@
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import { HashRouter, Routes, Route } from 'react-router-dom';
import { Layout } from './components/Layout';
import { lazy, Suspense } from 'react';
@@ -13,7 +13,7 @@ const GpuPage = lazy(() => import('./pages/gpu/GpuPage'));
function App() {
return (
<BrowserRouter>
<HashRouter>
<Suspense fallback={<div>Loading...</div>}>
<Routes>
<Route path="/" element={<Layout />}>
@@ -28,7 +28,7 @@ function App() {
</Route>
</Routes>
</Suspense>
</BrowserRouter>
</HashRouter>
)
}

View File

@@ -3,9 +3,9 @@ import clsx from 'clsx'
const baseStyles = {
solid:
'inline-flex justify-center rounded-full py-2 px-4 text-sm font-semibold transition-colors',
'inline-flex justify-center rounded-full py-2 px-5 text-base font-semibold transition-colors',
outline:
'inline-flex justify-center rounded-full border py-[calc(--spacing(2)-1px)] px-[calc(--spacing(4)-1px)] text-sm 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 = {
@@ -17,7 +17,7 @@ const variantStyles = {
green: 'bg-green-500 text-white hover:bg-green-600',
},
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',
white: 'border-gray-300 text-white hover:border-cyan-500 active:border-cyan-500',
},

View File

@@ -3,12 +3,12 @@ import { Container } from './Container'
export function Footer() {
return (
<footer className="border-t border-gray-200">
<footer className="">
<Container>
<div className="flex flex-col items-start justify-between gap-y-12 pt-16 pb-6 lg:flex-row lg:items-center lg:py-8">
<div>
<div className="flex items-center text-gray-900">
<img src="/src/images/logomark.svg" alt="Mycelium Logomark" className="h-15 w-15 flex-none" />
<img src="/images/logomark.svg" alt="Mycelium Logomark" className="h-15 w-15 flex-none" />
<div className="ml-4">
<p className="text-base font-semibold">Project Mycelium</p>
<p className="mt-1 text-sm">Unleash the Power of Decentralization</p>
@@ -31,7 +31,7 @@ export function Footer() {
</div>
<div className="group relative -mx-4 flex items-center self-stretch p-4 transition-colors hover:bg-gray-100 sm:self-auto sm:rounded-2xl lg:mx-0 lg:self-auto lg:p-6">
<div className="relative flex h-16 w-16 flex-none items-center justify-center">
<img src="/src/images/github.svg" alt="GitHub" className="h-16 w-16" />
<img src="/images/github.svg" alt="GitHub" className="h-16 w-16" />
</div>
<div className="ml-4 lg:w-72">
<p className="text-base font-semibold text-gray-900">
@@ -46,7 +46,7 @@ export function Footer() {
</div>
</div>
</div>
<div className="flex flex-col items-center border-t border-gray-200 pt-8 pb-12 md:flex-row-reverse md:justify-between md:pt-6">
<div className="flex flex-col items-center border-t border-gray-100 pt-8 pb-12 md:flex-row-reverse md:justify-between md:pt-6">
<p className="mt-6 text-sm text-gray-500 md:mt-0">
&copy; Copyright{' '}
<a href="https://www.threefold.io" target="_blank" rel="noopener noreferrer" className="hover:text-cyan-500 transition-colors">

View File

@@ -1,10 +1,12 @@
import { useState } from 'react'
import { Link, useLocation } from 'react-router-dom'
import { Dropdown } from './ui/Dropdown'
import { ChevronDownIcon } from '@heroicons/react/20/solid'
import { Container } from './Container'
import { Button } from './Button'
import pmyceliumLogo from '../images/logos/logo_1.png'
import { Dialog } from '@headlessui/react'
import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'
const cloudNavItems = [
{ name: 'Cloud', href: '/cloud' },
@@ -15,20 +17,20 @@ const cloudNavItems = [
export function Header() {
const location = useLocation()
const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
const getCurrentPageName = () => {
const currentPath = location.pathname;
if (currentPath.startsWith('/compute')) return 'Compute';
if (currentPath.startsWith('/storage')) return 'Storage';
if (currentPath.startsWith('/gpu')) return 'GPU';
if (currentPath.startsWith('/cloud')) return 'Cloud';
return 'Cloud';
};
return (
<header>
<nav>
<Container className="relative z-50 flex justify-between py-4">
<header className="bg-white">
<nav className="border-b border-gray-100">
<Container className="flex bg-transparent justify-between py-4">
<div className="relative z-10 flex items-center gap-16">
<Link to="/" aria-label="Home">
<img src={pmyceliumLogo} alt="Mycelium" className="h-8 w-auto" />
@@ -37,7 +39,14 @@ export function Header() {
<Dropdown
buttonContent={
<>
{getCurrentPageName()}
{['Compute', 'Storage', 'GPU'].includes(getCurrentPageName()) ? (
<>
<span className="text-gray-500">Cloud {' >'} </span>
<span>{getCurrentPageName()}</span>
</>
) : (
'Cloud'
)}
<ChevronDownIcon className="h-5 w-5" aria-hidden="true" />
</>
}
@@ -66,15 +75,94 @@ export function Header() {
target="_blank"
rel="noopener noreferrer"
>
Start Deployment
Deploy Now
</Button>
<Button to="/download" variant="solid" color="cyan">
Get Mycelium Connector
</Button>
</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>
</Container>
</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 lg:bg-transparent lg:bg-transparent 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"
onClick={() => setMobileMenuOpen(false)}
>
{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"
onClick={() => setMobileMenuOpen(false)}
>
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"
onClick={() => setMobileMenuOpen(false)}
>
Agents
</Link>
</div>
<div className="py-6">
<Button
to="https://myceliumcloud.tf"
variant="outline"
as="a"
target="_blank"
rel="noopener noreferrer"
className="w-full"
onClick={() => setMobileMenuOpen(false)}
>
Start Deployment
</Button>
<Button to="/download" variant="solid" color="cyan" className="mt-4 w-full" onClick={() => setMobileMenuOpen(false)}>
Get Mycelium Connector
</Button>
</div>
</div>
</div>
</Dialog.Panel>
</Dialog>
</header>
)
}

View File

@@ -5,12 +5,14 @@ import { Header } from './Header'
export function Layout() {
return (
<div className="bg-white antialiased" style={{ fontFamily: 'var(--font-inter)' }}>
<Header />
<main className="">
<Outlet />
</main>
<Footer />
<div className="bg-[#fdfdfd] antialiased relative" style={{ fontFamily: 'var(--font-inter)' }}>
<div className="relative z-10">
<Header />
<main>
<Outlet />
</main>
<Footer />
</div>
</div>
)
}

View File

@@ -106,7 +106,7 @@ export const H5 = createTextComponent(
)
export const Eyebrow = createTextComponent(
'h2',
'text-base/7 font-semibold tracking-[0.18em] uppercase',
'text-base/7 font-semibold uppercase tracking-[0.16em]',
{ color: 'accent' }
)
export const SectionHeader = createTextComponent(
@@ -162,5 +162,5 @@ export const DownloadCardDescription = createTextComponent(
'text-base/7 leading-normal tracking-normal'
)
export const CT = createTextComponent('span', 'text-lg lg:text-xl font-semibold')
export const CT = createTextComponent('span', 'text-base lg:text-lg font-medium')
export const CP = createTextComponent('p', 'text-sm lg:text-base tracking-wide leading-tight font-light')

View File

@@ -59,7 +59,7 @@ export default function FeaturesSectionDemo() {
},
];
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) => (
<Feature key={feature.title} {...feature} index={index} />
))}
@@ -81,7 +81,7 @@ const Feature = ({
return (
<div
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 < 4 && "lg:border-b dark:border-neutral-800"
)}

View File

@@ -40,7 +40,7 @@ export default function FeaturesSectionDemo() {
},
];
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">
<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

View File

@@ -20,15 +20,6 @@ export const InfiniteMovingCards = ({
const scrollerRef = React.useRef<HTMLUListElement>(null);
const [start, setStart] = useState(false);
const getDirection = useCallback(() => {
if (containerRef.current) {
if (direction === "left") {
containerRef.current.style.setProperty("--animation-direction", "forwards");
} else {
containerRef.current.style.setProperty("--animation-direction", "reverse");
}
}
}, [direction]);
const getSpeed = useCallback(() => {
if (containerRef.current) {
@@ -53,11 +44,10 @@ export const InfiniteMovingCards = ({
}
});
getDirection();
getSpeed();
setStart(true);
}
}, [getDirection, getSpeed]);
}, [getSpeed]);
useEffect(() => {
addAnimation();
@@ -75,6 +65,9 @@ export const InfiniteMovingCards = ({
start && "animate-scroll",
pauseOnHover && "hover:[animation-play-state:paused]",
)}
style={{
"--animation-direction": direction === "left" ? "forwards" : "reverse",
} as React.CSSProperties}
>
{items.map((item, idx) => (
<li className="relative flex-shrink-0" key={idx}>

View File

@@ -62,7 +62,7 @@ export const Carousel = ({ items, initialScroll = 0 }: CarouselProps) => {
return (
<div className="relative w-full">
<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}
onScroll={checkScrollability}
>
@@ -135,7 +135,7 @@ export const Card = ({
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"
>
<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
layoutId={layout ? `category-${card.category}` : undefined}
className="text-left font-sans font-semibold text-cyan-500 uppercase tracking-wider text-xs md:text-sm"

View File

@@ -8,7 +8,7 @@ const DarkCard = React.forwardRef<
<div
ref={ref}
className={cn(
"border border-white/10 bg-white/3 p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 rounded-3xl hover:bg-white/6 hover:scale-105 hover:shadow-lg hover:shadow-cyan-500/15",
"border border-white/10 bg-white/3 p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 rounded-xl hover:bg-white/6 hover:scale-105 hover:shadow-lg hover:shadow-cyan-500/15",
className
)}
{...props}

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

@@ -6,9 +6,7 @@
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
@@ -60,7 +58,6 @@ button:focus-visible {
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;

View File

@@ -1,7 +1,7 @@
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './styles/tailwind.css'
import App from './App.tsx'
import App from './App'
createRoot(document.getElementById('root')!).render(
<StrictMode>

View File

@@ -0,0 +1,157 @@
"use client";
import { Eyebrow, H3, P } from "@/components/Texts";
const bentos = [
{
id: "core",
eyebrow: "ARCHITECTURE",
title: "Deterministic by Design",
description:
"Every workload runs exactly as declared: no drift, no hidden state, no surprises.",
video: null,
colSpan: "lg:col-span-3",
rowSpan: "lg:row-span-1",
custom: true,
noBorder: true,
},
// ✅ Updated Bento Cards
{
id: "fungistor",
title: "FungiStor",
subtitle: "Long-Term AI Memory",
description:
"Erasure coding + compression slash storage bloat by up to 10× vs basic replication. Source-encrypted shards are geo-dispersed—lose pieces, rebuild perfectly from a quorum.",
video: "/videos/fungistor.mp4",
colSpan: "lg:col-span-3",
rowSpan: "lg:row-span-1",
},
{
id: "herodb",
title: "HeroDB",
subtitle: "Active AI Memory",
description:
"Multimodal vector+keyword retrieval makes RAG feel instant across text, image, audio. Time-aware, policy-guarded context keeps results fresh while access stays governed.",
video: "/videos/herodb.mp4",
colSpan: "lg:col-span-3",
rowSpan: "lg:row-span-1",
},
{
id: "mos",
title: "MOS Sandboxes",
subtitle: "Secure Agent Workspaces",
description:
"Attested, signed workspaces spin up ≈5s worldwide—ready to execute. Hardware isolation and scoped egress: run hard, tear down clean, zero residue.",
video: "/videos/herodb.mp4",
colSpan: "lg:col-span-3",
rowSpan: "lg:row-span-1",
},
{
id: "mesh",
title: "Mycelium Mesh",
subtitle: "Secure Communication Network",
description:
"A private, public-key fabric with self-healing multi-path routing. Glides through NATs and firewalls—direct, low-latency, no middlemen.",
video: "/videos/mesh.mp4",
colSpan: "lg:col-span-2",
rowSpan: "lg:row-span-1",
},
{
id: "deterministic",
title: "Deterministic Deployment",
subtitle: "Verifiable Code Execution",
description:
"Declare intent, get a hash; remote attestation proves that is what runs. Reproducible builds, signed artifacts, immutable logs—supply chain, sealed.",
video: "/videos/deterministic.mp4",
colSpan: "lg:col-span-2",
rowSpan: "lg:row-span-1",
},
{
id: "agent-coordination",
title: "Agent Coordination",
subtitle: "Sovereign Workflow Management",
description:
"Your private agent conducts swarms of specialists in parallel. Policies fan out work; human checkpoints keep you in command.",
video: "/videos/agent.mp4",
colSpan: "lg:col-span-2",
rowSpan: "lg:row-span-1",
},
];
export function AgentBento() {
return (
<section className="relative w-full bg-[#121212] overflow-hidden">
<div className="max-w-7xl bg-[#121212] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
<div className="w-full border-t border-l border-r border-gray-800" />
<div className="mx-auto bg-[#111111] max-w-2xl px-6 lg:max-w-7xl lg:px-10 border border-t-0 border-b-0 border-gray-800">
<div className="grid grid-cols-1 gap-6 pt-6 lg:grid-cols-6 lg:grid-rows-3 pb-6">
{bentos.map((card) => (
<div
key={card.id}
className={`relative ${card.colSpan} ${card.rowSpan} transition-transform duration-300 hover:scale-102 group`}
>
{!card.noBorder && (
<div
className={`absolute inset-0 rounded-md border border-gray-800 bg-[#111212] `}
/>
)}
<div
className={`relative flex lg:h-90 flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)] `}
>
{/* ✅ VIDEO instead of animation */}
{card.video ? (
<div className="lg:h-64 h-48 w-full overflow-hidden bg-transparent flex items-center">
<video
src={card.video}
autoPlay
loop
muted
playsInline
className="w-full h-full object-cover"
/>
</div>
) : (
<div className="h-48 w-full flex items-center justify-center bg-transparent" />
)}
<div className="px-8 pt-4 pb-6">
{card.custom ? (
<>
{card.eyebrow && <Eyebrow>{card.eyebrow}</Eyebrow>}
<H3 className="mt-2 text-white">{card.title}</H3>
<P className="mt-4 max-w-lg text-gray-200">{card.description}</P>
</>
) : (
<>
{/* ✅ NEW SUBTITLE */}
<p className="text-sm text-cyan-400">{card.subtitle}</p>
<p className="mt-1 text-lg font-medium lg:text-xl tracking-tight text-white">
{card.title}
</p>
<p className="mt-1 max-w-lg text-sm/6 text-gray-200">
{card.description}
</p>
</>
)}
</div>
</div>
{!card.noBorder && (
<div
className={`pointer-events-none absolute inset-0 rounded-lg shadow-sm outline outline-black/5 `}
/>
)}
</div>
))}
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,75 @@
import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader } from '@/components/Texts'
const components = [
{
component: 'Long-Term Memory (FungiStor)',
purpose: 'Durable, distributed memory with erasure-coded resilience',
backedBy: 'Mycelium Storage',
},
{
component: 'Active Retrieval (HeroDB)',
purpose: 'Fast multimodal vector + keyword retrieval',
backedBy: 'Compute + Storage',
},
{
component: 'Secure Agent Workspaces (MOS Sandboxes)',
purpose: 'Ephemeral, isolated execution for agent actions',
backedBy: 'Mycelium Compute',
},
{
component: 'Private Communication (Mycelium Mesh)',
purpose: 'Peer-to-peer encrypted network',
backedBy: 'Mycelium Network',
},
{
component: 'Verifiable Execution (Deterministic Deploy)',
purpose: 'Ensure the code running is exactly what you signed',
backedBy: 'The Stack',
},
{
component: 'Agent Coordination Engine (coming online next)',
purpose: 'Orchestrate multi-step workflows and tool use',
backedBy: 'Hero Orchestrator',
},
]
export function AgentComponents() {
return (
<section className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow>AGENT COMPONENTS</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900">
The Building Blocks of Sovereign Agents
</SectionHeader>
</div>
<div className="mx-auto mt-16 max-w-6xl overflow-x-auto">
<table className="w-full table-auto border-collapse text-left text-sm text-gray-700">
<thead>
<tr className="bg-cyan-50 border-b border-gray-100">
<th className="py-3 px-4 font-semibold text-gray-900">Component</th>
<th className="py-3 px-4 font-semibold text-gray-900">Purpose</th>
<th className="py-3 px-4 font-semibold text-gray-900">Backed By</th>
</tr>
</thead>
<tbody>
{components.map((item) => (
<tr
key={item.component}
className="border-b border-gray-100 hover:bg-cyan-50/40 transition"
>
<td className="py-4 px-4 font-medium text-gray-900">{item.component}</td>
<td className="py-4 px-4">{item.purpose}</td>
<td className="py-4 px-4 text-cyan-700 font-medium">{item.backedBy}</td>
</tr>
))}
</tbody>
</table>
</div>
</Container>
</section>
)
}

View File

@@ -1,33 +1,43 @@
'use client'
import { Button } from '../../components/Button'
import { Eyebrow, SectionHeader, P, H3 } from '../../components/Texts'
import { Button } from '@/components/Button'
import { Eyebrow, H3 } from '@/components/Texts'
export function AgentHeroAlt() {
return (
<div className="relative bg-white lg:mt-10 mt-0">
<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">
<img
alt=""
src="/images/agents.png"
className="size-full object-cover"
/>
</div>
<div className="relative mx-auto max-w-7xl py-24 sm:py-32 lg:px-8">
<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">
<Eyebrow className="text-base/7 font-semibold text-cyan-500">AGENT</Eyebrow>
<H3 as="h1" className="mt-2 text-gray-900">Sovereign AI Agents, Coming Soon.</H3>
<P className="mt-6 text-gray-600">
Hero is the autonomous agent layer for the Mycelium platformtrusted, policy-aware AI that runs on infrastructure you control and remembers what matters.
</P>
<div className="mt-8">
<Button href="#" variant="solid" color="cyan">
Join the Waitlist
</Button>
<div className="">
{/* Boxed container */}
<div
className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-100 bg-white overflow-hidden bg-contain bg-right bg-no-repeat"
style={{ backgroundImage: "url('/images/agents.webp')", backgroundSize: "contain" }}
>
{/* Inner padding */}
<div className="px-6 py-16 lg:py-16">
<div className="max-w-2xl lg:pl-6">
<Eyebrow>MYCELIUM AGENTS</Eyebrow>
<H3 as="h1" className="mt-4">
Sovereign AI Agents, Coming Soon.
</H3>
<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.
</p>
<p className="mt-4 lg:text-base italic text-gray-600 text-sm">
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.
</p>
<div className="mt-10 flex items-center gap-x-6">
<Button href="#" variant="solid" color="cyan">
Follow Deployment
</Button>
<Button href="#" variant="outline">
Explore Docs <span aria-hidden="true"></span>
</Button>
</div>
</div>
</div>
</div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</div>
)
}

View File

@@ -2,8 +2,9 @@ import { AnimatedSection } from '../../components/AnimatedSection'
import { DeploySection } from './DeploySection'
import { GallerySection } from './GallerySection'
import { Companies } from './Companies'
import { BentoSection } from './BentoSection'
import { AgentBento } from './AgentBento'
import { AgentHeroAlt } from './AgentHeroAlt'
import { CallToAction } from './CallToAction'
export default function AgentsPage() {
return (
@@ -25,7 +26,11 @@ export default function AgentsPage() {
</AnimatedSection>
<AnimatedSection>
<BentoSection />
<AgentBento />
</AnimatedSection>
<AnimatedSection>
<CallToAction />
</AnimatedSection>
</div>
)

View File

@@ -1,6 +1,6 @@
import { motion } from 'framer-motion'
import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P, CT, CP } from '../../components/Texts'
import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P, CT, CP } from '@/components/Texts'
const items = [
{
@@ -19,7 +19,7 @@ const items = [
title: 'MOS Sandboxes',
subtitle: 'Secure Agent Workspaces',
description: 'Attested, signed workspaces spin up ≈5s worldwide—ready to execute. Hardware isolation and scoped egress: run hard, tear down clean, zero residue.',
video: '/videos/sandbox.mp4',
video: '/videos/herodb.mp4',
},
{
title: 'Mycelium Mesh',
@@ -69,7 +69,7 @@ export function BentoSection() {
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.2 }}
transition={{ duration: 0.45, delay: index * 0.1, ease: 'easeOut' }}
className="overflow-hidden rounded-2xl border border-gray-800 bg-gray-900 p-6 transition-all duration-300 hover:scale-105 hover:border-cyan-500 hover:shadow-lg"
className="overflow-hidden rounded-2xl border border-gray-800 bg-[#121212] p-6 transition-all duration-300 hover:scale-105 hover:border-cyan-500 hover:shadow-lg"
>
<video
src={item.video}

View File

@@ -0,0 +1,57 @@
"use client";
import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
export function CallToAction() {
return (
<section className="relative overflow-hidden bg-[#121212]">
{/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-[#121212] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
<div className="w-full border-t border-l border-r border-gray-800" />
{/* ✅ Main boxed area */}
<div
id="get-started"
className="relative py-18 max-w-7xl mx-auto bg-[#111111] border border-t-0 border-b-0 border-gray-800"
>
<Container className="relative">
<div className="mx-auto max-w-3xl text-center">
<h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
Start Building the Future of Sovereign AI
</h2>
<p className="mt-6 text-lg text-gray-300">
Use todays components models, storage, compute, mesh and step into agents as they arrive.
</p>
{/* ✅ Two cards, stacked center with spacing */}
<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="/deploy" variant="solid" color="cyan" className="mt-4">
Deploy a Model
</Button>
</div>
<div className="flex flex-col items-center text-center max-w-xs">
<Button to="/host" as="a" variant="outline" color="white" className="mt-4">
Host a Node
</Button>
</div>
<div className="flex flex-col items-center text-center max-w-xs">
<Button to="https://threefold.info/mycelium_network/docs/" as="a" target="_blank" variant="outline" color="white" className="mt-4">
Follow Development
</Button>
</div>
</div>
</div>
</Container>
</div>
{/* ✅ Bottom horizontal line with spacing */}
<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>
);
}

View File

@@ -1,7 +1,5 @@
"use client";
import { motion } from "framer-motion";
import { P, Eyebrow } from "@/components/Texts";
import { InfiniteMovingCards } from "@/components/magicui/infinite-moving-cards";
@@ -39,25 +37,10 @@ const row2 = logos.slice(6);
export function Companies() {
return (
<div id="companies" className="relative bg-black flex flex-col items-center justify-center w-full overflow-hidden antialiased py-4 mb-12">
<div className="relative z-10 mx-auto w-full max-w-6xl p-4">
{/* Heading */}
<motion.div
className="flex flex-col justify-center max-w-4xl items-center mb-8 mx-auto"
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.3 }}
transition={{ duration: 0.6, ease: "easeOut" }}
>
<Eyebrow color="accent"></Eyebrow>
<P className="hidden min-xl:text-gray-100 text-center mb-6">
Mycelium Cloud allows you to deploy and scale AI agents from top global providers on a decentralized, privacy-first infrastructure.
</P>
</motion.div>
<div id="companies" className="relative bg-[#121212] flex flex-col items-center justify-center w-full overflow-hidden antialiased py-4 mb-12">
<div className="relative z-10 mx-auto w-full max-w-7xl p-4">
{/* Logos grid */}
<div className="flex flex-col items-center gap-y-6 text-white">
<div className="flex flex-col items-center gap-y-6 text-white ">
<InfiniteMovingCards
items={row1}
direction="right"

View File

@@ -46,8 +46,12 @@ const features = [
export function DeploySection() {
return (
<section id="benefits" className="relative bg-black px-4 pb-4 pt-12 text-white lg:px-12 lg:pt-24">
<div className="relative px-6 lg:px-12">
<section className="bg-[#121212] w-full max-w-8xl mx-auto">
{/* ✅ Top horizontal line with spacing */}
<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 px-6 lg:px-12 py-12 bg-[#111111] border border-t-0 border-b-0 border-gray-800 max-w-7xl mx-auto">
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
@@ -55,12 +59,12 @@ export function DeploySection() {
transition={{ duration: 0.6, ease: "easeOut", delay: 0.1 }}
className="mx-auto max-w-5xl text-center"
>
<Eyebrow color="accent">Get Started</Eyebrow>
<Eyebrow color="accent">Deployment</Eyebrow>
<SectionHeader className="text-3xl font-medium tracking-tight" color="light">
Deploy Scalable LLMs and AI Agents
Run LLMs and Agent Workloads privately, today.
</SectionHeader>
<P className="mt-6" color="light">
Launch and scale intelligence on your own terms. Mycelium Cloud makes it simple to deploy models, integrate knowledge, and run everything on a network you control.
Even before the full Agent layer launches, you can deploy models and retrieval pipelines using Mycelium Cloud.
</P>
</motion.div>
<motion.ul
@@ -90,6 +94,8 @@ export function DeploySection() {
))}
</motion.ul>
</div>
<div className="w-full border-b border-gray-800 bg-[#121212]" />
</section>
);
}

View File

@@ -53,14 +53,13 @@ export function GallerySection() {
<FadeIn transition={{ duration: 0.8, delay: 0.1 }}>
<div className="mx-auto max-w-5xl lg:mt-12">
<Eyebrow color="accent">Use Cases</Eyebrow>
<SectionHeader className="text-center" color="dark">Agents with Endless Possibilities.</SectionHeader>
<SectionHeader className="text-center" color="dark">What Agents Will Enable</SectionHeader>
</div>
</FadeIn>
<FadeIn transition={{ duration: 0.8, delay: 0.2 }}>
<div className="mx-auto max-w-4xl mt-6 lg:px-0 px-4">
<P className="text-center" color="dark">
Your private agent coordinates a team of specialists that spin up on demand, collaborate across your world, and deliver end-to-end results.
Many agents, one intelligenceyours.
The Agent layer is the coordination layer that sits on top of the Mycelium Stack, combining memory, execution, and secure communication into a single intelligence plane.
</P>
</div>
</FadeIn>
@@ -137,7 +136,7 @@ export function GallerySection() {
</div>
{/* Foreground pill (Desktop) */}
<div className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-[60] hidden md:block">
<div className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-60 hidden md:block">
<div className="flex items-center justify-between w-[1040px] gap-6 rounded-2xl bg-gray-100/80 shadow-[0_8px_40px_rgba(0,0,0,0.15)] px-12 backdrop-blur">
<CP as="h4" className="max-w-[820px] h-[72px] flex items-center" color="dark">
<TypeAnimation

View File

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

View File

@@ -0,0 +1,55 @@
"use client";
import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
export function CallToAction() {
return (
<section className="relative overflow-hidden bg-[#121212]">
{/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-[#121212] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
<div className="w-full border-t border-l border-r border-gray-800" />
{/* ✅ Main boxed area */}
<div
id="get-started"
className="relative py-18 max-w-7xl mx-auto bg-[#111111] border border-t-0 border-b-0 border-gray-800"
>
<Container className="relative">
<div className="mx-auto max-w-3xl text-center">
<h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
Choose How You Want to Start
</h2>
<p className="mt-6 text-lg text-gray-300">
Host your own node to contribute capacity or deploy workloads using the Mycelium Cloud.
You dont need to host before deploying, and you dont need to deploy before hosting.
</p>
{/* ✅ Two cards, stacked center with spacing */}
<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>
</Container>
</div>
{/* ✅ Bottom horizontal line with spacing */}
<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>
);
}

View File

@@ -1,92 +1,90 @@
import { Container } from '../../components/Container'
import { Eyebrow, H3, P } from '../../components/Texts'
'use client';
const architectureSections = [
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 = [
{
title: 'Decentralized Infrastructure',
title: 'Mesh Networking Layer',
description:
'Clusters launch across the ThreeFold Grid with direct node access and encrypted connectivity.',
bullets: [
'Unique Mycelium IP addresses assigned to every node.',
'Peer-to-peer mesh networking links services across nodes.',
'End-to-end encryption keeps traffic sealed inside the fabric.',
'No public IP exposure—everything is addressable via Mycelium IPs.',
],
'Every node receives a cryptographic network identity and secure routing path.',
icon: <MeshNetworkIcon className="mb-4" />, // ✅ stored as const JSX
},
{
title: 'Network Flow',
title: 'Sovereign Compute Layer',
description:
'Traffic moves through the Mycelium mesh, maintaining sovereignty without sacrificing reach.',
bullets: [
'User requests enter through the encrypted Mycelium network.',
'Traffic routes directly to cluster nodes without intermediate hops.',
'Services answer over the same mesh—no ingress controller required.',
'Operational visibility without exposing public attack surface.',
],
'Workloads run on hardware you authorize, no shared control, no exposed surfaces.',
icon: <SovereignComputer className="mb-4" />,
},
{
title: 'Kubernetes Management',
title: 'Deterministic Orchestration',
description:
'Lightweight K3s orchestration delivers HA clusters with automated lifecycle management.',
bullets: [
'Full K3s deployment and lifecycle management built-in.',
'IPv6-native networking ensures deterministic service discovery.',
'Multi-master topologies with automatic failover for resilience.',
'Drift-free upgrades orchestrated through smart contracts.',
],
'K3s clusters deploy predictably, verifiably, and remain drift-free.',
icon: <DeterministicOrchestration className="mb-4" />,
},
]
export function CloudArchitecture() {
return (
<section className="bg-white py-24 lg:py-32">
<Container>
<div className="mx-auto max-w-5xl text-center">
<Eyebrow>
Technical Architecture
</Eyebrow>
<H3 className="mt-6 text-gray-900">
Built on a Sovereign, Encrypted Delivery Mesh.
</H3>
<P className="mt-6 text-gray-600">
Mycelium Cloud rides on the ThreeFold Grid, pairing encrypted mesh
networking with deterministic K3s orchestration. Every layer is
designed to keep workloads sovereign, observable, and effortless to
operate.
</P>
</div>
<div className="mt-16 grid gap-8 lg:grid-cols-3">
{architectureSections.map((section) => (
<div
key={section.title}
className="flex h-full flex-col rounded-3xl border border-slate-200 bg-gray-50/25 p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg "
>
<div className="flex items-center gap-3">
<span className="inline-flex size-10 items-center justify-center rounded-full bg-cyan-500/10 text-base font-semibold uppercase tracking-[0.3em] text-cyan-600">
</span>
<h3 className="text-xl font-semibold text-gray-900">
{section.title}
</h3>
</div>
<p className="mt-4 text-sm leading-relaxed text-gray-600">
{section.description}
</p>
<ul className="mt-6 space-y-3 text-sm text-gray-600">
{section.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>
</div>
))}
</div>
</Container>
<section className="bg-[#121212] w-full max-w-8xl mx-auto">
{/* ✅ Top horizontal spacer like HomeHosting */}
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
<div className="w-full border-t border-l border-r border-gray-800" />
{/* ✅ Boxed container with matching spacing */}
<div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-800 bg-[#111111] py-12">
<Container>
<div className="mx-auto max-w-4xl sm:text-center">
<Eyebrow className="text-cyan-400">ARCHITECTURE</Eyebrow>
<H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-white">
How Mycelium Cloud Works
</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>
)
}

View File

@@ -0,0 +1,61 @@
"use client";
import { Container } from "@/components/Container";
import { H3, P, Eyebrow } from "@/components/Texts";
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 (
<section className="w-full max-w-8xl mx-auto bg-transparent">
{/* ✅ Boxed container */}
<div className="max-w-7xl bg-white mx-auto py-12 border border-t-0 border-b-0 border-gray-100">
<Container>
<div className="mx-auto max-w-4xl sm:text-center">
<Eyebrow className="text-cyan-500">Featured Blueprint</Eyebrow>
<H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-900 mt-2">
Your Personal Sovereign Cloud Workspace
</H3>
<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.
</P>
</div>
{/* ✅ 3x2 logo grid */}
<div className="mt-12 grid grid-cols-3 gap-x-8 gap-y-12">
{logos.map((logo, i) => (
<div key={i} className="flex justify-center">
<a
href={logo.href}
target="_blank"
rel="noopener noreferrer"
className="transition-transform duration-300 hover:scale-105"
>
<img
src={logo.src}
alt={`Logo ${i + 1}`}
className="max-h-12 w-auto object-contain"
/>
</a>
</div>
))}
</div>
</Container>
</div>
{/* ✅ Bottom line + bottom spacer */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-100 bg-transparent" />
</section>
);
}

View File

@@ -354,7 +354,7 @@ function CloudFeaturesMobile() {
>
<div
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
? 'outline-transparent' // Remove outline for active mobile slide
: 'outline-transparent hover:outline-cyan-500',
@@ -406,7 +406,7 @@ export function CloudFeatures() {
<section
id="overview"
aria-label="Features for investing all your money"
className="bg-gray-900 py-20 sm:py-32"
className="bg-[#121212] py-20 sm:py-32"
>
<Container>
<div className="mx-auto max-w-2xl lg:mx-0 lg:max-w-3xl">
@@ -415,7 +415,7 @@ export function CloudFeatures() {
A Decentralized Cloud that Operates Itself
</SectionHeader>
<P color="light" className="mt-6">
Mycelium Cloud runs Kubernetes on a sovereign, self-healing network. Storage, networking, and compute are all integrated.
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>

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-100"></div>
<div className="w-full border-t border-l border-r border-gray-100" />
{/* ✅ Boxed container (border-x only) */}
<div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-100 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-100" />
{/* ✅ Bottom spacer matching hero */}
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</div>
)
}

View File

@@ -1,45 +1,51 @@
import { H3, H5, Eyebrow } from "../../components/Texts"
import { Button } from "../../components/Button"
import { H3, Eyebrow } from "@/components/Texts"
import { Button } from "@/components/Button"
export function CloudHeroNew() {
export function CloudHeroNew({ onGetStartedClick = () => {} }: { onGetStartedClick?: () => void }) {
return (
<div
className="relative bg-cover lg:bg-contain bg-right bg-no-repeat"
style={{ backgroundImage: "url('/images/cloudhero4.webp')" }}
>
<div className="mx-auto max-w-7xl lg:px-8">
<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">
<div className="">
{/* Boxed container */}
<div
className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-100 bg-white overflow-hidden bg-contain bg-right bg-no-repeat"
style={{ backgroundImage: "url('/images/cloudhero4.webp')", backgroundSize: "contain" }}
>
{/* Inner padding */}
<div className="px-6 py-16 lg:py-16">
<div className="max-w-2xl lg:pl-6">
<Eyebrow>
Mycelium Cloud
Mycelium Cloud
</Eyebrow>
<H3 className="mt-4">
Run Kubernetes on the Sovereign Agentic Cloud
</H3>
<H5 className="mt-8 text-lg text-gray-600">
Mycelium Cloud turns the ThreeFold Grid into a programmable substrate for K3s.
</H5>
<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.
Your workloads run on sovereign, encrypted infrastructure, without centralized cloud control.
</H5>
Your workloads run on sovereign, encrypted infrastructure, without centralized cloud control.
</p>
<p className="mt-4 lg:text-base italic text-gray-600 text-sm">
Works Alone. Works Together.
Mycelium Cloud 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
to="#"
onClick={onGetStartedClick}
variant="solid"
className=""
color="cyan"
>
Get started
</Button>
<Button to="#" variant="outline">
Explore Docs <span aria-hidden="true"> </span>
Documentation <span aria-hidden="true"></span>
</Button>
</div>
</div>
</div>
</div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</div>
)
}

View File

@@ -4,28 +4,32 @@ import {
ServerIcon,
ShieldCheckIcon,
} from '@heroicons/react/24/outline'
import { CP, CT, Eyebrow, H3, P } from '../../components/Texts'
import { CP, CT, Eyebrow, H3 } from '@/components/Texts'
const features = [
{
Eyebrow: 'DevOps / Cloud teams',
name: 'Kubernetes Clusters',
description: 'Deploy and scale containerized apps across your own hardware.',
description: 'Deterministic K3s workloads across sovereign hardware.',
icon: ServerIcon,
},
{
name: 'AI Agents & LLM Runtimes',
description: 'Run open-source models locally, securely, and offline.',
icon: ArrowPathIcon,
Eyebrow: 'Security & infrastructure',
name: 'Encrypted Mesh Networking',
description: 'No public ingress, no exposed attack surface, zero-trust routing.',
icon: ShieldCheckIcon,
},
{
Eyebrow: 'Data-driven teams',
name: 'S3-Compatible Storage',
description: 'Your own personal over-the-network drive, encrypted end-to-end.',
description: 'Distributed storage with erasure coding and residency control.',
icon: CloudArrowUpIcon,
},
{
name: 'Mesh VPN & Zero-Trust Networking',
description: 'Securely connect all your devices and remote locations.',
icon: ShieldCheckIcon,
Eyebrow: 'AI / ML workloads',
name: 'GPU-Ready',
description: 'Scale inference & training on demand.',
icon: ArrowPathIcon,
},
]
@@ -33,13 +37,8 @@ export function CloudHosting() {
return (
<div className="relative bg-white py-24 lg:py-32">
<div className="mx-auto max-w-md px-6 text-center sm:max-w-3xl lg:max-w-7xl lg:px-8">
<Eyebrow>DEPLOY</Eyebrow>
<Eyebrow>CAPABILITIES</Eyebrow>
<H3 className="mt-2">What You Can Run on Mycelium Cloud</H3>
<P className="mx-auto mt-5 max-w-prose">
Turn your own machines into real, production-grade infrastructure. Mycelium handles the networking,
orchestration, and security layers, so you can deploy services the same way you would on public cloud without
giving your data or control to anyone.
</P>
<div className="mt-16">
<div className="grid grid-cols-1 gap-12 lg:grid-cols-4">
{features.map((feature) => (
@@ -48,6 +47,7 @@ export function CloudHosting() {
<span className="absolute -top-6 left-1/2 -translate-x-1/2 transform rounded-xl bg-cyan-500 hover:bg-cyan-400 p-3 shadow-lg">
<feature.icon aria-hidden="true" className="size-8 text-white" />
</span>
<Eyebrow>{feature.Eyebrow}</Eyebrow>
<CT as="h3" className="mt-4">
{feature.name}
</CT>

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-800"></div>
<div className="w-full border-t border-l border-r border-gray-800" />
{/* ✅ 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-800">
<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-800" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
</div>
)
}

View File

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

View File

@@ -1,90 +1,111 @@
import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts'
"use client";
import { Container } from '@/components/Container'
import { Eyebrow, H3, P, Small } from '@/components/Texts'
const useCases = [
{
title: 'AI / ML Training',
title: 'Enterprise & Private Kubernetes',
description:
'Run GPU-accelerated workloads for deep learning, data science, and inference on demand.',
bullets: ['GPU acceleration', 'Scalable compute', 'Cost optimization'],
},
{
title: 'Enterprise Kubernetes',
description:
'Operate production-grade clusters with complete control and no vendor lock-in.',
bullets: ['High availability', 'Security', 'Compliance'],
},
{
title: 'Edge & IoT',
description:
'Leverage global nodes for low-latency workloads and connected device deployments.',
bullets: ['Low latency', 'Global distribution', 'Real-time processing'],
},
{
title: 'DigitalMe Blueprint',
description:
'Launch a full digital workspace on Mycelium Cloud with pre-integrated services.',
'Production-grade K3s clusters with full workload ownership and residency control. Deploy apps and internal services without vendor lock-in or exposed surfaces.',
bullets: [
'Cryptpad • Encrypted collaboration',
'Elements • Matrix chat',
'Stallwart • Mail, calendar, contacts',
'Gitea • Git hosting',
'Nextcloud • File storage and sync',
'LiveKit / Jitsi • Real-time video',
'Single Sign-On backed by Gitea',
'High availability + failover',
'Encrypted, mesh-native networking',
'Compliance-ready governance & policy control',
],
},
{
title: 'Edge & Distributed Deployments',
description:
'Place compute close to where data is created. Run clusters globally across home labs, offices, data centers, or edge locations.',
bullets: [
'Low-latency execution',
'Mesh-routed connectivity',
'Autonomous healing across region',
],
},
{
title: 'AI / ML & Agent Workloads',
description:
'Run inference, training, and autonomous AI systems on sovereign compute. GPU orchestration, private vector storage, and model execution without handing data to hyperscalers.',
bullets: [
'Scales across nodes',
'Supports open-source & fine-tuned models',
'Built for agentic automation + RAG',
],
},
]
export function CloudUseCases() {
return (
<section className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow>
Use Cases
</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900">
Built for intelligent workloads across every edge.
</SectionHeader>
<P className="mt-6 text-gray-600">
Mycelium Cloud unifies compute, storage, and networking so teams can
launch anything from GPU inference farms to global collaboration
suites with deterministic outcomes.
</P>
</div>
<div className="mt-16 grid gap-8 lg:grid-cols-2">
{useCases.map((useCase) => (
<div
key={useCase.title}
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"
>
<div className="flex items-center justify-between">
<h3 className="text-xl font-semibold text-gray-900">
{useCase.title}
</h3>
<Small className="text-xs uppercase tracking-[0.3em] text-cyan-500">
Scenario
</Small>
</div>
<p className="mt-4 text-sm leading-relaxed text-gray-600">
{useCase.description}
</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>
</div>
))}
</div>
</Container>
<section className="w-full max-w-8xl mx-auto bg-transparent">
{/* ✅ 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-100"></div>
<div className="w-full border-t border-l border-r border-gray-100" />
{/* ✅ Inner boxed container */}
<div className="max-w-7xl bg-white mx-auto py-12 border border-t-0 border-b-0 border-gray-100">
<Container>
<div className="mx-auto max-w-4xl sm:text-center">
<Eyebrow className="text-cyan-500">USE CASES</Eyebrow>
<H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-900">
Built for intelligent workloads across every edge.
</H3>
<P className="mt-6 text-lg text-gray-600">
Mycelium Cloud unifies compute, storage, and networking so teams can
launch anything from GPU inference farms to global collaboration suites
with deterministic outcomes.
</P>
</div>
{/* ✅ 3 columns on desktop */}
<ul
role="list"
className="mx-auto mt-12 grid max-w-2xl grid-cols-1 gap-6
sm:grid-cols-2 lg:max-w-none lg:grid-cols-3 md:gap-y-10"
>
{useCases.map((useCase) => (
<li
key={useCase.title}
className="rounded-md border border-gray-100 bg-white p-6 transition-all duration-300
hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20 flex flex-col"
>
<div className="flex items-center justify-between">
<h3 className="font-semibold text-gray-900">
{useCase.title}
</h3>
<Small className="uppercase tracking-[0.25em] text-cyan-500">
Scenario
</Small>
</div>
<p className="mt-4 text-gray-700 leading-snug">
{useCase.description}
</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-100" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</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 { Button } from '../../components/Button'
import { Container } from '@/components/Container'
import { Button } from '@/components/Button'
export function CloudCTA() {
return (

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