diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..47b3190 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,7 @@ +{ + "permissions": { + "allow": [ + "Bash(npm run:*)" + ] + } +} diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..6e659a9 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,64 @@ +# 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 (`