Skip to content

Commit df8a6e8

Browse files
authored
Merge pull request #677 from dnum-mi/develop
Develop
2 parents b6b1755 + 94f1e80 commit df8a6e8

File tree

7 files changed

+263
-22
lines changed

7 files changed

+263
-22
lines changed

docs/pour-commencer.md

Lines changed: 220 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@
33
Ceci est le guide d̛’utilisation de la bibliothèque. Si vous cherchez à contribuer, se référer au
44
[Guide du développeur](/guide-developpeur).
55

6+
::: info Prérequis
7+
8+
Pour utiliser cette bibliothèque, il vous faudra **[Vue 3](https://v3.vuejs.org/)** (et **[Vue-Router 4](https://next.router.vuejs.org/)**). Par conséquent, si vous utilisez Nuxt, il vous faut **[Nuxt 3](https://v3.nuxtjs.org/)** (plus de détails plus loin).
9+
10+
:::
11+
612
## Utiliser create-vue-dsfr (fortement recommandé)
713

8-
La façon la plus simple de commencer un projet est d’utiliser le package `create-vue-dsfr`, qui permet de créer un projet NPM avec tout le nécessaire pour développer un projet utilisant VueDsfr, que ce soit pour Vite (Vue3) ou pour Nuxt (Nuxt3), avec ou sans TypeScript.
14+
La façon la plus simple de commencer un projet est d’utiliser le package `create-vue-dsfr`, qui permet de créer un projet NPM avec le nécessaire et suffisant (ou plus, selon votre choix) pour développer un projet utilisant VueDsfr, que ce soit pour Vite (Vue3) ou pour Nuxt (Nuxt3), avec TypeScript et ESLint.
915

1016
Avec npm :
1117

@@ -31,10 +37,6 @@ Et suivez les indications de l’assistant.
3137

3238
### Utiliser la bibliothèque en tant que plugin
3339

34-
| Notes : |
35-
|:---------------------------|
36-
| Pour utiliser cette bibliothèque, il vous faudra **[Vue 3](https://v3.vuejs.org/)** (et **[Vue-Router 4](https://next.router.vuejs.org/)**). Par conséquent, si vous utilisez Nuxt, il vous faut **[Nuxt 3](https://v3.nuxtjs.org/)** (plus de détails plus loin). |
37-
3840
#### Installer la bibliothèque en tant que dépendance du projet
3941

4042
Afin d'installer la bibliothèque, taper ces commandes dans votre console au sein du répertoire du projet :
@@ -43,17 +45,30 @@ Afin d'installer la bibliothèque, taper ces commandes dans votre console au sei
4345
npm install @gouvfr/dsfr @gouvminint/vue-dsfr
4446
```
4547

46-
::: info
48+
::: info Pourquoi `@gouvfr/dsfr` ?
4749

4850
`@gouvminint/vue-dsfr` utilise le CSS de `@gouvfr/dsfr`, c’est pourquoi il faut l’installer aussi.
4951

5052
:::
5153

5254
#### Ajouter le plugin
5355

54-
##### Dans une application Vite (recommandé) ou Vue-CLI
56+
Ajouter la bibliothèque en tant que plugin a deux conséquences :
57+
58+
| pros | cons |
59+
| ---- | ---- |
60+
| Pas besoin d’enregistrer les composants qu’on utilise : le plugin les enregistre tous pour nous | Le bundle final sera plus lourd |
61+
62+
::: info Le meilleur des deux mondes
5563

56-
À partir d'un fichier `main.js` simple comme celui-ci :
64+
On peut avoir le meilleur des deux mondes (la tranquilité de ne pas avoir à importer les composants et un bundle final qui ne contient que les composants réellement utilisés) avec l’auto-import et le component resolver livrés avec la version [5.5.0 de VueDsfr](https://github.com/dnum-mi/vue-dsfr/releases/tag/v5.5.0).
65+
C’est le défaut depuis la version [1.7.0](https://github.com/laruiss/create-vue-dsfr) de l’assistant officiel [create-vue-dsfr](https://github.com/laruiss/create-vue-dsfr).
66+
67+
:::
68+
69+
##### Dans une application Vite
70+
71+
À partir d'un fichier `main.ts` simple comme celui-ci :
5772

5873
```js
5974
import { createApp } from 'vue'
@@ -113,12 +128,11 @@ Vous pouvez voir une implémentation **[sur Codesandbox ici](https://codesandbox
113128

114129
## Utiliser la bibliothèque de composants sans plugin
115130

116-
Pour les petits projets, il est possible de ne pas importer tous les composants, et de sélectionner
117-
les composants utilisés :
131+
Il est possible de ne pas importer tous les composants, et de sélectionner les composants utilisés :
118132

119133
```js{2,16}=
120134
import { createApp } from 'vue'
121-
import { OhVueIcon } from 'oh-vue-icons' // Import du composant OhVueIcon du pkg oh-vue-icons
135+
import { OhVueIcon } from 'oh-vue-icons' // Import du composant OhVueIcon du pkg oh-vue-icons (facultatif)
122136
123137
import App from './App.vue'
124138
import {
@@ -132,7 +146,7 @@ import '@gouvfr/dsfr/dist/dsfr.min.css' // Import des styles du DSFR
132146
import '@gouvminint/vue-dsfr/styles' // Import des styles propres à la bibliothèque VueDSFR
133147
134148
const app = createApp(App)
135-
.component('VIcon', OhVueIcon) // Enregistrement global du composant OhVueIcon
149+
.component('VIcon', OhVueIcon) // Enregistrement global du composant OhVueIcon (facultatif)
136150
.component('DsfrHeader', DsfrHeader) // Enregistrement global du composant DsfrHeader
137151
.component('DsfrButton', DsfrButton) // Enregistrement global du composant DsfrButton
138152
.component('DsfrBreadcrumb', DsfrBreadcrumb) // Enregistrement global du composant DsfrBreadcrumb
@@ -141,16 +155,16 @@ const app = createApp(App)
141155
```
142156

143157
:::info
144-
N.B. : il faut bien en plus enregistrer globalement le composant **VIcon** car il est utilisé en interne dans VueDsfr.
158+
Il faut enregistrer globalement le composant **VIcon** si vous voulez l’utiliser.
145159
:::
146160

147161
## Utiliser les icônes
148162

149163
Cf. [la page dédiée](./icones.md)
150164

151-
## Avoir un bundle minimal
165+
## Avoir un bundle optimisé (et une DX optimale)
152166

153-
Il est possible d’intégrer moins de CSS pour les petits projets.
167+
Il est possible d’intégrer moins de CSS, voici quelques notes à ce propos (voir les commentaires dans le code).
154168

155169
### Vue3
156170

@@ -166,6 +180,197 @@ import '@gouvfr/dsfr/dist/scheme/scheme.min.css' // Facultatif : Si
166180
import '@gouvfr/dsfr/dist/utility/icons/icons.min.css' // Facultatif : Si des icônes sont utilisées avec les classes "fr-icon-..."
167181
```
168182
183+
### Les imports automatiques des composables et des composants
184+
185+
La version [5.5.0 de VueDsfr](https://github.com/dnum-mi/vue-dsfr/releases/tag/v5.5.0) intègre 3 nouveaux exports pour pouvoir importer automatiquement les composables et autres fonctions et les composants (grâce au plugin vite [unplugin-auto-import](https://github.com/unplugin/unplugin-auto-import)).
186+
187+
#### Les imports automatiques des composables et fonctions
188+
189+
Il y a deux presets livrés avec VueDsfr (**depuis la v5.5.0 seulement**) à utiliser avec le plugin unplugin-auto-import :
190+
191+
Installer les dépendances de développement :
192+
193+
```shell
194+
npm i -D unplugin-auto-import unplugin-vue-components
195+
```
196+
197+
Ajouter ces lignes dans `vite.config.ts` :
198+
199+
```typescript{6-8,18-46}
200+
import { fileURLToPath, URL } from 'node:url'
201+
202+
import { defineConfig } from 'vite'
203+
import vue from '@vitejs/plugin-vue'
204+
import vueJsx from '@vitejs/plugin-vue-jsx'
205+
import AutoImport from 'unplugin-auto-import/vite'
206+
import Components from 'unplugin-vue-components/vite'
207+
import { vueDsfrAutoimportPreset, ohVueIconAutoimportPreset, vueDsfrComponentResolver } from '@gouvminint/vue-dsfr'
208+
209+
const isCypress = process.env.CYPRESS === 'true'
210+
211+
// https://vitejs.dev/config/
212+
export default defineConfig({
213+
base: process.env.BASE_URL || '/',
214+
plugins: [
215+
vue(),
216+
vueJsx(),
217+
AutoImport({
218+
include: [
219+
/\.[tj]sx?$/,
220+
/\.vue$/, /\.vue\?vue/,
221+
],
222+
imports: [
223+
'vue',
224+
'vue-router',
225+
...(isCypress ? [] : ['vitest']),
226+
vueDsfrAutoimportPreset, // Autoimport des composables de VueDsfr
227+
ohVueIconAutoimportPreset, // Autoimport des fonctions de OhVueIcon (addIcons et OhVueIcon)
228+
],
229+
vueTemplate: true,
230+
dts: './src/auto-imports.d.ts',
231+
eslintrc: {
232+
enabled: true,
233+
filepath: './.eslintrc-auto-import.json',
234+
globalsPropValue: true,
235+
},
236+
}),
237+
Components({
238+
extensions: ['vue'],
239+
dirs: ['src/components'], // Autoimport de vos composants qui sont dans le dossier `src/components`
240+
include: [/\.vue$/, /\.vue\?vue/],
241+
dts: './src/components.d.ts',
242+
resolvers: [
243+
vueDsfrComponentResolver, // Autoimport des composants de VueDsfr dans les templates
244+
],
245+
}),
246+
],
247+
resolve: {
248+
alias: {
249+
'@': fileURLToPath(new URL('./src', import.meta.url)),
250+
},
251+
},
252+
})
253+
254+
```
255+
256+
##### Avec les auto-imports
257+
258+
`main.ts`
259+
260+
```typescript
261+
import '@gouvfr/dsfr/dist/dsfr.min.css'
262+
import '@gouvfr/dsfr/dist/utility/icons/icons.min.css'
263+
264+
import '@gouvminint/vue-dsfr/styles'
265+
266+
import App from './App.vue'
267+
import router from './router/index'
268+
import * as icons from './icons'
269+
270+
import './main.css'
271+
272+
addIcons(...Object.values(icons)) // addIcons est autoimporté grâce à ohVueIconAutoimportPreset dans vite.config.ts // [!code warning]
273+
274+
createApp(App) // createApp est autoimporté grâce au preset 'vue' dans vite.config.ts // [!code warning]
275+
.component('VIcon', OhVueIcon) // OhVueIcon est autoimporté grâce à ohVueIconAutoimportPreset dans vite.config.ts // [!code warning]
276+
.use(router)
277+
.mount('#app')
278+
```
279+
280+
`App.vue`
281+
282+
```vue
283+
<script setup lang="ts">
284+
useScheme() // Autoimporté grâce à vueDsfrAutoimportPreset dans vite.config.ts // [!code warning]
285+
286+
const serviceTitle = 'Service'
287+
const serviceDescription = 'Description du service'
288+
const logoText = ['Ministère', 'de l’intérieur']
289+
290+
const quickLinks = [
291+
// (...)
292+
]
293+
const searchQuery = ref('')
294+
</script>
295+
296+
<template>
297+
<!-- DsfrHeader est autoimporté grâce à vueDsfrComponentResolver dans vite.config.ts --> // [!code warning]
298+
<DsfrHeader
299+
v-model="searchQuery"
300+
:service-title="serviceTitle"
301+
:service-description="serviceDescription"
302+
:logo-text="logoText"
303+
:quick-links="quickLinks"
304+
show-search
305+
/>
306+
307+
<div class="fr-container fr-mt-3w fr-mt-md-5w fr-mb-5w">
308+
<router-view />
309+
</div>
310+
</template>
311+
```
312+
313+
##### Sans les auto-imports
314+
315+
`main.ts`
316+
317+
```typescript{6-7}
318+
import '@gouvfr/dsfr/dist/dsfr.min.css'
319+
import '@gouvfr/dsfr/dist/utility/icons/icons.min.css'
320+
321+
import '@gouvminint/vue-dsfr/styles'
322+
323+
import { createApp } from 'vue'
324+
import { OhVueIcon, addIcons } from 'oh-vue-icon'
325+
326+
import App from './App.vue'
327+
import router from './router/index'
328+
import * as icons from './icons'
329+
330+
import './main.css'
331+
332+
addIcons(...Object.values(icons))
333+
334+
createApp(App)
335+
.component('VIcon', OhVueIcon)
336+
.use(router)
337+
.mount('#app')
338+
```
339+
340+
`App.vue`
341+
342+
```vue{2}
343+
<script setup lang="ts">
344+
import { DsfrHeader, useScheme } from '@gouvminint/vue-dsfr'
345+
346+
useScheme()
347+
348+
const serviceTitle = 'Service'
349+
const serviceDescription = 'Description du service'
350+
const logoText = ['Ministère', 'de l’intérieur']
351+
352+
const quickLinks = [
353+
// (...)
354+
]
355+
const searchQuery = ref('')
356+
</script>
357+
358+
<template>
359+
<DsfrHeader
360+
v-model="searchQuery"
361+
:service-title="serviceTitle"
362+
:service-description="serviceDescription"
363+
:logo-text="logoText"
364+
:quick-links="quickLinks"
365+
show-search
366+
/>
367+
368+
<div class="fr-container fr-mt-3w fr-mt-md-5w fr-mb-5w">
369+
<router-view />
370+
</div>
371+
</template>
372+
```
373+
169374
### Nuxt3
170375

171376
Dans `nuxt.config.js` :

src/composables/useTabs.stories.mdx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,22 @@ Ce composable permet de gérer simplement les props de [DsfrTabs](/docs/composan
1414
ref="tabs"
1515
:tab-list-name="tabListName"
1616
:tab-titles="tabTitles"
17-
:initial-selected-index="selectedTabIndex"
18-
@select-tab="selectTab"
17+
:initial-selected-index="selected"
18+
@select-tab="select"
1919
>
2020
<DsfrTabContent
2121
panel-id="tab-content-0"
2222
tab-id="tab-0"
23-
:selected="selectedTabIndex === 0"
24-
:asc="asc"
23+
:selected="selected === 0"
24+
:asc="ascendant"
2525
>
2626
<div>Contenu 1 avec d'autres composants</div>
2727
</DsfrTabContent>
2828
<DsfrTabContent
2929
panel-id="tab-content-1"
3030
tab-id="tab-1"
31-
:selected="selectedTabIndex === 1"
32-
:asc="asc"
31+
:selected="selected === 1"
32+
:asc="ascendant"
3333
>
3434
<div>Contenu 2 avec d'autres composants</div>
3535
</DsfrTabContent>
@@ -39,7 +39,7 @@ Ce composable permet de gérer simplement les props de [DsfrTabs](/docs/composan
3939
<script setup lang="ts">
4040
import { useTabs, DsfrTabs } from '@gouvminint/vue-dsfr'
4141
42-
const { asc, selectedTabIndex, selectTab } = useTabs(true,0)
42+
const { ascendant, selected, select } = useTabs(true,0)
4343
4444
const tabListName = "Onglets"
4545

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,6 @@ export default {
2626
export * from './components/index.js'
2727
export * from './utils/random-utils'
2828
export * from './composables/index'
29+
export * from './meta/index'
2930
export * from './common-types.js'
3031
export * as icons from './icons.js'

src/meta/autoimport-preset.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// Autoimport preset for unplugin-auto-import plugin for Vite or Nuxt for VueDsfr composables
2+
export const vueDsfrAutoimportPreset = {
3+
from: '@gouvminint/vue-dsfr',
4+
imports: [
5+
'useScheme',
6+
'useTabs',
7+
],
8+
} as const

src/meta/component-resolver.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Component resolver for the unplugin-vue-components plugin for VueDsfr components
2+
export const vueDsfrComponentResolver = (componentName: string): { name: string, from: string } | undefined => {
3+
if (componentName === 'VIcon' || componentName === 'OhVueIcon') {
4+
return {
5+
name: 'OhVueIcon',
6+
from: 'oh-vue-icons',
7+
}
8+
}
9+
10+
if (componentName.startsWith('Dsfr')) {
11+
return {
12+
name: componentName,
13+
from: '@gouvminint/vue-dsfr',
14+
}
15+
}
16+
}

src/meta/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from './autoimport-preset'
2+
export * from './ovi-autoimport-preset'
3+
export * from './component-resolver'

src/meta/ovi-autoimport-preset.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// Autoimport preset for unplugin-auto-import plugin for Vite or Nuxt for VueDsfr composables
2+
export const ohVueIconAutoimportPreset = {
3+
from: 'oh-vue-icons',
4+
imports: [
5+
'addIcons',
6+
'OhVueIcon',
7+
],
8+
} as const

0 commit comments

Comments
 (0)