# CLAUDE.md — @malio/layer-ui ## Projet Bibliothèque de composants UI sous forme de **Nuxt 4 Layer**. Le package `@malio/layer-ui` est consommé par les autres applications Malio via `extends` dans leur `nuxt.config.ts`. ## Commandes ```bash npm run dev # Lance le playground (.playground/) npm run dev:prepare # Génère les types Nuxt (à lancer après un clone) npm run test # Vitest (run mode) npm run lint # ESLint npm run story:dev # Histoire (documentation composants) ``` ## Architecture ``` app/ components/malio/ # Composants (auto-importés comme ) story/ # Fichiers .story.vue (Histoire) assets/css/malio.css # Design tokens (CSS custom properties) .playground/ # App Nuxt pour tester les composants en dev ``` ## Conventions composants - **Nommage fichier** : PascalCase (`InputText.vue`). Le préfixe `Malio` est ajouté automatiquement par le dossier `malio/`. - **`defineOptions({ name: 'MalioXxx', inheritAttrs: false })`** en tête de chaque composant. - **Props communes** : `id`, `label`, `modelValue`, `inputClass`, `labelClass`, `groupClass`, `disabled`, `readonly`, `hint`, `error`, `success`. - **Pattern contrôlé/non-contrôlé** : `isControlled = computed(() => props.modelValue !== undefined)` avec `localValue` en fallback. - **Classes CSS** : fusionnées avec `twMerge()` pour permettre l'override par le consommateur via les props `*Class`. - **Accessibilité** : `aria-invalid`, `aria-describedby`, labels liés par `for/id`. - **Icônes** : via `@iconify/vue` (Icon component), pas `@nuxt/icon` dans les composants. ## Stack technique - **Nuxt 4** (layer), **Vue 3** Composition API (`