15 KiB
UI Components
Reusable UI components used throughout the app.
Asset Display Components
Thumbnail Tile
Displays a single asset thumbnail in grids.
Properties:
- asset: Asset to display
- showStorageIndicator: Show local/remote badge
- onTap: Tap handler
- onLongPress: Long press handler (selection)
- isSelected: Selection state
Visual States:
Normal: Selected:
┌──────────┐ ┌──────────┐
│ │ │ ┌──────┐ │
│ [Image] │ │ │Image │✓│
│ │ │ └──────┘ │
│ [●] │ │ [●] │
└──────────┘ └──────────┘
└─ Storage └─ Checkmark
indicator overlay
Storage Indicators:
- Cloud icon: Remote only
- Device icon: Local only
- Cloud+Device: Both (merged)
Overlay Badges:
- Video duration (bottom left)
- Stack count (bottom right)
- Favorite heart (top right)
Thumbnail Image
Loads and displays asset images with progressive loading.
Loading States:
- Show thumbhash placeholder (blurred)
- Load thumbnail quality
- Optionally load preview quality
- Optionally load original
Caching:
- Uses image cache
- Key: asset ID + quality level
- Respects cache size limits
Asset Grid
Displays assets in a scrollable grid.
Properties:
- assets: List of assets
- tilesPerRow: Column count (2-6)
- onAssetTap: Individual tap handler
- onSelectModeChanged: Selection mode callback
- enableMultiSelect: Allow multi-selection
Features:
- Virtualized scrolling (only renders visible items)
- Grouped by date with section headers
- Pull-to-refresh support
- Drag to scroll with date indicator
Draggable Scrollbar
Custom scrollbar with date indicator.
Components:
┌─────────────────────────┬─┐
│ │▲│
│ ├─┤
│ [Asset Grid] │ │
│ │█│← Thumb
│ │ │ ┌──────────┐
│ │ │ │ Jan 2024 │← Date bubble
│ │ │ └──────────┘
│ │ │
│ ├─┤
│ │▼│
└─────────────────────────┴─┘
Behaviors:
- Drag thumb to fast scroll
- Date bubble shows current position
- Auto-hide when not interacting
- Haptic feedback on date changes
Navigation Components
Bottom Navigation Bar
Main app navigation.
Tabs:
┌─────────────────────────────────────┐
│ [Photos] [Search] [Sharing] [Library] │
│ ● ○ ○ ○ │
└─────────────────────────────────────┘
States:
- Selected: Filled icon + label
- Unselected: Outline icon
App Bar
Standard navigation header.
Variants:
Default:
┌─────────────────────────────────────┐
│ [←] Title [⋮] │
└─────────────────────────────────────┘
Selection mode:
┌─────────────────────────────────────┐
│ [✕] 3 selected [Share][⋮] │
└─────────────────────────────────────┘
Tab Bar
Secondary navigation within screens.
┌─────────────────────────────────────┐
│ Albums │ Shared │ │
│ ────────── ────────────── │
└─────────────────────────────────────┘
Form Components
Text Input
Standard text field with decorations.
States:
- Enabled: Normal appearance
- Focused: Primary color border
- Error: Red border + error message
- Disabled: Grayed out
Layout:
┌─────────────────────────────────────┐
│ Label │
│ ┌───────────────────────────────┐ │
│ │ [Icon] Placeholder text [X] │ │
│ └───────────────────────────────┘ │
│ Helper or error text │
└─────────────────────────────────────┘
Search Bar
Specialized input for search.
┌─────────────────────────────────────┐
│ ┌───────────────────────────────┐ │
│ │ [🔍] Search photos... [X] │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
Features:
- Search icon prefix
- Clear button when has text
- Debounced input for API calls
Settings Tiles
Various settings input components.
Switch Tile:
┌─────────────────────────────────────┐
│ Setting Title [═══] │
│ Description text │
└─────────────────────────────────────┘
Slider Tile:
┌─────────────────────────────────────┐
│ Setting Title 4 │
│ ──────●──────────────────────── │
└─────────────────────────────────────┘
Radio Tiles:
┌─────────────────────────────────────┐
│ ○ Option 1 │
│ ● Option 2 (selected) │
│ ○ Option 3 │
└─────────────────────────────────────┘
Button Tile:
┌─────────────────────────────────────┐
│ [Icon] Action Title [>] │
│ Description │
└─────────────────────────────────────┘
User Interface
User Circle Avatar
Displays user profile picture or initials.
Properties:
- user: User object
- size: Diameter in pixels
Rendering:
- If user has profile image → show image
- Otherwise → show initials on colored background
- Avatar color derived from user ID
Sizes:
- Small: 30px (comments, lists)
- Medium: 44px (activity tiles)
- Large: 80px (profile page)
User List Tile
Displays user in a list.
┌─────────────────────────────────────┐
│ [Avatar] User Name │
│ user@email.com │
└─────────────────────────────────────┘
Feedback Components
Loading Indicators
Circular Progress:
- Indeterminate: Spinning animation
- Determinate: Shows percentage
Linear Progress:
┌─────────────────────────────────────┐
│ ████████░░░░░░░░░░░ 40% │
└─────────────────────────────────────┘
Skeleton Loader:
┌──────┐ ┌──────┐ ┌──────┐
│░░░░░░│ │░░░░░░│ │░░░░░░│
│░░░░░░│ │░░░░░░│ │░░░░░░│
└──────┘ └──────┘ └──────┘
Snackbar
Temporary notification at bottom.
┌─────────────────────────────────────┐
│ Message text here [ACTION]│
└─────────────────────────────────────┘
Types:
- Info: Default colors
- Success: Green tint
- Error: Red tint
- Warning: Orange tint
Dialog
Modal overlay for confirmations.
┌─────────────────────────────────────┐
│ │
│ ┌───────────────────────────────┐ │
│ │ Dialog Title │ │
│ ├───────────────────────────────┤ │
│ │ │ │
│ │ Dialog content goes here │ │
│ │ │ │
│ ├───────────────────────────────┤ │
│ │ [Cancel] [Confirm] │ │
│ └───────────────────────────────┘ │
│ │
└─────────────────────────────────────┘
(dimmed background)
Bottom Sheet
Slides up from bottom.
┌─────────────────────────────────────┐
│ │
│ │
│ (main content) │
│ │
├─────────────────────────────────────┤
│ ─────── (drag handle) │
│ │
│ Bottom sheet content │
│ │
│ [Action 1] │
│ [Action 2] │
│ [Action 3] │
│ │
└─────────────────────────────────────┘
Behaviors:
- Drag handle to resize/dismiss
- Can expand to full screen
- Dismissible by dragging down
Photo Viewer Components
Top Control Bar
Overlay controls on asset viewer.
┌─────────────────────────────────────┐
│ [←] filename.jpg [♡] [⋮] │
└─────────────────────────────────────┘
Actions:
- Back: Return to grid
- Favorite: Toggle favorite
- More: Show action menu
Bottom Control Bar
Additional actions for current asset.
┌─────────────────────────────────────┐
│ [Share] [Archive] [Delete] [More] │
└─────────────────────────────────────┘
EXIF Panel
Shows metadata when expanded.
┌─────────────────────────────────────┐
│ Details │
├─────────────────────────────────────┤
│ 📅 January 15, 2024 3:30 PM │
│ 📷 iPhone 15 Pro │
│ 🔧 f/1.8 1/120s ISO 100 │
│ 📍 New York, United States │
└─────────────────────────────────────┘
Map Components
Map View
Displays assets on a map.
Features:
- Cluster markers for grouped assets
- Tap cluster to zoom
- Tap marker to show asset
- Map style (light/dark/satellite)
Map Settings Sheet
Filter controls for map.
┌─────────────────────────────────────┐
│ Map Settings │
├─────────────────────────────────────┤
│ Show favorites only [═══] │
│ Include archived [═══] │
│ Include partner photos [═══] │
│ │
│ Time Range: │
│ [All Time ▼] │
└─────────────────────────────────────┘
Album Components
Album Thumbnail
Album preview with cover image.
┌─────────────────────────────────────┐
│ ┌───────────────────────────────┐ │
│ │ │ │
│ │ [Cover Image] │ │
│ │ │ │
│ └───────────────────────────────┘ │
│ Album Name │
│ 50 items │
└─────────────────────────────────────┘
Album App Bar
Album-specific header with actions.
┌─────────────────────────────────────┐
│ [←] Album Name [Share] [⋮] │
└─────────────────────────────────────┘