mirror of
https://github.com/R0m1k3/xtremflow.git
synced 2026-10-11 17:30:00 +02:00
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>
435 lines
11 KiB
Markdown
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
|