Skip to content

[feat] 40 F1-F5: phone sheets, profile menu, Explorer long-press, ResizeObserver loop - #351

Closed
AlexZ005 wants to merge 5 commits into
feat/40from
feat/40-sheets
Closed

AlexZ005 wants to merge 5 commits into
feat/40from
feat/40-sheets

Conversation

@AlexZ005

Copy link
Copy Markdown
Collaborator

Roadmap 40 rows F1-F5 (phone sheets, profile menu, Explorer on the phone, ResizeObserver loop).

id state proof
F1 sheets: swipe to close, sticky grab bar, min/max snap, remembered height, never cover Play / selection toolbar shipped (fixed once in the sheet primitive + phone layering, every drawer inherits it) e2e phone-sheets 104 (real touch)
F2 Customize character / Profile settings from the profile menu on a phone shipped — #avatar-dropdown inherited pointer-events:none from .top-right-chrome phone-sheets F2 + counterfactual
F3 Explorer: long-press action sheet (no browser callout/native drag, Explorer items only), readable rename selection, sideways toolbar shipped ($lib/ui/touchHold) e2e explorer-phone 28 (CDP touch, dark + light); counterfactuals: no folder hold / no contextmenu swallow each go red
F4 Install app button not needed — the app was already installed on that phone —
F5 "ResizeObserver loop completed with undelivered notifications" shipped — ui/ScrollStrip kept watching REMOVED children; the docked Explorer header unmounts its storage chip inside a resize pass e2e resize-observer-loop 14; the old strip reds 6 (incl. the exact toast)

Contract change: explorer-header-panels section 5 — at <= 640px (phone shell) the docked Explorer toolbar scrolls instead of truncating the project chip (F3); truncation is still asserted at 660px.

Regression (all green): phone-sheets 104, explorer-phone 28, mobile-map 84, mobile-ui-fixes 28, mobile-editors 40, toolbar-position 63, menu-mobile-scroll 51, mobile-hud 12, explorer-header-panels 71, explorer-views 113, resize-observer-loop 14. svelte-check 300/40 (baseline), check:tokens clean.

Evidence (before/after shots 390x844 + 1440x900, dark + light; docs-fragment.md; summary.md): /home/deck/.code/lanes-30/after-40/40-sheets/.

OWED on device: sheet swipe feel, long-press timing (450 ms), the iOS callout (Chromium ignores -webkit-touch-callout).

Merge note: src/components/ui/ScrollStrip.svelte is a shared primitive — union with 40-docks if both touch it.

🤖 Generated with Claude Code

AlexZ005 and others added 5 commits October 8, 2026 14:30
…enu taps (F2)

- F1: $lib/ui/sheetDrag (the shared drag/flick/keyboard gesture) + sheetSnap.settleSheet
  (free-height rest rule: snap to min/max, swipe down to the end closes) + ui/SheetGrip
  (the sticky grab bar). Wired into the shell's framed sheets, ui/Sheet, the Inspector /
  Configure Scene, the main menu, the profile menu, every phone context menu (Add), the
  notes sheet, toolboxes, Customize character and the dock (grab bar drawn by PhoneShell;
  swipe-away minimizes the dock). Heights remembered under each sheet's existing key.
- phoneSheetMax / --ps-sheet-max: no sheet rises into the top bar or pushes the selection
  strip under it; the bar + strip rise over every open sheet so Play is never covered
  (cover-play-and-handle). The notification centre's desktop click-catcher stands down
  on the phone.
- F2: the profile menu inherited pointer-events:none from the top-right corner chrome on
  the phone, so Customize character / Profile settings never got the tap. On the phone it
  is a plain sheet above the bar (no top layer), tappable.
- e2e phone-sheets (104, real touch events, F2 counterfactual); mobile-map and
  mobile-ui-fixes assert the new above-the-bar contract; vitest sheetSnap +4.
- svelte-check 300/40 (baseline ratcheted from 300/41).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…n, toolbar strip (40 F3)

- $lib/ui/touchHold: touch hold opens an Explorer item's menu (the phone action sheet);
  the browser's touch contextmenu / native dragstart are swallowed on Explorer items only.
  File cards: hold-and-lift = menu, hold-then-move = the existing touch pick-up.
- the inline rename field's ::selection uses --accent-fill / --on-accent.
- docked Explorer toolbar is a ui/ScrollStrip on the phone shell (#explorer-dock-strip).
- e2e explorer-phone: 20 PASS / 8 FAIL — remaining failures are TEST sequencing
  (the folder menu has no "Open" row and Escape does not close the action sheet, so the
  later sections run with a menu open), see the STATUS handover.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…on, toolbar strip (40 F3)

- finishes the wip commit: e2e explorer-phone 28/28 (real CDP touch, dark + light).
- an action sheet closes on a tap on its backdrop (a phone has no Escape); the folder
  menu's rows are Share folder / Properties / ... (no "Open").
- counterfactuals: no folder onhold -> the folder-sheet check reds; touchHold's swallow
  removed -> a touch contextmenu opens a second menu before the hold (menus 1).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- cause (measured with an instrumented ResizeObserver): ui/ScrollStrip watched every child
  and never stopped watching a REMOVED one. The docked Explorer's header measures itself
  inside a resize pass, finds it is narrow and unmounts its storage chip (a strip child) in
  that pass; a detached node's 0x0 notification cannot be delivered in the same pass, so the
  browser raised "loop completed with undelivered notifications" and the crash toast showed
  it (the user's phone had Explorer + Animation docked: feedback-1.31/resizeobserver.jpg).
- the strip un-watches a child in its MutationObserver, which runs at the same microtask
  checkpoint as the removal, before the next gather. Every ScrollStrip inherits it.
- e2e resize-observer-loop (14): 350x716 touch, dark + light, Explorer + Animation (Graph)
  docked, tab switches, a real-touch dock resize; desktop open + resize. Counterfactual: the
  old ScrollStrip reds 6 checks (1 loop error + the toast, per theme).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ct (40 F3)

- section 5 asserted the docked header TRUNCATES the project chip at 520px; at <= 640px the
  phone shell is up and F3 made that toolbar a sideways strip on purpose (the name was cut to
  "Unt..." on a phone). The truncation contract moves to 660px (narrow, not phone) unchanged,
  and 520px asserts the strip: search keeps its width, the name shows whole, a scroll brings
  the chip fully into view, the page does not overflow. 71/71.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@AlexZ005

Copy link
Copy Markdown
Collaborator Author

Included in 1.32.0: merged into feat/40-int → feat/41 → release PR #365 (v1.32.0, 862ed79). Closing as included.

@AlexZ005 AlexZ005 closed this Oct 13, 2026
@AlexZ005
AlexZ005 deleted the feat/40-sheets branch October 23, 2026 11:17
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