Skip to content

Make the page usable: board beside the text, and Return takes the offer - #24

Merged
RCheesley merged 1 commit into
mainfrom
usable-layout
Sep 23, 2026
Merged

RCheesley merged 1 commit into
mainfrom
usable-layout

Conversation

@RCheesley

Copy link
Copy Markdown
Owner

Three things found by using the hosted app rather than by testing it.

1. Return threw away the offer — a real bug

Pressing Return on a finished drill went straight to startDrill() instead of through the same handler the button uses. So a result card reading "Repair drill · T" restarted the lesson when you pressed a key, silently discarding the repair every time.

That is the same failure as a button that lies, reached by a different route. Now routed through onContinue(), with an end-to-end guard that the keyboard does what the button says.

Verified by hand: fumbled a key, result offered Repair drill · T, pressed Return, and got fast nta at tan data idti sit ditst fast fast — the repair drill, not the lesson again.

2. The board and the text were never on screen together

They were 770 pixels apart. The readout names the next key in words and the diagram shows where it is; they are meant to reinforce each other and could not, because you could only ever see one.

Side by side above 62rem, stacked below it — and in markup order, board then drill, left then right, so what the eye follows and what Tab follows never disagree.

3. Everything below the drill was undiscoverable

Before After
Page height 5366px 3786px
Content width in a 1440px window 608px uses the window
Board → drill text 770px apart side by side
Ladder section 2520px 1665px
  • A section navigation, revealed once a layout is loaded, and skippable by the skip link that already existed.
  • The ladder is a grid of cards rather than thirteen full-width rows. It flows in rows, so reading and Tab order are unchanged.
  • Choosing a layout and reading what was found share one band instead of two.
  • The load instructions stand down once they have been followed. The file input stays — you may want a different layout.

Tests

New tests/e2e/layout.spec.ts guards all of it, including at 380px where the columns stack, and asserts the page cannot grow back into an endless scroll.

The keyboard-only journey is updated for the navigation: it now takes the skip link, which is what the skip link is for, rather than tabbing through five nav items.

566 unit/functional/regression · 158 end-to-end · axe clean in both themes.

🤖 Generated with Claude Code

Three things found by using the hosted app rather than by testing it.

Pressing Return on a finished drill threw away whatever the result card was
offering. The keyboard path went straight to "start this drill again" instead
of through the same handler the button uses, so a card reading "Repair drill ·
T" restarted the lesson when you pressed a key. That is the same failure as a
button that lies, reached by a different route, and it silently discarded the
repair every time.

The board sat 770 pixels above the text being typed, so a learner could see
where the next key was or what they were meant to type, but never both. The
readout naming the key and the diagram showing it are meant to reinforce each
other and could not. They now sit side by side above 62rem and stack below it,
in the order they appear in the markup, so what the eye follows and what Tab
follows still agree.

The sprint, the ladder, the statistics and the saving controls were somewhere
down a five-thousand-pixel page with nothing to say they existed. There is a
section navigation now, revealed once a layout is loaded and skippable by the
link that already existed; the ladder is a grid of cards instead of thirteen
full-width rows; choosing a layout and reading what was found in it share one
band instead of two; and the instructions stand down once they have been
followed. The page is 3786 pixels where it was 5366, and the content uses the
window instead of 42 per cent of it.

New tests guard all of it, including at 380 pixels where the columns stack.
The keyboard-only journey is updated for the navigation: it now takes the skip
link, which is what the skip link is for.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@RCheesley
RCheesley merged commit b224b1a into main Sep 23, 2026
3 checks passed
@RCheesley
RCheesley deleted the usable-layout branch September 23, 2026 22:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant