Skip to content

feat: single Liquid Glass settings drawer with controllable height animation - #25

Merged
joeblau merged 1 commit into
mainfrom
feat/settings-morphing-drawer
Jul 4, 2026
Merged

feat: single Liquid Glass settings drawer with controllable height animation#25
joeblau merged 1 commit into
mainfrom
feat/settings-morphing-drawer

Conversation

@joeblau

@joeblau joeblau commented Jul 4, 2026

Copy link
Copy Markdown
Owner

Summary

Reworks the settings sheet into a single Liquid Glass morphing drawer and adds a reusable component that gives a bottom sheet's height resize a dialable, controllable animation curve.

What changed

SettingsView

  • One sheet with the system Liquid Glass chrome — glass nav bar, glass toolbar Done/back buttons, inline title (no more custom flat header painting over the glass).
  • Launcher ↔ section swap with a directional push/pop slide (.move(edge:)), not a NavigationStack push.
  • Height animates to fit the on-screen content, locked to the slide in one transaction.
  • One light haptic per navigation (removed a duplicate).

DynamicDetentSheet.swift (new, reusable)

  • DynamicDetentSheetModel + dynamicHeightDetents(_:) — animates a content-hugging .height() detent with a caller-owned curve (the reliable path for a controllable resize; the selection: form only loosely honors a curve).
  • Guards the real "desync" cause: a late re-measurement restarting the spring mid-resize (isResizing + completion-based settle()).
  • selectableDetents(_:selection:) for the fixed .medium/.large case.

First-open sync

  • Every section's height is pre-warmed off-screen (bare Forms, no side effects), so the first open resizes in lockstep with the slide instead of a beat after it.

Verification

  • Compile-verified on the iOS 27 simulator + device SDKs.
  • Rendered on an iOS 27 simulator (launcher + section: glass sheet, glass toolbar buttons, correct content-fit height).
  • CI builds the StreamCore test suite only (the full iOS-27 app can't build on GitHub runners); this change is UI-only and doesn't touch StreamCore.

The mic-mute FAB WIP in ContentView.swift is intentionally not in this PR — it's a separate feature.

🤖 Generated with Claude Code

…imation

Rework the settings sheet into one morphing drawer instead of a stacked
navigation push, and add a reusable component that gives the sheet's height
resize a dialable, controllable animation curve.

- SettingsView: one sheet with the system Liquid Glass chrome (glass nav bar,
  glass toolbar Done/back buttons, inline title). The launcher and each section
  swap with a directional push/pop slide; the sheet height animates to fit the
  on-screen content, locked to the slide in a single transaction.
- DynamicDetentSheet: a reusable DynamicDetentSheetModel + dynamicHeightDetents
  modifier that animates a content-hugging .height() detent with a caller-owned
  curve (the reliable path for a controllable resize) and guards a late
  re-measurement from restarting the spring mid-resize. Plus selectableDetents
  for the fixed .medium/.large case.
- Pre-warm every section's measured height off-screen so the first open resizes
  in lockstep with the slide, not a beat after it.
- One light haptic per navigation (dropped a duplicate).

ScreenCaptureKit-free UI; compile-verified on the iOS 27 simulator and device
SDKs and rendered on an iOS 27 simulator.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@joeblau
joeblau merged commit 48627d0 into main Jul 4, 2026
1 check passed
@joeblau
joeblau deleted the feat/settings-morphing-drawer branch July 4, 2026 20:08
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