veza/docs/archive/V0_801_RELEASE_SCOPE.md

259 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# V0.801 Release Scope — UX/UI Polish, Accessibilité & PWA
**Statut** : Planifié
**Phase** : 8 (Polish & Scale — Lot 1)
**Prérequis** : v0.703 (taguée)
**Date cible** : TBD
**Estimation** : ~3 sprints (15 jours ouvrés)
**Précédente** : [v0.703](archive/V0_703_RELEASE_SCOPE.md)
---
## 1. Objectif
Première version de la Phase 8. Améliore l'expérience utilisateur avec les **thèmes avancés** (contraste élevé, compact, accents personnalisables), l'**accessibilité WCAG AA** (clavier, screen reader, ARIA), et le **renforcement PWA** (offline, add-to-home-screen, background playback). Ces améliorations touchent l'ensemble de l'interface sans modifier les fonctionnalités métier.
---
## 2. État actuel (post-v0.703)
| Composant | État | Détail |
|-----------|------|--------|
| **Thème clair/sombre** | ✅ Livré | ThemeProvider, toggle dans Settings |
| **Thème auto (système)** | ✅ Livré | prefers-color-scheme détecté |
| **Contraste élevé** | ❌ Absent | Pas de mode high contrast |
| **Mode compact/confortable** | ❌ Absent | Layout unique, pas de densité configurable |
| **Couleur d'accent** | ❌ Absent | Couleur primary fixe dans design tokens |
| **Navigation clavier** | ⚠️ Partiel | Certains composants focusables, pas systématique |
| **Screen reader (ARIA)** | ⚠️ Partiel | Labels manquants sur boutons icônes, tables, modales |
| **Focus visible** | ⚠️ Partiel | Outline CSS basique, pas toujours visible |
| **Taille de police ajustable** | ❌ Absent | Tailles fixes dans design tokens |
| **prefers-reduced-motion** | ❌ Absent | Animations non conditionnées |
| **PWA Service Worker** | ⚠️ Partiel | SW de base, pas d'offline caching |
| **Add-to-home-screen** | ❌ Absent | Pas de manifest complet ni prompt |
| **Background playback** | ❌ Absent | Audio s'arrête en background mobile |
---
## 3. Lots
### Lot UX1 — Thèmes avancés
**Objectif** : Offrir des options de personnalisation visuelle complètes.
| # | Tâche | Fichiers impactés | Effort |
|---|-------|--------------------|--------|
| UX1-01 | Mode contraste élevé — palette high-contrast dans index.css, toggle dans SettingsAppearance | `apps/web/src/index.css`, `apps/web/src/components/settings/SettingsAppearance.tsx` | M |
| UX1-02 | Mode compact/confortable — réduire spacing/padding/gap de 25% en mode compact, CSS variables | `apps/web/src/index.css`, ThemeProvider | M |
| UX1-03 | Couleur d'accent personnalisable — color picker dans Settings, CSS variable `--color-primary`, persistence localStorage | `apps/web/src/components/settings/SettingsAppearance.tsx`, ThemeProvider | M |
| UX1-04 | Persistence des préférences — stocker theme, contrast, density, accent dans localStorage + compte utilisateur (PUT /users/me/preferences) | `apps/web/src/stores/`, backend | M |
| UX1-05 | Migration backend — ajout colonne `preferences JSONB` sur users | `migrations/118_users_preferences.sql` | S |
| UX1-06 | Tests — theme toggle, accent change, compact mode rendering | Tests | S |
### Lot UX2 — Accessibilité WCAG AA
**Objectif** : Atteindre la conformité WCAG AA sur tous les composants critiques.
| # | Tâche | Fichiers impactés | Effort |
|---|-------|--------------------|--------|
| UX2-01 | Audit a11y — lister tous les composants UI avec aria-label manquant, focus trap incomplet, contraste insuffisant | Audit doc | M |
| UX2-02 | Navigation clavier complète — tabindex, Enter/Space handlers sur tous les composants interactifs (Button, Card, Menu, Tab, Modal) | `apps/web/src/components/ui/` | L |
| UX2-03 | ARIA labels — ajouter aria-label sur boutons icônes, aria-describedby sur forms, role sur régions | `apps/web/src/components/` | M |
| UX2-04 | Focus visible amélioré — focus-visible ring distinct (2px solid, offset), skip-to-content link | `apps/web/src/index.css`, layout | S |
| UX2-05 | Taille de police ajustable — slider dans Settings (14px20px), CSS variable `--font-size-base`, scale proportionnel | `apps/web/src/index.css`, Settings | M |
| UX2-06 | prefers-reduced-motion — conditionner toutes les animations/transitions CSS, respecter l'OS preference | `apps/web/src/index.css` | S |
| UX2-07 | Contraste WCAG AA — vérifier ratio 4.5:1 sur tous les textes, ajuster les couleurs secondaires si nécessaire | `apps/web/src/index.css` | M |
| UX2-08 | Tests a11y — axe-core intégré dans Storybook (addon-a11y), 0 violations critiques | `apps/web/.storybook/` | M |
### Lot UX3 — PWA & Mobile
**Objectif** : Améliorer l'expérience mobile avec offline, installation, et background playback.
| # | Tâche | Fichiers impactés | Effort |
|---|-------|--------------------|--------|
| UX3-01 | Manifest PWA complet — icons (192, 512, maskable), theme_color, background_color, display: standalone, shortcuts | `apps/web/public/manifest.json` | S |
| UX3-02 | Service worker offline — cache app shell, pages visitées, fallback offline page | `apps/web/src/sw.ts` ou vite-plugin-pwa | M |
| UX3-03 | Add-to-home-screen prompt — beforeinstallprompt handler, bouton "Install App" dans Settings | `apps/web/src/hooks/usePWAInstall.ts`, Settings | M |
| UX3-04 | Background playback mobile — Audio element persist, page visibility API, prevent sleep (WakeLock API) | `apps/web/src/features/player/hooks/` | M |
| UX3-05 | Tests PWA — Lighthouse PWA score, offline fallback, install prompt | Tests | S |
### Lot QA1 — Tests & Release
| # | Tâche | Fichiers impactés | Effort |
|---|-------|--------------------|--------|
| QA1-01 | Smoke test v0.801 | `docs/SMOKE_TEST_V0801.md` | S |
| QA1-02 | Mise à jour PROJECT_STATE, FEATURE_STATUS, CHANGELOG | `docs/` | S |
| QA1-03 | Rétrospective, archivage, placeholder v0.802, tag | `docs/`, Git | S |
---
## 4. Hors scope v0.801
| Élément | Version cible |
|---------|---------------|
| Cloud Storage avancé | v0.802 |
| Gear warranty tracking | v0.802 |
| OpenAPI/Swagger | v0.803 |
| GDPR compliance complet | v0.803 |
| Wishlists marketplace | v0.901 |
| Layouts personnalisables (drag & drop modules) | v2.0 |
| Thèmes communautaires | v2.0 |
| Mode dyslexie-friendly | v2.0 |
| Transcriptions vidéo auto | v2.0 |
| Sous-titres auto-générés | v2.0 |
---
## 5. Détail technique
### 5.1 Design tokens contraste élevé
```css
[data-contrast="high"] {
--color-foreground: #000000;
--color-background: #ffffff;
--color-muted: #4a4a4a;
--color-border: #000000;
--color-primary: #0000cc;
--color-destructive: #cc0000;
}
.dark[data-contrast="high"] {
--color-foreground: #ffffff;
--color-background: #000000;
--color-muted: #cccccc;
--color-border: #ffffff;
--color-primary: #6666ff;
--color-destructive: #ff6666;
}
```
### 5.2 Mode compact
```css
[data-density="compact"] {
--spacing-unit: 0.75;
--font-size-base: 13px;
}
[data-density="comfortable"] {
--spacing-unit: 1;
--font-size-base: 15px;
}
```
### 5.3 Couleur d'accent
```typescript
function applyAccentColor(hue: number) {
document.documentElement.style.setProperty('--color-primary', `hsl(${hue}, 70%, 50%)`);
document.documentElement.style.setProperty('--color-primary-foreground', `hsl(${hue}, 70%, 98%)`);
localStorage.setItem('veza-accent-hue', String(hue));
}
```
### 5.4 prefers-reduced-motion
```css
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
```
### 5.5 Background Playback (WakeLock)
```typescript
async function requestWakeLock() {
if ('wakeLock' in navigator) {
try {
const lock = await navigator.wakeLock.request('screen');
return lock;
} catch (e) {
// WakeLock denied — battery saver, etc.
}
}
return null;
}
```
---
## 6. Fichiers impactés (récapitulatif)
### Backend (nouveau)
| Fichier | Action |
|---------|--------|
| `migrations/118_users_preferences.sql` | Nouveau — colonne preferences JSONB |
### Backend (modifier)
| Fichier | Action |
|---------|--------|
| `internal/models/user.go` | Ajout champ Preferences |
| `internal/handlers/user_handler.go` | PUT /users/me/preferences |
### Frontend (nouveau)
| Fichier | Action |
|---------|--------|
| `apps/web/src/hooks/usePWAInstall.ts` | Nouveau — beforeinstallprompt handler |
| `apps/web/src/hooks/useReducedMotion.ts` | Nouveau — prefers-reduced-motion hook |
### Frontend (modifier)
| Fichier | Action |
|---------|--------|
| `apps/web/src/index.css` | Design tokens contrast, compact, accent, reduced-motion, font-size |
| `apps/web/src/components/settings/SettingsAppearance.tsx` | Toggle contrast, density, color picker, font size slider |
| `apps/web/src/components/ui/` | ARIA labels, focus handlers, keyboard nav |
| `apps/web/public/manifest.json` | PWA manifest complet |
| `apps/web/src/features/player/hooks/` | WakeLock, background playback |
| `apps/web/.storybook/` | addon-a11y |
---
## 7. Critères d'acceptation
- [ ] Mode contraste élevé activable dans Settings, couleurs WCAG AA ratio 4.5:1
- [ ] Mode compact réduit spacing de 25%, confortable par défaut
- [ ] Couleur d'accent personnalisable via color picker, persistée
- [ ] Navigation clavier complète (Tab, Enter, Space, Escape) sur tous les composants UI
- [ ] ARIA labels sur tous les boutons icônes, modales, formulaires
- [ ] Focus visible ring distinct, skip-to-content link
- [ ] Taille de police ajustable (14px20px) via slider Settings
- [ ] prefers-reduced-motion respecté (animations désactivées)
- [ ] axe-core 0 violations critiques dans Storybook
- [ ] PWA installable (manifest complet, icons, display standalone)
- [ ] Offline : app shell cachée, page fallback
- [ ] Background playback mobile avec WakeLock
- [ ] Tag v0.801 créé
---
## 8. Risques
| Risque | Mitigation |
|--------|------------|
| Accent color casse le contraste | Validation ratio contraste automatique sur selection |
| ARIA labels verbeux sur screen reader | Tester avec VoiceOver/NVDA réels |
| Service worker cache stale | Cache-first + network fallback avec versioning |
| WakeLock non supporté partout | Feature detection, fallback gracieux |
| Compact mode casse des layouts | Tests visuels sur résolutions critiques (320px, 768px, 1920px) |
---
## 9. Références
- [RETROSPECTIVE_V0703.md](RETROSPECTIVE_V0703.md)
- [V0_703_RELEASE_SCOPE.md](archive/V0_703_RELEASE_SCOPE.md)
- [SCOPE_CONTROL.md](SCOPE_CONTROL.md)
- [DESIGN_TOKENS.md](apps/web/docs/DESIGN_TOKENS.md)
- [WCAG 2.1 AA Guidelines](https://www.w3.org/WAI/WCAG21/quickref/?levels=aaa)
- [Web App Manifest](https://developer.mozilla.org/en-US/docs/Web/Manifest)
- [Screen Wake Lock API](https://developer.mozilla.org/en-US/docs/Web/API/Screen_Wake_Lock_API)