import type { Meta, StoryObj } from '@storybook/nextjs' import { useState } from 'react' import Checkbox from '.' // Helper function for toggling items in an array const createToggleItem = ( items: T[], setItems: (items: T[]) => void, ) => (id: string) => { setItems(items.map(item => item.id === id ? { ...item, checked: !item.checked } as T : item, )) } const meta = { title: 'Base/Data Entry/Checkbox', component: Checkbox, parameters: { layout: 'centered', docs: { description: { component: 'Checkbox component with support for checked, unchecked, indeterminate, and disabled states.', }, }, }, tags: ['autodocs'], argTypes: { checked: { control: 'boolean', description: 'Checked state', }, indeterminate: { control: 'boolean', description: 'Indeterminate state (partially checked)', }, disabled: { control: 'boolean', description: 'Disabled state', }, className: { control: 'text', description: 'Additional CSS classes', }, id: { control: 'text', description: 'HTML id attribute', }, }, } satisfies Meta export default meta type Story = StoryObj // Interactive demo wrapper const CheckboxDemo = (args: any) => { const [checked, setChecked] = useState(args.checked || false) return (
{ if (!args.disabled) { setChecked(!checked) console.log('Checkbox toggled:', !checked) } }} /> {checked ? 'Checked' : 'Unchecked'}
) } // Default unchecked export const Default: Story = { render: args => , args: { checked: false, disabled: false, indeterminate: false, }, } // Checked state export const Checked: Story = { render: args => , args: { checked: true, disabled: false, indeterminate: false, }, } // Indeterminate state export const Indeterminate: Story = { render: args => , args: { checked: false, disabled: false, indeterminate: true, }, } // Disabled unchecked export const DisabledUnchecked: Story = { render: args => , args: { checked: false, disabled: true, indeterminate: false, }, } // Disabled checked export const DisabledChecked: Story = { render: args => , args: { checked: true, disabled: true, indeterminate: false, }, } // Disabled indeterminate export const DisabledIndeterminate: Story = { render: args => , args: { checked: false, disabled: true, indeterminate: true, }, } // State comparison export const StateComparison: Story = { render: () => (
undefined} /> Unchecked
undefined} /> Checked
undefined} /> Indeterminate
undefined} /> Disabled
undefined} /> Disabled Checked
undefined} /> Disabled Indeterminate
), } // With labels const WithLabelsDemo = () => { const [items, setItems] = useState([ { id: '1', label: 'Enable notifications', checked: true }, { id: '2', label: 'Enable email updates', checked: false }, { id: '3', label: 'Enable SMS alerts', checked: false }, ]) const toggleItem = createToggleItem(items, setItems) return (
{items.map(item => (
toggleItem(item.id)} />
))}
) } export const WithLabels: Story = { render: () => , } // Select all example const SelectAllExampleDemo = () => { const [items, setItems] = useState([ { id: '1', label: 'Item 1', checked: false }, { id: '2', label: 'Item 2', checked: false }, { id: '3', label: 'Item 3', checked: false }, ]) const allChecked = items.every(item => item.checked) const someChecked = items.some(item => item.checked) const indeterminate = someChecked && !allChecked const toggleAll = () => { const newChecked = !allChecked setItems(items.map(item => ({ ...item, checked: newChecked }))) } const toggleItem = createToggleItem(items, setItems) return (
Select All
{items.map(item => (
toggleItem(item.id)} />
))}
) } export const SelectAllExample: Story = { render: () => , } // Form example const FormExampleDemo = () => { const [formData, setFormData] = useState({ terms: false, newsletter: false, privacy: false, }) return (

Account Settings

setFormData({ ...formData, terms: !formData.terms })} />

Required to continue

setFormData({ ...formData, newsletter: !formData.newsletter })} />

Get updates about new features

setFormData({ ...formData, privacy: !formData.privacy })} />

Required to continue

) } export const FormExample: Story = { render: () => , } // Task list example const TaskListExampleDemo = () => { const [tasks, setTasks] = useState([ { id: '1', title: 'Review pull request', completed: true }, { id: '2', title: 'Update documentation', completed: true }, { id: '3', title: 'Fix navigation bug', completed: false }, { id: '4', title: 'Deploy to staging', completed: false }, ]) const toggleTask = (id: string) => { setTasks(tasks.map(task => task.id === id ? { ...task, completed: !task.completed } : task, )) } const completedCount = tasks.filter(t => t.completed).length return (

Today's Tasks

{completedCount} of {tasks.length} completed
{tasks.map(task => (
toggleTask(task.id)} /> toggleTask(task.id)} > {task.title}
))}
) } export const TaskListExample: Story = { render: () => , } // Interactive playground export const Playground: Story = { render: args => , args: { checked: false, indeterminate: false, disabled: false, id: 'playground-checkbox', }, }