@hyphen/hyphen-components 2.9.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 (319) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/package.json +138 -0
  4. package/src/components/Alert/Alert.constants.ts +19 -0
  5. package/src/components/Alert/Alert.mdx +29 -0
  6. package/src/components/Alert/Alert.module.scss +74 -0
  7. package/src/components/Alert/Alert.stories.tsx +102 -0
  8. package/src/components/Alert/Alert.test.tsx +187 -0
  9. package/src/components/Alert/Alert.tsx +157 -0
  10. package/src/components/Alert/Alert.types.ts +14 -0
  11. package/src/components/Badge/Badge.mdx +28 -0
  12. package/src/components/Badge/Badge.module.scss +155 -0
  13. package/src/components/Badge/Badge.stories.tsx +52 -0
  14. package/src/components/Badge/Badge.test.tsx +74 -0
  15. package/src/components/Badge/Badge.tsx +70 -0
  16. package/src/components/Box/Box.mdx +259 -0
  17. package/src/components/Box/Box.module.scss +16 -0
  18. package/src/components/Box/Box.stories.tsx +1679 -0
  19. package/src/components/Box/Box.test.tsx +478 -0
  20. package/src/components/Box/Box.tsx +636 -0
  21. package/src/components/Button/Button.constants.ts +10 -0
  22. package/src/components/Button/Button.mdx +71 -0
  23. package/src/components/Button/Button.module.scss +312 -0
  24. package/src/components/Button/Button.stories.tsx +117 -0
  25. package/src/components/Button/Button.test.tsx +460 -0
  26. package/src/components/Button/Button.tsx +241 -0
  27. package/src/components/Card/Card.mdx +46 -0
  28. package/src/components/Card/Card.module.scss +6 -0
  29. package/src/components/Card/Card.stories.tsx +101 -0
  30. package/src/components/Card/Card.test.tsx +11 -0
  31. package/src/components/Card/Card.tsx +61 -0
  32. package/src/components/Card/components/CardFooter/CardFooter.test.tsx +11 -0
  33. package/src/components/Card/components/CardFooter/CardFooter.tsx +35 -0
  34. package/src/components/Card/components/CardHeader/CardHeader.test.tsx +23 -0
  35. package/src/components/Card/components/CardHeader/CardHeader.tsx +54 -0
  36. package/src/components/Card/components/CardSection/CardSection.test.tsx +28 -0
  37. package/src/components/Card/components/CardSection/CardSection.tsx +102 -0
  38. package/src/components/Card/components/index.ts +3 -0
  39. package/src/components/CheckboxInput/CheckboxInput.mdx +98 -0
  40. package/src/components/CheckboxInput/CheckboxInput.stories.tsx +254 -0
  41. package/src/components/CheckboxInput/CheckboxInput.test.tsx +436 -0
  42. package/src/components/CheckboxInput/CheckboxInput.tsx +171 -0
  43. package/src/components/CheckboxInput/components/Checkbox.module.scss +174 -0
  44. package/src/components/CheckboxInput/components/Checkbox.test.tsx +201 -0
  45. package/src/components/CheckboxInput/components/Checkbox.tsx +176 -0
  46. package/src/components/CheckboxInput/components/CheckboxIcon.tsx +71 -0
  47. package/src/components/DateInput/DateInput.mdx +61 -0
  48. package/src/components/DateInput/DateInput.stories.tsx +168 -0
  49. package/src/components/DateInput/DateInput.test.tsx +258 -0
  50. package/src/components/DateInput/DateInput.tsx +189 -0
  51. package/src/components/DatePicker/DatePicker.mdx +52 -0
  52. package/src/components/DatePicker/DatePicker.module.scss +603 -0
  53. package/src/components/DatePicker/DatePicker.stories.tsx +199 -0
  54. package/src/components/DatePicker/DatePicker.test.tsx +26 -0
  55. package/src/components/DatePicker/DatePicker.tsx +138 -0
  56. package/src/components/Details/Details.mdx +30 -0
  57. package/src/components/Details/Details.module.scss +32 -0
  58. package/src/components/Details/Details.stories.tsx +38 -0
  59. package/src/components/Details/Details.test.tsx +189 -0
  60. package/src/components/Details/Details.tsx +51 -0
  61. package/src/components/Details/DetailsSummary.tsx +65 -0
  62. package/src/components/Drawer/Drawer.mdx +117 -0
  63. package/src/components/Drawer/Drawer.module.scss +96 -0
  64. package/src/components/Drawer/Drawer.stories.tsx +380 -0
  65. package/src/components/Drawer/Drawer.test.tsx +90 -0
  66. package/src/components/Drawer/Drawer.tsx +249 -0
  67. package/src/components/FormControl/FormControl.tsx +78 -0
  68. package/src/components/FormLabel/FormLabel.mdx +24 -0
  69. package/src/components/FormLabel/FormLabel.module.scss +19 -0
  70. package/src/components/FormLabel/FormLabel.stories.tsx +20 -0
  71. package/src/components/FormLabel/FormLabel.test.tsx +35 -0
  72. package/src/components/FormLabel/FormLabel.tsx +96 -0
  73. package/src/components/Formik/Formik.mdx +10 -0
  74. package/src/components/Formik/Formik.stories.tsx +307 -0
  75. package/src/components/Formik/FormikCheckboxInput/FormikCheckboxInput.test.tsx +172 -0
  76. package/src/components/Formik/FormikCheckboxInput/FormikCheckboxInput.tsx +41 -0
  77. package/src/components/Formik/FormikRadioGroup/FormikRadioGroup.test.tsx +205 -0
  78. package/src/components/Formik/FormikRadioGroup/FormikRadioGroup.tsx +37 -0
  79. package/src/components/Formik/FormikSelectInput/FormikSelectInput.test.tsx +210 -0
  80. package/src/components/Formik/FormikSelectInput/FormikSelectInput.tsx +41 -0
  81. package/src/components/Formik/FormikSelectInputInset/FormikSelectInputInset.test.tsx +153 -0
  82. package/src/components/Formik/FormikSelectInputInset/FormikSelectInputInset.tsx +44 -0
  83. package/src/components/Formik/FormikSelectInputNative/FormikSelectInputNative.test.tsx +161 -0
  84. package/src/components/Formik/FormikSelectInputNative/FormikSelectInputNative.tsx +46 -0
  85. package/src/components/Formik/FormikTextInput/FormikTextInput.test.tsx +176 -0
  86. package/src/components/Formik/FormikTextInput/FormikTextInput.tsx +38 -0
  87. package/src/components/Formik/FormikTextInputInset/FormikTextInputInset.test.tsx +170 -0
  88. package/src/components/Formik/FormikTextInputInset/FormikTextInputInset.tsx +42 -0
  89. package/src/components/Formik/FormikTextareaInput/FormikTextareaInput.test.tsx +186 -0
  90. package/src/components/Formik/FormikTextareaInput/FormikTextareaInput.tsx +42 -0
  91. package/src/components/Formik/FormikTextareaInputInset/FormikTextareaInputInset.test.tsx +179 -0
  92. package/src/components/Formik/FormikTextareaInputInset/FormikTextareaInputInset.tsx +42 -0
  93. package/src/components/Formik/FormikTimePicker/FormikTimePicker.test.tsx +224 -0
  94. package/src/components/Formik/FormikTimePicker/FormikTimePicker.tsx +37 -0
  95. package/src/components/Formik/FormikTimePickerNative/FormikTimePickerNative.test.tsx +175 -0
  96. package/src/components/Formik/FormikTimePickerNative/FormikTimePickerNative.tsx +38 -0
  97. package/src/components/Formik/FormikToggle/FormikToggle.test.tsx +172 -0
  98. package/src/components/Formik/FormikToggle/FormikToggle.tsx +38 -0
  99. package/src/components/Heading/Heading.constants.ts +19 -0
  100. package/src/components/Heading/Heading.mdx +35 -0
  101. package/src/components/Heading/Heading.module.scss +5 -0
  102. package/src/components/Heading/Heading.stories.tsx +90 -0
  103. package/src/components/Heading/Heading.test.tsx +67 -0
  104. package/src/components/Heading/Heading.tsx +67 -0
  105. package/src/components/HelpText/HelpText.module.scss +14 -0
  106. package/src/components/HelpText/HelpText.tsx +33 -0
  107. package/src/components/Icon/Icon.mdx +40 -0
  108. package/src/components/Icon/Icon.stories.tsx +72 -0
  109. package/src/components/Icon/Icon.test.tsx +30 -0
  110. package/src/components/Icon/Icon.tsx +61 -0
  111. package/src/components/InputValidationMessage/InputValidationMessage.module.scss +3 -0
  112. package/src/components/InputValidationMessage/InputValidationMessage.tsx +27 -0
  113. package/src/components/Modal/Modal.mdx +60 -0
  114. package/src/components/Modal/Modal.module.scss +135 -0
  115. package/src/components/Modal/Modal.stories.tsx +194 -0
  116. package/src/components/Modal/Modal.test.tsx +81 -0
  117. package/src/components/Modal/Modal.tsx +174 -0
  118. package/src/components/Modal/components/ModalBody/ModalBody.test.tsx +20 -0
  119. package/src/components/Modal/components/ModalBody/ModalBody.tsx +24 -0
  120. package/src/components/Modal/components/ModalFooter/ModalFooter.test.tsx +32 -0
  121. package/src/components/Modal/components/ModalFooter/ModalFooter.tsx +37 -0
  122. package/src/components/Modal/components/ModalHeader/ModalHeader.test.tsx +29 -0
  123. package/src/components/Modal/components/ModalHeader/ModalHeader.tsx +58 -0
  124. package/src/components/Modal/components/index.ts +5 -0
  125. package/src/components/Pagination/Pagination.mdx +26 -0
  126. package/src/components/Pagination/Pagination.stories.tsx +55 -0
  127. package/src/components/Pagination/Pagination.test.tsx +225 -0
  128. package/src/components/Pagination/Pagination.tsx +162 -0
  129. package/src/components/Pagination/Pagination.utilities.test.ts +133 -0
  130. package/src/components/Pagination/Pagination.utilities.ts +101 -0
  131. package/src/components/Popover/Popover.mdx +104 -0
  132. package/src/components/Popover/Popover.module.scss +74 -0
  133. package/src/components/Popover/Popover.stories.tsx +471 -0
  134. package/src/components/Popover/Popover.test.tsx +128 -0
  135. package/src/components/Popover/Popover.tsx +277 -0
  136. package/src/components/RadioGroup/RadioGroup.mdx +81 -0
  137. package/src/components/RadioGroup/RadioGroup.module.scss +23 -0
  138. package/src/components/RadioGroup/RadioGroup.stories.tsx +375 -0
  139. package/src/components/RadioGroup/RadioGroup.test.tsx +282 -0
  140. package/src/components/RadioGroup/RadioGroup.tsx +145 -0
  141. package/src/components/RadioGroup/RadioInput/RadioInput.module.scss +114 -0
  142. package/src/components/RadioGroup/RadioInput/RadioInput.test.tsx +156 -0
  143. package/src/components/RadioGroup/RadioInput/RadioInput.tsx +148 -0
  144. package/src/components/RadioGroup/RadioInput/RadioInputIcon.tsx +59 -0
  145. package/src/components/ResponsiveProvider/ResponsiveProvider.mdx +36 -0
  146. package/src/components/ResponsiveProvider/ResponsiveProvider.stories.tsx +54 -0
  147. package/src/components/ResponsiveProvider/ResponsiveProvider.test.tsx +70 -0
  148. package/src/components/ResponsiveProvider/ResponsiveProvider.tsx +73 -0
  149. package/src/components/SelectInput/SelectInput.mdx +115 -0
  150. package/src/components/SelectInput/SelectInput.module.scss +357 -0
  151. package/src/components/SelectInput/SelectInput.stories.tsx +373 -0
  152. package/src/components/SelectInput/SelectInput.test.tsx +403 -0
  153. package/src/components/SelectInput/SelectInput.tsx +245 -0
  154. package/src/components/SelectInputInset/SelectInputInset.mdx +56 -0
  155. package/src/components/SelectInputInset/SelectInputInset.module.scss +397 -0
  156. package/src/components/SelectInputInset/SelectInputInset.stories.tsx +189 -0
  157. package/src/components/SelectInputInset/SelectInputInset.test.tsx +305 -0
  158. package/src/components/SelectInputInset/SelectInputInset.tsx +235 -0
  159. package/src/components/SelectInputNative/SelectInputNative.mdx +87 -0
  160. package/src/components/SelectInputNative/SelectInputNative.module.scss +356 -0
  161. package/src/components/SelectInputNative/SelectInputNative.stories.tsx +282 -0
  162. package/src/components/SelectInputNative/SelectInputNative.test.tsx +341 -0
  163. package/src/components/SelectInputNative/SelectInputNative.tsx +121 -0
  164. package/src/components/Spinner/Spinner.mdx +29 -0
  165. package/src/components/Spinner/Spinner.module.scss +16 -0
  166. package/src/components/Spinner/Spinner.stories.tsx +48 -0
  167. package/src/components/Spinner/Spinner.test.tsx +47 -0
  168. package/src/components/Spinner/Spinner.tsx +116 -0
  169. package/src/components/Table/Table.mdx +216 -0
  170. package/src/components/Table/Table.module.scss +61 -0
  171. package/src/components/Table/Table.stories.tsx +884 -0
  172. package/src/components/Table/Table.test.tsx +437 -0
  173. package/src/components/Table/Table.tsx +171 -0
  174. package/src/components/Table/TableBody/TableBody.module.scss +19 -0
  175. package/src/components/Table/TableBody/TableBody.test.tsx +38 -0
  176. package/src/components/Table/TableBody/TableBody.tsx +96 -0
  177. package/src/components/Table/TableBody/TableBodyCell/TableBodyCell.module.scss +47 -0
  178. package/src/components/Table/TableBody/TableBodyCell/TableBodyCell.test.tsx +81 -0
  179. package/src/components/Table/TableBody/TableBodyCell/TableBodyCell.tsx +94 -0
  180. package/src/components/Table/TableHead/TableHead.test.tsx +20 -0
  181. package/src/components/Table/TableHead/TableHead.tsx +78 -0
  182. package/src/components/Table/TableHead/TableHeaderCell/TableHeaderCell.module.scss +72 -0
  183. package/src/components/Table/TableHead/TableHeaderCell/TableHeaderCell.test.tsx +187 -0
  184. package/src/components/Table/TableHead/TableHeaderCell/TableHeaderCell.tsx +192 -0
  185. package/src/components/Table/common/TableRow/TableRow.module.scss +5 -0
  186. package/src/components/Table/common/TableRow/TableRow.test.tsx +52 -0
  187. package/src/components/Table/common/TableRow/TableRow.tsx +155 -0
  188. package/src/components/TextInput/TextInput.mdx +96 -0
  189. package/src/components/TextInput/TextInput.module.scss +405 -0
  190. package/src/components/TextInput/TextInput.stories.tsx +268 -0
  191. package/src/components/TextInput/TextInput.test.tsx +231 -0
  192. package/src/components/TextInput/TextInput.tsx +263 -0
  193. package/src/components/TextInputInset/TextInputInset.mdx +62 -0
  194. package/src/components/TextInputInset/TextInputInset.module.scss +418 -0
  195. package/src/components/TextInputInset/TextInputInset.stories.tsx +213 -0
  196. package/src/components/TextInputInset/TextInputInset.test.tsx +222 -0
  197. package/src/components/TextInputInset/TextInputInset.tsx +261 -0
  198. package/src/components/TextareaInput/TextareaInput.mdx +117 -0
  199. package/src/components/TextareaInput/TextareaInput.module.scss +275 -0
  200. package/src/components/TextareaInput/TextareaInput.stories.tsx +293 -0
  201. package/src/components/TextareaInput/TextareaInput.test.tsx +195 -0
  202. package/src/components/TextareaInput/TextareaInput.tsx +182 -0
  203. package/src/components/TextareaInputInset/TextareaInputInset.mdx +55 -0
  204. package/src/components/TextareaInputInset/TextareaInputInset.module.scss +337 -0
  205. package/src/components/TextareaInputInset/TextareaInputInset.stories.tsx +160 -0
  206. package/src/components/TextareaInputInset/TextareaInputInset.test.tsx +199 -0
  207. package/src/components/TextareaInputInset/TextareaInputInset.tsx +213 -0
  208. package/src/components/ThemeProvider/ThemeProvider.mdx +11 -0
  209. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +56 -0
  210. package/src/components/ThemeProvider/ThemeProvider.tsx +75 -0
  211. package/src/components/TimePicker/TimePicker.mdx +75 -0
  212. package/src/components/TimePicker/TimePicker.stories.tsx +149 -0
  213. package/src/components/TimePicker/TimePicker.test.tsx +97 -0
  214. package/src/components/TimePicker/TimePicker.tsx +83 -0
  215. package/src/components/TimePickerNative/TimePickerNative.mdx +67 -0
  216. package/src/components/TimePickerNative/TimePickerNative.stories.tsx +151 -0
  217. package/src/components/TimePickerNative/TimePickerNative.test.tsx +117 -0
  218. package/src/components/TimePickerNative/TimePickerNative.tsx +93 -0
  219. package/src/components/Toast/Toast.mdx +134 -0
  220. package/src/components/Toast/Toast.store.ts +280 -0
  221. package/src/components/Toast/Toast.stories.tsx +283 -0
  222. package/src/components/Toast/Toast.test.tsx +784 -0
  223. package/src/components/Toast/Toast.types.ts +98 -0
  224. package/src/components/Toast/ToastContainer.tsx +170 -0
  225. package/src/components/Toast/ToastNotification.module.scss +63 -0
  226. package/src/components/Toast/ToastNotification.tsx +176 -0
  227. package/src/components/Toast/index.ts +4 -0
  228. package/src/components/Toast/toast.ts +102 -0
  229. package/src/components/Toast/useToasts.ts +102 -0
  230. package/src/components/Toggle/Toggle.mdx +51 -0
  231. package/src/components/Toggle/Toggle.module.scss +294 -0
  232. package/src/components/Toggle/Toggle.stories.tsx +128 -0
  233. package/src/components/Toggle/Toggle.test.tsx +308 -0
  234. package/src/components/Toggle/Toggle.tsx +184 -0
  235. package/src/constants/keyCodes.ts +2 -0
  236. package/src/docs/Brands.mdx +153 -0
  237. package/src/docs/Colors.mdx +158 -0
  238. package/src/docs/DesignTokens.mdx +415 -0
  239. package/src/docs/GetStarted.mdx +47 -0
  240. package/src/docs/intro.mdx +12 -0
  241. package/src/fonts/AvenirBold.otf +0 -0
  242. package/src/fonts/AvenirBold.woff +0 -0
  243. package/src/fonts/AvenirBold.woff2 +0 -0
  244. package/src/fonts/AvenirLight.otf +0 -0
  245. package/src/fonts/AvenirLight.woff +0 -0
  246. package/src/fonts/AvenirLight.woff2 +0 -0
  247. package/src/fonts/AvenirRegular.otf +0 -0
  248. package/src/fonts/AvenirRegular.woff +0 -0
  249. package/src/fonts/AvenirRegular.woff2 +0 -0
  250. package/src/fonts/Geist-Bold.otf +0 -0
  251. package/src/fonts/Geist-Bold.woff +0 -0
  252. package/src/fonts/Geist-Bold.woff2 +0 -0
  253. package/src/fonts/Geist-Medium.otf +0 -0
  254. package/src/fonts/Geist-Medium.woff +0 -0
  255. package/src/fonts/Geist-Medium.woff2 +0 -0
  256. package/src/fonts/Geist-Regular.otf +0 -0
  257. package/src/fonts/Geist-Regular.woff +0 -0
  258. package/src/fonts/Geist-Regular.woff2 +0 -0
  259. package/src/fonts/Geist-SemiBold.otf +0 -0
  260. package/src/fonts/Geist-SemiBold.woff +0 -0
  261. package/src/fonts/Geist-SemiBold.woff2 +0 -0
  262. package/src/fonts/GeistMono-Regular.otf +0 -0
  263. package/src/fonts/GeistMono-Regular.woff +0 -0
  264. package/src/fonts/GeistMono-Regular.woff2 +0 -0
  265. package/src/hooks/index.ts +4 -0
  266. package/src/hooks/useBreakpoint/useBreakpoint.mdx +26 -0
  267. package/src/hooks/useBreakpoint/useBreakpoint.stories.tsx +30 -0
  268. package/src/hooks/useBreakpoint/useBreakpoint.test.tsx +19 -0
  269. package/src/hooks/useBreakpoint/useBreakpoint.ts +50 -0
  270. package/src/hooks/useIsomorphicLayoutEffect/useIsomorphicLayouEffect.ts +5 -0
  271. package/src/hooks/useOpenClose/useOpenClose.mdx +15 -0
  272. package/src/hooks/useOpenClose/useOpenClose.stories.tsx +41 -0
  273. package/src/hooks/useOpenClose/useOpenClose.test.tsx +119 -0
  274. package/src/hooks/useOpenClose/useOpenClose.tsx +95 -0
  275. package/src/hooks/useWindowSize/useWindowSize.mdx +25 -0
  276. package/src/hooks/useWindowSize/useWindowSize.stories.tsx +35 -0
  277. package/src/hooks/useWindowSize/useWindowSize.ts +24 -0
  278. package/src/index.ts +48 -0
  279. package/src/lib/cssShorthandToClasses.test.ts +149 -0
  280. package/src/lib/cssShorthandToClasses.ts +133 -0
  281. package/src/lib/doesStringIncludeCssUnit.ts +6 -0
  282. package/src/lib/generateResponsiveClasses.test.ts +24 -0
  283. package/src/lib/generateResponsiveClasses.ts +30 -0
  284. package/src/lib/getAutoCompleteValue.test.ts +27 -0
  285. package/src/lib/getAutoCompleteValue.ts +12 -0
  286. package/src/lib/getColumnKeys.ts +27 -0
  287. package/src/lib/getDimensionCss.test.ts +148 -0
  288. package/src/lib/getDimensionCss.ts +73 -0
  289. package/src/lib/getElementType.test.tsx +42 -0
  290. package/src/lib/getElementType.ts +42 -0
  291. package/src/lib/getFlexCss.test.ts +122 -0
  292. package/src/lib/getFlexCss.ts +67 -0
  293. package/src/lib/index.ts +15 -0
  294. package/src/lib/isFunction.ts +6 -0
  295. package/src/lib/mergeRefs.ts +15 -0
  296. package/src/lib/prefersReducedMotion.ts +12 -0
  297. package/src/lib/react-children-utilities/filter.ts +12 -0
  298. package/src/lib/react-children-utilities/index.ts +1 -0
  299. package/src/lib/reactRouterClickHandler.ts +37 -0
  300. package/src/lib/resolveValue.ts +7 -0
  301. package/src/lib/tokens.ts +139 -0
  302. package/src/modes.ts +8 -0
  303. package/src/styles/animation.scss +152 -0
  304. package/src/styles/cursor.scss +43 -0
  305. package/src/styles/display.scss +119 -0
  306. package/src/styles/flex.scss +453 -0
  307. package/src/styles/fonts.scss +44 -0
  308. package/src/styles/globals/utilities.scss +4 -0
  309. package/src/styles/mixins.scss +14 -0
  310. package/src/styles/overflow.scss +41 -0
  311. package/src/styles/position.scss +45 -0
  312. package/src/styles/reset.scss +108 -0
  313. package/src/styles/text-align.scss +21 -0
  314. package/src/styles/utilities.scss +9 -0
  315. package/src/styles/variables/forms.scss +71 -0
  316. package/src/styles/variables/index.scss +3 -0
  317. package/src/styles/white-space.scss +21 -0
  318. package/src/types/index.ts +201 -0
  319. package/src/types/lib.types.ts +3 -0
@@ -0,0 +1,636 @@
1
+ import * as CSS from 'csstype';
2
+
3
+ import {
4
+ BaseSpacing,
5
+ BorderRadiusSize,
6
+ BorderSize,
7
+ BoxShadowSize,
8
+ // BaseColor,
9
+ BreakpointSizeWithBase,
10
+ CssAlignContentValue,
11
+ CssAlignItemsValue,
12
+ CssDisplayValue,
13
+ CssFlexDirectionValue,
14
+ CssFlexValue,
15
+ CssJustifyContentValue,
16
+ CssOverflowValue,
17
+ CssTextAlignValue,
18
+ DimensionSize,
19
+ FontColor,
20
+ FontFamily,
21
+ FontSize,
22
+ FontWeight,
23
+ ResponsiveProp,
24
+ SpacingSize,
25
+ ZIndexSize,
26
+ BackgroundColor,
27
+ BorderColor,
28
+ } from '../../types';
29
+ import {
30
+ CSSProperties,
31
+ Children,
32
+ FC,
33
+ ReactElement,
34
+ ReactNode,
35
+ cloneElement,
36
+ createElement,
37
+ forwardRef,
38
+ } from 'react';
39
+
40
+ import { KnownKeys } from '../../types/lib.types';
41
+ import classNames from 'classnames';
42
+ import { cssShorthandToClasses } from '../../lib/cssShorthandToClasses';
43
+ import { generateResponsiveClasses } from '../../lib/generateResponsiveClasses';
44
+ import { getDimensionCss } from '../../lib/getDimensionCss';
45
+ import { getElementType } from '../../lib/getElementType';
46
+ import styles from './Box.module.scss';
47
+
48
+ export type HoverableBoxProperties =
49
+ | 'color'
50
+ | 'borderColor'
51
+ | 'shadow'
52
+ | 'background';
53
+ export interface BoxProps {
54
+ /**
55
+ * The element type to be rendered.
56
+ */
57
+ as?: string;
58
+ /**
59
+ * How to align the contents along the cross axis.
60
+ */
61
+ alignItems?: CssAlignItemsValue | ResponsiveProp<CssAlignItemsValue>;
62
+ /**
63
+ * How to align the contents when there is extra space in the cross axis.
64
+ * This property has no effect when there is only one line of flex items.
65
+ */
66
+ alignContent?: CssAlignContentValue | ResponsiveProp<CssAlignContentValue>;
67
+ /**
68
+ * How to align along the cross axis when contained in a Box.
69
+ * This allows the default alignment (or the one specified by `align`) to be overridden for the individual Box.
70
+ */
71
+ alignSelf?: CssAlignItemsValue | ResponsiveProp<CssAlignItemsValue>;
72
+ /**
73
+ * Any valid background color token, or a `url()` for an image
74
+ */
75
+ background?: BackgroundColor;
76
+ /**
77
+ * Any valid border color token
78
+ */
79
+ borderColor?: BorderColor;
80
+ /**
81
+ * Width of the Box's border
82
+ * Can be a single [border width token](/?path=/docs/foundation-design-tokens--docs#border-width).
83
+ * Can also be a string of [border width tokens](/?path=/docs/foundation-design-tokens--docs#border-width)
84
+ * that models itself after the css shorthand property,
85
+ * where you can set the border width on all four sides of an element.
86
+ * e.g: "0 sm xs 0" --> top: 0, right: sm, bottom: xs, left: 0;
87
+ */
88
+ borderWidth?: BorderSize | string | ResponsiveProp<BorderSize | string>;
89
+ /**
90
+ * Additional class names to add
91
+ */
92
+ className?: string;
93
+ /**
94
+ * The amount of spacing (implemented as margin) between child elements.
95
+ * Can be a single [spacing value](/?path=/docs/foundation-design-tokens--docs#spacing).
96
+ * NOTE: this prop is incompatible with reverse flex direction values (row-reverse, column-reverse).
97
+ * For grid and flex layouts, use 'gap' instead.
98
+ */
99
+ childGap?: SpacingSize | ResponsiveProp<SpacingSize>;
100
+ /**
101
+ * The box's contents
102
+ */
103
+ children?: ReactNode;
104
+ /**
105
+ * A color token identifier to use for the text color.
106
+ */
107
+ color?: FontColor;
108
+ /**
109
+ * Sets the gaps (gutters) between columns.
110
+ */
111
+ columnGap?: BaseSpacing | ResponsiveProp<BaseSpacing>;
112
+ /**
113
+ * Cursor style. Use any standard CSS value.
114
+ */
115
+ cursor?: CSS.Property.Cursor;
116
+ /**
117
+ * Sets how flex items are placed inside the Box, defining the main axis and the direction
118
+ * NOTE: reverse directions are incompatible with the `childGap` prop.
119
+ */
120
+ direction?: CssFlexDirectionValue | ResponsiveProp<CssFlexDirectionValue>;
121
+ /**
122
+ * Display property. Only select values supported.
123
+ */
124
+ display?: CssDisplayValue | ResponsiveProp<CssDisplayValue>;
125
+ /**
126
+ * Can be used as shorthand for the flexbox css properties `flex-grow`, `flex-shrink`, `flex-basis`
127
+ */
128
+ flex?: CssFlexValue | ResponsiveProp<CssFlexValue>;
129
+ /**
130
+ * Pass style modifiers for focus states. The following properties can be modified on focus.
131
+ * `* background`
132
+ * `* borderColor`
133
+ * `* borderWidth`
134
+ * `* color`
135
+ * `* shadow`
136
+ */
137
+ focus?: {
138
+ background?: BoxProps['background'];
139
+ borderColor?: BoxProps['borderColor'];
140
+ borderWidth?: BoxProps['borderWidth'];
141
+ color?: BoxProps['color'];
142
+ shadow?: BoxProps['shadow'];
143
+ };
144
+ /**
145
+ * The [font family token](/?path=/docs/foundation-design-tokens--docs#font-family) identifier for the Box's text
146
+ */
147
+ fontFamily?: FontFamily | ResponsiveProp<FontFamily>;
148
+ /**
149
+ * The [font size token](/?path=/docs/foundation-design-tokens--docs#font-size) identifier for the Box's text
150
+ */
151
+ fontSize?: FontSize | ResponsiveProp<FontSize>;
152
+ /**
153
+ * The [font weight token](/?path=/docs/design-tokens-design-tokens--page#font-weight) identifier for the Box's text
154
+ */
155
+ fontWeight?: FontWeight | ResponsiveProp<FontWeight>;
156
+ /**
157
+ * The height of the element. Can be given a standard css value (px, rem, em, %),
158
+ * or a [height token](/?path=/docs/foundation-design-tokens--docs#height)
159
+ */
160
+ height?: DimensionSize | ResponsiveProp<DimensionSize> | string;
161
+ /**
162
+ * Pass style modifiers for hover states. The following properties can be modified on hover:
163
+ * `* background`
164
+ * `* borderColor`
165
+ * `* borderWidth`
166
+ * `* color`
167
+ * `* fontSize`
168
+ * `* shadow`
169
+ */
170
+ hover?: {
171
+ background?: BoxProps['background'];
172
+ borderColor?: BoxProps['borderColor'];
173
+ borderWidth?: BoxProps['borderWidth'];
174
+ color?: BoxProps['color'];
175
+ fontSize?: BoxProps['fontSize'];
176
+ shadow?: BoxProps['shadow'];
177
+ };
178
+ /**
179
+ * Sets the gaps (gutters) between rows and columns.
180
+ */
181
+ gap?: BaseSpacing | ResponsiveProp<BaseSpacing>;
182
+ /**
183
+ * How space between and around content items is distributed along the main-axis a flex Box
184
+ */
185
+ justifyContent?:
186
+ | CssJustifyContentValue
187
+ | ResponsiveProp<CssJustifyContentValue>;
188
+ /**
189
+ * Amount of space around the element.
190
+ * Can be a single [spacing value](/?path=/docs/foundation-design-tokens--docs#spacing).
191
+ * Can also be a string of [spacing value](/?path=/docs/foundation-design-tokens--docs#spacing)
192
+ * that models itself after the css shorthand property,
193
+ * where you can set the margin area on all four sides of an element. It is shorthand for top, right, bottom, left.
194
+ */
195
+ margin?: BaseSpacing | ResponsiveProp<BaseSpacing>;
196
+ /**
197
+ * The maximum height of the element. Can be given a standard css value (px, rem, em, %),
198
+ * or a [height token](/?path=/docs/foundation-design-tokens--docs#height)
199
+ */
200
+ maxHeight?: DimensionSize | ResponsiveProp<DimensionSize> | string;
201
+ /**
202
+ * The minimum height of the element. Can be given a standard css value (px, rem, em, %),
203
+ * or a [height token](/?path=/docs/foundation-design-tokens--docs#height)
204
+ */
205
+ minHeight?: DimensionSize | ResponsiveProp<DimensionSize> | string;
206
+ /**
207
+ * The maximum width of the element. Can be given a standard css value (px, rem, em, %),
208
+ * or a [width token](/?path=/docs/foundation-design-tokens--docs#width)
209
+ */
210
+ maxWidth?: DimensionSize | ResponsiveProp<DimensionSize> | string;
211
+ /**
212
+ * The minimum width of the element. Can be given a standard css value (px, rem, em, %),
213
+ * or a [width token](/?path=/docs/foundation-design-tokens--docs#width)
214
+ */
215
+ minWidth?: DimensionSize | ResponsiveProp<DimensionSize> | string;
216
+ /**
217
+ * The css overflow behavior of the Box
218
+ */
219
+ overflow?: CssOverflowValue | ResponsiveProp<CssOverflowValue>;
220
+ /**
221
+ * Amount of space within the element around the Box contents.
222
+ * Can be a single [spacing value](/?path=/docs/foundation-design-tokens--docs#spacing).
223
+ * Can also be a string of [spacing value](/?path=/docs/foundation-design-tokens--docs#spacing)
224
+ * that models itself after the css shorthand property,
225
+ * where you can set the margin area on all four sides of an element. It is shorthand for top, right, bottom, left.
226
+ */
227
+ padding?: BaseSpacing | ResponsiveProp<BaseSpacing>;
228
+ /**
229
+ * CSS position property.
230
+ */
231
+ position?: CSS.Property.Position | ResponsiveProp<CSS.Property.Position>;
232
+ /**
233
+ * Set the radius of all corners
234
+ */
235
+ radius?: BorderRadiusSize | ResponsiveProp<BorderRadiusSize>;
236
+ /**
237
+ * Sets the gaps (gutters) between rows.
238
+ */
239
+ rowGap?: BaseSpacing | ResponsiveProp<BaseSpacing>;
240
+ /**
241
+ * The size of the drop shadow applied to the Box
242
+ */
243
+ shadow?: BoxShadowSize | ResponsiveProp<BoxShadowSize>;
244
+ /**
245
+ * CSS Style object
246
+ */
247
+ style?: CSSProperties;
248
+ /**
249
+ * the alignment of the text
250
+ */
251
+ textAlign?: CssTextAlignValue | ResponsiveProp<CssTextAlignValue>;
252
+ /**
253
+ * By default, a Box's items will all try to fit onto one line.
254
+ * Change that and allow the items to wrap as needed wrap
255
+ */
256
+ wrap?: boolean | ResponsiveProp<boolean>;
257
+ /**
258
+ * The width of the element. Can be given a standard css value (px, rem, em, %),
259
+ * or a [width token](/?path=/docs/foundation-design-tokens--docs#width)
260
+ */
261
+ width?: DimensionSize | ResponsiveProp<DimensionSize> | string;
262
+ /**
263
+ * ZIndex value for the element. Can be one of the predetermined token values.
264
+ * Can be responsive.
265
+ */
266
+ zIndex?: ZIndexSize | ResponsiveProp<ZIndexSize>;
267
+ /**
268
+ * Additional props to be spread to rendered element
269
+ */
270
+ [x: string]: any; // eslint-disable-line
271
+ }
272
+
273
+ /**
274
+ * A `<Box>` is a layout component to build UIs with consistent padding and spacing between
275
+ * elements.
276
+ */
277
+ export const Box: FC<BoxProps> = forwardRef(
278
+ (
279
+ {
280
+ as = 'div',
281
+ alignItems = undefined,
282
+ alignContent = undefined,
283
+ alignSelf = undefined,
284
+ background = undefined,
285
+ borderColor = undefined,
286
+ borderWidth = undefined,
287
+ children = undefined,
288
+ childGap = undefined,
289
+ className = '',
290
+ color = undefined,
291
+ columnGap = undefined,
292
+ cursor = undefined,
293
+ display = 'flex',
294
+ direction = 'column',
295
+ flex = undefined,
296
+ fontFamily = undefined,
297
+ fontSize = 'inherit',
298
+ focus = undefined,
299
+ fontWeight = undefined,
300
+ gap = undefined,
301
+ height = undefined,
302
+ hover = undefined,
303
+ justifyContent = undefined,
304
+ margin = undefined,
305
+ maxHeight = undefined,
306
+ minHeight = undefined,
307
+ maxWidth = undefined,
308
+ minWidth = undefined,
309
+ overflow = undefined,
310
+ padding = undefined,
311
+ position = undefined,
312
+ radius = undefined,
313
+ rowGap = undefined,
314
+ shadow = undefined,
315
+ style = {},
316
+ textAlign = undefined,
317
+ wrap = undefined,
318
+ width = undefined,
319
+ zIndex = undefined,
320
+ ...restProps
321
+ },
322
+ ref
323
+ ) => {
324
+ const heightCss = getDimensionCss('h', height);
325
+ const widthCss = getDimensionCss('w', width);
326
+ const maxHeightCss = getDimensionCss('mh', maxHeight);
327
+ const maxWidthCss = getDimensionCss('mw', maxWidth);
328
+ const minHeightCss = getDimensionCss('minh', minHeight);
329
+ const minWidthCss = getDimensionCss('minw', minWidth);
330
+
331
+ const isFlexBox = typeof display === 'string' && display.includes('flex');
332
+ const flexDirectionClasses = isFlexBox
333
+ ? generateResponsiveClasses('flex-direction', direction)
334
+ : null;
335
+
336
+ const cssPropertyMap: {
337
+ [key: string]: {
338
+ classPrefix: string;
339
+ transformer:
340
+ | typeof generateResponsiveClasses
341
+ | typeof cssShorthandToClasses;
342
+ };
343
+ } = {
344
+ color: {
345
+ classPrefix: 'font-color',
346
+ transformer: generateResponsiveClasses,
347
+ },
348
+ background: {
349
+ classPrefix: 'background-color',
350
+ transformer: generateResponsiveClasses,
351
+ },
352
+ borderColor: {
353
+ classPrefix: 'border-color',
354
+ transformer: generateResponsiveClasses,
355
+ },
356
+ borderWidth: {
357
+ classPrefix: 'border-width',
358
+ transformer: cssShorthandToClasses,
359
+ },
360
+ shadow: { classPrefix: 'shadow', transformer: generateResponsiveClasses },
361
+ fontSize: {
362
+ classPrefix: 'font-size',
363
+ transformer: generateResponsiveClasses,
364
+ },
365
+ };
366
+
367
+ const getStatefulClasses = (
368
+ stateKey: 'hover' | 'focus',
369
+ values: BoxProps['hover' | 'hover']
370
+ ) =>
371
+ values // eslint-disable-line
372
+ ? Object.entries(values).map(
373
+ ([key, value]) =>
374
+ cssPropertyMap[key].transformer(
375
+ `${stateKey}:${
376
+ cssPropertyMap[key as keyof BoxProps['focus' | 'hover']]
377
+ .classPrefix
378
+ }`,
379
+ value
380
+ ) // eslint-disable-line max-len
381
+ )
382
+ : undefined;
383
+
384
+ const hoverClasses = getStatefulClasses('hover', hover);
385
+ const focusClasses = getStatefulClasses('focus', focus);
386
+
387
+ const boxClasses = classNames(
388
+ className,
389
+ cssShorthandToClasses('m', margin),
390
+ cssShorthandToClasses('p', padding),
391
+ cssShorthandToClasses('br', radius),
392
+ cssShorthandToClasses('g', gap),
393
+ cssShorthandToClasses('cg', columnGap),
394
+ cssShorthandToClasses('rg', rowGap),
395
+ heightCss.classes,
396
+ maxHeightCss.classes,
397
+ minHeightCss.classes,
398
+ maxWidthCss.classes,
399
+ minWidthCss.classes,
400
+ widthCss.classes,
401
+ flexDirectionClasses,
402
+ generateResponsiveClasses('display', display),
403
+ generateResponsiveClasses('justify-content', justifyContent),
404
+ generateResponsiveClasses('align-items', alignItems),
405
+ generateResponsiveClasses('align-content', alignContent),
406
+ generateResponsiveClasses('align-self', alignSelf),
407
+ generateResponsiveClasses('font-family', fontFamily),
408
+ generateResponsiveClasses('font-size', fontSize),
409
+ generateResponsiveClasses('overflow', overflow),
410
+ generateResponsiveClasses('shadow', shadow),
411
+ generateResponsiveClasses('flex', flex),
412
+ cssShorthandToClasses('bw', borderWidth),
413
+ generateResponsiveClasses('font-weight', fontWeight),
414
+ generateResponsiveClasses('text-align', textAlign),
415
+ generateResponsiveClasses('position', position),
416
+ generateResponsiveClasses('z-index', zIndex),
417
+ ...(hoverClasses ?? []),
418
+ ...(focusClasses ?? []),
419
+ {
420
+ 'flex-wrap': isFlexBox && wrap,
421
+ 'flex-nowrap': isFlexBox && wrap === false,
422
+ [`background-color-${background}`]: background,
423
+ [`font-color-${color}`]: color,
424
+ [`border-color-${borderColor}`]: borderColor,
425
+ [`cursor-${cursor}`]: cursor,
426
+ [styles['box-transition']]: hover || focus,
427
+ }
428
+ );
429
+
430
+ const boxStyles = {
431
+ ...style,
432
+ ...heightCss.styles,
433
+ ...maxHeightCss.styles,
434
+ ...maxWidthCss.styles,
435
+ ...widthCss.styles,
436
+ ...minHeightCss.styles,
437
+ ...minWidthCss.styles,
438
+ };
439
+
440
+ /**
441
+ * Creates an object that maps the flex direction to either `right` or `bottom`
442
+ * so a margin can be applied to that side.
443
+ */
444
+ const generateChildGapDirection = (): ResponsiveProp<string> => {
445
+ let childGapDirection = {};
446
+
447
+ const getChildGapMarginDirection = (d: CssFlexDirectionValue) => {
448
+ let marginDirection = '';
449
+ if (d?.includes('row')) marginDirection = 'right';
450
+ else if (d?.includes('column')) marginDirection = 'bottom';
451
+
452
+ return marginDirection;
453
+ };
454
+
455
+ if (typeof direction === 'string') {
456
+ childGapDirection = { base: getChildGapMarginDirection(direction) };
457
+ } else if (typeof direction === 'object' && direction !== null) {
458
+ childGapDirection = Object.keys(direction).reduce(
459
+ (acc, curr) => ({
460
+ ...acc,
461
+ [curr]: getChildGapMarginDirection(
462
+ direction[curr as BreakpointSizeWithBase]
463
+ ),
464
+ }),
465
+ {}
466
+ );
467
+ }
468
+
469
+ return childGapDirection;
470
+ };
471
+
472
+ /**
473
+ * Shapes the childGap prop into a ResponsiveSpacing object
474
+ * so that we can cross-reference values between direction and childGap values to generate
475
+ * responsive classes.
476
+ */
477
+ const generateChildGap = (): ResponsiveProp<SpacingSize> => {
478
+ let childGapObj = {};
479
+
480
+ if (typeof childGap === 'string') {
481
+ childGapObj = { base: childGap };
482
+ } else if (typeof childGap === 'object' && childGap !== null) {
483
+ childGapObj = { ...childGap };
484
+ }
485
+
486
+ return childGapObj;
487
+ };
488
+
489
+ const childGapClasses: string[] = [];
490
+
491
+ if (childGap && direction) {
492
+ const childGapDirection = generateChildGapDirection();
493
+ const childGapValues = generateChildGap();
494
+ const breakpoints: BreakpointSizeWithBase[] = [
495
+ 'hd',
496
+ 'desktop',
497
+ 'tablet',
498
+ 'base',
499
+ ];
500
+
501
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
502
+ const findMatchingBreakpoint = (
503
+ responsiveObj: ResponsiveProp<any>,
504
+ key: BreakpointSizeWithBase
505
+ ): string => {
506
+ const index = breakpoints.findIndex((breakpoint) => breakpoint === key);
507
+ let value = '';
508
+
509
+ value = responsiveObj[key];
510
+
511
+ if (!value)
512
+ return findMatchingBreakpoint(responsiveObj, breakpoints[index + 1]);
513
+
514
+ return value;
515
+ };
516
+
517
+ breakpoints.forEach((breakpoint) => {
518
+ const foundDirection = findMatchingBreakpoint(
519
+ childGapDirection,
520
+ breakpoint as BreakpointSizeWithBase
521
+ );
522
+ const foundChildGap = findMatchingBreakpoint(
523
+ childGapValues,
524
+ breakpoint as BreakpointSizeWithBase
525
+ );
526
+
527
+ const classSuffix = breakpoint === 'base' ? '' : `-${breakpoint}`;
528
+ const oppositeDirection =
529
+ foundDirection === 'bottom' ? 'right' : 'bottom';
530
+
531
+ childGapClasses.push(
532
+ `m-${foundDirection}-${foundChildGap}${classSuffix}`
533
+ );
534
+ childGapClasses.push(`m-${oppositeDirection}-0${classSuffix}`);
535
+ });
536
+ }
537
+
538
+ /**
539
+ * Shallow merges existing classes of child node with a className based on the childGap value.
540
+ */
541
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
542
+ const decorateChildren = (
543
+ child: string | number | ReactElement<any>,
544
+ i: number,
545
+ array: ReactElement<any>[]
546
+ ) => {
547
+ if (
548
+ i === array.length - 1 ||
549
+ !child ||
550
+ typeof child === 'string' ||
551
+ typeof child === 'number'
552
+ ) {
553
+ return child; // Not gap if child is last element or if the children are strings or numbers.
554
+ }
555
+
556
+ const childClasses = classNames(child.props.className, [
557
+ ...new Set(childGapClasses),
558
+ ]);
559
+
560
+ return cloneElement(child, {
561
+ className: childClasses,
562
+ key: child.key ?? i,
563
+ });
564
+ };
565
+
566
+ let decoratedChildren = Children.toArray(children).filter(
567
+ (child) => child !== null
568
+ );
569
+
570
+ if (childGapClasses && decoratedChildren.length > 1) {
571
+ decoratedChildren = decoratedChildren.map((value, index, array) =>
572
+ decorateChildren(
573
+ value as string | number | ReactElement<any>, // eslint-disable-line @typescript-eslint/no-explicit-any
574
+ index,
575
+ array as ReactElement<any>[] // eslint-disable-line @typescript-eslint/no-explicit-any
576
+ )
577
+ );
578
+ }
579
+
580
+ const element = getElementType(Box, { as });
581
+
582
+ return createElement(
583
+ element,
584
+ {
585
+ className: boxClasses,
586
+ style: boxStyles,
587
+ ref,
588
+ ...restProps,
589
+ },
590
+ children !== null && children !== undefined ? decoratedChildren : null
591
+ );
592
+ }
593
+ );
594
+
595
+ export const boxPropsKeys: (keyof Pick<BoxProps, KnownKeys<BoxProps>>)[] = [
596
+ 'as',
597
+ 'alignItems',
598
+ 'alignContent',
599
+ 'alignSelf',
600
+ 'background',
601
+ 'borderColor',
602
+ 'borderWidth',
603
+ 'className',
604
+ 'childGap',
605
+ 'children',
606
+ 'color',
607
+ 'columnGap',
608
+ 'cursor',
609
+ 'direction',
610
+ 'display',
611
+ 'flex',
612
+ 'focus',
613
+ 'fontFamily',
614
+ 'fontSize',
615
+ 'fontWeight',
616
+ 'gap',
617
+ 'height',
618
+ 'hover',
619
+ 'justifyContent',
620
+ 'margin',
621
+ 'maxHeight',
622
+ 'minHeight',
623
+ 'maxWidth',
624
+ 'minWidth',
625
+ 'overflow',
626
+ 'padding',
627
+ 'position',
628
+ 'radius',
629
+ 'rowGap',
630
+ 'shadow',
631
+ 'style',
632
+ 'textAlign',
633
+ 'wrap',
634
+ 'width',
635
+ 'zIndex',
636
+ ];
@@ -0,0 +1,10 @@
1
+ import { ButtonSize, ButtonVariant } from './Button';
2
+
3
+ export const BUTTON_VARIANTS: ButtonVariant[] = [
4
+ 'primary',
5
+ 'secondary',
6
+ 'tertiary',
7
+ 'danger',
8
+ ];
9
+
10
+ export const BUTTON_SIZES: ButtonSize[] = ['sm', 'md', 'lg'];