@transferwise/components 0.0.0-experimental-4af964d → 0.0.0-experimental-04f7ce3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"Chips.js","sources":["../../src/chips/Chips.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useIntl } from 'react-intl';\n\nimport { CommonProps, AriaLabelProperty } from '../common';\n\nimport Chip from './Chip';\nimport messages from './Chips.messages';\n\nexport type ChipValue = string | number;\n\nexport type Chip = {\n value: ChipValue;\n label: string;\n};\n\nexport type ChipsProps = CommonProps &\n AriaLabelProperty & {\n /** List of chips with string labels and string/number values */\n chips: readonly Chip[];\n /** Callback which is invoked when a chip is selected or deselected */\n onChange: ({\n isEnabled,\n selectedValue,\n }: {\n isEnabled: boolean;\n selectedValue: ChipValue;\n }) => void;\n /** Used to manage which chips are selected */\n selected: ChipValue | readonly ChipValue[];\n /** Used to activate multi-selection */\n multiple?: boolean;\n };\n\nconst Chips = ({\n chips,\n onChange,\n selected,\n 'aria-label': ariaLabel,\n className,\n multiple,\n}: ChipsProps) => {\n const intl = useIntl();\n\n const isSelected = (value: ChipValue) =>\n Array.isArray(selected) ? selected.includes(value) : selected === value;\n\n const handleOnChange = (selectedValue: ChipValue, isCurrentlyEnabled: boolean) => {\n onChange({ isEnabled: !isCurrentlyEnabled, selectedValue });\n };\n\n return (\n <div\n className={clsx('np-chips d-flex', className)}\n aria-label={ariaLabel}\n role={!multiple ? 'radiogroup' : 'group'}\n >\n {chips.map((chip) => {\n const chipSelected = isSelected(chip.value);\n return (\n <Chip\n key={chip.value}\n role={!multiple ? 'radio' : 'checkbox'}\n aria-checked={chipSelected}\n value={chip.value}\n label={chip.label}\n closeButton={{\n 'aria-label': intl.formatMessage(messages.ariaLabel, { choice: chip.label }),\n }}\n className={clsx('text-xs-nowrap', {\n 'np-chip--selected': chipSelected,\n 'p-r-1': multiple && chipSelected,\n })}\n {...(multiple && chipSelected\n ? {\n onRemove: () => handleOnChange(chip.value, chipSelected),\n }\n : {\n onClick: () => handleOnChange(chip.value, chipSelected),\n onKeyPress: () => handleOnChange(chip.value, chipSelected),\n })}\n />\n );\n })}\n </div>\n );\n};\n\nexport default Chips;\n"],"names":["Chips","chips","onChange","selected","ariaLabel","className","multiple","intl","useIntl","isSelected","value","Array","isArray","includes","handleOnChange","selectedValue","isCurrentlyEnabled","isEnabled","_jsx","clsx","role","children","map","chip","chipSelected","Chip","label","closeButton","formatMessage","messages","choice","onRemove","onClick","onKeyPress"],"mappings":";;;;;;;;;;AAiCA,MAAMA,KAAK,GAAGA,CAAC;EACbC,KAAK;EACLC,QAAQ;EACRC,QAAQ;AACR,EAAA,YAAY,EAAEC,SAAS;EACvBC,SAAS;AACTC,EAAAA;AAAQ,CACG,KAAI;AACf,EAAA,MAAMC,IAAI,GAAGC,iBAAO,EAAE;EAEtB,MAAMC,UAAU,GAAIC,KAAgB,IAClCC,KAAK,CAACC,OAAO,CAACT,QAAQ,CAAC,GAAGA,QAAQ,CAACU,QAAQ,CAACH,KAAK,CAAC,GAAGP,QAAQ,KAAKO,KAAK;AAEzE,EAAA,MAAMI,cAAc,GAAGA,CAACC,aAAwB,EAAEC,kBAA2B,KAAI;AAC/Ed,IAAAA,QAAQ,CAAC;MAAEe,SAAS,EAAE,CAACD,kBAAkB;AAAED,MAAAA;AAAa,KAAE,CAAC;EAC7D,CAAC;AAED,EAAA,oBACEG,cAAA,CAAA,KAAA,EAAA;AACEb,IAAAA,SAAS,EAAEc,SAAI,CAAC,iBAAiB,EAAEd,SAAS,CAAE;AAC9C,IAAA,YAAA,EAAYD,SAAU;AACtBgB,IAAAA,IAAI,EAAE,CAACd,QAAQ,GAAG,YAAY,GAAG,OAAQ;AAAAe,IAAAA,QAAA,EAExCpB,KAAK,CAACqB,GAAG,CAAEC,IAAI,IAAI;AAClB,MAAA,MAAMC,YAAY,GAAGf,UAAU,CAACc,IAAI,CAACb,KAAK,CAAC;MAC3C,oBACEQ,cAAA,CAACO,YAAI,EAAA;AAEHL,QAAAA,IAAI,EAAE,CAACd,QAAQ,GAAG,OAAO,GAAG,UAAW;AACvC,QAAA,cAAA,EAAckB,YAAa;QAC3Bd,KAAK,EAAEa,IAAI,CAACb,KAAM;QAClBgB,KAAK,EAAEH,IAAI,CAACG,KAAM;AAClBC,QAAAA,WAAW,EAAE;UACX,YAAY,EAAEpB,IAAI,CAACqB,aAAa,CAACC,sBAAQ,CAACzB,SAAS,EAAE;YAAE0B,MAAM,EAAEP,IAAI,CAACG;WAAO;SAC3E;AACFrB,QAAAA,SAAS,EAAEc,SAAI,CAAC,gBAAgB,EAAE;AAChC,UAAA,mBAAmB,EAAEK,YAAY;UACjC,OAAO,EAAElB,QAAQ,IAAIkB;AACtB,SAAA,CAAE;QAAA,IACElB,QAAQ,IAAIkB,YAAY,GACzB;UACEO,QAAQ,EAAEA,MAAMjB,cAAc,CAACS,IAAI,CAACb,KAAK,EAAEc,YAAY;AACxD,SAAA,GACD;UACEQ,OAAO,EAAEA,MAAMlB,cAAc,CAACS,IAAI,CAACb,KAAK,EAAEc,YAAY,CAAC;UACvDS,UAAU,EAAEA,MAAMnB,cAAc,CAACS,IAAI,CAACb,KAAK,EAAEc,YAAY;SAC1D;OAAA,EAnBAD,IAAI,CAACb,KAmBH,CACP;IAEN,CAAC;AAAC,GACC,CAAC;AAEV;;;;"}
1
+ {"version":3,"file":"Chips.js","sources":["../../src/chips/Chips.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useIntl } from 'react-intl';\n\nimport { CommonProps, AriaLabelProperty } from '../common';\n\nimport Chip from './Chip';\nimport messages from './Chips.messages';\n\nexport type ChipValue = string | number;\n\nexport type Chip = {\n value: ChipValue;\n label: string;\n};\n\nexport type ChipsProps = CommonProps &\n AriaLabelProperty & {\n /** List of chips with string labels and string/number values */\n chips: readonly Chip[];\n /** Callback which is invoked when a chip is selected or deselected */\n onChange: ({\n isEnabled,\n selectedValue,\n }: {\n isEnabled: boolean;\n selectedValue: ChipValue;\n }) => void;\n /** Used to manage which chips are selected */\n selected: ChipValue | readonly ChipValue[];\n /** True turns on Filter-mode, False is Choice */\n multiple?: boolean;\n };\n\nconst Chips = ({\n chips,\n onChange,\n selected,\n 'aria-label': ariaLabel,\n className,\n multiple,\n}: ChipsProps) => {\n const intl = useIntl();\n\n const isSelected = (value: ChipValue) =>\n Array.isArray(selected) ? selected.includes(value) : selected === value;\n\n const handleOnChange = (selectedValue: ChipValue, isCurrentlyEnabled: boolean) => {\n onChange({ isEnabled: !isCurrentlyEnabled, selectedValue });\n };\n\n return (\n <div\n className={clsx('np-chips d-flex', className)}\n aria-label={ariaLabel}\n role={!multiple ? 'radiogroup' : 'group'}\n >\n {chips.map((chip) => {\n const chipSelected = isSelected(chip.value);\n return (\n <Chip\n key={chip.value}\n role={!multiple ? 'radio' : 'checkbox'}\n aria-checked={chipSelected}\n value={chip.value}\n label={chip.label}\n closeButton={{\n 'aria-label': intl.formatMessage(messages.ariaLabel, { choice: chip.label }),\n }}\n className={clsx('text-xs-nowrap', {\n 'np-chip--selected': chipSelected,\n 'p-r-1': multiple && chipSelected,\n })}\n {...(multiple && chipSelected\n ? {\n onRemove: () => handleOnChange(chip.value, chipSelected),\n }\n : {\n onClick: () => handleOnChange(chip.value, chipSelected),\n onKeyPress: () => handleOnChange(chip.value, chipSelected),\n })}\n />\n );\n })}\n </div>\n );\n};\n\nexport default Chips;\n"],"names":["Chips","chips","onChange","selected","ariaLabel","className","multiple","intl","useIntl","isSelected","value","Array","isArray","includes","handleOnChange","selectedValue","isCurrentlyEnabled","isEnabled","_jsx","clsx","role","children","map","chip","chipSelected","Chip","label","closeButton","formatMessage","messages","choice","onRemove","onClick","onKeyPress"],"mappings":";;;;;;;;;;AAiCA,MAAMA,KAAK,GAAGA,CAAC;EACbC,KAAK;EACLC,QAAQ;EACRC,QAAQ;AACR,EAAA,YAAY,EAAEC,SAAS;EACvBC,SAAS;AACTC,EAAAA;AAAQ,CACG,KAAI;AACf,EAAA,MAAMC,IAAI,GAAGC,iBAAO,EAAE;EAEtB,MAAMC,UAAU,GAAIC,KAAgB,IAClCC,KAAK,CAACC,OAAO,CAACT,QAAQ,CAAC,GAAGA,QAAQ,CAACU,QAAQ,CAACH,KAAK,CAAC,GAAGP,QAAQ,KAAKO,KAAK;AAEzE,EAAA,MAAMI,cAAc,GAAGA,CAACC,aAAwB,EAAEC,kBAA2B,KAAI;AAC/Ed,IAAAA,QAAQ,CAAC;MAAEe,SAAS,EAAE,CAACD,kBAAkB;AAAED,MAAAA;AAAa,KAAE,CAAC;EAC7D,CAAC;AAED,EAAA,oBACEG,cAAA,CAAA,KAAA,EAAA;AACEb,IAAAA,SAAS,EAAEc,SAAI,CAAC,iBAAiB,EAAEd,SAAS,CAAE;AAC9C,IAAA,YAAA,EAAYD,SAAU;AACtBgB,IAAAA,IAAI,EAAE,CAACd,QAAQ,GAAG,YAAY,GAAG,OAAQ;AAAAe,IAAAA,QAAA,EAExCpB,KAAK,CAACqB,GAAG,CAAEC,IAAI,IAAI;AAClB,MAAA,MAAMC,YAAY,GAAGf,UAAU,CAACc,IAAI,CAACb,KAAK,CAAC;MAC3C,oBACEQ,cAAA,CAACO,YAAI,EAAA;AAEHL,QAAAA,IAAI,EAAE,CAACd,QAAQ,GAAG,OAAO,GAAG,UAAW;AACvC,QAAA,cAAA,EAAckB,YAAa;QAC3Bd,KAAK,EAAEa,IAAI,CAACb,KAAM;QAClBgB,KAAK,EAAEH,IAAI,CAACG,KAAM;AAClBC,QAAAA,WAAW,EAAE;UACX,YAAY,EAAEpB,IAAI,CAACqB,aAAa,CAACC,sBAAQ,CAACzB,SAAS,EAAE;YAAE0B,MAAM,EAAEP,IAAI,CAACG;WAAO;SAC3E;AACFrB,QAAAA,SAAS,EAAEc,SAAI,CAAC,gBAAgB,EAAE;AAChC,UAAA,mBAAmB,EAAEK,YAAY;UACjC,OAAO,EAAElB,QAAQ,IAAIkB;AACtB,SAAA,CAAE;QAAA,IACElB,QAAQ,IAAIkB,YAAY,GACzB;UACEO,QAAQ,EAAEA,MAAMjB,cAAc,CAACS,IAAI,CAACb,KAAK,EAAEc,YAAY;AACxD,SAAA,GACD;UACEQ,OAAO,EAAEA,MAAMlB,cAAc,CAACS,IAAI,CAACb,KAAK,EAAEc,YAAY,CAAC;UACvDS,UAAU,EAAEA,MAAMnB,cAAc,CAACS,IAAI,CAACb,KAAK,EAAEc,YAAY;SAC1D;OAAA,EAnBAD,IAAI,CAACb,KAmBH,CACP;IAEN,CAAC;AAAC,GACC,CAAC;AAEV;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Chips.mjs","sources":["../../src/chips/Chips.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useIntl } from 'react-intl';\n\nimport { CommonProps, AriaLabelProperty } from '../common';\n\nimport Chip from './Chip';\nimport messages from './Chips.messages';\n\nexport type ChipValue = string | number;\n\nexport type Chip = {\n value: ChipValue;\n label: string;\n};\n\nexport type ChipsProps = CommonProps &\n AriaLabelProperty & {\n /** List of chips with string labels and string/number values */\n chips: readonly Chip[];\n /** Callback which is invoked when a chip is selected or deselected */\n onChange: ({\n isEnabled,\n selectedValue,\n }: {\n isEnabled: boolean;\n selectedValue: ChipValue;\n }) => void;\n /** Used to manage which chips are selected */\n selected: ChipValue | readonly ChipValue[];\n /** Used to activate multi-selection */\n multiple?: boolean;\n };\n\nconst Chips = ({\n chips,\n onChange,\n selected,\n 'aria-label': ariaLabel,\n className,\n multiple,\n}: ChipsProps) => {\n const intl = useIntl();\n\n const isSelected = (value: ChipValue) =>\n Array.isArray(selected) ? selected.includes(value) : selected === value;\n\n const handleOnChange = (selectedValue: ChipValue, isCurrentlyEnabled: boolean) => {\n onChange({ isEnabled: !isCurrentlyEnabled, selectedValue });\n };\n\n return (\n <div\n className={clsx('np-chips d-flex', className)}\n aria-label={ariaLabel}\n role={!multiple ? 'radiogroup' : 'group'}\n >\n {chips.map((chip) => {\n const chipSelected = isSelected(chip.value);\n return (\n <Chip\n key={chip.value}\n role={!multiple ? 'radio' : 'checkbox'}\n aria-checked={chipSelected}\n value={chip.value}\n label={chip.label}\n closeButton={{\n 'aria-label': intl.formatMessage(messages.ariaLabel, { choice: chip.label }),\n }}\n className={clsx('text-xs-nowrap', {\n 'np-chip--selected': chipSelected,\n 'p-r-1': multiple && chipSelected,\n })}\n {...(multiple && chipSelected\n ? {\n onRemove: () => handleOnChange(chip.value, chipSelected),\n }\n : {\n onClick: () => handleOnChange(chip.value, chipSelected),\n onKeyPress: () => handleOnChange(chip.value, chipSelected),\n })}\n />\n );\n })}\n </div>\n );\n};\n\nexport default Chips;\n"],"names":["Chips","chips","onChange","selected","ariaLabel","className","multiple","intl","useIntl","isSelected","value","Array","isArray","includes","handleOnChange","selectedValue","isCurrentlyEnabled","isEnabled","_jsx","clsx","role","children","map","chip","chipSelected","Chip","label","closeButton","formatMessage","messages","choice","onRemove","onClick","onKeyPress"],"mappings":";;;;;;AAiCA,MAAMA,KAAK,GAAGA,CAAC;EACbC,KAAK;EACLC,QAAQ;EACRC,QAAQ;AACR,EAAA,YAAY,EAAEC,SAAS;EACvBC,SAAS;AACTC,EAAAA;AAAQ,CACG,KAAI;AACf,EAAA,MAAMC,IAAI,GAAGC,OAAO,EAAE;EAEtB,MAAMC,UAAU,GAAIC,KAAgB,IAClCC,KAAK,CAACC,OAAO,CAACT,QAAQ,CAAC,GAAGA,QAAQ,CAACU,QAAQ,CAACH,KAAK,CAAC,GAAGP,QAAQ,KAAKO,KAAK;AAEzE,EAAA,MAAMI,cAAc,GAAGA,CAACC,aAAwB,EAAEC,kBAA2B,KAAI;AAC/Ed,IAAAA,QAAQ,CAAC;MAAEe,SAAS,EAAE,CAACD,kBAAkB;AAAED,MAAAA;AAAa,KAAE,CAAC;EAC7D,CAAC;AAED,EAAA,oBACEG,GAAA,CAAA,KAAA,EAAA;AACEb,IAAAA,SAAS,EAAEc,IAAI,CAAC,iBAAiB,EAAEd,SAAS,CAAE;AAC9C,IAAA,YAAA,EAAYD,SAAU;AACtBgB,IAAAA,IAAI,EAAE,CAACd,QAAQ,GAAG,YAAY,GAAG,OAAQ;AAAAe,IAAAA,QAAA,EAExCpB,KAAK,CAACqB,GAAG,CAAEC,IAAI,IAAI;AAClB,MAAA,MAAMC,YAAY,GAAGf,UAAU,CAACc,IAAI,CAACb,KAAK,CAAC;MAC3C,oBACEQ,GAAA,CAACO,IAAI,EAAA;AAEHL,QAAAA,IAAI,EAAE,CAACd,QAAQ,GAAG,OAAO,GAAG,UAAW;AACvC,QAAA,cAAA,EAAckB,YAAa;QAC3Bd,KAAK,EAAEa,IAAI,CAACb,KAAM;QAClBgB,KAAK,EAAEH,IAAI,CAACG,KAAM;AAClBC,QAAAA,WAAW,EAAE;UACX,YAAY,EAAEpB,IAAI,CAACqB,aAAa,CAACC,QAAQ,CAACzB,SAAS,EAAE;YAAE0B,MAAM,EAAEP,IAAI,CAACG;WAAO;SAC3E;AACFrB,QAAAA,SAAS,EAAEc,IAAI,CAAC,gBAAgB,EAAE;AAChC,UAAA,mBAAmB,EAAEK,YAAY;UACjC,OAAO,EAAElB,QAAQ,IAAIkB;AACtB,SAAA,CAAE;QAAA,IACElB,QAAQ,IAAIkB,YAAY,GACzB;UACEO,QAAQ,EAAEA,MAAMjB,cAAc,CAACS,IAAI,CAACb,KAAK,EAAEc,YAAY;AACxD,SAAA,GACD;UACEQ,OAAO,EAAEA,MAAMlB,cAAc,CAACS,IAAI,CAACb,KAAK,EAAEc,YAAY,CAAC;UACvDS,UAAU,EAAEA,MAAMnB,cAAc,CAACS,IAAI,CAACb,KAAK,EAAEc,YAAY;SAC1D;OAAA,EAnBAD,IAAI,CAACb,KAmBH,CACP;IAEN,CAAC;AAAC,GACC,CAAC;AAEV;;;;"}
1
+ {"version":3,"file":"Chips.mjs","sources":["../../src/chips/Chips.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useIntl } from 'react-intl';\n\nimport { CommonProps, AriaLabelProperty } from '../common';\n\nimport Chip from './Chip';\nimport messages from './Chips.messages';\n\nexport type ChipValue = string | number;\n\nexport type Chip = {\n value: ChipValue;\n label: string;\n};\n\nexport type ChipsProps = CommonProps &\n AriaLabelProperty & {\n /** List of chips with string labels and string/number values */\n chips: readonly Chip[];\n /** Callback which is invoked when a chip is selected or deselected */\n onChange: ({\n isEnabled,\n selectedValue,\n }: {\n isEnabled: boolean;\n selectedValue: ChipValue;\n }) => void;\n /** Used to manage which chips are selected */\n selected: ChipValue | readonly ChipValue[];\n /** True turns on Filter-mode, False is Choice */\n multiple?: boolean;\n };\n\nconst Chips = ({\n chips,\n onChange,\n selected,\n 'aria-label': ariaLabel,\n className,\n multiple,\n}: ChipsProps) => {\n const intl = useIntl();\n\n const isSelected = (value: ChipValue) =>\n Array.isArray(selected) ? selected.includes(value) : selected === value;\n\n const handleOnChange = (selectedValue: ChipValue, isCurrentlyEnabled: boolean) => {\n onChange({ isEnabled: !isCurrentlyEnabled, selectedValue });\n };\n\n return (\n <div\n className={clsx('np-chips d-flex', className)}\n aria-label={ariaLabel}\n role={!multiple ? 'radiogroup' : 'group'}\n >\n {chips.map((chip) => {\n const chipSelected = isSelected(chip.value);\n return (\n <Chip\n key={chip.value}\n role={!multiple ? 'radio' : 'checkbox'}\n aria-checked={chipSelected}\n value={chip.value}\n label={chip.label}\n closeButton={{\n 'aria-label': intl.formatMessage(messages.ariaLabel, { choice: chip.label }),\n }}\n className={clsx('text-xs-nowrap', {\n 'np-chip--selected': chipSelected,\n 'p-r-1': multiple && chipSelected,\n })}\n {...(multiple && chipSelected\n ? {\n onRemove: () => handleOnChange(chip.value, chipSelected),\n }\n : {\n onClick: () => handleOnChange(chip.value, chipSelected),\n onKeyPress: () => handleOnChange(chip.value, chipSelected),\n })}\n />\n );\n })}\n </div>\n );\n};\n\nexport default Chips;\n"],"names":["Chips","chips","onChange","selected","ariaLabel","className","multiple","intl","useIntl","isSelected","value","Array","isArray","includes","handleOnChange","selectedValue","isCurrentlyEnabled","isEnabled","_jsx","clsx","role","children","map","chip","chipSelected","Chip","label","closeButton","formatMessage","messages","choice","onRemove","onClick","onKeyPress"],"mappings":";;;;;;AAiCA,MAAMA,KAAK,GAAGA,CAAC;EACbC,KAAK;EACLC,QAAQ;EACRC,QAAQ;AACR,EAAA,YAAY,EAAEC,SAAS;EACvBC,SAAS;AACTC,EAAAA;AAAQ,CACG,KAAI;AACf,EAAA,MAAMC,IAAI,GAAGC,OAAO,EAAE;EAEtB,MAAMC,UAAU,GAAIC,KAAgB,IAClCC,KAAK,CAACC,OAAO,CAACT,QAAQ,CAAC,GAAGA,QAAQ,CAACU,QAAQ,CAACH,KAAK,CAAC,GAAGP,QAAQ,KAAKO,KAAK;AAEzE,EAAA,MAAMI,cAAc,GAAGA,CAACC,aAAwB,EAAEC,kBAA2B,KAAI;AAC/Ed,IAAAA,QAAQ,CAAC;MAAEe,SAAS,EAAE,CAACD,kBAAkB;AAAED,MAAAA;AAAa,KAAE,CAAC;EAC7D,CAAC;AAED,EAAA,oBACEG,GAAA,CAAA,KAAA,EAAA;AACEb,IAAAA,SAAS,EAAEc,IAAI,CAAC,iBAAiB,EAAEd,SAAS,CAAE;AAC9C,IAAA,YAAA,EAAYD,SAAU;AACtBgB,IAAAA,IAAI,EAAE,CAACd,QAAQ,GAAG,YAAY,GAAG,OAAQ;AAAAe,IAAAA,QAAA,EAExCpB,KAAK,CAACqB,GAAG,CAAEC,IAAI,IAAI;AAClB,MAAA,MAAMC,YAAY,GAAGf,UAAU,CAACc,IAAI,CAACb,KAAK,CAAC;MAC3C,oBACEQ,GAAA,CAACO,IAAI,EAAA;AAEHL,QAAAA,IAAI,EAAE,CAACd,QAAQ,GAAG,OAAO,GAAG,UAAW;AACvC,QAAA,cAAA,EAAckB,YAAa;QAC3Bd,KAAK,EAAEa,IAAI,CAACb,KAAM;QAClBgB,KAAK,EAAEH,IAAI,CAACG,KAAM;AAClBC,QAAAA,WAAW,EAAE;UACX,YAAY,EAAEpB,IAAI,CAACqB,aAAa,CAACC,QAAQ,CAACzB,SAAS,EAAE;YAAE0B,MAAM,EAAEP,IAAI,CAACG;WAAO;SAC3E;AACFrB,QAAAA,SAAS,EAAEc,IAAI,CAAC,gBAAgB,EAAE;AAChC,UAAA,mBAAmB,EAAEK,YAAY;UACjC,OAAO,EAAElB,QAAQ,IAAIkB;AACtB,SAAA,CAAE;QAAA,IACElB,QAAQ,IAAIkB,YAAY,GACzB;UACEO,QAAQ,EAAEA,MAAMjB,cAAc,CAACS,IAAI,CAACb,KAAK,EAAEc,YAAY;AACxD,SAAA,GACD;UACEQ,OAAO,EAAEA,MAAMlB,cAAc,CAACS,IAAI,CAACb,KAAK,EAAEc,YAAY,CAAC;UACvDS,UAAU,EAAEA,MAAMnB,cAAc,CAACS,IAAI,CAACb,KAAK,EAAEc,YAAY;SAC1D;OAAA,EAnBAD,IAAI,CAACb,KAmBH,CACP;IAEN,CAAC;AAAC,GACC,CAAC;AAEV;;;;"}
@@ -14,7 +14,7 @@ export type ChipsProps = CommonProps & AriaLabelProperty & {
14
14
  }) => void;
15
15
  /** Used to manage which chips are selected */
16
16
  selected: ChipValue | readonly ChipValue[];
17
- /** Used to activate multi-selection */
17
+ /** True turns on Filter-mode, False is Choice */
18
18
  multiple?: boolean;
19
19
  };
20
20
  declare const Chips: ({ chips, onChange, selected, "aria-label": ariaLabel, className, multiple, }: ChipsProps) => import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"Chips.d.ts","sourceRoot":"","sources":["../../../src/chips/Chips.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAK3D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAExC,MAAM,MAAM,IAAI,GAAG;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,WAAW,GAClC,iBAAiB,GAAG;IAClB,gEAAgE;IAChE,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,sEAAsE;IACtE,QAAQ,EAAE,CAAC,EACT,SAAS,EACT,aAAa,GACd,EAAE;QACD,SAAS,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,SAAS,CAAC;KAC1B,KAAK,IAAI,CAAC;IACX,8CAA8C;IAC9C,QAAQ,EAAE,SAAS,GAAG,SAAS,SAAS,EAAE,CAAC;IAC3C,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEJ,QAAA,MAAM,KAAK,GAAI,8EAOZ,UAAU,gCA6CZ,CAAC;AAEF,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Chips.d.ts","sourceRoot":"","sources":["../../../src/chips/Chips.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAK3D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAExC,MAAM,MAAM,IAAI,GAAG;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,WAAW,GAClC,iBAAiB,GAAG;IAClB,gEAAgE;IAChE,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,sEAAsE;IACtE,QAAQ,EAAE,CAAC,EACT,SAAS,EACT,aAAa,GACd,EAAE;QACD,SAAS,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,SAAS,CAAC;KAC1B,KAAK,IAAI,CAAC;IACX,8CAA8C;IAC9C,QAAQ,EAAE,SAAS,GAAG,SAAS,SAAS,EAAE,CAAC;IAC3C,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEJ,QAAA,MAAM,KAAK,GAAI,8EAOZ,UAAU,gCA6CZ,CAAC;AAEF,eAAe,KAAK,CAAC"}
@@ -1,10 +1,4 @@
1
1
  export type CommonProps = {
2
- /**
3
- * Space-separated list of the case-sensitive CSS classes,
4
- * most would be applied to outermost element inside the component
5
- *
6
- * @see https://github.com/transferwise/neptune-web/blob/main/rfc/0001-always-pass-classname.md
7
- */
8
2
  className?: string;
9
3
  };
10
4
  export type AriaLabelProperty = {
@@ -1 +1 @@
1
- {"version":3,"file":"commonProps.d.ts","sourceRoot":"","sources":["../../../src/common/commonProps.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,KAAK,CAAC,yBAAyB,CAAC;IACzC,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC"}
1
+ {"version":3,"file":"commonProps.d.ts","sourceRoot":"","sources":["../../../src/common/commonProps.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,KAAK,CAAC,yBAAyB,CAAC;IACzC,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-4af964d",
3
+ "version": "0.0.0-experimental-04f7ce3",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -87,8 +87,8 @@
87
87
  "storybook-addon-tag-badges": "^3.1.0",
88
88
  "storybook-addon-test-codegen": "^3.0.1",
89
89
  "@transferwise/less-config": "3.1.2",
90
- "@wise/components-theming": "1.10.1",
91
90
  "@transferwise/neptune-css": "14.27.1",
91
+ "@wise/components-theming": "1.10.1",
92
92
  "@wise/wds-configs": "0.0.0"
93
93
  },
94
94
  "peerDependencies": {
@@ -165,6 +165,7 @@ const meta: Meta<typeof Button> = {
165
165
  name: 'enum',
166
166
  value: ['lg', 'md', 'sm'],
167
167
  },
168
+ description: 'Sets the size of the button.',
168
169
  table: {
169
170
  type: {
170
171
  summary: 'ButtonSize',
@@ -176,6 +177,7 @@ const meta: Meta<typeof Button> = {
176
177
  name: 'enum',
177
178
  value: ['primary', 'secondary', 'secondary-neutral', 'tertiary'],
178
179
  },
180
+ description: 'Sets the visual hierarchy of the action.',
179
181
  table: {
180
182
  type: {
181
183
  summary: 'ButtonPriority',
@@ -195,7 +197,7 @@ const meta: Meta<typeof Button> = {
195
197
  },
196
198
  },
197
199
  disabled: {
198
- description: 'Toggles the disabled state',
200
+ description: 'Toggles the disabled state.',
199
201
  table: {
200
202
  defaultValue: { summary: 'false' },
201
203
  },
@@ -215,12 +217,13 @@ const meta: Meta<typeof Button> = {
215
217
  type: {
216
218
  name: 'string',
217
219
  },
218
- description: 'If set, the component will render as an HTML anchor.',
220
+ description: 'Renders the component as a link when provided.',
219
221
  },
220
222
  target: {
221
223
  type: {
222
224
  name: 'string',
223
225
  },
226
+ description: 'Controls where the linked document opens. Use `_blank` to open in a new tab.',
224
227
  table: {
225
228
  type: {
226
229
  summary: 'string',
@@ -248,12 +251,31 @@ const meta: Meta<typeof Button> = {
248
251
  },
249
252
  },
250
253
  children: {
254
+ description: 'Visible button label.',
251
255
  table: {
252
256
  type: {
253
257
  summary: 'ReactNode',
254
258
  },
255
259
  },
256
260
  },
261
+ id: {
262
+ description: '',
263
+ table: {
264
+ category: 'Common',
265
+ },
266
+ },
267
+ className: {
268
+ description: '',
269
+ table: {
270
+ category: 'Common',
271
+ },
272
+ },
273
+ onClick: {
274
+ description: '',
275
+ table: {
276
+ category: 'Common',
277
+ },
278
+ },
257
279
  },
258
280
  args: {
259
281
  v2: true,
@@ -1,67 +1,148 @@
1
- import { action } from 'storybook/actions';
1
+ import { useState, useEffect } from 'react';
2
+ import { fn } from 'storybook/test';
2
3
  import { Meta, StoryObj } from '@storybook/react-webpack5';
3
- import { useState } from 'react';
4
4
 
5
- import CheckboxButton from './CheckboxButton';
5
+ import { storySourceWithoutNoise } from '../../.storybook/helpers';
6
+ import CheckboxButton, { type CheckboxButtonProps } from './CheckboxButton';
7
+ import { Label } from '../label/Label';
6
8
 
9
+ /**
10
+ * Use <a href="?path=/docs/forms-checkbox--docs">Checkbox</a> component instead when pairing with a label. Only use CheckboxButton when you need a standalone checkbox (e.g. settings matrix) and provide an `aria-label`.
11
+ *
12
+ * **Design guidance**: <a href="https://wise.design/components/checkbox" target="_blank">wise.design/components/checkbox</a>
13
+ */
7
14
  export default {
8
15
  component: CheckboxButton,
9
16
  title: 'Actions/CheckboxButton',
10
17
  args: {
18
+ checked: true,
11
19
  disabled: false,
12
- onBlur: action('blur'),
13
- onClick: action('click'),
14
- onFocus: action('focus'),
20
+ indeterminate: false,
21
+ onBlur: fn(),
22
+ onChange: fn(),
23
+ onClick: fn(),
24
+ onFocus: fn(),
25
+ },
26
+ argTypes: {
27
+ 'aria-label': {
28
+ description: 'Provides the accessible name when the control has no visible text label.',
29
+ },
30
+ checked: {
31
+ description: 'Controls whether the checkbox is checked.',
32
+ },
33
+ disabled: {
34
+ description: 'Toggles the disabled state.',
35
+ },
36
+ name: {
37
+ description: 'Name submitted with the form when the checkbox is checked.',
38
+ },
39
+ value: {
40
+ description: 'Value submitted with the form when the checkbox is checked.',
41
+ },
42
+ onChange: {
43
+ description: 'Called when the checked state changes.',
44
+ },
45
+ indeterminate: {
46
+ description:
47
+ 'Sets the native mixed state — used when some (not all) child items are selected. Clicking resolves to checked; clear `indeterminate` in `onChange` to reflect the transition.',
48
+ },
49
+ defaultChecked: { description: '', table: { category: 'Common' } },
50
+ id: { description: '', table: { category: 'Common' } },
51
+ className: { description: '', table: { category: 'Common' } },
52
+ onBlur: { description: '', table: { category: 'Common' } },
53
+ onClick: { description: '', table: { category: 'Common' } },
54
+ onFocus: { description: '', table: { category: 'Common' } },
55
+ },
56
+ parameters: {
57
+ docs: { toc: true },
15
58
  },
16
59
  } satisfies Meta<typeof CheckboxButton>;
17
60
 
18
61
  type Story = StoryObj<typeof CheckboxButton>;
19
62
 
20
- export const Basic: Story = {
21
- args: {
22
- 'aria-label': 'Toggle email updates',
23
- },
24
- render: (args) => {
25
- const [checked, setChecked] = useState(true);
63
+ const withColumnLayout = (Story: () => JSX.Element) => (
64
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>
65
+ <Story />
66
+ </div>
67
+ );
26
68
 
27
- return <CheckboxButton {...args} checked={checked} onChange={() => setChecked(!checked)} />;
28
- },
29
- };
69
+ /** Interactive single checkbox — use the Controls panel to toggle `disabled` and `indeterminate`. */
70
+ export const Playground: Story = storySourceWithoutNoise({
71
+ render: function Render(args: CheckboxButtonProps) {
72
+ const [checked, setChecked] = useState(args.checked ?? true);
30
73
 
31
- /**
32
- * The `indeterminate` state is predominantly visual and should match the [native HTML checkbox
33
- * implementation](https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/indeterminate).
34
- * It is used to indicate a mixed state, where some but not all items are selected, but does not
35
- * change the `checked` state of the input itself – it remains either checked or unchecked.
36
- *
37
- * In the example below the 1st checkbox is unchecked and the 2nd checkbox is checked.
38
- */
39
- export const Indeterminate: Story = {
40
- args: {
41
- indeterminate: true,
42
- },
43
- render: (args) => {
44
- const [checked1, setChecked1] = useState<boolean | undefined>(false);
45
- const [checked2, setChecked2] = useState<boolean | undefined>(true);
74
+ useEffect(() => {
75
+ setChecked(args.checked ?? true);
76
+ }, [args.checked]);
46
77
 
47
78
  return (
48
- <>
79
+ <CheckboxButton
80
+ {...args}
81
+ aria-label="Playground checkbox"
82
+ checked={checked}
83
+ onChange={(e) => {
84
+ setChecked(e.currentTarget.checked);
85
+ args.onChange?.(e);
86
+ }}
87
+ />
88
+ );
89
+ },
90
+ });
91
+
92
+ /** Disabled state — checked and unchecked. */
93
+ export const Disabled: Story = {
94
+ decorators: [withColumnLayout],
95
+ render: (args) => (
96
+ <>
97
+ <div>
98
+ <Label htmlFor="disabled-unchecked">Disabled unchecked</Label>
99
+ <CheckboxButton
100
+ id="disabled-unchecked"
101
+ aria-label="Disabled unchecked"
102
+ checked={false}
103
+ disabled
104
+ onChange={() => {}}
105
+ />
106
+ </div>
107
+ <div>
108
+ <Label htmlFor="disabled-checked">Disabled checked</Label>
49
109
  <CheckboxButton
50
- {...args}
51
- checked={checked1}
52
- indeterminate={args.indeterminate}
53
- aria-label="Initially disabled checkbox with indeterminate state"
54
- onChange={() => setChecked1((current) => !current)}
110
+ id="disabled-checked"
111
+ aria-label="Disabled checked"
112
+ checked
113
+ disabled
114
+ onChange={() => {}}
55
115
  />
116
+ </div>
117
+ </>
118
+ ),
119
+ };
56
120
 
121
+ /** Indeterminate state — checked and unchecked. */
122
+ export const Indeterminate: Story = {
123
+ decorators: [withColumnLayout],
124
+ render: (args) => (
125
+ <>
126
+ <div>
127
+ <Label htmlFor="indeterminate-unchecked">Indeterminate (unchecked)</Label>
57
128
  <CheckboxButton
58
- {...args}
59
- checked={checked2}
60
- indeterminate={args.indeterminate}
61
- aria-label="Initially enabled checkbox with indeterminate state"
62
- onChange={() => setChecked2((current) => !current)}
129
+ id="indeterminate-unchecked"
130
+ aria-label="Indeterminate unchecked"
131
+ checked={false}
132
+ indeterminate
133
+ onChange={() => {}}
63
134
  />
64
- </>
65
- );
66
- },
135
+ </div>
136
+ <div>
137
+ <Label htmlFor="indeterminate-checked">Indeterminate (checked)</Label>
138
+ <CheckboxButton
139
+ id="indeterminate-checked"
140
+ aria-label="Indeterminate checked"
141
+ checked
142
+ indeterminate
143
+ onChange={() => {}}
144
+ />
145
+ </div>
146
+ </>
147
+ ),
67
148
  };
@@ -0,0 +1,236 @@
1
+ import React, { useState } from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react-webpack5';
3
+ import { expect, userEvent, within } from 'storybook/test';
4
+
5
+ import { withVariantConfig } from '../../.storybook/helpers';
6
+ import CheckboxButton from './CheckboxButton';
7
+
8
+ export default {
9
+ component: CheckboxButton,
10
+ title: 'Actions/CheckboxButton/Tests',
11
+ tags: ['!autodocs', '!manifest'],
12
+ } satisfies Meta<typeof CheckboxButton>;
13
+
14
+ type Story = StoryObj<typeof CheckboxButton>;
15
+
16
+ /** All checkbox states across all themes. */
17
+ export const Variants: Story = {
18
+ render: function Render() {
19
+ const [unchecked, setUnchecked] = useState(false);
20
+ const [checked, setChecked] = useState(true);
21
+ const [indeterminate, setIndeterminate] = useState(false);
22
+ return (
23
+ <div style={{ display: 'flex', gap: '16px', alignItems: 'center', padding: '16px' }}>
24
+ <CheckboxButton
25
+ aria-label="Unchecked"
26
+ checked={unchecked}
27
+ onChange={() => setUnchecked((v) => !v)}
28
+ />
29
+ <CheckboxButton
30
+ aria-label="Checked"
31
+ checked={checked}
32
+ onChange={() => setChecked((v) => !v)}
33
+ />
34
+ <CheckboxButton
35
+ aria-label="Indeterminate"
36
+ checked={indeterminate}
37
+ indeterminate
38
+ onChange={() => setIndeterminate((v) => !v)}
39
+ />
40
+ <CheckboxButton
41
+ aria-label="Disabled unchecked"
42
+ checked={false}
43
+ disabled
44
+ onChange={() => {}}
45
+ />
46
+ <CheckboxButton aria-label="Disabled checked" checked disabled onChange={() => {}} />
47
+ </div>
48
+ );
49
+ },
50
+ ...withVariantConfig(['default', 'dark', 'bright-green', 'forest-green']),
51
+ };
52
+
53
+ /**
54
+ * `Space` toggles when focused (requires `onChange`). Tab skips disabled checkboxes.
55
+ * Indeterminate resolves to checked on first `Space`, then toggles normally.
56
+ */
57
+ export const KeyboardInteraction: Story = {
58
+ render: function Render() {
59
+ const [unchecked, setUnchecked] = useState(false);
60
+ const [checked, setChecked] = useState(true);
61
+ const [indeterminate, setIndeterminate] = useState(false);
62
+ const [disabledUnchecked] = useState(false);
63
+ const [disabledChecked] = useState(true);
64
+
65
+ const row: React.CSSProperties = {
66
+ display: 'flex',
67
+ alignItems: 'center',
68
+ gap: '8px',
69
+ };
70
+
71
+ const label: React.CSSProperties = {
72
+ fontSize: '14px',
73
+ color: '#4a5568',
74
+ width: '140px',
75
+ };
76
+
77
+ return (
78
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>
79
+ <div style={row}>
80
+ <CheckboxButton
81
+ aria-label="Unchecked"
82
+ checked={unchecked}
83
+ onChange={() => setUnchecked((v: boolean) => !v)}
84
+ />
85
+ <span style={label}>Unchecked</span>
86
+ </div>
87
+ <div style={row}>
88
+ <CheckboxButton
89
+ aria-label="Checked"
90
+ checked={checked}
91
+ onChange={() => setChecked((v: boolean) => !v)}
92
+ />
93
+ <span style={label}>Checked</span>
94
+ </div>
95
+ <div style={row}>
96
+ <CheckboxButton
97
+ aria-label="Indeterminate"
98
+ checked={indeterminate}
99
+ indeterminate
100
+ onChange={() => setIndeterminate((v: boolean) => !v)}
101
+ />
102
+ <span style={label}>Indeterminate</span>
103
+ </div>
104
+ <div style={row}>
105
+ <CheckboxButton
106
+ aria-label="Disabled unchecked"
107
+ checked={disabledUnchecked}
108
+ disabled
109
+ onChange={() => {}}
110
+ />
111
+ <span style={label}>Disabled unchecked</span>
112
+ </div>
113
+ <div style={row}>
114
+ <CheckboxButton
115
+ aria-label="Disabled checked"
116
+ checked={disabledChecked}
117
+ disabled
118
+ onChange={() => {}}
119
+ />
120
+ <span style={label}>Disabled checked</span>
121
+ </div>
122
+ </div>
123
+ );
124
+ },
125
+ play: async ({ canvasElement, step }) => {
126
+ const wait = async (ms: number) =>
127
+ new Promise<void>((resolve) => {
128
+ setTimeout(resolve, ms);
129
+ });
130
+ const canvas = within(canvasElement);
131
+
132
+ await step('tab to Unchecked and toggle on then off', async () => {
133
+ await userEvent.tab();
134
+ const cb = canvas.getByRole('checkbox', { name: /^unchecked$/i });
135
+ await expect(cb).toHaveFocus();
136
+ await wait(400);
137
+ await userEvent.keyboard(' ');
138
+ await expect(cb).toBeChecked();
139
+ await wait(400);
140
+ await userEvent.keyboard(' ');
141
+ await expect(cb).not.toBeChecked();
142
+ });
143
+
144
+ await wait(400);
145
+
146
+ await step('tab to Checked and toggle off then on', async () => {
147
+ await userEvent.tab();
148
+ const cb = canvas.getByRole('checkbox', { name: /^checked$/i });
149
+ await expect(cb).toHaveFocus();
150
+ await wait(400);
151
+ await userEvent.keyboard(' ');
152
+ await expect(cb).not.toBeChecked();
153
+ await wait(400);
154
+ await userEvent.keyboard(' ');
155
+ await expect(cb).toBeChecked();
156
+ });
157
+
158
+ await wait(400);
159
+
160
+ await step('tab to Indeterminate and toggle on then off', async () => {
161
+ await userEvent.tab();
162
+ const cb = canvas.getByRole('checkbox', { name: /^indeterminate$/i });
163
+ await expect(cb).toHaveFocus();
164
+ await wait(400);
165
+ await userEvent.keyboard(' ');
166
+ await expect(cb).toBeChecked();
167
+ await wait(400);
168
+ await userEvent.keyboard(' ');
169
+ await expect(cb).not.toBeChecked();
170
+ });
171
+
172
+ await wait(400);
173
+
174
+ await step('tab skips both disabled checkboxes — focus leaves the component', async () => {
175
+ await userEvent.tab();
176
+ const disabledUnchecked = canvas.getByRole('checkbox', { name: /disabled unchecked/i });
177
+ const disabledChecked = canvas.getByRole('checkbox', { name: /disabled checked/i });
178
+ await expect(disabledUnchecked).not.toHaveFocus();
179
+ await expect(disabledChecked).not.toHaveFocus();
180
+ });
181
+ },
182
+ };
183
+
184
+ /** Base checkbox states in right-to-left layout. */
185
+ export const RTL: Story = {
186
+ render: function Render() {
187
+ const [unchecked, setUnchecked] = useState(false);
188
+ const [checked, setChecked] = useState(true);
189
+ const [indeterminate, setIndeterminate] = useState(false);
190
+ return (
191
+ <div style={{ display: 'flex', gap: '16px', alignItems: 'center', padding: '16px' }}>
192
+ <CheckboxButton
193
+ aria-label="Unchecked"
194
+ checked={unchecked}
195
+ onChange={() => setUnchecked((v) => !v)}
196
+ />
197
+ <CheckboxButton
198
+ aria-label="Checked"
199
+ checked={checked}
200
+ onChange={() => setChecked((v) => !v)}
201
+ />
202
+ <CheckboxButton
203
+ aria-label="Indeterminate"
204
+ checked={indeterminate}
205
+ indeterminate
206
+ onChange={() => setIndeterminate((v) => !v)}
207
+ />
208
+ <CheckboxButton
209
+ aria-label="Disabled unchecked"
210
+ checked={false}
211
+ disabled
212
+ onChange={() => {}}
213
+ />
214
+ <CheckboxButton aria-label="Disabled checked" checked disabled onChange={() => {}} />
215
+ </div>
216
+ );
217
+ },
218
+ ...withVariantConfig(['rtl']),
219
+ };
220
+
221
+ /** Checkbox states at 400% zoom for accessibility testing. */
222
+ export const Zoom400: Story = {
223
+ render: () => (
224
+ <div style={{ display: 'flex', gap: '16px', alignItems: 'center', padding: '16px' }}>
225
+ <CheckboxButton aria-label="Unchecked" checked={false} onChange={() => {}} />
226
+ <CheckboxButton aria-label="Checked" checked onChange={() => {}} />
227
+ <CheckboxButton
228
+ aria-label="Indeterminate"
229
+ checked={false}
230
+ indeterminate
231
+ onChange={() => {}}
232
+ />
233
+ </div>
234
+ ),
235
+ ...withVariantConfig(['400%']),
236
+ };