From 78c7e8a9a9cb370f3689a803cd366e2773cb0338 Mon Sep 17 00:00:00 2001 From: Nate Date: Mon, 16 Mar 2026 14:22:41 -0400 Subject: [PATCH] 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); } -}