0.54.0: an act deposits a value into a field, and a binding carries its heading
Two vocabulary members, both ruled and both with a measured consumer, plus an
accessibility fix a parallel session landed in the same tree (see the last section).
f35aafee, ruled (a) by Max 2026-08-21. Nothing could say "take this string and put
it into that OTHER field". A chosen thing landed in exactly two places: the server
wrote it and answered a screen or a fragment, or a Field carried `changes` and sent
its own value. MNW's media-picker.js does the third thing across three templates and
155 lines, and it is the entire point of the button.
Act::fills: Option<Fill>, Fill { field, value }, Act::filling(field, value). The
ruling suggested fills: Option<String> and that names a destination with nothing to
put in it -- an Act carries a label and an address and no value, and the picker's
card reads as kick.png while depositing . Both halves, the way
Candidate splits value from label. field is addressed by Field::name, so no id
relationship is invented.
A deposit does not replace the action: the renderer fills and then dispatches
Act::action as it always would, and an act that only fills says so with
Destination::Local. Fill-after-gather, fixed by the webview rather than chosen --
htmx's listener sits on the control and the fill script on the document, so the
element handler runs first, and the two client renderers match it deliberately.
d52884b0 stands untouched, which is why (a) rather than (b): nothing here carries a
caret in either direction. A webview inserts at the selection, the TUI and egui
append, and the vocabulary calls appending correct rather than a fallback.
The webview half is FILL_JS and not a hyperscript program. That file's one standing
rule is that no program is built out of text a user typed, and the deposited value is
exactly that. As two escaped attributes it is data. The script inserts at
selectionStart and dispatches `input`, without which the three measured surfaces show
the reference and save a document without it: the blog editor autosaves on a 30s
debounce, the item text editor has no autosave, and item_details' section bodies are
unsaved by construction. Losing the caret is a downgrade; losing the draft is a
defect.
cf7872dc, split out of a7f0c6c0. Binding::label exists so a help overlay is not a
second hand-written copy of the key table, and that argument runs out at length:
audiofiles' described table was four rows until 0.52.0's focus guard let the bare
letters be declared, and thirteen is the same wall the shipped tab broke into seven
arrays. Binding::group, Chrome::bind_in, Chrome::grouped.
Said by the app, never derived. Sorting by key puts "Toggle the sidebar" beside "Show
this help", and deriving from the address prefix is the same guess wearing a path:
/panels/sidebar and /forge are both Toggles to a reader and siblings in nothing.
The grouping is Chrome's and not the renderers'. The task asked for "all three
renderers group a help listing by it" and no renderer draws one -- a help screen is a
described screen like any other, which is what Binding::label bought. Chrome::grouped
is the shared half that stops the three renderers and every app that draws its own
table each writing the ordering.
Consumers forward-fixed in the same pass: audiofiles, goingson and the MNW server all
take 0.54, and audiofiles' help.rs binds under Bulk, Discovery, Toggles and System
and draws a heading and a table per group.
Found beside it: Shell links quasi-download.js by default and neither goingson nor the
MNW server was writing the file out, so every described document has been linking a
404 since that script shipped. Both now write the renderer's scripts in a loop rather
than one call per name, which is what stops the next one going the same way.
461582b5, carried here rather than split. quasi-immediate's node::row claimed a
pressable row's strip with a bare ui.interact and never called Response::widget_info,
and egui builds its AccessKit tree from WidgetInfo alone -- so a row that opens worked
under a mouse and did not exist for a keyboard or a screen reader. row_name plus one
widget_info call, with two tests. Found by the parallel session flipping audiofiles'
tag queue, where it left no non-mouse way to open a tag group; it lands in this commit
because node.rs also carries the deposit above and splitting the file would have been
worse than saying so. The table path has the same bare interact and is deliberately
not fixed: it is claimed per cell, so naming each cell a button announces N buttons
per row, and a row-wide response needs makeover-immediate's table to hand one back.
That half stays on the problem.
- Wiki
- quasi-vocabulary-findings, two new sections.