This snapshot establishes the camera-to-result recognition flow and related tests while checking in the project skill/docs assets required for the configured local tooling.
610 lines
20 KiB
Markdown
610 lines
20 KiB
Markdown
---
|
||
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
|