Files
weather/app/public/style.css
T
Nate EmmertandClaude Sonnet 4.6 e4a5a9c4bb Style nav links as buttons across all three pages
Replace plain text/opacity links with bordered pill buttons that fill
with accent color on hover — consistent across main app, conditions,
and dashboard headers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-24 15:47:01 -04:00

2555 lines
57 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--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-radius-sm: 8px;
--surface-shadow: 0 8px 18px rgba(0, 0, 0, 0.16);
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--ink: #ece7dc;
--ink-mid: #d2c8b1;
--ink-light: #beb399;
--paper: #191510;
--paper-dark: #201c16;
--paper-darker: #2b2620;
--border: #3a342a;
--accent: #e07848;
--cool: #5ab0d8;
}
}
:root[data-theme="dark"] {
--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%;
background: var(--paper);
color: var(--ink);
font-family: var(--mono);
font-size: 16px;
line-height: 1.6;
scroll-behavior: smooth;
overflow-x: hidden;
}
.app {
max-width: 900px;
margin: 0 auto;
padding: 2rem 1.5rem 4rem;
}
a { color: var(--cool); text-decoration: none; }
a:hover { text-decoration: underline; }
/* ── 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);
}
.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;
}
.tagline {
font-size: 0.88rem;
letter-spacing: 0.08em;
color: var(--card-sub);
text-transform: uppercase;
white-space: nowrap;
}
.tagline-link {
color: inherit;
text-decoration: none;
opacity: .85;
}
.tagline-link:hover { opacity: 1; text-decoration: underline; }
.station-links {
display: flex;
align-items: center;
gap: 0.5rem;
}
.station-link {
font-size: 0.78rem;
font-weight: 600;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--card-sub);
text-decoration: none;
padding: 0.35rem 0.85rem;
border: 1px solid var(--border);
border-radius: 8px;
background: transparent;
transition: background .15s, border-color .15s, color .15s;
}
.station-link:hover {
background: var(--accent);
border-color: var(--accent);
color: #fff;
}
.settings-nav-links {
display: flex;
gap: 0.6rem;
flex-wrap: wrap;
margin-bottom: 1.5rem;
}
.settings-nav-link {
display: inline-block;
padding: 0.45rem 1rem;
background: var(--card-bg-soft);
border: 1px solid var(--border);
border-radius: 8px;
font-size: 0.85rem;
font-weight: 500;
color: var(--ink);
text-decoration: none;
transition: background .15s;
}
.settings-nav-link:hover { background: var(--border); }
/* ── Tabs ── */
.tabs {
display: flex;
gap: 0;
border: 1px solid var(--border);
border-radius: 10px;
overflow: hidden;
}
/* ── Unified Map ── */
.unified-map-wrap {
border: var(--surface-border);
border-radius: var(--surface-radius-md);
background: var(--card-bg);
padding: 1rem;
display: flex;
flex-direction: column;
gap: 1rem;
}
/* ── Map Controls ── */
.map-controls-header {
display: flex;
flex-direction: column;
gap: 0.75rem;
padding-bottom: 0.75rem;
border-bottom: var(--surface-border);
}
.map-controls-row {
display: flex;
align-items: center;
gap: 0.75rem;
}
.control-label {
font-size: 0.9rem;
font-weight: 500;
color: var(--card-ink);
}
.map-select {
padding: 0.4rem 0.6rem;
border: 1px solid var(--border);
border-radius: var(--surface-radius-sm);
background: var(--card-bg-soft);
color: var(--card-ink);
font-size: 1rem;
cursor: pointer;
}
.map-controls-toggle-grid {
display: grid;
grid-template-columns: 1fr;
gap: 0.5rem;
margin-top: 0.55rem;
}
.map-layer-menu {
border: var(--surface-border);
border-radius: var(--surface-radius-sm);
background: var(--card-bg-soft);
padding: 0.45rem 0.5rem 0.55rem;
}
.map-layer-menu-toggle {
width: 100%;
text-align: left;
background: transparent;
border: 1px solid var(--border);
border-radius: 8px;
padding: 0.45rem 0.6rem;
cursor: pointer;
user-select: none;
font-family: var(--mono);
font-size: 0.95rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--card-ink);
transition: background 0.15s;
}
.map-layer-menu-toggle:hover {
background: var(--paper-dark);
}
.map-layer-menu-title {
margin-top: 0.55rem;
font-family: var(--mono);
font-size: 0.88rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--card-sub);
}
.map-layer-menu-panel {
margin-top: 0.45rem;
}
.toggle-control {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.4rem 0.6rem;
cursor: pointer;
border-radius: var(--surface-radius-sm);
transition: background 0.15s;
font-family: var(--mono);
}
.toggle-control:hover {
background: var(--card-bg-soft);
}
.toggle-control input[type="checkbox"] {
cursor: pointer;
}
.toggle-label {
font-size: 1rem;
color: var(--card-ink);
font-weight: 700;
letter-spacing: 0.015em;
}
.unified-map-container {
height: calc(100vh - 490px);
min-height: 420px;
border: var(--surface-border);
border-radius: 10px;
overflow: hidden;
}
.unified-map-shell {
position: relative;
}
.map-overlay-readouts {
position: absolute;
left: 0.7rem;
right: 0.7rem;
bottom: 0.7rem;
display: flex;
flex-wrap: wrap;
gap: 0.45rem;
z-index: 650;
pointer-events: none;
}
.map-readout-chip {
display: inline-flex;
align-items: center;
padding: 0.3rem 0.62rem;
border-radius: 999px;
background: rgba(20, 18, 14, 0.9);
border: 1px solid rgba(255, 255, 255, 0.24);
color: #fff;
font-family: var(--mono);
font-size: 0.78rem;
font-weight: 700;
letter-spacing: 0.01em;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5);
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.34);
}
.map-timeline-wrap {
padding: 0.6rem 0.75rem;
background: var(--paper-darker);
border-top: 1px solid var(--border);
border-radius: 0 0 10px 10px;
}
.map-data-panel {
background: var(--card-bg-soft);
border: var(--surface-border);
border-radius: var(--surface-radius-sm);
padding: 1rem 1.1rem;
display: grid;
grid-template-columns: 1fr;
gap: 1rem;
}
.panel-location {
font-weight: 700;
color: var(--card-ink);
font-size: 1.08rem;
}
.panel-data {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.85rem;
}
.data-item {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.map-location-dot {
width: 12px;
height: 12px;
background: #e07848;
border: 2px solid #fff;
border-radius: 50%;
box-shadow: 0 1px 4px rgba(0,0,0,0.5);
}
.map-labeled-marker {
display: flex;
align-items: center;
gap: 5px;
cursor: pointer;
}
.map-dot {
width: 16px;
height: 16px;
border: 2px solid #fff;
border-radius: 50%;
flex-shrink: 0;
box-shadow: 0 1px 4px rgba(0,0,0,0.4);
}
.map-dot-label {
background: rgba(20, 18, 14, 0.9);
border: 1px solid rgba(255, 255, 255, 0.22);
color: #fff;
border-radius: 999px;
padding: 0.18rem 0.52rem;
font-family: var(--mono);
font-size: 0.78rem;
font-weight: 700;
letter-spacing: 0.01em;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.55);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35);
white-space: nowrap;
}
.data-label {
font-size: 0.78rem;
color: var(--card-sub);
text-transform: uppercase;
font-weight: 700;
letter-spacing: 0.06em;
}
.data-item span:last-child {
font-size: 1.02rem;
color: var(--card-ink);
font-weight: 700;
}
.tab {
background: transparent;
border: none;
border-right: 1px solid var(--border);
padding: 0.4rem 1rem;
font-family: var(--mono);
font-size: 0.95rem;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--ink-mid);
cursor: pointer;
transition: background 0.15s, color 0.15s;
min-height: 44px;
display: inline-flex;
align-items: center;
justify-content: center;
}
.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);
}
.settings-search { margin-bottom: 1rem; }
.search-row { display: flex; }
.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;
}
.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.95rem;
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: 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;
}
#units-btn {
background: rgba(0, 0, 0, 0.22) !important;
color: var(--card-ink) !important;
border-left: none !important;
min-width: 76px;
}
.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;
}
.saved-locations {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
font-size: 0.72rem;
color: var(--ink-mid);
}
/* ── Toggle Switch ── */
.switch-toggle {
display: inline-flex;
align-items: center;
position: relative;
width: 50px;
height: 28px;
cursor: pointer;
user-select: none;
}
.switch-toggle input {
display: none;
}
.toggle-slider {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(255, 255, 255, 0.1);
border: var(--surface-border);
border-radius: 14px;
transition: all 0.3s ease;
display: flex;
align-items: center;
}
.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;
}
.switch-toggle input:checked + .toggle-slider {
background-color: var(--accent);
border-color: var(--accent);
}
.switch-toggle input:checked + .toggle-slider::before {
left: 26px;
background-color: #fff;
}
.switch-toggle input:disabled + .toggle-slider {
opacity: 0.5;
cursor: not-allowed;
}
.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);
}
.saved-item {
display: inline-flex;
border: 1px solid var(--border);
background: var(--paper-dark);
}
.saved-chip,
.saved-remove {
border: none;
background: transparent;
color: var(--ink);
padding: 0.35rem 0.45rem;
font-family: var(--mono);
cursor: pointer;
}
.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;
}
.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;
justify-content: center;
min-height: calc(100vh - 200px);
padding: 3rem;
}
.loading-container {
display: flex;
flex-direction: column;
align-items: center;
gap: 2rem;
text-align: center;
}
.loading-icon {
font-size: 6rem;
animation: float 2s ease-in-out infinite;
}
.loading-text {
font-size: 1.5rem;
font-weight: 500;
color: var(--ink);
letter-spacing: 0.05em;
}
.loading-dots {
display: flex;
gap: 0.5rem;
justify-content: center;
}
.loading-dots span {
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--accent);
animation: bounce 1.4s ease-in-out infinite;
}
.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%; }
/* ── Learn tab ── */
.learn-wrap {
border: var(--surface-border);
border-radius: var(--surface-radius-md);
background: var(--card-bg);
padding: 1rem;
}
.learn-title {
font-family: var(--serif);
font-size: 1.35rem;
color: var(--card-ink);
margin-bottom: 0.35rem;
}
.learn-intro {
color: var(--card-sub);
margin-bottom: 0.95rem;
}
.learn-toc {
border: var(--surface-border);
border-radius: 10px;
background: var(--card-bg-soft);
padding: 0.6rem;
margin-bottom: 0.9rem;
}
.learn-toc-title {
font-size: 0.78rem;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--card-sub);
margin-bottom: 0.4rem;
}
.learn-toc-links {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 0.32rem;
}
.learn-toc-links a {
border: var(--surface-border);
border-radius: 999px;
background: rgba(0, 0, 0, 0.16);
color: var(--card-ink);
text-decoration: none;
font-size: 0.72rem;
font-weight: 700;
padding: 0.24rem 0.42rem;
text-align: center;
line-height: 1.2;
}
.learn-toc-links a:hover {
background: rgba(0, 0, 0, 0.3);
}
.learn-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.75rem;
}
.learn-card {
border: var(--surface-border);
border-radius: var(--surface-radius-sm);
background: var(--card-bg-soft);
padding: 0.75rem;
}
.learn-card h4 {
font-size: 0.93rem;
color: var(--card-ink);
margin-bottom: 0.3rem;
}
.learn-card p {
font-size: 0.84rem;
color: var(--card-sub);
line-height: 1.45;
}
.learn-section {
margin-top: 1rem;
border-top: var(--surface-border);
padding-top: 0.9rem;
}
.learn-section-title {
font-size: 1rem;
color: var(--card-ink);
margin-bottom: 0.25rem;
}
.learn-section-intro {
font-size: 0.82rem;
color: var(--card-sub);
margin-bottom: 0.6rem;
}
.learn-range-list {
display: grid;
gap: 0.45rem;
}
.learn-range-item {
display: grid;
grid-template-columns: 18px 108px minmax(180px, 1fr) 1.5fr;
align-items: center;
gap: 0.55rem;
border: var(--surface-border);
border-radius: 10px;
background: var(--card-bg-soft);
padding: 0.5rem 0.6rem;
}
.range-swatch {
width: 12px;
height: 12px;
border-radius: 999px;
border: 1px solid rgba(255, 255, 255, 0.4);
}
.range-value {
font-size: 0.79rem;
color: var(--card-ink);
font-weight: 700;
}
.range-label {
font-size: 0.8rem;
color: var(--card-ink);
font-weight: 600;
}
.range-note {
font-size: 0.77rem;
color: var(--card-sub);
}
.learn-table {
display: grid;
border: var(--surface-border);
border-radius: 10px;
overflow: hidden;
}
.learn-table-row {
display: grid;
grid-template-columns: 120px 1.2fr 1.6fr;
gap: 0.5rem;
padding: 0.5rem 0.6rem;
background: var(--card-bg-soft);
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.learn-table-row:last-child {
border-bottom: none;
}
.learn-table-row span {
font-size: 0.78rem;
color: var(--card-sub);
}
.learn-table-head {
background: rgba(0, 0, 0, 0.18);
}
.learn-table-head span {
color: var(--card-ink);
font-size: 0.74rem;
font-weight: 700;
letter-spacing: 0.05em;
text-transform: uppercase;
}
.learn-table-row span:first-child {
color: var(--card-ink);
font-weight: 700;
}
.aqi-good { background: #00a650; }
.aqi-moderate { background: #ffd000; }
.aqi-sensitive { background: #ff8c00; }
.aqi-unhealthy { background: #e53935; }
.aqi-very-unhealthy { background: #8e24aa; }
.aqi-hazardous { background: #7e0023; }
.wind-calm { background: #4fc3f7; }
.wind-breezy { background: #43a047; }
.wind-windy { background: #fdd835; }
.wind-strong { background: #fb8c00; }
.wind-severe { background: #e53935; }
.radar-light { background: #1e88e5; }
.radar-moderate { background: #fdd835; }
.radar-heavy { background: #f4511e; }
.radar-extreme { background: #8e24aa; }
.comfort-dry { background: #4fc3f7; }
.comfort-pleasant { background: #66bb6a; }
.comfort-sticky { background: #fdd835; }
.comfort-oppressive { background: #fb8c00; }
.comfort-tropical { background: #e53935; }
.vis-good { background: #43a047; }
.vis-fair { background: #fdd835; }
.vis-poor { background: #fb8c00; }
.vis-danger { background: #e53935; }
.uv-low { background: #43a047; }
.uv-moderate { background: #fdd835; }
.uv-high { background: #fb8c00; }
.uv-very-high { background: #e53935; }
.uv-extreme { background: #8e24aa; }
.cloud-clear { background: #64b5f6; }
.cloud-partly { background: #90caf9; }
.cloud-mostly { background: #78909c; }
.cloud-overcast { background: #546e7a; }
.learn-list {
margin: 0;
padding-left: 1.1rem;
display: grid;
gap: 0.35rem;
color: var(--card-sub);
font-size: 0.84rem;
line-height: 1.45;
}
.learn-mini-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 0.55rem;
}
.learn-mini-card {
border: var(--surface-border);
border-radius: 10px;
background: var(--card-bg-soft);
padding: 0.55rem 0.6rem;
}
.learn-mini-card h5 {
margin: 0 0 0.25rem;
font-size: 0.8rem;
color: var(--card-ink);
}
.learn-mini-card p {
margin: 0;
font-size: 0.78rem;
color: var(--card-sub);
line-height: 1.4;
}
.learn-faq {
display: grid;
gap: 0.45rem;
}
.learn-faq-item {
border: var(--surface-border);
border-radius: 10px;
background: var(--card-bg-soft);
padding: 0.5rem 0.6rem;
}
.learn-faq-item summary {
cursor: pointer;
font-size: 0.82rem;
font-weight: 700;
color: var(--card-ink);
}
.learn-faq-item p {
margin: 0.45rem 0 0;
font-size: 0.79rem;
color: var(--card-sub);
line-height: 1.45;
}
.learn-checklist {
margin: 0;
padding-left: 0;
list-style: none;
display: grid;
gap: 0.4rem;
}
.learn-checklist li {
border: var(--surface-border);
border-radius: 10px;
background: var(--card-bg-soft);
padding: 0.45rem 0.6rem 0.45rem 1.95rem;
position: relative;
font-size: 0.8rem;
color: var(--card-sub);
line-height: 1.4;
}
.learn-checklist li::before {
content: '✓';
position: absolute;
left: 0.65rem;
top: 0.45rem;
color: var(--accent);
font-weight: 800;
}
.learn-glossary-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.5rem;
}
.glossary-item {
border: var(--surface-border);
border-radius: 10px;
background: var(--card-bg-soft);
padding: 0.55rem 0.6rem;
}
.glossary-item h5 {
margin: 0 0 0.2rem;
font-size: 0.8rem;
color: var(--card-ink);
}
.glossary-item p {
margin: 0;
font-size: 0.77rem;
color: var(--card-sub);
line-height: 1.4;
}
.learn-back-top {
position: fixed;
right: 1rem;
bottom: calc(0.9rem + env(safe-area-inset-bottom, 0px));
z-index: 460;
border: 1px solid rgba(255, 255, 255, 0.25);
border-radius: 999px;
background: rgba(20, 18, 14, 0.94);
color: #fff;
text-decoration: none;
font-size: 0.78rem;
font-weight: 700;
padding: 0.42rem 0.72rem;
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.35);
}
.learn-back-top:hover {
background: rgba(20, 18, 14, 1);
}
/* ── Location header ── */
.loc-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.75rem;
border: var(--surface-border);
border-radius: var(--surface-radius-lg);
background: var(--card-bg-soft);
padding: 0.45rem 0.8rem;
}
.loc-name { font-family: var(--serif); font-size: 1.3rem; font-weight: 400; line-height: 1.1; }
.loc-name { color: var(--card-ink); }
.loc-sub { font-size: 0.72rem; color: var(--card-sub); letter-spacing: 0.06em; margin-top: 0.1rem; text-transform: uppercase; }
.loc-time { font-size: 0.72rem; color: var(--card-sub); text-align: right; letter-spacing: 0.03em; white-space: nowrap; }
.loc-actions { display: flex; flex-direction: column; align-items: flex-end; gap: 0.2rem; }
/* ── 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;
}
.hero-left {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 0.4rem;
}
.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-share-btn {
margin-top: 0.5rem;
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 999px;
background: rgba(0, 0, 0, 0.2);
color: var(--card-ink);
font-family: var(--mono);
font-size: 0.72rem;
letter-spacing: 0.05em;
text-transform: uppercase;
padding: 0.3rem 0.62rem;
cursor: pointer;
}
.hero-share-btn:hover {
background: rgba(0, 0, 0, 0.34);
}
.hero-share-status {
margin-top: 0.25rem;
min-height: 1rem;
font-size: 0.7rem;
color: var(--card-sub);
}
.hero-temp {
font-family: var(--serif);
font-size: 6.5rem;
font-weight: 400;
line-height: 1;
letter-spacing: -4px;
}
.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;
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;
}
.hilo-item {
display: flex;
flex-direction: column;
align-items: center;
line-height: 1.2;
font-size: 1.3rem;
font-weight: 500;
}
.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;
}
.sun-timeline-wrap {
display: flex;
align-items: center;
gap: 0.75rem;
margin-bottom: 0.65rem;
}
.sun-endpoint {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.2rem;
flex-shrink: 0;
}
.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;
}
.sun-progress {
height: 100%;
background: linear-gradient(90deg, #fb923c, #fbbf24);
border-radius: 3px;
transition: width 0.6s ease;
}
.sun-dot {
position: absolute;
top: 50%;
transform: translate(-50%, -50%);
font-size: 1.2rem;
pointer-events: none;
transition: left 0.6s ease;
}
.moon-row {
display: flex;
align-items: center;
gap: 0.6rem;
font-size: 1rem;
font-weight: 500;
color: var(--card-sub);
border-top: 1px solid rgba(255, 255, 255, 0.12);
padding-top: 0.6rem;
}
.moon-emoji { font-size: 1.2rem; }
.daylight-info { margin-left: auto; font-size: 0.78rem; font-weight: 500; color: var(--card-sub); }
/* ── Card Group ── */
.card-group {
display: grid;
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;
}
.stat-card {
background: var(--card-bg);
padding: 1rem 0.9rem;
display: flex;
flex-direction: column;
gap: 0.3rem;
}
.stat-card .stat-label {
font-size: 0.68rem;
letter-spacing: 0.08em;
text-transform: uppercase;
font-weight: 700;
color: var(--card-sub);
}
.stat-card .stat-val {
font-size: 1.65rem;
font-weight: 600;
line-height: 1.2;
color: var(--card-ink);
}
.stat-unit { font-size: 1rem; font-weight: 600; color: var(--card-sub); margin-left: 2px; }
.stat-sub { font-size: 0.8rem; font-weight: 500; color: var(--card-sub); }
/* ── Details Drawer ── */
.details-drawer {
border: var(--surface-border);
margin-bottom: 2rem;
background: var(--card-bg);
border-radius: var(--surface-radius-md);
overflow: hidden;
}
.drawer-summary {
list-style: none;
font-size: 0.68rem;
letter-spacing: 0.08em;
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;
}
.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;
}
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-direction: column;
align-items: center;
gap: 0.4rem;
}
.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);
}
.alerts-actions {
display: inline-flex;
gap: 0.45rem;
align-items: center;
}
.alerts-share-status {
margin: 0.3rem 0 0.5rem;
font-size: 0.74rem;
color: var(--card-sub);
}
.alerts-list {
display: grid;
gap: 0.5rem;
}
.alerts-group {
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 10px;
padding: 0.45rem;
background: rgba(0, 0, 0, 0.08);
}
.alerts-group-head {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.35rem;
padding: 0.1rem 0.2rem;
}
.alerts-group-title {
font-size: 0.76rem;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--card-ink);
}
.alerts-group-hint {
font-size: 0.7rem;
color: var(--card-sub);
}
.alerts-group-extreme .alerts-group-title,
.alerts-group-severe .alerts-group-title {
color: #f28b82;
}
.alerts-group-moderate .alerts-group-title {
color: #ffd166;
}
.alert-item {
display: grid;
gap: 0.3rem;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 10px;
padding: 0.58rem;
background: var(--card-bg-soft);
font-size: 0.74rem;
}
.alert-top {
display: flex;
justify-content: space-between;
gap: 0.5rem;
align-items: center;
}
.alert-severity {
border-radius: 999px;
border: 1px solid rgba(255, 255, 255, 0.2);
padding: 0.06rem 0.45rem;
font-size: 0.65rem;
letter-spacing: 0.05em;
text-transform: uppercase;
font-weight: 700;
}
.severity-extreme,
.severity-severe {
background: rgba(229, 57, 53, 0.26);
color: #ffd3d1;
}
.severity-moderate {
background: rgba(255, 209, 102, 0.25);
color: #ffe4a3;
}
.severity-minor,
.severity-unknown {
background: rgba(120, 144, 156, 0.25);
color: #e3eef5;
}
.alert-timing {
font-size: 0.7rem;
color: var(--card-sub);
}
.alert-message {
font-size: 0.74rem;
color: var(--card-sub);
line-height: 1.35;
}
.alert-action {
border-top: 1px dashed rgba(255, 255, 255, 0.14);
padding-top: 0.3rem;
font-size: 0.73rem;
color: var(--card-ink);
font-weight: 600;
}
.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);
}
.settings-wrap {
border: var(--surface-border);
border-radius: var(--surface-radius-md);
background: var(--card-bg);
padding: 0.9rem;
display: grid;
gap: 1rem;
}
.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;
}
.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 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;
}
.settings-btn:hover { background: var(--card-bg); }
.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;
}
.maps-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 0.5rem;
}
.maps-header h3 {
margin: 0;
font-size: 1.1rem;
font-weight: 600;
color: var(--card-ink);
}
.maps-quick-toggles {
display: flex;
gap: 0.5rem;
}
.overlay-toggle {
padding: 0.5rem 1rem;
border: var(--surface-border);
border-radius: var(--surface-radius-sm);
background: var(--card-bg-soft);
color: var(--card-sub);
font-size: 1rem;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
}
.overlay-toggle:hover {
background: var(--card-bg);
border-color: var(--accent);
}
.overlay-toggle.active {
background: var(--accent);
color: #fff;
border-color: var(--accent);
}
.map-overview {
height: calc(100vh - 470px);
min-height: 420px;
border: var(--surface-border);
border-radius: 10px;
box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.2);
}
.maps-legend {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
padding: 0.75rem;
background: rgba(255, 255, 255, 0.04);
border: var(--surface-border);
border-radius: 8px;
}
.legend-section {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.legend-title {
font-size: 0.8rem;
font-weight: 600;
color: var(--card-ink);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.legend-item {
display: flex;
align-items: center;
gap: 0.6rem;
font-size: 0.75rem;
color: var(--card-sub);
}
.legend-item svg {
flex-shrink: 0;
}
.maps-data {
display: grid;
grid-template-columns: 1fr 1.2fr;
gap: 1rem;
}
.maps-card {
background: var(--card-bg-soft);
border: var(--surface-border);
border-radius: var(--surface-radius-sm);
padding: 1rem;
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.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);
}
.wind-stats {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 0.75rem;
}
.wind-stat {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.wind-stat .stat-label {
font-size: 0.7rem;
color: var(--card-sub);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.wind-stat .stat-value {
font-size: 1.1rem;
font-weight: 600;
color: var(--accent);
}
/* ── Section heads ── */
.section-head {
display: flex;
justify-content: space-between;
align-items: baseline;
margin-bottom: 0.6rem;
}
.section-label { font-size: 0.88rem; 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;
font-family: var(--mono);
font-size: 0.82rem;
font-weight: 600;
color: var(--cool);
cursor: pointer;
padding: 0.35rem 0.65rem;
font-style: italic;
}
.link-btn:hover { text-decoration: underline; }
/* ── Radar maps ── */
.radar-embed-wrap {
border: var(--surface-border);
border-radius: var(--surface-radius-md);
overflow: hidden;
margin-bottom: 2rem;
background: #1a1f2e;
}
.radar-map {
width: 100%;
height: 320px;
}
.radar-map-full {
height: calc(100dvh - 290px);
min-height: 320px;
}
.radar-full-wrap {
border: var(--surface-border);
border-radius: var(--surface-radius-md);
background: #1a1f2e;
margin-bottom: 0;
overflow: hidden;
}
/* Fullscreen toggle button */
.radar-fs-btn {
background: var(--paper-dark);
border: 1px solid var(--border);
color: var(--ink);
font-size: 1.1rem;
margin-left: auto;
flex-shrink: 0;
}
/* ── Map fullscreen mode (CSS-based, works on iOS Safari) ── */
body.map-fs .masthead,
body.map-fs .bottom-nav,
body.map-fs .offline-banner,
body.map-fs .ptr-indicator {
display: none !important;
}
body.map-fs .app {
padding: 0 !important;
}
body.map-fs #tab-unified-map {
position: fixed;
inset: 0;
z-index: 9999;
overflow: hidden;
}
body.map-fs .unified-map-wrap {
height: 100dvh;
padding: 0;
border: none;
border-radius: 0;
background: #1a1f2e;
}
body.map-fs .map-controls-header {
padding: 0.3rem 0.65rem;
gap: 0;
border-bottom: none;
}
body.map-fs .map-controls-row label,
body.map-fs .map-controls-row select,
body.map-fs .map-layer-menu {
display: none;
}
body.map-fs .map-controls-row {
justify-content: flex-end;
}
body.map-fs #data-panel {
display: none !important;
}
body.map-fs .unified-map-shell {
flex: 1;
min-height: 0;
}
body.map-fs #unified-map {
height: 100% !important;
min-height: 0 !important;
}
/* ── Radar controls ── */
.radar-controls {
display: flex;
align-items: center;
gap: 0.75rem;
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); }
.fullscreen-btn { font-size: 1rem; }
/* Fullscreen state for the radar embed */
.radar-embed-wrap:fullscreen,
.radar-embed-wrap:-webkit-full-screen {
display: flex;
flex-direction: column;
border-radius: 0;
margin: 0;
background: #000;
}
.radar-embed-wrap:fullscreen #radar-embed,
.radar-embed-wrap:-webkit-full-screen #radar-embed {
flex: 1;
height: 0;
}
.radar-embed-wrap:fullscreen .radar-controls,
.radar-embed-wrap:-webkit-full-screen .radar-controls {
background: rgba(0,0,0,0.8);
border-top: 1px solid rgba(255,255,255,0.15);
}
.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.88rem;
color: var(--ink);
font-weight: 600;
letter-spacing: 0.04em;
white-space: nowrap;
min-width: 80px;
text-align: right;
}
/* Radar legend */
.radar-legend {
display: flex;
align-items: center;
gap: 0.4rem;
margin-left: 0.5rem;
}
.legend-label { font-size: 0.66rem; color: var(--ink-mid); 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: var(--surface-border);
border-radius: var(--surface-radius-md);
scrollbar-width: thin;
scrollbar-color: var(--border) transparent;
}
.hourly-track { display: flex; min-width: max-content; }
.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;
}
.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(--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; }
/* ── Daily forecast ── */
.daily-list {
border: none;
display: grid;
gap: 0.55rem;
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: 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;
}
/* ── 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(100dvh - 290px - env(safe-area-inset-top) - env(safe-area-inset-bottom));
}
.map-overview {
height: calc(100vh - 470px - env(safe-area-inset-top) - env(safe-area-inset-bottom));
}
}
/* ── PWA: status bar area when running standalone ── */
@media (display-mode: standalone) {
.masthead { padding-top: max(1rem, calc(0.75rem + env(safe-area-inset-top))); }
}
/* ── Touch-friendly tap targets (min 44 × 44 px) ── */
.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; }
/* ── MapLibre overrides ── */
.maplibregl-map { background: #1a1f2e; }
.maplibregl-ctrl-zoom-in,
.maplibregl-ctrl-zoom-out,
.maplibregl-ctrl-compass {
background-color: var(--paper-dark) !important;
color: var(--ink) !important;
}
.maplibregl-ctrl-group {
border-radius: 6px;
overflow: hidden;
box-shadow: 0 1px 4px rgba(0,0,0,0.4);
}
.maplibregl-ctrl button:not(:disabled) span {
filter: invert(0.8);
}
.maplibregl-popup-content {
background: var(--paper-dark);
color: var(--ink);
border-radius: 8px;
font-size: 0.85rem;
padding: 0.5rem 0.75rem;
box-shadow: 0 2px 8px rgba(0,0,0,0.35);
}
.maplibregl-popup-tip { border-top-color: var(--paper-dark); }
/* ── 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);
}
.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; }
.radar-controls-full .radar-legend { display: none; }
.radar-attribution {
overflow-wrap: anywhere;
padding-bottom: 0.3rem;
}
.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.95rem;
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; }
.loc-header {
flex-direction: row;
align-items: center;
}
.loc-name { font-size: 1.5rem; }
.loc-sub { font-size: 0.8rem; }
.loc-actions { align-items: flex-end; margin-top: 0; }
.loc-time { text-align: right; font-size: 0.8rem; }
.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; }
.hero-share-btn { font-size: 0.7rem; }
.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.88rem; }
.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: 1fr; }
.recs-grid { grid-template-columns: repeat(3, 1fr); }
.day-row { grid-template-columns: 80px 36px 1fr 70px; }
.day-meta { display: none; }
.radar-embed-wrap .radar-map { height: 220px; }
.radar-map-full { height: calc(100dvh - 330px); min-height: 250px; }
.legend-bar { width: 50px; }
.settings-row { flex-direction: column; align-items: flex-start; gap: 0.5rem; }
.settings-value { text-align: left; }
.map-overview { height: 350px; }
.maps-data { grid-template-columns: 1fr; }
.maps-legend { grid-template-columns: 1fr; }
.wind-stats { grid-template-columns: 1fr 1fr; }
.alerts-actions {
display: grid;
gap: 0.15rem;
justify-items: end;
}
.alerts-group-head {
flex-direction: column;
align-items: flex-start;
gap: 0.2rem;
}
.learn-grid { grid-template-columns: 1fr; }
.learn-toc-links {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.learn-range-item {
grid-template-columns: 16px 1fr;
align-items: start;
}
.range-value,
.range-label,
.range-note {
grid-column: 2;
}
.learn-table-row {
grid-template-columns: 1fr;
gap: 0.2rem;
}
.learn-table-head {
display: none;
}
.learn-table-row span {
font-size: 0.8rem;
}
.learn-mini-grid,
.learn-glossary-grid {
grid-template-columns: 1fr;
}
.learn-back-top {
right: 0.65rem;
bottom: calc(5rem + env(safe-area-inset-bottom, 0px));
font-size: 0.74rem;
padding: 0.36rem 0.6rem;
}
.map-overlay-readouts {
left: 0.45rem;
right: 0.45rem;
bottom: 0.45rem;
gap: 0.35rem;
}
.map-readout-chip {
font-size: 0.72rem;
padding: 0.26rem 0.52rem;
}
}
/* ── ntfy / Settings additions ────────────────────────────────────────── */
.settings-section-title {
font-size: 0.65rem;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--ink-mid);
padding: 0.25rem 0.25rem 0;
}
.settings-row--block {
flex-direction: column;
align-items: flex-start;
gap: 0.55rem;
}
.settings-row-head {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.settings-input {
width: 100%;
background: var(--paper-darker);
border: 1px solid var(--border);
border-radius: 8px;
color: var(--ink);
font-family: var(--mono);
font-size: 0.78rem;
padding: 0.45rem 0.6rem;
outline: none;
transition: border-color 0.15s;
}
.settings-input:focus { border-color: var(--accent); }
.settings-input::placeholder { color: var(--ink-mid); opacity: 0.7; }
.settings-help {
font-size: 0.68rem;
color: var(--ink-mid);
line-height: 1.5;
margin: 0;
}
.settings-help a { color: var(--accent); text-decoration: none; }
.settings-help a:hover { text-decoration: underline; }
.settings-input--short { width: 6rem; }
/* ── Wind drawer peek (shows summary when collapsed) ────────────────────── */
.wind-drawer-peek {
font-size: 0.72rem;
color: var(--ink-mid);
font-weight: 400;
margin-left: 0.4rem;
}
/* ── Forecast Discussion drawer ──────────────────────────────────────────── */
.discussion-drawer { margin-top: 1.5rem; }
.discussion-office {
font-size: 0.65rem;
color: var(--ink-mid);
margin-left: 0.5rem;
font-weight: 400;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.discussion-meta {
font-size: 0.68rem;
color: var(--ink-mid);
margin: 0 0 0.75rem;
}
.discussion-text {
font-family: 'Courier New', 'Consolas', monospace;
font-size: 0.72rem;
line-height: 1.55;
white-space: pre-wrap;
word-break: break-word;
color: var(--ink);
background: var(--paper-darker);
border: 1px solid var(--border);
border-radius: var(--surface-radius-sm);
padding: 0.75rem 1rem;
max-height: 55vh;
overflow-y: auto;
margin: 0;
}
/* ── Offline banner ─────────────────────────────────────────────────────── */
.offline-banner {
position: fixed;
top: 0; left: 0; right: 0;
background: #b91c1c;
color: #fff;
font-size: 0.78rem;
font-weight: 600;
text-align: center;
padding: 0.4rem 1rem;
z-index: 9999;
transition: transform 0.25s ease;
}
.offline-banner.hidden { display: none; }
/* ── Pull-to-refresh indicator ──────────────────────────────────────────── */
.ptr-indicator {
position: fixed;
top: 0; left: 50%;
transform: translateX(-50%) translateY(-100%);
background: var(--accent);
color: #fff;
font-size: 0.8rem;
font-weight: 600;
padding: 0.35rem 1rem;
border-radius: 0 0 12px 12px;
z-index: 9998;
transition: transform 0.25s ease;
}
.ptr-indicator.visible { transform: translateX(-50%) translateY(0); }
.ptr-indicator.hidden { display: none; }
/* ── Alert badge ─────────────────────────────────────────────────────────── */
.tab[data-tab="alerts"],
.bottom-tab[data-tab="alerts"] { position: relative; }
.alert-badge {
position: absolute;
top: 2px; right: 2px;
background: var(--accent);
color: #fff;
border-radius: 10px;
font-size: 0.6rem;
font-weight: 700;
padding: 1px 5px;
min-width: 16px;
text-align: center;
pointer-events: none;
}
.alert-badge.hidden { display: none; }
/* ── Precip chart (hidden — bars now inline in hourly cells) ─────────────── */
.precip-chart-wrap { display: none; }
/* ── Inline hourly precip bar ─────────────────────────────────────────────── */
.hour-bar-wrap {
width: 100%;
height: 28px;
display: flex;
align-items: flex-end;
justify-content: center;
}
.hour-bar {
width: 60%;
min-height: 2px;
border-radius: 2px 2px 0 0;
transition: height 0.2s ease;
}
/* ── Hurricane tracking panel ────────────────────────────────────────────── */
.hurricane-panel { margin-bottom: 1rem; }
.hurricane-panel:empty { display: none; }
.hurricane-storm-card {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: var(--surface-radius-md);
padding: 0.75rem 1rem;
margin-bottom: 0.6rem;
box-shadow: var(--surface-shadow);
}
.hurricane-header {
display: flex;
align-items: center;
gap: 0.6rem;
margin-bottom: 0.4rem;
}
.hurricane-name {
font-size: 1rem;
font-weight: 700;
color: var(--ink);
}
.hurricane-cat-badge {
display: inline-block;
padding: 2px 8px;
border-radius: 8px;
font-size: 0.7rem;
font-weight: 700;
color: #fff;
}
.cat-td { background: #2196f3; }
.cat-ts { background: #9c27b0; }
.cat-1 { background: #ff9800; }
.cat-2 { background: #f44336; }
.cat-3 { background: #b71c1c; }
.cat-4 { background: #7b1fa2; }
.cat-5 { background: #1a237e; }
.hurricane-stats {
display: flex;
flex-wrap: wrap;
gap: 0.4rem 1.2rem;
font-size: 0.78rem;
color: var(--ink-light);
}
/* ── Animated current condition icon ─────────────────────────────────────── */
@keyframes icon-spin { to { transform: rotate(360deg); } }
@keyframes icon-drip { 0%,100% { transform: translateY(0); } 50% { transform: translateY(4px); } }
@keyframes icon-fall { 0%,100% { transform: translateY(0) rotate(-5deg); } 50% { transform: translateY(5px) rotate(5deg); } }
@keyframes icon-flash { 0%,100% { opacity: 1; } 50% { opacity: 0.4; } }
@keyframes icon-sway { 0%,100% { transform: rotate(-8deg); } 50% { transform: rotate(8deg); } }
#cur-icon[data-wmo-group="clear"] { animation: icon-spin 20s linear infinite; display: inline-block; }
#cur-icon[data-wmo-group="cloud"] { animation: icon-sway 4s ease-in-out infinite; display: inline-block; }
#cur-icon[data-wmo-group="rain"] { animation: icon-drip 1.2s ease-in-out infinite; display: inline-block; }
#cur-icon[data-wmo-group="snow"] { animation: icon-fall 1.5s ease-in-out infinite; display: inline-block; }
#cur-icon[data-wmo-group="storm"] { animation: icon-flash 0.8s ease-in-out infinite; display: inline-block; }
/* ── Theme toggle buttons ─────────────────────────────────────────────────── */
.theme-toggle-group {
display: flex;
gap: 0.3rem;
}
.theme-btn {
background: var(--paper-darker);
border: 1px solid var(--border);
border-radius: 8px;
color: var(--ink);
font-size: 0.75rem;
padding: 0.3rem 0.65rem;
cursor: pointer;
transition: background 0.15s, border-color 0.15s;
}
.theme-btn:hover { border-color: var(--accent); }
.theme-btn.active { background: var(--accent); color: #fff; border-color: var(--accent); }
/* ── Saved mini weather cards ────────────────────────────────────────────── */
.saved-cards {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
margin-top: 0.5rem;
}
.saved-mini-card {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: var(--surface-radius-md);
padding: 0.5rem 0.75rem;
cursor: pointer;
min-width: 100px;
display: flex;
flex-direction: column;
gap: 0.2rem;
position: relative;
transition: border-color 0.15s;
}
.saved-mini-card:hover { border-color: var(--accent); }
.mini-city-name {
font-size: 0.72rem;
font-weight: 600;
color: var(--ink);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 90px;
}
.mini-weather-row {
display: flex;
align-items: center;
gap: 0.3rem;
font-size: 0.82rem;
}
.mini-remove {
position: absolute;
top: 3px; right: 5px;
background: none;
border: none;
color: var(--ink-light);
font-size: 0.75rem;
cursor: pointer;
line-height: 1;
padding: 0 2px;
}
.mini-remove:hover { color: var(--accent); }
/* ── My Station (Ambient Weather) ──────────────────────────────────────────── */
.station-drawer { margin-top: 1rem; }
.station-drawer-peek { font-size: 0.8rem; color: var(--ink-light); margin-left: 0.5rem; font-weight: 400; }
.station-loading { color: var(--ink-light); font-size: 0.9rem; padding: 0.5rem 0; }
.station-error { color: #e57373; font-size: 0.88rem; padding: 0.4rem 0; }
.station-name-row {
display: flex;
align-items: baseline;
gap: 0.6rem;
margin-bottom: 0.75rem;
flex-wrap: wrap;
}
.station-name { font-weight: 600; font-size: 0.95rem; }
.station-updated { font-size: 0.75rem; color: var(--ink-light); }
.station-badge {
display: inline-flex;
align-items: center;
gap: 0.3rem;
margin-top: 0.4rem;
font-size: 0.72rem;
font-weight: 600;
color: var(--accent);
background: color-mix(in srgb, var(--accent) 12%, transparent);
border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
border-radius: 999px;
padding: 0.15rem 0.55rem;
letter-spacing: 0.02em;
}