liquid-glass

iOS 26 Liquid Glass design system for SwiftUI. Implements Apple's glassmorphism material effects, depth-based layering, and adaptive tinting. Follows Apple Human Interface Guidelines for glass materials. Use when: (1) Building iOS 26+ SwiftUI interfaces, (2) Implementing glassmorphism effects, (3) Creating translucent/frosted UI elements, (4) Designing with Apple's Liquid Glass aesthetic, (5) User mentions liquid glass, glassmorphism, or frosted glass UI.

Best use case

liquid-glass is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

iOS 26 Liquid Glass design system for SwiftUI. Implements Apple's glassmorphism material effects, depth-based layering, and adaptive tinting. Follows Apple Human Interface Guidelines for glass materials. Use when: (1) Building iOS 26+ SwiftUI interfaces, (2) Implementing glassmorphism effects, (3) Creating translucent/frosted UI elements, (4) Designing with Apple's Liquid Glass aesthetic, (5) User mentions liquid glass, glassmorphism, or frosted glass UI.

Teams using liquid-glass should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/liquid-glass/SKILL.md --create-dirs "https://raw.githubusercontent.com/stevengonsalvez/agents-in-a-box/main/toolkit/packages/skills/liquid-glass/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/liquid-glass/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How liquid-glass Compares

Feature / Agentliquid-glassStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

iOS 26 Liquid Glass design system for SwiftUI. Implements Apple's glassmorphism material effects, depth-based layering, and adaptive tinting. Follows Apple Human Interface Guidelines for glass materials. Use when: (1) Building iOS 26+ SwiftUI interfaces, (2) Implementing glassmorphism effects, (3) Creating translucent/frosted UI elements, (4) Designing with Apple's Liquid Glass aesthetic, (5) User mentions liquid glass, glassmorphism, or frosted glass UI.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Liquid Glass — iOS 26 SwiftUI Design System

## Overview

Liquid Glass is Apple's design language introduced in iOS 26 (2025). It features
translucent, depth-aware materials that react to content behind them. This skill
provides patterns for implementing Liquid Glass effects in SwiftUI.

## Core Principles

1. **Translucency over opacity** — Elements reveal the content beneath them
2. **Depth through layering** — Multiple glass layers create visual hierarchy
3. **Adaptive tinting** — Glass adapts color to surrounding content
4. **Motion and physics** — Elements respond to scroll, tilt, and interaction
5. **Semantic materials** — Use Apple's material types, not hardcoded colors

## SwiftUI Materials

### Built-in Materials (iOS 15+, enhanced iOS 26)

```swift
// Thin material — barely visible, subtle blur
.background(.thinMaterial)

// Regular material — standard glass effect
.background(.regularMaterial)

// Thick material — more opaque, stronger effect
.background(.thickMaterial)

// Ultra-thin material — maximum transparency
.background(.ultraThinMaterial)

// Ultra-thick material — nearly opaque
.background(.ultraThickMaterial)

// Bar material — for navigation/tab bars
.background(.bar)
```

### Liquid Glass Modifier (iOS 26+)

```swift
// New in iOS 26: native liquid glass effect
.glassEffect(.regular)

// With tinting
.glassEffect(.regular.tint(.blue))

// Interactive glass (responds to hover/press)
.glassEffect(.regular.interactive())
```

## Component Patterns

### Glass Card

```swift
struct GlassCard<Content: View>: View {
    let content: () -> Content

    var body: some View {
        content()
            .padding(20)
            .background(.ultraThinMaterial)
            .clipShape(RoundedRectangle(cornerRadius: 20, style: .continuous))
            .shadow(color: .black.opacity(0.1), radius: 10, y: 5)
            .overlay(
                RoundedRectangle(cornerRadius: 20, style: .continuous)
                    .stroke(.white.opacity(0.2), lineWidth: 0.5)
            )
    }
}

// Usage
GlassCard {
    VStack(alignment: .leading, spacing: 8) {
        Text("Title").font(.headline)
        Text("Subtitle").font(.subheadline).foregroundStyle(.secondary)
    }
}
```

### Glass Navigation Bar

```swift
struct GlassNavBar: View {
    let title: String

    var body: some View {
        HStack {
            Text(title)
                .font(.largeTitle.bold())
            Spacer()
        }
        .padding(.horizontal, 20)
        .padding(.vertical, 12)
        .background(.bar)
        .overlay(alignment: .bottom) {
            Divider().opacity(0.3)
        }
    }
}
```

### Glass Tab Bar

```swift
struct GlassTabBar: View {
    @Binding var selection: Int
    let items: [(icon: String, label: String)]

    var body: some View {
        HStack {
            ForEach(items.indices, id: \.self) { index in
                Button {
                    withAnimation(.spring(response: 0.3)) {
                        selection = index
                    }
                } label: {
                    VStack(spacing: 4) {
                        Image(systemName: items[index].icon)
                            .font(.system(size: 20))
                        Text(items[index].label)
                            .font(.caption2)
                    }
                    .foregroundStyle(selection == index ? .primary : .secondary)
                    .frame(maxWidth: .infinity)
                }
            }
        }
        .padding(.vertical, 8)
        .background(.ultraThinMaterial)
        .clipShape(RoundedRectangle(cornerRadius: 24, style: .continuous))
        .padding(.horizontal, 20)
    }
}
```

### Glass Button

```swift
struct GlassButton: View {
    let title: String
    let icon: String?
    let action: () -> Void

    var body: some View {
        Button(action: action) {
            HStack(spacing: 8) {
                if let icon {
                    Image(systemName: icon)
                }
                Text(title).fontWeight(.medium)
            }
            .padding(.horizontal, 20)
            .padding(.vertical, 12)
            .background(.ultraThinMaterial)
            .clipShape(Capsule())
            .overlay(Capsule().stroke(.white.opacity(0.2), lineWidth: 0.5))
        }
    }
}
```

### Glass Sheet / Modal

```swift
struct GlassSheet<Content: View>: View {
    let content: () -> Content

    var body: some View {
        content()
            .frame(maxWidth: .infinity)
            .padding(24)
            .background(.regularMaterial)
            .clipShape(RoundedRectangle(cornerRadius: 32, style: .continuous))
            .overlay(
                RoundedRectangle(cornerRadius: 32, style: .continuous)
                    .stroke(.white.opacity(0.15), lineWidth: 0.5)
            )
            .shadow(color: .black.opacity(0.2), radius: 20, y: 10)
            .padding(16)
    }
}
```

## Color & Tinting

### Adaptive Tinting

```swift
// Glass that picks up color from content beneath
.background(.ultraThinMaterial)
.environment(\.colorScheme, .dark) // Force dark glass

// Tinted glass
ZStack {
    Color.blue.opacity(0.15)
    content
}
.background(.ultraThinMaterial)
```

### Vibrancy

```swift
// Text that adapts to material behind it
Text("Label")
    .foregroundStyle(.primary) // Adapts to material

Text("Secondary")
    .foregroundStyle(.secondary) // Reduced prominence

// Use semantic colors — they adapt to materials
Text("Vibrant")
    .foregroundStyle(.primary)
    .environment(\.backgroundMaterial, .ultraThinMaterial)
```

## Layout Patterns

### Depth Layering

```
+-----------------------------------------+
| Background (image, gradient, video)     |  Layer 0: Content
+-----------------------------------------+
| Ultra-thin material overlay             |  Layer 1: Ambient glass
+-----------------------------------------+
| Regular material cards                  |  Layer 2: Content glass
+-----------------------------------------+
| Thick material controls                 |  Layer 3: Interactive glass
+-----------------------------------------+
| Bar material navigation                 |  Layer 4: Chrome glass
+-----------------------------------------+
```

**Rule**: Each layer up uses a thicker material. Never put thin material on top of thick.

### Scroll-Aware Glass

```swift
struct ScrollGlassHeader: View {
    @State private var scrollOffset: CGFloat = 0

    var body: some View {
        ZStack(alignment: .top) {
            ScrollView {
                // Content with offset tracking
                GeometryReader { geo in
                    Color.clear.preference(
                        key: ScrollOffsetKey.self,
                        value: geo.frame(in: .named("scroll")).minY
                    )
                }
                .frame(height: 0)

                // Actual content
                LazyVStack { /* ... */ }
                    .padding(.top, 60)
            }
            .coordinateSpace(name: "scroll")
            .onPreferenceChange(ScrollOffsetKey.self) { scrollOffset = $0 }

            // Glass header that intensifies on scroll
            Text("Title")
                .font(.headline)
                .frame(maxWidth: .infinity)
                .padding()
                .background(
                    scrollOffset < -10
                        ? AnyShapeStyle(.regularMaterial)
                        : AnyShapeStyle(.clear)
                )
                .animation(.easeInOut(duration: 0.2), value: scrollOffset < -10)
        }
    }
}
```

## Best Practices

1. **Never hardcode blur values** — Always use `.material` modifiers
2. **Test in both light and dark mode** — Glass renders differently
3. **Use `.continuous` corner style** — Apple's superellipse, not circular
4. **Keep glass layers to 3 max** — Too many layers reduce readability
5. **Use semantic foreground styles** — `.primary`, `.secondary`, not raw colors
6. **Add subtle borders** — `.white.opacity(0.15-0.25)` with 0.5pt stroke
7. **Shadow behind glass, not on it** — Shadow goes on the container
8. **Test on real devices** — Simulator doesn't perfectly render materials

Related Skills

workflow

8
from stevengonsalvez/agents-in-a-box

Guide through structured delivery workflow with plan, implement, validate phases

webapp-testing

8
from stevengonsalvez/agents-in-a-box

Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.

validate

8
from stevengonsalvez/agents-in-a-box

Verify implementation against specifications

ui-ux-pro-max

8
from stevengonsalvez/agents-in-a-box

UI/UX design intelligence. 67 styles, 96 palettes, 57 font pairings, 25 charts, 13 stacks (React, Next.js, Vue, Svelte, Astro, Nuxt, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui, Jetpack Compose). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app, .html, .tsx, .vue, .svelte. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient.

tui-style-guide

8
from stevengonsalvez/agents-in-a-box

TUI style guide for consistent terminal interface design

token-usage

8
from stevengonsalvez/agents-in-a-box

Show Claude Code token usage across sessions — daily, weekly, per-project, and per-session breakdowns. Parses {{HOME_TOOL_DIR}}/projects/**/*.jsonl for consumption data. Use when the user asks about token usage, costs, how many tokens were used, session statistics, or wants a usage report.

tmux-status

8
from stevengonsalvez/agents-in-a-box

Show status of all tmux sessions including dev environments, spawned agents, and running processes

tmux-monitor

8
from stevengonsalvez/agents-in-a-box

Monitor and report status of all tmux sessions including dev environments, spawned agents, and running processes. Uses tmuxwatch for enhanced visibility.

tmux-message

8
from stevengonsalvez/agents-in-a-box

Reliable peer-to-peer message delivery to other Claude Code instances via tmux send-keys. Use as a fallback when claude-peers MCP send_message fails to surface in the receiver's inbox (delivered server-side but receiver never picks it up — observed behaviour). Also use when sending a directive to a known Claude Code TUI session by tmux session name or fuzzy hint, or when injecting a multi-line directive into a peer's prompt and submitting it. Trigger phrases — "claude-peers fallback", "tmux send-keys", "send to peer via tmux", "inject directive", "deliver to nanoclaw/hermes peer", "peer message". Tmux-only — won't reach peers running outside tmux.

test-driven-development

8
from stevengonsalvez/agents-in-a-box

Use when implementing any feature or bugfix, before writing implementation code. Enforces RED-GREEN-REFACTOR cycle with test-first approach.

test-ainb

8
from stevengonsalvez/agents-in-a-box

Run tests for the ainb (agents-in-a-box) Rust workspace via a 5-layer strategy — unit, insta snapshot, mock-plugin compositing, real-plugin spawn, vhs recording. Wraps cargo + insta + vhs into one CLI. Use when Stevie says "/test-ainb", "test ainb", "run ainb tests", "snapshot <component>", "regenerate vhs tapes", or any phrasing about validating ainb test layers. The skill autodetects which ainb-tui worktree the cwd sits in and dispatches to scripts/run.sh.

sync-learnings

8
from stevengonsalvez/agents-in-a-box

Sync user-level agent config changes back to toolkit repository (works for Claude, Codex, Copilot)