diff --git a/frontend/src/pages/QuizPage.jsx b/frontend/src/pages/QuizPage.jsx
index 184f811..caaecdb 100644
--- a/frontend/src/pages/QuizPage.jsx
+++ b/frontend/src/pages/QuizPage.jsx
@@ -1629,10 +1629,9 @@ const timerStarted = timeLeft !== null
}}>
{isStudy ? '📖 Study' : '🎯 Exam'}
- {/* Said out loud, because the difference between a block being
- sat and a block being read back is the difference between a
- score that counts and one that has already been counted. */}
- {reviewing && Review}
+ {/* The Review badge lives on the rail now, beside the name of
+ the session it belongs to. Two of them on one screen, saying
+ the same word about the same block, was one too many. */}
Q {currentIdx + 1} / {totalCount}{answeredCount} answered
@@ -2212,7 +2211,15 @@ const timerStarted = timeLeft !== null
{/* Desktop rail — numbers with an excerpt, as in a Qbank session */}
- Session questions
+
+ {reviewing && Review}
+ {/* Which session this is, in full. A repetition is titled
+ "… (repetition)" when it is built, and that is worth seeing:
+ it is the difference between a score that counts towards
+ what you know and one that is practice. */}
+ {isStudy ? 'Study mode' : 'Exam mode'}: {quiz.title}
+ {answeredCount} / {totalCount}
+
-
+
{/* The block's own clock, and the only one: a second countdown
elsewhere on the screen is a second chance to misread it. An
untimed block says so rather than showing an empty space
@@ -2250,10 +2259,14 @@ const timerStarted = timeLeft !== null
{/* Pause is the exam's own pause — the same flag the clocks read,
and the same Exam Paused dialog that covers the questions. */}
-
-
+
+
>
) : (
<>
diff --git a/frontend/src/pages/QuizPlayer.css b/frontend/src/pages/QuizPlayer.css
index f1ea8a5..24b6cc0 100644
--- a/frontend/src/pages/QuizPlayer.css
+++ b/frontend/src/pages/QuizPlayer.css
@@ -381,6 +381,33 @@ body:has(.quiz-player.is-boxed) .navbar { margin-bottom: 0; }
}
.quiz-block-end:hover:not(:disabled) { background: #365b8d; }
+/* The block bar's own three controls: an icon, a word, and enough weight to
+ be found without reading. Leaving a block, stopping its clock and handing
+ it in are the loudest decisions on the screen, and they were three grey
+ pills of the same size as everything else. */
+.quiz-block-btn {
+ display: inline-flex; align-items: center; gap: 7px; flex-shrink: 0;
+ padding: 9px 16px; font: inherit; font-size: .8rem; font-weight: 700;
+ letter-spacing: .04em; text-transform: uppercase; cursor: pointer;
+ color: var(--text); background: none;
+ border: 1px solid var(--border); border-radius: 6px;
+}
+.quiz-block-btn span { font-size: .95rem; line-height: 1; }
+.quiz-block-btn:disabled { opacity: .5; cursor: not-allowed; }
+
+/* The rail says which session this is, not that a session has questions. */
+.quiz-rail-name { display: flex; flex-direction: column; gap: 3px; min-width: 0; text-transform: none; letter-spacing: 0; }
+.quiz-rail-name strong {
+ font-size: .82rem; font-weight: 700; line-height: 1.35; color: var(--text);
+ overflow-wrap: anywhere;
+}
+.quiz-rail-name small { font-size: .72rem; font-weight: 600; color: var(--text-subtle); }
+.quiz-rail-badge {
+ align-self: flex-start; padding: 1px 7px; border-radius: 4px;
+ font-size: .6rem; font-weight: 800; letter-spacing: .09em; text-transform: uppercase;
+ background: #e5ecf8; color: #365b8d;
+}
+
/* Nothing else on the page while a session is being sat. */
body:has(.quiz-player.is-boxed) .site-footer { display: none; }
@@ -745,14 +772,22 @@ body:has(.quiz-player.is-exam-chrome) .site-footer { display: none; }
.quiz-player.is-exam-chrome .quiz-block-time strong { color: #fff; }
.quiz-player.is-exam-chrome .quiz-exit,
.quiz-player.is-exam-chrome .quiz-block-pause {
- color: #fff; background: none; border: 1px solid rgba(255, 255, 255, .4);
+ color: #fff; background: none; border-color: rgba(255, 255, 255, .45);
}
.quiz-player.is-exam-chrome .quiz-exit:hover,
-.quiz-player.is-exam-chrome .quiz-block-pause:hover { background: rgba(255, 255, 255, .16); }
-.quiz-player.is-exam-chrome .quiz-block-end {
- background: #b03047; border-color: #b03047;
+.quiz-player.is-exam-chrome .quiz-block-pause:hover {
+ background: rgba(255, 255, 255, .16); border-color: #fff;
}
-.quiz-player.is-exam-chrome .quiz-block-end:hover:not(:disabled) { background: #93253a; }
+.quiz-player.is-exam-chrome .quiz-block-end {
+ color: #fff; background: #b03047; border-color: #b03047;
+}
+.quiz-player.is-exam-chrome .quiz-block-end:hover:not(:disabled) { background: #93253a; border-color: #93253a; }
+
+/* On the navy, the badge and the title are read against it rather than on a
+ card of their own. */
+.quiz-player.is-exam-chrome .quiz-rail-name strong { color: #fff; }
+.quiz-player.is-exam-chrome .quiz-rail-name small { color: rgba(255, 255, 255, .7); }
+.quiz-player.is-exam-chrome .quiz-rail-badge { background: rgba(255, 255, 255, .2); color: #fff; }
@media (max-width: 900px) {
.quiz-player.is-exam-chrome .quiz-topbar { gap: 8px; padding: 6px 8px; }