From cal
Apple Liquid Glass (iOS 26, refined in 27) design system reference. Invoke when building UI, reviewing visual design, or implementing glass effects, background extension, tab bar minimize, typography, spacing, animations, or accessibility.
How this skill is triggered — by the user, by Claude, or both
Slash command
/cal:designThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Research compiled from WWDC 2025, Apple Human Interface Guidelines, and developer community analysis.
Research compiled from WWDC 2025, Apple Human Interface Guidelines, and developer community analysis.
Hierarchy - "Establish a clear visual hierarchy where controls and interface elements elevate and distinguish the content beneath them."
Harmony - "Align with the concentric design of the hardware and software to create harmony between interface elements, system experiences, and devices."
Consistency - "Adopt platform conventions to maintain a consistent design that continuously adapts across window sizes and displays."
| Layer | Purpose | Treatment |
|---|---|---|
| Background | Content (wallpapers, media) | No glass |
| Glass | Panels, modals, cards | Semi-transparent, blur |
| Solid | Critical text, icons, CTAs | Always readable |
| Dynamic | Floating overlays | Context-responsive |
/* Light Mode Glass */
.glass {
background: rgba(255, 255, 255, 0.15);
backdrop-filter: blur(20px) saturate(180%);
-webkit-backdrop-filter: blur(20px) saturate(180%);
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: 22%; /* Squircle approximation */
box-shadow:
0 8px 32px rgba(31, 38, 135, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.5),
inset 0 4px 20px rgba(255, 255, 255, 0.3);
}
/* Dark Mode Glass */
.glass-dark {
background: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(20px) saturate(180%);
-webkit-backdrop-filter: blur(20px) saturate(180%);
border: 1px solid rgba(255, 255, 255, 0.1);
}
| Context | Blur | Saturation | Background Alpha |
|---|---|---|---|
| Default Glass | 15-20px | 180% | 0.15-0.20 |
| Subtle/Clear | 4-8px | 120% | 0.10-0.15 |
| Heavy Glass | 32px | 150% | 0.25-0.40 |
| Text Backing | 2-4px | 100% | 0.70-0.90 |
Add 2-3% opacity monochromatic noise layer for tactile feel (dithering effect).
opacity property - breaks backdrop-filter. Use rgba() values.-webkit-backdrop-filter - Safari compatibility.| Opacity | Use Case |
|---|---|
| 100% | Primary text, main CTAs, logos |
| 70% | Secondary text, navigation tabs, secondary buttons |
| 40% | Decorative dividers, outlines, icons |
| 20% | Subtle tints, background overlays, atmospheric effects |
| 4-8% | Glass base transparency plate |
.regular - Medium transparency, full adaptivity (default).clear - High transparency for media-rich backgrounds.identity - No effect (conditional disable)| Variant | Use Case | Weights |
|---|---|---|
| SF Pro Display | Headlines 20pt+ | Ultralight to Black (9 weights) |
| SF Pro Text | Body 19pt and below | Ultralight to Black (9 weights) |
| SF Pro Rounded | Friendly contexts | Ultralight to Black (no italics) |
| Style | Size | Weight | Use Case |
|---|---|---|---|
| Large Title | 34pt | Medium | Screen headers (before scroll) |
| Title 1 | 28pt | Regular | Section headers |
| Title 2 | 22pt | Regular | Card titles |
| Title 3 | 20pt | Regular | Subsections |
| Headline | 17pt | Semibold | Emphasizing body text |
| Body | 17pt | Regular | Default content |
| Callout | 16pt | Regular | Secondary content |
| Subhead | 15pt | Regular | Supporting labels |
| Footnote | 13pt | Regular | Tertiary/caption text |
| Caption 1 | 12pt | Regular | Timestamps, metadata |
| Caption 2 | 11pt | Regular | Fine print |
| Tab Bar | 10pt | Medium | Tab labels (iPhone) |
SF Pro has built-in optical sizing. General guidance:
| Token | Value | Use |
|---|---|---|
| xs | 4px | Tight inline spacing |
| sm | 8px | Icon-text gaps |
| md | 16px | Card padding |
| lg | 24px | Section spacing |
| xl | 32px | Major section breaks |
| 2xl | 48px | Page margins |
Tab bars and toolbars float with inset from edges. Typical implementation:
When nesting rounded elements, inner corners should be concentric (share same center as outer corners). Formula: innerRadius = outerRadius - padding
border-radius?Regular border-radius creates circular arcs with abrupt curvature changes (curvature jumps from 0 to 1/r). Apple's squircle has continuous curvature for smoother visual transitions.
Apple uses a quintic superellipse (n=5), not a true squircle (n=4):
|x|^n + |y|^n = r^n, where n = 5
However, actual iOS implementation uses 3 cubic Bezier curves per corner for efficiency.
Key constants (normalized to corner radius r):
| Constant | Value | Purpose |
|---|---|---|
| Edge point | 1.528665r | Where curve meets straight edge |
| Control 1 | 1.08849296r | First bezier handle |
| Control 2 | 0.86840694r | Second bezier handle |
| Near-corner | 0.07491139r | Point closest to corner |
Formula for corner radius: r = (p * l) / 200 where p = percentage, l = side length
/* Quick approximation - not perfect but acceptable */
.squircle {
border-radius: 22%; /* Scales with element size */
}
/* Better approximation for fixed sizes */
.squircle-fixed {
border-radius: 37.5% / 37.5%;
}
For pixel-perfect implementation, use SVG path or canvas with the Bezier constants above.
// iOS 13+: Use continuous corner curve
layer.cornerCurve = .continuous
layer.cornerRadius = 16
// iOS 26+: Concentric automatic nesting
ConcentricRectangle() // New SwiftUI shape
.rect(cornerRadius: .containerConcentric)
// Framer Motion / React Native
const spring = {
type: "spring",
stiffness: 400,
damping: 30,
mass: 1
};
// Bouncy variant
const bouncy = {
type: "spring",
stiffness: 300,
damping: 20
};
// SwiftUI equivalent
withAnimation(.spring(response: 0.3, dampingFraction: 0.6)) { }
| Behavior | Description |
|---|---|
| Lensing | Background bends through glass in real-time |
| Specular highlights | Move with device motion |
| Materialization | Elements appear by modulating light bending |
| Morphing | Dynamic transformation between states |
| Flexing | Gel-like response to touch |
// Tap feedback
const tapScale = {
whileTap: { scale: 0.98 },
transition: { type: "spring", stiffness: 400, damping: 30 }
};
// Hover glow (desktop)
const hoverGlow = {
whileHover: {
boxShadow: "0 0 20px rgba(100, 200, 255, 0.3)"
}
};
Not simple transparency - vibrancy samples background luminance:
// SwiftUI
.glassEffect(.regular.tint(.blue))
.glassEffect(.regular.tint(.purple.opacity(0.6)))
Materials auto-adjust tint and vibrancy. Glass base becomes darker with adjusted opacity.
| Content Type | Minimum Ratio |
|---|---|
| Normal text | 4.5:1 |
| Large text (18pt+ or 14pt bold) | 3:1 |
| UI components | 3:1 |
Glass effects respect accessibilityReduceTransparency and accessibilityReduceMotion environment values automatically.
Icons combine:
New "Clear" theme uses transparent glass-like icons with dynamic reflections.
Icons locked to invisible grid. Use Apple Design Resources templates for proper alignment.
Before shipping UI, verify:
Liquid Glass shipped in iOS 26 (everything above). iOS 27 refines it — Apple framed these as changes developers "must adopt," not optional. Sourced from iPhoneOS27.0.sdk SwiftUI (✅) and WWDC 2026 coverage (📰).
heroImage
.backgroundExtensionEffect() // content bleeds UNDER glass chrome, not clipped
.backgroundExtensionEffect(isEnabled: isScrolledUnder)
Use for full-bleed imagery/backdrops that should sit beneath translucent navigation/sidebars. This is the headline 27 glass modifier (the 26 core glassEffect / GlassEffectContainer are unchanged).
TabView { … }.tabBarMinimizeBehavior(.onScrollDown) // .automatic / .onScrollDown / .onScrollUp / .never
The floating glass tab bar shrinks on scroll to reclaim space. Adopt it on scroll-heavy screens so the glass chrome stays out of the way.
The glass toolbar must collapse gracefully on narrow widths. Assign visibilityPriority(.high/.low) to toolbar items; overflow goes to ToolbarOverflowMenu automatically. (Full API in swiftui27 §4.)
ToolbarItem { SaveButton() }.visibilityPriority(.high) // survives the squeeze
ToolbarItem { InfoButton() }.visibilityPriority(.low) // collapses to overflow first
iOS 27 adds a Settings slider letting users dial down glass transparency system-wide (an accessibility/personalization control beyond Reduce Transparency). Implication: never assume a fixed translucency — your contrast must hold across the full range. Re-run the contrast checks in §9 at both extremes, and keep relying on system materials (which respond to the setting) over hardcoded opacity.
.backgroundExtensionEffect()..tabBarMinimizeBehavior to scrollable tab screens.visibilityPriority; verify overflow behavior at iPhone-mini width.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub pixley-growth/cal-plugin --plugin cal