Files
xtremflow/DESIGN_SYSTEM.md
MichaelandClaude Fable 5 e332895d7d feat(design): Projector Noir theme - tungsten amber on film-black
Full visual refonte replacing the generic neon-blue glass look:

- palette: warm film-black surface ladder, tungsten amber primary,
  warm taupe secondary, verdigris teal tertiary; semantic and
  category colors retuned to match (coral live, gold movies)
- typography: Syne (display/headlines) + Instrument Sans (body/UI)
  replace Space Grotesk/Inter/Outfit across all screens
- glassmorphism tokens warmed (amber inner glow, warm-white borders)
- web player theme.css + index.html loader mirror the new tokens
- hardcoded Colors.blue* in streaming settings and recordings tabs
  now use AppColors tokens
- DESIGN_SYSTEM.md updated to v3.0 Projector Noir

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 14:52:45 +02:00

435 lines
11 KiB
Markdown

# XtremFlow Projector Noir Design System
## Overview
XtremFlow uses a **Projector Noir aesthetic**: warm tungsten light cutting through a dark screening room. The design system prioritizes:
- **Sophisticated Glassmorphism** - Elegant blur effects with warm-tinted borders
- **Tungsten Palette** - Amber projector-beam accents on deep film-black
- **Art-House Typography** - Geometric headlines (Syne) + refined UI text (Instrument Sans)
- **Focus-Driven Interactions** - TV-friendly hover states and animations
- **Responsive Layouts** - Seamless adaptation from web to mobile
---
## Color Palette
### Backgrounds (warm film-black ladder)
- **`baseLevel0`** (#0B0A08) - Deepest black, OLED optimized
- **`background` / `surface`** (#14110C) - Primary dark surface
- **`surfaceContainerLow`** (#1B1812) to **`surfaceContainerHighest`** (#363027) - Warm charcoal hierarchy
### Primary Accents
- **`primary`** (#FFB35C) - Tungsten amber (main brand color)
- **`primaryContainer`** (#F39A1F) - Vivid amber (buttons, focus rings)
- **`secondary`** (#D3C6B2) - Warm taupe
- **`tertiary`** (#A4CCBE) - Verdigris teal (counterpoint accent)
### Semantic Colors
- **`success`** (#6BD89B) - Success/completed state
- **`warning`** (#FFAB00) - Warning/caution state
- **`error`** (#FFB4AB) - Error/danger state (Material 3 dark)
- **`info`** (#64B6AC) - Information state (soft teal)
### Text Hierarchy (warm ivory)
- **`textPrimary`** (#ECE6DA) - Main text
- **`textSecondary`** (#CDC4B4) - Secondary text
- **`textTertiary`** (#998F7C) - Tertiary text
### Category Colors
- **`live`** (#FF6E5E) - Live streams (signal coral)
- **`movies`** (#E8B64C) - Movie content (warm gold)
- **`series`** (#5FC9AE) - Series content (teal)
---
## Typography
### Font Stack
1. **Syne** (headings/display) - Geometric, art-house, distinctive
2. **Instrument Sans** (UI/body) - Clean, readable, characterful
3. Fallback to system fonts
### Sizes & Weights
| Style | Size | Weight | Usage |
|-------|------|--------|-------|
| `displayLarge` | 56px | W800 | Hero titles, billboards |
| `displayMedium` | 48px | W700 | Section headers |
| `displaySmall` | 36px | W700 | Sub-titles |
| `headlineMedium` | 28px | W700 | Card titles |
| `headlineSmall` | 24px | W600 | Smaller headings |
| `titleLarge` | 20px | W600 | Labels, emphasis |
| `titleMedium` | 16px | W600 | UI elements |
| `titleSmall` | 14px | W600 | Secondary labels |
| `bodyLarge` | 16px | W400 | Primary body text |
| `bodyMedium` | 14px | W400 | Standard body |
| `bodySmall` | 12px | W400 | Secondary text |
| `labelLarge` | 14px | W700 | Button text |
---
## Spacing System (8pt base)
```dart
spacing2 = 2.0
spacing4 = 4.0
spacing8 = 8.0
spacing12 = 12.0
spacing16 = 16.0
spacing20 = 20.0
spacing24 = 24.0
spacing32 = 32.0
spacing40 = 40.0
spacing48 = 48.0
spacing56 = 56.0
spacing64 = 64.0
```
**TV Safe Margins:** Use `spacing32` (32px) for content edges on web/desktop.
**Mobile Safe Margins:** Use `spacing16` (16px) for mobile screens.
---
## Radius System
| Token | Value | Usage |
|-------|-------|-------|
| `radiusXs` | 4px | Tiny elements, toggles |
| `radiusSm` | 8px | Badges, chips |
| `radiusMd` | 12px | Buttons, inputs |
| `radiusLg` | 16px | Cards, dialogs |
| `radiusXl` | 24px | Large containers |
| `radiusXxl` | 32px | Hero sections |
| `radiusFull` | 999px | Circles, pills |
---
## Elevation & Shadows
### Elevation Levels
```dart
elevationXs = 2.0 // Subtle lift (tooltips)
elevationSm = 4.0 // Slight elevation (cards)
elevationMd = 8.0 // Standard elevation (modals)
elevationLg = 16.0 // Prominent elevation (dialogs)
elevationXl = 24.0 // Maximum elevation (top-level modals)
```
### Shadow System
Shadows automatically scale with elevation. Premium glass effects use dual shadows for depth:
- **Primary shadow:** Larger blur, higher spread (primary depth)
- **Secondary shadow:** Smaller blur, lower spread (edge definition)
---
## Animations
### Duration
```dart
durationXs = 100ms // Quick interactions
durationSm = 150ms // Hover states
durationBase = 200ms // Standard transitions
durationMd = 300ms // UI animations
durationLg = 400ms // Page transitions
durationXl = 600ms // Hero animations
```
### Curves
- **`curveDefault`** (easeInOutCubic) - Standard animations
- **`curveSnappy`** (fastOutSlowIn) - Apple-like feel
- **`curveSmooth`** (easeOutCubic) - Content reveal
- **`curveBouncy`** (elasticOut) - Fun interactions
---
## Core Widgets
### `GlassContainer`
Premium glassmorphism widget with backdrop blur and gradient overlay.
```dart
GlassContainer(
borderRadius: AppTheme.radiusLg,
padding: EdgeInsets.all(16),
blur: 15.0,
opacity: 0.08,
child: YourWidget(),
)
```
### `GlassCard`
Interactive glass card with scale animations and loading states.
```dart
GlassCard(
interactive: true,
onTap: () => Navigator.push(...),
child: ContentWidget(),
)
```
### `ChannelCard`
Modern channel card with:
- Live indicator (with pulse animation)
- Favorite toggle button
- EPG information display
- Hover scale effects
```dart
ChannelCard(
streamId: channel.id,
name: channel.name,
iconUrl: channel.logo,
currentProgram: epg?.title,
isLive: true,
playlist: playlistConfig,
onTap: () => playChannel(channel),
)
```
### `TvModernCard`
Premium content card for movies, shows, or other media.
```dart
TvModernCard(
id: item.id,
title: item.title,
imageUrl: item.posterUrl,
rating: '8.7',
year: '2024',
badge: 'NEW',
badgeColor: AppColors.primary,
onTap: () => showDetails(item),
onPlayTap: () => playContent(item),
)
```
### `HeroCarousel`
Full-screen featured content carousel with auto-play.
```dart
HeroCarousel(
items: [
HeroCarouselItem(
id: '1',
title: 'Breaking Bad',
subtitle: 'Season 5 - Now Streaming',
imageUrl: 'https://...',
badge: 'LIMITED TIME',
onPlay: () => play(),
),
],
autoPlay: true,
autoPlayInterval: Duration(seconds: 6),
)
```
### `TvChannelGrid`
Responsive grid layout for channels with flexible columns.
```dart
TvChannelGrid(
children: channels.map((ch) => ChannelCard(...)).toList(),
horizontalSpacing: 20,
verticalSpacing: 20,
)
```
### `TvHorizontalList`
Horizontal scrollable list with title and smooth scrolling.
```dart
TvHorizontalList(
title: 'Trending Now',
children: items.map((item) => TvModernCard(...)).toList(),
itemWidth: 200,
spacing: 16,
)
```
### `TvTopNavBar`
Premium top navigation with search, notifications, profile.
```dart
TvTopNavBar(
title: 'XtremFlow',
onSearch: () => showSearchModal(),
onNotifications: () => showNotifications(),
onProfile: () => showProfile(),
notificationCount: 3,
)
```
### `TvSideNav`
Vertical navigation menu with category items.
```dart
TvSideNav(
items: [
TvNavItem(label: 'Home', icon: Icons.home),
TvNavItem(label: 'Live TV', icon: Icons.tv),
TvNavItem(label: 'Movies', icon: Icons.movie),
],
selectedIndex: 0,
onItemSelected: (index) => navigate(index),
)
```
---
## Usage Guidelines
### Color Usage
- **Primary (Tungsten Amber):** Call-to-action buttons, focus states, active indicators
- **Secondary (Warm Taupe):** Alerts, favorite toggles, urgent actions
- **Tertiary (Verdigris Teal):** Accent highlights, success states, featured badges
- **White/Grey text:** Maintain WCAG AA contrast ratio (4.5:1 minimum)
### Typography
- **Syne:** Only for headings/hero text (sizes 20px and above)
- **Instrument Sans:** All UI, buttons, body text
- **Letter spacing:** Increase for larger sizes (hero titles: -1.0 to -1.5), decrease for body text
### Spacing
- **Card padding:** 16px standard, 24px for premium cards
- **List spacing:** 20px horizontal, 20px vertical between items
- **Button height:** 44px standard (48px for mobile large buttons)
- **Safe margins:** 32px for TV, 16px for mobile
### Animations
- **Hover states:** Always use 200-300ms animations
- **Page transitions:** 400-600ms for hero animations
- **Loading:** Use pulse/fade animations, not spinners when possible
### Glassmorphism
- **Blur:** 15px standard, up to 20px for premium overlays
- **Opacity:** 8-12% for background colors, 15% for borders
- **Gradient:** Always include subtle gradient + border for depth
- **Shadows:** Dual shadow system for elevation
---
## Mobile Adaptations
### Touch Targets
- **Minimum button size:** 48x48px
- **Minimum tap area:** 44x44px
- **Between buttons:** 16px spacing minimum
### Typography Scaling
- **Display text:** Reduced by 8px on mobile
- **Body text:** Standard sizes (no reduction needed)
- **Buttons:** Slightly smaller (14px vs 16px)
### Navigation
- **Bottom navigation bar** for main categories
- **Horizontal scrolling** for content grids
- **Collapsible menus** for secondary options
- **Modal dialogs** for detailed information
### Bottom Navigation
- Maximum 5 items
- Icon + label style
- Bottom safe area padding
- Glass effect with elevated background
---
## Implementation Examples
### Adding a New Feature
1. Use `TvModernCard` or `ChannelCard` base
2. Extend with custom styling if needed
3. Follow spacing/animation guidelines
4. Test hover states on desktop, tap on mobile
5. Ensure text contrast >= 4.5:1
### Color Customization
- Never override `AppColors` constants directly
- Use `color.withOpacity()` for transparency
- Test on OLED displays for pure black background
- Avoid colors outside the defined palette
### Custom Animations
- Always import `AppTheme.durationMd` and `curveDefault`
- Keep animations under 600ms unless loading indicator
- Use `AnimatedScale`, `FadeTransition` over custom controllers
- Test at 60fps on low-end devices
---
## Performance Tips
1. **Image Loading:** Use `CachedNetworkImage` with placeholder
2. **Scroll Performance:** Enable `repaint` boundaries on large lists
3. **Animations:** Use `SingleTickerProviderStateMixin` for complex animations
4. **Memory:** Dispose controllers in `dispose()` method
5. **Rendering:** Avoid nested `LayoutBuilders` in scrollable areas
---
## Accessibility
- **Text Contrast:** All text must meet WCAG AA (4.5:1)
- **Touch Targets:** 48x48px minimum on mobile
- **Focus States:** Always visible with 2px border or scale change
- **Semantic HTML:** Use proper widget hierarchy
- **Tooltips:** Always add for icon-only buttons
---
## Export & Integration
### Update main.dart
```dart
import 'package:flutter/material.dart';
import 'lib/core/theme/app_theme.dart';
import 'lib/mobile/theme/mobile_theme.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'XtremFlow',
theme: AppTheme.darkTheme,
home: const HomePage(),
);
}
}
```
### Use Across App
```dart
// Colors
Container(color: AppColors.primary)
// Spacing
Padding(padding: EdgeInsets.all(AppTheme.spacing16))
// Animations
Duration animDuration = AppTheme.durationMd;
Curve animCurve = AppTheme.curveDefault;
```
---
## Future Enhancements
- [ ] Implement animations library for transitions
- [ ] Add haptic feedback for interactions
- [ ] Create dark/light theme toggle
- [ ] Implement material motion guide (motion curves)
- [ ] Add accessibility scanner integration
- [ ] Create Storybook/documentation UI
---
**Design System Version:** 3.0 Projector Noir
**Last Updated:** 2026-06-10
**Status:** Production Ready OK