Skip to content

Commit c9024ae

Browse files
authored
Merge pull request #326 from dnum-mi/develop
RC11
2 parents d653ccb + b157c2e commit c9024ae

File tree

10 files changed

+8464
-4495
lines changed

10 files changed

+8464
-4495
lines changed

package-lock.json

Lines changed: 7731 additions & 4453 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -101,18 +101,17 @@
101101
"@rollup/plugin-node-resolve": "^13.1.3",
102102
"@rollup/plugin-replace": "^4.0.0",
103103
"@rollup/plugin-url": "^6.1.0",
104-
"@rushstack/eslint-patch": "^1.1.1",
105-
"@storybook/addon-actions": "^6.4.20",
106-
"@storybook/addon-docs": "^6.4.20",
107-
"@storybook/addon-essentials": "^6.4.20",
108-
"@storybook/addon-links": "^6.4.20",
104+
"@rushstack/eslint-patch": "^1.1.2",
105+
"@storybook/addon-actions": "^6.4.21",
106+
"@storybook/addon-docs": "^6.4.21",
107+
"@storybook/addon-essentials": "^6.4.21",
108+
"@storybook/addon-links": "^6.4.21",
109109
"@storybook/addon-postcss": "^2.0.0",
110-
"@storybook/builder-vite": "^0.1.24",
111-
"@storybook/builder-webpack5": "^6.4.20",
112-
"@storybook/client-api": "^6.4.20",
113-
"@storybook/core-common": "^6.4.20",
114-
"@storybook/manager-webpack5": "^6.4.20",
115-
"@storybook/vue3": "^6.4.20",
110+
"@storybook/builder-vite": "^0.1.26",
111+
"@storybook/client-api": "^6.4.21",
112+
"@storybook/client-logger": "^6.4.21",
113+
"@storybook/core-common": "^6.4.21",
114+
"@storybook/vue3": "^6.4.21",
116115
"@testing-library/jest-dom": "^5.16.4",
117116
"@testing-library/user-event": "^14.0.4",
118117
"@testing-library/vue": "^6.5.1",
@@ -139,12 +138,12 @@
139138
"cross-env": "^7.0.3",
140139
"cypress": "^9.5.3",
141140
"cypress-plugin-tab": "^1.0.5",
142-
"eslint": "^8.12.0",
141+
"eslint": "^8.13.0",
143142
"eslint-plugin-cypress": "^2.12.1",
144143
"eslint-plugin-import": "^2.26.0",
145144
"eslint-plugin-node": "^11.1.0",
146145
"eslint-plugin-promise": "^6.0.0",
147-
"eslint-plugin-storybook": "^0.5.7",
146+
"eslint-plugin-storybook": "^0.5.8",
148147
"eslint-plugin-vue": "^8.6.0",
149148
"globby": "^13.1.1",
150149
"inquirer": "^8.2.2",
@@ -171,11 +170,11 @@
171170
"tsd-jsdoc": "^2.5.0",
172171
"typescript": "^4.6.3",
173172
"vite": "^2.9.1",
174-
"vitest": "^0.9.0",
173+
"vitest": "^0.9.3",
175174
"vue-loader": "^17.0.0",
176175
"vue-router": "^4.0.14",
177176
"vue-router-mock": "^0.1.7",
178-
"vue-tsc": "^0.33.9",
177+
"vue-tsc": "^0.34.2",
179178
"vue-typegen": "^0.2.0",
180179
"yorkie": "^2.0.0"
181180
},
@@ -184,7 +183,7 @@
184183
"vue-router": "^4.0.14"
185184
},
186185
"optionalDependencies": {
187-
"esbuild-linux-64": "^0.14.27"
186+
"esbuild-linux-64": "^0.14.34"
188187
},
189188
"gitHooks": {
190189
"pre-commit": "lint-staged",

src/components/DsfrHeader/DsfrHeader.stories.js

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
import DsfrHeader from './DsfrHeader.vue'
22

3+
import { addIcons } from 'oh-vue-icons'
4+
5+
import {
6+
RiAddCircleLine,
7+
RiLockLine,
8+
RiAccountCircleLine,
9+
} from 'oh-vue-icons/icons/ri/index.js'
10+
11+
addIcons(
12+
RiAddCircleLine,
13+
RiLockLine,
14+
RiAccountCircleLine,
15+
)
16+
317
export default {
418
component: DsfrHeader,
519
title: 'Composants/En-tête - DsfrHeader',
@@ -31,12 +45,15 @@ export default {
3145
quickLinks: {
3246
control: 'object',
3347
description: `Tableau des liens d’accès rapide, chaque objet contiendra les props suivantes :
34-
3548
- \`label\`: Texte du lien (\`'Notifications'\`, par ex.)
3649
- \`to\`: Chemin ou objet à passer à \`to\` de \`router-link\` ou \`nuxt-link\` (\`'/notification'\` ou \`{ name: 'Notifications' }\` par ex.)
3750
- \`href\`: URL à passer à \`href\` de la balise \`<a>\` (\`'https://systeme-de-design.gouv.fr\` par ex.) **pour un lien externe uniquement**.
38-
- \`icon\` pour le nom de l’icône à afficher (\`'phone-line'\` par ex.)
39-
- \`button\`: \`true\` pour avoir une balise \`button\`, \`false\` pour laisser en balise \`a\``,
51+
- \`icon\` Nom de l’icône [Remix Icon](https://remixicon.com/) (ou toute autre icône de [oh-vue-icons](https://oh-vue-icons.netlify.app/)) à afficher (\`'ri-phone-line'\` par ex.)
52+
- \`iconRight\` Permet de mettre l’icône à droite (si la valeur est \`true\` ou <em>truthy</em> et que \`icon\` est renseigné )
53+
- \`iconAttrs\` Ensemble des props/attributs à donner à \`<VIcon>\` (Cf. [Doc](https://oh-vue-icons.netlify.app/docs#props)). Ex. : \`{ scale: 0.9, animation: }\`
54+
- \`button\`: \`true\` pour avoir une balise \`button\`, \`false\` pour laisser en balise \`a\`
55+
- accepte aussi tout ce qui peut être mis sur un composant, par exemple \`class\`
56+
`,
4057
},
4158
modelValue: {
4259
control: 'text',
@@ -118,8 +135,8 @@ EnTete.args = {
118135
placeholder: '',
119136
homeTo: '#',
120137
quickLinks: [
121-
{ label: 'Créer un espace', to: '/path1', icon: 'add-circle-line' },
122-
{ label: 'Se connecter', to: '/path2', icon: 'lock-line' },
123-
{ label: 'S’enregistrer', to: '/path3', icon: 'account-line' },
138+
{ label: 'Créer un espace', to: '/space/create', icon: 'ri-add-circle-line', iconAttrs: { scale: 0.9 } },
139+
{ label: 'Se connecter', to: '/login', class: 'fr-fi-lock-line' },
140+
{ label: 'S’enregistrer', to: '/signin', icon: 'ri-account-circle-line', iconRight: true, iconAttrs: { animation: 'spin', speed: 'slow' } },
124141
],
125142
}

src/components/DsfrHeader/DsfrHeaderMenuLink.vue

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ export default defineComponent({
1515
type: String,
1616
default: undefined,
1717
},
18+
iconAttrs: {
19+
type: String,
20+
default: undefined,
21+
},
22+
iconRight: Boolean,
1823
label: {
1924
type: String,
2025
default: '',
@@ -69,10 +74,23 @@ export default defineComponent({
6974
<component
7075
:is="is"
7176
class="fr-btn"
72-
:class="`fr-fi-${icon}`"
7377
v-bind="linkData"
7478
@click.stop="onClick"
7579
>
80+
<VIcon
81+
v-if="(icon || iconAttrs) && !iconRight"
82+
:name="icon"
83+
class="fr-mr-1w"
84+
v-bind="iconAttrs"
85+
/>
86+
7687
{{ label }}
88+
89+
<VIcon
90+
v-if="(icon || iconAttrs) && iconRight"
91+
:name="icon"
92+
class="fr-ml-1w"
93+
v-bind="iconAttrs"
94+
/>
7795
</component>
7896
</template>

src/components/DsfrInput/DsfrInput.stories.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,39 @@ LabelVisible.args = {
148148
disabled: false,
149149
}
150150

151+
export const ChampObligatoire = (args) => ({
152+
components: {
153+
DsfrInput,
154+
},
155+
data () {
156+
return {
157+
...args,
158+
}
159+
},
160+
template: `
161+
<DsfrInput
162+
:model-value="modelValue"
163+
:label="label"
164+
:label-visible="labelVisible"
165+
:placeholder="placeholder"
166+
:disabled="disabled"
167+
:required="true"
168+
/>
169+
`,
170+
mounted () {
171+
document.body.parentElement.setAttribute('data-fr-theme', this.dark ? 'dark' : 'light')
172+
},
173+
})
174+
ChampObligatoire.args = {
175+
dark: false,
176+
label: 'Label champ de saisie',
177+
labelVisible: true,
178+
placeholder: 'Placeholder',
179+
modelValue: '',
180+
disabled: false,
181+
isTextarea: true,
182+
}
183+
151184
export const ChampEnErreur = (args) => ({
152185
components: {
153186
DsfrInput,

src/components/DsfrInput/DsfrInput.vue

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import { getRandomId } from '../../utils/random-utils.js'
55
66
export default defineComponent({
77
name: 'DsfrInput',
8+
89
inheritAttrs: false,
10+
911
props: {
1012
id: {
1113
type: String,
@@ -39,7 +41,9 @@ export default defineComponent({
3941
isValid: Boolean,
4042
isTextarea: Boolean,
4143
},
44+
4245
emits: ['update:modelValue'],
46+
4347
computed: {
4448
isComponent () {
4549
return this.isTextarea ? 'textarea' : 'input'
@@ -59,12 +63,22 @@ export default defineComponent({
5963
}"
6064
:for="id"
6165
>
62-
{{ label }} {{ $attrs.required ? '*' : '' }}
66+
{{ label }}
67+
68+
<!-- @slot Slot pour indiquer que le champ est obligatoire. Par défaut, met une astérisque (dans un `<span class="required">`) -->
69+
<slot name="required-tip">
70+
<span
71+
v-if="$attrs.required"
72+
class="required"
73+
>&nbsp;*</span>
74+
</slot>
75+
6376
<span
6477
v-if="hint"
6578
class="fr-hint-text"
6679
>{{ hint }}</span>
6780
</label>
81+
6882
<component
6983
:is="isComponent"
7084
v-if="!wrapper"
@@ -80,6 +94,7 @@ export default defineComponent({
8094
@input="$emit('update:modelValue', $event.target.value)"
8195
@keydown.esc="$emit('update:modelValue', '')"
8296
/>
97+
8398
<div
8499
v-else
85100
:class="[

src/stories/docs/01-intro.stories.mdx

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ en [**Vue 3**](https://v3.vuejs.org/) sous forme de **bibliothèque de composant
1414

1515
Pour commencer à l’utiliser, [c’est par ici !](/story/docs-2-guide-d-utilisation--page)
1616

17-
# Qui sont les acteurs du projet
17+
# Les acteurs du projet
1818

1919
- **Clément Debroize** [<img src={MailIcon} style={{height: '1.25rem', 'position': 'relative', top: '0.25rem' }} />](mailto:[email protected]) [<img src={GithubIcon} style={{height: '1.25rem', 'position': 'relative', top: '0.25rem' }} />](https://github.com/DaBadBunny)
2020
- **Pierre-Louis Egaud** [<img src={MailIcon} style={{height: '1.25rem', 'position': 'relative', top: '0.25rem' }} />](mailto:[email protected]) [<img src={GithubIcon} style={{height: '1.25rem', 'position': 'relative', top: '0.25rem' }} />](https://github.com/plegaud)
21-
- **Stanislas Ormières** [<img src={MailIcon} style={{height: '1.25rem', 'position': 'relative', top: '0.25rem' }} />](mailto:[email protected]) [<img src={GithubIcon} style={{height: '1.25rem', 'position': 'relative', top: '0.25rem' }} />](https://github.com/laruiss)
21+
- **Stanislas Ormières** [<img src={MailIcon} style={{height: '1.25rem', 'position': 'relative', top: '0.25rem' }} />](mailto:[email protected]) [<img src={GithubIcon} style={{height: '1.25rem', 'position': 'relative', top: '0.25rem' }} />](https://github.com/laruiss) *(Lead dev, architecte, devops)*
22+
23+
Le projet a pu bénéficier des retours et de contributions de
24+
[Gildéric Deruette](https://github.com/gideruette) et [Sophie Aitis](https://github.com/sophieaitis)
2225

2326
# Pourquoi VueDsfr
2427

@@ -27,24 +30,26 @@ Vue 3. Le Système de design français (DSFR) est développé en JavaScript nati
2730

2831
Le BRR a donc besoin d'un portage en Vue 3 de ce DSFR pour ses futurs projets qui devront le respecter.
2932

30-
# Quels sont les principes et les buts de VueDsfr
33+
# VueDsfr en quelques mots
3134

3235
Ce projet de bibliothèque de composants
3336

34-
- doit être fait avec Vue 3
35-
- doit être utilisable facilement en tant que plugin
36-
- doit être utilisable facilement dans un projet npm
37-
- doit mettre à disposition deux types de documentation :
38-
- une pour aider au développement
39-
- une autre pour l'utilisation
40-
- doit publier un site complet avec les composants et leurs variants testables dans celui-ci dans un storybook
41-
- doit avoir un site déployé avec ce storybook disponible pour tous
42-
- doit avoir une couverture de test minimale
43-
- doit contenir le moins de CSS global possible et le CSS scopé inclus dans les composants
44-
- doit mettre à disposition les composants individuellement sans avoir à importer toute la bibliothèque
37+
- reproduit le plus fidèlement possible les composants du [DSFR](https://www.systeme-de-design.gouv.fr/)
38+
- est fait avec [Vue 3](https://vuejs.org)
39+
- est utilisable facilement en tant que plugin Vue 3
40+
- exporte les types (TypeScript) du plugin, des composants et des composables
41+
- est utilisable facilement dans un projet [npm](https://www.npmjs.com/package/@laruiss/vue-dsfr)
42+
- met à disposition deux parties dans la documentation :
43+
- une pour [aider au développement](/?path=/story/docs-3-guide-du-développeur--page)
44+
- une autre pour l'[utilisation](/?path=/story/docs-2-guide-d-utilisation--page)
45+
- publie un [site complet](vue-dsfr.netlify.app/) avec les composants et leurs variants testables dans celui-ci dans un storybook
46+
- déploie un site avec ce storybook disponible pour tous
47+
- a une couverture de test optimale
48+
- contient le CSS global du DSFR et (rarement) du CSS scopé inclus dans les composants
49+
- met à disposition les composants individuellement sans avoir à importer toute la bibliothèque
4550
(pour les petits projets)
4651

47-
# Quels sont les choix techniques retenus
52+
# Les choix techniques retenus
4853

4954
La bibliothèque est faite avec [Vue 3](https://v3.vuejs.org/) et [Vue-router 4](https://next.router.vuejs.org/).
5055

@@ -57,13 +62,15 @@ Le serveur de développement est celui de [Storybook](https://storybook.js.org/)
5762
Storybook, et le site pour tester les composants est le storybook lui-même.
5863

5964
Le CSS est écrit avec [PostCSS](https://postcss.org/) et notamment
60-
le plugin [postcss-preset-env](https://preset-env.cssdb.org/).
65+
le plugin [postcss-preset-env](https://preset-env.cssdb.org/) (mais très peu de CSS est propre à la bibliothèque).
6166

6267
Storybook est configuré pour utiliser PostCSS.
6368

64-
Les tests sont faits avec [Jest](https://jestjs.io) et [Vue Testing Library](https://testing-library.com/docs/vue-testing-library/intro/),
65-
et dans un futur proche avec [Cypress](https://www.cypress.io/).
69+
Les tests sont faits avec [Vitest](https://vitest.dev) et [Vue Testing Library](https://testing-library.com/docs/vue-testing-library/intro/),
70+
et des tests d’accessibilité sont faits avec [Cypress](https://www.cypress.io/) grâce aux
71+
[tests de composants](https://docs.cypress.io/guides/component-testing/introduction).
6672

6773
Les icônes sont toujours celles de [RemixIcon](https://remixicon.com/), grâce à [Oh, Vue Icons!](https://github.com/Renovamen/oh-vue-icons/)
74+
(qui permet d’ajouter d’[autres icônes](/?path=/story/fondamentaux-4-1-icônes-personnalisées--page))
6875

6976
La bibliothèque est compilée avec [Rollup](https://rollupjs.org/).

0 commit comments

Comments
 (0)