Files
AetherForge/server/web/src/styles/operatorDeck.css
AetherForge 7831e70dd4 Add AV/Defender tests and clear PROBLEMS.md antivirus rows.
Cover mining diagnostics JSON blockers, AV-Safe preset fields, defender_off error paths, and Calibrate exclusion .ps1 generation with Go + Vitest; honest AV limits already documented in settingHelp.
2026-06-07 06:34:56 -07:00

415 lines
14 KiB
CSS

/* ═══ Unified Operator Deck — shared instrument chrome ═══ */
:root {
/* Card chrome */
--deck-card-bg: linear-gradient(145deg, rgba(14, 12, 20, 0.94) 0%, rgba(6, 6, 12, 0.98) 100%);
--deck-card-border: rgba(140, 120, 60, 0.28);
--deck-card-radius: 6px;
--deck-card-padding: 1.25rem;
--deck-card-shadow: 0 10px 36px rgba(0, 0, 0, 0.72), 0 0 1px rgba(80, 60, 140, 0.25);
--deck-card-glow: rgba(0, 232, 245, 0.12);
--deck-card-accent-bar: var(--neon-cyan, #00e8f5);
/* Section accent (default command deck) */
--deck-accent: var(--neon-cyan, #00e8f5);
--deck-accent-secondary: var(--brass-light, #c4ad5a);
--deck-accent-dim: rgba(0, 232, 245, 0.35);
--deck-accent-glow: rgba(0, 232, 245, 0.45);
--deck-accent-bg: rgba(0, 232, 245, 0.06);
/* Persistent 4px left accent rail */
--deck-accent-rail: var(--neon-cyan, #00e8f5);
--deck-accent-rail-glow: rgba(0, 232, 245, 0.48);
/* Interactive bounding box */
--deck-interactive-outline: var(--deck-accent-dim);
--deck-interactive-glow: var(--deck-accent-glow);
--deck-interactive-radius: var(--deck-card-radius);
--deck-interactive-dash: 8px;
--deck-interactive-lift: -1px;
--deck-interactive-btn-scale: 1.018;
/* Ambient music UI (Layout sets data-operator-deck) */
--deck-ambient-ui-opacity: 0.72;
}
/* ── Per-section accent tokens ── */
[data-operator-deck='dashboard'] {
--deck-accent: var(--neon-cyan, #00e8f5);
--deck-accent-secondary: var(--brass-light, #c4ad5a);
--deck-accent-dim: rgba(0, 232, 245, 0.38);
--deck-accent-glow: rgba(0, 232, 245, 0.5);
--deck-accent-bg: rgba(0, 232, 245, 0.07);
--deck-card-accent-bar: var(--neon-cyan);
--deck-accent-rail: var(--neon-cyan, #00e8f5);
--deck-accent-rail-glow: rgba(0, 232, 245, 0.5);
--deck-ambient-ui-opacity: 0.68;
}
[data-operator-deck='fleet'] {
--deck-accent: var(--neon-cyan, #00e8f5);
--deck-accent-secondary: var(--neon-green, #2ee810);
--deck-accent-dim: rgba(0, 232, 245, 0.34);
--deck-accent-glow: rgba(0, 232, 245, 0.42);
--deck-accent-bg: rgba(0, 232, 245, 0.05);
--deck-card-accent-bar: var(--neon-cyan);
--deck-accent-rail: var(--neon-green, #2ee810);
--deck-accent-rail-glow: rgba(46, 232, 16, 0.46);
--deck-ambient-ui-opacity: 0.7;
}
[data-operator-deck='crucible'] {
--deck-accent: #c9a227;
--deck-accent-secondary: #e85d4a;
--deck-accent-dim: rgba(201, 162, 39, 0.42);
--deck-accent-glow: rgba(232, 93, 74, 0.48);
--deck-accent-bg: rgba(180, 50, 30, 0.08);
--deck-card-accent-bar: #c9a227;
--deck-accent-rail: #c9a227;
--deck-accent-rail-glow: rgba(201, 162, 39, 0.52);
--deck-ambient-ui-opacity: 0.75;
}
[data-operator-deck='forge'] {
--deck-accent: var(--neon-amber, #e89830);
--deck-accent-secondary: var(--neon-cyan, #00e8f5);
--deck-accent-dim: rgba(232, 152, 48, 0.42);
--deck-accent-glow: rgba(255, 180, 60, 0.55);
--deck-accent-bg: rgba(232, 152, 48, 0.08);
--deck-card-accent-bar: var(--neon-amber);
--deck-accent-rail: var(--neon-cyan, #00e8f5);
--deck-accent-rail-glow: rgba(0, 232, 245, 0.5);
--deck-ambient-ui-opacity: 1;
}
[data-operator-deck='mission-deck'] {
--deck-accent: #ff8c3a;
--deck-accent-secondary: #ffd700;
--deck-accent-dim: rgba(255, 140, 58, 0.42);
--deck-accent-glow: rgba(255, 140, 58, 0.55);
--deck-accent-bg: rgba(255, 140, 58, 0.08);
--deck-card-accent-bar: #ff8c3a;
--deck-accent-rail: #a78bfa;
--deck-accent-rail-glow: rgba(167, 139, 250, 0.52);
--deck-ambient-ui-opacity: 0.95;
}
[data-operator-deck='builds'] {
--deck-accent: var(--brass-light, #c4ad5a);
--deck-accent-secondary: var(--neon-cyan, #00e8f5);
--deck-accent-dim: rgba(201, 162, 39, 0.38);
--deck-accent-glow: rgba(201, 162, 39, 0.45);
--deck-accent-bg: rgba(201, 162, 39, 0.07);
--deck-card-accent-bar: var(--brass-light);
--deck-accent-rail: var(--brass-light, #c4ad5a);
--deck-accent-rail-glow: rgba(196, 173, 90, 0.48);
--deck-ambient-ui-opacity: 0.55;
}
[data-operator-deck='emberwake'] {
--deck-accent: #f43f5e;
--deck-accent-secondary: #ff6b2c;
--deck-accent-dim: rgba(244, 63, 94, 0.4);
--deck-accent-glow: rgba(255, 107, 44, 0.5);
--deck-accent-bg: rgba(244, 63, 94, 0.07);
--deck-card-accent-bar: #ff6b2c;
--deck-accent-rail: #f43f5e;
--deck-accent-rail-glow: rgba(244, 63, 94, 0.5);
--deck-ambient-ui-opacity: 0.8;
}
[data-operator-deck='settings'] {
--deck-accent: var(--neon-purple, #a83ef0);
--deck-accent-secondary: var(--text-muted, #5e5868);
--deck-accent-dim: rgba(168, 62, 240, 0.28);
--deck-accent-glow: rgba(168, 62, 240, 0.32);
--deck-accent-bg: rgba(168, 62, 240, 0.05);
--deck-card-accent-bar: var(--neon-purple);
--deck-accent-rail: var(--neon-purple, #a83ef0);
--deck-accent-rail-glow: rgba(168, 62, 240, 0.42);
--deck-ambient-ui-opacity: 0.38;
}
[data-operator-deck='pathtracer'] {
--deck-accent: var(--neon-cyan, #00e8f5);
--deck-accent-secondary: var(--brass-light, #c4ad5a);
--deck-accent-dim: rgba(0, 232, 245, 0.38);
--deck-accent-glow: rgba(0, 232, 245, 0.45);
--deck-accent-bg: rgba(0, 232, 245, 0.07);
--deck-card-accent-bar: var(--neon-cyan);
--deck-accent-rail: var(--neon-cyan, #00e8f5);
--deck-accent-rail-glow: rgba(0, 232, 245, 0.48);
--deck-ambient-ui-opacity: 0.55;
}
/* Forge seasonal skins override deck accent when present on page root */
[class*='forge-skin--'] {
--deck-accent: var(--forge-accent, var(--neon-amber));
--deck-accent-secondary: var(--forge-accent-secondary, var(--neon-cyan));
--deck-accent-dim: var(--forge-accent-dim, rgba(232, 152, 48, 0.42));
--deck-accent-glow: var(--forge-glow, rgba(255, 180, 60, 0.55));
--deck-accent-bg: var(--forge-accent-bg, rgba(232, 152, 48, 0.08));
--deck-card-accent-bar: var(--forge-accent, var(--neon-amber));
--deck-accent-rail: var(--neon-cyan, #00e8f5);
--deck-accent-rail-glow: rgba(0, 232, 245, 0.5);
}
/* ── Section accent rail (4px persistent left edge) ── */
[data-operator-deck] .main-content {
position: relative;
}
[data-operator-deck] .main-content:not(:has(.operator-deck-page))::before,
.operator-deck-page::before {
content: '';
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 4px;
background: var(--deck-accent-rail, var(--deck-accent));
box-shadow: 0 0 18px var(--deck-accent-rail-glow, var(--deck-accent-glow));
pointer-events: none;
z-index: 3;
}
.operator-deck-page {
position: relative;
}
/* ── Page shell ── */
.operator-deck-page .deck-hero::after {
background: linear-gradient(90deg, var(--deck-accent), transparent);
box-shadow: 0 0 12px var(--deck-accent-glow);
}
.operator-deck-page .deck-eyebrow {
color: var(--deck-accent-secondary, var(--deck-accent));
}
/* ── Card chrome (layers on .card / .neon-card — does not replace page styles) ── */
.operator-deck-card {
position: relative;
border-radius: var(--deck-card-radius);
box-shadow:
var(--deck-card-shadow),
0 0 28px -14px var(--deck-card-glow);
transition:
border-color 0.22s ease,
box-shadow 0.28s ease;
}
.card.operator-deck-card,
.neon-card.operator-deck-card {
border-color: color-mix(in srgb, var(--deck-card-border) 75%, var(--deck-accent-dim));
}
.operator-deck-card::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
border-radius: var(--deck-card-radius) var(--deck-card-radius) 0 0;
background: linear-gradient(90deg, var(--deck-card-accent-bar), transparent 72%);
opacity: 0.65;
pointer-events: none;
z-index: 1;
}
.operator-deck-card:hover {
border-color: color-mix(in srgb, var(--deck-card-border) 55%, var(--deck-accent));
box-shadow:
var(--deck-card-shadow),
0 0 32px -10px var(--deck-accent-glow);
}
/* Emberwake spread sections — deck chrome without losing section accents */
.emberwake-page .spread-section.operator-deck-card {
padding: var(--deck-card-padding);
border-radius: var(--deck-card-radius);
box-shadow:
var(--deck-card-shadow),
0 0 24px -12px var(--deck-accent-glow);
}
.emberwake-page .spread-section--ember.operator-deck-card { --deck-card-accent-bar: #ff6b2c; }
.emberwake-page .spread-section--cyan.operator-deck-card { --deck-card-accent-bar: #3dd6c6; }
.emberwake-page .spread-section--gold.operator-deck-card { --deck-card-accent-bar: #c9a227; }
.emberwake-page .spread-section--violet.operator-deck-card { --deck-card-accent-bar: #a78bfa; }
.emberwake-page .spread-section--war-room.operator-deck-card { --deck-card-accent-bar: #f43f5e; }
/* Builder form sections */
.builder-form .form-section.operator-deck-card {
padding: var(--deck-card-padding);
border-radius: var(--deck-card-radius);
}
/* ── Interactive bounding boxes (focus / hover outlines) ── */
@keyframes operator-interactive-dash-march {
to {
background-position:
var(--deck-interactive-dash) 0,
calc(-1 * var(--deck-interactive-dash)) 100%,
0 var(--deck-interactive-dash),
100% calc(-1 * var(--deck-interactive-dash));
}
}
.operator-interactive {
position: relative;
transition:
transform 0.22s cubic-bezier(0.23, 1, 0.32, 1),
box-shadow 0.22s ease,
outline-color 0.22s ease;
outline: 1px solid transparent;
outline-offset: 2px;
}
/* Animated dashed ring — enhancement layer via ::before (does not replace outline) */
.operator-interactive::before {
content: '';
position: absolute;
inset: -2px;
border-radius: calc(var(--deck-interactive-radius) + 2px);
pointer-events: none;
z-index: 4;
opacity: 0;
background:
linear-gradient(90deg, var(--deck-interactive-outline) 50%, transparent 50%) 0 0 / var(--deck-interactive-dash) 1px repeat-x,
linear-gradient(90deg, var(--deck-interactive-outline) 50%, transparent 50%) 0 100% / var(--deck-interactive-dash) 1px repeat-x,
linear-gradient(0deg, var(--deck-interactive-outline) 50%, transparent 50%) 0 0 / 1px var(--deck-interactive-dash) repeat-y,
linear-gradient(0deg, var(--deck-interactive-outline) 50%, transparent 50%) 100% 0 / 1px var(--deck-interactive-dash) repeat-y;
transition: opacity 0.22s ease;
}
.operator-interactive:hover,
.operator-interactive:focus-within {
outline-color: var(--deck-interactive-outline);
box-shadow:
0 0 0 1px var(--deck-interactive-outline),
0 0 20px -6px var(--deck-interactive-glow);
}
.operator-interactive:hover::before,
.operator-interactive:focus-within::before {
opacity: 1;
animation: operator-interactive-dash-march 0.75s linear infinite;
}
.operator-interactive:focus-within {
outline-color: var(--deck-accent);
box-shadow:
0 0 0 1px var(--deck-accent-dim),
0 0 22px -4px var(--deck-interactive-glow);
}
.operator-interactive:focus-visible {
outline: 2px solid var(--deck-accent);
outline-offset: 3px;
}
/* Micro-lift — flat panels only; 3D neon cards keep their own tilt transform */
.operator-interactive:not(.neon-card-3d):hover,
.operator-interactive:not(.neon-card-3d):focus-within {
transform: translateY(var(--deck-interactive-lift));
}
.neon-card-3d.operator-interactive:hover,
.neon-card-3d.operator-interactive:focus-within {
transform: perspective(var(--perspective, 900px)) rotateX(2deg) translateY(calc(var(--deck-interactive-lift) - 3px));
}
/* Crucible node cards — lighter outline + compact lift */
.crucible-node-card.operator-interactive:hover:not(.selected),
.crucible-node-card.operator-interactive:focus-within:not(.selected) {
outline-color: var(--deck-interactive-outline);
transform: translateY(var(--deck-interactive-lift)) scale(1.008);
}
/* Tactile button scale within operator decks */
.operator-interactive-btn,
.operator-deck-page .btn:not(:disabled),
.operator-deck-page button:not(:disabled):not([role='switch']) {
transition:
transform 0.16s cubic-bezier(0.23, 1, 0.32, 1),
box-shadow 0.16s ease,
border-color 0.16s ease,
background 0.16s ease,
color 0.16s ease,
opacity 0.16s ease;
}
.operator-interactive-btn:hover:not(:disabled),
.operator-interactive-btn:focus-visible:not(:disabled),
.operator-deck-page .btn:not(:disabled):hover,
.operator-deck-page .btn:not(:disabled):focus-visible,
.operator-deck-page button:not(:disabled):not([role='switch']):hover,
.operator-deck-page button:not(:disabled):not([role='switch']):focus-visible {
transform: scale(var(--deck-interactive-btn-scale));
}
.operator-interactive-btn:active:not(:disabled),
.operator-deck-page .btn:not(:disabled):active,
.operator-deck-page button:not(:disabled):not([role='switch']):active {
transform: scale(0.985);
}
/* Nested step panels inside fleet / forge wizards */
.fleet-policy-step-panel.operator-interactive,
.forge-mission-wizard .forge-mission-step-panel.operator-interactive {
border-radius: var(--deck-interactive-radius);
padding: 0.85rem 1rem;
margin-top: 0.5rem;
}
/* Global music player — section-aware ambient UI intensity */
.global-music-player {
opacity: var(--deck-ambient-ui-opacity);
border-color: color-mix(in srgb, var(--deck-card-border) 60%, var(--deck-accent-dim));
}
.global-music-player:hover,
.global-music-player:focus-within {
opacity: 1;
border-color: color-mix(in srgb, var(--deck-accent-dim) 80%, var(--deck-accent));
box-shadow:
0 6px 22px rgba(0, 0, 0, 0.6),
0 0 16px var(--deck-accent-glow);
}
.global-music-player--ambient-dim {
opacity: calc(var(--deck-ambient-ui-opacity) * 0.85);
}
@media (prefers-reduced-motion: reduce) {
.operator-deck-card,
.operator-interactive,
.operator-interactive-btn,
.global-music-player {
transition: none;
}
.operator-interactive::before {
animation: none !important;
}
.operator-interactive:not(.neon-card-3d):hover,
.operator-interactive:not(.neon-card-3d):focus-within,
.crucible-node-card.operator-interactive:hover:not(.selected),
.neon-card-3d.operator-interactive:hover,
.neon-card-3d.operator-interactive:focus-within {
transform: none;
}
.operator-interactive-btn:hover:not(:disabled),
.operator-interactive-btn:active:not(:disabled),
.operator-deck-page .btn:not(:disabled):hover,
.operator-deck-page .btn:not(:disabled):active,
.operator-deck-page button:not(:disabled):hover,
.operator-deck-page button:not(:disabled):active {
transform: none;
}
}