StavanKhobare's picture
Update documentation, add blog, and simplify inference script
312c390
/* =====================================================================
NeuralEdge AI Boardroom — Terminal CLI Design System
Phosphor Green on Deep Black | JetBrains Mono
===================================================================== */
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&display=swap');
/* ── Tokens ─────────────────────────────────────────────────────── */
:root {
--bg: #0a0a0a;
--bg-pane: #0d0d0d;
--bg-card: #0f0f0f;
--primary: #33ff00;
--secondary: #ffb000;
--muted: #1f521f;
--error: #ff3333;
--border: #1f521f;
--border-dim:#152b15;
/* NPC role colours — kept as terminal-adjacent */
--cto-color: #33ff00;
--cfo-color: #ffb000;
--inv-color: #00e5ff;
--ind-color: #b0b0b0;
--text-primary: #33ff00;
--text-secondary: #1f9900;
--text-muted: #0d4d0d;
--glow: 0 0 6px rgba(51,255,0,0.45);
--glow-sm: 0 0 3px rgba(51,255,0,0.3);
--amber-glow:0 0 6px rgba(255,176,0,0.5);
--font-mono: 'JetBrains Mono', 'Fira Code', 'Courier New', monospace;
--transition: all 0.12s ease;
}
/* ── Reset ──────────────────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { font-size: 14px; }
body {
font-family: var(--font-mono);
background: var(--bg);
color: var(--text-primary);
min-height: 100vh;
line-height: 1.5;
-webkit-font-smoothing: none; /* keep pixel-sharp */
text-shadow: var(--glow-sm);
overflow-x: hidden;
}
/* ── CRT Scanline Overlay ───────────────────────────────────────── */
body::after {
content: '';
position: fixed;
inset: 0;
background: repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
rgba(0, 0, 0, 0.08) 2px,
rgba(0, 0, 0, 0.08) 4px
);
pointer-events: none;
z-index: 9999;
}
/* ── Scrollbar ──────────────────────────────────────────────────── */
::-webkit-scrollbar { width: 4px; height: 4px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--muted); border-radius: 0; }
/* ── Layout ─────────────────────────────────────────────────────── */
.app-shell {
position: relative;
z-index: 1;
min-height: 100vh;
display: flex;
flex-direction: column;
}
/* ── Metrics Strip ──────────────────────────────────────────────── */
.metrics-strip {
background: var(--bg-pane);
border-bottom: 1px solid var(--border);
display: flex;
overflow-x: auto;
}
.metrics-strip .metric-tile {
flex: 1;
min-width: 90px;
border-right: 1px solid var(--border-dim);
background: transparent;
padding: 0.5rem 0.75rem;
transition: var(--transition);
}
.metrics-strip .metric-tile:last-child { border-right: none; }
.metrics-strip .metric-tile:hover { background: rgba(51,255,0,0.04); }
.metrics-strip .m-value {
font-size: 1.1rem;
font-weight: 700;
}
.metrics-strip .m-label {
font-size: 0.55rem;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.metrics-strip .m-delta {
font-size: 0.62rem;
font-weight: 700;
}
/* ── Main grid ──────────────────────────────────────────────────── */
.main-grid {
display: grid;
grid-template-columns: 260px 1fr 280px;
gap: 1px;
flex: 1;
background: var(--border-dim);
height: calc(100vh - 48px - 38px - 60px);
overflow: hidden;
}
.col-left, .col-center, .col-right {
background: var(--bg);
overflow-y: auto;
padding: 0.75rem;
display: flex;
flex-direction: column;
gap: 0.75rem;
}
/* ── Card / Pane ────────────────────────────────────────────────── */
.card {
background: var(--bg-card);
border: 1px solid var(--border);
padding: 0;
}
/* pane title bar: +--- TITLE ---+ */
.section-label {
font-size: 0.6rem;
font-weight: 700;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--text-primary);
text-shadow: var(--glow);
background: var(--bg-pane);
border-bottom: 1px solid var(--border);
padding: 0.3rem 0.6rem;
display: flex;
align-items: center;
gap: 0.35rem;
}
.section-label::before { content: '+--'; color: var(--muted); margin-right: 0.15rem; }
.section-label::after { content: '--+'; color: var(--muted); margin-left: 0.15rem; }
.card-body { padding: 0.625rem; }
/* ── TopBar ─────────────────────────────────────────────────────── */
.topbar {
height: 48px;
background: var(--bg-pane);
border-bottom: 1px solid var(--border);
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 1rem;
position: sticky;
top: 0;
z-index: 50;
}
.topbar-brand {
display: flex;
align-items: center;
gap: 0.6rem;
}
.brand-logo {
font-size: 0.8rem;
color: var(--primary);
text-shadow: var(--glow);
letter-spacing: 0;
white-space: pre;
line-height: 1;
}
.brand-name {
font-size: 0.85rem;
font-weight: 700;
color: var(--primary);
text-shadow: var(--glow);
text-transform: uppercase;
letter-spacing: 0.06em;
}
.brand-ceo {
font-size: 0.58rem;
color: var(--text-secondary);
text-shadow: none;
margin-top: 0.05rem;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.topbar-center {
display: flex;
align-items: center;
gap: 1.25rem;
}
.round-badge {
font-size: 0.7rem;
font-weight: 700;
color: var(--secondary);
text-shadow: var(--amber-glow);
border: 1px solid var(--secondary);
padding: 0.2rem 0.55rem;
letter-spacing: 0.06em;
text-transform: uppercase;
}
.score-display { text-align: center; }
.score-label {
font-size: 0.5rem;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--text-secondary);
}
.score-value {
font-size: 1rem;
font-weight: 700;
color: var(--text-primary);
text-shadow: var(--glow);
}
.score-value.good { color: var(--primary); text-shadow: var(--glow); }
.score-value.warn { color: var(--secondary); text-shadow: var(--amber-glow); }
.score-value.bad { color: var(--error); text-shadow: 0 0 6px rgba(255,51,51,0.5); }
.topbar-right {
display: flex;
align-items: center;
gap: 0.75rem;
}
.health-indicator {
display: flex;
align-items: center;
gap: 0.35rem;
font-size: 0.58rem;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.06em;
}
.health-dot {
width: 7px;
height: 7px;
background: var(--text-muted);
}
.health-dot.online { background: var(--primary); box-shadow: var(--glow); animation: blink-dot 1.8s step-end infinite; }
.health-dot.offline { background: var(--error); }
@keyframes blink-dot {
0%, 100% { opacity: 1; }
50% { opacity: 0.3; }
}
/* ── Playback Controls ──────────────────────────────────────────── */
.playback-bar {
background: var(--bg-pane);
border-bottom: 1px solid var(--border);
padding: 0.45rem 1rem;
display: flex;
align-items: center;
gap: 0.75rem;
font-size: 0.7rem;
}
.pb-btn {
height: 28px;
padding: 0 0.75rem;
border: 1px solid var(--border);
background: transparent;
color: var(--text-primary);
font-family: var(--font-mono);
font-size: 0.68rem;
font-weight: 700;
cursor: pointer;
transition: var(--transition);
display: flex;
align-items: center;
gap: 0.3rem;
text-transform: uppercase;
letter-spacing: 0.05em;
text-shadow: var(--glow-sm);
}
/* bracket-wrap effect using pseudo-elements */
.pb-btn::before { content: '['; color: var(--muted); margin-right: 0.1rem; }
.pb-btn::after { content: ']'; color: var(--muted); margin-left: 0.1rem; }
.pb-btn:hover:not(:disabled) {
background: var(--primary);
color: #000;
text-shadow: none;
border-color: var(--primary);
box-shadow: var(--glow);
}
.pb-btn:disabled { opacity: 0.25; cursor: not-allowed; }
.pb-btn.primary {
color: var(--secondary);
border-color: var(--secondary);
text-shadow: var(--amber-glow);
}
.pb-btn.primary::before { content: '['; color: var(--secondary); opacity: 0.5; }
.pb-btn.primary::after { content: ']'; color: var(--secondary); opacity: 0.5; }
.pb-btn.primary:hover:not(:disabled) {
background: var(--secondary);
color: #000;
text-shadow: none;
border-color: var(--secondary);
box-shadow: var(--amber-glow);
}
.pb-divider {
width: 1px;
height: 18px;
background: var(--border-dim);
}
.speed-control {
display: flex;
align-items: center;
gap: 0.4rem;
font-size: 0.62rem;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.speed-control input[type=range] {
width: 72px;
accent-color: var(--primary);
cursor: pointer;
}
.speed-label {
font-size: 0.62rem;
color: var(--primary);
min-width: 32px;
text-shadow: var(--glow-sm);
}
.pb-status {
margin-left: auto;
font-size: 0.62rem;
color: var(--text-secondary);
display: flex;
align-items: center;
gap: 0.35rem;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.status-dot {
width: 6px;
height: 6px;
background: var(--text-muted);
}
.status-dot.running { background: var(--primary); box-shadow: var(--glow); animation: blink-dot 1s step-end infinite; }
.status-dot.paused { background: var(--secondary); box-shadow: var(--amber-glow); }
/* ── Keyframes ──────────────────────────────────────────────────── */
@keyframes pulse {
0%, 100% { opacity: 1 }
50% { opacity: 0.4 }
}
@keyframes cursor-blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
/* ── Metrics Panel ──────────────────────────────────────────────── */
.metrics-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0.4rem;
}
.metric-tile {
background: var(--bg-pane);
border: 1px solid var(--border-dim);
padding: 0.5rem 0.65rem;
transition: var(--transition);
}
.metric-tile.wide { grid-column: 1 / -1; }
.metric-tile:hover { border-color: var(--border); background: rgba(51,255,0,0.03); }
.m-icon-label {
display: flex;
align-items: center;
gap: 0.25rem;
margin-bottom: 0.15rem;
}
.m-icon { font-size: 0.75rem; filter: grayscale(1) brightness(2); }
.m-label {
font-size: 0.52rem;
font-weight: 700;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--text-secondary);
}
.m-value-row {
display: flex;
align-items: baseline;
gap: 0.3rem;
}
.m-value {
font-size: 0.88rem;
font-weight: 700;
color: var(--text-primary);
text-shadow: var(--glow-sm);
}
.m-value.good { color: var(--primary); text-shadow: var(--glow); }
.m-value.warn { color: var(--secondary); text-shadow: var(--amber-glow); }
.m-value.bad { color: var(--error); text-shadow: 0 0 5px rgba(255,51,51,0.4); }
.m-delta { font-size: 0.55rem; font-weight: 700; }
.m-delta.pos { color: var(--primary); }
.m-delta.neg { color: var(--error); }
/* ── Trust Panel ────────────────────────────────────────────────── */
.trust-list {
display: flex;
flex-direction: column;
gap: 0.55rem;
padding: 0.6rem;
}
.trust-row {
display: flex;
align-items: center;
gap: 0.4rem;
}
.trust-role {
font-size: 0.6rem;
font-weight: 700;
width: 74px;
flex-shrink: 0;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.04em;
}
.trust-track {
flex: 1;
height: 6px;
background: var(--border-dim);
overflow: hidden;
font-family: var(--font-mono);
position: relative;
}
/* ASCII bar blocks inside the track */
.trust-fill {
height: 100%;
transition: width 0.7s cubic-bezier(0.4, 0, 0.2, 1);
}
.trust-fill.cto { background: var(--cto-color); box-shadow: 0 0 4px rgba(51,255,0,0.5); }
.trust-fill.cfo { background: var(--cfo-color); box-shadow: 0 0 4px rgba(255,176,0,0.5); }
.trust-fill.inv { background: var(--inv-color); box-shadow: 0 0 4px rgba(0,229,255,0.5); }
.trust-fill.ind { background: var(--ind-color); }
.trust-pct {
font-size: 0.58rem;
color: var(--text-secondary);
width: 28px;
text-align: right;
}
.trust-delta { font-size: 0.55rem; width: 18px; text-align: right; }
.trust-delta.pos { color: var(--primary); }
.trust-delta.neg { color: var(--error); }
/* ── Event Banner ───────────────────────────────────────────────── */
.event-banner {
border: 1px solid var(--secondary);
background: var(--bg-card);
padding: 0.75rem 0.875rem;
position: relative;
overflow: hidden;
}
.event-banner::before {
content: '';
position: absolute;
top: 0; right: 0;
width: 100px; height: 100%;
background: linear-gradient(to left, rgba(255,176,0,0.04), transparent);
pointer-events: none;
}
.event-tag {
font-size: 0.55rem;
font-weight: 700;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--secondary);
text-shadow: var(--amber-glow);
margin-bottom: 0.4rem;
display: flex;
align-items: center;
gap: 0.3rem;
}
.event-tag::before { content: '//'; color: var(--muted); margin-right: 0.2rem; }
.event-title {
font-size: 0.88rem;
font-weight: 700;
color: var(--primary);
text-shadow: var(--glow);
margin-bottom: 0.4rem;
line-height: 1.3;
text-transform: uppercase;
letter-spacing: 0.02em;
}
.event-desc {
font-size: 0.72rem;
color: var(--text-secondary);
line-height: 1.55;
}
/* ── NPC Grid ───────────────────────────────────────────────────── */
.npc-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0.5rem;
padding: 0.6rem;
}
.npc-card {
background: var(--bg-pane);
padding: 0.6rem;
border: 1px solid var(--border-dim);
display: flex;
flex-direction: column;
gap: 0.45rem;
transition: var(--transition);
border-top: 2px solid;
}
.npc-card:hover { border-color: var(--border); }
.npc-card.cto { border-top-color: var(--cto-color); }
.npc-card.cfo { border-top-color: var(--cfo-color); }
.npc-card.inv { border-top-color: var(--inv-color); }
.npc-card.ind { border-top-color: var(--ind-color); }
.npc-header {
display: flex;
align-items: center;
justify-content: space-between;
}
.npc-avatar-role {
display: flex;
align-items: center;
gap: 0.35rem;
}
.npc-avatar {
width: 22px;
height: 22px;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.6rem;
font-weight: 700;
flex-shrink: 0;
border: 1px solid;
}
.npc-avatar.cto { border-color: var(--cto-color); color: var(--cto-color); }
.npc-avatar.cfo { border-color: var(--cfo-color); color: var(--cfo-color); }
.npc-avatar.inv { border-color: var(--inv-color); color: var(--inv-color); }
.npc-avatar.ind { border-color: var(--ind-color); color: var(--ind-color); }
.npc-role {
font-size: 0.6rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.npc-role.cto { color: var(--cto-color); text-shadow: var(--glow-sm); }
.npc-role.cfo { color: var(--cfo-color); text-shadow: 0 0 4px rgba(255,176,0,0.4); }
.npc-role.inv { color: var(--inv-color); text-shadow: 0 0 4px rgba(0,229,255,0.4); }
.npc-role.ind { color: var(--ind-color); }
.npc-vote-chip {
font-size: 0.52rem;
font-weight: 700;
background: transparent;
border: 1px solid var(--border-dim);
padding: 0.1rem 0.35rem;
color: var(--text-secondary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 90px;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.npc-statement {
font-size: 0.68rem;
color: var(--text-secondary);
line-height: 1.5;
font-style: normal;
border-left: 2px solid var(--border-dim);
padding-left: 0.45rem;
}
/* prompt-style quote */
.npc-statement::before { content: '> '; color: var(--muted); }
.npc-conf-row {
display: flex;
align-items: center;
gap: 0.35rem;
}
.conf-label {
font-size: 0.52rem;
color: var(--text-muted);
width: 38px;
flex-shrink: 0;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.conf-track {
flex: 1;
height: 4px;
background: var(--border-dim);
overflow: hidden;
}
.conf-fill { height: 100%; transition: width 0.5s ease; }
.npc-card.cto .conf-fill { background: var(--cto-color); }
.npc-card.cfo .conf-fill { background: var(--cfo-color); }
.npc-card.inv .conf-fill { background: var(--inv-color); }
.npc-card.ind .conf-fill { background: var(--ind-color); }
.conf-pct {
font-size: 0.55rem;
color: var(--text-secondary);
width: 24px;
text-align: right;
}
/* Agenda keyword tags */
.npc-agenda-tags {
display: flex;
flex-wrap: wrap;
gap: 0.2rem;
}
.agenda-tag {
font-size: 0.5rem;
font-weight: 700;
letter-spacing: 0.04em;
padding: 0.08rem 0.3rem;
background: transparent;
border: 1px solid var(--border-dim);
color: var(--text-muted);
text-transform: lowercase;
transition: var(--transition);
}
.agenda-tag:hover { border-color: var(--border); color: var(--text-secondary); }
/* ── Agent Decision Panel ───────────────────────────────────────── */
.agent-decision-panel {
display: flex;
flex-direction: column;
gap: 0.6rem;
padding: 0.6rem;
}
.decision-options-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.4rem;
}
.decision-option {
border: 1px solid var(--border-dim);
padding: 0.6rem 0.4rem;
text-align: center;
transition: var(--transition);
position: relative;
background: var(--bg-pane);
cursor: default;
}
.decision-option:hover { border-color: var(--border); }
.decision-option .opt-icon {
font-size: 1rem;
margin-bottom: 0.25rem;
filter: grayscale(1) brightness(1.5);
}
.decision-option .opt-label {
font-size: 0.58rem;
font-weight: 700;
text-transform: uppercase;
color: var(--text-secondary);
word-break: break-word;
line-height: 1.3;
letter-spacing: 0.03em;
}
.decision-option.ai-pick {
border-color: var(--secondary);
background: rgba(255,176,0,0.06);
}
.decision-option.ai-pick .opt-label {
color: var(--secondary);
text-shadow: var(--amber-glow);
}
.decision-option.ai-pick::before {
content: 'AI>';
position: absolute;
top: 3px; right: 4px;
font-size: 0.48rem;
font-weight: 700;
color: var(--secondary);
letter-spacing: 0.04em;
}
.decision-option.board-winner.board-match {
border-color: var(--primary);
background: rgba(51,255,0,0.06);
}
.decision-option.board-winner.board-mismatch {
border-color: var(--error);
background: rgba(255,51,51,0.06);
}
.decision-option.board-winner .opt-label { color: var(--text-primary); font-weight: 700; }
.coalition-pitch-block {
background: var(--bg-pane);
border: 1px solid var(--border-dim);
padding: 0.5rem 0.65rem;
}
.pitch-header {
font-size: 0.55rem;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--text-secondary);
margin-bottom: 0.3rem;
}
.pitch-text {
font-size: 0.68rem;
color: var(--text-secondary);
line-height: 1.5;
white-space: pre-wrap;
word-break: break-word;
}
.pitch-text::before { content: '$ '; color: var(--muted); }
.pitch-text.empty { font-style: italic; color: var(--text-muted); }
.pitch-text.empty::before { content: ''; }
/* AI thinking state */
.ai-thinking {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.7rem;
color: var(--secondary);
text-shadow: var(--amber-glow);
padding: 0.6rem;
}
.ai-thinking::before { content: '>_'; color: var(--secondary); animation: cursor-blink 0.8s step-end infinite; }
.thinking-dots span {
display: inline-block;
width: 6px;
height: 6px;
background: var(--secondary);
animation: blink 1.2s ease infinite;
margin: 0 1px;
}
.thinking-dots span:nth-child(2) { animation-delay: 0.2s; }
.thinking-dots span:nth-child(3) { animation-delay: 0.4s; }
@keyframes blink {
0%, 80%, 100% { opacity: 0.2 }
40% { opacity: 1 }
}
/* ── Vote Tally ─────────────────────────────────────────────────── */
.vote-tally {
display: flex;
flex-direction: column;
gap: 0.4rem;
padding: 0.6rem;
}
.tally-row {
display: flex;
align-items: center;
gap: 0.4rem;
}
.tally-label {
font-size: 0.6rem;
font-weight: 700;
color: var(--text-secondary);
width: 100px;
flex-shrink: 0;
text-transform: uppercase;
letter-spacing: 0.03em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.tally-track {
flex: 1;
height: 8px;
background: var(--border-dim);
overflow: hidden;
position: relative;
}
.tally-fill {
height: 100%;
background: var(--text-secondary);
transition: width 0.5s ease;
}
.tally-fill.winner {
background: var(--primary);
box-shadow: var(--glow);
}
.tally-value {
font-size: 0.58rem;
color: var(--text-secondary);
width: 28px;
text-align: right;
}
.tally-winner-row {
font-size: 0.58rem;
color: var(--text-muted);
margin-top: 0.35rem;
padding: 0.6rem;
padding-top: 0;
font-family: var(--font-mono);
text-transform: uppercase;
letter-spacing: 0.06em;
}
/* ── History Timeline ───────────────────────────────────────────── */
.history-list {
display: flex;
flex-direction: column;
gap: 0.3rem;
padding: 0.6rem;
}
.history-item {
display: grid;
grid-template-columns: 22px 1fr auto;
align-items: center;
gap: 0.4rem;
padding: 0.4rem 0.5rem;
background: var(--bg-pane);
border: 1px solid var(--border-dim);
animation: slideIn 0.2s ease;
transition: var(--transition);
}
.history-item:hover { border-color: var(--border); }
.h-round {
font-size: 0.58rem;
font-weight: 700;
color: var(--secondary);
text-shadow: var(--amber-glow);
}
.h-info { min-width: 0; }
.h-event {
font-size: 0.6rem;
color: var(--text-secondary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
text-transform: uppercase;
letter-spacing: 0.03em;
}
.h-picks {
font-size: 0.58rem;
color: var(--text-muted);
display: flex;
align-items: center;
gap: 0.2rem;
margin-top: 0.1rem;
}
.h-ai-pick { color: var(--secondary); }
.h-win-pick { color: var(--text-secondary); }
.h-mismatch { color: var(--error); font-size: 0.58rem; }
.h-reward {
font-size: 0.62rem;
font-weight: 700;
text-align: right;
min-width: 36px;
}
.h-reward.pos { color: var(--primary); text-shadow: var(--glow-sm); }
.h-reward.neg { color: var(--error); }
.history-empty {
font-size: 0.68rem;
color: var(--text-muted);
text-align: center;
padding: 1rem;
}
.history-empty::before { content: '// '; }
@keyframes slideIn {
from { opacity: 0; transform: translateX(-6px); }
to { opacity: 1; transform: none; }
}
/* ── End Screen ─────────────────────────────────────────────────── */
.end-overlay {
position: fixed;
inset: 0;
z-index: 200;
background: rgba(0,0,0,0.92);
display: flex;
align-items: center;
justify-content: center;
animation: fadeIn 0.3s ease;
}
.end-modal {
background: var(--bg-pane);
border: 1px solid var(--primary);
box-shadow: 0 0 40px rgba(51,255,0,0.15), var(--glow);
padding: 1.75rem;
max-width: 520px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
animation: slideUp 0.3s cubic-bezier(0.4,0,0.2,1);
}
.end-icon {
font-size: 0.75rem;
text-align: center;
margin-bottom: 0.5rem;
color: var(--primary);
text-shadow: var(--glow);
letter-spacing: 0.1em;
}
.end-title {
font-size: 1.25rem;
font-weight: 700;
text-align: center;
letter-spacing: 0.06em;
text-transform: uppercase;
margin-bottom: 0.4rem;
color: var(--primary);
text-shadow: var(--glow);
}
.end-reason {
display: block;
text-align: center;
font-size: 0.65rem;
font-weight: 700;
letter-spacing: 0.14em;
text-transform: uppercase;
padding: 0.25rem 1rem;
margin: 0 auto 1.25rem;
width: fit-content;
border: 1px solid;
}
.end-reason.ipo { color: var(--primary); border-color: var(--primary); }
.end-reason.acquisition { color: var(--secondary); border-color: var(--secondary); }
.end-reason.bankruptcy { color: var(--error); border-color: var(--error); }
.end-reason.default { color: var(--text-secondary); border-color: var(--border); }
.end-stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.5rem;
margin-bottom: 1rem;
}
.end-stat {
background: var(--bg-card);
border: 1px solid var(--border-dim);
padding: 0.65rem;
text-align: center;
}
.es-label {
font-size: 0.52rem;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--text-muted);
}
.es-value {
font-size: 0.9rem;
font-weight: 700;
margin-top: 0.15rem;
color: var(--text-primary);
text-shadow: var(--glow-sm);
}
.replay-btn {
display: block;
width: 100%;
padding: 0.6rem;
background: transparent;
border: 1px solid var(--primary);
color: var(--primary);
font-family: var(--font-mono);
font-size: 0.78rem;
font-weight: 700;
cursor: pointer;
transition: var(--transition);
letter-spacing: 0.08em;
text-transform: uppercase;
text-shadow: var(--glow-sm);
}
.replay-btn::before { content: '[ '; }
.replay-btn::after { content: ' ]'; }
.replay-btn:hover {
background: var(--primary);
color: #000;
text-shadow: none;
box-shadow: var(--glow);
}
/* ── Toast ──────────────────────────────────────────────────────── */
.toast {
position: fixed;
bottom: 1rem;
right: 1rem;
background: #0a0000;
border: 1px solid var(--error);
padding: 0.5rem 0.875rem;
color: var(--error);
font-size: 0.7rem;
font-weight: 700;
z-index: 300;
max-width: 300px;
animation: slideUp 0.2s ease;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.toast::before { content: '[ERR] '; }
/* ── Spinner (replaced with blinking cursor) ────────────────────── */
.spinner {
display: inline-block;
width: 10px;
height: 14px;
background: var(--secondary);
animation: cursor-blink 0.7s step-end infinite;
vertical-align: middle;
}
/* ── Misc animations ────────────────────────────────────────────── */
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: none; }
}
/* ── Glitch effect on hover for round badge ─────────────────────── */
.round-badge:hover {
animation: glitch 0.3s ease;
}
@keyframes glitch {
0% { transform: none; }
20% { transform: translateX(-2px); text-shadow: 2px 0 var(--primary), -2px 0 var(--secondary); }
40% { transform: translateX(2px); text-shadow: -2px 0 var(--primary), 2px 0 var(--secondary); }
60% { transform: translateX(-1px); }
80% { transform: translateX(1px); }
100%{ transform: none; }
}
/* ── Responsive ─────────────────────────────────────────────────── */
@media (max-width: 1100px) {
.main-grid { grid-template-columns: 240px 1fr 260px; }
}
@media (max-width: 860px) {
.main-grid {
grid-template-columns: 1fr;
grid-template-rows: auto;
height: auto;
}
.npc-grid { grid-template-columns: 1fr; }
.decision-options-grid { grid-template-columns: 1fr; }
}
/* ── Reward Trace panel ─────────────────────────────────────────── */
.reward-bars {
display: grid;
grid-template-columns: repeat(10, 1fr);
gap: 4px;
height: 72px;
padding: 0.15rem 0.1rem 1.05rem;
border: 1px solid var(--border-dim);
background: linear-gradient(180deg, rgba(51,255,0,0.04), rgba(0,0,0,0.0));
position: relative;
}
.reward-bar-slot {
position: relative;
height: 100%;
border-left: 1px dashed var(--border-dim);
}
.reward-bar-slot:first-child { border-left: none; }
.reward-bar-slot.empty { opacity: 0.35; }
.reward-bar-up,
.reward-bar-down {
position: absolute;
left: 12%;
right: 12%;
transition: height 0.25s ease;
}
.reward-bar-up { background: var(--primary); box-shadow: var(--glow-sm); }
.reward-bar-down { background: var(--error); box-shadow: 0 0 4px rgba(255,51,51,0.45); }
.reward-bar-zero {
position: absolute;
left: 0; right: 0;
height: 1px;
background: var(--muted);
pointer-events: none;
}
.reward-bar-label {
position: absolute;
bottom: -1.1rem;
left: 0; right: 0;
text-align: center;
font-size: 0.55rem;
color: var(--text-muted);
letter-spacing: 0;
}