- Integrate Kingfisher for image caching with CachedAsyncImage component - Add CacheSettingsView for managing image cache size and clearing cache - Implement three card layout styles: compact, magazine (default), natural - Add AppearanceSettingsView with visual layout previews and theme settings - Create Clean Architecture for card layout with domain models and use cases - Implement FlowLayout for dynamic label width calculation - Add skeleton loading animation for initial bookmark loads - Replace delete confirmation dialogs with immediate delete + 3-second undo - Support multiple simultaneous undo operations with individual progress bars - Add grayed-out visual feedback for pending deletions - Centralize notification names in dedicated NotificationNames file - Remove pagination logic from label management (replaced with FlowLayout) - Update AsyncImage usage across BookmarkCardView, BookmarkDetailView, ImageViewerView - Improve UI consistency and spacing throughout the app
27 lines
550 B
Swift
27 lines
550 B
Swift
import SwiftUI
|
|
import Kingfisher
|
|
|
|
struct CachedAsyncImage: View {
|
|
let url: URL?
|
|
|
|
init(url: URL?) {
|
|
self.url = url
|
|
}
|
|
|
|
var body: some View {
|
|
if let url {
|
|
KFImage(url)
|
|
.placeholder {
|
|
Color.gray.opacity(0.3)
|
|
}
|
|
.fade(duration: 0.25)
|
|
.resizable()
|
|
.frame(maxWidth: .infinity)
|
|
} else {
|
|
Image("placeholder")
|
|
.resizable()
|
|
.scaledToFill()
|
|
}
|
|
}
|
|
}
|