From 24155bbf76dcc8e8c559ac35e12f0ed5135c3cba Mon Sep 17 00:00:00 2001 From: Cipher Vance Date: Sun, 31 Aug 2025 13:36:36 -0500 Subject: [PATCH] feat(ui): Mobile hamburger nav menu --- static/css/styles.css | 133 ++++++++++++++++++++++++++++++++++++++++-- templates/base.html | 64 ++++++++++++++++++-- 2 files changed, 186 insertions(+), 11 deletions(-) diff --git a/static/css/styles.css b/static/css/styles.css index b5ca331..8031a86 100644 --- a/static/css/styles.css +++ b/static/css/styles.css @@ -65,6 +65,7 @@ body { display: flex; justify-content: space-between; align-items: center; + position: relative; /* for mobile dropdown positioning */ } .logo { @@ -75,6 +76,10 @@ body { transition: transform 0.3s ease; letter-spacing: 0.2px; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; + display: inline-flex; + align-items: center; + gap: 0.5rem; + transform-origin: left center; } .logo:hover { @@ -85,6 +90,12 @@ body { color: var(--accent); } +.logo-img { + display: block; + height: 28px; + width: auto; +} + .nav-links { display: flex; gap: 2rem; @@ -115,6 +126,35 @@ body { width: 100%; } +/* Hamburger toggle (hidden on desktop) */ +.nav-toggle { + display: none; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 5px; + width: 42px; + height: 42px; + border: 1px solid rgba(2, 6, 23, 0.08); + border-radius: 10px; + background: #ffffff; + cursor: pointer; + transition: box-shadow 0.2s ease, transform 0.2s ease; +} + +.nav-toggle:hover { + box-shadow: var(--shadow); + transform: translateY(-1px); +} + +.nav-toggle .bar { + width: 20px; + height: 2px; + background: var(--text-dark); + border-radius: 2px; + transition: transform 0.25s ease, opacity 0.25s ease; +} + /* ======================= Hero Section (Landing) ======================= */ @@ -297,10 +337,24 @@ body { text-align: center; } +.app-brand { + display: inline-flex; + align-items: center; + gap: 0.5rem; + margin-bottom: 0.5rem; +} + +.app-brand-icon { + width: 32px; + height: 32px; + display: block; + border-radius: 6px; /* optional */ +} + .app-logo { font-size: 2rem; font-weight: 700; - margin-bottom: 1rem; + margin-bottom: 0; } .stats-grid { @@ -350,8 +404,8 @@ body { background: var(--gradient); -webkit-background-clip: text; -webkit-text-fill-color: transparent; - background-clip: text; - color: transparent; + background-clip: text; + color: transparent; } .section-header p { @@ -708,13 +762,73 @@ body { /* ======================= Responsive ======================= */ +@media (max-width: 1024px) { + .hero-container { + gap: 3rem; + } +} + @media (max-width: 768px) { .nav-container { padding: 0 1rem; } + /* Show hamburger, convert links to dropdown */ + .nav-toggle { + display: inline-flex; + } + .nav-links { + position: absolute; + top: 64px; /* below navbar */ + left: 16px; + right: 16px; + display: none; /* hidden until opened */ + flex-direction: column; + gap: 0; + list-style: none; + background: #ffffff; + border: 1px solid rgba(2, 6, 23, 0.08); + border-radius: 12px; + box-shadow: var(--shadow); + padding: 8px; + z-index: 1001; + } + + .nav-links.open { + display: flex; + } + + .nav-links li { + width: 100%; + } + + .nav-links a { + display: block; + width: 100%; + padding: 12px 14px; + border-radius: 8px; + } + + .nav-links a:hover { + background: #f8fafc; + } + + /* Remove desktop underline animation on mobile */ + .nav-links a::after { display: none; + content: none; + } + + /* Animate hamburger to X when active */ + .nav-toggle.active .bar:nth-child(1) { + transform: translateY(7px) rotate(45deg); + } + .nav-toggle.active .bar:nth-child(2) { + opacity: 0; + } + .nav-toggle.active .bar:nth-child(3) { + transform: translateY(-7px) rotate(-45deg); } .hero-container { @@ -793,7 +907,9 @@ body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important; } -/* Article layout for newsletter detail */ +/* ======================= + Article layout for newsletter detail + ======================= */ .article-wrap { max-width: 1200px; margin: 6rem auto 3rem; @@ -872,8 +988,13 @@ body { color: var(--text-dark); font-size: 0.95rem; } -#toc-list a:hover { color: var(--secondary); } -.toc-h3 { margin-left: 0.75rem; opacity: 0.9; } +#toc-list a:hover { + color: var(--secondary); +} +.toc-h3 { + margin-left: 0.75rem; + opacity: 0.9; +} .article-main .article-hero { display: flex; diff --git a/templates/base.html b/templates/base.html index 5f4bc39..b93251b 100644 --- a/templates/base.html +++ b/templates/base.html @@ -56,7 +56,11 @@