### Install @callstack/liquid-glass
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/callstack-liquid-glass.md
Install the library. For vanilla React Native projects use npm install; for Expo projects prefer npx expo install.
```bash
npm install @callstack/liquid-glass
```
```bash
npx expo install @callstack/liquid-glass
```
--------------------------------
### Install agent skills with npx
Source: https://github.com/devanshudesai/agent-skills/blob/main/README.md
Use this command to install the agent-skills package. After installation, skills are automatically available to the agent.
```bash
npx skills add devanshuDesai/agent-skills
```
--------------------------------
### Example prompts for using skills
Source: https://github.com/devanshudesai/agent-skills/blob/main/README.md
These example prompts show how to invoke the skills. They are provided as plain text examples, not executable code.
```text
Add a floating glass toolbar to the home screen
```
```text
Audit the design of my app
```
```text
Make the checkout screen look better
```
```text
Set up native Liquid Glass tab bars with expo-router
```
--------------------------------
### Install @expo/ui
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/expo-ui-swiftui.md
Install the @expo/ui package using npx expo install. Requires SDK 54+ and a development build.
```bash
npx expo install @expo/ui
```
--------------------------------
### SDK 54 to 55 Migration Example
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
This example shows the migration from SDK 54 to SDK 55 for trigger subcomponents. The SDK 54 code uses 'Icon' and 'Label', while SDK 55 uses 'TabBarIcon' and 'TabBarLabel'. The 'Icon' alias still works in SDK 55 for compatibility.
```tsx
// SDK 54
Home
// SDK 55
Home
```
--------------------------------
### Install expo-router@next for native tabs
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Install the unstable native tabs API using the current unstable channel. Requires Expo Router v6.
```bash
# current unstable channel
npx expo install expo-router@next
```
--------------------------------
### SwiftUI Layout with Host and HStack
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/expo-ui-swiftui.md
Use Host with HStack and VStack for layout instead of flexbox. The example shows a toolbar with left and right text separated by a Spacer, using padding and glassEffect modifiers.
```tsx
import { Host, HStack, VStack, Text, Spacer } from '@expo/ui/swift-ui';
import { padding, glassEffect } from '@expo/ui/swift-ui/modifiers';
function GlassToolbar() {
return (
LeftRight
);
}
```
--------------------------------
### Mixing React Native and SwiftUI Components
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/expo-ui-swiftui.md
Nest React Native components as JSX children within Host. The example shows a VStack with a SwiftUI Text and a comment indicating RN View usage.
```tsx
SwiftUI Text
{/* RN View as child - use with care */}
```
--------------------------------
### Guarded Adaptive Glass Wrapper (Pattern A)
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/SKILL.md
Use this component to render glass effects adaptively: expo-glass-effect when available, iOS blur as fallback, and a semi-transparent View otherwise. It requires expo-blur and expo-glass-effect installed.
```tsx
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 (
{children}
);
}
if (Platform.OS === 'ios') {
return (
{children}
);
}
return {children};
}
```
--------------------------------
### Coordinated Glass Transitions
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/expo-ui-swiftui.md
Uses Namespace and glassEffectID to coordinate glass identity across transitions. The example shows a Text component with glassEffect and glassEffectID modifiers inside a Host, enabling shared element transitions.
```tsx
import { Host, Namespace, Text } from '@expo/ui/swift-ui';
import { glassEffect, glassEffectID } from '@expo/ui/swift-ui/modifiers';
const glassNamespace = new Namespace('main');
Search
;
```
--------------------------------
### Conditional Glass Effect with isGlassEffectAPIAvailable
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/expo-ui-swiftui.md
Conditionally apply glassEffect based on API availability. The example builds a modifiers array and conditionally pushes glassEffect if isGlassEffectAPIAvailable() returns true.
```tsx
import { isGlassEffectAPIAvailable } from 'expo-glass-effect';
function AdaptiveCard() {
const mods = [padding({ all: 16 })];
if (isGlassEffectAPIAvailable()) {
mods.push(glassEffect({ glass: { variant: 'regular' } }));
}
return (
Content
);
}
```
--------------------------------
### Glass + Mesh Gradient (Liquid Glass Text)
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/expo-ui-swiftui.md
Combines expo-mesh-gradient with glassEffect for liquid glass text. The example shows a GlassTitle component with a MeshGradient background and a Host containing Text with glassEffect and padding modifiers.
```tsx
import { Host, Text } from '@expo/ui/swift-ui';
import { glassEffect, padding } from '@expo/ui/swift-ui/modifiers';
import { MeshGradient } from 'expo-mesh-gradient';
function GlassTitle() {
return (
Liquid Glass Text
);
}
```
--------------------------------
### Glass Modifier Usage
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/expo-ui-swiftui.md
Applies the glassEffect modifier to a SwiftUI component. The example shows a GlassCard component using Host, Text, VStack with padding, frame, and glassEffect modifiers to create a liquid glass surface.
```tsx
import { Host, Text, VStack } from '@expo/ui/swift-ui';
import { glassEffect, padding, frame } from '@expo/ui/swift-ui/modifiers';
function GlassCard() {
return (
Glass Surface
);
}
```
--------------------------------
### Before/After comparison template
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/design-audit/references/post-implementation.md
Template for presenting before/after comparisons for each changed screen, including design rationale.
```markdown
### [Screen Name]
**Before:** [description of previous state or screenshot reference]
**After:** [description of new state or screenshot reference]
**Why:** [design rationale — which rule or dimension this addresses]
```
--------------------------------
### Skill directory structure
Source: https://github.com/devanshudesai/agent-skills/blob/main/README.md
Shows the file layout for the two skills, including SKILL.md, metadata.json, and reference files.
```text
skills/
expo-liquid-glass/
SKILL.md # Liquid Glass implementation guide
metadata.json # Skill metadata
references/
apple-liquid-glass-design.md # Apple HIG design guidance
callstack-liquid-glass.md # @callstack/liquid-glass setup
expo-ui-swiftui.md # @expo/ui SwiftUI integration
native-tabs.md # Native tab bar reference
design-audit/
SKILL.md # Design audit protocol
metadata.json # Skill metadata
references/
audit-dimensions.md # 15 audit dimensions with scoring
design-rules.md # 8 design rules expanded
scope-discipline.md # Touch/don't-touch boundaries
jobs-filter.md # Kill-or-elevate checklist
post-implementation.md # Post-phase update protocol
```
--------------------------------
### progress.txt entry template
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/design-audit/references/post-implementation.md
Template for adding an entry to progress.txt after completing a design phase. Includes placeholders for changes, affected screens, and modified tokens.
```markdown
## Design Phase [N] Complete — [Date]
- Changes: [summary of what was changed]
- Screens affected: [list]
- Tokens modified: [list any design system changes]
```
--------------------------------
### File structure for native tabs
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Shows the required file structure for the native tabs layout, including the _layout.tsx file and the (tabs) directory with index, search, and account screens.
```text
app/
_layout.tsx # NativeTabs layout
(tabs)/
index.tsx # Home tab
search.tsx # Search tab
account.tsx # Account tab
```
--------------------------------
### Bottom Accessory for Mini Player
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Use the bottomAccessory prop to render a floating view above the tab bar for persistent controls like a mini player.
```tsx
Now Playing: Song Title
}
>
{/* tabs */}
```
--------------------------------
### LESSONS.md entry template
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/design-audit/references/post-implementation.md
Template for documenting design decisions, patterns, and mistakes in LESSONS.md after a design audit phase.
```markdown
## [Date] — Design Audit Phase [N]
### Decisions Made
- [Decision]: [Why this choice was made]
### Patterns Established
- [New pattern]: [When to use it]
### Mistakes Avoided
- [What was considered but rejected]: [Why]
```
--------------------------------
### Mitigate White Flash with ThemeProvider
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Wraps NativeTabs with a ThemeProvider using DarkTheme to prevent white flashes during stack transitions. Requires transparentBackground prop on NativeTabs.
```tsx
import { DarkTheme, ThemeProvider } from '@react-navigation/native';
import { NativeTabs } from 'expo-router/unstable-native-tabs';
export default function Layout() {
return (
);
}
```
--------------------------------
### Per-Tab Stack Navigator with Header Configuration
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Defines a Stack layout for a tab, setting screen options like large title, blur effect, and transparency. Use this to customize headers per screen within a tab.
```tsx
// app/(tabs)/home/_layout.tsx
import { Stack } from 'expo-router';
export default function HomeLayout() {
return (
);
}
```
--------------------------------
### isLiquidGlassAvailable platform detection
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/callstack-liquid-glass.md
Platform detection helper. Returns true when Liquid Glass APIs are available; otherwise falls back to normal View rendering.
```tsx
import { isLiquidGlassAvailable } from '@callstack/liquid-glass';
if (isLiquidGlassAvailable()) {
// Use LiquidGlassView
} else {
// Fallback to BlurView or semi-transparent View
}
```
--------------------------------
### Native Tabs SDK 55+ Compound API (Pattern C)
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/SKILL.md
Use this SDK 55+ syntax for native tabs with compound components. It uses TabBarIcon with platform-specific icons and TabBarLabel for the label.
```tsx
Home
```
--------------------------------
### DynamicColorIOS for Liquid Glass Colors
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Use DynamicColorIOS to adapt colors for light and dark backgrounds in NativeTabs. Set labelStyle and tintColor with dark and light color values.
```tsx
import { DynamicColorIOS } from 'react-native';
```
--------------------------------
### Native Tabs SDK 54 Syntax (Pattern C)
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/SKILL.md
Use this SDK 54 syntax for native tabs. It uses Icon and Label sub-components with platform-specific icon names.
```tsx
Home
```
--------------------------------
### LiquidGlassView usage
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/callstack-liquid-glass.md
Drop-in glass panel component. Wrap any content to render it on glass. Supports interactive touch animations and effect options like 'clear' or 'regular'. Falls back to a semi-transparent background when Liquid Glass is unavailable.
```tsx
import { LiquidGlassView, isLiquidGlassAvailable } from '@callstack/liquid-glass';
import { Text, View } from 'react-native';
function GlassCard() {
return (
Hello
);
}
```
--------------------------------
### Host Component with Button
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/expo-ui-swiftui.md
Use the Host component to bridge React Native to SwiftUI. Wrap SwiftUI components like Button inside Host. Style the Host container with React Native styles; use SwiftUI layout primitives inside.
```tsx
import { Host, Button } from '@expo/ui/swift-ui';
function Example() {
return (
);
}
```
--------------------------------
### SwiftUI Glass with Namespace (Pattern D)
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/SKILL.md
Use this pattern with @expo/ui for coordinated glass transitions. It creates a namespace and applies glassEffect with a shared ID for matched geometry effects.
```tsx
import { Host, Namespace, Text } from '@expo/ui/swift-ui';
import { glassEffect, glassEffectID, padding } from '@expo/ui/swift-ui/modifiers';
const ns = new Namespace('glass');
Explore
;
```
--------------------------------
### TabBarIcon with Custom Image
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Use this variant to display a custom image as the tab bar icon. The 'src' prop expects a require() call pointing to the image asset.
```tsx
// Custom image
```
--------------------------------
### Web Fallback with Custom Tab Layout
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Provides a web-specific layout using the Tabs component from 'expo-router/ui'. Use this to render a custom tab UI on web platforms.
```tsx
// app/_layout.web.tsx
import { Tabs } from 'expo-router/ui';
export default function WebTabLayout() {
return {/* custom web tab UI */};
}
```
--------------------------------
### Remaining phases reminder template
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/design-audit/references/post-implementation.md
Template for reminding the user which phases are still pending approval.
```markdown
Remaining phases:
- Phase [N]: [brief description] — awaiting approval
```
--------------------------------
### Basic NativeTabs layout with triggers
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Defines a tab layout using NativeTabs and NativeTabs.Trigger. Each trigger includes a TabBarIcon with iOS and Android icons and a TabBarLabel. On iOS 26, the tab bar automatically uses liquid glass material.
```tsx
import { NativeTabs } from 'expo-router/unstable-native-tabs';
export default function TabLayout() {
return (
HomeSearchAccount
);
}
```
--------------------------------
### Search Bar in Tab Header with Stack
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Wrap tab content in a Stack navigator to add a search bar to the header. Configure headerSearchBarOptions with placeholder and onChangeText handler.
```tsx
// app/(tabs)/search/_layout.tsx
import { Stack } from 'expo-router';
export default function SearchLayout() {
return (
{ /* handle search */ },
},
}}
/>
);
}
```
--------------------------------
### Glass Variants
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/expo-ui-swiftui.md
Shows the different glassEffect variants: regular for standard controls, clear for high transparency, with optional tint color, and interactive for touch animations. Each variant is a separate call to glassEffect.
```tsx
// Regular - medium transparency, standard controls
glassEffect({ glass: { variant: 'regular' } })
// Clear - high transparency, media-rich backgrounds
glassEffect({ glass: { variant: 'clear' } })
// With tint color
glassEffect({ glass: { variant: 'regular', tint: '#007AFF' } })
// Interactive - enables touch animations (scale, bounce, shimmer)
glassEffect({ glass: { variant: 'regular', interactive: true } })
```
--------------------------------
### Separate Search Tab with NativeTabs.Trigger
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Define a search tab using NativeTabs.Trigger with role="search". Configure the tab bar label and icon for iOS and Android.
```tsx
Search
```
--------------------------------
### LiquidGlassContainerView usage
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/callstack-liquid-glass.md
Groups glass elements for morphing/merging when close together. The spacing prop controls the distance at which elements begin merging.
```tsx
import { LiquidGlassContainerView, LiquidGlassView } from '@callstack/liquid-glass';
function MergingExample() {
return (
AB
);
}
```
--------------------------------
### TabBarIcon with SF Symbols and Material Symbols (SDK 55+)
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Use this compound component to set the tab bar icon with platform-specific symbols. The 'ios' prop accepts an object with 'default' and 'selected' SF Symbol names, and 'androidIconName' specifies the Material Symbol name.
```tsx
// SF Symbols (iOS) + Material Symbols (Android)
```
--------------------------------
### TabBarIcon State Variants
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Use this variant to show different icons for selected and default states. The 'ios' prop object includes 'default' and 'selected' keys for SF Symbols.
```tsx
// State variants (different icons for selected/default)
```
--------------------------------
### Minimize Tab Bar on Scroll
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Set minimizeBehavior="onScrollDown" on NativeTabs to minimize the tab bar when scrolling down.
```tsx
{/* tabs */}
```
--------------------------------
### TabBarLabel
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Use this component to set the label text for the tab bar item. The label is displayed under the icon.
```tsx
Home
```
--------------------------------
### TabBarBadge Numeric
Source: https://github.com/devanshudesai/agent-skills/blob/main/skills/expo-liquid-glass/references/native-tabs.md
Use this component to display a numeric badge on the tab bar icon. The number is passed as children.
```tsx
// Numeric badge
3
```