205 lines
11 KiB
CSS
205 lines
11 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; }
|
|
.craft-label {
|
|
font-size: 9.5px; letter-spacing: 0.3px; white-space: nowrap;
|
|
text-shadow: 0 0 4px #000, 0 0 8px #000; transform: translate(-50%, -180%);
|
|
user-select: none; padding: 1px 3px;
|
|
}
|
|
|
|
/* ---- 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: 46px; left: 14px; width: 300px; max-height: calc(100vh - 160px);
|
|
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; }
|
|
|
|
/* PERIHELION-E — sky-events timeline marks (SYZYGY). Diamonds sit on/above the
|
|
time bar, positioned by date fraction; the container is click-transparent so
|
|
the strip's own scrub still works between marks. Opposition = brass (bright),
|
|
greatest elongation = cool accent, conjunction = dim (on the bar). */
|
|
#event-marks { position: absolute; inset: 0; overflow: visible; pointer-events: none; z-index: 4; }
|
|
.ev-mark {
|
|
position: absolute; width: 7px; height: 7px; border-radius: 1px;
|
|
transform: translate(-50%, 0) rotate(45deg);
|
|
pointer-events: auto; cursor: pointer; transition: transform 0.1s ease, box-shadow 0.1s ease;
|
|
}
|
|
.ev-mark:hover { transform: translate(-50%, 0) rotate(45deg) scale(1.6); z-index: 6; }
|
|
.ev-opp { top: -8px; background: var(--brass); box-shadow: 0 0 5px rgba(217, 164, 65, 0.75); }
|
|
.ev-elong { top: -8px; background: #7fc7d6; box-shadow: 0 0 5px rgba(127, 199, 214, 0.6); }
|
|
.ev-conj { top: 2px; width: 5px; height: 5px; background: var(--brass-dim); opacity: 0.6; }
|
|
.ev-conj:hover { opacity: 1; }
|