Sub-issue of #13158 (dock layouts). Reported by the operator on the Workstation, 2026-09-02 ~16:20Z: maximizing the Queues pane fills half the screen while maximizing other items fills it all; and the intent, stated with it: maximize should fill the workspace (not the viewport), with a slight gap and a box-shadow. #18027 (the FLIP flash) is the neighbour and does not cover this.
Measured (served Workstation, 1280×720 CSS px, DPR 2)
Neo.dashboard.dock.Workspace#measureDockMaximizeRect measures the workspace root (me.id), which on the Workstation is the whole app view: {x: 0, y: 0, w: 1239, h: 720} — the viewport, tour bar and status bar included. The dock host (getDockHost(), .neo-dashboard-dock-query-host) is {x: 0, y: 98, w: 1239, h: 622}.
- Maximizing the center node
right-top-tabs (Metrics) writes left: 0; top: 0; width: 1239px; height: 720px and renders exactly that: the app viewport.
- Maximizing the edge-band node
left-tabs (Queues) writes the same inline rect but renders 640 × 720 — half the viewport — because .neo-dashboard-dock-edge-band keeps max-inline-size: var(--dock-edge-band-left-max-inline-size, var(--dock-edge-band-max-inline-size, 50%)) (and its min/inline-size) under .neo-dock-maximized; a max-* constraint applies to an inline width too. Center nodes carry no such cap, which is the asymmetry the operator saw.
- The containing block is the viewport for both (the maximized node is
position: fixed; the dock host's container-type: size does not capture it in Chrome), so the written rect is in viewport coordinates.
The Fix
- Fill the dock host.
measureDockMaximizeRect measures getDockHost() (fallback: the workspace root when no host is mounted). The resize re-measure follows the same source.
- Gap and shadow as tokens on
.neo-dashboard, owned by the paint contract, never a literal in the worker: --dock-maximize-gap (engine default a slight inset) and --dock-maximize-shadow (a neutral soft shadow, like the drop chips'). The worker writes the rect as calc() against the gap token — left: calc(<x>px + var(--dock-maximize-gap)), width: calc(<w>px - 2 * var(--dock-maximize-gap)), likewise top/height — so the token resolves in CSS and a consumer tunes it without touching the engine; the FLIP still measures the DOM and is unaffected.
- Lift the band caps under maximize:
.neo-dashboard-dock-edge-band.neo-dock-maximized clears max-inline-size / max-block-size / min-* for the maximized node only, so an edge-band pane maximizes to the same rect as a center pane.
Acceptance Criteria
Out of Scope
- The FLIP flash (#18027).
- A consumer-tuned gap per app (the tokens make it possible; the Workstation keeps the engine default unless the operator asks).
Sweep 16:20Z before filing: live latest-open (#18027 is the only maximize ticket, on the FLIP flash), A2A (no claim), Knowledge Base (no leaf).
Authored by Mnemosyne (@neo-fable, Claude Fable 5.1, Claude Code) · session 37bbc610-f0cd-4abb-95c2-eb70336a86f3
Sub-issue of #13158 (dock layouts). Reported by the operator on the Workstation, 2026-09-02 ~16:20Z: maximizing the Queues pane fills half the screen while maximizing other items fills it all; and the intent, stated with it: maximize should fill the workspace (not the viewport), with a slight gap and a box-shadow. #18027 (the FLIP flash) is the neighbour and does not cover this.
Measured (served Workstation, 1280×720 CSS px, DPR 2)
Neo.dashboard.dock.Workspace#measureDockMaximizeRectmeasures the workspace root (me.id), which on the Workstation is the whole app view:{x: 0, y: 0, w: 1239, h: 720}— the viewport, tour bar and status bar included. The dock host (getDockHost(),.neo-dashboard-dock-query-host) is{x: 0, y: 98, w: 1239, h: 622}.right-top-tabs(Metrics) writesleft: 0; top: 0; width: 1239px; height: 720pxand renders exactly that: the app viewport.left-tabs(Queues) writes the same inline rect but renders 640 × 720 — half the viewport — because.neo-dashboard-dock-edge-bandkeepsmax-inline-size: var(--dock-edge-band-left-max-inline-size, var(--dock-edge-band-max-inline-size, 50%))(and its min/inline-size) under.neo-dock-maximized; amax-*constraint applies to an inline width too. Center nodes carry no such cap, which is the asymmetry the operator saw.position: fixed; the dock host'scontainer-type: sizedoes not capture it in Chrome), so the written rect is in viewport coordinates.The Fix
measureDockMaximizeRectmeasuresgetDockHost()(fallback: the workspace root when no host is mounted). The resize re-measure follows the same source..neo-dashboard, owned by the paint contract, never a literal in the worker:--dock-maximize-gap(engine default a slight inset) and--dock-maximize-shadow(a neutral soft shadow, like the drop chips'). The worker writes the rect ascalc()against the gap token —left: calc(<x>px + var(--dock-maximize-gap)),width: calc(<w>px - 2 * var(--dock-maximize-gap)), likewise top/height — so the token resolves in CSS and a consumer tunes it without touching the engine; the FLIP still measures the DOM and is unaffected..neo-dashboard-dock-edge-band.neo-dock-maximizedclearsmax-inline-size/max-block-size/min-*for the maximized node only, so an edge-band pane maximizes to the same rect as a center pane.Acceptance Criteria
DockMaximize.spec.mjs, the fixture has a right edge band): a maximized center node's rect equals the dock host's rect inset by the gap on every side, not the viewport; red ondev(today it equals the workspace root).edge-tabs) renders the same rect as the center node; red ondev(today it stops at half).max-inline-size; Escape restores as before.component/dashboard+unit/dashboardstay green.Out of Scope
Sweep 16:20Z before filing: live latest-open (#18027 is the only maximize ticket, on the FLIP flash), A2A (no claim), Knowledge Base (no leaf).
Authored by Mnemosyne (@neo-fable, Claude Fable 5.1, Claude Code) · session 37bbc610-f0cd-4abb-95c2-eb70336a86f3