Claude-skill-registry expo-glass-effect
Guide for using expo-glass-effect to create iOS native liquid glass UI effects. Apply when implementing glass effect UI components, cards, or surfaces on iOS.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/expo-glass-effect" ~/.claude/skills/majiayu000-claude-skill-registry-expo-glass-effect && rm -rf "$T"
manifest:
skills/data/expo-glass-effect/SKILL.mdsource content
Expo Glass Effect
Guide for using
expo-glass-effect to create iOS native liquid glass UI effects.
Overview
- Platform: iOS 26+ only (falls back to regular
on unsupported platforms)View - Native API: Uses
under the hoodUIVisualEffectView - Package:
expo-glass-effect
Installation
npx expo install expo-glass-effect
Core Components
GlassView
Primary component for rendering glass effect surfaces.
import { GlassView } from 'expo-glass-effect'; <GlassView style={styles.glass} glassEffectStyle="regular" // 'regular' | 'clear' isInteractive={false} // Enable interactive glass effect tintColor="#ffffff" // Optional tint overlay />
Props:
:glassEffectStyle
(default) or'regular''clear'
: Boolean for interactive behavior (default:isInteractive
)false
: Optional color string for tinting the glasstintColor- All standard
props (style, children, etc.)View
GlassContainer
Wrapper for combining multiple glass views with merged effects.
import { GlassContainer, GlassView } from 'expo-glass-effect'; <GlassContainer spacing={10} style={styles.container}> <GlassView style={styles.glass1} isInteractive /> <GlassView style={styles.glass2} /> <GlassView style={styles.glass3} /> </GlassContainer>
Props:
: Distance (number) at which glass elements start merging effectsspacing- All standard
propsView
Utility Functions
isLiquidGlassAvailable()
Check if glass components are available (validates system version, compiler version, Info.plist settings).
import { isLiquidGlassAvailable } from 'expo-glass-effect'; if (isLiquidGlassAvailable()) { // Render GlassView } else { // Render fallback UI }
Note: This checks component availability, not user accessibility settings. Use
AccessibilityInfo.isReduceTransparencyEnabled() to check if user disabled transparency.
isGlassEffectAPIAvailable()
Runtime check for Glass Effect API availability on device (important for iOS 26 beta compatibility).
import { isGlassEffectAPIAvailable } from 'expo-glass-effect'; if (isGlassEffectAPIAvailable()) { // Safe to use GlassView }
Common Patterns
Basic Glass Card
import { StyleSheet, View, Image, Text } from 'react-native'; import { GlassView } from 'expo-glass-effect'; export default function GlassCard() { return ( <View style={styles.container}> <Image style={styles.background} source={{ uri: 'https://example.com/image.jpg' }} /> <GlassView style={styles.card}> <Text style={styles.text}>Glass Effect Card</Text> </GlassView> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, }, background: { ...StyleSheet.absoluteFill, }, card: { position: 'absolute', top: 100, left: 50, width: 200, height: 100, borderRadius: 12, padding: 20, }, });
Merged Glass Elements
import { GlassContainer, GlassView } from 'expo-glass-effect'; <GlassContainer spacing={10} style={styles.row}> <GlassView style={styles.circle1} isInteractive /> <GlassView style={styles.circle2} /> <GlassView style={styles.circle3} /> </GlassContainer>
Conditional Rendering with Fallback
import { isLiquidGlassAvailable, GlassView } from 'expo-glass-effect'; import { View } from 'react-native'; function Card({ children, style }) { const GlassComponent = isLiquidGlassAvailable() ? GlassView : View; return ( <GlassComponent style={[styles.card, style]}> {children} </GlassComponent> ); }
Known Issues & Limitations
1. isInteractive Cannot Change Dynamically
// ❌ BAD - Won't work after initial render const [interactive, setInteractive] = useState(false); <GlassView isInteractive={interactive} /> // ✅ GOOD - Remount with different key const [interactive, setInteractive] = useState(false); <GlassView key={interactive ? 'interactive' : 'static'} isInteractive={interactive} />
2. Opacity Issues
Avoid
on opacity < 1
GlassView or parent views - causes rendering issues.
// ❌ BAD <View style={{ opacity: 0.8 }}> <GlassView /> </View> // ✅ GOOD - Use tintColor instead <GlassView tintColor="rgba(255, 255, 255, 0.8)" />
3. Platform Support
Always wrap in platform checks or use fallback components for cross-platform apps:
import { Platform } from 'react-native'; import { isLiquidGlassAvailable, GlassView } from 'expo-glass-effect'; const useGlass = Platform.OS === 'ios' && isLiquidGlassAvailable();
Styling Best Practices
- Always use
for layering over background contentposition: 'absolute' - Use
to create rounded glass surfacesborderRadius - Layer backgrounds using
for full coverageStyleSheet.absoluteFill - Avoid shadows - glass effect provides natural depth
- Use
for content spacing within glass viewspadding
Accessibility
Check user preference for reduced transparency:
import { AccessibilityInfo } from 'react-native'; import { isLiquidGlassAvailable, GlassView } from 'expo-glass-effect'; const [reduceTransparency, setReduceTransparency] = useState(false); useEffect(() => { AccessibilityInfo.isReduceTransparencyEnabled().then(setReduceTransparency); }, []); const shouldUseGlass = isLiquidGlassAvailable() && !reduceTransparency;
References
- Expo Glass Effect Docs
- Apple UIVisualEffectView
- GitHub Issue #41024 - Opacity rendering bug
- GitHub Issue #40911 - iOS 26 beta API availability