import type { Meta, StoryObj } from '@storybook/nextjs-vite'; import { useState } from 'react'; import { Button } from '../components/ui/button'; import { CheckboxBlock } from '../components/ui/checkbox-block'; const meta = { title: 'UI/CheckboxBlock', component: CheckboxBlock, parameters: { layout: 'centered', docs: { description: { component: 'A checkbox with label inside a bordered block container. Matches the ODS design system with dark theme styling.', }, }, }, tags: ['autodocs'], argTypes: { label: { control: 'text', description: 'The label text displayed next to the checkbox', }, checked: { control: 'boolean', description: 'Controlled checked state', }, defaultChecked: { control: 'boolean', description: 'Default checked state for uncontrolled usage', }, description: { control: 'text', description: 'Optional secondary description text below the label', }, disabled: { control: 'boolean', description: 'Whether the checkbox is disabled', }, onCheckedChange: { action: 'checkedChange', description: 'Callback when checked state changes', }, }, decorators: [ (Story) => ( ), ], } satisfies Meta; export default meta; type Story = StoryObj; /** * Default unchecked checkbox block. */ export const Default: Story = { args: { label: 'Checkbox Text', }, }; /** * Checkbox block matching the Figma design with "Repeat Script Run" label. */ export const RepeatScriptRun: Story = { args: { label: 'Repeat Script Run', }, }; /** * Checkbox block in checked state. */ export const Checked: Story = { args: { label: 'Checkbox Text', defaultChecked: true, }, }; /** * Disabled checkbox block. */ export const Disabled: Story = { args: { label: 'Disabled Checkbox', disabled: true, }, }; /** * Disabled and checked checkbox block. */ export const DisabledChecked: Story = { args: { label: 'Disabled Checked', disabled: true, defaultChecked: true, }, }; /** * Controlled checkbox block with state management. */ export const Controlled: Story = { args: { label: 'Controlled Checkbox', }, render: function ControlledCheckbox() { const [checked, setChecked] = useState(false); return (
Checked: {checked ? 'true' : 'false'}
); }, }; /** * Long label text demonstrating text wrapping behavior. */ export const LongLabel: Story = { args: { label: 'This is a longer checkbox label that demonstrates how the component handles extended text content', }, }; /** * Checkbox block with description text (taller h-16 variant). */ export const WithDescription: Story = { args: { label: 'Run as User', description: 'Windows Only', }, }; /** * Checkbox block with a trailing action. Interactive trailing content must * call `preventDefault` on click so the wrapping label doesn't toggle the * checkbox (see the OpenFrame customer guardrails tab for a real usage). */ export const WithTrailingAction: Story = { args: { label: 'Use the default guardrails settings', description: 'This customer follows guardrails defaults.', trailing: ( ), }, }; /** * Checkbox block with description, checked. */ export const WithDescriptionChecked: Story = { args: { label: 'Run as User', description: 'Windows Only', defaultChecked: true, }, }; /** * Checkbox block with description, disabled. */ export const WithDescriptionDisabled: Story = { args: { label: 'Run as User', description: 'Windows Only', disabled: true, }, }; /** * Error state — red border to indicate validation failure. */ export const Error: Story = { args: { label: 'Send me an SMS if my email gets caught by spam filters', description: 'I agree to receive recurring automated text messages at the phone number provided. Msg & data rates may apply.', error: 'Please agree to SMS notifications to continue.', }, }; /** * Flamingo theme (pink accent) with error state. */ export const FlamingoError: Story = { args: { label: 'Send me an SMS if my email gets caught by spam filters', description: 'I agree to receive recurring automated text messages at the phone number provided. Msg & data rates may apply.', error: 'Please agree to SMS notifications to continue.', }, decorators: [ (Story) => ( ), ], }; /** * Flamingo theme (pink accent) checked. */ export const FlamingoChecked: Story = { args: { label: 'Send me an SMS if my email gets caught by spam filters', description: 'I agree to receive recurring automated text messages at the phone number provided. Msg & data rates may apply.', defaultChecked: true, }, decorators: [ (Story) => (
), ], }; /** * All variants displayed together for comparison. */ export const AllVariants: Story = { args: { label: 'Default', }, render: () => (
), };