import type { Meta, StoryObj } from '@storybook/vue3' import SyIcon from './SyIcon.vue' import SyIconAccessibility from './SyIconAccessibility.vue' import { mdiHome, mdiAlert, mdiStar, mdiDelete, mdiClose, mdiInformation } from '@mdi/js' const meta = { title: 'Composants/Données/SyIcon', component: SyIcon, decorators: [ () => ({ template: '
', }), ], argTypes: { icon: { control: { type: 'text' }, description: 'Nom de l\'icône à afficher (format Material Design Icons)', }, label: { control: { type: 'text' }, description: 'Label d\'accessibilité pour l\'icône (utilisé avec decorative=false)', }, decorative: { control: { type: 'boolean' }, description: 'Indique si l\'icône est décorative (true) ou informative (false)', default: true, }, role: { options: ['img', 'button', 'presentation'], control: { type: 'select', }, description: 'Rôle ARIA de l\'icône (img, button, presentation)', }, autoDetectButton: { control: { type: 'boolean' }, description: 'Active la détection automatique du rôle bouton pour les icônes interactives', default: false, }, color: { control: { type: 'text' }, description: 'Couleur de l\'icône (nom de couleur Vuetify)', }, size: { options: ['x-small', 'small', 'default', 'large', 'x-large'], control: { type: 'select', }, description: 'Taille de l\'icône (x-small, small, default, large, x-large ou valeur en px)', default: 'default', }, }, } satisfies Meta export default meta type Story = StoryObj export const Default: Story = { parameters: { sourceCode: [ { name: 'Template', language: 'vue', code: ` `, }, ], }, args: { icon: mdiHome, label: 'Accueil', decorative: false, }, render: args => ({ components: { SyIcon }, setup() { return { args, mdiHome } }, template: `
`, }), } export const WithColor: Story = { parameters: { sourceCode: [ { name: 'Template', language: 'vue', code: ` `, }, ], }, args: { icon: mdiAlert, color: 'error', label: 'Alerte', decorative: false, }, render: args => ({ components: { SyIcon }, setup() { return { args, mdiAlert } }, template: `
`, }), } export const WithSize: Story = { parameters: { sourceCode: [ { name: 'Template', language: 'vue', code: ``, }, ], }, args: { icon: mdiStar, size: 'x-large', decorative: true, }, render: args => ({ components: { SyIcon }, setup() { return { args, mdiStar } }, template: `
`, }), } export const Decorative: Story = { parameters: { sourceCode: [ { name: 'Template', language: 'vue', code: ` `, }, ], }, args: { icon: mdiStar, decorative: true, }, render: args => ({ components: { SyIcon }, setup() { return { args, mdiStar } }, template: `
`, }), } export const ExplicitButtonRole: Story = { parameters: { sourceCode: [ { name: 'Template', language: 'vue', code: ` `, }, ], }, args: { icon: mdiDelete, decorative: false, role: 'button', label: 'Supprimer', }, render: args => ({ components: { SyIcon }, setup() { const handleClick = () => { alert('Bouton cliqué !') } return { args, mdiDelete, handleClick } }, template: `
`, }), } export const AutoDetectButtonRole: Story = { parameters: { sourceCode: [ { name: 'Template', language: 'vue', code: ` `, }, ], }, args: { icon: mdiClose, decorative: false, autoDetectButton: true, label: 'Fermer', }, render: args => ({ components: { SyIcon }, setup() { const handleClick = () => { alert('Fermeture !') } return { args, mdiClose, handleClick } }, template: `
`, }), } export const InformativeIcon: Story = { parameters: { sourceCode: [ { name: 'Template', language: 'vue', code: ` `, }, ], }, args: { icon: mdiInformation, decorative: false, role: 'img', label: 'Information importante', color: 'info', }, render: args => ({ components: { SyIcon }, setup() { return { args, mdiInformation } }, template: `
`, }), } export const AccessibilityDemo: Story = { parameters: { a11y: { disable: true, }, }, args: { icon: mdiStar, // Using an icon from the imported icons }, render: () => ({ components: { SyIconAccessibility }, template: '', }), }