opção
LarLar Skill Outros liquid-glass-design

liquid-glass-design

affaan-m/ECC affaan-m/ECC

Implementar o sistema de design Liquid Glass da Apple para o iOS 26+ com materiais de vidro dinâmicos, desfoque, reflexo e transformação interativa no SwiftUI, UIKit e WidgetKit.

...Expandir tudo
7
Tempo atualizado 12 de Outubro de 2026

Sistema de Design Liquid Glass (iOS 26)

Padrões para implementar o Liquid Glass da Apple — um material dinâmico que desfoca o conteúdo por trás dele, reflete a cor e a luz do conteúdo ao redor e reage a interações por toque e com o ponteiro. Abrange a integração com SwiftUI, UIKit e WidgetKit.

Quando ativar

  • Ao criar ou atualizar aplicativos para iOS 26+ com a nova linguagem de design
  • Ao implementar botões, cartões, barras de ferramentas ou contêineres no estilo de vidro
  • Criação de transições de transformação entre elementos de vidro
  • Aplicando efeitos do Liquid Glass a widgets
  • Migrar efeitos de desfoque/material existentes para a nova API do Liquid Glass

Padrão básico — SwiftUI

Efeito de vidro básico

A maneira mais simples de adicionar o Liquid Glass a qualquer visualização:

Text("Olá, Mundo!")
    .font(.title)
    .padding()
    .glassEffect()  // Padrão: variante regular, formato de cápsula

Personalizando a forma e a tonalidade

Text("Hello, World!")
    .font(.title)
    .padding()
    .glassEffect(.regular.tint(.orange).interactive(), in: .rect(cornerRadius: 16.0))

Principais opções de personalização:

  • .regular — efeito de vidro padrão
  • .tint(Cor) — adiciona matiz de cor para destacar
  • .interactive() — reage a interações por toque e do ponteiro
  • Forma: .capsule (padrão), .rect(cornerRadius:), .circle

Estilos de botões com efeito de vidro

Button("Clique aqui") { /* ação */ }
    .buttonStyle(.glass)

Button("Importante") { /* ação */ }
    .buttonStyle(.glassProminent)

GlassEffectContainer para vários elementos

Sempre coloque várias visualizações de vidro dentro de um contêiner para melhorar o desempenho e a transição:

GlassEffectContainer(spacing: 40.0) {
    HStack(spacing: 40.0) {
        Image(systemName: "scribble.variable")
            .frame(width: 80.0, height: 80.0)
            .font(.system(size: 36))
            .glassEffect()

        Image(systemName: "eraser.fill")
            .frame(width: 80.0, height: 80.0)
            .font(.system(size: 36))
            .glassEffect()
    }
}

O parâmetro de espaçamento controla a distância de fusão — elementos mais próximos misturam suas formas de vidro.

Unindo efeitos de vidro

Combine várias visualizações em uma única forma de vidro com glassEffectUnion:

@Namespace private var namespace

GlassEffectContainer(spacing: 20.0) {
    HStack(spacing: 20.0) {
        ForEach(symbolSet.indices, id: \.self) { item in
            Image(systemName: symbolSet[item])
                .frame(width: 80.0, height: 80.0)
                .glassEffect()
                .glassEffectUnion(id: item < 2 ? "group1" : "group2", namespace: namespace)
        }
    }
}

Transições de morphing

Crie uma transição suave com efeito de morphing quando os elementos de vidro aparecerem ou desaparecerem:

@State private var isExpanded = false
@Namespace private var namespace

GlassEffectContainer(spacing: 40.0) {
    HStack(spacing: 40.0) {
        Image(systemName: "scribble.variable")
            .frame(width: 80.0, height: 80.0)
            .glassEffect()
            .glassEffectID("pencil", in: namespace)

        if isExpanded {
            Image(systemName: "eraser.fill")
                .frame(width: 80.0, height: 80.0)
                .glassEffect()
                .glassEffectID("eraser", in: namespace)
        }
    }
}

Button("Alternar") {
    withAnimation { isExpanded.toggle() }
}
.buttonStyle(.glass)

Estendendo a rolagem horizontal sob a barra lateral

Para permitir que o conteúdo da rolagem horizontal se estenda abaixo de uma barra lateral ou de um inspetor, certifique-se de que o conteúdo do ScrollView alcance as bordas inicial e final do contêiner. O sistema lida automaticamente com o comportamento de rolagem abaixo da barra lateral quando o layout se estende até as bordas — não é necessário nenhum modificador adicional.

Padrão básico — UIKit

UIGlassEffect básico

let glassEffect = UIGlassEffect()
glassEffect.tintColor = UIColor.systemBlue.withAlphaComponent(0.3)
glassEffect.isInteractive = true

let visualEffectView = UIVisualEffectView(effect: glassEffect)
visualEffectView.translatesAutoresizingMaskIntoConstraints = false
visualEffectView.layer.cornerRadius = 20
visualEffectView.clipsToBounds = true

view.addSubview(visualEffectView)
NSLayoutConstraint.activate([
    visualEffectView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    visualEffectView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    visualEffectView.widthAnchor.constraint(equalToConstant: 200),
    visualEffectView.heightAnchor.constraint(equalToConstant: 120)
])

// Adicionar conteúdo à contentView
let label = UILabel()
label.text = "Liquid Glass"
label.translatesAutoresizingMaskIntoConstraints = false
visualEffectView.contentView.addSubview(label)
NSLayoutConstraint.activate([
    label.centerXAnchor.constraint(equalTo: visualEffectView.contentView.centerXAnchor),
    label.centerYAnchor.constraint(equalTo: visualEffectView.contentView.centerYAnchor)
])

UIGlassContainerEffect para vários elementos

let containerEffect = UIGlassContainerEffect()
containerEffect.spacing = 40.0

let containerView = UIVisualEffectView(effect: containerEffect)

let firstGlass = UIVisualEffectView(effect: UIGlassEffect())
let secondGlass = UIVisualEffectView(effect: UIGlassEffect())

containerView.contentView.addSubview(firstGlass)
containerView.contentView.addSubview(secondGlass)

Efeitos nas bordas de rolagem

scrollView.topEdgeEffect.style = .automatic
scrollView.bottomEdgeEffect.style = .hard
scrollView.leftEdgeEffect.isHidden = true

Integração do efeito de vidro na barra de ferramentas

let favoriteButton = UIBarButtonItem(image: UIImage(systemName: "heart"), style: .plain, target: self, action: #selector(favoriteAction))
favoriteButton.hidesSharedBackground = true  // Desativar o fundo de vidro compartilhado

Padrão básico — WidgetKit

Detecção do modo de renderização

struct MyWidgetView: View {
    @Environment(\.widgetRenderingMode) var renderingMode

    var body: some View {
        if renderingMode == .accented {
            // Modo com tonalidade: fundo de vidro com tonalidade branca e tema
        } else {
            // Modo colorido: aparência padrão
        }
    }
}

Grupos de destaque para hierarquia visual

HStack {
    VStack(alignment: .leading) {
        Text("Título")
            .widgetAccentable()  // Grupo de destaque
        Text("Subtítulo")
            // Grupo primário (padrão)
    }
    Image(systemName: "star.fill")
        .widgetAccentable()  // Grupo de destaque
}

Renderização de imagem no modo com destaque

Image("myImage")
    .widgetAccentedRenderingMode(.monochrome)

Fundo do contêiner

VStack { /* conteúdo */ }
    .containerBackground(for: .widget) {
        Color.blue.opacity(0.2)
    }

Principais decisões de design

Decisão Justificativa
Envolvimento do GlassEffectContainer Otimização de desempenho, permite a transição entre elementos de vidro
parâmetrode espaçamento Controla a distância de fusão — ajusta com precisão a proximidade necessária entre os elementos para que se misturem
@Namespace + glassEffectID Permite transições suaves de morphing ao ocorrerem mudanças na hierarquia de visualização
modificadorinteractive() Ativa explicitamente as reações ao toque ou ao ponteiro — nem todo o efeito de vidro deve responder
UIGlassContainerEffect no UIKit O mesmo padrão de contêiner do SwiftUI para garantir a consistência
Modo de renderização com destaque nos widgets O sistema aplica vidro colorido quando o usuário seleciona a tela inicial colorida

Melhores práticas

  • Sempre use GlassEffectContainer ao aplicar o efeito de vidro a várias visualizações irmãs — isso permite a transição gradual e melhora o desempenho da renderização
  • Aplique .glassEffect() após outros modificadores de aparência (frame, font, padding)
  • Use .interactive() apenas em elementos que respondam à interação do usuário (botões, itens com botões de alternância)
  • Escolha cuidadosamente o espaçamento nos contêineres para controlar quando os efeitos de vidro se fundem
  • Use withAnimation ao alterar hierarquias de visualizações para permitir transições de morphing suaves
  • Teste em todas as aparências — modo claro, modo escuro e modos acentuados/matizados
  • Garanta o contraste de acessibilidade — o texto sobre o efeito de vidro deve permanecer legível

Antipadrões a serem evitados

  • Usar várias visualizações .glassEffect() independentes sem um GlassEffectContainer
  • Aninhar muitos efeitos de vidro — prejudica o desempenho e a clareza visual
  • Aplicar o efeito de vidro a todas as visualizações — reserve-o para elementos interativos, barras de ferramentas e cartões
  • Esquecer de definir clipsToBounds = true no UIKit ao usar raios nos cantos
  • Ignorar o modo de renderização acentuado nos widgets — prejudica a aparência colorida da Tela Inicial
  • Usar fundos opacos atrás do efeito de vidro — anula o efeito de translucidez

Quando usar

  • Barras de navegação, barras de ferramentas e barras de abas com o novo design do iOS 26
  • Botões de ação flutuantes e contêineres no estilo cartão
  • Controles interativos que exigem profundidade visual e feedback tátil
  • Widgets que devem se integrar à aparência “Liquid Glass” do sistema
  • Transições de transformação entre estados relacionados da interface do usuário
Ver no GitHub
---
name: liquid-glass-design
description: Implement Apple's Liquid Glass design system for iOS 26+ with dynamic glass materials, blur, reflection, and interactive morphing in SwiftUI, UIKit, and WidgetKit.
---

# Liquid Glass Design System (iOS 26)

Patterns for implementing Apple's Liquid Glass — a dynamic material that blurs content behind it, reflects color and light from surrounding content, and reacts to touch and pointer interactions. Covers SwiftUI, UIKit, and WidgetKit integration.

## When to Activate

- Building or updating apps for iOS 26+ with the new design language
- Implementing glass-style buttons, cards, toolbars, or containers
- Creating morphing transitions between glass elements
- Applying Liquid Glass effects to widgets
- Migrating existing blur/material effects to the new Liquid Glass API

## Core Pattern — SwiftUI

### Basic Glass Effect

The simplest way to add Liquid Glass to any view:

```swift
Text("Hello, World!")
    .font(.title)
    .padding()
    .glassEffect()  // Default: regular variant, capsule shape
```

### Customizing Shape and Tint

```swift
Text("Hello, World!")
    .font(.title)
    .padding()
    .glassEffect(.regular.tint(.orange).interactive(), in: .rect(cornerRadius: 16.0))
```

Key customization options:
- `.regular` — standard glass effect
- `.tint(Color)` — add color tint for prominence
- `.interactive()` — react to touch and pointer interactions
- Shape: `.capsule` (default), `.rect(cornerRadius:)`, `.circle`

### Glass Button Styles

```swift
Button("Click Me") { /* action */ }
    .buttonStyle(.glass)

Button("Important") { /* action */ }
    .buttonStyle(.glassProminent)
```

### GlassEffectContainer for Multiple Elements

Always wrap multiple glass views in a container for performance and morphing:

```swift
GlassEffectContainer(spacing: 40.0) {
    HStack(spacing: 40.0) {
        Image(systemName: "scribble.variable")
            .frame(width: 80.0, height: 80.0)
            .font(.system(size: 36))
            .glassEffect()

        Image(systemName: "eraser.fill")
            .frame(width: 80.0, height: 80.0)
            .font(.system(size: 36))
            .glassEffect()
    }
}
```

The `spacing` parameter controls merge distance — closer elements blend their glass shapes together.

### Uniting Glass Effects

Combine multiple views into a single glass shape with `glassEffectUnion`:

```swift
@Namespace private var namespace

GlassEffectContainer(spacing: 20.0) {
    HStack(spacing: 20.0) {
        ForEach(symbolSet.indices, id: \.self) { item in
            Image(systemName: symbolSet[item])
                .frame(width: 80.0, height: 80.0)
                .glassEffect()
                .glassEffectUnion(id: item < 2 ? "group1" : "group2", namespace: namespace)
        }
    }
}
```

### Morphing Transitions

Create smooth morphing when glass elements appear/disappear:

```swift
@State private var isExpanded = false
@Namespace private var namespace

GlassEffectContainer(spacing: 40.0) {
    HStack(spacing: 40.0) {
        Image(systemName: "scribble.variable")
            .frame(width: 80.0, height: 80.0)
            .glassEffect()
            .glassEffectID("pencil", in: namespace)

        if isExpanded {
            Image(systemName: "eraser.fill")
                .frame(width: 80.0, height: 80.0)
                .glassEffect()
                .glassEffectID("eraser", in: namespace)
        }
    }
}

Button("Toggle") {
    withAnimation { isExpanded.toggle() }
}
.buttonStyle(.glass)
```

### Extending Horizontal Scrolling Under Sidebar

To allow horizontal scroll content to extend under a sidebar or inspector, ensure the `ScrollView` content reaches the leading/trailing edges of the container. The system automatically handles the under-sidebar scrolling behavior when the layout extends to the edges — no additional modifier is needed.

## Core Pattern — UIKit

### Basic UIGlassEffect

```swift
let glassEffect = UIGlassEffect()
glassEffect.tintColor = UIColor.systemBlue.withAlphaComponent(0.3)
glassEffect.isInteractive = true

let visualEffectView = UIVisualEffectView(effect: glassEffect)
visualEffectView.translatesAutoresizingMaskIntoConstraints = false
visualEffectView.layer.cornerRadius = 20
visualEffectView.clipsToBounds = true

view.addSubview(visualEffectView)
NSLayoutConstraint.activate([
    visualEffectView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    visualEffectView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    visualEffectView.widthAnchor.constraint(equalToConstant: 200),
    visualEffectView.heightAnchor.constraint(equalToConstant: 120)
])

// Add content to contentView
let label = UILabel()
label.text = "Liquid Glass"
label.translatesAutoresizingMaskIntoConstraints = false
visualEffectView.contentView.addSubview(label)
NSLayoutConstraint.activate([
    label.centerXAnchor.constraint(equalTo: visualEffectView.contentView.centerXAnchor),
    label.centerYAnchor.constraint(equalTo: visualEffectView.contentView.centerYAnchor)
])
```

### UIGlassContainerEffect for Multiple Elements

```swift
let containerEffect = UIGlassContainerEffect()
containerEffect.spacing = 40.0

let containerView = UIVisualEffectView(effect: containerEffect)

let firstGlass = UIVisualEffectView(effect: UIGlassEffect())
let secondGlass = UIVisualEffectView(effect: UIGlassEffect())

containerView.contentView.addSubview(firstGlass)
containerView.contentView.addSubview(secondGlass)
```

### Scroll Edge Effects

```swift
scrollView.topEdgeEffect.style = .automatic
scrollView.bottomEdgeEffect.style = .hard
scrollView.leftEdgeEffect.isHidden = true
```

### Toolbar Glass Integration

```swift
let favoriteButton = UIBarButtonItem(image: UIImage(systemName: "heart"), style: .plain, target: self, action: #selector(favoriteAction))
favoriteButton.hidesSharedBackground = true  // Opt out of shared glass background
```

## Core Pattern — WidgetKit

### Rendering Mode Detection

```swift
struct MyWidgetView: View {
    @Environment(\.widgetRenderingMode) var renderingMode

    var body: some View {
        if renderingMode == .accented {
            // Tinted mode: white-tinted, themed glass background
        } else {
            // Full color mode: standard appearance
        }
    }
}
```

### Accent Groups for Visual Hierarchy

```swift
HStack {
    VStack(alignment: .leading) {
        Text("Title")
            .widgetAccentable()  // Accent group
        Text("Subtitle")
            // Primary group (default)
    }
    Image(systemName: "star.fill")
        .widgetAccentable()  // Accent group
}
```

### Image Rendering in Accented Mode

```swift
Image("myImage")
    .widgetAccentedRenderingMode(.monochrome)
```

### Container Background

```swift
VStack { /* content */ }
    .containerBackground(for: .widget) {
        Color.blue.opacity(0.2)
    }
```

## Key Design Decisions

| Decision | Rationale |
|----------|-----------|
| GlassEffectContainer wrapping | Performance optimization, enables morphing between glass elements |
| `spacing` parameter | Controls merge distance — fine-tune how close elements must be to blend |
| `@Namespace` + `glassEffectID` | Enables smooth morphing transitions on view hierarchy changes |
| `interactive()` modifier | Explicit opt-in for touch/pointer reactions — not all glass should respond |
| UIGlassContainerEffect in UIKit | Same container pattern as SwiftUI for consistency |
| Accented rendering mode in widgets | System applies tinted glass when user selects tinted Home Screen |

## Best Practices

- **Always use GlassEffectContainer** when applying glass to multiple sibling views — it enables morphing and improves rendering performance
- **Apply `.glassEffect()` after** other appearance modifiers (frame, font, padding)
- **Use `.interactive()`** only on elements that respond to user interaction (buttons, toggleable items)
- **Choose spacing carefully** in containers to control when glass effects merge
- **Use `withAnimation`** when changing view hierarchies to enable smooth morphing transitions
- **Test across appearances** — light mode, dark mode, and accented/tinted modes
- **Ensure accessibility contrast** — text on glass must remain readable

## Anti-Patterns to Avoid

- Using multiple standalone `.glassEffect()` views without a GlassEffectContainer
- Nesting too many glass effects — degrades performance and visual clarity
- Applying glass to every view — reserve for interactive elements, toolbars, and cards
- Forgetting `clipsToBounds = true` in UIKit when using corner radii
- Ignoring accented rendering mode in widgets — breaks tinted Home Screen appearance
- Using opaque backgrounds behind glass — defeats the translucency effect

## When to Use

- Navigation bars, toolbars, and tab bars with the new iOS 26 design
- Floating action buttons and card-style containers
- Interactive controls that need visual depth and touch feedback
- Widgets that should integrate with the system's Liquid Glass appearance
- Morphing transitions between related UI states

Todos os arquivos

1 arquivos

Instalar liquid-glass-design

Baixe e descompacte os arquivos de habilidades no diretório .claude/skills/.

Baixar ZIP

Clone o repositório e copie os arquivos da habilidade para o seu projeto.

git clone https://github.com/affaan-m/ECC/tree/main/skills/liquid-glass-design # Copy SKILL.md to your .claude/skills/ directory

Copiar Copiar
Configuração rápida: Copie a pasta da habilidade para .claude/skills/ O Claude detectará e utilizará automaticamente a habilidade
Repositório affaan-m/ECC

Habilidades relacionadas

v4-new-features
Tempo atualizado 4 de Agosto de 2026
multica-creating-agents
Tempo atualizado 12 de Agosto de 2026
pixijs-application
Tempo atualizado 4 de Agosto de 2026
tilemaps
Tempo atualizado 4 de Agosto de 2026
OR