# Liquid Glass UI Implementation ## Overview This document describes the implementation of Apple's Liquid Glass design language in the Picture app using the `@callstack/liquid-glass` library. Liquid Glass provides a modern, translucent UI effect available on iOS 26+ with graceful fallbacks for older iOS versions. ## Table of Contents - [Technology](#technology) - [Why Liquid Glass?](#why-liquid-glass) - [Implementation Details](#implementation-details) - [Components Using Liquid Glass](#components-using-liquid-glass) - [Configuration](#configuration) - [Platform Support](#platform-support) - [Performance Considerations](#performance-considerations) - [Future Improvements](#future-improvements) --- ## Technology ### Library: `@callstack/liquid-glass` **Version:** ^0.4.2 **Installation:** ```bash npm install @callstack/liquid-glass ``` **Key Features:** - ✅ Native iOS Liquid Glass effects on iOS 26+ - ✅ Automatic graceful fallback for iOS < 26 - ✅ GPU-accelerated blur effects - ✅ Interactive touch feedback - ✅ Works with Expo SDK 54 - ✅ Zero breaking changes for older devices ### Alternative Considered **`expo-glass-effect`** (Official Expo package) - ❌ Only works on iOS 26+ (no fallback) - ❌ Requires Xcode 26 beta - ❌ Known bugs in device builds - ❌ Not compatible with older iOS versions **Decision:** We chose `@callstack/liquid-glass` for better compatibility and graceful degradation. --- ## Why Liquid Glass? ### Design Benefits 1. **Modern iOS Aesthetic** - Aligns with iOS 26 design language - Provides visual depth and hierarchy - Creates premium, polished UI feel 2. **Improved Readability** - Dynamic blur adapts to background - Maintains contrast automatically - Better focus on important UI elements 3. **Performance** - GPU-accelerated rendering - Real-time blur calculations - Smooth animations and transitions 4. **User Experience** - Interactive touch feedback - Familiar iOS design patterns - Consistent with native apps --- ## Implementation Details ### Basic Usage ```tsx import { LiquidGlassView } from '@callstack/liquid-glass'; import { PlatformColor } from 'react-native'; {/* Your content with adaptive colors */} Adaptive Text ``` ### Props Configuration | Prop | Type | Default | Description | |------|------|---------|-------------| | `effect` | `'clear' \| 'regular'` | `'regular'` | Glass effect style. `'regular'` = stronger blur, `'clear'` = minimal blur | | `interactive` | `boolean` | `false` | Enable interactive touch feedback effects | | `colorScheme` | `'light' \| 'dark' \| 'system'` | - | Control appearance. `'system'` auto-adapts to device theme | | `tintColor` | `string` | - | Optional color overlay | | `style` | `ViewStyle` | - | Standard React Native styles | ### Adaptive Content with PlatformColor To make text and UI elements automatically adapt to the background behind the Liquid Glass, use `PlatformColor`: ```tsx import { PlatformColor } from 'react-native'; // Adaptive text color This text adapts to the background // Adaptive icon color // Adaptive border color {/* Content */} // Adaptive placeholder text ``` **Important Notes:** - ⚠️ Adaptive colors only work if the glass view height is **< 65px** - ✅ For taller views, the glass effect is static and won't adapt to content behind it - ✅ Use `colorScheme="system"` for automatic light/dark mode switching **Available PlatformColors:** | Color | Usage | |-------|-------| | `labelColor` | Primary text and icons | | `secondaryLabelColor` | Secondary text | | `tertiaryLabelColor` | Tertiary/hint text | | `placeholderTextColor` | Input placeholder text | | `separatorColor` | Borders and dividers | | `systemBackgroundColor` | Background surfaces | --- ## Components Using Liquid Glass ### 1. QuickGenerateBar **Location:** `components/QuickGenerateBar.tsx` **Implementation:** - 3 instances of `LiquidGlassView` replaced `BlurView` - Used for: Extended menu panel, FAB icon, main bar - All content uses `PlatformColor` for adaptive styling **Configuration:** ```tsx {/* Adaptive content */} ``` **Visual Elements:** 1. **Extended Settings Panel** - Full options menu with blur backdrop 2. **FAB Icon** - Minimized floating action button 3. **Main Input Bar** - Quick generate text input with actions **User Benefits:** - ✨ Premium feel when generating images - 🎯 Better visual separation from gallery - 📱 Modern iOS-aligned design - 🌓 Automatic light/dark mode adaptation ### 2. FilterBar **Location:** `components/FilterBar.tsx` **Implementation:** - 2 instances of `LiquidGlassView` (FAB + expanded bar) - All icons, text, and borders use adaptive `PlatformColor` - Favorites and tag filter pills **Configuration:** ```tsx {/* Pills with adaptive styling */} Label ``` **Adaptive Elements:** - Filter icon (FAB) - Favorites pill icon and text - Tag pill text - Clear filters icon - Tag management icon - All pill borders ### 3. ExploreSortBar **Location:** `components/ExploreSortBar.tsx` **Implementation:** - 2 instances of `LiquidGlassView` (FAB + expanded bar) - Sort mode pills (Neueste, Beliebt, Trending) with adaptive colors - Tag filter pills with adaptive styling **Configuration:** ```tsx {/* Sort pills with adaptive styling */} ``` **Adaptive Elements:** - Funnel icon (FAB) - Sort mode icons (time, heart) - Sort mode text - Tag pill text - Clear filters icon - All pill borders --- ## Configuration ### Development Setup **No additional configuration required!** The library works out-of-the-box with Expo SDK 54. ### EAS Build (Optional - for iOS 26 features) To enable full iOS 26 Liquid Glass features in production builds: **eas.json:** ```json { "build": { "production": { "ios": { "image": "macos-sequoia-15.5-xcode-26.0" } } } } ``` ⚠️ **Note:** This is optional. The app works perfectly on older iOS versions with automatic fallback. --- ## Platform Support ### iOS 26+ - ✅ Full Liquid Glass effects - ✅ GPU-accelerated blur - ✅ Interactive touch feedback - ✅ Real-time blur updates ### iOS < 26 - ✅ Automatic fallback to standard blur - ✅ Same visual hierarchy maintained - ✅ No breaking changes - ✅ Graceful degradation ### Android - ⚠️ Not applicable (iOS-only feature) - ✅ Renders as standard View - ✅ No crashes or errors --- ## Performance Considerations ### Best Practices 1. **Use Sparingly** - Apply only to key UI elements (bars, modals, cards) - Avoid excessive layering - Don't use on every component 2. **Optimize Hierarchy** - Keep view hierarchy shallow - Minimize nested LiquidGlassViews - Use `interactive={false}` when touch feedback not needed 3. **Monitor Performance** - GPU usage is efficient but not free - Test on older devices (iPhone 12, 13) - Profile in release builds ### Current Usage **Total LiquidGlassView Instances:** 7 - QuickGenerateBar: 3 instances (settings panel, FAB, main bar) - FilterBar: 2 instances (FAB, expanded bar) - ExploreSortBar: 2 instances (FAB, expanded bar) - No performance issues observed - Smooth 60 FPS on iPhone 13 and newer - All instances use `PlatformColor` for adaptive content --- ## Future Improvements ### Potential Enhancements 1. ✅ **FilterBar Component** - DONE - ✅ Added Liquid Glass to filter/tag bar - ✅ Consistency with QuickGenerateBar - ✅ Adaptive colors with PlatformColor 2. ✅ **ExploreSortBar Component** - DONE - ✅ Added Liquid Glass to explore sort bar - ✅ Adaptive colors for all UI elements 3. **RemixBottomSheet** - Replace solid background with Liquid Glass - Modern modal appearance 4. **ImageCard Grid Overlays** - Tag/info overlays with blur effect - Better readability on images 5. **LiquidGlassContainerView** - Use container for merging glass effects - Smooth transitions between elements ### Design Considerations **When to Use:** - ✅ Navigation bars and headers - ✅ Modal overlays and bottom sheets - ✅ Floating action buttons - ✅ Quick action bars **When to Avoid:** - ❌ List items (performance impact) - ❌ Rapidly animating elements - ❌ Full-screen backgrounds - ❌ Non-critical UI elements --- ## Code Examples ### Before (expo-blur) ```tsx import { BlurView } from 'expo-blur'; {/* Content */} ``` ### After (liquid-glass) ```tsx import { LiquidGlassView } from '@callstack/liquid-glass'; import { PlatformColor } from 'react-native'; Adaptive Content ``` ### Key Differences | Feature | expo-blur | liquid-glass | |---------|-----------|--------------| | iOS 26+ Support | ❌ No | ✅ Yes | | Fallback | ❌ None | ✅ Automatic | | Interactive | ❌ No | ✅ Yes | | GPU Acceleration | ⚠️ Limited | ✅ Full | | Compatibility | ✅ All iOS | ✅ All iOS | | Adaptive Content | ❌ No | ✅ Yes (with PlatformColor) | | System Theme | ⚠️ Manual | ✅ Automatic (`colorScheme="system"`) | --- ## Troubleshooting ### Issue: Liquid Glass not visible **Check:** 1. Device is running iOS 26+ for full effect 2. `effect="regular"` is set (stronger blur than `"clear"`) 3. Background has content to blur 4. View has proper dimensions 5. `borderRadius` and `overflow: 'hidden'` are set ### Issue: Performance lag **Solutions:** 1. Reduce number of LiquidGlassView instances 2. Set `interactive={false}` where not needed 3. Simplify view hierarchy 4. Test on device (not just simulator) ### Issue: Fallback looks different **This is expected!** - Older iOS versions show standard blur - Visual hierarchy is maintained - Functionality remains identical ### Issue: Content not adapting to background **Check:** 1. Are you using `PlatformColor` for text/icons? 2. Is the glass view height < 65px? (Limitation of adaptive colors) 3. Is `colorScheme="system"` set? **Solution:** ```tsx // ✅ Correct - Adaptive Text // ❌ Wrong - Static Text ``` ### Issue: Rendering artifacts on rounded corners **Solution:** Always add `overflow: 'hidden'` to the LiquidGlassView style: ```tsx ``` --- ## References ### Documentation - [Callstack Liquid Glass Blog Post](https://www.callstack.com/blog/how-to-use-liquid-glass-in-react-native) - [NPM Package](https://www.npmjs.com/package/@callstack/liquid-glass) - [Expo SDK 54 Changelog](https://expo.dev/changelog/sdk-54) ### Related Files - `components/QuickGenerateBar.tsx` - Main implementation with adaptive colors - `components/FilterBar.tsx` - Filter bar with Liquid Glass - `components/ExploreSortBar.tsx` - Explore sort bar with Liquid Glass - `package.json` - Dependency configuration --- ## Summary Liquid Glass implementation provides a modern, iOS 26-aligned design language while maintaining full backward compatibility. The `@callstack/liquid-glass` library ensures graceful degradation on older devices, making it a production-ready solution for premium UI effects. All content within Liquid Glass views uses `PlatformColor` for dynamic adaptation to backgrounds. **Key Takeaways:** - ✅ Modern iOS 26 design language - ✅ Zero breaking changes - ✅ Automatic fallback for older iOS - ✅ GPU-accelerated performance - ✅ Adaptive content with PlatformColor - ✅ System theme support (light/dark auto-switching) - ✅ Production-ready **Implementation Stats:** - 7 LiquidGlassView instances across 3 components - All use `effect="regular"` for stronger blur - All use `colorScheme="system"` for auto-theming - All content uses `PlatformColor` for adaptive styling - Icons, text, borders all adapt to background **Status:** ✅ Implemented and tested **Last Updated:** 2025-10-08