Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
127e171
[#139] Documented the anatomy of a widget.
AlexSkrypnyk Jul 29, 2026
d625631
[#139] Drew the anatomy diagrams with Unicode borders.
AlexSkrypnyk Jul 29, 2026
23583ec
[#139] Marked each anatomy part beside the part itself.
AlexSkrypnyk Jul 29, 2026
67ac2af
[#139] Marked the anatomy parts with circled numbers.
AlexSkrypnyk Jul 29, 2026
5fac054
[#139] Rendered the widget anatomy as an annotated SVG.
AlexSkrypnyk Jul 29, 2026
bd3c629
[#139] Placed the anatomy labels either side of the frame.
AlexSkrypnyk Jul 29, 2026
548cf36
[#139] Numbered the anatomy parts and embedded the diagrams.
AlexSkrypnyk Jul 29, 2026
1b5418f
[#139] Pointed lime arrows at the anatomy parts from all four sides.
AlexSkrypnyk Jul 29, 2026
2a957c2
[#139] Straightened every anatomy leader by fitting a label to its row.
AlexSkrypnyk Jul 29, 2026
2fdabdc
[#139] Showed the constraint and the error as two shots of one picker.
AlexSkrypnyk Jul 29, 2026
fd1ef6a
[#139] Showed the row parts across several fields of one form.
AlexSkrypnyk Jul 29, 2026
48c577a
[#139] Gave a repeated part one number and an arrow per occurrence.
AlexSkrypnyk Jul 29, 2026
fd66a7f
[#139] Stood the anatomy brackets off the text they point at.
AlexSkrypnyk Jul 29, 2026
3951b43
[#139] Drew a constraint in the guidance voice, not the description's.
AlexSkrypnyk Jul 29, 2026
2dfa2f2
[#139] Gave the guidance voice a colour every surface can carry.
AlexSkrypnyk Jul 29, 2026
afd2664
[#139] Carried the guidance voice down to a plain terminal.
AlexSkrypnyk Jul 29, 2026
0dfaf9e
[#139] Moved the key legend callout to the left margin.
AlexSkrypnyk Jul 29, 2026
956b51d
[#139] Sat the highlighted entry's detail against the list it follows.
AlexSkrypnyk Jul 29, 2026
4ec4cb8
[#139] Named the parts for what a reader sees, and the atoms that dra…
AlexSkrypnyk Jul 29, 2026
3981213
[#139] Explained how each atom behaves, and tracked what is still open.
AlexSkrypnyk Jul 29, 2026
3051505
[#139] Marked every atom mention and named the widgets behind the fra…
AlexSkrypnyk Jul 29, 2026
4cdf574
[#139] Renamed the key legend to the legend, and stated the atom rule.
AlexSkrypnyk Jul 29, 2026
cd10d50
[#139] Split selecting from marking, and named the breadcrumb separator.
AlexSkrypnyk Jul 29, 2026
49639c1
[#139] Moved a field's long text behind '?' and framed the two modes.
AlexSkrypnyk Jul 29, 2026
f9bcbda
[#139] Marked a field that has help, and kept its text out of the row.
AlexSkrypnyk Jul 29, 2026
43ffd95
[#139] Gave the entry description its own voice and the help mark the…
AlexSkrypnyk Jul 29, 2026
cea80ec
[#139] Named the two separators and marked a multi-part value.
AlexSkrypnyk Jul 29, 2026
3266346
[#139] Collapsed the page into two modes, each numbering its own parts.
AlexSkrypnyk Jul 29, 2026
5ffcbac
[#139] Read a legend entry as 'KEY to action', in three named atoms.
AlexSkrypnyk Jul 29, 2026
1f97dcb
[#139] Cleared the legend risers of the labels above them.
AlexSkrypnyk Jul 29, 2026
a787140
[#139] Turned the atom columns into the target contract and listed th…
AlexSkrypnyk Jul 29, 2026
2237736
[#139] Let case alone set a legend key apart from what it does.
AlexSkrypnyk Jul 29, 2026
a25f075
[#139] Let a widget's own bindings resolve its legend, and gave '?' t…
AlexSkrypnyk Jul 30, 2026
8a22eab
[#139] Split the window chrome out of view mode on the anatomy page.
AlexSkrypnyk Jul 30, 2026
e1b2f8c
[#139] Named the interface pieces 'atoms' and cut the page's own read…
AlexSkrypnyk Jul 30, 2026
fff9cf4
[#139] Recorded the theme and owner surface for every atom.
AlexSkrypnyk Jul 30, 2026
deb231f
[#139] Described the screen as three sections of widgets drawn from a…
AlexSkrypnyk Jul 30, 2026
2420115
[#139] Settled the four levels a screen is built from.
AlexSkrypnyk Jul 30, 2026
3647f75
[#139] Led the structure page with the hierarchy, and labelled it on …
AlexSkrypnyk Jul 30, 2026
e736fd5
[#139] Emphasised the vocabulary words where the prose uses them.
AlexSkrypnyk Jul 30, 2026
593d4ce
[#139] Rebuilt the structure page around what each level can do.
AlexSkrypnyk Jul 30, 2026
6cc4e26
[#139] Defined every level by the capabilities it claims.
AlexSkrypnyk Jul 30, 2026
6b25fbf
[#139] Separated the four levels from the kinds that fill them.
AlexSkrypnyk Jul 30, 2026
b785ac2
[#139] Gave the layout an axis, and renamed four capabilities.
AlexSkrypnyk Jul 30, 2026
4fd7448
[#139] Settled the capability names, and cut the shipped layouts to two.
AlexSkrypnyk Jul 30, 2026
1f8fb6e
[#139] Renamed the screen's capability to Occupy.
AlexSkrypnyk Jul 30, 2026
5e8639a
[#139] Built layouts with constructors, and gave columns a twelve-uni…
AlexSkrypnyk Jul 30, 2026
503071f
[#139] Sized regions by percentage on either axis, and gave every lev…
AlexSkrypnyk Jul 30, 2026
a61c617
[#139] Sized regions by weight, and shipped layouts as registrable cl…
AlexSkrypnyk Jul 30, 2026
281067f
[#139] Gave a region a flow, so two blocks side by side need no secon…
AlexSkrypnyk Jul 30, 2026
571e5b9
[#139] Made Flow a capability, and gave a region a builder.
AlexSkrypnyk Jul 30, 2026
cb652cd
[#139] Renamed the proportional size to flex.
AlexSkrypnyk Jul 30, 2026
9ddec77
[#139] Let Actions claim Reject, and renamed the block from Buttons.
AlexSkrypnyk Jul 30, 2026
aa36f06
[#139] Listed Flow among the layout's capabilities.
AlexSkrypnyk Jul 30, 2026
70da0c8
[#139] Corrected the count of a field's capabilities.
AlexSkrypnyk Jul 30, 2026
ac8d431
[#139] Said what a panel nests, since it is never blocks.
AlexSkrypnyk Jul 30, 2026
8d719e7
[#139] Named the level the on-screen labels skip.
AlexSkrypnyk Jul 30, 2026
8fb8726
[#139] Gave the theme one tier, and made a block compose it.
AlexSkrypnyk Jul 30, 2026
a44e762
[#139] Renamed the KeyHints block to Legend.
AlexSkrypnyk Jul 30, 2026
6f50cb1
[#139] Captured two blocks in full, and the DSL for patching their el…
AlexSkrypnyk Jul 30, 2026
3a6fbd7
[#139] Made every kind of block a subsection of Block.
AlexSkrypnyk Jul 30, 2026
165067e
[#139] Named a layout that arrives with blocks in it.
AlexSkrypnyk Jul 30, 2026
4c10a71
[#139] Gave Actions and Progress their elements and drawings.
AlexSkrypnyk Jul 30, 2026
e4e614b
[#139] Kept a layout ignorant of the blocks drawn in it.
AlexSkrypnyk Jul 30, 2026
22a2371
[#139] Made the worked tensions read as settled rather than open.
AlexSkrypnyk Jul 30, 2026
fd20c69
[#139] Restored the emphasis on vocabulary words in the tension table.
AlexSkrypnyk Jul 30, 2026
0f7bba5
[#139] Described how a screen is driven, and what survives without one.
AlexSkrypnyk Jul 30, 2026
29fa7e9
[#139] Nested the page into four parts.
AlexSkrypnyk Jul 30, 2026
b2eae88
[#139] Renamed the page to specification.
AlexSkrypnyk Jul 30, 2026
032c8ca
[#139] Added the region: a named container that flows blocks and may …
AlexSkrypnyk Jul 30, 2026
b6228f9
[#139] Added the layout, and the region's half that holds blocks.
AlexSkrypnyk Jul 30, 2026
4cdf279
[#139] Added the screen root and the layout registry.
AlexSkrypnyk Jul 30, 2026
141f95b
[#139] Added the five blocks and the elements each declares.
AlexSkrypnyk Jul 30, 2026
909f384
[#139] Drew a screen: the layout sizes, the region flows, the block r…
AlexSkrypnyk Jul 30, 2026
fdbec9c
[#139] Declared what a theme supports, so an element knows what it ma…
AlexSkrypnyk Jul 30, 2026
6d16329
[#139] Added the panel: the block you can go into.
AlexSkrypnyk Jul 30, 2026
e975ac4
[#139] Added the field: the block that collects, and the only one wit…
AlexSkrypnyk Jul 30, 2026
c3db31f
[#139] Collected a form with no screen at all.
AlexSkrypnyk Jul 30, 2026
06299e4
[#139] Sent a key to the innermost thing that binds it.
AlexSkrypnyk Jul 30, 2026
4b82e62
[#139] Made the simple case simple, and drew a form end to end.
AlexSkrypnyk Jul 30, 2026
27fef30
[#139] Covered the declarations and guards the main paths never reach.
AlexSkrypnyk Jul 30, 2026
115c8db
[#139] Added a playground drawing a screen from the specified levels.
AlexSkrypnyk Jul 30, 2026
9947754
[#139] Found the field to open by id rather than by position.
AlexSkrypnyk Jul 30, 2026
427d284
[#139] Brought the new namespaces in line with the coding standard.
AlexSkrypnyk Jul 30, 2026
c9279cb
[#139] Recorded what the specification has and has not built.
AlexSkrypnyk Jul 30, 2026
444075b
[#139] Cleared the lint warnings and spelling the pipeline rejects.
AlexSkrypnyk Jul 30, 2026
3da3b37
[#139] Formatted the documentation the way the pipeline checks it.
AlexSkrypnyk Jul 30, 2026
2e66f77
[#139] Addressed code review: measured widths, clamped counters, type…
AlexSkrypnyk Jul 30, 2026
3a1de84
[#139] Renamed the widget to the field it always was.
AlexSkrypnyk Jul 30, 2026
c3ed003
[#139] Regenerated the field assets from the renamed renderers.
AlexSkrypnyk Jul 30, 2026
314eeb7
[#139] Declared every block capability as an interface enforced by a …
AlexSkrypnyk Jul 30, 2026
22c6854
[#139] Gave the theme a floor, capability traits and delegating eleme…
AlexSkrypnyk Jul 30, 2026
9da87f4
[#139] Brought the blocks to declaration parity with the model.
AlexSkrypnyk Jul 31, 2026
086e25b
[#139] Made a block panel drivable: capture, bind, and a legend that …
AlexSkrypnyk Jul 31, 2026
831ae26
[#139] Covered the theme traits as traits, and taught the docs suite …
AlexSkrypnyk Jul 31, 2026
a50ec5a
[#139] Made the builders write the block tree, and derived the defini…
AlexSkrypnyk Jul 31, 2026
a665118
[#139] Collected headlessly from the block tree, to the engine's exac…
AlexSkrypnyk Jul 31, 2026
0ba1c39
[#139] Drove a screen through a terminal session, keys inward and dra…
AlexSkrypnyk Jul 31, 2026
544e7cc
[#139] Reached interactive parity: settling, modals, editors, chrome …
AlexSkrypnyk Jul 31, 2026
91d8bb2
[#139] Matched the legacy row: readable values, edge badges, padded a…
AlexSkrypnyk Jul 31, 2026
e83bb2e
[#139] Switched the facade onto the screen driver.
AlexSkrypnyk Jul 31, 2026
788fd0e
[#139] Deleted the parallel implementation: one tree, one driver, one…
AlexSkrypnyk Jul 31, 2026
6ab08f7
[#139] Stepped conditional chains in, and counted what a summary cann…
AlexSkrypnyk Jul 31, 2026
a8e6351
[#139] Converged the theme: two theme-wide methods, elements everywhe…
AlexSkrypnyk Jul 31, 2026
e855b5a
[#139] Let the facade name the screen's layout.
AlexSkrypnyk Jul 31, 2026
ad27cb6
[#139] Proved the playground against the final surface, and showed it…
AlexSkrypnyk Jul 31, 2026
1e5e918
[#139] Reached full Ukrainian parity, guarded from both directions.
AlexSkrypnyk Jul 31, 2026
481e770
[#139] Retired the one fixture nothing exercises.
AlexSkrypnyk Jul 31, 2026
6cf0144
[#139] Made every page tell the truth about the shipped architecture.
AlexSkrypnyk Jul 31, 2026
fbf0994
[#139] Regenerated the corpus on the screen driver, dropping hints wh…
AlexSkrypnyk Aug 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 3 additions & 3 deletions .claude/demo_content_reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ vocabulary below so the docs, the playground scripts, and the screenshots all
read as one consistent world.

Why: the engine is application-agnostic. A neutral, friendly theme keeps the
examples about the *widgets* rather than any particular software stack, and
examples about the *fields* rather than any particular software stack, and
avoids dating the docs to a specific toolchain.

## The scenario
Expand All @@ -26,12 +26,12 @@ fruit, adding vegetables, choosing a quantity, and confirming.
- **Categories**: Fruit, Vegetable, Herb.
- **States**: Ripe / Unripe, Organic / Conventional.

## Canonical widget values
## Canonical field values

Use these exact ids, labels, options and defaults so the code and its screenshot
always match.

| Widget | Label | Default | Options / bounds |
| Field | Label | Default | Options / bounds |
| --- | --- | --- | --- |
| text | `Item` | `Pear` | complete: `Pear`, `Peach`, `Plum` |
| template | `Crate label` | `valley-pear-a` | pattern `{{orchard}}-{{fruit}}-{{grade}}`; slots Orchard, Fruit, Grade (a single letter a-c) |
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/render-tui-diagrams/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ The light render stays the single source of truth; the dark variant is derived f

## Task B - add a new data-flow diagram

1. **Trace the flow from source.** Pick the entry method (e.g. `Engine::collect()`, `PanelController::run()`) and follow it through the classes it calls: `InputResolver`, the discovery specs, `Deriver` + `Derive` + `Transform`, `Condition`, `HandlerRegistry` (reusable static behaviour), then `Answers` / `Theme` / `WidgetFactory` on the way out.
1. **Trace the flow from source.** Pick the entry method (e.g. `Engine::collect()`, `PanelController::run()`) and follow it through the classes it calls: `InputResolver`, the discovery specs, `Deriver` + `Derive` + `Transform`, `Condition`, `HandlerRegistry` (reusable static behaviour), then `Answers` / `Theme` / `FieldFactory` on the way out.
2. **Create** `docs/architecture/dataflow-<flow>.puml` from the template below.
3. **Fill** the participants and messages from the real call path: solid arrows (`->`) for the forward path, dashed (`-->`) for returns. Mirror `dataflow-collect.puml`.
4. **Render and derive** it: `plantuml -tsvg docs/architecture/dataflow-<flow>.puml`, then `node docs/util/derive-dark-diagram.js docs/architecture/dataflow-<flow>.svg` for the dark variant.
Expand Down
18 changes: 9 additions & 9 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -186,33 +186,33 @@ After a structural change, update them with the `render-tui-diagrams` skill.

### Terminal SVG assets

Every widget and every primitive carries a full set of terminal SVGs under
Every field and every primitive carries a full set of terminal SVGs under
`docs/assets/` - light and dark, in all four display modes (Unicode/ASCII,
colour on/off) - embedded in the README and the docs pages. Anything that
moves also carries an animated variant beside its static one; a subject with
no motion to record (the output primitives, which write finished lines and
return) is static-only by design. They render deterministically (no pty) from
the scripts in `docs/util/`:
`render-widget-svgs.php` for widgets, `render-progress-svgs.php` for the
`render-field-svgs.php` for fields, `render-progress-svgs.php` for the
progress primitive, `render-output-svgs.php` for the output primitives (static
only - they write finished lines, so there is no motion to record), and
`render-theme-svgs.php` for theme previews, all run by `update-assets.php`. The
naming convention lives in `docs/assets/README.md`.

Whenever you add a widget or a primitive, do all of the following before
Whenever you add a field or a primitive, do all of the following before
opening a PR:

- Add a spec to the matching renderer and generate its variants with it: a
widget's spec (form, keystrokes, rows) goes in `widgetSpecs()` in
`render-widget-svgs.php` for 16 variants; a primitive's goes in the renderer
field's spec (form, keystrokes, rows) goes in `fieldSpecs()` in
`render-field-svgs.php` for 16 variants; a primitive's goes in the renderer
that suits how it draws - `progressSpecs()` in `render-progress-svgs.php`
when it animates, `outputSpecs()` in `render-output-svgs.php` when it does
not. Run `php docs/util/render-<kind>-svgs.php <name>` to generate them.
- For a widget only, regenerate the all-widgets montage so the gallery includes
it: `php docs/util/update-assets.php --record widgets`. A primitive is not in
- For a field only, regenerate the all-fields montage so the gallery includes
it: `php docs/util/update-assets.php --record fields`. A primitive is not in
the montage, so it skips this step.
- Add its documentation page and a `docs/sidebars.js` entry: a widget goes in
`docs/content/widgets/<name>.mdx` (mirror `pause.mdx`), a primitive at the
- Add its documentation page and a `docs/sidebars.js` entry: a field goes in
`docs/content/fields/<name>.mdx` (mirror `pause.mdx`), a primitive at the
top level in `docs/content/<name>.mdx` (mirror `progress.mdx`).
- Run `php docs/util/audit-svgs.php` - it must stay green, and every dark asset
needs its light twin.
Expand Down
Loading
Loading