From 0ee3fe6d21d49d43dd443ffba89d2b5b51eb6eea Mon Sep 17 00:00:00 2001 From: Marco Allegretti Date: Wed, 4 Feb 2026 00:41:17 +0100 Subject: [PATCH] ui: responsive nav toggle --- frontend/src/layouts/Layout.astro | 149 ++++++++++++++++++++-- frontend/src/layouts/PublicLayout.astro | 157 ++++++++++++++++++++++-- 2 files changed, 284 insertions(+), 22 deletions(-) diff --git a/frontend/src/layouts/Layout.astro b/frontend/src/layouts/Layout.astro index 535dcb5..a4d8826 100644 --- a/frontend/src/layouts/Layout.astro +++ b/frontend/src/layouts/Layout.astro @@ -84,16 +84,28 @@ const publicDemoSite = isEnabled((globalThis as any).process?.env?.PUBLIC_DEMO_S
-
@@ -106,6 +118,35 @@ const publicDemoSite = isEnabled((globalThis as any).process?.env?.PUBLIC_DEMO_S
@@ -168,6 +210,75 @@ const defaultTheme = DEFAULT_THEME; gap: 2rem; } + .nav-menu { + display: flex; + align-items: center; + gap: 2rem; + } + + .nav-toggle { + display: none; + align-items: center; + justify-content: center; + width: 42px; + height: 42px; + border-radius: var(--radius-sm); + border: 1px solid var(--color-border); + background: rgba(255, 255, 255, 0.06); + color: var(--color-text); + cursor: pointer; + transition: background-color var(--motion-fast) var(--easing-standard), border-color var(--motion-fast) var(--easing-standard); + } + + .nav-toggle:hover { + background: rgba(255, 255, 255, 0.1); + border-color: var(--color-border-hover); + } + + .nav-toggle-icon, + .nav-toggle-icon::before, + .nav-toggle-icon::after { + display: block; + width: 18px; + height: 2px; + background: currentColor; + border-radius: 999px; + transition: transform var(--motion-fast) var(--easing-standard), top var(--motion-fast) var(--easing-standard), background-color var(--motion-fast) var(--easing-standard); + } + + .nav-toggle-icon { + position: relative; + } + + .nav-toggle-icon::before, + .nav-toggle-icon::after { + content: ''; + position: absolute; + left: 0; + } + + .nav-toggle-icon::before { + top: -6px; + } + + .nav-toggle-icon::after { + top: 6px; + } + + .public-nav.is-open .nav-toggle-icon { + background: transparent; + } + + .public-nav.is-open .nav-toggle-icon::before { + top: 0; + transform: rotate(45deg); + } + + .public-nav.is-open .nav-toggle-icon::after { + top: 0; + transform: rotate(-45deg); + } + .logo { font-size: 1.375rem; font-weight: 700; @@ -299,14 +410,36 @@ const defaultTheme = DEFAULT_THEME; padding: 1rem; } - .nav-links { + .nav-toggle { + display: inline-flex; + } + + .nav-menu { + display: none; order: 3; width: 100%; - justify-content: center; + flex-direction: column; + align-items: center; gap: 1rem; padding-top: 1rem; border-top: 1px solid var(--color-border); margin-top: 1rem; } + + .public-nav.is-open .nav-menu { + display: flex; + } + + .nav-links { + width: 100%; + justify-content: center; + gap: 1rem; + } + + .nav-actions { + width: 100%; + justify-content: center; + flex-wrap: wrap; + } }