Skip to content

Commit d2fcba3

Browse files
authored
Merge pull request #1134 from dnum-mi/docs/powered-by-vue-dsfr
docs/powered by vue dsfr
2 parents 3e1dff5 + bbf97b3 commit d2fcba3

File tree

122 files changed

+1820
-273
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

122 files changed

+1820
-273
lines changed

.github/copilot-instructions.md

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
# Instructions de codage IA pour VueDsfr
2+
3+
## Vue d'ensemble du projet
4+
VueDsfr est une bibliothèque de composants Vue 3 qui porte le Système de Design Français (DSFR) vers Vue.js. Elle fournit ~50 composants accessibles et prêts pour la production suivant les normes de design du gouvernement français.
5+
6+
## Architecture et structure des fichiers
7+
8+
### Organisation des composants
9+
- **Emplacement** : `src/components/Dsfr*/`
10+
- **Fichiers par composant** :
11+
- `DsfrComponent.vue` - Composant principal
12+
- `DsfrComponent.types.ts` - Interfaces TypeScript
13+
- `DsfrComponent.spec.ts` - Tests unitaires (Vitest)
14+
- `DsfrComponent.stories.ts` - Stories Storybook
15+
- `DsfrComponent.md` - Documentation du composant
16+
- `docs-demo/` - Composants de démonstration pour la docs
17+
18+
### Répertoires clés
19+
- `src/components/` - Tous les composants DSFR (exportés via `index.ts`)
20+
- `src/composables/` - Composables Vue partagés (useScheme, useTabs, useCollapsable)
21+
- `src/utils/` - Fonctions utilitaires
22+
- `meta/` - Outils de build (auto-import, résolveur de composants)
23+
- `demo-app/` - Application de développement/démonstration
24+
- `docs/` - Documentation VitePress
25+
- `tests/unit/` - Utilitaires et configuration des tests
26+
27+
## Workflow de développement
28+
29+
### Commandes de build et exécution
30+
```bash
31+
pnpm install # Installer les dépendances (utiliser pnpm, pas npm/yarn)
32+
pnpm dev # Démarrer le serveur de développement Storybook (:6006)
33+
pnpm demo # Démarrer l'app de démonstration (:5173)
34+
pnpm docs:dev # Démarrer la documentation VitePress (:4173)
35+
pnpm build # Builder la bibliothèque vers dist/
36+
pnpm test # Exécuter les tests unitaires Vitest
37+
pnpm coverage # Exécuter les tests avec couverture
38+
pnpm lint # Exécuter ESLint
39+
pnpm format # Corriger automatiquement ESLint
40+
```
41+
42+
### Pattern de création de composant
43+
1. Créer le répertoire `src/components/DsfrNewComponent/`
44+
2. Ajouter les fichiers : `DsfrNewComponent.vue`, `.types.ts`, `.spec.ts`, `.stories.ts`, `.md`
45+
3. Exporter depuis `src/components/index.ts` (types et composant)
46+
4. Ajouter à `src/index.ts` s'il s'agit d'une nouvelle exportation racine
47+
5. Exécuter `pnpm check-exports` pour vérifier les exportations
48+
49+
### Patterns TypeScript
50+
- **Interface props** : `DsfrComponentProps` dans `.types.ts`
51+
- **Ref composant** : Utiliser `InstanceType<typeof Component>['$props']` pour les types complexes
52+
- **Clés d'injection** : Définir dans `injection-key.ts` pour la communication entre composants
53+
- **Types composables** : Exporter l'implémentation et les interfaces de types de retour
54+
55+
### Patterns de test
56+
- **Fichier de test** : `*.spec.ts` colocalisé avec le composant
57+
- **Configuration** : `tests/unit/vitest-setup.ts` configure Vue Test Utils + jsdom
58+
- **Mocking** : Utiliser `vi.mock()` pour les dépendances externes
59+
- **Test de composant** : Monter avec `mount(Component, { props })`
60+
61+
### Intégration du style et DSFR
62+
- **Imports CSS** : Les composants importent depuis les modules CSS `@gouvfr/dsfr`
63+
- **Support du thème** : Utiliser le composable `useScheme` pour les modes clair/sombre
64+
- **Accessibilité** : Tous les composants suivent les standards d'accessibilité DSFR
65+
- **Icônes** : Utiliser le composant `VIcon` avec @iconify/vue
66+
67+
### Qualité du code et commits
68+
- **Commits** : Suivre les commits conventionnels (`feat:`, `fix:`, `docs:`, etc.)
69+
- **Linting** : @antfu/eslint-config avec règles spécifiques à Vue
70+
- **Pre-commit** : Husky exécute lint-staged sur `*.{vue,ts}`
71+
- **CI** : GitHub Actions exécute les tests, le linting et la vérification de build
72+
73+
### Points d'intégration clés
74+
- **Installation plugin** : `app.use(VueDsfr)` enregistre tous les composants mais cette utilisation est obsolète
75+
- **Auto-import** : Utiliser `meta/component-resolver.js` avec `unplugin-vue-components`
76+
- **Collections d'icônes** : Le binaire `vue-dsfr-icons` génère des collections d'icônes personnalisées
77+
- **Initialisation DSFR** : Importer `src/init-dsfr.ts` pour configurer `window.dsfr`
78+
79+
### Patterns courants
80+
- **Communication composants** : Utiliser `provide`/`inject` avec des clés d'injection
81+
- **Gestion événements** : Émettre des événements personnalisés en kebab-case
82+
- **Nommage slots** : Utiliser des noms de slots descriptifs (ex: `header`, `content`, `footer`)
83+
- **Classes CSS** : Suivre les conventions BEM-like DSFR
84+
- **Gestion erreurs** : Lever des erreurs descriptives pour les combinaisons de props invalides
85+
86+
### Documentation
87+
- **Docs composants** : Écrire en français (standard DSFR), inclure des exemples d'usage
88+
- **Stories** : Utiliser le format Storybook CSF3 avec `args`/`argTypes`
89+
- **VitePress** : Site de documentation dans `docs/` avec références de composants
90+
91+
## 🎯 Conventions Git & Commits
92+
93+
### Format des commits
94+
Utilise **TOUJOURS** le format : `type(scope): gitmoji description`
95+
96+
**Exemple** : `feat(auth): ✨ add user authentication system`
97+
98+
### Types de commits conventionnels
99+
- `feat`: ✨ Nouvelles fonctionnalités
100+
- `fix`: 🐛 Corrections de bugs
101+
- `docs`: 📚 Documentation
102+
- `style`: 💄 Formatage, style (pas de changement de logique)
103+
- `refactor`: ♻️ Refactoring (ni feat ni fix)
104+
- `perf`: ⚡ Améliorations de performance
105+
- `test`: ✅ Ajout/modification de tests
106+
- `chore`: 🔧 Maintenance, configuration, dépendances
107+
- `ci`: 👷 CI/CD, GitHub Actions
108+
- `revert`: ⏪ Annulation de commit
109+
110+
### Gitmojis recommandés
111+
-`:sparkles:` - Nouvelle fonctionnalité
112+
- 🐛 `:bug:` - Correction de bug
113+
- 📝 `:memo:` - Documentation
114+
- 💄 `:lipstick:` - UI/UX, styles
115+
- ♻️ `:recycle:` - Refactoring
116+
-`:zap:` - Performance
117+
-`:white_check_mark:` - Tests
118+
- 🔧 `:wrench:` - Configuration
119+
- 🚀 `:rocket:` - Déploiement
120+
- 🎨 `:art:` - Structure/format du code
121+
- 🔒 `:lock:` - Sécurité
122+
- 🌐 `:globe_with_meridians:` - Internationalisation
123+
- 💾 `:floppy_disk:` - Base de données
124+
- 🔄 `:arrows_counterclockwise:` - Réactivité, WebSockets
125+
126+
### Structure des messages de commit
127+
```
128+
type(scope): gitmoji description courte
129+
130+
## Pourquoi les changements ont été faits :
131+
- Explication du contexte et des raisons
132+
- Problème résolu ou besoin adressé
133+
134+
## Quelles modifications ont été apportées :
135+
- Description détaillée des modifications
136+
- Impact sur l'architecture/fonctionnalités
137+
```
138+
139+
Pas de majuscule au début de la description courte.
140+
Utilise la troisième personne du singulier au présent de l'indicatif pour la description courte.
141+
142+
## 🛠️ Conventions Techniques
143+
144+
### Vue.js & Composition API
145+
- **TOUJOURS** utiliser `<script setup lang="ts">`
146+
- Préférer les `ref()` et `computed()` aux options API
147+
- **Props & Emits** : Utiliser TOUJOURS la définition par types TypeScript
148+
- **Props booléennes** : Ne pas utiliser `withDefaults` si la valeur par défaut est `false`
149+
- Exposer les références nécessaires avec `defineExpose()`
150+
151+
#### ✅ Props & Emits - Bonnes pratiques
152+
153+
```vue
154+
<!-- ✅ Correct - Types TypeScript -->
155+
<script setup lang="ts">
156+
// Props simples
157+
const props = defineProps<{
158+
show?: boolean // false par défaut, pas besoin de withDefaults
159+
title?: string // undefined par défaut
160+
count?: number // undefined par défaut
161+
}>()
162+
163+
// Emits avec types
164+
const emit = defineEmits<{
165+
'update:modelValue': [value: string]
166+
close: []
167+
submit: [data: FormData]
168+
}>()
169+
```
170+
171+
```vue
172+
// Props avec defaults personnalisés
173+
const props = withDefaults(defineProps<{
174+
size?: 'sm' | 'md' | 'lg'
175+
disabled?: boolean
176+
}>(), {
177+
size: 'md', // Valeur par défaut custom
178+
// disabled: false // Pas besoin, false par défaut
179+
})
180+
181+
</script>
182+
183+
<!-- ❌ Éviter - Syntaxe objet -->
184+
<script setup>
185+
const props = defineProps({
186+
show: { type: Boolean, default: false }, // Verbeux
187+
title: { type: String },
188+
})
189+
const emit = defineEmits(['update:show', 'close']) // Pas de typage
190+
</script>
191+
```
192+
193+
### Structure des composables
194+
```typescript
195+
export function useFeatureName () {
196+
const data = ref()
197+
const isLoading = ref(false)
198+
const error = ref()
199+
200+
async function fetchData () {
201+
// logique
202+
}
203+
204+
return {
205+
data: readonly(data),
206+
isLoading: readonly(isLoading),
207+
error: readonly(error),
208+
fetchData,
209+
}
210+
}
211+
```
212+
213+
### Linting et formatage
214+
- Respecter TOUTES les règles ESLint configurées
215+
- Pas de `console.*`
216+
- Préférer les imports nommés aux imports par défaut
217+
- Ordre alphabétique des imports
218+
219+
### TypeScript
220+
- Types explicites pour toutes les props/interfaces
221+
- Éviter `any`, utiliser `unknown` si nécessaire
222+
- Utiliser les types génériques pour la réutilisabilité
223+
- Interfaces plutôt que types pour les objets
224+
225+
### Tâches
226+
227+
Pour les tâches que je vais te demander, voir `.github/copilot-tasks.instructions.md`.

0 commit comments

Comments
 (0)