@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,67 @@
1
+ import { FC, ReactNode, createElement } from 'react';
2
+ import { FontColor, HeadingSize, ResponsiveProp } from '../../types';
3
+ import {
4
+ HEADING_DEFAULT_SIZE_MAP,
5
+ HEADING_LEVELS_TYPE,
6
+ } from './Heading.constants';
7
+
8
+ import classNames from 'classnames';
9
+ import { generateResponsiveClasses } from '../../lib/generateResponsiveClasses';
10
+ import { getElementType } from '../../lib/getElementType';
11
+ import styles from './Heading.module.scss';
12
+
13
+ export interface HeadingProps {
14
+ /**
15
+ * The DOM tag or react component to use for the element.
16
+ * Select the appropriate semantic element (h1-h6).
17
+ */
18
+ as?: HEADING_LEVELS_TYPE;
19
+ /**
20
+ * Content of the heading. Can be a string or any valid DOM node.
21
+ */
22
+ children?: ReactNode;
23
+ /**
24
+ * Additional class names to add.
25
+ */
26
+ className?: string;
27
+ /**
28
+ * A variant token identifier to use for the text variant. Available variants found:
29
+ * [here](https://github.com/hyphen/hyphen-design-tokens/blob/main/properties/color/font.json).
30
+ */
31
+ color?: FontColor;
32
+ /**
33
+ * By default, size is determined by the chosen tag (e.g. h1 is bigger than h2).
34
+ * However, size can be set independently so that its size is appropriate for the surrounding content.
35
+ * Available sizes found:
36
+ * [here](https://github.com/hyphen/hyphen-design-tokens/blob/main/properties/size/font.json).
37
+ */
38
+ size?: HeadingSize | ResponsiveProp<HeadingSize>;
39
+ /**
40
+ * Additional props to be spread to rendered element
41
+ */
42
+ [x: string]: any; // eslint-disable-line
43
+ }
44
+
45
+ export const Heading: FC<HeadingProps> = ({
46
+ as = 'h4',
47
+ children,
48
+ className,
49
+ color,
50
+ size,
51
+ ...restProps
52
+ }) => {
53
+ const element = getElementType(Heading, { as });
54
+
55
+ const headingSize = size || HEADING_DEFAULT_SIZE_MAP[as];
56
+
57
+ const classes = classNames(
58
+ styles.heading,
59
+ className,
60
+ generateResponsiveClasses('heading', headingSize),
61
+ {
62
+ [`font-color-${color}`]: color,
63
+ }
64
+ );
65
+
66
+ return createElement(element, { className: classes, ...restProps }, children);
67
+ };
@@ -0,0 +1,14 @@
1
+ .help-text {
2
+ font-family: var(
3
+ --form-control-font-family,
4
+ var(--INTERNAL_form-control-font-family)
5
+ );
6
+ margin-top: var(
7
+ --form-control-help-margin,
8
+ var(--INTERNAL_form-control-help-margin)
9
+ );
10
+ font-weight: var(
11
+ --form-control-help-text-font-weight,
12
+ var(--INTERNAL_form-control-help-text-font-weight)
13
+ );
14
+ }
@@ -0,0 +1,33 @@
1
+ import React, { forwardRef } from 'react';
2
+ import classNames from 'classnames';
3
+ import { Box } from '../Box/Box';
4
+ import styles from './HelpText.module.scss';
5
+
6
+ export interface HelpTextProps {
7
+ /**
8
+ * Contents of the help text.
9
+ */
10
+ children?: React.ReactNode;
11
+ /**
12
+ * Additional class names to add.
13
+ */
14
+ className?: string;
15
+ }
16
+
17
+ export const HelpText = forwardRef<HTMLDivElement, HelpTextProps>(
18
+ ({ children, className }, ref) => (
19
+ <Box
20
+ ref={ref}
21
+ className={classNames(
22
+ 'hyphen-components__variables__form-control',
23
+ styles['help-text'],
24
+ className
25
+ )}
26
+ display="block"
27
+ color="secondary"
28
+ fontSize="sm"
29
+ >
30
+ {children}
31
+ </Box>
32
+ )
33
+ );
@@ -0,0 +1,40 @@
1
+ import { Icon } from './Icon';
2
+ import { Meta, Story, Canvas, ArgTypes } from '@storybook/addon-docs';
3
+
4
+ import * as Stories from './Icon.stories';
5
+
6
+ <Meta of={Stories} />
7
+
8
+ # Icon
9
+
10
+ Icons are used to visually communicate product functionality and actions.
11
+ Use an icon only when it provides additional clarity or is necessary to draw attention to an element.
12
+
13
+ <Canvas isExpanded of={Stories.Default} />
14
+
15
+ ## Props
16
+
17
+ <ArgTypes of={Icon} />
18
+
19
+ ## Size
20
+
21
+ The size of the icon can be set on the Icon itself, or inherited from its parent's `fontSize`.
22
+ This allows for easy placement inside of other components.
23
+
24
+ <Canvas of={Stories.Sizes} />
25
+
26
+ ## Color
27
+
28
+ Similar to sizing, the color of the icon can be set on the Icon itself, or inherited from its parent.
29
+
30
+ <Canvas of={Stories.Colors} />
31
+
32
+ ## Unknown Icon
33
+
34
+ If a given icon name is not found in the dictionary, a red box with question marks will be displayed, as well as log an error to the console.
35
+
36
+ <Canvas of={Stories.UnknownIcon} />
37
+
38
+ ## Available Icons
39
+
40
+ <Canvas of={Stories.AvailableIcons} />
@@ -0,0 +1,72 @@
1
+ import { Box } from '../Box/Box';
2
+ import { ICON_NAMES } from '@hyphen/hyphen-design-tokens/build/assets/icons';
3
+ import { IconName } from 'src/types';
4
+ import { Icon } from './Icon';
5
+ import type { Meta } from '@storybook/react';
6
+ import React from 'react';
7
+
8
+ const meta: Meta<typeof Icon> = {
9
+ title: 'Components/Icon',
10
+ component: Icon,
11
+ };
12
+
13
+ export default meta;
14
+
15
+ export const Default = () => <Icon name="star" />;
16
+
17
+ export const Sizes = () => (
18
+ <>
19
+ <Box direction="row" childGap="sm" margin="0 0 md 0" fontSize="xs">
20
+ <Icon name="remove" color="danger" />
21
+ <Box>Size is set by the Icon's parent</Box>
22
+ </Box>
23
+ <Box direction="row" fontSize="xl" childGap="sm">
24
+ <Icon name="star" color="warn" />
25
+ <Box>Size is set by the Icon's parent</Box>
26
+ </Box>
27
+ </>
28
+ );
29
+
30
+ export const Colors = () => (
31
+ <>
32
+ <Box direction="row" childGap="sm" margin="0 0 md 0">
33
+ <Icon name="remove" color="danger" />
34
+ <Box>Color is set at the Icon level</Box>
35
+ </Box>
36
+ <Box direction="row" childGap="sm" color="info">
37
+ <Icon name="add" />
38
+ <Box>Color is set by the Icon's parent</Box>
39
+ </Box>
40
+ </>
41
+ );
42
+
43
+ export const UnknownIcon = () => (
44
+ <Icon name={'does-not-exist' as any} className="font-size-2xl" />
45
+ );
46
+
47
+ export const AvailableIcons = () => (
48
+ <Box
49
+ style={{
50
+ display: 'grid',
51
+ gridTemplateColumns: 'repeat(auto-fill,minmax(6rem,1fr))',
52
+ gridAutoRows: '6rem',
53
+ gap: '1rem',
54
+ }}
55
+ >
56
+ {ICON_NAMES.map((iconName: IconName) => (
57
+ <Box
58
+ key={iconName}
59
+ fontSize="lg"
60
+ textAlign="center"
61
+ alignItems="center"
62
+ justifyContent="center"
63
+ childGap="sm"
64
+ >
65
+ <Icon className="neutral-500" name={iconName} />
66
+ <Box as="p" color="secondary" fontSize="sm">
67
+ {iconName}
68
+ </Box>
69
+ </Box>
70
+ ))}
71
+ </Box>
72
+ );
@@ -0,0 +1,30 @@
1
+ import { render, screen } from '@testing-library/react';
2
+
3
+ import { Icon } from './Icon';
4
+ import React from 'react';
5
+
6
+ describe('Icon', () => {
7
+ test('default', () => {
8
+ render(<Icon name="user" />);
9
+ const icon = screen.getByTestId('icon-testid--user');
10
+ expect(icon).toBeInTheDocument();
11
+ });
12
+
13
+ test('does not add a class property if none is provided', () => {
14
+ render(<Icon name="user" />);
15
+ const icon = screen.getByTestId('icon-testid--user');
16
+ expect(icon).not.toHaveAttribute('class');
17
+ });
18
+
19
+ test('adds a class property if defined', () => {
20
+ render(<Icon name="user" className="testClass" />);
21
+ const icon = screen.getByTestId('icon-testid--user');
22
+ expect(icon.getAttribute('class')).toBe('testClass');
23
+ });
24
+
25
+ test('fallback', () => {
26
+ render(<Icon name={'does-not-exist' as 'user'} />);
27
+ const icon = screen.getByText('???');
28
+ expect(icon).toBeInTheDocument();
29
+ });
30
+ });
@@ -0,0 +1,61 @@
1
+ import { FontColor, FontSize, IconName, ResponsiveProp } from '../../types';
2
+ import React, { FC, forwardRef } from 'react';
3
+
4
+ import { Box } from '../Box/Box';
5
+ import classNames from 'classnames';
6
+ import { generateResponsiveClasses } from '../../lib/generateResponsiveClasses';
7
+ import icons from '@hyphen/hyphen-design-tokens/build/assets/icons/react';
8
+
9
+ export interface IconProps {
10
+ className?: string;
11
+ /**
12
+ * A color token identifier to use for the text color.
13
+ */
14
+ color?: FontColor | ResponsiveProp<FontColor>;
15
+ /**
16
+ * A [font size token](/?path=/docs/design-tokens-design-tokens--page#font-size) identifier
17
+ */
18
+ size?: FontSize | ResponsiveProp<FontSize>;
19
+ /**
20
+ * Name of the icon
21
+ */
22
+ name: IconName;
23
+ /**
24
+ * Additional props to be spread to rendered element
25
+ */
26
+ [x: string]: any; // eslint-disable-line
27
+ }
28
+
29
+ export const Icon: FC<IconProps> = forwardRef<SVGSVGElement, IconProps>(
30
+ ({ className = undefined, name, color, size, ...restProps }, ref) => {
31
+ const IconComponent = icons[name];
32
+
33
+ if (!IconComponent) console.error(`Icon '${name}' not found`); // eslint-disable-line no-console
34
+
35
+ const iconClasses = classNames(
36
+ className,
37
+ generateResponsiveClasses('font-color', color),
38
+ generateResponsiveClasses('font-size', size)
39
+ );
40
+
41
+ return IconComponent ? (
42
+ <IconComponent
43
+ className={iconClasses || null}
44
+ ref={ref}
45
+ data-testid={`icon-testid--${name}`}
46
+ {...restProps}
47
+ />
48
+ ) : (
49
+ <Box
50
+ fontWeight="bold"
51
+ background="error"
52
+ color="white"
53
+ padding="2xs"
54
+ fontSize="sm"
55
+ display="inline"
56
+ >
57
+ ???
58
+ </Box>
59
+ );
60
+ }
61
+ );
@@ -0,0 +1,3 @@
1
+ .input-validation-message {
2
+ font-family: var(--form-control-font-family, var(--INTERNAL_form-control-font-family));
3
+ }
@@ -0,0 +1,27 @@
1
+ import React, { FC, ReactNode } from 'react';
2
+ import classNames from 'classnames';
3
+ import styles from './InputValidationMessage.module.scss';
4
+
5
+ /**
6
+ * Used by form inputs such as TextInput, to display a validation message for an invalid input.
7
+ */
8
+
9
+ export interface InputValidationMessageProps {
10
+ children: ReactNode;
11
+ size?: 'xs' | 'sm' | 'md';
12
+ }
13
+
14
+ export const InputValidationMessage: FC<InputValidationMessageProps> = ({
15
+ children,
16
+ size = 'sm',
17
+ }) => {
18
+ const classes = classNames(
19
+ 'hyphen-components__variables__form-control',
20
+ styles['input-validation-message'],
21
+ 'font-color-danger',
22
+ `font-size-${size}`,
23
+ 'm-top-xs'
24
+ );
25
+
26
+ return <div className={classes}>{children}</div>;
27
+ };
@@ -0,0 +1,60 @@
1
+ import { Canvas, Meta, ArgTypes } from '@storybook/blocks';
2
+ import { Modal } from './Modal';
3
+ import * as Stories from './Modal.stories';
4
+
5
+ <Meta of={Stories} />
6
+
7
+ # Modal
8
+
9
+ Modals are containers appearing in front of the main content to provide critical information or an actionable piece of content.
10
+ These are specifically great for presenting new flows while preserving the state of content.
11
+
12
+ The default behavior of a Modal is to focus on the first focusable item.
13
+ Therefore, you should ensure that the first focusable item is non-destructive, such as a "cancel" or close button.
14
+
15
+ Modal consists of three child components that are automatically included with the `<Modal />`:
16
+
17
+ 1. `<Modal.Header />` - a standard header of a Modal, which may contain a title for the Modal's contents and a close button
18
+ 1. `<Modal.Body />` - for the body of the Modal
19
+ 1. `<Modal.Footer />` - a place for primary actions for the Modals's contents
20
+
21
+ ## Basic Usage
22
+
23
+ In order to hide or show the Modal, set the Modal's `isOpen` prop to `true` or `false`.
24
+
25
+ <Canvas of={Stories.BasicUsage} />
26
+
27
+ ## Props
28
+
29
+ <ArgTypes of={Modal} />
30
+
31
+ ## Body and Footer
32
+
33
+ Use the `Modal.Body` and `Modal.Footer` to add body and footer content. These components simply wrap your content in consistent padding, otherwise you can pass whatever you want as content.
34
+
35
+ <Canvas of={Stories.BodyAndFooter} />
36
+
37
+ ## Close button
38
+
39
+ Set the `onDismiss` prop on the `Modal.Header` to true to automatically add a close button.
40
+
41
+ <Canvas of={Stories.CloseButton} />
42
+ ## Without a Header
43
+
44
+ Omit `<Modal.Header/>` to render a minimal modal without a header.
45
+
46
+ <Canvas of={Stories.WithoutHeader} />
47
+
48
+ ## Fullscreen on mobile
49
+
50
+ Use `fullScreenMobile` to enable fullscreen at mobile viewport widths.
51
+
52
+ <Canvas of={Stories.FullscreenMobile} />
53
+
54
+ ## Max Width
55
+
56
+ Use the `maxWidth` prop for modals that have minimal content or form fields that may not look right at a larger width.
57
+ As with the `Box` component, this can be set to a specific pixel value, or any of the existing width tokens. For responsive
58
+ maxWidth, use existing tokens only.
59
+
60
+ <Canvas of={Stories.MaxWidth} />
@@ -0,0 +1,135 @@
1
+ @import '@hyphen/hyphen-design-tokens/build/scss/variables';
2
+
3
+ .modal-close {
4
+ border: none;
5
+ background: transparent;
6
+ cursor: pointer;
7
+ padding: var(--size-spacing-xs);
8
+ color: var(--color-font-secondary);
9
+ line-height: var(--size-line-height-base);
10
+ border-radius: var(--size-border-radius-sm);
11
+
12
+ &:hover {
13
+ color: var(--color-font-secondary);
14
+ }
15
+
16
+ // Show focus styles on keyboard focus.
17
+ &:focus-visible {
18
+ outline: 0;
19
+ box-shadow: var(
20
+ --modal-close-button-box-shadow-focus,
21
+ 0 0 0 4px var(--color-base-grey-200)
22
+ );
23
+ }
24
+
25
+ // Hide focus styles if they are not needed, for example,
26
+ // when an element receives focus via the mouse.
27
+ &:focus:not(:focus-visible) {
28
+ outline: 0;
29
+ box-shadow: none;
30
+ }
31
+ }
32
+
33
+ .modal {
34
+ display: flex;
35
+ position: fixed;
36
+ top: 0;
37
+ right: 0;
38
+ bottom: 0;
39
+ left: 0;
40
+ align-items: flex-end;
41
+ z-index: var(--size-z-index-overlay);
42
+ background: hsl(0deg 0% 0% / 33%);
43
+ background-color: rgb(77 82 79 / 50%);
44
+ overflow: hidden;
45
+
46
+ :global {
47
+ animation: fadeIn 0.2s;
48
+ }
49
+ }
50
+
51
+ .modal {
52
+ .modal-content {
53
+ display: flex;
54
+ position: absolute;
55
+ bottom: 0;
56
+ flex-direction: column;
57
+ grid-row: 1;
58
+ grid-column: 1;
59
+ z-index: var(--size-z-index-modal);
60
+ margin: 0;
61
+ background-color: var(--color-background-primary);
62
+ padding: 0;
63
+ width: 100%;
64
+ border-radius: var(--size-border-radius-md) var(--size-border-radius-md) 0 0;
65
+
66
+ :global {
67
+ animation: slideInUp 0.3s;
68
+ }
69
+
70
+ @media (min-width: $size-breakpoint-tablet) {
71
+ position: initial;
72
+ grid-row: 2;
73
+ grid-column: 2;
74
+ margin: auto;
75
+ outline: none;
76
+ border-radius: var(--size-border-radius-md);
77
+ box-shadow: var(--modal-box-shadow, var(--size-box-shadow-md));
78
+ width: 70vw;
79
+ min-height: unset;
80
+ max-height: calc(100vh - 80px);
81
+
82
+ :global {
83
+ animation: fadeInUp 0.2s ease-out;
84
+ }
85
+ }
86
+
87
+ @media (min-width: $size-breakpoint-desktop) {
88
+ width: 50vw;
89
+ }
90
+ }
91
+ }
92
+
93
+ :global(.fullscreen) {
94
+ .modal-content {
95
+ position: fixed;
96
+ top: env(safe-area-inset-top, 0);
97
+ right: env(safe-area-inset-right, 0);
98
+ bottom: env(safe-area-inset-bottom, 0);
99
+ left: env(safe-area-inset-left, 0);
100
+ border-radius: 0;
101
+ }
102
+
103
+ @media (min-width: $size-breakpoint-tablet) {
104
+ display: grid;
105
+ grid-template-rows: minmax(var(--size-spacing-2xl), 1fr) auto minmax(
106
+ var(--size-spacing-2xl),
107
+ 1fr
108
+ );
109
+ grid-template-columns: var(--size-spacing-2xl) auto var(--size-spacing-2xl);
110
+ align-items: center;
111
+ overflow: hidden;
112
+
113
+ // should no longer be fullscreen on tablet and larger
114
+ .modal-content {
115
+ position: unset;
116
+ grid-row: 2;
117
+ grid-column: 2;
118
+ margin: auto;
119
+ outline: none;
120
+ border-radius:var(--size-border-radius-md);
121
+ box-shadow: var(--size-box-shadow-md);
122
+ width: 70vw;
123
+ min-height: unset;
124
+ max-height: calc(100vh - 80px);
125
+
126
+ :global {
127
+ animation: fadeInUp 0.2s ease-out;
128
+ }
129
+
130
+ @media (min-width: $size-breakpoint-desktop) {
131
+ width: 50vw;
132
+ }
133
+ }
134
+ }
135
+ }