/* === Weather Consensus – Enhanced Theme with Day/Night + Rain + Snow === */ /* ---------- Design tokens (Night default) ---------- */ :root { --bg: #0b1220; --bg-2: #0d1526; --panel: #10192b; --panel-2: #0f1726; --card: #121c31; --card-2: #16223a; --muted: #98a2b3; --text: #e6eefc; --brand: #5ea0ff; --accent: #8ef2d0; --accent-2: #b388ff; --warning: #ffd166; --error: #ff6b6b; --border: #1e2a42; --glass: rgba(255, 255, 255, 0.05); --shadow-lg: 0 20px 45px rgba(0, 0, 0, .35); --shadow-md: 0 10px 25px rgba(0, 0, 0, .28); --radius-lg: 16px; --radius-md: 12px; --radius-sm: 10px; } /* ---------- Day theme overrides (darker sky) ---------- */ body[data-theme="day"] { --bg: #9ec7ff; /* zenith */ --bg-2: #cfe4ff; /* near horizon */ --panel: #ffffff; --panel-2: #f6fbff; --card: #ffffff; --card-2: #f4f9ff; --text: #0e1c33; --muted: #3c4b63; --border: #c0d6f7; --brand: #2e75ff; --accent: #00bba0; --accent-2: #8a75ff; } /* ---------- Base ---------- */ * { box-sizing: border-box } html, body { height: 100% } body { margin: 0; background: radial-gradient(1200px 600px at 70% -10%, #1b2a4a33 0%, transparent 60%), linear-gradient(180deg, var(--bg) 0%, var(--bg-2) 60%, var(--bg) 100%); color: var(--text); font: 16px/1.5 system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, "Helvetica Neue", Arial; letter-spacing: .2px; } /* subtle animated star dots (night only) */ body:not([data-theme="day"])::before { content: ""; position: fixed; inset: 0; pointer-events: none; z-index: 0; background-image: radial-gradient(1px 1px at 10% 20%, #fff2 40%, transparent 41%), radial-gradient(1px 1px at 80% 30%, #fff3 40%, transparent 41%), radial-gradient(1px 1px at 50% 70%, #fff2 40%, transparent 41%), radial-gradient(1px 1px at 20% 80%, #fff1 40%, transparent 41%); animation: twinkle 8s linear infinite; } @keyframes twinkle { 0%, 100% { opacity: .4 } 50% { opacity: .8 } } .container { width: min(1100px, 92vw); margin: 0 auto; padding: 1rem; position: relative; z-index: 2 } /* ---------- Top gradient bar ---------- */ .topbar { height: 6px; width: 100%; position: fixed; top: 0; left: 0; z-index: 5; background: linear-gradient(90deg, #4ea2ff 0%, #7b86ff 20%, #b07cff 40%, #ff7fd1 60%, #77e1c6 80%, #4ea2ff 100%); box-shadow: 0 2px 10px rgba(94, 160, 255, .6); } /* ---------- Header / Hero with clouds ---------- */ .site-header { padding-top: 24px } .hero { position: relative; overflow: hidden; border-bottom: 1px solid #12203b; background: radial-gradient(800px 240px at 50% 0%, #1d2b48aa 0%, transparent 70%); } /* Day: softer atmospheric glow */ body[data-theme="day"] .hero { background: radial-gradient(900px 260px at 70% -10%, rgba(255, 255, 255, 0.65) 0%, rgba(255, 255, 255, 0.15) 40%, transparent 75%); } .hero-inner { padding: 2.6rem 1rem 1.1rem } .controls { display: flex; gap: .9rem; align-items: center; justify-content: center; flex-wrap: wrap; margin-top: .6rem; } .site-header h1 { margin: .25rem 0 .35rem; font-size: 2.1rem; font-weight: 800; letter-spacing: .3px; text-shadow: 0 3px 16px rgba(0, 0, 0, .35); } body[data-theme="day"] .site-header h1 { text-shadow: none } .tagline { color: var(--muted); margin: 0 .5rem .9rem; text-align: center } /* ---------- Minimal modern sun (day only) ---------- */ .sun { position: absolute; top: 20px; right: 40px; width: 90px; height: 90px; display: none; z-index: 0; } body[data-theme="day"] .sun { display: block; } .sun .disc { position: absolute; inset: 0; border-radius: 50%; background: radial-gradient(circle at 35% 35%, #fff7c2 0%, #ffe169 45%, #ffc94d 75%, #ffb84b 100%); box-shadow: 0 0 45px 12px rgba(255, 215, 91, 0.45), 0 0 120px 40px rgba(255, 215, 91, 0.15); } .sun .ray { display: none !important; } /* if old markup exists */ /* ---------- Minimal modern moon (night only) ---------- */ .moon { position: absolute; top: 20px; /* matches sun placement for symmetry */ right: 40px; width: 84px; height: 84px; display: none; z-index: 0; /* behind clouds/precip, same as sun */ } body[data-theme="night"] .moon { display: block; } /* show only at night */ body[data-theme="day"] .moon { display: none; } /* hide in day */ .moon .disc { position: absolute; inset: 0; border-radius: 50%; /* Soft, cool moon gradient */ background: radial-gradient(circle at 40% 40%, #f7f9ff 0%, #e9efff 45%, #d6defe 72%, #c3ccff 100%); /* Subtle bluish glow */ box-shadow: 0 0 40px 12px rgba(150, 170, 255, 0.28), 0 0 120px 40px rgba(140, 160, 255, 0.14); } /* (Optional) very subtle craters — keep modern & minimal */ .moon .disc { background: radial-gradient(10px 10px at 28% 36%, rgba(0, 0, 0, .12) 0 55%, transparent 56%), radial-gradient(7px 7px at 62% 30%, rgba(0, 0, 0, .10) 0 55%, transparent 56%), radial-gradient(6px 6px at 50% 64%, rgba(0, 0, 0, .10) 0 55%, transparent 56%), radial-gradient(circle at 40% 40%, #f7f9ff 0%, #e9efff 45%, #d6defe 72%, #c3ccff 100%); } /* Clouds */ .clouds { position: absolute; left: 0; right: 0; bottom: 0; height: 120px; pointer-events: none; z-index: 1; opacity: .9; filter: drop-shadow(0 10px 20px rgba(0, 0, 0, .18)); } .layer-back { animation: driftBack 36s linear infinite; opacity: .45 } .layer-front { animation: driftFront 28s linear infinite; opacity: .65 } .clouds svg { width: 150%; height: 100% } @keyframes driftBack { 0% { transform: translateX(0) } 100% { transform: translateX(-20%) } } @keyframes driftFront { 0% { transform: translateX(0) } 100% { transform: translateX(-35%) } } /* Lightning flash (kept subtle; barely visible by day) */ .lightning { position: absolute; inset: 0; pointer-events: none; z-index: 0; background: radial-gradient(400px 220px at 70% 0%, #fff0 0%, #fff0 55%, #fff3 55.5%, #fff0 56%); mix-blend-mode: screen; opacity: 0; animation: flash 9s ease-in-out infinite; } @keyframes flash { 0%, 86%, 100% { opacity: 0 } 89% { opacity: .22 } 90% { opacity: .55 } 92% { opacity: .12 } } /* ---------- Rain overlay ---------- */ .rain { position: absolute; inset: 0; pointer-events: none; z-index: 3; opacity: 0; transition: opacity .3s ease } body.rainy .rain { opacity: .65 } .rain span { position: absolute; top: -10vh; width: 2px; height: 8vh; background: linear-gradient(to bottom, #aee1ff 0%, #4f9bf2 80%, transparent 100%); opacity: .8; border-radius: 1px; filter: blur(.3px); animation: drop 1.2s linear infinite; } @keyframes drop { 0% { transform: translateY(-12vh) } 100% { transform: translateY(110vh) } } /* ---------- Snow overlay ---------- */ .snow { position: absolute; inset: 0; pointer-events: none; z-index: 3; opacity: 0; transition: opacity .3s ease } body.snowy .snow { opacity: .9 } .snow span { position: absolute; top: -10vh; width: var(--size, 6px); height: var(--size, 6px); background: #ffffff; border-radius: 50%; opacity: var(--alpha, .9); filter: drop-shadow(0 1px 3px rgba(0, 0, 0, .28)); animation: snowFall var(--dur, 8s) linear infinite; animation-play-state: paused; } body.snowy .snow span { animation-play-state: running; } @keyframes snowFall { 0% { transform: translateY(-12vh) translateX(0) } 100% { transform: translateY(110vh) translateX(var(--drift, 40px)) } } /* ---------- Search ---------- */ .search { display: flex; gap: .6rem; justify-content: center; position: relative; flex-wrap: wrap; z-index: 4; } .search input { width: min(520px, 86vw); padding: .85rem 1rem; border-radius: 12px; border: 1px solid #22314e; background: #0e1626; color: var(--text); outline: none; box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.02), 0 8px 18px rgba(0, 0, 0, .35); } body[data-theme="day"] .search input { background: #ffffff; border-color: #cfe3ff; color: #10233d; box-shadow: 0 8px 18px rgba(0, 0, 0, .10) } .search input:focus { border-color: #2f4b7f; box-shadow: 0 0 0 4px #2f4b7f33 } .search button { padding: .85rem 1rem; border-radius: 12px; border: none; background: linear-gradient(135deg, var(--brand), var(--accent-2)); color: #061229; font-weight: 800; letter-spacing: .3px; cursor: pointer; box-shadow: var(--shadow-md); } .search button:hover { filter: brightness(1.06) } .theme-toggle { display: flex; align-items: center; gap: .45rem; color: var(--muted); font-weight: 600 } .theme-toggle select { appearance: none; padding: .62rem .7rem; border-radius: 10px; border: 1px solid #22314e; background: #0e1626; color: var(--text) } body[data-theme="day"] .theme-toggle select { background: #fff; border-color: #cfe3ff; color: #10233d } /* ---------- Autocomplete (portal dropdown) ---------- */ .sugg-box { position: fixed; /* NOTE: JS controls left/transform now */ display: none; z-index: 10000; background: #0e1626; border: 1px solid #22314e; border-radius: 12px; box-shadow: 0 18px 38px rgba(0, 0, 0, .35); max-height: 55vh; overflow: auto; color: var(--text); /* No default left/transform here to avoid conflict with JS */ } .sugg-item { padding: .7rem .95rem; border-bottom: 1px solid #18253e; cursor: pointer; color: var(--text); } .sugg-item:last-child { border-bottom: none } .sugg-item:hover, .sugg-item:focus { background: #15223a; outline: none } /* Day theme for autocomplete: light background + dark text */ body[data-theme="day"] .sugg-box { background: #ffffff; border-color: #cfe3ff; color: #0e1c33; box-shadow: 0 18px 38px rgba(0, 0, 0, .14); } body[data-theme="day"] .sugg-item { color: #0e1c33; border-bottom: 1px solid #e6efff; } body[data-theme="day"] .sugg-item:hover, body[data-theme="day"] .sugg-item:focus { background: #f0f6ff; } /* ---------- Panels & Grid ---------- */ .panel { background: linear-gradient(180deg, var(--panel) 0%, var(--panel-2) 100%); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 1.1rem; margin: 1rem 0; color: var(--muted); box-shadow: var(--shadow-md); backdrop-filter: blur(4px); } .grid { display: grid; grid-template-columns: 1fr; gap: 1rem; margin: 1rem 0 } @media(min-width:720px) { .grid { grid-template-columns: repeat(2, 1fr) } } @media(min-width:1024px) { .grid { grid-template-columns: repeat(3, 1fr) } } /* ---------- Forecast cards ---------- */ .card { position: relative; background: linear-gradient(180deg, var(--card) 0%, var(--card-2) 100%); border: 1px solid #1f2c47; border-radius: var(--radius-lg); padding: 1rem; box-shadow: var(--shadow-lg); overflow: hidden; transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease; } .card::after { content: ""; position: absolute; inset: 0; pointer-events: none; background: radial-gradient(600px 300px at 120% -10%, rgba(94, 160, 255, 0.12), transparent 60%); opacity: .8; } .card:hover { transform: translateY(-3px); box-shadow: 0 22px 50px rgba(0, 0, 0, .42); border-color: #28406c; } .card-head { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: .5rem; gap: .6rem } .card .day { font-weight: 700 } .card .hi .label { display: block; color: var(--muted); font-size: .8rem } .card .hi .val { font-size: 1.4rem; font-weight: 800 } /* ---------- Metrics rows ---------- */ .metrics { display: grid; grid-template-columns: 1fr; gap: .6rem; margin-top: .6rem } .metric { display: grid; grid-template-columns: auto 1fr auto; gap: .6rem; align-items: center } .metric .i { width: 24px; height: 24px; color: var(--accent); display: grid; place-items: center } .metric .i svg { width: 22px; height: 22px } .metric .name { color: var(--muted) } .metric .value { font-weight: 800 } /* ---------- Provider breakdown ---------- */ .providers { margin-top: .8rem } .providers summary { cursor: pointer; color: var(--brand); font-weight: 700; letter-spacing: .2px } .prov-pre { white-space: pre-wrap; overflow: auto; background: #0e1626; border: 1px dashed #27406b; border-radius: 10px; padding: .7rem; margin: .6rem 0; color: #bdd0ff; } body[data-theme="day"] .prov-pre { background: #f6fbff; color: #213555; border-color: #cfe3ff } /* ---------- Utility / Micro ---------- */ .error { background: #240d12; border: 1px solid #4d1c2a; color: #ffb5b5; padding: .9rem; border-radius: 12px } .site-footer { padding: 1.2rem 0; text-align: center; color: var(--muted) } :focus-visible { outline: 3px solid #6db0ff; outline-offset: 2px } /* Reduced motion: keep precipitation (slower), disable heavy chrome */ @media (prefers-reduced-motion: reduce) { .layer-back, .layer-front, .lightning, body::before, .sun { animation: none !important } .rain span { animation-duration: 2s !important; } .snow span { animation-duration: calc(var(--dur, 8s) * 1.5) !important; } } #useMyLocation{ padding:.85rem 1rem; border-radius:12px; border:1px solid var(--border); background:linear-gradient(180deg, var(--panel) 0%, var(--panel-2) 100%); color:var(--text); font-weight:700; box-shadow: var(--shadow-md); } #useMyLocation:hover{ filter:brightness(1.03) } body[data-theme="day"] #useMyLocation{ background:#ffffff; border-color:#cfe3ff; color:#10233d; box-shadow:0 8px 18px rgba(0,0,0,.10); } #radarControls button { padding:.55rem .9rem; border-radius:10px; border:1px solid var(--border); background:linear-gradient(180deg,var(--panel) 0%, var(--panel-2) 100%); color:var(--text); font-weight:700; } /* --- Card header layout tweaks --- */ .card .card-head { display: grid; grid-template-columns: 1fr auto; /* date row on left, hi/low on right */ gap: .25rem 1rem; align-items: center; } .card .card-head .date-row { display: inline-flex; align-items: center; gap: .5rem; white-space: nowrap; /* keep "Wed, Jan 28" together */ min-width: 0; /* prevent overflow issues in narrow cards */ } .card .card-head .date-text { font-weight: 600; } /* Small pill for “Today” */ .today-badge { display: inline-block; font-size: .78rem; line-height: 1; padding: .18rem .45rem; border-radius: 999px; background: rgba(80,145,255,.16); /* subtle blue pill on dark */ color: #b9d4ff; /* lighter blue text */ border: 1px solid rgba(80,145,255,.3); user-select: none; } /* Optional: keep the hi/low line from wrapping too early */ .card .card-head .hi-lo { white-space: nowrap; justify-self: end; }