-
+
Pretest complete
-
+
{correctCount} / {visibleQuestions.length}
-
+
The article below covers each of these topics in depth. Pay particular
attention to any questions you got wrong; the pretesting effect makes
the content that follows measurably stickier.
@@ -195,10 +195,10 @@ export function LearnQuizWidget({
{/* Widget header — instrument-label strip */}
-
+
{/* Helper line — guidance, not body */}
{currentIndex === 0 && !isSubmitted && (
-
+
—
Try these before reading. Getting them wrong here makes the article
that follows stick better in memory.
@@ -228,7 +228,7 @@ export function LearnQuizWidget({
{/* Question stem */}
{currentQuestion.questionText}
@@ -260,15 +260,15 @@ export function LearnQuizWidget({
'focus:outline-none focus-visible:ring-2 focus-visible:ring-crystal-500 focus-visible:ring-offset-2',
'disabled:pointer-events-none',
isIdle &&
- 'border-slate-200 text-slate-800 hover:border-slate-300 hover:bg-slate-50 dark:border-slate-800 dark:text-slate-200 dark:hover:border-slate-700 dark:hover:bg-slate-800/40',
+ 'border-slate-200 text-slate-800 hover:border-slate-300 hover:bg-slate-50',
isPickedIdle &&
- 'border-crystal-600 bg-crystal-50 text-crystal-900 ring-1 ring-crystal-600 dark:bg-crystal-950/40 dark:text-crystal-100 dark:border-crystal-500 dark:ring-crystal-500',
+ 'border-crystal-600 bg-crystal-50 text-crystal-900 ring-1 ring-crystal-600',
isCorrectReveal &&
- 'border-emerald-600 bg-emerald-50 text-emerald-900 dark:bg-emerald-950/40 dark:text-emerald-100 dark:border-emerald-500',
+ 'border-emerald-600 bg-emerald-50 text-emerald-900',
isWrongChosen &&
- 'border-red-500 bg-red-50 text-red-900 dark:bg-red-950/40 dark:text-red-100 dark:border-red-500',
+ 'border-red-500 bg-red-50 text-red-900',
showCorrectness && !isThisCorrect && !isSelected &&
- 'border-slate-200 text-slate-500 dark:border-slate-800 dark:text-slate-500',
+ 'border-slate-200 text-slate-500',
)}
>
@@ -277,15 +277,15 @@ export function LearnQuizWidget({
className={cn(
'inline-flex h-6 w-6 items-center justify-center rounded font-mono text-[11px] tracking-wider transition-colors duration-150 flex-shrink-0',
isIdle &&
- 'bg-slate-100 text-slate-600 group-hover:bg-slate-200 dark:bg-slate-800 dark:text-slate-400 dark:group-hover:bg-slate-700',
+ 'bg-slate-100 text-slate-600 group-hover:bg-slate-200',
isPickedIdle &&
- 'bg-crystal-600 text-white dark:bg-crystal-500',
+ 'bg-crystal-600 text-white',
isCorrectReveal &&
- 'bg-emerald-600 text-white dark:bg-emerald-500',
+ 'bg-emerald-600 text-white',
isWrongChosen &&
- 'bg-red-600 text-white dark:bg-red-500',
+ 'bg-red-600 text-white',
showCorrectness && !isThisCorrect && !isSelected &&
- 'bg-slate-100 text-slate-400 dark:bg-slate-800 dark:text-slate-600',
+ 'bg-slate-100 text-slate-400',
)}
>
{letter}
diff --git a/src/components/quiz/study/RationalePanel.tsx b/src/components/quiz/study/RationalePanel.tsx
index e6cc178..7cf0e68 100644
--- a/src/components/quiz/study/RationalePanel.tsx
+++ b/src/components/quiz/study/RationalePanel.tsx
@@ -67,9 +67,7 @@ export function RationalePanel({
{correct ? (
@@ -116,16 +110,16 @@ export function RationalePanel({
{/* Main rationale */}
-
+
{cleanCorrect}
{/* Per-option breakdown */}
{cleanOptions.length > 0 && (
-
+
{cleanOptions.map((opt, idx) => {
const wasChosen = userPickedIndex === idx;
const isCorrect = opt.isCorrect;
@@ -134,23 +128,21 @@ export function RationalePanel({
key={idx}
className={cn(
'px-4 py-3 text-sm',
- isCorrect && 'bg-emerald-50/50 dark:bg-emerald-950/20',
- wasChosen && !isCorrect && 'bg-red-50/50 dark:bg-red-950/20',
+ isCorrect && 'bg-emerald-50/50',
+ wasChosen && !isCorrect && 'bg-red-50/50',
)}
>
{isCorrect ? (
) : (
@@ -160,10 +152,10 @@ export function RationalePanel({
className={cn(
'font-medium',
isCorrect
- ? 'text-emerald-700 dark:text-emerald-300'
+ ? 'text-emerald-700'
: wasChosen
- ? 'text-red-700 dark:text-red-300'
- : 'text-slate-600 dark:text-slate-400',
+ ? 'text-red-700'
+ : 'text-slate-600',
)}
>
{opt.text}
@@ -172,7 +164,7 @@ export function RationalePanel({
)}
{opt.rationale && (
-
{opt.rationale}
+
{opt.rationale}
)}
@@ -185,15 +177,15 @@ export function RationalePanel({
{/* Sources footer — single deduped citation line at the foot of the body */}
{sources.length > 0 && (
-
+
Sources
{sources.map((slug, idx) => (
- {idx > 0 && · }
+ {idx > 0 && · }
{citationLabel(slug)}
))}
diff --git a/src/components/quiz/study/StudySettingsPanel.tsx b/src/components/quiz/study/StudySettingsPanel.tsx
index 1666511..8129eb3 100644
--- a/src/components/quiz/study/StudySettingsPanel.tsx
+++ b/src/components/quiz/study/StudySettingsPanel.tsx
@@ -36,11 +36,11 @@ function ToggleRow({ id, label, description, checked, onToggle }: ToggleRowProps
{label}
-
{description}
+
{description}
{/* Toggle switch */}
-
+
Study settings
-
+
{/* Require confidence */}
Review mix
-
+
{reviewMixPercent}% review / {100 - reviewMixPercent}% new
-
+
Fraction of due (spaced-repetition) items vs new questions in each session.
@@ -144,11 +142,11 @@ export function StudySettingsPanel({ value, onChange }: StudySettingsPanelProps)
Default question count
-
+
Pre-filled in the quiz setup screen.
diff --git a/src/components/quiz/study/UnvettedFlag.tsx b/src/components/quiz/study/UnvettedFlag.tsx
index 7052ae0..f7ff942 100644
--- a/src/components/quiz/study/UnvettedFlag.tsx
+++ b/src/components/quiz/study/UnvettedFlag.tsx
@@ -62,7 +62,6 @@ export function UnvettedFlag({ unvetted }: UnvettedFlagProps) {
'absolute bottom-full left-0 mb-2 z-50',
'w-56 rounded-lg border border-amber-200 bg-amber-50 px-3 py-2',
'text-xs text-amber-800 shadow-md',
- 'dark:border-amber-800 dark:bg-amber-950/80 dark:text-amber-200',
'transition-opacity duration-150',
tooltipVisible ? 'opacity-100' : 'opacity-0 pointer-events-none',
)}
diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro
index ff611bc..24fd649 100644
--- a/src/layouts/BaseLayout.astro
+++ b/src/layouts/BaseLayout.astro
@@ -93,7 +93,7 @@ const fullTitle = isHome
{!noHeader &&
}
-
+
{!noFooter && }
diff --git a/src/pages/index.astro b/src/pages/index.astro
index 8be46a1..916723d 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -141,7 +141,7 @@ const iconPaths: Record = {
- cubic[m3m]:{'{'}{'{'}111{'}'}
+ cubic[m3m]:{'{'}111{'}'}
diff --git a/src/pages/quiz/index.astro b/src/pages/quiz/index.astro
index 51af37e..a429598 100644
--- a/src/pages/quiz/index.astro
+++ b/src/pages/quiz/index.astro
@@ -142,15 +142,6 @@ const quizSchema = {
items with no setup screen, making it easy to fit a focused five-minute review into any
break between study sessions.
-
- Quiz categories
-
- {categories.map(cat => (
-
- {cat.name}: {cat.description}
-
- ))}
-
diff --git a/src/styles/global.css b/src/styles/global.css
index a1cf5c2..c97ed94 100644
--- a/src/styles/global.css
+++ b/src/styles/global.css
@@ -35,6 +35,15 @@
scroll-behavior: smooth;
}
+ /*
+ * The sticky header (h-16 + border = ~65px) hides anchor-jump targets
+ * (citation backlinks, jump-nav) without this. 5rem (80px) covers the
+ * header height plus a small visual buffer.
+ */
+ [id] {
+ scroll-margin-top: 5rem;
+ }
+
body {
@apply bg-white text-slate-900 antialiased;
font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11';