Expo Liquid Glass
Ship Liquid Glass UI that feels native, stays legible, and degrades safely across iOS/Android.
Execution Order
- Confirm platform/runtime constraints.
- Check design alignment against HIG buckets (recommended for design-heavy tasks).
- Pick one primary implementation path (add a second path only if needed).
- Apply Apple-aligned visual rules before writing code.
- Implement guarded glass components with explicit fallbacks.
- Run accessibility and visual QA in both light/dark and clear/tinted appearances.
1) Preflight Constraints
- Use Liquid Glass only for controls/navigation chrome, not primary content surfaces.
- Treat these APIs as fast-moving: check current Expo SDK docs before finalizing syntax.
- Expect a development build for advanced iOS-native features:
expo-glass-effect and @expo/ui are not reliable in Expo Go on iOS.
- Keep scope on Liquid Glass in Expo: use HIG rules to guide implementation, not to redesign unrelated product behavior.
2) Design Alignment (Recommended for design-heavy tasks)
For tasks that involve significant visual design decisions, evaluate against these HIG buckets:
- Foundations
Check materials, color, layout, motion, and accessibility implications.
- Patterns
Check navigation/search/flow behavior for consistency with system expectations.
- Components
Check bars, buttons, menus, fields, sidebars, and overlays used by the screen.
- Inputs
Check touch, gesture, keyboard, and pointer behavior for parity and discoverability.
See references/apple-liquid-glass-design.md for practical design guidance.
If a proposed style conflicts with HIG intent, prefer the HIG-consistent option.
3) Choose the Primary Path
| Path |
Use It For |
Tradeoffs |
expo-glass-effect |
Most RN screens that need glass chips, floating buttons, toolbars, grouped controls |
Best default in Expo; must guard runtime availability |
@expo/ui (Host + SwiftUI modifiers) |
Native SwiftUI composition, advanced glass transitions, coordinated IDs/namespaces |
iOS-family only, dev-build workflow, SwiftUI mental model |
expo-router/unstable-native-tabs |
System-native Liquid Glass tab bars and iOS 26 nav behavior |
Unstable API; syntax differs between SDK 54 and 55 |
@callstack/liquid-glass |
Non-Expo RN or teams standardizing on Callstack package |
iOS/tvOS focus; also requires fallbacks and runtime checks |
Combine paths when appropriate:
- Use native tabs for navigation chrome.
- Use
expo-glass-effect for floating controls inside screens.
- Use
@expo/ui only where SwiftUI-specific behavior is required.
4) Apple-Style Design Rules (Critical)
Apply these rules before implementing visuals:
- Keep hierarchy in layout and spacing, not decorative layers.
- Group related controls into shared glass clusters; separate unrelated groups with space.
- Let content run edge-to-edge behind controls so glass has something to refract.
- Use system controls/material first; customize minimally.
- Move strong brand color into content/background, not navigation bars.
- Keep icons/labels high contrast in light, dark, clear, and tinted modes.
- Avoid full-screen glass sheets; reserve glass for top-level interaction surfaces.
5) Implementation Patterns
Pattern A: Guarded Adaptive Glass Wrapper
import { Platform, View } from 'react-native';
import { BlurView } from 'expo-blur';
import { GlassView, isGlassEffectAPIAvailable } from 'expo-glass-effect';
export function AdaptiveGlass({ style, children }) {
if (isGlassEffectAPIAvailable()) {
return (
<GlassView style={style} glassEffectStyle="regular" tintColor="#FFFFFF10">
{children}
</GlassView>
);
}
if (Platform.OS === 'ios') {
return (
<BlurView style={style} intensity={40} tint="dark">
{children}
</BlurView>
);
}
return <View style={[style, { backgroundColor: 'rgba(60,60,67,0.30)' }]}>{children}</View>;
}
Pattern B: Safe expo-glass-effect Usage
- Prefer
glassEffectStyle: 'regular' | 'clear' | 'identity' as needed.
- Never set
opacity < 1 on GlassView or parents.
- Treat
isInteractive as mount-time only. Remount using a key if it must change.
- Avoid scrollable content inside
GlassView.
- Check availability with
isGlassEffectAPIAvailable() before rendering.
Pattern C: Native Tabs (SDK-Specific Syntax)
SDK 55+ compound API:
<NativeTabs.Trigger name="index">
<NativeTabs.Trigger.TabBarIcon
ios={{ default: 'house', selected: 'house.fill' }}
androidIconName="home"
/>
<NativeTabs.Trigger.TabBarLabel>Home</NativeTabs.Trigger.TabBarLabel>
</NativeTabs.Trigger>
SDK 54 API:
<NativeTabs.Trigger name="index">
<NativeTabs.Trigger.Icon sf="house.fill" md="home" />
<NativeTabs.Trigger.Label>Home</NativeTabs.Trigger.Label>
</NativeTabs.Trigger>
Known issue: transparent NativeTabs can flash white while pushing screens in some stacks.
Mitigate by setting a background color via ThemeProvider (see native-tabs reference).
Pattern D: SwiftUI Glass with Namespace IDs
Use @expo/ui when coordinated glass transitions are needed:
import { Host, Namespace, Text } from '@expo/ui/swift-ui';
import { glassEffect, glassEffectID, padding } from '@expo/ui/swift-ui/modifiers';
const ns = new Namespace('glass');
<Host style={{ width: 220, height: 56 }}>
<Text
modifiers={[
padding({ all: 16 }),
glassEffect({ glass: { variant: 'regular' } }),
glassEffectID({ id: 'primary-chip', in: ns }),
]}
>
Explore
</Text>
</Host>;
6) Accessibility and Quality Gates
Treat this as required before completion:
- Check
AccessibilityInfo.isReduceTransparencyEnabled() and provide non-glass fallback.
- Verify legibility over bright, dark, and high-saturation backgrounds.
- Validate both clear and tinted system appearances on iOS 26.
- Keep hit targets and spacing stable during interactive animations.
- Measure scroll performance with and without glass on low-end test devices.
7) Common Failure Modes and Fixes
- Double blur in headers:
Native header blur + custom glass child causes muddy layering. Use a plain translucent View in header accessories.
- Flat-looking glass:
Solid backgrounds remove refraction cues. Add tonal variation, gradients, or imagery behind the surface.
- Over-customized controls:
Heavy tint/border/shadow stacks reduce native feel. Start from system defaults, then tune lightly.
- Missing runtime guards:
Rendering glass APIs unguarded can crash or silently degrade on unsupported builds.
- Version drift:
Native-tabs and SwiftUI wrappers evolve quickly; check SDK-specific docs before coding.
8) Reference Loading Strategy
Load only what is needed for the task:
references/expo-ui-swiftui.md: SwiftUI component mapping, Host layout, modifier patterns.
references/native-tabs.md: Native tab behaviors, migration notes, known issues.
references/callstack-liquid-glass.md: Callstack setup and compatibility tradeoffs.
references/apple-liquid-glass-design.md: Apple-aligned composition, hierarchy, motion, and accessibility rules.
If a request is design-heavy (not API-heavy), prioritize Apple visual rules in this file first,
then pull API syntax from the relevant reference.
1---2name: expo-liquid-glass3description: Design and implement beautiful, fluid Liquid Glass interfaces in Expo React Native apps. Covers four paths: (1) expo-glass-effect for UIKit-backed glass surfaces, (2) @expo/ui SwiftUI integration for native SwiftUI glass modifiers and advanced transitions, (3) Expo Router unstable native tabs for system Liquid Glass tab bars, and (4) @callstack/liquid-glass as a third-party alternative. Use when tasks mention "liquid glass", "glass effect", "frosted/translucent UI", "iOS 26 design", "native tabs", "expo-ui", "SwiftUI in Expo", or when shipping Apple-style glass with robust fallbacks, accessibility checks, HIG-aware design decisions (Foundations, Patterns, Components, Inputs), and cross-platform degradation.4---5
6# Expo Liquid Glass
7
8Ship Liquid Glass UI that feels native, stays legible, and degrades safely across iOS/Android.
9
10## Execution Order
11
121. Confirm platform/runtime constraints.
132. Check design alignment against HIG buckets (recommended for design-heavy tasks).
143. Pick one primary implementation path (add a second path only if needed).
154. Apply Apple-aligned visual rules before writing code.
165. Implement guarded glass components with explicit fallbacks.
176. Run accessibility and visual QA in both light/dark and clear/tinted appearances.
18
19## 1) Preflight Constraints
20
21- Use Liquid Glass only for **controls/navigation chrome**, not primary content surfaces.
22- Treat these APIs as fast-moving: check current Expo SDK docs before finalizing syntax.
23- Expect a development build for advanced iOS-native features:
24 `expo-glass-effect` and `@expo/ui` are not reliable in Expo Go on iOS.
25- Keep scope on Liquid Glass in Expo: use HIG rules to guide implementation, not to redesign unrelated product behavior.
26
27## 2) Design Alignment (Recommended for design-heavy tasks)
28
29For tasks that involve significant visual design decisions, evaluate against these HIG buckets:
30
311. **Foundations**
32 Check materials, color, layout, motion, and accessibility implications.
332. **Patterns**
34 Check navigation/search/flow behavior for consistency with system expectations.
353. **Components**
36 Check bars, buttons, menus, fields, sidebars, and overlays used by the screen.
374. **Inputs**
38 Check touch, gesture, keyboard, and pointer behavior for parity and discoverability.
39
40See `references/apple-liquid-glass-design.md` for practical design guidance.
41If a proposed style conflicts with HIG intent, prefer the HIG-consistent option.
42
43## 3) Choose the Primary Path
44
45| Path | Use It For | Tradeoffs |
46|---|---|---|
47| `expo-glass-effect` | Most RN screens that need glass chips, floating buttons, toolbars, grouped controls | Best default in Expo; must guard runtime availability |
48| `@expo/ui` (`Host` + SwiftUI modifiers) | Native SwiftUI composition, advanced glass transitions, coordinated IDs/namespaces | iOS-family only, dev-build workflow, SwiftUI mental model |
49| `expo-router/unstable-native-tabs` | System-native Liquid Glass tab bars and iOS 26 nav behavior | Unstable API; syntax differs between SDK 54 and 55 |
50| `@callstack/liquid-glass` | Non-Expo RN or teams standardizing on Callstack package | iOS/tvOS focus; also requires fallbacks and runtime checks |
51
52Combine paths when appropriate:
53- Use native tabs for navigation chrome.
54- Use `expo-glass-effect` for floating controls inside screens.
55- Use `@expo/ui` only where SwiftUI-specific behavior is required.
56
57## 4) Apple-Style Design Rules (Critical)
58
59Apply these rules before implementing visuals:
60
611. Keep hierarchy in layout and spacing, not decorative layers.
622. Group related controls into shared glass clusters; separate unrelated groups with space.
633. Let content run edge-to-edge behind controls so glass has something to refract.
644. Use system controls/material first; customize minimally.
655. Move strong brand color into content/background, not navigation bars.
666. Keep icons/labels high contrast in light, dark, clear, and tinted modes.
677. Avoid full-screen glass sheets; reserve glass for top-level interaction surfaces.
68
69## 5) Implementation Patterns
70
71### Pattern A: Guarded Adaptive Glass Wrapper
72
73```tsx
74import { Platform, View } from 'react-native';
75import { BlurView } from 'expo-blur';
76import { GlassView, isGlassEffectAPIAvailable } from 'expo-glass-effect';
77
78export function AdaptiveGlass({ style, children }) {
79 if (isGlassEffectAPIAvailable()) {
80 return (
81 <GlassView style={style} glassEffectStyle="regular" tintColor="#FFFFFF10">
82 {children}
83 </GlassView>
84 );
85 }
86
87 if (Platform.OS === 'ios') {
88 return (
89 <BlurView style={style} intensity={40} tint="dark">
90 {children}
91 </BlurView>
92 );
93 }
94
95 return <View style={[style, { backgroundColor: 'rgba(60,60,67,0.30)' }]}>{children}</View>;
96}
97```
98
99### Pattern B: Safe `expo-glass-effect` Usage
100
101- Prefer `glassEffectStyle`: `'regular' | 'clear' | 'identity'` as needed.
102- Never set `opacity < 1` on `GlassView` or parents.
103- Treat `isInteractive` as mount-time only. Remount using a `key` if it must change.
104- Avoid scrollable content inside `GlassView`.
105- Check availability with `isGlassEffectAPIAvailable()` before rendering.
106
107### Pattern C: Native Tabs (SDK-Specific Syntax)
108
109SDK 55+ compound API:
110
111```tsx
112<NativeTabs.Trigger name="index">
113 <NativeTabs.Trigger.TabBarIcon
114 ios={{ default: 'house', selected: 'house.fill' }}
115 androidIconName="home"
116 />
117 <NativeTabs.Trigger.TabBarLabel>Home</NativeTabs.Trigger.TabBarLabel>
118</NativeTabs.Trigger>
119```
120
121SDK 54 API:
122
123```tsx
124<NativeTabs.Trigger name="index">
125 <NativeTabs.Trigger.Icon sf="house.fill" md="home" />
126 <NativeTabs.Trigger.Label>Home</NativeTabs.Trigger.Label>
127</NativeTabs.Trigger>
128```
129
130Known issue: transparent `NativeTabs` can flash white while pushing screens in some stacks.
131Mitigate by setting a background color via `ThemeProvider` (see native-tabs reference).
132
133### Pattern D: SwiftUI Glass with Namespace IDs
134
135Use `@expo/ui` when coordinated glass transitions are needed:
136
137```tsx
138import { Host, Namespace, Text } from '@expo/ui/swift-ui';
139import { glassEffect, glassEffectID, padding } from '@expo/ui/swift-ui/modifiers';
140
141const ns = new Namespace('glass');
142
143<Host style={{ width: 220, height: 56 }}>
144 <Text
145 modifiers={[
146 padding({ all: 16 }),
147 glassEffect({ glass: { variant: 'regular' } }),
148 glassEffectID({ id: 'primary-chip', in: ns }),
149 ]}
150 >
151 Explore
152 </Text>
153</Host>;
154```
155
156## 6) Accessibility and Quality Gates
157
158Treat this as required before completion:
159
160- Check `AccessibilityInfo.isReduceTransparencyEnabled()` and provide non-glass fallback.
161- Verify legibility over bright, dark, and high-saturation backgrounds.
162- Validate both clear and tinted system appearances on iOS 26.
163- Keep hit targets and spacing stable during interactive animations.
164- Measure scroll performance with and without glass on low-end test devices.
165
166## 7) Common Failure Modes and Fixes
167
168- Double blur in headers:
169 Native header blur + custom glass child causes muddy layering. Use a plain translucent View in header accessories.
170- Flat-looking glass:
171 Solid backgrounds remove refraction cues. Add tonal variation, gradients, or imagery behind the surface.
172- Over-customized controls:
173 Heavy tint/border/shadow stacks reduce native feel. Start from system defaults, then tune lightly.
174- Missing runtime guards:
175 Rendering glass APIs unguarded can crash or silently degrade on unsupported builds.
176- Version drift:
177 Native-tabs and SwiftUI wrappers evolve quickly; check SDK-specific docs before coding.
178
179## 8) Reference Loading Strategy
180
181Load only what is needed for the task:
182
183- `references/expo-ui-swiftui.md`: SwiftUI component mapping, Host layout, modifier patterns.
184- `references/native-tabs.md`: Native tab behaviors, migration notes, known issues.
185- `references/callstack-liquid-glass.md`: Callstack setup and compatibility tradeoffs.
186- `references/apple-liquid-glass-design.md`: Apple-aligned composition, hierarchy, motion, and accessibility rules.
187
188If a request is design-heavy (not API-heavy), prioritize Apple visual rules in this file first,
189then pull API syntax from the relevant reference.