From 04ef97d67531bdcc930f41a562a717a5c0fc8e17 Mon Sep 17 00:00:00 2001 From: Nate Date: Mon, 16 Mar 2026 14:08:42 -0400 Subject: [PATCH 1/7] Mobile-first UI redesign with bottom nav, sticky search, and card layout --- app/public/style.css | 277 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) diff --git a/app/public/style.css b/app/public/style.css index cc0a2b7..f75983b 100644 --- a/app/public/style.css +++ b/app/public/style.css @@ -998,3 +998,280 @@ select:focus-visible { .stat-label { font-size: 0.54rem; } .section-label { font-size: 0.58rem; } } + +/* Mobile-first redesign layer */ +@media (max-width: 768px) { + :root { + --ink: #102331; + --ink-mid: #315064; + --ink-light: #5d7a8b; + --paper: #eef5f8; + --paper-dark: #dfeaf0; + --paper-darker: #cedee7; + --border: #b3cad8; + --accent: #d26a2b; + --cool: #0f6f9e; + } + + body { + background: + radial-gradient(circle at 15% 0%, #f8fbfd 0%, transparent 50%), + linear-gradient(180deg, #edf5f9 0%, #e2edf3 40%, #d8e6ee 100%); + } + + .app { + max-width: 100%; + padding: 0.8rem 0.75rem calc(5.8rem + env(safe-area-inset-bottom, 0px)); + } + + .masthead { + border: none; + margin-bottom: 0.7rem; + padding: 0; + display: block; + } + + .masthead h1 { + font-size: 1.35rem; + letter-spacing: -0.2px; + margin-bottom: 0.45rem; + } + + .search-wrap { + position: sticky; + top: 0; + z-index: 180; + background: rgba(238, 245, 248, 0.92); + backdrop-filter: blur(4px); + padding: 0.35rem 0 0.55rem; + margin-bottom: 0.95rem; + } + + .search-row { + grid-template-columns: 1fr 56px 72px; + gap: 0.35rem; + } + + .search-row input, + .search-row button { + border-radius: 10px; + border: 1px solid var(--border); + } + + .search-row input { + font-size: 0.95rem; + background: rgba(255, 255, 255, 0.76); + } + + #search-btn { + grid-column: 1 / -1; + order: 4; + background: linear-gradient(180deg, #12364d 0%, #0d2a3d 100%); + color: #eef6fa; + border-color: #0d2a3d; + letter-spacing: 0.06em; + } + + #locate-btn { + order: 2; + font-size: 1.05rem !important; + background: #e6f0f5 !important; + } + + #units-btn { + order: 3; + background: #e6f0f5 !important; + } + + .tab-panel { + animation: fade-in 0.2s ease-out; + } + + .loc-header, + .current-grid, + .stats-bar, + .astro-grid, + .aq-grid, + .radar-embed-wrap, + .daily-list, + .maps-wrap, + .alerts-wrap, + .settings-wrap, + .panel-note { + border-radius: 14px; + overflow: hidden; + box-shadow: 0 8px 18px rgba(16, 35, 49, 0.08); + border: 1px solid rgba(179, 202, 216, 0.92); + } + + .loc-header { + padding: 0.7rem 0.8rem; + background: rgba(255, 255, 255, 0.72); + margin-bottom: 0.8rem; + } + + .loc-name { + font-size: 1.25rem; + line-height: 1.15; + } + + .section-head { + margin-top: 0.25rem; + margin-bottom: 0.45rem; + } + + .section-label { + color: #446072; + letter-spacing: 0.1em; + } + + .current-grid { + background: transparent; + border: none; + gap: 0.55rem; + margin-bottom: 0.65rem; + box-shadow: none; + } + + .current-grid > * { + border-radius: 14px; + border: 1px solid var(--border); + background: rgba(255, 255, 255, 0.84); + padding: 0.95rem 0.85rem; + } + + .temp-big { + font-size: 3.1rem; + line-height: 0.95; + letter-spacing: -1.2px; + } + + .deg { + font-size: 1.2rem; + } + + .stats-bar { + gap: 0.45rem; + background: transparent; + border: none; + box-shadow: none; + } + + .stat { + border: 1px solid var(--border); + border-radius: 12px; + background: rgba(255, 255, 255, 0.82); + } + + .astro-grid, + .aq-grid { + gap: 0.45rem; + background: transparent; + border: none; + box-shadow: none; + } + + .astro-card, + .aq-card { + border: 1px solid var(--border); + border-radius: 12px; + background: rgba(255, 255, 255, 0.82); + padding: 0.72rem 0.7rem; + } + + .radar-map, + .map-overview { + height: 210px; + } + + .radar-controls { + background: rgba(207, 224, 234, 0.9); + } + + .hourly-scroll { + border-radius: 12px; + border: 1px solid var(--border); + background: rgba(255, 255, 255, 0.82); + } + + .hour-cell { + min-width: 62px; + background: transparent; + } + + .hour-cell.now { + background: rgba(15, 111, 158, 0.12); + } + + .daily-list { + background: rgba(255, 255, 255, 0.82); + } + + .day-row { + border-bottom: 1px solid rgba(179, 202, 216, 0.92); + } + + .maps-wrap, + .alerts-wrap, + .settings-wrap, + .panel-note { + background: rgba(255, 255, 255, 0.8); + } + + .settings-row { + border-radius: 10px; + } + + .tabs { + position: fixed; + left: 0; + right: 0; + bottom: 0; + z-index: 220; + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + border: none; + border-top: 1px solid rgba(94, 126, 145, 0.4); + background: rgba(10, 35, 51, 0.94); + backdrop-filter: blur(10px); + padding: 0.28rem 0.25rem calc(0.2rem + env(safe-area-inset-bottom, 0px)); + } + + .tab { + border: none; + color: #bfd0da; + min-height: 46px; + font-size: 0.55rem; + letter-spacing: 0.02em; + border-radius: 10px; + text-transform: none; + line-height: 1.15; + padding: 0.2rem 0.25rem; + } + + .tab:hover { + background: rgba(255, 255, 255, 0.08); + color: #eef6fa; + } + + .tab.active { + background: rgba(210, 106, 43, 0.94); + color: #fff; + } + + .footer-note { + padding-bottom: 0.2rem; + } +} + +@media (min-width: 769px) { + .tabs { + position: static; + background: transparent; + } +} + +@keyframes fade-in { + from { opacity: 0; transform: translateY(4px); } + to { opacity: 1; transform: translateY(0); } +} From 11f2769d7f98c9893bfa5c79ae8e8a49255cfbe6 Mon Sep 17 00:00:00 2001 From: Nate Date: Mon, 16 Mar 2026 14:09:48 -0400 Subject: [PATCH 2/7] Tune mobile-first redesign for iPhone Safari and narrow Android screens --- app/public/style.css | 46 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/app/public/style.css b/app/public/style.css index f75983b..0ed10f9 100644 --- a/app/public/style.css +++ b/app/public/style.css @@ -1039,7 +1039,7 @@ select:focus-visible { .search-wrap { position: sticky; - top: 0; + top: env(safe-area-inset-top, 0px); z-index: 180; background: rgba(238, 245, 248, 0.92); backdrop-filter: blur(4px); @@ -1184,6 +1184,11 @@ select:focus-visible { height: 210px; } + .radar-map-full { + height: calc(100dvh - 18.5rem); + min-height: 300px; + } + .radar-controls { background: rgba(207, 224, 234, 0.9); } @@ -1262,6 +1267,45 @@ select:focus-visible { .footer-note { padding-bottom: 0.2rem; } + + .tab-panel { + min-height: calc(100dvh - 9rem); + } +} + +@media (max-width: 480px) { + .tabs { + display: flex; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + gap: 0.35rem; + padding-left: 0.35rem; + padding-right: 0.35rem; + scroll-snap-type: x proximity; + } + + .tab { + flex: 0 0 auto; + min-width: 82px; + font-size: 0.62rem; + scroll-snap-align: start; + } +} + +/* iPhone Safari tuning: avoid form zoom and preserve safe-area readability. */ +@supports (-webkit-touch-callout: none) { + @media (max-width: 768px) { + .search-row input, + .search-row button, + .maps-control select, + .settings-btn { + font-size: 16px; + } + + .app { + padding-bottom: calc(6.1rem + env(safe-area-inset-bottom, 0px)); + } + } } @media (min-width: 769px) { From 9bf83d44aadb244ef152213ecf7608a03c1cd4ba Mon Sep 17 00:00:00 2001 From: Nate Date: Mon, 16 Mar 2026 14:15:10 -0400 Subject: [PATCH 3/7] Add tab icons, fix mobile nav overflow, and soften card styling --- app/public/index.html | 25 ++++++++++--- app/public/style.css | 83 ++++++++++++++++++++++++++++++------------- 2 files changed, 78 insertions(+), 30 deletions(-) diff --git a/app/public/index.html b/app/public/index.html index 46ea61f..80d2884 100644 --- a/app/public/index.html +++ b/app/public/index.html @@ -23,11 +23,26 @@

Weather

Open-Meteo · RainViewer
diff --git a/app/public/style.css b/app/public/style.css index 0ed10f9..e6f331c 100644 --- a/app/public/style.css +++ b/app/public/style.css @@ -94,6 +94,16 @@ a:hover { text-decoration: underline; } transition: background 0.15s, color 0.15s; } +.tab-icon { + font-size: 0.82rem; + line-height: 1; + margin-right: 0.35rem; +} + +.tab-text { + line-height: 1; +} + .tab:last-child { border-right: none; } .tab:hover { background: var(--paper-dark); color: var(--ink); } .tab.active { background: var(--ink); color: var(--paper); } @@ -1011,6 +1021,8 @@ select:focus-visible { --border: #b3cad8; --accent: #d26a2b; --cool: #0f6f9e; + --card-bg: rgba(255, 255, 255, 0.76); + --card-stroke: rgba(179, 202, 216, 0.55); } body { @@ -1100,13 +1112,13 @@ select:focus-visible { .panel-note { border-radius: 14px; overflow: hidden; - box-shadow: 0 8px 18px rgba(16, 35, 49, 0.08); - border: 1px solid rgba(179, 202, 216, 0.92); + box-shadow: 0 8px 20px rgba(16, 35, 49, 0.07); + border: 1px solid var(--card-stroke); } .loc-header { padding: 0.7rem 0.8rem; - background: rgba(255, 255, 255, 0.72); + background: var(--card-bg); margin-bottom: 0.8rem; } @@ -1135,8 +1147,8 @@ select:focus-visible { .current-grid > * { border-radius: 14px; - border: 1px solid var(--border); - background: rgba(255, 255, 255, 0.84); + border: 1px solid var(--card-stroke); + background: var(--card-bg); padding: 0.95rem 0.85rem; } @@ -1158,9 +1170,9 @@ select:focus-visible { } .stat { - border: 1px solid var(--border); + border: 1px solid var(--card-stroke); border-radius: 12px; - background: rgba(255, 255, 255, 0.82); + background: var(--card-bg); } .astro-grid, @@ -1173,9 +1185,9 @@ select:focus-visible { .astro-card, .aq-card { - border: 1px solid var(--border); + border: 1px solid var(--card-stroke); border-radius: 12px; - background: rgba(255, 255, 255, 0.82); + background: var(--card-bg); padding: 0.72rem 0.7rem; } @@ -1195,8 +1207,8 @@ select:focus-visible { .hourly-scroll { border-radius: 12px; - border: 1px solid var(--border); - background: rgba(255, 255, 255, 0.82); + border: 1px solid var(--card-stroke); + background: var(--card-bg); } .hour-cell { @@ -1209,7 +1221,7 @@ select:focus-visible { } .daily-list { - background: rgba(255, 255, 255, 0.82); + background: var(--card-bg); } .day-row { @@ -1220,7 +1232,7 @@ select:focus-visible { .alerts-wrap, .settings-wrap, .panel-note { - background: rgba(255, 255, 255, 0.8); + background: var(--card-bg); } .settings-row { @@ -1240,6 +1252,7 @@ select:focus-visible { background: rgba(10, 35, 51, 0.94); backdrop-filter: blur(10px); padding: 0.28rem 0.25rem calc(0.2rem + env(safe-area-inset-bottom, 0px)); + overflow: hidden; } .tab { @@ -1250,8 +1263,23 @@ select:focus-visible { letter-spacing: 0.02em; border-radius: 10px; text-transform: none; - line-height: 1.15; + line-height: 1.05; padding: 0.2rem 0.25rem; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 0.18rem; + } + + .tab-icon { + margin-right: 0; + font-size: 0.9rem; + } + + .tab-text { + font-size: 0.56rem; + letter-spacing: 0.02em; } .tab:hover { @@ -1275,20 +1303,25 @@ select:focus-visible { @media (max-width: 480px) { .tabs { - display: flex; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - gap: 0.35rem; - padding-left: 0.35rem; - padding-right: 0.35rem; - scroll-snap-type: x proximity; + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 0.22rem; + padding-left: 0.2rem; + padding-right: 0.2rem; } .tab { - flex: 0 0 auto; - min-width: 82px; - font-size: 0.62rem; - scroll-snap-align: start; + min-width: 0; + border-radius: 8px; + padding: 0.2rem 0.12rem; + } + + .tab-icon { + font-size: 0.84rem; + } + + .tab-text { + font-size: 0.52rem; } } From 78c7e8a9a9cb370f3689a803cd366e2773cb0338 Mon Sep 17 00:00:00 2001 From: Nate Date: Mon, 16 Mar 2026 14:22:41 -0400 Subject: [PATCH 4/7] Complete mobile-first UI overhaul with larger typography and touch-first layout --- app/public/style.css | 1989 +++++++++++++++++------------------------- 1 file changed, 780 insertions(+), 1209 deletions(-) diff --git a/app/public/style.css b/app/public/style.css index e6f331c..71aada0 100644 --- a/app/public/style.css +++ b/app/public/style.css @@ -1,30 +1,38 @@ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { - --ink: #1a1a1a; - --ink-mid: #555; - --ink-light: #999; - --paper: #f5f2ec; - --paper-dark: #ece7db; - --paper-darker: #ddd6c7; - --border: #c8bfaf; - --accent: #c25a2a; - --cool: #2a6b8a; - --mono: 'DM Mono', monospace; + --ink: #122637; + --ink-mid: #3a5a70; + --ink-light: #668398; + --paper: #eaf3f8; + --paper-deep: #dce9f1; + --card: rgba(255, 255, 255, 0.78); + --card-strong: rgba(255, 255, 255, 0.9); + --border: rgba(129, 167, 191, 0.42); + --accent: #e07234; + --accent-strong: #cc5c1d; + --cool: #1275a7; + --radius: 16px; + --radius-sm: 12px; + --shadow: 0 10px 30px rgba(13, 41, 58, 0.12); + --mono: 'DM Mono', ui-monospace, SFMono-Regular, Menlo, monospace; --serif: 'Playfair Display', Georgia, serif; } @media (prefers-color-scheme: dark) { :root { - --ink: #ece7dc; - --ink-mid: #a09880; - --ink-light: #6a6258; - --paper: #191510; - --paper-dark: #201c16; - --paper-darker: #2b2620; - --border: #3a342a; - --accent: #e07848; - --cool: #5ab0d8; + --ink: #ecf4f9; + --ink-mid: #b0c4d2; + --ink-light: #8ea6b8; + --paper: #0d1822; + --paper-deep: #122331; + --card: rgba(25, 42, 56, 0.8); + --card-strong: rgba(30, 49, 64, 0.9); + --border: rgba(121, 158, 182, 0.38); + --accent: #f28a4f; + --accent-strong: #df7438; + --cool: #5bb7e3; + --shadow: 0 10px 30px rgba(0, 0, 0, 0.35); } } @@ -33,204 +41,639 @@ html, body { background: var(--paper); color: var(--ink); font-family: var(--mono); - font-size: 14px; - line-height: 1.6; + font-size: 16px; + line-height: 1.45; overflow-x: hidden; } +body { + background: + radial-gradient(circle at 10% -10%, rgba(255, 255, 255, 0.8) 0%, transparent 45%), + radial-gradient(circle at 100% 0%, rgba(136, 197, 228, 0.24) 0%, transparent 40%), + linear-gradient(180deg, var(--paper) 0%, var(--paper-deep) 100%); +} + .app { - max-width: 900px; - margin: 0 auto; - padding: 2rem 1.5rem 4rem; + width: 100%; + max-width: 100%; + padding: calc(0.65rem + env(safe-area-inset-top, 0px)) 0.7rem calc(6.2rem + env(safe-area-inset-bottom, 0px)); } a { color: var(--cool); text-decoration: none; } a:hover { text-decoration: underline; } +.hidden { display: none !important; } -/* ── Masthead ── */ +/* Top */ .masthead { display: grid; - grid-template-columns: auto 1fr auto; - align-items: center; - gap: 1.5rem; - border-bottom: 1.5px solid var(--ink); - padding-bottom: 0.6rem; - margin-bottom: 1.5rem; + grid-template-columns: 1fr; + gap: 0.55rem; + margin-bottom: 0.6rem; } .masthead h1 { font-family: var(--serif); - font-size: 2.2rem; - font-weight: 400; - letter-spacing: -0.5px; + font-size: 1.5rem; + letter-spacing: -0.2px; } .tagline { - font-size: 0.62rem; - letter-spacing: 0.12em; + font-size: 0.72rem; color: var(--ink-light); - text-transform: uppercase; - white-space: nowrap; + letter-spacing: 0.04em; } -/* ── Tabs ── */ +/* Tabs */ .tabs { - display: flex; - gap: 0; - border: 1px solid var(--border); + position: fixed; + left: 0; + right: 0; + bottom: 0; + z-index: 260; + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 0.2rem; + padding: 0.35rem 0.28rem calc(0.38rem + env(safe-area-inset-bottom, 0px)); + background: rgba(8, 24, 35, 0.9); + backdrop-filter: blur(12px); + border-top: 1px solid rgba(124, 160, 181, 0.35); } .tab { - background: transparent; border: none; - border-right: 1px solid var(--border); - padding: 0.4rem 1rem; + border-radius: 10px; + min-width: 0; + min-height: 50px; + padding: 0.35rem 0.15rem; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 0.24rem; font-family: var(--mono); - font-size: 0.72rem; - letter-spacing: 0.08em; - text-transform: uppercase; - color: var(--ink-mid); + color: #c9dce8; + background: rgba(255, 255, 255, 0.03); cursor: pointer; - transition: background 0.15s, color 0.15s; } .tab-icon { - font-size: 0.82rem; + font-size: 1.05rem; line-height: 1; - margin-right: 0.35rem; + display: inline-flex; } .tab-text { + font-size: 0.64rem; line-height: 1; + letter-spacing: 0.02em; } -.tab:last-child { border-right: none; } -.tab:hover { background: var(--paper-dark); color: var(--ink); } -.tab.active { background: var(--ink); color: var(--paper); } +.tab.active { + color: #fff; + background: linear-gradient(180deg, var(--accent) 0%, var(--accent-strong) 100%); +} + +.tab:hover { color: #fff; } + +/* Shared controls */ +button, input, select { + font-family: var(--mono); +} -/* ── Search ── */ .search-wrap { - position: relative; - margin-bottom: 2rem; + position: sticky; + top: env(safe-area-inset-top, 0px); + z-index: 220; + background: linear-gradient(180deg, rgba(234, 243, 248, 0.95) 0%, rgba(234, 243, 248, 0.84) 100%); + backdrop-filter: blur(6px); + padding: 0.35rem 0 0.55rem; + margin-bottom: 0.7rem; } -.search-row { display: flex; } +.search-row { + display: grid; + grid-template-columns: 1fr 58px 74px; + gap: 0.4rem; +} + +.search-row input, +.search-row button, +.maps-control select, +.settings-btn { + font-size: 16px; /* prevent iOS zoom */ +} .search-row input { - flex: 1; - background: var(--paper-dark); + grid-column: 1 / -1; border: 1px solid var(--border); - border-right: none; - padding: 0.6rem 1rem; - font-family: var(--mono); - font-size: 0.85rem; + border-radius: 12px; + background: var(--card-strong); color: var(--ink); - outline: none; - border-radius: 0; - transition: background 0.15s; + min-height: 50px; + padding: 0 0.85rem; } -.search-row input::placeholder { color: var(--ink-light); } -.search-row input:focus { background: var(--paper-darker); } - .search-row button { - background: var(--ink); - color: var(--paper); - border: 1px solid var(--ink); - padding: 0.6rem 1.1rem; - font-family: var(--mono); - font-size: 0.75rem; + min-height: 48px; + border-radius: 12px; + border: 1px solid var(--border); + cursor: pointer; +} + +#search-btn { + grid-column: 1 / -1; + background: linear-gradient(180deg, #17425d 0%, #113247 100%); + color: #f1f8fc; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +#locate-btn, +#units-btn { + background: var(--card-strong) !important; + color: var(--ink) !important; +} + +#locate-btn { font-size: 1.15rem !important; } + +.suggestions { + list-style: none; + border: 1px solid var(--border); + border-radius: 12px; + margin-top: 0.25rem; + overflow: hidden; + background: var(--card-strong); + box-shadow: var(--shadow); +} + +.suggestions li { + padding: 0.65rem 0.75rem; + border-bottom: 1px solid var(--border); + font-size: 0.88rem; + cursor: pointer; +} + +.suggestions li:last-child { border-bottom: none; } +.suggestions li:hover { background: rgba(18, 117, 167, 0.08); } +.sug-country { color: var(--ink-light); margin-left: 0.4rem; font-size: 0.8rem; } + +.error { + margin-top: 0.35rem; + color: #c34722; + font-size: 0.84rem; +} + +.loading { + display: flex; + align-items: center; + gap: 0.6rem; + color: var(--ink-mid); + font-size: 0.84rem; + padding: 1.2rem 0.3rem; +} + +.loading-dot { + width: 9px; + height: 9px; + border-radius: 50%; + background: var(--accent); + animation: pulse 1.1s ease-in-out infinite; +} + +@keyframes pulse { + 0%, 100% { opacity: 0.35; transform: scale(0.9); } + 50% { opacity: 1; transform: scale(1.08); } +} + +.tab-panel { + width: 100%; + min-height: calc(100dvh - 10.5rem); + animation: panel-fade 0.18s ease-out; +} + +@keyframes panel-fade { + from { opacity: 0; transform: translateY(4px); } + to { opacity: 1; transform: translateY(0); } +} + +/* Layout cards */ +.loc-header, +.current-grid, +.stats-bar, +.astro-grid, +.aq-grid, +.radar-embed-wrap, +.radar-full-wrap, +.hourly-scroll, +.daily-list, +.maps-wrap, +.alerts-wrap, +.panel-note, +.settings-wrap { + border: 1px solid var(--border); + border-radius: var(--radius); + background: var(--card); + box-shadow: var(--shadow); +} + +.loc-header { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 0.35rem; + padding: 0.8rem; + margin-bottom: 0.7rem; +} + +.loc-name { + font-family: var(--serif); + font-size: 1.35rem; + line-height: 1.15; +} + +.loc-sub, +.loc-time { + font-size: 0.78rem; + color: var(--ink-light); +} + +.loc-actions { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 0.35rem; +} + +.link-btn { + border: none; + background: none; + color: var(--cool); + padding: 0; + cursor: pointer; + font-size: 0.8rem; +} + +.section-head { + display: flex; + flex-direction: column; + gap: 0.2rem; + margin: 0.25rem 0.45rem 0.45rem; +} + +.section-actions { + display: inline-flex; + flex-wrap: wrap; + gap: 0.55rem; +} + +.section-label { + color: var(--ink-mid); + font-size: 0.72rem; letter-spacing: 0.08em; text-transform: uppercase; - cursor: pointer; - border-radius: 0; - transition: opacity 0.15s; - white-space: nowrap; } -.search-row button:hover { opacity: 0.72; } - -#locate-btn { - background: var(--paper-dark) !important; - color: var(--ink) !important; - border-left: none !important; - font-size: 1.2rem !important; - letter-spacing: 0 !important; - padding: 0.6rem 0.9rem !important; +.section-note { + color: var(--ink-light); + font-size: 0.76rem; } -#units-btn { - background: var(--paper-dark) !important; - color: var(--ink) !important; - border-left: none !important; - min-width: 76px; +.current-grid { + display: grid; + gap: 0.5rem; + border: none; + background: transparent; + box-shadow: none; + margin-bottom: 0.6rem; } -.saved-wrap { margin-top: 0.6rem; } -.saved-head { - display: flex; - justify-content: space-between; - align-items: center; +.current-grid > * { + border: 1px solid var(--border); + border-radius: var(--radius-sm); + background: var(--card-strong); + padding: 0.9rem 0.8rem; +} + +.temp-big { + font-family: var(--serif); + font-size: 3.35rem; + letter-spacing: -1.5px; + line-height: 0.95; +} + +.deg { + font-size: 1.25rem; + color: var(--ink-mid); + vertical-align: super; +} + +.feels, +.hi-lo, +.cond-sub { + font-size: 0.8rem; + color: var(--ink-mid); +} + +.current-cond { display: flex; flex-direction: column; justify-content: center; } +.cond-icon { font-size: 2rem; } +.cond-desc { font-size: 1.02rem; font-weight: 500; } + +.stats-bar { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.45rem; + border: none; + background: transparent; + box-shadow: none; + margin-bottom: 0.8rem; +} + +.stat, +.astro-card, +.aq-card, +.maps-card, +.settings-row, +.alert-item { + border: 1px solid var(--border); + border-radius: var(--radius-sm); + background: var(--card-strong); +} + +.stat { + padding: 0.7rem 0.55rem; + text-align: center; +} + +.stat-label { font-size: 0.62rem; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-light); + margin-bottom: 0.2rem; +} + +.stat-val { font-size: 0.95rem; font-weight: 500; } +.unit { font-size: 0.68rem; color: var(--ink-mid); } + +.astro-grid, +.aq-grid { + display: grid; + gap: 0.45rem; + border: none; + background: transparent; + box-shadow: none; + margin-bottom: 0.75rem; +} + +.astro-card, +.aq-card, +.maps-card { + padding: 0.68rem 0.65rem; +} + +.astro-val, +.aq-val, +.maps-value { + font-size: 0.95rem; + font-weight: 500; +} + +.radar-embed-wrap, +.radar-full-wrap, +.maps-wrap, +.alerts-wrap, +.settings-wrap { + padding: 0.65rem; + margin-bottom: 0.8rem; +} + +.radar-map, +.map-overview { + width: 100%; + height: 220px; + border-radius: 12px; + overflow: hidden; + border: 1px solid var(--border); +} + +.radar-map-full { + height: calc(100dvh - 20rem); + min-height: 300px; +} + +.radar-controls { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.45rem; + margin-top: 0.55rem; +} + +.radar-btn { + width: 44px; + height: 44px; + border: none; + border-radius: 10px; + background: #0f3248; + color: #f2f8fb; + cursor: pointer; +} + +.layer-btn { background: var(--accent); } + +.radar-timeline { + order: 3; + flex-basis: 100%; + height: 30px; + display: flex; + gap: 2px; +} + +.tl-tick { + flex: 1; + border-radius: 5px; + border: 1px solid var(--border); + background: rgba(255, 255, 255, 0.5); + cursor: pointer; +} + +.tl-tick.active { background: var(--cool); border-color: var(--cool); } +.tl-tick.forecast { opacity: 0.55; } + +.radar-ts { + color: var(--ink-mid); + font-size: 0.72rem; +} + +.radar-legend { display: inline-flex; align-items: center; gap: 0.35rem; } +.legend-label { font-size: 0.62rem; color: var(--ink-light); } +.legend-bar { + width: 74px; + height: 9px; + border-radius: 999px; + border: 1px solid var(--border); + background: linear-gradient(to right, #00d8ff, #00a0e0, #0070d0, #00c800, #ffff00, #ff6000, #ff0000); +} + +.radar-attribution, +.footer-note { + font-size: 0.72rem; + color: var(--ink-light); + margin-bottom: 0.7rem; +} + +.hourly-summary { + margin: 0.2rem 0.35rem 0.4rem; + color: var(--ink-mid); + font-size: 0.78rem; +} + +.hourly-scroll { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + margin-bottom: 0.8rem; + padding: 0.35rem; +} + +.hourly-track { display: flex; min-width: max-content; } + +.hour-cell { + min-width: 74px; + text-align: center; + padding: 0.65rem 0.35rem; + border-radius: 10px; + margin-right: 0.25rem; + border: 1px solid var(--border); + background: var(--card-strong); +} + +.hour-cell.now { background: rgba(18, 117, 167, 0.14); } +.hour-time { font-size: 0.66rem; color: var(--ink-light); margin-bottom: 0.25rem; } +.hour-icon { font-size: 1.2rem; margin-bottom: 0.18rem; } +.hour-temp { font-size: 0.92rem; font-weight: 600; } +.hour-feels, +.hour-precip { font-size: 0.64rem; color: var(--ink-mid); } + +.daily-list { + padding: 0.35rem; + margin-bottom: 0.8rem; +} + +.day-row { + display: grid; + grid-template-columns: 1fr auto; + grid-template-areas: + 'name temps' + 'desc desc'; + gap: 0.2rem 0.5rem; + padding: 0.6rem; + border-radius: 10px; + border: 1px solid var(--border); + background: var(--card-strong); + margin-bottom: 0.3rem; +} + +.day-row:last-child { margin-bottom: 0; } +.day-row.today { outline: 1px solid rgba(18, 117, 167, 0.35); } +.day-name { grid-area: name; font-size: 0.82rem; font-weight: 600; } +.day-icon { display: none; } +.day-desc { + grid-area: desc; + font-size: 0.74rem; + color: var(--ink-mid); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.day-temps { grid-area: temps; font-size: 0.8rem; font-weight: 600; } +.day-lo { color: var(--ink-light); } +.day-meta { display: none; } + +.panel-note { + padding: 0.7rem; + font-size: 0.78rem; + color: var(--ink-mid); +} + +.alerts-list, +.saved-locations, +.maps-controls, +.maps-meta { + display: grid; + gap: 0.45rem; +} + +.alert-item { + padding: 0.65rem; + display: grid; + gap: 0.2rem; + font-size: 0.78rem; +} + +.maps-control { + display: grid; + gap: 0.3rem; + font-size: 0.66rem; + letter-spacing: 0.05em; + text-transform: uppercase; + color: var(--ink-light); +} + +.maps-control input, +.maps-control select, +.settings-btn { + border: 1px solid var(--border); + background: var(--card-strong); + color: var(--ink); + border-radius: 10px; + min-height: 42px; + padding: 0.4rem 0.55rem; +} + +.wind-legend { + margin-top: 0.5rem; + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 0.4rem; + color: var(--ink-light); + font-size: 0.68rem; +} + +.wind-legend-scale { + width: 120px; + height: 10px; + border: 1px solid var(--border); + border-radius: 999px; + background: linear-gradient(to right, #d2f0ff, #84ccff, #3f9fff, #1879df); +} + +.saved-wrap { margin-top: 0.2rem; } +.saved-head { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 0.28rem; + margin-bottom: 0.3rem; + color: var(--ink-light); + text-transform: uppercase; + font-size: 0.66rem; + letter-spacing: 0.07em; +} + +.saved-help { + font-size: 0.72rem; + color: var(--ink-light); margin-bottom: 0.35rem; } -.saved-locations { - display: grid; - gap: 0.35rem; - font-size: 0.72rem; - color: var(--ink-mid); -} - -.saved-help { - font-size: 0.62rem; - color: var(--ink-light); - margin-bottom: 0.45rem; -} - -.auto-detect-toggle { - display: inline-flex; - align-items: center; - gap: 0.45rem; - margin-bottom: 0.45rem; - font-size: 0.68rem; - color: var(--ink-mid); - cursor: pointer; - user-select: none; -} - -.auto-detect-toggle input { - accent-color: var(--accent); -} - -.toggle-label { - display: inline-flex; - align-items: center; - gap: 0.45rem; - margin-bottom: 0.45rem; - font-size: 0.68rem; - color: var(--ink-mid); - cursor: pointer; - user-select: none; -} - -.toggle-label input { - accent-color: var(--accent); -} - -.toggle-label span { - min-width: 24px; -} - .saved-item { display: grid; - grid-template-columns: 28px 1fr 28px 28px 28px auto; - align-items: center; + grid-template-columns: 34px 1fr 34px 34px 34px; border: 1px solid var(--border); - background: var(--paper-dark); + border-radius: 10px; + background: var(--card-strong); + overflow: hidden; } .saved-chip, @@ -240,582 +683,59 @@ a:hover { text-decoration: underline; } border: none; background: transparent; color: var(--ink); - padding: 0.35rem 0.45rem; - font-family: var(--mono); cursor: pointer; + min-height: 42px; } .saved-chip { text-align: left; + padding: 0 0.55rem; border-left: 1px solid var(--border); border-right: 1px solid var(--border); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .saved-default { color: var(--accent); } - +.saved-remove { color: var(--ink-light); border-right: 1px solid var(--border); } .saved-move { border-right: 1px solid var(--border); } .saved-move:disabled { opacity: 0.35; cursor: not-allowed; } - -.saved-remove { - border-right: 1px solid var(--border); - color: var(--ink-light); -} - -.saved-meta { - padding: 0 0.55rem; - font-size: 0.6rem; - color: var(--ink-light); -} - -/* Suggestions */ -.suggestions { - position: absolute; - top: 100%; - left: 0; right: 0; - background: var(--paper-darker); - border: 1px solid var(--border); - border-top: none; - z-index: 200; - list-style: none; -} - -.suggestions li { - padding: 0.6rem 1rem; - cursor: pointer; - font-size: 0.82rem; - border-bottom: 0.5px solid var(--border); - transition: background 0.1s; -} - -.suggestions li:last-child { border-bottom: none; } -.suggestions li:hover { background: var(--paper-dark); } -.sug-country { color: var(--ink-light); margin-left: 0.5rem; font-size: 0.75rem; } - -/* ── Error / Loading ── */ -.error { font-size: 0.78rem; color: var(--accent); margin-top: 0.5rem; } - -.loading { - display: flex; - align-items: center; - gap: 0.75rem; - padding: 3rem 0; - font-size: 0.78rem; - color: var(--ink-light); - letter-spacing: 0.08em; -} - -.loading-dot { - width: 6px; height: 6px; - border-radius: 50%; - background: var(--ink-light); - animation: pulse 1.2s ease-in-out infinite; -} - -@keyframes pulse { 0%,100%{opacity:.2} 50%{opacity:1} } - -.hidden { display: none !important; } - -/* ── Tab panels ── */ -.tab-panel { width: 100%; } - -/* ── Location header ── */ -.loc-header { - display: flex; - justify-content: space-between; - align-items: flex-end; - margin-bottom: 1.5rem; - padding-bottom: 0.6rem; - border-bottom: 0.5px solid var(--border); -} - -.loc-name { font-family: var(--serif); font-size: 1.6rem; font-weight: 400; line-height: 1.1; } -.loc-sub { font-size: 0.68rem; color: var(--ink-light); letter-spacing: 0.06em; margin-top: 0.2rem; text-transform: uppercase; } -.loc-time { font-size: 0.68rem; color: var(--ink-light); text-align: right; letter-spacing: 0.04em; line-height: 1.5; } -.loc-actions { display: flex; flex-direction: column; align-items: flex-end; gap: 0.35rem; } - -/* ── Current hero ── */ -.current-grid { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 1px; - background: var(--border); - border: 1px solid var(--border); - margin-bottom: 1px; -} - -.current-grid > * { background: var(--paper); padding: 1.75rem 1.5rem; } - -.temp-big { - font-family: var(--serif); - font-size: 5.5rem; - font-weight: 400; - line-height: 1; - letter-spacing: -3px; -} - -.deg { font-family: var(--mono); font-size: 1.6rem; color: var(--ink-mid); vertical-align: super; letter-spacing: 0; } -.feels { font-size: 0.72rem; color: var(--ink-mid); margin-top: 0.5rem; } -.hi-lo { font-size: 0.72rem; color: var(--ink-mid); margin-top: 0.2rem; } - -.current-cond { display: flex; flex-direction: column; justify-content: center; } -.cond-icon { font-size: 2.8rem; margin-bottom: 0.4rem; line-height: 1; } -.cond-desc { font-size: 1rem; font-weight: 500; } -.cond-sub { font-size: 0.72rem; color: var(--ink-mid); margin-top: 0.3rem; } - -/* ── Stats bar ── */ -.stats-bar { - display: grid; - grid-template-columns: repeat(6, 1fr); - gap: 1px; - background: var(--border); - border: 1px solid var(--border); - border-top: none; - margin-bottom: 2rem; -} - -.astro-grid, -.aq-grid { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 1px; - background: var(--border); - border: 1px solid var(--border); - margin-bottom: 1rem; -} - -.astro-card, -.aq-card { - background: var(--paper-dark); - padding: 0.85rem 0.75rem; -} - -.astro-val, -.aq-val { - font-size: 0.95rem; - font-weight: 500; -} - -.alerts-wrap { - border: 1px solid var(--border); - padding: 0.75rem; - margin-bottom: 1.2rem; - background: var(--paper-dark); -} - -.alerts-list { - display: grid; - gap: 0.5rem; -} - -.alert-item { - display: grid; - gap: 0.2rem; - border: 1px solid var(--border); - padding: 0.55rem; - background: var(--paper); - font-size: 0.72rem; -} - -.panel-note { - font-size: 0.72rem; - color: var(--ink-light); - border: 1px solid var(--border); - padding: 0.75rem; - background: var(--paper-dark); -} +.saved-meta { display: none; } .settings-wrap { - border: 1px solid var(--border); - background: var(--paper-dark); - padding: 0.9rem; display: grid; - gap: 1rem; + gap: 0.6rem; } .settings-row { + padding: 0.65rem; display: flex; - align-items: center; - justify-content: space-between; - border: 1px solid var(--border); - background: var(--paper); - padding: 0.65rem 0.75rem; + flex-direction: column; + align-items: flex-start; + gap: 0.4rem; } .settings-label { - font-size: 0.72rem; - color: var(--ink-mid); - text-transform: uppercase; - letter-spacing: 0.08em; -} - -.settings-value { - font-size: 0.8rem; - color: var(--ink); - text-align: right; -} - -.settings-btn { - border: 1px solid var(--border); - background: var(--paper-darker); - color: var(--ink); - padding: 0.45rem 0.7rem; - font-family: var(--mono); - font-size: 0.72rem; - cursor: pointer; -} - -.settings-btn:hover { background: var(--paper-dark); } - -.maps-wrap { - border: 1px solid var(--border); - background: var(--paper-dark); - padding: 0.75rem; -} - -.map-overview { - height: 360px; - border: 1px solid var(--border); -} - -.maps-controls { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 0.75rem; - margin-top: 0.75rem; -} - -.maps-control { - display: grid; - gap: 0.35rem; - font-size: 0.66rem; - color: var(--ink-mid); - text-transform: uppercase; - letter-spacing: 0.06em; -} - -.maps-control input, -.maps-control select { - width: 100%; - border: 1px solid var(--border); - background: var(--paper); - color: var(--ink); - font-family: var(--mono); - font-size: 0.72rem; - padding: 0.35rem 0.45rem; -} - -.maps-meta { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 1px; - margin-top: 0.75rem; - background: var(--border); - border: 1px solid var(--border); -} - -.maps-card { - background: var(--paper); - padding: 0.7rem; -} - -.maps-value { - font-size: 0.85rem; - color: var(--ink); -} - -.wind-legend { - display: flex; - align-items: center; - gap: 0.55rem; - font-size: 0.62rem; - color: var(--ink-light); - margin-top: 0.6rem; -} - -.wind-legend-scale { - width: 120px; - height: 8px; - border: 1px solid var(--border); - background: linear-gradient(to right, #d2f0ff, #84ccff, #3f9fff, #1879df); -} - -.stat { background: var(--paper-dark); padding: 0.9rem 0.75rem; text-align: center; } -.stat-label { font-size: 0.58rem; letter-spacing: 0.1em; color: var(--ink-light); text-transform: uppercase; margin-bottom: 0.3rem; } -.stat-val { font-size: 1rem; font-weight: 500; } -.unit { font-size: 0.6rem; color: var(--ink-mid); margin-left: 1px; } - -/* ── Section heads ── */ -.section-head { - display: flex; - justify-content: space-between; - align-items: baseline; - margin-bottom: 0.6rem; -} - -.section-actions { - display: inline-flex; - align-items: center; - gap: 0.6rem; - flex-wrap: wrap; - justify-content: flex-end; -} - -.section-label { font-size: 0.62rem; letter-spacing: 0.14em; color: var(--ink-light); text-transform: uppercase; } -.section-note { font-size: 0.6rem; color: var(--ink-light); font-style: italic; } - -.link-btn { - background: none; - border: none; - font-family: var(--mono); - font-size: 0.6rem; - color: var(--cool); - cursor: pointer; - padding: 0; - font-style: italic; -} - -.link-btn:hover { text-decoration: underline; } - -/* ── Radar maps ── */ -.radar-embed-wrap { - border: 1px solid var(--border); - margin-bottom: 2rem; - background: #1a1f2e; -} - -.radar-map { - width: 100%; - height: 320px; -} - -.radar-map-full { - height: calc(100vh - 280px); - min-height: 420px; -} - -.radar-full-wrap { - border: 1px solid var(--border); - background: #1a1f2e; - margin-bottom: 0.5rem; -} - -/* ── Radar controls ── */ -.radar-controls { - display: flex; - align-items: center; - gap: 0.75rem; - flex-wrap: wrap; - padding: 0.6rem 0.75rem; - background: var(--paper-darker); - border-top: 1px solid var(--border); -} - -.radar-controls-full { padding: 0.75rem 1rem; } - -.radar-btn { - background: var(--ink); - color: var(--paper); - border: none; - width: 28px; height: 28px; - display: flex; align-items: center; justify-content: center; font-size: 0.7rem; - cursor: pointer; - flex-shrink: 0; - transition: opacity 0.15s; -} - -.radar-btn:hover { opacity: 0.72; } -.layer-btn { background: var(--accent); } - -.radar-timeline { - flex: 1; - display: flex; - gap: 2px; - align-items: center; - height: 28px; -} - -.tl-tick { - flex: 1; - height: 100%; - background: var(--paper-dark); - border: 1px solid var(--border); - cursor: pointer; - transition: background 0.1s; - position: relative; -} - -.tl-tick:hover { background: var(--paper); } -.tl-tick.active { background: var(--cool); border-color: var(--cool); } -.tl-tick.forecast { opacity: 0.55; } - -.radar-ts { - font-size: 0.62rem; - color: var(--ink-mid); - letter-spacing: 0.04em; - white-space: nowrap; - min-width: 80px; - text-align: right; - margin-left: auto; -} - -/* Radar legend */ -.radar-legend { - display: flex; - align-items: center; - gap: 0.4rem; - margin-left: 0.5rem; -} - -.legend-label { font-size: 0.58rem; color: var(--ink-light); letter-spacing: 0.06em; } - -.legend-bar { - width: 80px; - height: 8px; - background: linear-gradient(to right, - #00d8ff, #00a0e0, #0070d0, - #00c800, #80e000, #ffff00, - #ffc000, #ff6000, #ff0000, #c00000 - ); - border: 0.5px solid var(--border); -} - -.radar-attribution { - font-size: 0.62rem; - color: var(--ink-light); - padding-top: 0.5rem; -} - -/* ── Hourly scroll ── */ -.hourly-scroll { - overflow-x: auto; - margin-bottom: 2rem; - border: 1px solid var(--border); - scrollbar-width: thin; - scrollbar-color: var(--border) transparent; -} - -.hourly-track { display: flex; min-width: max-content; } - -.hourly-summary { - font-size: 0.68rem; - color: var(--ink-mid); - margin-bottom: 0.45rem; -} - -.hour-cell { - min-width: 72px; - padding: 0.75rem 0.5rem; - text-align: center; - border-right: 0.5px solid var(--border); - background: var(--paper); - transition: background 0.12s; -} - -.hour-cell:last-child { border-right: none; } -.hour-cell:hover { background: var(--paper-dark); } -.hour-cell.now { background: var(--paper-darker); } - -.hour-time { font-size: 0.6rem; color: var(--ink-light); letter-spacing: 0.06em; margin-bottom: 0.35rem; text-transform: uppercase; } -.hour-icon { font-size: 1.4rem; margin-bottom: 0.3rem; } -.hour-temp { font-size: 0.88rem; font-weight: 500; } -.hour-feels { font-size: 0.56rem; color: var(--ink-mid); margin-top: 0.15rem; } -.hour-precip { font-size: 0.6rem; color: var(--cool); margin-top: 0.2rem; } - -/* ── Daily forecast ── */ -.daily-list { - border: 1px solid var(--border); - margin-bottom: 2rem; -} - -.day-row { - display: grid; - grid-template-columns: 120px 44px 1fr 80px 60px; - align-items: center; - gap: 1rem; - padding: 0.85rem 1.1rem; - border-bottom: 0.5px solid var(--border); - transition: background 0.12s; -} - -.day-row:last-child { border-bottom: none; } -.day-row:hover { background: var(--paper-dark); } -.day-row.today { background: var(--paper-dark); } - -.day-name { font-size: 0.8rem; font-weight: 500; } -.day-icon { font-size: 1.5rem; text-align: center; } -.day-desc { font-size: 0.72rem; color: var(--ink-mid); } -.day-temps { text-align: right; font-size: 0.82rem; font-weight: 500; white-space: nowrap; } -.day-lo { color: var(--ink-light); } -.day-meta { text-align: right; font-size: 0.62rem; color: var(--ink-light); line-height: 1.6; } - -#daily-forecast-toggle { - font-size: 0.66rem; - letter-spacing: 0.08em; + letter-spacing: 0.05em; text-transform: uppercase; -} - -/* ── Footer ── */ -.footer-note { - font-size: 0.62rem; color: var(--ink-light); - letter-spacing: 0.04em; - border-top: 0.5px solid var(--border); - padding-top: 0.75rem; } -/* ── PWA: safe area insets (iPhone notch / home bar) ── */ -@supports (padding: env(safe-area-inset-bottom)) { - .app { - padding-left: max(1.5rem, calc(1rem + env(safe-area-inset-left))); - padding-right: max(1.5rem, calc(1rem + env(safe-area-inset-right))); - padding-bottom: max(4rem, calc(2rem + env(safe-area-inset-bottom))); - } - .radar-map-full { - height: calc(100vh - 280px - env(safe-area-inset-top) - env(safe-area-inset-bottom)); - } -} +.settings-value { font-size: 0.85rem; color: var(--ink); } -/* ── PWA: status bar area when running standalone ── */ -@media (display-mode: standalone) { - .masthead { padding-top: env(safe-area-inset-top); } -} - -/* ── Touch-friendly tap targets (min 44 × 44 px) ── */ -.tab { - min-height: 44px; +.auto-detect-toggle, +.toggle-label { display: inline-flex; align-items: center; - justify-content: center; -} -.search-row input, -.search-row button { min-height: 44px; } -.radar-btn { width: 44px; height: 44px; font-size: 0.8rem; } -.tl-tick { min-height: 36px; } - -/* iOS momentum scrolling */ -.hourly-scroll { -webkit-overflow-scrolling: touch; } - -/* ── Leaflet overrides ── */ -.leaflet-container { background: #1a1f2e; } -.leaflet-control-zoom a { - background: var(--paper-dark) !important; - color: var(--ink) !important; - border-color: var(--border) !important; + gap: 0.45rem; + color: var(--ink-mid); + font-size: 0.84rem; } -/* UI polish: strong contrast toggle */ -body.high-contrast { - --ink: #0a0a0a; - --ink-mid: #1f1f1f; - --ink-light: #3b3b3b; - --paper: #ffffff; - --paper-dark: #f2f2f2; - --paper-darker: #e8e8e8; - --border: #111111; - --accent: #a43600; - --cool: #005f8a; -} +.auto-detect-toggle input, +.toggle-label input { accent-color: var(--accent); } button:focus-visible, input:focus-visible, @@ -824,531 +744,182 @@ select:focus-visible { outline-offset: 2px; } -/* ── Responsive ── */ -@media (max-width: 640px) { +/* Leaflet overrides */ +.leaflet-container { background: #1a2430; } +.leaflet-control-zoom a { + background: var(--card-strong) !important; + color: var(--ink) !important; + border-color: var(--border) !important; +} + +/* Accessibility mode */ +body.high-contrast { + --ink: #0b0b0b; + --ink-mid: #222; + --ink-light: #444; + --paper: #fff; + --paper-deep: #f2f2f2; + --card: #fff; + --card-strong: #fff; + --border: #111; + --accent: #aa3300; + --accent-strong: #8a2800; + --cool: #005a82; +} + +/* Desktop enhancements */ +@media (min-width: 900px) { + html, body { font-size: 15px; } + .app { - padding: 1rem 0.8rem max(3.5rem, calc(1.75rem + env(safe-area-inset-bottom, 0px))); + max-width: 1060px; + margin: 0 auto; + padding: 1.4rem 1.25rem 2.2rem; } .masthead { - grid-template-columns: 1fr; - gap: 0.8rem; + display: grid; + grid-template-columns: auto 1fr auto; + align-items: center; + gap: 1rem; margin-bottom: 1rem; } - .masthead h1 { font-size: 1.7rem; } - .tagline { display: none; } - .tabs { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 0; - width: 100%; - } - .tab { - min-width: 0; - min-height: 42px; - font-size: 0.66rem; - padding: 0.35rem 0.25rem; - letter-spacing: 0.05em; - } + .masthead h1 { font-size: 2rem; } - .search-wrap { margin-bottom: 1.25rem; } - .search-row { - display: grid; - grid-template-columns: 1fr 1fr 1fr; - gap: 0.35rem; - } - .search-row input { - grid-column: 1 / -1; - border-right: 1px solid var(--border); - font-size: 0.95rem; - } - .search-row button { - border: 1px solid var(--border); - padding: 0.55rem 0.4rem; - font-size: 0.7rem; - } - #search-btn { - min-width: 0; - width: 100%; - } - #locate-btn, - #units-btn { - border-left: 1px solid var(--border) !important; - min-width: 0; - width: 100%; - padding: 0.55rem 0.4rem !important; - } - - .loc-header { - flex-direction: column; - align-items: flex-start; - gap: 0.45rem; - } - .loc-name { font-size: 1.35rem; } - .loc-actions { align-items: flex-start; } - - .current-grid > * { padding: 1rem 0.85rem; } - .current-grid { grid-template-columns: 1fr; } - .temp-big { - font-size: 3.4rem; - letter-spacing: -1.5px; - } - .cond-icon { font-size: 2.1rem; } - - .stats-bar { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .stat { padding: 0.75rem 0.45rem; } - .stat-val { font-size: 0.9rem; } - .astro-grid, - .aq-grid { grid-template-columns: 1fr; } - - .section-head { - align-items: flex-start; - flex-direction: column; - gap: 0.35rem; - } - .section-actions { justify-content: flex-start; } - - .radar-map { height: 220px; } - .radar-map-full { - height: 52vh; - min-height: 280px; - } - .radar-controls { - gap: 0.5rem; - padding: 0.5rem; - } - .radar-timeline { - order: 3; - width: 100%; - flex-basis: 100%; - } - .radar-ts { - order: 2; - margin-left: 0; - min-width: 0; - text-align: left; - } - - .hour-cell { min-width: 64px; } - .hour-temp { font-size: 0.8rem; } - .hour-time, - .hour-precip, - .hour-feels { font-size: 0.55rem; } - - .day-row { - grid-template-columns: 1fr auto; - grid-template-areas: - 'name temps' - 'desc desc'; - gap: 0.25rem 0.6rem; - padding: 0.65rem 0.7rem; - align-items: start; - } - .day-name { - grid-area: name; - font-size: 0.74rem; - } - .day-icon { display: none; } - .day-desc { - grid-area: desc; - font-size: 0.66rem; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - .day-temps { - grid-area: temps; - font-size: 0.72rem; - } - .day-meta { display: none; } - - .map-overview { height: 250px; } - .maps-controls, - .maps-meta { grid-template-columns: 1fr; } - .wind-legend { - flex-wrap: wrap; - gap: 0.35rem; - } - .legend-bar { width: 56px; } - - .settings-wrap { - padding: 0.65rem; - gap: 0.75rem; - } - .settings-row { - flex-direction: column; - align-items: flex-start; - gap: 0.45rem; - padding: 0.55rem 0.6rem; - } - .settings-value { text-align: left; } - - .saved-head { - align-items: flex-start; - flex-direction: column; - gap: 0.25rem; - } - .saved-item { - grid-template-columns: 28px 1fr 28px 28px 28px; - } - .saved-chip { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - .saved-meta { display: none; } -} - -@media (max-width: 420px) { - .tabs { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .tab { font-size: 0.64rem; } - .loc-name { font-size: 1.2rem; } - .temp-big { font-size: 3rem; } - .stat-label { font-size: 0.54rem; } - .section-label { font-size: 0.58rem; } -} - -/* Mobile-first redesign layer */ -@media (max-width: 768px) { - :root { - --ink: #102331; - --ink-mid: #315064; - --ink-light: #5d7a8b; - --paper: #eef5f8; - --paper-dark: #dfeaf0; - --paper-darker: #cedee7; - --border: #b3cad8; - --accent: #d26a2b; - --cool: #0f6f9e; - --card-bg: rgba(255, 255, 255, 0.76); - --card-stroke: rgba(179, 202, 216, 0.55); - } - - body { - background: - radial-gradient(circle at 15% 0%, #f8fbfd 0%, transparent 50%), - linear-gradient(180deg, #edf5f9 0%, #e2edf3 40%, #d8e6ee 100%); - } - - .app { - max-width: 100%; - padding: 0.8rem 0.75rem calc(5.8rem + env(safe-area-inset-bottom, 0px)); - } - - .masthead { - border: none; - margin-bottom: 0.7rem; - padding: 0; - display: block; - } - - .masthead h1 { - font-size: 1.35rem; - letter-spacing: -0.2px; - margin-bottom: 0.45rem; - } - - .search-wrap { - position: sticky; - top: env(safe-area-inset-top, 0px); - z-index: 180; - background: rgba(238, 245, 248, 0.92); - backdrop-filter: blur(4px); - padding: 0.35rem 0 0.55rem; - margin-bottom: 0.95rem; - } - - .search-row { - grid-template-columns: 1fr 56px 72px; - gap: 0.35rem; - } - - .search-row input, - .search-row button { - border-radius: 10px; - border: 1px solid var(--border); - } - - .search-row input { - font-size: 0.95rem; - background: rgba(255, 255, 255, 0.76); - } - - #search-btn { - grid-column: 1 / -1; - order: 4; - background: linear-gradient(180deg, #12364d 0%, #0d2a3d 100%); - color: #eef6fa; - border-color: #0d2a3d; - letter-spacing: 0.06em; - } - - #locate-btn { - order: 2; - font-size: 1.05rem !important; - background: #e6f0f5 !important; - } - - #units-btn { - order: 3; - background: #e6f0f5 !important; - } - - .tab-panel { - animation: fade-in 0.2s ease-out; - } - - .loc-header, - .current-grid, - .stats-bar, - .astro-grid, - .aq-grid, - .radar-embed-wrap, - .daily-list, - .maps-wrap, - .alerts-wrap, - .settings-wrap, - .panel-note { - border-radius: 14px; - overflow: hidden; - box-shadow: 0 8px 20px rgba(16, 35, 49, 0.07); - border: 1px solid var(--card-stroke); - } - - .loc-header { - padding: 0.7rem 0.8rem; - background: var(--card-bg); - margin-bottom: 0.8rem; - } - - .loc-name { - font-size: 1.25rem; - line-height: 1.15; - } - - .section-head { - margin-top: 0.25rem; - margin-bottom: 0.45rem; - } - - .section-label { - color: #446072; - letter-spacing: 0.1em; - } - - .current-grid { - background: transparent; - border: none; - gap: 0.55rem; - margin-bottom: 0.65rem; - box-shadow: none; - } - - .current-grid > * { - border-radius: 14px; - border: 1px solid var(--card-stroke); - background: var(--card-bg); - padding: 0.95rem 0.85rem; - } - - .temp-big { - font-size: 3.1rem; - line-height: 0.95; - letter-spacing: -1.2px; - } - - .deg { - font-size: 1.2rem; - } - - .stats-bar { - gap: 0.45rem; - background: transparent; - border: none; - box-shadow: none; - } - - .stat { - border: 1px solid var(--card-stroke); - border-radius: 12px; - background: var(--card-bg); - } - - .astro-grid, - .aq-grid { - gap: 0.45rem; - background: transparent; - border: none; - box-shadow: none; - } - - .astro-card, - .aq-card { - border: 1px solid var(--card-stroke); - border-radius: 12px; - background: var(--card-bg); - padding: 0.72rem 0.7rem; - } - - .radar-map, - .map-overview { - height: 210px; - } - - .radar-map-full { - height: calc(100dvh - 18.5rem); - min-height: 300px; - } - - .radar-controls { - background: rgba(207, 224, 234, 0.9); - } - - .hourly-scroll { - border-radius: 12px; - border: 1px solid var(--card-stroke); - background: var(--card-bg); - } - - .hour-cell { - min-width: 62px; - background: transparent; - } - - .hour-cell.now { - background: rgba(15, 111, 158, 0.12); - } - - .daily-list { - background: var(--card-bg); - } - - .day-row { - border-bottom: 1px solid rgba(179, 202, 216, 0.92); - } - - .maps-wrap, - .alerts-wrap, - .settings-wrap, - .panel-note { - background: var(--card-bg); - } - - .settings-row { - border-radius: 10px; - } - - .tabs { - position: fixed; - left: 0; - right: 0; - bottom: 0; - z-index: 220; - display: grid; - grid-template-columns: repeat(5, minmax(0, 1fr)); - border: none; - border-top: 1px solid rgba(94, 126, 145, 0.4); - background: rgba(10, 35, 51, 0.94); - backdrop-filter: blur(10px); - padding: 0.28rem 0.25rem calc(0.2rem + env(safe-area-inset-bottom, 0px)); - overflow: hidden; - } - - .tab { - border: none; - color: #bfd0da; - min-height: 46px; - font-size: 0.55rem; - letter-spacing: 0.02em; - border-radius: 10px; - text-transform: none; - line-height: 1.05; - padding: 0.2rem 0.25rem; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 0.18rem; - } - - .tab-icon { - margin-right: 0; - font-size: 0.9rem; - } - - .tab-text { - font-size: 0.56rem; - letter-spacing: 0.02em; - } - - .tab:hover { - background: rgba(255, 255, 255, 0.08); - color: #eef6fa; - } - - .tab.active { - background: rgba(210, 106, 43, 0.94); - color: #fff; - } - - .footer-note { - padding-bottom: 0.2rem; - } - - .tab-panel { - min-height: calc(100dvh - 9rem); - } -} - -@media (max-width: 480px) { - .tabs { - display: grid; - grid-template-columns: repeat(5, minmax(0, 1fr)); - gap: 0.22rem; - padding-left: 0.2rem; - padding-right: 0.2rem; - } - - .tab { - min-width: 0; - border-radius: 8px; - padding: 0.2rem 0.12rem; - } - - .tab-icon { - font-size: 0.84rem; - } - - .tab-text { - font-size: 0.52rem; - } -} - -/* iPhone Safari tuning: avoid form zoom and preserve safe-area readability. */ -@supports (-webkit-touch-callout: none) { - @media (max-width: 768px) { - .search-row input, - .search-row button, - .maps-control select, - .settings-btn { - font-size: 16px; - } - - .app { - padding-bottom: calc(6.1rem + env(safe-area-inset-bottom, 0px)); - } - } -} - -@media (min-width: 769px) { .tabs { position: static; + display: flex; background: transparent; + border: 1px solid var(--border); + border-radius: 14px; + padding: 0; + gap: 0; + } + + .tab { + min-height: 42px; + border-radius: 0; + border-right: 1px solid var(--border); + flex-direction: row; + gap: 0.35rem; + padding: 0.45rem 0.8rem; + background: transparent; + color: var(--ink-mid); + } + + .tab:last-child { border-right: none; } + .tab-text { font-size: 0.72rem; } + .tab-icon { font-size: 0.9rem; } + .tab.active { color: #fff; } + + .search-wrap { + position: relative; + top: auto; + background: transparent; + backdrop-filter: none; + padding: 0; + margin-bottom: 1rem; + } + + .search-row { + grid-template-columns: 1fr auto auto auto; + } + + .search-row input { + grid-column: auto; + } + + #search-btn { + grid-column: auto; + min-width: 120px; + order: 0; + } + + .loc-header { + flex-direction: row; + justify-content: space-between; + align-items: flex-end; + } + + .loc-actions { align-items: flex-end; } + + .current-grid { + grid-template-columns: 1fr 1fr; + } + + .stats-bar { grid-template-columns: repeat(6, minmax(0, 1fr)); } + + .astro-grid, + .aq-grid, + .maps-meta, + .maps-controls { grid-template-columns: repeat(3, minmax(0, 1fr)); } + + .maps-controls { grid-template-columns: 1fr 1fr; } + .alerts-list { grid-template-columns: 1fr 1fr; } + + .day-row { + grid-template-columns: 120px 44px 1fr 80px 60px; + grid-template-areas: none; + align-items: center; + gap: 0.8rem; + } + + .day-name { grid-area: auto; font-size: 0.84rem; } + .day-icon { display: block; font-size: 1.35rem; text-align: center; } + .day-desc { grid-area: auto; white-space: normal; } + .day-temps { grid-area: auto; text-align: right; } + .day-meta { + display: block; + text-align: right; + font-size: 0.64rem; + color: var(--ink-light); + line-height: 1.4; + } + + .saved-item { + grid-template-columns: 34px 1fr 34px 34px 34px auto; + } + + .saved-meta { + display: block; + padding: 0 0.55rem; + font-size: 0.66rem; + color: var(--ink-light); + } + + .settings-row { + flex-direction: row; + justify-content: space-between; + align-items: center; + } + + .section-head { + flex-direction: row; + justify-content: space-between; + align-items: center; + margin-left: 0; + margin-right: 0; + } + + .radar-timeline { + order: 0; + flex-basis: auto; + flex: 1; + min-width: 160px; + } + + .radar-ts { + margin-left: auto; + } + + .radar-map-full { + height: calc(100vh - 300px); + min-height: 430px; + } + + .tab-panel { + min-height: auto; + animation: none; } } - -@keyframes fade-in { - from { opacity: 0; transform: translateY(4px); } - to { opacity: 1; transform: translateY(0); } -} From 162969c2a295e489099cfa6af075108ee8353722 Mon Sep 17 00:00:00 2001 From: Nate Date: Mon, 16 Mar 2026 14:29:27 -0400 Subject: [PATCH 5/7] Rebuild UI as true mobile-app layout with larger scale and emoji nav icons --- app/public/index.html | 12 +- app/public/style.css | 793 ++++++++++++++++++++---------------------- 2 files changed, 392 insertions(+), 413 deletions(-) diff --git a/app/public/index.html b/app/public/index.html index 80d2884..49570df 100644 --- a/app/public/index.html +++ b/app/public/index.html @@ -13,7 +13,7 @@ - + @@ -24,23 +24,23 @@

Weather

diff --git a/app/public/style.css b/app/public/style.css index 71aada0..297d58f 100644 --- a/app/public/style.css +++ b/app/public/style.css @@ -1,464 +1,455 @@ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { - --ink: #122637; - --ink-mid: #3a5a70; - --ink-light: #668398; - --paper: #eaf3f8; - --paper-deep: #dce9f1; - --card: rgba(255, 255, 255, 0.78); - --card-strong: rgba(255, 255, 255, 0.9); - --border: rgba(129, 167, 191, 0.42); - --accent: #e07234; - --accent-strong: #cc5c1d; - --cool: #1275a7; - --radius: 16px; - --radius-sm: 12px; - --shadow: 0 10px 30px rgba(13, 41, 58, 0.12); - --mono: 'DM Mono', ui-monospace, SFMono-Regular, Menlo, monospace; - --serif: 'Playfair Display', Georgia, serif; + --ink: #102539; + --ink-soft: #476a82; + --ink-muted: #6f90a4; + --paper: #e7f2f8; + --paper-deep: #d6e7f1; + --surface: rgba(255, 255, 255, 0.9); + --surface-soft: rgba(255, 255, 255, 0.74); + --line: rgba(96, 138, 166, 0.35); + --brand: #f0722f; + --brand-strong: #d75f1f; + --info: #1d87bf; + --ok: #1f9c79; + --danger: #c84b2f; + --radius-xl: 22px; + --radius-lg: 16px; + --radius-md: 12px; + --shadow-lg: 0 14px 36px rgba(11, 35, 52, 0.16); + --shadow-md: 0 8px 22px rgba(11, 35, 52, 0.12); + --ui: 'Manrope', 'Avenir Next', 'Segoe UI', sans-serif; + --display: 'Playfair Display', Georgia, serif; } @media (prefers-color-scheme: dark) { :root { - --ink: #ecf4f9; - --ink-mid: #b0c4d2; - --ink-light: #8ea6b8; - --paper: #0d1822; - --paper-deep: #122331; - --card: rgba(25, 42, 56, 0.8); - --card-strong: rgba(30, 49, 64, 0.9); - --border: rgba(121, 158, 182, 0.38); - --accent: #f28a4f; - --accent-strong: #df7438; - --cool: #5bb7e3; - --shadow: 0 10px 30px rgba(0, 0, 0, 0.35); + --ink: #ecf6fd; + --ink-soft: #bed1dd; + --ink-muted: #92aebf; + --paper: #0b1721; + --paper-deep: #122433; + --surface: rgba(26, 46, 61, 0.88); + --surface-soft: rgba(28, 49, 65, 0.7); + --line: rgba(118, 152, 176, 0.34); + --brand: #ff8d4d; + --brand-strong: #ef7330; + --info: #63c2ef; + --ok: #38c89f; + --danger: #f77257; + --shadow-lg: 0 16px 40px rgba(0, 0, 0, 0.45); + --shadow-md: 0 9px 22px rgba(0, 0, 0, 0.35); } } html, body { min-height: 100%; - background: var(--paper); - color: var(--ink); - font-family: var(--mono); - font-size: 16px; + font-family: var(--ui); + font-size: 18px; line-height: 1.45; + color: var(--ink); + background: var(--paper); overflow-x: hidden; } body { background: - radial-gradient(circle at 10% -10%, rgba(255, 255, 255, 0.8) 0%, transparent 45%), - radial-gradient(circle at 100% 0%, rgba(136, 197, 228, 0.24) 0%, transparent 40%), + radial-gradient(circle at 8% -6%, rgba(255, 255, 255, 0.86), transparent 46%), + radial-gradient(circle at 100% 0%, rgba(111, 184, 222, 0.25), transparent 35%), linear-gradient(180deg, var(--paper) 0%, var(--paper-deep) 100%); } +a { color: var(--info); text-decoration: none; } +a:hover { text-decoration: underline; } +.hidden { display: none !important; } + .app { width: 100%; max-width: 100%; - padding: calc(0.65rem + env(safe-area-inset-top, 0px)) 0.7rem calc(6.2rem + env(safe-area-inset-bottom, 0px)); + padding: calc(0.7rem + env(safe-area-inset-top, 0px)) 0.75rem calc(6.9rem + env(safe-area-inset-bottom, 0px)); } -a { color: var(--cool); text-decoration: none; } -a:hover { text-decoration: underline; } -.hidden { display: none !important; } - -/* Top */ +/* Header */ .masthead { - display: grid; - grid-template-columns: 1fr; - gap: 0.55rem; + position: sticky; + top: env(safe-area-inset-top, 0px); + z-index: 220; + padding: 0.55rem 0.55rem 0.45rem; + border: 1px solid var(--line); + border-radius: var(--radius-xl); + background: linear-gradient(180deg, var(--surface) 0%, var(--surface-soft) 100%); + backdrop-filter: blur(9px); + box-shadow: var(--shadow-md); margin-bottom: 0.6rem; } .masthead h1 { - font-family: var(--serif); - font-size: 1.5rem; - letter-spacing: -0.2px; + font-family: var(--display); + font-size: 1.7rem; + letter-spacing: -0.3px; + margin-bottom: 0.35rem; } .tagline { - font-size: 0.72rem; - color: var(--ink-light); + display: block; + margin-top: 0.35rem; + font-size: 0.76rem; + color: var(--ink-muted); letter-spacing: 0.04em; } -/* Tabs */ +/* Bottom nav */ .tabs { position: fixed; left: 0; right: 0; bottom: 0; - z-index: 260; + z-index: 300; display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); - gap: 0.2rem; - padding: 0.35rem 0.28rem calc(0.38rem + env(safe-area-inset-bottom, 0px)); - background: rgba(8, 24, 35, 0.9); + gap: 0.22rem; + padding: 0.45rem 0.28rem calc(0.45rem + env(safe-area-inset-bottom, 0px)); + background: rgba(9, 28, 40, 0.92); backdrop-filter: blur(12px); - border-top: 1px solid rgba(124, 160, 181, 0.35); + border-top: 1px solid rgba(121, 165, 191, 0.36); } .tab { border: none; - border-radius: 10px; + border-radius: 12px; min-width: 0; - min-height: 50px; - padding: 0.35rem 0.15rem; + min-height: 58px; + padding: 0.32rem 0.15rem; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0.24rem; - font-family: var(--mono); - color: #c9dce8; - background: rgba(255, 255, 255, 0.03); + background: rgba(255, 255, 255, 0.04); + color: #d8eaf4; cursor: pointer; + font-family: var(--ui); } .tab-icon { - font-size: 1.05rem; + font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Noto Color Emoji', sans-serif; + font-size: 1.18rem; line-height: 1; - display: inline-flex; } .tab-text { - font-size: 0.64rem; + font-size: 0.67rem; line-height: 1; letter-spacing: 0.02em; + font-weight: 600; } .tab.active { color: #fff; - background: linear-gradient(180deg, var(--accent) 0%, var(--accent-strong) 100%); -} - -.tab:hover { color: #fff; } - -/* Shared controls */ -button, input, select { - font-family: var(--mono); + background: linear-gradient(180deg, var(--brand) 0%, var(--brand-strong) 100%); } +/* Search */ .search-wrap { - position: sticky; - top: env(safe-area-inset-top, 0px); - z-index: 220; - background: linear-gradient(180deg, rgba(234, 243, 248, 0.95) 0%, rgba(234, 243, 248, 0.84) 100%); - backdrop-filter: blur(6px); - padding: 0.35rem 0 0.55rem; - margin-bottom: 0.7rem; + margin-bottom: 0.65rem; } .search-row { display: grid; - grid-template-columns: 1fr 58px 74px; - gap: 0.4rem; + grid-template-columns: 1fr 64px 80px; + gap: 0.45rem; } +button, input, select { font-family: var(--ui); } + .search-row input, .search-row button, .maps-control select, .settings-btn { - font-size: 16px; /* prevent iOS zoom */ + font-size: 16px; /* prevent iOS focus zoom */ } .search-row input { grid-column: 1 / -1; - border: 1px solid var(--border); - border-radius: 12px; - background: var(--card-strong); + min-height: 54px; + border-radius: var(--radius-lg); + border: 1px solid var(--line); + background: var(--surface); color: var(--ink); - min-height: 50px; - padding: 0 0.85rem; + padding: 0 0.95rem; + box-shadow: var(--shadow-md); } .search-row button { - min-height: 48px; - border-radius: 12px; - border: 1px solid var(--border); + min-height: 50px; + border-radius: 14px; + border: 1px solid var(--line); cursor: pointer; + box-shadow: var(--shadow-md); } #search-btn { grid-column: 1 / -1; - background: linear-gradient(180deg, #17425d 0%, #113247 100%); - color: #f1f8fc; - letter-spacing: 0.04em; + background: linear-gradient(180deg, #15445f 0%, #11344c 100%); + color: #f2f8fc; text-transform: uppercase; + letter-spacing: 0.05em; + font-weight: 700; } #locate-btn, #units-btn { - background: var(--card-strong) !important; + background: var(--surface) !important; color: var(--ink) !important; } -#locate-btn { font-size: 1.15rem !important; } +#locate-btn { + font-size: 1.25rem !important; +} .suggestions { list-style: none; - border: 1px solid var(--border); - border-radius: 12px; - margin-top: 0.25rem; + margin-top: 0.3rem; + border-radius: var(--radius-lg); overflow: hidden; - background: var(--card-strong); - box-shadow: var(--shadow); + border: 1px solid var(--line); + background: var(--surface); + box-shadow: var(--shadow-lg); } .suggestions li { - padding: 0.65rem 0.75rem; - border-bottom: 1px solid var(--border); + padding: 0.72rem 0.8rem; + border-bottom: 1px solid var(--line); font-size: 0.88rem; cursor: pointer; } .suggestions li:last-child { border-bottom: none; } -.suggestions li:hover { background: rgba(18, 117, 167, 0.08); } -.sug-country { color: var(--ink-light); margin-left: 0.4rem; font-size: 0.8rem; } +.suggestions li:hover { background: rgba(29, 135, 191, 0.09); } +.sug-country { color: var(--ink-muted); font-size: 0.8rem; margin-left: 0.35rem; } .error { margin-top: 0.35rem; - color: #c34722; + color: var(--danger); font-size: 0.84rem; } +/* Generic cards */ +.tab-panel { + width: 100%; + min-height: calc(100dvh - 11.6rem); +} + +.loc-header, +.radar-embed-wrap, +.radar-full-wrap, +.maps-wrap, +.alerts-wrap, +.panel-note, +.settings-wrap, +.daily-list, +.hourly-scroll, +.stats-bar, +.astro-grid, +.aq-grid { + border: 1px solid var(--line); + border-radius: var(--radius-xl); + background: var(--surface-soft); + box-shadow: var(--shadow-md); +} + .loading { display: flex; align-items: center; - gap: 0.6rem; - color: var(--ink-mid); - font-size: 0.84rem; - padding: 1.2rem 0.3rem; + gap: 0.65rem; + color: var(--ink-soft); + font-size: 0.88rem; + padding: 1rem 0.35rem; } .loading-dot { - width: 9px; - height: 9px; + width: 11px; + height: 11px; border-radius: 50%; - background: var(--accent); + background: var(--brand); animation: pulse 1.1s ease-in-out infinite; } @keyframes pulse { - 0%, 100% { opacity: 0.35; transform: scale(0.9); } + 0%, 100% { opacity: 0.4; transform: scale(0.9); } 50% { opacity: 1; transform: scale(1.08); } } -.tab-panel { - width: 100%; - min-height: calc(100dvh - 10.5rem); - animation: panel-fade 0.18s ease-out; -} - -@keyframes panel-fade { - from { opacity: 0; transform: translateY(4px); } - to { opacity: 1; transform: translateY(0); } -} - -/* Layout cards */ -.loc-header, -.current-grid, -.stats-bar, -.astro-grid, -.aq-grid, -.radar-embed-wrap, -.radar-full-wrap, -.hourly-scroll, -.daily-list, -.maps-wrap, -.alerts-wrap, -.panel-note, -.settings-wrap { - border: 1px solid var(--border); - border-radius: var(--radius); - background: var(--card); - box-shadow: var(--shadow); -} - .loc-header { + padding: 0.9rem; + margin-bottom: 0.75rem; display: flex; flex-direction: column; - align-items: flex-start; - gap: 0.35rem; - padding: 0.8rem; - margin-bottom: 0.7rem; + gap: 0.4rem; } .loc-name { - font-family: var(--serif); - font-size: 1.35rem; - line-height: 1.15; + font-family: var(--display); + font-size: 1.5rem; + line-height: 1.1; } .loc-sub, .loc-time { - font-size: 0.78rem; - color: var(--ink-light); + font-size: 0.8rem; + color: var(--ink-muted); } .loc-actions { display: flex; flex-direction: column; align-items: flex-start; - gap: 0.35rem; + gap: 0.32rem; } .link-btn { border: none; background: none; - color: var(--cool); - padding: 0; + color: var(--info); cursor: pointer; - font-size: 0.8rem; + font-size: 0.84rem; } .section-head { display: flex; flex-direction: column; - gap: 0.2rem; - margin: 0.25rem 0.45rem 0.45rem; + gap: 0.22rem; + margin: 0.35rem 0.45rem 0.5rem; +} + +.section-label { + font-size: 0.74rem; + color: var(--ink-soft); + text-transform: uppercase; + letter-spacing: 0.08em; + font-weight: 700; +} + +.section-note { + color: var(--ink-muted); + font-size: 0.79rem; } .section-actions { display: inline-flex; flex-wrap: wrap; - gap: 0.55rem; -} - -.section-label { - color: var(--ink-mid); - font-size: 0.72rem; - letter-spacing: 0.08em; - text-transform: uppercase; -} - -.section-note { - color: var(--ink-light); - font-size: 0.76rem; + gap: 0.62rem; } +/* Current */ .current-grid { display: grid; - gap: 0.5rem; - border: none; - background: transparent; - box-shadow: none; - margin-bottom: 0.6rem; + gap: 0.6rem; + margin-bottom: 0.75rem; } .current-grid > * { - border: 1px solid var(--border); - border-radius: var(--radius-sm); - background: var(--card-strong); - padding: 0.9rem 0.8rem; + border-radius: var(--radius-lg); + border: 1px solid var(--line); + background: var(--surface); + padding: 1rem 0.85rem; + box-shadow: var(--shadow-md); } .temp-big { - font-family: var(--serif); - font-size: 3.35rem; + font-family: var(--display); + font-size: 3.75rem; + line-height: 0.92; letter-spacing: -1.5px; - line-height: 0.95; } .deg { - font-size: 1.25rem; - color: var(--ink-mid); + font-size: 1.35rem; + color: var(--ink-soft); vertical-align: super; } .feels, .hi-lo, .cond-sub { - font-size: 0.8rem; - color: var(--ink-mid); + font-size: 0.84rem; + color: var(--ink-soft); } .current-cond { display: flex; flex-direction: column; justify-content: center; } -.cond-icon { font-size: 2rem; } -.cond-desc { font-size: 1.02rem; font-weight: 500; } +.cond-icon { font-size: 2.2rem; margin-bottom: 0.15rem; } +.cond-desc { font-size: 1.08rem; font-weight: 700; } -.stats-bar { +/* Stat blocks */ +.stats-bar, +.astro-grid, +.aq-grid { display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 0.45rem; + gap: 0.52rem; border: none; background: transparent; box-shadow: none; - margin-bottom: 0.8rem; + margin-bottom: 0.78rem; } +.stats-bar { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .stat, .astro-card, .aq-card, .maps-card, .settings-row, .alert-item { - border: 1px solid var(--border); - border-radius: var(--radius-sm); - background: var(--card-strong); + border: 1px solid var(--line); + border-radius: var(--radius-md); + background: var(--surface); + box-shadow: var(--shadow-md); } -.stat { - padding: 0.7rem 0.55rem; - text-align: center; -} +.stat { padding: 0.78rem 0.58rem; text-align: center; } .stat-label { - font-size: 0.62rem; - letter-spacing: 0.08em; + font-size: 0.64rem; text-transform: uppercase; - color: var(--ink-light); + letter-spacing: 0.08em; + color: var(--ink-muted); margin-bottom: 0.2rem; + font-weight: 700; } -.stat-val { font-size: 0.95rem; font-weight: 500; } -.unit { font-size: 0.68rem; color: var(--ink-mid); } - -.astro-grid, -.aq-grid { - display: grid; - gap: 0.45rem; - border: none; - background: transparent; - box-shadow: none; - margin-bottom: 0.75rem; -} +.stat-val { font-size: 1.02rem; font-weight: 700; } +.unit { font-size: 0.72rem; color: var(--ink-soft); } .astro-card, .aq-card, -.maps-card { - padding: 0.68rem 0.65rem; -} - +.maps-card { padding: 0.74rem 0.7rem; } .astro-val, .aq-val, -.maps-value { - font-size: 0.95rem; - font-weight: 500; -} +.maps-value { font-size: 0.98rem; font-weight: 700; } +/* Radar & maps */ .radar-embed-wrap, .radar-full-wrap, .maps-wrap, .alerts-wrap, .settings-wrap { - padding: 0.65rem; - margin-bottom: 0.8rem; + padding: 0.7rem; + margin-bottom: 0.85rem; } .radar-map, .map-overview { width: 100%; - height: 220px; - border-radius: 12px; + height: 235px; + border-radius: var(--radius-md); + border: 1px solid var(--line); overflow: hidden; - border: 1px solid var(--border); } .radar-map-full { height: calc(100dvh - 20rem); - min-height: 300px; + min-height: 310px; } .radar-controls { @@ -466,97 +457,99 @@ button, input, select { flex-wrap: wrap; align-items: center; gap: 0.45rem; - margin-top: 0.55rem; + margin-top: 0.62rem; } .radar-btn { - width: 44px; - height: 44px; + width: 46px; + height: 46px; border: none; - border-radius: 10px; + border-radius: 12px; background: #0f3248; - color: #f2f8fb; + color: #f5fbfe; cursor: pointer; + font-size: 0.86rem; } -.layer-btn { background: var(--accent); } +.layer-btn { background: var(--brand); } .radar-timeline { order: 3; flex-basis: 100%; - height: 30px; + height: 32px; display: flex; gap: 2px; } .tl-tick { flex: 1; - border-radius: 5px; - border: 1px solid var(--border); - background: rgba(255, 255, 255, 0.5); + border-radius: 7px; + border: 1px solid var(--line); + background: rgba(255, 255, 255, 0.52); cursor: pointer; } -.tl-tick.active { background: var(--cool); border-color: var(--cool); } -.tl-tick.forecast { opacity: 0.55; } - -.radar-ts { - color: var(--ink-mid); - font-size: 0.72rem; -} +.tl-tick.active { background: var(--info); border-color: var(--info); } +.tl-tick.forecast { opacity: 0.6; } +.radar-ts { font-size: 0.75rem; color: var(--ink-soft); } .radar-legend { display: inline-flex; align-items: center; gap: 0.35rem; } -.legend-label { font-size: 0.62rem; color: var(--ink-light); } +.legend-label { font-size: 0.64rem; color: var(--ink-muted); } .legend-bar { - width: 74px; - height: 9px; + width: 84px; + height: 10px; border-radius: 999px; - border: 1px solid var(--border); + border: 1px solid var(--line); background: linear-gradient(to right, #00d8ff, #00a0e0, #0070d0, #00c800, #ffff00, #ff6000, #ff0000); } .radar-attribution, .footer-note { - font-size: 0.72rem; - color: var(--ink-light); - margin-bottom: 0.7rem; + font-size: 0.74rem; + color: var(--ink-muted); + margin-bottom: 0.8rem; } +/* Hourly */ .hourly-summary { - margin: 0.2rem 0.35rem 0.4rem; - color: var(--ink-mid); - font-size: 0.78rem; + margin: 0.22rem 0.38rem 0.45rem; + font-size: 0.8rem; + color: var(--ink-soft); } .hourly-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; - margin-bottom: 0.8rem; - padding: 0.35rem; + margin-bottom: 0.85rem; + padding: 0.42rem; } .hourly-track { display: flex; min-width: max-content; } .hour-cell { - min-width: 74px; + min-width: 90px; + padding: 0.72rem 0.45rem; text-align: center; - padding: 0.65rem 0.35rem; - border-radius: 10px; - margin-right: 0.25rem; - border: 1px solid var(--border); - background: var(--card-strong); + border-radius: 12px; + border: 1px solid var(--line); + background: var(--surface); + margin-right: 0.3rem; } -.hour-cell.now { background: rgba(18, 117, 167, 0.14); } -.hour-time { font-size: 0.66rem; color: var(--ink-light); margin-bottom: 0.25rem; } -.hour-icon { font-size: 1.2rem; margin-bottom: 0.18rem; } -.hour-temp { font-size: 0.92rem; font-weight: 600; } -.hour-feels, -.hour-precip { font-size: 0.64rem; color: var(--ink-mid); } +.hour-cell.now { + background: linear-gradient(180deg, rgba(29, 135, 191, 0.18) 0%, var(--surface) 100%); +} +.hour-time { font-size: 0.7rem; color: var(--ink-muted); margin-bottom: 0.28rem; } +.hour-icon { font-size: 1.35rem; margin-bottom: 0.18rem; } +.hour-temp { font-size: 1rem; font-weight: 700; } +.hour-feels, +.hour-precip { font-size: 0.68rem; color: var(--ink-soft); } + +/* Daily */ .daily-list { - padding: 0.35rem; - margin-bottom: 0.8rem; + padding: 0.4rem; + margin-bottom: 0.9rem; } .day-row { @@ -565,34 +558,35 @@ button, input, select { grid-template-areas: 'name temps' 'desc desc'; - gap: 0.2rem 0.5rem; - padding: 0.6rem; - border-radius: 10px; - border: 1px solid var(--border); - background: var(--card-strong); - margin-bottom: 0.3rem; + gap: 0.28rem 0.55rem; + border-radius: 12px; + border: 1px solid var(--line); + background: var(--surface); + padding: 0.72rem; + margin-bottom: 0.34rem; } .day-row:last-child { margin-bottom: 0; } -.day-row.today { outline: 1px solid rgba(18, 117, 167, 0.35); } -.day-name { grid-area: name; font-size: 0.82rem; font-weight: 600; } +.day-row.today { outline: 1px solid rgba(29, 135, 191, 0.45); } +.day-name { grid-area: name; font-size: 0.9rem; font-weight: 700; } .day-icon { display: none; } .day-desc { grid-area: desc; - font-size: 0.74rem; - color: var(--ink-mid); + font-size: 0.78rem; + color: var(--ink-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } -.day-temps { grid-area: temps; font-size: 0.8rem; font-weight: 600; } -.day-lo { color: var(--ink-light); } +.day-temps { grid-area: temps; font-size: 0.88rem; font-weight: 700; } +.day-lo { color: var(--ink-muted); } .day-meta { display: none; } +/* Lists and settings */ .panel-note { - padding: 0.7rem; - font-size: 0.78rem; - color: var(--ink-mid); + padding: 0.75rem; + font-size: 0.82rem; + color: var(--ink-soft); } .alerts-list, @@ -600,79 +594,80 @@ button, input, select { .maps-controls, .maps-meta { display: grid; - gap: 0.45rem; + gap: 0.5rem; } .alert-item { - padding: 0.65rem; + padding: 0.72rem; display: grid; - gap: 0.2rem; - font-size: 0.78rem; + gap: 0.22rem; + font-size: 0.82rem; } .maps-control { display: grid; gap: 0.3rem; - font-size: 0.66rem; - letter-spacing: 0.05em; + font-size: 0.68rem; + color: var(--ink-muted); text-transform: uppercase; - color: var(--ink-light); + letter-spacing: 0.05em; } .maps-control input, .maps-control select, .settings-btn { - border: 1px solid var(--border); - background: var(--card-strong); + min-height: 44px; + border: 1px solid var(--line); + border-radius: 12px; + background: var(--surface); color: var(--ink); - border-radius: 10px; - min-height: 42px; - padding: 0.4rem 0.55rem; + padding: 0.35rem 0.55rem; } .wind-legend { - margin-top: 0.5rem; display: flex; align-items: center; flex-wrap: wrap; - gap: 0.4rem; - color: var(--ink-light); - font-size: 0.68rem; + gap: 0.42rem; + margin-top: 0.52rem; + font-size: 0.71rem; + color: var(--ink-muted); } .wind-legend-scale { - width: 120px; + width: 126px; height: 10px; - border: 1px solid var(--border); border-radius: 999px; + border: 1px solid var(--line); background: linear-gradient(to right, #d2f0ff, #84ccff, #3f9fff, #1879df); } -.saved-wrap { margin-top: 0.2rem; } +.saved-wrap { margin-top: 0.1rem; } + .saved-head { display: flex; flex-direction: column; align-items: flex-start; - gap: 0.28rem; - margin-bottom: 0.3rem; - color: var(--ink-light); + gap: 0.3rem; + margin-bottom: 0.32rem; + color: var(--ink-muted); text-transform: uppercase; - font-size: 0.66rem; letter-spacing: 0.07em; + font-size: 0.67rem; } .saved-help { - font-size: 0.72rem; - color: var(--ink-light); - margin-bottom: 0.35rem; + margin-bottom: 0.38rem; + font-size: 0.74rem; + color: var(--ink-muted); } .saved-item { display: grid; - grid-template-columns: 34px 1fr 34px 34px 34px; - border: 1px solid var(--border); - border-radius: 10px; - background: var(--card-strong); + grid-template-columns: 36px 1fr 36px 36px 36px; + border: 1px solid var(--line); + border-radius: 12px; + background: var(--surface); overflow: hidden; } @@ -680,147 +675,142 @@ button, input, select { .saved-remove, .saved-default, .saved-move { + min-height: 44px; border: none; background: transparent; color: var(--ink); cursor: pointer; - min-height: 42px; } .saved-chip { + padding: 0 0.58rem; text-align: left; - padding: 0 0.55rem; - border-left: 1px solid var(--border); - border-right: 1px solid var(--border); + border-left: 1px solid var(--line); + border-right: 1px solid var(--line); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } -.saved-default { color: var(--accent); } -.saved-remove { color: var(--ink-light); border-right: 1px solid var(--border); } -.saved-move { border-right: 1px solid var(--border); } +.saved-default { color: var(--brand); } +.saved-move { border-right: 1px solid var(--line); } +.saved-remove { border-right: 1px solid var(--line); color: var(--ink-muted); } .saved-move:disabled { opacity: 0.35; cursor: not-allowed; } .saved-meta { display: none; } -.settings-wrap { - display: grid; - gap: 0.6rem; -} +.settings-wrap { display: grid; gap: 0.62rem; } .settings-row { - padding: 0.65rem; display: flex; flex-direction: column; align-items: flex-start; - gap: 0.4rem; + gap: 0.45rem; + padding: 0.74rem; } .settings-label { - font-size: 0.7rem; - letter-spacing: 0.05em; + font-size: 0.72rem; + color: var(--ink-muted); text-transform: uppercase; - color: var(--ink-light); + letter-spacing: 0.05em; + font-weight: 700; } -.settings-value { font-size: 0.85rem; color: var(--ink); } +.settings-value { font-size: 0.88rem; color: var(--ink); } .auto-detect-toggle, .toggle-label { display: inline-flex; align-items: center; - gap: 0.45rem; - color: var(--ink-mid); - font-size: 0.84rem; + gap: 0.48rem; + color: var(--ink-soft); + font-size: 0.9rem; } .auto-detect-toggle input, -.toggle-label input { accent-color: var(--accent); } +.toggle-label input { accent-color: var(--brand); } button:focus-visible, input:focus-visible, select:focus-visible { - outline: 2px solid var(--accent); + outline: 2px solid var(--brand); outline-offset: 2px; } -/* Leaflet overrides */ +/* Leaflet */ .leaflet-container { background: #1a2430; } .leaflet-control-zoom a { - background: var(--card-strong) !important; + background: var(--surface) !important; color: var(--ink) !important; - border-color: var(--border) !important; + border-color: var(--line) !important; } -/* Accessibility mode */ +/* High contrast */ body.high-contrast { - --ink: #0b0b0b; - --ink-mid: #222; - --ink-light: #444; + --ink: #0a0a0a; + --ink-soft: #1f1f1f; + --ink-muted: #3b3b3b; --paper: #fff; --paper-deep: #f2f2f2; - --card: #fff; - --card-strong: #fff; - --border: #111; - --accent: #aa3300; - --accent-strong: #8a2800; - --cool: #005a82; + --surface: #fff; + --surface-soft: #fff; + --line: #111; + --brand: #a93a00; + --brand-strong: #8d2f00; + --info: #005a82; } -/* Desktop enhancements */ -@media (min-width: 900px) { - html, body { font-size: 15px; } +/* Desktop second */ +@media (min-width: 940px) { + html, body { font-size: 16px; } .app { - max-width: 1060px; + max-width: 1120px; margin: 0 auto; - padding: 1.4rem 1.25rem 2.2rem; + padding: 1.35rem 1.3rem 2.4rem; } .masthead { + position: static; display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 1rem; margin-bottom: 1rem; + padding: 0; + border: none; + box-shadow: none; + background: transparent; + backdrop-filter: none; } - .masthead h1 { font-size: 2rem; } + .masthead h1 { margin: 0; font-size: 2rem; } .tabs { position: static; display: flex; - background: transparent; - border: 1px solid var(--border); - border-radius: 14px; - padding: 0; gap: 0; + background: transparent; + border: 1px solid var(--line); + border-radius: 16px; + padding: 0; } .tab { - min-height: 42px; - border-radius: 0; - border-right: 1px solid var(--border); + min-height: 44px; flex-direction: row; - gap: 0.35rem; - padding: 0.45rem 0.8rem; + border-radius: 0; + border-right: 1px solid var(--line); + padding: 0.45rem 0.9rem; background: transparent; - color: var(--ink-mid); + color: var(--ink-soft); } .tab:last-child { border-right: none; } - .tab-text { font-size: 0.72rem; } - .tab-icon { font-size: 0.9rem; } - .tab.active { color: #fff; } + .tab-icon { font-size: 1rem; } + .tab-text { font-size: 0.76rem; } - .search-wrap { - position: relative; - top: auto; - background: transparent; - backdrop-filter: none; - padding: 0; - margin-bottom: 1rem; - } + .tagline { margin: 0; } .search-row { grid-template-columns: 1fr auto auto auto; @@ -828,12 +818,12 @@ body.high-contrast { .search-row input { grid-column: auto; + min-height: 48px; } #search-btn { grid-column: auto; - min-width: 120px; - order: 0; + min-width: 140px; } .loc-header { @@ -844,10 +834,7 @@ body.high-contrast { .loc-actions { align-items: flex-end; } - .current-grid { - grid-template-columns: 1fr 1fr; - } - + .current-grid { grid-template-columns: 1fr 1fr; } .stats-bar { grid-template-columns: repeat(6, minmax(0, 1fr)); } .astro-grid, @@ -859,33 +846,30 @@ body.high-contrast { .alerts-list { grid-template-columns: 1fr 1fr; } .day-row { - grid-template-columns: 120px 44px 1fr 80px 60px; + grid-template-columns: 120px 44px 1fr 84px 64px; grid-template-areas: none; align-items: center; gap: 0.8rem; } - .day-name { grid-area: auto; font-size: 0.84rem; } - .day-icon { display: block; font-size: 1.35rem; text-align: center; } + .day-name { grid-area: auto; } + .day-icon { display: block; font-size: 1.36rem; text-align: center; } .day-desc { grid-area: auto; white-space: normal; } .day-temps { grid-area: auto; text-align: right; } .day-meta { display: block; text-align: right; - font-size: 0.64rem; - color: var(--ink-light); - line-height: 1.4; - } - - .saved-item { - grid-template-columns: 34px 1fr 34px 34px 34px auto; + font-size: 0.67rem; + color: var(--ink-muted); + line-height: 1.35; } + .saved-item { grid-template-columns: 36px 1fr 36px 36px 36px auto; } .saved-meta { display: block; - padding: 0 0.55rem; - font-size: 0.66rem; - color: var(--ink-light); + padding: 0 0.58rem; + font-size: 0.68rem; + color: var(--ink-muted); } .settings-row { @@ -906,20 +890,15 @@ body.high-contrast { order: 0; flex-basis: auto; flex: 1; - min-width: 160px; + min-width: 180px; } - .radar-ts { - margin-left: auto; - } + .radar-ts { margin-left: auto; } .radar-map-full { height: calc(100vh - 300px); - min-height: 430px; + min-height: 440px; } - .tab-panel { - min-height: auto; - animation: none; - } + .tab-panel { min-height: auto; } } From cd45f0bf5ef4a36804afdf699fcd2c38062c80c4 Mon Sep 17 00:00:00 2001 From: Nate Date: Mon, 16 Mar 2026 14:34:17 -0400 Subject: [PATCH 6/7] Keep bottom menu fixed during scroll across breakpoints --- app/public/style.css | 59 ++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/app/public/style.css b/app/public/style.css index 297d58f..19fab1c 100644 --- a/app/public/style.css +++ b/app/public/style.css @@ -767,13 +767,13 @@ body.high-contrast { .app { max-width: 1120px; margin: 0 auto; - padding: 1.35rem 1.3rem 2.4rem; + padding: 1.35rem 1.3rem calc(6.9rem + env(safe-area-inset-bottom, 0px)); } .masthead { position: static; display: grid; - grid-template-columns: auto 1fr auto; + grid-template-columns: auto 1fr; align-items: center; gap: 1rem; margin-bottom: 1rem; @@ -787,28 +787,49 @@ body.high-contrast { .masthead h1 { margin: 0; font-size: 2rem; } .tabs { - position: static; - display: flex; - gap: 0; - background: transparent; - border: 1px solid var(--line); - border-radius: 16px; - padding: 0; + position: fixed; + left: 0; + right: 0; + bottom: 0; + z-index: 300; + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 0.22rem; + padding: 0.45rem 0.28rem calc(0.45rem + env(safe-area-inset-bottom, 0px)); + background: rgba(9, 28, 40, 0.92); + backdrop-filter: blur(12px); + border-top: 1px solid rgba(121, 165, 191, 0.36); + border-radius: 0; } .tab { - min-height: 44px; - flex-direction: row; - border-radius: 0; - border-right: 1px solid var(--line); - padding: 0.45rem 0.9rem; - background: transparent; - color: var(--ink-soft); + min-height: 58px; + flex-direction: column; + border-radius: 12px; + border-right: none; + padding: 0.32rem 0.15rem; + background: rgba(255, 255, 255, 0.04); + color: #d8eaf4; + gap: 0.24rem; } - .tab:last-child { border-right: none; } - .tab-icon { font-size: 1rem; } - .tab-text { font-size: 0.76rem; } + .tab-icon { + font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Noto Color Emoji', sans-serif; + font-size: 1.18rem; + line-height: 1; + } + + .tab-text { + font-size: 0.67rem; + line-height: 1; + letter-spacing: 0.02em; + font-weight: 600; + } + + .tab.active { + color: #fff; + background: linear-gradient(180deg, var(--brand) 0%, var(--brand-strong) 100%); + } .tagline { margin: 0; } From 1786bc8985f6f7822a99e03f1ee23df47d78f206 Mon Sep 17 00:00:00 2001 From: Nate Date: Mon, 16 Mar 2026 14:38:36 -0400 Subject: [PATCH 7/7] Fix persistent bottom nav by moving tabs outside sticky header --- app/public/index.html | 45 ++++++++++++++++++++++--------------------- app/public/style.css | 11 +++++++++++ 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/app/public/index.html b/app/public/index.html index 49570df..33c49e2 100644 --- a/app/public/index.html +++ b/app/public/index.html @@ -22,28 +22,6 @@

Weather

- Open-Meteo · RainViewer
@@ -290,6 +268,29 @@ + + diff --git a/app/public/style.css b/app/public/style.css index 19fab1c..9733e8f 100644 --- a/app/public/style.css +++ b/app/public/style.css @@ -105,6 +105,8 @@ a:hover { text-decoration: underline; } left: 0; right: 0; bottom: 0; + width: 100vw; + max-width: 100vw; z-index: 300; display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); @@ -115,6 +117,13 @@ a:hover { text-decoration: underline; } border-top: 1px solid rgba(121, 165, 191, 0.36); } +@supports (bottom: env(safe-area-inset-bottom)) { + .tabs { + bottom: 0; + padding-bottom: calc(0.45rem + env(safe-area-inset-bottom)); + } +} + .tab { border: none; border-radius: 12px; @@ -791,6 +800,8 @@ body.high-contrast { left: 0; right: 0; bottom: 0; + width: 100vw; + max-width: 100vw; z-index: 300; display: grid; grid-template-columns: repeat(5, minmax(0, 1fr));