Skip to content

Commit cec193e

Browse files
committed
refactor(tile): ♻️ convertit les stories DsfrTile au format CSF3
## Pourquoi les changements ont été faits : - Migration vers Storybook 9 nécessitant le format CSF3 moderne - Amélioration de la maintenabilité avec TypeScript strict - Documentation des slots avec defineSlots pour DsfrTile.vue ## Quelles modifications ont été apportées : - DsfrTile.stories.ts : conversion au format CSF3 avec Meta/StoryObj - DsfrTiles.stories.ts : conversion au format CSF3 avec Meta/StoryObj - Migration de data()/this vers setup()/ref() (Composition API) - DsfrTile.vue : ajout de defineSlots pour documenter les slots (start-details, header) - Suppression des commentaires HTML @slot remplacés par defineSlots - Respect des conventions typographiques françaises
1 parent b8cd1be commit cec193e

File tree

3 files changed

+104
-90
lines changed

3 files changed

+104
-90
lines changed

src/components/DsfrTile/DsfrTile.stories.ts

Lines changed: 51 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
import type { Meta, StoryObj } from '@storybook/vue3-vite'
2+
13
import DsfrTile from './DsfrTile.vue'
24

35
/**
46
* [Voir quand l’utiliser sur la documentation du DSFR](https://www.systeme-de-design.gouv.fr/version-courante/fr/composants/tuile)
57
*
68
* Nous vous invitons à regarder plutôt la [nouvelle documentation](https://vue-ds.fr/composants/DsfrTile) pour ce composant
79
*/
8-
export default {
10+
const meta = {
911
component: DsfrTile,
1012
title: 'Composants/DsfrTile',
1113
argTypes: {
@@ -82,53 +84,55 @@ export default {
8284
description: 'Permet de passer le fond de la tuile en gris',
8385
},
8486
},
85-
}
87+
} as Meta<typeof DsfrTile>
8688

87-
export const TuileSimple = (args) => ({
88-
components: {
89-
DsfrTile,
90-
},
89+
export default meta
9190

92-
data () {
93-
return {
94-
...args,
95-
}
96-
},
91+
type Story = StoryObj<typeof meta>
9792

98-
template: `
99-
<DsfrTile
100-
:title="title"
101-
:imgSrc="imgSrc"
102-
:description="description"
103-
:details="details"
104-
:horizontal="horizontal"
105-
:vertical="vertical"
106-
:disabled="false"
107-
:to="to"
108-
:title-tag="titleTag"
109-
:download="download"
110-
:small="small"
111-
:icon="icon"
112-
:no-border="noBorder"
113-
:shadow="shadow"
114-
:no-background="noBackground"
115-
:grey="grey"
116-
/>
117-
`,
118-
})
119-
TuileSimple.args = {
120-
title: 'Ma formidable tuile',
121-
imgSrc: 'https://loremflickr.com/80/80/cat',
122-
description: 'Une tuile absolument formidable',
123-
horizontal: false,
124-
disabled: false,
125-
to: '#',
126-
titleTag: 'h2',
127-
download: false,
128-
small: false,
129-
icon: false,
130-
noBorder: false,
131-
shadow: false,
132-
noBackground: false,
133-
grey: false,
93+
export const TuileSimple: Story = {
94+
render: (args) => ({
95+
components: {
96+
DsfrTile,
97+
},
98+
setup () {
99+
return { args }
100+
},
101+
template: `
102+
<DsfrTile
103+
:title="args.title"
104+
:imgSrc="args.imgSrc"
105+
:description="args.description"
106+
:details="args.details"
107+
:horizontal="args.horizontal"
108+
:vertical="args.vertical"
109+
:disabled="args.disabled"
110+
:to="args.to"
111+
:title-tag="args.titleTag"
112+
:download="args.download"
113+
:small="args.small"
114+
:icon="args.icon"
115+
:no-border="args.noBorder"
116+
:shadow="args.shadow"
117+
:no-background="args.noBackground"
118+
:grey="args.grey"
119+
/>
120+
`,
121+
}),
122+
args: {
123+
title: 'Ma formidable tuile',
124+
imgSrc: 'https://loremflickr.com/80/80/cat',
125+
description: 'Une tuile absolument formidable',
126+
horizontal: false,
127+
disabled: false,
128+
to: '#',
129+
titleTag: 'h2',
130+
download: false,
131+
small: false,
132+
icon: false,
133+
noBorder: false,
134+
shadow: false,
135+
noBackground: false,
136+
grey: false,
137+
},
134138
}

src/components/DsfrTile/DsfrTile.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ const props = withDefaults(defineProps<DsfrTileProps>(), {
1919
icon: true,
2020
})
2121
22+
defineSlots<{
23+
/** Slot pour les détails d’une tuile sous forme de tags (cliquables ou non) ou de badges (4 maximum) */
24+
'start-details'?: (props: Record<string, never>) => void
25+
/** Slot pour l’en-tête d’une tuile */
26+
header?: (props: Record<string, never>) => void
27+
}>()
28+
2229
const defaultSvgAttrs = { viewBox: '0 0 80 80', width: '80px', height: '80px' }
2330
2431
const isExternalLink = computed(() => {
@@ -84,7 +91,6 @@ const isExternalLink = computed(() => {
8491
v-if="$slots['start-details']"
8592
class="fr-tile__start"
8693
>
87-
<!-- @slot Slot pour les détails d’une tuile sous forme de tags (cliquables ou non) ou de badges (4 maximum) -->
8894
<slot name="start-details" />
8995
</div>
9096
</div>
Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import type { Meta, StoryObj } from '@storybook/vue3-vite'
2+
13
import DsfrTiles from './DsfrTiles.vue'
24

35
/**
4-
* [Voir quand lutiliser sur la documentation du DSFR](https://www.systeme-de-design.gouv.fr/version-courante/fr/composants/tuile)
6+
* [Voir quand l'utiliser sur la documentation du DSFR](https://www.systeme-de-design.gouv.fr/version-courante/fr/composants/tuile)
57
*/
6-
export default {
8+
const meta = {
79
component: DsfrTiles,
810
title: 'Composants/DsfrTiles',
911
argTypes: {
@@ -15,51 +17,53 @@ export default {
1517
horizontal: {
1618
control: 'boolean',
1719
description:
18-
'Permet de mettre chaque tuile sur une ligne entière, et denvoyer aussi par défaut cette valeur à chacune des tuiles enfant (Surchargeable éventuellement par chaque objet du tableau `tiles`)',
20+
'Permet de mettre chaque tuile sur une ligne entière, et d\'envoyer aussi par défaut cette valeur à chacune des tuiles enfant (Surchargeable éventuellement par chaque objet du tableau `tiles`)',
1921
},
2022
},
21-
}
23+
} as Meta<typeof DsfrTiles>
2224

23-
export const JeuDeTuiles = (args) => ({
24-
components: {
25-
DsfrTiles,
26-
},
25+
export default meta
2726

28-
data () {
29-
return {
30-
...args,
31-
}
32-
},
27+
type Story = StoryObj<typeof meta>
3328

34-
template: `
35-
<DsfrTiles
36-
:tiles="tiles"
37-
:horizontal="horizontal"
38-
/>
39-
`,
40-
})
41-
JeuDeTuiles.args = {
42-
tiles: [
43-
{
44-
title: 'Ma formidable tuile 1',
45-
imgSrc: 'https://loremflickr.com/80/80/cat?random=1',
46-
description: 'Une tuile absolument formidable',
47-
},
48-
{
49-
title: 'Ma formidable tuile 2',
50-
imgSrc: 'https://loremflickr.com/80/80/cat?random=2',
51-
description: 'Une tuile absolument formidable',
52-
},
53-
{
54-
title: 'Ma formidable tuile 3',
55-
imgSrc: 'https://loremflickr.com/80/80/cat?random=3',
56-
description: 'Une tuile absolument formidable',
29+
export const JeuDeTuiles: Story = {
30+
args: {
31+
tiles: [
32+
{
33+
title: 'Ma formidable tuile 1',
34+
imgSrc: 'https://loremflickr.com/80/80/cat?random=1',
35+
description: 'Une tuile absolument formidable',
36+
},
37+
{
38+
title: 'Ma formidable tuile 2',
39+
imgSrc: 'https://loremflickr.com/80/80/cat?random=2',
40+
description: 'Une tuile absolument formidable',
41+
},
42+
{
43+
title: 'Ma formidable tuile 3',
44+
imgSrc: 'https://loremflickr.com/80/80/cat?random=3',
45+
description: 'Une tuile absolument formidable',
46+
},
47+
{
48+
title: 'Ma formidable tuile 4',
49+
imgSrc: 'https://loremflickr.com/80/80/cat?random=4',
50+
description: 'Une tuile absolument formidable',
51+
},
52+
],
53+
horizontal: false,
54+
},
55+
render: (args) => ({
56+
components: {
57+
DsfrTiles,
5758
},
58-
{
59-
title: 'Ma formidable tuile 4',
60-
imgSrc: 'https://loremflickr.com/80/80/cat?random=4',
61-
description: 'Une tuile absolument formidable',
59+
setup () {
60+
return { args }
6261
},
63-
],
64-
horizontal: false,
62+
template: `
63+
<DsfrTiles
64+
:tiles="args.tiles"
65+
:horizontal="args.horizontal"
66+
/>
67+
`,
68+
}),
6569
}

0 commit comments

Comments
 (0)