Report button moves under the exercise, bottom-right

The red "!" left the top chrome (it read as chrome and was easy to
mis-tap) and now sits in a row under the exercise: the AI disclaimer stays
centred, the report control is right-aligned with the card edge and is a
44px target. Applies to study, Smart Review and exam sessions; the results
slides keep just the disclaimer.

phase-2 suite now asserts the placement (below the card, right-aligned,
not in the header, >=44px) — 60 checks.

README: decision 52 updated. SW -> freezmo-v43.
This commit is contained in:
Martin Dvořák 2026-10-12 12:29:59 +00:00
commit 33c0ad1ed0
6 changed files with 88 additions and 37 deletions

View file

@ -174,16 +174,6 @@ export function SessionFeed({
{formatClock(remaining)}
</span>
) : null}
{!finished && items[index] ? (
<ReportQuestionButton
deck={items[index].deck}
activity={items[index].activity}
onSkip={() => {
setSkipped((current) => [...current, items[index].activity.id]);
goTo(index + 1);
}}
/>
) : null}
</div>
<div className="flex items-center justify-between gap-2 text-[11px] font-semibold text-[var(--text-muted)]">
<span className="min-w-0 truncate">{title}</span>
@ -217,7 +207,26 @@ export function SessionFeed({
isLast={itemIndex === total - 1}
nextLabel={itemIndex === total - 1 ? t("review.seeResults") : undefined}
/>
<AiDisclaimer />
{/* Under the card: disclaimer centred, report control in the
bottom-right corner (it used to sit in the top chrome). */}
{!finished && index === itemIndex ? (
<div className="grid grid-cols-[2.75rem_1fr_2.75rem] items-center gap-3">
<span aria-hidden />
<AiDisclaimer />
<div className="flex justify-end">
<ReportQuestionButton
deck={item.deck}
activity={item.activity}
onSkip={() => {
setSkipped((current) => [...current, item.activity.id]);
goTo(itemIndex + 1);
}}
/>
</div>
</div>
) : (
<AiDisclaimer />
)}
</div>
</section>
))}