@nypl/design-system-react-components 0.23.4 → 0.25.1
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/CHANGELOG.md +98 -1
- package/README.md +46 -11
- package/dist/components/Accordion/Accordion.d.ts +14 -14
- package/dist/components/Autosuggest/Autosuggest.stories.d.ts +1 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +11 -14
- package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +6 -0
- package/dist/components/Button/Button.d.ts +6 -13
- package/dist/components/Button/ButtonTypes.d.ts +5 -3
- package/dist/components/Card/Card.d.ts +59 -10
- package/dist/components/Card/CardTypes.d.ts +19 -0
- package/dist/components/CardEdition/CardEdition.d.ts +21 -0
- package/dist/components/{StyleGuide/Colors.stories.d.ts → CardEdition/CardEdition.stories.d.ts} +5 -2
- package/dist/components/Checkbox/Checkbox.d.ts +21 -16
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +43 -0
- package/dist/components/CheckboxGroup/CheckboxGroupLayoutTypes.d.ts +4 -0
- package/dist/components/DatePicker/DatePicker.d.ts +79 -0
- package/dist/components/DatePicker/DatePickerTypes.d.ts +5 -0
- package/dist/components/Form/Form.d.ts +16 -8
- package/dist/components/Form/FormTypes.d.ts +2 -0
- package/dist/components/Grid/GridTypes.d.ts +9 -0
- package/dist/components/Grid/SimpleGrid.d.ts +14 -0
- package/dist/components/Heading/Heading.d.ts +9 -11
- package/dist/components/Heading/{HeadingDisplaySizes.d.ts → HeadingTypes.d.ts} +8 -0
- package/dist/components/HelperErrorText/HelperErrorText.stories.d.ts +2 -1
- package/dist/components/Hero/Hero.d.ts +19 -14
- package/dist/components/Hero/HeroTypes.d.ts +10 -5
- package/dist/components/Icons/Icon.d.ts +13 -16
- package/dist/components/Icons/IconSvgs.d.ts +4 -0
- package/dist/components/Icons/IconTypes.d.ts +78 -60
- package/dist/components/Image/Image.stories.d.ts +2 -1
- package/dist/components/Label/Label.d.ts +10 -26
- package/dist/components/Link/Link.d.ts +8 -12
- package/dist/components/List/List.stories.d.ts +1 -0
- package/dist/components/Radio/Radio.d.ts +30 -24
- package/dist/components/RadioGroup/RadioGroup.d.ts +40 -0
- package/dist/components/RadioGroup/RadioGroupLayoutTypes.d.ts +4 -0
- package/dist/components/SearchBar/SearchBar.d.ts +45 -27
- package/dist/components/Select/Select.d.ts +34 -35
- package/dist/components/Select/SelectTypes.d.ts +4 -0
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +1 -1
- package/dist/components/SkeletonLoader/SkeletonLoaderTypes.d.ts +2 -2
- package/dist/components/StatusBadge/StatusBadge.d.ts +8 -6
- package/dist/components/StatusBadge/StatusBadgeTypes.d.ts +5 -0
- package/dist/components/Tabs/Tabs.d.ts +25 -0
- package/dist/components/Template/Template.d.ts +91 -0
- package/dist/components/Text/Text.d.ts +16 -0
- package/dist/components/Text/TextTypes.d.ts +6 -0
- package/dist/components/TextInput/TextInput.d.ts +37 -30
- package/dist/components/TextInput/TextInputTypes.d.ts +5 -0
- package/dist/design-system-react-components.cjs.development.js +4102 -917
- package/dist/design-system-react-components.cjs.development.js.map +1 -1
- package/dist/design-system-react-components.cjs.production.min.js +1 -1
- package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
- package/dist/design-system-react-components.esm.js +4023 -920
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/index.d.ts +23 -5
- package/dist/resources.scss +133 -24
- package/dist/styles.css +1 -1
- package/dist/theme/components/accordion.d.ts +25 -0
- package/dist/theme/components/breadcrumb.d.ts +90 -0
- package/dist/theme/components/button.d.ts +109 -0
- package/dist/theme/components/checkbox.d.ts +91 -0
- package/dist/theme/components/customCheckboxGroup.d.ts +18 -0
- package/dist/theme/components/customRadioGroup.d.ts +18 -0
- package/dist/theme/components/global.d.ts +55 -0
- package/dist/theme/components/globalMixins.d.ts +15 -0
- package/dist/theme/components/heading.d.ts +110 -0
- package/dist/theme/components/hero.d.ts +492 -0
- package/dist/theme/components/icon.d.ts +13 -0
- package/dist/theme/components/label.d.ts +16 -0
- package/dist/theme/components/link.d.ts +45 -0
- package/dist/theme/components/radio.d.ts +95 -0
- package/dist/theme/components/searchBar.d.ts +20 -0
- package/dist/theme/components/select.d.ts +58 -0
- package/dist/theme/components/statusBadge.d.ts +25 -0
- package/dist/theme/components/tabs.d.ts +85 -0
- package/dist/theme/components/template.d.ts +105 -0
- package/dist/theme/components/text.d.ts +20 -0
- package/dist/theme/components/textInput.d.ts +105 -0
- package/dist/theme/foundations/breakpoints.d.ts +23 -0
- package/dist/theme/foundations/colors.d.ts +3 -0
- package/dist/theme/foundations/global.d.ts +23 -0
- package/dist/theme/foundations/shadows.d.ts +4 -0
- package/dist/theme/foundations/spacing.d.ts +77 -0
- package/dist/theme/foundations/typography.d.ts +8 -0
- package/dist/theme/index.d.ts +20 -0
- package/dist/theme/provider.d.ts +5 -0
- package/dist/theme/types.d.ts +1 -0
- package/dist/utils/utils.d.ts +6 -0
- package/package.json +9 -2
- package/src/components/Accordion/Accordion.stories.mdx +233 -33
- package/src/components/Accordion/Accordion.test.tsx +135 -19
- package/src/components/Accordion/Accordion.tsx +81 -56
- package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -3
- package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -1
- package/src/components/Autosuggest/_Autosuggest.scss +2 -2
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +57 -56
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +31 -25
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +71 -73
- package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +6 -0
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +100 -0
- package/src/components/Button/Button.stories.mdx +125 -138
- package/src/components/Button/Button.test.tsx +65 -11
- package/src/components/Button/Button.tsx +72 -68
- package/src/components/Button/ButtonTypes.tsx +4 -2
- package/src/components/Button/_Button.scss +7 -92
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +58 -3
- package/src/components/Card/Card.stories.mdx +694 -0
- package/src/components/Card/Card.test.tsx +97 -102
- package/src/components/Card/Card.tsx +182 -31
- package/src/components/Card/CardTypes.tsx +21 -0
- package/src/components/Card/_Card.scss +234 -49
- package/src/components/{Card/Card.stories.tsx → CardEdition/CardEdition.stories.tsx} +32 -22
- package/src/components/CardEdition/CardEdition.test.tsx +395 -0
- package/src/components/CardEdition/CardEdition.tsx +60 -0
- package/src/components/CardEdition/_CardEdition.scss +138 -0
- package/src/components/Chakra/Box.stories.mdx +57 -0
- package/src/components/Chakra/Center.stories.mdx +99 -0
- package/src/components/Chakra/Grid.stories.mdx +79 -0
- package/src/components/Chakra/Stack.stories.mdx +93 -0
- package/src/components/Checkbox/Checkbox.stories.mdx +57 -35
- package/src/components/Checkbox/Checkbox.test.tsx +117 -147
- package/src/components/Checkbox/Checkbox.tsx +76 -50
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +325 -0
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +249 -0
- package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +345 -0
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +148 -0
- package/src/components/CheckboxGroup/CheckboxGroupLayoutTypes.tsx +4 -0
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +1360 -0
- package/src/components/DatePicker/DatePicker.stories.mdx +284 -0
- package/src/components/DatePicker/DatePicker.test.tsx +657 -0
- package/src/components/DatePicker/DatePicker.tsx +396 -0
- package/src/components/DatePicker/DatePickerTypes.tsx +5 -0
- package/src/components/DatePicker/_DatePicker.scss +76 -0
- package/src/components/Form/Form.stories.mdx +130 -27
- package/src/components/Form/Form.test.tsx +78 -36
- package/src/components/Form/Form.tsx +53 -19
- package/src/components/Form/FormTypes.tsx +3 -0
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +38 -0
- package/src/components/Grid/GridTypes.tsx +9 -0
- package/src/components/Grid/SimpleGrid.stories.mdx +275 -0
- package/src/components/Grid/SimpleGrid.test.tsx +66 -0
- package/src/components/Grid/SimpleGrid.tsx +37 -0
- package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +8 -0
- package/src/components/Heading/Heading.stories.mdx +63 -33
- package/src/components/Heading/Heading.test.tsx +24 -16
- package/src/components/Heading/Heading.tsx +54 -38
- package/src/components/Heading/{HeadingDisplaySizes.tsx → HeadingTypes.tsx} +9 -0
- package/src/components/HelperErrorText/HelperErrorText.stories.tsx +2 -1
- package/src/components/HelperErrorText/_HelperErrorText.scss +1 -1
- package/src/components/Hero/Hero.stories.mdx +195 -85
- package/src/components/Hero/Hero.test.tsx +544 -113
- package/src/components/Hero/Hero.tsx +80 -93
- package/src/components/Hero/HeroTypes.tsx +17 -5
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +307 -0
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +6 -1
- package/src/components/HorizontalRule/_HorizontalRule.scss +1 -1
- package/src/components/Icons/Icon.stories.mdx +89 -74
- package/src/components/Icons/Icon.test.tsx +30 -22
- package/src/components/Icons/Icon.tsx +63 -61
- package/src/components/Icons/IconSvgs.tsx +8 -0
- package/src/components/Icons/IconTypes.tsx +80 -60
- package/src/components/Image/Image.stories.tsx +2 -1
- package/src/components/Input/_Input.scss +2 -2
- package/src/components/Label/Label.stories.mdx +77 -0
- package/src/components/Label/Label.test.tsx +43 -12
- package/src/components/Label/Label.tsx +28 -45
- package/src/components/Label/__snapshots__/Label.test.tsx.snap +41 -0
- package/src/components/Link/Link.stories.mdx +47 -41
- package/src/components/Link/Link.test.tsx +33 -44
- package/src/components/Link/Link.tsx +114 -100
- package/src/components/List/List.stories.mdx +7 -3
- package/src/components/List/List.stories.tsx +14 -9
- package/src/components/List/List.test.tsx +12 -8
- package/src/components/List/List.tsx +9 -7
- package/src/components/List/_List.scss +3 -3
- package/src/components/Modal/Modal.stories.mdx +7 -3
- package/src/components/Modal/_Modal.scss +1 -1
- package/src/components/Notification/Notification.stories.mdx +99 -65
- package/src/components/Notification/Notification.test.tsx +3 -16
- package/src/components/Notification/Notification.tsx +12 -12
- package/src/components/Notification/_Notification.scss +5 -4
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +1 -1
- package/src/components/Pagination/Pagination.stories.mdx +7 -1
- package/src/components/Pagination/Pagination.test.tsx +16 -10
- package/src/components/Radio/Radio.stories.mdx +57 -46
- package/src/components/Radio/Radio.test.tsx +92 -138
- package/src/components/Radio/Radio.tsx +70 -69
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +250 -0
- package/src/components/RadioGroup/RadioGroup.stories.mdx +247 -0
- package/src/components/RadioGroup/RadioGroup.test.tsx +327 -0
- package/src/components/RadioGroup/RadioGroup.tsx +154 -0
- package/src/components/RadioGroup/RadioGroupLayoutTypes.tsx +4 -0
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +1101 -0
- package/src/components/SearchBar/SearchBar.Test.tsx +151 -16
- package/src/components/SearchBar/SearchBar.stories.mdx +196 -224
- package/src/components/SearchBar/SearchBar.tsx +151 -46
- package/src/components/Select/Select.stories.mdx +193 -168
- package/src/components/Select/Select.test.tsx +129 -324
- package/src/components/Select/Select.tsx +120 -160
- package/src/components/Select/SelectTypes.tsx +4 -0
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +18 -29
- package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +7 -7
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +4 -2
- package/src/components/SkeletonLoader/SkeletonLoaderTypes.tsx +2 -2
- package/src/components/SkeletonLoader/_SkeletonLoader.scss +3 -3
- package/src/components/StatusBadge/StatusBadge.stories.mdx +91 -0
- package/src/components/StatusBadge/StatusBadge.test.tsx +35 -7
- package/src/components/StatusBadge/StatusBadge.tsx +24 -25
- package/src/components/StatusBadge/StatusBadgeTypes.tsx +5 -0
- package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +28 -0
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +112 -90
- package/src/components/StyleGuide/Buttons.stories.mdx +98 -100
- package/src/components/StyleGuide/Colors.stories.mdx +336 -0
- package/src/components/StyleGuide/Forms.stories.mdx +85 -0
- package/src/components/StyleGuide/Iconography.stories.mdx +86 -93
- package/src/components/StyleGuide/Spacing.stories.mdx +0 -1
- package/src/components/StyleGuide/Typography.stories.mdx +164 -166
- package/src/components/StyleGuide/UIDocCard.tsx +4 -4
- package/src/components/Tabs/Tabs.stories.mdx +221 -0
- package/src/components/Tabs/Tabs.test.tsx +264 -0
- package/src/components/Tabs/Tabs.tsx +220 -0
- package/src/components/Template/Template.stories.mdx +574 -0
- package/src/components/Template/Template.test.tsx +124 -0
- package/src/components/Template/Template.tsx +226 -0
- package/src/components/Text/Text.stories.mdx +70 -0
- package/src/components/Text/Text.test.tsx +63 -0
- package/src/components/Text/Text.tsx +55 -0
- package/src/components/Text/TextTypes.tsx +6 -0
- package/src/components/Text/__snapshots__/Text.test.tsx.snap +33 -0
- package/src/components/TextInput/TextInput.stories.mdx +90 -90
- package/src/components/TextInput/TextInput.test.tsx +103 -83
- package/src/components/TextInput/TextInput.tsx +108 -91
- package/src/components/TextInput/TextInputTypes.tsx +6 -0
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +2 -1
- package/src/components/VideoPlayer/VideoPlayer.tsx +4 -2
- package/src/components/VideoPlayer/_VideoPlayer.scss +1 -1
- package/src/docs/Chakra.stories.mdx +341 -0
- package/src/docs/Intro.stories.mdx +31 -24
- package/src/index.ts +70 -5
- package/src/styles/01-colors/_colors-brand.scss +6 -4
- package/src/styles/01-colors/_colors-utility.scss +14 -15
- package/src/styles/03-space/_space-inline.scss +47 -7
- package/src/styles/03-space/_space-inset.scss +33 -5
- package/src/styles/03-space/_space-stack.scss +48 -8
- package/src/styles/base/_02-breakpoints.scss +5 -4
- package/src/styles/base/_04-base.scss +2 -1
- package/src/styles/base/_place-holder.scss +1 -1
- package/src/styles/base/_typography.scss +1 -29
- package/src/styles.scss +22 -25
- package/src/theme/components/accordion.ts +30 -0
- package/src/theme/components/breadcrumb.ts +77 -0
- package/src/theme/components/button.ts +125 -0
- package/src/theme/components/checkbox.ts +107 -0
- package/src/theme/components/customCheckboxGroup.ts +12 -0
- package/src/theme/components/customRadioGroup.ts +12 -0
- package/src/theme/components/global.ts +71 -0
- package/src/theme/components/globalMixins.ts +16 -0
- package/src/theme/components/heading.ts +72 -0
- package/src/theme/components/hero.ts +239 -0
- package/src/theme/components/icon.ts +79 -0
- package/src/theme/components/label.ts +17 -0
- package/src/theme/components/link.ts +47 -0
- package/src/theme/components/radio.ts +106 -0
- package/src/theme/components/searchBar.ts +21 -0
- package/src/theme/components/select.ts +50 -0
- package/src/theme/components/statusBadge.ts +27 -0
- package/src/theme/components/tabs.ts +79 -0
- package/src/theme/components/template.ts +114 -0
- package/src/theme/components/text.ts +31 -0
- package/src/theme/components/textInput.ts +61 -0
- package/src/theme/foundations/breakpoints.ts +24 -0
- package/src/theme/foundations/colors.ts +208 -0
- package/src/theme/foundations/global.ts +26 -0
- package/src/theme/foundations/shadows.ts +5 -0
- package/src/theme/foundations/spacing.ts +85 -0
- package/src/theme/foundations/typography.ts +35 -0
- package/src/theme/index.ts +88 -0
- package/src/theme/provider.tsx +9 -0
- package/src/theme/types.ts +1 -0
- package/src/utils/componentCategories.ts +56 -21
- package/src/utils/utils.ts +13 -0
- package/dist/components/Accordion/Accordion.stories.d.ts +0 -5
- package/dist/components/Card/Card.stories.d.ts +0 -27
- package/dist/components/Label/Label.stories.d.ts +0 -12
- package/dist/components/StatusBadge/StatusBadge.stories.d.ts +0 -8
- package/dist/components/Template/Template.stories.d.ts +0 -29
- package/src/components/Accordion/Accordion.stories.tsx +0 -65
- package/src/components/Accordion/_Accordion.scss +0 -81
- package/src/components/Breadcrumbs/_Breadcrumbs.scss +0 -97
- package/src/components/Checkbox/_Checkbox.scss +0 -97
- package/src/components/Form/_Form.scss +0 -28
- package/src/components/Heading/_Heading.scss +0 -163
- package/src/components/Hero/_Hero.scss +0 -256
- package/src/components/Icons/_Icons.scss +0 -116
- package/src/components/Label/Label.stories.tsx +0 -30
- package/src/components/Label/_Label.scss +0 -22
- package/src/components/Link/_Link.scss +0 -73
- package/src/components/Radio/_Radio.scss +0 -84
- package/src/components/SearchBar/_SearchBar.scss +0 -16
- package/src/components/Select/_Select.scss +0 -82
- package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -33
- package/src/components/StatusBadge/_StatusBadge.scss +0 -23
- package/src/components/StyleGuide/Colors.stories.tsx +0 -288
- package/src/components/Template/Template.stories.tsx +0 -85
- package/src/components/Template/_Template.scss +0 -63
- package/src/components/TextInput/_TextInput.scss +0 -59
|
@@ -1,99 +1,111 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
Box,
|
|
4
|
+
Input as ChakraInput,
|
|
5
|
+
Textarea as ChakraTextarea,
|
|
6
|
+
useMultiStyleConfig,
|
|
7
|
+
} from "@chakra-ui/react";
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
TextInputTypes,
|
|
11
|
+
TextInputFormats,
|
|
12
|
+
TextInputVariants,
|
|
13
|
+
} from "./TextInputTypes";
|
|
4
14
|
import Label from "../Label/Label";
|
|
5
15
|
import HelperErrorText from "../HelperErrorText/HelperErrorText";
|
|
6
16
|
import generateUUID from "../../helpers/generateUUID";
|
|
7
17
|
|
|
8
18
|
export interface InputProps {
|
|
9
|
-
/** Additional attributes to pass to the `<input>`
|
|
19
|
+
/** Additional attributes to pass to the `<input>` or `<textarea>` element */
|
|
10
20
|
attributes?: { [key: string]: any };
|
|
11
|
-
/**
|
|
12
|
-
type?: TextInputTypes;
|
|
13
|
-
/** Will add 'aria-required: true' to input */
|
|
14
|
-
required?: boolean;
|
|
15
|
-
/** Provides text for a `Label` component if `showLabel` is set to true; populates a `aria-label` sttribute if `showLabel` is set to false. */
|
|
16
|
-
labelText: string;
|
|
17
|
-
/** Offers the ability to show the label onscreen or hide it. Refer to the `labelText` property for more information. */
|
|
18
|
-
showLabel?: boolean;
|
|
19
|
-
/** Populates the HelperErrorText for standard state */
|
|
20
|
-
helperText?: string;
|
|
21
|
-
/** Populates the HelperErrorText for error state */
|
|
22
|
-
errorText?: string;
|
|
23
|
-
/** Populates the placeholder of the input */
|
|
24
|
-
placeholder?: string;
|
|
25
|
-
/** Populates the value of the input */
|
|
26
|
-
value?: string;
|
|
27
|
-
/** className you can add in addition to 'textinput' */
|
|
21
|
+
/** A class name for the TextInput parent div. */
|
|
28
22
|
className?: string;
|
|
23
|
+
/** Populates the HelperErrorText for the standard state */
|
|
24
|
+
helperText?: string;
|
|
29
25
|
/** ID that other components can cross reference for accessibility purposes */
|
|
30
26
|
id?: string;
|
|
31
|
-
/**
|
|
32
|
-
|
|
33
|
-
/** Adds the
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
|
|
37
|
-
/**
|
|
27
|
+
/** Populates the HelperErrorText for the error state */
|
|
28
|
+
invalidText?: string;
|
|
29
|
+
/** Adds the `disabled` and `aria-disabled` prop to the input when true */
|
|
30
|
+
isDisabled?: boolean;
|
|
31
|
+
/** Adds errored styling to the input/textarea and helper text elements */
|
|
32
|
+
isInvalid?: boolean;
|
|
33
|
+
/** Will add `required` and `aria-required` props to the input/textarea elements */
|
|
34
|
+
isRequired?: boolean;
|
|
35
|
+
/** Provides text for a `Label` component if `showLabel` is set to true;
|
|
36
|
+
* populates an `aria-label` attribute if `showLabel` is set to false. */
|
|
37
|
+
labelText: string;
|
|
38
|
+
/** The action to perform on the `input`/`textarea`'s onChange function */
|
|
38
39
|
onChange?: (
|
|
39
40
|
event:
|
|
40
41
|
| React.ChangeEvent<HTMLInputElement>
|
|
41
42
|
| React.ChangeEvent<HTMLTextAreaElement>
|
|
42
43
|
) => void;
|
|
44
|
+
/** Populates the placeholder for the input/textarea elements */
|
|
45
|
+
placeholder?: string;
|
|
46
|
+
/** Offers the ability to show the label onscreen or hide it. Refer to the
|
|
47
|
+
* `labelText` property for more information. */
|
|
48
|
+
showLabel?: boolean;
|
|
49
|
+
/** Offers the ability to show the "Required"/"Optional" label onscreen or
|
|
50
|
+
* hide it. True by default. */
|
|
51
|
+
showOptReqLabel?: boolean;
|
|
52
|
+
/** HTML Input types as defined by MDN: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input */
|
|
53
|
+
type?: TextInputTypes;
|
|
54
|
+
/** Populates the value of the input/textarea elements */
|
|
55
|
+
value?: string;
|
|
56
|
+
/** The variant to display. */
|
|
57
|
+
variantType?: TextInputVariants;
|
|
43
58
|
}
|
|
44
59
|
|
|
45
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* The type used for `ref`s. We want to extend both `input` and `textarea`
|
|
46
62
|
* since both are available to create through `TextInput`.
|
|
47
63
|
*/
|
|
48
64
|
export type TextInputRefType = HTMLInputElement & HTMLTextAreaElement;
|
|
49
65
|
|
|
50
|
-
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
66
|
+
/**
|
|
67
|
+
* Renders either an `input` element with a specified type or a `textarea`
|
|
68
|
+
* element. All types will render an accessible `Label` component and an
|
|
69
|
+
* optional `HelperErrorText` component.
|
|
53
70
|
*/
|
|
54
71
|
const TextInput = React.forwardRef<TextInputRefType, InputProps>(
|
|
55
72
|
(props, ref: React.Ref<TextInputRefType>) => {
|
|
56
73
|
const {
|
|
57
74
|
attributes = {},
|
|
58
|
-
|
|
59
|
-
required,
|
|
60
|
-
labelText,
|
|
61
|
-
showLabel = true,
|
|
75
|
+
className,
|
|
62
76
|
helperText,
|
|
63
|
-
|
|
77
|
+
id = generateUUID(),
|
|
78
|
+
invalidText,
|
|
79
|
+
isDisabled = false,
|
|
80
|
+
isInvalid = false,
|
|
81
|
+
isRequired = false,
|
|
82
|
+
labelText,
|
|
83
|
+
onChange,
|
|
64
84
|
placeholder,
|
|
85
|
+
showLabel = true,
|
|
86
|
+
showOptReqLabel = true,
|
|
87
|
+
type = TextInputTypes.text,
|
|
65
88
|
value,
|
|
66
|
-
|
|
67
|
-
disabled,
|
|
68
|
-
errored,
|
|
69
|
-
onChange,
|
|
70
|
-
modifiers = [],
|
|
71
|
-
id = generateUUID(),
|
|
89
|
+
variantType = TextInputVariants.Default,
|
|
72
90
|
} = props;
|
|
73
|
-
|
|
91
|
+
const styles = useMultiStyleConfig("TextInput", { variant: variantType });
|
|
74
92
|
const isTextArea = type === TextInputTypes.textarea;
|
|
75
93
|
const isHidden = type === TextInputTypes.hidden;
|
|
76
|
-
const optReqFlag =
|
|
77
|
-
const
|
|
78
|
-
?
|
|
94
|
+
const optReqFlag = isRequired ? "Required" : "Optional";
|
|
95
|
+
const finalInvalidText = invalidText
|
|
96
|
+
? invalidText
|
|
79
97
|
: "There is an error related to this field.";
|
|
80
|
-
let footnote
|
|
98
|
+
let footnote: string | React.ReactNode = isInvalid
|
|
99
|
+
? finalInvalidText
|
|
100
|
+
: helperText;
|
|
101
|
+
let fieldOutput;
|
|
81
102
|
let options;
|
|
82
103
|
|
|
83
|
-
if (!showLabel)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
if (
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
if (isTextArea) {
|
|
90
|
-
modifiers.push("textarea");
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (errored) {
|
|
94
|
-
footnote = errorOutput;
|
|
95
|
-
} else {
|
|
96
|
-
footnote = helperText;
|
|
104
|
+
if (!showLabel) {
|
|
105
|
+
attributes["aria-label"] =
|
|
106
|
+
labelText && footnote ? `${labelText} - ${footnote}` : labelText;
|
|
107
|
+
} else if (helperText) {
|
|
108
|
+
attributes["aria-describedby"] = `${id}-helperText`;
|
|
97
109
|
}
|
|
98
110
|
|
|
99
111
|
if (
|
|
@@ -111,50 +123,55 @@ const TextInput = React.forwardRef<TextInputRefType, InputProps>(
|
|
|
111
123
|
);
|
|
112
124
|
}
|
|
113
125
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
+
// When the type is "hidden", the input element needs fewer attributes.
|
|
127
|
+
options = isHidden
|
|
128
|
+
? { id, "aria-hidden": isHidden, onChange, ref }
|
|
129
|
+
: {
|
|
130
|
+
id,
|
|
131
|
+
"aria-required": isRequired,
|
|
132
|
+
isDisabled,
|
|
133
|
+
isRequired,
|
|
134
|
+
isInvalid,
|
|
135
|
+
placeholder,
|
|
136
|
+
onChange,
|
|
137
|
+
ref,
|
|
138
|
+
...attributes,
|
|
139
|
+
};
|
|
126
140
|
// For `input` and `textarea`, all attributes are the same but `input`
|
|
127
141
|
// also needs `type` and `value` to render correctly.
|
|
128
142
|
if (!isTextArea) {
|
|
129
143
|
options = { type, value, ...options } as any;
|
|
144
|
+
fieldOutput = <ChakraInput {...options} __css={styles.input} />;
|
|
145
|
+
} else {
|
|
146
|
+
fieldOutput = (
|
|
147
|
+
<ChakraTextarea {...options} __css={styles.textarea}>
|
|
148
|
+
{value}
|
|
149
|
+
</ChakraTextarea>
|
|
150
|
+
);
|
|
130
151
|
}
|
|
131
152
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
options,
|
|
135
|
-
isTextArea ? value : null
|
|
136
|
-
);
|
|
137
|
-
|
|
138
|
-
const transformedInput = (
|
|
139
|
-
<div className="textinput">
|
|
153
|
+
return (
|
|
154
|
+
<Box __css={styles} className={className}>
|
|
140
155
|
{labelText && showLabel && !isHidden && (
|
|
141
|
-
<Label
|
|
156
|
+
<Label
|
|
157
|
+
htmlFor={id}
|
|
158
|
+
optReqFlag={showOptReqLabel && optReqFlag}
|
|
159
|
+
id={`${id}-label`}
|
|
160
|
+
>
|
|
142
161
|
{labelText}
|
|
143
162
|
</Label>
|
|
144
163
|
)}
|
|
145
164
|
{fieldOutput}
|
|
146
|
-
{
|
|
147
|
-
<
|
|
148
|
-
{
|
|
149
|
-
|
|
165
|
+
{footnote && !isHidden && (
|
|
166
|
+
<Box __css={styles.helper} aria-disabled={isDisabled}>
|
|
167
|
+
<HelperErrorText isError={isInvalid} id={`${id}-helperText`}>
|
|
168
|
+
{footnote}
|
|
169
|
+
</HelperErrorText>
|
|
170
|
+
</Box>
|
|
150
171
|
)}
|
|
151
|
-
</
|
|
172
|
+
</Box>
|
|
152
173
|
);
|
|
153
|
-
|
|
154
|
-
return transformedInput;
|
|
155
174
|
}
|
|
156
175
|
);
|
|
157
176
|
|
|
158
|
-
TextInput.displayName = "TextInput";
|
|
159
|
-
|
|
160
177
|
export default TextInput;
|
|
@@ -23,6 +23,12 @@ export enum TextInputFormats {
|
|
|
23
23
|
url = "https://domain.com",
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
export enum TextInputVariants {
|
|
27
|
+
Default = "default",
|
|
28
|
+
SearchBar = "searchBar",
|
|
29
|
+
SearchBarSelect = "searchBarSelect",
|
|
30
|
+
}
|
|
31
|
+
|
|
26
32
|
/*
|
|
27
33
|
export enum TextInputPatterns {
|
|
28
34
|
// eslint-disable-next-line prettier/prettier
|
|
@@ -11,9 +11,10 @@ import { withDesign } from "storybook-addon-designs";
|
|
|
11
11
|
import VideoPlayer from "./VideoPlayer";
|
|
12
12
|
import { VideoPlayerTypes } from "./VideoPlayerTypes";
|
|
13
13
|
import { action } from "@storybook/addon-actions";
|
|
14
|
+
import { getCategory } from "../../utils/componentCategories";
|
|
14
15
|
|
|
15
16
|
<Meta
|
|
16
|
-
title="VideoPlayer"
|
|
17
|
+
title={getCategory("VideoPlayer")}
|
|
17
18
|
component={VideoPlayer}
|
|
18
19
|
decorators={[withDesign]}
|
|
19
20
|
parameters={{
|
|
@@ -2,7 +2,7 @@ import * as React from "react";
|
|
|
2
2
|
import bem from "../../utils/bem";
|
|
3
3
|
import { VideoPlayerAspectRatios, VideoPlayerTypes } from "./VideoPlayerTypes";
|
|
4
4
|
import Heading from "../Heading/Heading";
|
|
5
|
-
|
|
5
|
+
import { HeadingLevels } from "../Heading/HeadingTypes";
|
|
6
6
|
import HelperErrorText from "../HelperErrorText/HelperErrorText";
|
|
7
7
|
|
|
8
8
|
export interface VideoPlayerProps {
|
|
@@ -105,7 +105,9 @@ export default function VideoPlayer(
|
|
|
105
105
|
<span dangerouslySetInnerHTML={{ __html: errorMessage }} />
|
|
106
106
|
) : (
|
|
107
107
|
<>
|
|
108
|
-
{headingText &&
|
|
108
|
+
{headingText && (
|
|
109
|
+
<Heading level={HeadingLevels.Two} text={headingText} />
|
|
110
|
+
)}
|
|
109
111
|
{descriptionText && <p>{descriptionText}</p>}
|
|
110
112
|
<div className={bem("video-player__inside", modifiers, "", [])}>
|
|
111
113
|
{embedCode}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { Meta } from "@storybook/addon-docs/blocks";
|
|
2
|
+
|
|
3
|
+
<Meta title="Chakra UI" />
|
|
4
|
+
|
|
5
|
+
# Chakra UI
|
|
6
|
+
|
|
7
|
+
| Table of Contents |
|
|
8
|
+
| ----------------------------------- |
|
|
9
|
+
| 1. [Why Chakra UI?](#why-chakra-ui) |
|
|
10
|
+
| 2. [DSProvider](#dsprovider) |
|
|
11
|
+
| 3. [Components](#components) |
|
|
12
|
+
| 4. [Styling](#styling) |
|
|
13
|
+
| 5. [Testing](#testing) |
|
|
14
|
+
|
|
15
|
+
## Why Chakra UI?
|
|
16
|
+
|
|
17
|
+
The NYPL Design System (DS) project was influenced by other design systems but
|
|
18
|
+
ultimately we decided to initially build DS components from scratch rather than
|
|
19
|
+
use another design system as its foundation. To better help all the projects at
|
|
20
|
+
NYPL and to better scale with all the components we have built and still need to
|
|
21
|
+
build, we decided to integrate Chakra UI into the NYPL Design System.
|
|
22
|
+
|
|
23
|
+
Chakra UI is an open source component library that is opinionated and uses design
|
|
24
|
+
and development patterns that various projects at NYPL use. Since the NYPL DS
|
|
25
|
+
will be the foundation for all NYPL projects moving forward, using Chakra will
|
|
26
|
+
help us align all projects so similar patterns are used throughout various teams
|
|
27
|
+
and projects.
|
|
28
|
+
|
|
29
|
+
Chakra follows WAI-ARIA and WCAG 2.1 standards and guidelines which aligns with
|
|
30
|
+
the standards that NYPL follows for its own components and applications.
|
|
31
|
+
|
|
32
|
+
With design and development consistency, the ability to customize components
|
|
33
|
+
_if necessary_, and accessibility standards in place, developers at NYPL using
|
|
34
|
+
the Design System will be able to build out applications faster.
|
|
35
|
+
|
|
36
|
+
We recommend to read Chakra's own [documentation](https://chakra-ui.com/docs/getting-started)
|
|
37
|
+
to get up to speed on it. This file will provide information on how it is used
|
|
38
|
+
in the DS but we rely on Chakra's documentation.
|
|
39
|
+
|
|
40
|
+
## DSProvider
|
|
41
|
+
|
|
42
|
+
While the Chakra UI integration into the DS is a work-in-progress, there is one
|
|
43
|
+
necessary step consuming applications need to take for component styles to
|
|
44
|
+
properly render. Consuming applications need to wrap all the DS components with
|
|
45
|
+
a simple provider component. Fortunately, this only needs to be done once at
|
|
46
|
+
the top level of the consuming application.
|
|
47
|
+
|
|
48
|
+
Once the following is completed, DS components that internally use Chakra UI
|
|
49
|
+
will render styles properly. Internally, the `DSProvider` is built on top of
|
|
50
|
+
Chakra's `ChakraProvider` with NYPL's custom theme.
|
|
51
|
+
|
|
52
|
+
```jsx
|
|
53
|
+
// your main application file
|
|
54
|
+
import { DSProvider } from "@nypl/design-system-react-components";
|
|
55
|
+
|
|
56
|
+
// ...
|
|
57
|
+
const Application = (props) => {
|
|
58
|
+
// ...
|
|
59
|
+
return (
|
|
60
|
+
<DSProvider>
|
|
61
|
+
<header>...</header>
|
|
62
|
+
<div className="my-app nypl-ds">
|
|
63
|
+
// ...
|
|
64
|
+
{children}
|
|
65
|
+
</div>
|
|
66
|
+
<footer>...</footer>
|
|
67
|
+
</DSProvider>
|
|
68
|
+
);
|
|
69
|
+
};
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Chakra Components in Storybook
|
|
73
|
+
|
|
74
|
+
Storybook is configured to use the `DSProvider` so that components can render
|
|
75
|
+
appropriately. Unfortunately, this only works within the `Story` component.
|
|
76
|
+
When rendering components in documentation examples within a `Canvas` component,
|
|
77
|
+
wrap the elements in the `DSProvider` component.
|
|
78
|
+
|
|
79
|
+
```jsx
|
|
80
|
+
// These buttons are not a part of a "story" but still appear only
|
|
81
|
+
// in the documentation.
|
|
82
|
+
<Canvas>
|
|
83
|
+
<DSProvider>
|
|
84
|
+
<ButtonGroup>
|
|
85
|
+
<Button disabled={false}>Enabled</Button>
|
|
86
|
+
<Button disabled={true}>Disabled</Button>
|
|
87
|
+
</ButtonGroup>
|
|
88
|
+
</DSProvider>
|
|
89
|
+
</Canvas>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Components
|
|
93
|
+
|
|
94
|
+
The current work-in-progress is to use Chakra components to compose DS
|
|
95
|
+
components that align directly or to compose DS-specific components with Chakra.
|
|
96
|
+
For example, both the DS and Chakra have a `Button` component so we will use
|
|
97
|
+
Chakra's `Button` component to compose the DS `Button` component. However, the
|
|
98
|
+
DS has a `Hero` component that is not already built by Chakra. In this case,
|
|
99
|
+
the DS `Hero` component will internally use `Chakra` components.
|
|
100
|
+
|
|
101
|
+
### Components Composed with Chakra
|
|
102
|
+
|
|
103
|
+
While we can directly use Chakra components that align with DS components, we
|
|
104
|
+
want to compose DS components using the Chakra component as a base instead. This
|
|
105
|
+
pattern allows the Design System to have control over props and standard styles.
|
|
106
|
+
|
|
107
|
+
These components composed from Chakra, therefore, do not have all styled props
|
|
108
|
+
available. For example, whereas `m` (`margin`), `mr` (`marginright`), and similar
|
|
109
|
+
props can be used in Chakra components, those props are not available for DS
|
|
110
|
+
components that internally are composed with Chakra components.
|
|
111
|
+
|
|
112
|
+
Components built from Chakra rename the component with the `Chakra` name prefix.
|
|
113
|
+
|
|
114
|
+
```jsx
|
|
115
|
+
import { Tabs as ChakraTabs, useStyleConfig } from "@chakra-ui/react";
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
In this example, the `ChakraTabs` component is returned with NYPL specific
|
|
119
|
+
functionality, styles, and other requirements.
|
|
120
|
+
|
|
121
|
+
```jsx
|
|
122
|
+
function Tabs(props) {
|
|
123
|
+
// ...
|
|
124
|
+
const styles = useStyleConfig("Tabs", { variant: props.tabsType });
|
|
125
|
+
|
|
126
|
+
return (
|
|
127
|
+
<ChakraTabs
|
|
128
|
+
id={id}
|
|
129
|
+
__css={styles}
|
|
130
|
+
// ... other props
|
|
131
|
+
>
|
|
132
|
+
{children}
|
|
133
|
+
</ChakraTabs>
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
#### Patterns
|
|
138
|
+
|
|
139
|
+
The NYPL DS uses the [CSS BEM](http://getbem.com/introduction/) pattern to structure
|
|
140
|
+
and write CSS. We are moving away from this and re-writing SCSS classes into
|
|
141
|
+
Javascript objects that work with Chakra's theme. Instead of creating a variant
|
|
142
|
+
for a component with a class name, now the `type` prop is used. Internally, the
|
|
143
|
+
`type` prop will be mapped to a Chakra theme variant that will provide all the
|
|
144
|
+
necessary styles.
|
|
145
|
+
|
|
146
|
+
For the `Button` component, for example, we would convert a SCSS class rule such
|
|
147
|
+
as `.button-outline` to a Javascript object (more on this in the [Anatomy of a
|
|
148
|
+
Component Styling Object](#anatomy-of-a-component-styling-object) section).
|
|
149
|
+
|
|
150
|
+
### Components re-exported from Chakra
|
|
151
|
+
|
|
152
|
+
Some components are directly exported from Chakra. These components can be found
|
|
153
|
+
in the `/src/index.ts` file. Note that not _all_ Chakra components are re-exported
|
|
154
|
+
because we want to limit what developers should use in consuming applications.
|
|
155
|
+
|
|
156
|
+
Note: These components are harder to have snapshot tests for because, internally,
|
|
157
|
+
these components autogenerate ids and class names on every new render. We can't
|
|
158
|
+
override them so snapshot tests will fail.
|
|
159
|
+
|
|
160
|
+
## Styling
|
|
161
|
+
|
|
162
|
+
As mentioned in the [Components composed with Chakra](#components-composed-with-chakra)
|
|
163
|
+
section, we are moving away from using the BEM structure to using Javascript objects
|
|
164
|
+
to extend Chakra's theme.
|
|
165
|
+
|
|
166
|
+
The NYPL DS' theme file can be found at `src/theme/index.ts`. This creates a new
|
|
167
|
+
theme that extends Chakra's theme and is set in the `DSProvider` component. Note
|
|
168
|
+
that the example below is the general structure of the `theme` object but the DS
|
|
169
|
+
`theme` object has values already set so it may look different. You would generally
|
|
170
|
+
only work and add new object values in the `components` attribute for new
|
|
171
|
+
components and their theme or variants.
|
|
172
|
+
|
|
173
|
+
```jsx
|
|
174
|
+
const theme = extendTheme({
|
|
175
|
+
styles: { ... },
|
|
176
|
+
breakpoints: { ... },
|
|
177
|
+
colors: { ... },
|
|
178
|
+
typography: { ... },
|
|
179
|
+
space: { ... },
|
|
180
|
+
components: {
|
|
181
|
+
Button,
|
|
182
|
+
// ...
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Anatomy of a Component Styling Object
|
|
188
|
+
|
|
189
|
+
For in-depth information, read Chakra's [Component Style documentation](https://chakra-ui.com/docs/theming/component-style).
|
|
190
|
+
|
|
191
|
+
Component theme files can be found in the `src/theme/components/` directory.
|
|
192
|
+
Here is an example using the `Button` component.
|
|
193
|
+
|
|
194
|
+
```jsx
|
|
195
|
+
// The basic structure for all component style objects.
|
|
196
|
+
const Button = {
|
|
197
|
+
baseStyle: {},
|
|
198
|
+
sizes: {},
|
|
199
|
+
variants: {},
|
|
200
|
+
defaultProps: {},
|
|
201
|
+
};
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
A current variant class rule can be converted to a Javascript object and go in
|
|
205
|
+
the `variants` object as in the following example.
|
|
206
|
+
|
|
207
|
+
```jsx
|
|
208
|
+
// Button.scss
|
|
209
|
+
// This is the "Secondary" variant.
|
|
210
|
+
.button--outline {
|
|
211
|
+
@include button-base;
|
|
212
|
+
|
|
213
|
+
background-color: var(--ui-white);
|
|
214
|
+
border: 1px solid var(--ui-gray-light-cool);
|
|
215
|
+
color: inherit;
|
|
216
|
+
|
|
217
|
+
&:hover {
|
|
218
|
+
background-color: var(--ui-gray-xx-light-cool);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Button.ts
|
|
223
|
+
const Button = {
|
|
224
|
+
baseStyles: { ... },
|
|
225
|
+
sizes: { ... },
|
|
226
|
+
variants: {
|
|
227
|
+
secondary: {
|
|
228
|
+
bg: "ui.white",
|
|
229
|
+
border: "1px solid",
|
|
230
|
+
borderColor: "ui.gray.light-cool",
|
|
231
|
+
color: "inherit",
|
|
232
|
+
_hover: {
|
|
233
|
+
bg: "ui.gray.xx-light-cool",
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
// ... other variants,
|
|
237
|
+
},
|
|
238
|
+
defaultProps: { ... },
|
|
239
|
+
};
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Now this variant can be rendered:
|
|
243
|
+
|
|
244
|
+
```jsx
|
|
245
|
+
<Button buttonType={ButtonTypes.Secondary}>Press me</Button>
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Breakpoints
|
|
249
|
+
|
|
250
|
+
TODO:
|
|
251
|
+
|
|
252
|
+
### Colors
|
|
253
|
+
|
|
254
|
+
All available colors can be found in `src/theme/foundations/colors.ts`. Chakra
|
|
255
|
+
autogenerates the `colors` object into CSS variables. We will rely on these
|
|
256
|
+
variables rather than creating our own.
|
|
257
|
+
|
|
258
|
+
```jsx
|
|
259
|
+
const colors: Colors = {
|
|
260
|
+
// ui fills
|
|
261
|
+
ui: {
|
|
262
|
+
/// State and link utilities
|
|
263
|
+
focus: "#4181F1",
|
|
264
|
+
link: {
|
|
265
|
+
primary: "#0576D3",
|
|
266
|
+
secondary: "#004B98",
|
|
267
|
+
},
|
|
268
|
+
// ...
|
|
269
|
+
},
|
|
270
|
+
section: {
|
|
271
|
+
/** What's On is used for Exhibitions & Events. */
|
|
272
|
+
"whats-on": {
|
|
273
|
+
primary: "#242424",
|
|
274
|
+
secondary: "#000000",
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
// ...
|
|
278
|
+
};
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
In the shorten object example above, the following will be generated by Chakra:
|
|
282
|
+
|
|
283
|
+
| Theme object value | CSS variable |
|
|
284
|
+
| -------------------------------------- | -------------------------------------------- |
|
|
285
|
+
| `colors.ui.focus` | `--chakra-colors-ui-focus` |
|
|
286
|
+
| `colors.ui.link.primary` | `--chakra-colors-ui-link-primary` |
|
|
287
|
+
| `colors.ui.link.secondary` | `--chakra-colors-ui-link-secondary` |
|
|
288
|
+
| `colors.section["whats-on"].primary` | `--chakra-colors-section-whats-on-primary` |
|
|
289
|
+
| `colors.section["whats-on"].secondary` | `--chakra-colors-section-whats-on-secondary` |
|
|
290
|
+
|
|
291
|
+
The current prefix is `--chakra` but we expect to update that soon. DS specified
|
|
292
|
+
CSS variables are still exported but we will remove those in favor of the CSS
|
|
293
|
+
variables provided by Chakra for ease of use.
|
|
294
|
+
|
|
295
|
+
Note: while each Chakra color has number range values from 50 to 900 (such as
|
|
296
|
+
`red.400`, `blue.600`, etc) and each one is based on the color coming from
|
|
297
|
+
DS' Figma documentation, we recommend NOT to use them.
|
|
298
|
+
|
|
299
|
+
### Spacing
|
|
300
|
+
|
|
301
|
+
All the spacing values can be found in the `src/theme/foundations/spacing.ts`
|
|
302
|
+
file. While Chakra provides many values, only use the eight DS defined values.
|
|
303
|
+
|
|
304
|
+
| Chakra Value | DS Variable |
|
|
305
|
+
| ------------ | ----------- |
|
|
306
|
+
| 1 | --space-xxs |
|
|
307
|
+
| 2 | --space-xs |
|
|
308
|
+
| 4 | --space-s |
|
|
309
|
+
| 6 | --space-m |
|
|
310
|
+
| 8 | --space-l |
|
|
311
|
+
| 12 | --space-xl |
|
|
312
|
+
| 16 | --space-xxl |
|
|
313
|
+
| 24 | --space-xxl |
|
|
314
|
+
|
|
315
|
+
For example, to make all `button`s have a `padding: 8px 16px` value:
|
|
316
|
+
|
|
317
|
+
```jsx
|
|
318
|
+
// src/theme/components/button.ts
|
|
319
|
+
const Button = {
|
|
320
|
+
baseStyle: {
|
|
321
|
+
py: 2, // var(--space-xs) which results in a value of 8px or 0.5rem
|
|
322
|
+
px: 4, // var(--space-s) which results in a value of 16px or 1rem
|
|
323
|
+
// ... other styles
|
|
324
|
+
},
|
|
325
|
+
sizes: { ... },
|
|
326
|
+
variants: { ... },
|
|
327
|
+
defaultProps: { ... },
|
|
328
|
+
};
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Typography
|
|
332
|
+
|
|
333
|
+
All typography values can be found in the `src/theme/foundations/typography.ts`
|
|
334
|
+
file. These values declare the font family, font sizes, and font weights to use
|
|
335
|
+
for all text.
|
|
336
|
+
|
|
337
|
+
## Testing
|
|
338
|
+
|
|
339
|
+
Do not re-test Chakra components that are re-exported since they are already
|
|
340
|
+
tested in the `@chakra-ui/react` package. We do expect all new components composed
|
|
341
|
+
from Chakra to have tests for functionality and styling (such as snapshots).
|