/* Lunar Impact Flash Explorer — dark theme, layout, focus styles, reduced motion (design §9.1, §9.4–9.5). */ :root { --bg-0: #0a0a1a; --bg-1: #1a1a3a; --panel: rgba(12, 12, 32, 0.85); --panel-solid: #0c0c20; --border: rgba(255, 255, 255, 0.12); --text: #ececf4; --muted: #b4b8cc; --accent: #ffcc00; --accent-ink: #1a1400; --ok: #5fd38d; --bad: #ff7a7a; --warn: #ffb347; --radius: 10px; --header-h: 72px; font-family: system-ui, "Segoe UI", Roboto, sans-serif; color-scheme: dark; } * { box-sizing: border-box; } html, body { margin: 0; padding: 0; } body { min-height: 100vh; color: var(--text); background: linear-gradient(160deg, var(--bg-0) 0%, var(--bg-1) 100%) fixed; line-height: 1.45; font-size: 15px; } a { color: var(--accent); } a:hover { text-decoration-thickness: 2px; } :focus-visible { outline: 3px solid var(--accent); outline-offset: 2px; } h1, h2, h3 { line-height: 1.2; margin: 0.4em 0; } h1 { font-size: 1.35rem; } h2 { font-size: 1.1rem; } h3 { font-size: 0.98rem; } kbd { font: 0.75em ui-monospace, Consolas, monospace; border: 1px solid var(--border); border-radius: 4px; padding: 0 4px; color: var(--muted); } .noscript { padding: 1rem; background: var(--panel-solid); border-bottom: 1px solid var(--bad); } /* ---------- header / footer ---------- */ .site-header { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.5rem 1rem; padding: 0.5rem 1rem; min-height: var(--header-h); border-bottom: 1px solid var(--border); } .subtitle { margin: 0; color: var(--muted); font-size: 0.9rem; } .header-actions { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; } .site-footer { padding: 0.75rem 1rem 1.25rem; color: var(--muted); font-size: 0.85rem; border-top: 1px solid var(--border); } /* ---------- panels ---------- */ .panel { background: var(--panel); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border: 1px solid var(--border); border-radius: var(--radius); } @supports not ((backdrop-filter: blur(10px)) or (-webkit-backdrop-filter: blur(10px))) { .panel { background: var(--panel-solid); } } /* ---------- layout ---------- */ .layout { display: grid; gap: 0.75rem; padding: 0.75rem; grid-template-columns: minmax(0, 1fr); grid-template-areas: "view" "side" "panels"; } #view { grid-area: view; display: flex; flex-direction: column; min-width: 0; } #side { grid-area: side; padding: 0.5rem 0.75rem; min-width: 0; } #panels { grid-area: panels; padding: 0.5rem 0.75rem 1rem; min-width: 0; } #view-stage { position: relative; height: 50vh; min-height: 300px; border-radius: var(--radius) var(--radius) 0 0; overflow: hidden; background: #05050f; } @media (min-width: 900px) { .layout { grid-template-columns: minmax(0, 1fr) 380px; grid-template-areas: "view side" "panels side"; align-items: start; } #view-stage { height: 60vh; min-height: 360px; } #side { position: sticky; top: 0.75rem; overflow: auto; max-height: calc(100vh - var(--header-h) - 1.5rem); } } #view-canvas { position: absolute; inset: 0; } #view-canvas canvas { display: block; width: 100%; height: 100%; } #hud { position: absolute; left: 0.5rem; top: 0.5rem; font-size: 0.8rem; color: var(--text); background: rgba(5, 5, 15, 0.6); border-radius: 6px; padding: 0.25rem 0.5rem; font-variant-numeric: tabular-nums; pointer-events: none; } #hud:empty { display: none; } .ir-legend { position: absolute; right: 0.5rem; bottom: 0.5rem; width: 200px; font-size: 0.75rem; color: var(--text); background: rgba(5, 5, 15, 0.6); border-radius: 6px; padding: 0.3rem 0.5rem; pointer-events: none; } .ir-legend[hidden] { display: none; } .ir-legend .ir-bar { height: 10px; border-radius: 3px; margin-bottom: 0.2rem; } #view-placeholder { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; padding: 1.5rem; text-align: center; color: var(--muted); font-size: 1rem; background: radial-gradient(circle at 50% 45%, #1d1d3a 0%, #05050f 70%); } #view-placeholder[hidden] { display: none; } #toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem 0.6rem; padding: 0.5rem 0.75rem; border-top: 1px solid var(--border); } .tb-item { display: inline-flex; align-items: center; gap: 0.35rem; font-size: 0.85rem; } .tb-item.scrub input { width: 160px; } #status { margin: 0; padding: 0.4rem 0.75rem 0.6rem; font-size: 0.85rem; color: var(--muted); border-top: 1px solid var(--border); } #status .st-icon { margin-right: 0.35em; } #status.st-warning { color: var(--warn); } #status.st-error { color: var(--bad); } /* ---------- controls ---------- */ .btn, select, input[type="number"], button { font: inherit; color: var(--text); background: #16163a; border: 1px solid var(--border); border-radius: 6px; padding: 0.25rem 0.5rem; } .btn { cursor: pointer; } .btn:hover:not(:disabled) { border-color: var(--accent); } .btn:disabled, select:disabled, input:disabled { opacity: 0.5; cursor: not-allowed; } .btn-accent { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); } #controls fieldset { border: 1px solid var(--border); border-radius: 8px; margin: 0.5rem 0; padding: 0.35rem 0.6rem 0.5rem; } #controls legend { padding: 0 0.3rem; color: var(--accent); font-weight: 600; font-size: 0.9rem; } #controls details { margin: 0.5rem 0; } #controls summary { cursor: pointer; color: var(--accent); font-weight: 600; padding: 0.25rem 0; } .ctl { margin: 0.4rem 0; } .ctl > label { display: block; font-size: 0.85rem; } .ctl-row { display: flex; align-items: center; gap: 0.4rem; } .ctl-row input[type="range"] { flex: 1 1 auto; min-width: 0; accent-color: var(--accent); } .ctl-row input[type="number"] { width: 7.5em; font-variant-numeric: tabular-nums; } .ctl-row .unit { color: var(--muted); font-size: 0.8rem; min-width: 2.5em; } .ctl select { width: 100%; } .ctl small { display: block; color: var(--muted); font-size: 0.75rem; } .ctl.is-disabled > label { color: var(--muted); } /* ---------- quick answers / outputs ---------- */ #quick { border-bottom: 1px solid var(--border); padding-bottom: 0.4rem; } #quick-body p { margin: 0.3rem 0; font-size: 0.88rem; } #quick-body strong { color: var(--accent); } #outputs dl { display: grid; grid-template-columns: minmax(0, 42%) minmax(0, 1fr); gap: 0.15rem 0.5rem; font-size: 0.83rem; font-variant-numeric: tabular-nums; margin: 0.25rem 0; } #outputs dt { color: var(--muted); } #outputs dd { margin: 0; overflow-wrap: anywhere; } #outputs .greyed { color: var(--muted); } .warnings { list-style: none; padding: 0; margin: 0.4rem 0; display: flex; flex-wrap: wrap; gap: 0.3rem; } .warnings li, .chip { font-size: 0.75rem; color: var(--warn); border: 1px solid var(--warn); border-radius: 999px; padding: 0.05rem 0.5rem; } /* ---------- tabs ---------- */ .tablist { display: flex; flex-wrap: wrap; gap: 0.25rem; border-bottom: 1px solid var(--border); margin-bottom: 0.5rem; } .tablist [role="tab"] { border: 1px solid transparent; border-bottom: none; border-radius: 8px 8px 0 0; background: transparent; padding: 0.4rem 0.9rem; cursor: pointer; color: var(--muted); } .tablist [role="tab"][aria-selected="true"] { color: var(--text); background: #16163a; border-color: var(--border); box-shadow: inset 0 -3px 0 var(--accent); } [role="tabpanel"][hidden] { display: none; } .panel-title { margin-top: 0.2rem; } /* ---------- charts ---------- */ .chart { display: block; width: 100%; height: 300px; background: rgba(5, 5, 15, 0.55); border-radius: 8px; } .chart-tall { height: 380px; } .legend { display: flex; flex-wrap: wrap; gap: 0.25rem 0.9rem; font-size: 0.8rem; margin: 0.35rem 0 0.5rem; color: var(--muted); } .legend-item { display: inline-flex; align-items: center; gap: 0.35rem; } .legend-item svg { flex: none; } .chart-note, .note { color: var(--muted); font-size: 0.82rem; } /* ---------- tables ---------- */ .table-wrap { overflow-x: auto; } table.data { border-collapse: collapse; width: 100%; font-size: 0.82rem; font-variant-numeric: tabular-nums; margin: 0.5rem 0; } table.data caption { text-align: left; color: var(--muted); padding: 0.25rem 0; caption-side: top; } table.data th, table.data td { border-bottom: 1px solid var(--border); padding: 0.25rem 0.4rem; text-align: left; vertical-align: top; } table.data thead th { color: var(--muted); font-weight: 600; } table.data tr.is-selected { background: rgba(240, 228, 66, 0.12); } .yes { color: var(--ok); } .no { color: var(--bad); } #recommendation p, .answers p { margin: 0.35rem 0; } .answers { border: 1px solid var(--border); border-radius: 8px; padding: 0.4rem 0.7rem; background: rgba(255, 204, 0, 0.05); } .answers strong { color: var(--accent); } /* ---------- equations ---------- */ .eq-card { border: 1px solid var(--border); border-radius: 8px; margin: 0.4rem 0; padding: 0 0.7rem; background: rgba(5, 5, 15, 0.35); } .eq-card > summary { cursor: pointer; padding: 0.35rem 0; list-style-position: inside; } .eq-card > summary h3 { display: inline; font-size: 0.95rem; } .eq-card[open] { padding-bottom: 0.5rem; } .eq-tex { overflow-x: auto; margin: 0.4rem 0; } .eq-live { color: var(--accent); font-variant-numeric: tabular-nums; } .eq-refs a { margin-right: 0.6rem; } .eq-card table { border-collapse: collapse; font-size: 0.82rem; margin: 0.4rem 0; } .eq-card th, .eq-card td { border-bottom: 1px solid var(--border); padding: 0.2rem 0.45rem; text-align: left; } .eq-card caption { text-align: left; color: var(--muted); } .no-katex .eq-tex, .no-katex .eq-sym { font-family: ui-monospace, Consolas, "Courier New", monospace; white-space: pre-wrap; color: var(--text); } /* ---------- about / dialog ---------- */ #about ol { padding-left: 1.4rem; font-size: 0.85rem; } #about li { margin: 0.2rem 0; } dialog { color: var(--text); background: var(--panel-solid); border: 1px solid var(--border); border-radius: var(--radius); max-width: min(640px, 92vw); padding: 1rem 1.25rem; } dialog::backdrop { background: rgba(0, 0, 0, 0.6); } .shortcuts { display: grid; grid-template-columns: auto 1fr; gap: 0.2rem 0.8rem; } .shortcuts dd { margin: 0; } /* ---------- user preferences ---------- */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition: none !important; animation: none !important; scroll-behavior: auto !important; } } @media (prefers-contrast: more) { .panel { background: var(--panel-solid); backdrop-filter: none; -webkit-backdrop-filter: none; border: 1px solid var(--muted); } .eq-card, #controls fieldset, table.data th, table.data td, .answers { border-color: var(--muted); } }