Repository navigation
v0.42.2
Pre-releaseSelection is the platform's again on a phone
The deck had been reaching into the browser's own gesture handling, and every attempt to steer it cost the reader something they already had. user-select was switched off while the navigation chrome was idle, so a phone could not select a word without waking the chrome first; the wake gesture then lifted that gate mid-gesture and the browser's pending word-selection completed on top of it; and contextmenu was cancelled outright, which on a touch screen is the long press — holding a word threw the reader back a card and took the copy callout with it.
None of that is the deck's business. A long press is the platform's, and so is a selection. The gate, its lift, the timer and the "a live selection holds the chrome up" rule are gone, and contextmenu is handled only where there is a fine pointer, which is the right-click it was written for. The double tap still switches the navigation chrome on and off, and it no longer competes with anything.
Completion offers each command the options it accepts, and no others
build --<Tab> put --polarity, --hue, --family, --shell and --format in front of you, and build --polarity dark then answered "Unknown option: --polarity (not an option of build)". The script emitted one list — the union of every command's options — for every command, so it was the program dictating what the program would reject.
It now reads the same table the parser refuses against, and emits one entry per command, keyed by what you type rather than by the internal name: build and series build are one command and two paths. series theme and series theme set are two commands and get two entries — keyed on the reading one, the writing one was offered --format, which it refuses, and never --theme, which is the whole reason to type it. Before a command there are no command options at all (lightwebpres --polarity dark theme list answers "Unknown command"), so that position offers the globals only, and a bare series/theme/template offers --help, which is all a node takes.
The build stamp can be read
--build-stamp painted a literal #6B6B7D at opacity: 0.75 — a grey chosen against no particular ground. Measured against all 57 built-in themes, that pair cleared 4.5:1 on none of them and 3:1 on five, bottoming out at 1.27:1 on pop-red.
No fixed colour can work, and no fixed opacity either: opacity always pulls ink towards its ground, so a palette sitting on the 4.5:1 floor is put under it by any fade at all. The marker inherits its colour now, with no opacity, which gives it exactly the contrast the theme already guarantees for its body text. Discretion is the 11px and the corner, not a colour nobody can read.
It also moved into the first card. Emitted beside the cards it inherited the body's ink, and on a light theme the cover paints its ground with the page's ink — so on nord it was writing #2E3440 onto #2E3440, at 1.00:1. Measured after the move: nord 1.92:1 → 10.84:1, solarized 2.18:1 → 13.92:1, midnight 2.62:1 → 17.61:1. It sits at the top-left of the first card and scrolls away with it, as the option has always specified — not pinned to the window, and not repeated on every card.
The rendered-contrast sweep builds its probe with the flag now, and a second instrument runs beside it: an overlay takes its ground from whichever sibling the painter drew there, not from its ancestors, so a DOM walk had called the marker legible on the very page where it was painting its own colour.
Migration
Rebuild. Nothing about the format, the identities or the pages changes.
If the build warns that templates/nav.js differs from the built-in version, the touch fixes above are not reaching your readers — that copy is what the build uses. lightwebpres template update . goes back to the built-in one and keeps yours as nav.js.bak; settings.conf and custom.css are never touched.