@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,46 @@
1
+ import { Canvas, Meta, ArgTypes } from '@storybook/blocks';
2
+ import { Card } from './Card';
3
+ import * as Stories from './Card.stories';
4
+
5
+ <Meta of={Stories} />
6
+
7
+ # Card
8
+
9
+ A card is a stylized Box component that acts as a container to group related information and actions.
10
+ It consists of three child components that are automatically included with the `<Card />`:
11
+
12
+ 1. `<Card.Header />` - should contain a descriptive title for the Card's contents
13
+ 1. `<Card.Section />` - for the body of the card, and can consists of many sections
14
+ 1. `<Card.Footer />` - a place for primary actions for the card's contents
15
+
16
+ <Canvas of={Stories.OverviewCard} />
17
+
18
+ ## Props
19
+
20
+ <ArgTypes of={Card} />
21
+
22
+ ## Examples
23
+
24
+ Here are some common use cases of `<Card />`.
25
+
26
+ ### Sign Up Form
27
+
28
+ <Canvas of={Stories.ExampleSignUpForm} />
29
+
30
+ ### Full Bleed Photo
31
+
32
+ <Canvas of={Stories.ExampleFullBleedPhotos} />
33
+
34
+ ## Child Component Props
35
+
36
+ ### Card.Header Props
37
+
38
+ <ArgTypes of={Card.Header} />
39
+
40
+ ### Card.Section Props
41
+
42
+ <ArgTypes of={Card.Section} />
43
+
44
+ ### Card.Footer Props
45
+
46
+ <ArgTypes of={Card.Footer} />
@@ -0,0 +1,6 @@
1
+ .card-section-border {
2
+ + .card-section-border {
3
+ border-top: 1px solid
4
+ var(--card-section-border-color, var(--color-border-subtle));
5
+ }
6
+ }
@@ -0,0 +1,101 @@
1
+ import { Card } from './Card';
2
+ import type { Meta } from '@storybook/react';
3
+ import React from 'react';
4
+ import { Box } from '../Box/Box';
5
+ import { Button } from '../Button/Button';
6
+ import { Heading } from '../Heading/Heading';
7
+ import { TextInput } from '../TextInput/TextInput';
8
+ import { allModes } from '../../modes';
9
+
10
+ const meta: Meta<typeof Card> = {
11
+ title: 'Components/Card',
12
+ component: Card,
13
+ parameters: {
14
+ chromatic: {
15
+ modes: {
16
+ light: allModes['light'],
17
+ dark: allModes['dark'],
18
+ },
19
+ },
20
+ },
21
+ };
22
+
23
+ export default meta;
24
+
25
+ export const OverviewCard = () => (
26
+ <Card>
27
+ <Card.Header title="Card Overview" />
28
+ <Card.Section>
29
+ <p>Card content</p>
30
+ </Card.Section>
31
+ <Card.Section title="Section Two">Another section</Card.Section>
32
+ <Card.Footer>Footer</Card.Footer>
33
+ </Card>
34
+ );
35
+
36
+ export const ExampleSignUpForm = () => (
37
+ <Box
38
+ alignItems="center"
39
+ alignContent="center"
40
+ padding="2xl"
41
+ background="secondary"
42
+ >
43
+ <Card maxWidth="9xl">
44
+ <Card.Section padding="5xl" gap="4xl">
45
+ <Box gap="sm" alignItems="center">
46
+ <Heading as="h1" size="lg">
47
+ Sign Up
48
+ </Heading>
49
+ <Box as="p" color="secondary" fontSize="sm">
50
+ Create your Hyphen account
51
+ </Box>
52
+ </Box>
53
+ <Box gap="2xl">
54
+ <TextInput
55
+ id="email"
56
+ value=""
57
+ label="Email Address"
58
+ onChange={() => null}
59
+ />
60
+ <TextInput
61
+ id="password"
62
+ type="password"
63
+ value=""
64
+ label="Password"
65
+ onChange={() => null}
66
+ />
67
+ <Button fullWidth variant="primary">
68
+ Sign Up
69
+ </Button>
70
+ </Box>
71
+ <Box alignItems="center" fontSize="sm" color="secondary">
72
+ <p>
73
+ Already have an account?{' '}
74
+ <a href="/#" className="font-color-primary">
75
+ Log in
76
+ </a>
77
+ .
78
+ </p>
79
+ </Box>
80
+ </Card.Section>
81
+ </Card>
82
+ </Box>
83
+ );
84
+
85
+ export const ExampleFullBleedPhotos = () => (
86
+ <>
87
+ <Card maxWidth="9xl">
88
+ <Card.Section padding="0" overflow="hidden" height="300px">
89
+ <img
90
+ src="https://images.unsplash.com/photo-1555412654-72a95a495858?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=600&q=80"
91
+ data-chromatic="ignore"
92
+ alt=""
93
+ />
94
+ </Card.Section>
95
+ <Card.Section childGap="xs">
96
+ <Heading>Headline</Heading>
97
+ <Box as="p">This is the body copy of the card.</Box>
98
+ </Card.Section>
99
+ </Card>
100
+ </>
101
+ );
@@ -0,0 +1,11 @@
1
+ /* eslint-disable react/no-array-index-key */
2
+ import React from 'react';
3
+ import { render } from '@testing-library/react';
4
+ import { Card } from './Card';
5
+
6
+ describe('Card', () => {
7
+ test('card has overflow hidden by default', () => {
8
+ const { container } = render(<Card>test</Card>);
9
+ expect(container.children[0].classList).toContain('overflow-hidden');
10
+ });
11
+ });
@@ -0,0 +1,61 @@
1
+ import { Box, BoxProps } from '../Box/Box';
2
+ import { CardFooter, CardHeader, CardSection } from './components';
3
+ import React, { ReactNode } from 'react';
4
+
5
+ export interface CardProps extends BoxProps {
6
+ /**
7
+ * The Card's contents.
8
+ */
9
+ children?: ReactNode;
10
+ }
11
+
12
+ export const CardBaseComponent: React.FC<CardProps> = React.forwardRef(
13
+ (
14
+ {
15
+ children,
16
+ subdued,
17
+ overflow = 'hidden',
18
+ display = 'block',
19
+ width = '100',
20
+ ...restProps
21
+ },
22
+ ref
23
+ ) => {
24
+ return (
25
+ <Box
26
+ background={subdued ? 'secondary' : 'primary'}
27
+ borderWidth="sm"
28
+ borderColor="subtle"
29
+ overflow={overflow}
30
+ display={display}
31
+ ref={ref}
32
+ shadow="2xs"
33
+ width={width}
34
+ radius="lg"
35
+ {...restProps}
36
+ >
37
+ {children}
38
+ </Box>
39
+ );
40
+ }
41
+ );
42
+
43
+ export interface CardStatic {
44
+ Header: typeof CardHeader;
45
+ Section: typeof CardSection;
46
+ Footer: typeof CardFooter;
47
+ }
48
+
49
+ export type CardWithStaticComponents = typeof CardBaseComponent & CardStatic;
50
+
51
+ // Actual component is wrapped in an IIFE for the export
52
+ // To allow tree-shaking even with static properties (subcomponents in this case).
53
+ export const Card = (() => {
54
+ const Card = CardBaseComponent as CardWithStaticComponents; // eslint-disable-line no-shadow
55
+
56
+ Card.Header = CardHeader;
57
+ Card.Section = CardSection;
58
+ Card.Footer = CardFooter;
59
+
60
+ return Card;
61
+ })();
@@ -0,0 +1,11 @@
1
+ /* eslint-disable react/no-array-index-key */
2
+ import React from 'react';
3
+ import { render } from '@testing-library/react';
4
+ import { CardFooter } from './CardFooter';
5
+
6
+ describe('Card/CardFooter', () => {
7
+ test('lg padding class is applied by default', () => {
8
+ const { getByText } = render(<CardFooter>Test Box</CardFooter>);
9
+ expect(getByText('Test Box').classList).toContain('p-2xl');
10
+ });
11
+ });
@@ -0,0 +1,35 @@
1
+ import { Box, BoxProps } from '../../../Box/Box';
2
+ import React, { FC, ReactNode } from 'react';
3
+ export interface CardFooterProps extends BoxProps {
4
+ /**
5
+ * Contents of the Footer.
6
+ */
7
+ children?: ReactNode;
8
+ /**
9
+ * Additional props to be spread to rendered element
10
+ */
11
+ [x: string]: any; // eslint-disable-line
12
+ }
13
+
14
+ export const CardFooter: FC<CardFooterProps> = ({
15
+ background = 'secondary',
16
+ borderColor = 'subtle',
17
+ borderWidth = 'xs 0 0 0',
18
+ children = null,
19
+ display = 'block',
20
+ padding = '2xl',
21
+ ...restProps
22
+ }) => {
23
+ return (
24
+ <Box
25
+ display={display}
26
+ padding={padding}
27
+ background={background}
28
+ borderColor={borderColor}
29
+ borderWidth={borderWidth}
30
+ {...restProps}
31
+ >
32
+ {children}
33
+ </Box>
34
+ );
35
+ };
@@ -0,0 +1,23 @@
1
+ /* eslint-disable react/no-array-index-key */
2
+ import React from 'react';
3
+ import { render } from '@testing-library/react';
4
+ import { CardHeader } from './CardHeader';
5
+
6
+ describe('Card/CardHeader', () => {
7
+ test('correct padding classes are applied', () => {
8
+ const { getByText } = render(<CardHeader>Test Card Header</CardHeader>);
9
+ expect(getByText('Test Card Header').classList).toContain('p-2xl');
10
+ });
11
+
12
+ test('title is rendered as h4 if defined as a string', () => {
13
+ const { container } = render(<CardHeader title="card title" />);
14
+ expect(container.getElementsByTagName('h4')).toHaveLength(1);
15
+ });
16
+
17
+ test('title is rendered as node if defined as a node', () => {
18
+ const { container } = render(
19
+ <CardHeader title={<h1>card title node</h1>} />
20
+ );
21
+ expect(container.getElementsByTagName('h1')).toHaveLength(1);
22
+ });
23
+ });
@@ -0,0 +1,54 @@
1
+ import React, { FC, ReactNode } from 'react';
2
+ import { Box, BoxProps } from '../../../Box/Box';
3
+ import { Heading } from '../../../Heading/Heading';
4
+
5
+ export interface CardHeaderProps extends BoxProps {
6
+ /**
7
+ * contents of the Header
8
+ */
9
+ children?: ReactNode;
10
+ /**
11
+ * Additional class names to add
12
+ */
13
+ className?: string;
14
+ /**
15
+ * The title of the card
16
+ */
17
+ title?: ReactNode;
18
+ /**
19
+ * Additional props to be spread to rendered element
20
+ */
21
+ [x: string]: any; // eslint-disable-line
22
+ }
23
+
24
+ export const CardHeader: FC<CardHeaderProps> = ({
25
+ childGap = '2xs',
26
+ children = null,
27
+ className = undefined,
28
+ display = 'block',
29
+ padding = '2xl',
30
+ title = null,
31
+ ...restProps
32
+ }) => {
33
+ const renderTitle = () =>
34
+ typeof title === 'string' ? (
35
+ <Heading size="sm" as="h4">
36
+ {title}
37
+ </Heading>
38
+ ) : (
39
+ title
40
+ );
41
+
42
+ return (
43
+ <Box
44
+ childGap={childGap}
45
+ display={display}
46
+ padding={padding}
47
+ className={className}
48
+ {...restProps}
49
+ >
50
+ {title && renderTitle()}
51
+ {children}
52
+ </Box>
53
+ );
54
+ };
@@ -0,0 +1,28 @@
1
+ /* eslint-disable react/no-array-index-key */
2
+ import React from 'react';
3
+ import { render } from '@testing-library/react';
4
+ import { CardSection } from './CardSection';
5
+
6
+ describe('Card/CardSection', () => {
7
+ test('2xl padding class is applied by default', () => {
8
+ const { container } = render(<CardSection>Test Card</CardSection>);
9
+ expect(container.children[0].classList).toContain('p-2xl');
10
+ });
11
+
12
+ test('is subdued', () => {
13
+ const { container } = render(<CardSection subdued>subdued</CardSection>);
14
+ expect(container.children[0].classList).toContain('card-subdued');
15
+ });
16
+
17
+ test('title is rendered as h4 if defined as a string', () => {
18
+ const { container } = render(<CardSection title="section title" />);
19
+ expect(container.getElementsByTagName('h4')).toHaveLength(1);
20
+ });
21
+
22
+ test('title is rendered as node if defined as a node', () => {
23
+ const { container } = render(
24
+ <CardSection title={<h1>section title node</h1>} />
25
+ );
26
+ expect(container.getElementsByTagName('h1')).toHaveLength(1);
27
+ });
28
+ });
@@ -0,0 +1,102 @@
1
+ import { Box, BoxProps } from '../../../Box/Box';
2
+ import React, { FC, ReactNode } from 'react';
3
+
4
+ import classNames from 'classnames';
5
+ import styles from '../../Card.module.scss';
6
+
7
+ export interface CardSectionProps extends BoxProps {
8
+ /**
9
+ * Any valid background color token, or a `url()` for an image
10
+ */
11
+ background?: BoxProps['background'];
12
+ /**
13
+ * If defined as a prop, this value will take higher precedence than the corresponding component design token value
14
+ * Any valid border color token
15
+ * Or a responsive prop with borderColor for each breakpoint.
16
+ */
17
+ borderColor?: BoxProps['borderColor'];
18
+ /**
19
+ * If defined as a prop, this value will take higher precedence than the corresponding component design token value
20
+ * Width of the section's border
21
+ * Can be a single [border width token](/?path=/docs/foundation-design-tokens--docs#border-width).
22
+ * Can also be a string of [border width tokens](/?path=/docs/foundation-design-tokens--docs#border-width)
23
+ * that models itself after the css shorthand property,
24
+ * where you can set the border width on all four sides of an element.
25
+ * e.g: "0 sm xs 0" --> top: 0, right: sm, bottom: xs, left: 0;
26
+ */
27
+ borderWidth?: BoxProps['borderWidth'];
28
+ /**
29
+ * Contents of the Section.
30
+ */
31
+ children?: ReactNode;
32
+ /**
33
+ * Custom class to be applied to section container.
34
+ */
35
+ className?: string;
36
+ /**
37
+ * Visually subdued the appearance of the section.
38
+ */
39
+ subdued?: boolean;
40
+ /**
41
+ * Title for the section.
42
+ */
43
+ title?: ReactNode;
44
+ /**
45
+ * Additional props to be spread to rendered element
46
+ */
47
+ [x: string]: any; // eslint-disable-line
48
+ }
49
+
50
+ export const CardSection: FC<CardSectionProps> = ({
51
+ background = undefined,
52
+ borderColor = undefined,
53
+ borderWidth = undefined,
54
+ children = null,
55
+ childGap = undefined,
56
+ gap = undefined,
57
+ className = undefined,
58
+ display = 'block',
59
+ padding = '2xl',
60
+ subdued = undefined,
61
+ title = undefined,
62
+ ...restProps
63
+ }) => {
64
+ const renderTitle =
65
+ typeof title === 'string' ? (
66
+ <Box className="m-bottom-md">
67
+ <Box as="h4" fontWeight="bold" fontSize="sm" color="base">
68
+ {title}
69
+ </Box>
70
+ </Box>
71
+ ) : (
72
+ title
73
+ );
74
+
75
+ const sectionClasses = classNames(
76
+ {
77
+ [styles['card-section-border']]:
78
+ borderColor === undefined && borderWidth === undefined,
79
+ [styles['card-subdued']]: subdued,
80
+ },
81
+ className
82
+ );
83
+
84
+ return (
85
+ <Box
86
+ background={background}
87
+ borderColor={borderColor}
88
+ borderWidth={borderWidth}
89
+ className={sectionClasses}
90
+ display={display}
91
+ padding={padding}
92
+ {...restProps}
93
+ >
94
+ {renderTitle}
95
+ <Box gap={gap} childGap={childGap}>
96
+ {children}
97
+ </Box>
98
+ </Box>
99
+ );
100
+ };
101
+
102
+ export default CardSection;
@@ -0,0 +1,3 @@
1
+ export * from './CardFooter/CardFooter';
2
+ export * from './CardHeader/CardHeader';
3
+ export * from './CardSection/CardSection';
@@ -0,0 +1,98 @@
1
+ import { Canvas, Meta, ArgTypes } from '@storybook/blocks';
2
+ import { CheckboxInput } from './CheckboxInput';
3
+ import * as Stories from './CheckboxInput.stories';
4
+
5
+ <Meta of={Stories} />
6
+
7
+ # CheckboxInput
8
+
9
+ Use a CheckboxInput to allow users to make a range of selections (zero, one or many).
10
+
11
+ <Canvas isExpanded of={Stories.Basic} />
12
+
13
+ ## Props
14
+
15
+ <ArgTypes of={CheckboxInput} />
16
+
17
+ ## Default
18
+
19
+ All that is required to render a basic version of the CheckboxInput is a unique `id`, a `label`, `isChecked`, and an onchange event handler passed to the `onChange` prop.
20
+
21
+ <Canvas of={Stories.Default} />
22
+
23
+ ## States
24
+
25
+ The state of a checkbox can be `checked`, `unchecked` or `indeterminate`. For More
26
+ details on indeterminate checkboxes [See Here](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox#indeterminate).
27
+
28
+ An important consideration is that a checkbox being `indeterminate` has no effect on the value of it's `checked` value. Accordingly
29
+ we have kept this prop separate and affect the checkbox visually as well as the value of the indeterminate HTML attribute on the checkbox
30
+ element. I.E: A checkbox can be indeterminate while being either checked or unchecked. The logic for such UI implementations is left
31
+ up to the user.
32
+
33
+ <Canvas of={Stories.States} />
34
+
35
+ ## Indeterminate Checkboxes
36
+
37
+ Use cases for intermediate checkboxes can sometimes be unclear. Below is an example of when to use this UI pattern.
38
+
39
+ <Canvas of={Stories.IndeterminateCheckboxes} />
40
+
41
+ ## Required
42
+
43
+ Use the `isRequired` prop to set the `required` and `aria-required` on the underlying input element.
44
+
45
+ <Canvas of={Stories.Required} />
46
+
47
+ You can remove or customize the required indicator using the `requiredIndicator` prop.
48
+
49
+ <Canvas of={Stories.CustomRequiredIndicator} />
50
+
51
+ ## Sizes
52
+
53
+ Set the size of the checkbox and label with the `size` prop.
54
+
55
+ <Canvas of={Stories.Sizes} />
56
+
57
+ ## Help Text
58
+
59
+ Use `helpText` to add additional context to the checkbox.
60
+ This can help keep checkbox label concise.
61
+
62
+ <Canvas of={Stories.HelpText} />
63
+
64
+ ## Checked Initial State
65
+
66
+ Use the `isChecked` prop to mark the input as checked upon initial render.
67
+
68
+ <Canvas of={Stories.CheckedInitialState} />
69
+
70
+ ## Hidden Label
71
+
72
+ The `label` is a required prop, but if you need to hide it for stylistic reasons, you can do
73
+ so with the `hideLabel` prop. The checkbox will still utilize the label string value to
74
+ populate the `aria-label` property on the input for accessibility reasons.
75
+
76
+ <Canvas of={Stories.HiddenLabel} />
77
+
78
+ ## Disabled and Unchecked
79
+
80
+ Use the `isDisabled` prop to disable an input.
81
+
82
+ <Canvas of={Stories.DisabledAndUnchecked} />
83
+
84
+ ## Disabled and Checked
85
+
86
+ Use the `isDisabled` and `isChecked` props to disable an input in a checked state.
87
+
88
+ <Canvas of={Stories.DisabledAndChecked} />
89
+
90
+ ## Error
91
+
92
+ Use the `error` prop to mark the input as invalid. `error` accepts a `boolean`, `string`, or `node`. If either a `string` or `node` is passed, a validation message is displayed below it.
93
+
94
+ <Canvas of={Stories.Error} />
95
+
96
+ ## Component Design Tokens
97
+
98
+ This component shares component design tokens with all form controls. For a complete list of tokens, see the [Theming Form Controls documentation](/docs/theming-form-controls--custom-theme-form).