Files
the-nexus/style.css
Alexander Whitestone d4f57943ce
Some checks failed
CI / validate (pull_request) Failing after 9s
CI / auto-merge (pull_request) Has been skipped
feat: add right-click object inspection for 3D objects
Right-clicking any inspectable 3D mesh or sprite now shows a
holographic tooltip with the object's name and description.

Tagged objects: glass platform, platform rim, sovereignty meter,
sovereignty score sprite, agent panels, and commit banners.
The contextmenu handler uses THREE.Raycaster against all scene
children and surfaces the first hit with userData.inspectName.
Tooltip dismisses on click or Escape.

Fixes #141
2026-03-24 00:37:33 -04:00

259 lines
5.0 KiB
CSS

/* === DESIGN SYSTEM — NEXUS === */
:root {
--color-bg: #000008;
--color-primary: #4488ff;
--color-secondary: #334488;
--color-text: #ccd6f6;
--color-text-muted: #4a5568;
--font-body: 'Courier New', monospace;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: var(--color-bg);
color: var(--color-text);
font-family: var(--font-body);
overflow: hidden;
width: 100vw;
height: 100vh;
}
canvas {
display: block;
position: fixed;
top: 0;
left: 0;
}
/* === HUD === */
.hud-controls {
z-index: 10;
}
/* === AUDIO TOGGLE === */
#audio-toggle {
font-size: 14px;
background-color: var(--color-primary);
color: var(--color-bg);
padding: 4px 8px;
border: none;
border-radius: 4px;
font-family: var(--font-body);
transition: background-color 0.3s ease;
cursor: pointer;
}
#audio-toggle:hover {
background-color: var(--color-secondary);
}
#audio-toggle.muted {
background-color: var(--color-text-muted);
}
/* === DEBUG MODE === */
#debug-toggle {
margin-left: 8px;
}
.collision-box {
outline: 2px solid red;
outline-offset: 2px;
}
.light-source {
outline: 2px dashed yellow;
outline-offset: 2px;
}
/* === OVERVIEW MODE === */
#overview-indicator {
display: none;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: var(--color-primary);
font-family: var(--font-body);
font-size: 11px;
letter-spacing: 0.2em;
text-transform: uppercase;
pointer-events: none;
z-index: 20;
border: 1px solid var(--color-primary);
padding: 4px 10px;
background: rgba(0, 0, 8, 0.6);
white-space: nowrap;
animation: overview-pulse 2s ease-in-out infinite;
}
#overview-indicator.visible {
display: block;
}
.overview-hint {
margin-left: 12px;
color: var(--color-text-muted);
font-size: 10px;
}
@keyframes overview-pulse {
0%, 100% { opacity: 0.7; }
50% { opacity: 1; }
}
/* === PHOTO MODE === */
body.photo-mode .hud-controls {
display: none;
}
body.photo-mode #overview-indicator {
display: none !important;
}
#photo-indicator {
display: none;
position: fixed;
bottom: 16px;
left: 50%;
transform: translateX(-50%);
color: var(--color-primary);
font-family: var(--font-body);
font-size: 11px;
letter-spacing: 0.2em;
text-transform: uppercase;
pointer-events: none;
z-index: 20;
border: 1px solid var(--color-primary);
padding: 4px 12px;
background: rgba(0, 0, 8, 0.5);
white-space: nowrap;
animation: overview-pulse 2s ease-in-out infinite;
}
#photo-indicator.visible {
display: block;
}
.photo-hint {
margin-left: 12px;
color: var(--color-text-muted);
font-size: 10px;
letter-spacing: 0.1em;
}
#photo-focus {
color: var(--color-primary);
}
/* === SOVEREIGNTY EASTER EGG === */
#sovereignty-msg {
display: none;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #ffd700;
font-family: var(--font-body);
font-size: 13px;
letter-spacing: 0.3em;
text-transform: uppercase;
pointer-events: none;
z-index: 30;
border: 1px solid #ffd700;
padding: 8px 20px;
background: rgba(0, 0, 8, 0.7);
white-space: nowrap;
text-align: center;
}
#sovereignty-msg.visible {
display: block;
animation: sovereignty-flash 2.5s ease-out forwards;
}
@keyframes sovereignty-flash {
0% { opacity: 0; transform: translate(-50%, -50%) scale(0.85); }
15% { opacity: 1; transform: translate(-50%, -50%) scale(1.05); }
40% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
100% { opacity: 0; transform: translate(-50%, -50%) scale(1); }
}
/* === OBJECT INSPECTION TOOLTIP === */
#inspect-tooltip {
display: none;
position: fixed;
z-index: 50;
background: rgba(0, 8, 24, 0.92);
border: 1px solid var(--color-primary);
padding: 8px 12px;
font-family: var(--font-body);
pointer-events: none;
max-width: 280px;
}
#inspect-tooltip.visible {
display: block;
}
#inspect-name {
font-size: 11px;
color: var(--color-primary);
letter-spacing: 0.15em;
text-transform: uppercase;
margin-bottom: 4px;
}
#inspect-desc {
font-size: 11px;
color: var(--color-text);
line-height: 1.4;
opacity: 0.85;
}
/* === CRT / CYBERPUNK OVERLAY === */
.crt-overlay {
position: fixed;
inset: 0;
z-index: 9999;
pointer-events: none;
background:
linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.15) 50%),
linear-gradient(90deg, rgba(255, 0, 0, 0.04), rgba(0, 255, 0, 0.02), rgba(0, 0, 255, 0.04));
background-size: 100% 4px, 4px 100%;
animation: flicker 0.15s infinite;
box-shadow: inset 0 0 100px rgba(0,0,0,0.9);
}
@keyframes flicker {
0% { opacity: 0.95; }
50% { opacity: 1; }
100% { opacity: 0.98; }
}
.crt-overlay::after {
content: " ";
display: block;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
background: rgba(18, 16, 16, 0.1);
opacity: 0;
z-index: 999;
pointer-events: none;
animation: crt-pulse 4s linear infinite;
}
@keyframes crt-pulse {
0% { opacity: 0.05; }
50% { opacity: 0.15; }
100% { opacity: 0.05; }
}