--- name: ui-style description: Design system et harmonisation UI de Mangarr — layout de page canonique (Toolbar + flex + sections border-t), palette Tailwind, patterns composants (boutons, badges, upload, progression). Utiliser quand on crée ou modifie une page Vue ou un composant UI. allowed-tools: Read, Grep, Glob --- # Design system Mangarr — Guide UI Les pages de référence canoniques sont : - `assets/vue/app/domain/manga/infrastructure/presentation/pages/NewImportPage.vue` - `assets/vue/app/domain/conversion/infrastructure/presentation/pages/ConversionPage.vue` En cas de doute, les lire pour vérifier le pattern en vigueur. --- ## 1. Layout de page canonique ```vue ``` **Règles absolues :** - `flex flex-col h-full` toujours à la racine du template - `` toujours en premier enfant direct de la racine - `overflow-y-auto flex-1` pour le contenu scrollable - `px-6 py-8` comme wrapper interne — **jamais** `container mx-auto` - Chaque bloc logique = une `
` avec `border-t border-gray-200 dark:border-gray-700` - **Jamais** de `

` volant dans le contenu — le titre de page va dans `toolbarConfig.leftSection` --- ## 2. Configuration Toolbar ```javascript import { computed } from 'vue'; import { SomeIcon } from '@heroicons/vue/24/outline'; const toolbarConfig = computed(() => ({ leftSection: [ { type: 'label', text: 'Titre de la page', class: 'text-sm font-medium' }, ], rightSection: [ { type: 'button', icon: SomeIcon, label: 'Action principale', onClick: handler, disabled: condition, }, // Bouton conditionnel : ...(showAction ? [{ type: 'button', icon: OtherIcon, label: 'Action contextuelle', onClick: otherHandler, }] : []), ], })); ``` - Icônes : Heroicons v24/outline (`@heroicons/vue/24/outline`) - Boutons toolbar visibles uniquement si pertinents — utiliser le spread conditionnel - `rightSection` peut être vide `[]` --- ## 3. Headers de section ```vue

Titre

Titre

info contextuelle
``` --- ## 4. Palette de couleurs | Usage | Classes Tailwind | |-------|-----------------| | Primaire (action principale) | `bg-green-600 hover:bg-green-700` | | Secondaire | `bg-blue-600 hover:bg-blue-700` | | Danger | `bg-red-600 hover:bg-red-700` | | Désactivé | `disabled:bg-gray-400 disabled:cursor-not-allowed` | | Texte principal | `text-gray-900 dark:text-gray-100` | | Texte secondaire | `text-gray-600 dark:text-gray-300` | | Texte subtil | `text-gray-500 dark:text-gray-400` | | Étiquette section | `text-gray-400 dark:text-gray-500` | | Fond carte / panel | `bg-white dark:bg-gray-800` | | Bordure | `border-gray-200 dark:border-gray-700` | | Séparateur de liste | `divide-y divide-gray-100 dark:divide-gray-700/50` | --- ## 5. Boutons ```vue ``` --- ## 6. Barre de progression ```vue
``` > **Important :** toujours `bg-green-600`, jamais `bg-blue-600` pour les barres de progression. --- ## 7. Liste avec séparateurs ```vue
``` --- ## 8. Zone de drop / upload de fichier ```vue

Message principal

Précision format/taille

``` --- ## 9. Pages non conformes à corriger Les pages suivantes dévient encore du pattern canonique : | Page | Chemin relatif | Déviations principales | |------|---------------|----------------------| | `HomePage.vue` | `domain/manga/.../pages/` | Pas de `px-6 py-8`, pas de sections `border-t` | | `AddManga.vue` | `domain/manga/.../pages/` | Pas de Toolbar, pas de `flex flex-col h-full` | | `ActivityPage.vue` | `domain/activity/.../pages/` | Pas de `flex flex-col`, pas de Toolbar intégré | | `UserPreferencesPage.vue` | `domain/setting/.../pages/` | `h1` volant, pas de Toolbar | | `ScrapperConfigurations.vue` | `domain/setting/.../pages/` | `h1` volant, `container mx-auto` | | `ScrapperEdit.vue` | `domain/setting/.../pages/` | `container mx-auto` au lieu de `px-6 py-8` | | `MangaDetails.vue` | `domain/manga/.../pages/` | Layout spécial (cover + chapitres), à traiter séparément | | `ChapterPage.vue` | `domain/reader/.../pages/` | Layout lecteur spécialisé — **exception justifiée**, ne pas modifier | --- ## 10. Checklist avant de livrer une page - [ ] Racine : `flex flex-col h-full` - [ ] Premier enfant : `` - [ ] Contenu scrollable : `overflow-y-auto flex-1` - [ ] Wrapper interne : `px-6 py-8` (jamais `container mx-auto`) - [ ] Blocs logiques : `
` - [ ] Titre de page dans `toolbarConfig.leftSection`, pas de `

` dans le contenu - [ ] Headers de section : classes `text-xs font-semibold text-gray-400 dark:text-gray-500 uppercase tracking-wider` - [ ] Barres de progression : `bg-green-600` (pas `bg-blue-600`) - [ ] Dark mode : chaque couleur a sa variante `dark:`