ChokePointAI / src /chokepoint /web /style.css
YuraBodnar's picture
feat(ui): enhance simulation dashboard with executive summary
b370c7d
Raw History Blame Contribute Delete
4.73 kB
/* Tailwind (via CDN, see index.html) handles layout, spacing and color
utilities. Everything here is stuff Tailwind's utility classes can't
express: the Cytoscape canvas, custom tooltips, the active pipeline step,
the range-slider thumb, the loading spinner and scrollbars.
Light theme, tuned for projectors: near-black text on white/light-gray
surfaces, every text pair at WCAG AA (4.5:1) or better. */
:root {
color-scheme: light;
}
html,
body {
height: 100%;
}
/* ── Cytoscape canvas ─────────────────────────────────────────────────── */
#cy {
width: 100%;
min-height: 420px;
background: #ffffff;
}
/* ── Custom tooltip ────────────────────────────────────────────────────
A single fixed-position element positioned and viewport-clamped by
app.js (pseudo-element tooltips overflowed the page on narrow screens).
Dark plate on a light page so it pops on a projector. */
[data-tip] {
cursor: help;
}
#tooltip {
position: fixed;
z-index: 100;
max-width: min(280px, calc(100vw - 16px));
background: #111827;
color: #f9fafb;
border-radius: 6px;
padding: 7px 11px;
font-size: 0.8125rem;
font-weight: 500;
line-height: 1.4;
pointer-events: none;
opacity: 0;
transition: opacity 0.12s ease;
box-shadow: 0 6px 16px rgb(17 24 39 / 0.25);
}
#tooltip.is-visible {
opacity: 1;
}
/* ── Pipeline step connector ───────────────────────────────────────────── */
.pipeline-step {
transition: background-color 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease,
transform 0.2s ease;
}
.pipeline-step.is-active {
border-color: #1d4ed8;
background-color: #eff6ff;
box-shadow: 0 0 0 2px rgb(29 78 216 / 0.25);
transform: translateY(-1px);
}
.pipeline-step.is-active .pipeline-step-num {
background-color: #1d4ed8;
color: #ffffff;
}
.pipeline-arrow {
color: #6b7280;
}
/* ── Loading spinner (sits inside the blue Simulate button) ───────────── */
.spinner {
width: 1rem;
height: 1rem;
border-radius: 50%;
border: 2px solid rgb(255 255 255 / 0.35);
border-top-color: #ffffff;
animation: spin 0.7s linear infinite;
display: inline-block;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
/* ── Local-model consent dialog ───────────────────────────────────────── */
.fallback-dialog {
width: min(30rem, calc(100vw - 2rem));
padding: 0;
border: 1px solid #d1d5db;
border-radius: 0.875rem;
background: #ffffff;
color: #374151;
box-shadow: 0 24px 48px rgb(17 24 39 / 0.3);
}
.fallback-dialog[open] {
animation: fade-in 0.18s ease;
}
.fallback-dialog::backdrop {
background: rgb(17 24 39 / 0.55);
backdrop-filter: blur(2px);
}
/* ── Severity slider ──────────────────────────────────────────────────── */
input[type="range"] {
-webkit-appearance: none;
appearance: none;
width: 100%;
height: 8px;
border-radius: 999px;
background: linear-gradient(to right, #f59e0b, #ea580c, #b91c1c);
outline: none;
}
input[type="range"]:disabled {
opacity: 0.45;
}
input[type="range"]:focus-visible {
outline: 2px solid #1d4ed8;
outline-offset: 4px;
}
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 22px;
height: 22px;
border-radius: 50%;
background: #ffffff;
border: 3px solid #1f2937;
box-shadow: 0 1px 4px rgb(0 0 0 / 0.35);
cursor: pointer;
margin-top: -7px;
}
input[type="range"]::-moz-range-thumb {
width: 22px;
height: 22px;
border-radius: 50%;
background: #ffffff;
border: 3px solid #1f2937;
box-shadow: 0 1px 4px rgb(0 0 0 / 0.35);
cursor: pointer;
}
/* ── Misc ──────────────────────────────────────────────────────────────── */
pre {
white-space: pre-wrap;
word-break: break-word;
}
.scroll-thin::-webkit-scrollbar {
width: 8px;
height: 8px;
}
.scroll-thin::-webkit-scrollbar-thumb {
background: #9ca3af;
border-radius: 999px;
}
@keyframes fade-in {
from {
opacity: 0;
transform: translateY(4px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.fade-in {
animation: fade-in 0.25s ease;
}