Skip to content

v0.7.0 — the disabled control kept the focus it was taking away

Choose a tag to compare

@robertblust robertblust released this 01 Sep 09:22
· 12 commits to main since this release

Two corrections to 0.6.x, both found by reviewing the branch as one change rather than task by task.

A disabled button dropped the keyboard user's focus

render() set the disabled property on prev, first and next at the ends of the deck. Correct
about intent, wrong about mechanism: the control becomes disabled as a result of the user's own
activation, while it holds focus
.

Measured in Chromium — focus a deck's Previous button and press Enter until slide zero:

focus
before tPrev
after reaching slide 0 BODY

The control deactivates under the finger and the user loses their place. It now sets
aria-disabled and guards each handler: the button stays where the user put it, stays announced,
and does nothing. Re-measured, focus stays on tPrev, and pressing it again is a no-op.

.lcd:has(.n.msg) shipped with a justification that is false on every deck

0.6.0's comment claimed the rule fixed a gap where companygraph's and guestgraph's decks "could
never show a message at that width at all". No deck can, at any width.

  • lcdMessage() has exactly one call site, gated on if (!pickVoice() && !hasClips())
  • hasClips() returns clipsSeen
  • clipsSeen is var clipsSeen = true, never reassigned, on all four decks

So .msg is never added and the rule never matches. lcdMessage, msgTimer and both novoice
strings are dead today.

The rule stays. It is correct and costs nothing, and it becomes live the moment anything
actually probes for clips. What changed is the comment: it now says the path is unreachable and
why, rather than claiming a fix nobody can observe. Whether the deck should probe is a design
question, deliberately not decided here.

Also corrected

  • A seam comment that quoted the value substituted into it, so each deck shipped a sentence
    contradicting itself — "its own LANG_KEY line reads rb-lang, a template, not a value".
  • A claim that a missing TALK leaves "every check green". It does not: that is a load-time
    ReferenceError, and opensFromFile fails on it. The identical sentence inherited from
    blocks/lang.js is accurate there, so only the new one changed.
  • Three documents describing a fence set two releases out of date — "Six blocks"/"Five blocks"
    where there are ten, and footerVersion still documented as the deck footer's assertion in all
    three sites' conventions files, though that check was retired a plan ago.

deck runtime and deck transport both to v3. 120 tests.