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