Skip to content

Fold the phone layout's panels, slider and metadata into slide-up sheets - #440

Merged
lstein merged 4 commits into
masterfrom
lstein/feature/mobile-sheets
Nov 14, 2026
Merged

lstein merged 4 commits into
masterfrom
lstein/feature/mobile-sheets

Conversation

@lstein

@lstein lstein commented Nov 14, 2026

Copy link
Copy Markdown
Owner

On phones, the Control and Search panels at the bottom of the window and the album badge and seek slider at the top were hard to use. This folds them into two slide-up sheets, in the style of Google Maps on the iPhone, and moves the metadata drawer into the bottom sheet.

Phone layout

The layout switches on at 600px wide and below, or 500px tall and below on a touch screen (phones held sideways). Desktop and tablet layouts are unchanged.

  • Bottom sheet: holds both panels.
    • It has three stops: collapsed (just the handle), controls, and details.
    • At the controls stop, the file name and path sit below the panels. Tapping that row, pulling the sheet higher, or swiping up on the photo opens the details stop.
    • The details stop shows what the drawer showed (tags, Image Details, the InvokeAI buttons) over the photo, and scrolls.
    • Held sideways, the two panels share one row.
    • The sheet remembers whether you left it collapsed or open to the controls. It never reopens to the details after a reload.
  • Top sheet: holds the album badge and a full-width seek slider.
    • Collapsed, only the progress strip and a handle show.
    • The slider stays open as long as the sheet does.
  • Gestures:
    • Drag or flick from anywhere on a sheet, including from a button; the drag doesn't press it. A flick moves the sheet one stop.
    • Dragging the slider thumb seeks rather than moving the sheet.
    • Inside the details, dragging scrolls them; once they're scrolled to the top, dragging down moves the sheet.
  • Keyboard: i, ↑, ↓ and Esc open and close the details.

Layout around the sheets

  • Grid view: tiles stop above the sheet and are laid out again when it moves.
  • Semantic map: in fullscreen it stays clear of the sheet.
  • Text search box: sits above the sheet in one column, and closes when the details open.
  • Metadata table: the label column gets 30% of the width, so labels no longer break mid-word.
  • iPadOS viewport fix: panel-anchor.js also publishes how far the stranded iPadOS layout viewport hangs below the visible one, so the sheet clears it too.

Testing

  • Jest: new suites mobile-sheets, mobile-sheets-details, seek-slider-sheet and metadata-drawer-sheet. All 1140 frontend tests pass; lint and format checks are clean.
  • Headless Chromium: checked at 390×760, 667×375, 740×340 and 844×390 (gestures by touch emulation), and at desktop size.
  • On an iPhone: the user tried an earlier build. The latest fixes (the hand-off between scrolling and dragging in the details, the landscape row) haven't been tried on a device yet. WebKit couldn't run headless on the build machine.
  • Adversarial review: a fresh-context review was run, and its confirmed findings are fixed here:
    • landscape panels wrapped onto two rows;
    • the details could open unseen while in fullscreen;
    • the user's next tap after a touch drag was swallowed;
    • the fullscreen map didn't re-fit when the sheet moved;
    • the text search box was lifted twice on a stranded iPad viewport;
    • a change in the sheet's height (e.g. panel labels turned on) wasn't announced;
    • a stale mouse drag could move the sheet later;
    • a late date lookup could re-show the slider's date bubble.

🤖 Generated with Claude Code

lstein and others added 4 commits November 14, 2026 14:36
On small screens the Control and Search panels now share one bottom sheet,
and the album badge and seek slider share one top sheet. Each slides between
open and a grab handle by drag, flick or tap, like Google Maps on the iPhone.
The bottom sheet also takes over the metadata drawer: its file name row sits
under the panels, and a third, "details" stop opens the drawer's contents
over the photo (also by swiping up on the photo, or the i/arrow keys).

Desktop and tablet layouts are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…where it can't work

Held sideways, an iPhone has no toolbar under the page, and a drag on the
collapsed bottom sheet's handle at the very bottom edge was taken by the
swipe-up-to-go-home gesture. Collapsed, the handle now grows to 46px with its
pill at the top. The bottom sheet's peek is measured from the handle, since
that peek is now a calc() that reads back unevaluated. The panels under a
collapsed handle are hidden once it has slid down: the Grid View checkmark
overhung into the strip left showing.

iPhone Safari has no page Fullscreen API, so the Fullscreen button did
nothing there. It is hidden wherever document.fullscreenEnabled is false.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
46px was more than the home-indicator strip needs. 34px, with the pill
about 25px above the bottom edge, still keeps drags clear of the
swipe-up-to-go-home gesture on an iPhone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
34px still lost drags to the iPhone's swipe-home gesture.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@lstein
lstein merged commit 0b43704 into master Nov 14, 2026
11 checks passed
@lstein
lstein deleted the lstein/feature/mobile-sheets branch November 14, 2026 20:32
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