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: '',
}),
}