# Guide de migration - Toolbar fixe → Toolbar inline
## 📌 Résumé des changements
### Avant (Toolbar fixe)
```
┌─────────────────────────────────────────┐
│ [Titre du document] │
│ │
│ ┌─────────────────────────────────────┐ │
│ │ Start writing... [🤖][☑][1.][•][⊞]│ │ ← Barre fixe
│ └─────────────────────────────────────┘ │
│ │
│ Bloc 1: Paragraphe │
│ Bloc 2: Table │
│ Bloc 3: Image │
└─────────────────────────────────────────┘
```
### Après (Toolbar inline)
```
┌─────────────────────────────────────────┐
│ [Titre du document] │
│ │
│ ⋮⋮ Start writing... [🤖][☑][1.][⊞][⬇] │ ← Inline dans le bloc
│ │
│ ⋮⋮ Bloc 1: Paragraphe [icônes...] │ ← Chaque bloc a sa toolbar
│ ⋮⋮ Bloc 2: Table [icônes...] │
│ ⋮⋮ Bloc 3: Image [icônes...] │
└─────────────────────────────────────────┘
```
## 🔄 Composants modifiés
### 1. EditorShellComponent
**Supprimé**:
```typescript
// ❌ ANCIEN - Toolbar fixe au niveau shell
```
**Résultat**: Plus de toolbar globale, chaque bloc gère la sienne.
### 2. ParagraphBlockComponent
**Avant**:
```html
```
**Après**:
```html
```
**Changements**:
- ✅ Wrapper avec gestion hover/focus
- ✅ Intégration `BlockInlineToolbarComponent`
- ✅ Signals pour états visuels
- ✅ Détection "/" pour menu
### 3. BlockMenuComponent
**Avant**:
```typescript
// Position fixe centrée
style="top: 20%; left: 50%; transform: translateX(-50%)"
width: 680px
height: 600px
```
**Après**:
```typescript
// Position contextuelle près du curseur
[style.top.px]="menuPosition().top"
[style.left.px]="menuPosition().left"
width: 420px
height: 500px
```
**Changements**:
- ✅ Taille réduite (420×500 vs 680×600)
- ✅ Position dynamique basée sur bloc actif
- ✅ Design compact (spacing réduit)
- ✅ Headers sticky optimisés
## 📝 Checklist de migration pour autres blocs
Pour migrer un autre type de bloc (heading, list, table, etc.):
### ✅ Étape 1: Imports
```typescript
import { signal } from '@angular/core';
import { BlockInlineToolbarComponent } from '../block-inline-toolbar.component';
import { PaletteService } from '../../../services/palette.service';
@Component({
imports: [..., BlockInlineToolbarComponent],
})
```
### ✅ Étape 2: Ajouter les signals
```typescript
export class YourBlockComponent {
isFocused = signal(false);
isHovered = signal(false);
private paletteService = inject(PaletteService);
}
```
### ✅ Étape 3: Wrapper le template
```html
```
### ✅ Étape 4: Gérer focus/blur
```html
```
### ✅ Étape 5: Implémenter onToolbarAction
```typescript
onToolbarAction(action: string): void {
if (action === 'more' || action === 'menu') {
this.paletteService.open();
} else {
// Logique spécifique au bloc
this.handleQuickAction(action);
}
}
```
## 🎯 Nouveaux comportements
### Détection du "/"
```typescript
onKeyDown(event: KeyboardEvent): void {
if (event.key === '/') {
const text = (event.target as HTMLElement).textContent || '';
if (text.length === 0 || text.endsWith(' ')) {
event.preventDefault();
this.paletteService.open(); // Ouvre le menu
}
}
}
```
### États visuels
| État | Drag handle | Icônes | Background |
|------|-------------|--------|------------|
| Défaut | Caché | Cachées | Transparent |
| Hover | Visible | Semi-visibles | `bg-neutral-800/30` |
| Focus | Visible | Visibles | Transparent |
## 🐛 Points d'attention
### 1. Z-index et layering
- Drag handle: `absolute -left-8` (en dehors du flux)
- Menu: `z-[9999]` (au dessus de tout)
- Sticky headers: `z-10` (dans le menu)
### 2. Responsive
Le drag handle peut déborder sur mobile. Considérer:
```css
@media (max-width: 640px) {
.drag-handle {
position: relative;
left: 0;
}
}
```
### 3. Performance
Les signals sont efficients, mais éviter:
```typescript
// ❌ MAUVAIS - Recalcul à chaque render
[isFocused]="someComplexComputation()"
// ✅ BON - Signal mis à jour explicitement
[isFocused]="isFocused"
```
## 📊 Comparaison des fichiers
| Fichier | Avant | Après | Statut |
|---------|-------|-------|--------|
| `editor-toolbar.component.ts` | Toolbar globale | N/A | ⚠️ Peut être supprimé |
| `block-inline-toolbar.component.ts` | N/A | Toolbar par bloc | ✅ Nouveau |
| `paragraph-block.component.ts` | Simple contenteditable | Wrapper + toolbar | ✅ Migré |
| `block-menu.component.ts` | Position fixe centrée | Position contextuelle | ✅ Optimisé |
| `editor-shell.component.ts` | Contient toolbar | Seulement blocks | ✅ Simplifié |
## 🔮 Prochaines étapes
1. **Migrer les autres blocs** (heading, list, table, etc.)
2. **Implémenter le drag & drop** via le drag handle
3. **Menu bloc contextuel** (clic sur ⋮⋮)
4. **Toolbar flottante** pour formatage texte (Bold, Italic, etc.)
5. **Tests E2E** pour valider les interactions
---
**Note**: L'ancien `EditorToolbarComponent` peut être conservé temporairement pour référence, mais n'est plus utilisé dans le shell.