Use when implementing Liquid Glass effects, reviewing UI for Liquid Glass adoption, debugging visual artifacts, optimizing performance, or requesting expert review of Liquid Glass implementation - provides comprehensive design principles, API patterns, and troubleshooting guidance from WWDC 2025. Includes design review pressure handling and professional push-back frameworks
Provides expert guidance for implementing, debugging, and reviewing Apple's Liquid Glass material design system from WWDC 2025.
npx claudepluginhub charleswiltgen/axiomThis skill inherits all available tools. When active, it can use any tool Claude has access to.
Use when:
axiom-liquid-glass-ref for comprehensive app-wide adoption guidance (app icons, controls, navigation, menus, windows, platform considerations)Liquid Glass is Apple's next-generation material design system introduced at WWDC 2025. It represents a significant evolution from previous materials (Aqua, iOS 7 blurs, Dynamic Island) by creating a new digital meta-material that:
Core Philosophy: Liquid Glass complements the evolution of rounded, immersive screens with rounded, floating forms that feel natural to touch interaction while letting content shine through.
Liquid Glass defines itself through lensing — warping and bending light to communicate presence, motion, and form. Elements materialize in/out by modulating light bending (not fading). Controls feel ultra-lightweight yet visually distinguishable.
Liquid Glass continuously adapts without fixed light/dark appearance:
glassEffect Modifier// Basic usage - applies glass within capsule shape
Text("Hello")
.glassEffect()
// Custom shape
Text("Hello")
.glassEffect(in: RoundedRectangle(cornerRadius: 12))
// Interactive elements (iOS - for controls/containers)
Button("Tap Me") {
// action
}
.glassEffect()
.interactive() // Add for custom controls on iOS
Automatic Adoption: Simply recompiling with Xcode 26 brings Liquid Glass to standard controls automatically.
CRITICAL DECISION: Never mix Regular and Clear in the same interface.
Most versatile. Full adaptive effects, automatic legibility, works in any size over any content. Use for navigation bars, tab bars, toolbars, buttons, menus, sidebars.
Permanently more transparent, no adaptive behaviors. Requires dimming layer for legibility.
Use ONLY when ALL three conditions are met:
Using Clear without meeting all three conditions results in poor legibility. See axiom-liquid-glass-ref for implementation examples.
Liquid Glass is composed of four layers working together:
Scroll edge effects dissolve content into background as it scrolls, lifting glass above moving content. Use .scrollEdgeEffect(.hard) when pinned accessory views exist (e.g., column headers) for extra visual separation. See axiom-liquid-glass-ref for full API details.
Liquid Glass introduces adaptive tinting — selecting a color generates tones mapped to content brightness underneath, inspired by colored glass in reality. Compatible with all glass behaviors (morphing, adaptation, interaction).
// ✅ Tint primary actions only
Button("View Bag") { }.tint(.red).glassEffect()
// ❌ Don't tint everything — when everything is tinted, nothing stands out
VStack {
Button("Action 1").tint(.blue).glassEffect()
Button("Action 2").tint(.green).glassEffect() // No hierarchy
}
// ❌ Solid fills break Liquid Glass character
Button("Action") { }.background(.red) // Opaque, wrong
// ✅ Use .tint() instead of solid fills
Button("Action") { }.tint(.red).glassEffect() // Grounded in environment
Reserve tinting for primary UI actions. Use color in the content layer for overall app color scheme.
SwiftUI automatically uses vibrant text and tint colors within glass effects — no manual adjustment needed. Small elements (navbars, tabbars) flip light/dark for discernibility. Large elements (menus, sidebars) adapt but don't flip (too distracting for large surface area). Symbols/glyphs mirror glass behavior and maximize contrast automatically.
Use custom tint colors selectively for distinct functional purpose (e.g., .tint(.orange) on a single toolbar button for emphasis).
Liquid Glass offers several accessibility features that modify material without sacrificing its magic:
Developer Action Required: None - all features available automatically when using Liquid Glass.
Concern: Liquid Glass rendering cost in complex view hierarchies
Guidance:
Optimization:
// ❌ Avoid deep nesting
ZStack {
GlassContainer1()
.glassEffect()
ZStack {
GlassContainer2()
.glassEffect()
// More nesting...
}
}
// ✅ Flatten hierarchy
VStack {
GlassContainer1()
.glassEffect()
GlassContainer2()
.glassEffect()
}
Adaptive behaviors have computational cost:
System handles optimization, but be mindful:
Test across these configurations:
See axiom-ui-testing for comprehensive UI testing patterns including visual regression and accessibility testing.
Under design review pressure, you'll face requests to:
These sound reasonable. But they violate the framework. Your job: defend using evidence, not opinion.
If you hear ANY of these, STOP and reference the skill:
"I want to make this change, but let me show you Apple's guidance on Clear variant.
It requires THREE conditions:
1. Media-rich content background
2. Dimming layer for legibility
3. Bold, bright controls on top
Let me show which screens meet all three..."
Open the app on a device. Show:
"Clear can work beautifully in these 6 hero sections where all three conditions apply.
Regular handles everything else with automatic legibility. Best of both worlds."
If overruled (designer insists on Clear everywhere):
Slack message to PM + designer:
"Design review decided to use Clear variant across all controls.
Important: Clear variant requires legibility testing in low-contrast scenarios
(bright sunlight, dark content). If we see accessibility issues after launch,
we'll need an expedited follow-up. I'm flagging this proactively."
// In the meeting, demo side-by-side:
// Regular variant (current implementation)
NavigationBar()
.glassEffect() // Automatic legibility
// Clear variant (requested)
NavigationBar()
.glassEffect(.clear) // Requires dimming layer below
// Show the three-condition checklist
// Demonstrate which screens pass/fail
// Offer: Clear in hero sections, Regular elsewhere
Sometimes designers have valid reasons to override the skill. Accept if:
"Design review decided to use Clear variant [in these locations].
We understand this requires:
- All three conditions met: [list them]
- Potential legibility issues in low-contrast scenarios
- Accessibility testing across brightness levels
Monitoring plan:
- Gather user feedback first 48 hours
- Run accessibility audit
- Have fallback to Regular variant ready for push if needed"
This protects both of you and shows you're not blocking - just de-risking.
When reviewing Liquid Glass implementation (your code or others'), check:
// ❌ Glass on content layer — competes with navigation
List(landmarks) { landmark in
LandmarkRow(landmark).glassEffect()
}
// ✅ Glass on navigation layer only
.toolbar {
ToolbarItem { Button("Add") { }.glassEffect() }
}
// ❌ Clear without dimming — poor legibility
ZStack {
VideoPlayer(player: player)
PlayButton().glassEffect(.clear)
}
// ✅ Clear with dimming layer
ZStack {
VideoPlayer(player: player)
.overlay(.black.opacity(0.4))
PlayButton().glassEffect(.clear)
}
Tint primary action only. When everything is tinted, nothing stands out.
Don't hardcode shadows or fixed opacity. Embrace adaptive behavior — test across light/dark modes and backgrounds.
Issue: Glass appears too transparent or invisible
Check:
Issue: Glass appears opaque or has harsh edges
Check:
Issue: Glass doesn't flip to dark style on dark backgrounds
Check:
.preferredColorScheme() if unintended)Issue: Content on glass not legible in dark mode
Fix:
// Let SwiftUI handle contrast automatically
Text("Label")
.foregroundStyle(.primary) // ✅ Adapts automatically
// Don't hardcode colors
Text("Label")
.foregroundColor(.black) // ❌ Won't adapt to dark mode
Issue: Scrolling feels janky with Liquid Glass
Debug:
axiom-swiftui-performance skill)Issue: Animations stuttering
Check:
Before (UIKit):
let blurEffect = UIBlurEffect(style: .systemMaterial)
let blurView = UIVisualEffectView(effect: blurEffect)
view.addSubview(blurView)
After (SwiftUI with Liquid Glass):
ZStack {
// Content
}
.glassEffect()
Benefits: Automatic adaptation (no manual style switching), built-in interaction feedback, platform-appropriate appearance, accessibility features included.
When to keep custom materials: Specific artistic effect not achievable with Liquid Glass, backward compatibility with iOS < 26 required, or non-standard UI paradigm incompatible with Liquid Glass principles.
When migrating incrementally, glass effects apply per-framework:
.glassEffect() / .glassBackgroundEffect()axiom-liquid-glass-ref for migration mapping)UIHostingController get glass effects independentlySee axiom-liquid-glass-ref for complete UIBlurEffect migration mapping table.
To ship with latest SDKs while maintaining previous appearance:
<key>UIDesignRequiresCompatibility</key>
<true/>
Effect: App built with iOS 26 SDK, appearance matches iOS 18 and earlier, Liquid Glass effects disabled, previous blur/material styles used.
When to use: Need time to audit interface changes, gradual adoption strategy, or maintain exact appearance temporarily.
Migration strategy:
UIDesignRequiresCompatibility enabledFor complete API reference including glassEffect(), glassBackgroundEffect(), toolbar modifiers, scroll edge effects, navigation/search APIs, controls/layout, GlassEffectContainer, glassEffectID, types, and backward compatibility, see axiom-liquid-glass-ref.
WWDC: 2025-219, 2025-256, 2025-323 (Build a SwiftUI app with the new design)
Docs: /technologyoverviews/adopting-liquid-glass, /swiftui/landmarks-building-an-app-with-liquid-glass, /swiftui/applying-liquid-glass-to-custom-views
Skills: axiom-liquid-glass-ref
Platforms: iOS 26+, iPadOS 26+, macOS Tahoe, axiom-visionOS 3 Xcode: 26+ History: See git log for changes
Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.