import { useState, useEffect } from "react"; import { Link as RouterLink } from "react-router-dom"; import { Box, Container, Typography, Button, Grid, Stack, Link, } from "@mui/material"; import { useSpring, animated } from "@react-spring/web"; import OpenInNewIcon from "@mui/icons-material/OpenInNew"; import ArrowForwardIcon from "@mui/icons-material/ArrowForward"; import Layout from "../components/Layout"; import Section from "../components/Section"; import { useApps } from "../context/AppsContext"; // Floating Sticker Component with scroll parallax function FloatingSticker({ src, size, top, left, right, bottom, rotation = 0, floatRange = 15, floatSpeed = 6000, scrollFactor = 0.05, }) { const [floatOffset, setFloatOffset] = useState(0); const [scrollY, setScrollY] = useState(0); useEffect(() => { let startTime = Date.now(); let animationFrame; const animate = () => { const elapsed = Date.now() - startTime; const offset = Math.sin((elapsed / floatSpeed) * Math.PI * 2) * floatRange; setFloatOffset(offset); animationFrame = requestAnimationFrame(animate); }; animationFrame = requestAnimationFrame(animate); return () => cancelAnimationFrame(animationFrame); }, [floatSpeed, floatRange]); useEffect(() => { const handleScroll = () => setScrollY(window.scrollY); window.addEventListener("scroll", handleScroll, { passive: true }); return () => window.removeEventListener("scroll", handleScroll); }, []); const springProps = useSpring({ transform: `translateY(${floatOffset + scrollY * scrollFactor}px) rotate(${rotation}deg)`, config: { mass: 3, tension: 80, friction: 40 }, }); return ( ); } // Hero Section function Hero() { const [scrollY, setScrollY] = useState(0); useEffect(() => { const handleScroll = () => setScrollY(window.scrollY); window.addEventListener("scroll", handleScroll, { passive: true }); return () => window.removeEventListener("scroll", handleScroll); }, []); const videoParallax = useSpring({ transform: `translate(-45%, calc(-50% + ${scrollY * 0.15}px))`, config: { mass: 1, tension: 280, friction: 60 }, }); return ( {/* Overlay gradients + vignette */} Open Source Robot Powered by{" "} Reachy Mini An expressive companion robot designed for{" "} human interaction ,{" "} creative coding , and{" "} AI experimentation . ); } // Stats/Bento Section - Sober backgrounds, illustrations for color function StatsSection() { return (
{/* Big stat - Open Source */} {/* How to create app illustration - floating */} Build your
own robot
Get Started
Follow our guides to assemble your Reachy Mini →
{/* 30+ Apps with Hand Tracking GIF */} {/* GIF Background */} {/* Overlay gradient */} {/* Content */} Apps Explore ready-to-use app → {/* Community */} Join our Discord Community We are already 4500+ Makers → {/* Python SDK */} from {" "} reachy_mini {" "} import {" "} ReachyMini {"\n\n"} with {" "} ReachyMini () {" "} as {" "} mini :{"\n"} {" "}mini. goto_target (head=pose) Discover the Python SDK Full control in 3 lines →
); } // Products Section - Minimal comparison function ProductsSection() { return (
{/* Stickers */} Two ways to Reachy Choose wireless for standalone use, or Lite for a budget-friendly tethered experience. {/* Wireless */} Most Popular Reachy Mini Wireless • On-board compute $449 {[ "Raspberry Pi 4 on-board", "Wi-Fi + USB", "Camera, 4 mics, speaker", "Accelerometer", ].map((item) => ( ✓ {item} ))} {/* Lite */} Reachy Mini Lite USB • External compute $299 {[ "Your Mac/PC as brain", "USB only", "Camera, 4 mics, speaker", "Same motion capabilities", ].map((item) => ( ✓ {item} ))} {/* Lead time notice */} Current Lead time: 90 days after purchase Import duties: EU/UK + US/Canada ship duty-paid (DDP).
Other destinations may incur local import duties/taxes on delivery (DAP).
Both ship as DIY kits. Assembly takes ~2 hours.{" "} Watch the guide →
); } // Apps Showcase - Sober design with illustrations function AppsShowcase() { const { apps } = useApps(); // Round down to nearest 10 (e.g., 35 → 30, 42 → 40) const appsCountRounded = Math.floor(apps.length / 10) * 10; return ( {/* Sticker */} {/* Header */} App Ecosystem {appsCountRounded}+ apps, one click install From AI conversations to hand tracking - explore what the community has built or create your own and share it with the world. {/* Featured App - AI Companion (large) */} {/* Illustration */} {/* Content */} Featured AI Companion Have a conversation with Reachy! Powered by LLMs, it understands what you say and responds with expressive movements and speech. {/* Other apps grid */} {/* Hand Tracking */} Hand Tracking Reachy follows your hand movements in real-time using OpenCV. {/* More apps CTA */} +{appsCountRounded} more apps to explore Browse all → {/* Build your own CTA */} Got an idea?{" "} Build your own app → ); } // Community Section function CommunitySection() { return (
Join 4500+ makers Connect with other Reachy Mini owners on Discord. Share your projects, get help, and stay updated on the latest developments.
); } // Final CTA function FinalCTA() { return (
Ready to meet Reachy? Get your own expressive companion robot and join the community of makers building the future of human-robot interaction. {/* ✓ Free worldwide shipping ✓ 30-day returns ✓ 1-year warranty */}
); } // Main Home Page export default function Home() { return ( ); }