# ๐ŸŽฏ Prompt Windsurf โ€” ObsiViewer Nimbus UI (Desktop + Mobile) ## ObsiViewer โ†’ UI/UX "Nimbus-like" (simple, dense, rapide) **Rรดle & mode :** Agis comme **Staff Frontend Engineer Angular 20 + UX designer**. Raisonnement dรฉtaillรฉ autorisรฉ. Tu as les pleins pouvoirs de refactor UI, d'ajout de composants, et de migration CSS vers Tailwind. Conserve la compatibilitรฉ de toutes features existantes. **Contrainte majeure :** L'interface doit รชtre **100% responsive** (Desktop + Mobile). Un **bouton toggle** dans la navbar permet de basculer entre l'ancienne interface et la nouvelle sans perte d'รฉtat. --- ## Contexte rapide * Projet : **ObsiViewer** (Angular 20 + Tailwind, Node/Express backend). * Objectif : Refondre l'interface selon un design **Nimbus Notes**-like. * Cล“urs d'usage : navigation par **dossiers**, **tags**, **recherche**, **lecture markdown** plein รฉcran, **ToC** ร  droite, **tri et filtres** rapides. * **Nouveautรฉ** : Design adaptatif complet (Desktop/Mobile/Tablet) avec UI toggle persistรฉ. --- ## ๐ŸŽฏ Objectif final (rรฉsumรฉ) ### Desktop (โ‰ฅ1024px) Refondre l'interface ObsiViewer en **3 colonnes** : 1. **Sidebar gauche** (Quick Links, Dossiers arborescents, Tags) โ€” Redimensionnable. 2. **Colonne centrale** Liste des pages (recherche, filtres dossiers/tags, tris, rรฉsultats virtualisรฉs). 3. **Vue de page** ร  droite (lecture markdown, barre d'actions, **panneau sommaire/ToC** dockรฉ ร  l'extrรชme droite). Le tout **compact, performant, thรจme clair/sombre**, navigation au clavier, รฉtats persistรฉs localement. ### Mobile/Tablet (<1024px) Une navigation **par onglets/drawer** intelligente : - **Tab 1 : Sidebar** (dossiers, tags, recherche) โ€” Panneau full-width ou drawer collapsible. - **Tab 2 : Liste** (rรฉsultats de recherche) โ€” Full-width scrollable. - **Tab 3 : Page** (markdown) โ€” Full-width avec ToC inline collapsible ou drawer. **Gestures** : Swipe horizontal pour navigation onglets, pull-to-refresh, tap = open item. --- ## ๐Ÿ“‹ Architecture Feature Flag & Toggle ### 1) Toggle UI dans la NavBar Ajouter un **bouton toggle** dans `src/app/layout/app-navbar/app-navbar.component.ts` : ```html
``` ### 2) Service de gestion du mode UI Crรฉer `src/app/shared/services/ui-mode.service.ts` : ```typescript import { Injectable, signal } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class UiModeService { // Signal pour rรฉactivitรฉ fine-grained isNimbusMode = signal(this.loadUIMode()); constructor() {} toggleUIMode() { const newMode = !this.isNimbusMode(); this.isNimbusMode.set(newMode); localStorage.setItem('obsiviewer-ui-mode', newMode ? 'nimbus' : 'legacy'); } private loadUIMode(): boolean { if (typeof localStorage === 'undefined') return false; const saved = localStorage.getItem('obsiviewer-ui-mode'); return saved ? saved === 'nimbus' : true; // Nimbus par dรฉfaut } } ``` ### 3) Layout wrapper avec feature flag Crรฉer `src/app/layout/app-shell-adaptive/app-shell-adaptive.component.ts` : ```typescript import { Component, inject } from '@angular/core'; import { UiModeService } from '@app/shared/services/ui-mode.service'; import { AppShellNimbusLayoutComponent } from '../app-shell-nimbus/app-shell-nimbus.component'; import { AppShellLegacyLayoutComponent } from '../app-shell-legacy/app-shell-legacy.component'; @Component({ selector: 'app-shell-adaptive', template: ` @if (uiMode.isNimbusMode()) { } @else { } `, standalone: true, imports: [AppShellNimbusLayoutComponent, AppShellLegacyLayoutComponent], }) export class AppShellAdaptiveComponent { uiMode = inject(UiModeService); } ``` --- ## ๐ŸŽจ Responsive Design Strategy ### Breakpoints Tailwind (standard) ```typescript // tailwind.config.js module.exports = { theme: { screens: { 'xs': '320px', // iPhone SE 'sm': '640px', // Petites tablettes 'md': '768px', // iPad, tablettes 'lg': '1024px', // Desktop compact 'xl': '1280px', // Desktop standard '2xl': '1536px', // Larges รฉcrans }, }, }; ``` ### Mobile First Approach **Dรฉvelopper pour mobile d'abord, puis enrichir pour desktop.** --- ## ๐Ÿ“ฑ Layouts Responsifs ### Desktop Layout (โ‰ฅ1024px) ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ NAVBAR (Dark, fixed, h-14) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ SIDEBAR โ”‚ RESULT LIST โ”‚ NOTE VIEW + TOC โ”‚ โ”‚ (240-440px) โ”‚ (virtualized) โ”‚ (Resizable) โ”‚ โ”‚ Resizable โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - Quick โ”‚ - Search bar โ”‚ - Markdown โ”‚ โ”‚ Links โ”‚ - Filters โ”‚ - ToC drawer โ”‚ โ”‚ - Folders โ”‚ - Items (80px) โ”‚ - Actions bar โ”‚ โ”‚ - Tags โ”‚ - Pagination โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### Tablet Layout (768px โ‰ค width < 1024px) ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ NAVBAR + Toggle (fixed, h-14) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ TAB NAVIGATION (fixed, bottom) โ”‚ โ”‚ [Sidebar] [List] [Page] [ToC] โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ ACTIVE TAB CONTENT (scrollable) โ”‚ โ”‚ - Drawer si besoin โ”‚ โ”‚ - Full-width panels โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### Mobile Layout (<768px) ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ NAVBAR (compact, h-12) โ”‚ โ”‚ [Menu] [Search] [Toggle] โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ TAB/DRAWER NAVIGATION โ”‚ โ”‚ [โ‰ก] [๐Ÿ”] [๐Ÿ“„] [๐Ÿ“‹] โ”‚ โ”‚ โ”‚ โ”‚ CONTENT AREA (Full-width) โ”‚ โ”‚ - Drawer sidebar (80vw left) โ”‚ โ”‚ - Swipeable list (list tab) โ”‚ โ”‚ - Markdown full-screen (page) โ”‚ โ”‚ - Inline ToC (toggle button) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Bottom Navigation (sticky) โ”‚ โ”‚ Tab buttons (4 icรดnes) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## ๐ŸŽฌ Composants Nimbus Responsifs ### Desktop/Mobile Variants Chaque composant doit avoir des **variants responsifs** : ``` app-left-sidebar/ โ”œโ”€โ”€ app-left-sidebar.component.ts # Logique partagรฉe โ”œโ”€โ”€ app-left-sidebar.desktop.component.ts # โ‰ฅ1024px (fixed, resizable) โ””โ”€โ”€ app-left-sidebar.mobile.component.ts # <1024px (drawer) app-center-list/ โ”œโ”€โ”€ app-center-list.component.ts โ”œโ”€โ”€ app-center-list.desktop.component.ts # โ‰ฅ1024px (2 colonnes) โ””โ”€โ”€ app-center-list.mobile.component.ts # <1024px (full-width) app-note-view/ โ”œโ”€โ”€ app-note-view.component.ts โ”œโ”€โ”€ app-note-view.desktop.component.ts # โ‰ฅ1024px (3 colonnes + ToC) โ””โ”€โ”€ app-note-view.mobile.component.ts # <1024px (full-width + ToC inline) app-toc-drawer/ โ”œโ”€โ”€ app-toc-drawer.component.ts โ”œโ”€โ”€ app-toc-drawer.desktop.component.ts # โ‰ฅ1024px (Fixed right) โ””โ”€โ”€ app-toc-drawer.mobile.component.ts # <1024px (Collapsible, inline) ``` ### Dรฉtection et Injection ```typescript // app-left-sidebar.component.ts import { Component, inject } from '@angular/core'; import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; @Component({ selector: 'app-left-sidebar', standalone: true, template: ` @if (isDesktop$ | async) { } @else { } `, }) export class AppLeftSidebarComponent { private breakpoint = inject(BreakpointObserver); isDesktop$ = this.breakpoint.observe(Breakpoints.Large).pipe( map(result => result.matches) ); } ``` --- ## ๐Ÿ“ฑ Navigation Mobile Avancรฉe ### Tab/Drawer Navigation ```typescript // src/shared/services/mobile-nav.service.ts @Injectable({ providedIn: 'root' }) export class MobileNavService { activeTab = signal<'sidebar' | 'list' | 'page' | 'toc'>('list'); setTab(tab: 'sidebar' | 'list' | 'page' | 'toc') { this.activeTab.set(tab); // Persist if needed } } // Usage in component ``` ### Swipe Navigation (Gestures) ```typescript // Directive pour dรฉtection de swipe import { Directive, Output, EventEmitter, HostListener } from '@angular/core'; @Directive({ selector: '[appSwipeNav]', standalone: true, }) export class SwipeNavDirective { @Output() swipeLeft = new EventEmitter(); @Output() swipeRight = new EventEmitter(); private startX = 0; @HostListener('touchstart', ['$event']) onTouchStart(e: TouchEvent) { this.startX = e.touches[0].clientX; } @HostListener('touchend', ['$event']) onTouchEnd(e: TouchEvent) { const endX = e.changedTouches[0].clientX; const diff = this.startX - endX; if (Math.abs(diff) > 50) { // Seuil minimum if (diff > 0) this.swipeLeft.emit(); else this.swipeRight.emit(); } } } ``` --- ## ๐ŸŽจ Composants Spรฉcifiques (Mobile-First) ### 1) Bottom Navigation (Mobile) ```html ``` ### 2) Drawer Sidebar (Mobile) ```html
``` ### 3) Search Bar Compact (Mobile) ```html
{{ badge }} โœ•
``` ### 4) Result List Item (Mobile-Optimized) ```html

{{ item.title }}

{{ item.modified | date:'short' }}
{{ tag }}

{{ item.excerpt }}

``` ### 5) Markdown Viewer (Mobile-Responsive) ```html
``` ### 6) ToC Drawer (Desktop Fixed, Mobile Inline) ```typescript // app-toc-drawer.component.ts @Component({ selector: 'app-toc-drawer', template: `
`, animations: [ trigger('slideDown', [ state('in', style({ height: '*' })), state('out', style({ height: '0px' })), transition('in <=> out', animate('200ms ease-in-out')), ]), ], standalone: true, }) export class AppTocDrawerComponent { @Input() headings: Heading[] = []; showTocMobile = false; isMobile$ = this.breakpoint.observe('(max-width: 1023px)').pipe( map(r => r.matches) ); } ``` --- ## ๐ŸŽฏ Livrables Attendus ### Code 1. **Toggle UI** : `UiModeService`, bouton navbar, `AppShellAdaptiveComponent` 2. **Responsive Wrappers** : Variants pour chaque composant (Desktop/Mobile) 3. **Mobile Components** : Bottom nav, drawer sidebar, inline ToC, mobile search 4. **Gesture Handling** : Swipe navigation directive, touch-friendly interactions 5. **Breakpoint Utilities** : Service CDK layout, reactive signals ### Styling 1. **Tailwind Config** : Breakpoints personnalisรฉs, tokens tokens clair/sombre 2. **Mobile-First CSS** : Base mobile, enrichissements desktop via `md:`, `lg:` 3. **Touch-Friendly** : Boutons โ‰ฅ44x44px, padding adรฉquat, hover states ### Documentation 1. **README_UI.md** : Schรฉmas responsive, breakpoints, guide toggle 2. **MOBILE_GUIDE.md** : Navigation gestures, bottom nav flow, drawer patterns 3. **RESPONSIVE_CHECKLIST.md** : Tests par breakpoint, checklist A11y mobile ### Tests 1. **E2E** : Toggle persistence, layout switch, gesture navigation 2. **Visual Regression** : Screenshots desktop/tablet/mobile 3. **Accessibility** : Touch targets, ARIA labels, keyboard nav (Tab key) --- ## โšก Performance & Mobile Optimizations ### Critical Optimizations - **Lazy-load images** : `loading="lazy"`, responsive `srcset` - **Virtual scroll** : CDK virtual scroll adaptรฉ mobile (item height โ‰ˆ 70โ€“80px) - **Debounce search** : 300ms sur mobile, 150ms sur desktop - **Avoid layout shift** : Aspect ratios, skeleton loaders - **Network awareness** : `navigator.connection.effectiveType` pour adapt qualitรฉ - **Battery saver** : Rรฉduire animations, throttle updates en mode saver ### Lighthouse Mobile Targets - Performance โ‰ฅ 85 - Accessibility โ‰ฅ 95 - Best Practices โ‰ฅ 90 --- ## ๐ŸŽฎ Raccourcis Clavier & Gestures ### Desktop - `Ctrl/Cmd + K` : Palette commandes - `Ctrl/Cmd + F` : Focus recherche - `[` `]` : Replier/ouvrir ToC - `Alt + โ†/โ†’` : Navigation historique ### Mobile/Tablet - **Tap** : Ouvrir note/item - **Swipe left/right** : Changer onglet (list โ†’ page โ†’ sidebar) - **Long-press** : Menu contextuel (favoris, open in new tab) - **Pull-to-refresh** : Rafraรฎchir liste (optionnel) - **Double-tap** : Zoom ToC (mobile) --- ## ๐Ÿ“‹ Critรจres d'Acceptation ### Desktop (โ‰ฅ1024px) - [x] Layout 3 colonnes (sidebar fixe/resizable, liste, page+ToC) - [x] Changement dossier/tag/tri reflรฉtรฉ en URL - [x] 1000+ items fluide (60fps virtual scroll) - [x] ToC synchronisรฉ + repliable - [x] Tous les flux clavier-seuls possibles ### Tablet (768โ€“1023px) - [x] Navigation par onglets (Sidebar / List / Page) - [x] Drawer sidebar (80vw, swipeable) - [x] Bottom navigation sticky (4 icรดnes) - [x] Contenu full-width par onglet - [x] ToC inline collapsible ### Mobile (<768px) - [x] Drawer sidebar (80vw max) - [x] Bottom nav (4 onglets) - [x] Search bar compact (menu + search + filters) - [x] List items optimisรฉs (titre + date + excerpt) - [x] Markdown full-screen - [x] ToC overlay ou inline toggle - [x] Touch targets โ‰ฅ 44x44px ### Feature Flag - [x] Toggle UI visible dans navbar - [x] ร‰tat persistรฉ (localStorage) - [x] Pas de perte d'รฉtat lors du switch - [x] Legacy UI reste intacte ### Accessibility - [x] WCAG 2.1 AA sur tous les breakpoints - [x] Keyboard navigation complรจte (Tab, Arrow, Enter) - [x] ARIA labels pour navigation tactile - [x] Focus visible partout - [x] Zoom โ‰ค 200% sans horizontal scroll ### Performance - [x] TTI < 2.5s cold start - [x] Scroll 60fps sur 1000+ items - [x] Lighthouse Mobile โ‰ฅ 85 perf, โ‰ฅ 95 a11y - [x] ImageOptimizations (lazy, srcset, format next-gen) --- ## ๐Ÿ—‚๏ธ Arborescence Fichiers ``` src/app/ โ”œโ”€โ”€ layout/ โ”‚ โ”œโ”€โ”€ app-shell-adaptive/ โ”‚ โ”‚ โ””โ”€โ”€ app-shell-adaptive.component.ts # Feature flag wrapper โ”‚ โ”œโ”€โ”€ app-shell-nimbus/ โ”‚ โ”‚ โ”œโ”€โ”€ app-shell-nimbus.component.ts # 3 colonnes (desktop) โ”‚ โ”‚ โ”œโ”€โ”€ app-shell-nimbus.desktop.component.ts โ”‚ โ”‚ โ””โ”€โ”€ app-shell-nimbus.mobile.component.ts โ”‚ โ””โ”€โ”€ app-navbar/ โ”‚ โ”œโ”€โ”€ app-navbar.component.ts โ”‚ โ””โ”€โ”€ [Bouton toggle UI intรฉgrรฉ] โ”‚ โ”œโ”€โ”€ features/ โ”‚ โ”œโ”€โ”€ sidebar/ โ”‚ โ”‚ โ”œโ”€โ”€ app-left-sidebar.component.ts โ”‚ โ”‚ โ”œโ”€โ”€ app-left-sidebar.desktop.component.ts โ”‚ โ”‚ โ””โ”€โ”€ app-left-sidebar.mobile.component.ts โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ search-bar/ โ”‚ โ”‚ โ”œโ”€โ”€ app-search-bar.component.ts โ”‚ โ”‚ โ”œโ”€โ”€ app-search-bar.desktop.component.ts โ”‚ โ”‚ โ””โ”€โ”€ app-search-bar.mobile.component.ts โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ result-list/ โ”‚ โ”‚ โ”œโ”€โ”€ app-result-list.component.ts โ”‚ โ”‚ โ”œโ”€โ”€ app-result-list.desktop.component.ts โ”‚ โ”‚ โ”œโ”€โ”€ app-result-list.mobile.component.ts โ”‚ โ”‚ โ””โ”€โ”€ app-result-list-item.component.ts โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ note-view/ โ”‚ โ”‚ โ”œโ”€โ”€ app-note-view.component.ts โ”‚ โ”‚ โ”œโ”€โ”€ app-note-view.desktop.component.ts โ”‚ โ”‚ โ””โ”€โ”€ app-note-view.mobile.component.ts โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ toc-drawer/ โ”‚ โ”‚ โ”œโ”€โ”€ app-toc-drawer.component.ts โ”‚ โ”‚ โ””โ”€โ”€ app-toc-content.component.ts โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ bottom-nav/ [NEW] โ”‚ โ”œโ”€โ”€ app-bottom-nav.component.ts โ”‚ โ””โ”€โ”€ app-bottom-nav.component.html โ”‚ โ”œโ”€โ”€ shared/ โ”‚ โ”œโ”€โ”€ services/ โ”‚ โ”‚ โ”œโ”€โ”€ ui-mode.service.ts # [NEW] Toggle management โ”‚ โ”‚ โ”œโ”€โ”€ mobile-nav.service.ts # [NEW] Tab/drawer state โ”‚ โ”‚ โ””โ”€โ”€ breakpoint.service.ts # [NEW] Responsive helper โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ directives/ โ”‚ โ”‚ โ””โ”€โ”€ swipe-nav.directive.ts # [NEW] Gesture detection โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ components/ โ”‚ โ””โ”€โ”€ resizable-handle/ โ”‚ โ””โ”€โ”€ styles/ โ”œโ”€โ”€ tokens.css # Tailwind tokens โ”œโ”€โ”€ responsive.css # Breakpoint utilities โ””โ”€โ”€ mobile.css # Mobile-specific (touches, etc.) ``` --- ## ๐Ÿ“… Plan d'Implรฉmentation (ordre conseillรฉ) 1. **Feature Flag Infrastructure** (1-2j) - `UiModeService` + localStorage persistence - `AppShellAdaptiveComponent` wrapper - Toggle button dans navbar 2. **Responsive Shell & Breakpoints** (2-3j) - Desktop layout 3 colonnes (>=1024px) - Tailwind breakpoints & tokens - Resizable sidebar logic 3. **Mobile Navigation & Bottom Nav** (2-3j) - `BottomNavComponent` (4 onglets) - `MobileNavService` (state management) - Tab/drawer routing 4. **Mobile Sidebar Drawer** (1-2j) - Drawer animรฉ (translate, backdrop) - Swipe dismiss directive - Z-index management 5. **Responsive Components** (3-4j) - Search bar variants (desktop/mobile) - Result list item responsive - Markdown viewer mobile optimizations 6. **ToC Drawer Adaptive** (1-2j) - Fixed right panel (desktop) - Inline toggle (mobile) - Animations smooth 7. **Gestures & Touch** (1-2j) - Swipe nav directive - Long-press menu - Pull-to-refresh (optionnel) 8. **Accessibility & Testing** (2-3j) - WCAG 2.1 AA audit - Keyboard nav (Tab, Arrow) - E2E tests (toggle, breakpoints) - Visual regression (3 breakpoints) **Total estimรฉ** : 13โ€“21 jours (รฉquipe 1 FE engineer) --- ## ๐Ÿš€ Scripts NPM ```bash # Dev complet (Nimbus activรฉ par dรฉfaut) npm run dev # Build production npm run build # Tests responsifs (plusieurs breakpoints) npm run test:responsive # Lighthouse audit mobile npm run audit:lighthouse:mobile # Feature flag (override) NIMBUS_UI=false npm run dev # Force legacy UI ``` --- ## โœ… Checklist Livraison - [ ] Toggle UI visible, fonctionnel, persistรฉ - [ ] Desktop (โ‰ฅ1024px) : 3 colonnes, interactions fluides - [ ] Tablet (768โ€“1023px) : Onglets + drawer, full-width contenu - [ ] Mobile (<768px) : Bottom nav, drawer, touch-friendly - [ ] Tous les flux clavier-seuls rรฉalisables - [ ] Lighthouse mobile โ‰ฅ 85 perf, โ‰ฅ 95 a11y - [ ] Virtual scroll 60fps sur 1000+ items - [ ] Tests E2E (toggle, breakpoints, gestures) - [ ] Documentation complรจte (README_UI.md, MOBILE_GUIDE.md, RESPONSIVE_CHECKLIST.md) - [ ] Zรฉro rรฉgression : legacy UI inchangรฉe, Wikilinks, bookmarks, graph intacts - [ ] Screenshots before/after 3 breakpoints --- ## ๐Ÿ“– Documentation ร  Produire 1. **README_UI.md** : Overview, architecture, screenshots 3 breakpoints 2. **MOBILE_GUIDE.md** : Navigation onglets, gestures, drawer patterns 3. **RESPONSIVE_CHECKLIST.md** : Tests par breakpoint, device testing 4. **DEPLOYMENT.md** : Feature flag pour bascule progressive 5. **ARCHITECTURE_DIAGRAM.md** : Schรฉmas adaptatifs (Mermaid) --- ## ๐Ÿ’ก Notes Importantes - **Mobile First** : Dรฉvelopper pour mobile en premier, puis enrichir desktop. - **Persistent State** : Le toggle UI et les filtres actifs doivent persister via localStorage (sans browser storage, utiliser sessionStorage ou service state). - **Zero Regression** : L'ancienne interface reste intacte et fonctionnelle. - **Performance** : Virtual scroll adaptรฉ mobile (40+ items ร  l'รฉcran), lazy-load images. - **Accessibility** : 44x44px touch targets minimum, ARIA labels complets, keyboard nav. - **Testing** : Visual regression sur breakpoints clรฉs (375px / 768px / 1440px). --- **Exรฉcute maintenant ce plan** : crรฉe les composants, adapte les routes/รฉtats, ajoute les styles Tailwind responsifs, branche la recherche et livre le MR conforme aux critรจres ci-dessus avec toggle UI et compatibilitรฉ 100% Desktop/Mobile.