Skip to content

Commit 796e7a5

Browse files
committed
refactor(DsfrTag): ♻️ migre les stories vers Storybook 9 et CSF3
- Mise à jour vers la syntaxe CSF3 pour Storybook 9 - Amélioration du typage et de la maintenabilité - Harmonisation avec les autres composants du projet - Ajout des imports de types Meta depuis @storybook/vue3 - Conversion de la story Etiquette du format fonction vers le format objet CSF3 - Utilisation de la syntaxe `as Meta<typeof DsfrTag>` pour gérer le composant générique - Suppression du template inline au profit du rendu direct des args - Conservation de tous les argTypes et descriptions existants
1 parent 11a587a commit 796e7a5

File tree

4 files changed

+108
-46
lines changed

4 files changed

+108
-46
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import type { Meta } from '@storybook/vue3'
2+
3+
import DsfrTag from './DsfrTag.vue'
4+
5+
/**
6+
* [Voir quand l'utiliser sur la documentation du DSFR](https://www.systeme-de-design.gouv.fr/version-courante/fr/composants/tag)
7+
*/
8+
const meta = {
9+
component: DsfrTag,
10+
title: 'Composants/DsfrTag',
11+
tags: ['chip'],
12+
argTypes: {
13+
class: {
14+
control: 'text',
15+
description: 'Classe CSS (facultative) pour utiliser les icônes du DSFR',
16+
table: {
17+
category: 'Attributs',
18+
},
19+
},
20+
label: {
21+
control: 'text',
22+
description: '**Texte** du tag',
23+
},
24+
disabled: {
25+
control: 'boolean',
26+
description: 'Indique si le tag est **inactivé**',
27+
},
28+
selected: {
29+
control: 'boolean',
30+
description: 'Indique si le tag est **selectionné**',
31+
table: {
32+
category: 'PROPS',
33+
},
34+
},
35+
selectable: {
36+
control: 'boolean',
37+
description: 'Indique si le tag est **selectionnable**',
38+
},
39+
icon: {
40+
control: 'text',
41+
description:
42+
'**Nom de l’icône** (tel que sur le site [RemixIcon](https://remixicon.com), exemple: `"ri-checkbox-circle-line"`) à afficher à côté du texte du bouton.\n\n Par défaut, l’icône est',
43+
},
44+
iconOnly: {
45+
control: 'boolean',
46+
description:
47+
'Indique si l’icône doit apparaître seule (le `label` sera dans l’`aria-label` de l’icône)',
48+
},
49+
link: {
50+
control: 'text',
51+
description:
52+
'URL complète pour un lien externe, ou chaîne de caractère ou objet à donner à `to` de `RouterLink` pour un lien interne',
53+
},
54+
small: {
55+
control: 'boolean',
56+
description: 'Indique si le tag doit être petit',
57+
},
58+
tagName: {
59+
control: 'text',
60+
description: `Balise ou composant à utiliser (e.g. : \`"p"\`, \`"button"\`, \`"strong"\`, \`"em"\`).
61+
- \`"p"\` par défaut
62+
- si \`link\` est indiqué, le défaut est \`"a"\` si le lien est externe et \`"RouterLink"\` si le lien est interne
63+
- si \`disabled\` est à \`true\` et qu'il n'y a pas de lien, le défaut est \`"button".\`
64+
`,
65+
},
66+
},
67+
} satisfies Meta<typeof DsfrTag>
68+
69+
export default meta
70+
71+
export const Etiquette = {
72+
render: (args: typeof meta.args) => ({
73+
components: { DsfrTag },
74+
75+
setup () {
76+
return args
77+
},
78+
79+
template: `
80+
<DsfrTag
81+
:label="label"
82+
:icon="icon"
83+
:tag-name="tagName"
84+
:icon-only="iconOnly"
85+
:disabled="disabled"
86+
:selected="selected"
87+
:selectable="selectable"
88+
:small="small"
89+
@select="selected = !selected"
90+
91+
/>
92+
`,
93+
}),
94+
args: {
95+
label: 'Étiquette',
96+
icon: 'ri-arrow-right-line',
97+
iconOnly: false,
98+
disabled: false,
99+
small: false,
100+
selected: false,
101+
selectable: true,
102+
tagName: 'button',
103+
},
104+
}

src/components/DsfrTag/DsfrTag.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const props = withDefaults(defineProps<DsfrTagProps<T>>(), {
1414
})
1515
1616
defineEmits<{
17+
/** Émis lors de la sélection et désélection du tag */
1718
select: [[unknown, boolean]]
1819
}>()
1920

src/components/DsfrTag/DsfrTags.stories.ts

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@ export default {
99
title: 'Composants/DsfrTags',
1010
tags: ['chip'],
1111
argTypes: {
12-
class: {
13-
control: 'text',
14-
description: 'Classe CSS (facultative) pour utiliser les icônes du DSFR',
15-
},
1612
label: {
1713
control: 'text',
1814
description: '**Texte** du tag',
@@ -60,11 +56,6 @@ export default {
6056
},
6157
}
6258

63-
const tagGroup = [
64-
{ label: 'Tag sans icône' },
65-
{ label: 'Tag avec icône', icon: 'ri-arrow-right-line' },
66-
]
67-
6859
const tags = [
6960
[
7061
{ label: 'Tag sans icône' },
@@ -111,40 +102,6 @@ const tags = [
111102
],
112103
]
113104

114-
export const Etiquette = (args) => ({
115-
components: { DsfrTag },
116-
data () {
117-
const obj = {
118-
...args,
119-
className: args.class,
120-
}
121-
delete obj.class
122-
return obj
123-
},
124-
template: `
125-
<DsfrTag
126-
:class="className"
127-
:label="label"
128-
:icon="icon"
129-
:tagName="tagName"
130-
:iconOnly="iconOnly"
131-
:disabled="disabled"
132-
:selected="selected"
133-
:small="small"
134-
/>
135-
`,
136-
})
137-
Etiquette.args = {
138-
label: 'Étiquette',
139-
class: '',
140-
icon: '',
141-
iconOnly: false,
142-
disabled: false,
143-
small: false,
144-
selected: false,
145-
tagName: 'button',
146-
}
147-
148105
export const GroupeDEtiquettes = (args) => ({
149106
components: { DsfrTags },
150107
data () {
@@ -157,7 +114,7 @@ export const GroupeDEtiquettes = (args) => ({
157114
`,
158115
})
159116
GroupeDEtiquettes.args = {
160-
tags: tagGroup,
117+
tags: tags[0],
161118
}
162119

163120
export const EtiquettesSimples = (args) => ({

src/components/DsfrTag/DsfrTags.types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ export type DsfrTagProps<T = string> = {
1010
iconOnly?: boolean
1111
} & ({
1212
selectable: true
13-
selected?: boolean
14-
value?: T
13+
selected: boolean
14+
value: T
1515
} | {
1616
selectable?: false
1717
})

0 commit comments

Comments
 (0)