/* ════════════════════════════════════════════════════════════════════════ 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); } .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; } .event-banner { display: flex; align-items: center; gap: 14px; padding: 13px 18px; border-radius: 4px; position: relative; border-left: 4px solid rgba(255,255,255,0.25); } /* Single-element crossfade — content swaps during the transition gap */ .event-banner.banner-exiting { animation: banner-fade-out 0.4s ease both; pointer-events: none; } .event-banner.banner-entering { animation: banner-fade-in 0.4s ease both; } .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: 8px; /* push banner clear of the fixed nav bar */ margin-bottom: 18px; /* breathing room between banner and header */ } .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