import type { Meta, StoryObj } from '@storybook/vue3' import SyTabs from './SyTabs.vue' import { ref } from 'vue' import { mdiHome } from '@mdi/js' // Plus d'informations sur la configuration de Storybook pour Vue: // https://storybook.js.org/docs/vue/writing-stories/introduction /** * `SyTabs` est un composant de navigation par onglets accessible et personnalisable. * Il permet d'organiser le contenu en sections navigables facilement via une interface à onglets. * Le composant implémente toutes les bonnes pratiques d'accessibilité ARIA et supporte la navigation complète au clavier. */ const meta = { title: 'Composants/Navigation/SyTabs', component: SyTabs, parameters: { layout: 'fullscreen', controls: { exclude: ['confirmationMessage'] }, }, argTypes: { items: { description: 'Liste des éléments à afficher dans les onglets', control: 'object', }, modelValue: { description: 'Index ou valeur de l\'onglet actuellement sélectionné (utilisé avec v-model)', control: 'text', }, confirmTabChange: { description: 'Si activé, une confirmation sera demandée avant de changer d\'onglet', control: 'boolean', }, }, args: { items: [ { label: 'Onglet 1', value: 'tab1', content: 'Contenu de l\'onglet 1' }, { label: 'Onglet 2', value: 'tab2', content: 'Contenu de l\'onglet 2' }, { label: 'Onglet 3', value: 'tab3', content: 'Contenu de l\'onglet 3' }, ], }, } as Meta export default meta type Story = StoryObj /** * Exemple de base du composant SyTabs avec des onglets simples. */ export const Default: Story = { args: {}, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ` const items = [ { label: 'Onglet 1', value: 'tab1', content: "Contenu de l'onglet 1" }, { label: 'Onglet 2', value: 'tab2', content: "Contenu de l'onglet 2" }, { label: 'Onglet 3', value: 'tab3', content: "Contenu de l'onglet 3" }, ] `, }, ], }, } /** * Exemple de base du composant SyTabs avecun onglet disabled. */ export const Disabled: Story = { args: { items: [ { label: 'Onglet 1', value: 'tab1', content: 'Contenu de l\'onglet 1' }, { label: 'Onglet 2', value: 'tab2', content: 'Contenu de l\'onglet 2', disabled: true }, { label: 'Onglet 3', value: 'tab3', content: 'Contenu de l\'onglet 3' }, ], }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ` const items = [ { label: 'Onglet 1', value: 'tab1', content: "Contenu de l'onglet 1" }, { label: 'Onglet 2', value: 'tab2', content: "Contenu de l'onglet 2", disabled: true }, { label: 'Onglet 3', value: 'tab3', content: "Contenu de l'onglet 3" }, ] `, }, ], }, } /** * Exemple avec v-model pour contrôler l'onglet actif de façon externe. */ export const WithVModel: Story = { render: args => ({ components: { SyTabs }, setup() { const activeTab = ref('tab2') return { args, activeTab } }, template: `
Onglet actif: {{ activeTab }}
`, }), parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } /** * Exemple avec slot tabs prepend */ export const WithTabsPrependSlot: Story = { render: args => ({ components: { SyTabs }, setup() { return { args } }, template: ` `, }), parameters: { sourceCode: [ { name: 'Template', code: ` `, }, ], }, } /** * Exemple avec slot tabs append */ export const WithTabsAppendSlot: Story = { render: args => ({ components: { SyTabs }, setup() { return { args } }, template: ` `, }), parameters: { sourceCode: [ { name: 'Template', code: ` `, }, ], }, } /** * Exemple avec slot tab prepend */ export const WithTabPrependSlot: Story = { render: args => ({ components: { SyTabs }, setup() { return { args, mdiHome } }, template: ` `, }), parameters: { sourceCode: [ { name: 'Template', code: ` `, script: ` `, }, ], }, } /** * Exemple avec slot tab append */ export const WithTabAppendSlot: Story = { render: args => ({ components: { SyTabs }, setup() { return { args, mdiHome } }, template: ` `, }), parameters: { sourceCode: [ { name: 'Template', code: ` `, script: ` `, }, ], }, } /** * Exemple avec slot pannel */ export const WithCustomContent: Story = { render: args => ({ components: { SyTabs }, setup() { return { args } }, template: ` `, }), parameters: { sourceCode: [ { name: 'Template', code: ` `, }, ], }, } /** * Exemple avec de nombreux onglets pour démontrer le comportement de scrolling. */ export const ManyTabs: Story = { args: { items: Array.from({ length: 10 }, (_, i) => ({ label: `Onglet ${i + 1}`, value: `tab${i + 1}`, content: `Contenu de l'onglet ${i + 1}`, })), }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ` // Création d'un grand nombre d'onglets pour tester le comportement de défilement const items = Array.from({ length: 10 }, (_, i) => ({ label: \`Onglet \${i + 1}\`, value: \`tab\${i + 1}\`, content: \`Contenu de l'onglet \${i + 1}\`, })) `, }, ], }, } /** * Exemple avec des options de personnalisation du thème. */ export const CustomTheme: Story = { render: args => ({ components: { SyTabs }, setup() { return { args } }, template: ` `, }), parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } /** * Exemple de SyTabs utilisé comme menu de navigation (Routing). * La sémantique d'accessibilité s'adapte automatiquement (utilisation d'une balise