Skip to content

Sheet pane: inline always-on draggable pane + permanent bottom sheets - #38

Merged
shanerbaner82 merged 4 commits into
mainfrom
feat/sheet-pane
Aug 4, 2026
Merged

Sheet pane: inline always-on draggable pane + permanent bottom sheets#38
shanerbaner82 merged 4 commits into
mainfrom
feat/sheet-pane

Conversation

@shanerbaner82

Copy link
Copy Markdown
Contributor

Two halves of the Maps/Flighty "always-on pane" pattern:

<native:sheet-pane> — an inline, permanently-visible bottom pane that drags fluidly with the finger and spring-snaps to detents on release, entirely native-side (no PHP round-trips while tracking). Renders inside the screen's own layer — unlike BottomSheet's presented UISheetPresentationController — so floating chrome (Liquid Glass tab bar, FABs) stays above it. Dragging the header/grabber moves the pane; drags inside a child scroll-view scroll the content (per-touch responder precedence).

<native:sheet-pane detents="200,560,780" :detent="$detent"
    corner-radius="44" inset-x="8" inset-bottom="8" @change="setDetent">

BottomSheet additions for the presented variant: permanent (no swipe-away — drag only snaps between detents) and background-interaction (view behind stays usable — HIG "sheets with interaction behind").

Draft — in-flight feature branch packaged from the working tree so it has a home; review/finish at leisure.

shanerbaner82 and others added 3 commits August 4, 2026 13:02
SheetPane: an inline, permanently-visible bottom pane that drags fluidly
with the finger and spring-snaps to detents on release, entirely
native-side — no PHP round-trips while tracking. Unlike BottomSheet (a
presented UISheetPresentationController) it renders inside the screen's
own layer, so floating chrome — the Liquid Glass tab bar, FABs — stays
above it. The Maps/Flighty always-on pane pattern. Dragging the pane's
non-scrolling area moves the pane; drags inside a child scroll-view
scroll the content.

BottomSheet grows the presented-sheet variant of the same pattern:
`permanent` disables swipe-away dismissal (drag only snaps between
detents) and `background-interaction` keeps the view behind the sheet
interactive (HIG "sheets with interaction behind").
- BottomSheet on Android now honours `permanent`: drag-to-hide is
  blocked via confirmValueChange, back press via
  ModalBottomSheetProperties, and scrim taps no longer fire @Dismiss.
- `background_interaction` is documented as iOS-only on the PHP methods:
  M3's ModalBottomSheet is a modal window, so the scrim always
  intercepts background touches — sheet-pane is the cross-platform
  answer for a live background.
- Both sheet-pane renderers now report fractional detents faithfully
  (truncating 560.5 to 560 failed the applied-detent equality on the
  republish and nudged the pane after every drag) and only fire @change
  when the pane settles on a DIFFERENT detent.
- CollectorElementsTest covers the sheet-pane attribute surface (kebab +
  camel + defaults + on_change) and the new bottom-sheet props,
  including filter_var string-boolean parsing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@shanerbaner82

Copy link
Copy Markdown
Contributor Author

Pushed fixes from review: Android now honours permanent (drag-to-hide blocked via confirmValueChange, back press via ModalBottomSheetProperties, scrim taps no longer fire @dismiss), background_interaction is documented as iOS-only on both PHP methods (M3's ModalBottomSheet is a modal window — the scrim always intercepts background touches; sheet-pane is the cross-platform answer), both sheet-pane renderers report fractional detents faithfully and only fire @change on a genuine detent change, and CollectorElementsTest now covers the sheet-pane attribute surface plus the new bottom-sheet props (suite: 206 passing).

Remaining from review, deliberately left: Android WindowInsets handling for the pane under edge-to-edge, and the a11y-label read in the sheet-pane renderers.

🤖 Generated with Claude Code

@shanerbaner82
shanerbaner82 marked this pull request as ready for review August 4, 2026 18:56
@shanerbaner82
shanerbaner82 merged commit 466eaac into main Aug 4, 2026
3 checks passed
@shanerbaner82
shanerbaner82 deleted the feat/sheet-pane branch August 4, 2026 18:56
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