# SPEC: Widget "Derniers fichiers ouverts" sur la page principale ## 1. Objectif Remplacer le message d'accueil actuel (`#welcome`) par un widget dashboard professionnel affichant les **XX derniers fichiers ouverts**. Le nombre de fichiers affichés sera configurable via les paramètres existants (`cfg-recent-limit`). ## 2. Architecture du composant ```mermaid graph TD A["#content-area"] --> B["#dashboard-home"] B --> C["En-tête: Logo + Titre"] B --> D["Sélecteur vault filter"] B --> E["#dashboard-recent-grid"] B --> F["#dashboard-recent-empty"] E --> G["Carte 1: fichier récent"] E --> H["Carte 2: fichier récent"] E --> I["..."] G --> G1["Icône fichier"] G --> G2["Titre"] G --> G3["Chemin breadcrumb"] G --> G4["Tags"] G --> G5["Horodatage"] ``` ## 3. Design UI/UX ### 3.1 Structure HTML (dans `#content-area`) ```html

Derniers fichiers ouverts

``` ### 3.2 Layout Grid - **Desktop (>1024px)**: Grid 3 colonnes - **Tablet (768-1024px)**: Grid 2 colonnes - **Mobile (<768px)**: Grid 1 colonne ### 3.3 Style des cartes (`.dashboard-card`) | Élément | Style | |---------|-------| | Container | `border-radius: 12px`, `padding: 16px`, fond `var(--bg-secondary)` | | Hover | Légère élévation avec `box-shadow`, bordure accent | | Icône | 32x32px, couleur accent | | Titre | `font-weight: 600`, `font-size: 14px`, truncation avec ellipsis | | Chemin | `font-size: 11px`, `color: var(--text-muted)` | | Tags | Pills compacts, même style que sidebar | | Horodatage | Badge discret avec icône clock | | Badge vault | Position absolute en haut-droit | ### 3.4 États | État | Description | |------|-------------| | **Chargement** | Skeleton cards animées (pulse) | | **Données** | Grid de cartes | | **Vide** | Icône + message centré | | **Erreur** | Toast notification | ## 4. Interactions | Action | Comportement | |--------|--------------| | **Clic sur carte** | Ouvre le fichier (`openFile(vault, path)`) | | **Changement filter vault** | Recharge les données avec filtre | | **Hover carte** | Élévation visuelle, curseur pointer | | **Fermeture fichier** | Affiche le dashboard (si plus de fichier ouvert) | ## 5. Intégration JavaScript ### 5.1 Nouveau module `DashboardRecentWidget` ```javascript const DashboardRecentWidget = { async load(vaultFilter) { /* Charge via /api/recent */ }, render(files) { /* Génère le HTML des cartes */ }, showEmpty() { /* Affiche état vide */ }, showLoading() { /* Affiche skeletons */ }, init() { /* Bind events, charge initial */ } }; ``` ### 5.2 Points d'intégration - **Au démarrage**: `DashboardRecentWidget.init()` dans `DOMContentLoaded` - **Ouverture fichier**: Dashboard masqué automatiquement - **Fermeture fichier**: Dashboard affiché si `activeEditor === null` - **Filtre vault**: Recharge via `loadRecentFiles` de la sidebar (partage du cache) ### 5.3 Partage avec sidebar "Recent" Le widget réutilisera `_recentFilesCache` et `renderRecentList` mais avec un **template de carte différent** pour le dashboard. ## 6. Fichiers à modifier | Fichier | Modification | |---------|--------------| | `frontend/index.html` | Remplacer `#welcome` par `#dashboard-home` | | `frontend/style.css` | Ajouter `.dashboard-home`, `.dashboard-card`, skeleton, animations | | `frontend/app.js` | Ajouter `DashboardRecentWidget`, modifier `showWelcome()`, intégration hooks | ## 7. Paramètres configurables | Paramètre | Source | Description | |-----------|--------|-------------| | `recent_files_limit` | Backend config | Nombre max de fichiers (5-100, défaut: 20) | ## 8. Accessibilité - Rôles ARIA appropriés (`role="region"`, `aria-label`) - Navigation clavier fonctionnelle - Contraste des couleurs conforme WCAG 2.1 AA - Support screen reader pour les états vides/chargement ## 9. Responsive breakpoints ```css .dashboard-recent-grid { display: grid; gap: 16px; /* Mobile first */ grid-template-columns: 1fr; } @media (min-width: 768px) { grid-template-columns: repeat(2, 1fr); } @media (min-width: 1024px) { grid-template-columns: repeat(3, 1fr); } ``` ## 10. Animations | Événement | Animation | |-----------|-----------| | Entrée cartes | Fade-in + slide-up staggeré (50ms entre cartes) | | Hover carte | Scale 1.02 + shadow | | Skeleton loading | Pulse animation | | Transition vault filter | Fade out/in des cartes |