import type { Meta, StoryObj } from '@storybook/html'; import { Form, type FormOptions, type FormSubmitEvent } from '@42/core/form'; import '@42/styles/form.css'; const snippet = `import { Form } from '@42/core/form'; import '@42/styles/form.css'; const form = new Form(document.querySelector('[data-c42-form]')!, { mode: 'blur', validators: { pwd: (value) => (value.length >= 8 ? null : 'Use at least 8 characters.'), }, }); form.on('form:submit', (e) => console.log('valid', e.detail.values)); form.on('form:invalid', (e) => console.log('errors', e.detail.errors));`; const meta: Meta = { title: 'Core/Inputs & Forms/Form', tags: ['autodocs'], parameters: { docs: { source: { code: snippet, language: 'ts' } }, }, argTypes: { mode: { control: 'inline-radio', options: ['submit', 'blur', 'change', 'input'], }, }, args: { mode: 'blur', }, render: (args) => { const wrapper = document.createElement('div'); wrapper.style.maxWidth = '24rem'; const form = document.createElement('form'); form.dataset.c42Form = ''; form.innerHTML = `
`; const status = document.createElement('p'); status.style.fontSize = '0.8125rem'; status.style.marginBlockStart = '0.75rem'; const instance = new Form(form, args); instance.on('form:submit', (e) => { status.style.color = 'var(--c42-color-success, #16a34a)'; status.textContent = `Submitted: ${JSON.stringify(e.detail.values)}`; }); instance.on('form:invalid', () => { status.style.color = 'var(--c42-color-danger, #dc2626)'; status.textContent = 'Please fix the errors above.'; }); wrapper.append(form, status); return wrapper; }, }; export default meta; type Story = StoryObj; export const Default: Story = {}; export const ValidateOnSubmit: Story = { args: { mode: 'submit' }, };