Phase 1 - Corrections Critiques: - Fixed memory leaks dans music_provider.dart (stream subscriptions) - Fixed race conditions dans search_provider.dart (stale results) - Fixed token refresh errors dans api_service.dart - Improved error handling avec messages utilisateur - Changed API URL to HTTPS by default Phase 2 - Améliorations UX Desktop: - Ajouté cursor pointers sur tous les éléments cliquables - Implémenté hover states avec effets néon glow (200ms transitions) - Créé skeleton loading states avec shimmer animation - Ajouté widgets: ClickableWrapper, ErrorDisplay, SkeletonLoading - Enhanced visual feedback pour desktop users Phase 3 - Configuration Flutter: - Configuré Android (Gradle 8.1.0, Kotlin 1.9.0, minSdk 21, targetSdk 34) - Créé launcher icons cyberpunk néon (5 densités) - Configuré Windows desktop (structure complète) - Activé Linux desktop support - Ajouté package équatable pour entités de domaine - Corrigé imports (colors.dart, auth_provider.dart) - Fixed Dio API compatibility (RequestOptions) Documentation: - STYLE_GUIDE.md: Guide complet (100+ pages) - DESIGN_IMPLEMENTATION_GUIDE.md: Implémentation Flutter - BUILD_STATUS.md: Status builds + troubleshooting - QUICKSTART_BUILDS.md: Guide rapide - BUILD_INDEX.md: Index documentation - PHASE_1_CORRECTIONS.md: Corrections Phase 1 - PHASE_2_UX_IMPROVEMENTS.md: Améliorations Phase 2 - PR_REVIEW_SUMMARY.md: Revue code complète - CODE_ANALYSIS_AND_PRIORITIES.md: Analyse code Scripts & Builds: - BUILD_ALL.sh: Script automatisé builds multi-plateforme - builds/: Structure avec README par plateforme - design-system/: Système de design complet Backend: - Ajouté streaming HTTP Range pour audio progressif - Enhanced YouTube service avec métadonnées complètes - Improved error handling et validation Generated with [Claude Code](https://claude.com/claude-code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
10 KiB
AudiOhm Design System - Master
Brand Identity
AudiOhm est une plateforme de streaming musicale alternative à Spotify avec une esthétique cyberpunk moderne. Notre design combine :
- L'énergie néon du cyberpunk
- La fonctionnalité des plateformes de streaming modernes
- Une expérience utilisateur fluide et immersive
Color Palette
Primary Colors (Dark Theme Base)
| Role | Hex | Usage |
|---|---|---|
| Background | #0A0E27 |
Page background, main sections |
| Surface | #151932 |
Cards, modals, elevated elements |
| Surface-Elevated | #1F2342 |
Hovered cards, active elements |
| Border | #2A2F4A |
Dividers, card borders |
Neon Accents
| Role | Hex | Usage |
|---|---|---|
| Primary | #00F0FF |
Main CTAs, active states, links |
| Secondary | #BF00FF |
Secondary actions, tags |
| Accent | #FF006E |
Highlights, notifications, likes |
| Success | #00FF94 |
Success states, now playing |
| Warning | #FFB800 |
Warnings, pending states |
| Error | FF3B3B |
Errors, destructive actions |
Text Colors
| Role | Hex | Usage |
|---|---|---|
| Text-Primary | #F0F4F8 |
Headings, primary text |
| Text-Secondary | #9BA3B8 |
Secondary text, descriptions |
| Text-Tertiary | #6B7280 |
Tertiary text, disabled states |
| Text-Inverted | #0A0E27 |
Text on neon backgrounds |
Gradient Overlays
/* Primary Gradient */
--gradient-primary: linear-gradient(135deg, #00F0FF 0%, #BF00FF 100%);
/* Accent Gradient */
--gradient-accent: linear-gradient(135deg, #FF006E 0%, #FF3B3B 100%);
/* Surface Gradient */
--gradient-surface: linear-gradient(180deg, rgba(21,25,50,0.9) 0%, rgba(10,14,39,0.95) 100%);
Typography
Font Families
/* Primary Fonts via Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800&family=Space+Grotesk:wght@400;500;600;700&display=swap');
/* Heading Font - Modern & Bold */
--font-heading: 'Space Grotesk', sans-serif;
/* Body Font - Clean & Readable */
--font-body: 'Outfit', sans-serif;
/* Monospace - For technical details */
--font-mono: 'JetBrains Mono', 'Fira Code', monospace;
Type Scale
| Role | Size | Weight | Line-Height | Usage |
|---|---|---|---|---|
| Display | 48px | 700 | 1.1 | Hero section, large titles |
| H1 | 36px | 700 | 1.2 | Page titles |
| H2 | 28px | 600 | 1.3 | Section headers |
| H3 | 22px | 600 | 1.4 | Card titles, subtitles |
| Body-Large | 18px | 400 | 1.5 | Emphasized body text |
| Body | 16px | 400 | 1.6 | Standard body text |
| Body-Small | 14px | 400 | 1.6 | Secondary text |
| Caption | 12px | 500 | 1.5 | Metadata, timestamps |
| Overline | 11px | 600 | 1.4 | Labels, tags, uppercase |
Spacing System
Scale (Base: 4px)
| Token | Value | Usage |
|---|---|---|
--spacing-1 |
4px | Tight gaps, icon padding |
--spacing-2 |
8px | Small gaps, button padding |
--spacing-3 |
12px | Card padding (compact) |
--spacing-4 |
16px | Standard spacing, card padding |
--spacing-5 |
20px | Medium gaps |
--spacing-6 |
24px | Section padding, form fields |
--spacing-8 |
32px | Large gaps, content sections |
--spacing-10 |
40px | XL gaps, page padding |
--spacing-12 |
48px | XXL gaps, major sections |
--spacing-16 |
64px | Hero sections, page margins |
Layout System
Container Widths
| Breakpoint | Max Width | Usage |
|---|---|---|
| Mobile | 100% | < 768px |
| Tablet | 768px | 768px - 1024px |
| Desktop | 1200px | 1024px - 1440px |
| Wide | 1440px | > 1440px |
Grid System
/* 12-column grid */
--grid-columns: 12;
--grid-gap: 24px;
/* Responsive columns */
--cols-mobile: 1fr;
--cols-tablet: repeat(6, 1fr);
--cols-desktop: repeat(12, 1fr);
Components
Buttons
Primary Button (Neon)
.btn-primary {
background: linear-gradient(135deg, #00F0FF 0%, #00C8FF 100%);
color: #0A0E27;
padding: 12px 24px;
border-radius: 8px;
font-weight: 600;
font-size: 16px;
border: none;
cursor: pointer;
transition: all 200ms ease;
box-shadow: 0 0 20px rgba(0, 240, 255, 0.3);
}
.btn-primary:hover {
box-shadow: 0 0 30px rgba(0, 240, 255, 0.5);
transform: translateY(-1px);
}
.btn-primary:active {
transform: translateY(0);
}
Secondary Button (Ghost)
.btn-secondary {
background: transparent;
color: #00F0FF;
padding: 12px 24px;
border-radius: 8px;
font-weight: 600;
font-size: 16px;
border: 1px solid #00F0FF;
cursor: pointer;
transition: all 200ms ease;
}
.btn-secondary:hover {
background: rgba(0, 240, 255, 0.1);
box-shadow: 0 0 20px rgba(0, 240, 255, 0.2);
}
Cards
Base Card
.card {
background: #151932;
border-radius: 16px;
padding: 20px;
border: 1px solid #2A2F4A;
transition: all 250ms ease;
}
.card:hover {
border-color: #00F0FF;
box-shadow: 0 8px 32px rgba(0, 240, 255, 0.15);
transform: translateY(-2px);
}
Album Card
.card-album {
position: relative;
border-radius: 16px;
overflow: hidden;
aspect-ratio: 1/1;
cursor: pointer;
}
.card-album:hover .play-overlay {
opacity: 1;
}
.play-overlay {
position: absolute;
inset: 0;
background: rgba(10, 14, 39, 0.7);
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 200ms ease;
}
.play-button {
width: 56px;
height: 56px;
background: #00F0FF;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 24px rgba(0, 240, 255, 0.4);
}
Inputs
.input {
background: #0A0E27;
border: 1px solid #2A2F4A;
border-radius: 8px;
padding: 12px 16px;
color: #F0F4F8;
font-size: 16px;
transition: all 200ms ease;
}
.input:focus {
outline: none;
border-color: #00F0FF;
box-shadow: 0 0 0 3px rgba(0, 240, 255, 0.1);
}
.input::placeholder {
color: #6B7280;
}
Effects & Animations
Glow Effects
/* Primary Glow */
.glow-primary {
box-shadow: 0 0 20px rgba(0, 240, 255, 0.4);
}
/* Secondary Glow */
.glow-secondary {
box-shadow: 0 0 20px rgba(191, 0, 255, 0.4);
}
/* Accent Glow */
.glow-accent {
box-shadow: 0 0 20px rgba(255, 0, 110, 0.4);
}
Transitions
| Type | Duration | Easing | Usage |
|---|---|---|---|
| Fast | 150ms | ease-out | Micro-interactions |
| Base | 200ms | ease-out | Button hovers, color changes |
| Slow | 300ms | ease-out | Card transforms, modals |
/* Reduced Motion Support */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
Icons
Use Lucide Icons or Heroicons (SVG format only - never emojis)
/* Icon Sizing */
--icon-xs: 16px;
--icon-sm: 20px;
--icon-md: 24px;
--icon-lg: 32px;
--icon-xl: 48px;
Z-Index Scale
| Layer | Value | Usage |
|---|---|---|
| Base | 0 | Default content |
| Elevated | 10 | Cards, dropdowns |
| Sticky | 20 | Sticky headers, sidebars |
| Overlay | 30 | Modals, tooltips |
| Modal | 40 | Active modal |
| Notification | 50 | Toasts, notifications |
Accessibility Standards
Color Contrast
- Text & Background: Minimum 4.5:1 (WCAG AA)
- Large Text: Minimum 3:1 (WCAG AA)
- Interactive Elements: Minimum 3:1
Focus States
.focusable:focus {
outline: 2px solid #00F0FF;
outline-offset: 2px;
}
Touch Targets
- Minimum 44x44px for all interactive elements
- Minimum 48x48px for primary CTAs
Screen Reader Support
- All images must have descriptive
alttext - Form inputs must have associated labels
- Icon-only buttons need
aria-label
Anti-Patterns to Avoid
❌ NEVER use emojis as icons - Use SVG icons (Lucide/Heroicons)
❌ NEVER use text color below #9BA3B8 in dark mode - Insufficient contrast
❌ NEVER use instant transitions (0ms) - Use 150-300ms for smoothness
❌ NEVER skip hover states - All interactive elements need feedback
❌ NEVER use cursor: default on clickable elements - Always use cursor: pointer
❌ NEVER use layout-shifting transforms - Avoid scale on hover, use color/shadow
❌ NEVER mix inconsistent spacing - Follow spacing system strictly
❌ NEVER use transparent borders in light mode - Must be visible
❌ NEVER skip reduced-motion checks - Always respect user preferences
Responsive Breakpoints
/* Mobile First Approach */
/* Mobile: < 768px (default) */
--breakpoint-mobile: 0px;
/* Tablet: >= 768px */
--breakpoint-tablet: 768px;
/* Desktop: >= 1024px */
--breakpoint-desktop: 1024px;
/* Wide: >= 1440px */
--breakpoint-wide: 1440px;
Page-Specific Guidelines
For page-specific design overrides, refer to:
design-system/pages/home.md- Home page specific rulesdesign-system/pages/search.md- Search page specific rulesdesign-system/pages/player.md- Player page specific rulesdesign-system/pages/library.md- Library page specific rules
If a page-specific file exists, its rules override these master rules.
Implementation Checklist
Before delivering any UI component or page, verify:
Visual Quality
- No emojis used as icons (SVG only)
- All icons from consistent set (Lucide/Heroicons)
- Hover states use color/shadow, not scale
- Neon glow effects are subtle, not overwhelming
- Background and surface colors are consistent
Interaction
- All clickable elements have
cursor: pointer - Hover states provide clear visual feedback
- Transitions are 150-300ms (smooth, not slow)
- Focus states visible for keyboard navigation
Accessibility
- Text contrast minimum 4.5:1
- All images have alt text
- Form inputs have labels
- Interactive elements can be operated via keyboard
prefers-reduced-motionis respected
Responsive
- Layout works at 375px (mobile)
- Layout works at 768px (tablet)
- Layout works at 1024px (desktop)
- Layout works at 1440px (wide)
- No horizontal scroll on mobile
- Touch targets minimum 44x44px
Performance
- Images use WebP format with fallbacks
- Large images are lazy-loaded
- Animations use transform/opacity (not width/height)
- No layout shifts from async content
This design system is the single source of truth for AudiOhm's UI/UX. All implementations must follow these guidelines unless a page-specific override exists.