Spaces:
Running
Running
Merge main into feature/install-modal
Browse files- src/components/Header.jsx +20 -18
- src/pages/Download.jsx +62 -3
- src/pages/Home.jsx +21 -22
src/components/Header.jsx
CHANGED
|
@@ -15,7 +15,6 @@ import {
|
|
| 15 |
useMediaQuery,
|
| 16 |
useTheme,
|
| 17 |
Link,
|
| 18 |
-
Container,
|
| 19 |
} from '@mui/material';
|
| 20 |
import MenuIcon from '@mui/icons-material/Menu';
|
| 21 |
import CloseIcon from '@mui/icons-material/Close';
|
|
@@ -37,17 +36,18 @@ export default function Header({ transparent = false }) {
|
|
| 37 |
const isMobile = useMediaQuery(theme.breakpoints.down('md'));
|
| 38 |
const location = useLocation();
|
| 39 |
|
| 40 |
-
// Track scroll position for
|
| 41 |
useEffect(() => {
|
| 42 |
-
if (!transparent) return;
|
| 43 |
-
|
| 44 |
const handleScroll = () => {
|
| 45 |
-
setScrolled(window.scrollY >
|
| 46 |
};
|
| 47 |
|
|
|
|
|
|
|
|
|
|
| 48 |
window.addEventListener('scroll', handleScroll);
|
| 49 |
return () => window.removeEventListener('scroll', handleScroll);
|
| 50 |
-
}, [
|
| 51 |
|
| 52 |
const handleDrawerToggle = () => {
|
| 53 |
setMobileOpen(!mobileOpen);
|
|
@@ -146,13 +146,13 @@ export default function Header({ transparent = false }) {
|
|
| 146 |
transition: 'all 0.4s cubic-bezier(0.4, 0, 0.2, 1)',
|
| 147 |
}}
|
| 148 |
>
|
| 149 |
-
<Container maxWidth="xl">
|
| 150 |
<Toolbar
|
| 151 |
-
disableGutters
|
| 152 |
sx={{
|
| 153 |
justifyContent: 'space-between',
|
| 154 |
-
|
| 155 |
-
|
|
|
|
|
|
|
| 156 |
}}
|
| 157 |
>
|
| 158 |
{/* Logo */}
|
|
@@ -162,9 +162,9 @@ export default function Header({ transparent = false }) {
|
|
| 162 |
sx={{
|
| 163 |
display: 'flex',
|
| 164 |
alignItems: 'center',
|
| 165 |
-
gap: 1.5,
|
| 166 |
textDecoration: 'none',
|
| 167 |
-
transition: '
|
| 168 |
'&:hover': {
|
| 169 |
opacity: 0.8,
|
| 170 |
},
|
|
@@ -175,8 +175,9 @@ export default function Header({ transparent = false }) {
|
|
| 175 |
src="/assets/reachy-icon.svg"
|
| 176 |
alt="Reachy Mini"
|
| 177 |
sx={{
|
| 178 |
-
width:
|
| 179 |
-
height:
|
|
|
|
| 180 |
}}
|
| 181 |
/>
|
| 182 |
<Typography
|
|
@@ -185,7 +186,8 @@ export default function Header({ transparent = false }) {
|
|
| 185 |
fontWeight: 700,
|
| 186 |
color: textColor,
|
| 187 |
letterSpacing: '-0.03em',
|
| 188 |
-
fontSize: { xs: 20, md: 22 },
|
|
|
|
| 189 |
}}
|
| 190 |
>
|
| 191 |
Reachy Mini
|
|
@@ -268,7 +270,7 @@ export default function Header({ transparent = false }) {
|
|
| 268 |
<Button
|
| 269 |
component={RouterLink}
|
| 270 |
to="/buy"
|
| 271 |
-
variant=
|
| 272 |
color="primary"
|
| 273 |
sx={{
|
| 274 |
px: 3,
|
|
@@ -276,6 +278,7 @@ export default function Header({ transparent = false }) {
|
|
| 276 |
fontSize: 14,
|
| 277 |
fontWeight: 600,
|
| 278 |
borderRadius: 2,
|
|
|
|
| 279 |
...(isTransparentMode && {
|
| 280 |
borderColor: 'primary.main',
|
| 281 |
color: 'primary.main',
|
|
@@ -291,7 +294,6 @@ export default function Header({ transparent = false }) {
|
|
| 291 |
</Box>
|
| 292 |
)}
|
| 293 |
</Toolbar>
|
| 294 |
-
</Container>
|
| 295 |
</AppBar>
|
| 296 |
|
| 297 |
{/* Mobile Drawer */}
|
|
@@ -311,7 +313,7 @@ export default function Header({ transparent = false }) {
|
|
| 311 |
</Drawer>
|
| 312 |
|
| 313 |
{/* Spacer for fixed AppBar - only show if not transparent */}
|
| 314 |
-
{!transparent && <Toolbar sx={{ minHeight: { xs: 64, md:
|
| 315 |
</>
|
| 316 |
);
|
| 317 |
}
|
|
|
|
| 15 |
useMediaQuery,
|
| 16 |
useTheme,
|
| 17 |
Link,
|
|
|
|
| 18 |
} from '@mui/material';
|
| 19 |
import MenuIcon from '@mui/icons-material/Menu';
|
| 20 |
import CloseIcon from '@mui/icons-material/Close';
|
|
|
|
| 36 |
const isMobile = useMediaQuery(theme.breakpoints.down('md'));
|
| 37 |
const location = useLocation();
|
| 38 |
|
| 39 |
+
// Track scroll position for header compacting
|
| 40 |
useEffect(() => {
|
|
|
|
|
|
|
| 41 |
const handleScroll = () => {
|
| 42 |
+
setScrolled(window.scrollY > 50);
|
| 43 |
};
|
| 44 |
|
| 45 |
+
// Check initial position
|
| 46 |
+
handleScroll();
|
| 47 |
+
|
| 48 |
window.addEventListener('scroll', handleScroll);
|
| 49 |
return () => window.removeEventListener('scroll', handleScroll);
|
| 50 |
+
}, []);
|
| 51 |
|
| 52 |
const handleDrawerToggle = () => {
|
| 53 |
setMobileOpen(!mobileOpen);
|
|
|
|
| 146 |
transition: 'all 0.4s cubic-bezier(0.4, 0, 0.2, 1)',
|
| 147 |
}}
|
| 148 |
>
|
|
|
|
| 149 |
<Toolbar
|
|
|
|
| 150 |
sx={{
|
| 151 |
justifyContent: 'space-between',
|
| 152 |
+
px: scrolled ? { xs: 1, md: 1.5, lg: 2 } : { xs: 2, md: 3, lg: 4 },
|
| 153 |
+
py: scrolled ? { xs: 1, md: 1.5 } : { xs: 2, md: 3.5 },
|
| 154 |
+
minHeight: scrolled ? { xs: 56, md: 64 } : { xs: 64, md: 88 },
|
| 155 |
+
transition: 'all 0.4s cubic-bezier(0.4, 0, 0.2, 1)',
|
| 156 |
}}
|
| 157 |
>
|
| 158 |
{/* Logo */}
|
|
|
|
| 162 |
sx={{
|
| 163 |
display: 'flex',
|
| 164 |
alignItems: 'center',
|
| 165 |
+
gap: scrolled ? 1 : 1.5,
|
| 166 |
textDecoration: 'none',
|
| 167 |
+
transition: 'all 0.4s cubic-bezier(0.4, 0, 0.2, 1)',
|
| 168 |
'&:hover': {
|
| 169 |
opacity: 0.8,
|
| 170 |
},
|
|
|
|
| 175 |
src="/assets/reachy-icon.svg"
|
| 176 |
alt="Reachy Mini"
|
| 177 |
sx={{
|
| 178 |
+
width: scrolled ? 52 : 60,
|
| 179 |
+
height: scrolled ? 52 : 60,
|
| 180 |
+
transition: 'all 0.4s cubic-bezier(0.4, 0, 0.2, 1)',
|
| 181 |
}}
|
| 182 |
/>
|
| 183 |
<Typography
|
|
|
|
| 186 |
fontWeight: 700,
|
| 187 |
color: textColor,
|
| 188 |
letterSpacing: '-0.03em',
|
| 189 |
+
fontSize: scrolled ? { xs: 18, md: 19 } : { xs: 20, md: 22 },
|
| 190 |
+
transition: 'all 0.4s cubic-bezier(0.4, 0, 0.2, 1)',
|
| 191 |
}}
|
| 192 |
>
|
| 193 |
Reachy Mini
|
|
|
|
| 270 |
<Button
|
| 271 |
component={RouterLink}
|
| 272 |
to="/buy"
|
| 273 |
+
variant={scrolled ? 'contained' : 'outlined'}
|
| 274 |
color="primary"
|
| 275 |
sx={{
|
| 276 |
px: 3,
|
|
|
|
| 278 |
fontSize: 14,
|
| 279 |
fontWeight: 600,
|
| 280 |
borderRadius: 2,
|
| 281 |
+
transition: 'all 0.4s cubic-bezier(0.4, 0, 0.2, 1)',
|
| 282 |
...(isTransparentMode && {
|
| 283 |
borderColor: 'primary.main',
|
| 284 |
color: 'primary.main',
|
|
|
|
| 294 |
</Box>
|
| 295 |
)}
|
| 296 |
</Toolbar>
|
|
|
|
| 297 |
</AppBar>
|
| 298 |
|
| 299 |
{/* Mobile Drawer */}
|
|
|
|
| 313 |
</Drawer>
|
| 314 |
|
| 315 |
{/* Spacer for fixed AppBar - only show if not transparent */}
|
| 316 |
+
{!transparent && <Toolbar sx={{ minHeight: { xs: 64, md: 88 } }} />}
|
| 317 |
</>
|
| 318 |
);
|
| 319 |
}
|
src/pages/Download.jsx
CHANGED
|
@@ -620,7 +620,7 @@ export default function Download() {
|
|
| 620 |
fontSize: 17,
|
| 621 |
}}
|
| 622 |
>
|
| 623 |
-
🚧 {currentPlatform?.name}
|
| 624 |
</Typography>
|
| 625 |
</Box>
|
| 626 |
|
|
@@ -630,13 +630,72 @@ export default function Download() {
|
|
| 630 |
color: 'rgba(255,255,255,0.5)',
|
| 631 |
mt: 2,
|
| 632 |
fontSize: 14,
|
| 633 |
-
maxWidth:
|
| 634 |
mx: 'auto',
|
| 635 |
}}
|
| 636 |
>
|
| 637 |
We're working hard to bring Reachy Mini Control to {currentPlatform?.name}.
|
| 638 |
-
In the meantime,
|
| 639 |
</Typography>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 640 |
</>
|
| 641 |
)}
|
| 642 |
|
|
|
|
| 620 |
fontSize: 17,
|
| 621 |
}}
|
| 622 |
>
|
| 623 |
+
🚧 {currentPlatform?.name} desktop app coming soon!
|
| 624 |
</Typography>
|
| 625 |
</Box>
|
| 626 |
|
|
|
|
| 630 |
color: 'rgba(255,255,255,0.5)',
|
| 631 |
mt: 2,
|
| 632 |
fontSize: 14,
|
| 633 |
+
maxWidth: 500,
|
| 634 |
mx: 'auto',
|
| 635 |
}}
|
| 636 |
>
|
| 637 |
We're working hard to bring Reachy Mini Control to {currentPlatform?.name}.
|
| 638 |
+
In the meantime, macOS (Apple Silicon) is fully supported and Windows is in beta!
|
| 639 |
</Typography>
|
| 640 |
+
|
| 641 |
+
{/* Alternative for Linux/advanced users - Python SDK */}
|
| 642 |
+
<Box
|
| 643 |
+
sx={{
|
| 644 |
+
mt: 3,
|
| 645 |
+
p: 3,
|
| 646 |
+
borderRadius: 2,
|
| 647 |
+
background: 'rgba(16, 185, 129, 0.08)',
|
| 648 |
+
border: '1px solid rgba(16, 185, 129, 0.25)',
|
| 649 |
+
maxWidth: 520,
|
| 650 |
+
mx: 'auto',
|
| 651 |
+
textAlign: 'left',
|
| 652 |
+
}}
|
| 653 |
+
>
|
| 654 |
+
<Typography
|
| 655 |
+
variant="body2"
|
| 656 |
+
sx={{
|
| 657 |
+
color: 'rgba(255,255,255,0.9)',
|
| 658 |
+
fontWeight: 600,
|
| 659 |
+
mb: 1,
|
| 660 |
+
fontSize: 14,
|
| 661 |
+
}}
|
| 662 |
+
>
|
| 663 |
+
🐍 Looking to use the Python SDK directly?
|
| 664 |
+
</Typography>
|
| 665 |
+
<Typography
|
| 666 |
+
variant="body2"
|
| 667 |
+
sx={{
|
| 668 |
+
color: 'rgba(255,255,255,0.6)',
|
| 669 |
+
fontSize: 13,
|
| 670 |
+
lineHeight: 1.6,
|
| 671 |
+
mb: 1.5,
|
| 672 |
+
}}
|
| 673 |
+
>
|
| 674 |
+
{detectedPlatform?.includes('linux')
|
| 675 |
+
? "Linux users can interact directly with their Reachy Mini using the Python SDK. Run the daemon locally and use the full API for custom applications."
|
| 676 |
+
: "Advanced users can interact directly with their Reachy Mini using the Python SDK and daemon."}
|
| 677 |
+
</Typography>
|
| 678 |
+
<Button
|
| 679 |
+
variant="outlined"
|
| 680 |
+
size="small"
|
| 681 |
+
href="https://github.com/pollen-robotics/reachy_mini"
|
| 682 |
+
target="_blank"
|
| 683 |
+
endIcon={<OpenInNewIcon sx={{ fontSize: 14 }} />}
|
| 684 |
+
sx={{
|
| 685 |
+
color: '#10b981',
|
| 686 |
+
borderColor: 'rgba(16, 185, 129, 0.4)',
|
| 687 |
+
fontWeight: 600,
|
| 688 |
+
fontSize: 12,
|
| 689 |
+
textTransform: 'none',
|
| 690 |
+
'&:hover': {
|
| 691 |
+
borderColor: '#10b981',
|
| 692 |
+
bgcolor: 'rgba(16, 185, 129, 0.1)',
|
| 693 |
+
},
|
| 694 |
+
}}
|
| 695 |
+
>
|
| 696 |
+
View reachy_mini on GitHub
|
| 697 |
+
</Button>
|
| 698 |
+
</Box>
|
| 699 |
</>
|
| 700 |
)}
|
| 701 |
|
src/pages/Home.jsx
CHANGED
|
@@ -83,7 +83,8 @@ function Hero() {
|
|
| 83 |
position: 'relative',
|
| 84 |
minHeight: { xs: '85vh', md: '80vh' },
|
| 85 |
display: 'flex',
|
| 86 |
-
alignItems: 'center',
|
|
|
|
| 87 |
backgroundColor: '#000',
|
| 88 |
overflow: 'hidden',
|
| 89 |
// Curved bottom edge
|
|
@@ -257,9 +258,9 @@ function Hero() {
|
|
| 257 |
function StatsSection() {
|
| 258 |
return (
|
| 259 |
<Section id="stats" sx={{ py: { xs: 8, md: 12 }, position: 'relative', overflow: 'visible' }}>
|
| 260 |
-
<Grid container spacing={2}>
|
| 261 |
{/* Big stat - Open Source */}
|
| 262 |
-
<Grid size={{ xs: 12, md: 8 }}>
|
| 263 |
<Box
|
| 264 |
component={RouterLink}
|
| 265 |
to="/getting-started"
|
|
@@ -273,8 +274,8 @@ function StatsSection() {
|
|
| 273 |
display: 'flex',
|
| 274 |
flexDirection: 'column',
|
| 275 |
justifyContent: 'space-between',
|
| 276 |
-
// Clip only bottom and
|
| 277 |
-
clipPath: 'inset(-100px
|
| 278 |
textDecoration: 'none',
|
| 279 |
color: 'inherit',
|
| 280 |
cursor: 'pointer',
|
|
@@ -285,21 +286,19 @@ function StatsSection() {
|
|
| 285 |
},
|
| 286 |
}}
|
| 287 |
>
|
| 288 |
-
{/*
|
| 289 |
-
<Box
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
}}
|
| 302 |
-
/>
|
| 303 |
<Box sx={{ position: 'relative', zIndex: 1 }}>
|
| 304 |
<Typography
|
| 305 |
sx={{
|
|
@@ -309,8 +308,8 @@ function StatsSection() {
|
|
| 309 |
color: 'white',
|
| 310 |
}}
|
| 311 |
>
|
| 312 |
-
Build your
|
| 313 |
-
robot
|
| 314 |
</Typography>
|
| 315 |
<Typography
|
| 316 |
variant="h4"
|
|
|
|
| 83 |
position: 'relative',
|
| 84 |
minHeight: { xs: '85vh', md: '80vh' },
|
| 85 |
display: 'flex',
|
| 86 |
+
alignItems: { xs: 'flex-end', md: 'center' },
|
| 87 |
+
pb: { xs: 12, md: 0 },
|
| 88 |
backgroundColor: '#000',
|
| 89 |
overflow: 'hidden',
|
| 90 |
// Curved bottom edge
|
|
|
|
| 258 |
function StatsSection() {
|
| 259 |
return (
|
| 260 |
<Section id="stats" sx={{ py: { xs: 8, md: 12 }, position: 'relative', overflow: 'visible' }}>
|
| 261 |
+
<Grid container spacing={2} sx={{ overflow: 'visible' }}>
|
| 262 |
{/* Big stat - Open Source */}
|
| 263 |
+
<Grid size={{ xs: 12, md: 8 }} sx={{ overflow: 'visible' }}>
|
| 264 |
<Box
|
| 265 |
component={RouterLink}
|
| 266 |
to="/getting-started"
|
|
|
|
| 274 |
display: 'flex',
|
| 275 |
flexDirection: 'column',
|
| 276 |
justifyContent: 'space-between',
|
| 277 |
+
// Clip only bottom and left, allow top and right overflow
|
| 278 |
+
clipPath: 'inset(-100px -50px 0 0 round 16px)',
|
| 279 |
textDecoration: 'none',
|
| 280 |
color: 'inherit',
|
| 281 |
cursor: 'pointer',
|
|
|
|
| 286 |
},
|
| 287 |
}}
|
| 288 |
>
|
| 289 |
+
{/* How to create app illustration - floating */}
|
| 290 |
+
<Box sx={{ display: { xs: 'none', sm: 'block' } }}>
|
| 291 |
+
<FloatingSticker
|
| 292 |
+
src="/assets/reachy-how-to-create-app.svg"
|
| 293 |
+
size={336}
|
| 294 |
+
top={-60}
|
| 295 |
+
right={10}
|
| 296 |
+
rotation={0}
|
| 297 |
+
floatRange={8}
|
| 298 |
+
floatSpeed={5000}
|
| 299 |
+
scrollFactor={0.03}
|
| 300 |
+
/>
|
| 301 |
+
</Box>
|
|
|
|
|
|
|
| 302 |
<Box sx={{ position: 'relative', zIndex: 1 }}>
|
| 303 |
<Typography
|
| 304 |
sx={{
|
|
|
|
| 308 |
color: 'white',
|
| 309 |
}}
|
| 310 |
>
|
| 311 |
+
Build your<br />
|
| 312 |
+
own robot
|
| 313 |
</Typography>
|
| 314 |
<Typography
|
| 315 |
variant="h4"
|