import type { Meta, StoryObj } from '@storybook/react-webpack5'; import { userEvent } from 'storybook/test'; import { useState } from 'react'; import { withVariantConfig } from '../../.storybook/helpers'; import Chips, { type ChipValue } from './Chips'; export default { component: Chips, title: 'Actions/Chips/Tests', tags: ['!autodocs', '!manifest'], } satisfies Meta; type Story = StoryObj; const wait = async (ms: number) => new Promise((resolve) => { setTimeout(resolve, ms); }); const filterChips = [ { value: 'all', label: 'All' }, { value: 'accounting', label: 'Accounting' }, { value: 'payroll', label: 'Payroll' }, { value: 'payments', label: 'Payments' }, ]; const choiceChips = [ { value: 100, label: '100 GBP' }, { value: 200, label: '200 GBP' }, { value: 300, label: '300 GBP' }, { value: 500, label: '500 GBP+' }, ]; /** Filter and choice chips across all themes. */ export const Variants: Story = { render: function Render() { const [filterSelected, setFilterSelected] = useState([ 'accounting', 'payments', ]); const [choiceSelected, setChoiceSelected] = useState(300); return (
{ setFilterSelected((prev) => isEnabled ? [...prev, selectedValue] : prev.filter((v) => v !== selectedValue), ); }} /> setChoiceSelected(selectedValue)} />
); }, ...withVariantConfig(['default', 'dark', 'bright-green', 'forest-green']), }; /** * Tab moves between chips. Enter or Space toggles selection. */ export const ChoiceKeyboardInteraction: Story = { render: function Render() { const [selected, setSelected] = useState(300); return ( setSelected(selectedValue)} /> ); }, play: async () => { await userEvent.tab(); await wait(400); await userEvent.tab(); await wait(400); await userEvent.keyboard('{Enter}'); }, }; /** * Tab moves between chips. Enter or Space toggles selection. */ export const FilterKeyboardInteraction: Story = { render: function Render() { const [selected, setSelected] = useState(['accounting']); return ( { setSelected((prev) => isEnabled ? [...prev, selectedValue] : prev.filter((v) => v !== selectedValue), ); }} /> ); }, play: async () => { await userEvent.tab(); await wait(400); await userEvent.tab(); await wait(400); await userEvent.tab(); await wait(400); await userEvent.keyboard('{Enter}'); }, }; /** Filter and choice chips in right-to-left layout. */ export const RTL: Story = { render: function Render() { const [filterSelected, setFilterSelected] = useState([ 'accounting', 'payments', ]); const [choiceSelected, setChoiceSelected] = useState(300); return (
{ setFilterSelected((prev) => isEnabled ? [...prev, selectedValue] : prev.filter((v) => v !== selectedValue), ); }} /> setChoiceSelected(selectedValue)} />
); }, ...withVariantConfig(['rtl']), }; /** Filter chips at 400% zoom for accessibility testing. */ export const Zoom400: Story = { render: function Render() { const [selected, setSelected] = useState(['accounting']); return ( { setSelected((prev) => isEnabled ? [...prev, selectedValue] : prev.filter((v) => v !== selectedValue), ); }} /> ); }, ...withVariantConfig(['400%']), };