Demo / dashboard /css /styles.css
Ajayyy00
Add hotseat multiplayer Red Team controls and 4 architectural fixes
a144947
/* ============================================================
CyberSOC Command Center — Dark SOC Theme
============================================================ */
:root {
--bg-primary: #0a0e17;
--bg-secondary: #111827;
--bg-card: #1a1f2e;
--border: #2a3040;
--border-hover: #3d4a60;
--accent-blue: #3b82f6;
--accent-cyan: #06b6d4;
--accent-green: #10b981;
--accent-red: #ef4444;
--accent-amber: #f59e0b;
--accent-orange: #f97316;
--accent-purple: #8b5cf6;
--text-primary: #f1f5f9;
--text-secondary: #94a3b8;
--text-muted: #4b5563;
--glow-red: 0 0 20px rgba(239,68,68,0.45);
--glow-blue: 0 0 20px rgba(59,130,246,0.45);
--glow-green: 0 0 15px rgba(16,185,129,0.35);
--glow-amber: 0 0 15px rgba(245,158,11,0.35);
--glow-purple: 0 0 15px rgba(139,92,246,0.35);
--glow-cyan: 0 0 15px rgba(6,182,212,0.35);
--header-h: 60px;
--gap: 7px;
--r: 10px;
--r-sm: 5px;
}
/* ============================================================ Reset */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html, body { height: 100%; overflow: hidden; font-family: 'Inter', sans-serif;
background: var(--bg-primary); color: var(--text-primary); font-size: 13px; line-height: 1.5; }
.mono { font-family: 'JetBrains Mono', monospace; }
/* ============================================================ Header */
.header {
position: fixed; top: 0; left: 0; right: 0;
height: var(--header-h); z-index: 100;
background: var(--bg-primary);
border-bottom: 1px solid var(--border);
display: flex; align-items: center; justify-content: space-between;
padding: 0 16px; gap: 12px;
backdrop-filter: blur(4px);
}
.header-left { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.shield-icon { font-size: 22px; filter: drop-shadow(0 0 8px rgba(59,130,246,0.7)); }
.header-title { font-size: 15px; font-weight: 700; letter-spacing: 0.04em; white-space: nowrap; }
/* Phase Indicator */
.header-center { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 3px; }
.phase-indicator { display: flex; align-items: center; }
.phase-dot { display: flex; flex-direction: column; align-items: center; gap: 3px; }
.phase-dot-circle {
width: 11px; height: 11px; border-radius: 50%;
background: var(--text-muted); border: 2px solid var(--border);
transition: all 0.4s ease;
}
.phase-dot.active .phase-dot-circle { background: var(--accent-blue); border-color: var(--accent-blue); box-shadow: var(--glow-blue); animation: phasePulse 1.6s ease infinite; }
.phase-dot.completed .phase-dot-circle { background: var(--accent-green); border-color: var(--accent-green); box-shadow: var(--glow-green); }
.phase-dot[data-phase="triage"].active .phase-dot-circle { background: var(--accent-amber); border-color: var(--accent-amber); box-shadow: var(--glow-amber); }
.phase-dot[data-phase="remediation"].active .phase-dot-circle { background: var(--accent-orange); border-color: var(--accent-orange); }
.phase-dot[data-phase="report"].active .phase-dot-circle { background: var(--accent-green); border-color: var(--accent-green); box-shadow: var(--glow-green); }
@keyframes phasePulse { 0%,100%{box-shadow:0 0 6px rgba(59,130,246,.4)} 50%{box-shadow:0 0 18px rgba(59,130,246,.9)} }
.phase-label { font-size: 8px; font-weight: 600; letter-spacing: .08em; color: var(--text-muted); transition: color .3s; white-space: nowrap; }
.phase-dot.active .phase-label { color: var(--accent-blue); }
.phase-dot.completed .phase-label { color: var(--accent-green); }
.phase-dot[data-phase="triage"].active .phase-label { color: var(--accent-amber); }
.phase-dot[data-phase="remediation"].active .phase-label { color: var(--accent-orange); }
.phase-connector { width: 36px; height: 1px; background: var(--border); margin: 0 4px 12px; transition: background .4s; }
.phase-connector.completed { background: var(--accent-green); }
.red-team-alert {
font-size: 10px; font-weight: 700; letter-spacing: .1em;
color: var(--accent-red); padding: 2px 8px;
border: 1px solid var(--accent-red); border-radius: 4px;
animation: blink 0.7s ease infinite;
}
@keyframes blink { 0%,100%{opacity:1} 50%{opacity:.25} }
/* Header right */
.header-right { display: flex; align-items: center; gap: 14px; flex-shrink: 0; }
.header-stat { display: flex; flex-direction: column; align-items: center; }
.header-stat-label { font-size: 8px; font-weight: 600; letter-spacing: .1em; color: var(--text-muted); }
.header-stat-value { font-size: 12px; font-weight: 700; }
.header-stat-value.mono { font-family: 'JetBrains Mono', monospace; font-size: 10px; }
.difficulty-badge {
padding: 3px 9px; border-radius: 4px; font-size: 9px; font-weight: 700; letter-spacing: .1em;
background: rgba(59,130,246,.15); color: var(--accent-blue); border: 1px solid rgba(59,130,246,.4);
}
.difficulty-badge.easy { background:rgba(16,185,129,.15); color:var(--accent-green); border-color:rgba(16,185,129,.4); }
.difficulty-badge.medium { background:rgba(245,158,11,.15); color:var(--accent-amber); border-color:rgba(245,158,11,.4); }
.difficulty-badge.hard { background:rgba(239,68,68,.15); color:var(--accent-red); border-color:rgba(239,68,68,.4); }
/* ============================================================ Grid */
.main-grid {
position: fixed; top: var(--header-h); left: 0; right: 0; bottom: 0;
display: grid;
grid-template-columns: 272px 1fr 256px;
grid-template-rows: 56% 44%;
gap: var(--gap); padding: var(--gap);
}
/* ============================================================ Panel */
.panel {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: var(--r);
box-shadow: 0 4px 24px rgba(0,0,0,.35);
display: flex; flex-direction: column; overflow: hidden;
transition: border-color .25s;
}
.panel:hover { border-color: var(--border-hover); }
.panel-header {
padding: 8px 12px; border-bottom: 1px solid var(--border);
display: flex; align-items: center; justify-content: space-between; flex-shrink: 0;
min-height: 36px;
}
.panel-title { font-size: 11px; font-weight: 600; letter-spacing: .05em; }
.panel-body { flex: 1; overflow: hidden; position: relative; }
.panel-1 { grid-column:1; grid-row:1; }
.panel-2 { grid-column:2; grid-row:1; }
.panel-3 { grid-column:3; grid-row:1; }
.panel-4 { grid-column:1; grid-row:2; }
.panel-5 { grid-column:2; grid-row:2; }
.panel-6 { grid-column:3; grid-row:2; display:flex; flex-direction:column; }
/* ============================================================ Badges */
.badge {
display:inline-flex; align-items:center; justify-content:center;
min-width:18px; height:18px; padding:0 5px; border-radius:9px;
font-size:10px; font-weight:700; font-family:'JetBrains Mono',monospace;
background:rgba(239,68,68,.2); color:var(--accent-red); border:1px solid rgba(239,68,68,.4);
}
.reward-badge { font-family:'JetBrains Mono',monospace; font-size:12px; font-weight:700; color:var(--accent-green); }
.reward-badge.negative { color:var(--accent-red); }
/* Panel 2 graph summary subtitle */
.graph-summary {
width:100%; font-size:9px; font-family:'JetBrains Mono',monospace;
color:var(--text-muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
padding-top:1px;
}
/* Panel 2 legend */
.graph-legend { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.legend-item { display:flex; align-items:center; gap:3px; font-size:9px; color:var(--text-secondary); }
.legend-dot { width:7px; height:7px; border-radius:50%; }
.legend-dot.host { background:var(--accent-blue); }
.legend-dot.process { background:var(--accent-amber); border-radius:1px; transform:rotate(45deg); }
.legend-dot.ioc { background:var(--accent-red); }
.legend-dot.alert-node { background:var(--accent-orange); }
.legend-dot.vuln { background:var(--accent-green); border-radius:1px; }
/* ============================================================ Alert List (Panel 1) */
.alert-list {
height:100%; overflow-y:auto; padding:7px;
display:flex; flex-direction:column; gap:5px;
scrollbar-width:thin; scrollbar-color:var(--border) transparent;
}
.alert-card {
background:var(--bg-secondary); border:1px solid var(--border);
border-radius:var(--r-sm); padding:7px 9px; cursor:pointer;
transition:border-color .2s, box-shadow .2s;
animation:slideInRight .3s ease forwards;
}
.alert-card:hover { border-color:var(--accent-blue); }
.alert-card.pivot { border-color:var(--accent-red) !important; animation:pivotPulse 1s ease 4; }
@keyframes pivotPulse { 0%,100%{box-shadow:none} 50%{box-shadow:var(--glow-red)} }
.alert-card-header { display:flex; align-items:center; justify-content:space-between; gap:5px; margin-bottom:3px; }
.severity-badge { padding:1px 5px; border-radius:3px; font-size:8px; font-weight:700; letter-spacing:.07em; flex-shrink:0; }
.severity-low { background:rgba(16,185,129,.2); color:var(--accent-green); }
.severity-medium { background:rgba(245,158,11,.2); color:var(--accent-amber); }
.severity-high { background:rgba(249,115,22,.2); color:var(--accent-orange); }
.severity-critical { background:rgba(239,68,68,.2); color:var(--accent-red); border:1px solid rgba(239,68,68,.4); }
.alert-host { font-family:'JetBrains Mono',monospace; font-size:10px; color:var(--accent-cyan); }
.alert-description { font-size:10px; color:var(--text-secondary); line-height:1.4; margin-bottom:3px; }
.alert-iocs { font-family:'JetBrains Mono',monospace; font-size:9px; color:var(--text-muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.alert-footer { display:flex; align-items:center; gap:5px; margin-top:3px; }
.pivot-badge {
display:inline-flex; align-items:center; gap:2px; padding:1px 5px;
border-radius:3px; font-size:8px; font-weight:700;
background:rgba(239,68,68,.2); color:var(--accent-red); border:1px solid rgba(239,68,68,.5);
animation:blink .7s ease infinite;
}
.correlated-badge {
display:inline-flex; align-items:center; gap:2px; padding:1px 5px;
border-radius:3px; font-size:8px; font-weight:700;
background:rgba(139,92,246,.2); color:var(--accent-purple); border:1px solid rgba(139,92,246,.4);
}
/* ============================================================ Threat Graph (Panel 2) */
.graph-body {
padding:0; background:radial-gradient(ellipse at center, #0d1422 0%, var(--bg-card) 100%);
}
#threat-graph-svg { width:100%; height:100%; }
.graph-tooltip {
position:absolute; background:var(--bg-secondary); border:1px solid var(--border);
border-radius:var(--r-sm); padding:7px 9px; font-size:10px;
pointer-events:none; z-index:10; max-width:190px;
box-shadow:0 4px 16px rgba(0,0,0,.5); transition:opacity .15s;
}
.graph-tooltip.hidden { opacity:0; pointer-events:none; }
.graph-tooltip-title { font-weight:600; font-family:'JetBrains Mono',monospace; margin-bottom:4px; color:var(--accent-cyan); font-size:11px; }
.graph-tooltip-row { display:flex; justify-content:space-between; gap:8px; margin-bottom:1px; }
.graph-tooltip-key { color:var(--text-muted); }
.graph-tooltip-value { color:var(--text-primary); font-family:'JetBrains Mono',monospace; }
/* D3 SVG styles */
.graph-link { fill:none; stroke-width:1.5; }
.graph-link.runs_on { stroke:rgba(59,130,246,.5); }
.graph-link.involves { stroke:rgba(148,163,184,.35); stroke-dasharray:4,4; }
.graph-link.communicates_with { stroke:rgba(245,158,11,.5); stroke-dasharray:6,3; }
.graph-link.exploits { stroke:rgba(239,68,68,.6); }
.graph-link.pivoted_from { stroke:var(--accent-red); stroke-width:3; filter:drop-shadow(0 0 4px rgba(239,68,68,.8)); }
.graph-link.part_of_chain { stroke:rgba(100,116,139,.4); stroke-dasharray:3,5; }
.node-label { font-family:'JetBrains Mono',monospace; font-size:9px; fill:rgba(148,163,184,.7); pointer-events:none; user-select:none; }
/* ============================================================ Action Log (Panel 3) */
.action-log {
height:100%; overflow-y:auto; padding:7px;
display:flex; flex-direction:column; gap:3px;
font-family:'JetBrains Mono',monospace; font-size:10.5px;
scrollbar-width:thin; scrollbar-color:var(--border) transparent;
}
.log-entry {
padding:5px 7px; border-radius:4px;
border-left:2.5px solid var(--border);
background:rgba(255,255,255,.02);
animation:slideInRight .25s ease forwards;
line-height:1.5;
}
.log-entry.investigation { border-left-color:var(--accent-cyan); }
.log-entry.remediation { border-left-color:var(--accent-amber); }
.log-entry.triage { border-left-color:var(--accent-purple); }
.log-entry.report { border-left-color:var(--accent-green); }
.log-step { color:var(--text-muted); font-size:9px; }
.log-action { color:var(--accent-cyan); font-weight:700; }
.log-entry.remediation .log-action { color:var(--accent-amber); }
.log-entry.triage .log-action { color:var(--accent-purple); }
.log-entry.report .log-action { color:var(--accent-green); }
.log-target { color:var(--text-primary); }
.log-result { font-size:9px; color:var(--text-secondary); margin-top:1px; }
.log-details {
font-size:9px; color:var(--text-muted); margin-top:3px; padding:3px 6px;
background:rgba(0,0,0,.2); border-radius:3px; border-left:2px solid var(--border);
line-height:1.6;
}
.log-reward { font-size:10px; font-weight:700; }
.log-reward.positive { color:var(--accent-green); }
.log-reward.negative { color:var(--accent-red); }
/* ============================================================ Network Topology (Panel 4) */
.network-topology {
height:100%; overflow-y:auto; padding:7px;
display:flex; flex-direction:column; gap:5px;
scrollbar-width:thin; scrollbar-color:var(--border) transparent;
}
.subnet-section {
background:var(--bg-secondary); border:1px solid var(--border);
border-radius:var(--r-sm); padding:6px 8px;
transition:border-color .3s; position:relative; overflow:hidden;
}
.subnet-section.has-compromised { border-color:rgba(239,68,68,.4); }
.subnet-section.isolated { border-color:rgba(245,158,11,.6); background:rgba(245,158,11,.04); }
.subnet-header { display:flex; align-items:center; justify-content:space-between; margin-bottom:5px; }
.subnet-name { font-size:10px; font-weight:600; text-transform:uppercase; letter-spacing:.08em; }
.subnet-stats { font-size:9px; font-family:'JetBrains Mono',monospace; color:var(--text-muted); }
.subnet-stats .compromised { color:var(--accent-red); }
.subnet-stats .isolated { color:var(--accent-amber); }
.host-grid { display:flex; flex-wrap:wrap; gap:3px; }
.host-dot {
width:9px; height:9px; border-radius:2px;
cursor:pointer; transition:transform .15s;
}
.host-dot:hover { transform:scale(1.6); z-index:1; }
.host-dot.online { background:rgba(59,130,246,.5); }
.host-dot.compromised { background:var(--accent-red); animation:hostGlow 1.2s ease infinite; }
.host-dot.isolated { background:rgba(100,116,139,.5); border:1px solid var(--accent-amber); }
.host-dot.queried { background:var(--accent-cyan); }
.host-dot.healthy { background:rgba(16,185,129,.5); }
@keyframes hostGlow { 0%,100%{box-shadow:none} 50%{box-shadow:0 0 5px rgba(239,68,68,.9)} }
.isolated-overlay {
position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
background:rgba(245,158,11,.06); border:1.5px solid rgba(245,158,11,.5);
border-radius:var(--r-sm); font-size:9px; font-weight:700;
color:var(--accent-amber); letter-spacing:.08em; pointer-events:none;
}
.topology-stats { display:flex; gap:6px; }
.topo-stat { font-size:9px; font-family:'JetBrains Mono',monospace; font-weight:600; padding:2px 5px; border-radius:3px; }
.topo-stat.compromised { background:rgba(239,68,68,.15); color:var(--accent-red); }
.topo-stat.isolated { background:rgba(245,158,11,.15); color:var(--accent-amber); }
/* ============================================================ Scores Panel (Panel 5) */
.scores-body {
display:flex; flex-direction:row; gap:10px; padding:8px; overflow:hidden; height:100%; align-items:stretch;
}
.radar-container { flex:0 0 52%; position:relative; min-width:0; }
.timeline-container { flex:1; position:relative; min-width:0; border-left:1px solid rgba(42,48,64,0.7); padding-left:10px; }
/* ============================================================ Mission Status (Panel 6) */
.panel-6 .panel-body {
display:flex; flex-direction:column; overflow-y:auto;
scrollbar-width:thin; scrollbar-color:var(--border) transparent;
}
.containment-section,
.impact-section,
.threats-section,
.control-section {
padding:7px 11px; border-bottom:1px solid var(--border); flex-shrink:0;
}
.containment-section:last-child,
.impact-section:last-child,
.threats-section:last-child,
.control-section:last-child { border-bottom:none; }
.section-label {
font-size:9px; font-weight:600; letter-spacing:.08em;
color:var(--text-muted); text-transform:uppercase; margin-bottom:5px;
}
/* Containment bars */
.containment-bars { display:flex; flex-direction:column; gap:4px; }
.containment-bar-item { display:flex; flex-direction:column; gap:2px; }
.containment-bar-label {
display:flex; justify-content:space-between;
font-size:9px; color:var(--text-secondary);
}
.containment-bar-label .complete { color:var(--accent-green); }
.containment-bar-track { height:5px; background:var(--bg-secondary); border-radius:3px; overflow:hidden; border:1px solid var(--border); }
.containment-bar-fill { height:100%; background:var(--accent-cyan); border-radius:3px; transition:width .5s ease; width:0%; }
.containment-bar-fill.complete { background:var(--accent-green); box-shadow:var(--glow-green); }
/* Business Impact Gauge */
.impact-gauge { padding:2px 0; }
.impact-gauge-track {
position:relative; height:11px; border-radius:6px; overflow:hidden;
display:flex; margin-bottom:3px;
}
.impact-zone-green { flex:0 0 40%; background:linear-gradient(90deg,rgba(16,185,129,.4),rgba(16,185,129,.2)); }
.impact-zone-amber { flex:0 0 35%; background:linear-gradient(90deg,rgba(245,158,11,.25),rgba(245,158,11,.5)); }
.impact-zone-red { flex:0 0 25%; background:linear-gradient(90deg,rgba(239,68,68,.35),rgba(239,68,68,.7)); }
.impact-marker {
position:absolute; top:-2px; width:3px; height:15px;
background:white; border-radius:2px; box-shadow:0 0 8px rgba(255,255,255,.8);
transition:left .5s ease; left:0%; transform:translateX(-50%);
}
.impact-labels { display:flex; justify-content:space-between; font-size:8px; color:var(--text-muted); margin-bottom:3px; }
.impact-value-display { display:flex; align-items:center; justify-content:space-between; }
.impact-label { font-size:9px; color:var(--text-muted); }
.impact-value { font-size:18px; font-weight:700; font-family:'JetBrains Mono',monospace; color:var(--accent-green); transition:color .5s; }
.impact-value.high { color:var(--accent-amber); }
.impact-value.critical { color:var(--accent-red); }
/* Active threats */
.active-threats-list { display:flex; flex-wrap:wrap; gap:3px; }
.threat-tag {
padding:2px 5px; border-radius:3px; font-size:9px; font-weight:600;
font-family:'JetBrains Mono',monospace;
background:rgba(239,68,68,.15); color:var(--accent-red); border:1px solid rgba(239,68,68,.3);
}
.threat-tag.contained {
background:rgba(16,185,129,.15); color:var(--accent-green);
border-color:rgba(16,185,129,.3); text-decoration:line-through; opacity:.6;
}
/* Controls */
.control-section { display:flex; flex-wrap:wrap; align-items:center; gap:5px; padding:8px 11px !important; }
.btn {
padding:5px 12px; border-radius:var(--r-sm); font-size:11px; font-weight:600;
cursor:pointer; border:1px solid transparent; transition:all .2s;
display:inline-flex; align-items:center; gap:3px;
}
.btn:disabled { opacity:.5; cursor:not-allowed; }
.btn-primary { background:var(--accent-blue); color:#fff; border-color:var(--accent-blue); }
.btn-primary:hover:not(:disabled) { background:#2563eb; box-shadow:var(--glow-blue); }
.btn-secondary { background:var(--bg-secondary); color:var(--text-primary); border-color:var(--border); }
.btn-secondary:hover { border-color:var(--accent-blue); color:var(--accent-blue); }
.task-selector { display:flex; align-items:center; gap:5px; font-size:11px; color:var(--text-secondary); margin-left:auto; }
.task-select {
background:var(--bg-secondary); color:var(--text-primary);
border:1px solid var(--border); border-radius:4px; padding:3px 6px;
font-size:11px; cursor:pointer; outline:none;
}
.task-select:focus { border-color:var(--accent-blue); }
/* ============================================================ Overlays */
.overlay {
position:fixed; inset:0; z-index:200;
display:flex; align-items:center; justify-content:center;
background:rgba(10,14,23,.92); backdrop-filter:blur(10px);
}
.overlay.hidden { display:none; }
.overlay-content {
text-align:center; display:flex; flex-direction:column; align-items:center; gap:14px;
}
.overlay-icon { font-size:44px; filter:drop-shadow(0 0 20px rgba(59,130,246,.7)); }
.overlay h2 { font-size:22px; font-weight:700; }
#connection-status { font-size:13px; color:var(--text-secondary); }
.connection-spinner {
width:30px; height:30px; border:2.5px solid var(--border);
border-top-color:var(--accent-blue); border-radius:50%; animation:spin 1s linear infinite;
}
@keyframes spin { to { transform:rotate(360deg); } }
/* Final Score Overlay */
.final-score-content {
text-align:center; display:flex; flex-direction:column; align-items:center; gap:14px;
max-width:480px; width:90%; padding:28px;
background:var(--bg-card); border:1px solid var(--accent-green);
border-radius:var(--r); box-shadow:var(--glow-green), 0 24px 60px rgba(0,0,0,.7);
animation:revealPop .5s cubic-bezier(.175,.885,.32,1.275) forwards;
}
@keyframes revealPop { from{opacity:0;transform:scale(.8)} to{opacity:1;transform:scale(1)} }
.mission-complete-banner {
font-size:12px; font-weight:700; letter-spacing:.2em; color:var(--accent-green);
border:1px solid var(--accent-green); padding:3px 14px; border-radius:3px;
animation:bannerGlow 1.5s ease infinite;
}
@keyframes bannerGlow { 0%,100%{box-shadow:none} 50%{box-shadow:var(--glow-green)} }
.final-score-label { font-size:10px; font-weight:600; letter-spacing:.15em; color:var(--text-muted); }
.final-score-number {
font-family:'JetBrains Mono',monospace; font-size:64px; font-weight:700;
color:var(--accent-green); line-height:1;
}
.final-grade-bars { width:100%; display:flex; flex-direction:column; gap:3px; }
.final-grade-bar-item { display:grid; grid-template-columns:140px 1fr 38px; align-items:center; gap:6px; }
.final-grade-bar-label { font-size:9px; color:var(--text-secondary); text-align:right; }
.final-grade-bar-track { height:5px; background:var(--bg-secondary); border-radius:3px; overflow:hidden; }
.final-grade-bar-fill { height:100%; background:var(--accent-cyan); border-radius:3px; transition:width 1s ease; }
.final-grade-bar-value { font-family:'JetBrains Mono',monospace; font-size:9px; color:var(--text-primary); }
.final-penalties-bonuses { width:100%; display:flex; flex-direction:column; gap:2px; max-height:80px; overflow-y:auto; }
.penalty-item { font-size:10px; color:var(--accent-red); font-family:'JetBrains Mono',monospace; }
.bonus-item { font-size:10px; color:var(--accent-green); font-family:'JetBrains Mono',monospace; }
/* ============================================================ Screen Flash */
.screen-flash { position:fixed; inset:0; pointer-events:none; z-index:999; opacity:0; border-radius:0; }
.screen-flash.red-flash { background:rgba(239,68,68,.08); border:5px solid rgba(239,68,68,.6); }
.screen-flash.green-flash { background:rgba(16,185,129,.07); border:5px solid rgba(16,185,129,.5); }
/* ============================================================ Notifications */
#notification-container {
position:fixed; top:calc(var(--header-h) + 10px); right:10px; z-index:150;
display:flex; flex-direction:column; gap:5px; pointer-events:none;
}
.notification-toast {
padding:7px 13px; border-radius:var(--r-sm); font-size:11px; font-weight:600;
color:#fff; animation:toastIn .3s ease forwards; pointer-events:none;
max-width:340px;
}
.notification-toast.red { background:rgba(239,68,68,.9); border:1px solid var(--accent-red); box-shadow:var(--glow-red); }
.notification-toast.green { background:rgba(16,185,129,.9); border:1px solid var(--accent-green); }
.notification-toast.blue { background:rgba(59,130,246,.9); border:1px solid var(--accent-blue); }
.notification-toast.amber { background:rgba(245,158,11,.9); border:1px solid var(--accent-amber); }
@keyframes toastIn { from{opacity:0;transform:translateX(100%)} to{opacity:1;transform:translateX(0)} }
/* ============================================================ Utility */
.hidden { display:none !important; }
.empty-state { color:var(--text-muted); font-size:11px; text-align:center; padding:16px; font-style:italic; }
/* ============================================================ Animations */
@keyframes slideInRight { from{opacity:0;transform:translateX(16px)} to{opacity:1;transform:translateX(0)} }
@keyframes fadeIn { from{opacity:0} to{opacity:1} }
@keyframes scaleBounce { 0%{transform:scale(1)} 50%{transform:scale(1.14)} 100%{transform:scale(1)} }
/* ============================================================ Scrollbars */
::-webkit-scrollbar { width:3px; height:3px; }
::-webkit-scrollbar-track { background:transparent; }
::-webkit-scrollbar-thumb { background:var(--border); border-radius:2px; }
::-webkit-scrollbar-thumb:hover { background:var(--border-hover); }
/* ============================================================ Turn Indicator */
.turn-indicator {
font-size:10px; font-weight:700; letter-spacing:.08em;
padding:3px 10px; border-radius:4px; border:1px solid;
white-space:nowrap;
}
.turn-indicator.blue-turn {
color:var(--accent-blue); border-color:rgba(59,130,246,.5);
background:rgba(59,130,246,.1);
}
.turn-indicator.red-turn {
color:var(--accent-red); border-color:rgba(239,68,68,.5);
background:rgba(239,68,68,.1); animation:blink .7s ease infinite;
}
/* ============================================================ Red Team Toolkit */
.red-team-section {
padding:7px 11px; border-top:1px solid rgba(239,68,68,.2);
background:rgba(239,68,68,.03); flex-shrink:0;
}
.red-team-section.rt-disabled { opacity:.45; pointer-events:none; }
.rt-form { display:flex; flex-direction:column; gap:5px; }
.rt-select { width:100%; }
.rt-fields { display:flex; flex-direction:column; gap:4px; }
.rt-input {
width:100%; padding:4px 7px; border-radius:4px;
background:var(--bg-secondary); color:var(--text-primary);
border:1px solid var(--border); font-size:11px; outline:none;
font-family:'Inter', sans-serif;
}
.rt-input:focus { border-color:var(--accent-red); }
.rt-input::placeholder { color:var(--text-muted); }
.btn-red {
background:rgba(239,68,68,.15); color:var(--accent-red);
border:1px solid rgba(239,68,68,.5); width:100%;
}
.btn-red:hover:not(:disabled) { background:rgba(239,68,68,.28); box-shadow:var(--glow-red); }
.btn-red:disabled { opacity:.4; }