import type { Meta, StoryObj } from '@storybook/html'; import { Drawer, type DrawerOptions } from '@42/core/drawer'; import '@42/styles/drawer.css'; import '@42/styles/button.css'; const snippet = `import { Drawer } from '@42/core/drawer'; import '@42/styles/drawer.css'; const root = document.querySelector('[data-c42-drawer]')!; const drawer = new Drawer(root, { side: 'right' }); document.querySelector('[data-open]')! .addEventListener('click', () => drawer.open()); drawer.on('drawer:open', () => console.log('opened')); drawer.on('drawer:close', () => console.log('closed'));`; const meta: Meta = { title: 'Core/Overlays/Drawer', tags: ['autodocs'], parameters: { docs: { // Feeds Storybook's native "Show code" panel under the live example. source: { code: snippet, language: 'ts' }, }, }, argTypes: { side: { control: 'radio', options: ['left', 'right', 'top', 'bottom'] }, closeOnOverlayClick: { control: 'boolean' }, closeOnEscape: { control: 'boolean' }, }, args: { side: 'right', closeOnOverlayClick: true, closeOnEscape: true }, render: (args) => { const wrapper = document.createElement('div'); wrapper.innerHTML = `

Headless drawer

Focus is trapped, scroll is locked and Escape closes the panel.

`; const root = wrapper.querySelector('[data-c42-drawer]')!; const drawer = new Drawer(root, args); wrapper .querySelector('[data-open]')! .addEventListener('click', () => drawer.open()); return wrapper; }, }; export default meta; type Story = StoryObj; export const Default: Story = {}; export const Left: Story = { args: { side: 'left' }, }; export const Top: Story = { args: { side: 'top' }, }; export const Bottom: Story = { args: { side: 'bottom' }, };