@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.
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/package.json +138 -0
- package/src/components/Alert/Alert.constants.ts +19 -0
- package/src/components/Alert/Alert.mdx +29 -0
- package/src/components/Alert/Alert.module.scss +74 -0
- package/src/components/Alert/Alert.stories.tsx +102 -0
- package/src/components/Alert/Alert.test.tsx +187 -0
- package/src/components/Alert/Alert.tsx +157 -0
- package/src/components/Alert/Alert.types.ts +14 -0
- package/src/components/Badge/Badge.mdx +28 -0
- package/src/components/Badge/Badge.module.scss +155 -0
- package/src/components/Badge/Badge.stories.tsx +52 -0
- package/src/components/Badge/Badge.test.tsx +74 -0
- package/src/components/Badge/Badge.tsx +70 -0
- package/src/components/Box/Box.mdx +259 -0
- package/src/components/Box/Box.module.scss +16 -0
- package/src/components/Box/Box.stories.tsx +1679 -0
- package/src/components/Box/Box.test.tsx +478 -0
- package/src/components/Box/Box.tsx +636 -0
- package/src/components/Button/Button.constants.ts +10 -0
- package/src/components/Button/Button.mdx +71 -0
- package/src/components/Button/Button.module.scss +312 -0
- package/src/components/Button/Button.stories.tsx +117 -0
- package/src/components/Button/Button.test.tsx +460 -0
- package/src/components/Button/Button.tsx +241 -0
- package/src/components/Card/Card.mdx +46 -0
- package/src/components/Card/Card.module.scss +6 -0
- package/src/components/Card/Card.stories.tsx +101 -0
- package/src/components/Card/Card.test.tsx +11 -0
- package/src/components/Card/Card.tsx +61 -0
- package/src/components/Card/components/CardFooter/CardFooter.test.tsx +11 -0
- package/src/components/Card/components/CardFooter/CardFooter.tsx +35 -0
- package/src/components/Card/components/CardHeader/CardHeader.test.tsx +23 -0
- package/src/components/Card/components/CardHeader/CardHeader.tsx +54 -0
- package/src/components/Card/components/CardSection/CardSection.test.tsx +28 -0
- package/src/components/Card/components/CardSection/CardSection.tsx +102 -0
- package/src/components/Card/components/index.ts +3 -0
- package/src/components/CheckboxInput/CheckboxInput.mdx +98 -0
- package/src/components/CheckboxInput/CheckboxInput.stories.tsx +254 -0
- package/src/components/CheckboxInput/CheckboxInput.test.tsx +436 -0
- package/src/components/CheckboxInput/CheckboxInput.tsx +171 -0
- package/src/components/CheckboxInput/components/Checkbox.module.scss +174 -0
- package/src/components/CheckboxInput/components/Checkbox.test.tsx +201 -0
- package/src/components/CheckboxInput/components/Checkbox.tsx +176 -0
- package/src/components/CheckboxInput/components/CheckboxIcon.tsx +71 -0
- package/src/components/DateInput/DateInput.mdx +61 -0
- package/src/components/DateInput/DateInput.stories.tsx +168 -0
- package/src/components/DateInput/DateInput.test.tsx +258 -0
- package/src/components/DateInput/DateInput.tsx +189 -0
- package/src/components/DatePicker/DatePicker.mdx +52 -0
- package/src/components/DatePicker/DatePicker.module.scss +603 -0
- package/src/components/DatePicker/DatePicker.stories.tsx +199 -0
- package/src/components/DatePicker/DatePicker.test.tsx +26 -0
- package/src/components/DatePicker/DatePicker.tsx +138 -0
- package/src/components/Details/Details.mdx +30 -0
- package/src/components/Details/Details.module.scss +32 -0
- package/src/components/Details/Details.stories.tsx +38 -0
- package/src/components/Details/Details.test.tsx +189 -0
- package/src/components/Details/Details.tsx +51 -0
- package/src/components/Details/DetailsSummary.tsx +65 -0
- package/src/components/Drawer/Drawer.mdx +117 -0
- package/src/components/Drawer/Drawer.module.scss +96 -0
- package/src/components/Drawer/Drawer.stories.tsx +380 -0
- package/src/components/Drawer/Drawer.test.tsx +90 -0
- package/src/components/Drawer/Drawer.tsx +249 -0
- package/src/components/FormControl/FormControl.tsx +78 -0
- package/src/components/FormLabel/FormLabel.mdx +24 -0
- package/src/components/FormLabel/FormLabel.module.scss +19 -0
- package/src/components/FormLabel/FormLabel.stories.tsx +20 -0
- package/src/components/FormLabel/FormLabel.test.tsx +35 -0
- package/src/components/FormLabel/FormLabel.tsx +96 -0
- package/src/components/Formik/Formik.mdx +10 -0
- package/src/components/Formik/Formik.stories.tsx +307 -0
- package/src/components/Formik/FormikCheckboxInput/FormikCheckboxInput.test.tsx +172 -0
- package/src/components/Formik/FormikCheckboxInput/FormikCheckboxInput.tsx +41 -0
- package/src/components/Formik/FormikRadioGroup/FormikRadioGroup.test.tsx +205 -0
- package/src/components/Formik/FormikRadioGroup/FormikRadioGroup.tsx +37 -0
- package/src/components/Formik/FormikSelectInput/FormikSelectInput.test.tsx +210 -0
- package/src/components/Formik/FormikSelectInput/FormikSelectInput.tsx +41 -0
- package/src/components/Formik/FormikSelectInputInset/FormikSelectInputInset.test.tsx +153 -0
- package/src/components/Formik/FormikSelectInputInset/FormikSelectInputInset.tsx +44 -0
- package/src/components/Formik/FormikSelectInputNative/FormikSelectInputNative.test.tsx +161 -0
- package/src/components/Formik/FormikSelectInputNative/FormikSelectInputNative.tsx +46 -0
- package/src/components/Formik/FormikTextInput/FormikTextInput.test.tsx +176 -0
- package/src/components/Formik/FormikTextInput/FormikTextInput.tsx +38 -0
- package/src/components/Formik/FormikTextInputInset/FormikTextInputInset.test.tsx +170 -0
- package/src/components/Formik/FormikTextInputInset/FormikTextInputInset.tsx +42 -0
- package/src/components/Formik/FormikTextareaInput/FormikTextareaInput.test.tsx +186 -0
- package/src/components/Formik/FormikTextareaInput/FormikTextareaInput.tsx +42 -0
- package/src/components/Formik/FormikTextareaInputInset/FormikTextareaInputInset.test.tsx +179 -0
- package/src/components/Formik/FormikTextareaInputInset/FormikTextareaInputInset.tsx +42 -0
- package/src/components/Formik/FormikTimePicker/FormikTimePicker.test.tsx +224 -0
- package/src/components/Formik/FormikTimePicker/FormikTimePicker.tsx +37 -0
- package/src/components/Formik/FormikTimePickerNative/FormikTimePickerNative.test.tsx +175 -0
- package/src/components/Formik/FormikTimePickerNative/FormikTimePickerNative.tsx +38 -0
- package/src/components/Formik/FormikToggle/FormikToggle.test.tsx +172 -0
- package/src/components/Formik/FormikToggle/FormikToggle.tsx +38 -0
- package/src/components/Heading/Heading.constants.ts +19 -0
- package/src/components/Heading/Heading.mdx +35 -0
- package/src/components/Heading/Heading.module.scss +5 -0
- package/src/components/Heading/Heading.stories.tsx +90 -0
- package/src/components/Heading/Heading.test.tsx +67 -0
- package/src/components/Heading/Heading.tsx +67 -0
- package/src/components/HelpText/HelpText.module.scss +14 -0
- package/src/components/HelpText/HelpText.tsx +33 -0
- package/src/components/Icon/Icon.mdx +40 -0
- package/src/components/Icon/Icon.stories.tsx +72 -0
- package/src/components/Icon/Icon.test.tsx +30 -0
- package/src/components/Icon/Icon.tsx +61 -0
- package/src/components/InputValidationMessage/InputValidationMessage.module.scss +3 -0
- package/src/components/InputValidationMessage/InputValidationMessage.tsx +27 -0
- package/src/components/Modal/Modal.mdx +60 -0
- package/src/components/Modal/Modal.module.scss +135 -0
- package/src/components/Modal/Modal.stories.tsx +194 -0
- package/src/components/Modal/Modal.test.tsx +81 -0
- package/src/components/Modal/Modal.tsx +174 -0
- package/src/components/Modal/components/ModalBody/ModalBody.test.tsx +20 -0
- package/src/components/Modal/components/ModalBody/ModalBody.tsx +24 -0
- package/src/components/Modal/components/ModalFooter/ModalFooter.test.tsx +32 -0
- package/src/components/Modal/components/ModalFooter/ModalFooter.tsx +37 -0
- package/src/components/Modal/components/ModalHeader/ModalHeader.test.tsx +29 -0
- package/src/components/Modal/components/ModalHeader/ModalHeader.tsx +58 -0
- package/src/components/Modal/components/index.ts +5 -0
- package/src/components/Pagination/Pagination.mdx +26 -0
- package/src/components/Pagination/Pagination.stories.tsx +55 -0
- package/src/components/Pagination/Pagination.test.tsx +225 -0
- package/src/components/Pagination/Pagination.tsx +162 -0
- package/src/components/Pagination/Pagination.utilities.test.ts +133 -0
- package/src/components/Pagination/Pagination.utilities.ts +101 -0
- package/src/components/Popover/Popover.mdx +104 -0
- package/src/components/Popover/Popover.module.scss +74 -0
- package/src/components/Popover/Popover.stories.tsx +471 -0
- package/src/components/Popover/Popover.test.tsx +128 -0
- package/src/components/Popover/Popover.tsx +277 -0
- package/src/components/RadioGroup/RadioGroup.mdx +81 -0
- package/src/components/RadioGroup/RadioGroup.module.scss +23 -0
- package/src/components/RadioGroup/RadioGroup.stories.tsx +375 -0
- package/src/components/RadioGroup/RadioGroup.test.tsx +282 -0
- package/src/components/RadioGroup/RadioGroup.tsx +145 -0
- package/src/components/RadioGroup/RadioInput/RadioInput.module.scss +114 -0
- package/src/components/RadioGroup/RadioInput/RadioInput.test.tsx +156 -0
- package/src/components/RadioGroup/RadioInput/RadioInput.tsx +148 -0
- package/src/components/RadioGroup/RadioInput/RadioInputIcon.tsx +59 -0
- package/src/components/ResponsiveProvider/ResponsiveProvider.mdx +36 -0
- package/src/components/ResponsiveProvider/ResponsiveProvider.stories.tsx +54 -0
- package/src/components/ResponsiveProvider/ResponsiveProvider.test.tsx +70 -0
- package/src/components/ResponsiveProvider/ResponsiveProvider.tsx +73 -0
- package/src/components/SelectInput/SelectInput.mdx +115 -0
- package/src/components/SelectInput/SelectInput.module.scss +357 -0
- package/src/components/SelectInput/SelectInput.stories.tsx +373 -0
- package/src/components/SelectInput/SelectInput.test.tsx +403 -0
- package/src/components/SelectInput/SelectInput.tsx +245 -0
- package/src/components/SelectInputInset/SelectInputInset.mdx +56 -0
- package/src/components/SelectInputInset/SelectInputInset.module.scss +397 -0
- package/src/components/SelectInputInset/SelectInputInset.stories.tsx +189 -0
- package/src/components/SelectInputInset/SelectInputInset.test.tsx +305 -0
- package/src/components/SelectInputInset/SelectInputInset.tsx +235 -0
- package/src/components/SelectInputNative/SelectInputNative.mdx +87 -0
- package/src/components/SelectInputNative/SelectInputNative.module.scss +356 -0
- package/src/components/SelectInputNative/SelectInputNative.stories.tsx +282 -0
- package/src/components/SelectInputNative/SelectInputNative.test.tsx +341 -0
- package/src/components/SelectInputNative/SelectInputNative.tsx +121 -0
- package/src/components/Spinner/Spinner.mdx +29 -0
- package/src/components/Spinner/Spinner.module.scss +16 -0
- package/src/components/Spinner/Spinner.stories.tsx +48 -0
- package/src/components/Spinner/Spinner.test.tsx +47 -0
- package/src/components/Spinner/Spinner.tsx +116 -0
- package/src/components/Table/Table.mdx +216 -0
- package/src/components/Table/Table.module.scss +61 -0
- package/src/components/Table/Table.stories.tsx +884 -0
- package/src/components/Table/Table.test.tsx +437 -0
- package/src/components/Table/Table.tsx +171 -0
- package/src/components/Table/TableBody/TableBody.module.scss +19 -0
- package/src/components/Table/TableBody/TableBody.test.tsx +38 -0
- package/src/components/Table/TableBody/TableBody.tsx +96 -0
- package/src/components/Table/TableBody/TableBodyCell/TableBodyCell.module.scss +47 -0
- package/src/components/Table/TableBody/TableBodyCell/TableBodyCell.test.tsx +81 -0
- package/src/components/Table/TableBody/TableBodyCell/TableBodyCell.tsx +94 -0
- package/src/components/Table/TableHead/TableHead.test.tsx +20 -0
- package/src/components/Table/TableHead/TableHead.tsx +78 -0
- package/src/components/Table/TableHead/TableHeaderCell/TableHeaderCell.module.scss +72 -0
- package/src/components/Table/TableHead/TableHeaderCell/TableHeaderCell.test.tsx +187 -0
- package/src/components/Table/TableHead/TableHeaderCell/TableHeaderCell.tsx +192 -0
- package/src/components/Table/common/TableRow/TableRow.module.scss +5 -0
- package/src/components/Table/common/TableRow/TableRow.test.tsx +52 -0
- package/src/components/Table/common/TableRow/TableRow.tsx +155 -0
- package/src/components/TextInput/TextInput.mdx +96 -0
- package/src/components/TextInput/TextInput.module.scss +405 -0
- package/src/components/TextInput/TextInput.stories.tsx +268 -0
- package/src/components/TextInput/TextInput.test.tsx +231 -0
- package/src/components/TextInput/TextInput.tsx +263 -0
- package/src/components/TextInputInset/TextInputInset.mdx +62 -0
- package/src/components/TextInputInset/TextInputInset.module.scss +418 -0
- package/src/components/TextInputInset/TextInputInset.stories.tsx +213 -0
- package/src/components/TextInputInset/TextInputInset.test.tsx +222 -0
- package/src/components/TextInputInset/TextInputInset.tsx +261 -0
- package/src/components/TextareaInput/TextareaInput.mdx +117 -0
- package/src/components/TextareaInput/TextareaInput.module.scss +275 -0
- package/src/components/TextareaInput/TextareaInput.stories.tsx +293 -0
- package/src/components/TextareaInput/TextareaInput.test.tsx +195 -0
- package/src/components/TextareaInput/TextareaInput.tsx +182 -0
- package/src/components/TextareaInputInset/TextareaInputInset.mdx +55 -0
- package/src/components/TextareaInputInset/TextareaInputInset.module.scss +337 -0
- package/src/components/TextareaInputInset/TextareaInputInset.stories.tsx +160 -0
- package/src/components/TextareaInputInset/TextareaInputInset.test.tsx +199 -0
- package/src/components/TextareaInputInset/TextareaInputInset.tsx +213 -0
- package/src/components/ThemeProvider/ThemeProvider.mdx +11 -0
- package/src/components/ThemeProvider/ThemeProvider.stories.tsx +56 -0
- package/src/components/ThemeProvider/ThemeProvider.tsx +75 -0
- package/src/components/TimePicker/TimePicker.mdx +75 -0
- package/src/components/TimePicker/TimePicker.stories.tsx +149 -0
- package/src/components/TimePicker/TimePicker.test.tsx +97 -0
- package/src/components/TimePicker/TimePicker.tsx +83 -0
- package/src/components/TimePickerNative/TimePickerNative.mdx +67 -0
- package/src/components/TimePickerNative/TimePickerNative.stories.tsx +151 -0
- package/src/components/TimePickerNative/TimePickerNative.test.tsx +117 -0
- package/src/components/TimePickerNative/TimePickerNative.tsx +93 -0
- package/src/components/Toast/Toast.mdx +134 -0
- package/src/components/Toast/Toast.store.ts +280 -0
- package/src/components/Toast/Toast.stories.tsx +283 -0
- package/src/components/Toast/Toast.test.tsx +784 -0
- package/src/components/Toast/Toast.types.ts +98 -0
- package/src/components/Toast/ToastContainer.tsx +170 -0
- package/src/components/Toast/ToastNotification.module.scss +63 -0
- package/src/components/Toast/ToastNotification.tsx +176 -0
- package/src/components/Toast/index.ts +4 -0
- package/src/components/Toast/toast.ts +102 -0
- package/src/components/Toast/useToasts.ts +102 -0
- package/src/components/Toggle/Toggle.mdx +51 -0
- package/src/components/Toggle/Toggle.module.scss +294 -0
- package/src/components/Toggle/Toggle.stories.tsx +128 -0
- package/src/components/Toggle/Toggle.test.tsx +308 -0
- package/src/components/Toggle/Toggle.tsx +184 -0
- package/src/constants/keyCodes.ts +2 -0
- package/src/docs/Brands.mdx +153 -0
- package/src/docs/Colors.mdx +158 -0
- package/src/docs/DesignTokens.mdx +415 -0
- package/src/docs/GetStarted.mdx +47 -0
- package/src/docs/intro.mdx +12 -0
- package/src/fonts/AvenirBold.otf +0 -0
- package/src/fonts/AvenirBold.woff +0 -0
- package/src/fonts/AvenirBold.woff2 +0 -0
- package/src/fonts/AvenirLight.otf +0 -0
- package/src/fonts/AvenirLight.woff +0 -0
- package/src/fonts/AvenirLight.woff2 +0 -0
- package/src/fonts/AvenirRegular.otf +0 -0
- package/src/fonts/AvenirRegular.woff +0 -0
- package/src/fonts/AvenirRegular.woff2 +0 -0
- package/src/fonts/Geist-Bold.otf +0 -0
- package/src/fonts/Geist-Bold.woff +0 -0
- package/src/fonts/Geist-Bold.woff2 +0 -0
- package/src/fonts/Geist-Medium.otf +0 -0
- package/src/fonts/Geist-Medium.woff +0 -0
- package/src/fonts/Geist-Medium.woff2 +0 -0
- package/src/fonts/Geist-Regular.otf +0 -0
- package/src/fonts/Geist-Regular.woff +0 -0
- package/src/fonts/Geist-Regular.woff2 +0 -0
- package/src/fonts/Geist-SemiBold.otf +0 -0
- package/src/fonts/Geist-SemiBold.woff +0 -0
- package/src/fonts/Geist-SemiBold.woff2 +0 -0
- package/src/fonts/GeistMono-Regular.otf +0 -0
- package/src/fonts/GeistMono-Regular.woff +0 -0
- package/src/fonts/GeistMono-Regular.woff2 +0 -0
- package/src/hooks/index.ts +4 -0
- package/src/hooks/useBreakpoint/useBreakpoint.mdx +26 -0
- package/src/hooks/useBreakpoint/useBreakpoint.stories.tsx +30 -0
- package/src/hooks/useBreakpoint/useBreakpoint.test.tsx +19 -0
- package/src/hooks/useBreakpoint/useBreakpoint.ts +50 -0
- package/src/hooks/useIsomorphicLayoutEffect/useIsomorphicLayouEffect.ts +5 -0
- package/src/hooks/useOpenClose/useOpenClose.mdx +15 -0
- package/src/hooks/useOpenClose/useOpenClose.stories.tsx +41 -0
- package/src/hooks/useOpenClose/useOpenClose.test.tsx +119 -0
- package/src/hooks/useOpenClose/useOpenClose.tsx +95 -0
- package/src/hooks/useWindowSize/useWindowSize.mdx +25 -0
- package/src/hooks/useWindowSize/useWindowSize.stories.tsx +35 -0
- package/src/hooks/useWindowSize/useWindowSize.ts +24 -0
- package/src/index.ts +48 -0
- package/src/lib/cssShorthandToClasses.test.ts +149 -0
- package/src/lib/cssShorthandToClasses.ts +133 -0
- package/src/lib/doesStringIncludeCssUnit.ts +6 -0
- package/src/lib/generateResponsiveClasses.test.ts +24 -0
- package/src/lib/generateResponsiveClasses.ts +30 -0
- package/src/lib/getAutoCompleteValue.test.ts +27 -0
- package/src/lib/getAutoCompleteValue.ts +12 -0
- package/src/lib/getColumnKeys.ts +27 -0
- package/src/lib/getDimensionCss.test.ts +148 -0
- package/src/lib/getDimensionCss.ts +73 -0
- package/src/lib/getElementType.test.tsx +42 -0
- package/src/lib/getElementType.ts +42 -0
- package/src/lib/getFlexCss.test.ts +122 -0
- package/src/lib/getFlexCss.ts +67 -0
- package/src/lib/index.ts +15 -0
- package/src/lib/isFunction.ts +6 -0
- package/src/lib/mergeRefs.ts +15 -0
- package/src/lib/prefersReducedMotion.ts +12 -0
- package/src/lib/react-children-utilities/filter.ts +12 -0
- package/src/lib/react-children-utilities/index.ts +1 -0
- package/src/lib/reactRouterClickHandler.ts +37 -0
- package/src/lib/resolveValue.ts +7 -0
- package/src/lib/tokens.ts +139 -0
- package/src/modes.ts +8 -0
- package/src/styles/animation.scss +152 -0
- package/src/styles/cursor.scss +43 -0
- package/src/styles/display.scss +119 -0
- package/src/styles/flex.scss +453 -0
- package/src/styles/fonts.scss +44 -0
- package/src/styles/globals/utilities.scss +4 -0
- package/src/styles/mixins.scss +14 -0
- package/src/styles/overflow.scss +41 -0
- package/src/styles/position.scss +45 -0
- package/src/styles/reset.scss +108 -0
- package/src/styles/text-align.scss +21 -0
- package/src/styles/utilities.scss +9 -0
- package/src/styles/variables/forms.scss +71 -0
- package/src/styles/variables/index.scss +3 -0
- package/src/styles/white-space.scss +21 -0
- package/src/types/index.ts +201 -0
- 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,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,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).
|