0.69.0: a control may show a picture, and half the brief was stale
`db998898`, filed 2026-08-22 with a standing instruction that the measuring was
the first half of the task. It was, and it changed the answer.
The brief's wider claim stopped being true after it was filed. It said
`Cell::new` and `Row::new` both take a string, "so a picture cannot sit beside a
control in a table or a list either", offered as option (b), the big change. The
containment model shipped since: `Row::part` and `Cell::part` take any leaf,
`Node::Image` declares `Containment::Text`, and the webview puts an activated
row's whole run inside the anchor. Emitted one to check, and a picture inside an
activated row is already pressable with no member at all. Option (b) was done.
What that leaves is the case a row cannot be: the control itself is the picture.
Two sites, which clears the bar the task set, since one consumer is a shape and
not a gap.
media_picker.rs `fn card` -- the tile is a region holding an image and an act
as siblings, so only the file name answers a press and a reader aiming at the
thumbnail hits nothing. It cannot be an activated row instead, because the
press deposits a value and `Fill` lives on `Act`.
templates/pages/project.html:135 -- `<a class="item-thumbnail"><img></a>`,
with a second link on the title going to the same place. One act showing the
cover and labelled with the title is one control where the markup has two
adjacent links to one destination.
Measured and NOT consumers, recorded so the next pass does not redo them:
gallery.js (the tile is a div, the picture decorative, the controls glyph
buttons), purchase.html (same markup, a div), discover_results.html (already one
link, thumbnail is text, describable today as an activated row),
quasi-basics::carousel, audiofiles' file list, Balanced Breakfast, goingson.
`Act::shows: Option<Picture>`, with `Act::showing`. The label stays what the
control says and the picture is what it shows, and a renderer draws both: a
control drawing only a picture and hiding its name has no accessible text.
A webview writes the `<img>` inside the control, sharing one emitter with a
picture in a region body so the two cannot drift -- the `<img>` was extracted
for that and the 302 existing tests pin it as unchanged. quasi-immediate draws
it above the button, grouped, outside `makeover_immediate::widget::act` for
`Act::hint`'s reason. quasi-tui ignores it and draws the label, which the brief
predicted and which is right: alt text is all a terminal has of a picture, and
the label is already saying the name.
`Outcome`'s `#[expect(clippy::large_enum_variant)]` goes back on, which is that
type's own recorded instruction rather than a new call. `Picture` is 88 bytes,
an `Act` is now 464 and the enum 520 against `Locating`'s 272. Boxing the node
is refused as before; boxing the picture is refused for a second reason, that it
would put an allocation in the public shape to save stack on a value built once
per request.
Consumers forward-fixed in the same pass: MNW server, goingson and audiofiles
move to `^0.69` and each compiles and tests green.
- Co-Authored-By
- Claude Opus 5 (1M context) <noreply@anthropic.com>