Files
brainwave/docs/design_handoff_brainwave/styles.css
T
LaurensBartelds be69db04a5 Add SVG icons and TypeScript configuration files
- Introduced a new favicon.svg file for the application.
- Added icons.svg containing various SVG symbols for UI components.
- Created tsconfig.app.json for frontend TypeScript configuration with ES2023 target and bundler mode.
- Established tsconfig.json to reference app and node configurations.
- Implemented tsconfig.node.json for Node.js specific TypeScript settings.
2026-04-21 22:19:06 +02:00

1026 lines
24 KiB
CSS

/* ============================================================
Practice Exam — modern minimal design system
============================================================ */
:root {
/* Type */
--font-sans: 'Inter', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
--font-serif: 'Fraunces', 'Iowan Old Style', Georgia, serif;
--font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, monospace;
/* Neutrals — warm-cool paper whites + charcoals */
--paper: oklch(0.985 0.004 80);
--paper-2: oklch(0.965 0.005 80);
--paper-3: oklch(0.945 0.006 80);
--ink: oklch(0.22 0.012 260);
--ink-2: oklch(0.36 0.012 260);
--ink-3: oklch(0.52 0.012 260);
--ink-4: oklch(0.68 0.008 260);
--line: oklch(0.9 0.006 80);
--line-2: oklch(0.86 0.008 80);
--line-3: oklch(0.78 0.01 80);
/* Accent — single restrained indigo */
--accent: oklch(0.55 0.15 265);
--accent-weak: oklch(0.94 0.03 265);
--accent-ink: oklch(0.38 0.14 265);
/* Semantic */
--correct: oklch(0.58 0.13 150);
--correct-weak: oklch(0.95 0.03 150);
--wrong: oklch(0.58 0.18 25);
--wrong-weak: oklch(0.96 0.03 25);
--warn: oklch(0.72 0.15 75);
/* Rhythm */
--r-xs: 4px;
--r-sm: 6px;
--r-md: 10px;
--r-lg: 14px;
--shadow-sm: 0 1px 0 oklch(0.9 0.005 80 / 0.6);
--shadow-md: 0 1px 2px oklch(0 0 0 / 0.04), 0 4px 16px oklch(0 0 0 / 0.04);
}
[data-theme="dark"] {
--paper: oklch(0.18 0.012 260);
--paper-2: oklch(0.22 0.013 260);
--paper-3: oklch(0.26 0.013 260);
--ink: oklch(0.96 0.005 80);
--ink-2: oklch(0.82 0.008 80);
--ink-3: oklch(0.68 0.008 80);
--ink-4: oklch(0.52 0.008 80);
--line: oklch(0.3 0.012 260);
--line-2: oklch(0.36 0.012 260);
--line-3: oklch(0.44 0.012 260);
--accent: oklch(0.72 0.13 265);
--accent-weak: oklch(0.28 0.06 265);
--accent-ink: oklch(0.85 0.12 265);
--correct-weak: oklch(0.28 0.06 150);
--wrong-weak: oklch(0.28 0.06 25);
}
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
body {
font-family: var(--font-sans);
font-feature-settings: 'ss01', 'cv11';
background: var(--paper);
color: var(--ink);
-webkit-font-smoothing: antialiased;
font-size: 15px;
line-height: 1.55;
letter-spacing: -0.005em;
}
button { font-family: inherit; }
input, textarea, select { font-family: inherit; font-size: inherit; color: inherit; }
/* Utility */
.mono { font-family: var(--font-mono); font-feature-settings: 'zero'; letter-spacing: 0; }
.serif { font-family: var(--font-serif); }
.hairline { border: 1px solid var(--line); }
.muted { color: var(--ink-3); }
.faint { color: var(--ink-4); }
/* ---------- Button ---------- */
.btn {
display: inline-flex; align-items: center; gap: 8px;
padding: 9px 14px;
border-radius: var(--r-md);
border: 1px solid var(--line-2);
background: var(--paper);
color: var(--ink);
font-size: 13.5px;
font-weight: 500;
letter-spacing: -0.005em;
cursor: pointer;
transition: background 120ms ease, border-color 120ms ease, color 120ms ease;
}
.btn:hover { background: var(--paper-2); border-color: var(--line-3); }
.btn:active { background: var(--paper-3); }
.btn[disabled] { opacity: 0.4; cursor: not-allowed; }
.btn-primary {
background: var(--ink);
color: var(--paper);
border-color: var(--ink);
}
.btn-primary:hover { background: var(--ink-2); border-color: var(--ink-2); }
.btn-ghost {
border-color: transparent;
background: transparent;
}
.btn-ghost:hover { background: var(--paper-2); }
.btn-sm { padding: 6px 10px; font-size: 12.5px; }
/* ---------- Inputs ---------- */
.input, .textarea {
width: 100%;
padding: 10px 12px;
border: 1px solid var(--line-2);
border-radius: var(--r-md);
background: var(--paper);
color: var(--ink);
outline: none;
transition: border-color 120ms ease, box-shadow 120ms ease;
}
.input:focus, .textarea:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-weak);
}
.textarea { resize: vertical; min-height: 120px; line-height: 1.6; }
/* ---------- Layout ---------- */
.shell {
display: grid;
grid-template-rows: auto 1fr;
min-height: 100vh;
}
.topbar {
display: flex;
align-items: center;
gap: 16px;
padding: 14px 28px;
border-bottom: 1px solid var(--line);
background: var(--paper);
position: sticky; top: 0; z-index: 10;
}
.brand {
display: flex; align-items: center; gap: 10px;
font-weight: 600;
letter-spacing: -0.02em;
font-size: 15px;
}
.brand-mark {
width: 22px; height: 22px;
border: 1.5px solid var(--ink);
border-radius: 5px;
position: relative;
display: inline-block;
}
.brand-mark::after {
content: '';
position: absolute;
inset: 4px 8px 4px 4px;
background: var(--ink);
border-radius: 1px;
}
.topbar-meta {
display: flex; align-items: center; gap: 16px;
margin-left: auto;
color: var(--ink-3);
font-size: 13px;
}
/* ---------- Landing ---------- */
.landing {
max-width: 1080px;
margin: 0 auto;
padding: 72px 32px 120px;
}
.landing-eyebrow {
font-family: var(--font-mono);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--ink-3);
margin-bottom: 24px;
}
.landing-title {
font-family: var(--font-serif);
font-weight: 400;
font-size: clamp(40px, 6vw, 68px);
line-height: 1.02;
letter-spacing: -0.028em;
color: var(--ink);
margin: 0 0 20px;
text-wrap: pretty;
max-width: 18ch;
}
.landing-title em {
font-style: italic;
color: var(--accent);
font-variation-settings: 'SOFT' 100;
}
.landing-sub {
font-size: 17px;
color: var(--ink-2);
max-width: 58ch;
margin: 0 0 48px;
line-height: 1.55;
}
.landing-grid {
display: grid;
grid-template-columns: 1.2fr 1fr;
gap: 48px;
align-items: start;
}
.dropzone {
border: 1.5px dashed var(--line-3);
border-radius: var(--r-lg);
padding: 40px 32px;
text-align: center;
background: var(--paper-2);
transition: all 150ms ease;
cursor: pointer;
}
.dropzone:hover, .dropzone.drag-over {
border-color: var(--accent);
background: var(--accent-weak);
}
.dropzone-icon {
width: 40px; height: 40px;
margin: 0 auto 16px;
border: 1.5px solid var(--ink-3);
border-radius: 8px;
position: relative;
}
.dropzone-icon::before, .dropzone-icon::after {
content: '';
position: absolute;
background: var(--ink-3);
}
.dropzone-icon::before {
width: 2px; height: 14px;
top: 10px; left: 50%;
transform: translateX(-50%);
}
.dropzone-icon::after {
width: 10px; height: 2px;
top: 16px; left: 50%;
transform: translateX(-50%) rotate(45deg);
transform-origin: left center;
box-shadow: -12px 0 0 var(--ink-3);
}
.dropzone h3 {
margin: 0 0 6px;
font-weight: 500;
font-size: 16px;
}
.dropzone p {
margin: 0;
color: var(--ink-3);
font-size: 13.5px;
}
.samples h4 {
font-size: 11px;
font-family: var(--font-mono);
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--ink-3);
margin: 0 0 14px;
font-weight: 500;
}
.sample {
display: flex;
align-items: flex-start;
gap: 16px;
padding: 16px;
border-radius: var(--r-md);
border: 1px solid var(--line);
margin-bottom: 8px;
cursor: pointer;
background: var(--paper);
transition: all 120ms ease;
}
.sample:hover {
border-color: var(--line-3);
background: var(--paper-2);
}
.sample-mark {
width: 36px; height: 36px;
border-radius: 8px;
background: var(--paper-3);
display: grid; place-items: center;
font-family: var(--font-mono);
font-size: 14px;
color: var(--ink-2);
flex-shrink: 0;
}
.sample-body { flex: 1; min-width: 0; }
.sample-title { font-weight: 500; font-size: 14.5px; margin-bottom: 2px; }
.sample-meta { font-size: 12.5px; color: var(--ink-3); }
.sample-arrow { color: var(--ink-4); align-self: center; }
.history {
margin-top: 56px;
padding-top: 40px;
border-top: 1px solid var(--line);
}
.history-row {
display: grid;
grid-template-columns: 1fr auto auto auto;
gap: 24px;
padding: 14px 0;
border-bottom: 1px solid var(--line);
align-items: center;
font-size: 13.5px;
}
.history-row:last-child { border-bottom: none; }
.history-title { font-weight: 500; }
.score-pill {
font-family: var(--font-mono);
padding: 3px 10px;
border-radius: 999px;
background: var(--paper-3);
font-size: 12px;
color: var(--ink-2);
}
.score-pill.pass { background: var(--correct-weak); color: var(--correct); }
.score-pill.fail { background: var(--wrong-weak); color: var(--wrong); }
/* ---------- Exam Layout ---------- */
.exam-shell {
display: grid;
grid-template-columns: 280px 1fr 280px;
min-height: calc(100vh - 57px);
}
.sidebar {
border-right: 1px solid var(--line);
padding: 24px 20px;
background: var(--paper);
overflow-y: auto;
position: sticky; top: 57px;
max-height: calc(100vh - 57px);
}
.sidebar-title {
font-family: var(--font-serif);
font-size: 22px;
letter-spacing: -0.015em;
margin: 0 0 4px;
line-height: 1.15;
}
.sidebar-sub {
font-size: 12.5px;
color: var(--ink-3);
margin: 0 0 24px;
}
.sidebar-section-label {
font-family: var(--font-mono);
font-size: 10.5px;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--ink-4);
margin: 24px 0 10px;
font-weight: 500;
}
.nav-list {
display: flex;
flex-direction: column;
gap: 2px;
}
.nav-item {
display: grid;
grid-template-columns: 28px 1fr auto;
align-items: center;
gap: 10px;
padding: 7px 10px;
border-radius: var(--r-sm);
cursor: pointer;
border: none;
background: transparent;
color: var(--ink-2);
text-align: left;
font-size: 13px;
transition: background 100ms ease;
width: 100%;
}
.nav-item:hover { background: var(--paper-2); }
.nav-item.active {
background: var(--paper-3);
color: var(--ink);
}
.nav-item-num {
font-family: var(--font-mono);
font-size: 11.5px;
color: var(--ink-4);
}
.nav-item.active .nav-item-num { color: var(--ink-2); }
.nav-item-title {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.nav-dot {
width: 7px; height: 7px; border-radius: 50%;
background: var(--line-2);
}
.nav-dot.answered { background: var(--accent); }
.nav-dot.flagged { background: var(--warn); }
.nav-dot.correct { background: var(--correct); }
.nav-dot.wrong { background: var(--wrong); }
.main {
padding: 48px 64px 120px;
overflow-y: auto;
max-width: 920px;
margin: 0 auto;
width: 100%;
}
.meta-rail {
border-left: 1px solid var(--line);
padding: 24px 20px;
background: var(--paper);
position: sticky; top: 57px;
max-height: calc(100vh - 57px);
overflow-y: auto;
}
.meta-block { margin-bottom: 28px; }
.meta-label {
font-family: var(--font-mono);
font-size: 10.5px;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--ink-4);
margin-bottom: 8px;
font-weight: 500;
}
.meta-value {
font-family: var(--font-serif);
font-size: 26px;
letter-spacing: -0.02em;
line-height: 1.1;
}
.meta-value.mono { font-family: var(--font-mono); font-size: 18px; font-weight: 500; }
.progress-bar {
height: 3px;
background: var(--line);
border-radius: 999px;
overflow: hidden;
margin-top: 10px;
}
.progress-bar > div {
height: 100%;
background: var(--ink);
transition: width 200ms ease;
}
.timer-urgent { color: var(--wrong); }
/* ---------- Question Card ---------- */
.question-header {
display: flex;
align-items: baseline;
gap: 16px;
margin-bottom: 32px;
padding-bottom: 24px;
border-bottom: 1px solid var(--line);
}
.q-index {
font-family: var(--font-mono);
font-size: 12px;
color: var(--ink-3);
letter-spacing: 0.02em;
}
.q-category {
font-size: 12px;
color: var(--ink-3);
padding: 2px 8px;
background: var(--paper-3);
border-radius: 4px;
font-family: var(--font-mono);
}
.q-points {
margin-left: auto;
font-family: var(--font-mono);
font-size: 12px;
color: var(--ink-3);
}
.q-prompt {
font-family: var(--font-serif);
font-size: 26px;
line-height: 1.35;
letter-spacing: -0.015em;
color: var(--ink);
margin: 0 0 32px;
text-wrap: pretty;
font-weight: 400;
}
.q-prompt .katex { font-size: 1em; }
.q-media {
margin: 0 0 32px;
border-radius: var(--r-md);
overflow: hidden;
border: 1px solid var(--line);
}
.q-media img { width: 100%; display: block; }
.q-media-caption {
padding: 10px 14px;
background: var(--paper-2);
border-top: 1px solid var(--line);
font-size: 12.5px;
color: var(--ink-3);
font-style: italic;
}
.q-code {
background: var(--paper-2);
border: 1px solid var(--line);
border-radius: var(--r-md);
padding: 16px 20px;
font-family: var(--font-mono);
font-size: 13px;
line-height: 1.6;
margin: 0 0 32px;
overflow-x: auto;
white-space: pre;
}
.q-code .cm-keyword { color: oklch(0.5 0.18 280); font-weight: 500; }
.q-code .cm-string { color: oklch(0.55 0.12 140); }
.q-code .cm-number { color: oklch(0.55 0.14 40); }
.q-code .cm-comment { color: var(--ink-4); font-style: italic; }
.q-code .cm-fn { color: oklch(0.5 0.14 220); }
.q-table {
width: 100%;
border-collapse: collapse;
margin: 0 0 32px;
font-size: 14px;
}
.q-table th, .q-table td {
padding: 10px 14px;
text-align: left;
border-bottom: 1px solid var(--line);
}
.q-table th {
font-family: var(--font-mono);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--ink-3);
font-weight: 500;
background: var(--paper-2);
}
.q-table tr:last-child td { border-bottom: 1px solid var(--line-2); }
.q-audio {
display: flex;
align-items: center;
gap: 12px;
padding: 14px 18px;
background: var(--paper-2);
border-radius: var(--r-md);
border: 1px solid var(--line);
margin: 0 0 32px;
}
.q-audio audio { flex: 1; }
/* ---------- Choices ---------- */
.choices { display: flex; flex-direction: column; gap: 8px; }
.choice {
display: flex;
align-items: flex-start;
gap: 14px;
padding: 16px 20px;
border: 1px solid var(--line-2);
border-radius: var(--r-md);
cursor: pointer;
transition: all 120ms ease;
background: var(--paper);
text-align: left;
width: 100%;
color: var(--ink);
font-size: 15px;
line-height: 1.5;
}
.choice:hover { border-color: var(--line-3); background: var(--paper-2); }
.choice.selected {
border-color: var(--ink);
background: var(--paper-2);
}
.choice.correct {
border-color: var(--correct);
background: var(--correct-weak);
}
.choice.wrong {
border-color: var(--wrong);
background: var(--wrong-weak);
}
.choice-marker {
width: 22px; height: 22px;
border: 1.5px solid var(--line-3);
border-radius: 50%;
flex-shrink: 0;
margin-top: 1px;
display: grid; place-items: center;
position: relative;
transition: all 120ms ease;
}
.choice.selected .choice-marker {
border-color: var(--ink);
background: var(--ink);
}
.choice.selected .choice-marker::after {
content: '';
width: 8px; height: 8px;
border-radius: 50%;
background: var(--paper);
}
.choice-marker.square { border-radius: 5px; }
.choice.selected .choice-marker.square::after {
width: 10px; height: 6px;
border: 2px solid var(--paper);
border-top: 0; border-right: 0;
background: transparent;
border-radius: 0;
transform: rotate(-45deg) translate(1px, -1px);
}
.choice-key {
font-family: var(--font-mono);
font-size: 12px;
color: var(--ink-4);
margin-right: 8px;
}
.choice.selected .choice-key { color: var(--ink-2); }
/* ---------- Match ---------- */
.match-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 32px;
position: relative;
}
.match-col {
display: flex;
flex-direction: column;
gap: 8px;
}
.match-col-label {
font-family: var(--font-mono);
font-size: 10.5px;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--ink-4);
margin-bottom: 4px;
font-weight: 500;
}
.match-item {
padding: 14px 16px;
border: 1px solid var(--line-2);
border-radius: var(--r-md);
background: var(--paper);
cursor: pointer;
transition: all 120ms ease;
display: flex;
justify-content: space-between;
align-items: center;
gap: 12px;
font-size: 14px;
}
.match-item:hover { border-color: var(--line-3); background: var(--paper-2); }
.match-item.active {
border-color: var(--accent);
background: var(--accent-weak);
box-shadow: 0 0 0 3px var(--accent-weak);
}
.match-item.paired {
border-color: var(--ink-3);
background: var(--paper-2);
}
.match-item.correct { border-color: var(--correct); background: var(--correct-weak); }
.match-item.wrong { border-color: var(--wrong); background: var(--wrong-weak); }
.match-pair-badge {
font-family: var(--font-mono);
font-size: 11px;
color: var(--ink-3);
padding: 2px 7px;
background: var(--paper-3);
border-radius: 999px;
flex-shrink: 0;
}
/* ---------- Order ---------- */
.order-list { display: flex; flex-direction: column; gap: 8px; }
.order-item {
display: flex;
align-items: center;
gap: 14px;
padding: 14px 16px;
border: 1px solid var(--line-2);
border-radius: var(--r-md);
background: var(--paper);
cursor: grab;
transition: all 120ms ease;
font-size: 14.5px;
}
.order-item:hover { border-color: var(--line-3); background: var(--paper-2); }
.order-item.dragging { opacity: 0.4; }
.order-item.drop-before { border-top-color: var(--accent); box-shadow: 0 -2px 0 var(--accent); }
.order-item.drop-after { border-bottom-color: var(--accent); box-shadow: 0 2px 0 var(--accent); }
.order-handle {
color: var(--ink-4);
font-size: 16px;
line-height: 1;
cursor: grab;
user-select: none;
}
.order-num {
font-family: var(--font-mono);
font-size: 12px;
color: var(--ink-3);
width: 20px;
flex-shrink: 0;
}
.order-text { flex: 1; }
.order-item.correct { border-color: var(--correct); background: var(--correct-weak); }
.order-item.wrong { border-color: var(--wrong); background: var(--wrong-weak); }
/* ---------- Short / Math input ---------- */
.answer-input-wrap { display: flex; flex-direction: column; gap: 12px; max-width: 560px; }
.math-preview {
padding: 14px 16px;
background: var(--paper-2);
border: 1px solid var(--line);
border-radius: var(--r-md);
min-height: 48px;
display: flex;
align-items: center;
}
.math-preview-label {
font-family: var(--font-mono);
font-size: 10.5px;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--ink-4);
margin-right: 12px;
}
/* ---------- Feedback block ---------- */
.feedback {
margin-top: 32px;
padding: 20px 24px;
border-radius: var(--r-md);
border-left: 3px solid var(--ink);
background: var(--paper-2);
}
.feedback.correct { border-left-color: var(--correct); background: var(--correct-weak); }
.feedback.wrong { border-left-color: var(--wrong); background: var(--wrong-weak); }
.feedback-label {
font-family: var(--font-mono);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.12em;
font-weight: 600;
margin-bottom: 8px;
}
.feedback.correct .feedback-label { color: var(--correct); }
.feedback.wrong .feedback-label { color: var(--wrong); }
.feedback-body {
font-size: 14.5px;
line-height: 1.6;
}
.feedback-body p { margin: 0 0 8px; }
.feedback-body p:last-child { margin-bottom: 0; }
/* ---------- Exam footer ---------- */
.exam-footer {
display: flex;
align-items: center;
gap: 12px;
margin-top: 48px;
padding-top: 32px;
border-top: 1px solid var(--line);
}
.exam-footer .spacer { flex: 1; }
/* ---------- Results ---------- */
.results {
max-width: 960px;
margin: 0 auto;
padding: 64px 32px 120px;
}
.results-eyebrow {
font-family: var(--font-mono);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--ink-3);
margin-bottom: 16px;
}
.results-title {
font-family: var(--font-serif);
font-size: 56px;
font-weight: 400;
letter-spacing: -0.025em;
line-height: 1.05;
margin: 0 0 48px;
}
.results-title em { font-style: italic; color: var(--accent); }
.score-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 0;
border-top: 1px solid var(--line);
border-bottom: 1px solid var(--line);
margin-bottom: 56px;
}
.score-cell {
padding: 28px 0;
border-right: 1px solid var(--line);
}
.score-cell:last-child { border-right: none; }
.score-cell-label {
font-family: var(--font-mono);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--ink-3);
margin-bottom: 8px;
font-weight: 500;
}
.score-cell-value {
font-family: var(--font-serif);
font-size: 48px;
letter-spacing: -0.02em;
line-height: 1;
font-weight: 400;
}
.score-cell-unit {
font-family: var(--font-mono);
font-size: 14px;
color: var(--ink-3);
margin-left: 4px;
}
.category-breakdown { margin-bottom: 56px; }
.category-row {
display: grid;
grid-template-columns: 180px 1fr 60px;
gap: 16px;
align-items: center;
padding: 14px 0;
border-bottom: 1px solid var(--line);
font-size: 14px;
}
.category-row:last-child { border-bottom: none; }
.category-bar {
height: 4px;
background: var(--line);
border-radius: 999px;
overflow: hidden;
}
.category-bar > div { height: 100%; background: var(--ink); transition: width 400ms ease; }
.category-score {
font-family: var(--font-mono);
font-size: 12.5px;
text-align: right;
color: var(--ink-2);
}
.review-heading {
font-family: var(--font-serif);
font-size: 28px;
letter-spacing: -0.02em;
margin: 0 0 24px;
font-weight: 400;
}
.review-item {
border: 1px solid var(--line);
border-radius: var(--r-md);
margin-bottom: 16px;
overflow: hidden;
}
.review-item-header {
padding: 16px 20px;
display: flex;
align-items: center;
gap: 16px;
cursor: pointer;
background: var(--paper);
border-bottom: 1px solid transparent;
}
.review-item.open .review-item-header { border-bottom-color: var(--line); }
.review-item-header:hover { background: var(--paper-2); }
.review-num {
font-family: var(--font-mono);
font-size: 12px;
color: var(--ink-3);
min-width: 36px;
}
.review-title {
flex: 1;
font-size: 14.5px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.review-status {
font-family: var(--font-mono);
font-size: 11px;
padding: 3px 10px;
border-radius: 999px;
text-transform: uppercase;
letter-spacing: 0.08em;
}
.review-status.correct { background: var(--correct-weak); color: var(--correct); }
.review-status.wrong { background: var(--wrong-weak); color: var(--wrong); }
.review-status.ungraded { background: var(--paper-3); color: var(--ink-3); }
.review-body {
padding: 24px 28px;
background: var(--paper-2);
font-size: 14px;
}
/* ---------- Tweaks panel ---------- */
.tweaks-panel {
position: fixed;
bottom: 20px;
right: 20px;
width: 280px;
background: var(--paper);
border: 1px solid var(--line-2);
border-radius: var(--r-md);
box-shadow: var(--shadow-md);
z-index: 100;
overflow: hidden;
}
.tweaks-header {
padding: 12px 16px;
border-bottom: 1px solid var(--line);
display: flex;
justify-content: space-between;
align-items: center;
font-family: var(--font-mono);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.12em;
font-weight: 500;
color: var(--ink-2);
}
.tweaks-body { padding: 16px; display: flex; flex-direction: column; gap: 16px; }
.tweak-row { display: flex; flex-direction: column; gap: 6px; }
.tweak-label { font-size: 12px; color: var(--ink-3); font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.08em; }
.tweak-control {
display: flex;
gap: 4px;
background: var(--paper-2);
padding: 3px;
border-radius: var(--r-sm);
border: 1px solid var(--line);
}
.tweak-seg {
flex: 1;
padding: 6px 10px;
border: none;
background: transparent;
border-radius: 4px;
font-size: 12px;
cursor: pointer;
color: var(--ink-2);
text-align: center;
}
.tweak-seg.active { background: var(--paper); color: var(--ink); box-shadow: var(--shadow-sm); }
/* Keyboard hints */
.kbd {
font-family: var(--font-mono);
font-size: 10.5px;
padding: 2px 6px;
background: var(--paper-2);
border: 1px solid var(--line);
border-bottom-width: 2px;
border-radius: 4px;
color: var(--ink-3);
}
/* Scrollbar */
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--line-2); border-radius: 999px; border: 2px solid var(--paper); }
::-webkit-scrollbar-thumb:hover { background: var(--line-3); }
/* Selection */
::selection { background: var(--accent-weak); color: var(--accent-ink); }
/* Responsive */
@media (max-width: 1100px) {
.exam-shell { grid-template-columns: 240px 1fr; }
.meta-rail { display: none; }
}
@media (max-width: 760px) {
.exam-shell { grid-template-columns: 1fr; }
.sidebar { position: relative; max-height: none; }
.main { padding: 32px 20px 120px; }
.landing-grid { grid-template-columns: 1fr; }
.score-grid { grid-template-columns: 1fr; }
.score-cell { border-right: none; border-bottom: 1px solid var(--line); }
}