Spaces:
Running
Running
Header improvements: compact mode with animation, larger logo, orange CTA on scroll + Hero mobile alignment
Browse files- src/components/Header.jsx +20 -18
- src/pages/Home.jsx +2 -1
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/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
|
|
|
|
| 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
|