axiom-liquid-glass by CharlesWiltgen
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
Content & Writing
238 Stars
16 Forks
Updated Jan 16, 2026, 03:16 PM
Why Use This
This skill provides specialized capabilities for CharlesWiltgen's codebase.
Use Cases
- Developing new features in the CharlesWiltgen repository
- Refactoring existing code to follow CharlesWiltgen standards
- Understanding and working with CharlesWiltgen's codebase structure
Install Guide
2 steps- 1
Skip this step if Ananke is already installed.
- 2
Skill Snapshot
Auto scan of skill assets. Informational only.
Valid SKILL.md
Checks against SKILL.md specification
Source & Community
Skill Stats
SKILL.md 610 Lines
Total Files 1
Total Size 0 B
License MIT
---
name: axiom-liquid-glass
description: 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
license: MIT
compatibility: iOS 26+, iPadOS 26+, macOS Tahoe+, axiom-visionOS 3+
metadata:
version: "1.2.0"
last-updated: "Added new iOS 26 APIs and backward compatibility guidance"
---
# Liquid Glass — Apple's New Material Design System
## When to Use This Skill
Use when:
- Implementing Liquid Glass effects in your app
- Reviewing existing UI for Liquid Glass adoption opportunities
- Debugging visual artifacts with Liquid Glass materials
- Optimizing Liquid Glass performance
- **Requesting expert review of Liquid Glass implementation**
- Understanding when to use Regular vs Clear variants
- Troubleshooting tinting, legibility, or adaptive behavior issues
#### Related Skills
- Use `axiom-liquid-glass-ref` for comprehensive app-wide adoption guidance (app icons, controls, navigation, menus, windows, platform considerations)
## Example Prompts
- "How is Liquid Glass different from blur effects? Should I adopt it?"
- "My lensing effect looks like a regular blur. What am I missing?"
- "Liquid Glass looks odd on iPad vs iPhone. How do I adjust?"
- "How do I ensure text contrast on top of Liquid Glass?"
- "What are the expert criteria for reviewing a Liquid Glass implementation?"
---
## What is Liquid Glass?
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:
- **Dynamically bends and shapes light** (lensing) rather than scattering it
- **Moves organically** like a lightweight liquid, responding to touch and app dynamism
- **Adapts automatically** to size, environment, content, and light/dark modes
- **Unifies design language** across all Apple platforms (iOS, iPadOS, macOS, axiom-visionOS)
**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.
---
## Visual Properties
### 1. Lensing (Primary Visual Characteristic)
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.
### 2. Motion & Fluidity
- Responds to interaction by flexing with light
- Gel-like flexibility communicates transient, malleable nature
- Elements lift into Liquid Glass on interaction (controls)
- Dynamic morphing between app states as a singular floating plane
### 3. Adaptive Behavior
Liquid Glass **continuously adapts** without fixed light/dark appearance:
- Shadows intensify when text scrolls underneath; tint shifts for legibility
- Small elements (navbars) independently flip light/dark; large elements (menus, sidebars) don't flip but adapt depth
- Ambient environment subtly spills onto surface
---
## Implementation Guide
### Basic API Usage
#### SwiftUI: `glassEffect` Modifier
```swift
// 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.
### Variants: Regular vs Clear
**CRITICAL DECISION**: Never mix Regular and Clear in the same interface.
#### Regular Variant (Default — 95% of Cases)
Most versatile. Full adaptive effects, automatic legibility, works in any size over any content. Use for navigation bars, tab bars, toolbars, buttons, menus, sidebars.
#### Clear Variant (Special Cases Only)
Permanently more transparent, no adaptive behaviors. **Requires dimming layer** for legibility.
**Use ONLY when ALL three conditions are met**:
1. Element is over **media-rich content**
2. Content layer won't be negatively affected by **dimming layer**
3. Content above glass is **bold and bright**
Using Clear without meeting all three conditions results in poor legibility. See `axiom-liquid-glass-ref` for implementation examples.
---
## Layered System Architecture
Liquid Glass is composed of four layers working together:
1. **Highlights** — Light sources produce highlights responding to geometry; some respond to device motion
2. **Shadows** — Content-aware: stronger over text, weaker over light backgrounds
3. **Internal Glow** — Material illuminates from within on interaction; spreads to nearby glass elements
4. **Adaptive Tinting** — Multiple layers adapt together to maintain hierarchy; all built-in automatically
---
## Scroll Edge Effects
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.
---
## Tinting & Color
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).
### Tinting Rules
```swift
// ✅ 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.
---
## Legibility & Contrast
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).
---
## Accessibility
Liquid Glass offers several accessibility features that modify material **without sacrificing its magic**:
### Reduced Transparency
- Makes Liquid Glass frostier
- Obscures more content behind it
- Applied automatically when system setting enabled
### Increased Contrast
- Makes elements predominantly black or white
- Highlights with contrasting border
- Applied automatically when system setting enabled
### Reduced Motion
- Decreases intensity of effects
- Disables elastic properties
- Applied automatically when system setting enabled
**Developer Action Required**: None - all features available automatically when using Liquid Glass.
---
## Performance Considerations
### View Hierarchy Impact
**Concern**: Liquid Glass rendering cost in complex view hierarchies
**Guidance**:
- Regular variant optimized for performance
- Larger elements (menus, sidebars) use more pronounced effects but managed by system
- Avoid excessive nesting of glass elements
**Optimization**:
```swift
// ❌ Avoid deep nesting
ZStack {
GlassContainer1()
.glassEffect()
ZStack {
GlassContainer2()
.glassEffect()
// More nesting...
}
}
// ✅ Flatten hierarchy
VStack {
GlassContainer1()
.glassEffect()
GlassContainer2()
.glassEffect()
}
```
### Rendering Costs
**Adaptive behaviors have computational cost**:
- Light/dark switching
- Shadow adjustments
- Tint calculations
- Lensing effects
**System handles optimization**, but be mindful:
- Don't animate Liquid Glass elements unnecessarily
- Use Clear variant sparingly (requires dimming layer computation)
- Profile with Instruments if experiencing performance issues
---
## Testing Liquid Glass
Test across these configurations:
- Light/dark modes
- Reduced Transparency enabled
- Increased Contrast enabled
- Reduced Motion enabled
- Dynamic Type (larger text sizes)
- Content scrolling (verify scroll edge effects)
- Right-to-left languages
See `axiom-ui-testing` for comprehensive UI testing patterns including visual regression and accessibility testing.
---
## Design Review Pressure: Defending Your Implementation
### The Problem
Under design review pressure, you'll face requests to:
- "Use Clear variant everywhere — Regular is too opaque"
- "Glass on all controls for visual cohesion"
- "More transparency to let content shine through"
These sound reasonable. **But they violate the framework.** Your job: defend using evidence, not opinion.
### Red Flags — Designer Requests That Violate Skill Guidelines
If you hear ANY of these, **STOP and reference the skill**:
- ❌ **"Use Clear everywhere"** – Clear requires three specific conditions, not design preference
- ❌ **"Glass looks better than fills"** – Correct layer (navigation vs content) trumps aesthetics
- ❌ **"Users won't notice the difference"** – Clear variant fails legibility tests in low-contrast scenarios
- ❌ **"Stack glass on glass for consistency"** – Explicitly prohibited; use fills instead
- ❌ **"Apply glass to Lists for sophistication"** – Lists are content layer; causes visual confusion
### How to Push Back Professionally
#### Step 1: Show the Framework
```
"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..."
```
#### Step 2: Demonstrate the Risk
Open the app on a device. Show:
- Clear variant in low-contrast scenario (unreadable)
- Regular variant in same scenario (legible)
#### Step 3: Offer Compromise
```
"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."
```
#### Step 4: Document the Decision
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."
```
#### Why this works
- You're not questioning their taste (you like Clear too)
- You're raising accessibility/legibility risk
- You're offering a solution that preserves their vision in hero sections
- You're documenting the decision (protects you post-launch)
### Real-World Example: App Store Launch Blocker (36-Hour Deadline)
#### Scenario
- 36 hours to launch
- Chief designer says: "Clear variant everywhere"
- Client watching the review meeting
- You already implemented Regular per the skill
#### What to do
```swift
// 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
```
#### Result
- 30-minute compromise demo
- 90 minutes to implement changes
- Launch on schedule with optimal legibility
- No post-launch accessibility complaints
### When to Accept the Design Decision (Even If You Disagree)
Sometimes designers have valid reasons to override the skill. Accept if:
- [ ] They understand the three-condition framework
- [ ] They're willing to accept legibility risks
- [ ] You document the decision in writing
- [ ] They commit to monitoring post-launch feedback
#### Document in Slack
```
"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.
---
## Expert Review Checklist
When reviewing Liquid Glass implementation (your code or others'), check:
### 1. Material Appropriateness
- [ ] Is Liquid Glass used only on navigation layer (not content)?
- [ ] Are standard controls getting glass automatically via Xcode 26 recompile?
- [ ] Is glass avoided on glass situations?
### 2. Variant Selection
- [ ] Is Regular variant used for most cases?
- [ ] If Clear variant used, do all three conditions apply?
- [ ] Over media-rich content?
- [ ] Dimming layer acceptable?
- [ ] Content above is bold and bright?
- [ ] Are Regular and Clear never mixed in same interface?
### 3. Legibility & Contrast
- [ ] Are primary actions selectively tinted (not everything)?
- [ ] Is color used in content layer for overall app color scheme?
- [ ] Are solid fills avoided on glass elements?
- [ ] Do elements maintain legibility on various backgrounds?
### 4. Layering & Hierarchy
- [ ] Are content intersections avoided in steady states?
- [ ] Are elements on top of glass using fills/transparency (not glass)?
- [ ] Is visual hierarchy clear (navigation layer vs content layer)?
### 5. Scroll Edge Effects
- [ ] Are scroll edge effects applied where Liquid Glass meets scrolling content?
- [ ] Is hard style used for pinned accessory views?
### 6. Accessibility
- [ ] Does implementation work with Reduced Transparency?
- [ ] Does implementation work with Increased Contrast?
- [ ] Does implementation work with Reduced Motion?
- [ ] Are interactive elements hittable in all configurations?
### 7. Performance
- [ ] Is view hierarchy reasonably flat?
- [ ] Are glass elements animated only when necessary?
- [ ] Is Clear variant used sparingly?
---
## Common Mistakes & Solutions
### Glass Placement Errors
```swift
// ❌ 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)
}
```
### Over-Tinting
Tint primary action only. When everything is tinted, nothing stands out.
### Static Material Expectations
Don't hardcode shadows or fixed opacity. Embrace adaptive behavior — test across light/dark modes and backgrounds.
---
## Troubleshooting
### Visual Artifacts
**Issue**: Glass appears too transparent or invisible
**Check**:
1. Are you using Clear variant? (Switch to Regular if inappropriate)
2. Is background content extremely light or dark? (Glass adapts - this may be correct behavior)
3. Is Reduced Transparency enabled? (Check accessibility settings)
**Issue**: Glass appears opaque or has harsh edges
**Check**:
1. Are you using solid fills on glass? (Remove, use tinting)
2. Is Increased Contrast enabled? (Expected behavior)
3. Is custom shape too complex? (Simplify geometry)
### Dark Mode Issues
**Issue**: Glass doesn't flip to dark style on dark backgrounds
**Check**:
1. Is element large (menu, sidebar)? (Large elements don't flip - by design)
2. Is background actually dark? (Use Color Picker to verify)
3. Are you overriding appearance? (Remove `.preferredColorScheme()` if unintended)
**Issue**: Content on glass not legible in dark mode
**Fix**:
```swift
// 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
```
### Performance Issues
**Issue**: Scrolling feels janky with Liquid Glass
**Debug**:
1. Profile with Instruments (see `axiom-swiftui-performance` skill)
2. Check for excessive view body updates
3. Simplify view hierarchy under glass
4. Verify not applying glass to content layer (major performance hit)
**Issue**: Animations stuttering
**Check**:
1. Are you animating glass shape changes? (Expensive)
2. Profile with SwiftUI Instrument for long view updates
3. Consider reducing glass usage if critical path
---
## Migration from Previous Materials
### From UIBlurEffect / NSVisualEffectView
**Before** (UIKit):
```swift
let blurEffect = UIBlurEffect(style: .systemMaterial)
let blurView = UIVisualEffectView(effect: blurEffect)
view.addSubview(blurView)
```
**After** (SwiftUI with Liquid Glass):
```swift
ZStack {
// Content
}
.glassEffect()
```
**Benefits**: Automatic adaptation (no manual style switching), built-in interaction feedback, platform-appropriate appearance, accessibility features included.
### From Custom Materials
1. **Try Liquid Glass first** — may provide desired effect automatically
2. **Evaluate Regular vs Clear** — Clear may match custom transparency needs
3. **Test across configurations** — Liquid Glass adapts automatically
**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.
### UIKit + SwiftUI Interop
When migrating incrementally, glass effects apply per-framework:
- SwiftUI views get `.glassEffect()` / `.glassBackgroundEffect()`
- UIKit views use the UIKit Liquid Glass APIs (see `axiom-liquid-glass-ref` for migration mapping)
- Hosted SwiftUI views inside `UIHostingController` get glass effects independently
See `axiom-liquid-glass-ref` for complete UIBlurEffect migration mapping table.
---
## Backward Compatibility
### UIDesignRequiresCompatibility Key (iOS 26)
To ship with latest SDKs while maintaining previous appearance:
```xml
<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**:
1. Ship with `UIDesignRequiresCompatibility` enabled
2. Audit interface changes in separate build
3. Update interface incrementally
4. Remove key when ready for Liquid Glass
---
## API Reference
For 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`.
---
## Resources
**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
Name Size