Voici le prompt refondu pour inclure la compatibilité mobile/tablet complète tout en conservant la philosophie Nimbus :
# π― Prompt Windsurf β ObsiViewer Nimbus UI (Desktop + Mobile)
## ObsiViewer β UI/UX "Nimbus-like" (responsive, 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 β₯1024px / Tablet 768-1023px / Mobile <768px). Un **bouton toggle** dans la navbar permet de basculer entre l'ancienne interface et la nouvelle sans perte d'Γ©tat.
---
## π Architecture Nimbus Responsive
### Desktop (β₯1024px) - Layout 3 colonnes
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β NAVBAR (Search centrΓ© + CTA "+ Page" + Actions droite) β
βββββββββββββββ¬ββββββββββββββββββββββ¬ββββββββββββββββββββββ€
β SIDEBAR β CENTER COLUMN β NOTE + TOC β
β Navigation β β’ Chips filtres β β’ Γdition riche β
β Dossiers/Tagsβ β’ Liste rΓ©sultats β β’ Outline contextuelβ
β Quick Links β β’ Virtual scroll β β’ Barre actions β
βββββββββββββββ΄ββββββββββββββββββββββ΄ββββββββββββββββββββββ
```
### Tablet (768-1023px) - Navigation par onglets
```
ββββββββββββββββββββββββββββββββββββββ
β NAVBAR (Search + Toggle UI) β
ββββββββββββββββββββββββββββββββββββββ€
β [β‘] [π] [π] [π] Tabs bottom β
ββββββββββββββββββββββββββββββββββββββ€
β β
β CONTENU ACTIF FULL-WIDTH β
β β’ Sidebar: Drawer 80vw β
β β’ Liste: Cards compactes β
β β’ Note: Markdown + ToC inline β
β β
ββββββββββββββββββββββββββββββββββββββ
```
### Mobile (<768px) - Navigation bottom + Drawers
```
ββββββββββββββββββββββββββββββββββββ
β NAVBAR compacte (Menu + Search) β
ββββββββββββββββββββββββββββββββββββ€
β CONTENT AREA β
β β’ Sidebar: Drawer full β
β β’ Liste: Items optimisΓ©s β
β β’ Note: Plein Γ©cran β
ββββββββββββββββββββββββββββββββββββ€
β [β‘][π][+][π][π] Bottom Nav β
ββββββββββββββββββββββββββββββββββββ
```
---
## π― Composants Nimbus SpΓ©cifiques Γ Reproduire
### 1) Top Bar Nimbus (Responsive)
```typescript
// Desktop: Search centrΓ© + CTA turquoise
Workspace Selector
// Mobile: Stacked + icons
```
### 2) Chips de Filtres Nimbus (Responsive)
```typescript
// Desktop: Chips horizontales
All folders
+2
βΎ
All tags
+1
βΎ
All pages
βΎ
// Mobile: Chips scrollables horizontalement
```
### 3) Picker Overlays Nimbus (Responsive)
```typescript
// Desktop: Overlay centrΓ©
// Mobile: Picker full-screen
```
### 4) Outline Contextuel Nimbus (Responsive)
```typescript
// Desktop: Panneau droit fixe
// Mobile: Bouton flottant + overlay
```
---
## π¨ Palette Nimbus & Design Tokens
```css
/* Tokens Nimbus (light/dark) */
:root {
/* Couleurs primaires */
--nimbus-cyan: #06b6d4;
--nimbus-cyan-dark: #0891b2;
/* Gris scale */
--nimbus-gray-50: #f9fafb;
--nimbus-gray-100: #f3f4f6;
--nimbus-gray-800: #1f2937;
--nimbus-gray-900: #111827;
/* Espacements */
--nimbus-space-1: 0.25rem;
--nimbus-space-2: 0.5rem;
--nimbus-space-3: 0.75rem;
/* Typographie */
--nimbus-text-sm: 0.875rem;
--nimbus-text-base: 1rem;
}
.dark {
--nimbus-bg: var(--nimbus-gray-900);
--nimbus-surface: var(--nimbus-gray-800);
}
```
---
## π± Gestes Mobiles SpΓ©cifiques Nimbus
### Swipe Navigation
```typescript
@Directive({
selector: '[appSwipeNav]',
standalone: true
})
export class SwipeNavDirective {
private startX = 0;
private startY = 0;
@HostListener('touchstart', ['$event'])
onTouchStart(e: TouchEvent) {
this.startX = e.touches[0].clientX;
this.startY = e.touches[0].clientY;
}
@HostListener('touchend', ['$event'])
onTouchEnd(e: TouchEvent) {
const endX = e.changedTouches[0].clientX;
const endY = e.changedTouches[0].clientY;
const diffX = this.startX - endX;
const diffY = this.startY - endY;
// Seulement swipe horizontal significatif
if (Math.abs(diffX) > 50 && Math.abs(diffY) < 30) {
if (diffX > 0) {
this.swipeLeft.emit(); // β Tab suivant
} else {
this.swipeRight.emit(); // β Tab prΓ©cΓ©dent
}
}
}
@Output() swipeLeft = new EventEmitter();
@Output() swipeRight = new EventEmitter();
}
```
### Hover-reveal Adaptatif (Desktop seulement)
```typescript
// Seulement sur desktop
// Mobile: Toujours visible ou menu contextuel
π Projects
```
---
## π§ Service UI Mode & Responsive State
```typescript
@Injectable({ providedIn: 'root' })
export class UiModeService {
// Signal pour le mode Nimbus vs Legacy
isNimbusMode = signal(this.loadUIMode());
// Signal pour le breakpoint actif
currentBreakpoint = signal<'mobile' | 'tablet' | 'desktop'>('desktop');
constructor(private breakpointObserver: BreakpointObserver) {
// Surveillance des breakpoints
this.breakpointObserver.observe([
'(max-width: 767px)',
'(min-width: 768px) and (max-width: 1023px)',
'(min-width: 1024px)'
]).subscribe(result => {
const breakpoints = result.breakpoints;
if (breakpoints['(max-width: 767px)']) {
this.currentBreakpoint.set('mobile');
} else if (breakpoints['(min-width: 768px) and (max-width: 1023px)']) {
this.currentBreakpoint.set('tablet');
} else {
this.currentBreakpoint.set('desktop');
}
});
}
toggleUIMode() {
const newMode = !this.isNimbusMode();
this.isNimbusMode.set(newMode);
localStorage.setItem('obsiviewer-ui-mode', newMode ? 'nimbus' : 'legacy');
}
private loadUIMode(): boolean {
return localStorage?.getItem('obsiviewer-ui-mode') !== 'legacy';
}
}
```
---
## π Composants SpΓ©cifiques Nimbus
### 1) Bookmark Card (Responsive)
```typescript
// Desktop: Carte horizontale
Article Title
Description of the bookmarked content...
example.com
2 days ago
// Mobile: Carte verticale
Article Title
Description...
example.com
2 days ago
```
### 2) Result List Item Nimbus
```typescript
// Desktop: Ligne compacte
π
Document Title
First few lines of content as preview...
// Mobile: Stack vertical
π
Document Title
First few lines of content as preview...
```
---
## π CritΓ¨res d'Acceptation Nimbus
### Desktop (β₯1024px)
- [x] **Layout 3 colonnes** fidèle à Nimbus
- [x] **Top bar** avec search centrΓ© + CTA "+ Page" turquoise
- [x] **Chips filtres** "All folders βΎ", "All tags βΎ", "All pages βΎ" avec badges
- [x] **Pickers overlays** avec recherche locale + hiΓ©rarchie
- [x] **Outline contextuel** panneau droit fixe
- [x] **Hover-reveal** crΓ©ation sous-dossiers
- [x] **Workspace switcher** dans sidebar
### Tablet (768-1023px)
- [x] **Navigation par onglets** [Sidebar] [List] [Page] [ToC]
- [x] **Drawer sidebar** 80vw avec arborescence
- [x] **Chips scrollables** horizontalement
- [x] **Pickers full-screen** avec Done/Clear
- [x] **ToC inline** collapsible
### Mobile (<768px)
- [x] **Bottom navigation** 5 onglets [Menu] [List] [+] [Search] [ToC]
- [x] **Drawers full-width** pour sidebar/pickers
- [x] **Search bar compacte** dans header
- [x] **Touch targets** β₯ 44px
- [x] **Swipe gestures** changement onglets
- [x] **Pull-to-refresh** liste rΓ©sultats
### FidΓ©litΓ© Nimbus
- [x] **Philosophie workspace-first** avec sΓ©lecteur d'espace
- [x] **Organisation bi-axiale** dossiers + tags
- [x] **Recherche d'abord** avec filtres persistants
- [x] **Progressive disclosure** (menus contextuels)
- [x] **Bookmarks** avec cartes enrichies
- [x] **Boutons Share/Add to portal** visibles
### Performance & AccessibilitΓ©
- [x] **Virtual scroll** 1000+ items fluide
- [x] **Lighthouse Mobile** β₯ 85 perf, β₯ 95 a11y
- [x] **Keyboard navigation** complète
- [x] **WCAG 2.1 AA** tous breakpoints
- [x] **Toggle UI** persistΓ© sans perte Γ©tat
---
## π― Livrables Exacts
1. **Toggle UI Nimbus/Legacy** avec persistence
2. **Layout 3 colonnes desktop** fidèle Nimbus
3. **Navigation responsive** tablette/mobile
4. **Composants Nimbus** : Chips, Pickers, Outline, Bookmark cards
5. **Gestes mobiles** : swipe, pull-to-refresh
6. **Thème clair/sombre** Nimbus-like
7. **Documentation** responsive + patterns Nimbus
**Γtat initial** : Toggle sur "Nimbus" par dΓ©faut, legacy UI intacte
**Testing** : 3 breakpoints + gestures + accessibility
**Performance** : 60fps virtual scroll, lazy loading images
---
ExΓ©cute maintenant cette implΓ©mentation en respectant scrupuleusement les patterns UI/UX de Nimbus Notes tout en garantissant la compatibilitΓ© 100% responsive mobile/tablet/desktop.