Files
sunscope/assets/css/ui.css
T
fraxle ad889d938b 2.1
New profile icons
New profile higher position
Updated Column toggle row
Fixed text encoding
2026-06-01 12:59:19 +01:00

1130 lines
29 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.
/* ════════════════════════════════════════════════════════════════════════
ui.css — Status banners, legend, about block, footer, and responsive.
════════════════════════════════════════════════════════════════════════ */
/* ── EVENT BANNER ───────────────────────────────────────────────────── */
/* Animated slide-down banner for cosmic/weather/promo events. */
/* Open/close: grow vertically using grid-template-rows (silky smooth,
no max-height hack — it animates from 0fr → 1fr and back). */
.event-banner-wrap {
display: grid;
grid-template-rows: 0fr;
transition: grid-template-rows 0.45s cubic-bezier(0.4, 0, 0.2, 1);
position: absolute;
top: 0;
left: 0;
right: 0;
z-index: 10;
}
.event-banner-wrap > * {
overflow: hidden;
}
.event-banner-wrap.visible {
grid-template-rows: 1fr;
}
/* When closing, fade the content out before the row collapses */
.event-banner-wrap:not(.visible) .event-banner-stage {
opacity: 0;
}
/* Slide crossfade: both banners rendered simultaneously, fading into each other */
@keyframes banner-fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes banner-fade-out {
from { opacity: 1; }
to { opacity: 0; }
}
/* Container that holds both slides during a crossfade */
/* Also fades in/out with the wrap open/close */
.event-banner-stage {
opacity: 1;
transition: opacity 0.35s ease;
position: relative;
margin-bottom: 12px;
}
/* True crossfade — outgoing slide sits absolutely on top and fades out */
.event-banner {
display: flex;
align-items: center;
gap: 14px;
padding: 13px 18px;
border-radius: 4px;
position: relative;
z-index: 1;
border-left: 4px solid rgba(255,255,255,0.25);
}
.event-banner--outgoing {
position: absolute;
top: 0;
left: 0;
width: 100%;
z-index: 2;
pointer-events: none;
animation: banner-fade-out 0.45s ease both;
}
.event-banner-stage {
position: relative;
overflow: hidden;
}
.event-banner-emoji {
font-size: 24px;
flex-shrink: 0;
line-height: 1;
}
.event-banner-body {
flex: 1;
min-width: 0;
}
.event-banner-title {
font-family: Fraunces, serif;
font-style: italic;
font-weight: 700;
font-size: 16px;
line-height: 1.2;
margin-bottom: 3px;
}
.event-banner-msg {
font-family: Manrope, sans-serif;
font-size: 12.5px;
line-height: 1.55;
opacity: 0.88;
}
.event-banner-dismiss {
background: transparent;
border: none;
cursor: pointer;
font-size: 18px;
opacity: 0.55;
padding: 4px 6px;
line-height: 1;
flex-shrink: 0;
transition: opacity 0.15s;
}
.event-banner-dismiss:hover {
opacity: 1;
}
/* Slideshow dots */
.event-banner-dots {
display: flex;
gap: 5px;
margin-top: 7px;
align-items: center;
}
.event-banner-dot {
width: 6px;
height: 6px;
border-radius: 50%;
opacity: 0.35;
cursor: pointer;
transition: opacity 0.2s, transform 0.2s;
flex-shrink: 0;
}
.event-banner-dot.active {
opacity: 1;
transform: scale(1.3);
}
.event-banner-dot:hover {
opacity: 0.75;
}
/* Cell tag — event icon in the hour column */
.event-cell-tag {
font-size: 15px;
line-height: 1;
vertical-align: middle;
margin-left: 1px;
display: inline-block;
cursor: pointer;
border-radius: 3px;
transition: opacity 0.15s;
}
.event-cell-tag:hover {
opacity: 0.75;
}
/* ── ALMANAC PANEL ──────────────────────────────────────────────────── */
/* "What's Coming" upcoming cosmic events box below the forecast table. */
.almanac-panel {
margin: 20px 0 12px;
border: 1.5px solid #c9b08a;
border-radius: 4px;
background: #fdf8ee;
overflow: hidden;
}
.almanac-header {
display: flex;
align-items: baseline;
gap: 12px;
padding: 12px 18px 10px;
border-bottom: 1px solid #e8d8b8;
background: #faf2e2;
}
.almanac-title {
font-family: Fraunces, serif;
font-style: italic;
font-weight: 700;
font-size: 17px;
color: #2a1a08;
letter-spacing: 0;
}
.almanac-subtitle {
font-family: Manrope, sans-serif;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.07em;
color: #9a7d5a;
}
.almanac-list {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 0;
}
.almanac-entry {
display: flex;
align-items: flex-start;
gap: 13px;
padding: 13px 18px;
border-bottom: 1px solid #f0e4cc;
border-right: 1px solid #f0e4cc;
transition: background 0.15s;
}
.almanac-entry:hover {
background: #fef8e8;
}
.almanac-entry-icon {
font-size: 22px;
line-height: 1;
flex-shrink: 0;
margin-top: 1px;
}
.almanac-entry-body {
flex: 1;
min-width: 0;
}
.almanac-entry-head {
display: flex;
align-items: baseline;
gap: 8px;
flex-wrap: wrap;
margin-bottom: 3px;
}
.almanac-entry-title {
font-family: Fraunces, serif;
font-style: italic;
font-weight: 700;
font-size: 14px;
color: #1e1208;
line-height: 1.2;
}
.almanac-entry-date {
font-family: Manrope, sans-serif;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: #c8922a;
white-space: nowrap;
}
.almanac-entry-countdown {
font-family: Manrope, sans-serif;
font-size: 10px;
font-weight: 700;
color: #9a7d5a;
white-space: nowrap;
}
.almanac-entry-desc {
font-family: Manrope, sans-serif;
font-size: 12px;
color: #4a3420;
line-height: 1.55;
}
.almanac-entry-visibility {
display: inline-block;
margin-top: 5px;
font-family: Manrope, sans-serif;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: #7a9a6a;
background: #eef4e8;
border: 1px solid #c0d8b0;
border-radius: 3px;
padding: 2px 7px;
}
.almanac-entry-accent {
width: 3px;
align-self: stretch;
border-radius: 2px;
flex-shrink: 0;
margin-top: 1px;
opacity: 0.7;
}
.almanac-empty {
padding: 22px 18px;
font-family: Manrope, sans-serif;
font-size: 13px;
color: #9a7d5a;
font-style: italic;
}
@media (max-width: 600px) {
.almanac-list {
grid-template-columns: 1fr;
}
}
/* ── EVENT BANNER — mobile fixes ────────────────────────────────────── */
@media (max-width: 640px) {
.event-banner-wrap {
margin-top: 0; /* JS pins the banner's top to the nav's bottom edge */
margin-bottom: 0;
}
.event-banner {
align-items: flex-start; /* stop dismiss ✕ drifting downward */
gap: 10px;
padding: 18px 12px 14px 14px;
margin-bottom: 0;
border-radius: 4px;
}
.event-banner-emoji {
font-size: 20px;
margin-top: 3px; /* visually balance the dates-line margin-top below */
}
.event-banner-title {
font-size: 15px;
line-height: 1.25;
margin-bottom: 3px;
}
.event-banner-msg {
font-size: 12px;
line-height: 1.5;
}
.event-banner-dismiss {
margin-top: 0; /* keep ✕ pinned flush to the top-right */
padding: 0 2px;
font-size: 16px;
line-height: 1.4;
flex-shrink: 0;
align-self: flex-start;
}
}
/* ── CUSTOM SELECT DROPDOWN ─────────────────────────────────────────── */
/* Cross-platform replacement for native <select> on the col-toggles bar */
.cs-wrap {
position: relative;
display: inline-block;
}
/* The visible pill button */
.cs-btn {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 5px 10px 5px 13px;
cursor: pointer;
border: 1.5px solid #c9b08a;
border-radius: 0;
background: #f5edd6;
color: #6b4228;
font-family: Manrope, sans-serif;
font-size: 13px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
transition: all 0.15s;
user-select: none;
white-space: nowrap;
}
.cs-btn:hover {
border-color: #c8922a;
color: #6b4f2a;
background: #fef3dc;
}
/* Active state — brass border + brass text, parchment background */
.cs-btn.on {
background: #c8922a;
border-color: #c8922a;
color: #fff;
font-weight: 600;
}
.cs-btn.on:hover {
background: #a06e18;
border-color: #a06e18;
color: #fff;
}
/* ── CUSTOM SELECT BUTTON - group colour tints ──────────────────────────
Mirrors the col-toggle group palette for dropdowns (Vehicle, Indoors,
Burn, Pollen). Same idle - hover - on - on-hover pattern. */
.cs-btn.grp-felt { background: rgba(223,243,236,0.50); color: #075c3a; border-color: rgba(7,92,58,0.35); }
.cs-btn.grp-surface { background: rgba(221,234,248,0.50); color: #0b3e72; border-color: rgba(11,62,114,0.30); }
.cs-btn.grp-ambient { background: rgba(236,234,227,0.50); color: #3c3a35; border-color: rgba(60,58,53,0.30); }
.cs-btn.grp-precip { background: rgba(247,228,238,0.50); color: #6b1e3a; border-color: rgba(107,30,58,0.30); }
.cs-btn.grp-sky { background: rgba(234,232,252,0.50); color: #352e7a; border-color: rgba(53,46,122,0.30); }
.cs-btn.grp-wind { background: rgba(250,230,224,0.50); color: #6a2210; border-color: rgba(106,34,16,0.30); }
.cs-btn.grp-airqual { background: rgba(229,240,216,0.50); color: #244408; border-color: rgba(36,68,8,0.30); }
.cs-btn.grp-solar { background: rgba(250,234,204,0.50); color: #5a3004; border-color: rgba(90,48,4,0.30); }
.cs-btn.grp-felt:hover { background: rgba(213,233,226,0.80); color: #075c3a; border-color: rgba(7,92,58,0.55); }
.cs-btn.grp-surface:hover { background: rgba(211,224,238,0.80); color: #0b3e72; border-color: rgba(11,62,114,0.50); }
.cs-btn.grp-ambient:hover { background: rgba(226,224,217,0.80); color: #3c3a35; border-color: rgba(60,58,53,0.50); }
.cs-btn.grp-precip:hover { background: rgba(237,218,228,0.80); color: #6b1e3a; border-color: rgba(107,30,58,0.50); }
.cs-btn.grp-sky:hover { background: rgba(224,222,242,0.80); color: #352e7a; border-color: rgba(53,46,122,0.50); }
.cs-btn.grp-wind:hover { background: rgba(240,220,214,0.80); color: #6a2210; border-color: rgba(106,34,16,0.50); }
.cs-btn.grp-airqual:hover { background: rgba(219,230,206,0.80); color: #244408; border-color: rgba(36,68,8,0.50); }
.cs-btn.grp-solar:hover { background: rgba(240,224,194,0.80); color: #5a3004; border-color: rgba(90,48,4,0.50); }
/* Dropdown buttons - lighter palette to match toggle pills */
.cs-btn.grp-felt.on { background: #2ab578; border-color: #2ab578; color: #fff; }
.cs-btn.grp-surface.on { background: #4088d4; border-color: #4088d4; color: #fff; }
.cs-btn.grp-ambient.on { background: #929088; border-color: #929088; color: #fff; }
.cs-btn.grp-precip.on { background: #c24e6c; border-color: #c24e6c; color: #fff; }
.cs-btn.grp-sky.on { background: #786ec8; border-color: #786ec8; color: #fff; }
.cs-btn.grp-wind.on { background: #c25646; border-color: #c25646; color: #fff; }
.cs-btn.grp-airqual.on { background: #5e9828; border-color: #5e9828; color: #fff; }
.cs-btn.grp-solar.on { background: #c08c34; border-color: #c08c34; color: #fff; }
.cs-btn.grp-felt.on:hover { background: #1e9e64; border-color: #1e9e64; color: #fff; }
.cs-btn.grp-surface.on:hover { background: #2e72bc; border-color: #2e72bc; color: #fff; }
.cs-btn.grp-ambient.on:hover { background: #7a7870; border-color: #7a7870; color: #fff; }
.cs-btn.grp-precip.on:hover { background: #a83c5a; border-color: #a83c5a; color: #fff; }
.cs-btn.grp-sky.on:hover { background: #6258b0; border-color: #6258b0; color: #fff; }
.cs-btn.grp-wind.on:hover { background: #a84436; border-color: #a84436; color: #fff; }
.cs-btn.grp-airqual.on:hover { background: #4c7e1a; border-color: #4c7e1a; color: #fff; }
.cs-btn.grp-solar.on:hover { background: #a87824; border-color: #a87824; color: #fff; }
/* Toggle pills - lighter palette */
.col-toggle.grp-felt.on { background: #2ab578; border-color: #2ab578; color: #fff; }
.col-toggle.grp-surface.on { background: #4088d4; border-color: #4088d4; color: #fff; }
.col-toggle.grp-ambient.on { background: #929088; border-color: #929088; color: #fff; }
.col-toggle.grp-precip.on { background: #c24e6c; border-color: #c24e6c; color: #fff; }
.col-toggle.grp-sky.on { background: #786ec8; border-color: #786ec8; color: #fff; }
.col-toggle.grp-wind.on { background: #c25646; border-color: #c25646; color: #fff; }
.col-toggle.grp-airqual.on { background: #5e9828; border-color: #5e9828; color: #fff; }
.col-toggle.grp-solar.on { background: #c08c34; border-color: #c08c34; color: #fff; }
.col-toggle.grp-felt.on:hover { background: #1e9e64; border-color: #1e9e64; color: #fff; }
.col-toggle.grp-surface.on:hover { background: #2e72bc; border-color: #2e72bc; color: #fff; }
.col-toggle.grp-ambient.on:hover { background: #7a7870; border-color: #7a7870; color: #fff; }
.col-toggle.grp-precip.on:hover { background: #a83c5a; border-color: #a83c5a; color: #fff; }
.col-toggle.grp-sky.on:hover { background: #6258b0; border-color: #6258b0; color: #fff; }
.col-toggle.grp-wind.on:hover { background: #a84436; border-color: #a84436; color: #fff; }
.col-toggle.grp-airqual.on:hover { background: #4c7e1a; border-color: #4c7e1a; color: #fff; }
.col-toggle.grp-solar.on:hover { background: #a87824; border-color: #a87824; color: #fff; }
/* ── VENT PILL - group colour tints ─────────────────────────────────────
VentPill fuses with its sibling cs-btn so needs matching group tints.
Only felt and surface groups currently use VentPills. */
.cs-vent.grp-felt { background: rgba(223,243,236,0.50); color: #075c3a; border-color: rgba(7,92,58,0.35); }
.cs-vent.grp-surface { background: rgba(221,234,248,0.50); color: #0b3e72; border-color: rgba(11,62,114,0.30); }
.cs-vent.grp-felt:hover { background: rgba(213,233,226,0.80); color: #075c3a; border-color: rgba(7,92,58,0.55); }
.cs-vent.grp-surface:hover { background: rgba(211,224,238,0.80); color: #0b3e72; border-color: rgba(11,62,114,0.50); }
.cs-vent.grp-felt.on { border-color: #0f9e63; color: #0f9e63; }
.cs-vent.grp-surface.on { border-color: #2672c8; color: #2672c8; }
.cs-vent.grp-felt.on:hover { background: rgba(213,233,226,0.80); color: #0c7d4e; border-color: #0c7d4e; }
.cs-vent.grp-surface.on:hover { background: rgba(211,224,238,0.80); color: #1e5aa0; border-color: #1e5aa0; }
/* ── CUSTOM SELECT - profile card variant ────────────────────────────────
Square 80×80px card with scene image area + label strip at bottom.
Used for the Places / Activities / Work triggers in the profile bar. */
.profile-scroll .cs-wrap {
height: 80px;
}
.cs-btn.profile-card {
width: 80px;
height: 80px;
padding: 0;
position: relative;
flex-direction: column;
align-items: stretch;
overflow: hidden;
border-radius: 3px;
gap: 0;
white-space: normal;
}
.cs-btn.profile-card .cs-btn-scene {
flex: 1;
background-size: cover;
background-position: center;
display: flex;
align-items: center;
justify-content: center;
font-size: 22px;
line-height: 1;
opacity: 0.45;
transition: opacity 0.2s;
}
.cs-btn.profile-card:hover .cs-btn-scene {
opacity: 0.7;
}
.cs-btn.profile-card.on .cs-btn-scene {
opacity: 1;
}
.cs-btn.profile-card .cs-btn-label {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
background: rgba(30,18,8,0.52);
color: #fff;
padding: 0 14px 0 4px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.cs-btn.profile-card .cs-arrow {
position: absolute;
right: 6px;
bottom: 9px;
margin: 0;
color: rgba(255,255,255,0.9);
}
.cs-btn.profile-card.on {
background: transparent;
border-color: #c8922a;
}
.cs-btn.profile-card.on .cs-btn-label {
background: rgba(200,146,42,0.82);
color: #fff;
}
.cs-btn.profile-card.on .cs-arrow {
color: #fff;
}
.cs-btn.profile-card:hover {
background: transparent;
color: inherit;
border-color: #c8922a;
box-shadow: 0 1px 4px rgba(200,146,42,0.25);
}
.cs-btn.profile-card.on:hover {
background: transparent;
}
@media (max-width: 640px) {
.profile-scroll .cs-wrap {
height: 68px;
}
.cs-btn.profile-card {
width: 68px;
height: 68px;
}
.cs-btn.profile-card .cs-arrow {
bottom: 7px;
right: 5px;
}
.cs-btn.profile-card .cs-btn-scene {
font-size: 18px;
}
.cs-btn.profile-card .cs-btn-label {
height: 20px;
font-size: 9px;
}
}
/* Hover overlay — invisible by default, only activated in specific contexts */
.cs-btn-overlay {
display: none;
}
/* The chevron arrow inside the button */
.cs-arrow {
display: inline-block;
width: 6px;
height: 6px;
border-right: 2px solid currentColor;
border-bottom: 2px solid currentColor;
transform: rotate(45deg);
margin-left: 5px;
margin-bottom: 3px;
opacity: 1;
transition: transform 0.15s;
vertical-align: middle;
}
.cs-wrap.open .cs-arrow {
transform: rotate(225deg);
margin-bottom: -1px;
}
/* Grouped left (fused with checkbox pill) */
.cs-btn.grouped-left {
border-right: none;
border-radius: 0;
}
.cs-btn.grouped-left:only-child,
.cs-btn.grouped-left.last-child {
border-right: 1.5px solid #c9b08a;
border-radius: 0;
}
/* The floating dropdown panel */
.cs-panel {
position: absolute;
top: calc(100% + 4px);
left: 0; /* left edge flushes with button's left edge by default */
right: auto;
z-index: 1000;
background: #fffcf2;
border: 1.5px solid #c9b08a;
border-radius: 4px;
box-shadow: 0 4px 16px rgba(30,18,8,0.13);
min-width: 100%;
white-space: nowrap;
overflow: hidden;
}
/* Flip panel to right-align when left-align would overflow the viewport */
.cs-panel.cs-panel--right {
left: auto;
right: 0;
}
/* Card-grid panel — wrapping flex grid of scene cards */
.cs-panel.cs-panel--cards {
display: flex;
flex-wrap: wrap;
gap: 5px;
padding: 6px;
min-width: 0;
width: max-content;
max-width: min(320px, 90vw);
white-space: normal;
overflow: visible;
}
/* Individual card option */
.cs-option.cs-option-card {
display: inline-flex;
flex-direction: column;
align-items: stretch;
width: 68px;
height: 68px;
padding: 0;
overflow: hidden;
border: 1.5px solid #c9b08a;
border-radius: 3px;
background: transparent;
transition: border-color 0.15s, box-shadow 0.15s;
}
.cs-option.cs-option-card:hover {
background: transparent;
color: inherit;
border-color: #c8922a;
box-shadow: 0 1px 5px rgba(200,146,42,0.3);
}
.cs-option.cs-option-card.selected {
border-color: #c8922a;
background: transparent;
color: inherit;
}
.cs-option.cs-option-card.disabled {
opacity: 0.55;
}
.cs-option.cs-option-card.disabled:hover {
border-color: #c9b08a;
box-shadow: none;
}
/* Scene area (gradient + emoji) */
.cs-option-scene {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
line-height: 1;
background-size: cover;
background-position: center;
}
/* Label strip at the bottom */
.cs-option-label {
height: 20px;
display: flex;
align-items: center;
justify-content: center;
font-family: Manrope, sans-serif;
font-size: 9px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.04em;
background: rgba(245,237,214,0.92);
border-top: 1px solid rgba(201,176,138,0.4);
color: #6b4228;
padding: 0 2px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.cs-option.cs-option-card.selected .cs-option-label {
background: #c8922a;
color: #fff;
border-top-color: rgba(0,0,0,0.1);
}
/* Each option row */
.cs-option {
display: block;
padding: 8px 14px;
font-family: Manrope, sans-serif;
font-size: 12px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
color: #4a3420;
cursor: pointer;
transition: background 0.1s, color 0.1s;
user-select: none;
}
.cs-option:hover {
background: #fef3dc;
color: #1e1208;
}
.cs-option.selected {
color: #c8922a;
font-weight: 600;
background: #fdf8ee;
}
.cs-option.disabled {
opacity: 0.5;
cursor: default;
}
.cs-option.disabled:hover {
background: transparent;
color: #4a3420;
}
/* Hide option divider between show/hide */
.cs-divider {
height: 1px;
background: #e8d8c0;
margin: 2px 0;
}
/* ── CUSTOM CHECKBOX PILL (ventilation / managed) ───────────────────── */
.cs-vent {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 5px 12px 5px 10px;
font-size: 12px;
font-family: Manrope, sans-serif;
font-weight: 700;
letter-spacing: 0.05em;
text-transform: uppercase;
cursor: pointer;
border: 1.5px solid #c9b08a;
border-left: none;
margin-left: -1px;
padding-left: 11px;
border-radius: 0;
background: #f5edd6;
color: #6b4228;
user-select: none;
transition: background 0.15s, color 0.15s, border-color 0.15s;
white-space: nowrap;
}
.cs-vent:hover {
border-color: #c8922a;
color: #6b4f2a;
background: #fef3dc;
}
.cs-vent.on {
border-color: #c8922a;
color: #c8922a;
background: #f5edd6;
font-weight: 600;
}
.cs-vent.on:hover {
background: #fef3dc;
color: #a06e18;
border-color: #a06e18;
}
/* The little square tick box inside the vent pill */
.cs-checkbox {
display: inline-flex;
align-items: center;
justify-content: center;
width: 13px;
height: 13px;
border: 1.5px solid currentColor;
border-radius: 2px;
flex-shrink: 0;
transition: background 0.12s;
}
.cs-checkbox.checked::after {
content: '';
display: block;
width: 7px;
height: 5px;
border-left: 2px solid currentColor;
border-bottom: 2px solid currentColor;
transform: rotate(-45deg) translateY(-1px);
}
/* ── 9. STATUS & ERROR BANNERS ("Acquiring forecast data…") ────────── */
.utci-status {
padding: 14px 18px;
background: #f0e4c4;
color: #7a5c2a;
font-family: Manrope, sans-serif;
font-size: 11px;
font-weight: 700;
text-align: center;
letter-spacing: 0.07em;
text-transform: uppercase;
border: 1.5px solid #c9b08a;
margin-bottom: 18px;
}
/* acquiring-data popup overlay */
.acquiring-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.45);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
}
.acquiring-popup {
background: #fdf8ee;
border: 1.5px solid #c9b08a;
border-radius: 10px;
padding: 32px 40px;
display: flex;
flex-direction: column;
align-items: center;
gap: 18px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.22);
}
.acquiring-spinner {
width: 36px;
height: 36px;
border: 3px solid #c9b08a;
border-top-color: #7a5c2a;
border-radius: 50%;
animation: acquiring-spin 0.8s linear infinite;
}
@keyframes acquiring-spin {
to { transform: rotate(360deg); }
}
.acquiring-label {
font-family: Manrope, sans-serif;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.07em;
text-transform: uppercase;
color: #7a5c2a;
}
.utci-fetch-time {
text-align: right;
font-size: 0.72rem;
opacity: 0.5;
margin: 0.3rem 0 0;
letter-spacing: 0.03em;
}
/* ── 10. LEGEND (thermal-stress band colours at the bottom) ────────── */
.utci-legend {
margin-top: 22px;
padding: 18px 20px;
background: #fdf8ee;
border: 1.5px solid #c9b08a;
}
.utci-legend-label {
font-family: Manrope, sans-serif;
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.08em;
color: #7a5c2a;
margin-bottom: 12px;
display: block;
font-weight: 600;
}
.utci-legend-row {
display: flex;
flex-wrap: wrap;
gap: 4px;
}
.utci-legend-item {
padding: 6px 12px;
font-family: Manrope, sans-serif;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.04em;
flex: 1;
min-width: 110px;
text-align: center;
opacity: 0.9;
}
/* ── 11. ABOUT + FOOTER ─────────────────────────────────────────────── */
.utci-about {
margin-top: 28px;
padding: 24px 28px;
background: #fdf8ee;
border: 1.5px solid #c9b08a;
}
.utci-about-heading {
font-family: Fraunces, serif;
font-size: 18px;
font-weight: 700;
color: #1e1208;
margin-bottom: 14px;
letter-spacing: -0.01em;
max-width: 860px;
margin-left: auto;
margin-right: auto;
}
.utci-about-text {
font-family: Manrope, sans-serif;
font-size: 14px;
line-height: 1.75;
color: #4a3420;
margin-bottom: 12px;
max-width: 860px;
margin-left: auto;
margin-right: auto;
}
.utci-about-text:last-child {
margin-bottom: 0;
}
.utci-about-text strong {
color: #1e1208;
font-weight: 600;
}
.utci-about-text em {
font-style: italic;
color: #6b4f2a;
}
.utci-about-link {
display: inline-block;
margin-left: 4px;
color: #c8922a;
font-weight: 600;
text-decoration: none;
white-space: nowrap;
}
.utci-about-link:hover {
text-decoration: underline;
}
.utci-footer {
margin-top: 36px;
padding-top: 20px;
border-top: 1px solid #d4c0a0;
font-family: Manrope, sans-serif;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.07em;
color: #9a7d5a;
line-height: 2.2;
}
/* The "Reading the table." intro snippet */
.utci-footer em {
font-family: Fraunces, serif;
font-style: italic;
text-transform: none;
letter-spacing: 0;
font-size: 14px;
color: #7a5c2a;
}
/* Site-wide footer - matches about and faq pages */
.utci-site-footer {
text-align: center;
padding: 2rem 1.5rem;
font-size: 0.82rem;
color: #b09870;
border-top: 1px solid #e0d0a8;
font-family: Manrope, sans-serif;
font-weight: 600;
text-transform: none;
letter-spacing: 0;
line-height: 1.7;
}
.utci-site-footer a {
color: #b09870;
text-decoration: none;
transition: color 0.2s;
}
.utci-site-footer a:hover {
color: #c8922a;
text-decoration: underline;
}
.display-opt {
display: flex;
align-items: center;
gap: 5px;
cursor: pointer;
user-select: none;
}
.display-opt input[type="checkbox"] {
accent-color: var(--c-accent, #e07b2a);
cursor: pointer;
}
/* ── 12. RESPONSIVE (mobile) ───────────────────────────────────────── */
/* On screens narrower than 800px, stack the header vertically and
shrink the dial. Add more rules in this block to tweak mobile
layout further. */
@media (max-width: 800px) {
.utci-app {
padding: 52px 10px 32px;
}
.utci-header {
grid-template-columns: 1fr; /* stack the 3 header columns */
text-align: center;
}
.header-right {
align-items: center;
}
.utci-current-loc,
.utci-loc-coords,
.utci-fetch-time {
text-align: center;
}
.utci-search-wrap {
width: 100%;
}
.scope-ring {
width: 250px;
height: 250px;
margin: 0 auto;
}
.scope-env-row {
width: 250px;
}
/* Halve the hourly-table cell padding on mobile so more columns fit
in the viewport before the horizontal scrollbar kicks in. */
.utci-table th {
padding: 7px 6px;
}
.utci-table td {
padding: 5px 6px;
}
/* Drop the compass-label text ("N", "NW"...) next to the wind vane on
mobile — the vane arrow alone is enough at small sizes. */
.wind-dir-label {
display: none;
}
}
/* At ≤640px the top nav becomes position:fixed (72px tall, see base.css),
so the app needs 96px of top padding to clear it. This must come AFTER the
max-width:800px rule above — which sets padding-top:52px for the tablet
range where the nav is NOT fixed — so it wins the cascade on true mobile. */
@media (max-width: 640px) {
.utci-app {
padding-top: 96px;
}
.utci-fetch-time {
text-align: center; /* override the default left-align on mobile */
}
}
/* -- CUSTOM SELECT BUTTON - mobile label clipping ----------------------
On narrow screens buttons are fixed ~33% width. The .cs-btn-label span
wraps the text node so ellipsis can work (text-overflow needs a block
context - bare text nodes inside flex containers cannot clip directly).
The cs-arrow is flex-shrink-0 so the chevron always stays visible.
DENSITY-BREAKPOINT - matches the table.css 480px breakpoint.
-------------------------------------------------------------------- */
@media (max-width: 480px) {
.cs-btn {
display: block !important;
position: relative !important;
overflow: hidden;
padding: 7px 6px !important;
white-space: nowrap;
}
.cs-btn-label {
display: block;
width: calc(100% - 15px);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.cs-btn .cs-arrow {
position: absolute !important;
right: 6px;
top: 50%;
margin: 0;
transform: translateY(-50%) rotate(45deg);
}
}