import type { Meta, StoryObj } from '@storybook/vue3' import { VCarousel, VCarouselItem, VCard, VCardTitle, VCardText, VBtn } from 'vuetify/components' const meta: Meta = { title: 'Composants/Composants Vuetify/VCarousel', component: VCarousel, tags: ['!dev'], parameters: { docs: { source: { transform: (src: string) => src .replace(/VCarousel/g, 'v-carousel') .replace(/VCarouselItem/g, 'v-carousel-item'), }, }, }, argTypes: { cycle: { control: { type: 'boolean' }, description: 'Active le défilement automatique', table: { defaultValue: { summary: 'false' }, }, }, hideDelimiters: { control: { type: 'boolean' }, description: 'Masque les indicateurs de pagination', table: { defaultValue: { summary: 'false' }, }, }, hideDelimiterBackground: { control: { type: 'boolean' }, description: 'Masque le fond des indicateurs', table: { defaultValue: { summary: 'false' }, }, }, showArrows: { control: { type: 'select' }, options: [true, false, 'hover'], description: 'Affiche les flèches de navigation', table: { defaultValue: { summary: 'true' }, }, }, height: { control: { type: 'text' }, description: 'Hauteur du carousel', table: { defaultValue: { summary: '500' }, }, }, interval: { control: { type: 'number' }, description: 'Intervalle de défilement automatique (ms)', table: { defaultValue: { summary: '6000' }, }, }, continuous: { control: { type: 'boolean' }, description: 'Continue le défilement en boucle', table: { defaultValue: { summary: 'true' }, }, }, progress: { control: { type: 'select' }, options: [false, 'primary', 'secondary', 'success', 'info', 'warning', 'error'], description: 'Affiche une barre de progression', }, }, } export default meta type Story = StoryObj export const Primary: Story = { render: args => ({ components: { VCarousel, VCarouselItem }, setup() { const colors = ['primary', 'secondary', 'success', 'info', 'warning'] return { args, colors } }, template: `
Slide {{ i + 1 }}
`, }), args: { height: 400, }, parameters: { docs: { source: { code: `
Slide {{ i + 1 }}
`, }, }, }, } export const WithCycle: Story = { render: args => ({ components: { VCarousel, VCarouselItem }, setup() { const slides = [ { title: 'Slide 1', color: 'primary' }, { title: 'Slide 2', color: 'secondary' }, { title: 'Slide 3', color: 'success' }, ] return { args, slides } }, template: `
{{ slide.title }}
`, }), args: { height: 400, cycle: true, interval: 3000, }, parameters: { docs: { source: { code: `
{{ slide.title }}
`, }, }, }, } export const HideDelimiters: Story = { render: args => ({ components: { VCarousel, VCarouselItem }, setup() { const colors = ['primary', 'secondary', 'success'] return { args, colors } }, template: `
Slide {{ i + 1 }}
`, }), args: { height: 400, hideDelimiters: true, }, parameters: { docs: { source: { code: `
Slide {{ i + 1 }}
`, }, }, }, } export const ShowArrowsOnHover: Story = { render: args => ({ components: { VCarousel, VCarouselItem }, setup() { const colors = ['primary', 'secondary', 'success', 'info'] return { args, colors } }, template: `
Slide {{ i + 1 }}
`, }), args: { height: 400, showArrows: 'hover', }, parameters: { docs: { source: { code: `
Slide {{ i + 1 }}
`, }, }, }, } export const WithProgress: Story = { render: args => ({ components: { VCarousel, VCarouselItem }, setup() { const colors = ['primary', 'secondary', 'success'] return { args, colors } }, template: `
Slide {{ i + 1 }}
`, }), args: { height: 400, cycle: true, progress: 'primary', interval: 4000, }, parameters: { docs: { source: { code: `
Slide {{ i + 1 }}
`, }, }, }, } export const WithImages: Story = { render: args => ({ components: { VCarousel, VCarouselItem }, setup() { const images = [ 'https://picsum.photos/800/400?random=1', 'https://picsum.photos/800/400?random=2', 'https://picsum.photos/800/400?random=3', ] return { args, images } }, template: ` `, }), args: { height: 400, }, parameters: { docs: { source: { code: ` `, }, }, }, } export const CustomHeight: Story = { render: args => ({ components: { VCarousel, VCarouselItem }, setup() { const colors = ['primary', 'secondary', 'success'] return { args, colors } }, template: `
Slide {{ i + 1 }}
`, }), args: { height: 600, }, parameters: { docs: { source: { code: `
Slide {{ i + 1 }}
`, }, }, }, } export const WithCustomSlots: Story = { render: args => ({ components: { VCarousel, VCarouselItem, VCard, VCardTitle, VCardText, VBtn }, setup() { return { args } }, template: `
Slide 1

Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée à titre provisoire pour calibrer une mise en page, le texte définitif venant remplacer le faux-texte dès qu'il est prêt ou que la mise en page est achevée. Généralement, on utilise un texte en faux latin, le Lorem ipsum ou Lipsum.

Bouton slide 1
Slide 2

Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée à titre provisoire pour calibrer une mise en page, le texte définitif venant remplacer le faux-texte dès qu'il est prêt ou que la mise en page est achevée. Généralement, on utilise un texte en faux latin, le Lorem ipsum ou Lipsum.

Bouton slide 2
Slide 3

Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée à titre provisoire pour calibrer une mise en page, le texte définitif venant remplacer le faux-texte dès qu'il est prêt ou que la mise en page est achevée. Généralement, on utilise un texte en faux latin, le Lorem ipsum ou Lipsum.

Bouton slide 3
`, }), args: { height: 500, }, parameters: { docs: { source: { code: ` `, }, }, }, }