From ca47c7bae95e9c4d01149d473a7ce812b1b21a18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stig-=C3=98rjan=20Smelror?= Date: Tue, 26 May 2026 18:34:42 +0200 Subject: [PATCH] feat(ui): add responsive navigation and mobile layout improvements Add hamburger menu toggle with ARIA support for mobile nav. Introduce responsive breakpoints at 768px (tablet) and 480px (phone) with stacked nav, adjusted spacing, and full-width elements. Add table overflow protection and responsive refinements across all page layouts. --- public/styles/global.css | 178 +++++++++++++++++++++++++++-- src/layouts/BaseLayout.astro | 26 ++++- src/layouts/BlogPost.astro | 94 ++++++++++++++++ src/pages/blog.astro | 21 +++- src/pages/changelog.astro | 65 +++++++++++ src/pages/docs.astro | 76 +++++++++++-- src/pages/index.astro | 213 ++++++++++++++++++++++++++++++++++- src/pages/privacy.astro | 28 +++++ src/pages/tools.astro | 51 +++++++++ 9 files changed, 733 insertions(+), 19 deletions(-) diff --git a/public/styles/global.css b/public/styles/global.css index 48934c2..c6e681f 100644 --- a/public/styles/global.css +++ b/public/styles/global.css @@ -145,6 +145,7 @@ a { .nav { display: flex; gap: var(--space-xl); + align-items: center; } .nav a { @@ -153,6 +154,7 @@ a { font-size: 0.9rem; letter-spacing: 0.02em; position: relative; + white-space: nowrap; } .nav a::after { @@ -176,8 +178,26 @@ a { width: 100%; } +/* Hamburger menu toggle (hidden by default, visible on mobile) */ +.nav-toggle { + display: none; + background: none; + border: 1px solid var(--color-border); + color: var(--color-text); + font-size: 1.5rem; + cursor: pointer; + padding: 0.4rem 0.6rem; + line-height: 1; + border-radius: 4px; + transition: border-color 0.2s ease, color 0.2s ease; +} + +.nav-toggle:hover { + border-color: var(--color-accent); + color: var(--color-accent); +} + .nav-download { - margin-left: auto; color: var(--color-bg) !important; background: var(--color-accent); padding: 0.65rem 1.75rem; @@ -201,6 +221,14 @@ a { box-shadow: 0 2px 12px rgba(0, 221, 119, 0.3); } +/* Table overflow protection */ +table { + display: block; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + max-width: 100%; +} + /* ===== Hero Section ===== */ .hero { position: relative; @@ -671,7 +699,7 @@ section { .feature-row { display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--space-lg); } @@ -781,7 +809,7 @@ section { .arch-grid { display: grid; - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: var(--space-xl); margin-top: var(--space-2xl); } @@ -1096,7 +1124,7 @@ section { .download-grid { display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--space-lg); margin-bottom: var(--space-xl); } @@ -1303,19 +1331,63 @@ section { } } +/* Tablet and smaller */ @media (max-width: 768px) { .site-header { padding: var(--space-sm) 0; } + .header-content { + flex-wrap: wrap; + gap: var(--space-sm); + } + + .logo-image { + height: 32px; + max-width: 140px; + } + + /* Show hamburger toggle, hide nav by default */ + .nav-toggle { + display: block; + } + .nav { - gap: var(--space-md); - font-size: 0.8rem; + display: none; + flex-direction: column; + gap: 0; + width: 100%; + order: 3; + padding-top: var(--space-sm); + background: var(--color-bg); + border: 1px solid var(--color-border); + border-radius: 4px; + overflow: hidden; + } + + .nav.nav-open { + display: flex; + } + + .nav a { + font-size: 0.85rem; + padding: 0.75rem var(--space-md); + border-bottom: 1px solid var(--color-border); + } + + .nav a:last-child { + border-bottom: none; + } + + .nav a::after { + display: none; } .nav-download { - padding: 0.5rem 1rem; - font-size: 0.75rem !important; + border-radius: 0; + text-align: center; + padding: 0.75rem var(--space-md) !important; + font-size: 0.85rem !important; letter-spacing: 0.06em !important; } @@ -1371,8 +1443,14 @@ section { grid-template-columns: 1fr; gap: var(--space-lg); } + + .download-disclaimer { + flex-direction: column; + text-align: center; + } } +/* Small phones */ @media (max-width: 480px) { .container, .features-layout, @@ -1381,10 +1459,65 @@ section { padding: 0 var(--space-md); } + .site-header { + padding: var(--space-xs) 0; + } + + .logo-image { + height: 28px; + max-width: 120px; + } + + .nav a { + font-size: 0.8rem; + padding: 0.6rem var(--space-sm); + } + + .nav-download { + padding: 0.6rem var(--space-sm) !important; + font-size: 0.8rem !important; + white-space: nowrap; + text-align: center; + } + + .nav-toggle { + padding: 0.3rem 0.5rem; + font-size: 1.25rem; + } + + .hero { + padding-top: calc(var(--space-xl) + 60px); + padding-bottom: var(--space-xl); + } + + .hero-label { + font-size: 0.75rem; + } + + .hero-description { + font-size: 1rem; + } + + section { + padding: var(--space-xl) 0; + } + + .section-title { + font-size: clamp(1.75rem, 8vw, 2.5rem); + } + .feature-primary, .pricing-block { padding: var(--space-lg); } + + .feature-item { + padding: var(--space-lg); + } + + .feature-content h3 { + font-size: 1.5rem; + } .pricing-features { flex-direction: column; @@ -1394,6 +1527,35 @@ section { width: 100%; text-align: center; } + + .pricing-action { + width: 100%; + justify-content: center; + } + + .platform-card { + padding: var(--space-lg); + } + + .platform-name { + font-size: 1.25rem; + } + + .footer-section { + text-align: center; + } + + .footer-section a { + padding-left: 0; + } + + .footer-section a::before { + display: none; + } + + .footer-bottom { + font-size: 0.75rem; + } } /* ===== Animations & Effects ===== */ diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index ce8afaa..ad549ad 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -67,7 +67,10 @@ const isActiveRoute = (path: string) => currentPath === normalizePath(path); -