veza/apps/web/dev_audit/frontend/03_component_map.md

201 lines
9.1 KiB
Markdown
Raw Normal View History

# Phase C — Cartographie des Composants
---
## Vue d'ensemble
| Zone | Fichiers .tsx (source) | Rôle |
|------|----------------------|------|
| `components/ui/` | ~120 | Primitives UI (design system) |
| `components/layout/` | 8 | Shell applicatif |
| `components/views/` | ~138 | Feature views (architecture legacy) |
| `components/{domain}/` | ~337 | Composants domaine (30 sous-dossiers) |
| `features/*/` | ~350+ | Feature modules (architecture cible) |
| **Total estimé** | **~950+** composants source | |
---
## 1. Primitives UI (`components/ui/`)
### Composants > 200 lignes (complexes)
| Composant | Lignes | Type | Observations |
|-----------|--------|------|-------------|
| `context-menu/ContextMenu.tsx` | 358 | Compound | Keyboard nav + ARIA complet |
| `table.tsx` | 305 | Compound | Table sémantique complète |
| `avatar.tsx` | 305 | Smart | Image fallback + sizes + status |
| `empty-state.tsx` | 237 | Dumb | Variantes multiples avec illustrations |
| `ImageViewerModal.tsx` | 230 | Smart | Zoom, navigation, gestures |
| `radio-group.tsx` | 228 | Compound | Accessible, keyboard nav |
| `badge.tsx` | 222 | Dumb | 7+ variantes CVA |
| `FormField.tsx` | 217 | Smart | Form integration + validation |
| `Sidebar.tsx` | 217 | Smart | Duplicate de layout/Sidebar ? |
| `dropdown.tsx` | 215 | Smart | Dropdown legacy |
| `LoadingState.tsx` | 214 | Dumb | Spinner, skeleton, message |
| `ImageCropper.tsx` | 211 | Smart | Canvas-based cropping |
| `progress.tsx` | 208 | Dumb | Linear + circular variants |
| `collapsible.tsx` | 198 | Smart | Animated expand/collapse |
| `alert.tsx` | 185 | Dumb | Info/warning/error/success |
| `card.tsx` | 180 | Compound | Header, Content, Footer, variants |
| `slider.tsx` | 170 | Smart | Range input, dual thumb |
| `WaveformVisualizer.tsx` | 165 | Smart | Canvas audio waveform |
| `confirmation-dialog.tsx` | 165 | Smart | Async confirm/cancel |
| `hover-card/HoverCard.tsx` | 268 | Smart | Positionnement auto |
| `ErrorDisplay.tsx` | 246 | Dumb | Variantes error/empty/loading |
| `select/SelectDropdownContent.tsx` | 156 | Smart | Virtualised dropdown |
| `KeyboardShortcutsPanel.tsx` | 151 | Dumb | Panel raccourcis |
| `modal.tsx` | 150 | Smart | Focus trap + overlay |
| `OptimizedImage.tsx` | 145 | Smart | Lazy load + blur placeholder |
### Composants légers (< 50 lignes)
- `AnimatedNumber.tsx` (16L), `ComingSoon.tsx` (14L), `ContentFadeIn.tsx` (33L), `ScrollToTop.tsx` (38L), `LazyComponent.tsx` (39L), `tooltip.tsx` (2L — re-export), `tabs.tsx` (7L — re-export)
### Compound Components (pattern Radix)
| Groupe | Fichiers | Pattern |
|--------|----------|---------|
| `dialog/` | 9 fichiers | Dialog, Content, Header, Body, Footer, Title, Description, Trigger, Skeleton |
| `dropdown-menu/` | 11 fichiers | Menu, Content, Item, Checkbox, Radio, Label, Separator, Shortcut, Trigger |
| `tabs/` | 5 fichiers | Tabs, List, Trigger, Content |
| `select/` | 5 fichiers | Select, Trigger, DropdownContent, OptionItem |
| `accordion/` | 4 fichiers | Accordion, Item, Trigger, Content |
| `date-picker/` | 4 fichiers | DatePicker, Calendar, Trigger |
| `hover-card/` | 4 fichiers | HoverCard, TrackHoverContent, UserHoverContent |
| `file-upload/` | 6 fichiers | FileUpload, Dropzone, FileList, ErrorList |
| `avatar-upload/` | 5 fichiers | AvatarUpload, Dropzone, Actions, Skeleton |
| `virtualized-list/` | 3 fichiers | VirtualizedList + hooks |
| `data-list/` | 5 fichiers | DataList, Empty, Error, Skeleton |
| `lazy-component/` | 4 fichiers | createLazyComponent, ErrorBoundary, ErrorFallback |
| `optimized-image/` | 4 fichiers | OptimizedImage, BlurPlaceholder, Skeleton, Responsive |
---
## 2. Layout (`components/layout/`)
| Composant | Lignes | Type | Rôle |
|-----------|--------|------|------|
| `Sidebar.tsx` | 294 | Smart | Navigation principale, collapse, mobile |
| `AudioPlayer.tsx` | 264 | Smart | Player bar persistent |
| `Navbar.tsx` | 263 | Smart | Barre de navigation top |
| `Header.tsx` | 172 | Smart | Header applicatif |
| `DashboardLayout.tsx` | 61 | Smart | Layout wrapper (sidebar + main) |
| `Layout.tsx` | 57 | Dumb | Layout générique |
| `MobileBottomNav.tsx` | 50 | Dumb | Navigation mobile |
| `PageTransition.tsx` | 26 | Dumb | Transition entre pages |
**Observation** : `Sidebar.tsx` dans layout/ (294L) et `Sidebar.tsx` dans ui/ (217L) — **duplication probable**. L'un est le layout sidebar, l'autre semble être un composant UI sidebar générique.
---
## 3. Features (architecture cible)
### Features les plus volumineuses
| Feature | Composants | Fichier principal | Lignes max |
|---------|-----------|-------------------|------------|
| `tracks` | ~40+ | TrackListRow.tsx | 320L |
| `playlists` | ~25+ | PlaylistListPage.tsx | 238L |
| `auth` | ~35+ | LoginPage.tsx | 225L |
| `chat` | ~15+ | ChatInput.tsx | 261L |
| `player` | ~20+ | PlayerExpanded.tsx | 241L |
| `streaming` | ~10+ | PlaybackSummary.tsx | 206L |
| `profile` | ~8+ | UserProfilePageTabs.tsx | 226L |
| `search` | ~8+ | SearchPageResults.tsx | 218L |
| `dashboard` | ~5+ | DashboardPage.tsx | 328L |
| `roles` | ~3+ | RolesPage.tsx | 275L |
| `library` | ~6+ | LibraryPageGrid.tsx | 102L |
| `studio` | ~10+ | FileToolbar.tsx | 242L |
| `settings` | ~5+ | SettingsPage.tsx | 183L |
| `marketplace` | ~5+ | Cart.tsx | 224L |
| `notifications` | ~5+ | NotificationsPage.tsx | 157L |
### Composants > 250 lignes dans features (attention)
| Composant | Lignes | Risque |
|-----------|--------|--------|
| `features/dashboard/pages/DashboardPage.tsx` | 328 | ⚠️ Dépasse limite 300L |
| `features/tracks/components/TrackListRow.tsx` | 320 | ⚠️ Dépasse limite 300L |
| `features/tracks/components/TrackList.tsx` | 290 | OK mais proche |
| `features/roles/pages/RolesPage.tsx` | 275 | Proche limite |
| `features/chat/components/ChatInput.tsx` | 261 | Proche limite |
| `features/tracks/components/TrackSearchResults.tsx` | 258 | Proche limite |
---
## 4. Composants domaine (`components/{domain}/`)
### Répartition par domaine
| Domaine | Composants (.tsx) | Observations |
|---------|------------------|-------------|
| `views/` | 138 | ⚠️ Plus gros dossier — views refactorés en sous-dossiers |
| `studio/` | 49 | Studio projects, file browser |
| `settings/` | 38 | Settings views (6 onglets) |
| `education/` | 18 | Cours, learning — feature "ComingSoon" |
| `social/` | 18 | Feed, groups, posts |
| `admin/` | 16 | Administration, moderation |
| `marketplace/` | 14 | Product listing |
| `inventory/` | 14 | Gear management |
| `player/` | 14 | Player UI (audio player legacy) |
| `upload/` | 10 | Upload components |
| `seller/` | 10 | Seller dashboard |
| `library/` | 9 | Library views |
| `monitoring/` | 9 | Monitoring dashboard |
| `notifications/` | 9 | Notification system |
| `share/` | 7 | Sharing components |
| `developer/` | 6 | Developer tools |
| `forms/` | 6 | Form components |
| `commerce/` | 5 | Commerce views |
| `gamification/` | 5 | XP, achievements, leaderboard |
| `charts/` | 4 | Chart components |
| `feedback/` | 4 | Toast, progress |
| `search/` | 4 | Global search |
| `dashboard/` | 3 | Dashboard widgets |
| `navigation/` | 3 | Breadcrumbs |
| `live/` | 2 | Live streaming |
| `theme/` | 2 | Theme provider/switcher |
| `auth/` | 1 | ProtectedRoute |
| `analytics/` | 1 | TrackAnalyticsView |
| `keyboard/` | 1 | Keyboard shortcuts |
| `pwa/` | 1 | PWA install banner |
| `user/` | 1 | User profile |
---
## 5. Tests associés
### Couverture des tests
| Zone | Fichiers .test.tsx | Observations |
|------|-------------------|-------------|
| `components/ui/` | ~25+ | Bonne couverture des primitives |
| `features/auth/` | ~15+ | Tests unitaires + integration |
| `features/tracks/` | ~15+ | Tests composants + services |
| `features/playlists/` | ~15+ | Tests + integration tests |
| `features/player/` | ~8+ | Tests services + hooks |
| `features/streaming/` | ~8+ | Tests services + hooks |
| `services/` | ~15+ | Tests services API |
| `hooks/` | ~12+ | Tests hooks custom |
| `__tests__/` | 2 | Accessibility + contrast |
| `router/` | 1 | Tests de routing |
**Estimation couverture** : ~60-70% des composants critiques ont des tests associés. Les features `chat`, `dashboard`, `studio`, `marketplace` semblent sous-testées côté composants.
---
## 6. Observations structurelles
### Points forts
- **Compound components** bien structurés (dialog, tabs, dropdown-menu, select) avec index.ts barrel exports
- **Skeletons systématiques** dans les views refactorées
- **Pattern cohérent** dans les features : `types.ts`, `index.ts`, `useXxx.ts`, `XxxSkeleton.tsx`
- **Composants bien nommés** : convention PascalCase, nom descriptif
### Points faibles
- **Dualité layout/** : `components/layout/Sidebar.tsx` (294L) vs `components/ui/Sidebar.tsx` (217L)
- **components/views/** (138 fichiers) coexiste avec `features/*/pages/` — migration incomplète
- **2 composants dépassent 300L** sans split (DashboardPage 328L, TrackListRow 320L)
- **Quelques legacy wrappers** : fichiers plats dans `components/views/` (AnalyticsView.tsx, CartView.tsx) qui wrappent les sous-dossiers refactorés
- **components/player/** (14 fichiers) coexiste avec `features/player/components/` (~20 fichiers) — même problème de dualité