Narrative + layout primitives
A one-window tour of the read-only widget families: narrative text, layout primitives, display widgets, and the flat tooltip form. Each widget renders into a single panel sized for an APNG recording; the driver moves a cursor across them with a spoken line per group.
Source: examples/tutorial/narrative_layout_tour.das.
The recording is voiced and self-verifying: most of these widgets take no input, so each beat narrates a group while the cursor points and asserts the widget rendered and echoed its string. The final beat rests the cursor on the button and asserts the flat tooltip actually fired. A missing or wrong value aborts the recording at teardown instead of shipping.
What the tour shows
The widgets, in order of appearance:
text(IDENT, (text = "..."))— one-line, no wrap. Telemetry carries the source string.text_wrapped(IDENT, (text = "..."))— reflows to the window’s right edge; the snapshot still carries the full unwrapped string.text_colored(IDENT, (color = float4(...), text = "..."))— arbitrary RGBA tint.text_disabled(IDENT, (text = "..."))— the ImGui disabled-text color (greyed-out hint style).bullet_text(IDENT, (text = "..."))— bullet marker + text in a single call.label_text(IDENT, (key = "Version", value = "v2.0-detour"))— ImGui’s two-string form: value at the cursor, label to its right.separator_text(IDENT, (text = "..."))— inline section header. Paired withdummy((size = float2(0, 8)))for inter-section gap.progress_bar(IDENT, (fraction, size, overlay))— driven by a per-frame counter inupdate().button(HOVER_TIP, ...)+set_item_tooltip(IDENT, (text = "..."))— the flat tooltip form. Fires on hover over the previous item; no[container]body needed.
Driving the tour
Standalone:
daslang modules/dasImgui/examples/tutorial/narrative_layout_tour.das
Live (with reload):
daslang-live modules/dasImgui/examples/tutorial/narrative_layout_tour.das
The standalone form opens a window with the static layout. The driver
under tests/integration/record_narrative_layout_tour.das spawns it,
speaks a line per group while pointing the cursor, and verifies each
widget — see Recording tutorial videos.
Idents matter for recordings
Each widget takes an explicit IDENT (INTRO, WRAP, etc.).
Without one, the [widget] macro falls back to a path keyed by
source-file line/column (TOUR_WIN/:66:8) — those resolve fine for
in-process telemetry, but break the moment the file is edited and a
recording driver tries to widget_center(snap, "TOUR_WIN/WRAP").
Stable idents keep the driver-script paths file-edit-resistant.
See also
Full source: examples/tutorial/narrative_layout_tour.das
Recording driver: tests/integration/record_narrative_layout_tour.das.
Containers — the [container] family
counterpart (these are flat [widget] calls; no body).
Recording — the two-shell driver setup that produces APNGs like the one above.