Skip to content

Preview workspace slice 4 — pane-scoped controls and focused-pane chrome #945

Description

@jeonghun-jj-lee

Important

Problem -- #944 creates multiple live Preview panes, but the former single-pane controls cannot remain shared. Researchers need to tell which pane receives a new file and adjust one pane's zoom without changing another. This must happen without duplicating the renderer-owned preview/edit state or recreating a moved renderer.

Approach -- Add pane-scoped presentation around the existing renderer controls. Each leaf owns only its zoom value and focus chrome. The renderer continues to own its own preview/edit mode, document state, local scroll, and control behavior. When a tab moves, its stable renderer host adopts the destination pane's zoom accessor without being recreated.

Scope -- in: independent pane zoom values, wiring existing controls to the active pane, focused-pane indication, destination-pane zoom adoption after transfer, and browser coverage for these behaviors. Out: a new editor control implementation, a duplicated preview/edit mode store, breadcrumb navigation, renderer lifecycle changes, draft storage, scroll persistence, or automatic tab eviction.

Assumptions -- #942 through #944 are green. Every leaf has a stable identity and the renderer pool can relocate a host without recreation. The existing Preview renderer already provides the zoom and preview/edit controls; this slice scopes their inputs rather than replacing their UI logic.

Acceptance Criteria

  • Each leaf pane has its own stored zoom value, initially inheriting the source pane's value when the leaf is created.
  • Changing zoom in one visible pane does not change any other pane's zoom.
  • Existing zoom controls, wheel/pinch zoom behavior, and category-aware effective zoom continue to run through the baseline renderer path.
  • A renderer host moved to another pane adopts the destination pane's zoom value without recreation, document replacement, focus loss, or scroll restoration.
  • Markdown preview/edit mode remains renderer-owned and file-local. This slice does not create a pane-level mode store or duplicate an existing mode value.
  • The focused pane has a clear non-disruptive visual indicator. Clicking its tab strip or content, completing an open, or completing a successful transfer/split updates that indicator through Preview workspace slice 3 — drag-first pane tree and renderer relocation #944's focused-pane route.
  • Dirty indicators and close controls appear correctly in every leaf tab strip using Preview workspace slice 2 — persistent renderer pool and inner tabs #943's dirty boolean and close behavior.
  • Hidden inactive renderer hosts do not expose interactive controls or receive pointer input.
  • The focused-pane indicator and controls do not move editor focus to the composer or alter renderer scroll state.
  • Browser tests prove two panes can hold different zoom values, a moved renderer adopts the destination value while retaining identity and content, and focused-pane chrome tracks actual pane targeting.

Key Decisions

Zoom belongs to a pane; mode belongs to a renderer. Zoom describes the viewport into a leaf pane. Preview/edit mode describes the individual file renderer currently shown there. Keeping those scopes separate avoids turning renderer-owned state into workspace data.

This is control wiring, not a control rewrite. The existing Preview renderer remains responsible for its controls' rendering, wheel behavior, and category semantics. The workspace supplies the pane-local zoom accessor and does not import or reimplement CodeMirror behavior.

Focused-pane chrome is observational. It communicates routing state but does not steal focus, mutate a document, or create a second active-editor model.

Testing Decisions

Extend the real-browser suite with a two-pane fixture that verifies:

  • independent zoom values remain independent after repeated tab changes;
  • a transfer relocates the same renderer host and applies destination-pane zoom;
  • Markdown edit mode remains local to the renderer across pane targeting;
  • clicking panes, splitting, and transferring updates visual focused-pane chrome;
  • controls and chrome do not move focus from a visible CodeMirror editor or reset its local scroll.

Unit tests may cover pane-zoom selection and inheritance. Browser tests remain authoritative for renderer identity, control wiring, and focus behavior.

Constraints And Invariants

Source

Part of #940 and ADR 0013. Blocked by #942, #943, and #944. Replaces this issue's former nested-DnD implementation plan; DnD is owned by #944.

Activity

  1. changed the title [-]Preview workspace slice 4 — drag-and-drop: reorder, transfer, edge-split[/-] [+]Preview workspace slice 4 — pane-scoped controls and focused-pane chrome[/+] on Sep 10, 2026
  2. jeonghun-jj-lee commented on Sep 12, 2026

    @jeonghun-jj-lee
    ContributorAuthor

    Implemented. Per-pane zoom (PreviewLeaf.zoom, setPreviewLeafZoom with 50–1000 clamping), focused-pane tracking (focusedLeafID in PreviewWorkspace, updated on open/split/transfer), and pane-scoped zoom wiring in session-preview-tab.tsx (lines 156/603-605) are all live. Renderer hosts relocate without recreation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

area:uienhancementNew feature or requesthitlNeeds human review before merge

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions