1. Delete: ev.target pouvait être un noeud texte (emoji 🗑)
→ Text.closest() n'existe pas → handleTreeAction échouait.
Fix: fallback sur ev.target.parentElement.closest().
2. Preview PDF: ajout lien 'Open viewer →' vers /pages/{id}
(le viewer standalone rend le PDF dans une iframe).
3. Icônes distinctes:
- Pages FlowDeck (content_format='blocks'/'markdown') → 📝
- Fichiers uploadés → icône basée sur l'extension
- _fileIcon() accepte contentFormat, propage depuis l'API tree
- Appliqué dans sidebar (board.py) + page workspace (x-for + renderChildren)