SwiftUI & UIKit/AppKit shimmer / skeleton loading effects. iOS 16+ (includes iPadOS) · macOS 15+ · watchOS 10+ (SwiftUI-only) Reduce Motion / Low Power aware · Light/Dark tone adjustment · Multi-framework
- Multi-framework: SwiftUI + (iOS) UIKit / (macOS) AppKit via CAGradientLayer
- watchOS 10+: Pure SwiftUI overlay implementation
- Accessibility/Power aware: Auto tuning for Reduce Motion & Low Power
- Global pause:
.glimmerPaused(true)pauses an entire subtree - Accurate masking:
SkeletonBlock<Shape>usesclipShapeto preserve circles/corners - Light/Dark tone adjustment: On by default (can be disabled)
- Presets:
.subtle/.bold, plus full custom configuration
- Swift 5.10+
- iOS 16+ (iPadOS included)
- macOS 15+
- watchOS 10+ (SwiftUI-only)
- (Optional) tvOS 16+, visionOS 1.0 — add to
Package.swiftif needed
- File → Add Package Dependencies…
- URL - https
https://github.com/cestbonciel/GlimmerKit.git- Product: GlimmerKit
import SwiftUI
import GlimmerKit
struct ContentView: View {
var body: some View {
VStack(spacing: 16) {
// Line placeholder
SkeletonBlock(cornerRadius: 12, size: .init(width: 240, height: 14))
// Avatar + two lines
HStack(spacing: 12) {
SkeletonBlock(circleWith: .init(width: 44, height: 44))
VStack(alignment: .leading, spacing: 8) {
SkeletonBlock(cornerRadius: 10, size: .init(width: 200, height: 12))
SkeletonBlock(cornerRadius: 10, size: .init(width: 140, height: 12))
}
}
// Button-like capsule
SkeletonBlock(capsuleWith: .init(width: 160, height: 28))
}
// Pause all glimmers in this subtree if needed
.glimmerPaused(false)
// Apply shimmer to the whole section (subtle preset by default)
.glimmer()
}
}// in Package.swift of your app/framework
dependencies: [
.package(url: "https://github.com/cestbonciel/GlimmerKit.git", branch: "main")
],
targets: [
.target(
name: "YourTarget",
dependencies: ["GlimmerKit"]
)
]