Skip to content

feat: workbench chrome: header project chip, one band with attached tabs, view-keyed Tree - #426

Open
Yona-Appletree wants to merge 16 commits into
mainfrom
claude/gracious-mclaren-6938a9
Open

feat: workbench chrome: header project chip, one band with attached tabs, view-keyed Tree#426
Yona-Appletree wants to merge 16 commits into
mainfrom
claude/gracious-mclaren-6938a9

Conversation

@Yona-Appletree

@Yona-Appletree Yona-Appletree commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator

Plan: lp2025/2026-08-14-0826-workbench-bar-chrome
Path: ~/.photomancer/planning/lp2025/2026-08-14-0826-workbench-bar-chrome/plan.md

Implements the converged round-6 chrome direction (vision D7–D13; spike = spikes/studio-chrome/index.html, rounds 1–6 in this branch's history — the design record rides this PR).

Three bands = three ownership levels:

  • Site header = project: chip (state glyph + name + amber dirty count, affordance-toned) opening the existing ProjectDetailSections popover
  • Workbench band = views + panels: [Tree] · Nodes Map · [right panel tabs] — one band, attached tabs, persistent-on-collapse tab rows
  • Docks = panel bodies with Finder-style summary footers

Phases (all complete):

  • P1 view-primary substrate (4dfa89489) — byte-identical oracle held (no baseline drift on its push)
  • P2 Tree merge + footers (1a9f51374)
  • P3 the band, Map label (0d7ab2b9d)
  • P4 header chip; root-card [i] retired (b78754a88)
  • Gate G1 answered by Yona 2026-08-14 — fixes landed: popover stale-pin engine fix (0ab428c8d), shared Tree Save/Revert row + state-toned chip (bc809a811), fold moved 960→820 so md keeps real docks (21bf52e6d)
  • P5 stories + ADR feat: The studio workbench — IDE chrome with docked panels #413 amendment + docs (313b4e707)

Follow-up (chipped, per G1): group the device + project header cluster (task started separately).

Coordination: the parallel R5 patching-view plan consumes this model. This PR does NOT touch /patch, PatchSurfacePage, PatchToggle, route parsing, or the authored/effective tree grain (all R5).

🤖 Generated with Claude Code

Yona-Appletree and others added 10 commits August 14, 2026 09:29
…iew tabs)

Per vision dir 2026-08-14-0826-workbench-bar-chrome: promote the sm summon
strip to the universal chrome bar. §1 reproduces the shipped #413 chrome as
the baseline; §2 is the live bar (project chip w/ popover, radio toggles,
draggable dome -> dirty); §3 Q1 underline-vs-segmented + Q2 chip content;
§4 md/sm folds w/ Props summonable; §5 gate questions R4-1..R4-4.

Co-Authored-By: Claude Fable 5 <[email protected]>
…one band (B)

Round-4 lg bar rejected (toggles read disconnected from panels); md/sm kept.
A = GitHub object band: chip+name / view tabs / Save-when-dirty + Share +
corner region toggles, docks with attached y-compact tab rows + Finder-style
footers. B = today's one-band structure with the attached treatment in place,
tab rows persist on collapse. Gate questions R5-1..R5-5.

Co-Authored-By: Claude Fable 5 <[email protected]>
…ode segment deleted

Yona's ruling: Map and Patch are siblings (matches shipped /patch route +
R5 authored-vs-effective grain split). View tabs = Nodes/Mapping/Patching
everywhere; toolbar is per-view (patch verbs on the Patching view); Patching
dock defaults = Fixtures + Outputs; sm seg compressed to fit three.

Co-Authored-By: Claude Fable 5 <[email protected]>
Round-5 rulings applied: B chosen; project chip + share move UP to the site
header (Google-Docs pattern, supersedes vision D3 — deliberate reversal);
Nodes+Fixtures panels MERGE into one view-keyed Tree (assembly/authored/
effective per view — the enabler the R5 patching plan needs); Map·Patch over
gerunds. Chip-home comparison strip + tree-grain strip; A and the round-4 bar
to the rejected list. Gate questions R6-1..R6-4.

Co-Authored-By: Claude Fable 5 <[email protected]>
The workbench model becomes data-driven and N-view-ready with zero
visual change: a VIEWS table (label + route slot) drives the view tabs
and the summon strip's view segment; PanelId::strip becomes the free
roster(view, side) table; the ratified dock defaults move to
defaults(view); PanelMemory becomes a view-keyed map seeded lazily from
those defaults; the hard-coded (workspace, mapping) href tuple becomes
the per-view WorkbenchHrefs collection threaded through StudioShell.

Unit tests pin the roster/defaults tables, the per-view memory
seeding/radio-toggle semantics, and the view<->route round trip.

Plan: lp2025/2026-08-14-0826-workbench-bar-chrome
Signed-off-by: Yona Appletree <[email protected]>
One left panel named Tree replaces the Nodes and Fixtures panels: a
panel is a ROLE and the view supplies its body — the project's node
tree (embedded ProjectPane) on the Nodes view, today's fixture tree
(mixed grain, deliberate until R5) on the Mapping view. Defaults become
Nodes→(Tree, Device), Mapping→(Tree, Props).

The Fixtures panel's top summary line moves to a dock-bottom footer
owned by the dock composition (panel_footer declares per (panel, view)),
and the SummonStrip now renders its buttons from roster(), which makes
Props summonable below the fold for free.

Plan: lp2025/2026-08-14-0826-workbench-bar-chrome
Signed-off-by: Yona Appletree <[email protected]>
…, Map label (P3)

Dock tab rows, view tabs, and edge strips merge into ONE band across
the workbench top (D7): each dock's tab segment is sized by the shared
dock-width constants so tabs sit exactly over their docks, with the
view tabs centered between them. Panel tabs wear the ATTACHED
treatment — the active tab shares the dock fill and breaks the band's
bottom hairline — and pressing it collapses the side, whose tab row
persists inactive as the reopen affordance (D11). EdgeStrip, DockTab,
and the «» hide chevrons are deleted; PanelDock is body + footer only.
View tab label Mapping → Map (D9; route strings unchanged).

Plan: lp2025/2026-08-14-0826-workbench-bar-chrome
Signed-off-by: Yona Appletree <[email protected]>
…ires (P4)

The site header carries the project chip (D8, Google-Docs pattern):
state glyph from the affordance vocabulary + project name + amber
unsaved count, opening the existing ProjectDetailSections popup
(Save/Revert/per-entry revert/Share/stats) as a DetailPopover custom
trigger. Mounted UNGATED so it is present at every header width — one
mount, no top-layer/container-query workaround (Q10). Presentation
only: web_app builds ChromeProjectChip from the editor pane's own view
and status; zero new state.

The workspace root card's [i] project mount retires (D5/Q11): NodePane
and NodeDetailPopover lose the project slot, ProjectNodeWorkspace no
longer threads it, and the workbench_root_card_project_popup story
documenting that mount is deleted. The non-workbench ProjectPane
header mount stays — other routes still use it.

Plan: lp2025/2026-08-14-0826-workbench-bar-chrome
Signed-off-by: Yona Appletree <[email protected]>
@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

CI refreshed the story baselines on this branch

The validate-stories job detected drift and committed the fresh set: 6 added
in bf93163.

Review every PNG in the PR's Files changed view (swipe / onion-skin).
Your local branch is now behind — git pull before pushing again.

Story Before After
studio__layout__site-chrome__project-chip-popover-open__lg.png studio__layout__site-chrome__project-chip-popover-open__lg.png@bf931632bc
studio__layout__site-chrome__project-chip-popover-open__md.png studio__layout__site-chrome__project-chip-popover-open__md.png@bf931632bc
studio__layout__site-chrome__project-chip-popover-open__sm.png studio__layout__site-chrome__project-chip-popover-open__sm.png@bf931632bc
studio__layout__site-chrome__project-chip-states__lg.png studio__layout__site-chrome__project-chip-states__lg.png@bf931632bc
studio__layout__site-chrome__project-chip-states__md.png studio__layout__site-chrome__project-chip-states__md.png@bf931632bc
studio__layout__site-chrome__project-chip-states__sm.png studio__layout__site-chrome__project-chip-states__sm.png@bf931632bc

A measurement rAF queued while a popover is open can fire after the
closed render and imperatively re-pin the in-flow trigger's inline
width/height (trigger_rect_by_id restores what it removes). The closed
VDOM style string carries no pin, so the stale pin was never rewritten —
the trigger froze at its open-state size forever, truncating any
trigger whose content grows while closed. Surfaced by the header
project chip: open the popup once while clean, and the pencil+count
that appears on the first edit had to squeeze into the clean-state
width ('Min…' instead of 'Mini Dome 1').

Queue a clear behind the stale rAF at close time; a reopen re-pins via
the placeholder class, which the clear respects.

Plan: lp2025/2026-08-14-0826-workbench-bar-chrome
Signed-off-by: Yona Appletree <[email protected]>
G1 answers 3a/3b: the Save/Revert actions and the debug chip move from
the Nodes view's embedded ProjectPane into TreePanelActions — one row
rendered by the Tree panel composition on EVERY view's Tree body, so
the Map view offers the same save affordances and the two can never
drift. The header chip's button now wears the affordance's status tone
itself (quiet / working / yellow unsaved / hazard debug / red error,
open variants included) via affordance_chip_class — the state is the
chip, not just its glyph.

Plan: lp2025/2026-08-14-0826-workbench-bar-chrome
Signed-off-by: Yona Appletree <[email protected]>
… (G1 fix)

G1 answer 1: at ~925px the workbench was already below the 960 fold, so
opening any panel summoned it over the WHOLE view (the #413 phone
model) where a dock taking a portion was expected. The fold moves to
820px: mid widths keep the band + fixed-width docks (center stays
usable at the md dock tier), and the full-view summon model is reserved
for genuinely narrow screens.

Plan: lp2025/2026-08-14-0826-workbench-bar-chrome
Signed-off-by: Yona Appletree <[email protected]>
…(P5)

Workbench story descriptions catch up with the band model (attached
tabs, persistent-on-collapse rows, the view-keyed Tree, the 820px
fold); site-chrome grows the project chip stories — the four states
(clean / unsaved / failed / narrow) and the popover-open capture, which
needs no narrow-frame caveat because the chip is one ungated mount
(ChromeProjectChip grows a stories-only initially_open).

The #413 PanelDock ADR gains its Amended 2026-08-14 section: one band
(D7), persistent collapse (D11), the Tree merge and 'one panel, one
ROLE' roster model (D10/D12/D13), the D3 reversal re-housing the
project identity onto the header chip (D8), Nodes-Map labels (D9), and
the 820px fold ruling from G1 — plus the recorded follow-up on the
project-chip/session-chip grouping. README chrome paragraph updated.

Plan: lp2025/2026-08-14-0826-workbench-bar-chrome
Signed-off-by: Yona Appletree <[email protected]>
@Yona-Appletree
Yona-Appletree marked this pull request as ready for review August 15, 2026 02:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant