import type { Meta, StoryObj } from '@storybook/nextjs' import { useState } from 'react' import Switch from '.' const meta = { title: 'Base/Data Entry/Switch', component: Switch, parameters: { layout: 'centered', docs: { description: { component: 'Toggle switch component with multiple sizes (xs, sm, md, lg, l). Built on Headless UI Switch with smooth animations.', }, }, }, tags: ['autodocs'], argTypes: { size: { control: 'select', options: ['xs', 'sm', 'md', 'lg', 'l'], description: 'Switch size', }, defaultValue: { control: 'boolean', description: 'Default checked state', }, disabled: { control: 'boolean', description: 'Disabled state', }, }, } satisfies Meta export default meta type Story = StoryObj // Interactive demo wrapper const SwitchDemo = (args: any) => { const [enabled, setEnabled] = useState(args.defaultValue || false) return (
{ setEnabled(value) console.log('Switch toggled:', value) }} /> {enabled ? 'On' : 'Off'}
) } // Default state (off) export const Default: Story = { render: args => , args: { size: 'md', defaultValue: false, disabled: false, }, } // Default on export const DefaultOn: Story = { render: args => , args: { size: 'md', defaultValue: true, disabled: false, }, } // Disabled off export const DisabledOff: Story = { render: args => , args: { size: 'md', defaultValue: false, disabled: true, }, } // Disabled on export const DisabledOn: Story = { render: args => , args: { size: 'md', defaultValue: true, disabled: true, }, } // Size variations const SizeComparisonDemo = () => { const [states, setStates] = useState({ xs: false, sm: false, md: true, lg: true, l: false, }) return (
setStates({ ...states, xs: v })} /> Extra Small (xs)
setStates({ ...states, sm: v })} /> Small (sm)
setStates({ ...states, md: v })} /> Medium (md)
setStates({ ...states, l: v })} /> Large (l)
setStates({ ...states, lg: v })} /> Extra Large (lg)
) } export const SizeComparison: Story = { render: () => , } // With labels const WithLabelsDemo = () => { const [enabled, setEnabled] = useState(true) return (
Email Notifications
Receive email updates about your account
) } export const WithLabels: Story = { render: () => , } // Real-world example - Settings panel const SettingsPanelDemo = () => { const [settings, setSettings] = useState({ notifications: true, autoSave: true, darkMode: false, analytics: false, emailUpdates: true, }) const updateSetting = (key: string, value: boolean) => { setSettings({ ...settings, [key]: value }) } return (

Application Settings

Push Notifications
Receive push notifications on your device
updateSetting('notifications', v)} />
Auto-Save
Automatically save changes as you work
updateSetting('autoSave', v)} />
Dark Mode
Use dark theme for the interface
updateSetting('darkMode', v)} />
Analytics
Help us improve by sharing usage data
updateSetting('analytics', v)} />
Email Updates
Receive product updates via email
updateSetting('emailUpdates', v)} />
) } export const SettingsPanel: Story = { render: () => , } // Real-world example - Privacy controls const PrivacyControlsDemo = () => { const [privacy, setPrivacy] = useState({ profilePublic: false, showEmail: false, allowMessages: true, shareActivity: false, }) return (

Privacy Settings

Control who can see your information

Public Profile
Make your profile visible to everyone
setPrivacy({ ...privacy, profilePublic: v })} />
Show Email Address
Display your email on your profile
setPrivacy({ ...privacy, showEmail: v })} />
Allow Direct Messages
Let others send you private messages
setPrivacy({ ...privacy, allowMessages: v })} />
Share Activity
Show your recent activity to connections
setPrivacy({ ...privacy, shareActivity: v })} />
) } export const PrivacyControls: Story = { render: () => , } // Real-world example - Feature toggles const FeatureTogglesDemo = () => { const [features, setFeatures] = useState({ betaFeatures: false, experimentalUI: false, advancedMode: true, developerTools: false, }) return (

Feature Flags

๐Ÿงช
Beta Features
Access experimental functionality
setFeatures({ ...features, betaFeatures: v })} />
๐ŸŽจ
Experimental UI
Try the new interface design
setFeatures({ ...features, experimentalUI: v })} />
โšก
Advanced Mode
Show advanced configuration options
setFeatures({ ...features, advancedMode: v })} />
๐Ÿ”ง
Developer Tools
Enable debugging and inspection tools
setFeatures({ ...features, developerTools: v })} />
) } export const FeatureToggles: Story = { render: () => , } // Real-world example - Notification preferences const NotificationPreferencesDemo = () => { const [notifications, setNotifications] = useState({ email: true, push: true, sms: false, desktop: true, }) const allEnabled = Object.values(notifications).every(v => v) const someEnabled = Object.values(notifications).some(v => v) return (

Notification Channels

{allEnabled ? 'All enabled' : someEnabled ? 'Some enabled' : 'All disabled'}
๐Ÿ“ง
Email
Receive notifications via email
setNotifications({ ...notifications, email: v })} />
๐Ÿ””
Push Notifications
Mobile and browser push notifications
setNotifications({ ...notifications, push: v })} />
๐Ÿ’ฌ
SMS Messages
Receive text message notifications
setNotifications({ ...notifications, sms: v })} />
๐Ÿ’ป
Desktop Alerts
Show desktop notification popups
setNotifications({ ...notifications, desktop: v })} />
) } export const NotificationPreferences: Story = { render: () => , } // Real-world example - API access control const APIAccessControlDemo = () => { const [access, setAccess] = useState({ readAccess: true, writeAccess: true, deleteAccess: false, adminAccess: false, }) return (

API Permissions

Configure access levels for API key

โœ“ Read Access
View resources and data
setAccess({ ...access, readAccess: v })} />
โœŽ Write Access
Create and update resources
setAccess({ ...access, writeAccess: v })} />
๐Ÿ—‘ Delete Access
Remove resources permanently
setAccess({ ...access, deleteAccess: v })} />
โšก Admin Access
Full administrative privileges
setAccess({ ...access, adminAccess: v })} />
) } export const APIAccessControl: Story = { render: () => , } // Compact list with switches const CompactListDemo = () => { const [items, setItems] = useState([ { id: 1, name: 'Feature A', enabled: true }, { id: 2, name: 'Feature B', enabled: false }, { id: 3, name: 'Feature C', enabled: true }, { id: 4, name: 'Feature D', enabled: false }, { id: 5, name: 'Feature E', enabled: true }, ]) const toggleItem = (id: number) => { setItems(items.map(item => item.id === id ? { ...item, enabled: !item.enabled } : item, )) } return (

Quick Toggles

{items.map(item => (
{item.name} toggleItem(item.id)} />
))}
) } export const CompactList: Story = { render: () => , } // Interactive playground export const Playground: Story = { render: args => , args: { size: 'md', defaultValue: false, disabled: false, }, }