tfrere HF Staff commited on
Commit
56090ff
·
2 Parent(s): 14e18f1 84c6237

Merge main into feature/install-modal

Browse files
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 transparent header
41
  useEffect(() => {
42
- if (!transparent) return;
43
-
44
  const handleScroll = () => {
45
- setScrolled(window.scrollY > 80);
46
  };
47
 
 
 
 
48
  window.addEventListener('scroll', handleScroll);
49
  return () => window.removeEventListener('scroll', handleScroll);
50
- }, [transparent]);
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
- py: { xs: 2, md: 2.5 },
155
- minHeight: { xs: 64, md: 80 },
 
 
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: 'opacity 0.2s',
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: 32,
179
- height: 32,
 
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="outlined"
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: 80 } }} />}
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} support coming soon!
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: 400,
634
  mx: 'auto',
635
  }}
636
  >
637
  We're working hard to bring Reachy Mini Control to {currentPlatform?.name}.
638
- In the meantime, Windows and macOS (Apple Silicon) are fully supported!
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 sides, allow top overflow
277
- clipPath: 'inset(-100px 0 0 0 round 16px)',
278
  textDecoration: 'none',
279
  color: 'inherit',
280
  cursor: 'pointer',
@@ -285,21 +286,19 @@ function StatsSection() {
285
  },
286
  }}
287
  >
288
- {/* Hacker illustration - overflows top */}
289
- <Box
290
- component="img"
291
- src="/assets/reachies/plumber.png"
292
- alt=""
293
- sx={{
294
- position: 'absolute',
295
- top: -50,
296
- right: 20,
297
- height: 350,
298
- opacity: 1,
299
- pointerEvents: 'none',
300
- display: { xs: 'none', sm: 'block' },
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 own <br />
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"