@spaced-out/ui-design-system 0.3.38 → 0.3.39-beta.0

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.
Files changed (307) hide show
  1. package/.cspell/custom-words.txt +4 -0
  2. package/.github/workflows/publish_to_npm.yml +32 -4
  3. package/CHANGELOG.md +14 -0
  4. package/dts-generator/.editorconfig +10 -0
  5. package/dts-generator/.gitattributes +4 -0
  6. package/dts-generator/README.md +63 -0
  7. package/dts-generator/convert.js +101 -0
  8. package/dts-generator/package.json +16 -0
  9. package/gulpfile.js +20 -1
  10. package/lib/components/Avatar/Avatar.d.ts +264 -0
  11. package/lib/components/Avatar/index.d.ts +1 -0
  12. package/lib/components/AvatarGroup/AvatarGroup.d.ts +161 -0
  13. package/lib/components/AvatarGroup/index.d.ts +1 -0
  14. package/lib/components/Badge/Badge.d.ts +138 -0
  15. package/lib/components/Badge/index.d.ts +1 -0
  16. package/lib/components/Banner/Banner.d.ts +52 -0
  17. package/lib/components/Banner/index.d.ts +1 -0
  18. package/lib/components/Breadcrumbs/BreadcrumbLink/BreadcrumbLink.d.ts +50 -0
  19. package/lib/components/Breadcrumbs/BreadcrumbLink/index.d.ts +1 -0
  20. package/lib/components/Breadcrumbs/Breadcrumbs.d.ts +64 -0
  21. package/lib/components/Breadcrumbs/index.d.ts +2 -0
  22. package/lib/components/Button/Button.d.ts +288 -0
  23. package/lib/components/Button/index.d.ts +14 -0
  24. package/lib/components/ButtonDropdown/ButtonDropdown.d.ts +192 -0
  25. package/lib/components/ButtonDropdown/SimpleButtonDropdown.d.ts +148 -0
  26. package/lib/components/ButtonDropdown/index.d.ts +2 -0
  27. package/lib/components/ButtonTabs/ButtonTab/ButtonTab.d.ts +82 -0
  28. package/lib/components/ButtonTabs/ButtonTab/index.d.ts +1 -0
  29. package/lib/components/ButtonTabs/ButtonTabDropdown.d.ts +118 -0
  30. package/lib/components/ButtonTabs/ButtonTabs.d.ts +113 -0
  31. package/lib/components/ButtonTabs/index.d.ts +2 -0
  32. package/lib/components/Card/Card.d.ts +163 -0
  33. package/lib/components/Card/index.d.ts +1 -0
  34. package/lib/components/Charts/ChartTooltip/index.d.ts +10 -0
  35. package/lib/components/Charts/ChartWrapper/ChartWrapper.d.ts +184 -0
  36. package/lib/components/Charts/ChartWrapper/index.d.ts +1 -0
  37. package/lib/components/Charts/ColumnChart/ColumnChart.d.ts +111 -0
  38. package/lib/components/Charts/ColumnChart/index.d.ts +1 -0
  39. package/lib/components/Charts/DonutChart/DonutChart.d.ts +142 -0
  40. package/lib/components/Charts/DonutChart/index.d.ts +1 -0
  41. package/lib/components/Charts/FunnelChart/FunnelChart.d.ts +99 -0
  42. package/lib/components/Charts/FunnelChart/index.d.ts +1 -0
  43. package/lib/components/Charts/LineChart/LineChart.d.ts +97 -0
  44. package/lib/components/Charts/LineChart/index.d.ts +1 -0
  45. package/lib/components/Charts/SpiderChart/SpiderChart.d.ts +95 -0
  46. package/lib/components/Charts/SpiderChart/index.d.ts +1 -0
  47. package/lib/components/Charts/index.d.ts +7 -0
  48. package/lib/components/ChatBubble/ChatBubble.d.ts +203 -0
  49. package/lib/components/ChatBubble/index.d.ts +1 -0
  50. package/lib/components/Checkbox/Checkbox.d.ts +165 -0
  51. package/lib/components/Checkbox/CheckboxGroup.d.ts +113 -0
  52. package/lib/components/Checkbox/index.d.ts +2 -0
  53. package/lib/components/Chip/Chip.d.ts +181 -0
  54. package/lib/components/Chip/index.d.ts +2 -0
  55. package/lib/components/CircularLoader/CircularLoader.d.ts +56 -0
  56. package/lib/components/CircularLoader/index.d.ts +1 -0
  57. package/lib/components/CollapsibleCard/CollapsibleCard.d.ts +134 -0
  58. package/lib/components/CollapsibleCard/index.d.ts +1 -0
  59. package/lib/components/Combobox/Combobox.d.ts +292 -0
  60. package/lib/components/Combobox/helper.d.ts +205 -0
  61. package/lib/components/Combobox/index.d.ts +1 -0
  62. package/lib/components/ConditionalWrapper/ConditionalWrapper.d.ts +12 -0
  63. package/lib/components/ConditionalWrapper/index.d.ts +1 -0
  64. package/lib/components/DateRangePicker/Calendar.d.ts +119 -0
  65. package/lib/components/DateRangePicker/DateRangePicker.d.ts +196 -0
  66. package/lib/components/DateRangePicker/DateRangeWrapper.d.ts +311 -0
  67. package/lib/components/DateRangePicker/Day.d.ts +70 -0
  68. package/lib/components/DateRangePicker/index.d.ts +1 -0
  69. package/lib/components/Dialog/Dialog.d.ts +208 -0
  70. package/lib/components/Dialog/index.d.ts +1 -0
  71. package/lib/components/Disclaimer/Disclaimer.d.ts +32 -0
  72. package/lib/components/Disclaimer/index.d.ts +1 -0
  73. package/lib/components/Dropdown/Dropdown.d.ts +145 -0
  74. package/lib/components/Dropdown/SimpleDropdown.d.ts +142 -0
  75. package/lib/components/Dropdown/index.d.ts +2 -0
  76. package/lib/components/EmptyState/EmptyImages/CalendarEmptyImage.d.ts +108 -0
  77. package/lib/components/EmptyState/EmptyImages/ChartEmptyImage.d.ts +194 -0
  78. package/lib/components/EmptyState/EmptyImages/DataEmptyImage.d.ts +116 -0
  79. package/lib/components/EmptyState/EmptyImages/FileEmptyImage.d.ts +133 -0
  80. package/lib/components/EmptyState/EmptyImages/MessageEmptyImage.d.ts +64 -0
  81. package/lib/components/EmptyState/EmptyImages/UploadEmptyImage.d.ts +67 -0
  82. package/lib/components/EmptyState/EmptyImages/index.d.ts +6 -0
  83. package/lib/components/EmptyState/EmptyState.d.ts +82 -0
  84. package/lib/components/EmptyState/index.d.ts +1 -0
  85. package/lib/components/ErrorMessage/ErrorImages/ForbiddenImage.d.ts +85 -0
  86. package/lib/components/ErrorMessage/ErrorImages/NotFoundImage.d.ts +117 -0
  87. package/lib/components/ErrorMessage/ErrorImages/ServerErrorImage.d.ts +237 -0
  88. package/lib/components/ErrorMessage/ErrorImages/UnauthorizedImage.d.ts +73 -0
  89. package/lib/components/ErrorMessage/ErrorImages/index.d.ts +4 -0
  90. package/lib/components/ErrorMessage/ErrorMessage.d.ts +86 -0
  91. package/lib/components/ErrorMessage/index.d.ts +1 -0
  92. package/lib/components/FileUpload/FileBlock/FileBlock.d.ts +137 -0
  93. package/lib/components/FileUpload/FileBlock/index.d.ts +1 -0
  94. package/lib/components/FileUpload/FileUpload.d.ts +190 -0
  95. package/lib/components/FileUpload/index.d.ts +2 -0
  96. package/lib/components/FocusManager/FocusManager.d.ts +52 -0
  97. package/lib/components/FocusManager/index.d.ts +1 -0
  98. package/lib/components/FocusManagerWithArrowKeyNavigation/FocusManagerWithArrowKeyNavigation.d.ts +137 -0
  99. package/lib/components/FocusManagerWithArrowKeyNavigation/index.d.ts +1 -0
  100. package/lib/components/FormTitleWrapper/FormTitleWrapper.d.ts +62 -0
  101. package/lib/components/FormTitleWrapper/index.d.ts +1 -0
  102. package/lib/components/Grid/Grid.d.ts +104 -0
  103. package/lib/components/Grid/index.d.ts +1 -0
  104. package/lib/components/Icon/ClickableIcon.d.ts +101 -0
  105. package/lib/components/Icon/Icon.d.ts +71 -0
  106. package/lib/components/Icon/Icon.docs.d.ts +138 -0
  107. package/lib/components/Icon/SemanticIcon.d.ts +42 -0
  108. package/lib/components/Icon/index.d.ts +3 -0
  109. package/lib/components/InContextAlert/InContextAlert.d.ts +210 -0
  110. package/lib/components/InContextAlert/index.d.ts +1 -0
  111. package/lib/components/InlineDropdown/InlineDropdown.d.ts +146 -0
  112. package/lib/components/InlineDropdown/SimpleInlineDropdown.d.ts +145 -0
  113. package/lib/components/InlineDropdown/index.d.ts +2 -0
  114. package/lib/components/Input/Input.d.ts +327 -0
  115. package/lib/components/Input/index.d.ts +1 -0
  116. package/lib/components/KPIBox/KPIBox.d.ts +89 -0
  117. package/lib/components/KPIBox/index.d.ts +1 -0
  118. package/lib/components/LinearLoader/LinearLoader.d.ts +44 -0
  119. package/lib/components/LinearLoader/index.d.ts +1 -0
  120. package/lib/components/Link/Link.d.ts +225 -0
  121. package/lib/components/Link/index.d.ts +1 -0
  122. package/lib/components/Menu/Menu.d.ts +379 -0
  123. package/lib/components/Menu/MenuOptionButton.d.ts +199 -0
  124. package/lib/components/Menu/index.d.ts +2 -0
  125. package/lib/components/Modal/Modal.d.ts +354 -0
  126. package/lib/components/Modal/index.d.ts +14 -0
  127. package/lib/components/Notification/Notification.d.ts +147 -0
  128. package/lib/components/Notification/index.d.ts +1 -0
  129. package/lib/components/OptionButton/OptionButton.d.ts +150 -0
  130. package/lib/components/OptionButton/SimpleOptionButton.d.ts +150 -0
  131. package/lib/components/OptionButton/index.d.ts +2 -0
  132. package/lib/components/PageTitle/PageTitle.d.ts +256 -0
  133. package/lib/components/PageTitle/index.d.ts +1 -0
  134. package/lib/components/Pagination/Pagination.d.ts +144 -0
  135. package/lib/components/Pagination/PaginationItem.d.ts +136 -0
  136. package/lib/components/Pagination/index.d.ts +1 -0
  137. package/lib/components/Panel/Panel.d.ts +168 -0
  138. package/lib/components/Panel/index.d.ts +9 -0
  139. package/lib/components/ProgressDonut/ProgressDonut.d.ts +102 -0
  140. package/lib/components/ProgressDonut/index.d.ts +1 -0
  141. package/lib/components/PromptChip/PromptChip.d.ts +167 -0
  142. package/lib/components/PromptChip/index.d.ts +1 -0
  143. package/lib/components/PromptInput/PromptInput.d.ts +189 -0
  144. package/lib/components/PromptInput/index.d.ts +1 -0
  145. package/lib/components/RadioButton/RadioButton.d.ts +132 -0
  146. package/lib/components/RadioButton/RadioGroup.d.ts +88 -0
  147. package/lib/components/RadioButton/index.d.ts +2 -0
  148. package/lib/components/RadioTile/RadioTile.d.ts +109 -0
  149. package/lib/components/RadioTile/index.d.ts +1 -0
  150. package/lib/components/RangeSlider/RangeSlider.d.ts +207 -0
  151. package/lib/components/RangeSlider/index.d.ts +1 -0
  152. package/lib/components/Rating/Rating.d.ts +131 -0
  153. package/lib/components/Rating/index.d.ts +1 -0
  154. package/lib/components/ScoreBar/ScoreBar.d.ts +122 -0
  155. package/lib/components/ScoreBar/index.d.ts +1 -0
  156. package/lib/components/SearchInput/SearchInput.d.ts +79 -0
  157. package/lib/components/SearchInput/index.d.ts +2 -0
  158. package/lib/components/Separator/Separator.d.ts +51 -0
  159. package/lib/components/Separator/index.d.ts +1 -0
  160. package/lib/components/Shimmer/Shimmer.d.ts +131 -0
  161. package/lib/components/Shimmer/index.d.ts +1 -0
  162. package/lib/components/SideMenuLink/SideMenuLink.d.ts +336 -0
  163. package/lib/components/SideMenuLink/index.d.ts +1 -0
  164. package/lib/components/StatusIndicator/StatusIndicator.d.ts +60 -0
  165. package/lib/components/StatusIndicator/index.d.ts +1 -0
  166. package/lib/components/Stepper/Step/Step.d.ts +119 -0
  167. package/lib/components/Stepper/Step/StepContent.d.ts +35 -0
  168. package/lib/components/Stepper/Step/StepLabel.d.ts +35 -0
  169. package/lib/components/Stepper/Step/index.d.ts +3 -0
  170. package/lib/components/Stepper/Stepper.d.ts +60 -0
  171. package/lib/components/Stepper/index.d.ts +2 -0
  172. package/lib/components/StickyBar/StickyBar.d.ts +55 -0
  173. package/lib/components/StickyBar/index.d.ts +1 -0
  174. package/lib/components/SubMenu/SubMenu.d.ts +89 -0
  175. package/lib/components/SubMenu/SubMenuGroup.d.ts +156 -0
  176. package/lib/components/SubMenu/SubMenuItem.d.ts +161 -0
  177. package/lib/components/SubMenu/SubMenuLink.d.ts +81 -0
  178. package/lib/components/SubMenu/index.d.ts +4 -0
  179. package/lib/components/Table/Cell.d.ts +107 -0
  180. package/lib/components/Table/DefaultRow.d.ts +144 -0
  181. package/lib/components/Table/DefaultTableHeader.d.ts +236 -0
  182. package/lib/components/Table/StaticTable.d.ts +198 -0
  183. package/lib/components/Table/Table.d.ts +113 -0
  184. package/lib/components/Table/Table.docs.d.ts +532 -0
  185. package/lib/components/Table/TableActionBar.d.ts +48 -0
  186. package/lib/components/Table/TableBottomBar.d.ts +20 -0
  187. package/lib/components/Table/TableTopBar.d.ts +20 -0
  188. package/lib/components/Table/dummyTableData.d.ts +2189 -0
  189. package/lib/components/Table/hooks.d.ts +98 -0
  190. package/lib/components/Table/index.d.ts +8 -0
  191. package/lib/components/Tabs/Tab/Tab.d.ts +146 -0
  192. package/lib/components/Tabs/Tab/index.d.ts +1 -0
  193. package/lib/components/Tabs/TabList/TabDropdown.d.ts +100 -0
  194. package/lib/components/Tabs/TabList/TabList.d.ts +157 -0
  195. package/lib/components/Tabs/TabList/index.d.ts +1 -0
  196. package/lib/components/Tabs/index.d.ts +2 -0
  197. package/lib/components/Text/Text.d.ts +1021 -0
  198. package/lib/components/Text/index.d.ts +30 -0
  199. package/lib/components/TextTile/TextTile.d.ts +40 -0
  200. package/lib/components/TextTile/index.d.ts +1 -0
  201. package/lib/components/Textarea/Textarea.d.ts +132 -0
  202. package/lib/components/Textarea/index.d.ts +2 -0
  203. package/lib/components/Timeline/Timeline.d.ts +40 -0
  204. package/lib/components/Timeline/TimelineItem/TimelineItem.d.ts +121 -0
  205. package/lib/components/Timeline/TimelineItem/index.d.ts +1 -0
  206. package/lib/components/Timeline/index.d.ts +2 -0
  207. package/lib/components/Toast/Toast.d.ts +248 -0
  208. package/lib/components/Toast/ToastContainer.d.ts +140 -0
  209. package/lib/components/Toast/ToastManager.d.ts +58 -0
  210. package/lib/components/Toast/index.d.ts +10 -0
  211. package/lib/components/Toggle/Toggle.d.ts +111 -0
  212. package/lib/components/Toggle/index.d.ts +1 -0
  213. package/lib/components/TokenListInput/TokenListInput.d.ts +333 -0
  214. package/lib/components/TokenListInput/TokenValueChips.d.ts +64 -0
  215. package/lib/components/TokenListInput/index.d.ts +1 -0
  216. package/lib/components/Tooltip/Tooltip.d.ts +186 -0
  217. package/lib/components/Tooltip/index.d.ts +1 -0
  218. package/lib/components/Truncate/Truncate.d.ts +87 -0
  219. package/lib/components/Truncate/index.d.ts +2 -0
  220. package/lib/components/TruncatedTextWithTooltip/TruncatedTextWithTooltip.d.ts +95 -0
  221. package/lib/components/TruncatedTextWithTooltip/index.d.ts +1 -0
  222. package/lib/components/Typeahead/SimpleTypeahead.d.ts +141 -0
  223. package/lib/components/Typeahead/Typeahead.d.ts +217 -0
  224. package/lib/components/Typeahead/index.d.ts +2 -0
  225. package/lib/components/WeekdayPicker/WeekdayPicker.d.ts +242 -0
  226. package/lib/components/WeekdayPicker/index.d.ts +1 -0
  227. package/lib/components/index.d.ts +71 -0
  228. package/lib/hooks/index.d.ts +12 -0
  229. package/lib/hooks/useArbitraryOptionAddition/index.d.ts +1 -0
  230. package/lib/hooks/useArbitraryOptionAddition/useArbitraryOptionAddition.d.ts +124 -0
  231. package/lib/hooks/useCopyToClipboard/index.d.ts +1 -0
  232. package/lib/hooks/useCopyToClipboard/useCopyToClipboard.d.ts +27 -0
  233. package/lib/hooks/useFileUpload/index.d.ts +1 -0
  234. package/lib/hooks/useFileUpload/useFileUpload.d.ts +342 -0
  235. package/lib/hooks/useFilteredOptions/index.d.ts +1 -0
  236. package/lib/hooks/useFilteredOptions/useFilteredOptions.d.ts +87 -0
  237. package/lib/hooks/useInputState/index.d.ts +1 -0
  238. package/lib/hooks/useInputState/useInputState.d.ts +22 -0
  239. package/lib/hooks/useLockedBody/index.d.ts +1 -0
  240. package/lib/hooks/useLockedBody/useLockedBody.d.ts +46 -0
  241. package/lib/hooks/useModal/index.d.ts +1 -0
  242. package/lib/hooks/useModal/useModal.d.ts +32 -0
  243. package/lib/hooks/useMountTransition/index.d.ts +24 -0
  244. package/lib/hooks/usePagination/index.d.ts +1 -0
  245. package/lib/hooks/usePagination/usePagination.d.ts +140 -0
  246. package/lib/hooks/useToastPortal/index.d.ts +1 -0
  247. package/lib/hooks/useToastPortal/useToastPortal.d.ts +31 -0
  248. package/lib/hooks/useToggle/index.d.ts +1 -0
  249. package/lib/hooks/useToggle/useToggle.d.ts +11 -0
  250. package/lib/hooks/useWindowSize/index.d.ts +1 -0
  251. package/lib/hooks/useWindowSize/useWindowSize.d.ts +28 -0
  252. package/lib/index.d.ts +5 -0
  253. package/lib/styles/index.d.ts +267 -0
  254. package/lib/styles/variables/_border.d.ts +12 -0
  255. package/lib/styles/variables/_color.d.ts +104 -0
  256. package/lib/styles/variables/_elevation.d.ts +7 -0
  257. package/lib/styles/variables/_font.d.ts +30 -0
  258. package/lib/styles/variables/_motion.d.ts +6 -0
  259. package/lib/styles/variables/_opacity.d.ts +15 -0
  260. package/lib/styles/variables/_shadow.d.ts +24 -0
  261. package/lib/styles/variables/_size.d.ts +57 -0
  262. package/lib/styles/variables/_space.d.ts +12 -0
  263. package/lib/types/charts.d.ts +225 -0
  264. package/lib/types/common.d.ts +10 -0
  265. package/lib/types/date-range-picker.d.ts +17 -0
  266. package/lib/types/date-range-picker.js.flow +2 -3
  267. package/lib/types/index.d.ts +6 -0
  268. package/lib/types/menu.d.ts +13 -0
  269. package/lib/types/toast.d.ts +32 -0
  270. package/lib/types/typography.d.ts +17 -0
  271. package/lib/utils/array/are-arrays-equal.d.ts +11 -0
  272. package/lib/utils/array/index.d.ts +1 -0
  273. package/lib/utils/charts/charts.d.ts +102 -0
  274. package/lib/utils/charts/columnChart.d.ts +51 -0
  275. package/lib/utils/charts/donutChart.d.ts +116 -0
  276. package/lib/utils/charts/funnelChart.d.ts +94 -0
  277. package/lib/utils/charts/helpers.d.ts +44 -0
  278. package/lib/utils/charts/index.d.ts +7 -0
  279. package/lib/utils/charts/lineChart.d.ts +44 -0
  280. package/lib/utils/charts/spiderChart.d.ts +46 -0
  281. package/lib/utils/charts/typography.d.ts +42 -0
  282. package/lib/utils/classify/index.d.ts +27 -0
  283. package/lib/utils/click-away/click-away.d.ts +194 -0
  284. package/lib/utils/click-away/index.d.ts +1 -0
  285. package/lib/utils/date-range-picker/date-range-picker.d.ts +391 -0
  286. package/lib/utils/date-range-picker/index.d.ts +2 -0
  287. package/lib/utils/date-range-picker/timezones.d.ts +262 -0
  288. package/lib/utils/dom/dom.d.ts +245 -0
  289. package/lib/utils/dom/index.d.ts +1 -0
  290. package/lib/utils/helpers/helpers.d.ts +48 -0
  291. package/lib/utils/helpers/index.d.ts +1 -0
  292. package/lib/utils/index.d.ts +14 -0
  293. package/lib/utils/makeClassNameComponent/index.d.ts +1 -0
  294. package/lib/utils/makeClassNameComponent/makeClassNameComponent.d.ts +73 -0
  295. package/lib/utils/menu/index.d.ts +1 -0
  296. package/lib/utils/merge-refs/index.d.ts +1 -0
  297. package/lib/utils/merge-refs/merge-refs.d.ts +15 -0
  298. package/lib/utils/rating/index.d.ts +1 -0
  299. package/lib/utils/rating/rating.d.ts +31 -0
  300. package/lib/utils/score-bar/index.d.ts +1 -0
  301. package/lib/utils/score-bar/score-bar.d.ts +54 -0
  302. package/lib/utils/string/index.d.ts +1 -0
  303. package/lib/utils/string/string.d.ts +30 -0
  304. package/lib/utils/token-list-input/token-list-input.d.ts +32 -0
  305. package/lib/utils/tokens/index.d.ts +1 -0
  306. package/lib/utils/tokens/tokens.d.ts +230 -0
  307. package/package.json +5 -5
@@ -0,0 +1,288 @@
1
+ import {$ReadOnly, $Values, $Keys} from 'utility-types';
2
+ import * as React from 'react';
3
+ import {classify} from '../../utils/classify';
4
+ import {CircularLoader} from '../CircularLoader';
5
+ import type {IconType} from '../Icon';
6
+ import {Icon} from '../Icon';
7
+ import {Truncate} from '../Truncate';
8
+ import css from './Button.module.css';
9
+ type ClassNames = $ReadOnly<{
10
+ wrapper?: string;
11
+ icon?: string;
12
+ text?: string;
13
+ }>;
14
+
15
+ /**
16
+ * Note(Nishant): Although Button supports gradient as a type, its not currently customizable really.
17
+ * This only supports pre-defined gradient that moves from left to right.
18
+ * If someone wants to add more gradients, the expectation is that they would add it through a wrapper className.
19
+ *
20
+ * We could have taken an extra prop to take in the Gradient colors but that should not be encouraged
21
+ * as it would add an additional overhead on the component to figure out exact color values from string tokens
22
+ * and since this is rarely used type anyway, it should be avoided.
23
+ */
24
+ export const BUTTON_TYPES = Object.freeze({
25
+ primary: 'primary',
26
+ secondary: 'secondary',
27
+ tertiary: 'tertiary',
28
+ ghost: 'ghost',
29
+ danger: 'danger',
30
+ gradient: 'gradient',
31
+ });
32
+ export const BUTTON_ACTION_TYPE = Object.freeze({
33
+ button: 'button',
34
+ submit: 'submit',
35
+ reset: 'reset',
36
+ });
37
+ export const BUTTON_SIZE = Object.freeze({
38
+ small: 'small',
39
+ medium: 'medium',
40
+ });
41
+ export type ButtonType = $Values<typeof BUTTON_TYPES>;
42
+ export type ButtonActionType = $Values<typeof BUTTON_ACTION_TYPE>;
43
+ export type ButtonSize = $Keys<typeof BUTTON_SIZE>;
44
+ export type BaseButtonProps = {
45
+ children?: React.ReactNode;
46
+ disabled?: unknown;
47
+ actionType?: ButtonActionType;
48
+ onClick?:
49
+ | ((arg0: React.SyntheticEvent<HTMLElement>) => unknown)
50
+ | null
51
+ | undefined;
52
+ ariaLabel?: string;
53
+ tabIndex?: number;
54
+ isLoading?: boolean;
55
+ role?: string;
56
+ };
57
+ export type UnstyledButtonProps = BaseButtonProps & {
58
+ className?: string;
59
+ };
60
+ export type ButtonProps = BaseButtonProps & {
61
+ classNames?: ClassNames;
62
+ iconLeftName?: string;
63
+ iconLeftType?: IconType;
64
+ iconRightName?: string;
65
+ iconRightType?: IconType;
66
+ type?: ButtonType;
67
+ isFluid?: boolean;
68
+ size?: ButtonSize;
69
+ };
70
+ const ButtonTypeToIconColorMap = {
71
+ primary: 'inversePrimary',
72
+ secondary: 'clickable',
73
+ tertiary: 'primary',
74
+ ghost: 'primary',
75
+ danger: 'inversePrimary',
76
+ gradient: 'inversePrimary',
77
+ };
78
+ const ButtonTypeToLoaderColorMap = {
79
+ primary: 'colorTextInversePrimary',
80
+ secondary: 'colorTextClickable',
81
+ tertiary: 'colorTextPrimary',
82
+ ghost: 'colorTextPrimary',
83
+ danger: 'colorTextInversePrimary',
84
+ gradient: 'colorTextInversePrimary',
85
+ };
86
+ export const UnstyledButton: React$AbstractComponent<
87
+ UnstyledButtonProps,
88
+ HTMLButtonElement
89
+ > = React.forwardRef<UnstyledButtonProps, HTMLButtonElement>(
90
+ (
91
+ {
92
+ disabled,
93
+ onClick,
94
+ className,
95
+ ariaLabel,
96
+ actionType,
97
+ tabIndex = 0,
98
+ isLoading,
99
+ role = 'button',
100
+ ...props
101
+ }: UnstyledButtonProps,
102
+ ref,
103
+ ) => (
104
+ <button
105
+ {...props}
106
+ {...(ariaLabel
107
+ ? {
108
+ 'aria-label': ariaLabel,
109
+ }
110
+ : {})}
111
+ className={className}
112
+ ref={ref}
113
+ role={role}
114
+ disabled={disabled}
115
+ tabIndex={disabled ? -1 : tabIndex}
116
+ type={actionType}
117
+ onClick={(event) => {
118
+ if (disabled || isLoading) {
119
+ event.preventDefault();
120
+ } else if (onClick) {
121
+ onClick(event);
122
+ }
123
+ }}
124
+ />
125
+ ),
126
+ );
127
+ export const Button: React$AbstractComponent<ButtonProps, HTMLButtonElement> =
128
+ React.forwardRef<ButtonProps, HTMLButtonElement>(
129
+ (
130
+ {
131
+ classNames,
132
+ children,
133
+ iconLeftName = '',
134
+ iconLeftType = 'regular',
135
+ iconRightName = '',
136
+ iconRightType = 'regular',
137
+ type = 'primary',
138
+ isFluid = false,
139
+ disabled = false,
140
+ actionType = 'button',
141
+ size = 'medium',
142
+ isLoading,
143
+ ...props
144
+ }: ButtonProps,
145
+ ref,
146
+ ) => (
147
+ <UnstyledButton
148
+ {...props}
149
+ actionType={actionType}
150
+ disabled={disabled}
151
+ isLoading={isLoading}
152
+ className={classify(
153
+ css.button,
154
+ {
155
+ [css.primary]: type === 'primary',
156
+ [css.secondary]: type === 'secondary',
157
+ [css.tertiary]: type === 'tertiary',
158
+ [css.ghost]: type === 'ghost',
159
+ [css.danger]: type === 'danger',
160
+ [css.gradient]: type === 'gradient',
161
+ [css.disabled]: disabled,
162
+ [css.small]: size === 'small',
163
+ [css.medium]: size === 'medium',
164
+ [css.isFluid]: isFluid === true,
165
+ [css.withIconLeft]: !!iconLeftName,
166
+ [css.withIconRight]: !!iconRightName,
167
+ [css.withBothIcon]: !!(iconLeftName && iconRightName),
168
+ [css.onlyIcon]: (iconLeftName || iconRightName) && !children,
169
+ },
170
+ classNames?.wrapper,
171
+ )}
172
+ ref={ref}
173
+ >
174
+ <div className={css.buttonRow}>
175
+ {/* Has no icon, only child */}
176
+ {!(iconLeftName || iconRightName) ? (
177
+ <div className={classify(css.textContainer, classNames?.text)}>
178
+ {isLoading && (
179
+ <div className={css.loader}>
180
+ <CircularLoader
181
+ size={size}
182
+ colorToken={
183
+ disabled
184
+ ? 'colorTextDisabled'
185
+ : ButtonTypeToLoaderColorMap[type]
186
+ }
187
+ />
188
+ </div>
189
+ )}
190
+ <Truncate
191
+ className={classify({
192
+ [css.hidden]: isLoading,
193
+ })}
194
+ >
195
+ {children}
196
+ </Truncate>
197
+ </div> // has icon, but no child
198
+ ) : children == null ? (
199
+ <>
200
+ {isLoading && (
201
+ <div className={css.loader}>
202
+ <CircularLoader
203
+ size={size}
204
+ colorToken={
205
+ disabled
206
+ ? 'colorTextDisabled'
207
+ : ButtonTypeToLoaderColorMap[type]
208
+ }
209
+ />
210
+ </div>
211
+ )}
212
+ <Icon
213
+ name={iconLeftName || iconRightName}
214
+ color={disabled ? 'disabled' : ButtonTypeToIconColorMap[type]}
215
+ size={size === 'medium' ? 'medium' : 'small'}
216
+ type={iconLeftName ? iconLeftType : iconRightType}
217
+ className={classify(
218
+ {
219
+ [css.hidden]: isLoading,
220
+ },
221
+ classNames?.icon,
222
+ )}
223
+ />
224
+ </> // has icon _and_ child
225
+ ) : (
226
+ (iconLeftName || iconRightName) && (
227
+ <>
228
+ {iconLeftName && (
229
+ <Icon
230
+ name={iconLeftName}
231
+ color={
232
+ disabled ? 'disabled' : ButtonTypeToIconColorMap[type]
233
+ }
234
+ size={size === 'medium' ? 'medium' : 'small'}
235
+ type={iconLeftType}
236
+ className={classify(
237
+ {
238
+ [css.hidden]: isLoading,
239
+ },
240
+ classNames?.icon,
241
+ )}
242
+ />
243
+ )}
244
+ <div className={classify(css.textContainer, classNames?.text)}>
245
+ {isLoading && (
246
+ <div className={css.loader}>
247
+ <CircularLoader
248
+ size={size}
249
+ colorToken={
250
+ disabled
251
+ ? 'colorTextDisabled'
252
+ : ButtonTypeToLoaderColorMap[type]
253
+ }
254
+ />
255
+ </div>
256
+ )}
257
+ <Truncate
258
+ className={classify({
259
+ [css.hidden]: isLoading,
260
+ })}
261
+ >
262
+ {children}
263
+ </Truncate>
264
+ </div>
265
+ {iconRightName && (
266
+ <Icon
267
+ name={iconRightName}
268
+ color={
269
+ disabled ? 'disabled' : ButtonTypeToIconColorMap[type]
270
+ }
271
+ size={size === 'medium' ? 'medium' : 'small'}
272
+ type={iconRightType}
273
+ className={classify(
274
+ {
275
+ [css.hidden]: isLoading,
276
+ },
277
+ classNames?.icon,
278
+ )}
279
+ />
280
+ )}
281
+ </>
282
+ )
283
+ )}
284
+ </div>
285
+ </UnstyledButton>
286
+ ),
287
+ );
288
+ Button.name = Button.displayName = 'Button';
@@ -0,0 +1,14 @@
1
+ export type {
2
+ ButtonActionType,
3
+ ButtonProps,
4
+ ButtonSize,
5
+ ButtonType,
6
+ UnstyledButtonProps,
7
+ } from './Button';
8
+ export {
9
+ Button,
10
+ BUTTON_ACTION_TYPE,
11
+ BUTTON_SIZE,
12
+ BUTTON_TYPES,
13
+ UnstyledButton,
14
+ } from './Button';
@@ -0,0 +1,192 @@
1
+ import {$Values, $ReadOnly} from 'utility-types';
2
+ import * as React from 'react';
3
+ import {
4
+ // $FlowFixMe[untyped-import]
5
+ autoUpdate, // $FlowFixMe[untyped-import]
6
+ flip, // $FlowFixMe[untyped-import]
7
+ offset, // $FlowFixMe[untyped-import]
8
+ shift, // $FlowFixMe[untyped-import]
9
+ useFloating,
10
+ } from '@floating-ui/react';
11
+ import {sizeFluid} from '../../styles/variables/_size';
12
+ import {spaceNone, spaceXXSmall} from '../../styles/variables/_space';
13
+ import {classify} from '../../utils/classify';
14
+ import type {ClickAwayRefType} from '../../utils/click-away';
15
+ import {ClickAway} from '../../utils/click-away';
16
+ import {mergeRefs} from '../../utils/merge-refs';
17
+ import type {ButtonProps} from '../Button';
18
+ import {Button} from '../Button';
19
+ import {ConditionalWrapper} from '../ConditionalWrapper';
20
+ import type {MenuOption, MenuProps} from '../Menu';
21
+ import {Menu} from '../Menu';
22
+ import type {BaseTooltipProps} from '../Tooltip';
23
+ import {Tooltip} from '../Tooltip';
24
+ import css from './ButtonDropdown.module.css';
25
+ export const ANCHOR_POSITION_TYPE = Object.freeze({
26
+ top: 'top',
27
+ topStart: 'top-start',
28
+ topEnd: 'top-end',
29
+ bottom: 'bottom',
30
+ bottomStart: 'bottom-start',
31
+ bottomEnd: 'bottom-end',
32
+ });
33
+ export const STRATEGY_TYPE = Object.freeze({
34
+ absolute: 'absolute',
35
+ fixed: 'fixed',
36
+ });
37
+ export type AnchorType = $Values<typeof ANCHOR_POSITION_TYPE>;
38
+ export type Strategy = $Values<typeof STRATEGY_TYPE>;
39
+ type ClassNames = $ReadOnly<{
40
+ buttonWrapper?: string;
41
+ dropdownContainer?: string;
42
+ buttonIcon?: string;
43
+ }>;
44
+ export type ButtonDropdownProps = ButtonProps & {
45
+ classNames?: ClassNames;
46
+ menu?: MenuProps;
47
+ positionStrategy?: Strategy;
48
+ anchorPosition?: AnchorType;
49
+ onOptionSelect?: (
50
+ option: MenuOption,
51
+ arg1: React.SyntheticEvent<HTMLElement> | null | undefined,
52
+ ) => unknown;
53
+ onMenuOpen?: () => unknown;
54
+ onMenuClose?: () => unknown;
55
+ tooltip?: BaseTooltipProps;
56
+ clickAwayRef?: ClickAwayRefType;
57
+ };
58
+ export const ButtonDropdown: React$AbstractComponent<
59
+ ButtonDropdownProps,
60
+ HTMLDivElement
61
+ > = React.forwardRef<ButtonDropdownProps, HTMLDivElement>(
62
+ (
63
+ {
64
+ anchorPosition = 'bottom-start',
65
+ positionStrategy = STRATEGY_TYPE.absolute,
66
+ size = 'medium',
67
+ onOptionSelect,
68
+ menu,
69
+ classNames,
70
+ disabled,
71
+ onMenuOpen,
72
+ onMenuClose,
73
+ children,
74
+ iconRightName,
75
+ iconRightType = 'solid',
76
+ isFluid,
77
+ tooltip,
78
+ onClick,
79
+ clickAwayRef,
80
+ ...restButtonProps
81
+ }: ButtonDropdownProps,
82
+ forwardRef,
83
+ ) => {
84
+ const menuBtnRef = React.useRef(null);
85
+ const [isMenuOpen, setIsMenuOpen] = React.useState(false);
86
+ React.useImperativeHandle(forwardRef, () => menuBtnRef.current);
87
+ const {x, y, refs, strategy} = useFloating({
88
+ open: true,
89
+ strategy: positionStrategy,
90
+ placement: anchorPosition,
91
+ whileElementsMounted: autoUpdate,
92
+ middleware: [shift(), flip(), offset(parseInt(spaceXXSmall))],
93
+ });
94
+
95
+ const onMenuToggle = (isOpen: boolean) => {
96
+ if (isOpen) {
97
+ onMenuOpen?.();
98
+ setIsMenuOpen(true);
99
+ } else {
100
+ onMenuClose?.();
101
+ setIsMenuOpen(false);
102
+ }
103
+ };
104
+
105
+ return (
106
+ <ClickAway onChange={onMenuToggle} clickAwayRef={clickAwayRef}>
107
+ {({isOpen, onOpen, clickAway, boundaryRef, triggerRef}) => (
108
+ <div
109
+ data-testid="ButtonDropdown"
110
+ className={classify(
111
+ css.buttonDropdownContainer,
112
+ {
113
+ [css.isFluid]: isFluid === true,
114
+ },
115
+ classNames?.dropdownContainer,
116
+ )}
117
+ ref={menuBtnRef}
118
+ >
119
+ <ConditionalWrapper
120
+ condition={Boolean(tooltip)}
121
+ wrapper={(children) => (
122
+ <Tooltip
123
+ {...tooltip}
124
+ hidden={isMenuOpen ? true : tooltip?.hidden}
125
+ >
126
+ {children}
127
+ </Tooltip>
128
+ )}
129
+ >
130
+ <Button
131
+ {...restButtonProps}
132
+ iconRightName={
133
+ children
134
+ ? iconRightName || (isOpen ? 'caret-up' : 'caret-down')
135
+ : iconRightName
136
+ }
137
+ iconRightType={iconRightType}
138
+ disabled={disabled}
139
+ size={size}
140
+ ref={mergeRefs([refs.setReference, triggerRef])}
141
+ onClick={(e) => {
142
+ onClick?.(e);
143
+ e.stopPropagation();
144
+ onOpen();
145
+ }}
146
+ isFluid={isFluid}
147
+ classNames={{
148
+ wrapper: classNames?.buttonWrapper,
149
+ icon: classNames?.buttonIcon,
150
+ }}
151
+ >
152
+ {children}
153
+ </Button>
154
+ </ConditionalWrapper>
155
+
156
+ {isOpen && menu && (
157
+ <div
158
+ ref={mergeRefs([refs.setFloating, boundaryRef])}
159
+ style={{
160
+ display: 'flex',
161
+ position: strategy,
162
+ top: y ?? spaceNone,
163
+ left: x ?? spaceNone,
164
+ ...(isFluid && {
165
+ width: sizeFluid,
166
+ }),
167
+ }}
168
+ >
169
+ <Menu
170
+ {...menu}
171
+ onSelect={(option, e) => {
172
+ onOptionSelect && onOptionSelect(option, e);
173
+
174
+ if (
175
+ // option.keepMenuOpenOnOptionSelect - to allow the menu persist its open stat upon option selection in normal variant
176
+ !option.keepMenuOpenOnOptionSelect &&
177
+ (!menu.optionsVariant || menu.optionsVariant === 'normal')
178
+ ) {
179
+ clickAway();
180
+ }
181
+ }}
182
+ size={menu.size || size}
183
+ onTabOut={clickAway}
184
+ />
185
+ </div>
186
+ )}
187
+ </div>
188
+ )}
189
+ </ClickAway>
190
+ );
191
+ },
192
+ );
@@ -0,0 +1,148 @@
1
+ import {$ReadOnly} from 'utility-types';
2
+ import * as React from 'react';
3
+ import type {MenuClassNames, MenuLabelTooltip} from '../../types/menu';
4
+ import type {ClickAwayRefType} from '../../utils/click-away';
5
+ import {
6
+ getButtonLabelFromSelectedKeys,
7
+ getSelectedKeysFromSelectedOption,
8
+ } from '../../utils/menu';
9
+ import type {ButtonProps} from '../Button';
10
+ import type {MenuOption, MenuOptionsVariant, Virtualization} from '../Menu';
11
+ import type {BaseTooltipProps} from '../Tooltip';
12
+ import type {AnchorType} from './ButtonDropdown';
13
+ import {ButtonDropdown} from './ButtonDropdown';
14
+ type ClassNames = $ReadOnly<{
15
+ buttonWrapper?: string;
16
+ dropdownContainer?: string;
17
+ buttonIcon?: string;
18
+ }>;
19
+ export type SimpleButtonDropdownRef = {
20
+ selectedKeys?: Array<string>;
21
+ };
22
+ export type SimpleButtonDropdownProps = ButtonProps & {
23
+ classNames?: ClassNames;
24
+ anchorPosition?: AnchorType;
25
+ tooltip?: BaseTooltipProps;
26
+ // Menu props
27
+ options?: Array<MenuOption>;
28
+ optionsVariant?: MenuOptionsVariant;
29
+ allowSearch?: boolean;
30
+ selectedKeys?: Array<string>;
31
+ menuVirtualization?: Virtualization;
32
+ header?: React.ReactNode;
33
+ footer?: React.ReactNode;
34
+ menuClassNames?: MenuClassNames;
35
+ showLabelTooltip?: MenuLabelTooltip;
36
+ allowWrap?: boolean;
37
+ // events
38
+ onOptionSelect?: (
39
+ option: MenuOption,
40
+ arg1: React.SyntheticEvent<HTMLElement> | null | undefined,
41
+ ) => unknown;
42
+ onMenuOpen?: () => unknown;
43
+ onMenuClose?: () => unknown;
44
+ // Resolvers
45
+ resolveLabel?: (option: MenuOption) => string | React.ReactNode;
46
+ resolveSecondaryLabel?: (option: MenuOption) => string | React.ReactNode;
47
+ clickAwayRef?: ClickAwayRefType;
48
+ };
49
+
50
+ const SimpleButtonDropdownBase = (props: SimpleButtonDropdownProps, ref) => {
51
+ const {
52
+ size = 'medium',
53
+ classNames,
54
+ anchorPosition,
55
+ options,
56
+ optionsVariant,
57
+ allowSearch,
58
+ selectedKeys,
59
+ onOptionSelect,
60
+ onMenuOpen,
61
+ onMenuClose,
62
+ resolveLabel,
63
+ resolveSecondaryLabel,
64
+ children,
65
+ isFluid,
66
+ menuVirtualization,
67
+ header,
68
+ footer,
69
+ menuClassNames,
70
+ showLabelTooltip,
71
+ allowWrap = false,
72
+ clickAwayRef,
73
+ ...buttonProps
74
+ } = props;
75
+ const [btnText, setBtnText] = React.useState('');
76
+ const [buttonDropdownSelectedKeys, setButtonDropdownSelectedKeys] =
77
+ React.useState(selectedKeys);
78
+ React.useEffect(() => {
79
+ const newBtnText = getButtonLabelFromSelectedKeys(selectedKeys, children);
80
+ setButtonDropdownSelectedKeys(selectedKeys);
81
+ setBtnText(newBtnText);
82
+ }, [selectedKeys]);
83
+
84
+ const handleOptionChange = (selectedOption: MenuOption, e) => {
85
+ e?.stopPropagation();
86
+ let newSelectedKeys = [];
87
+
88
+ if (optionsVariant === 'checkbox') {
89
+ newSelectedKeys = getSelectedKeysFromSelectedOption(
90
+ selectedOption,
91
+ buttonDropdownSelectedKeys,
92
+ );
93
+ } else {
94
+ newSelectedKeys = [selectedOption.key];
95
+ }
96
+
97
+ const newBtnText = getButtonLabelFromSelectedKeys(
98
+ newSelectedKeys,
99
+ children,
100
+ );
101
+ setButtonDropdownSelectedKeys(newSelectedKeys);
102
+ setBtnText(newBtnText);
103
+ setTimeout(() => {
104
+ onOptionSelect?.(selectedOption, e);
105
+ });
106
+ };
107
+
108
+ React.useImperativeHandle(ref, () => ({
109
+ selectedKeys: buttonDropdownSelectedKeys,
110
+ }));
111
+ return (
112
+ <ButtonDropdown
113
+ {...buttonProps}
114
+ anchorPosition={anchorPosition}
115
+ classNames={classNames}
116
+ size={size}
117
+ onOptionSelect={handleOptionChange}
118
+ onMenuOpen={onMenuOpen}
119
+ onMenuClose={onMenuClose}
120
+ clickAwayRef={clickAwayRef}
121
+ menu={{
122
+ isFluid,
123
+ options,
124
+ selectedKeys: buttonDropdownSelectedKeys,
125
+ optionsVariant,
126
+ allowSearch,
127
+ resolveLabel,
128
+ resolveSecondaryLabel,
129
+ size,
130
+ virtualization: menuVirtualization,
131
+ header,
132
+ footer,
133
+ classNames: menuClassNames,
134
+ showLabelTooltip,
135
+ allowWrap,
136
+ }}
137
+ >
138
+ {optionsVariant === 'checkbox' ? btnText : children}
139
+ </ButtonDropdown>
140
+ );
141
+ };
142
+
143
+ export const SimpleButtonDropdown: React.AbstractComponent<
144
+ SimpleButtonDropdownProps,
145
+ SimpleButtonDropdownRef
146
+ > = React.forwardRef<SimpleButtonDropdownProps, SimpleButtonDropdownRef>(
147
+ SimpleButtonDropdownBase,
148
+ );
@@ -0,0 +1,2 @@
1
+ export * from './ButtonDropdown';
2
+ export * from './SimpleButtonDropdown';