Skip to content

Open confirmed links and paths in a floating side panel beside the terminal - #61

Merged
jhen0409 merged 1 commit into
mainfrom
side-panel
Aug 21, 2026
Merged

Open confirmed links and paths in a floating side panel beside the terminal#61
jhen0409 merged 1 commit into
mainfrom
side-panel

Conversation

@jhen0409

Copy link
Copy Markdown
Member

What

Closes #58. A confirmed path or web link now opens in a floating side panel beside the live terminal — a shadowed card over the pane on iPad, a slab hanging off the glass's trailing edge on Vision Pro — instead of as a tab. The terminal is never re-laid out. ↗ TAB moves the same live viewer into a tab; a second summon replaces the first (one panel per terminal tab); the panel closes with its tab and rides along through merge/split; its width is remembered per device. iPhone is unchanged.

Summary

  • Ownership: TerminalWorkspace.sidePanels keyed by the HOST terminal tab id (survives merge/split); SidePanelViewController wraps the existing ViewportPaneViewController / FileViewerPaneViewController with one 30-pt action row; AuxiliaryPaneController.routeMode lets ↗ TAB re-register the live controller as an auxiliary tab without a downcast.
  • visionOS: a third .trailing UIHostingOrnament hosting ONE static mount — a transparent strip twice the window's width, centred on the glass edge — so a drag never changes the ornament. The card's geometry is stored glass-relative (width, overhang = right edge past the glass, default 440, max 800); both handles have two-way travel from the default and the left handle can pull the card across the terminal down to a 320-pt reserve. Drags freeze the card into one blurred bitmap until release (per-tick reflow and per-tick system-glass resizes were both unusable on device); under GLASS the platter steps out for the drag.
  • iPad / Shell: in-window overlay, admitted at ≥ 660 pt pane width in a regular size class; the leading seam resizes live (320 … pane − 320); a Stage Manager shrink below the floor moves the panel into a tab.
  • Row: ✕ · ↗ TAB lead, then the viewer's identity and controls, which EXPAND as the width allows by measured priority (▤ TREE · REFRESH · SOURCE|DIFF · SELECT · A− A+ · host; ⌗ SYSTEM); only for what did not fit. Header on iPad, bottom bar on visionOS.
  • Pure model (SidePanel.swift): admission policy, clamps, strip/overlay geometry and the drag arithmetic, all unit-tested without UIKit. SidePanelWidthStore persists per platform.
  • DEBUG hooks debug.sidepanelsplit|sidepanelclose|sidepanelwidth; MULTIPLEX_SIDE_PANEL=0 forces the legacy tab road. 18 new localized keys (zh-Hant, ja); the catalog also gains the 22 iPad-only keys an IDE build had left untranslated.
  • Docs: links-and-viewers.md, input-and-windows.md, architecture.md, e2e-headless.md, i18n.md; DESIGN.md, README, TestFlight line.

Proof

Ten feedback rounds on Vision Pro hardware drove the handle design (reach, two-way travel, performance, row placement, control order). Headless E2E on both simulators from a fresh install: ⌗ panel → width hook → ▤ replaces ⌗ → ✕ → ▤ → ↗ TAB → relaunch restores nothing; the visionOS card's default edges measured at the terminal's edge / 440 pt past the glass, the width hook moving only the left edge.

./Tools/build.sh lint clean · visionOS 1328 XCTests green · iPad 1334 green · ruby Tools/check-metadata.rb OK.

Checklist

  • ./Tools/build.sh lint passes
  • Unit tests pass (MultiplexTests)
  • User-visible change noted in fastlane/testflight-whats-new.txt

…rminal

Closes #58. iPad: a card over the pane (leading-seam resize, admitted at a
660-pt pane, a Stage Manager shrink moves it into a tab). Vision Pro: a slab
hanging off the glass from a third trailing ornament — one static strip twice
the window's width, glass-relative geometry, a handle on each edge, the card
frozen into a blurred bitmap while it moves. ✕ · ↗ TAB lead the row and the
viewer's controls expand by measured priority. One panel per terminal tab,
carried through merge/split, width remembered per device; iPhone unchanged.
@jhen0409
jhen0409 merged commit 9cfcb71 into main Aug 21, 2026
2 checks passed
@jhen0409
jhen0409 deleted the side-panel branch August 21, 2026 05:34
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.

Floating side panel for File Viewer / Viewport (visionOS + iPad), with "split as new tab"

1 participant