Public Access
- 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.
1026 lines
24 KiB
CSS
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); }
|
|
}
|