import type { Meta, StoryObj } from '@storybook/html'; import { Modal, type ModalOptions } from '@42/core/modal'; import { modalSnippets } from '../framework-snippets'; import '@42/styles/modal.css'; import '@42/styles/button.css'; const meta: Meta = { title: 'Core/Overlays/Modal', tags: ['autodocs'], parameters: { docs: { // Feeds Storybook's native "Show code" panel under the live example. source: { code: modalSnippets.vanilla, language: 'ts' }, }, }, argTypes: { closeOnOverlayClick: { control: 'boolean' }, closeOnEscape: { control: 'boolean' }, }, args: { closeOnOverlayClick: true, closeOnEscape: true }, render: (args) => { const wrapper = document.createElement('div'); wrapper.innerHTML = `

Headless modal

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

`; const root = wrapper.querySelector('[data-c42-modal]')!; const modal = new Modal(root, args); wrapper.querySelector('[data-open]')!.addEventListener('click', () => modal.openModal()); return wrapper; }, }; export default meta; type Story = StoryObj; export const Default: Story = {};