import type { Meta, StoryObj } from '@storybook/vue3' import { fn } from '@storybook/test' import Accordion from './Accordion.vue' import { ref } from 'vue' const meta: Meta = { title: 'Composants/Données/Accordion', component: Accordion, parameters: { layout: 'fullscreen', }, argTypes: { 'items': { control: { type: 'object' }, description: 'Liste des éléments de l\'accordéon', }, 'headingLevel': { control: { type: 'number', min: 1, max: 6 }, description: 'Niveau de titre pour les boutons de dévoilement', default: 3, }, 'groupId': { control: { type: 'text' }, description: 'Identifiant de groupe pour synchroniser le focus entre plusieurs accordions', default: 'default', }, 'modelValue': { control: 'object', description: 'Liste des identifiants des éléments ouverts (v-model)', table: { type: { summary: 'string[]' }, category: 'props', defaultValue: { summary: '[]' }, }, }, 'onUpdate:modelValue': { action: 'update:modelValue', description: 'Événement émis lors de l\'ouverture ou la fermeture d\'un élément', table: { type: { summary: '(value: string[]) => void' }, category: 'events', }, }, }, args: { 'onUpdate:modelValue': fn(), }, } export default meta type Story = StoryObj const defaultItems = [ { id: 'item1', title: 'Section 1', content: 'Contenu de la section 1' }, { id: 'item2', title: 'Section 2', content: 'Contenu de la section 2' }, { id: 'item3', title: 'Section 3', content: { title: 'Sous-titre de la section 3', content: 'Contenu détaillé de la section 3', }, }, ] export const Default: Story = { parameters: { sourceCode: [ { language: 'vue', code: ``, }, ], }, args: { items: defaultItems.slice(0, 2), headingLevel: 3, }, render: args => ({ components: { Accordion }, setup() { return { args } }, template: `
`, }), } export const WithObjectContent: Story = { parameters: { sourceCode: [ { language: 'vue', code: ``, }, ], }, args: { items: [ { id: 'item', title: 'Section', content: { title: 'Sous-titre de la section ', content: 'Contenu détaillé de la section', }, }, ], headingLevel: 3, }, render: args => ({ components: { Accordion }, setup() { return { args } }, template: `
`, }), } export const CustomColors: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { language: 'vue', name: 'Template', code: ``, }, ], }, args: { items: [ { id: 'item1', title: 'Couleurs par défaut', content: 'Utilise les couleurs définies dans config.ts' }, ], }, render: args => ({ components: { Accordion }, setup() { return { args } }, template: `

Couleurs par défaut

Cet accordéon utilise les couleurs définies dans le fichier config.ts

Couleurs personnalisées

Cet accordéon utilise des couleurs personnalisées via les props

Guide des couleurs

  • titleColor : Couleur du titre quand l'accordéon est fermé
  • hoverColor : Couleur utilisée au survol
  • focusColor : Couleur utilisée pour le focus (bordure)
  • activeColor : Couleur du titre quand l'accordéon est ouvert
  • backgroundColor : Couleur de fond de l'accordéon
`, }), } export const CustomHeadingLevel: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { language: 'vue', name: 'Template', code: ``, }, ], }, args: { items: defaultItems.slice(0, 1), }, render: args => ({ components: { Accordion }, setup() { return { args } }, template: `
`, }), } export const WithSlots: Story = { parameters: { sourceCode: [ { language: 'vue', name: 'Template', code: ``, }, ], }, args: { items: defaultItems.slice(0, 2), headingLevel: 3, }, render: args => ({ components: { Accordion }, setup() { return { args } }, template: `
`, }), } export const WithVModel: Story = { parameters: { sourceCode: [ { language: 'vue', name: 'Template', code: ` `, }, ], }, args: { items: defaultItems, headingLevel: 3, }, render: args => ({ components: { Accordion }, setup() { const openItems = ref([]) const openAll = () => { openItems.value = (args.items ?? []).map((i: { id: string }) => i.id) } const closeAll = () => { openItems.value = [] } return { args, openItems, openAll, closeAll } }, template: `
Éléments ouverts : {{ openItems }}
Tout ouvrir Tout fermer
`, }), } export const PreOpened: Story = { parameters: { sourceCode: [ { language: 'vue', name: 'Template', code: ` `, }, ], }, args: { items: defaultItems, headingLevel: 3, }, render: args => ({ components: { Accordion }, setup() { const openItems = ref(['item2']) return { args, openItems } }, template: `
Éléments ouverts : {{ openItems }}
`, }), }