/* ════════════════════════════════════════════════════════════════════════ ui.css — Status banners, legend, about block, footer, and responsive. ════════════════════════════════════════════════════════════════════════ */ /* ── EVENT BANNER ───────────────────────────────────────────────────── */ /* Animated slide-down banner for cosmic/weather/promo events. */ /* Flyout: a fixed panel pinned to the very top of the screen that slides down over everything (including the nav) and retracts upward on close. */ .event-banner-wrap { position: fixed; top: 0; left: 0; right: 0; z-index: 9999; display: flex; justify-content: center; padding: 0 14px; transform: translateY(-130%); transition: transform 0.5s cubic-bezier(0.34, 1.25, 0.64, 1); /* The wrap is full-width but the panel is centred — keep the wrap itself click-through so its transparent sides never block the nav beneath it. Only the visible banner panel (.event-banner) captures clicks. */ pointer-events: none; } .event-banner-wrap.visible { transform: translateY(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. Constrains the flyout to a centred panel width and clips the absolute outgoing slide. */ .event-banner-stage { position: relative; overflow: hidden; width: 100%; max-width: 720px; } /* True crossfade — outgoing slide sits absolutely on top and fades out */ .event-banner { display: flex; align-items: center; gap: 14px; padding: 14px 18px; border-radius: 0 0 12px 12px; /* rounded bottom — it hangs from the top edge */ position: relative; z-index: 1; border-left: 4px solid rgba(255,255,255,0.25); box-shadow: 0 12px 32px rgba(0, 0, 0, 0.3); cursor: pointer; /* whole banner is click-to-close */ pointer-events: auto; /* re-enable clicks on the panel itself */ } .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-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: 10px; margin-top: 7px; align-items: center; padding: 5px 0; } .event-banner-dot { width: 10px; height: 10px; 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(4, 1fr); grid-auto-rows: 1fr; gap: 0; } .almanac-entry { display: flex; align-items: flex-start; gap: 13px; padding: 13px 18px; border-right: 1px solid #f0e4cc; transition: background 0.15s; } /* Desktop: single row of 4 — vertical dividers only, none on the far edge. */ .almanac-entry:last-child { border-right: none; } .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; } /* ≤900px: fall back to a 2×2 grid so cards stay readable. */ @media (max-width: 900px) { .almanac-list { grid-template-columns: repeat(2, 1fr); } .almanac-entry { border-right: 1px solid #f0e4cc; } .almanac-entry:nth-child(2n) { border-right: none; /* right edge of the grid */ } .almanac-entry:nth-child(-n + 2) { border-bottom: 1px solid #f0e4cc; /* divider between the two rows */ } } /* ≤600px: single column. */ @media (max-width: 600px) { .almanac-list { grid-template-columns: 1fr; } .almanac-entry, .almanac-entry:nth-child(2n) { border-right: none; } .almanac-entry { border-bottom: 1px solid #f0e4cc; } .almanac-entry:last-child { border-bottom: none; } } /* ── EVENT BANNER — mobile fixes ────────────────────────────────────── */ @media (max-width: 640px) { .event-banner-wrap { padding: 0; /* full-bleed flyout on small screens */ } .event-banner { align-items: flex-start; /* stop dismiss ✕ drifting downward */ gap: 10px; padding: 18px 12px 14px 14px; margin-bottom: 0; border-radius: 0 0 12px 12px; } .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