Compare commits
	
		
			21 Commits
		
	
	
		
			developmen
			...
			ff1f29b652
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| ff1f29b652 | |||
| 41bd49dfaf | |||
| 9ae3785c70 | |||
| 24a0a981a9 | |||
| e5cbce4c86 | |||
| 2ba55566b5 | |||
| 
						 | 
					d82d3351f3 | ||
| 05cd30f510 | |||
| 2a141cbc91 | |||
| 2ebdb14409 | |||
| 3ea9e77a7b | |||
| a52e838d17 | |||
| b543aebce9 | |||
| 8844ec8a63 | |||
| 68b2119c76 | |||
| 94f4e72e57 | |||
| c1952754d7 | |||
| c0df7c21a7 | |||
| be74079de2 | |||
| 752668b38d | |||
| 11689fdd37 | 
							
								
								
									
										181
									
								
								docs/mycelium_cloud_for_devs.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,181 @@
 | 
			
		||||
# Mycelium Cloud for Developers
 | 
			
		||||
 | 
			
		||||
*Developer Guide to Decentralized Cloud Computing*
 | 
			
		||||
 | 
			
		||||
## Overview
 | 
			
		||||
Mycelium Cloud provides a comprehensive platform for deploying and managing Kubernetes clusters on the decentralized ThreeFold Grid infrastructure. This guide covers the core features and capabilities available to developers.
 | 
			
		||||
 | 
			
		||||
## Architecture
 | 
			
		||||
 | 
			
		||||
### Decentralized Infrastructure
 | 
			
		||||
Mycelium Cloud deploys on ThreeFold Grid's distributed network, providing:
 | 
			
		||||
- **Direct Node Access**: Each node gets a unique Mycelium IP address
 | 
			
		||||
- **Cross-Node Communication**: Services communicate across nodes using Mycelium networking
 | 
			
		||||
- **Secure Communication**: All traffic is encrypted through the Mycelium network
 | 
			
		||||
- **No Public IPs Required**: Services accessible via Mycelium IPs
 | 
			
		||||
 | 
			
		||||
### Network Flow
 | 
			
		||||
User Machine → Mycelium Network → Cluster Node → Service
 | 
			
		||||
 | 
			
		||||
### Kubernetes Management
 | 
			
		||||
- **K3s Support**: Full K3s cluster deployment and management
 | 
			
		||||
- **IPv6 Networking**: Mycelium peer-to-peer networking
 | 
			
		||||
- **High Availability**: Multi-master cluster support
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Core Features
 | 
			
		||||
 | 
			
		||||
### Mycelium Networking
 | 
			
		||||
Ultra-fast, decentralized networking inspired by nature. Mycelium Networking forms a resilient, adaptive mesh that routes around failures and optimizes for speed and security.
 | 
			
		||||
 | 
			
		||||
**Features:**
 | 
			
		||||
- End-to-end encrypted
 | 
			
		||||
- Nature-inspired
 | 
			
		||||
- Direct node communication
 | 
			
		||||
- Secure peer-to-peer connections
 | 
			
		||||
 | 
			
		||||
### Zero-Image Technology
 | 
			
		||||
Metadata-driven zero-images cut artifacts up to 100x, slashing bandwidth and deployment overhead.
 | 
			
		||||
 | 
			
		||||
**Benefits:**
 | 
			
		||||
- **Deterministic Deployments**: Cryptographic verification ensures every workload deploys exactly as intended—no tampering, no drift
 | 
			
		||||
- **Multi-Workload Compatibility with Secure Boot**: Run containers, VMs, and Linux workloads anywhere with stateless secure boot and continuous verification
 | 
			
		||||
- **Smart Contract-Based Deployment**: Cryptographically signed contracts orchestrate every workload with transparent, tamper-proof execution
 | 
			
		||||
 | 
			
		||||
### Quantum-Safe Storage (QSS)
 | 
			
		||||
Quantum-resistant encryption secures data beyond the app layer so ownership and control stay yours.
 | 
			
		||||
 | 
			
		||||
**Features:**
 | 
			
		||||
- **Self-Healing Storage System**: Autonomous recovery heals failures or corruption instantly, preserving integrity without human intervention
 | 
			
		||||
- **Multi-Protocol Data Access**: Serve the same data via IPFS, S3, WebDAV, HTTP, and native file systems for seamless integration
 | 
			
		||||
- **Geo-Aware Data Placement & Replication**: Define residency, redundancy, and distribution per workload while zone-to-zone replication hardens resilience
 | 
			
		||||
 | 
			
		||||
### Multi-Master Clusters
 | 
			
		||||
High-availability Kubernetes clusters with multiple control plane nodes. Automatic failover, leader election, and zero-downtime upgrades built-in.
 | 
			
		||||
 | 
			
		||||
**Capabilities:**
 | 
			
		||||
- **HA Control Plane**
 | 
			
		||||
- **Automatic Failover**
 | 
			
		||||
- **Zero-downtime Upgrades**
 | 
			
		||||
 | 
			
		||||
### Effortless Load Balancing & Scaling
 | 
			
		||||
Mycelium Cloud automatically balances traffic and scales your services up or down based on demand. Enjoy high availability and optimal performance with zero manual intervention.
 | 
			
		||||
 | 
			
		||||
**Features:**
 | 
			
		||||
- **Auto-scaling**
 | 
			
		||||
- **Built-in load balancing**
 | 
			
		||||
- **High availability**
 | 
			
		||||
 | 
			
		||||
### Simple Web Gateway Access
 | 
			
		||||
Expose any service to the public web with a simple Kubernetes resource. No complex Ingress controllers. Domain and prefix-based routing is built-in.
 | 
			
		||||
 | 
			
		||||
**Benefits:**
 | 
			
		||||
- **Simple configuration**
 | 
			
		||||
- **Built-in routing**
 | 
			
		||||
- **No ingress controllers**
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Getting Started
 | 
			
		||||
 | 
			
		||||
### 1. Account Setup
 | 
			
		||||
- **Sign Up**: Create your account from signup page
 | 
			
		||||
- **Verify Email**: Check your email and verify your account
 | 
			
		||||
- **Add Funds**: Navigate to your dashboard and add credits to your account
 | 
			
		||||
- **Add SSH Key**: Navigate to Add SSH card and upload your public SSH key
 | 
			
		||||
 | 
			
		||||
### 2. Deploy Your First Cluster
 | 
			
		||||
- **Access Deploy**: Click "Deploy Cluster" from your dashboard
 | 
			
		||||
- **Configure VMs**: Define your virtual machines:
 | 
			
		||||
  - Choose CPU, memory, and storage requirements
 | 
			
		||||
  - Select the number of master and worker nodes
 | 
			
		||||
- **Select Nodes**: Choose ThreeFold Grid nodes for deployment
 | 
			
		||||
- **Review & Deploy**: Confirm your configuration and deploy
 | 
			
		||||
 | 
			
		||||
### 3. Access Your Cluster
 | 
			
		||||
 | 
			
		||||
#### Download Kubeconfig
 | 
			
		||||
- Go to dashboard → Clusters → Click download icon (⬇️)
 | 
			
		||||
- Set kubeconfig: `export KUBECONFIG=/path/to/config`
 | 
			
		||||
- Test: `kubectl get nodes`
 | 
			
		||||
 | 
			
		||||
#### SSH Access
 | 
			
		||||
- **Find Mycelium IPs**: Check cluster details page for node IPs
 | 
			
		||||
- **Download Mycelium Binary**:
 | 
			
		||||
  ```bash
 | 
			
		||||
  wget https://github.com/threefoldtech/mycelium/releases/latest/download/mycelium-private-x86_64-unknown-linux-musl.tar.gz
 | 
			
		||||
  tar -xzf mycelium-private-x86_64-unknown-linux-musl.tar.gz
 | 
			
		||||
  sudo chmod +x mycelium-private
 | 
			
		||||
  sudo mv mycelium-private /usr/local/bin/mycelium
 | 
			
		||||
  ```
 | 
			
		||||
- **Start Mycelium**:
 | 
			
		||||
  ```bash
 | 
			
		||||
  sudo mycelium --peers tcp://188.40.132.242:9651 tcp://136.243.47.186:9651 tcp://185.69.166.7:9651 tcp://185.69.166.8:9651 tcp://65.21.231.58:9651 tcp://65.109.18.113:9651 tcp://209.159.146.190:9651 tcp://5.78.122.16:9651 tcp://5.223.43.251:9651 tcp://142.93.217.194:9651
 | 
			
		||||
  ```
 | 
			
		||||
- **SSH to nodes**: `ssh root@<mycelium-ip>`
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Use Cases
 | 
			
		||||
 | 
			
		||||
### AI/ML Training
 | 
			
		||||
Run GPU-accelerated workloads for deep learning and data science on demand.
 | 
			
		||||
- **GPU Acceleration**
 | 
			
		||||
- **Scalable Compute**
 | 
			
		||||
- **Cost Optimization**
 | 
			
		||||
 | 
			
		||||
### Enterprise Kubernetes
 | 
			
		||||
Deploy production-grade clusters with full control and no vendor lock-in.
 | 
			
		||||
- **High Availability**
 | 
			
		||||
- **Security**
 | 
			
		||||
- **Compliance**
 | 
			
		||||
 | 
			
		||||
### Edge & IoT
 | 
			
		||||
Leverage global nodes for low-latency edge computing and IoT applications.
 | 
			
		||||
- **Low Latency**
 | 
			
		||||
- **Global Distribution**
 | 
			
		||||
- **Real-time Processing**
 | 
			
		||||
 | 
			
		||||
### DigitalMe Example
 | 
			
		||||
Example of what can be done with Mycelium Cloud. With a very simple execution, the following can be deployed on k8s cluster and served on Mycelium IPs:
 | 
			
		||||
 | 
			
		||||
- **Cryptpad**: Encrypted document collaboration
 | 
			
		||||
- **Elements**: Matrix chat (the Rust one)
 | 
			
		||||
- **Stallwart**: Mail/calendar/contacts
 | 
			
		||||
- **Gitea**: Git hosting and code collaboration
 | 
			
		||||
- **Nextcloud**: File storage and synchronization
 | 
			
		||||
- **LiveKit or Jitsi**: Video conferencing integrated with elements/nextcloud
 | 
			
		||||
- **SSO**: Single Sign-On (can this be gitea as backend - later)
 | 
			
		||||
 | 
			
		||||
This demonstrates the platform's capability to host complex, integrated applications with minimal configuration.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Key Differentiators
 | 
			
		||||
 | 
			
		||||
### Sovereign by Design
 | 
			
		||||
Control jurisdiction, residency, and governance for every workload with transparent, verifiable operations.
 | 
			
		||||
 | 
			
		||||
### Secure by Default
 | 
			
		||||
Cryptographic verification, secure boot, and zero-image delivery protect the entire lifecycle automatically.
 | 
			
		||||
 | 
			
		||||
### Ready to Scale
 | 
			
		||||
Autonomous orchestration keeps the platform elastic, cost-efficient, and always available across the globe.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Security Architecture
 | 
			
		||||
 | 
			
		||||
### Provable Sovereignty
 | 
			
		||||
Assign workloads to trusted zones, verify state with cryptographic proofs, and maintain full lineage for every byte.
 | 
			
		||||
 | 
			
		||||
### Autonomous Zero-Trust
 | 
			
		||||
Identity, policy, and attestation are enforced continuously—no manual keys, no hidden backdoors, no shared control.
 | 
			
		||||
 | 
			
		||||
### Planetary-Scale Resilience
 | 
			
		||||
Mesh-connected infrastructure routes around failure, keeping applications responsive even when regions go dark.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
*Mycelium Cloud - Comprehensive platform for decentralized Kubernetes deployment.*
 | 
			
		||||
							
								
								
									
										157
									
								
								docs/mycelium_gpu_for_devs.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,157 @@
 | 
			
		||||
# Mycelium GPU for Developers
 | 
			
		||||
 | 
			
		||||
*The Energy Behind Intelligence*
 | 
			
		||||
 | 
			
		||||
## Overview
 | 
			
		||||
 | 
			
		||||
Mycelium GPU provides unified access to distributed GPU acceleration across the ThreeFold Grid. It transforms fragmented GPU resources into a single sovereign fabric for running AI, ML, and rendering workloads.
 | 
			
		||||
 | 
			
		||||
## Core Concept
 | 
			
		||||
 | 
			
		||||
Mycelium GPU unifies distributed acceleration into a single sovereign fabric — turning fragmented hardware into one adaptive intelligence layer. Run AI, ML, and rendering workloads anywhere, from edge to core, with deterministic performance and transparent cost.
 | 
			
		||||
 | 
			
		||||
### Key Principles
 | 
			
		||||
- **No Silos**: All GPU resources accessible through single interface
 | 
			
		||||
- **No Intermediaries**: Direct access to GPU resources
 | 
			
		||||
- **Raw, Verifiable Power**: Every GPU cycle cryptographically verified
 | 
			
		||||
- **Orchestrated Through Code**: GPU resources managed through APIs and smart contracts
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Use Cases
 | 
			
		||||
 | 
			
		||||
### AI/ML Training
 | 
			
		||||
Run GPU-accelerated workloads for deep learning and data science on demand.
 | 
			
		||||
 | 
			
		||||
**Features:**
 | 
			
		||||
- **GPU Acceleration**: High-performance computing for machine learning
 | 
			
		||||
- **Scalable Compute**: Scale training across multiple GPU resources
 | 
			
		||||
- **Cost Optimization**: Pay only for actual GPU usage
 | 
			
		||||
 | 
			
		||||
### Rendering & Visualization
 | 
			
		||||
Run high-performance graphics processing workloads.
 | 
			
		||||
 | 
			
		||||
**Applications:**
 | 
			
		||||
- **3D Rendering**: Distributed rendering for film, games, and architecture
 | 
			
		||||
- **Scientific Visualization**: Complex data visualization and analysis
 | 
			
		||||
- **Virtual Reality**: Real-time VR/AR processing
 | 
			
		||||
- **Digital Twins**: Real-time simulation and modeling
 | 
			
		||||
 | 
			
		||||
### General GPU Computing
 | 
			
		||||
High-performance computing for various computational workloads.
 | 
			
		||||
 | 
			
		||||
**Applications:**
 | 
			
		||||
- **Scientific Simulations**: Physics, chemistry, climate modeling
 | 
			
		||||
- **Financial Modeling**: Risk analysis and algorithmic trading
 | 
			
		||||
- **Cryptocurrency**: Mining and blockchain processing
 | 
			
		||||
- **Protein Folding**: Drug discovery and molecular modeling
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Integration with Mycelium Cloud
 | 
			
		||||
 | 
			
		||||
Mycelium GPU works seamlessly with Mycelium Cloud infrastructure:
 | 
			
		||||
 | 
			
		||||
- **Unified Networking**: GPU nodes accessible via Mycelium network
 | 
			
		||||
- **Shared Security**: Zero-trust security model applies to GPU operations
 | 
			
		||||
- **Storage Integration**: Access quantum-safe storage from GPU workloads
 | 
			
		||||
- **Kubernetes Support**: GPU workloads can be deployed as Kubernetes resources
 | 
			
		||||
 | 
			
		||||
### Deployment Example
 | 
			
		||||
```yaml
 | 
			
		||||
# GPU workload specification for Kubernetes
 | 
			
		||||
apiVersion: apps/v1
 | 
			
		||||
kind: Deployment
 | 
			
		||||
metadata:
 | 
			
		||||
  name: gpu-workload
 | 
			
		||||
spec:
 | 
			
		||||
  replicas: 1
 | 
			
		||||
  selector:
 | 
			
		||||
    matchLabels:
 | 
			
		||||
      app: gpu-compute
 | 
			
		||||
  template:
 | 
			
		||||
    metadata:
 | 
			
		||||
      labels:
 | 
			
		||||
        app: gpu-compute
 | 
			
		||||
    spec:
 | 
			
		||||
      containers:
 | 
			
		||||
      - name: gpu-compute
 | 
			
		||||
        image: tensorflow/tensorflow:latest-gpu
 | 
			
		||||
        resources:
 | 
			
		||||
          limits:
 | 
			
		||||
            nvidia.com/gpu: 1
 | 
			
		||||
        env:
 | 
			
		||||
        - name: MYCELIUM_GPU_REGION
 | 
			
		||||
          value: "auto"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Getting Started
 | 
			
		||||
 | 
			
		||||
### Access GPU Resources
 | 
			
		||||
1. **Account Setup**: Create Mycelium account with GPU access
 | 
			
		||||
2. **Resource Request**: Use Mycelium GPU APIs to request GPU resources
 | 
			
		||||
3. **Workload Deployment**: Deploy your AI/ML or compute workload
 | 
			
		||||
4. **Monitor Usage**: Track GPU utilization and costs through dashboard
 | 
			
		||||
 | 
			
		||||
### Basic Workflow
 | 
			
		||||
```
 | 
			
		||||
Application → Mycelium GPU API → GPU Resource Allocation → Workload Execution
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Key Benefits
 | 
			
		||||
- **Deterministic Performance**: Predictable GPU allocation and performance
 | 
			
		||||
- **Global Distribution**: Access GPU resources worldwide
 | 
			
		||||
- **Transparent Costs**: Clear pricing without hidden fees
 | 
			
		||||
- **Sovereign Control**: Full control over GPU workloads and data
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Technical Architecture
 | 
			
		||||
 | 
			
		||||
### Distributed GPU Mesh
 | 
			
		||||
Mycelium GPU creates a peer-to-peer network of GPU resources accessible through the Mycelium Network.
 | 
			
		||||
 | 
			
		||||
**Components:**
 | 
			
		||||
- **GPU Nodes**: Physical GPU hardware distributed globally
 | 
			
		||||
- **Mycelium Network**: Encrypted peer-to-peer communication layer
 | 
			
		||||
- **Orchestration Layer**: API and smart contract-based resource management
 | 
			
		||||
- **Monitoring**: Real-time GPU utilization and health monitoring
 | 
			
		||||
 | 
			
		||||
### Performance Characteristics
 | 
			
		||||
- **Edge-to-Core Deployment**: Run workloads from edge devices to data centers
 | 
			
		||||
- **Adaptive Intelligence Layer**: Optimizes GPU resource allocation
 | 
			
		||||
- **Deterministic Performance**: Guaranteed resource availability and performance
 | 
			
		||||
- **Transparent Cost**: All GPU usage tracked and billed transparently
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Key Differentiators
 | 
			
		||||
 | 
			
		||||
### Unified Fabric
 | 
			
		||||
Transforms fragmented GPU resources into a single, unified acceleration fabric accessible through standard APIs.
 | 
			
		||||
 | 
			
		||||
### Sovereign Control
 | 
			
		||||
Complete control over GPU workloads with no vendor lock-in or geographical restrictions.
 | 
			
		||||
 | 
			
		||||
### Code-Driven Orchestration
 | 
			
		||||
GPU resources managed through APIs and smart contracts, enabling automated and verifiable resource allocation.
 | 
			
		||||
 | 
			
		||||
### Deterministic Performance
 | 
			
		||||
Guaranteed GPU allocation with consistent performance characteristics across all workloads.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Cost Efficiency
 | 
			
		||||
 | 
			
		||||
Mycelium GPU provides cost-effective access to GPU resources through:
 | 
			
		||||
 | 
			
		||||
- **Transparent Pricing**: No hidden fees or surprise charges
 | 
			
		||||
- **Pay-per-Usage**: Pay only for actual GPU consumption
 | 
			
		||||
- **Global Optimization**: Access GPUs where they're most cost-effective
 | 
			
		||||
- **No Vendor Lock-in**: Avoid premium pricing from single providers
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
*Mycelium GPU - Unifying distributed acceleration into a sovereign fabric.*
 | 
			
		||||
							
								
								
									
										10
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						@@ -12,6 +12,7 @@
 | 
			
		||||
        "@headlessui/react": "^2.2.9",
 | 
			
		||||
        "@heroicons/react": "^2.2.0",
 | 
			
		||||
        "@lobehub/icons": "^1.97.2",
 | 
			
		||||
        "@radix-ui/react-icons": "^1.3.2",
 | 
			
		||||
        "@react-three/drei": "^9.89.2",
 | 
			
		||||
        "@react-three/fiber": "^8.15.12",
 | 
			
		||||
        "@tabler/icons-react": "^3.35.0",
 | 
			
		||||
@@ -2478,6 +2479,15 @@
 | 
			
		||||
        "react": "^16.8 || ^17.0 || ^18.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@radix-ui/react-icons": {
 | 
			
		||||
      "version": "1.3.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz",
 | 
			
		||||
      "integrity": "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@radix-ui/react-id": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz",
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@
 | 
			
		||||
    "@headlessui/react": "^2.2.9",
 | 
			
		||||
    "@heroicons/react": "^2.2.0",
 | 
			
		||||
    "@lobehub/icons": "^1.97.2",
 | 
			
		||||
    "@radix-ui/react-icons": "^1.3.2",
 | 
			
		||||
    "@react-three/drei": "^9.89.2",
 | 
			
		||||
    "@react-three/fiber": "^8.15.12",
 | 
			
		||||
    "@tabler/icons-react": "^3.35.0",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								public/images/ChatGPT Image Oct 24, 2025, 05_03_52 PM.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.1 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/agentshero.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.1 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/benefits/autonomous.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 51 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/benefits/cost.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 50 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/benefits/energy.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 30 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/benefits/sovereign.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 68 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/computehero.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 116 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/computehero.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.1 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/computehero2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.1 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/computehero3.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 110 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/computehero3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.6 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/computehero4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.3 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/gpuhero.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 6.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/gpuhero.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 943 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/home.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.4 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/homehero1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.7 MiB  | 
| 
		 After Width: | Height: | Size: 232 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/logo_1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 22 KiB  | 
| 
		 Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 66 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/mchip3.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 48 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/networkhero.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.1 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/storagehero.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.2 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/images/storagehero2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.5 MiB  | 
@@ -5,6 +5,9 @@ import CloudPage from './pages/cloud/CloudPage'
 | 
			
		||||
import NetworkPage from './pages/network/NetworkPage'
 | 
			
		||||
import AgentsPage from './pages/agents/AgentsPage'
 | 
			
		||||
import DownloadPage from './pages/download/DownloadPage'
 | 
			
		||||
import ComputePage from './pages/compute/ComputePage'
 | 
			
		||||
import StoragePage from './pages/storage/StoragePage'
 | 
			
		||||
import GpuPage from './pages/gpu/GpuPage'
 | 
			
		||||
 | 
			
		||||
function App() {
 | 
			
		||||
  return (
 | 
			
		||||
@@ -15,7 +18,10 @@ function App() {
 | 
			
		||||
          <Route path="cloud" element={<CloudPage />} />
 | 
			
		||||
          <Route path="network" element={<NetworkPage />} />
 | 
			
		||||
          <Route path="agents" element={<AgentsPage />} />
 | 
			
		||||
          <Route path="download" element={<DownloadPage />} />
 | 
			
		||||
                    <Route path="download" element={<DownloadPage />} />
 | 
			
		||||
          <Route path="compute" element={<ComputePage />} />
 | 
			
		||||
          <Route path="storage" element={<StoragePage />} />
 | 
			
		||||
          <Route path="gpu" element={<GpuPage />} />
 | 
			
		||||
        </Route>
 | 
			
		||||
      </Routes>
 | 
			
		||||
    </BrowserRouter>
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +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',
 | 
			
		||||
    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',
 | 
			
		||||
  },
 | 
			
		||||
@@ -29,7 +30,7 @@ type ButtonProps = (
 | 
			
		||||
    }
 | 
			
		||||
  | {
 | 
			
		||||
      variant: 'outline'
 | 
			
		||||
      color?: keyof typeof variantStyles.outline
 | 
			
		||||
      color?: (keyof typeof variantStyles.outline) | 'cyan'
 | 
			
		||||
    }
 | 
			
		||||
) &
 | 
			
		||||
  (
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ interface ContactFormProps {
 | 
			
		||||
  isOpen: boolean
 | 
			
		||||
  onClose: () => void
 | 
			
		||||
  title?: string
 | 
			
		||||
  formType?: 'investor' | 'partner' | 'agent_waitlist'
 | 
			
		||||
  formType?: 'investor' | 'partner' | 'agent_waitlist' | 'storage_waitlist' | 'compute_waitlist' | 'gpu_waitlist'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const initialFormState = {
 | 
			
		||||
@@ -187,6 +187,12 @@ export default function ContactForm({
 | 
			
		||||
                          ? 'Tell us about your investment interests and how we can collaborate.'
 | 
			
		||||
                          : formType === 'agent_waitlist'
 | 
			
		||||
                            ? 'Tell us about your sovereign agent requirements.'
 | 
			
		||||
                            : formType === 'storage_waitlist'
 | 
			
		||||
                            ? 'Tell us about your storage requirements.'
 | 
			
		||||
                            : formType === 'compute_waitlist'
 | 
			
		||||
                            ? 'Tell us about your compute requirements.'
 | 
			
		||||
                            : formType === 'gpu_waitlist'
 | 
			
		||||
                            ? 'Tell us about your GPU requirements.'
 | 
			
		||||
                            : 'Tell us about your project or how we can help.'
 | 
			
		||||
                      }
 | 
			
		||||
                    />
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ export function Footer() {
 | 
			
		||||
        <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-20 w-20 flex-none" />
 | 
			
		||||
              <img src="/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>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,9 @@
 | 
			
		||||
import { Link } 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/pmyceliumlogo.png'
 | 
			
		||||
import pmyceliumLogo from '../images/logos/logo_1.png'
 | 
			
		||||
 | 
			
		||||
export function Header() {
 | 
			
		||||
  return (
 | 
			
		||||
@@ -13,12 +15,20 @@ export function Header() {
 | 
			
		||||
              <img src={pmyceliumLogo} alt="Mycelium" className="h-8 w-auto" />
 | 
			
		||||
            </Link>
 | 
			
		||||
            <div className="hidden lg:flex lg:gap-10">
 | 
			
		||||
              <Link
 | 
			
		||||
                to="/cloud"
 | 
			
		||||
                className="text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors"
 | 
			
		||||
              >
 | 
			
		||||
                Cloud
 | 
			
		||||
              </Link>
 | 
			
		||||
              <Dropdown
 | 
			
		||||
                buttonContent={
 | 
			
		||||
                  <>
 | 
			
		||||
                    Cloud
 | 
			
		||||
                    <ChevronDownIcon className="h-5 w-5" aria-hidden="true" />
 | 
			
		||||
                  </>
 | 
			
		||||
                }
 | 
			
		||||
                items={[
 | 
			
		||||
                  { name: 'Cloud', href: '/cloud' },
 | 
			
		||||
                  { name: 'Compute', href: '/compute' },
 | 
			
		||||
                  { name: 'Storage', href: '/storage' },
 | 
			
		||||
                  { name: 'GPU', href: '/gpu' },
 | 
			
		||||
                ]}
 | 
			
		||||
              />
 | 
			
		||||
              <Link
 | 
			
		||||
                to="/network"
 | 
			
		||||
                className="text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors"
 | 
			
		||||
 
 | 
			
		||||
@@ -160,4 +160,4 @@ export const DownloadCardDescription = createTextComponent(
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
export const CT = createTextComponent('span', 'text-lg lg:text-xl font-semibold')
 | 
			
		||||
export const CP = createTextComponent('p', 'text-sm lg:text-sm leading-[1.525] font-light')
 | 
			
		||||
export const CP = createTextComponent('p', 'text-sm lg:text-sm tracking-wide leading-[1.525] font-light')
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										77
									
								
								src/components/magicui/bento-grid.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,77 @@
 | 
			
		||||
import type { ReactNode } from "react";
 | 
			
		||||
import { Button } from "@/components/ui/button";
 | 
			
		||||
import { ArrowRightIcon } from "@radix-ui/react-icons";
 | 
			
		||||
import { cn } from "@/lib/utils";
 | 
			
		||||
 | 
			
		||||
const BentoGrid = ({
 | 
			
		||||
  children,
 | 
			
		||||
  className,
 | 
			
		||||
}: {
 | 
			
		||||
  children: ReactNode;
 | 
			
		||||
  className?: string;
 | 
			
		||||
}) => {
 | 
			
		||||
  return (
 | 
			
		||||
    <div
 | 
			
		||||
      className={cn(
 | 
			
		||||
        "grid w-full auto-rows-[22rem] grid-cols-3 gap-4",
 | 
			
		||||
        className,
 | 
			
		||||
      )}
 | 
			
		||||
    >
 | 
			
		||||
      {children}
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const BentoCard = ({
 | 
			
		||||
  name,
 | 
			
		||||
  className,
 | 
			
		||||
  background,
 | 
			
		||||
  Icon,
 | 
			
		||||
  description,
 | 
			
		||||
  href,
 | 
			
		||||
  cta,
 | 
			
		||||
}: {
 | 
			
		||||
  name: string;
 | 
			
		||||
  className: string;
 | 
			
		||||
  background: ReactNode;
 | 
			
		||||
  Icon: any;
 | 
			
		||||
  description: string;
 | 
			
		||||
  href: string;
 | 
			
		||||
  cta: string;
 | 
			
		||||
}) => (
 | 
			
		||||
  <div
 | 
			
		||||
    key={name}
 | 
			
		||||
    className={cn(
 | 
			
		||||
      "group relative col-span-3 flex flex-col justify-between overflow-hidden rounded-xl",
 | 
			
		||||
      // light styles
 | 
			
		||||
      "bg-white [box-shadow:0_0_0_1px_rgba(0,0,0,.03),0_2px_4px_rgba(0,0,0,.05),0_12px_24px_rgba(0,0,0,.05)]",
 | 
			
		||||
      // dark styles
 | 
			
		||||
      "transform-gpu dark:bg-black dark:[border:1px_solid_rgba(255,255,255,.1)] dark:[box-shadow:0_-20px_80px_-20px_#ffffff1f_inset]",
 | 
			
		||||
      className,
 | 
			
		||||
    )}
 | 
			
		||||
  >
 | 
			
		||||
    <div>{background}</div>
 | 
			
		||||
    <div className="pointer-events-none z-10 flex transform-gpu flex-col gap-1 p-6 transition-all duration-300 group-hover:-translate-y-10">
 | 
			
		||||
      <Icon className="h-12 w-12 origin-left transform-gpu text-neutral-700 -translate-y-12 transition-all duration-300 ease-in-out group-hover:scale-75 group-hover:text-sky-700" />
 | 
			
		||||
      <h3 className="text-xl font-semibold text-neutral-700 dark:text-neutral-300">
 | 
			
		||||
        {name}
 | 
			
		||||
      </h3>
 | 
			
		||||
      <p className="max-w-lg text-neutral-400">{description}</p>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div
 | 
			
		||||
      className={cn(
 | 
			
		||||
        "pointer-events-none absolute bottom-0 flex w-full translate-y-10 transform-gpu flex-row items-center p-4 opacity-0 transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100",
 | 
			
		||||
      )}
 | 
			
		||||
    >
 | 
			
		||||
      <Button variant="ghost" asChild size="sm" className="pointer-events-auto">
 | 
			
		||||
        <a href={href}>
 | 
			
		||||
          {cta}
 | 
			
		||||
          <ArrowRightIcon className="ml-2 h-4 w-4" />
 | 
			
		||||
        </a>
 | 
			
		||||
      </Button>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
export { BentoCard, BentoGrid };
 | 
			
		||||
							
								
								
									
										63
									
								
								src/components/magicui/magic-card.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,63 @@
 | 
			
		||||
'use client';
 | 
			
		||||
 | 
			
		||||
import { cn } from '@/lib/utils';
 | 
			
		||||
import { type ReactNode, useEffect, useRef, useState } from 'react';
 | 
			
		||||
 | 
			
		||||
interface MagicCardProps {
 | 
			
		||||
  children: ReactNode;
 | 
			
		||||
  className?: string;
 | 
			
		||||
  gradientSize?: number;
 | 
			
		||||
  gradientColor?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const MagicCard = ({ children, className, gradientSize = 200, gradientColor = '#262626' }: MagicCardProps) => {
 | 
			
		||||
  const mouseX = useRef<number>(0);
 | 
			
		||||
  const mouseY = useRef<number>(0);
 | 
			
		||||
  const cardRef = useRef<HTMLDivElement>(null);
 | 
			
		||||
  const [isHovering, setIsHovering] = useState(false);
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    const handleMouseMove = (e: MouseEvent) => {
 | 
			
		||||
      if (cardRef.current) {
 | 
			
		||||
        const rect = cardRef.current.getBoundingClientRect();
 | 
			
		||||
        mouseX.current = e.clientX - rect.left;
 | 
			
		||||
        mouseY.current = e.clientY - rect.top;
 | 
			
		||||
        cardRef.current.style.setProperty('--mouse-x', `${mouseX.current}px`);
 | 
			
		||||
        cardRef.current.style.setProperty('--mouse-y', `${mouseY.current}px`);
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const currentCardRef = cardRef.current;
 | 
			
		||||
    if (currentCardRef) {
 | 
			
		||||
      currentCardRef.addEventListener('mousemove', handleMouseMove);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return () => {
 | 
			
		||||
      if (currentCardRef) {
 | 
			
		||||
        currentCardRef.removeEventListener('mousemove', handleMouseMove);
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
  }, []);
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <div
 | 
			
		||||
      ref={cardRef}
 | 
			
		||||
      onMouseEnter={() => setIsHovering(true)}
 | 
			
		||||
      onMouseLeave={() => setIsHovering(false)}
 | 
			
		||||
      className={cn(
 | 
			
		||||
        'relative w-full h-full p-px rounded-2xl transition-all duration-300 ease-in-out',
 | 
			
		||||
        'bg-neutral-900 hover:bg-neutral-800',
 | 
			
		||||
        className
 | 
			
		||||
      )}
 | 
			
		||||
      style={{
 | 
			
		||||
        background: isHovering
 | 
			
		||||
          ? `radial-gradient(var(--gradient-size, ${gradientSize}px) circle at var(--mouse-x) var(--mouse-y), var(--gradient-color, ${gradientColor}), transparent 100%)`
 | 
			
		||||
          : 'transparent',
 | 
			
		||||
      }}
 | 
			
		||||
    >
 | 
			
		||||
      <div className="relative w-full h-full bg-neutral-950/90 rounded-[15px] p-8">
 | 
			
		||||
        {children}
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
@@ -26,8 +26,11 @@ const CubeSvg: React.FC<React.SVGProps<SVGSVGElement> & { index: number }> = ({
 | 
			
		||||
    <path
 | 
			
		||||
      fill={`url(#cube-gradient-${index})`}
 | 
			
		||||
      d="M491.651 144.747L287.198 227.339C265.219 236.22 241.783 236.22 219.802 227.339L15.3486 144.747C-5.11621 136.479 -5.11621 97.5191 15.3486 89.2539L219.802 6.65884C241.783 -2.21961 265.219 -2.21961 287.198 6.65884L491.651 89.2539C512.116 97.5191 512.116 136.479 491.651 144.747Z"
 | 
			
		||||
      stroke="rgba(59, 130, 246, 0.25)"
 | 
			
		||||
      strokeWidth="0.5"
 | 
			
		||||
    />
 | 
			
		||||
    <defs>
 | 
			
		||||
      {/* Blue-white soft gradient */}
 | 
			
		||||
      <linearGradient
 | 
			
		||||
        id={`cube-gradient-${index}`}
 | 
			
		||||
        x1="185.298"
 | 
			
		||||
@@ -36,14 +39,24 @@ const CubeSvg: React.FC<React.SVGProps<SVGSVGElement> & { index: number }> = ({
 | 
			
		||||
        y2="206.448"
 | 
			
		||||
        gradientUnits="userSpaceOnUse"
 | 
			
		||||
      >
 | 
			
		||||
        <stop stopColor="#E5E7EB" />
 | 
			
		||||
        <stop offset="1" stopColor="#9CA3AF" />
 | 
			
		||||
        <stop offset="0%" stopColor="#EBF8FF" stopOpacity="0.75" />
 | 
			
		||||
        <stop offset="40%" stopColor="#BEE3F8" stopOpacity="0.8" />
 | 
			
		||||
        <stop offset="100%" stopColor="#FFFFFF" stopOpacity="0.9" />
 | 
			
		||||
      </linearGradient>
 | 
			
		||||
    </defs>
 | 
			
		||||
  </svg>
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
export function CubeLight({ title, descriptionTitle, description, isActive, index, onHover, onLeave, onClick }: CubeProps) {
 | 
			
		||||
export function CubeLight({
 | 
			
		||||
  title,
 | 
			
		||||
  descriptionTitle,
 | 
			
		||||
  description,
 | 
			
		||||
  isActive,
 | 
			
		||||
  index,
 | 
			
		||||
  onHover,
 | 
			
		||||
  onLeave,
 | 
			
		||||
  onClick,
 | 
			
		||||
}: CubeProps) {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="relative flex flex-col items-center">
 | 
			
		||||
      <motion.div
 | 
			
		||||
@@ -62,22 +75,34 @@ export function CubeLight({ title, descriptionTitle, description, isActive, inde
 | 
			
		||||
          ease: "easeOut",
 | 
			
		||||
        }}
 | 
			
		||||
      >
 | 
			
		||||
        {/* Glow aura behind cube */}
 | 
			
		||||
        <div
 | 
			
		||||
          className={`absolute inset-0 blur-3xl rounded-2xl transition-all duration-500 ${
 | 
			
		||||
            isActive
 | 
			
		||||
              ? "bg-blue-400/40 opacity-70"
 | 
			
		||||
              : "bg-blue-200/20 opacity-40"
 | 
			
		||||
          }`}
 | 
			
		||||
        />
 | 
			
		||||
 | 
			
		||||
        {/* SVG Cube */}
 | 
			
		||||
        <CubeSvg 
 | 
			
		||||
        <CubeSvg
 | 
			
		||||
          index={index}
 | 
			
		||||
          className="w-48 sm:w-64 lg:w-80 h-auto drop-shadow-lg opacity-80"
 | 
			
		||||
          className="w-48 sm:w-64 lg:w-80 h-auto relative"
 | 
			
		||||
          style={{
 | 
			
		||||
            filter: isActive ? 'brightness(1.1) drop-shadow(0 0 15px rgba(0, 0, 0, 0.2))' : 'brightness(1)',
 | 
			
		||||
            filter: isActive
 | 
			
		||||
              ? "drop-shadow(0 0 25px rgba(59, 130, 246, 0.4)) brightness(1.1)"
 | 
			
		||||
              : "drop-shadow(0 0 10px rgba(59, 130, 246, 0.15)) brightness(1)",
 | 
			
		||||
            transition: "all 0.4s ease",
 | 
			
		||||
          }}
 | 
			
		||||
        />
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        {/* Title overlay */}
 | 
			
		||||
        <div className="absolute inset-0 flex items-center justify-center">
 | 
			
		||||
          <h3 
 | 
			
		||||
            className="text-black text-sm lg:text-base font-medium text-center px-4 drop-shadow-sm"
 | 
			
		||||
            style={{ 
 | 
			
		||||
              transform: 'rotate(0deg) skewX(0deg)',
 | 
			
		||||
              transformOrigin: 'center'
 | 
			
		||||
          <h3
 | 
			
		||||
            className="text-blue-900 text-sm lg:text-base font-medium text-center px-4"
 | 
			
		||||
            style={{
 | 
			
		||||
              textShadow:
 | 
			
		||||
                "0 0 15px rgba(255,255,255,0.8), 0 0 25px rgba(59, 130, 246, 0.5)",
 | 
			
		||||
            }}
 | 
			
		||||
          >
 | 
			
		||||
            {title}
 | 
			
		||||
@@ -106,26 +131,24 @@ export function CubeLight({ title, descriptionTitle, description, isActive, inde
 | 
			
		||||
                y1="1"
 | 
			
		||||
                x2="120"
 | 
			
		||||
                y2="1"
 | 
			
		||||
                stroke="black"
 | 
			
		||||
                stroke="rgba(59, 130, 246, 0.6)"
 | 
			
		||||
                strokeWidth="1"
 | 
			
		||||
                opacity="0.6"
 | 
			
		||||
                opacity="0.8"
 | 
			
		||||
              />
 | 
			
		||||
            </svg>
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            {/* Description text */}
 | 
			
		||||
            <div className="ml-32 w-80">
 | 
			
		||||
              <h4 className="text-black text-base font-semibold mb-2">
 | 
			
		||||
              <h4 className="text-black text-base font-semibold mb-2 drop-shadow-[0_0_6px_rgba(255,255,255,0.6)]">
 | 
			
		||||
                {descriptionTitle}
 | 
			
		||||
              </h4>
 | 
			
		||||
              <p className="text-gray-800 text-sm leading-relaxed font-light">
 | 
			
		||||
              <p className="text-gray-800 text-sm leading-relaxed font-light drop-shadow-[0_0_4px_rgba(255,255,255,0.4)]">
 | 
			
		||||
                {description}
 | 
			
		||||
              </p>
 | 
			
		||||
            </div>
 | 
			
		||||
          </motion.div>
 | 
			
		||||
        )}
 | 
			
		||||
 | 
			
		||||
        {/* Description for Mobile - Below cube */}
 | 
			
		||||
              </motion.div>
 | 
			
		||||
      </motion.div>
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										55
									
								
								src/components/ui/Dropdown.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,55 @@
 | 
			
		||||
import { Menu, Transition } from '@headlessui/react'
 | 
			
		||||
import { Fragment } from 'react'
 | 
			
		||||
import { Link } from 'react-router-dom'
 | 
			
		||||
 | 
			
		||||
interface DropdownItem {
 | 
			
		||||
  name: string
 | 
			
		||||
  href: string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface DropdownProps {
 | 
			
		||||
  buttonContent: React.ReactNode
 | 
			
		||||
  items: DropdownItem[]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function Dropdown({ buttonContent, items }: DropdownProps) {
 | 
			
		||||
  return (
 | 
			
		||||
    <Menu as="div" className="relative inline-block text-left">
 | 
			
		||||
      <div>
 | 
			
		||||
        <Menu.Button className="inline-flex w-full justify-center items-center gap-x-1.5 rounded-md bg-white text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors">
 | 
			
		||||
          {buttonContent}
 | 
			
		||||
        </Menu.Button>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <Transition
 | 
			
		||||
        as={Fragment}
 | 
			
		||||
        enter="transition ease-out duration-100"
 | 
			
		||||
        enterFrom="transform opacity-0 scale-95"
 | 
			
		||||
        enterTo="transform opacity-100 scale-100"
 | 
			
		||||
        leave="transition ease-in duration-75"
 | 
			
		||||
        leaveFrom="transform opacity-100 scale-100"
 | 
			
		||||
        leaveTo="transform opacity-0 scale-95"
 | 
			
		||||
      >
 | 
			
		||||
        <Menu.Items className="absolute right-0 z-10 mt-2 w-56 origin-top-right rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
 | 
			
		||||
          <div className="py-1">
 | 
			
		||||
            {items.map((item) => (
 | 
			
		||||
              <Menu.Item key={item.href}>
 | 
			
		||||
                {({ active }) => (
 | 
			
		||||
                  <Link
 | 
			
		||||
                    to={item.href}
 | 
			
		||||
                    className={`
 | 
			
		||||
                      ${active ? 'bg-gray-100 text-gray-900' : 'text-gray-700'}
 | 
			
		||||
                      block px-4 py-2 text-sm
 | 
			
		||||
                    `}
 | 
			
		||||
                  >
 | 
			
		||||
                    {item.name}
 | 
			
		||||
                  </Link>
 | 
			
		||||
                )}
 | 
			
		||||
              </Menu.Item>
 | 
			
		||||
            ))}
 | 
			
		||||
          </div>
 | 
			
		||||
        </Menu.Items>
 | 
			
		||||
      </Transition>
 | 
			
		||||
    </Menu>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
@@ -2,13 +2,14 @@
 | 
			
		||||
 | 
			
		||||
import { useState } from "react";
 | 
			
		||||
import { motion } from "framer-motion";
 | 
			
		||||
import { CubeLight } from "@/components/ui/CubeLight"
 | 
			
		||||
import { CubeLight } from "@/components/ui/CubeLight";
 | 
			
		||||
 | 
			
		||||
const stackData = [
 | 
			
		||||
  {
 | 
			
		||||
    id: "agent",
 | 
			
		||||
    title: "Agent Layer",
 | 
			
		||||
    descriptionTitle: "Your sovereign agent with private memory and permissioned data access—always under your control.",
 | 
			
		||||
    descriptionTitle:
 | 
			
		||||
      "Your sovereign agent with private memory and permissioned data access—always under your control.",
 | 
			
		||||
    description:
 | 
			
		||||
      "Choose from a wide library of open-source LLMs, paired with built-in semantic search and retrieval.\nIt coordinates across people, apps, and other agents to plan, create, and execute.\nIt operates inside a compliant legal & financial sandbox, ready for real-world transactions and operations.\nMore than just an assistant—an intelligent partner that learns and does your way.",
 | 
			
		||||
    position: "top",
 | 
			
		||||
@@ -16,7 +17,8 @@ const stackData = [
 | 
			
		||||
  {
 | 
			
		||||
    id: "network",
 | 
			
		||||
    title: "Network Layer",
 | 
			
		||||
    descriptionTitle: "A global, end-to-end encrypted overlay that simply doesn’t break.",
 | 
			
		||||
    descriptionTitle:
 | 
			
		||||
      "A global, end-to-end encrypted overlay that simply doesn’t break.",
 | 
			
		||||
    description:
 | 
			
		||||
      "Shortest-path routing moves your traffic the fastest way, every time.\nInstant discovery with integrated DNS, semantic search, and indexing.\nA distributed CDN and edge delivery keep content available and tamper-resistant worldwide.\nBuilt-in tool services and secure coding sandboxes—seamless on phones, desktops, and edge.",
 | 
			
		||||
    position: "middle",
 | 
			
		||||
@@ -24,7 +26,8 @@ const stackData = [
 | 
			
		||||
  {
 | 
			
		||||
    id: "cloud",
 | 
			
		||||
    title: "Cloud Layer",
 | 
			
		||||
    descriptionTitle: "An autonomous, stateless OS that enforces pre-deterministic deployments you define.",
 | 
			
		||||
    descriptionTitle:
 | 
			
		||||
      "An autonomous, stateless OS that enforces pre-deterministic deployments you define.",
 | 
			
		||||
    description:
 | 
			
		||||
      "Workloads are cryptographically bound to your private key—location and access are yours.\nNo cloud vendor or middleman in the path: end-to-end ownership and isolation by default.\nGeo-aware placement delivers locality, compliance, and ultra-low latency where it matters.\nEncrypted, erasure-coded storage, decentralized compute and GPU on demand—including LLMs.",
 | 
			
		||||
    position: "bottom",
 | 
			
		||||
@@ -36,60 +39,74 @@ export function StackedCubesLight() {
 | 
			
		||||
  const [selectedForMobile, setSelectedForMobile] = useState<string | null>("agent");
 | 
			
		||||
 | 
			
		||||
  const handleCubeClick = (id: string) => {
 | 
			
		||||
    setSelectedForMobile(prev => (prev === id ? null : id));
 | 
			
		||||
    setSelectedForMobile((prev) => (prev === id ? null : id));
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const selectedMobileLayer = stackData.find(layer => layer.id === selectedForMobile);
 | 
			
		||||
  const selectedMobileLayer = stackData.find(
 | 
			
		||||
    (layer) => layer.id === selectedForMobile
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="flex flex-col items-center">
 | 
			
		||||
    <div 
 | 
			
		||||
      className="relative w-full flex items-center justify-center lg:justify-center min-h-[450px] lg:min-h-[400px]"
 | 
			
		||||
      onMouseLeave={() => setActive("agent")}
 | 
			
		||||
    >
 | 
			
		||||
      <motion.div
 | 
			
		||||
        className="relative lg:pl-0 pl-6 h-[300px] lg:h-[400px] w-64 sm:w-80 lg:w-96 scale-120 lg:scale-100"
 | 
			
		||||
        animate={{ y: ["-8px", "8px"] }}
 | 
			
		||||
        transition={{
 | 
			
		||||
          duration: 4,
 | 
			
		||||
          repeat: Infinity,
 | 
			
		||||
          repeatType: "reverse",
 | 
			
		||||
          ease: "easeInOut",
 | 
			
		||||
        }}
 | 
			
		||||
    <div className="flex flex-col items-center relative">
 | 
			
		||||
      {/* ✨ Ambient cyan-white gradient background */}
 | 
			
		||||
      <div className="absolute inset-0 bg-gradient-to-b from-white via-cyan-50/40 to-white blur-3xl opacity-70 pointer-events-none" />
 | 
			
		||||
      <div
 | 
			
		||||
        className="relative w-full flex items-center justify-center lg:justify-center min-h-[450px] lg:min-h-[400px]"
 | 
			
		||||
        onMouseLeave={() => setActive("agent")}
 | 
			
		||||
      >
 | 
			
		||||
        {stackData.map((layer, index) => (
 | 
			
		||||
          <div
 | 
			
		||||
            key={layer.id}
 | 
			
		||||
            className="absolute"
 | 
			
		||||
            style={{
 | 
			
		||||
              top: `calc(${index * 30}% - ${index * 10}px)`,
 | 
			
		||||
              zIndex: active === layer.id ? 20 : 10 - index,
 | 
			
		||||
            }}
 | 
			
		||||
          >
 | 
			
		||||
            <CubeLight
 | 
			
		||||
              title={layer.title}
 | 
			
		||||
              descriptionTitle={layer.descriptionTitle}
 | 
			
		||||
              description={layer.description}
 | 
			
		||||
              isActive={active === layer.id}
 | 
			
		||||
              index={index}
 | 
			
		||||
              onHover={() => setActive(layer.id)}
 | 
			
		||||
              onLeave={() => {}}
 | 
			
		||||
              onClick={() => handleCubeClick(layer.id)}
 | 
			
		||||
            />
 | 
			
		||||
          </div>
 | 
			
		||||
        ))}
 | 
			
		||||
      </motion.div>
 | 
			
		||||
    </div>
 | 
			
		||||
    {selectedMobileLayer && (
 | 
			
		||||
      <div className="lg:hidden w-full max-w-md p-6 -mt-8 bg-gray-200/50 rounded-lg">
 | 
			
		||||
        <h4 className="text-black text-lg font-semibold mb-2 text-center">
 | 
			
		||||
          {selectedMobileLayer.descriptionTitle}
 | 
			
		||||
        </h4>
 | 
			
		||||
        <p className="text-gray-700 text-sm leading-relaxed text-center">
 | 
			
		||||
          {selectedMobileLayer.description}
 | 
			
		||||
        </p>
 | 
			
		||||
        <motion.div
 | 
			
		||||
          className="relative lg:pl-0 pl-6 h-[300px] lg:h-[400px] w-64 sm:w-80 lg:w-96"
 | 
			
		||||
          animate={{ y: ["-8px", "8px"] }}
 | 
			
		||||
          transition={{
 | 
			
		||||
            duration: 4,
 | 
			
		||||
            repeat: Infinity,
 | 
			
		||||
            repeatType: "reverse",
 | 
			
		||||
            ease: "easeInOut",
 | 
			
		||||
          }}
 | 
			
		||||
        >
 | 
			
		||||
          {stackData.map((layer, index) => (
 | 
			
		||||
            <div
 | 
			
		||||
              key={layer.id}
 | 
			
		||||
              className="absolute transition-all duration-500"
 | 
			
		||||
              style={{
 | 
			
		||||
                top: `calc(${index * 30}% - ${index * 10}px)`,
 | 
			
		||||
                zIndex: active === layer.id ? 20 : 10 - index,
 | 
			
		||||
              }}
 | 
			
		||||
            >
 | 
			
		||||
              {/* 🌫 subtle glow behind each cube */}
 | 
			
		||||
              <div
 | 
			
		||||
                className={`absolute inset-0 blur-2xl rounded-3xl transition-all duration-500 ${
 | 
			
		||||
                  active === layer.id
 | 
			
		||||
                    ? "bg-cyan-300/40 opacity-70"
 | 
			
		||||
                    : "bg-cyan-200/20 opacity-40"
 | 
			
		||||
                }`}
 | 
			
		||||
              />
 | 
			
		||||
              <CubeLight
 | 
			
		||||
                title={layer.title}
 | 
			
		||||
                descriptionTitle={layer.descriptionTitle}
 | 
			
		||||
                description={layer.description}
 | 
			
		||||
                isActive={active === layer.id}
 | 
			
		||||
                index={index}
 | 
			
		||||
                onHover={() => setActive(layer.id)}
 | 
			
		||||
                onLeave={() => {}}
 | 
			
		||||
                onClick={() => handleCubeClick(layer.id)}
 | 
			
		||||
              />
 | 
			
		||||
            </div>
 | 
			
		||||
          ))}
 | 
			
		||||
        </motion.div>
 | 
			
		||||
      </div>
 | 
			
		||||
    )}
 | 
			
		||||
 | 
			
		||||
      {/* Mobile layer description */}
 | 
			
		||||
      {selectedMobileLayer && (
 | 
			
		||||
        <div className="lg:hidden w-full max-w-md p-6 -mt-8 bg-white/50 backdrop-blur-xl border border-cyan-100/40 rounded-xl shadow-[0_0_25px_rgba(0,255,255,0.15)]">
 | 
			
		||||
          <h4 className="text-black text-lg font-semibold mb-2 text-center drop-shadow-[0_0_6px_rgba(255,255,255,0.6)]">
 | 
			
		||||
            {selectedMobileLayer.descriptionTitle}
 | 
			
		||||
          </h4>
 | 
			
		||||
          <p className="text-cyan-900/80 text-sm leading-relaxed text-center drop-shadow-[0_0_4px_rgba(255,255,255,0.4)]">
 | 
			
		||||
            {selectedMobileLayer.description}
 | 
			
		||||
          </p>
 | 
			
		||||
        </div>
 | 
			
		||||
      )}
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										196
									
								
								src/components/ui/apple-cards-carousel.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,196 @@
 | 
			
		||||
"use client";
 | 
			
		||||
import React, {
 | 
			
		||||
  useEffect,
 | 
			
		||||
  useState,
 | 
			
		||||
} from "react";
 | 
			
		||||
import {
 | 
			
		||||
  IconArrowNarrowLeft,
 | 
			
		||||
  IconArrowNarrowRight,
 | 
			
		||||
  IconChevronRight,
 | 
			
		||||
} from "@tabler/icons-react";
 | 
			
		||||
import { cn } from "@/lib/utils";
 | 
			
		||||
import { Link } from "react-router-dom";
 | 
			
		||||
import { motion } from "motion/react";
 | 
			
		||||
 | 
			
		||||
interface CarouselProps {
 | 
			
		||||
  items: JSX.Element[];
 | 
			
		||||
  initialScroll?: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Card = {
 | 
			
		||||
  src: string;
 | 
			
		||||
  title: string;
 | 
			
		||||
  category: string;
 | 
			
		||||
  description: string;
 | 
			
		||||
  link: string;
 | 
			
		||||
  bg: any;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const Carousel = ({ items, initialScroll = 0 }: CarouselProps) => {
 | 
			
		||||
  const carouselRef = React.useRef<HTMLDivElement>(null);
 | 
			
		||||
  const [canScrollLeft, setCanScrollLeft] = React.useState(false);
 | 
			
		||||
  const [canScrollRight, setCanScrollRight] = React.useState(true);
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    if (carouselRef.current) {
 | 
			
		||||
      carouselRef.current.scrollLeft = initialScroll;
 | 
			
		||||
      checkScrollability();
 | 
			
		||||
    }
 | 
			
		||||
  }, [initialScroll]);
 | 
			
		||||
 | 
			
		||||
  const checkScrollability = () => {
 | 
			
		||||
    if (carouselRef.current) {
 | 
			
		||||
      const { scrollLeft, scrollWidth, clientWidth } = carouselRef.current;
 | 
			
		||||
      setCanScrollLeft(scrollLeft > 0);
 | 
			
		||||
      setCanScrollRight(scrollLeft < scrollWidth - clientWidth);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const scrollLeft = () => {
 | 
			
		||||
    if (carouselRef.current) {
 | 
			
		||||
      carouselRef.current.scrollBy({ left: -300, behavior: "smooth" });
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const scrollRight = () => {
 | 
			
		||||
    if (carouselRef.current) {
 | 
			
		||||
      carouselRef.current.scrollBy({ left: 300, behavior: "smooth" });
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  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"
 | 
			
		||||
          ref={carouselRef}
 | 
			
		||||
          onScroll={checkScrollability}
 | 
			
		||||
        >
 | 
			
		||||
          <div
 | 
			
		||||
            className={cn(
 | 
			
		||||
              "absolute right-0 z-[1000] h-auto w-[5%] overflow-hidden bg-gradient-to-l",
 | 
			
		||||
            )}
 | 
			
		||||
          ></div>
 | 
			
		||||
 | 
			
		||||
          <div
 | 
			
		||||
            className={cn(
 | 
			
		||||
              "flex flex-row justify-start gap-4 pl-4",
 | 
			
		||||
              "mx-auto max-w-7xl", // remove max-w-4xl if you want the carousel to span the full width of its container
 | 
			
		||||
            )}
 | 
			
		||||
          >
 | 
			
		||||
            {items.map((item, index) => (
 | 
			
		||||
              <motion.div
 | 
			
		||||
                initial={{
 | 
			
		||||
                  opacity: 0,
 | 
			
		||||
                  y: 20,
 | 
			
		||||
                }}
 | 
			
		||||
                animate={{
 | 
			
		||||
                  opacity: 1,
 | 
			
		||||
                  y: 0,
 | 
			
		||||
                  transition: {
 | 
			
		||||
                    duration: 0.5,
 | 
			
		||||
                    delay: 0.2 * index,
 | 
			
		||||
                    ease: "easeOut",
 | 
			
		||||
                  },
 | 
			
		||||
                }}
 | 
			
		||||
                key={"card" + index}
 | 
			
		||||
                className="rounded-3xl last:pr-[5%] md:last:pr-[33%]"
 | 
			
		||||
              >
 | 
			
		||||
                {item}
 | 
			
		||||
              </motion.div>
 | 
			
		||||
            ))}
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div className="mr-10 flex justify-end gap-2">
 | 
			
		||||
          <button
 | 
			
		||||
            className="relative z-40 flex h-10 w-10 items-center justify-center rounded-full bg-neutral-800 disabled:opacity-50"
 | 
			
		||||
            onClick={scrollLeft}
 | 
			
		||||
            disabled={!canScrollLeft}
 | 
			
		||||
          >
 | 
			
		||||
            <IconArrowNarrowLeft className="h-6 w-6 text-white" />
 | 
			
		||||
          </button>
 | 
			
		||||
          <button
 | 
			
		||||
            className="relative z-40 flex h-10 w-10 items-center justify-center rounded-full bg-neutral-800 disabled:opacity-50"
 | 
			
		||||
            onClick={scrollRight}
 | 
			
		||||
            disabled={!canScrollRight}
 | 
			
		||||
          >
 | 
			
		||||
            <IconArrowNarrowRight className="h-6 w-6 text-white" />
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const Card = ({
 | 
			
		||||
  card,
 | 
			
		||||
  layout = false,
 | 
			
		||||
}: {
 | 
			
		||||
  card: Card;
 | 
			
		||||
  layout?: boolean;
 | 
			
		||||
}) => {
 | 
			
		||||
  
 | 
			
		||||
  return (
 | 
			
		||||
    <Link to={card.link}>
 | 
			
		||||
      <motion.div
 | 
			
		||||
        layoutId={layout ? `card-${card.title}` : undefined}
 | 
			
		||||
        className="relative z-10 flex h-60 w-56 flex-col items-start justify-start overflow-hidden rounded-3xl md:h-120 md:w-96 hover:scale-105 transition-transform duration-200"
 | 
			
		||||
        style={{
 | 
			
		||||
          backgroundImage: `url(${card.bg})`,
 | 
			
		||||
          backgroundSize: 'cover',
 | 
			
		||||
          backgroundPosition: 'center',
 | 
			
		||||
        }}
 | 
			
		||||
      >
 | 
			
		||||
        <div className="pointer-events-none absolute inset-x-0 top-0 z-30 h-full bg-gradient-to-b from-black/50 via-transparent to-transparent" />
 | 
			
		||||
        <div className="relative z-40 p-8 w-full">
 | 
			
		||||
          <motion.p
 | 
			
		||||
            layoutId={layout ? `category-${card.category}` : undefined}
 | 
			
		||||
            className="text-left font-sans text-sm font-medium text-white md:text-base"
 | 
			
		||||
          >
 | 
			
		||||
            {card.category}
 | 
			
		||||
          </motion.p>
 | 
			
		||||
          <motion.p
 | 
			
		||||
            layoutId={layout ? `title-${card.title}` : undefined}
 | 
			
		||||
            className="mt-2 max-w-xs text-left font-sans text-xl font-semibold [text-wrap:balance] text-white md:text-3xl"
 | 
			
		||||
          >
 | 
			
		||||
            {card.title}
 | 
			
		||||
          </motion.p>
 | 
			
		||||
          <div className="flex flex-row justify-between items-center w-full mt-4">
 | 
			
		||||
            <motion.p className="max-w-xs text-left font-sans text-sm text-neutral-300">
 | 
			
		||||
              {card.description}
 | 
			
		||||
            </motion.p>
 | 
			
		||||
            <div className="h-8 w-8 bg-[#212121] rounded-full flex items-center justify-center text-[#858585] shrink-0 hover:bg-[#262626] hover:text-white active:bg-[#262626] active:text-white transition-colors duration-200">
 | 
			
		||||
              <IconChevronRight className="h-6 w-6" />
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </motion.div>
 | 
			
		||||
    </Link>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const BlurImage = ({
 | 
			
		||||
  src,
 | 
			
		||||
  className,
 | 
			
		||||
  width,
 | 
			
		||||
  height,
 | 
			
		||||
  alt,
 | 
			
		||||
  ...rest
 | 
			
		||||
}: React.ImgHTMLAttributes<HTMLImageElement>) => {
 | 
			
		||||
  const [isLoading, setLoading] = useState(true);
 | 
			
		||||
  return (
 | 
			
		||||
    <img
 | 
			
		||||
      className={cn(
 | 
			
		||||
        "h-full w-full transition duration-300",
 | 
			
		||||
        isLoading ? "blur-sm" : "blur-0",
 | 
			
		||||
        className,
 | 
			
		||||
      )}
 | 
			
		||||
      onLoad={() => setLoading(false)}
 | 
			
		||||
      src={src as string}
 | 
			
		||||
      width={width}
 | 
			
		||||
      height={height}
 | 
			
		||||
      loading="lazy"
 | 
			
		||||
      decoding="async"
 | 
			
		||||
      alt={alt ? alt : "Background of a beautiful view"}
 | 
			
		||||
      {...rest}
 | 
			
		||||
    />
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										190
									
								
								src/components/ui/glowing-effect.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,190 @@
 | 
			
		||||
"use client";
 | 
			
		||||
 | 
			
		||||
import { memo, useCallback, useEffect, useRef } from "react";
 | 
			
		||||
import { cn } from "@/lib/utils";
 | 
			
		||||
import { animate } from "motion/react";
 | 
			
		||||
 | 
			
		||||
interface GlowingEffectProps {
 | 
			
		||||
  blur?: number;
 | 
			
		||||
  inactiveZone?: number;
 | 
			
		||||
  proximity?: number;
 | 
			
		||||
  spread?: number;
 | 
			
		||||
  variant?: "default" | "white";
 | 
			
		||||
  glow?: boolean;
 | 
			
		||||
  className?: string;
 | 
			
		||||
  disabled?: boolean;
 | 
			
		||||
  movementDuration?: number;
 | 
			
		||||
  borderWidth?: number;
 | 
			
		||||
}
 | 
			
		||||
const GlowingEffect = memo(
 | 
			
		||||
  ({
 | 
			
		||||
    blur = 0,
 | 
			
		||||
    inactiveZone = 0.7,
 | 
			
		||||
    proximity = 0,
 | 
			
		||||
    spread = 20,
 | 
			
		||||
    variant = "default",
 | 
			
		||||
    glow = false,
 | 
			
		||||
    className,
 | 
			
		||||
    movementDuration = 2,
 | 
			
		||||
    borderWidth = 1,
 | 
			
		||||
    disabled = true,
 | 
			
		||||
  }: GlowingEffectProps) => {
 | 
			
		||||
    const containerRef = useRef<HTMLDivElement>(null);
 | 
			
		||||
    const lastPosition = useRef({ x: 0, y: 0 });
 | 
			
		||||
    const animationFrameRef = useRef<number>(0);
 | 
			
		||||
 | 
			
		||||
    const handleMove = useCallback(
 | 
			
		||||
      (e?: MouseEvent | { x: number; y: number }) => {
 | 
			
		||||
        if (!containerRef.current) return;
 | 
			
		||||
 | 
			
		||||
        if (animationFrameRef.current) {
 | 
			
		||||
          cancelAnimationFrame(animationFrameRef.current);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        animationFrameRef.current = requestAnimationFrame(() => {
 | 
			
		||||
          const element = containerRef.current;
 | 
			
		||||
          if (!element) return;
 | 
			
		||||
 | 
			
		||||
          const { left, top, width, height } = element.getBoundingClientRect();
 | 
			
		||||
          const mouseX = e?.x ?? lastPosition.current.x;
 | 
			
		||||
          const mouseY = e?.y ?? lastPosition.current.y;
 | 
			
		||||
 | 
			
		||||
          if (e) {
 | 
			
		||||
            lastPosition.current = { x: mouseX, y: mouseY };
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          const center = [left + width * 0.5, top + height * 0.5];
 | 
			
		||||
          const distanceFromCenter = Math.hypot(
 | 
			
		||||
            mouseX - center[0],
 | 
			
		||||
            mouseY - center[1]
 | 
			
		||||
          );
 | 
			
		||||
          const inactiveRadius = 0.5 * Math.min(width, height) * inactiveZone;
 | 
			
		||||
 | 
			
		||||
          if (distanceFromCenter < inactiveRadius) {
 | 
			
		||||
            element.style.setProperty("--active", "0");
 | 
			
		||||
            return;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          const isActive =
 | 
			
		||||
            mouseX > left - proximity &&
 | 
			
		||||
            mouseX < left + width + proximity &&
 | 
			
		||||
            mouseY > top - proximity &&
 | 
			
		||||
            mouseY < top + height + proximity;
 | 
			
		||||
 | 
			
		||||
          element.style.setProperty("--active", isActive ? "1" : "0");
 | 
			
		||||
 | 
			
		||||
          if (!isActive) return;
 | 
			
		||||
 | 
			
		||||
          const currentAngle =
 | 
			
		||||
            parseFloat(element.style.getPropertyValue("--start")) || 0;
 | 
			
		||||
          let targetAngle =
 | 
			
		||||
            (180 * Math.atan2(mouseY - center[1], mouseX - center[0])) /
 | 
			
		||||
              Math.PI +
 | 
			
		||||
            90;
 | 
			
		||||
 | 
			
		||||
          const angleDiff = ((targetAngle - currentAngle + 180) % 360) - 180;
 | 
			
		||||
          const newAngle = currentAngle + angleDiff;
 | 
			
		||||
 | 
			
		||||
          animate(currentAngle, newAngle, {
 | 
			
		||||
            duration: movementDuration,
 | 
			
		||||
            ease: [0.16, 1, 0.3, 1],
 | 
			
		||||
            onUpdate: (value) => {
 | 
			
		||||
              element.style.setProperty("--start", String(value));
 | 
			
		||||
            },
 | 
			
		||||
          });
 | 
			
		||||
        });
 | 
			
		||||
      },
 | 
			
		||||
      [inactiveZone, proximity, movementDuration]
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    useEffect(() => {
 | 
			
		||||
      if (disabled) return;
 | 
			
		||||
 | 
			
		||||
      const handleScroll = () => handleMove();
 | 
			
		||||
      const handlePointerMove = (e: PointerEvent) => handleMove(e);
 | 
			
		||||
 | 
			
		||||
      window.addEventListener("scroll", handleScroll, { passive: true });
 | 
			
		||||
      document.body.addEventListener("pointermove", handlePointerMove, {
 | 
			
		||||
        passive: true,
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      return () => {
 | 
			
		||||
        if (animationFrameRef.current) {
 | 
			
		||||
          cancelAnimationFrame(animationFrameRef.current);
 | 
			
		||||
        }
 | 
			
		||||
        window.removeEventListener("scroll", handleScroll);
 | 
			
		||||
        document.body.removeEventListener("pointermove", handlePointerMove);
 | 
			
		||||
      };
 | 
			
		||||
    }, [handleMove, disabled]);
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
      <>
 | 
			
		||||
        <div
 | 
			
		||||
          className={cn(
 | 
			
		||||
            "pointer-events-none absolute -inset-px hidden rounded-[inherit] border opacity-0 transition-opacity",
 | 
			
		||||
            glow && "opacity-100",
 | 
			
		||||
            variant === "white" && "border-white",
 | 
			
		||||
            disabled && "!block"
 | 
			
		||||
          )}
 | 
			
		||||
        />
 | 
			
		||||
        <div
 | 
			
		||||
          ref={containerRef}
 | 
			
		||||
          style={
 | 
			
		||||
            {
 | 
			
		||||
              "--blur": `${blur}px`,
 | 
			
		||||
              "--spread": spread,
 | 
			
		||||
              "--start": "0",
 | 
			
		||||
              "--active": "0",
 | 
			
		||||
              "--glowingeffect-border-width": `${borderWidth}px`,
 | 
			
		||||
              "--repeating-conic-gradient-times": "5",
 | 
			
		||||
              "--gradient":
 | 
			
		||||
                variant === "white"
 | 
			
		||||
                  ? `repeating-conic-gradient(
 | 
			
		||||
                  from 236.84deg at 50% 50%,
 | 
			
		||||
                  var(--black),
 | 
			
		||||
                  var(--black) calc(25% / var(--repeating-conic-gradient-times))
 | 
			
		||||
                )`
 | 
			
		||||
                  : `radial-gradient(circle, #dd7bbb 10%, #dd7bbb00 20%),
 | 
			
		||||
                radial-gradient(circle at 40% 40%, #d79f1e 5%, #d79f1e00 15%),
 | 
			
		||||
                radial-gradient(circle at 60% 60%, #5a922c 10%, #5a922c00 20%), 
 | 
			
		||||
                radial-gradient(circle at 40% 60%, #4c7894 10%, #4c789400 20%),
 | 
			
		||||
                repeating-conic-gradient(
 | 
			
		||||
                  from 236.84deg at 50% 50%,
 | 
			
		||||
                  #dd7bbb 0%,
 | 
			
		||||
                  #d79f1e calc(25% / var(--repeating-conic-gradient-times)),
 | 
			
		||||
                  #5a922c calc(50% / var(--repeating-conic-gradient-times)), 
 | 
			
		||||
                  #4c7894 calc(75% / var(--repeating-conic-gradient-times)),
 | 
			
		||||
                  #dd7bbb calc(100% / var(--repeating-conic-gradient-times))
 | 
			
		||||
                )`,
 | 
			
		||||
            } as React.CSSProperties
 | 
			
		||||
          }
 | 
			
		||||
          className={cn(
 | 
			
		||||
            "pointer-events-none absolute inset-0 rounded-[inherit] opacity-100 transition-opacity",
 | 
			
		||||
            glow && "opacity-100",
 | 
			
		||||
            blur > 0 && "blur-[var(--blur)] ",
 | 
			
		||||
            className,
 | 
			
		||||
            disabled && "!hidden"
 | 
			
		||||
          )}
 | 
			
		||||
        >
 | 
			
		||||
          <div
 | 
			
		||||
            className={cn(
 | 
			
		||||
              "glow",
 | 
			
		||||
              "rounded-[inherit]",
 | 
			
		||||
              'after:content-[""] after:rounded-[inherit] after:absolute after:inset-[calc(-1*var(--glowingeffect-border-width))]',
 | 
			
		||||
              "after:[border:var(--glowingeffect-border-width)_solid_transparent]",
 | 
			
		||||
              "after:[background:var(--gradient)] after:[background-attachment:fixed]",
 | 
			
		||||
              "after:opacity-[var(--active)] after:transition-opacity after:duration-300",
 | 
			
		||||
              "after:[mask-clip:padding-box,border-box]",
 | 
			
		||||
              "after:[mask-composite:intersect]",
 | 
			
		||||
              "after:[mask-image:linear-gradient(#0000,#0000),conic-gradient(from_calc((var(--start)-var(--spread))*1deg),#00000000_0deg,#fff,#00000000_calc(var(--spread)*2deg))]"
 | 
			
		||||
            )}
 | 
			
		||||
          />
 | 
			
		||||
        </div>
 | 
			
		||||
      </>
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
GlowingEffect.displayName = "GlowingEffect";
 | 
			
		||||
 | 
			
		||||
export { GlowingEffect };
 | 
			
		||||
							
								
								
									
										42
									
								
								src/components/ui/son-of-a-glitch-text.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,42 @@
 | 
			
		||||
"use client";
 | 
			
		||||
 | 
			
		||||
import { cn } from "@/lib/utils";
 | 
			
		||||
import { type HTMLAttributes, useEffect, useState } from "react";
 | 
			
		||||
 | 
			
		||||
interface SonOfAGlitchProps extends HTMLAttributes<HTMLHeadingElement> {
 | 
			
		||||
  text: string;
 | 
			
		||||
  textClassName?: string;
 | 
			
		||||
  glitchClassName?: string;
 | 
			
		||||
  showGlitch?: boolean;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const SonOfAGlitch = ({
 | 
			
		||||
  text,
 | 
			
		||||
  className,
 | 
			
		||||
  textClassName,
 | 
			
		||||
  glitchClassName,
 | 
			
		||||
  showGlitch = true,
 | 
			
		||||
}: SonOfAGlitchProps) => {
 | 
			
		||||
  const [isGlitching, setIsGlitching] = useState(showGlitch);
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    setIsGlitching(showGlitch);
 | 
			
		||||
  }, [showGlitch]);
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <h1 className={cn("relative font-mono", className)}>
 | 
			
		||||
      <span
 | 
			
		||||
        className={cn(
 | 
			
		||||
          "absolute top-0 left-0 w-full h-full bg-transparent",
 | 
			
		||||
          isGlitching &&
 | 
			
		||||
            "before:content-[attr(data-text)] before:absolute before:top-0 before:w-full before:h-full before:bg-transparent before:left-[-2px] before:text-red-500 before:overflow-hidden before:animate-glitch-1",
 | 
			
		||||
          isGlitching &&
 | 
			
		||||
            "after:content-[attr(data-text)] after:absolute after:top-0 after:w-full after:h-full after:bg-transparent after:left-[2px] after:text-blue-500 after:overflow-hidden after:animate-glitch-2",
 | 
			
		||||
          glitchClassName,
 | 
			
		||||
        )}
 | 
			
		||||
        data-text={text}
 | 
			
		||||
      ></span>
 | 
			
		||||
      <span className={cn(textClassName)}>{text}</span>
 | 
			
		||||
    </h1>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										23
									
								
								src/hooks/use-outside-click.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,23 @@
 | 
			
		||||
import React, { useEffect } from "react";
 | 
			
		||||
 | 
			
		||||
export const useOutsideClick = (
 | 
			
		||||
  ref: React.RefObject<HTMLDivElement>,
 | 
			
		||||
  callback: Function
 | 
			
		||||
) => {
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    const listener = (event: any) => {
 | 
			
		||||
      if (!ref.current || ref.current.contains(event.target)) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      callback(event);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    document.addEventListener("mousedown", listener);
 | 
			
		||||
    document.addEventListener("touchstart", listener);
 | 
			
		||||
 | 
			
		||||
    return () => {
 | 
			
		||||
      document.removeEventListener("mousedown", listener);
 | 
			
		||||
      document.removeEventListener("touchstart", listener);
 | 
			
		||||
    };
 | 
			
		||||
  }, [ref, callback]);
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										24
									
								
								src/hooks/use-outside-click.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,24 @@
 | 
			
		||||
import React, { useEffect } from "react";
 | 
			
		||||
 | 
			
		||||
export const useOutsideClick = (
 | 
			
		||||
  ref: React.RefObject<HTMLDivElement>,
 | 
			
		||||
  callback: Function
 | 
			
		||||
) => {
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    const listener = (event: any) => {
 | 
			
		||||
      // DO NOTHING if the element being clicked is the target element or their children
 | 
			
		||||
      if (!ref.current || ref.current.contains(event.target)) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      callback(event);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    document.addEventListener("mousedown", listener);
 | 
			
		||||
    document.addEventListener("touchstart", listener);
 | 
			
		||||
 | 
			
		||||
    return () => {
 | 
			
		||||
      document.removeEventListener("mousedown", listener);
 | 
			
		||||
      document.removeEventListener("touchstart", listener);
 | 
			
		||||
    };
 | 
			
		||||
  }, [ref, callback]);
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								src/images/agent1.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 27 KiB  | 
| 
		 Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 66 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/images/logos/logo_1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 22 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/images/slider/agent1.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 30 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/images/slider/cloud1.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 37 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/images/slider/compute1.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 36 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/images/slider/gpu1.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 35 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/images/slider/network1.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 26 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/images/slider/storage1.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 32 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/images/storage.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.2 MiB  | 
							
								
								
									
										36
									
								
								src/pages/agents/AgentsHeroAlt.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,36 @@
 | 
			
		||||
"use client";
 | 
			
		||||
 | 
			
		||||
import { H2, H5 } from "@/components/Texts";
 | 
			
		||||
import { ScrollDownArrow } from '@/components/ScrollDownArrow';
 | 
			
		||||
 | 
			
		||||
export function AgentsHeroAlt() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div
 | 
			
		||||
      style={{
 | 
			
		||||
        backgroundImage: "url(/images/agentshero.png)",
 | 
			
		||||
        backgroundSize: "cover",
 | 
			
		||||
        backgroundPosition: "center",
 | 
			
		||||
      }}
 | 
			
		||||
      className="relative mx-auto flex min-h-screen flex-col items-center justify-center px-4 text-white"
 | 
			
		||||
    >
 | 
			
		||||
      <div className="absolute inset-0 bg-white/30" />
 | 
			
		||||
      <div className="relative flex flex-col items-center gap-6">
 | 
			
		||||
        <div className="text-center drop-shadow-lg">
 | 
			
		||||
          <H2>
 | 
			
		||||
            <span className="">
 | 
			
		||||
              Sovereign AI Agents, Coming Soon.
 | 
			
		||||
            </span>
 | 
			
		||||
          </H2>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div className="max-w-4xl text-center font-normal drop-shadow-lg">
 | 
			
		||||
          <H5>
 | 
			
		||||
            Hero is the autonomous agent layer for the Mycelium platform—trusted, policy-aware AI that runs on infrastructure you control and remembers what matters.
 | 
			
		||||
          </H5>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div className="absolute bottom-10">
 | 
			
		||||
        <ScrollDownArrow />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
@@ -4,12 +4,13 @@ import { DeploySection } from './DeploySection'
 | 
			
		||||
import { GallerySection } from './GallerySection'
 | 
			
		||||
import { Companies } from './Companies'
 | 
			
		||||
import { BentoSection } from './BentoSection'
 | 
			
		||||
import { AgentsHeroAlt } from './AgentsHeroAlt'
 | 
			
		||||
 | 
			
		||||
export default function AgentsPage() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div>
 | 
			
		||||
      <AnimatedSection>
 | 
			
		||||
        <AgentsHero />
 | 
			
		||||
        <AgentsHeroAlt />
 | 
			
		||||
      </AnimatedSection>
 | 
			
		||||
 | 
			
		||||
      <AnimatedSection>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								src/pages/cloud/CloudHeroAlt.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,32 @@
 | 
			
		||||
'use client'
 | 
			
		||||
 | 
			
		||||
import { Button } from '../../components/Button'
 | 
			
		||||
 | 
			
		||||
export function CloudHeroAlt() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="relative bg-white">
 | 
			
		||||
      <div className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-1/2">
 | 
			
		||||
        <img
 | 
			
		||||
          alt=""
 | 
			
		||||
          src="/images/kubernetes.png"
 | 
			
		||||
          className="size-full object-cover"
 | 
			
		||||
        />
 | 
			
		||||
       
 | 
			
		||||
      </div>
 | 
			
		||||
      <div className="relative mx-auto max-w-7xl py-24 sm:py-32 lg:px-8 lg:py-40">
 | 
			
		||||
        <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">
 | 
			
		||||
          <h2 className="text-base/7 font-semibold text-cyan-500">CLOUD</h2>
 | 
			
		||||
          <p className="mt-2 text-4xl font-semibold tracking-tight text-gray-900 sm:text-5xl">The pulse of intelligence runs here.</p>
 | 
			
		||||
          <p className="mt-6 text-base/7 text-gray-600">
 | 
			
		||||
             Mycelium Cloud blends deterministic compute with quantum-safe storage, delivering a sovereign platform built for zero-ops automation.
 | 
			
		||||
          </p>
 | 
			
		||||
          <div className="mt-8">
 | 
			
		||||
            <Button href="#" variant="solid" color="cyan">
 | 
			
		||||
              Experience Deterministic Compute
 | 
			
		||||
            </Button>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
@@ -4,12 +4,13 @@ import { CloudOverview } from './CloudOverview'
 | 
			
		||||
import { ComputeStorageSplit } from './ComputeStorageSplit'
 | 
			
		||||
import { SecurityPillars } from './SecurityPillars'
 | 
			
		||||
import { CloudCTA } from './CloudCTA'
 | 
			
		||||
import { CloudHeroAlt } from './CloudHeroAlt'
 | 
			
		||||
 | 
			
		||||
export default function CloudPage() {
 | 
			
		||||
  return (
 | 
			
		||||
    <>
 | 
			
		||||
      <AnimatedSection>
 | 
			
		||||
        <CloudHero />
 | 
			
		||||
        <CloudHeroAlt />
 | 
			
		||||
      </AnimatedSection>
 | 
			
		||||
      <AnimatedSection>
 | 
			
		||||
        <CloudOverview />
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								src/pages/compute/CallToAction.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,40 @@
 | 
			
		||||
import { CircleBackground } from '../../components/CircleBackground'
 | 
			
		||||
import { Container } from '../../components/Container'
 | 
			
		||||
import { Button } from '../../components/Button'
 | 
			
		||||
 | 
			
		||||
export function CallToAction() {
 | 
			
		||||
  return (
 | 
			
		||||
    <section
 | 
			
		||||
      id="get-started"
 | 
			
		||||
      className="relative overflow-hidden bg-gray-900 py-20 sm:py-28"
 | 
			
		||||
    >
 | 
			
		||||
      <div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
 | 
			
		||||
        <CircleBackground color="#06b6d4" className="animate-spin-slower" />
 | 
			
		||||
      </div>
 | 
			
		||||
      <Container className="relative">
 | 
			
		||||
        <div className="mx-auto max-w-2xl text-center">
 | 
			
		||||
          <h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
 | 
			
		||||
            Get Started Today
 | 
			
		||||
          </h2>
 | 
			
		||||
          <p className="mt-6 text-lg text-gray-300">
 | 
			
		||||
            Download the Mycelium app and step into the future of secure, peer-to-peer networking; fast, private, and decentralized.
 | 
			
		||||
          </p>
 | 
			
		||||
          <div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4">
 | 
			
		||||
            <Button to="/download" variant="solid" color="white">
 | 
			
		||||
              Get Mycelium Connector
 | 
			
		||||
            </Button>
 | 
			
		||||
            <Button
 | 
			
		||||
              to="https://threefold.info/mycelium_network/docs/"
 | 
			
		||||
              as="a"
 | 
			
		||||
              target="_blank"
 | 
			
		||||
              variant="outline"
 | 
			
		||||
              color="white"
 | 
			
		||||
            >
 | 
			
		||||
              Read Docs
 | 
			
		||||
            </Button>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </Container>
 | 
			
		||||
    </section>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								src/pages/compute/ComputeHero.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,35 @@
 | 
			
		||||
'use client'
 | 
			
		||||
 | 
			
		||||
import { Button } from '../../components/Button'
 | 
			
		||||
 | 
			
		||||
export function ComputeHero() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="relative bg-white">
 | 
			
		||||
      <div className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-1/2">
 | 
			
		||||
        <img
 | 
			
		||||
          alt=""
 | 
			
		||||
          src="/images/computehero4.png"
 | 
			
		||||
          className="size-full object-cover"
 | 
			
		||||
        />
 | 
			
		||||
       
 | 
			
		||||
      </div>
 | 
			
		||||
      <div className="relative mx-auto max-w-7xl py-24 sm:py-32 lg:px-8 lg:py-40">
 | 
			
		||||
        <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">
 | 
			
		||||
          <h2 className="text-base/7 font-semibold text-cyan-500">COMPUTE</h2>
 | 
			
		||||
          <p className="mt-2 text-4xl font-semibold tracking-tight text-gray-900 sm:text-5xl">The pulse of intelligence runs here.</p>
 | 
			
		||||
          <p className="mt-6 text-base/7 text-gray-600">
 | 
			
		||||
            Mycelium Compute brings predictable, sovereign performance — free from lock-in, free from drift.
 | 
			
		||||
            Deploy any workload, anywhere, with cryptographic precision and zero compromise.
 | 
			
		||||
            From micro-VMs to full clusters, every operation is deterministic, self-managing, and stateless by design.
 | 
			
		||||
            Compute that verifies itself. Expands itself. Heals itself.
 | 
			
		||||
          </p>
 | 
			
		||||
          <div className="mt-8">
 | 
			
		||||
            <Button href="#" variant="solid" color="cyan">
 | 
			
		||||
              Experience Deterministic Compute
 | 
			
		||||
            </Button>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								src/pages/compute/ComputePage.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,16 @@
 | 
			
		||||
import { AnimatedSection } from '../../components/AnimatedSection'
 | 
			
		||||
import { ComputeHero } from './ComputeHero'
 | 
			
		||||
import { CallToAction } from './CallToAction'
 | 
			
		||||
 | 
			
		||||
export default function ComputePage() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div>
 | 
			
		||||
      <AnimatedSection>
 | 
			
		||||
        <ComputeHero />
 | 
			
		||||
      </AnimatedSection>
 | 
			
		||||
      <AnimatedSection>
 | 
			
		||||
        <CallToAction />
 | 
			
		||||
      </AnimatedSection>
 | 
			
		||||
    </div>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										40
									
								
								src/pages/gpu/CallToAction.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,40 @@
 | 
			
		||||
import { CircleBackground } from '../../components/CircleBackground'
 | 
			
		||||
import { Container } from '../../components/Container'
 | 
			
		||||
import { Button } from '../../components/Button'
 | 
			
		||||
 | 
			
		||||
export function CallToAction() {
 | 
			
		||||
  return (
 | 
			
		||||
    <section
 | 
			
		||||
      id="get-started"
 | 
			
		||||
      className="relative overflow-hidden bg-gray-900 py-20 sm:py-28"
 | 
			
		||||
    >
 | 
			
		||||
      <div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
 | 
			
		||||
        <CircleBackground color="#06b6d4" className="animate-spin-slower" />
 | 
			
		||||
      </div>
 | 
			
		||||
      <Container className="relative">
 | 
			
		||||
        <div className="mx-auto max-w-2xl text-center">
 | 
			
		||||
          <h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
 | 
			
		||||
            Get Started Today
 | 
			
		||||
          </h2>
 | 
			
		||||
          <p className="mt-6 text-lg text-gray-300">
 | 
			
		||||
            Download the Mycelium app and step into the future of secure, peer-to-peer networking; fast, private, and decentralized.
 | 
			
		||||
          </p>
 | 
			
		||||
          <div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4">
 | 
			
		||||
            <Button to="/download" variant="solid" color="white">
 | 
			
		||||
              Get Mycelium Connector
 | 
			
		||||
            </Button>
 | 
			
		||||
            <Button
 | 
			
		||||
              to="https://threefold.info/mycelium_network/docs/"
 | 
			
		||||
              as="a"
 | 
			
		||||
              target="_blank"
 | 
			
		||||
              variant="outline"
 | 
			
		||||
              color="white"
 | 
			
		||||
            >
 | 
			
		||||
              Read Docs
 | 
			
		||||
            </Button>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </Container>
 | 
			
		||||
    </section>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								src/pages/gpu/GpuHero.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,35 @@
 | 
			
		||||
'use client'
 | 
			
		||||
 | 
			
		||||
import { Button } from '../../components/Button'
 | 
			
		||||
 | 
			
		||||
export function GpuHero() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="relative bg-white">
 | 
			
		||||
      <div className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-1/2">
 | 
			
		||||
        <img
 | 
			
		||||
          alt=""
 | 
			
		||||
          src="/images/gpuhero.png"
 | 
			
		||||
          className="size-full object-cover"
 | 
			
		||||
        />
 | 
			
		||||
       
 | 
			
		||||
      </div>
 | 
			
		||||
      <div className="relative mx-auto max-w-7xl py-24 sm:py-32 lg:px-8 lg:py-40">
 | 
			
		||||
        <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">
 | 
			
		||||
          <h2 className="text-base/7 font-semibold text-cyan-500">GPU</h2>
 | 
			
		||||
          <h1 className="mt-2 text-4xl font-semibold tracking-tight text-gray-900 sm:text-5xl">Unify Distributed GPU Power. Run Intelligence Anywhere.</h1>
 | 
			
		||||
          <p className="mt-6 text-base/7 text-gray-600">
 | 
			
		||||
            Mycelium GPU transforms fragmented GPU resources into a single sovereign fabric for running AI, ML, and rendering workloads — from edge to core, with deterministic performance and transparent cost.
 | 
			
		||||
          </p>
 | 
			
		||||
          <div className="mt-8 flex items-center gap-x-4">
 | 
			
		||||
            <Button to="/docs" variant="solid" color="cyan">
 | 
			
		||||
              Get Started →
 | 
			
		||||
            </Button>
 | 
			
		||||
            <Button to="#architecture" variant="outline" color="cyan">
 | 
			
		||||
              Explore Architecture →
 | 
			
		||||
            </Button>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										56
									
								
								src/pages/gpu/GpuOverview.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,56 @@
 | 
			
		||||
import { CodeBracketSquareIcon, CubeTransparentIcon, LockClosedIcon, Squares2X2Icon } from '@heroicons/react/24/outline'
 | 
			
		||||
 | 
			
		||||
const features = [
 | 
			
		||||
  {
 | 
			
		||||
    name: 'No Silos',
 | 
			
		||||
    description: 'All GPU resources accessible through a single interface.',
 | 
			
		||||
    icon: Squares2X2Icon,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    name: 'No Intermediaries',
 | 
			
		||||
    description: 'Direct access to GPU resources without centralized control.',
 | 
			
		||||
    icon: CubeTransparentIcon,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    name: 'Verifiable Power',
 | 
			
		||||
    description: 'Every GPU cycle cryptographically verified.',
 | 
			
		||||
    icon: LockClosedIcon,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    name: 'Code-Orchestrated',
 | 
			
		||||
    description: 'Managed entirely through APIs and smart contracts.',
 | 
			
		||||
    icon: CodeBracketSquareIcon,
 | 
			
		||||
  },
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
export function GpuOverview() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="bg-[#171717] py-24 sm:py-32">
 | 
			
		||||
      <div className="mx-auto max-w-7xl px-6 lg:px-8">
 | 
			
		||||
        <div className="mx-auto grid max-w-2xl grid-cols-1 gap-16 sm:gap-y-20 lg:mx-0 lg:max-w-none lg:grid-cols-5">
 | 
			
		||||
          <div className="lg:col-span-2">
 | 
			
		||||
            <h2 className="text-4xl font-semibold tracking-tight text-pretty text-white sm:text-5xl">
 | 
			
		||||
              Unified GPU Acceleration Across the Grid
 | 
			
		||||
            </h2>
 | 
			
		||||
            <p className="mt-4 text-base/7 text-gray-300">
 | 
			
		||||
              Mycelium GPU provides unified access to distributed GPU acceleration across the ThreeFold Grid. It transforms fragmented GPU resources into a single adaptive intelligence layer — enabling you to run AI, ML, and rendering workloads anywhere, anytime, with verifiable performance and transparent costs.
 | 
			
		||||
            </p>
 | 
			
		||||
          </div>
 | 
			
		||||
          <dl className="col-span-3 grid grid-cols-1 gap-x-8 gap-y-16 sm:grid-cols-2">
 | 
			
		||||
            {features.map((feature) => (
 | 
			
		||||
              <div key={feature.name}>
 | 
			
		||||
                <dt className="text-base/7 font-semibold text-white">
 | 
			
		||||
                  <div className="mb-6 flex size-10 items-center justify-center rounded-lg">
 | 
			
		||||
                    <feature.icon aria-hidden="true" className="size-8 text-cyan-500" />
 | 
			
		||||
                  </div>
 | 
			
		||||
                  {feature.name}
 | 
			
		||||
                </dt>
 | 
			
		||||
                <dd className="mt-1 text-base/7 text-gray-400">{feature.description}</dd>
 | 
			
		||||
              </div>
 | 
			
		||||
            ))}
 | 
			
		||||
          </dl>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								src/pages/gpu/GpuPage.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,20 @@
 | 
			
		||||
import { AnimatedSection } from '../../components/AnimatedSection'
 | 
			
		||||
import { GpuHero } from './GpuHero'
 | 
			
		||||
import { CallToAction } from './CallToAction'
 | 
			
		||||
import { GpuOverview } from './GpuOverview'
 | 
			
		||||
 | 
			
		||||
export default function GpuPage() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div>
 | 
			
		||||
      <AnimatedSection>
 | 
			
		||||
        <GpuHero />
 | 
			
		||||
      </AnimatedSection>
 | 
			
		||||
      <AnimatedSection>
 | 
			
		||||
        <GpuOverview />
 | 
			
		||||
      </AnimatedSection>
 | 
			
		||||
      <AnimatedSection>
 | 
			
		||||
        <CallToAction />
 | 
			
		||||
      </AnimatedSection>
 | 
			
		||||
    </div>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
@@ -7,13 +7,13 @@ export function HomeAurora() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div
 | 
			
		||||
      style={{
 | 
			
		||||
        backgroundImage: "url(/images/mchip2.webp)",
 | 
			
		||||
        backgroundImage: "url(/images/homehero1.png)",
 | 
			
		||||
        backgroundSize: "cover",
 | 
			
		||||
        backgroundPosition: "center",
 | 
			
		||||
      }}
 | 
			
		||||
      className="relative mx-auto flex min-h-screen flex-col items-center justify-center gap-6 px-4 pb-24 pt-24 text-gray-800 lg:pb-0"
 | 
			
		||||
      className="relative mx-auto flex min-h-screen flex-col items-center gap-6 px-4 pb-24 pt-[20vh] text-gray-800 lg:pb-0"
 | 
			
		||||
    >
 | 
			
		||||
      <div className="text-center">
 | 
			
		||||
      <div className="text-center -mt-5">
 | 
			
		||||
        <H1>
 | 
			
		||||
          <span className="text-bold lg:text-8xl">
 | 
			
		||||
            Full Sovereignty for<br />Cloud, Network & AI.
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import createGlobe from "cobe";
 | 
			
		||||
import { useEffect, useRef, type ReactNode } from "react";
 | 
			
		||||
import { motion } from "motion/react";
 | 
			
		||||
import { IconBrandYoutubeFilled } from "@tabler/icons-react";
 | 
			
		||||
import { LockClosedIcon, CogIcon, BoltIcon, CurrencyDollarIcon } from '@heroicons/react/24/solid'
 | 
			
		||||
import { H2, P } from '@/components/Texts'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -13,30 +12,30 @@ export function HomeBenefits() {
 | 
			
		||||
      title: "Sovereign",
 | 
			
		||||
      description:
 | 
			
		||||
        "Own your infrastructure and your data. Mycelium Cloud eliminates dependency on centralized providers, giving you full digital sovereignty.",
 | 
			
		||||
      icon: <LockClosedIcon className="h-6 w-6 text-cyan-500" />,
 | 
			
		||||
      image: "/images/benefits/sovereign.webp",
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      title: "Autonomous",
 | 
			
		||||
      description:
 | 
			
		||||
        "The cloud that runs itself. From deployment to scaling, Mycelium Cloud automates everything — so your systems stay fast, resilient, and adaptive.",
 | 
			
		||||
      icon: <CogIcon className="h-6 w-6 text-cyan-500" />,
 | 
			
		||||
      image: "/images/benefits/autonomous.webp",
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      title: "Energy Efficient",
 | 
			
		||||
      description:
 | 
			
		||||
        "Built on distributed nodes designed for minimal energy use, Mycelium Cloud redefines sustainability without compromising performance.",
 | 
			
		||||
      icon: <BoltIcon className="h-6 w-6 text-cyan-500" />,
 | 
			
		||||
      image: "/images/benefits/energy.webp",
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      title: "Cost Efficient",
 | 
			
		||||
      description:
 | 
			
		||||
        "No middlemen. No inflated bills. Just pure compute power at a fraction of traditional cloud costs — optimized, transparent, and fair.",
 | 
			
		||||
      icon: <CurrencyDollarIcon className="h-6 w-6 text-cyan-500" />,
 | 
			
		||||
      image: "/images/benefits/cost.webp",
 | 
			
		||||
    },
 | 
			
		||||
  ];
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="relative z-20 py-10 lg:py-40 max-w-7xl mx-auto">
 | 
			
		||||
      <div className="px-8">
 | 
			
		||||
      <div className="px-12">
 | 
			
		||||
        <H2 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">
 | 
			
		||||
          Why It Changes Everything
 | 
			
		||||
        </H2>
 | 
			
		||||
@@ -46,60 +45,88 @@ export function HomeBenefits() {
 | 
			
		||||
        </P>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div className="relative ">
 | 
			
		||||
        <div className="mt-12 rounded-2xl border border-neutral-200/70 bg-white/40 dark:bg-black/40 dark:border-neutral-800/60 backdrop-blur">
 | 
			
		||||
          <div className="grid grid-cols-1 md:grid-cols-2 divide-y md:divide-y-0 md:divide-x divide-neutral-200/70 dark:divide-neutral-800/60">
 | 
			
		||||
            {features.map((feature) => (
 | 
			
		||||
              <FeatureCard key={feature.title}>
 | 
			
		||||
                <FeatureTitle icon={feature.icon}>{feature.title}</FeatureTitle>
 | 
			
		||||
                <FeatureDescription>{feature.description}</FeatureDescription>
 | 
			
		||||
              </FeatureCard>
 | 
			
		||||
            ))}
 | 
			
		||||
      <div className="mt-10 grid grid-cols-1 gap-4 sm:mt-16 lg:grid-cols-7 lg:grid-rows-2 lg:px-12 px-6">
 | 
			
		||||
          <div className="flex p-px lg:col-span-4">
 | 
			
		||||
            <div className="w-full overflow-hidden rounded-lg bg-white/40 dark:bg-black/40 shadow-sm border border-transparent transition-all duration-300 hover:scale-105 hover:shadow-lg hover:shadow-cyan-500/50 hover:border-cyan-500 max-lg:rounded-t-4xl lg:rounded-tl-4xl">
 | 
			
		||||
                <div className="flex items-center">
 | 
			
		||||
                    <div className="w-1/3 p-2">
 | 
			
		||||
                        <img
 | 
			
		||||
                            alt={features[0].title}
 | 
			
		||||
                            src={features[0].image}
 | 
			
		||||
                            className="w-40 h-40 object-contain"
 | 
			
		||||
                        />
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div className="w-2/3 p-2 pr-12">
 | 
			
		||||
                        <h3 className="text-lg font-semibold text-black dark:text-white">{features[0].title}</h3>
 | 
			
		||||
                        <p className="mt-2 text-sm text-gray-600 dark:text-gray-300">
 | 
			
		||||
                            {features[0].description}
 | 
			
		||||
                        </p>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div className="flex p-px lg:col-span-3">
 | 
			
		||||
            <div className="w-full overflow-hidden rounded-lg bg-white/40 dark:bg-black/40 shadow-sm border border-transparent transition-all duration-300 hover:scale-105 hover:shadow-lg hover:shadow-cyan-500/50 hover:border-cyan-500 lg:rounded-tr-4xl">
 | 
			
		||||
                <div className="flex items-center">
 | 
			
		||||
                    <div className="w-1/3 p-4">
 | 
			
		||||
                        <img
 | 
			
		||||
                            alt={features[1].title}
 | 
			
		||||
                            src={features[1].image}
 | 
			
		||||
                            className="w-40 h-40 object-contain"
 | 
			
		||||
                        />
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div className="w-2/3 p-4">
 | 
			
		||||
                        <h3 className="text-lg font-semibold text-black dark:text-white">{features[1].title}</h3>
 | 
			
		||||
                        <p className="mt-2 text-sm text-gray-600 dark:text-gray-300">
 | 
			
		||||
                            {features[1].description}
 | 
			
		||||
                        </p>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div className="flex p-px lg:col-span-3">
 | 
			
		||||
            <div className="w-full overflow-hidden rounded-lg bg-white/40 dark:bg-black/40 shadow-sm border border-transparent transition-all duration-300 hover:scale-105 hover:shadow-lg hover:shadow-cyan-500/50 hover:border-cyan-500 lg:rounded-bl-4xl">
 | 
			
		||||
                <div className="flex items-center">
 | 
			
		||||
                    <div className="w-1/3 p-4">
 | 
			
		||||
                        <img
 | 
			
		||||
                            alt={features[2].title}
 | 
			
		||||
                            src={features[2].image}
 | 
			
		||||
                            className="w-40 h-40 object-contain"
 | 
			
		||||
                        />
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div className="w-2/3 p-4">
 | 
			
		||||
                        <h3 className="text-lg font-semibold text-black dark:text-white">{features[2].title}</h3>
 | 
			
		||||
                        <p className="mt-2 text-sm text-gray-600 dark:text-gray-300">
 | 
			
		||||
                            {features[2].description}
 | 
			
		||||
                        </p>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div className="flex p-px lg:col-span-4">
 | 
			
		||||
            <div className="w-full overflow-hidden rounded-lg bg-white/40 dark:bg-black/40 shadow-sm border border-transparent transition-all duration-300 hover:scale-105 hover:shadow-lg hover:shadow-cyan-500/50 hover:border-cyan-500 max-lg:rounded-b-4xl lg:rounded-br-4xl">
 | 
			
		||||
                <div className="flex items-center">
 | 
			
		||||
                    <div className="w-1/3 p-2">
 | 
			
		||||
                        <img
 | 
			
		||||
                            alt={features[3].title}
 | 
			
		||||
                            src={features[3].image}
 | 
			
		||||
                            className="w-40 h-40 object-contain"
 | 
			
		||||
                        />
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div className="w-2/3 p-2 pr-12">
 | 
			
		||||
                        <h3 className="text-lg font-semibold text-black dark:text-white">{features[3].title}</h3>
 | 
			
		||||
                        <p className="mt-2 text-sm text-gray-600 dark:text-gray-300">
 | 
			
		||||
                            {features[3].description}
 | 
			
		||||
                        </p>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const FeatureCard = ({
 | 
			
		||||
  children,
 | 
			
		||||
  className,
 | 
			
		||||
}: {
 | 
			
		||||
  children?: ReactNode;
 | 
			
		||||
  className?: string;
 | 
			
		||||
}) => {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className={cn(`p-6 lg:p-8 relative overflow-hidden`, className)}>
 | 
			
		||||
      {children}
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const FeatureTitle = ({ children, icon }: { children?: ReactNode; icon?: ReactNode }) => {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="flex items-center gap-2">
 | 
			
		||||
      {icon}
 | 
			
		||||
      <p className="max-w-5xl text-left tracking-tight text-black dark:text-white text-xl md:text-2xl md:leading-snug">
 | 
			
		||||
        {children}
 | 
			
		||||
      </p>
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const FeatureDescription = ({ children }: { children?: ReactNode }) => {
 | 
			
		||||
  return (
 | 
			
		||||
    <p
 | 
			
		||||
      className={cn(
 | 
			
		||||
        "text-sm md:text-base max-w-4xl",
 | 
			
		||||
        "text-neutral-500 font-normal dark:text-neutral-300",
 | 
			
		||||
        "text-left max-w-sm mx-0 md:text-sm my-2"
 | 
			
		||||
      )}
 | 
			
		||||
    >
 | 
			
		||||
      {children}
 | 
			
		||||
    </p>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const SkeletonOne = () => {
 | 
			
		||||
  return (
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import { Globe } from "@/components/ui/Globe"
 | 
			
		||||
import { motion } from "framer-motion"
 | 
			
		||||
import { P, CT, CP, SectionHeader, Eyebrow } from "@/components/Texts"
 | 
			
		||||
import { CountUpNumber } from '@/components/CountUpNumber'
 | 
			
		||||
import { MagicCard } from '@/components/magicui/magic-card'
 | 
			
		||||
 | 
			
		||||
export function WorldMap() {
 | 
			
		||||
  return (
 | 
			
		||||
@@ -62,13 +63,18 @@ export function WorldMap() {
 | 
			
		||||
              whileInView={{ opacity: 1, x: 0 }}
 | 
			
		||||
              viewport={{ once: true, amount: 0.3 }}
 | 
			
		||||
              transition={{ duration: 0.5, delay: 0.4, ease: "easeOut" }}
 | 
			
		||||
              className="lg:absolute lg:top-12 lg:-left-12 w-80 rounded-2xl border border-gray-300 p-8 transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20 bg-white/5 backdrop-blur-md"
 | 
			
		||||
              className="lg:absolute lg:top-12 lg:-left-12 w-80"
 | 
			
		||||
            >
 | 
			
		||||
              <div><CT color="light" className="uppercase tracking-wide">CORES</CT></div>
 | 
			
		||||
              <div><CountUpNumber end={54958} className="mt-2 text-3xl font-bold text-white" /></div>
 | 
			
		||||
              <CP color="light" className="mt-2 text-sm">
 | 
			
		||||
                Total Central Processing Unit Cores available on the grid.
 | 
			
		||||
              </CP>
 | 
			
		||||
              <MagicCard
 | 
			
		||||
                gradientColor="#334155"
 | 
			
		||||
                className="shadow-xl shadow-cyan-500/15 border border-gray-500/50 transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-xl hover:shadow-cyan-500/20"
 | 
			
		||||
              >
 | 
			
		||||
                <div><CT color="light" className="uppercase tracking-wide [text-shadow:0_0_12px_var(--color-cyan-500)]">CORES</CT></div>
 | 
			
		||||
                <div><CountUpNumber end={54958} className="mt-2 text-3xl font-bold text-white [text-shadow:0_0_12px_var(--color-cyan-500)]" /></div>
 | 
			
		||||
                <CP color="light" className="mt-2 text-sm">
 | 
			
		||||
                  Total Central Processing Unit Cores available on the grid.
 | 
			
		||||
                </CP>
 | 
			
		||||
              </MagicCard>
 | 
			
		||||
            </motion.div>
 | 
			
		||||
 | 
			
		||||
            <motion.div
 | 
			
		||||
@@ -76,13 +82,18 @@ export function WorldMap() {
 | 
			
		||||
              whileInView={{ opacity: 1, x: 0 }}
 | 
			
		||||
              viewport={{ once: true, amount: 0.3 }}
 | 
			
		||||
              transition={{ duration: 0.5, delay: 0.5, ease: "easeOut" }}
 | 
			
		||||
              className="lg:absolute lg:-top-10 lg:right-0 w-80 rounded-2xl border border-gray-300 p-8 transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20 bg-white/5 backdrop-blur-md"
 | 
			
		||||
              className="lg:absolute lg:-top-10 lg:right-0 w-80"
 | 
			
		||||
            >
 | 
			
		||||
              <div><CT color="light" className="uppercase tracking-wide">NODES</CT></div>
 | 
			
		||||
              <div><CountUpNumber end={1493} className="mt-4 text-3xl font-bold text-white" /></div>
 | 
			
		||||
              <CP color="light" className="mt-2 text-sm">
 | 
			
		||||
                Total number of nodes on the grid.
 | 
			
		||||
              </CP>
 | 
			
		||||
              <MagicCard
 | 
			
		||||
                gradientColor="#334155"
 | 
			
		||||
                className="shadow-xl  shadow-cyan-500/15 border border-gray-500/50 transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-xl hover:shadow-cyan-500/20"
 | 
			
		||||
              >
 | 
			
		||||
                <div><CT color="light" className="uppercase tracking-wide [text-shadow:0_0_12px_var(--color-cyan-500)]">NODES</CT></div>
 | 
			
		||||
                <div><CountUpNumber end={1493} className="mt-4 text-3xl font-bold text-white [text-shadow:0_0_12px_var(--color-cyan-500)]" /></div>
 | 
			
		||||
                <CP color="light" className="mt-2 text-sm">
 | 
			
		||||
                  Total number of nodes on the grid.
 | 
			
		||||
                </CP>
 | 
			
		||||
              </MagicCard>
 | 
			
		||||
            </motion.div>
 | 
			
		||||
 | 
			
		||||
            <motion.div
 | 
			
		||||
@@ -90,13 +101,18 @@ export function WorldMap() {
 | 
			
		||||
              whileInView={{ opacity: 1, x: 0 }}
 | 
			
		||||
              viewport={{ once: true, amount: 0.3 }}
 | 
			
		||||
              transition={{ duration: 0.5, delay: 0.6, ease: "easeOut" }}
 | 
			
		||||
              className="lg:absolute lg:bottom-28 lg:-left-12 w-80 rounded-2xl border border-gray-300 p-8 transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20 bg-white/5 backdrop-blur-md"
 | 
			
		||||
              className="lg:absolute lg:bottom-28 lg:-left-12 w-80"
 | 
			
		||||
            >
 | 
			
		||||
              <div><CT color="light" className="uppercase tracking-wide">SSD CAPACITY</CT></div>
 | 
			
		||||
              <div><CountUpNumber end={5388956} className="mt-2 text-3xl font-bold text-white" /></div>
 | 
			
		||||
              <CP color="light" className="mt-2 text-sm">
 | 
			
		||||
                Total GB amount of storage (SSD, HDD, & RAM) on the grid.
 | 
			
		||||
              </CP>
 | 
			
		||||
              <MagicCard
 | 
			
		||||
                gradientColor="#334155"
 | 
			
		||||
                className="shadow-xl shadow-cyan-500/15 border border-gray-500/50 transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-xl hover:shadow-cyan-500/20"
 | 
			
		||||
              >
 | 
			
		||||
                <div><CT color="light" className="uppercase tracking-wide [text-shadow:0_0_12px_var(--color-cyan-500)]">SSD CAPACITY</CT></div>
 | 
			
		||||
                <div><CountUpNumber end={5388956} className="mt-2 text-3xl font-bold text-white [text-shadow:0_0_12px_var(--color-cyan-500)]" /></div>
 | 
			
		||||
                <CP color="light" className="mt-2 text-sm">
 | 
			
		||||
                  Total GB amount of storage (SSD, HDD, & RAM) on the grid.
 | 
			
		||||
                </CP>
 | 
			
		||||
              </MagicCard>
 | 
			
		||||
            </motion.div>
 | 
			
		||||
 | 
			
		||||
            <motion.div
 | 
			
		||||
@@ -104,13 +120,18 @@ export function WorldMap() {
 | 
			
		||||
              whileInView={{ opacity: 1, x: 0 }}
 | 
			
		||||
              viewport={{ once: true, amount: 0.3 }}
 | 
			
		||||
              transition={{ duration: 0.5, delay: 0.7, ease: "easeOut" }}
 | 
			
		||||
              className="lg:absolute lg:top-47 lg:right-0 w-80 rounded-2xl border border-gray-300 p-8 transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20 bg-white/5 backdrop-blur-md"
 | 
			
		||||
              className="lg:absolute lg:top-47 lg:right-0 w-80"
 | 
			
		||||
            >
 | 
			
		||||
              <div><CT color="light" className="uppercase tracking-wide">COUNTRIES</CT></div>
 | 
			
		||||
              <div><CountUpNumber end={44} className="mt-2 text-3xl font-bold text-white" /></div>
 | 
			
		||||
              <CP color="light" className="mt-2 text-sm">
 | 
			
		||||
                Total number of countries with active nodes.
 | 
			
		||||
              </CP>
 | 
			
		||||
              <MagicCard
 | 
			
		||||
                gradientColor="#334155"
 | 
			
		||||
                className="shadow-xl shadow-cyan-500/15 border border-gray-500/50 transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-xl hover:shadow-cyan-500/20"
 | 
			
		||||
              >
 | 
			
		||||
                <div><CT color="light" className="uppercase tracking-wide [text-shadow:0_0_12px_var(--color-cyan-500)]">COUNTRIES</CT></div>
 | 
			
		||||
                <div><CountUpNumber end={44} className="mt-2 text-3xl font-bold text-white [text-shadow:0_0_12px_var(--color-cyan-500)]" /></div>
 | 
			
		||||
                <CP color="light" className="mt-2 text-sm">
 | 
			
		||||
                  Total number of countries with active nodes.
 | 
			
		||||
                </CP>
 | 
			
		||||
              </MagicCard>
 | 
			
		||||
            </motion.div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ import { StackSectionLight } from './StackSection'
 | 
			
		||||
import { WorldMap } from './HomeGlobe'
 | 
			
		||||
import { HomeBenefits } from './HomeBenefits'
 | 
			
		||||
import { CallToAction } from './CallToAction'
 | 
			
		||||
import { HomeSlider } from './HomeSlider'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export default function HomePage() {
 | 
			
		||||
@@ -24,7 +25,7 @@ export default function HomePage() {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      <AnimatedSection>
 | 
			
		||||
        <HomeFeaturesDark />
 | 
			
		||||
        <HomeSlider />
 | 
			
		||||
      </AnimatedSection>
 | 
			
		||||
 | 
			
		||||
      <AnimatedSection>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										87
									
								
								src/pages/home/HomeSlider.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,87 @@
 | 
			
		||||
"use client";
 | 
			
		||||
 | 
			
		||||
import React from "react";
 | 
			
		||||
import { Carousel, Card } from "@/components/ui/apple-cards-carousel";
 | 
			
		||||
import { H2, H3, P } from "@/components/Texts";
 | 
			
		||||
 | 
			
		||||
export function HomeSlider() {
 | 
			
		||||
  const cards = data.map((card) => (
 | 
			
		||||
    <Card key={card.src} card={card} />
 | 
			
		||||
  ));
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="w-full h-full py-20 bg-[#0b0b0b]">
 | 
			
		||||
      <div className="max-w-7xl mx-auto pl-4">
 | 
			
		||||
        <H3 className="text-left text-white">
 | 
			
		||||
          Discover the Mycelium Ecosystem
 | 
			
		||||
        </H3>
 | 
			
		||||
        <div className="mt-4 max-w-3xl">
 | 
			
		||||
          <P className="text-left text-neutral-400">
 | 
			
		||||
            From compute and networking to intelligent automation, these components work together to empower users, developers, and organizations to build freely, without intermediaries.
 | 
			
		||||
          </P>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <Carousel items={cards} />
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import networkImage from "@/images/slider/network1.jpg";
 | 
			
		||||
import agentImage from "@/images/slider/agent1.jpg";
 | 
			
		||||
import cloudImage from "@/images/slider/cloud1.jpg";
 | 
			
		||||
import gpuImage from "@/images/slider/gpu1.jpg";
 | 
			
		||||
import computeImage from "@/images/slider/compute1.jpg";
 | 
			
		||||
import storageImage from "@/images/slider/storage1.jpg";
 | 
			
		||||
 | 
			
		||||
const data = [
 | 
			
		||||
  {
 | 
			
		||||
    category: "DePIN",
 | 
			
		||||
    title: "Mycelium Network",
 | 
			
		||||
    description: "A decentralized network for distributed computing.",
 | 
			
		||||
    src: "/images/gallery/9.webp",
 | 
			
		||||
    bg: networkImage,
 | 
			
		||||
    link: "/network",
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    category: "AI Agent",
 | 
			
		||||
    title: "Mycelium Agent",
 | 
			
		||||
    description: "An intelligent agent for task automation.",
 | 
			
		||||
    src: "/images/gallery/2.webp",
 | 
			
		||||
    bg: agentImage,
 | 
			
		||||
    link: "/agent",
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    category: "Cloud",
 | 
			
		||||
    title: "Mycelium Cloud",
 | 
			
		||||
    description: "Decentralized cloud storage and services.",
 | 
			
		||||
    src: "/images/gallery/3.webp",
 | 
			
		||||
    bg: cloudImage,
 | 
			
		||||
    link: "/cloud",
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    category: "GPU",
 | 
			
		||||
    title: "Mycelium GPU",
 | 
			
		||||
    description: "Access to a global network of GPUs.",
 | 
			
		||||
    src: "/images/gallery/4.webp",
 | 
			
		||||
    bg: gpuImage,
 | 
			
		||||
    link: "/gpu",
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    category: "Compute",
 | 
			
		||||
    title: "Mycelium Compute",
 | 
			
		||||
    description: "Run computations on a distributed network.",
 | 
			
		||||
    src: "/images/gallery/5.webp",
 | 
			
		||||
    bg: computeImage,
 | 
			
		||||
    link: "/compute",
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    category: "Storage",
 | 
			
		||||
    title: "Mycelium Storage",
 | 
			
		||||
    description: "Secure and decentralized data storage.",
 | 
			
		||||
    src: "/images/gallery/6.webp",
 | 
			
		||||
    bg: storageImage,
 | 
			
		||||
    link: "/storage",
 | 
			
		||||
  },
 | 
			
		||||
];
 | 
			
		||||
@@ -4,31 +4,56 @@ import { motion } from "framer-motion";
 | 
			
		||||
import { StackedCubesLight } from "@/components/ui/StackedCubesLight";
 | 
			
		||||
import { P, SectionHeader, Eyebrow } from "@/components/Texts";
 | 
			
		||||
import { FadeIn } from "@/components/ui/FadeIn";
 | 
			
		||||
import { DottedGlowBackground } from '@/components/ui/dotted-glow-background';
 | 
			
		||||
 | 
			
		||||
export function StackSectionLight() {
 | 
			
		||||
  return (
 | 
			
		||||
    <section className="relative w-full overflow-hidden py-24 lg:py-40">
 | 
			
		||||
    <section className="relative w-full overflow-hidden py-24 lg:py-40 isolate">
 | 
			
		||||
      {/* === Background Layer === */}
 | 
			
		||||
      <div className="absolute inset-0 -z-10 bg-transparent">
 | 
			
		||||
        {/* Dotted Glow Background */}
 | 
			
		||||
        <DottedGlowBackground
 | 
			
		||||
          gap={15}
 | 
			
		||||
          radius={2}
 | 
			
		||||
          color="rgba(0,0,0,0.4)"
 | 
			
		||||
          glowColor="rgba(0,170,255,0.85)"
 | 
			
		||||
          opacity={0.2}
 | 
			
		||||
      <div className="absolute inset-0 z-0 bg-transparent">
 | 
			
		||||
        {/* Central main aura */}
 | 
			
		||||
        <motion.div
 | 
			
		||||
          className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[1200px] h-[1200px] rounded-full pointer-events-none"
 | 
			
		||||
          style={{
 | 
			
		||||
            background:
 | 
			
		||||
              "radial-gradient(circle, rgba(180,255,255,0.55) 0%, rgba(0,210,255,0.35) 35%, rgba(255,255,255,0) 55%)",
 | 
			
		||||
            filter: "blur(140px)",
 | 
			
		||||
          }}
 | 
			
		||||
          animate={{
 | 
			
		||||
            opacity: [0.5, 0.8, 0.5],
 | 
			
		||||
            scale: [1, 1.05, 1],
 | 
			
		||||
          }}
 | 
			
		||||
          transition={{
 | 
			
		||||
            duration: 9,
 | 
			
		||||
            repeat: Infinity,
 | 
			
		||||
            ease: "easeInOut",
 | 
			
		||||
          }}
 | 
			
		||||
        />
 | 
			
		||||
 | 
			
		||||
        {/* Faint cyan mist in the back for depth */}
 | 
			
		||||
        <motion.div
 | 
			
		||||
          className="absolute left-[70%] top-[30%] -translate-x-1/2 -translate-y-1/2 w-[1600px] h-[1600px] rounded-full pointer-events-none"
 | 
			
		||||
          style={{
 | 
			
		||||
            background:
 | 
			
		||||
              "radial-gradient(circle, rgba(100,220,255,0.25) 0%, rgba(200,255,255,0.15) 20§§%, rgba(255,255,255,0) 30%)",
 | 
			
		||||
            filter: "blur(200px)",
 | 
			
		||||
          }}
 | 
			
		||||
          animate={{
 | 
			
		||||
            opacity: [0.2, 0.35, 0.2],
 | 
			
		||||
            scale: [1, 1.1, 1],
 | 
			
		||||
          }}
 | 
			
		||||
          transition={{
 | 
			
		||||
            duration: 12,
 | 
			
		||||
            repeat: Infinity,
 | 
			
		||||
            ease: "easeInOut",
 | 
			
		||||
            delay: 3,
 | 
			
		||||
          }}
 | 
			
		||||
        />
 | 
			
		||||
        {/* Faint 3D grid floor */}
 | 
			
		||||
        <div className="absolute inset-0 flex items-end justify-center overflow-hidden">
 | 
			
		||||
          <div className="w-[200vw] h-[200vh] bg-[linear-gradient(to_right,rgba(0,0,0,0.03)_1px,transparent_1px),linear-gradient(to_bottom,rgba(0,0,0,0.03)_1px,transparent_1px)] bg-[size:60px_60px] [transform:perspective(800px)_rotateX(70deg)] origin-bottom opacity-50" />
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      {/* === Content === */}
 | 
			
		||||
      <div className="relative mx-auto max-w-7xl px-6 lg:px-8 grid grid-cols-1 lg:grid-cols-3 gap-16 items-center">
 | 
			
		||||
        {/* Left Column - Text */}
 | 
			
		||||
        <div className="text-center lg:text-left">
 | 
			
		||||
        <div className="text-center lg:text-left z-10">
 | 
			
		||||
          <FadeIn>
 | 
			
		||||
            <Eyebrow color="accent">Technology Layers</Eyebrow>
 | 
			
		||||
            <SectionHeader color="dark" className="text-4xl sm:text-5xl font-semibold">
 | 
			
		||||
@@ -46,7 +71,7 @@ export function StackSectionLight() {
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        {/* Right Column - Animated Stack */}
 | 
			
		||||
        <div className="lg:col-span-2 flex items-center justify-center lg:justify-start relative">
 | 
			
		||||
        <div className="lg:col-span-2 flex items-center justify-center lg:justify-start relative z-10">
 | 
			
		||||
          <motion.div
 | 
			
		||||
            initial={{ y: 30, opacity: 0 }}
 | 
			
		||||
            whileInView={{ y: 0, opacity: 1 }}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								src/pages/storage/CallToAction.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,40 @@
 | 
			
		||||
import { CircleBackground } from '../../components/CircleBackground'
 | 
			
		||||
import { Container } from '../../components/Container'
 | 
			
		||||
import { Button } from '../../components/Button'
 | 
			
		||||
 | 
			
		||||
export function CallToAction() {
 | 
			
		||||
  return (
 | 
			
		||||
    <section
 | 
			
		||||
      id="get-started"
 | 
			
		||||
      className="relative overflow-hidden bg-gray-900 py-20 sm:py-28"
 | 
			
		||||
    >
 | 
			
		||||
      <div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
 | 
			
		||||
        <CircleBackground color="#06b6d4" className="animate-spin-slower" />
 | 
			
		||||
      </div>
 | 
			
		||||
      <Container className="relative">
 | 
			
		||||
        <div className="mx-auto max-w-2xl text-center">
 | 
			
		||||
          <h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
 | 
			
		||||
            Get Started Today
 | 
			
		||||
          </h2>
 | 
			
		||||
          <p className="mt-6 text-lg text-gray-300">
 | 
			
		||||
            Download the Mycelium app and step into the future of secure, peer-to-peer networking; fast, private, and decentralized.
 | 
			
		||||
          </p>
 | 
			
		||||
          <div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4">
 | 
			
		||||
            <Button to="/download" variant="solid" color="white">
 | 
			
		||||
              Get Mycelium Connector
 | 
			
		||||
            </Button>
 | 
			
		||||
            <Button
 | 
			
		||||
              to="https://threefold.info/mycelium_network/docs/"
 | 
			
		||||
              as="a"
 | 
			
		||||
              target="_blank"
 | 
			
		||||
              variant="outline"
 | 
			
		||||
              color="white"
 | 
			
		||||
            >
 | 
			
		||||
              Read Docs
 | 
			
		||||
            </Button>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </Container>
 | 
			
		||||
    </section>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										33
									
								
								src/pages/storage/StorageHero.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,33 @@
 | 
			
		||||
'use client'
 | 
			
		||||
 | 
			
		||||
import { Button } from '../../components/Button'
 | 
			
		||||
 | 
			
		||||
export function StorageHero() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="relative bg-white">
 | 
			
		||||
      <div className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-1/2">
 | 
			
		||||
        <img
 | 
			
		||||
          alt=""
 | 
			
		||||
          src="/images/storagehero2.png"
 | 
			
		||||
          className="size-full object-cover"
 | 
			
		||||
        />
 | 
			
		||||
       
 | 
			
		||||
      </div>
 | 
			
		||||
      <div className="relative mx-auto max-w-7xl py-24 sm:py-32 lg:px-8 lg:py-40">
 | 
			
		||||
        <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">
 | 
			
		||||
          <h2 className="text-base/7 font-semibold text-cyan-500">STORAGE</h2>
 | 
			
		||||
          <p className="mt-2 text-4xl font-semibold tracking-tight text-gray-900 sm:text-5xl">If GPUs are the engine, data is the lifeblood of intelligence.</p>
 | 
			
		||||
          <p className="mt-6 text-base/7 text-gray-600">
 | 
			
		||||
            Mycelium interconnects autonomous nodes with unified storage that adapts to every workload — from high-throughput object stores to parallel file systems.
 | 
			
		||||
Rooted in open standards, it ensures speed, resilience, and true data sovereignty.
 | 
			
		||||
          </p>
 | 
			
		||||
          <div className="mt-8">
 | 
			
		||||
            <Button href="#" variant="solid" color="cyan">
 | 
			
		||||
              Talk to an expert
 | 
			
		||||
            </Button>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								src/pages/storage/StoragePage.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,16 @@
 | 
			
		||||
import { AnimatedSection } from '../../components/AnimatedSection'
 | 
			
		||||
import { StorageHero } from './StorageHero'
 | 
			
		||||
import { CallToAction } from './CallToAction'
 | 
			
		||||
 | 
			
		||||
export default function StoragePage() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div>
 | 
			
		||||
      <AnimatedSection>
 | 
			
		||||
        <StorageHero />
 | 
			
		||||
      </AnimatedSection>
 | 
			
		||||
      <AnimatedSection>
 | 
			
		||||
        <CallToAction />
 | 
			
		||||
      </AnimatedSection>
 | 
			
		||||
    </div>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										32
									
								
								tailwind.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,32 @@
 | 
			
		||||
/** @type {import('tailwindcss').Config} */
 | 
			
		||||
export default {
 | 
			
		||||
  content: [
 | 
			
		||||
    "./index.html",
 | 
			
		||||
    "./src/**/*.{js,ts,jsx,tsx}",
 | 
			
		||||
  ],
 | 
			
		||||
  theme: {
 | 
			
		||||
    extend: {
 | 
			
		||||
      keyframes: {
 | 
			
		||||
        'glitch-1': {
 | 
			
		||||
          '0%': { transform: 'none' },
 | 
			
		||||
          '25%': { transform: 'skew(-0.5deg, -0.5deg)' },
 | 
			
		||||
          '50%': { transform: 'none' },
 | 
			
		||||
          '75%': { transform: 'skew(0.5deg, 0.5deg)' },
 | 
			
		||||
          '100%': { transform: 'none' },
 | 
			
		||||
        },
 | 
			
		||||
        'glitch-2': {
 | 
			
		||||
          '0%': { transform: 'none' },
 | 
			
		||||
          '25%': { transform: 'skew(-0.5deg, -0.5deg)' },
 | 
			
		||||
          '50%': { transform: 'none' },
 | 
			
		||||
          '75%': { transform: 'skew(0.5deg, 0.5deg)' },
 | 
			
		||||
          '100%': { transform: 'none' },
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
      animation: {
 | 
			
		||||
        'glitch-1': 'glitch-1 1s infinite',
 | 
			
		||||
        'glitch-2': 'glitch-2 1s infinite',
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  plugins: [],
 | 
			
		||||
}
 | 
			
		||||