:root { color-scheme: dark; --bg: #071019; --bg-soft: #0d1827; --panel: #101b2a; --panel-2: #132235; --line: rgba(255, 255, 255, 0.12); --text: #f7fbff; --muted: #9fb0c4; --blue: #39a8ff; --green: #45d483; --pink: #ff5aa5; --purple: #9c6dff; --orange: #ff9f43; --red: #ff595e; --shadow: rgba(0, 0, 0, 0.28); --radius: 8px; --control-h: 42px; --font: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; } body.light { color-scheme: light; --bg: #f5f8fb; --bg-soft: #e8eef6; --panel: #ffffff; --panel-2: #eef4fa; --line: rgba(21, 33, 52, 0.13); --text: #152134; --muted: #64748b; --shadow: rgba(25, 38, 60, 0.14); } * { box-sizing: border-box; } html, body { min-height: 100%; } body { margin: 0; background: linear-gradient(135deg, rgba(57, 168, 255, 0.16), transparent 34%), linear-gradient(225deg, rgba(255, 90, 165, 0.13), transparent 38%), var(--bg); color: var(--text); font-family: var(--font); letter-spacing: 0; } button, input, select { font: inherit; } button { min-height: var(--control-h); border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel-2); color: var(--text); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 0 14px; white-space: nowrap; } button:hover { border-color: rgba(57, 168, 255, 0.55); } button svg, .search svg { width: 17px; height: 17px; flex: 0 0 auto; } input, select { min-height: var(--control-h); border: 1px solid var(--line); border-radius: var(--radius); background: rgba(255, 255, 255, 0.06); color: var(--text); padding: 0 12px; width: 100%; min-width: 0; } select option { color: #111827; } input::placeholder { color: var(--muted); } .app-shell { width: min(1720px, 100%); min-height: 100vh; margin: 0 auto; padding: 18px; } .topbar { display: grid; grid-template-columns: minmax(220px, 0.7fr) minmax(320px, 1.1fr) auto; gap: 16px; align-items: center; margin-bottom: 16px; } .brand { min-width: 0; display: flex; gap: 12px; align-items: center; } .brand-mark { width: 42px; height: 42px; border-radius: 50%; flex: 0 0 auto; background: conic-gradient(from 40deg, var(--blue), var(--green), var(--orange), var(--pink), var(--purple), var(--red), var(--blue)); box-shadow: 0 0 26px rgba(57, 168, 255, 0.3); } h1, h2, h3, p { margin: 0; } h1 { font-size: 1.55rem; line-height: 1.05; } .brand p { color: var(--muted); margin-top: 4px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .search { position: relative; min-width: 0; } .search-box { display: grid; grid-template-columns: 22px minmax(0, 1fr) auto; gap: 10px; align-items: center; min-height: 52px; padding: 5px 6px 5px 14px; border: 1px solid var(--line); border-radius: var(--radius); background: rgba(255, 255, 255, 0.07); box-shadow: 0 12px 30px var(--shadow); } .search-box input { border: 0; background: transparent; padding: 0; } .search-box input:focus { outline: 0; } .search-results { position: absolute; z-index: 900; top: calc(100% + 8px); left: 0; right: 0; overflow: hidden; border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel); box-shadow: 0 18px 40px var(--shadow); } .search-result { width: 100%; justify-content: flex-start; border: 0; border-bottom: 1px solid var(--line); border-radius: 0; background: transparent; min-height: 48px; } .search-result:last-child { border-bottom: 0; } .top-actions { display: flex; gap: 10px; justify-content: flex-end; } .layout { display: grid; grid-template-columns: 260px minmax(0, 1fr); gap: 16px; align-items: start; } .control-panel, .data-section, .current-card, .metric-card, .map-section, .status-line { border: 1px solid var(--line); border-radius: var(--radius); background: rgba(16, 27, 42, 0.86); box-shadow: 0 14px 36px var(--shadow); } body.light .control-panel, body.light .data-section, body.light .current-card, body.light .metric-card, body.light .map-section, body.light .status-line { background: rgba(255, 255, 255, 0.88); } .control-panel { position: sticky; top: 16px; padding: 14px; } .panel-heading, .section-title, .dialog-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .panel-heading { padding-bottom: 12px; border-bottom: 1px solid var(--line); } .panel-heading h2, .section-title h2 { font-size: 1rem; } .panel-heading span, .section-title span { color: var(--muted); font-size: 0.88rem; } .control-group { padding: 14px 0; display: grid; gap: 8px; border-bottom: 1px solid var(--line); } .control-group h3 { font-size: 0.78rem; text-transform: uppercase; color: var(--muted); } .control-group label { display: flex; align-items: center; gap: 9px; min-height: 26px; color: var(--text); } .control-group input[type="checkbox"] { width: 16px; min-height: 16px; accent-color: var(--pink); } .control-actions { display: grid; gap: 10px; padding-top: 14px; } .content { display: grid; gap: 16px; min-width: 0; } .status-line { min-height: 44px; padding: 11px 14px; color: var(--muted); } .section-grid { display: grid; grid-template-columns: minmax(280px, 0.92fr) minmax(320px, 1.08fr); gap: 16px; min-width: 0; } .two-column { grid-template-columns: minmax(320px, 1fr) minmax(320px, 1fr); } .current-card { padding: 18px; min-width: 0; } .main-current { min-height: 250px; display: grid; grid-template-columns: minmax(210px, 0.9fr) minmax(240px, 1.1fr); gap: 16px; align-items: center; } .eyebrow { color: var(--green); font-size: 0.78rem; font-weight: 700; text-transform: uppercase; } #currentTemp { font-size: clamp(3rem, 8vw, 6rem); line-height: 0.95; margin: 8px 0; } #currentSummary { color: var(--muted); font-size: 1rem; line-height: 1.45; } canvas { display: block; width: 100%; max-width: 100%; } .metric-grid { display: grid; grid-template-columns: repeat(3, minmax(120px, 1fr)); gap: 12px; } .metric-card { min-height: 119px; padding: 14px; display: grid; align-content: space-between; } .metric-card .label { color: var(--muted); font-size: 0.82rem; } .metric-card .value { font-size: 1.45rem; line-height: 1.1; font-weight: 800; } .metric-card .hint { color: var(--muted); font-size: 0.78rem; } .map-section, .data-section { padding: 14px; min-width: 0; } .weather-map { min-height: 480px; height: 58vh; max-height: 720px; width: 100%; margin-top: 12px; overflow: hidden; border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg-soft); } .leaflet-container { background: var(--bg-soft); font-family: var(--font); } .map-badge { display: grid; place-items: center; width: 38px; height: 38px; border-radius: 50%; border: 2px solid #ffffff; color: #ffffff; font-weight: 800; box-shadow: 0 8px 22px rgba(0, 0, 0, 0.35); } .wind-arrow { display: grid; place-items: center; width: 44px; height: 44px; border-radius: 50%; border: 2px solid #ffffff; background: #9c6dff; color: #ffffff; font-weight: 900; box-shadow: 0 8px 22px rgba(0, 0, 0, 0.35); } .scroll-table { margin-top: 12px; overflow: auto; border: 1px solid var(--line); border-radius: var(--radius); } table { border-collapse: collapse; width: 100%; min-width: 760px; } th, td { padding: 10px 12px; text-align: left; border-bottom: 1px solid var(--line); } th { color: var(--muted); font-weight: 700; font-size: 0.78rem; text-transform: uppercase; background: rgba(255, 255, 255, 0.04); } td { font-size: 0.92rem; } tbody tr:hover { background: rgba(57, 168, 255, 0.08); } .daily-grid, .weekly-grid, .air-grid, .archive-list { display: grid; gap: 12px; margin-top: 12px; } .daily-grid { grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); } .weekly-grid { grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); } .air-grid { grid-template-columns: repeat(auto-fit, minmax(135px, 1fr)); } .mini-card, .archive-card { border: 1px solid var(--line); border-radius: var(--radius); background: rgba(255, 255, 255, 0.055); padding: 12px; min-width: 0; } .mini-card h3, .archive-card h3 { font-size: 0.98rem; margin-bottom: 8px; } .mini-card p, .archive-card p { color: var(--muted); line-height: 1.45; font-size: 0.88rem; } .temp-range { display: flex; justify-content: space-between; gap: 8px; margin: 9px 0; font-weight: 800; } .range-bar { height: 8px; border-radius: 999px; background: linear-gradient(90deg, var(--blue), var(--green), var(--orange), var(--red)); } .fact-list { display: grid; gap: 10px; margin: 12px 0 0; padding: 0; list-style: none; } .fact-list li { border: 1px solid var(--line); border-radius: var(--radius); padding: 12px; background: rgba(255, 255, 255, 0.055); line-height: 1.45; } .archive-search { display: grid; grid-template-columns: minmax(180px, 1fr) 130px 150px 150px auto; gap: 10px; margin-top: 12px; } .archive-card { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 12px; align-items: center; } .archive-meta { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; } .chip { border: 1px solid var(--line); border-radius: 999px; color: var(--muted); padding: 4px 8px; font-size: 0.78rem; } dialog { width: min(920px, calc(100vw - 28px)); max-height: calc(100vh - 28px); border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel); color: var(--text); box-shadow: 0 22px 70px rgba(0, 0, 0, 0.45); } dialog::backdrop { background: rgba(0, 0, 0, 0.58); } .round-button { width: 42px; padding: 0; } pre { max-height: 65vh; overflow: auto; white-space: pre-wrap; color: var(--text); background: rgba(0, 0, 0, 0.18); border: 1px solid var(--line); border-radius: var(--radius); padding: 12px; } [hidden], .is-hidden { display: none !important; } @media (max-width: 1120px) { .topbar { grid-template-columns: 1fr; } .top-actions { justify-content: flex-start; } .layout { grid-template-columns: 1fr; } .control-panel { position: static; } .control-panel { display: grid; grid-template-columns: repeat(3, minmax(160px, 1fr)); gap: 12px; } .panel-heading, .control-actions { grid-column: 1 / -1; } .control-group { border: 1px solid var(--line); border-radius: var(--radius); padding: 12px; } } @media (max-width: 880px) { .section-grid, .two-column, .main-current { grid-template-columns: 1fr; } .metric-grid { grid-template-columns: repeat(2, minmax(120px, 1fr)); } .archive-search { grid-template-columns: 1fr 1fr; } .archive-search button { grid-column: 1 / -1; } } @media (max-width: 640px) { .app-shell { padding: 12px; } .search-box { grid-template-columns: 20px minmax(0, 1fr); } .search-box button { grid-column: 1 / -1; width: 100%; } .top-actions, .control-actions { display: grid; grid-template-columns: 1fr 1fr; } .control-panel { grid-template-columns: 1fr; } .metric-grid, .archive-search { grid-template-columns: 1fr; } .weather-map { height: 420px; min-height: 360px; } .archive-card { grid-template-columns: 1fr; } }