diff --git a/.tmp/imgdiff/old/style.css b/.tmp/imgdiff/new/style.css index 71c96f7..92ea4d9 100644 --- a/.tmp/imgdiff/old/style.css +++ b/.tmp/imgdiff/new/style.css @@ -1,1031 +1,1304 @@ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { - --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; + --ink: #1a1a1a; + --ink-mid: #3d3730; + --ink-light: #5f5649; + --paper: #f5f2ec; + --paper-dark: #ece7db; + --paper-darker: #ddd6c7; + --border: #b9ae9b; + --accent: #c25a2a; + --cool: #2a6b8a; + --mono: 'Segoe UI Rounded', 'Trebuchet MS', 'Avenir Next', 'Segoe UI', sans-serif; + --serif: 'Segoe UI Rounded', 'Trebuchet MS', 'Avenir Next', 'Segoe UI', sans-serif; + --card-bg: var(--paper-dark); + --card-bg-soft: var(--paper-darker); + --card-ink: var(--ink); + --card-sub: var(--ink-light); + --surface-border: 1px solid rgba(255, 255, 255, 0.08); + --surface-radius-lg: 16px; + --surface-radius-md: 12px; + --surface-shadow: 0 8px 18px rgba(0, 0, 0, 0.16); } @media (prefers-color-scheme: dark) { :root { - --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); + --ink: #ece7dc; + --ink-mid: #d2c8b1; + --ink-light: #beb399; + --paper: #191510; + --paper-dark: #201c16; + --paper-darker: #2b2620; + --border: #3a342a; + --accent: #e07848; + --cool: #5ab0d8; } } html, body { min-height: 100%; - font-family: var(--ui); - font-size: 18px; - line-height: 1.45; - color: var(--ink); background: var(--paper); + color: var(--ink); + font-family: var(--mono); + font-size: 16px; + line-height: 1.6; overflow-x: hidden; } -body { - background: - 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%); - transition: background 0.6s ease; +.app { + max-width: 900px; + margin: 0 auto; + padding: 2rem 1.5rem 4rem; } -body.weather-clear { - background: - radial-gradient(circle at 15% 0%, rgba(255, 255, 255, 0.95), transparent 44%), - radial-gradient(circle at 95% 5%, rgba(255, 214, 131, 0.4), transparent 30%), - linear-gradient(180deg, #dff2ff 0%, #cbe6f7 45%, #b6d9ee 100%); -} +a { color: var(--cool); text-decoration: none; } +a:hover { text-decoration: underline; } -body.weather-cloud { - background: - radial-gradient(circle at 10% -5%, rgba(255, 255, 255, 0.75), transparent 46%), - radial-gradient(circle at 85% 0%, rgba(175, 203, 220, 0.35), transparent 35%), - linear-gradient(180deg, #d7e8f1 0%, #c6dbe7 55%, #b5cfde 100%); +/* ── Masthead ── */ +.masthead { + display: grid; + grid-template-columns: 1fr; + align-items: center; + justify-items: center; + gap: 0.8rem; + border: var(--surface-border); + border-radius: var(--surface-radius-lg); + background: linear-gradient(180deg, var(--card-bg-soft), var(--paper-dark)); + color: var(--card-ink); + padding: 1rem 1.1rem; + margin-bottom: 1.5rem; + box-shadow: var(--surface-shadow); } -body.weather-rain { - background: - radial-gradient(circle at 20% -8%, rgba(196, 220, 235, 0.45), transparent 45%), - radial-gradient(circle at 100% 0%, rgba(109, 162, 191, 0.32), transparent 35%), - linear-gradient(180deg, #a8c1d2 0%, #8eaabd 55%, #748fa5 100%); +.masthead h1 { + font-family: var(--serif); + font-size: 2.35rem; + font-weight: 700; + letter-spacing: -0.5px; + color: var(--card-ink); + white-space: nowrap; + text-align: center; } -body.weather-snow { - background: - radial-gradient(circle at 12% 0%, rgba(255, 255, 255, 0.9), transparent 45%), - radial-gradient(circle at 92% 0%, rgba(225, 241, 252, 0.8), transparent 36%), - linear-gradient(180deg, #ebf4fa 0%, #dfeef8 55%, #d2e4f1 100%); +.tagline { + font-size: 0.74rem; + letter-spacing: 0.12em; + color: var(--card-sub); + text-transform: uppercase; + white-space: nowrap; } -body.weather-storm { - background: - radial-gradient(circle at 30% -10%, rgba(140, 160, 181, 0.36), transparent 44%), - radial-gradient(circle at 100% 5%, rgba(80, 111, 142, 0.45), transparent 34%), - linear-gradient(180deg, #6f8598 0%, #576d83 55%, #42566c 100%); +/* ── Tabs ── */ +.tabs { + display: flex; + gap: 0; + border: 1px solid var(--border); + border-radius: 10px; + overflow: hidden; } -body.weather-fog { - background: - radial-gradient(circle at 15% 0%, rgba(241, 246, 249, 0.9), transparent 44%), - radial-gradient(circle at 92% 0%, rgba(214, 224, 231, 0.6), transparent 36%), - linear-gradient(180deg, #d9e3e9 0%, #cdd9e0 55%, #c0ced7 100%); +.tab { + background: transparent; + border: none; + border-right: 1px solid var(--border); + padding: 0.4rem 1rem; + font-family: var(--mono); + font-size: 0.84rem; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--ink-mid); + cursor: pointer; + transition: background 0.15s, color 0.15s; } -body.weather-night { - background: - radial-gradient(circle at 15% -10%, rgba(123, 145, 173, 0.2), transparent 44%), - radial-gradient(circle at 100% 0%, rgba(74, 104, 131, 0.28), transparent 34%), - linear-gradient(180deg, #0b1722 0%, #102131 55%, #13283b 100%); +.tab:last-child { border-right: none; } +.tab:hover { background: var(--paper-dark); color: var(--ink); } +.tab.active { background: var(--ink); color: var(--paper); } + +/* ── Search ── */ +.search-wrap { + position: relative; + margin-bottom: 2rem; + background: var(--card-bg); + border: var(--surface-border); + border-radius: var(--surface-radius-md); + padding: 0.55rem; + box-shadow: var(--surface-shadow); } -a { color: var(--info); text-decoration: none; } -a:hover { text-decoration: underline; } -.hidden { display: none !important; } +.search-row { display: flex; } -.app { - width: 100%; - max-width: 100%; - padding: calc(0.7rem + env(safe-area-inset-top, 0px)) 0.75rem calc(6.9rem + env(safe-area-inset-bottom, 0px)); +.search-row input { + flex: 1; + min-width: 0; + background: rgba(0, 0, 0, 0.18); + border: 1px solid rgba(255, 255, 255, 0.14); + border-right: none; + padding: 0.6rem 1rem; + font-family: var(--mono); + font-size: 0.95rem; + color: var(--card-ink); + outline: none; + border-radius: 0; + transition: background 0.15s; } -/* Header */ -.masthead { - 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; +.search-row input::placeholder { color: var(--card-sub); } +.search-row input:focus { background: rgba(0, 0, 0, 0.25); } + +.search-row button { + background: rgba(0, 0, 0, 0.24); + color: var(--card-ink); + border: 1px solid rgba(255, 255, 255, 0.14); + padding: 0.6rem 1.1rem; + font-family: var(--mono); + font-size: 0.84rem; + letter-spacing: 0.08em; + text-transform: uppercase; + cursor: pointer; + border-radius: 0; + transition: opacity 0.15s; + white-space: nowrap; } -.masthead h1 { - font-family: var(--display); - font-size: 1.7rem; - letter-spacing: -0.3px; - margin-bottom: 0.35rem; - color: #111; - text-shadow: - 0 1px 2px rgba(255,255,255,0.7), - 0 0 8px rgba(255,255,255,0.5); +.search-row button:hover { opacity: 0.72; } + +#locate-btn { + background: rgba(0, 0, 0, 0.22) !important; + color: var(--card-ink) !important; + border-left: none !important; + font-size: 1.2rem !important; + letter-spacing: 0 !important; + padding: 0.6rem 0.9rem !important; } -.tagline { - display: block; - margin-top: 0.35rem; - font-size: 0.76rem; - letter-spacing: 0.04em; - color: rgba(0,0,0,0.65); - text-shadow: 0 1px 2px rgba(255,255,255,0.6); +#units-btn { + background: rgba(0, 0, 0, 0.22) !important; + color: var(--card-ink) !important; + border-left: none !important; + min-width: 76px; } -/* Bottom nav */ -.tabs { - position: fixed; - left: 0; - right: 0; - bottom: 0; - width: 100vw; - max-width: 100vw; - 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); -} - -@supports (bottom: env(safe-area-inset-bottom)) { - .tabs { - bottom: 0; - padding-bottom: calc(0.45rem + env(safe-area-inset-bottom)); - } +.saved-wrap { margin-top: 0.6rem; } +.saved-head { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 0.62rem; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--ink-light); + margin-bottom: 0.35rem; } -.tab { - border: none; - border-radius: 12px; - min-width: 0; - min-height: 58px; - padding: 0.32rem 0.15rem; +.saved-locations { display: flex; - flex-direction: column; + flex-wrap: wrap; + gap: 0.35rem; + font-size: 0.72rem; + color: var(--ink-mid); +} + +/* ── Toggle Switch ── */ +.switch-toggle { + display: inline-flex; align-items: center; - justify-content: center; - gap: 0.24rem; - background: rgba(255, 255, 255, 0.04); - color: #d8eaf4; + position: relative; + width: 50px; + height: 28px; cursor: pointer; - font-family: var(--ui); + user-select: none; } -.tab-icon { - font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Noto Color Emoji', sans-serif; - font-size: 1.18rem; - line-height: 1; +.switch-toggle input { + display: none; } -.tab-text { - font-size: 0.67rem; - line-height: 1; - letter-spacing: 0.02em; - font-weight: 600; +.toggle-slider { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(255, 255, 255, 0.1); + border: 1px solid var(--surface-border); + border-radius: 14px; + transition: all 0.3s ease; + display: flex; + align-items: center; } -.tab.active { - color: #fff; - background: linear-gradient(180deg, var(--brand) 0%, var(--brand-strong) 100%); +.toggle-slider::before { + content: ''; + position: absolute; + width: 22px; + height: 22px; + border-radius: 50%; + background-color: var(--ink-light); + left: 2px; + transition: all 0.3s ease; } -/* Search */ -.search-wrap { - margin-bottom: 0.4rem; +.switch-toggle input:checked + .toggle-slider { + background-color: var(--accent); + border-color: var(--accent); } -.search-row { - display: flex; - align-items: center; - flex-wrap: nowrap; - gap: 0; - border: 1px solid var(--line); - border-radius: var(--radius-lg); - overflow: hidden; - background: var(--surface); - box-shadow: var(--shadow-md); +.switch-toggle input:checked + .toggle-slider::before { + left: 26px; + background-color: #fff; } -button, input, select { font-family: var(--ui); } +.switch-toggle input:disabled + .toggle-slider { + opacity: 0.5; + cursor: not-allowed; +} -.search-row input, -.search-row button, -.maps-control select, -.settings-btn { - font-size: 16px; /* prevent iOS focus zoom */ +.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; } -.search-row input { - flex: 1; - min-width: 0; - min-height: 46px; - border: none; - background: transparent; - color: var(--ink); - padding: 0 0.75rem; +.auto-detect-toggle input { + accent-color: var(--accent); } -.search-row button { - flex: 0 0 auto; - min-height: 46px; - border: none; - border-left: 1px solid var(--line); +.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; - padding: 0 0.65rem; + user-select: none; } -#search-btn { - background: linear-gradient(180deg, #15445f 0%, #11344c 100%); - color: #f2f8fc; - min-width: 52px; - width: 52px; - font-size: 0; - letter-spacing: 0; - text-transform: none; - padding: 0; +.toggle-label input { + accent-color: var(--accent); } -#search-btn::before { - content: '🔎'; - font-size: 1rem; - line-height: 1; +.toggle-label span { + min-width: 24px; } -#locate-btn, -#units-btn { - background: var(--surface) !important; - color: var(--ink) !important; - min-width: 48px; +.saved-item { + display: inline-flex; + border: 1px solid var(--border); + background: var(--paper-dark); } -#locate-btn { - font-size: 1.05rem !important; +.saved-chip, +.saved-remove { + border: none; + background: transparent; + color: var(--ink); + padding: 0.35rem 0.45rem; + font-family: var(--mono); + cursor: pointer; } -@media (max-width: 390px) { - #search-btn, - #locate-btn, - #units-btn { - min-width: 46px; - width: 46px; - padding: 0 0.5rem; - } +.saved-remove { + border-left: 1px solid var(--border); + 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; - margin-top: 0.3rem; - border-radius: var(--radius-lg); - overflow: hidden; - border: 1px solid var(--line); - background: var(--surface); - box-shadow: var(--shadow-lg); } .suggestions li { - padding: 0.72rem 0.8rem; - border-bottom: 1px solid var(--line); - font-size: 0.88rem; + 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: rgba(29, 135, 191, 0.09); } -.sug-country { color: var(--ink-muted); font-size: 0.8rem; margin-left: 0.35rem; } +.suggestions li:hover { background: var(--paper-dark); } +.sug-country { color: var(--ink-light); margin-left: 0.5rem; font-size: 0.75rem; } -.error { - margin-top: 0.35rem; - color: var(--danger); - font-size: 0.84rem; -} +/* ── Error / Loading ── */ +.error { font-size: 0.78rem; color: var(--accent); margin-top: 0.5rem; } -/* 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; + justify-content: center; + min-height: calc(100vh - 200px); + padding: 3rem; } -.loading { +.loading-container { display: flex; + flex-direction: column; align-items: center; - gap: 0.65rem; - color: var(--ink-soft); - font-size: 0.88rem; - padding: 1rem 0.35rem; + gap: 2rem; + text-align: center; } -.loading-dot { - width: 11px; - height: 11px; - border-radius: 50%; - background: var(--brand); - animation: pulse 1.1s ease-in-out infinite; +.loading-icon { + font-size: 6rem; + animation: float 2s ease-in-out infinite; } -@keyframes pulse { - 0%, 100% { opacity: 0.4; transform: scale(0.9); } - 50% { opacity: 1; transform: scale(1.08); } +.loading-text { + font-size: 1.5rem; + font-weight: 500; + color: var(--ink); + letter-spacing: 0.05em; } -.loc-header { - padding: 0.9rem; - margin-bottom: 0.75rem; +.loading-dots { display: flex; - flex-direction: column; - gap: 0.4rem; + gap: 0.5rem; + justify-content: center; } -.loc-name { - font-family: var(--display); - font-size: 1.5rem; - line-height: 1.1; +.loading-dots span { + width: 10px; + height: 10px; + border-radius: 50%; + background: var(--accent); + animation: bounce 1.4s ease-in-out infinite; } -.loc-sub, -.loc-time { - font-size: 0.8rem; - color: var(--ink-muted); +.loading-dots span:nth-child(1) { animation-delay: 0s; } +.loading-dots span:nth-child(2) { animation-delay: 0.2s; } +.loading-dots span:nth-child(3) { animation-delay: 0.4s; } + +@keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-20px); } } +@keyframes bounce { 0%, 100% { transform: translateY(0); opacity: 0.4; } 50% { transform: translateY(-15px); 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; + border: var(--surface-border); + border-radius: var(--surface-radius-lg); + background: var(--card-bg-soft); + padding: 0.9rem 1rem; +} + +.loc-name { font-family: var(--serif); font-size: 1.6rem; font-weight: 400; line-height: 1.1; } +.loc-name { color: var(--card-ink); } +.loc-sub { font-size: 0.8rem; color: var(--card-sub); letter-spacing: 0.06em; margin-top: 0.2rem; text-transform: uppercase; } +.loc-time { font-size: 0.8rem; color: var(--card-sub); 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; } + +/* ── HERO ── */ +.hero { + display: grid; + grid-template-columns: 1fr 1.5fr 1fr; + align-items: center; + gap: 1rem; + border: var(--surface-border); + border-radius: var(--surface-radius-lg); + background: var(--card-bg); + color: var(--card-ink); + padding: 1.4rem 1rem; + margin-bottom: 1.8rem; } -.loc-actions { +.hero-left { display: flex; flex-direction: column; align-items: flex-start; - gap: 0.32rem; + gap: 0.4rem; } -.link-btn { - border: none; - background: none; - color: var(--info); - cursor: pointer; - font-size: 0.84rem; +.hero-icon { font-size: 3.5rem; line-height: 1; } +.hero-desc { font-size: 0.9rem; font-weight: 500; } +.hero-sub { font-size: 0.82rem; color: var(--card-sub); margin-top: 0.15rem; } + +.hero-center { text-align: center; } + +.hero-temp { + font-family: var(--serif); + font-size: 6.5rem; + font-weight: 400; + line-height: 1; + letter-spacing: -4px; } -.section-head { +.deg { font-family: var(--mono); font-size: 2rem; color: var(--card-sub); vertical-align: super; letter-spacing: 0; display: inline; } +.feels { font-size: 0.86rem; color: var(--card-sub); margin-top: 0.5rem; } + +.hero-right { display: flex; justify-content: flex-end; } + +.hero-hilo { display: flex; flex-direction: column; - gap: 0.22rem; - margin: 0.35rem 0.45rem 0.5rem; + align-items: center; + gap: 0.6rem; + background: rgba(0, 0, 0, 0.2); + border: 1px solid rgba(255, 255, 255, 0.12); + padding: 1rem 1.4rem; + min-width: 80px; } -.section-label { - font-size: 0.74rem; - color: var(--ink-soft); - text-transform: uppercase; - letter-spacing: 0.08em; - font-weight: 700; +.hilo-item { + display: flex; + flex-direction: column; + align-items: center; + line-height: 1.2; + font-size: 1.3rem; + font-weight: 500; } -.section-note { - color: var(--ink-muted); - font-size: 0.79rem; +.hilo-arrow { font-size: 0.75rem; color: var(--ink-light); } +.hilo-label { font-size: 0.55rem; text-transform: uppercase; letter-spacing: 0.1em; color: var(--card-sub); margin-top: 0.15rem; } +.hilo-divider { width: 100%; height: 1px; background: rgba(255, 255, 255, 0.12); } + +/* ── Sun & Moon Timeline ── */ +.sun-section { + border: var(--surface-border); + background: var(--card-bg); + color: var(--card-ink); + border-radius: var(--surface-radius-md); + padding: 1rem 1.1rem; + margin-bottom: 2rem; } -.section-actions { - display: inline-flex; - flex-wrap: wrap; - gap: 0.62rem; +.sun-timeline-wrap { + display: flex; + align-items: center; + gap: 0.75rem; + margin-bottom: 0.65rem; } -/* Current */ -.current-grid { - display: grid; - gap: 0.6rem; - margin-bottom: 0.75rem; +.sun-endpoint { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.2rem; + flex-shrink: 0; } -.current-grid > * { - border-radius: var(--radius-lg); - border: 1px solid var(--line); - background: var(--surface); - padding: 1rem 0.85rem; - box-shadow: var(--shadow-md); +.sun-ep-icon { font-size: 1.6rem; line-height: 1; } +.sun-ep-time { font-size: 0.8rem; font-weight: 600; color: var(--card-sub); white-space: nowrap; } + +.sun-track-wrap { flex: 1; position: relative; } + +.sun-track { + height: 6px; + background: rgba(255, 255, 255, 0.14); + border-radius: 3px; + position: relative; + overflow: visible; } -.temp-big { - font-family: var(--display); - font-size: 3.75rem; - line-height: 0.92; - letter-spacing: -1.5px; +.sun-progress { + height: 100%; + background: linear-gradient(90deg, #fb923c, #fbbf24); + border-radius: 3px; + transition: width 0.6s ease; } -.deg { - font-size: 1.35rem; - color: var(--ink-soft); - vertical-align: super; +.sun-dot { + position: absolute; + top: 50%; + transform: translate(-50%, -50%); + font-size: 1.2rem; + pointer-events: none; + transition: left 0.6s ease; } -.feels, -.hi-lo, -.cond-sub { - font-size: 0.84rem; - color: var(--ink-soft); +.moon-row { + display: flex; + align-items: center; + gap: 0.6rem; + font-size: 0.85rem; + font-weight: 500; + color: var(--card-sub); + border-top: 1px solid rgba(255, 255, 255, 0.12); + padding-top: 0.6rem; } -.current-cond { display: flex; flex-direction: column; justify-content: center; } -.cond-icon { font-size: 2.2rem; margin-bottom: 0.15rem; } -.cond-desc { font-size: 1.08rem; font-weight: 700; } +.moon-emoji { font-size: 1.2rem; } +.daylight-info { margin-left: auto; font-size: 0.78rem; font-weight: 500; color: var(--card-sub); } -/* Stat blocks */ -.stats-bar, -.astro-grid, -.aq-grid { +/* ── Card Group ── */ +.card-group { display: grid; - gap: 0.52rem; - border: none; - background: transparent; - box-shadow: none; - margin-bottom: 0.78rem; + grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); + gap: 1px; + background: rgba(255, 255, 255, 0.08); + border: var(--surface-border); + border-radius: var(--surface-radius-md); + overflow: hidden; + margin-bottom: 2rem; } -.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(--line); - border-radius: var(--radius-md); - background: var(--surface); - box-shadow: var(--shadow-md); +.stat-card { + background: var(--card-bg); + padding: 1rem 0.9rem; + display: flex; + flex-direction: column; + gap: 0.3rem; } -.stat { padding: 0.78rem 0.58rem; text-align: center; } - -.stat-label { - font-size: 0.64rem; +.stat-card .stat-label { + font-size: 0.68rem; + letter-spacing: 0.12em; text-transform: uppercase; - letter-spacing: 0.08em; - color: var(--ink-muted); - margin-bottom: 0.2rem; font-weight: 700; + color: var(--card-sub); } -.stat-val { font-size: 1.02rem; font-weight: 700; } -.unit { font-size: 0.72rem; color: var(--ink-soft); } +.stat-card .stat-val { + font-size: 1.65rem; + font-weight: 600; + line-height: 1.2; + color: var(--card-ink); +} -.astro-card, -.aq-card, -.maps-card { padding: 0.74rem 0.7rem; } -.astro-val, -.aq-val, -.maps-value { font-size: 0.98rem; font-weight: 700; } +.stat-unit { font-size: 0.85rem; font-weight: 600; color: var(--card-sub); margin-left: 2px; } +.stat-sub { font-size: 0.8rem; font-weight: 500; color: var(--card-sub); } -/* Radar & maps */ -.radar-embed-wrap, -.radar-full-wrap, -.maps-wrap, -.alerts-wrap, -.settings-wrap { - padding: 0.7rem; - margin-bottom: 0.85rem; +/* ── Details Drawer ── */ +.details-drawer { + border: var(--surface-border); + margin-bottom: 2rem; + background: var(--card-bg); + border-radius: var(--surface-radius-md); + overflow: hidden; } -.radar-map, -.map-overview { - width: 100%; - height: 235px; - border-radius: var(--radius-md); - border: 1px solid var(--line); - overflow: hidden; +.drawer-summary { + list-style: none; + font-size: 0.68rem; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--card-sub); + padding: 0.75rem 1rem; + cursor: pointer; + display: flex; + align-items: center; + justify-content: space-between; + user-select: none; } -.radar-map-full { - height: calc(100dvh - 20rem); - min-height: 310px; +.drawer-summary::-webkit-details-marker { display: none; } +.drawer-summary:focus { outline: none; } + +.drawer-chevron { + font-size: 1.1rem; + transition: transform 0.2s; + display: inline-block; } -.radar-controls { +details[open] .drawer-chevron { transform: rotate(90deg); } + +.drawer-body { border-top: 1px solid rgba(255, 255, 255, 0.1); } +.drawer-card-group { margin-bottom: 0; border: none; } + +/* ── What to Bring ── */ +.recs-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(90px, 1fr)); + gap: 0.5rem; + margin-bottom: 2rem; +} + +.rec-item { + background: var(--card-bg); + border: var(--surface-border); + border-radius: var(--surface-radius-md); + padding: 0.85rem 0.6rem; + text-align: center; display: flex; - flex-wrap: wrap; + flex-direction: column; align-items: center; - gap: 0.45rem; - margin-top: 0.62rem; + gap: 0.4rem; } -.radar-btn { - width: 46px; - height: 46px; - border: none; - border-radius: 12px; - background: #0f3248; - color: #f5fbfe; - cursor: pointer; - font-size: 0.86rem; +.rec-icon { font-size: 2rem; line-height: 1; } +.rec-label { font-size: 0.72rem; font-weight: 600; color: var(--card-sub); letter-spacing: 0.04em; line-height: 1.3; } + +.alerts-wrap { + border: var(--surface-border); + border-radius: var(--surface-radius-md); + padding: 0.75rem; + margin-bottom: 1.2rem; + background: var(--card-bg); } -.layer-btn { background: var(--brand); } +.alerts-list { + display: grid; + gap: 0.5rem; +} -.radar-timeline { - order: 3; - flex-basis: 100%; - height: 32px; - display: flex; - gap: 2px; +.alert-item { + display: grid; + gap: 0.2rem; + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 10px; + padding: 0.55rem; + background: var(--card-bg-soft); + font-size: 0.72rem; } -.tl-tick { - flex: 1; - border-radius: 7px; - border: 1px solid var(--line); - background: rgba(255, 255, 255, 0.52); - cursor: pointer; +.panel-note { + font-size: 0.72rem; + color: var(--ink-light); + border: var(--surface-border); + border-radius: var(--surface-radius-md); + padding: 0.75rem; + background: var(--card-bg); } -.tl-tick.active { background: var(--info); border-color: var(--info); } -.tl-tick.forecast { opacity: 0.6; } +.settings-wrap { + border: var(--surface-border); + border-radius: var(--surface-radius-md); + background: var(--card-bg); + padding: 0.9rem; + display: grid; + gap: 1rem; +} -.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.64rem; color: var(--ink-muted); } -.legend-bar { - width: 84px; - height: 10px; - border-radius: 999px; - border: 1px solid var(--line); - background: linear-gradient(to right, #00d8ff, #00a0e0, #0070d0, #00c800, #ffff00, #ff6000, #ff0000); +.settings-row { + display: flex; + align-items: center; + justify-content: space-between; + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 10px; + background: var(--card-bg-soft); + padding: 0.65rem 0.75rem; } -.radar-attribution, -.footer-note { - font-size: 0.74rem; - color: var(--ink-muted); - margin-bottom: 0.8rem; +.settings-label { + font-size: 0.72rem; + color: var(--ink-mid); + text-transform: uppercase; + letter-spacing: 0.08em; } -/* Hourly */ -.hourly-summary { - margin: 0.22rem 0.38rem 0.45rem; +.settings-value { font-size: 0.8rem; - color: var(--ink-soft); + color: var(--ink); + text-align: right; } -.hourly-scroll { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - margin-bottom: 0.85rem; - padding: 0.42rem; +.settings-btn { + border: 1px solid rgba(255, 255, 255, 0.14); + border-radius: 10px; + background: var(--card-bg-soft); + color: var(--ink); + padding: 0.45rem 0.7rem; + font-family: var(--mono); + font-size: 0.72rem; + cursor: pointer; } -.hourly-track { display: flex; min-width: max-content; } +.settings-btn:hover { background: var(--card-bg); } -.hour-cell { - min-width: 90px; - padding: 0.72rem 0.45rem; - text-align: center; - border-radius: 12px; - border: 1px solid var(--line); - background: var(--surface); - margin-right: 0.3rem; +.maps-wrap { + border: var(--surface-border); + border-radius: var(--surface-radius-md); + background: var(--card-bg); + padding: 1rem; + display: flex; + flex-direction: column; + gap: 1rem; } -.hour-cell.now { - background: linear-gradient(180deg, rgba(29, 135, 191, 0.18) 0%, var(--surface) 100%); +.maps-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 0.5rem; } -.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); } +.maps-header h3 { + margin: 0; + font-size: 1.1rem; + font-weight: 600; + color: var(--card-ink); +} -/* Daily */ -.daily-list { - padding: 0.4rem; - margin-bottom: 0.9rem; +.maps-quick-toggles { + display: flex; + gap: 0.5rem; } -.day-row { - display: grid; - grid-template-columns: 1fr auto; - grid-template-areas: - 'name temps' - 'desc desc'; - 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(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.78rem; - color: var(--ink-soft); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; +.overlay-toggle { + padding: 0.5rem 1rem; + border: 1px solid var(--surface-border); + border-radius: var(--surface-radius-sm); + background: var(--card-bg-soft); + color: var(--card-sub); + font-size: 0.85rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; } -.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.75rem; - font-size: 0.82rem; - color: var(--ink-soft); +.overlay-toggle:hover { + background: var(--card-bg); + border-color: var(--accent); } -.alerts-list, -.saved-locations, -.maps-controls, -.maps-meta { - display: grid; - gap: 0.5rem; +.overlay-toggle.active { + background: var(--accent); + color: #fff; + border-color: var(--accent); } -.alert-item { - padding: 0.72rem; - display: grid; - gap: 0.22rem; - font-size: 0.82rem; +.map-overview { + height: 360px; + border: var(--surface-border); + border-radius: 10px; + box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.2); } -.maps-control { +.maps-legend { display: grid; - gap: 0.3rem; - font-size: 0.68rem; - color: var(--ink-muted); - text-transform: uppercase; - letter-spacing: 0.05em; + grid-template-columns: 1fr 1fr; + gap: 1rem; + padding: 0.75rem; + background: rgba(255, 255, 255, 0.04); + border: var(--surface-border); + border-radius: 8px; } -.maps-control input, -.maps-control select, -.settings-btn { - min-height: 44px; - border: 1px solid var(--line); - border-radius: 12px; - background: var(--surface); - color: var(--ink); - padding: 0.35rem 0.55rem; +.legend-section { + display: flex; + flex-direction: column; + gap: 0.5rem; } -#maps-fullscreen-btn { - font-size: 0.78rem; - font-weight: 700; +.legend-title { + font-size: 0.8rem; + font-weight: 600; + color: var(--card-ink); + text-transform: uppercase; + letter-spacing: 0.05em; } -body.map-fullscreen-lock { - overflow: hidden; +.legend-item { + display: flex; + align-items: center; + gap: 0.6rem; + font-size: 0.75rem; + color: var(--card-sub); } -.maps-wrap.is-fullscreen { - position: fixed; - inset: 0; - z-index: 520; - margin: 0; - border-radius: 0; - border: none; - background: var(--paper); - overflow-y: auto; - padding: calc(0.65rem + env(safe-area-inset-top, 0px)) 0.65rem calc(0.65rem + env(safe-area-inset-bottom, 0px)); +.legend-item svg { + flex-shrink: 0; } -.maps-wrap.is-fullscreen .map-overview { - height: calc(100dvh - 210px); - min-height: 320px; +.maps-data { + display: grid; + grid-template-columns: 1fr 1.2fr; + gap: 1rem; } -.wind-legend { +.maps-card { + background: var(--card-bg-soft); + border: var(--surface-border); + border-radius: var(--surface-radius-sm); + padding: 1rem; display: flex; - align-items: center; - flex-wrap: wrap; - gap: 0.42rem; - margin-top: 0.52rem; - font-size: 0.71rem; - color: var(--ink-muted); + flex-direction: column; + gap: 0.75rem; } -.wind-legend-scale { - width: 126px; - height: 10px; - border-radius: 999px; - border: 1px solid var(--line); - background: linear-gradient(to right, #d2f0ff, #84ccff, #3f9fff, #1879df); +.card-title { + font-size: 0.8rem; + font-weight: 600; + color: var(--card-sub); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.maps-value { + font-size: 1rem; + font-weight: 500; + color: var(--card-ink); } -.saved-wrap { margin-top: 0.1rem; } +.wind-stats { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 0.75rem; +} -.saved-head { +.wind-stat { display: flex; flex-direction: column; - align-items: flex-start; - gap: 0.3rem; - margin-bottom: 0.32rem; - color: var(--ink-muted); + gap: 0.25rem; +} + +.wind-stat .stat-label { + font-size: 0.7rem; + color: var(--card-sub); text-transform: uppercase; - letter-spacing: 0.07em; - font-size: 0.67rem; + letter-spacing: 0.05em; } -.saved-help { - margin-bottom: 0.38rem; - font-size: 0.74rem; - color: var(--ink-muted); +.wind-stat .stat-value { + font-size: 1.1rem; + font-weight: 600; + color: var(--accent); } -.saved-item { - display: grid; - grid-template-columns: 36px 1fr 36px 36px 36px; - border: 1px solid var(--line); - border-radius: 12px; - background: var(--surface); - overflow: hidden; +.stat-label { font-size: 0.58rem; letter-spacing: 0.1em; color: var(--ink-light); text-transform: uppercase; margin-bottom: 0.3rem; } + +/* ── Section heads ── */ +.section-head { + display: flex; + justify-content: space-between; + align-items: baseline; + margin-bottom: 0.6rem; } -.saved-chip, -.saved-remove, -.saved-default, -.saved-move { - min-height: 44px; +.section-label { font-size: 0.74rem; font-weight: 800; letter-spacing: 0.14em; color: var(--ink); text-transform: uppercase; } +.section-note { font-size: 0.72rem; color: var(--card-sub); font-style: italic; } + +.link-btn { + background: none; border: none; - background: transparent; - color: var(--ink); + font-family: var(--mono); + font-size: 0.82rem; + font-weight: 600; + color: var(--cool); cursor: pointer; + padding: 0.35rem 0.65rem; + font-style: italic; } -.saved-chip { - padding: 0 0.58rem; - text-align: left; - border-left: 1px solid var(--line); - border-right: 1px solid var(--line); - white-space: nowrap; +.link-btn:hover { text-decoration: underline; } + +/* ── Radar maps ── */ +.radar-embed-wrap { + border: var(--surface-border); + border-radius: var(--surface-radius-md); overflow: hidden; - text-overflow: ellipsis; + margin-bottom: 2rem; + background: #1a1f2e; } -.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; } +.radar-map { + width: 100%; + height: 320px; +} -.settings-wrap { display: grid; gap: 0.62rem; } +.radar-map-full { + height: calc(100vh - 280px); + min-height: 420px; +} -.settings-row { +.radar-full-wrap { + border: var(--surface-border); + border-radius: var(--surface-radius-md); + background: #1a1f2e; + margin-bottom: 0.5rem; + overflow: hidden; +} + +/* ── Radar controls ── */ +.radar-controls { display: flex; - flex-direction: column; - align-items: flex-start; - gap: 0.45rem; - padding: 0.74rem; + align-items: center; + gap: 0.75rem; + padding: 0.6rem 0.75rem; + background: var(--paper-darker); + border-top: 1px solid var(--border); } -.settings-label { - font-size: 0.72rem; - color: var(--ink-muted); - text-transform: uppercase; - letter-spacing: 0.05em; - font-weight: 700; +.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; } -.settings-value { font-size: 0.88rem; color: var(--ink); } +.radar-btn:hover { opacity: 0.72; } +.layer-btn { background: var(--accent); } -.auto-detect-toggle, -.toggle-label { - display: inline-flex; +.radar-timeline { + flex: 1; + display: flex; + gap: 2px; align-items: center; - gap: 0.48rem; - color: var(--ink-soft); - font-size: 0.9rem; + 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; } -.auto-detect-toggle input, -.toggle-label input { accent-color: var(--brand); } +.tl-tick:hover { background: var(--paper); } +.tl-tick.active { background: var(--cool); border-color: var(--cool); } +.tl-tick.forecast { opacity: 0.55; } -button:focus-visible, -input:focus-visible, -select:focus-visible { - outline: 2px solid var(--brand); - outline-offset: 2px; +.radar-ts { + font-size: 0.74rem; + color: var(--ink); + font-weight: 600; + letter-spacing: 0.04em; + white-space: nowrap; + min-width: 80px; + text-align: right; } -/* Leaflet */ -.leaflet-container { background: #1a2430; } -.leaflet-control-zoom a { - background: var(--surface) !important; - color: var(--ink) !important; - border-color: var(--line) !important; -} - -/* High contrast */ -body.high-contrast { - --ink: #0a0a0a; - --ink-soft: #1f1f1f; - --ink-muted: #3b3b3b; - --paper: #fff; - --paper-deep: #f2f2f2; - --surface: #fff; - --surface-soft: #fff; - --line: #111; - --brand: #a93a00; - --brand-strong: #8d2f00; - --info: #005a82; -} - -/* Desktop second */ -@media (min-width: 940px) { - html, body { font-size: 16px; } +/* Radar legend */ +.radar-legend { + display: flex; + align-items: center; + gap: 0.4rem; + margin-left: 0.5rem; +} - .app { - max-width: 1120px; - margin: 0 auto; - padding: 1.35rem 1.3rem calc(6.9rem + env(safe-area-inset-bottom, 0px)); - } +.legend-label { font-size: 0.66rem; color: var(--ink-mid); letter-spacing: 0.06em; } - .masthead { - position: static; - display: grid; - grid-template-columns: auto 1fr; - align-items: center; - gap: 1rem; - margin-bottom: 1rem; - padding: 0; - border: none; - box-shadow: none; - background: transparent; - backdrop-filter: none; - } +.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); +} - .masthead h1 { margin: 0; font-size: 2rem; } +.radar-attribution { + font-size: 0.62rem; + color: var(--ink-light); + padding-top: 0.5rem; +} - .tabs { - position: fixed; - left: 0; - right: 0; - bottom: 0; - width: 100vw; - max-width: 100vw; - 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; - } +/* ── Hourly scroll ── */ +.hourly-scroll { + overflow-x: auto; + margin-bottom: 2rem; + border: var(--surface-border); + border-radius: var(--surface-radius-md); + scrollbar-width: thin; + scrollbar-color: var(--border) transparent; +} - .tab { - 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; - } +.hourly-track { display: flex; min-width: max-content; } - .tab-icon { - font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Noto Color Emoji', sans-serif; - font-size: 1.18rem; - line-height: 1; - } +.hour-cell { + min-width: 72px; + padding: 0.75rem 0.5rem; + text-align: center; + border-right: 0.5px solid var(--border); + background: var(--card-bg); + transition: background 0.12s; +} - .tab-text { - font-size: 0.67rem; - line-height: 1; - letter-spacing: 0.02em; - font-weight: 600; - } +.hour-cell:last-child { border-right: none; } +.hour-cell:hover { background: var(--paper-dark); } +.hour-cell.now { background: var(--paper-darker); } - .tab.active { - color: #fff; - background: linear-gradient(180deg, var(--brand) 0%, var(--brand-strong) 100%); - } +.hour-time { font-size: 0.6rem; color: var(--card-sub); 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; color: var(--card-ink); } +.hour-precip { font-size: 0.64rem; color: #1f5f7e; margin-top: 0.2rem; font-weight: 600; } - .tagline { margin: 0; } +/* ── Daily forecast ── */ +.daily-list { + border: none; + display: grid; + gap: 0.55rem; + margin-bottom: 2rem; +} - .search-row input { min-height: 48px; } - #search-btn { min-width: 140px; } +.day-row { + display: grid; + grid-template-columns: 120px 44px 1fr 80px 60px; + align-items: center; + gap: 1rem; + padding: 0.85rem 1.1rem; + border: var(--surface-border); + border-radius: var(--surface-radius-md); + background: var(--card-bg); + transition: background 0.12s; +} + +.day-row:last-child { border-bottom: var(--surface-border); } +.day-row:hover { background: var(--paper-dark); } +.day-row.today { background: var(--paper-dark); } + +.day-name { font-size: 0.8rem; font-weight: 500; color: var(--card-ink); } +.day-icon { font-size: 1.5rem; text-align: center; } +.day-desc { font-size: 0.75rem; color: var(--ink-mid); } +.day-temps { text-align: right; font-size: 0.82rem; font-weight: 500; white-space: nowrap; color: var(--card-ink); } +.day-lo { color: var(--ink-mid); } +.day-meta { text-align: right; font-size: 0.62rem; color: var(--ink-mid); line-height: 1.6; } + +/* ── Footer ── */ +.footer-note { + font-size: 0.72rem; + color: var(--ink-light); + letter-spacing: 0.04em; + border-top: 0.5px solid var(--border); + padding-top: 0.75rem; +} - .loc-header { - flex-direction: row; - justify-content: space-between; - align-items: flex-end; +/* ── PWA: safe area insets (iPhone notch / home bar) ── */ +@supports (padding: env(safe-area-inset-bottom)) { + .app { + padding-top: max(2rem, calc(1rem + env(safe-area-inset-top))); + 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)); } +} - .loc-actions { align-items: flex-end; } +/* ── PWA: status bar area when running standalone ── */ +@media (display-mode: standalone) { + .masthead { padding-top: max(1rem, calc(0.75rem + env(safe-area-inset-top))); } +} - .current-grid { grid-template-columns: 1fr 1fr; } - .stats-bar { grid-template-columns: repeat(6, minmax(0, 1fr)); } +/* ── Touch-friendly tap targets (min 44 × 44 px) ── */ +.tab { + min-height: 44px; + 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; } - .astro-grid, - .aq-grid, - .maps-meta, - .maps-controls { grid-template-columns: repeat(3, minmax(0, 1fr)); } +/* iOS momentum scrolling */ +.hourly-scroll { -webkit-overflow-scrolling: touch; } - .maps-controls { grid-template-columns: 1fr 1fr; } - .alerts-list { grid-template-columns: 1fr 1fr; } +/* ── Leaflet overrides ── */ +.leaflet-container { background: #1a1f2e; } +.leaflet-tile { transition: opacity 0.24s linear; } +.leaflet-control-zoom a { + background: var(--paper-dark) !important; + color: var(--ink) !important; + border-color: var(--border) !important; +} - .day-row { - grid-template-columns: 120px 44px 1fr 84px 64px; - grid-template-areas: none; - align-items: center; - gap: 0.8rem; - } +/* ── Mobile Bottom Navigation ── */ +.bottom-nav { + display: none; + position: fixed; + left: 0; + right: 0; + bottom: 0; + width: 100vw; + z-index: 300; + border-top: 1px solid rgba(255, 255, 255, 0.08); + background: rgba(25, 21, 16, 0.96); + backdrop-filter: blur(6px); + padding-bottom: env(safe-area-inset-bottom, 0px); +} - .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.67rem; - color: var(--ink-muted); - line-height: 1.35; +.bottom-tab { + flex: 1; + min-height: 56px; + border: none; + border-right: 1px solid rgba(255, 255, 255, 0.08); + background: transparent; + color: #efe8dc; + font-family: var(--mono); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 0.15rem; + cursor: pointer; +} + +.bottom-tab:last-child { border-right: none; } +.bottom-icon { font-size: 1rem; line-height: 1; } +.bottom-label { font-size: 0.58rem; letter-spacing: 0.05em; text-transform: uppercase; } + +.bottom-tab.active { + background: var(--accent); + color: #fff; +} + +/* ── Responsive ── */ +@media (max-width: 640px) { + html, body { font-size: 16px; } + .app { padding: max(1.2rem, calc(0.8rem + env(safe-area-inset-top, 0px))) 0.9rem max(5.25rem, calc(4.5rem + env(safe-area-inset-bottom, 0px))); } + .masthead { + grid-template-columns: 1fr; + grid-template-rows: auto; + gap: 0.35rem; + padding: 0.75rem 0.9rem; } + .masthead h1 { font-size: 2.2rem; line-height: 1.08; } + .tagline { display: none; } + .tabs { display: none; } + .bottom-nav { display: flex; } - .saved-item { grid-template-columns: 36px 1fr 36px 36px 36px auto; } - .saved-meta { - display: block; - padding: 0 0.58rem; - font-size: 0.68rem; - color: var(--ink-muted); + #tab-radar-full { + padding-bottom: max(6.4rem, calc(5.7rem + env(safe-area-inset-bottom, 0px))); } - .settings-row { - flex-direction: row; - justify-content: space-between; + .radar-controls-full { + display: grid; + grid-template-columns: auto auto minmax(0, 1fr); + grid-template-areas: + 'play layer ts' + 'timeline timeline timeline'; + gap: 0.45rem 0.5rem; + padding: 0.55rem 0.65rem; align-items: center; } - .section-head { - flex-direction: row; - justify-content: space-between; - align-items: center; - margin-left: 0; - margin-right: 0; + .radar-controls-full .play-btn { grid-area: play; } + .radar-controls-full .layer-btn { grid-area: layer; } + .radar-controls-full .radar-ts { + grid-area: ts; + min-width: 0; + text-align: right; + font-size: 0.66rem; } - .radar-timeline { - order: 0; - flex-basis: auto; - flex: 1; - min-width: 180px; + .radar-controls-full .radar-timeline { + grid-area: timeline; + width: 100%; + height: 24px; } - .radar-ts { margin-left: auto; } + .radar-controls-full .radar-legend { display: none; } + .radar-attribution { + overflow-wrap: anywhere; + padding-bottom: 0.3rem; + } - .radar-map-full { - height: calc(100vh - 300px); - min-height: 440px; + .tab { min-width: 88px; } + .search-wrap { padding: 0.45rem; } + .search-row { + display: grid; + grid-template-columns: minmax(0, 1fr) auto auto auto; + gap: 0; + } + .search-row input { + font-size: 0.84rem; + padding: 0.58rem 0.68rem; } + .search-row button { + font-size: 0.64rem; + padding: 0.58rem 0.62rem; + letter-spacing: 0.04em; + } + #locate-btn { font-size: 1rem !important; padding: 0.58rem 0.55rem !important; } + #units-btn { min-width: 56px; } - .tab-panel { min-height: auto; } + .loc-header { + flex-direction: column; + align-items: center; + text-align: center; + gap: 0.45rem; + } + .loc-name { font-size: 2rem; } + .loc-sub { font-size: 0.88rem; } + .loc-actions { align-items: center; margin-top: 0; } + .loc-time { text-align: center; font-size: 0.88rem; } + + .hero { grid-template-columns: 1fr; text-align: center; } + .hero-left { align-items: center; } + .hero-right { justify-content: center; } + .hero-temp { font-size: 5.4rem; } + .hero-desc { font-size: 1.55rem; } + .hero-sub { font-size: 0.92rem; } + .feels { font-size: 0.95rem; } + .hilo-item { font-size: 1.35rem; } + .hilo-label { font-size: 0.78rem; } + + .section-label { font-size: 0.76rem; font-weight: 800; } + .section-note { font-size: 0.78rem; color: var(--ink-mid); } + .stat-card .stat-label { font-size: 0.75rem; font-weight: 700; } + .stat-card .stat-val { font-size: 1.8rem; font-weight: 600; } + .stat-unit { font-size: 0.95rem; font-weight: 600; } + .stat-sub { font-size: 0.95rem; font-weight: 600; } + + /* Sun & moon section */ + .sun-ep-icon { font-size: 1.8rem; } + .sun-ep-time { font-size: 0.9rem; font-weight: 600; } + .moon-row { font-size: 0.95rem; font-weight: 500; } + .moon-emoji { font-size: 1.4rem; } + .daylight-info { font-size: 0.88rem; font-weight: 500; } + + /* What to bring */ + .rec-item { padding: 0.95rem 0.68rem; } + .rec-icon { font-size: 2.2rem; } + .rec-label { font-size: 0.82rem; font-weight: 600; } + + /* Hourly readability */ + .hour-cell { min-width: 88px; padding: 0.8rem 0.55rem; } + .hour-time { font-size: 0.74rem; } + .hour-icon { font-size: 1.6rem; } + .hour-temp { font-size: 1.08rem; } + .hour-precip { font-size: 0.78rem; } + + /* 7-day readability */ + .day-row { padding: 0.95rem 0.95rem; } + .day-name { font-size: 0.98rem; } + .day-icon { font-size: 1.35rem; } + .day-desc { font-size: 0.9rem; } + .day-temps { font-size: 0.95rem; } + + /* Bottom nav readability */ + .bottom-tab { min-height: 62px; gap: 0.2rem; } + .bottom-icon { font-size: 1.2rem; } + .bottom-label { font-size: 0.68rem; letter-spacing: 0.04em; } + + .hero-hilo { flex-direction: row; gap: 1.5rem; padding: 0.75rem 1.2rem; } + .hilo-divider { width: 1px; height: 2rem; } + .card-group { grid-template-columns: repeat(2, 1fr); } + .recs-grid { grid-template-columns: repeat(3, 1fr); } + .day-row { grid-template-columns: 80px 36px 1fr 70px; } + .day-meta { display: none; } + .radar-map { height: 240px; } + .legend-bar { width: 50px; } + .settings-row { flex-direction: column; align-items: flex-start; gap: 0.5rem; } + .settings-value { text-align: left; } + .map-overview { height: 280px; } + .maps-data { grid-template-columns: 1fr; } + .maps-legend { grid-template-columns: 1fr; } + .wind-stats { grid-template-columns: 1fr 1fr; } }