iOS 1.0.1: mini player, Now Playing spacing, play spinner fix

- Mini player floats as a solid card and every screen leaves room for it,
  so it no longer covers the bottom of lists
- More space between title and scrubber; panel switches animate
- Play button no longer spins forever after changing tracks: the engine
  now always reports buffering on load
- Springier button presses and play/pause symbol transitions

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
cdnutterandClaude Opus 5.5 committed 2026-10-20 08:50:42 -07:00
1 parent fdf9e970b2
commit 2ddfe051d8
5 files changed
+61 -24

No files matched your search

+19 -3
View File
@@ -11,11 +11,14 @@ struct RootView: View {
TabView(selection: Binding(get: { ui.tab }, set: { ui.selectTab($0) })) {
ForEach(Tab.allCases, id: \.self) { t in
NavigationStack(path: ui.path(t)) {
root(t).navigationDestination(for: Route.self) { destination($0) }
root(t).miniPlayerRoom()
.navigationDestination(for: Route.self) { destination($0).miniPlayerRoom() }
}
.safeAreaInset(edge: .bottom, spacing: 0) {
if g.playback.current != nil { MiniPlayer() }
// Floats over the screens; each screen leaves room for it so nothing ends up underneath.
.overlay(alignment: .bottom) {
if g.playback.current != nil { MiniPlayer().transition(.move(edge: .bottom).combined(with: .opacity)) }
}
.animation(.spring(duration: 0.35), value: g.playback.current != nil)
.tabItem { Label(t.rawValue, systemImage: t.icon) }
.tag(t)
}
@@ -68,3 +71,16 @@ struct RootView: View {
}
}
}
private struct MiniPlayerRoom: ViewModifier {
private var g: AppGraph { .shared }
func body(content: Content) -> some View {
content.safeAreaInset(edge: .bottom, spacing: 0) {
if g.playback.current != nil { Color.clear.frame(height: 66) }
}
}
}
private extension View {
func miniPlayerRoom() -> some View { modifier(MiniPlayerRoom()) }
}