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