Skip to content

iPhone Duo: pose-aware single-window shell - #67

Merged
jhen0409 merged 17 commits into
mainfrom
iphone-duo-shell
Oct 1, 2026
Merged

jhen0409 merged 17 commits into
mainfrom
iphone-duo-shell

Conversation

@jhen0409

@jhen0409 jhen0409 commented Sep 23, 2026 •

Copy link
Copy Markdown
Member

Summary

Prepares the single-window Shell for the foldable iPhone (Xcode 27.1 simulator, iOS 27.1 APIs), following the HIG's Designing for iPhone Duo.

  • Expand rule — a phone splits only while the terminal keeps the key rail's 390 pt TMUX tier beside the 316 pt deck rail; iPad keeps 620. SE-class landscape now runs a single pane (edge-swipe back to the deck).
  • Fold — vertical division: book pose, deck page | terminal page, the band is the divider. Horizontal division: terminal above the fold, key rail on the fold line, deck or panel in the console region below. The 27.1 simulator returns no division regions, so UIHingeInteraction status drives a synthetic band (DuoFoldGeometry) until hardware reports them.
  • Rail edge — the UMD follows the system's vertical-bar edge as a 44 pt chip column centred on the clock's glyph line (48 pt from the display edge), with a 20 pt source strip over the pane. RailFit is one pure, tested rule for the column and the horizontal shell row: chips drop into ⋯ in priority order, A−/A+ leave together, DECK and ⋯ never drop.
  • Inner portrait band — the 82 pt status band is content: the rail and the deck header sit on the glyph line inside it, clear of the clock cluster.
  • Bare corners — the pane that owns a 55 pt display corner insets its header row 24 pt; ShellHeaderChrome carries corner and band to the deck header, the UMD rail and a column panel's header.
  • Panel home — a ▤/⌗ panel takes the deck's column (SidePanelPresentationStyle.shellColumn); ‹ DECK sends it into a tab. Continuity: terminal wins on close, deck rail restored on open.
  • Closed display — landscape keeps the flush chrome of any iPhone landscape (the 8 pt bare-top padding is inner-display only) and stands the rail as a column in the camera's ~90 pt strip on whichever side holds it, clear of the camera; portrait follows the system's trailing bar edge under the clock cluster.
  • Home strip — on a foldable the key rail spends the 34 pt home strip in every pose, as on iPad; a shipped iPhone in portrait keeps its backfill band.
  • Fonts — 13 pt inner display, 12 outer, 14 iPad, until A−/A+ in that window.

docs/agents/iphone-duo.md records the measured display facts, the pose matrix, the simulator traps (no pose command, outer-display screenshot port, Debug scheme trap, probe env) and what stays open on hardware. Tools/build.sh gains the duo platform key.

Verification

  • Lint 0, 1395 unit tests green (Vision Pro sim), iPhone Duo Debug build green.
  • Sim-verified with the dev-sshd harness in every pose: open, closed, book, laptop, inner portrait, with and without the keyboard, with ◧ HIDE and with a column panel.
  • Deviation from the board: the Talkback composer stays docked above the key rail in laptop pose rather than below the fold.

@jhen0409
jhen0409 marked this pull request as draft September 23, 2026 23:43
@jhen0409
jhen0409 force-pushed the iphone-duo-shell branch 2 times, most recently from a795f32 to 59a5636 Compare September 25, 2026 01:36
The Shell now reads the foldable iPhone's traits and fold:

- Expand rule: a phone splits only while the terminal keeps the key rail's
  390 pt TMUX tier beside the 316 pt deck rail (iPad keeps 620). SE-class
  landscape drops to a single pane as a result.
- Fold: a vertical division makes a book (deck page | terminal page, the
  band is the divider); a horizontal one keeps the terminal above the fold
  with the key rail on the fold line and the deck or a panel below. The
  27.1 simulator reports no division regions, so the hinge status stands
  in via DuoFoldGeometry.
- Rail edge: the UMD follows the system's vertical-bar edge as a 44 pt
  chip column centred on the clock's glyph line, with a 20 pt source strip
  over the pane; the key rail stays horizontal. RailFit is one pure rule
  for the column and the horizontal shell row, dropping chips into ⋯ in
  priority order.
- Inner portrait: the 82 pt status band is content — the rail and the
  deck header sit on the glyph line inside it, clear of the clock.
- Bare corners: the pane owning a 55 pt display corner insets its header
  row 24 pt (ShellHeaderChrome carries that and the band to every header).
- Panel home: a ▤/⌗ panel takes the deck's column (.shellColumn) and
  ‹ DECK sends it into a tab; continuity keeps the terminal on close and
  restores the deck rail on open.
- Fonts: 13 pt on the inner display, 12 outer, 14 iPad, until A−/A+.

docs/agents/iphone-duo.md records the measured facts, the pose matrix and
the simulator traps; Tools/build.sh gains the duo platform key.
…e camera

While the deck spans the closed display, its + HOST / FAQ / SETTINGS chips
move out of the header row into the system's side strip as column chips;
the header keeps the title and summary. The shell resolves the rail edge
once and hands it to both panes. On the turned-around closed display the
column (deck and terminal alike) now hangs from the camera's end.
The shell resolves the side column once (edge and placement) and hands
it to the deck and the terminal window, which drop their own edge
resolution and the foldable/orientation flags. One frame and centre
rule serves both columns; the header's action faces come from one
table; the inner-display predicate replaces four repeated size-class
checks. Doc and comments state the rules without history.
…s band

The laptop pose's deck took the inner-portrait header band and opened an
82 pt gap above its title. The band belongs to the pane at the display's
top only. Also restores constraint-pinned pane mounting: autoresizing
left the terminal and deck stale after a fold.
The deck's presentation update now waits for the fold spring to settle:
tiles rebuilt inside the animation kept in-flight geometry and piled
their rows at the origin on a cold launch into the laptop pose. The
console deck's header also drops its top inset under the fold.
…the fold

The keyboard obstruction is measured against the window's bottom; the
laptop pose's pane stops at the fold, so the composer and side column
were lifted by a keyboard that only covered the console below.
@jhen0409
jhen0409 marked this pull request as ready for review September 30, 2026 06:17
@jhen0409
jhen0409 merged commit 225bf62 into main Oct 1, 2026
4 checks passed
@jhen0409
jhen0409 deleted the iphone-duo-shell branch October 1, 2026 01:05
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