@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,149 @@
1
+ import { cssShorthandToClasses } from './cssShorthandToClasses';
2
+ import { SPACING_OPTIONS } from './tokens';
3
+
4
+ describe('cssShorthandToClasses', () => {
5
+ describe('token values', () => {
6
+ SPACING_OPTIONS.map((token) =>
7
+ test(`returns expected css object if token ${token} is passed`, () => {
8
+ const spacingClasses = cssShorthandToClasses('p', token);
9
+
10
+ expect(spacingClasses).toEqual([`p-${token}`]);
11
+ })
12
+ );
13
+ });
14
+
15
+ describe('2 values', () => {
16
+ test('returns expected css object if vertical and horizontal spacing values are passed', () => {
17
+ const spacingClasses = cssShorthandToClasses('p', 'xs sm');
18
+
19
+ expect(spacingClasses).toEqual(['p-v-xs', 'p-h-sm']);
20
+ });
21
+
22
+ test('returns expected css object if vertical and horizontal are set to 0', () => {
23
+ const spacingClasses = cssShorthandToClasses('p', '0 0');
24
+
25
+ expect(spacingClasses).toEqual(['p-v-0', 'p-h-0']);
26
+ });
27
+
28
+ test('returns expected css object if gap is set to sm lg', () => {
29
+ const classes = cssShorthandToClasses('g', 'sm lg');
30
+
31
+ expect(classes).toEqual(['rg-sm', 'cg-lg']);
32
+ });
33
+
34
+ test('returns expected css object if border radius are set to sm lg', () => {
35
+ const classes = cssShorthandToClasses('br', 'sm lg');
36
+
37
+ expect(classes).toEqual([
38
+ 'br-top-left-sm',
39
+ 'br-bottom-right-sm',
40
+ 'br-top-right-lg',
41
+ 'br-bottom-left-lg',
42
+ ]);
43
+ });
44
+ });
45
+
46
+ describe('3 values', () => {
47
+ test('returns expected css object if top, horizontal and bottom spacing values are passed', () => {
48
+ const spacingClasses = cssShorthandToClasses('p', 'xs sm lg');
49
+
50
+ expect(spacingClasses).toEqual(['p-top-xs', 'p-h-sm', 'p-bottom-lg']);
51
+ });
52
+
53
+ test('returns expected css object if top, horizontal and bottom spacing values are set to 0', () => {
54
+ const spacingClasses = cssShorthandToClasses('p', '0 0 0');
55
+
56
+ expect(spacingClasses).toEqual(['p-top-0', 'p-h-0', 'p-bottom-0']);
57
+ });
58
+
59
+ test('returns expected css object if border radius are set to sm lg', () => {
60
+ const classes = cssShorthandToClasses('br', 'sm md lg');
61
+
62
+ expect(classes).toEqual([
63
+ 'br-top-left-sm',
64
+ 'br-top-right-md',
65
+ 'br-bottom-left-md',
66
+ 'br-bottom-right-lg',
67
+ ]);
68
+ });
69
+ });
70
+
71
+ describe('4 values', () => {
72
+ test('returns expected css object if top, right, bottom, left spacing values are passed', () => {
73
+ const spacingClasses = cssShorthandToClasses('p', 'xs sm lg md');
74
+
75
+ expect(spacingClasses).toEqual([
76
+ 'p-top-xs',
77
+ 'p-right-sm',
78
+ 'p-bottom-lg',
79
+ 'p-left-md',
80
+ ]);
81
+ });
82
+
83
+ test('returns expected css object if top, right, bottom, left spacing values are set to 0', () => {
84
+ const spacingClasses = cssShorthandToClasses('p', '0 0 0 0');
85
+
86
+ expect(spacingClasses).toEqual([
87
+ 'p-top-0',
88
+ 'p-right-0',
89
+ 'p-bottom-0',
90
+ 'p-left-0',
91
+ ]);
92
+ });
93
+
94
+ test('returns expected css object if border radius are set to xs sm md lg', () => {
95
+ const classes = cssShorthandToClasses('br', 'xs sm md lg');
96
+
97
+ expect(classes).toEqual([
98
+ 'br-top-left-xs',
99
+ 'br-top-right-sm',
100
+ 'br-bottom-right-md',
101
+ 'br-bottom-left-lg',
102
+ ]);
103
+ });
104
+ });
105
+
106
+ describe('Responsive Classes', () => {
107
+ test('returns expected css object if an object is passed with spacing for particular breakpoints', () => {
108
+ const spacingClasses = cssShorthandToClasses('p', {
109
+ base: 'md lg',
110
+ tablet: 'sm md lg xl',
111
+ });
112
+
113
+ expect(spacingClasses).toEqual([
114
+ 'p-v-md',
115
+ 'p-h-lg',
116
+ 'p-top-sm-tablet',
117
+ 'p-right-md-tablet',
118
+ 'p-bottom-lg-tablet',
119
+ 'p-left-xl-tablet',
120
+ ]);
121
+ });
122
+
123
+ test('returns expected css object if an object is passed with spacing 0 for particular breakpoints', () => {
124
+ const spacingClasses = cssShorthandToClasses('p', {
125
+ base: '3xl 0',
126
+ desktop: '0 3xl',
127
+ });
128
+
129
+ expect(spacingClasses).toEqual([
130
+ 'p-v-3xl',
131
+ 'p-h-0',
132
+ 'p-v-0-desktop',
133
+ 'p-h-3xl-desktop',
134
+ ]);
135
+ });
136
+ });
137
+
138
+ test('returns expected classes if inherit is passed', () => {
139
+ const spacingClasses = cssShorthandToClasses('p', 'inherit');
140
+
141
+ expect(spacingClasses).toEqual(['p-inherit']);
142
+ });
143
+
144
+ test('returns expected classes if margin is inherit is passed', () => {
145
+ const spacingClasses = cssShorthandToClasses('m', 'inherit');
146
+
147
+ expect(spacingClasses).toEqual(['m-inherit']);
148
+ });
149
+ });
@@ -0,0 +1,133 @@
1
+ import { ResponsiveProp, BreakpointSizeWithBase } from '../types';
2
+
3
+ export function isValidSpacingValue(
4
+ value?: string | ResponsiveProp<string | undefined>
5
+ ): boolean {
6
+ if (
7
+ value === undefined ||
8
+ value === null ||
9
+ (typeof value !== 'string' && typeof value !== 'object')
10
+ ) {
11
+ return false;
12
+ }
13
+
14
+ return true;
15
+ }
16
+
17
+ export function generateBaseClasses(
18
+ attribute: string | undefined,
19
+ value?: string | ResponsiveProp<string | undefined>
20
+ ): string[] {
21
+ if (typeof value !== 'string') return [];
22
+
23
+ const trimmedValue = value.trim();
24
+
25
+ if (trimmedValue !== value) {
26
+ // eslint-disable-next-line no-console
27
+ console.warn(`
28
+ Hyphen Components: It seems you've passed an incorrect
29
+ shorthand value as a prop in your component. The value
30
+ has extra whitespace either at the beginning or the end of it.
31
+ We have trimmed this whitespace, but please double-check that
32
+ the prop value is correct.
33
+ attribute: "${attribute}"
34
+ value: "${value}"
35
+ `);
36
+ }
37
+
38
+ const classes: string[] = [];
39
+ let shorthand: { [key: number]: string[] };
40
+
41
+ if (attribute === 'br') {
42
+ shorthand = {
43
+ /* top-left-and-bottom-right | top-right-and-bottom-left */
44
+ 2: ['top-left', 'top-right'],
45
+ /* top-left | top-right-and-bottom-left | bottom-right */
46
+ 3: ['top-left', 'top-right', 'bottom-right'],
47
+ 4: ['top-left', 'top-right', 'bottom-right', 'bottom-left'],
48
+ };
49
+ } else if (attribute === 'g') {
50
+ shorthand = { 2: ['rg', 'cg'] };
51
+ } else {
52
+ shorthand = {
53
+ 2: ['v', 'h'],
54
+ 3: ['top', 'h', 'bottom'],
55
+ 4: ['top', 'right', 'bottom', 'left'],
56
+ };
57
+ }
58
+
59
+ if (trimmedValue.includes(' ') && trimmedValue.split(' ').length > 1) {
60
+ const sides = trimmedValue.split(' ');
61
+
62
+ if (sides.length > 4) {
63
+ // eslint-disable-next-line no-console
64
+ console.warn(`
65
+ Hyphen Components: It seems you've passed an incorrect
66
+ shorthand value as a prop in your component. The value
67
+ has more than four string components. While it will not break anything,
68
+ please double-check your prop values to ensure the expected result is correct.
69
+ attribute: "${attribute}"
70
+ value: "${value}"
71
+ `);
72
+ }
73
+
74
+ const trimmedSides = sides.slice(0, 4);
75
+
76
+ // br = border radius -- the corner logic is different than sides.
77
+ if (attribute === 'br') {
78
+ trimmedSides.forEach((v, index) => {
79
+ classes.push(
80
+ `${attribute}-${shorthand[trimmedSides.length][index]}-${v}`
81
+ );
82
+
83
+ if (trimmedSides.length === 3 && index === 1) {
84
+ classes.push(`${attribute}-bottom-left-${trimmedSides[index]}`);
85
+ } else if (trimmedSides.length === 2 && index === 0) {
86
+ classes.push(`${attribute}-bottom-right-${trimmedSides[index]}`);
87
+ } else if (trimmedSides.length === 2 && index === 1) {
88
+ classes.push(`${attribute}-bottom-left-${trimmedSides[index]}`);
89
+ }
90
+ });
91
+ } else if (attribute === 'g') {
92
+ trimmedSides.forEach((v, index) => {
93
+ classes.push(`${shorthand[trimmedSides.length][index]}-${v}`);
94
+ });
95
+ } else {
96
+ trimmedSides.forEach((v, index) => {
97
+ classes.push(
98
+ `${attribute}-${shorthand[trimmedSides.length][index]}-${v}`
99
+ );
100
+ });
101
+ }
102
+ } else {
103
+ classes.push(`${attribute}-${trimmedValue}`);
104
+ }
105
+
106
+ return classes;
107
+ }
108
+
109
+ export function cssShorthandToClasses(
110
+ attribute: string,
111
+ value?: string | ResponsiveProp<string | undefined>
112
+ ): string[] {
113
+ if (!isValidSpacingValue(value)) return [];
114
+
115
+ const classes: string[] = [];
116
+
117
+ if (typeof value === 'object') {
118
+ Object.keys(value).forEach((key) => {
119
+ const baseClasses = generateBaseClasses(
120
+ attribute,
121
+ value[key as BreakpointSizeWithBase]
122
+ );
123
+ const responsiveClasses = baseClasses?.map((baseClass) =>
124
+ key === 'base' ? baseClass : `${baseClass}-${key}`
125
+ );
126
+ classes.push(...responsiveClasses);
127
+ });
128
+ } else if (typeof value === 'string') {
129
+ classes.push(...generateBaseClasses(attribute, value));
130
+ }
131
+
132
+ return classes;
133
+ }
@@ -0,0 +1,6 @@
1
+ // eslint-disable-next-line import/prefer-default-export
2
+ export function doesStringIncludeCssUnit(value: string | undefined): boolean {
3
+ const cssUnits = ['px', 'em', 'rem', '%', 'vw', 'vh'];
4
+
5
+ return cssUnits.some((unit) => value?.includes(unit));
6
+ }
@@ -0,0 +1,24 @@
1
+ import { generateResponsiveClasses } from './generateResponsiveClasses';
2
+
3
+ describe('generateResponsiveClasses', () => {
4
+ test('it generates a base class when passed a single string value', () => {
5
+ const generatedClass = generateResponsiveClasses(
6
+ 'align-items',
7
+ 'flex-start'
8
+ );
9
+
10
+ expect(generatedClass).toEqual(['align-items-flex-start']);
11
+ });
12
+
13
+ test('it generates responsive classes when an keyed object is passed', () => {
14
+ const generatedClass = generateResponsiveClasses('align-items', {
15
+ tablet: 'flex-start',
16
+ hd: 'flex-end',
17
+ });
18
+
19
+ expect(generatedClass).toEqual([
20
+ 'align-items-flex-start-tablet',
21
+ 'align-items-flex-end-hd',
22
+ ]);
23
+ });
24
+ });
@@ -0,0 +1,30 @@
1
+ import { ResponsiveProp, BreakpointSizeWithBase } from '../types';
2
+
3
+ // eslint-disable-next-line
4
+ export function generateResponsiveClasses(
5
+ classRoot: string,
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ value: ResponsiveProp<any> | string | undefined
8
+ ): string[] {
9
+ if (
10
+ value === null ||
11
+ (typeof value !== 'string' && typeof value !== 'object')
12
+ )
13
+ return [];
14
+
15
+ const classes: string[] = [];
16
+
17
+ if (typeof value === 'object') {
18
+ Object.keys(value).forEach((key) => {
19
+ const baseClass = `${classRoot}-${value[key as BreakpointSizeWithBase]}`;
20
+ const responsiveClass =
21
+ key === 'base' ? baseClass : `${baseClass}-${key}`;
22
+
23
+ classes.push(responsiveClass);
24
+ });
25
+ } else if (typeof value === 'string') {
26
+ classes.push(`${classRoot}-${value}`);
27
+ }
28
+
29
+ return classes;
30
+ }
@@ -0,0 +1,27 @@
1
+ import { getAutoCompleteValue } from './getAutoCompleteValue';
2
+
3
+ describe('getAutoCompleteValue', () => {
4
+ test('it returns expected value when passed on', () => {
5
+ const value = getAutoCompleteValue('on');
6
+
7
+ expect(value).toEqual('on');
8
+ });
9
+
10
+ test('it returns expected value when passed off', () => {
11
+ const value = getAutoCompleteValue('off');
12
+
13
+ expect(value).toEqual('off');
14
+ });
15
+
16
+ test('it returns expected value when passed true', () => {
17
+ const value = getAutoCompleteValue(true);
18
+
19
+ expect(value).toEqual('on');
20
+ });
21
+
22
+ test('it returns expected value when passed false', () => {
23
+ const value = getAutoCompleteValue(false);
24
+
25
+ expect(value).toEqual('off');
26
+ });
27
+ });
@@ -0,0 +1,12 @@
1
+ // eslint-disable-next-line import/prefer-default-export
2
+ export function getAutoCompleteValue(value: string | boolean): string {
3
+ if (!value || (typeof value !== 'boolean' && typeof value !== 'string')) {
4
+ return 'off';
5
+ }
6
+
7
+ if (typeof value === 'boolean' && value) {
8
+ return 'on';
9
+ }
10
+
11
+ return value;
12
+ }
@@ -0,0 +1,27 @@
1
+ import { Key } from 'react';
2
+ import { Column } from '../types';
3
+
4
+ // eslint-disable-next-line import/prefer-default-export
5
+ export const getColumnKeys = (columns: Column[]): Key[] => {
6
+ const INTERNAL_KEY_PREFIX = 'columnKeyPrefix';
7
+ const columnKeys: React.Key[] = [];
8
+ const keys: Record<any, boolean> = {};
9
+
10
+ columns.forEach((column) => {
11
+ const { key, dataKey } = column || {};
12
+ const shapedDataKey = dataKey?.includes(' ')
13
+ ? dataKey.split(' ').join('-')
14
+ : dataKey;
15
+
16
+ let mergedKey = key || shapedDataKey || INTERNAL_KEY_PREFIX;
17
+
18
+ while (keys[mergedKey as any]) {
19
+ mergedKey = `${mergedKey}_next`;
20
+ }
21
+ keys[mergedKey as any] = true;
22
+
23
+ columnKeys.push(mergedKey);
24
+ });
25
+
26
+ return columnKeys;
27
+ };
@@ -0,0 +1,148 @@
1
+ import { getDimensionCss } from './getDimensionCss';
2
+ import { HEIGHT_OPTIONS, WIDTH_OPTIONS } from './tokens';
3
+
4
+ describe('getDimensionCss', () => {
5
+ test('returns expected css object if width css value is passed', () => {
6
+ const spacingCss = getDimensionCss('w', '20px');
7
+
8
+ expect(spacingCss).toEqual({
9
+ classes: [],
10
+ styles: {
11
+ width: '20px',
12
+ },
13
+ });
14
+ });
15
+
16
+ test('returns expected css object if height css value is passed', () => {
17
+ const spacingCss = getDimensionCss('h', '42rem');
18
+
19
+ expect(spacingCss).toEqual({
20
+ classes: [],
21
+ styles: {
22
+ height: '42rem',
23
+ },
24
+ });
25
+ });
26
+
27
+ test('returns expected css object if max width css value is passed', () => {
28
+ const spacingCss = getDimensionCss('mw', '20px');
29
+
30
+ expect(spacingCss).toEqual({
31
+ classes: [],
32
+ styles: {
33
+ maxWidth: '20px',
34
+ },
35
+ });
36
+ });
37
+
38
+ test('returns expected css object if min width css value is passed', () => {
39
+ const spacingCss = getDimensionCss('minw', '20px');
40
+
41
+ expect(spacingCss).toEqual({
42
+ classes: [],
43
+ styles: {
44
+ minWidth: '20px',
45
+ },
46
+ });
47
+ });
48
+
49
+ test('returns expected css object if max height css value is passed', () => {
50
+ const spacingCss = getDimensionCss('mh', '42rem');
51
+
52
+ expect(spacingCss).toEqual({
53
+ classes: [],
54
+ styles: {
55
+ maxHeight: '42rem',
56
+ },
57
+ });
58
+ });
59
+
60
+ test('returns expected css object if min height css value is passed', () => {
61
+ const spacingCss = getDimensionCss('minh', '42rem');
62
+
63
+ expect(spacingCss).toEqual({
64
+ classes: [],
65
+ styles: {
66
+ minHeight: '42rem',
67
+ },
68
+ });
69
+ });
70
+
71
+ describe('width', () => {
72
+ WIDTH_OPTIONS.map((token) =>
73
+ test(`returns expected css object if ${token} width value is passed`, () => {
74
+ const spacingCss = getDimensionCss('w', token);
75
+
76
+ expect(spacingCss).toEqual({
77
+ classes: [`w-${token}`],
78
+ styles: undefined,
79
+ });
80
+ })
81
+ );
82
+ });
83
+
84
+ describe('height', () => {
85
+ HEIGHT_OPTIONS.map((token) =>
86
+ test(`returns expected css object if ${token} width value is passed`, () => {
87
+ const spacingCss = getDimensionCss('h', token);
88
+
89
+ expect(spacingCss).toEqual({
90
+ classes: [`h-${token}`],
91
+ styles: undefined,
92
+ });
93
+ })
94
+ );
95
+ });
96
+
97
+ describe('max width', () => {
98
+ WIDTH_OPTIONS.map((token) =>
99
+ test(`returns expected css object if ${token} max width value is passed`, () => {
100
+ const spacingCss = getDimensionCss('mw', token);
101
+
102
+ expect(spacingCss).toEqual({
103
+ classes: [`mw-${token}`],
104
+ styles: undefined,
105
+ });
106
+ })
107
+ );
108
+ });
109
+
110
+ describe('min width', () => {
111
+ WIDTH_OPTIONS.map((token) =>
112
+ test(`returns expected css object if ${token} min width value is passed`, () => {
113
+ const spacingCss = getDimensionCss('minw', token);
114
+
115
+ expect(spacingCss).toEqual({
116
+ classes: [`minw-${token}`],
117
+ styles: undefined,
118
+ });
119
+ })
120
+ );
121
+ });
122
+
123
+ describe('max height', () => {
124
+ HEIGHT_OPTIONS.map((token) =>
125
+ test(`returns expected css object if ${token} max height value is passed`, () => {
126
+ const spacingCss = getDimensionCss('mh', token);
127
+
128
+ expect(spacingCss).toEqual({
129
+ classes: [`mh-${token}`],
130
+ styles: undefined,
131
+ });
132
+ })
133
+ );
134
+ });
135
+
136
+ describe('min height', () => {
137
+ HEIGHT_OPTIONS.map((token) =>
138
+ test(`returns expected css object if ${token} min height value is passed`, () => {
139
+ const spacingCss = getDimensionCss('minh', token);
140
+
141
+ expect(spacingCss).toEqual({
142
+ classes: [`minh-${token}`],
143
+ styles: undefined,
144
+ });
145
+ })
146
+ );
147
+ });
148
+ });
@@ -0,0 +1,73 @@
1
+ import { CSSProperties } from 'react';
2
+ import {
3
+ StylesAndClasses,
4
+ CssDimensionAbbreviation,
5
+ ResponsiveProp,
6
+ DimensionSize,
7
+ } from '../types';
8
+ import { doesStringIncludeCssUnit } from './doesStringIncludeCssUnit';
9
+ import { generateResponsiveClasses } from './generateResponsiveClasses';
10
+
11
+ export function getDimensionStyles(
12
+ dimension: CssDimensionAbbreviation,
13
+ value?: DimensionSize | ResponsiveProp<DimensionSize> | string
14
+ ): { [key: string]: string } | undefined {
15
+ if (value === undefined) return value;
16
+
17
+ let styles;
18
+ // value is a css unit so set its style property
19
+ if (typeof value === 'string' && doesStringIncludeCssUnit(value)) {
20
+ switch (dimension) {
21
+ case 'h':
22
+ styles = { height: value };
23
+ break;
24
+ case 'mw':
25
+ styles = { maxWidth: value };
26
+ break;
27
+ case 'mh':
28
+ styles = { maxHeight: value };
29
+ break;
30
+ case 'minw':
31
+ styles = { minWidth: value };
32
+ break;
33
+ case 'minh':
34
+ styles = { minHeight: value };
35
+ break;
36
+ default:
37
+ styles = { width: value };
38
+ }
39
+ }
40
+ return styles;
41
+ }
42
+
43
+ export function getDimensionClasses(
44
+ dimension: CssDimensionAbbreviation,
45
+ value?: DimensionSize | ResponsiveProp<DimensionSize> | string
46
+ ): string[] | undefined {
47
+ if (value === undefined) return value;
48
+
49
+ const classes = [];
50
+ if (
51
+ (typeof value === 'string' && !doesStringIncludeCssUnit(value)) ||
52
+ (typeof value === 'object' &&
53
+ Object.values(value).every((v) => !doesStringIncludeCssUnit(v)))
54
+ ) {
55
+ classes.push(...generateResponsiveClasses(dimension, value));
56
+ }
57
+
58
+ return classes;
59
+ }
60
+ /**
61
+ * Returns an object of styles and class names that correspond with the given value
62
+ * @param {CssDimensionAbbreviation} dimension width or height
63
+ * @param {string} [value] value of the dimension
64
+ */
65
+ export function getDimensionCss(
66
+ dimension: CssDimensionAbbreviation,
67
+ value?: DimensionSize | ResponsiveProp<DimensionSize> | string
68
+ ): StylesAndClasses<CSSProperties> {
69
+ return {
70
+ styles: getDimensionStyles(dimension, value),
71
+ classes: getDimensionClasses(dimension, value),
72
+ };
73
+ }
@@ -0,0 +1,42 @@
1
+ import { getElementType } from './getElementType';
2
+
3
+ const MockComponent = () =>
4
+ ({
5
+ defaultProps: {
6
+ as: 'h4',
7
+ },
8
+ } as any);
9
+
10
+ const getDefault = () => 'p';
11
+
12
+ describe('Get Element Type', () => {
13
+ test('function returns element type if provided by props', () => {
14
+ const elementType = getElementType(MockComponent(), { as: 'h1' });
15
+
16
+ expect(elementType).toBe('h1');
17
+ });
18
+
19
+ test('function returns default element type if provided by defaultProps', () => {
20
+ const elementType = getElementType(MockComponent(), {});
21
+
22
+ expect(elementType).toBe('h4');
23
+ });
24
+
25
+ test('function returns default element based on getDefault function if provided', () => {
26
+ const elementType = getElementType(MockComponent(), {}, getDefault);
27
+
28
+ expect(elementType).toBe('p');
29
+ });
30
+
31
+ test('function returns an anchor element if href is included in props', () => {
32
+ const elementType = getElementType(MockComponent(), { href: 'myurl' });
33
+
34
+ expect(elementType).toBe('a');
35
+ });
36
+
37
+ test('function returns a div if no defaultProps or props are provided', () => {
38
+ const elementType = getElementType({} as any, {}, () => '');
39
+
40
+ expect(elementType).toBe('div');
41
+ });
42
+ });