Skip to content

apps/diagram — delivery plan

Audience: contributors. Execution-only; IDs refer to the feature requirements. Parent phase: ui-app PLAN, phase 3.

Two commit series, stacked (gh stack), each commit green on its own.

Series 1 — the MVP board

StepDeliverableIDs
D1.1Scaffold: apps/diagram + root subPackage, both configurations, runApp component that clears to the theme page and quits on q/EscDIA1DIA4
D1.2camera.d + the full pure test table (round-trips, pivot-stable zoom, unbounded pan, culling rects, minimap math)CAM1CAM5
D1.3world.d: columns, spawn/free free-list, groups, edges; unit testsWLD1WLD4
D1.4systemInput: create/select/marquee/move/pan/zoom/minimap scrub, capture owners; scripted-event tests via runAppRecordedIXN1IXN4
D1.5Render systems: board (grid, nodes, marquee) + minimap + status chrome into one op buffer; cull test; @nogc frame assertionRND1, RND2, RND4, RND5, DIA5

Gate: both configurations build; the scripted session suite passes headlessly; the isolation grep (DIA2) finds nothing; a manual GUI + TUI smoke run.

Series 2 — menus, structure, connectors

StepDeliverableIDs
D2.1Context menu + dismissal chain; DeleteIXN5, IXN6
D2.2Group / ungroup, group-aware move and outlinesWLD2
D2.3Labels: LineEditState edit, commit/dismiss, renderIXN5
D2.4Connectors: connect tool + orthogonal box-drawing routes with arrowheads; edge delete cascadeIXN2, WLD3, RND3
D2.5Fit-all + minimap toggle polish; final scripted-session sweepIXN4

Gate: the full UX table exercised by scripted tests where expressible and by the manual pass where not; isolation grep again; dub test :diagram green on ldc2 and dmd.

Verification

bash
dub test :diagram
dub build :diagram && dub build :diagram -c no-gui
dub run :diagram -- --tui
dub run :diagram -- --gui --window-width 120 --window-height 40
rg -n "ui_tui|ui_raylib|sparkles\.tui|import raylib" apps/diagram/   # no matches

Series 3 — the settings pane

StepDeliverableIDs
D3.1GridConfig carries its own property-tree metadata (@Label/@Doc/@Range) in sparkles:ui; settings.d declares the subjectSET4, SET7
D3.2settings_pane.d: the modal PropertyTree component + the settings keymap scope, replacing the three-fixture stand-inSET1SET3, SET6
D3.3Persist through the GRD8 schema; the pane paints on the board's op bufferSET5, SET8

Gate: dub test :diagram green; both configurations build; the isolation grep (DIA2) still finds nothing; the pane opens, edits, undoes and saves in a manual --tui and --gui pass.