feat: single Liquid Glass settings drawer with controllable height animation - #25
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.move(edge:)), not a NavigationStack push.DynamicDetentSheet.swift(new, reusable)DynamicDetentSheetModel+dynamicHeightDetents(_:)— animates a content-hugging.height()detent with a caller-owned curve (the reliable path for a controllable resize; theselection:form only loosely honors a curve).isResizing+ completion-basedsettle()).selectableDetents(_:selection:)for the fixed.medium/.largecase.First-open sync
Forms, no side effects), so the first open resizes in lockstep with the slide instead of a beat after it.Verification
StreamCoretest suite only (the full iOS-27 app can't build on GitHub runners); this change is UI-only and doesn't touchStreamCore.🤖 Generated with Claude Code