solargod/css/style.css
monsterrobotparty 26a5751394 🌞 genesis: scaffold — serve.py proxy+cache, importmap renderer, sky, sun, HUD, time bar, floating-origin bootstrap (opus)
Stage 0. Zero-dependency serve.py (static + allowlisted horizons/sbdb/cad proxy,
sha256 disk cache with past-span immutability). Three.js via pinned importmap,
logarithmic depth, procedural starfield sky (+ Milky Way panorama swap-in), Sun
with additive glow, OrbitControls, brass-and-void HUD, scrubbable time bar,
central bodyWorld position pass, focus/camera system, hash state. Boots clean,
no console errors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 00:04:41 +10:00

184 lines
9.3 KiB
CSS

/* SOLARGOD — brass-and-void observatory HUD. Structure ported from GODSIGH;
palette shifted from cyan-OSINT to warm brass over deep space. */
:root {
--void: #05060a;
--panel: rgba(12, 13, 20, 0.82);
--panel-solid: rgba(12, 13, 20, 0.96);
--border: rgba(217, 164, 65, 0.14);
--brass: #d9a441;
--brass-dim: #9a7b3e;
--text: #e6ddca;
--dim: #8a8674;
--ok: #6fcf6f;
--warn: #e0b64a;
--err: #e06a5a;
}
* { box-sizing: border-box; }
html, body {
margin: 0;
height: 100%;
overflow: hidden;
background: var(--void);
color: var(--text);
font-family: ui-monospace, "SF Mono", "Cascadia Code", Menlo, Consolas, monospace;
font-size: 12px;
}
#scene { position: absolute; inset: 0; }
#scene canvas { display: block; }
/* CSS2D label overlay sits above the canvas but below the HUD */
#labels { position: absolute; inset: 0; pointer-events: none; z-index: 5; overflow: hidden; }
.body-label {
color: var(--text);
font-size: 10.5px;
letter-spacing: 0.4px;
text-shadow: 0 0 4px #000, 0 0 8px #000;
white-space: nowrap;
padding: 1px 3px;
transform: translate(-50%, -140%);
user-select: none;
}
.body-label.moon { color: var(--dim); font-size: 9.5px; }
.body-label .lbl-dist { color: var(--brass-dim); font-size: 9px; }
.body-label.focused { color: var(--brass); font-weight: 700; }
/* ---- breadcrumb ---- */
#breadcrumb {
position: absolute; top: 16px; left: 16px; z-index: 10;
display: flex; align-items: center; gap: 7px;
font-size: 13px; letter-spacing: 1px; font-weight: 600;
text-shadow: 0 0 6px #000;
}
#breadcrumb .crumb { color: var(--dim); }
#breadcrumb .crumb.current { color: var(--brass); }
#breadcrumb .crumb:not(.current):hover { color: var(--text); }
#breadcrumb .crumb-sep { color: var(--brass-dim); font-size: 11px; }
/* ---- HUD (right) ---- */
#hud {
position: absolute; top: 14px; right: 14px; width: 300px;
max-height: calc(100vh - 130px);
display: flex; flex-direction: column; gap: 10px;
padding: 14px; background: var(--panel);
border: 1px solid var(--border); border-radius: 12px;
backdrop-filter: blur(9px); -webkit-backdrop-filter: blur(9px);
z-index: 10; box-shadow: 0 8px 44px rgba(0, 0, 0, 0.6);
}
#hud header { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.brand { font-weight: 700; letter-spacing: 1px; font-size: 15px; color: #fff; }
.brand span { color: var(--brass); font-weight: 500; font-size: 11px; }
#live-chip {
font-size: 10px; font-weight: 700; letter-spacing: 0.5px;
padding: 3px 8px; border-radius: 999px; white-space: nowrap; border: 1px solid transparent;
}
#live-chip[data-state="live"] { color: var(--ok); border-color: rgba(111,207,111,0.4); background: rgba(111,207,111,0.1); }
#live-chip[data-state="scrub"] { color: var(--warn); border-color: rgba(224,182,74,0.4); background: rgba(224,182,74,0.1); font-size: 9px; }
.ctl-row { display: flex; align-items: center; gap: 8px; }
.slider-row, .menu-row { justify-content: space-between; }
.ctl-label { color: var(--dim); font-size: 10px; text-transform: uppercase; letter-spacing: 0.6px; }
.seg { display: flex; gap: 4px; }
.seg button {
flex: 1; padding: 6px 10px; font: inherit; font-size: 11px; color: var(--dim);
background: rgba(255,255,255,0.03); border: 1px solid var(--border);
border-radius: 8px; cursor: pointer; transition: all 0.15s;
}
.seg button:hover { color: var(--text); }
.seg button.active { color: #16110a; background: var(--brass); border-color: var(--brass); font-weight: 700; }
.menu-row select, #tb-rate {
font: inherit; font-size: 11px; color: var(--text); background: rgba(255,255,255,0.04);
border: 1px solid var(--border); border-radius: 8px; padding: 5px 8px; cursor: pointer;
}
/* ---- layer rows ---- */
#layers { display: flex; flex-direction: column; gap: 1px; overflow-y: auto; margin-top: 2px; }
.layer-row { padding: 5px 4px; border-radius: 6px; }
.layer-row:hover { background: rgba(255,255,255,0.03); }
.layer-row label { display: flex; align-items: center; gap: 7px; cursor: pointer; user-select: none; }
.layer-row input[type="checkbox"] { accent-color: var(--brass); margin: 0; cursor: pointer; }
.layer-row .lname { flex: 1; color: var(--text); }
.dot { width: 7px; height: 7px; border-radius: 50%; flex: none; background: var(--dim); transition: background 0.2s; }
.dot[data-state="ok"] { background: var(--ok); box-shadow: 0 0 6px rgba(111,207,111,0.6); }
.dot[data-state="warn"] { background: var(--warn); box-shadow: 0 0 6px rgba(224,182,74,0.6); }
.dot[data-state="err"] { background: var(--err); box-shadow: 0 0 6px rgba(224,106,90,0.6); }
.dot[data-state="off"] { background: var(--dim); }
.lstatus { padding: 0 0 0 24px; color: var(--dim); font-size: 10px; line-height: 1.3; }
.lstatus:empty { display: none; }
#hud footer { border-top: 1px solid var(--border); padding-top: 8px; color: var(--dim); font-size: 9.5px; line-height: 1.5; }
#hud footer a { color: var(--brass-dim); }
/* ---- time bar (bottom) ---- */
#timebar {
position: absolute; left: 50%; bottom: 14px; transform: translateX(-50%);
width: min(880px, calc(100vw - 28px));
display: flex; flex-direction: column; gap: 8px;
padding: 10px 14px; background: var(--panel); border: 1px solid var(--border);
border-radius: 12px; backdrop-filter: blur(9px); -webkit-backdrop-filter: blur(9px);
z-index: 10; box-shadow: 0 8px 44px rgba(0,0,0,0.6);
}
.tb-controls { display: flex; align-items: center; gap: 8px; }
.tb-controls button {
font: inherit; font-size: 11px; color: var(--text); background: rgba(255,255,255,0.04);
border: 1px solid var(--border); border-radius: 8px; padding: 6px 10px; cursor: pointer; min-width: 34px;
}
.tb-controls button:hover { color: #fff; border-color: var(--brass-dim); }
.tb-controls button.on { color: #16110a; background: var(--brass); border-color: var(--brass); font-weight: 700; }
#date-readout { margin-left: auto; font-size: 12px; letter-spacing: 0.5px; color: var(--text); }
#date-readout.scrubbed { color: var(--warn); }
#timeline-outer { position: relative; height: 10px; border-radius: 6px; background: rgba(255,255,255,0.05); border: 1px solid var(--border); cursor: pointer; }
#timeline-fill { position: absolute; left: 0; top: 0; bottom: 0; width: 0; background: linear-gradient(90deg, rgba(217,164,65,0.15), rgba(217,164,65,0.35)); border-radius: 6px; pointer-events: none; }
#timeline-cursor { position: absolute; top: -3px; width: 3px; height: 16px; background: var(--brass); border-radius: 2px; transform: translateX(-50%); box-shadow: 0 0 8px rgba(217,164,65,0.8); pointer-events: none; }
.tb-ends { display: flex; justify-content: space-between; color: var(--dim); font-size: 9px; }
/* ---- info panel (left, Stage 6) ---- */
#infopanel {
position: absolute; top: 14px; left: 14px; width: 300px; max-height: calc(100vh - 130px);
padding: 16px; background: var(--panel-solid); border: 1px solid var(--border);
border-left: 2px solid var(--brass); border-radius: 12px; overflow-y: auto;
z-index: 9; box-shadow: 0 8px 44px rgba(0,0,0,0.6);
}
#infopanel[hidden] { display: none; }
#infopanel .ip-title { font-size: 18px; font-weight: 700; color: #fff; letter-spacing: 0.5px; }
#infopanel .ip-type { color: var(--brass); font-size: 10px; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; }
#infopanel .ip-art { width: 100%; border-radius: 8px; margin: 8px 0; border: 1px solid var(--border); }
#infopanel .ip-blurb { color: var(--text); line-height: 1.5; font-size: 11.5px; margin: 8px 0; }
#infopanel .ip-facts { display: flex; flex-direction: column; gap: 3px; margin-top: 8px; }
#infopanel .ip-fact { display: flex; justify-content: space-between; gap: 10px; font-size: 11px; }
#infopanel .ip-fact span:first-child { color: var(--dim); }
#infopanel .ip-fact span:last-child { color: var(--text); text-align: right; }
#infopanel .ip-close { position: absolute; top: 12px; right: 14px; cursor: pointer; color: var(--dim); font-size: 16px; }
#infopanel .ip-close:hover { color: var(--text); }
#infopanel .ip-link { display: inline-block; margin-top: 10px; color: var(--brass); text-decoration: none; border: 1px solid var(--border); border-radius: 8px; padding: 6px 10px; font-size: 11px; }
#infopanel .ip-link:hover { background: rgba(217,164,65,0.1); }
/* ---- toast + debug ---- */
#toast {
position: absolute; left: 50%; bottom: 96px; transform: translateX(-50%);
padding: 8px 14px; background: var(--panel-solid); border: 1px solid var(--border);
border-radius: 999px; font-size: 11px; color: var(--text); z-index: 20;
opacity: 0; transition: opacity 0.25s; pointer-events: none;
}
#toast.show { opacity: 1; }
#debug { position: absolute; top: 14px; left: 50%; transform: translateX(-50%); z-index: 20; padding: 4px 10px; background: var(--panel-solid); border: 1px solid var(--border); border-radius: 8px; font-size: 10px; color: var(--brass); }
#debug[hidden] { display: none; }
/* ---- splash / boot overlay ---- */
#splash {
position: absolute; inset: 0; z-index: 30; display: flex; flex-direction: column;
align-items: center; justify-content: center; gap: 18px;
background: var(--void); background-size: cover; background-position: center;
transition: opacity 0.8s; text-align: center;
}
#splash.hide { opacity: 0; pointer-events: none; }
#splash .sp-title { font-size: 42px; font-weight: 700; letter-spacing: 6px; color: #fff; text-shadow: 0 0 24px rgba(217,164,65,0.6); }
#splash .sp-sub { color: var(--brass); letter-spacing: 3px; font-size: 12px; }
#splash .sp-status { color: var(--dim); font-size: 11px; }