import type { Meta, StoryObj } from '@storybook/html';
import { Carousel, type CarouselOptions } from '@42/core/carousel';
import '@42/styles/carousel.css';
const snippet = `import { Carousel } from '@42/core/carousel';
import '@42/styles/carousel.css';
const carousel = new Carousel(document.querySelector('[data-c42-carousel]')!, {
loop: true,
autoplay: false,
swipe: true,
});
carousel.on('carousel:change', (e) => console.log(e.detail.index));`;
const COLORS = ['#4f46e5', '#0ea5e9', '#10b981', '#f59e0b'];
function build(): HTMLElement {
const root = document.createElement('div');
root.dataset.c42Carousel = '';
root.style.maxWidth = '32rem';
const slidesHtml = COLORS.map(
(c, i) =>
`
Slide ${i + 1}
`,
).join('');
root.innerHTML = `
`;
return root;
}
const meta: Meta = {
title: 'Core/Disclosure & Layout/Carousel',
tags: ['autodocs'],
parameters: {
docs: {
source: { code: snippet, language: 'ts' },
},
},
argTypes: {
loop: { control: 'boolean' },
autoplay: { control: 'boolean' },
autoplayInterval: { control: 'number' },
swipe: { control: 'boolean' },
dragFree: { control: 'boolean' },
align: { control: 'select', options: ['start', 'center', 'end'] },
slidesToScroll: { control: 'number' },
},
args: {
loop: true,
autoplay: false,
swipe: true,
},
render: (args) => {
const root = build();
new Carousel(root, args);
return root;
},
};
export default meta;
type Story = StoryObj;
export const Default: Story = {};
export const Autoplay: Story = {
args: { autoplay: true, autoplayInterval: 2500, loop: true },
};
export const NoLoop: Story = {
args: { loop: false },
};
export const MultipleSlides: Story = {
args: { align: 'start', slidesToScroll: 1 },
render: (args) => {
const root = build();
root
.querySelectorAll('[data-c42-carousel-slide]')
.forEach((slide) => (slide.style.flex = '0 0 50%'));
new Carousel(root, args);
return root;
},
};