import type { Meta, StoryObj } from '@storybook/vue3'
import { fn } from '@storybook/test'
import SyIconButton from './SyIconButton.vue'
import { mdiClose, mdiAlert, mdiMagnify } from '@mdi/js'
const meta = {
title: 'Composants/Boutons/SyIconButton',
component: SyIconButton,
decorators: [
() => ({
template: '
',
}),
],
argTypes: {
'icon': {
control: { type: 'text' },
description: 'Nom de l\'icône à afficher (format Material Design Icons)',
},
'label': {
control: { type: 'text' },
description: 'Texte accessible obligatoire porté par `aria-label` sur le bouton',
},
'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 du bouton et de l\'icône',
default: 'default',
},
'disabled': {
control: { type: 'boolean' },
description: 'Désactive le bouton',
default: false,
},
'onClick-icon-button': {
action: 'click-icon-button',
description: 'Événement émis lors du clic sur le bouton',
},
'variant': {
options: ['flat', 'elevated', 'tonal', 'outlined', 'text', 'plain'],
control: { type: 'select' },
description: 'Variante visuelle du bouton',
},
},
} satisfies Meta
export default meta
type Story = StoryObj
export const Default: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
language: 'vue',
code: `
`,
},
],
},
args: {
'icon': mdiClose,
'label': 'Fermer',
'onClick-icon-button': fn(),
},
render: args => ({
components: { SyIconButton },
setup() {
const handleClick = () => {
alert('Bouton cliqué !')
}
return { args, mdiClose, handleClick }
},
template: `
`,
}),
}
export const Disabled: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
language: 'vue',
code: `
`,
},
],
},
args: {
'icon': mdiClose,
'label': 'Fermer',
'disabled': true,
'onClick-icon-button': fn(),
},
render: args => ({
components: { SyIconButton },
setup() {
return { args, mdiClose }
},
template: `
`,
}),
}
export const WithColor: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
language: 'vue',
code: `
`,
},
],
},
args: {
'icon': mdiAlert,
'label': 'Alerte',
'color': 'red',
'onClick-icon-button': fn(),
},
render: args => ({
components: { SyIconButton },
setup() {
return { args, mdiAlert }
},
template: `
`,
}),
}
export const WithSize: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
language: 'vue',
code: `
`,
},
],
},
args: {
'icon': mdiMagnify,
'label': 'Rechercher',
'onClick-icon-button': fn(),
},
render: args => ({
components: { SyIconButton },
setup() {
const sizes = ['x-small', 'small', 'default', 'large', 'x-large']
return { args, mdiMagnify, sizes }
},
template: `
`,
}),
}