feat(ui): flat filled rectangles for demo overlays (#22, ADR-0047 D4)

Render the keystroke badge and step caption as a solid yellow rectangle
with no border glyphs and a one-cell text margin, instead of a
rounded-border box — deliberately unlike the app's bordered panels so
the demo overlays read as a distinct, eye-catching callout. Shared
fill_overlay_rect helper (borderless Block fill + inset Paragraph).
Snapshots regenerated; ADR-0047 D4 wording updated.
This commit is contained in:
claude@clouddev1
2026-06-11 08:40:07 +00:00
parent 241f60c503
commit 2d0f4b2958
7 changed files with 76 additions and 71 deletions
+25 -16
View File
@@ -186,12 +186,21 @@ confirmed by test if live `--demo` on Windows is exercised.)*
### D4 — Both overlays are floating boxes at the output panel's inner bottom-right
The badge and the caption both render as **floating, bordered boxes
anchored to the inside of the output panel's bottom-right corner**
(inset one cell from the panel's inner edge), drawn **last over the base
render** — after modals, so they remain visible while the load-picker
(the `#24` cast) or any modal is up, and with **no layout reflow**
(consistent with the modal / nav-overlay precedent; honours R8).
The badge and the caption both render as **floating, flat filled
rectangles anchored to the inside of the output panel's bottom-right
corner** (inset one cell from the panel's inner edge), drawn **last over
the base render** — after modals, so they remain visible while the
load-picker (the `#24` cast) or any modal is up, and with **no layout
reflow** (consistent with the modal / nav-overlay precedent; honours
R8).
**Flat rectangle, not a bordered box (user decision, post-build).** The
overlays draw as a **solid yellow rectangle with no border glyphs** and
a one-cell margin around the text — deliberately *unlike* the app's
rounded-border panels, so they read as a distinct callout that "stands
out nicely" rather than as another panel. Implemented with a borderless
`Block` fill (the `paint_background` mechanism) plus a `Paragraph` inset
into a one-cell `Margin`.
The top-level `render()` does not currently know the output-panel rect
(it is computed inside `render_right_column`), so a **new field
@@ -204,19 +213,19 @@ When **both** are present, the **keystroke badge stacks directly above
the caption box** (both right-aligned in the corner) so they never
overlap.
**Styling — deliberately high-contrast:** **black text on a yellow
background**, bold, bordered — hard to overlook, identical in light and
dark themes (a fixed high-contrast pair centralised in `theme.rs`, not
theme-derived).
**Styling — deliberately high-contrast:** **bold black text on a yellow
fill** — hard to overlook, identical in light and dark themes (a fixed
high-contrast pair centralised in `theme.rs`, not theme-derived).
**Caption sizing (user-confirmed).** The caption is **word-wrapped to at
most 3 lines** within a content width of `min(40, output_inner_width
6)` columns, ellipsised beyond the third line. So the caption box is
**35 rows** tall (13 text rows + 2 border), its height varying with
the text — a full sentence fits without forcing the author to split it,
while the 3-line cap keeps it corner-sized. The **badge** box is always
a single short token (`[TAB]` `[SHIFT-TAB]`), so it is a fixed **3
rows** (1 text + 2 border), narrow.
4)` columns, ellipsised beyond the third line. So the caption rectangle
is **35 rows** tall (13 text rows + a one-cell margin top and bottom),
its height varying with the text — a full sentence fits without forcing
the author to split it, while the 3-line cap keeps it corner-sized. The
**badge** rectangle is always a single short token (`[TAB]`
`[SHIFT-TAB]`), so it is a fixed **3 rows** (1 text row + the margin),
narrow.
**Clamping (runda finding).** Stacked, the two boxes are up to 8 rows
(5 caption + 3 badge); the output panel's inner height is only `Min(5)`,