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
259 lines
5.0 KiB
CSS
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; }
|
|
}
|