@mindlogic-ai/logician-ui 5.0.0-alpha.2 → 5.0.0-alpha.20
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.
- package/README.md +1 -0
- package/dist/components/Avatar/Avatar.d.ts +68 -11
- package/dist/components/Avatar/Avatar.d.ts.map +1 -1
- package/dist/components/Avatar/Avatar.js +41 -5
- package/dist/components/Avatar/Avatar.js.map +1 -1
- package/dist/components/Avatar/Avatar.mjs +40 -5
- package/dist/components/Avatar/Avatar.mjs.map +1 -1
- package/dist/components/Avatar/index.d.ts +2 -2
- package/dist/components/Avatar/index.d.ts.map +1 -1
- package/dist/components/Badge/Badge.d.ts.map +1 -1
- package/dist/components/Badge/Badge.js +5 -3
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Badge/Badge.mjs +5 -3
- package/dist/components/Badge/Badge.mjs.map +1 -1
- package/dist/components/Badge/Badge.types.d.ts +7 -5
- package/dist/components/Badge/Badge.types.d.ts.map +1 -1
- package/dist/components/Banner/Banner.types.d.ts +24 -1
- package/dist/components/Banner/Banner.types.d.ts.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.styles.d.ts +2 -2
- package/dist/components/Button/Button.d.ts.map +1 -1
- package/dist/components/Button/Button.js +31 -3
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Button/Button.mjs +31 -3
- package/dist/components/Button/Button.mjs.map +1 -1
- package/dist/components/Button/Button.types.d.ts +38 -1
- package/dist/components/Button/Button.types.d.ts.map +1 -1
- package/dist/components/Card/Card.types.d.ts +12 -0
- package/dist/components/Card/Card.types.d.ts.map +1 -1
- package/dist/components/CodeTabs/CodeTabs.styles.d.ts +6 -5
- package/dist/components/CodeTabs/CodeTabs.styles.d.ts.map +1 -1
- package/dist/components/CodeTabs/CodeTabs.styles.js +6 -5
- package/dist/components/CodeTabs/CodeTabs.styles.js.map +1 -1
- package/dist/components/CodeTabs/CodeTabs.styles.mjs +6 -5
- package/dist/components/CodeTabs/CodeTabs.styles.mjs.map +1 -1
- package/dist/components/ColorMode/ColorModeToggle.d.ts +7 -2
- package/dist/components/ColorMode/ColorModeToggle.d.ts.map +1 -1
- package/dist/components/ColorMode/ColorModeToggle.js +8 -3
- package/dist/components/ColorMode/ColorModeToggle.js.map +1 -1
- package/dist/components/ColorMode/ColorModeToggle.mjs +8 -3
- package/dist/components/ColorMode/ColorModeToggle.mjs.map +1 -1
- package/dist/components/Confetti/Confetti.types.d.ts +5 -1
- package/dist/components/Confetti/Confetti.types.d.ts.map +1 -1
- package/dist/components/Confetti/confettiColors.d.ts +5 -5
- package/dist/components/Confetti/confettiColors.js +5 -5
- package/dist/components/Confetti/confettiColors.mjs +5 -5
- package/dist/components/ErrorFallback/ErrorFallback.types.d.ts +6 -0
- package/dist/components/ErrorFallback/ErrorFallback.types.d.ts.map +1 -1
- package/dist/components/Form/FormModalFooter/FormModalFooter.d.ts +1 -1
- package/dist/components/Form/FormModalFooter/FormModalFooter.d.ts.map +1 -1
- package/dist/components/Form/FormModalFooter/FormModalFooter.js +2 -2
- package/dist/components/Form/FormModalFooter/FormModalFooter.js.map +1 -1
- package/dist/components/Form/FormModalFooter/FormModalFooter.mjs +2 -2
- package/dist/components/Form/FormModalFooter/FormModalFooter.mjs.map +1 -1
- package/dist/components/Form/FormModalFooter/FormModalFooter.types.d.ts +11 -1
- package/dist/components/Form/FormModalFooter/FormModalFooter.types.d.ts.map +1 -1
- package/dist/components/Form/FormSection/CollapsibleFormSection.js +1 -0
- package/dist/components/Form/FormSection/CollapsibleFormSection.js.map +1 -1
- package/dist/components/Form/FormSection/CollapsibleFormSection.mjs +1 -0
- package/dist/components/Form/FormSection/CollapsibleFormSection.mjs.map +1 -1
- package/dist/components/Input/Input.d.ts.map +1 -1
- package/dist/components/Input/Input.js +4 -0
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/Input/Input.mjs +4 -0
- package/dist/components/Input/Input.mjs.map +1 -1
- package/dist/components/LineGraph/LineGraph.d.ts.map +1 -1
- package/dist/components/LineGraph/LineGraph.js +4 -5
- package/dist/components/LineGraph/LineGraph.js.map +1 -1
- package/dist/components/LineGraph/LineGraph.mjs +5 -6
- package/dist/components/LineGraph/LineGraph.mjs.map +1 -1
- package/dist/components/LineGraph/LineGraph.types.d.ts +12 -2
- package/dist/components/LineGraph/LineGraph.types.d.ts.map +1 -1
- package/dist/components/LineGraph/seriesColors.d.ts +12 -8
- package/dist/components/LineGraph/seriesColors.d.ts.map +1 -1
- package/dist/components/LineGraph/seriesColors.js +8 -7
- package/dist/components/LineGraph/seriesColors.js.map +1 -1
- package/dist/components/LineGraph/seriesColors.mjs +8 -7
- package/dist/components/LineGraph/seriesColors.mjs.map +1 -1
- package/dist/components/Masonry/Masonry.types.d.ts +8 -3
- package/dist/components/Masonry/Masonry.types.d.ts.map +1 -1
- package/dist/components/Menu/MenuItem.types.d.ts +8 -0
- package/dist/components/Menu/MenuItem.types.d.ts.map +1 -1
- package/dist/components/Modal/ModalCloseButton.d.ts +1 -1
- package/dist/components/Modal/ModalCloseButton.js +1 -1
- package/dist/components/Modal/ModalCloseButton.mjs +1 -1
- package/dist/components/NavList/NavList.d.ts +35 -0
- package/dist/components/NavList/NavList.d.ts.map +1 -0
- package/dist/components/NavList/NavList.js +113 -0
- package/dist/components/NavList/NavList.js.map +1 -0
- package/dist/components/NavList/NavList.mjs +111 -0
- package/dist/components/NavList/NavList.mjs.map +1 -0
- package/dist/components/NavList/NavList.styles.d.ts +90 -0
- package/dist/components/NavList/NavList.styles.d.ts.map +1 -0
- package/dist/components/NavList/NavList.styles.js +104 -0
- package/dist/components/NavList/NavList.styles.js.map +1 -0
- package/dist/components/NavList/NavList.styles.mjs +97 -0
- package/dist/components/NavList/NavList.styles.mjs.map +1 -0
- package/dist/components/NavList/NavList.translations.json.js +19 -0
- package/dist/components/NavList/NavList.translations.json.js.map +1 -0
- package/dist/components/NavList/NavList.translations.json.mjs +14 -0
- package/dist/components/NavList/NavList.translations.json.mjs.map +1 -0
- package/dist/components/NavList/NavList.types.d.ts +140 -0
- package/dist/components/NavList/NavList.types.d.ts.map +1 -0
- package/dist/components/NavList/NavListContext.d.ts +30 -0
- package/dist/components/NavList/NavListContext.d.ts.map +1 -0
- package/dist/components/NavList/NavListContext.js +16 -0
- package/dist/components/NavList/NavListContext.js.map +1 -0
- package/dist/components/NavList/NavListContext.mjs +13 -0
- package/dist/components/NavList/NavListContext.mjs.map +1 -0
- package/dist/components/NavList/NavListGroup.d.ts +31 -0
- package/dist/components/NavList/NavListGroup.d.ts.map +1 -0
- package/dist/components/NavList/NavListGroup.js +115 -0
- package/dist/components/NavList/NavListGroup.js.map +1 -0
- package/dist/components/NavList/NavListGroup.mjs +113 -0
- package/dist/components/NavList/NavListGroup.mjs.map +1 -0
- package/dist/components/NavList/NavListItem.d.ts +16 -0
- package/dist/components/NavList/NavListItem.d.ts.map +1 -0
- package/dist/components/NavList/NavListItem.js +284 -0
- package/dist/components/NavList/NavListItem.js.map +1 -0
- package/dist/components/NavList/NavListItem.mjs +282 -0
- package/dist/components/NavList/NavListItem.mjs.map +1 -0
- package/dist/components/NavList/NavListSkeleton.d.ts +17 -0
- package/dist/components/NavList/NavListSkeleton.d.ts.map +1 -0
- package/dist/components/NavList/NavListSkeleton.js +33 -0
- package/dist/components/NavList/NavListSkeleton.js.map +1 -0
- package/dist/components/NavList/NavListSkeleton.mjs +31 -0
- package/dist/components/NavList/NavListSkeleton.mjs.map +1 -0
- package/dist/components/NavList/index.d.ts +7 -0
- package/dist/components/NavList/index.d.ts.map +1 -0
- package/dist/components/Pagination/Pagination.d.ts +11 -10
- package/dist/components/Pagination/Pagination.d.ts.map +1 -1
- package/dist/components/Pagination/Pagination.js +11 -10
- package/dist/components/Pagination/Pagination.js.map +1 -1
- package/dist/components/Pagination/Pagination.mjs +11 -10
- package/dist/components/Pagination/Pagination.mjs.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.types.d.ts +9 -0
- package/dist/components/ProgressBar/ProgressBar.types.d.ts.map +1 -1
- package/dist/components/RadialProgress/RadialProgress.types.d.ts +21 -1
- package/dist/components/RadialProgress/RadialProgress.types.d.ts.map +1 -1
- package/dist/components/SeeMoreButton/SeeMoreButton.types.d.ts +8 -0
- package/dist/components/SeeMoreButton/SeeMoreButton.types.d.ts.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.js +6 -7
- package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.mjs +6 -7
- package/dist/components/SegmentedControl/SegmentedControl.mjs.map +1 -1
- package/dist/components/SegmentedProgressBar/SegmentedProgressBar.types.d.ts +2 -0
- package/dist/components/SegmentedProgressBar/SegmentedProgressBar.types.d.ts.map +1 -1
- package/dist/components/Select/Combobox.d.ts +1 -1
- package/dist/components/Select/Combobox.d.ts.map +1 -1
- package/dist/components/Select/Combobox.js +9 -2
- package/dist/components/Select/Combobox.js.map +1 -1
- package/dist/components/Select/Combobox.mjs +10 -3
- package/dist/components/Select/Combobox.mjs.map +1 -1
- package/dist/components/Select/Select.d.ts +1 -1
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.js +14 -2
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Select/Select.mjs +15 -3
- package/dist/components/Select/Select.mjs.map +1 -1
- package/dist/components/Select/Select.styles.d.ts +97 -1
- package/dist/components/Select/Select.styles.d.ts.map +1 -1
- package/dist/components/Select/Select.styles.js +83 -0
- package/dist/components/Select/Select.styles.js.map +1 -1
- package/dist/components/Select/Select.styles.mjs +82 -1
- package/dist/components/Select/Select.styles.mjs.map +1 -1
- package/dist/components/Tabs/Tab/Tab.styles.d.ts +1 -1
- package/dist/components/Tabs/Tab/Tab.styles.js +1 -1
- package/dist/components/Tabs/Tab/Tab.styles.mjs +1 -1
- package/dist/components/Textarea/Textarea.d.ts.map +1 -1
- package/dist/components/Textarea/Textarea.js +4 -0
- package/dist/components/Textarea/Textarea.js.map +1 -1
- package/dist/components/Textarea/Textarea.mjs +4 -0
- package/dist/components/Textarea/Textarea.mjs.map +1 -1
- package/dist/components/Toast/Toast.styles.d.ts +6 -2
- package/dist/components/Toast/Toast.styles.d.ts.map +1 -1
- package/dist/components/Toast/Toast.styles.js +18 -10
- package/dist/components/Toast/Toast.styles.js.map +1 -1
- package/dist/components/Toast/Toast.styles.mjs +18 -10
- package/dist/components/Toast/Toast.styles.mjs.map +1 -1
- package/dist/components/Typography/Caption.d.ts.map +1 -1
- package/dist/components/Typography/Caption.js +1 -1
- package/dist/components/Typography/Caption.js.map +1 -1
- package/dist/components/Typography/Caption.mjs +1 -1
- package/dist/components/Typography/Caption.mjs.map +1 -1
- package/dist/components/Typography/H1.d.ts.map +1 -1
- package/dist/components/Typography/H1.js +1 -1
- package/dist/components/Typography/H1.js.map +1 -1
- package/dist/components/Typography/H1.mjs +1 -1
- package/dist/components/Typography/H1.mjs.map +1 -1
- package/dist/components/Typography/H2.d.ts.map +1 -1
- package/dist/components/Typography/H2.js +1 -1
- package/dist/components/Typography/H2.js.map +1 -1
- package/dist/components/Typography/H2.mjs +1 -1
- package/dist/components/Typography/H2.mjs.map +1 -1
- package/dist/components/Typography/H3.d.ts.map +1 -1
- package/dist/components/Typography/H3.js +1 -1
- package/dist/components/Typography/H3.js.map +1 -1
- package/dist/components/Typography/H3.mjs +1 -1
- package/dist/components/Typography/H3.mjs.map +1 -1
- package/dist/components/Typography/H4.d.ts.map +1 -1
- package/dist/components/Typography/H4.js +1 -1
- package/dist/components/Typography/H4.js.map +1 -1
- package/dist/components/Typography/H4.mjs +1 -1
- package/dist/components/Typography/H4.mjs.map +1 -1
- package/dist/components/Typography/H5.d.ts.map +1 -1
- package/dist/components/Typography/H5.js +1 -1
- package/dist/components/Typography/H5.js.map +1 -1
- package/dist/components/Typography/H5.mjs +1 -1
- package/dist/components/Typography/H5.mjs.map +1 -1
- package/dist/components/Typography/Link.d.ts.map +1 -1
- package/dist/components/Typography/Link.js +1 -1
- package/dist/components/Typography/Link.js.map +1 -1
- package/dist/components/Typography/Link.mjs +1 -1
- package/dist/components/Typography/Link.mjs.map +1 -1
- package/dist/components/Typography/Overline.d.ts.map +1 -1
- package/dist/components/Typography/Overline.js +1 -1
- package/dist/components/Typography/Overline.js.map +1 -1
- package/dist/components/Typography/Overline.mjs +1 -1
- package/dist/components/Typography/Overline.mjs.map +1 -1
- package/dist/components/Typography/Subtext.d.ts.map +1 -1
- package/dist/components/Typography/Subtext.js +1 -1
- package/dist/components/Typography/Subtext.js.map +1 -1
- package/dist/components/Typography/Subtext.mjs +1 -1
- package/dist/components/Typography/Subtext.mjs.map +1 -1
- package/dist/components/Typography/Subtitle.d.ts.map +1 -1
- package/dist/components/Typography/Subtitle.js +1 -1
- package/dist/components/Typography/Subtitle.js.map +1 -1
- package/dist/components/Typography/Subtitle.mjs +1 -1
- package/dist/components/Typography/Subtitle.mjs.map +1 -1
- package/dist/components/Typography/Text.d.ts.map +1 -1
- package/dist/components/Typography/Text.js +1 -1
- package/dist/components/Typography/Text.js.map +1 -1
- package/dist/components/Typography/Text.mjs +1 -1
- package/dist/components/Typography/Text.mjs.map +1 -1
- package/dist/hooks/useLanguage.d.ts +5 -0
- package/dist/hooks/useLanguage.d.ts.map +1 -1
- package/dist/hooks/useLanguage.js +7 -3
- package/dist/hooks/useLanguage.js.map +1 -1
- package/dist/hooks/useLanguage.mjs +7 -4
- package/dist/hooks/useLanguage.mjs.map +1 -1
- package/dist/hooks/useTranslate.d.ts.map +1 -1
- package/dist/hooks/useTranslate.js +8 -5
- package/dist/hooks/useTranslate.js.map +1 -1
- package/dist/hooks/useTranslate.mjs +8 -5
- package/dist/hooks/useTranslate.mjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -2
- package/dist/index.mjs.map +1 -1
- package/dist/theme/colors.d.ts +2 -2
- package/dist/theme/colors.d.ts.map +1 -1
- package/dist/theme/colors.js +54 -18
- package/dist/theme/colors.js.map +1 -1
- package/dist/theme/colors.mjs +55 -19
- package/dist/theme/colors.mjs.map +1 -1
- package/dist/theme/global.d.ts.map +1 -1
- package/dist/theme/global.js +19 -1
- package/dist/theme/global.js.map +1 -1
- package/dist/theme/global.mjs +19 -1
- package/dist/theme/global.mjs.map +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +2 -0
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/index.mjs +2 -0
- package/dist/theme/index.mjs.map +1 -1
- package/dist/theme/palette.generated.d.ts +232 -123
- package/dist/theme/palette.generated.d.ts.map +1 -1
- package/dist/theme/palette.generated.js +233 -123
- package/dist/theme/palette.generated.js.map +1 -1
- package/dist/theme/palette.generated.mjs +233 -124
- package/dist/theme/palette.generated.mjs.map +1 -1
- package/dist/theme/paletteSwatches.d.ts +20 -0
- package/dist/theme/paletteSwatches.d.ts.map +1 -1
- package/dist/theme/recipes/avatar.d.ts +30 -0
- package/dist/theme/recipes/avatar.d.ts.map +1 -0
- package/dist/theme/recipes/avatar.js +96 -0
- package/dist/theme/recipes/avatar.js.map +1 -0
- package/dist/theme/recipes/avatar.mjs +94 -0
- package/dist/theme/recipes/avatar.mjs.map +1 -0
- package/dist/translations/Defaults.translations.json.js +19 -1
- package/dist/translations/Defaults.translations.json.js.map +1 -1
- package/dist/translations/Defaults.translations.json.mjs +18 -2
- package/dist/translations/Defaults.translations.json.mjs.map +1 -1
- package/dist/utils/disabledControl.d.ts +8 -1
- package/dist/utils/disabledControl.d.ts.map +1 -1
- package/dist/utils/disabledControl.js +8 -1
- package/dist/utils/disabledControl.js.map +1 -1
- package/dist/utils/disabledControl.mjs +8 -1
- package/dist/utils/disabledControl.mjs.map +1 -1
- package/dist/utils/focusRing.d.ts +22 -0
- package/dist/utils/focusRing.d.ts.map +1 -1
- package/dist/utils/focusRing.js +22 -0
- package/dist/utils/focusRing.js.map +1 -1
- package/dist/utils/focusRing.mjs +21 -1
- package/dist/utils/focusRing.mjs.map +1 -1
- package/package.json +2 -1
- package/src/components/Accordion/Accordion.stories.tsx +85 -0
- package/src/components/Accordion/Accordion.usage.mdx +200 -0
- package/src/components/Appear/Appear.usage.mdx +107 -0
- package/src/components/Avatar/Avatar.recipe.test.tsx +176 -0
- package/src/components/Avatar/Avatar.stories.tsx +199 -24
- package/src/components/Avatar/Avatar.tsx +118 -21
- package/src/components/Avatar/Avatar.usage.mdx +185 -0
- package/src/components/Avatar/index.tsx +8 -1
- package/src/components/Badge/Badge.stories.tsx +193 -3
- package/src/components/Badge/Badge.tsx +5 -3
- package/src/components/Badge/Badge.types.ts +7 -5
- package/src/components/Badge/Badge.usage.mdx +265 -0
- package/src/components/Banner/Banner.stories.tsx +152 -2
- package/src/components/Banner/Banner.types.ts +30 -1
- package/src/components/Banner/Banner.usage.mdx +233 -0
- package/src/components/BottomSheet/BottomSheet.stories.tsx +168 -1
- package/src/components/BottomSheet/BottomSheet.test.tsx +2 -1
- package/src/components/BottomSheet/BottomSheet.usage.mdx +216 -0
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +59 -0
- package/src/components/Breadcrumb/Breadcrumb.usage.mdx +181 -0
- package/src/components/Button/Button.focusableWhenDisabled.test.tsx +218 -0
- package/src/components/Button/Button.stories.tsx +332 -3
- package/src/components/Button/Button.tsx +46 -3
- package/src/components/Button/Button.types.ts +38 -1
- package/src/components/Button/Button.usage.mdx +358 -0
- package/src/components/Button/Button.variants.test.tsx +13 -1
- package/src/components/Card/Card.stories.tsx +106 -0
- package/src/components/Card/Card.types.ts +12 -0
- package/src/components/Card/Card.usage.mdx +216 -0
- package/src/components/Checkbox/Checkbox.stories.tsx +140 -13
- package/src/components/Checkbox/Checkbox.usage.mdx +214 -0
- package/src/components/Chip/Chip.usage.mdx +78 -0
- package/src/components/Code/Code.stories.tsx +60 -0
- package/src/components/Code/Code.usage.mdx +187 -0
- package/src/components/CodeTabs/CodeTabs.stories.tsx +53 -0
- package/src/components/CodeTabs/CodeTabs.styles.ts +6 -5
- package/src/components/CodeTabs/CodeTabs.usage.mdx +176 -0
- package/src/components/Collapsible/Collapsible.stories.tsx +58 -0
- package/src/components/Collapsible/Collapsible.usage.mdx +173 -0
- package/src/components/ColorMode/ColorMode.stories.tsx +50 -0
- package/src/components/ColorMode/ColorMode.usage.mdx +135 -0
- package/src/components/ColorMode/ColorModeToggle.tsx +10 -3
- package/src/components/Confetti/Confetti.types.ts +5 -1
- package/src/components/Confetti/Confetti.usage.mdx +111 -0
- package/src/components/Confetti/confettiColors.ts +5 -5
- package/src/components/Container/Container.stories.tsx +32 -0
- package/src/components/Container/Container.usage.mdx +130 -0
- package/src/components/CopyableCode/CopyableCode.stories.tsx +62 -0
- package/src/components/CopyableCode/CopyableCode.usage.mdx +168 -0
- package/src/components/CountBadge/CountBadge.stories.tsx +69 -0
- package/src/components/CountBadge/CountBadge.usage.mdx +215 -0
- package/src/components/CountUp/CountUp.usage.mdx +107 -0
- package/src/components/DatePicker/DatePicker.usage.mdx +177 -0
- package/src/components/DatePicker/RangeDatePicker.stories.tsx +87 -3
- package/src/components/ErrorFallback/ErrorFallback.types.ts +6 -0
- package/src/components/ErrorFallback/ErrorFallback.usage.mdx +127 -0
- package/src/components/ExpandableText/ExpandableText.stories.tsx +55 -0
- package/src/components/ExpandableText/ExpandableText.usage.mdx +176 -0
- package/src/components/FileInput/FileInput.stories.tsx +38 -1
- package/src/components/FileInput/FileInput.usage.mdx +178 -0
- package/src/components/FileItem/FileItem.stories.tsx +71 -0
- package/src/components/FileItem/FileItem.usage.mdx +180 -0
- package/src/components/FileList/FileList.stories.tsx +25 -0
- package/src/components/FileList/FileList.usage.mdx +165 -0
- package/src/components/FlyTo/FlyTo.usage.mdx +99 -0
- package/src/components/Form/Form.stories.tsx +149 -0
- package/src/components/Form/Form.usage.mdx +203 -0
- package/src/components/Form/FormModalFooter/FormModalFooter.stories.tsx +1 -1
- package/src/components/Form/FormModalFooter/FormModalFooter.test.tsx +19 -1
- package/src/components/Form/FormModalFooter/FormModalFooter.tsx +2 -0
- package/src/components/Form/FormModalFooter/FormModalFooter.types.ts +11 -1
- package/src/components/FormControl/FormControl.stories.tsx +35 -0
- package/src/components/FormControl/FormControl.usage.mdx +128 -0
- package/src/components/FormIntegration/FormIntegration.usage.mdx +158 -0
- package/src/components/FormLabel/FormLabel.stories.tsx +71 -0
- package/src/components/FormLabel/FormLabel.usage.mdx +125 -0
- package/src/components/Icon/Icon.stories.tsx +61 -1
- package/src/components/Icon/Icon.usage.mdx +158 -0
- package/src/components/IconButton/IconButton.stories.tsx +213 -5
- package/src/components/IconButton/IconButton.usage.mdx +275 -0
- package/src/components/InfoSprinkle/InfoSprinkle.stories.tsx +77 -1
- package/src/components/InfoSprinkle/InfoSprinkle.usage.mdx +189 -0
- package/src/components/InlineCode/InlineCode.stories.tsx +75 -0
- package/src/components/InlineCode/InlineCode.usage.mdx +142 -0
- package/src/components/Input/Input.stories.tsx +180 -0
- package/src/components/Input/Input.tsx +4 -0
- package/src/components/Input/Input.usage.mdx +278 -0
- package/src/components/LineGraph/LineGraph.stories.tsx +112 -0
- package/src/components/LineGraph/LineGraph.tsx +4 -5
- package/src/components/LineGraph/LineGraph.types.ts +12 -2
- package/src/components/LineGraph/LineGraph.usage.mdx +186 -0
- package/src/components/LineGraph/seriesColors.test.ts +10 -9
- package/src/components/LineGraph/seriesColors.ts +18 -16
- package/src/components/Loaders/Loaders.stories.tsx +93 -0
- package/src/components/Loaders/Loaders.usage.mdx +180 -0
- package/src/components/LogicianProvider/LogicianProvider.usage.mdx +98 -0
- package/src/components/Markdown/Markdown.stories.tsx +53 -0
- package/src/components/Markdown/Markdown.usage.mdx +182 -0
- package/src/components/Masonry/Masonry.stories.tsx +63 -1
- package/src/components/Masonry/Masonry.types.ts +8 -3
- package/src/components/Masonry/Masonry.usage.mdx +142 -0
- package/src/components/MaxLengthIndicator/MaxLengthIndicator.stories.tsx +57 -0
- package/src/components/MaxLengthIndicator/MaxLengthIndicator.usage.mdx +125 -0
- package/src/components/Menu/Menu.stories.tsx +146 -2
- package/src/components/Menu/Menu.usage.mdx +238 -0
- package/src/components/Menu/MenuItem.types.ts +8 -0
- package/src/components/Modal/Modal.stories.tsx +177 -1
- package/src/components/Modal/Modal.usage.mdx +262 -0
- package/src/components/Modal/ModalCloseButton.tsx +1 -1
- package/src/components/MonthPicker/MonthPicker.stories.tsx +30 -0
- package/src/components/MonthPicker/MonthPicker.usage.mdx +191 -0
- package/src/components/NavList/NavList.stories.tsx +927 -0
- package/src/components/NavList/NavList.styles.ts +114 -0
- package/src/components/NavList/NavList.test.tsx +1306 -0
- package/src/components/NavList/NavList.translations.json +9 -0
- package/src/components/NavList/NavList.tsx +160 -0
- package/src/components/NavList/NavList.types.ts +155 -0
- package/src/components/NavList/NavList.usage.mdx +545 -0
- package/src/components/NavList/NavListContext.ts +25 -0
- package/src/components/NavList/NavListGroup.tsx +243 -0
- package/src/components/NavList/NavListItem.tsx +543 -0
- package/src/components/NavList/NavListSkeleton.tsx +57 -0
- package/src/components/NavList/index.ts +15 -0
- package/src/components/Pagination/Pagination.stories.tsx +90 -1
- package/src/components/Pagination/Pagination.tsx +11 -10
- package/src/components/Pagination/Pagination.usage.mdx +186 -0
- package/src/components/PasswordInput/PasswordInput.stories.tsx +51 -0
- package/src/components/PasswordInput/PasswordInput.usage.mdx +193 -0
- package/src/components/PinInput/PinInput.stories.tsx +91 -0
- package/src/components/PinInput/PinInput.usage.mdx +194 -0
- package/src/components/Popover/Popover.stories.tsx +104 -1
- package/src/components/Popover/Popover.usage.mdx +197 -0
- package/src/components/ProgressBar/ProgressBar.stories.tsx +92 -1
- package/src/components/ProgressBar/ProgressBar.types.ts +9 -0
- package/src/components/ProgressBar/ProgressBar.usage.mdx +210 -0
- package/src/components/Pulse/Pulse.usage.mdx +102 -0
- package/src/components/RadialProgress/RadialProgress.stories.tsx +74 -1
- package/src/components/RadialProgress/RadialProgress.types.ts +21 -1
- package/src/components/RadialProgress/RadialProgress.usage.mdx +153 -0
- package/src/components/Radio/Radio.stories.tsx +119 -0
- package/src/components/Radio/Radio.usage.mdx +187 -0
- package/src/components/Reveal/Reveal.usage.mdx +105 -0
- package/src/components/ScaledContext/ScaledContext.usage.mdx +111 -0
- package/src/components/SeeMoreButton/SeeMoreButton.stories.tsx +146 -2
- package/src/components/SeeMoreButton/SeeMoreButton.types.ts +8 -0
- package/src/components/SeeMoreButton/SeeMoreButton.usage.mdx +213 -0
- package/src/components/SegmentedControl/SegmentedControl.stories.tsx +69 -0
- package/src/components/SegmentedControl/SegmentedControl.tsx +6 -7
- package/src/components/SegmentedControl/SegmentedControl.usage.mdx +209 -0
- package/src/components/SegmentedProgressBar/SegmentedProgressBar.stories.tsx +54 -0
- package/src/components/SegmentedProgressBar/SegmentedProgressBar.types.ts +2 -0
- package/src/components/SegmentedProgressBar/SegmentedProgressBar.usage.mdx +145 -0
- package/src/components/Select/Combobox.tsx +28 -3
- package/src/components/Select/Select.clearTrigger.test.tsx +76 -0
- package/src/components/Select/Select.stories.tsx +290 -1
- package/src/components/Select/Select.styles.ts +89 -0
- package/src/components/Select/Select.tsx +28 -2
- package/src/components/Select/Select.usage.mdx +341 -0
- package/src/components/Shake/Shake.usage.mdx +107 -0
- package/src/components/Slider/Slider.stories.tsx +116 -0
- package/src/components/Slider/Slider.usage.mdx +179 -0
- package/src/components/Spinner/Spinner.stories.tsx +64 -0
- package/src/components/Spinner/Spinner.usage.mdx +136 -0
- package/src/components/SwapTransition/SwapTransition.usage.mdx +102 -0
- package/src/components/Switch/Switch.stories.tsx +131 -6
- package/src/components/Switch/Switch.usage.mdx +199 -0
- package/src/components/Table/Table.stories.tsx +159 -1
- package/src/components/Table/Table.usage.mdx +235 -0
- package/src/components/Tabs/Tab/Tab.styles.ts +1 -1
- package/src/components/Tabs/Tabs.stories.tsx +86 -0
- package/src/components/Tabs/Tabs.usage.mdx +263 -0
- package/src/components/Tag/Tag.stories.tsx +181 -4
- package/src/components/Tag/Tag.usage.mdx +257 -0
- package/src/components/Textarea/Textarea.stories.tsx +113 -0
- package/src/components/Textarea/Textarea.tsx +4 -0
- package/src/components/Textarea/Textarea.usage.mdx +186 -0
- package/src/components/Toast/Toast.stories.tsx +185 -3
- package/src/components/Toast/Toast.styles.ts +18 -10
- package/src/components/Toast/Toast.usage.mdx +265 -0
- package/src/components/Tooltip/Tooltip.stories.tsx +86 -1
- package/src/components/Tooltip/Tooltip.usage.mdx +219 -0
- package/src/components/Tree/Tree.stories.tsx +89 -0
- package/src/components/Tree/Tree.usage.mdx +207 -0
- package/src/components/Typography/Caption.tsx +0 -1
- package/src/components/Typography/H1.tsx +0 -1
- package/src/components/Typography/H2.tsx +0 -1
- package/src/components/Typography/H3.tsx +0 -1
- package/src/components/Typography/H4.tsx +0 -1
- package/src/components/Typography/H5.tsx +0 -1
- package/src/components/Typography/Link.tsx +0 -1
- package/src/components/Typography/Overline.tsx +0 -1
- package/src/components/Typography/Subtext.tsx +0 -1
- package/src/components/Typography/Subtitle.tsx +0 -1
- package/src/components/Typography/Text.tsx +0 -1
- package/src/components/Typography/Typography.stories.tsx +117 -0
- package/src/components/Typography/Typography.usage.mdx +257 -0
- package/src/components/Workflow/Workflow.usage.mdx +199 -0
- package/src/components/a11y.kwcag.test.tsx +66 -0
- package/src/components/claude.md +1 -1
- package/src/components/noRawScales.test.ts +5 -1
- package/src/foundations/BrandAssets.mdx +637 -0
- package/src/foundations/BrandAssets.stories.tsx +680 -0
- package/src/foundations/BrandColour.mdx +366 -0
- package/src/foundations/BrandColour.stories.tsx +343 -0
- package/src/guidelines/ComponentPageTemplate.mdx +84 -0
- package/src/guidelines/FeedbackActions.mdx +162 -23
- package/src/guidelines/_components/Lang.tsx +175 -0
- package/src/guidelines/_components/TokenTable.tsx +136 -0
- package/src/hooks/useLanguage.ts +8 -3
- package/src/hooks/useTranslate.test.tsx +46 -0
- package/src/hooks/useTranslate.ts +7 -5
- package/src/index.ts +7 -1
- package/src/theme/BazePalette.stories.tsx +111 -1
- package/src/theme/Palette.stories.tsx +2 -2
- package/src/theme/SemanticTokens.mdx +76 -17
- package/src/theme/claude.md +23 -9
- package/src/theme/colors.ts +71 -18
- package/src/theme/contrast.test.ts +57 -0
- package/src/theme/global.ts +20 -1
- package/src/theme/index.ts +2 -0
- package/src/theme/palette.generated.ts +233 -123
- package/src/theme/paletteSwatches.test.ts +1 -1
- package/src/theme/paletteSwatches.ts +35 -0
- package/src/theme/recipes/avatar.ts +92 -0
- package/src/translations/Defaults.translations.json +14 -0
- package/src/utils/disabledControl.ts +8 -1
- package/src/utils/focusRing.ts +23 -0
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { type ReactNode, useId, useRef, useState } from 'react';
|
|
1
2
|
import { Box, Flex, Grid, HStack, Text, VStack } from '@chakra-ui/react';
|
|
2
3
|
import { Meta, StoryObj } from '@storybook/react';
|
|
3
4
|
|
|
5
|
+
import { T } from '../../guidelines/_components/Lang';
|
|
6
|
+
import { TokenTable } from '../../guidelines/_components/TokenTable';
|
|
7
|
+
import { Card } from '../Card';
|
|
4
8
|
import { Sparkles, TrashIcon } from '../Icon';
|
|
5
|
-
import { Button, buttonVariants } from '.';
|
|
9
|
+
import { Button, buttonVariants, buttonVariantStyles } from '.';
|
|
6
10
|
import { ButtonVariant } from './Button.types';
|
|
7
11
|
|
|
8
12
|
const meta = {
|
|
@@ -12,11 +16,13 @@ const meta = {
|
|
|
12
16
|
variant: {
|
|
13
17
|
control: 'select',
|
|
14
18
|
options: buttonVariants,
|
|
15
|
-
description:
|
|
19
|
+
description:
|
|
20
|
+
'Role (fill, border and text together). `primary`: the one main action of a screen. `action`: run — black fill, coral icon. `accent`: the coloured CTA of a landing page or hero, one per view. `secondary`: an alternative or a way out. `subtle` (default): low emphasis with a shape. `ghost`: toolbars and inline actions. `danger`: confirms a destructive step.',
|
|
16
21
|
},
|
|
17
22
|
isDestructive: {
|
|
18
23
|
control: 'boolean',
|
|
19
|
-
description:
|
|
24
|
+
description:
|
|
25
|
+
'Danger-coloured label (`danger.fg`) on `secondary` / `subtle` / `ghost` for a destructive action that does not deserve a red fill. Ignored on filled roles.',
|
|
20
26
|
},
|
|
21
27
|
},
|
|
22
28
|
} satisfies Meta<typeof Button>;
|
|
@@ -257,3 +263,326 @@ export const AsLink: Story = {
|
|
|
257
263
|
</Flex>
|
|
258
264
|
),
|
|
259
265
|
};
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* `focusableWhenDisabled` keeps a disabled button reachable so it can explain
|
|
269
|
+
* itself. Tab to 결제 with the box unticked, then press it: `onClick` does not
|
|
270
|
+
* run, `onDisabledClick` moves focus to the box and the hint turns red.
|
|
271
|
+
*
|
|
272
|
+
* It is disabled by `aria-disabled="true"` instead of the native attribute, so
|
|
273
|
+
* it looks the same as the native disabled button next to it, ignores hover
|
|
274
|
+
* and press, and does not submit a form.
|
|
275
|
+
*/
|
|
276
|
+
export const FocusableWhenDisabled: Story = {
|
|
277
|
+
render: function Render() {
|
|
278
|
+
const [agreed, setAgreed] = useState(false);
|
|
279
|
+
const [nudged, setNudged] = useState(false);
|
|
280
|
+
const [paid, setPaid] = useState(0);
|
|
281
|
+
const checkboxRef = useRef<HTMLInputElement>(null);
|
|
282
|
+
const hintId = useId();
|
|
283
|
+
return (
|
|
284
|
+
<VStack align="flex-start" gap={3} p={4} maxW="360px">
|
|
285
|
+
<label style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
|
|
286
|
+
<input
|
|
287
|
+
ref={checkboxRef}
|
|
288
|
+
type="checkbox"
|
|
289
|
+
checked={agreed}
|
|
290
|
+
onChange={(event) => {
|
|
291
|
+
setAgreed(event.target.checked);
|
|
292
|
+
setNudged(false);
|
|
293
|
+
}}
|
|
294
|
+
/>
|
|
295
|
+
<Text fontSize="sm">이용 및 환불 안내에 동의합니다</Text>
|
|
296
|
+
</label>
|
|
297
|
+
{!agreed && (
|
|
298
|
+
<Text
|
|
299
|
+
id={hintId}
|
|
300
|
+
fontSize="sm"
|
|
301
|
+
color={nudged ? 'danger.fg' : 'fg.muted'}
|
|
302
|
+
>
|
|
303
|
+
안내에 동의하면 결제할 수 있습니다.
|
|
304
|
+
</Text>
|
|
305
|
+
)}
|
|
306
|
+
<HStack gap={3}>
|
|
307
|
+
<Button
|
|
308
|
+
variant="primary"
|
|
309
|
+
disabled={!agreed}
|
|
310
|
+
focusableWhenDisabled
|
|
311
|
+
aria-describedby={agreed ? undefined : hintId}
|
|
312
|
+
onDisabledClick={() => {
|
|
313
|
+
setNudged(true);
|
|
314
|
+
checkboxRef.current?.focus();
|
|
315
|
+
}}
|
|
316
|
+
onClick={() => setPaid((n) => n + 1)}
|
|
317
|
+
>
|
|
318
|
+
결제
|
|
319
|
+
</Button>
|
|
320
|
+
<Button variant="primary" disabled>
|
|
321
|
+
native disabled
|
|
322
|
+
</Button>
|
|
323
|
+
</HStack>
|
|
324
|
+
<Text fontSize="sm" color="fg.muted">
|
|
325
|
+
onClick: {paid}
|
|
326
|
+
</Text>
|
|
327
|
+
</VStack>
|
|
328
|
+
);
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
// ───────────────────────── Usage-page specimens ─────────────────────────
|
|
333
|
+
// Pulled into `Button.usage.mdx` with <Canvas of={…} />. Hidden from the
|
|
334
|
+
// sidebar (`!dev`); being stories, they type-check with the rest of the code.
|
|
335
|
+
// `tags` is written out on each story: the indexer reads CSF statically.
|
|
336
|
+
|
|
337
|
+
/** A dialog-like panel: title, one line of body, a right-aligned footer. */
|
|
338
|
+
const Panel = ({
|
|
339
|
+
title,
|
|
340
|
+
body,
|
|
341
|
+
children,
|
|
342
|
+
}: {
|
|
343
|
+
title: string;
|
|
344
|
+
body: string;
|
|
345
|
+
children: ReactNode;
|
|
346
|
+
}) => (
|
|
347
|
+
<Card p={5} maxW="420px" bg="bg.surface">
|
|
348
|
+
<Text fontWeight="bold" mb={1} color="fg.default">
|
|
349
|
+
{title}
|
|
350
|
+
</Text>
|
|
351
|
+
<Text fontSize="sm" color="fg.muted" mb={5}>
|
|
352
|
+
{body}
|
|
353
|
+
</Text>
|
|
354
|
+
<Flex gap={2} justify="flex-end">
|
|
355
|
+
{children}
|
|
356
|
+
</Flex>
|
|
357
|
+
</Card>
|
|
358
|
+
);
|
|
359
|
+
|
|
360
|
+
export const DoOnePrimary: Story = {
|
|
361
|
+
tags: ['!dev'],
|
|
362
|
+
parameters: { layout: 'padded' },
|
|
363
|
+
name: 'Usage / Do: one primary, secondary to its left',
|
|
364
|
+
render: () => (
|
|
365
|
+
<Panel title="그룹 이름 변경" body="변경한 이름은 모든 멤버에게 보입니다.">
|
|
366
|
+
<Button variant="secondary">취소</Button>
|
|
367
|
+
<Button variant="primary">저장</Button>
|
|
368
|
+
</Panel>
|
|
369
|
+
),
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
export const DontTwoPrimaries: Story = {
|
|
373
|
+
tags: ['!dev'],
|
|
374
|
+
parameters: { layout: 'padded' },
|
|
375
|
+
name: "Usage / Don't: two primaries side by side",
|
|
376
|
+
render: () => (
|
|
377
|
+
<Panel title="그룹 이름 변경" body="변경한 이름은 모든 멤버에게 보입니다.">
|
|
378
|
+
<Button variant="primary">취소</Button>
|
|
379
|
+
<Button variant="primary">저장</Button>
|
|
380
|
+
</Panel>
|
|
381
|
+
),
|
|
382
|
+
};
|
|
383
|
+
|
|
384
|
+
export const DoDangerToConfirm: Story = {
|
|
385
|
+
tags: ['!dev'],
|
|
386
|
+
parameters: { layout: 'padded' },
|
|
387
|
+
name: 'Usage / Do: danger fill only on the confirming button',
|
|
388
|
+
render: () => (
|
|
389
|
+
<Panel
|
|
390
|
+
title="챗봇을 삭제할까요?"
|
|
391
|
+
body="삭제한 챗봇과 대화 기록은 되돌릴 수 없습니다."
|
|
392
|
+
>
|
|
393
|
+
<Button variant="secondary">취소</Button>
|
|
394
|
+
<Button variant="danger">삭제</Button>
|
|
395
|
+
</Panel>
|
|
396
|
+
),
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
const ROWS = ['마케팅 챗봇', '영업 챗봇', '사내 규정 챗봇'];
|
|
400
|
+
|
|
401
|
+
const Row = ({ name, action }: { name: string; action: ReactNode }) => (
|
|
402
|
+
<Flex
|
|
403
|
+
justify="space-between"
|
|
404
|
+
align="center"
|
|
405
|
+
py={2}
|
|
406
|
+
borderBottomWidth="1px"
|
|
407
|
+
borderColor="border.subtle"
|
|
408
|
+
>
|
|
409
|
+
<Text fontSize="sm" color="fg.default">
|
|
410
|
+
{name}
|
|
411
|
+
</Text>
|
|
412
|
+
{action}
|
|
413
|
+
</Flex>
|
|
414
|
+
);
|
|
415
|
+
|
|
416
|
+
export const DoQuietDestructiveInRows: Story = {
|
|
417
|
+
tags: ['!dev'],
|
|
418
|
+
parameters: { layout: 'padded' },
|
|
419
|
+
name: 'Usage / Do: isDestructive on a quiet button in a list',
|
|
420
|
+
render: () => (
|
|
421
|
+
<Box maxW="420px">
|
|
422
|
+
{ROWS.map((name) => (
|
|
423
|
+
<Row
|
|
424
|
+
key={name}
|
|
425
|
+
name={name}
|
|
426
|
+
action={
|
|
427
|
+
<Button variant="ghost" size="sm" isDestructive>
|
|
428
|
+
<TrashIcon />
|
|
429
|
+
삭제
|
|
430
|
+
</Button>
|
|
431
|
+
}
|
|
432
|
+
/>
|
|
433
|
+
))}
|
|
434
|
+
</Box>
|
|
435
|
+
),
|
|
436
|
+
};
|
|
437
|
+
|
|
438
|
+
export const DontDangerFillInRows: Story = {
|
|
439
|
+
tags: ['!dev'],
|
|
440
|
+
parameters: { layout: 'padded' },
|
|
441
|
+
name: "Usage / Don't: a red fill on every row",
|
|
442
|
+
render: () => (
|
|
443
|
+
<Box maxW="420px">
|
|
444
|
+
{ROWS.map((name) => (
|
|
445
|
+
<Row
|
|
446
|
+
key={name}
|
|
447
|
+
name={name}
|
|
448
|
+
action={
|
|
449
|
+
<Button variant="danger" size="sm">
|
|
450
|
+
삭제
|
|
451
|
+
</Button>
|
|
452
|
+
}
|
|
453
|
+
/>
|
|
454
|
+
))}
|
|
455
|
+
</Box>
|
|
456
|
+
),
|
|
457
|
+
};
|
|
458
|
+
|
|
459
|
+
export const DoPrimaryForUpgrade: Story = {
|
|
460
|
+
tags: ['!dev'],
|
|
461
|
+
parameters: { layout: 'padded' },
|
|
462
|
+
name: 'Usage / Do: primary for upgrade and payment',
|
|
463
|
+
render: () => (
|
|
464
|
+
<Panel
|
|
465
|
+
title="크레딧이 부족합니다"
|
|
466
|
+
body="요금제를 올리면 이번 달 남은 기간에도 바로 쓸 수 있습니다."
|
|
467
|
+
>
|
|
468
|
+
<Button variant="secondary">나중에</Button>
|
|
469
|
+
<Button variant="primary">요금제 업그레이드</Button>
|
|
470
|
+
</Panel>
|
|
471
|
+
),
|
|
472
|
+
};
|
|
473
|
+
|
|
474
|
+
export const DontAccentForUpgrade: Story = {
|
|
475
|
+
tags: ['!dev'],
|
|
476
|
+
parameters: { layout: 'padded' },
|
|
477
|
+
name: "Usage / Don't: coral accent for upgrade in the product",
|
|
478
|
+
render: () => (
|
|
479
|
+
<Panel
|
|
480
|
+
title="크레딧이 부족합니다"
|
|
481
|
+
body="요금제를 올리면 이번 달 남은 기간에도 바로 쓸 수 있습니다."
|
|
482
|
+
>
|
|
483
|
+
<Button variant="secondary">나중에</Button>
|
|
484
|
+
<Button variant="accent">요금제 업그레이드</Button>
|
|
485
|
+
</Panel>
|
|
486
|
+
),
|
|
487
|
+
};
|
|
488
|
+
|
|
489
|
+
export const DoLoadingText: Story = {
|
|
490
|
+
tags: ['!dev'],
|
|
491
|
+
parameters: { layout: 'padded' },
|
|
492
|
+
name: 'Usage / Do: loadingText while the action runs',
|
|
493
|
+
render: () => (
|
|
494
|
+
<HStack gap={4}>
|
|
495
|
+
<Button variant="primary" loading loadingText="저장 중">
|
|
496
|
+
저장
|
|
497
|
+
</Button>
|
|
498
|
+
<Button variant="action" loading loadingText="실행 중">
|
|
499
|
+
<Sparkles />
|
|
500
|
+
실행
|
|
501
|
+
</Button>
|
|
502
|
+
</HStack>
|
|
503
|
+
),
|
|
504
|
+
};
|
|
505
|
+
|
|
506
|
+
export const DontSpinnerOnly: Story = {
|
|
507
|
+
tags: ['!dev'],
|
|
508
|
+
parameters: { layout: 'padded' },
|
|
509
|
+
name: "Usage / Don't: a spinner with no words",
|
|
510
|
+
render: () => (
|
|
511
|
+
<HStack gap={4}>
|
|
512
|
+
<Button variant="primary" loading>
|
|
513
|
+
저장
|
|
514
|
+
</Button>
|
|
515
|
+
</HStack>
|
|
516
|
+
),
|
|
517
|
+
};
|
|
518
|
+
|
|
519
|
+
type StateStyles = {
|
|
520
|
+
bgColor?: unknown;
|
|
521
|
+
borderColor?: unknown;
|
|
522
|
+
color?: unknown;
|
|
523
|
+
_hover?: unknown;
|
|
524
|
+
_active?: unknown;
|
|
525
|
+
};
|
|
526
|
+
|
|
527
|
+
const STATE_LABELS = {
|
|
528
|
+
bgColor: { en: 'fill', ko: '바탕' },
|
|
529
|
+
borderColor: { en: 'border', ko: '테두리' },
|
|
530
|
+
color: { en: 'label', ko: '글자' },
|
|
531
|
+
hover: { en: 'hover fill', ko: '마우스 올림' },
|
|
532
|
+
active: { en: 'pressed fill', ko: '누름' },
|
|
533
|
+
} as const;
|
|
534
|
+
|
|
535
|
+
type Use = { en: string; ko: string };
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* One row per token, listing every role and state that reads it. Read from
|
|
539
|
+
* `buttonVariantStyles`, so a recipe change shows up here on the next build.
|
|
540
|
+
*/
|
|
541
|
+
const buttonTokenRows = () => {
|
|
542
|
+
const uses = new Map<string, Use[]>();
|
|
543
|
+
const add = (token: unknown, use: Use) => {
|
|
544
|
+
if (typeof token !== 'string' || token === 'transparent') return;
|
|
545
|
+
uses.set(token, [...(uses.get(token) ?? []), use]);
|
|
546
|
+
};
|
|
547
|
+
buttonVariants.forEach((variant) => {
|
|
548
|
+
const s = buttonVariantStyles[variant] as StateStyles;
|
|
549
|
+
const label = (key: keyof typeof STATE_LABELS) => ({
|
|
550
|
+
en: `${variant} ${STATE_LABELS[key].en}`,
|
|
551
|
+
ko: `${variant} ${STATE_LABELS[key].ko}`,
|
|
552
|
+
});
|
|
553
|
+
add(s.bgColor, label('bgColor'));
|
|
554
|
+
add(s.borderColor, label('borderColor'));
|
|
555
|
+
add(s.color, label('color'));
|
|
556
|
+
add((s._hover as StateStyles | undefined)?.bgColor, label('hover'));
|
|
557
|
+
add((s._active as StateStyles | undefined)?.bgColor, label('active'));
|
|
558
|
+
});
|
|
559
|
+
add('action.iconOnSolid', { en: 'action icon', ko: 'action 아이콘' });
|
|
560
|
+
add('danger.fg', {
|
|
561
|
+
en: 'isDestructive label',
|
|
562
|
+
ko: 'isDestructive 글자',
|
|
563
|
+
});
|
|
564
|
+
add('disabled.bg', { en: 'disabled fill', ko: '비활성 바탕' });
|
|
565
|
+
add('disabled.fg', { en: 'disabled label', ko: '비활성 글자' });
|
|
566
|
+
add('disabled.fgGhost', {
|
|
567
|
+
en: 'ghost disabled label',
|
|
568
|
+
ko: 'ghost 비활성 글자',
|
|
569
|
+
});
|
|
570
|
+
add('focus.ring', { en: 'keyboard focus ring', ko: '키보드 초점 링' });
|
|
571
|
+
return [...uses].map(([token, list]) => ({
|
|
572
|
+
token,
|
|
573
|
+
use: (
|
|
574
|
+
<T
|
|
575
|
+
en={list.map((u) => u.en).join(', ')}
|
|
576
|
+
ko={list.map((u) => u.ko).join(', ')}
|
|
577
|
+
/>
|
|
578
|
+
),
|
|
579
|
+
}));
|
|
580
|
+
};
|
|
581
|
+
|
|
582
|
+
/** Every token a role reads at rest, on hover and on press. */
|
|
583
|
+
export const UsageTokens: Story = {
|
|
584
|
+
tags: ['!dev'],
|
|
585
|
+
parameters: { layout: 'padded' },
|
|
586
|
+
name: 'Usage / Tokens',
|
|
587
|
+
render: () => <TokenTable rows={buttonTokenRows()} />,
|
|
588
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { forwardRef } from 'react';
|
|
1
|
+
import { forwardRef, MouseEvent } from 'react';
|
|
2
2
|
import { Button as ChakraButton, SystemStyleObject } from '@chakra-ui/react';
|
|
3
3
|
|
|
4
|
+
import { useTranslate } from '@/hooks/useTranslate';
|
|
4
5
|
import { focusRing } from '@/utils/focusRing';
|
|
5
6
|
import { mergeCss } from '@/utils/mergeCss';
|
|
6
7
|
|
|
@@ -37,6 +38,10 @@ const ButtonImpl = forwardRef<HTMLButtonElement, ButtonProps>(
|
|
|
37
38
|
isDestructive: isDestructiveProp = false,
|
|
38
39
|
size,
|
|
39
40
|
lift,
|
|
41
|
+
disabled,
|
|
42
|
+
focusableWhenDisabled = false,
|
|
43
|
+
onDisabledClick,
|
|
44
|
+
onClick,
|
|
40
45
|
children,
|
|
41
46
|
_hover: hoverProp,
|
|
42
47
|
_active: activeProp,
|
|
@@ -49,8 +54,19 @@ const ButtonImpl = forwardRef<HTMLButtonElement, ButtonProps>(
|
|
|
49
54
|
// 4.x callers (untyped JS, `as any`) can still hand us `colorPalette` and
|
|
50
55
|
// an old variant name. Strip it so it never reaches Chakra's own recipe,
|
|
51
56
|
// and map the pair onto a 5.0 role — see `Button.legacy.ts`.
|
|
52
|
-
const {
|
|
53
|
-
|
|
57
|
+
const {
|
|
58
|
+
colorPalette: legacyPalette,
|
|
59
|
+
loadingText: loadingTextProp,
|
|
60
|
+
...rest
|
|
61
|
+
} = restWithLegacy as typeof restWithLegacy & { colorPalette?: unknown };
|
|
62
|
+
// A busy button says what it is doing: 처리 중 unless the call site names
|
|
63
|
+
// the verb (저장 중). `loadingText={null}` opts out — spinner only, and the
|
|
64
|
+
// button keeps its width.
|
|
65
|
+
const translate = useTranslate();
|
|
66
|
+
const loadingText =
|
|
67
|
+
loadingTextProp === undefined
|
|
68
|
+
? translate('processing')
|
|
69
|
+
: (loadingTextProp ?? undefined);
|
|
54
70
|
|
|
55
71
|
let variant: ButtonVariant = variantProp ?? 'subtle';
|
|
56
72
|
let isDestructive = isDestructiveProp;
|
|
@@ -67,6 +83,24 @@ const ButtonImpl = forwardRef<HTMLButtonElement, ButtonProps>(
|
|
|
67
83
|
|
|
68
84
|
const base = getButtonStyles(variant, isDestructive);
|
|
69
85
|
|
|
86
|
+
// `focusableWhenDisabled`: disabled by ARIA, not by the attribute, so the
|
|
87
|
+
// button stays focusable and can answer a press. `aria-disabled=true` is
|
|
88
|
+
// in Chakra's `_disabled` condition, so the disabled colours and cursor
|
|
89
|
+
// still apply; `data-disabled` is what `_hover` / `_active` exclude, so
|
|
90
|
+
// without it the button would still react to the pointer. `loading` keeps
|
|
91
|
+
// the native attribute (Chakra sets it) — see `focusableWhenDisabled`.
|
|
92
|
+
const softDisabled = !!disabled && focusableWhenDisabled && !rest.loading;
|
|
93
|
+
const handleClick = softDisabled
|
|
94
|
+
? (event: MouseEvent<HTMLButtonElement>) => {
|
|
95
|
+
// Also what stops a `type="submit"` button from submitting.
|
|
96
|
+
event.preventDefault();
|
|
97
|
+
// A native disabled button sends no click to its ancestors either —
|
|
98
|
+
// a clickable row around it must not run its own action.
|
|
99
|
+
event.stopPropagation();
|
|
100
|
+
onDisabledClick?.(event);
|
|
101
|
+
}
|
|
102
|
+
: onClick;
|
|
103
|
+
|
|
70
104
|
// Merged rather than spread after: each variant already owns `_hover` and
|
|
71
105
|
// `_active` for its colours, and replacing either would drop them.
|
|
72
106
|
const styles = lift
|
|
@@ -149,7 +183,16 @@ const ButtonImpl = forwardRef<HTMLButtonElement, ButtonProps>(
|
|
|
149
183
|
ref={ref}
|
|
150
184
|
data-variant={variant}
|
|
151
185
|
data-destructive={isDestructive || undefined}
|
|
186
|
+
loadingText={loadingText}
|
|
187
|
+
disabled={softDisabled ? undefined : disabled}
|
|
188
|
+
onClick={handleClick}
|
|
152
189
|
{...rest}
|
|
190
|
+
// After `rest`, so a stray `aria-disabled` / `data-disabled` from the
|
|
191
|
+
// call site or a merging `asChild` parent cannot undo it.
|
|
192
|
+
{...(softDisabled && {
|
|
193
|
+
'aria-disabled': true,
|
|
194
|
+
'data-disabled': '',
|
|
195
|
+
})}
|
|
153
196
|
// The `action` icon rule lives in `css` (a nested selector cannot be a
|
|
154
197
|
// style prop); merged so a call site's `css` adds to it.
|
|
155
198
|
css={mergeCss(base.css as SystemStyleObject | undefined, cssProp)}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ElementType } from 'react';
|
|
1
|
+
import type { ElementType, MouseEvent } from 'react';
|
|
2
2
|
import { ButtonProps as ChakraButtonProps } from '@chakra-ui/react';
|
|
3
3
|
|
|
4
4
|
// Relative, NOT `@/types/polymorphic`. Path aliases survive into the emitted
|
|
@@ -107,6 +107,43 @@ export type ButtonOwnProps = Omit<
|
|
|
107
107
|
* @default false
|
|
108
108
|
*/
|
|
109
109
|
lift?: boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Keeps a `disabled` button in the Tab order and lets it receive clicks, so
|
|
112
|
+
* the screen can say *why* it is disabled.
|
|
113
|
+
*
|
|
114
|
+
* A natively `disabled` `<button>` cannot be focused and swallows every
|
|
115
|
+
* click: a keyboard or screen reader user may never find it, and a mouse
|
|
116
|
+
* user who presses it gets no answer at all. With this prop, `disabled`
|
|
117
|
+
* renders as `aria-disabled="true"` (plus `data-disabled`) instead of the
|
|
118
|
+
* native attribute:
|
|
119
|
+
*
|
|
120
|
+
* - the disabled colours, the `not-allowed` cursor and the "no hover, no
|
|
121
|
+
* press" behaviour are the same as a native disabled button;
|
|
122
|
+
* - Tab still reaches it and the focus ring shows;
|
|
123
|
+
* - activating it (click, Enter, Space) does **not** call `onClick`, and its
|
|
124
|
+
* default action is cancelled, so a `type="submit"` button does not submit
|
|
125
|
+
* its form; the click does not bubble to ancestors; `onDisabledClick` is
|
|
126
|
+
* called instead.
|
|
127
|
+
*
|
|
128
|
+
* Only activation is blocked: other handlers (`onKeyDown`, `onPointerDown`,
|
|
129
|
+
* …) still run, as they would on any focusable element. Inside a trigger
|
|
130
|
+
* (`Menu.Trigger asChild`, `Popover.Trigger asChild`) disable the root as
|
|
131
|
+
* well. Meant for `<button>`: with `as="a"` the `href` stays, so middle-click
|
|
132
|
+
* still opens it.
|
|
133
|
+
*
|
|
134
|
+
* Has no effect unless `disabled` is set. `loading` keeps the native
|
|
135
|
+
* `disabled` — a busy button is working, not refusing.
|
|
136
|
+
*
|
|
137
|
+
* @default false
|
|
138
|
+
*/
|
|
139
|
+
focusableWhenDisabled?: boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Called when a `disabled` + `focusableWhenDisabled` button is activated
|
|
142
|
+
* (click, Enter, Space) — where `onClick` would have been. Use it to explain
|
|
143
|
+
* the reason or move focus to what is missing (an unticked consent box).
|
|
144
|
+
* Never called on a natively disabled button, and never while `loading`.
|
|
145
|
+
*/
|
|
146
|
+
onDisabledClick?: (event: MouseEvent<HTMLButtonElement>) => void;
|
|
110
147
|
};
|
|
111
148
|
|
|
112
149
|
/**
|