Merge pull request #302 from Ebullioscopic/bugfix/custom-glass

Update Settings
This commit is contained in:
Hariharan Mudaliar 2026-02-17 23:45:02 +05:30 • committed by GitHub
commit ce6b63d9e7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 29 additions and 15 deletions

View file

@ -4457,6 +4457,7 @@ private struct LockScreenGlassVariantPreviewCell: View {
private let cornerRadius: CGFloat = 16 private let cornerRadius: CGFloat = 16
private let previewCornerRadius: CGFloat = 14 private let previewCornerRadius: CGFloat = 14
private let previewSize = CGSize(width: 190, height: 96) private let previewSize = CGSize(width: 190, height: 96)
@State private var previewToken: Double = 0
var body: some View { var body: some View {
ZStack { ZStack {
@ -4478,22 +4479,28 @@ private struct LockScreenGlassVariantPreviewCell: View {
) )
.padding(.vertical, 6) .padding(.vertical, 6)
.allowsHitTesting(false) .allowsHitTesting(false)
.onAppear {
Logger.log("Lock screen glass preview appeared (variant v\(variant.rawValue))", category: .performance)
}
.onDisappear {
Logger.log("Lock screen glass preview disappeared", category: .performance)
}
.onChange(of: variant) { _, newValue in
previewToken = Date().timeIntervalSinceReferenceDate
Logger.log("Lock screen glass preview variant changed to v\(newValue.rawValue)", category: .performance)
}
} }
private var liquidGlassPreview: some View { private var liquidGlassPreview: some View {
TimelineView(.periodic(from: .now, by: 1.0 / 30.0)) { context in LiquidGlassBackground(
let phase = context.date.timeIntervalSinceReferenceDate.truncatingRemainder(dividingBy: 1.0) variant: variant,
let opacityJitter = phase < 0.5 ? 1.0 : 0.999999 cornerRadius: previewCornerRadius,
LiquidGlassBackground( trigger: previewToken,
variant: variant, jitterEnabled: false
cornerRadius: previewCornerRadius, ) {
trigger: context.date.timeIntervalSinceReferenceDate Color.white.opacity(0.04)
) {
Color.white.opacity(0.04)
}
.frame(width: previewSize.width, height: previewSize.height)
.opacity(opacityJitter)
} }
.frame(width: previewSize.width, height: previewSize.height)
.shadow(color: Color.black.opacity(0.2), radius: 10, x: 0, y: 6) .shadow(color: Color.black.opacity(0.2), radius: 10, x: 0, y: 6)
} }
} }

View file

@ -58,6 +58,7 @@ public struct LiquidGlassBackground<Content: View>: NSViewRepresentable {
private let cornerRadius: CGFloat private let cornerRadius: CGFloat
private let variant: LiquidGlassVariant private let variant: LiquidGlassVariant
private let trigger: Double private let trigger: Double
private let jitterEnabled: Bool
/// Creates a new liquid‑glass container. /// Creates a new liquid‑glass container.
/// - Parameters: /// - Parameters:
/// - variant: Any ``LiquidGlassVariant`` (0–19). Defaults to `.v11`, which is visually super pleasing /// - variant: Any ``LiquidGlassVariant`` (0–19). Defaults to `.v11`, which is visually super pleasing
@ -67,11 +68,13 @@ public struct LiquidGlassBackground<Content: View>: NSViewRepresentable {
variant: LiquidGlassVariant = .defaultVariant, variant: LiquidGlassVariant = .defaultVariant,
cornerRadius: CGFloat = 10, cornerRadius: CGFloat = 10,
trigger: Double = 0, trigger: Double = 0,
jitterEnabled: Bool = true,
@ViewBuilder content: () -> Content @ViewBuilder content: () -> Content
) { ) {
self.variant = variant self.variant = variant
self.cornerRadius = cornerRadius self.cornerRadius = cornerRadius
self.trigger = trigger self.trigger = trigger
self.jitterEnabled = jitterEnabled
self.content = content() self.content = content()
} }
@ -146,9 +149,13 @@ public struct LiquidGlassBackground<Content: View>: NSViewRepresentable {
nsView.setValue(cornerRadius, forKey: "cornerRadius") nsView.setValue(cornerRadius, forKey: "cornerRadius")
callPrivateVariantSetter(on: nsView, value: variant.rawValue) callPrivateVariantSetter(on: nsView, value: variant.rawValue)
// Micro-jitter: imperceptibly adjust opacity so WindowServer re-samples the wallpaper every frame. if jitterEnabled {
let jitter = sin(trigger * 100) * 0.000001 // Micro-jitter: imperceptibly adjust opacity so WindowServer re-samples the wallpaper every frame.
nsView.alphaValue = 1.0 - CGFloat(abs(jitter)) let jitter = sin(trigger * 100) * 0.000001
nsView.alphaValue = 1.0 - CGFloat(abs(jitter))
} else if nsView.alphaValue != 1.0 {
nsView.alphaValue = 1.0
}
nsView.needsDisplay = true nsView.needsDisplay = true
} }