356. A connector grows from where you were, and an entry has a marker slot
Date: 2026-09-17
Status
Accepted. Closes two of the three items ADR-0344 and ADR-0345 left in
book/src/TODO.md, and answers the third, ADR-0176’s “isModal has one
consumer”, without building it.
Context
After the catalog’s last four widgets were built, book/src/TODO.md listed three
small things under “What the last four widgets left behind” and §4:
- A step’s connector filled by colour, not by
scaleX. §3.1 asks for the fill to grow along the line. ADR-0344 said the subset has notransform-origin, so ascaleXwould grow from the middle. - A
badgecould not be a timeline’s marker. §10 lists “dot, icon orbadge”. ADR-0345 built the first two and said a widget marker needs a slot markup can name. isModalhas one consumer,dialog. That entry named awizardstep and asheetas plausible second consumers.
The first reason was wrong. transform-origin has parsed, cascaded and painted
since ADR-0068, with TransformTest covering its keywords and
TransformPaintTest its device-pixel resolution. The sentence in ADR-0344 was
copied from an older note and never checked.
Decision
The connector is a track with a fill in it, and the fill is scaled about its
start edge. An entry takes a widget marker from a marker child. A wizard is
not modal.
The connector
step-connectorkeeps its size and its track colour, and gains one child part,step-connector-fill, that covers it. The fill is present in every state. A node built already done has no previous style to move from and would snap, which ischeck-mark’s reason (ADR-0067).controls.cssgives the filltransform: scaleX(0)aboutleft center, andscaleX(1)understep-connector.done, withtransition: transformon--gb-motion-base. A vertical list usesscaleYaboutcenter top, so the line grows down.- The fill carries no class.
step-connector.done step-connector-fillreaches it, so the one word the list writes is written once. - Settled, the pixels are what the colour version drew, so both
stepsgoldens and bothwizardgoldens are unchanged. What differs is the frames between the two states.
The marker slot
EntryMarkeris@Markup("marker")and holds exactly one widget. It is a description, the waypageis towizardandtabtotabs:Entry.inflatelifts its content out of the children and everything else stays the body.- Named rather than inferred. “The first
badgein the body” would move a badge that a document wrote as content onto the axis. Twomarkerchildren, or amarkerwith zero or two widgets, are refused. Entrygains amarkercomponent andwithMarker(Widget). The seven-argument constructor is kept. A widget marker wins over an icon, and the pending ring never holds one.TimelineMarkerbecomes a bare holder with the classwidget. It takes the widget’s size and paints nothing of its own, so a badge draws as a badge, in its own colours.- The rail keeps its 20px. A wider marker overhangs it evenly, and a short
badge’s overhang lands in the body’s 8px of left padding. Widening the rail
per entry would move the axis for one event. A timeline whose markers are all
wide widens
timeline-railin its own stylesheet. - The marker names nothing. The entry is still announced by its label and time, and §10’s “the connecting line is a drawing” covers the axis.
isModal
A wizard is not its second consumer. §6 makes the wizard’s content area a
focus-scope: Next moves focus to the new page, and nothing is trapped. A
wizard is written inline in a window, and isModal traps the keyboard and,
since ADR-0232, the pointer, so an inline wizard declaring it would stop the
rest of the window taking input. A wizard shown inside a dialog is already
trapped by the dialog. sheet is not built. The entry stays open and now names
sheet alone.
Consequences
- ADR-0344’s and ADR-0345’s “not built” lines are corrected in
TODO.md,docs/core-widgets.md§6 and §10, andcontrols.css. - The box tree under every step connector gains one node. A list of N steps paints N−1 more boxes, each a 2px line.
markeris a markup name. It is only meaningful insideentry, and elsewhere it inflates to a description that draws nothing, which ispage’s behaviour outside awizard.- The showcase’s
Chroniclegives Rivendell anIXbadge marker, andgallery-collectionsis 1040 tall so the card is photographed whole. timeline-badges-dark.pngis a new golden: a successv2, a one-digit3that is exactly the rail’s width, and a dot after them.