@newtonschool/grauity 0.0.14 → 0.1.11
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 +145 -9
- package/dist/fonts/grauity-icons.eot +0 -0
- package/dist/fonts/grauity-icons.ttf +0 -0
- package/dist/fonts/grauity-icons.woff +0 -0
- package/dist/fonts/grauity-icons.woff2 +0 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/useClickAway.d.ts +15 -0
- package/dist/hooks/useClickAway.d.ts.map +1 -0
- package/dist/hooks/useDisableBodyScroll.d.ts +7 -0
- package/dist/hooks/useDisableBodyScroll.d.ts.map +1 -0
- package/dist/hooks/useKeyboardEvent.d.ts +17 -0
- package/dist/hooks/useKeyboardEvent.d.ts.map +1 -0
- package/dist/index.d.ts +1109 -39
- package/dist/index.d.ts.map +1 -1
- package/dist/main.cjs +1 -1
- package/dist/main.cjs.map +1 -1
- package/dist/main.css +10 -1
- package/dist/main.css.map +1 -1
- package/dist/module.css +10 -1
- package/dist/module.css.map +1 -1
- package/dist/module.mjs +1 -1
- package/dist/module.mjs.map +1 -1
- package/dist/stories/atoms/Colors/FoundationColors.stories.d.ts +7 -0
- package/dist/stories/atoms/Colors/FoundationColors.stories.d.ts.map +1 -0
- package/dist/stories/atoms/Colors/index.stories.d.ts +18 -0
- package/dist/stories/atoms/Colors/index.stories.d.ts.map +1 -0
- package/dist/stories/atoms/CornerRadius/index.stories.d.ts +7 -0
- package/dist/stories/atoms/CornerRadius/index.stories.d.ts.map +1 -0
- package/dist/stories/atoms/Spacing/index.stories.d.ts +7 -0
- package/dist/stories/atoms/Spacing/index.stories.d.ts.map +1 -0
- package/dist/stories/decorators/withEnableBodyScroll.d.ts +8 -0
- package/dist/stories/decorators/withEnableBodyScroll.d.ts.map +1 -0
- package/dist/stories/decorators/withInlineContainer.d.ts +15 -0
- package/dist/stories/decorators/withInlineContainer.d.ts.map +1 -0
- package/dist/stories/elements/Alert/Gallery.stories.d.ts +30 -0
- package/dist/stories/elements/Alert/Gallery.stories.d.ts.map +1 -0
- package/dist/stories/elements/Alert/index.stories.d.ts +30 -0
- package/dist/stories/elements/Alert/index.stories.d.ts.map +1 -0
- package/dist/stories/elements/AlertBanner/Gallery.stories.d.ts +33 -0
- package/dist/stories/elements/AlertBanner/Gallery.stories.d.ts.map +1 -0
- package/dist/stories/elements/AlertBanner/index.stories.d.ts +30 -0
- package/dist/stories/elements/AlertBanner/index.stories.d.ts.map +1 -0
- package/dist/stories/elements/Button/Gallery.stories.d.ts +10 -0
- package/dist/stories/elements/Button/Gallery.stories.d.ts.map +1 -0
- package/dist/stories/elements/Button/index.stories.d.ts +9 -0
- package/dist/stories/elements/Button/index.stories.d.ts.map +1 -0
- package/dist/stories/elements/Icon/index.stories.d.ts +14 -0
- package/dist/stories/elements/Icon/index.stories.d.ts.map +1 -0
- package/dist/stories/elements/IconButton/Gallery.stories.d.ts +10 -0
- package/dist/stories/elements/IconButton/Gallery.stories.d.ts.map +1 -0
- package/dist/stories/elements/IconButton/index.stories.d.ts +9 -0
- package/dist/stories/elements/IconButton/index.stories.d.ts.map +1 -0
- package/dist/stories/elements/Modal/ConfirmationDialog.source.d.ts +3 -0
- package/dist/stories/elements/Modal/ConfirmationDialog.source.d.ts.map +1 -0
- package/dist/stories/elements/Modal/ConfirmationDialog.stories.d.ts +43 -0
- package/dist/stories/elements/Modal/ConfirmationDialog.stories.d.ts.map +1 -0
- package/dist/stories/elements/Modal/ConfirmationDialogWithTrigger.stories.d.ts +42 -0
- package/dist/stories/elements/Modal/ConfirmationDialogWithTrigger.stories.d.ts.map +1 -0
- package/dist/stories/elements/Modal/MultiStepModal.stories.d.ts +46 -0
- package/dist/stories/elements/Modal/MultiStepModal.stories.d.ts.map +1 -0
- package/dist/stories/elements/Modal/index.stories.d.ts +32 -0
- package/dist/stories/elements/Modal/index.stories.d.ts.map +1 -0
- package/dist/stories/elements/Modal/multiStepArgs.d.ts +4 -0
- package/dist/stories/elements/Modal/multiStepArgs.d.ts.map +1 -0
- package/dist/stories/elements/Modal/singleStepArgs.d.ts +4 -0
- package/dist/stories/elements/Modal/singleStepArgs.d.ts.map +1 -0
- package/dist/stories/elements/MultiSelectDropdown/index.stories.d.ts +11 -0
- package/dist/stories/elements/MultiSelectDropdown/index.stories.d.ts.map +1 -0
- package/dist/stories/elements/SelectDropdown/index.stories.d.ts +11 -0
- package/dist/stories/elements/SelectDropdown/index.stories.d.ts.map +1 -0
- package/dist/stories/elements/Table/Manual.source.d.ts +3 -0
- package/dist/stories/elements/Table/Manual.source.d.ts.map +1 -0
- package/dist/stories/elements/Table/Manual.stories.d.ts +54 -0
- package/dist/stories/elements/Table/Manual.stories.d.ts.map +1 -0
- package/dist/stories/elements/Table/ManualColumnNesting.source.d.ts +3 -0
- package/dist/stories/elements/Table/ManualColumnNesting.source.d.ts.map +1 -0
- package/dist/stories/elements/Table/ManualColumnNesting.stories.d.ts +53 -0
- package/dist/stories/elements/Table/ManualColumnNesting.stories.d.ts.map +1 -0
- package/dist/stories/elements/Table/index.stories.d.ts +46 -0
- package/dist/stories/elements/Table/index.stories.d.ts.map +1 -0
- package/dist/stories/elements/Table/simpleArgs.d.ts +4 -0
- package/dist/stories/elements/Table/simpleArgs.d.ts.map +1 -0
- package/dist/stories/elements/Typography/TypographyGallery.stories.d.ts +29 -0
- package/dist/stories/elements/Typography/TypographyGallery.stories.d.ts.map +1 -0
- package/dist/stories/elements/Typography/index.stories.d.ts +28 -0
- package/dist/stories/elements/Typography/index.stories.d.ts.map +1 -0
- package/dist/stories/helper-components/ColorRenderer/index.d.ts +15 -0
- package/dist/stories/helper-components/ColorRenderer/index.d.ts.map +1 -0
- package/dist/stories/helper-components/DocPageWithPlayground.d.ts +12 -0
- package/dist/stories/helper-components/DocPageWithPlayground.d.ts.map +1 -0
- package/dist/stories/helper-components/TokenBlock/index.d.ts +21 -0
- package/dist/stories/helper-components/TokenBlock/index.d.ts.map +1 -0
- package/dist/stories/helper-components/TokenBlock/index.styles.d.ts +4 -0
- package/dist/stories/helper-components/TokenBlock/index.styles.d.ts.map +1 -0
- package/dist/stories/utils/index.d.ts +82 -0
- package/dist/stories/utils/index.d.ts.map +1 -0
- package/dist/ui/core/colors/colorTypes.d.ts +1 -0
- package/dist/ui/core/colors/colorTypes.d.ts.map +1 -0
- package/dist/ui/core/colors/index.d.ts +1 -0
- package/dist/ui/core/colors/index.d.ts.map +1 -0
- package/dist/ui/core/icons/iconTags.d.ts +409 -0
- package/dist/ui/core/icons/iconTags.d.ts.map +1 -0
- package/dist/ui/core/icons/iconTypes.d.ts +399 -0
- package/dist/ui/core/icons/iconTypes.d.ts.map +1 -0
- package/dist/{core → ui/core}/icons/index.d.ts +1 -1
- package/dist/ui/core/icons/index.d.ts.map +1 -0
- package/dist/ui/core/index.d.ts +7 -0
- package/dist/ui/core/index.d.ts.map +1 -0
- package/dist/ui/core/miscellaneous-choices/index.d.ts.map +1 -0
- package/dist/ui/core/miscellaneous-choices/miscellaneousTypes.d.ts.map +1 -0
- package/dist/ui/core/sizes/index.d.ts.map +1 -0
- package/dist/ui/core/sizes/sizeTypes.d.ts +3 -0
- package/dist/ui/core/sizes/sizeTypes.d.ts.map +1 -0
- package/dist/ui/elements/Alert/Alert.d.ts +8 -0
- package/dist/ui/elements/Alert/Alert.d.ts.map +1 -0
- package/dist/ui/elements/Alert/Alert.styles.d.ts +7 -0
- package/dist/ui/elements/Alert/Alert.styles.d.ts.map +1 -0
- package/dist/ui/elements/Alert/Alert.test.d.ts +2 -0
- package/dist/ui/elements/Alert/Alert.test.d.ts.map +1 -0
- package/dist/ui/elements/Alert/constants.d.ts +140 -0
- package/dist/ui/elements/Alert/constants.d.ts.map +1 -0
- package/dist/ui/elements/Alert/index.d.ts +7 -0
- package/dist/ui/elements/Alert/index.d.ts.map +1 -0
- package/dist/ui/elements/Alert/types.d.ts +125 -0
- package/dist/ui/elements/Alert/types.d.ts.map +1 -0
- package/dist/ui/elements/Alert/utils.d.ts +1 -0
- package/dist/ui/elements/Alert/utils.d.ts.map +1 -0
- package/dist/ui/elements/AlertBanner/AlertBanner.d.ts +9 -0
- package/dist/ui/elements/AlertBanner/AlertBanner.d.ts.map +1 -0
- package/dist/ui/elements/AlertBanner/AlertBanner.styles.d.ts +4 -0
- package/dist/ui/elements/AlertBanner/AlertBanner.styles.d.ts.map +1 -0
- package/dist/ui/elements/AlertBanner/AlertBanner.test.d.ts +2 -0
- package/dist/ui/elements/AlertBanner/AlertBanner.test.d.ts.map +1 -0
- package/dist/ui/elements/AlertBanner/constants.d.ts +140 -0
- package/dist/ui/elements/AlertBanner/constants.d.ts.map +1 -0
- package/dist/ui/elements/AlertBanner/index.d.ts +7 -0
- package/dist/ui/elements/AlertBanner/index.d.ts.map +1 -0
- package/dist/ui/elements/AlertBanner/types.d.ts +111 -0
- package/dist/ui/elements/AlertBanner/types.d.ts.map +1 -0
- package/dist/ui/elements/AlertBanner/utils.d.ts +105 -0
- package/dist/ui/elements/AlertBanner/utils.d.ts.map +1 -0
- package/dist/ui/elements/Button/Button.d.ts +11 -0
- package/dist/ui/elements/Button/Button.d.ts.map +1 -0
- package/dist/ui/elements/Button/Button.styles.d.ts +4 -0
- package/dist/ui/elements/Button/Button.styles.d.ts.map +1 -0
- package/dist/ui/elements/Button/Button.test.d.ts +2 -0
- package/dist/ui/elements/Button/Button.test.d.ts.map +1 -0
- package/dist/ui/elements/Button/ButtonGroup.d.ts +11 -0
- package/dist/ui/elements/Button/ButtonGroup.d.ts.map +1 -0
- package/dist/ui/elements/Button/ButtonGroup.styles.d.ts +2 -0
- package/dist/ui/elements/Button/ButtonGroup.styles.d.ts.map +1 -0
- package/dist/ui/elements/Button/IconButton.d.ts +8 -0
- package/dist/ui/elements/Button/IconButton.d.ts.map +1 -0
- package/dist/ui/elements/Button/IconButton.test.d.ts +2 -0
- package/dist/ui/elements/Button/IconButton.test.d.ts.map +1 -0
- package/dist/ui/elements/Button/constants.d.ts +54 -0
- package/dist/ui/elements/Button/constants.d.ts.map +1 -0
- package/dist/ui/elements/Button/index.d.ts +9 -0
- package/dist/ui/elements/Button/index.d.ts.map +1 -0
- package/dist/ui/elements/Button/types.d.ts +226 -0
- package/dist/ui/elements/Button/types.d.ts.map +1 -0
- package/dist/ui/elements/Button/utils.d.ts +1 -0
- package/dist/ui/elements/Button/utils.d.ts.map +1 -0
- package/dist/ui/elements/Icon/Icon.d.ts +48 -0
- package/dist/ui/elements/Icon/Icon.d.ts.map +1 -0
- package/dist/ui/elements/Icon/Icon.styles.d.ts +5 -0
- package/dist/ui/elements/Icon/Icon.styles.d.ts.map +1 -0
- package/dist/ui/elements/Icon/index.d.ts +3 -0
- package/dist/ui/elements/Icon/index.d.ts.map +1 -0
- package/dist/ui/elements/Icon/types.d.ts +74 -0
- package/dist/ui/elements/Icon/types.d.ts.map +1 -0
- package/dist/ui/elements/Modal/ConfirmationDialog/index.d.ts +43 -0
- package/dist/ui/elements/Modal/ConfirmationDialog/index.d.ts.map +1 -0
- package/dist/ui/elements/Modal/ConfirmationDialog/index.test.d.ts +2 -0
- package/dist/ui/elements/Modal/ConfirmationDialog/index.test.d.ts.map +1 -0
- package/dist/ui/elements/Modal/Modal.d.ts +21 -0
- package/dist/ui/elements/Modal/Modal.d.ts.map +1 -0
- package/dist/ui/elements/Modal/Modal.styles.d.ts +18 -0
- package/dist/ui/elements/Modal/Modal.styles.d.ts.map +1 -0
- package/dist/ui/elements/Modal/Modal.test.d.ts +2 -0
- package/dist/ui/elements/Modal/Modal.test.d.ts.map +1 -0
- package/dist/ui/elements/Modal/MultiStepModal/index.d.ts +46 -0
- package/dist/ui/elements/Modal/MultiStepModal/index.d.ts.map +1 -0
- package/dist/ui/elements/Modal/MultiStepModal/index.test.d.ts +2 -0
- package/dist/ui/elements/Modal/MultiStepModal/index.test.d.ts.map +1 -0
- package/dist/ui/elements/Modal/constants.d.ts +1 -0
- package/dist/ui/elements/Modal/constants.d.ts.map +1 -0
- package/dist/ui/elements/Modal/index.d.ts +5 -0
- package/dist/ui/elements/Modal/index.d.ts.map +1 -0
- package/dist/ui/elements/Modal/types.d.ts +312 -0
- package/dist/ui/elements/Modal/types.d.ts.map +1 -0
- package/dist/ui/elements/Modal/utils.d.ts +1 -0
- package/dist/ui/elements/Modal/utils.d.ts.map +1 -0
- package/dist/ui/elements/MultiSelectDropdown/DropdownListItem.d.ts +4 -0
- package/dist/ui/elements/MultiSelectDropdown/DropdownListItem.d.ts.map +1 -0
- package/dist/ui/elements/MultiSelectDropdown/MultiSelectDropdown.d.ts +5 -0
- package/dist/ui/elements/MultiSelectDropdown/MultiSelectDropdown.d.ts.map +1 -0
- package/dist/ui/elements/MultiSelectDropdown/MultiSelectDropdown.styles.d.ts +14 -0
- package/dist/ui/elements/MultiSelectDropdown/MultiSelectDropdown.styles.d.ts.map +1 -0
- package/dist/ui/elements/MultiSelectDropdown/MultiSelectDropdown.test.d.ts +2 -0
- package/dist/ui/elements/MultiSelectDropdown/MultiSelectDropdown.test.d.ts.map +1 -0
- package/dist/ui/elements/MultiSelectDropdown/index.d.ts +3 -0
- package/dist/ui/elements/MultiSelectDropdown/index.d.ts.map +1 -0
- package/dist/ui/elements/MultiSelectDropdown/types.d.ts +70 -0
- package/dist/ui/elements/MultiSelectDropdown/types.d.ts.map +1 -0
- package/dist/ui/elements/SelectDropdown/SelectDropdown.d.ts +5 -0
- package/dist/ui/elements/SelectDropdown/SelectDropdown.d.ts.map +1 -0
- package/dist/ui/elements/SelectDropdown/SelectDropdown.styles.d.ts +10 -0
- package/dist/ui/elements/SelectDropdown/SelectDropdown.styles.d.ts.map +1 -0
- package/dist/ui/elements/SelectDropdown/SelectDropdown.test.d.ts +2 -0
- package/dist/ui/elements/SelectDropdown/SelectDropdown.test.d.ts.map +1 -0
- package/dist/ui/elements/SelectDropdown/index.d.ts +3 -0
- package/dist/ui/elements/SelectDropdown/index.d.ts.map +1 -0
- package/dist/ui/elements/SelectDropdown/types.d.ts +59 -0
- package/dist/ui/elements/SelectDropdown/types.d.ts.map +1 -0
- package/dist/ui/elements/Table/Table.d.ts +47 -0
- package/dist/ui/elements/Table/Table.d.ts.map +1 -0
- package/dist/ui/elements/Table/Table.styles.d.ts +8 -0
- package/dist/ui/elements/Table/Table.styles.d.ts.map +1 -0
- package/dist/ui/elements/Table/Table.test.d.ts +2 -0
- package/dist/ui/elements/Table/Table.test.d.ts.map +1 -0
- package/dist/ui/elements/Table/constants.d.ts +1 -0
- package/dist/ui/elements/Table/constants.d.ts.map +1 -0
- package/dist/ui/elements/Table/index.d.ts +3 -0
- package/dist/ui/elements/Table/index.d.ts.map +1 -0
- package/dist/ui/elements/Table/types.d.ts +223 -0
- package/dist/ui/elements/Table/types.d.ts.map +1 -0
- package/dist/ui/elements/Table/utils.d.ts +1 -0
- package/dist/ui/elements/Table/utils.d.ts.map +1 -0
- package/dist/ui/elements/Typography/Typography.d.ts +36 -0
- package/dist/ui/elements/Typography/Typography.d.ts.map +1 -0
- package/dist/ui/elements/Typography/Typography.styles.d.ts +6 -0
- package/dist/ui/elements/Typography/Typography.styles.d.ts.map +1 -0
- package/dist/ui/elements/Typography/constants.d.ts +22 -0
- package/dist/ui/elements/Typography/constants.d.ts.map +1 -0
- package/dist/ui/elements/Typography/index.d.ts +5 -0
- package/dist/ui/elements/Typography/index.d.ts.map +1 -0
- package/dist/ui/elements/Typography/types.d.ts +50 -0
- package/dist/ui/elements/Typography/types.d.ts.map +1 -0
- package/dist/ui/elements/Typography/utils.d.ts +2 -0
- package/dist/ui/elements/Typography/utils.d.ts.map +1 -0
- package/dist/ui/helpers/classNameBuilders.d.ts.map +1 -0
- package/dist/ui/helpers/index.d.ts +3 -0
- package/dist/ui/helpers/index.d.ts.map +1 -0
- package/dist/ui/index.d.ts +11 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/{init → ui/init}/GrauityInit.d.ts +15 -3
- package/dist/ui/init/GrauityInit.d.ts.map +1 -0
- package/dist/ui/init/index.d.ts.map +1 -0
- package/dist/ui/themes/GlobalStyle.d.ts +5 -0
- package/dist/ui/themes/GlobalStyle.d.ts.map +1 -0
- package/dist/ui/themes/ThemeContext.d.ts +24 -0
- package/dist/ui/themes/ThemeContext.d.ts.map +1 -0
- package/dist/ui/themes/constants.d.ts +6 -0
- package/dist/ui/themes/constants.d.ts.map +1 -0
- package/dist/ui/themes/darkThemeConstants.d.ts +70 -0
- package/dist/ui/themes/darkThemeConstants.d.ts.map +1 -0
- package/dist/ui/themes/lightThemeConstants.d.ts +70 -0
- package/dist/ui/themes/lightThemeConstants.d.ts.map +1 -0
- package/dist/ui/themes/tokens.d.ts +1 -0
- package/dist/ui/themes/tokens.d.ts.map +1 -0
- package/dist/ui/themes/types.d.ts +73 -0
- package/dist/ui/themes/types.d.ts.map +1 -0
- package/package.json +59 -28
- package/ui/core/colors/colorTypes.ts +2 -20
- package/ui/core/colors/index.ts +23 -23
- package/ui/core/icons/iconTags.ts +1063 -59
- package/ui/core/icons/iconTypes.ts +837 -84
- package/ui/core/icons/index.ts +1 -3
- package/ui/core/index.ts +7 -10
- package/ui/core/sizes/sizeTypes.ts +1 -0
- package/ui/css/fonts.scss +0 -8
- package/ui/css/index.scss +0 -8
- package/ui/css/reset.scss +2 -5
- package/ui/elements/Alert/Alert.styles.ts +66 -0
- package/ui/elements/Alert/Alert.test.tsx +81 -0
- package/ui/elements/Alert/Alert.tsx +153 -0
- package/ui/elements/Alert/constants.ts +169 -0
- package/ui/elements/Alert/index.ts +6 -0
- package/ui/elements/Alert/types.ts +150 -0
- package/ui/elements/AlertBanner/AlertBanner.styles.ts +35 -0
- package/ui/elements/AlertBanner/AlertBanner.test.tsx +70 -0
- package/ui/elements/AlertBanner/AlertBanner.tsx +137 -0
- package/ui/elements/AlertBanner/constants.ts +179 -0
- package/ui/elements/AlertBanner/index.ts +6 -0
- package/ui/elements/AlertBanner/types.ts +133 -0
- package/ui/elements/AlertBanner/utils.ts +52 -0
- package/ui/elements/Button/Button.styles.ts +88 -0
- package/ui/elements/Button/Button.test.tsx +78 -0
- package/ui/elements/Button/Button.tsx +134 -0
- package/ui/elements/Button/ButtonGroup.styles.ts +7 -0
- package/ui/elements/Button/ButtonGroup.tsx +21 -0
- package/ui/elements/Button/IconButton.test.tsx +39 -0
- package/ui/elements/Button/IconButton.tsx +118 -0
- package/ui/elements/Button/constants.ts +304 -0
- package/ui/elements/Button/index.ts +8 -0
- package/ui/elements/Button/types.ts +282 -0
- package/ui/elements/Button/utils.ts +0 -0
- package/ui/elements/Icon/Icon.styles.ts +99 -0
- package/ui/elements/Icon/Icon.tsx +17 -107
- package/ui/elements/Icon/index.ts +1 -2
- package/ui/elements/Icon/types.ts +96 -0
- package/ui/elements/Modal/ConfirmationDialog/index.test.tsx +116 -0
- package/ui/elements/Modal/ConfirmationDialog/index.tsx +151 -0
- package/ui/elements/Modal/Modal.styles.ts +230 -0
- package/ui/elements/Modal/Modal.test.tsx +117 -0
- package/ui/elements/Modal/Modal.tsx +179 -0
- package/ui/elements/Modal/MultiStepModal/index.test.tsx +116 -0
- package/ui/elements/Modal/MultiStepModal/index.tsx +184 -0
- package/ui/elements/Modal/constants.ts +0 -0
- package/ui/elements/Modal/index.ts +4 -0
- package/ui/elements/Modal/types.ts +379 -0
- package/ui/elements/Modal/utils.tsx +0 -0
- package/ui/elements/MultiSelectDropdown/DropdownListItem.tsx +33 -0
- package/ui/elements/MultiSelectDropdown/MultiSelectDropdown.styles.ts +127 -0
- package/ui/elements/MultiSelectDropdown/MultiSelectDropdown.test.tsx +224 -0
- package/ui/elements/MultiSelectDropdown/MultiSelectDropdown.tsx +156 -0
- package/ui/elements/MultiSelectDropdown/index.ts +2 -0
- package/ui/elements/MultiSelectDropdown/types.ts +87 -0
- package/ui/elements/SelectDropdown/SelectDropdown.styles.ts +99 -0
- package/ui/elements/SelectDropdown/SelectDropdown.test.tsx +86 -0
- package/ui/elements/SelectDropdown/SelectDropdown.tsx +94 -0
- package/ui/elements/SelectDropdown/index.tsx +2 -0
- package/ui/elements/SelectDropdown/types.ts +73 -0
- package/ui/elements/Table/Table.styles.ts +178 -0
- package/ui/elements/Table/Table.test.tsx +72 -0
- package/ui/elements/Table/Table.tsx +118 -0
- package/ui/elements/Table/constants.ts +0 -0
- package/ui/elements/Table/index.ts +2 -0
- package/ui/elements/Table/types.ts +270 -0
- package/ui/elements/Table/utils.ts +0 -0
- package/ui/elements/Typography/Typography.styles.ts +29 -0
- package/ui/elements/Typography/Typography.tsx +70 -0
- package/ui/elements/Typography/constants.ts +292 -0
- package/ui/elements/Typography/index.ts +9 -0
- package/ui/elements/Typography/types.ts +116 -0
- package/ui/elements/Typography/utils.ts +11 -0
- package/ui/fonts/grauity-icons.eot +0 -0
- package/ui/fonts/grauity-icons.ttf +0 -0
- package/ui/fonts/grauity-icons.woff +0 -0
- package/ui/fonts/grauity-icons.woff2 +0 -0
- package/ui/helpers/index.ts +1 -7
- package/ui/index.ts +42 -3
- package/ui/init/GrauityInit.tsx +30 -7
- package/ui/init/index.ts +0 -1
- package/ui/themes/GlobalStyle.ts +273 -0
- package/ui/themes/ThemeContext.tsx +140 -0
- package/ui/themes/constants.ts +8 -0
- package/ui/themes/darkThemeConstants.ts +73 -0
- package/ui/themes/lightThemeConstants.ts +73 -0
- package/ui/themes/tokens.ts +0 -0
- package/ui/themes/types.ts +77 -0
- package/dist/core/colors/colorTypes.d.ts +0 -3
- package/dist/core/colors/colorTypes.d.ts.map +0 -1
- package/dist/core/colors/index.d.ts +0 -14
- package/dist/core/colors/index.d.ts.map +0 -1
- package/dist/core/icons/iconTags.d.ts +0 -158
- package/dist/core/icons/iconTags.d.ts.map +0 -1
- package/dist/core/icons/iconTypes.d.ts +0 -148
- package/dist/core/icons/iconTypes.d.ts.map +0 -1
- package/dist/core/icons/index.d.ts.map +0 -1
- package/dist/core/index.d.ts +0 -9
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/miscellaneous-choices/index.d.ts.map +0 -1
- package/dist/core/miscellaneous-choices/miscellaneousTypes.d.ts.map +0 -1
- package/dist/core/sizes/index.d.ts.map +0 -1
- package/dist/core/sizes/sizeTypes.d.ts +0 -3
- package/dist/core/sizes/sizeTypes.d.ts.map +0 -1
- package/dist/elements/Icon/Icon.d.ts +0 -115
- package/dist/elements/Icon/Icon.d.ts.map +0 -1
- package/dist/elements/Icon/index.d.ts +0 -3
- package/dist/elements/Icon/index.d.ts.map +0 -1
- package/dist/elements/index.d.ts +0 -3
- package/dist/elements/index.d.ts.map +0 -1
- package/dist/helpers/classNameBuilders.d.ts.map +0 -1
- package/dist/helpers/getElementTypeFromProps.d.ts +0 -14
- package/dist/helpers/getElementTypeFromProps.d.ts.map +0 -1
- package/dist/helpers/index.d.ts +0 -4
- package/dist/helpers/index.d.ts.map +0 -1
- package/dist/init/GrauityInit.d.ts.map +0 -1
- package/dist/init/index.d.ts.map +0 -1
- package/ui/css/colors.scss +0 -131
- package/ui/css/icons.scss +0 -96
- package/ui/elements/index.ts +0 -2
- package/ui/helpers/getElementTypeFromProps.ts +0 -32
- /package/dist/{core → ui/core}/miscellaneous-choices/index.d.ts +0 -0
- /package/dist/{core → ui/core}/miscellaneous-choices/miscellaneousTypes.d.ts +0 -0
- /package/dist/{core → ui/core}/sizes/index.d.ts +0 -0
- /package/dist/{helpers → ui/helpers}/classNameBuilders.d.ts +0 -0
- /package/dist/{init → ui/init}/index.d.ts +0 -0
- /package/ui/{css/sizes.scss → elements/Alert/utils.ts} +0 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import styled, { css } from 'styled-components';
|
|
2
|
+
|
|
3
|
+
import Button from '../Button';
|
|
4
|
+
import {
|
|
5
|
+
StyledDropdownHeaderProps,
|
|
6
|
+
StyledDropdownItemTextProps,
|
|
7
|
+
StyledDropdownListItemProps,
|
|
8
|
+
StyledDropdownSearchInputProps,
|
|
9
|
+
StyledDropdownWrapperProps,
|
|
10
|
+
} from './types';
|
|
11
|
+
|
|
12
|
+
export const StyledDropdownWrapper = styled.div<StyledDropdownWrapperProps>`
|
|
13
|
+
font-family: Mono Sans, sans-serif;
|
|
14
|
+
height: 100%;
|
|
15
|
+
width: 100%;
|
|
16
|
+
position: relative;
|
|
17
|
+
`;
|
|
18
|
+
|
|
19
|
+
export const StyledDropdownHeader = styled.div<StyledDropdownHeaderProps>`
|
|
20
|
+
display: flex;
|
|
21
|
+
justify-content: space-between;
|
|
22
|
+
align-items: center;
|
|
23
|
+
height: 100%;
|
|
24
|
+
width: 100%;
|
|
25
|
+
padding: var(--spacing-12px, 12px);
|
|
26
|
+
gap: var(--spacing-8px, 8px);
|
|
27
|
+
background: var(--bg-primary, #ffffff);
|
|
28
|
+
border: 1px solid var(--border-neutral, #e1e5ea);
|
|
29
|
+
border-radius: var(--corner-radius-8px, 8px);
|
|
30
|
+
cursor: pointer;
|
|
31
|
+
outline: none;
|
|
32
|
+
`;
|
|
33
|
+
|
|
34
|
+
export const StyledDropdownHeaderTitle = styled.div`
|
|
35
|
+
height: 100%;
|
|
36
|
+
display: flex;
|
|
37
|
+
align-items: center;
|
|
38
|
+
font-weight: 600;
|
|
39
|
+
line-height: var(--spacing-14px, 14px);
|
|
40
|
+
text-align: left;
|
|
41
|
+
color: var(--text-brand, #0673f9);
|
|
42
|
+
overflow: hidden;
|
|
43
|
+
`;
|
|
44
|
+
|
|
45
|
+
export const StyledDropdownContainer = styled.div`
|
|
46
|
+
position: absolute;
|
|
47
|
+
top: calc(100% + var(--spacing-4px, 4px));
|
|
48
|
+
width: 100%;
|
|
49
|
+
max-height: 300px;
|
|
50
|
+
padding: var(--spacing-8px, 8px);
|
|
51
|
+
display: flex;
|
|
52
|
+
flex-direction: column;
|
|
53
|
+
align-items: flex-start;
|
|
54
|
+
gap: var(--spacing-4px, 4px);
|
|
55
|
+
align-self: stretch;
|
|
56
|
+
border-radius: var(--corner-radius-12px, 12px);
|
|
57
|
+
border: var(--spacing-1px, 1px) solid var(--border-neutral, #e1e5ea);
|
|
58
|
+
background: var(--bg-primary, #fff);
|
|
59
|
+
box-shadow: var(--spacing-2px, 2px) var(--spacing-4px, 4px)
|
|
60
|
+
var(--spacing-8px, 8px) var(--spacing-0px, 0px) rgba(0, 0, 0, 0.06);
|
|
61
|
+
`;
|
|
62
|
+
|
|
63
|
+
export const StyledDropdownList = styled.div`
|
|
64
|
+
width: 100%;
|
|
65
|
+
overflow-y: auto;
|
|
66
|
+
`;
|
|
67
|
+
|
|
68
|
+
export const StyledDropdownListItem = styled.div<StyledDropdownListItemProps>`
|
|
69
|
+
width: 100%;
|
|
70
|
+
outline: none;
|
|
71
|
+
display: flex;
|
|
72
|
+
align-items: center;
|
|
73
|
+
align-self: stretch;
|
|
74
|
+
padding: var(--spacing-8px, 8px) var(--spacing-4px, 4px);
|
|
75
|
+
gap: var(--spacing-8px, 8px);
|
|
76
|
+
cursor: pointer;
|
|
77
|
+
|
|
78
|
+
&:hover {
|
|
79
|
+
background: var(--bg-secondary, #f6f7f9);
|
|
80
|
+
}
|
|
81
|
+
`;
|
|
82
|
+
|
|
83
|
+
export const StyledDropdownItemCheckbox = styled.div`
|
|
84
|
+
display: flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
justify-content: center;
|
|
87
|
+
`;
|
|
88
|
+
|
|
89
|
+
export const StyledDropdownItemText = styled.div<StyledDropdownItemTextProps>`
|
|
90
|
+
color: var(--text-primary, #16191d);
|
|
91
|
+
font-size: var(--spacing-14px, 14px);
|
|
92
|
+
font-weight: 500;
|
|
93
|
+
|
|
94
|
+
${({ $selected }) =>
|
|
95
|
+
$selected &&
|
|
96
|
+
css`
|
|
97
|
+
color: var(--text-brand, #0673f9);
|
|
98
|
+
`}
|
|
99
|
+
`;
|
|
100
|
+
|
|
101
|
+
export const StyledDropdownSearchContainer = styled.div`
|
|
102
|
+
width: 100%;
|
|
103
|
+
height: var(--spacing-36px, 36px);
|
|
104
|
+
padding: var(--spacing-12px, 12px);
|
|
105
|
+
display: flex;
|
|
106
|
+
align-items: center;
|
|
107
|
+
align-self: stretch;
|
|
108
|
+
gap: var(--spacing-8px, 8px);
|
|
109
|
+
border-radius: var(--corner-radius-8px, 8px);
|
|
110
|
+
border: var(--spacing-1px, 1px) solid var(--border-neutral, #e1e5ea);
|
|
111
|
+
background: var(--bg-primary, #ffffff);
|
|
112
|
+
`;
|
|
113
|
+
|
|
114
|
+
export const StyledDropdownSearchInput = styled.input<StyledDropdownSearchInputProps>`
|
|
115
|
+
outline: none;
|
|
116
|
+
border: none;
|
|
117
|
+
background: var(--bg-primary, #ffffff);
|
|
118
|
+
color: var(--text-primary, #16191d);
|
|
119
|
+
font-size: var(--spacing-14px, 14px);
|
|
120
|
+
font-style: normal;
|
|
121
|
+
font-weight: 500;
|
|
122
|
+
`;
|
|
123
|
+
|
|
124
|
+
export const StyledApplyButton = styled(Button)`
|
|
125
|
+
width: 100%;
|
|
126
|
+
outline: none;
|
|
127
|
+
`;
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import '@testing-library/jest-dom';
|
|
2
|
+
|
|
3
|
+
import { fireEvent, render, screen } from '@testing-library/react';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
|
|
6
|
+
import MultiSelectDropdown from './MultiSelectDropdown';
|
|
7
|
+
import { DropdownOption } from './types';
|
|
8
|
+
|
|
9
|
+
const openDropdown = () => {
|
|
10
|
+
const header = screen.getByRole('button');
|
|
11
|
+
fireEvent.click(header);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
describe('multi-select-dropdown', () => {
|
|
15
|
+
const options: Set<DropdownOption> = new Set([
|
|
16
|
+
{ id: 1, label: 'Option 1' },
|
|
17
|
+
{ id: 2, label: 'Option 2' },
|
|
18
|
+
{ id: 3, label: 'Option 3' },
|
|
19
|
+
]) as any as Set<DropdownOption>;
|
|
20
|
+
|
|
21
|
+
// Rendering of the component
|
|
22
|
+
it('renders with default props', () => {
|
|
23
|
+
render(<MultiSelectDropdown />);
|
|
24
|
+
const dropdown = screen.getByRole('combobox');
|
|
25
|
+
expect(dropdown).toBeInTheDocument();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// Dropdown Icon
|
|
29
|
+
it('icon is chevron-down when dropdown is closed', () => {
|
|
30
|
+
render(<MultiSelectDropdown />);
|
|
31
|
+
const icon = screen.getByTestId('testid-icon');
|
|
32
|
+
expect(icon).toHaveClass('grauity-icon');
|
|
33
|
+
expect(icon).toHaveClass('grauity-icon-chevron-down');
|
|
34
|
+
});
|
|
35
|
+
it('icon is chevron-up when dropdown is opened', () => {
|
|
36
|
+
render(<MultiSelectDropdown />);
|
|
37
|
+
openDropdown();
|
|
38
|
+
const icon = screen.getAllByTestId('testid-icon')[0];
|
|
39
|
+
expect(icon).toHaveClass('grauity-icon');
|
|
40
|
+
expect(icon).toHaveClass('grauity-icon-chevron-up');
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Search Box
|
|
44
|
+
it('shows search input when shouldEnableSearch is true', () => {
|
|
45
|
+
render(<MultiSelectDropdown shouldEnableSearch />);
|
|
46
|
+
openDropdown();
|
|
47
|
+
const searchInput = screen.getByRole('searchbox');
|
|
48
|
+
expect(searchInput).toBeInTheDocument();
|
|
49
|
+
});
|
|
50
|
+
it('does not show search input when shouldEnableSearch is false', () => {
|
|
51
|
+
render(<MultiSelectDropdown shouldEnableSearch={false} />);
|
|
52
|
+
openDropdown();
|
|
53
|
+
const searchInput = screen.queryByRole('searchbox');
|
|
54
|
+
expect(searchInput).not.toBeInTheDocument();
|
|
55
|
+
});
|
|
56
|
+
it('renders search box with placeholder text', () => {
|
|
57
|
+
render(
|
|
58
|
+
<MultiSelectDropdown
|
|
59
|
+
shouldEnableSearch
|
|
60
|
+
searchPlaceholder="Search..."
|
|
61
|
+
/>
|
|
62
|
+
);
|
|
63
|
+
openDropdown();
|
|
64
|
+
const searchInput = screen.getByRole('searchbox');
|
|
65
|
+
expect(searchInput).toHaveAttribute('placeholder', 'Search...');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Render Options
|
|
69
|
+
it('renders options correctly', () => {
|
|
70
|
+
render(<MultiSelectDropdown options={options} />);
|
|
71
|
+
openDropdown();
|
|
72
|
+
const option1 = screen.getByText('Option 1');
|
|
73
|
+
const option2 = screen.getByText('Option 2');
|
|
74
|
+
const option3 = screen.getByText('Option 3');
|
|
75
|
+
expect(option1).toBeInTheDocument();
|
|
76
|
+
expect(option2).toBeInTheDocument();
|
|
77
|
+
expect(option3).toBeInTheDocument();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Select All Options
|
|
81
|
+
it('shows select all options when shouldEnableAllSelected is true', () => {
|
|
82
|
+
render(<MultiSelectDropdown shouldEnableAllSelected />);
|
|
83
|
+
openDropdown();
|
|
84
|
+
const allOption = screen.getByText('All');
|
|
85
|
+
expect(allOption).toBeInTheDocument();
|
|
86
|
+
});
|
|
87
|
+
it('does not show select all options when shouldEnableAllSelected is false', () => {
|
|
88
|
+
render(<MultiSelectDropdown shouldEnableAllSelected={false} />);
|
|
89
|
+
openDropdown();
|
|
90
|
+
const allOption = screen.queryByText('All');
|
|
91
|
+
expect(allOption).not.toBeInTheDocument();
|
|
92
|
+
});
|
|
93
|
+
it('renders all option text correctly', () => {
|
|
94
|
+
render(
|
|
95
|
+
<MultiSelectDropdown
|
|
96
|
+
shouldEnableAllSelected
|
|
97
|
+
allOptionText="Select all"
|
|
98
|
+
/>
|
|
99
|
+
);
|
|
100
|
+
openDropdown();
|
|
101
|
+
const allOption = screen.getByText('Select all');
|
|
102
|
+
expect(allOption).toBeInTheDocument();
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// No Option Selected
|
|
106
|
+
it('renders no option selected text correctly', () => {
|
|
107
|
+
render(<MultiSelectDropdown noOptionSelctedText="Select option" />);
|
|
108
|
+
const header = screen.getByRole('button');
|
|
109
|
+
expect(header).toHaveTextContent('Select option');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// Apply Button
|
|
113
|
+
it('calls onOptionsChange when apply button is clicked', () => {
|
|
114
|
+
const onOptionsChange = jest.fn();
|
|
115
|
+
render(
|
|
116
|
+
<MultiSelectDropdown
|
|
117
|
+
options={options}
|
|
118
|
+
onOptionsChange={onOptionsChange}
|
|
119
|
+
/>
|
|
120
|
+
);
|
|
121
|
+
openDropdown();
|
|
122
|
+
const applyButton = screen.getByText('Apply');
|
|
123
|
+
fireEvent.click(applyButton);
|
|
124
|
+
expect(onOptionsChange).toHaveBeenCalledTimes(1);
|
|
125
|
+
});
|
|
126
|
+
it('closes dropdown when apply button is clicked', () => {
|
|
127
|
+
render(<MultiSelectDropdown options={options} />);
|
|
128
|
+
openDropdown();
|
|
129
|
+
const applyButton = screen.getByText('Apply');
|
|
130
|
+
fireEvent.click(applyButton);
|
|
131
|
+
const dropdown = screen.queryByRole('combobox');
|
|
132
|
+
expect(dropdown.children).toHaveLength(1);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// Select Options
|
|
136
|
+
it('calls onOptionsChange with selected options when apply button is clicked', () => {
|
|
137
|
+
const onOptionsChange = jest.fn();
|
|
138
|
+
render(
|
|
139
|
+
<MultiSelectDropdown
|
|
140
|
+
options={options}
|
|
141
|
+
onOptionsChange={onOptionsChange}
|
|
142
|
+
/>
|
|
143
|
+
);
|
|
144
|
+
openDropdown();
|
|
145
|
+
const option1 = screen.getByText('Option 1');
|
|
146
|
+
const option3 = screen.getByText('Option 3');
|
|
147
|
+
fireEvent.click(option1);
|
|
148
|
+
fireEvent.click(option3);
|
|
149
|
+
const applyButton = screen.getByText('Apply');
|
|
150
|
+
fireEvent.click(applyButton);
|
|
151
|
+
expect(onOptionsChange).toHaveBeenCalledWith(
|
|
152
|
+
new Set([
|
|
153
|
+
{ id: 1, label: 'Option 1' },
|
|
154
|
+
{ id: 3, label: 'Option 3' },
|
|
155
|
+
])
|
|
156
|
+
);
|
|
157
|
+
});
|
|
158
|
+
it('calls onOptionsChange with all options when select all is clicked', () => {
|
|
159
|
+
const onOptionsChange = jest.fn();
|
|
160
|
+
render(
|
|
161
|
+
<MultiSelectDropdown
|
|
162
|
+
options={options}
|
|
163
|
+
onOptionsChange={onOptionsChange}
|
|
164
|
+
shouldEnableAllSelected
|
|
165
|
+
/>
|
|
166
|
+
);
|
|
167
|
+
openDropdown();
|
|
168
|
+
const allOption = screen.getByText('All');
|
|
169
|
+
fireEvent.click(allOption);
|
|
170
|
+
const applyButton = screen.getByText('Apply');
|
|
171
|
+
fireEvent.click(applyButton);
|
|
172
|
+
expect(onOptionsChange).toHaveBeenCalledWith(options);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
// Header Text
|
|
176
|
+
it('renders header text correctly', () => {
|
|
177
|
+
render(<MultiSelectDropdown noOptionSelctedText="Select options" />);
|
|
178
|
+
const header = screen.getByRole('button');
|
|
179
|
+
expect(header).toHaveTextContent('Select options');
|
|
180
|
+
});
|
|
181
|
+
it('renders header text correctly when one option is selected', () => {
|
|
182
|
+
render(
|
|
183
|
+
<MultiSelectDropdown
|
|
184
|
+
options={options}
|
|
185
|
+
noOptionSelctedText="Select options"
|
|
186
|
+
/>
|
|
187
|
+
);
|
|
188
|
+
openDropdown();
|
|
189
|
+
const option1 = screen.getByText('Option 2');
|
|
190
|
+
fireEvent.click(option1);
|
|
191
|
+
const header = screen.getAllByRole('button')[0];
|
|
192
|
+
expect(header).toHaveTextContent('Option 2');
|
|
193
|
+
});
|
|
194
|
+
it('renders header text correctly when multiple options are selected', () => {
|
|
195
|
+
render(
|
|
196
|
+
<MultiSelectDropdown
|
|
197
|
+
options={options}
|
|
198
|
+
noOptionSelctedText="Select options"
|
|
199
|
+
/>
|
|
200
|
+
);
|
|
201
|
+
openDropdown();
|
|
202
|
+
const option1 = screen.getByText('Option 1');
|
|
203
|
+
const option2 = screen.getByText('Option 2');
|
|
204
|
+
fireEvent.click(option1);
|
|
205
|
+
fireEvent.click(option2);
|
|
206
|
+
const header = screen.getAllByRole('button')[0];
|
|
207
|
+
expect(header).toHaveTextContent('2 selected');
|
|
208
|
+
});
|
|
209
|
+
it('renders header text correctly when all options are selected', () => {
|
|
210
|
+
render(
|
|
211
|
+
<MultiSelectDropdown
|
|
212
|
+
options={options}
|
|
213
|
+
noOptionSelctedText="Select options"
|
|
214
|
+
shouldEnableAllSelected
|
|
215
|
+
allOptionText="All Selected"
|
|
216
|
+
/>
|
|
217
|
+
);
|
|
218
|
+
openDropdown();
|
|
219
|
+
const allOption = screen.getByText('All Selected');
|
|
220
|
+
fireEvent.click(allOption);
|
|
221
|
+
const header = screen.getAllByRole('button')[0];
|
|
222
|
+
expect(header).toHaveTextContent('All Selected');
|
|
223
|
+
});
|
|
224
|
+
});
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { debounce } from 'lodash';
|
|
2
|
+
import React, { forwardRef, useCallback, useEffect, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
import { Icon } from '../Icon';
|
|
5
|
+
import DropdownListItem from './DropdownListItem';
|
|
6
|
+
import {
|
|
7
|
+
StyledApplyButton,
|
|
8
|
+
StyledDropdownContainer,
|
|
9
|
+
StyledDropdownHeader,
|
|
10
|
+
StyledDropdownHeaderTitle,
|
|
11
|
+
StyledDropdownList,
|
|
12
|
+
StyledDropdownSearchContainer,
|
|
13
|
+
StyledDropdownSearchInput,
|
|
14
|
+
StyledDropdownWrapper,
|
|
15
|
+
} from './MultiSelectDropdown.styles';
|
|
16
|
+
import { DropdownOption, MultiSelectDropdownProps } from './types';
|
|
17
|
+
|
|
18
|
+
const MultiSelectDropdown = forwardRef<
|
|
19
|
+
HTMLSelectElement,
|
|
20
|
+
MultiSelectDropdownProps
|
|
21
|
+
>((props, ref) => {
|
|
22
|
+
const {
|
|
23
|
+
noOptionSelctedText = 'Select',
|
|
24
|
+
options = new Set([]),
|
|
25
|
+
shouldEnableSearch = true,
|
|
26
|
+
onSearchInputChange = () => {},
|
|
27
|
+
searchPlaceholder = 'Search',
|
|
28
|
+
shouldEnableAllSelected = true,
|
|
29
|
+
defaultAllSelected = false,
|
|
30
|
+
allOptionText = 'All',
|
|
31
|
+
onOptionsChange = () => {},
|
|
32
|
+
} = props;
|
|
33
|
+
|
|
34
|
+
const [isOpened, setIsOpened] = useState(false);
|
|
35
|
+
const [searchInput, setSearchInput] = useState('');
|
|
36
|
+
const [allOptionsSelected, setAllOptionsSelected] =
|
|
37
|
+
useState(defaultAllSelected);
|
|
38
|
+
const [selectedOptionsIds, setSelectedOptionsIds] = useState<
|
|
39
|
+
Record<string, boolean>
|
|
40
|
+
>({});
|
|
41
|
+
|
|
42
|
+
const clickOnOption = (option: DropdownOption) => {
|
|
43
|
+
const newSelectedOptionsIds = {
|
|
44
|
+
...selectedOptionsIds,
|
|
45
|
+
[option.id]: !selectedOptionsIds[option.id],
|
|
46
|
+
};
|
|
47
|
+
setAllOptionsSelected(false);
|
|
48
|
+
setSelectedOptionsIds(newSelectedOptionsIds);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const clickOnAllOptionsSelect = () => {
|
|
52
|
+
const newSelectedOptionsIds = Array.from(options).reduce(
|
|
53
|
+
(acc: Record<string, boolean>, option) => {
|
|
54
|
+
acc[option.id] = !allOptionsSelected;
|
|
55
|
+
return acc;
|
|
56
|
+
},
|
|
57
|
+
{}
|
|
58
|
+
);
|
|
59
|
+
setAllOptionsSelected(!allOptionsSelected);
|
|
60
|
+
setSelectedOptionsIds(newSelectedOptionsIds);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const handleApply = () => {
|
|
64
|
+
const selectedOptions = new Set(
|
|
65
|
+
Array.from(options).filter(
|
|
66
|
+
(option) => selectedOptionsIds[option.id]
|
|
67
|
+
)
|
|
68
|
+
);
|
|
69
|
+
onOptionsChange(selectedOptions);
|
|
70
|
+
setIsOpened(false);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const debouncedSearchCallback = useCallback(
|
|
74
|
+
debounce((value: string) => {
|
|
75
|
+
onSearchInputChange(value);
|
|
76
|
+
}, 500),
|
|
77
|
+
[]
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
const getHeaderTitle = (): string => {
|
|
81
|
+
if (allOptionsSelected) {
|
|
82
|
+
return allOptionText;
|
|
83
|
+
}
|
|
84
|
+
const selectedOptions = Array.from(options)
|
|
85
|
+
.filter((option) => selectedOptionsIds[option.id])
|
|
86
|
+
.map((option) => option.label);
|
|
87
|
+
if (selectedOptions.length === 0) {
|
|
88
|
+
return noOptionSelctedText;
|
|
89
|
+
}
|
|
90
|
+
if (selectedOptions.length === 1) {
|
|
91
|
+
return selectedOptions[0];
|
|
92
|
+
}
|
|
93
|
+
return `${selectedOptions.length} selected`;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
setAllOptionsSelected(defaultAllSelected);
|
|
98
|
+
}, [defaultAllSelected]);
|
|
99
|
+
|
|
100
|
+
return (
|
|
101
|
+
<StyledDropdownWrapper ref={ref} role="combobox">
|
|
102
|
+
<StyledDropdownHeader
|
|
103
|
+
role="button"
|
|
104
|
+
onClick={() => setIsOpened(!isOpened)}
|
|
105
|
+
>
|
|
106
|
+
<StyledDropdownHeaderTitle>
|
|
107
|
+
{getHeaderTitle()}
|
|
108
|
+
</StyledDropdownHeaderTitle>
|
|
109
|
+
<Icon name={isOpened ? 'chevron-up' : 'chevron-down'} />
|
|
110
|
+
</StyledDropdownHeader>
|
|
111
|
+
{isOpened && (
|
|
112
|
+
<StyledDropdownContainer>
|
|
113
|
+
{shouldEnableSearch && (
|
|
114
|
+
<StyledDropdownSearchContainer>
|
|
115
|
+
<Icon name="search" />
|
|
116
|
+
<StyledDropdownSearchInput
|
|
117
|
+
role="searchbox"
|
|
118
|
+
placeholder={searchPlaceholder}
|
|
119
|
+
value={searchInput}
|
|
120
|
+
onChange={(e) => {
|
|
121
|
+
debouncedSearchCallback(e.target.value);
|
|
122
|
+
setSearchInput(e.target.value);
|
|
123
|
+
}}
|
|
124
|
+
/>
|
|
125
|
+
</StyledDropdownSearchContainer>
|
|
126
|
+
)}
|
|
127
|
+
<StyledDropdownList>
|
|
128
|
+
{shouldEnableAllSelected && (
|
|
129
|
+
<DropdownListItem
|
|
130
|
+
displayText={allOptionText}
|
|
131
|
+
onClickFn={clickOnAllOptionsSelect}
|
|
132
|
+
isSelected={allOptionsSelected}
|
|
133
|
+
/>
|
|
134
|
+
)}
|
|
135
|
+
{Array.from(options || []).map((option) => (
|
|
136
|
+
<DropdownListItem
|
|
137
|
+
key={option.id}
|
|
138
|
+
displayText={option.label}
|
|
139
|
+
onClickFn={() => clickOnOption(option)}
|
|
140
|
+
isSelected={
|
|
141
|
+
allOptionsSelected ||
|
|
142
|
+
selectedOptionsIds[option.id]
|
|
143
|
+
}
|
|
144
|
+
/>
|
|
145
|
+
))}
|
|
146
|
+
</StyledDropdownList>
|
|
147
|
+
<StyledApplyButton onClick={handleApply}>
|
|
148
|
+
Apply
|
|
149
|
+
</StyledApplyButton>
|
|
150
|
+
</StyledDropdownContainer>
|
|
151
|
+
)}
|
|
152
|
+
</StyledDropdownWrapper>
|
|
153
|
+
);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
export default MultiSelectDropdown;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
export interface DropdownOption {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface MultiSelectDropdownProps {
|
|
9
|
+
/**
|
|
10
|
+
* Text to display when no option is selected.
|
|
11
|
+
* @default Select
|
|
12
|
+
*/
|
|
13
|
+
noOptionSelctedText?: string;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Set of options available for selection.
|
|
17
|
+
* @default new Set([])
|
|
18
|
+
*/
|
|
19
|
+
options?: Set<DropdownOption>;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Flag to enable or disable the search functionality.
|
|
23
|
+
* @default true
|
|
24
|
+
*/
|
|
25
|
+
shouldEnableSearch?: boolean;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Callback function triggered when the search input value changes.
|
|
29
|
+
* @param value - The current value of the search input.
|
|
30
|
+
*/
|
|
31
|
+
onSearchInputChange?: (value: string) => void;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Placeholder text for the search input field.
|
|
35
|
+
* @default Search
|
|
36
|
+
*/
|
|
37
|
+
searchPlaceholder?: string;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Flag to enable or disable the "Select All" functionality.
|
|
41
|
+
* @default true
|
|
42
|
+
*/
|
|
43
|
+
shouldEnableAllSelected?: boolean;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Flag to set all options as selected by default.
|
|
47
|
+
* @default false
|
|
48
|
+
*/
|
|
49
|
+
defaultAllSelected?: boolean;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Text to display for the "Select All" option.
|
|
53
|
+
* @default All
|
|
54
|
+
*/
|
|
55
|
+
allOptionText?: string;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Callback function triggered when the selected options change.
|
|
59
|
+
* @param options - The current set of selected options.
|
|
60
|
+
*/
|
|
61
|
+
onOptionsChange?: (options: Set<DropdownOption>) => void;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface DropdownListItemProps {
|
|
65
|
+
displayText: string;
|
|
66
|
+
onClickFn: () => void;
|
|
67
|
+
isSelected?: boolean;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface StyledDropdownWrapperProps
|
|
71
|
+
extends React.SelectHTMLAttributes<HTMLSelectElement> {
|
|
72
|
+
ref?: React.Ref<HTMLSelectElement>;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface StyledDropdownHeaderProps
|
|
76
|
+
extends React.ButtonHTMLAttributes<HTMLButtonElement> {}
|
|
77
|
+
|
|
78
|
+
export interface StyledDropdownListItemProps
|
|
79
|
+
extends React.ButtonHTMLAttributes<HTMLButtonElement> {}
|
|
80
|
+
|
|
81
|
+
export interface StyledDropdownSearchInputProps
|
|
82
|
+
extends React.InputHTMLAttributes<HTMLInputElement> {}
|
|
83
|
+
|
|
84
|
+
export interface StyledDropdownItemTextProps
|
|
85
|
+
extends React.HTMLAttributes<HTMLDivElement> {
|
|
86
|
+
$selected?: boolean;
|
|
87
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import styled, { css } from 'styled-components';
|
|
2
|
+
|
|
3
|
+
import Button from '../Button';
|
|
4
|
+
import {
|
|
5
|
+
StyledDivProps,
|
|
6
|
+
StyledDropdownSearchInputProps,
|
|
7
|
+
StyledSelectDropdownItemProps,
|
|
8
|
+
StyledSelectDropdownWrapperProps,
|
|
9
|
+
} from './types';
|
|
10
|
+
|
|
11
|
+
export const StyledSelectDropdownWrapper = styled.div<StyledSelectDropdownWrapperProps>`
|
|
12
|
+
width: 100%;
|
|
13
|
+
height: 100%;
|
|
14
|
+
position: relative;
|
|
15
|
+
`;
|
|
16
|
+
|
|
17
|
+
export const StyledSelectDropdownButton = styled(Button)`
|
|
18
|
+
height: 100%;
|
|
19
|
+
min-height: 0;
|
|
20
|
+
`;
|
|
21
|
+
|
|
22
|
+
export const StyledSelectDropdownContainer = styled.div<StyledDivProps>`
|
|
23
|
+
position: absolute;
|
|
24
|
+
top: calc(100% + var(--spacing-4px, 4px));
|
|
25
|
+
left: 0;
|
|
26
|
+
width: max-content;
|
|
27
|
+
min-width: 100%;
|
|
28
|
+
max-width: 300px;
|
|
29
|
+
max-height: 300px;
|
|
30
|
+
overflow: hidden;
|
|
31
|
+
padding: var(--spacing-8px, 8px);
|
|
32
|
+
font-family: var(--font-family, 'Mono Sans');
|
|
33
|
+
display: flex;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
align-items: flex-start;
|
|
36
|
+
gap: var(--spacing-4px, 4px);
|
|
37
|
+
border-radius: var(--spacing-12px, 12px);
|
|
38
|
+
border: var(--spacing-1px, 1px) solid var(--border, #e1e5ea);
|
|
39
|
+
background: var(--bg-primary, #fff);
|
|
40
|
+
box-shadow: var(--spacing-2px, 2px) var(--spacing-4px, 4px)
|
|
41
|
+
var(--spacing-8px, 8px) var(--spacing-0px, 0px) rgba(0, 0, 0, 0.06);
|
|
42
|
+
`;
|
|
43
|
+
|
|
44
|
+
export const StyledSelectDropdownList = styled.div`
|
|
45
|
+
width: 100%;
|
|
46
|
+
overflow: auto;
|
|
47
|
+
`;
|
|
48
|
+
|
|
49
|
+
export const StyledSelectDropdownItem = styled.div<StyledSelectDropdownItemProps>`
|
|
50
|
+
width: 100%;
|
|
51
|
+
display: flex;
|
|
52
|
+
align-items: center;
|
|
53
|
+
align-self: stretch;
|
|
54
|
+
gap: var(--spacing-8px, 8px);
|
|
55
|
+
padding: var(--spacing-8px, 8px) var(--spacing-4px, 4px);
|
|
56
|
+
border-radius: var(--spacing-4px, 4px);
|
|
57
|
+
color: var(--text-secondary, #5b6271);
|
|
58
|
+
font-size: var(--spacing-14px, 14px);
|
|
59
|
+
font-style: normal;
|
|
60
|
+
font-weight: 500;
|
|
61
|
+
cursor: pointer;
|
|
62
|
+
|
|
63
|
+
&:hover {
|
|
64
|
+
background: var(--bg-secondary, #f6f7f9);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
${({ $disabled }) =>
|
|
68
|
+
$disabled &&
|
|
69
|
+
css`
|
|
70
|
+
color: var(--text-disabled, #8c95a6);
|
|
71
|
+
cursor: default;
|
|
72
|
+
&:hover {
|
|
73
|
+
background: var(--bg-primary, #fff);
|
|
74
|
+
}
|
|
75
|
+
`}
|
|
76
|
+
`;
|
|
77
|
+
|
|
78
|
+
export const StyledDropdownSearchContainer = styled.div`
|
|
79
|
+
width: 100%;
|
|
80
|
+
height: var(--spacing-36px, 36px);
|
|
81
|
+
padding: var(--spacing-12px, 12px);
|
|
82
|
+
display: flex;
|
|
83
|
+
align-items: center;
|
|
84
|
+
align-self: stretch;
|
|
85
|
+
gap: var(--spacing-8px, 8px);
|
|
86
|
+
border-radius: var(--corner-radius-8px, 8px);
|
|
87
|
+
border: var(--spacing-1px, 1px) solid var(--border-neutral, #e1e5ea);
|
|
88
|
+
background: var(--bg-primary, #ffffff);
|
|
89
|
+
`;
|
|
90
|
+
|
|
91
|
+
export const StyledDropdownSearchInput = styled.input<StyledDropdownSearchInputProps>`
|
|
92
|
+
outline: none;
|
|
93
|
+
border: none;
|
|
94
|
+
background: var(--bg-primary, #ffffff);
|
|
95
|
+
color: var(--text-primary, #16191d);
|
|
96
|
+
font-size: var(--spacing-14px, 14px);
|
|
97
|
+
font-style: normal;
|
|
98
|
+
font-weight: 500;
|
|
99
|
+
`;
|