feature/backend-rewrite #2
@@ -27,15 +27,15 @@ struct RootTabView: View {
|
||||
.tag(Tab.home)
|
||||
|
||||
LibraryView()
|
||||
.tabItem { Label("Library", systemImage: "books.vertical.fill") }
|
||||
.tabItem { Label("Library", systemImage: "book.pages.fill") }
|
||||
.tag(Tab.library)
|
||||
|
||||
BrowseView()
|
||||
.tabItem { Label("Discover", systemImage: "globe.americas.fill") }
|
||||
.tabItem { Label("Discover", systemImage: "sparkles") }
|
||||
.tag(Tab.browse)
|
||||
|
||||
ProfileView()
|
||||
.tabItem { Label("Profile", systemImage: "person.fill") }
|
||||
.tabItem { Label("Profile", systemImage: "gear") }
|
||||
.tag(Tab.profile)
|
||||
}
|
||||
// Reserve space for the mini-player above the tab bar so scroll content
|
||||
|
||||
@@ -510,9 +510,9 @@ final class AudioPlayerService: ObservableObject {
|
||||
self?.togglePlayPause()
|
||||
return .success
|
||||
}
|
||||
center.skipForwardCommand.preferredIntervals = [30]
|
||||
center.skipForwardCommand.preferredIntervals = [15]
|
||||
center.skipForwardCommand.addTarget { [weak self] _ in
|
||||
self?.skip(by: 30)
|
||||
self?.skip(by: 15)
|
||||
return .success
|
||||
}
|
||||
center.skipBackwardCommand.preferredIntervals = [15]
|
||||
|
||||
@@ -62,7 +62,7 @@ struct BookDetailView: View {
|
||||
.font(.subheadline)
|
||||
.foregroundStyle(.white.opacity(0.8))
|
||||
HStack {
|
||||
TagChip(label: book.status).colorScheme(.dark)
|
||||
// TagChip(label: book.status).colorScheme(.dark)
|
||||
ForEach(book.genres.prefix(2), id: \.self) {
|
||||
TagChip(label: $0).colorScheme(.dark)
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ struct MiniPlayerView: View {
|
||||
Button { showFullPlayer = true } label: {
|
||||
AsyncCoverImage(url: audioPlayer.coverURL)
|
||||
.frame(width: 56, height: 56)
|
||||
.clipShape(RoundedRectangle(cornerRadius: 12))
|
||||
.clipShape(RoundedRectangle(cornerRadius: 40))
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
|
||||
@@ -141,8 +141,7 @@ struct MiniPlayerView: View {
|
||||
.fill(Color.black.opacity(0.3))
|
||||
)
|
||||
)
|
||||
.frame(height: 80)
|
||||
.padding(.horizontal, 12)
|
||||
.frame(height: 20)
|
||||
.shadow(color: .black.opacity(0.3), radius: 12, y: 4)
|
||||
// Follow finger in both directions while dragging vertically
|
||||
.offset(y: dragOffset)
|
||||
@@ -789,7 +788,7 @@ struct PlayerSlider: View {
|
||||
let fraction = (value - range.lowerBound) / (range.upperBound - range.lowerBound)
|
||||
let clampedFraction = max(0, min(1, fraction))
|
||||
let filled = width * clampedFraction
|
||||
let thumbSize: CGFloat = isDragging ? 22 : 16
|
||||
let thumbSize: CGFloat = isDragging ? 22 : 22
|
||||
let trackHeight: CGFloat = isDragging ? 5 : 4
|
||||
|
||||
ZStack(alignment: .leading) {
|
||||
@@ -840,10 +839,11 @@ private struct MiniPlayerProgressBar: View {
|
||||
ZStack(alignment: .leading) {
|
||||
RoundedRectangle(cornerRadius: 40)
|
||||
.fill(Color.white.opacity(0.2))
|
||||
RoundedRectangle(cornerRadius: 40)
|
||||
RoundedRectangle(cornerRadius: 6)
|
||||
.fill(Color.amber.opacity(0.3))
|
||||
.frame(width: max(0, geo.size.width * fraction))
|
||||
}
|
||||
.clipShape(RoundedRectangle(cornerRadius: 40))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -879,7 +879,6 @@ private struct PlayerProgressSection: View {
|
||||
.foregroundStyle(.white.opacity(0.5))
|
||||
}
|
||||
.padding(.horizontal, 28)
|
||||
.padding(.top, 16)
|
||||
}
|
||||
|
||||
private func formatTime(_ seconds: Double) -> String {
|
||||
|
||||
Reference in New Issue
Block a user