11 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	Voici une version prête à coller dans Windsurf qui intègre fidèlement l’interface Nimbus/FuseBase et garantit une compatibilité à 100 % Desktop + Mobile (téléphone + tablette). J’ai resserré, clarifié et relié chaque exigence aux patterns “Nimbus” (chips filtrants, pickers Clear/Done, outline latéral, Portals/Share, workspaces, etc.).
🎯 Prompt Windsurf — ObsiViewer « Nimbus UI » (Desktop + Mobile 100%)
Rôle & Autorité
Agis comme Staff Frontend Engineer Angular 20 + UX Designer. Raisonnement détaillé autorisé. Tu peux refactorer, introduire de nouveaux composants, migrer le CSS vers Tailwind, et ne brise aucune feature existante.
Garde-fous
- Feature flag : un toggle dans la navbar bascule Nimbus UI ↔ Legacy UI sans perte d’état (URL, sélection, filtres).
 - 100 % Responsive : Desktop, Tablet, Mobile (petits smartphones inclus).
 - A11y : WCAG 2.1 AA, clavier + écran tactile.
 
ADN Nimbus à reproduire (invariants UX)
- 3 panneaux stables : Nav gauche (Quick Links / Folders / Tags), Index central (Recherche + chips All folders ▾ / All tags ▾ / All pages ▾), Page à droite (markdown + outline ToC dockable).
 - Recherche d’abord : top bar centrée, icône filtre → options avancées.
 - Chips persistantes = stateful filters (caret + badges comptage + Clear/Done).
 - Pickers riches (dossiers hiérarchiques multi-sélection, tags à coches, barre de recherche locale).
 - Progressive disclosure : menus condensés, pickers/overlays, hover-reveal “+” pour créer un sous-dossier.
 - Workspaces strictement séparés ; Share et Add to portal accessibles depuis la barre d’action de la page (si disponibles).
 - Contenu riche : markdown, callouts, code, cartes Bookmark (titre/desc/vignette).
 - Outline contextuel : bouton rond “hamburger” flottant dans la page → rail ToC H1–H6 avec scroll-to.
 
Référence de conception : Folders/Tags bi-axial, chips visibles en permanence, Clear partout, hiérarchie typographique nette, dark/light cohérents.
Objectif Final (résumé)
- Desktop (≥ 1024px) : Layout 3 colonnes (sidebar resizable 240–440px / index virtualisé / page + ToC fixe à droite).
 - Tablet (768–1023px) : Bottom tabs (Sidebar • List • Page • ToC) + drawer pour la sidebar.
 - Mobile (< 768px) : Bottom nav (4 icônes), sidebar en drawer 80vw, ToC inline/drawer, gestes swipe pour naviguer entre onglets.
 
Feature Flag & Toggle (obligatoire)
- UiModeService (signal boolean, persistance 
localStorage: obsiviewer-ui-mode = nimbus|legacy). - AppShellAdaptiveComponent sélectionne Nimbus vs Legacy.
 - Bouton toggle dans la navbar, accessible (
aria-label) et sans reset de l’état (on conserve : filtres actifs, élément sélectionné, scrolls, URL). 
Responsive Design — Stratégie
- Mobile-first avec Tailwind (
xs, sm, md, lg, xl, 2xl). - Variants par composant : 
*.desktop.component(≥ lg) /*.mobile.component(< lg). - Breakpoints cdk/layout pour l’injection conditionnelle.
 - Touch targets ≥ 44×44px, densité compacte mais respirante (Nimbus-style).
 
Composants à livrer (Nimbus-compat)
- 
Left Sidebar (desktop fixe/resizable, mobile drawer)
- Sections : Quick Links, Folders (arbo + hover-reveal “+”), Tags, Trash.
 - Workspace switcher + theme switch via menu avatar en bas.
 
 - 
Center List
- 
Search bar (champ centré + icône filtre)
 - 
Chips : All folders ▾ / All tags ▾ / All pages ▾ (badges + caret)
 - 
Pickers overlays :
- Folders multi-sélection hiérarchique, recherche locale, Clear/Done, badges +N.
 - Tags alphabétique, checkmarks, Clear/Done.
 
 - 
Liste virtualisée (CDK) : titre, date grisée, snippet (line-clamp), petites icônes (ex. bookmark).
 - 
État : “Found pages: N” + Clear visible si filtres actifs.
 
 - 
 - 
Note View + ToC
- Page markdown (prose), barre d’actions à droite : Ask AI, Add to portal, Share, loupe “find in page”, attachements, plein écran.
 - ToC Drawer : fixe à droite (desktop) ; inline/drawer (mobile).
 - Bouton flottant ToC (rond) dans la page.
 - Cards Bookmark (preview URL).
 
 - 
Mobile Shell
- Bottom navigation (Sidebar / List / Page / ToC).
 - Gestures : swipe gauche/droite pour changer d’onglet, pull-to-refresh (optionnel), long-press menu contextuel.
 - Search compact (menu, champ, bouton filtres → popover).
 
 
Exigences Techniques Clés
- URL state : sélection dossier/tag/tri dans l’URL (deep link).
 - Persistences : chips actives, split sizes, dernier onglet mobile, thème, workspace.
 - Virtual scroll : item 70–80px, 60 fps sur 1000+ items.
 - Dark/Light : palette stable, contrastes sûrs (Nimbus dark très contrasté).
 - Overlays : pickers centrés, Clear/Done persistants en pied, focus trap + ESC.
 - Perf Mobile : debounce recherche (300 ms mobile / 150 ms desktop), images lazy, évite CLS (skeletons, 
aspect-[ratio]). - A11y : ARIA, focus visible, nav clavier complète (Tab/Shift+Tab, Arrow), skip links.
 
Livrables (code & docs)
Code
UiModeService, bouton navbar,AppShellAdaptiveComponent.- Variants responsive : 
left-sidebar,center-list,note-view,toc-drawer,search-bar. - BottomNav, MobileNavService, SwipeNavDirective.
 - Pickers (Folders/Tags) avec recherche locale + Clear/Done.
 - Resizable handle (sidebar), virtual scroll (index).
 
Styling
tailwind.config.js(breakpoints), tokens light/dark, classes utilitaires mobile-first.- Prose markdown responsive, badges/chips Nimbus-like, states hover/selected.
 
Docs
README_UI.md(diagrammes 3 breakpoints + captures).MOBILE_GUIDE.md(flow onglets, gestes, drawer).RESPONSIVE_CHECKLIST.md(tests par breakpoint + devices).DEPLOYMENT.md(feature flag rollout).
Tests
- E2E : toggle persistant, switch sans perte d’état, pickers Clear/Done, deep links.
 - Visuel : snapshots Desktop/Tablet/Mobile.
 - A11y : axe + audits clavier.
 - Perf : 60 fps scroll, TTI < 2.5 s (mobile cold), Lighthouse Mobile ≥ 85 / A11y ≥ 95.
 
Critères d’Acceptation (DoD)
Desktop (≥ 1024px)
- 3 colonnes, sidebar resizable, ToC fixe à droite.
 - Chips visibles + pickers overlays Clear/Done, badges comptage.
 - 1000+ items fluide (virtual scroll 60 fps).
 - Ask AI / Add to portal / Share visibles si feature activée.
 
Tablet (768–1023px)
- Bottom tabs + sidebar drawer (swipe).
 - ToC inline repliable.
 - Tous contenus full-width par onglet.
 
Mobile (< 768px)
- Bottom nav (4 onglets), sidebar drawer 80vw.
 - Search compact + popover filtres, badges actifs scrollables en horizontal.
 - Markdown full-screen, ToC overlay/inline toggle.
 - Touch targets ≥ 44×44px.
 
Feature Flag & A11y/Perf
- Toggle visible, persistant, sans perte d’état.
 - WCAG 2.1 AA, focus visible, ARIA.
 - Lighthouse Mobile ≥ 85 perf, ≥ 95 a11y.
 
Plan d’Implémentation (ordre conseillé)
- Feature Flag infra (UiModeService + AppShellAdaptive + toggle navbar).
 - Shell Responsive (3 colonnes desktop, Tailwind tokens, resizable sidebar).
 - Mobile Navigation (BottomNav + MobileNavService + routing/états).
 - Sidebar Drawer (anim, backdrop, swipe dismiss, z-index).
 - Pickers (Folders/Tags) + chips/overlays + Clear/Done + recherche locale.
 - ToC Drawer (fixe desktop / inline mobile) + bouton flottant.
 - Perf & A11y (virtual scroll, debounce, lazy, focus trap).
 - Tests & Docs (E2E, visuel, a11y, guides).
 
Squelette de code minimal (extraits)
Toggle UI (navbar)
<button (click)="ui.toggleUIMode()"
        [attr.aria-label]="'Toggle ' + (ui.isNimbusMode() ? 'legacy' : 'nimbus') + ' UI'"
        class="p-2 rounded hover:bg-gray-100 dark:hover:bg-gray-800">
  <span *ngIf="ui.isNimbusMode()">✨ Nimbus</span>
  <span *ngIf="!ui.isNimbusMode()">🔧 Legacy</span>
</button>
Shell adaptatif
@Component({
  selector: 'app-shell-adaptive',
  template: `
    @if (ui.isNimbusMode()) { <app-shell-nimbus/> } @else { <app-shell-legacy/> }
  `,
  standalone: true,
  imports: [AppShellNimbusComponent, AppShellLegacyComponent]
})
export class AppShellAdaptiveComponent { constructor(public ui: UiModeService) {} }
Chips + Pickers (pattern)
<!-- Chips persistants -->
<div class="flex gap-2 flex-wrap">
  <app-chip [label]="foldersLabel" (click)="openFoldersPicker()"></app-chip>
  <app-chip [label]="tagsLabel" (click)="openTagsPicker()"></app-chip>
  <app-chip [label]="pagesLabel" (click)="openPagesPicker()"></app-chip>
</div>
<!-- Overlay picker Folders (multi + Clear/Done + search locale) -->
<app-folders-picker *ngIf="showFolders"
  [selected]="selectedFolders"
  (search)="onLocalSearch($event)"
  (clear)="clearFolders()" (done)="applyFolders($event)">
</app-folders-picker>
Bottom Nav (mobile)
<nav class="fixed bottom-0 inset-x-0 h-16 md:hidden
            bg-white dark:bg-gray-900 border-t border-gray-200 dark:border-gray-800
            flex justify-around z-30">
  <button *ngFor="let t of tabs" (click)="setTab(t.id)"
          class="flex-1 flex flex-col items-center justify-center text-xs gap-1">
    <span class="text-lg">{{t.icon}}</span><span>{{t.label}}</span>
  </button>
</nav>
Arborescence proposée
src/app/
├─ layout/
│  ├─ app-shell-adaptive/
│  ├─ app-shell-nimbus/ (desktop/mobile variants)
│  └─ app-navbar/
├─ features/
│  ├─ sidebar/ (desktop + mobile drawer)
│  ├─ search-bar/ (desktop + mobile)
│  ├─ center-list/ (+ virtual scroll + chips + pickers)
│  ├─ note-view/ (+ toolbar AskAI/Share/Portal si activées)
│  └─ toc-drawer/ (desktop fixe / mobile inline)
├─ shared/
│  ├─ services/ (ui-mode, mobile-nav, breakpoint)
│  ├─ directives/ (swipe-nav)
│  └─ components/ (resizable-handle, chip, picker, badge)
└─ styles/ (tokens, responsive, mobile)
Raccourcis & Gestes
- Desktop : 
Ctrl/Cmd+Kpalette,Ctrl/Cmd+Frecherche,Alt+←/→historique,[]ToC. - Mobile : swipe onglet précédent/suivant, long-press menu item, tap ouvre note, pull-to-refresh (optionnel).
 
Cibles Perf & Qualité
- TTI < 2.5 s sur mobile cold.
 - 60 fps scroll 1000+ items.
 - CLS < 0.1 (skeletons, ratios).
 - Lighthouse Mobile ≥ 85 (Perf) / ≥ 95 (A11y).
 
Consignes supplémentaires
- Zéro régression : graph view, wikilinks, bookmarks, search operators fonctionnels.
 - Internationalisation prête (labels chips, Clear/Done).
 - State durable : localStorage ou service (fallback SSR).
 - Thèmes : switch Light/Dark depuis avatar footer (comme Nimbus).
 
Exécute ce plan : implémente le Nimbus UI responsive avec toggle, livre le MR complet (code + tests + docs), conforme aux critères ci-dessus, Desktop/Tablet/Mobile 100 % OK.