@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,636 @@
|
|
|
1
|
+
import * as CSS from 'csstype';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
BaseSpacing,
|
|
5
|
+
BorderRadiusSize,
|
|
6
|
+
BorderSize,
|
|
7
|
+
BoxShadowSize,
|
|
8
|
+
// BaseColor,
|
|
9
|
+
BreakpointSizeWithBase,
|
|
10
|
+
CssAlignContentValue,
|
|
11
|
+
CssAlignItemsValue,
|
|
12
|
+
CssDisplayValue,
|
|
13
|
+
CssFlexDirectionValue,
|
|
14
|
+
CssFlexValue,
|
|
15
|
+
CssJustifyContentValue,
|
|
16
|
+
CssOverflowValue,
|
|
17
|
+
CssTextAlignValue,
|
|
18
|
+
DimensionSize,
|
|
19
|
+
FontColor,
|
|
20
|
+
FontFamily,
|
|
21
|
+
FontSize,
|
|
22
|
+
FontWeight,
|
|
23
|
+
ResponsiveProp,
|
|
24
|
+
SpacingSize,
|
|
25
|
+
ZIndexSize,
|
|
26
|
+
BackgroundColor,
|
|
27
|
+
BorderColor,
|
|
28
|
+
} from '../../types';
|
|
29
|
+
import {
|
|
30
|
+
CSSProperties,
|
|
31
|
+
Children,
|
|
32
|
+
FC,
|
|
33
|
+
ReactElement,
|
|
34
|
+
ReactNode,
|
|
35
|
+
cloneElement,
|
|
36
|
+
createElement,
|
|
37
|
+
forwardRef,
|
|
38
|
+
} from 'react';
|
|
39
|
+
|
|
40
|
+
import { KnownKeys } from '../../types/lib.types';
|
|
41
|
+
import classNames from 'classnames';
|
|
42
|
+
import { cssShorthandToClasses } from '../../lib/cssShorthandToClasses';
|
|
43
|
+
import { generateResponsiveClasses } from '../../lib/generateResponsiveClasses';
|
|
44
|
+
import { getDimensionCss } from '../../lib/getDimensionCss';
|
|
45
|
+
import { getElementType } from '../../lib/getElementType';
|
|
46
|
+
import styles from './Box.module.scss';
|
|
47
|
+
|
|
48
|
+
export type HoverableBoxProperties =
|
|
49
|
+
| 'color'
|
|
50
|
+
| 'borderColor'
|
|
51
|
+
| 'shadow'
|
|
52
|
+
| 'background';
|
|
53
|
+
export interface BoxProps {
|
|
54
|
+
/**
|
|
55
|
+
* The element type to be rendered.
|
|
56
|
+
*/
|
|
57
|
+
as?: string;
|
|
58
|
+
/**
|
|
59
|
+
* How to align the contents along the cross axis.
|
|
60
|
+
*/
|
|
61
|
+
alignItems?: CssAlignItemsValue | ResponsiveProp<CssAlignItemsValue>;
|
|
62
|
+
/**
|
|
63
|
+
* How to align the contents when there is extra space in the cross axis.
|
|
64
|
+
* This property has no effect when there is only one line of flex items.
|
|
65
|
+
*/
|
|
66
|
+
alignContent?: CssAlignContentValue | ResponsiveProp<CssAlignContentValue>;
|
|
67
|
+
/**
|
|
68
|
+
* How to align along the cross axis when contained in a Box.
|
|
69
|
+
* This allows the default alignment (or the one specified by `align`) to be overridden for the individual Box.
|
|
70
|
+
*/
|
|
71
|
+
alignSelf?: CssAlignItemsValue | ResponsiveProp<CssAlignItemsValue>;
|
|
72
|
+
/**
|
|
73
|
+
* Any valid background color token, or a `url()` for an image
|
|
74
|
+
*/
|
|
75
|
+
background?: BackgroundColor;
|
|
76
|
+
/**
|
|
77
|
+
* Any valid border color token
|
|
78
|
+
*/
|
|
79
|
+
borderColor?: BorderColor;
|
|
80
|
+
/**
|
|
81
|
+
* Width of the Box's border
|
|
82
|
+
* Can be a single [border width token](/?path=/docs/foundation-design-tokens--docs#border-width).
|
|
83
|
+
* Can also be a string of [border width tokens](/?path=/docs/foundation-design-tokens--docs#border-width)
|
|
84
|
+
* that models itself after the css shorthand property,
|
|
85
|
+
* where you can set the border width on all four sides of an element.
|
|
86
|
+
* e.g: "0 sm xs 0" --> top: 0, right: sm, bottom: xs, left: 0;
|
|
87
|
+
*/
|
|
88
|
+
borderWidth?: BorderSize | string | ResponsiveProp<BorderSize | string>;
|
|
89
|
+
/**
|
|
90
|
+
* Additional class names to add
|
|
91
|
+
*/
|
|
92
|
+
className?: string;
|
|
93
|
+
/**
|
|
94
|
+
* The amount of spacing (implemented as margin) between child elements.
|
|
95
|
+
* Can be a single [spacing value](/?path=/docs/foundation-design-tokens--docs#spacing).
|
|
96
|
+
* NOTE: this prop is incompatible with reverse flex direction values (row-reverse, column-reverse).
|
|
97
|
+
* For grid and flex layouts, use 'gap' instead.
|
|
98
|
+
*/
|
|
99
|
+
childGap?: SpacingSize | ResponsiveProp<SpacingSize>;
|
|
100
|
+
/**
|
|
101
|
+
* The box's contents
|
|
102
|
+
*/
|
|
103
|
+
children?: ReactNode;
|
|
104
|
+
/**
|
|
105
|
+
* A color token identifier to use for the text color.
|
|
106
|
+
*/
|
|
107
|
+
color?: FontColor;
|
|
108
|
+
/**
|
|
109
|
+
* Sets the gaps (gutters) between columns.
|
|
110
|
+
*/
|
|
111
|
+
columnGap?: BaseSpacing | ResponsiveProp<BaseSpacing>;
|
|
112
|
+
/**
|
|
113
|
+
* Cursor style. Use any standard CSS value.
|
|
114
|
+
*/
|
|
115
|
+
cursor?: CSS.Property.Cursor;
|
|
116
|
+
/**
|
|
117
|
+
* Sets how flex items are placed inside the Box, defining the main axis and the direction
|
|
118
|
+
* NOTE: reverse directions are incompatible with the `childGap` prop.
|
|
119
|
+
*/
|
|
120
|
+
direction?: CssFlexDirectionValue | ResponsiveProp<CssFlexDirectionValue>;
|
|
121
|
+
/**
|
|
122
|
+
* Display property. Only select values supported.
|
|
123
|
+
*/
|
|
124
|
+
display?: CssDisplayValue | ResponsiveProp<CssDisplayValue>;
|
|
125
|
+
/**
|
|
126
|
+
* Can be used as shorthand for the flexbox css properties `flex-grow`, `flex-shrink`, `flex-basis`
|
|
127
|
+
*/
|
|
128
|
+
flex?: CssFlexValue | ResponsiveProp<CssFlexValue>;
|
|
129
|
+
/**
|
|
130
|
+
* Pass style modifiers for focus states. The following properties can be modified on focus.
|
|
131
|
+
* `* background`
|
|
132
|
+
* `* borderColor`
|
|
133
|
+
* `* borderWidth`
|
|
134
|
+
* `* color`
|
|
135
|
+
* `* shadow`
|
|
136
|
+
*/
|
|
137
|
+
focus?: {
|
|
138
|
+
background?: BoxProps['background'];
|
|
139
|
+
borderColor?: BoxProps['borderColor'];
|
|
140
|
+
borderWidth?: BoxProps['borderWidth'];
|
|
141
|
+
color?: BoxProps['color'];
|
|
142
|
+
shadow?: BoxProps['shadow'];
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* The [font family token](/?path=/docs/foundation-design-tokens--docs#font-family) identifier for the Box's text
|
|
146
|
+
*/
|
|
147
|
+
fontFamily?: FontFamily | ResponsiveProp<FontFamily>;
|
|
148
|
+
/**
|
|
149
|
+
* The [font size token](/?path=/docs/foundation-design-tokens--docs#font-size) identifier for the Box's text
|
|
150
|
+
*/
|
|
151
|
+
fontSize?: FontSize | ResponsiveProp<FontSize>;
|
|
152
|
+
/**
|
|
153
|
+
* The [font weight token](/?path=/docs/design-tokens-design-tokens--page#font-weight) identifier for the Box's text
|
|
154
|
+
*/
|
|
155
|
+
fontWeight?: FontWeight | ResponsiveProp<FontWeight>;
|
|
156
|
+
/**
|
|
157
|
+
* The height of the element. Can be given a standard css value (px, rem, em, %),
|
|
158
|
+
* or a [height token](/?path=/docs/foundation-design-tokens--docs#height)
|
|
159
|
+
*/
|
|
160
|
+
height?: DimensionSize | ResponsiveProp<DimensionSize> | string;
|
|
161
|
+
/**
|
|
162
|
+
* Pass style modifiers for hover states. The following properties can be modified on hover:
|
|
163
|
+
* `* background`
|
|
164
|
+
* `* borderColor`
|
|
165
|
+
* `* borderWidth`
|
|
166
|
+
* `* color`
|
|
167
|
+
* `* fontSize`
|
|
168
|
+
* `* shadow`
|
|
169
|
+
*/
|
|
170
|
+
hover?: {
|
|
171
|
+
background?: BoxProps['background'];
|
|
172
|
+
borderColor?: BoxProps['borderColor'];
|
|
173
|
+
borderWidth?: BoxProps['borderWidth'];
|
|
174
|
+
color?: BoxProps['color'];
|
|
175
|
+
fontSize?: BoxProps['fontSize'];
|
|
176
|
+
shadow?: BoxProps['shadow'];
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* Sets the gaps (gutters) between rows and columns.
|
|
180
|
+
*/
|
|
181
|
+
gap?: BaseSpacing | ResponsiveProp<BaseSpacing>;
|
|
182
|
+
/**
|
|
183
|
+
* How space between and around content items is distributed along the main-axis a flex Box
|
|
184
|
+
*/
|
|
185
|
+
justifyContent?:
|
|
186
|
+
| CssJustifyContentValue
|
|
187
|
+
| ResponsiveProp<CssJustifyContentValue>;
|
|
188
|
+
/**
|
|
189
|
+
* Amount of space around the element.
|
|
190
|
+
* Can be a single [spacing value](/?path=/docs/foundation-design-tokens--docs#spacing).
|
|
191
|
+
* Can also be a string of [spacing value](/?path=/docs/foundation-design-tokens--docs#spacing)
|
|
192
|
+
* that models itself after the css shorthand property,
|
|
193
|
+
* where you can set the margin area on all four sides of an element. It is shorthand for top, right, bottom, left.
|
|
194
|
+
*/
|
|
195
|
+
margin?: BaseSpacing | ResponsiveProp<BaseSpacing>;
|
|
196
|
+
/**
|
|
197
|
+
* The maximum height of the element. Can be given a standard css value (px, rem, em, %),
|
|
198
|
+
* or a [height token](/?path=/docs/foundation-design-tokens--docs#height)
|
|
199
|
+
*/
|
|
200
|
+
maxHeight?: DimensionSize | ResponsiveProp<DimensionSize> | string;
|
|
201
|
+
/**
|
|
202
|
+
* The minimum height of the element. Can be given a standard css value (px, rem, em, %),
|
|
203
|
+
* or a [height token](/?path=/docs/foundation-design-tokens--docs#height)
|
|
204
|
+
*/
|
|
205
|
+
minHeight?: DimensionSize | ResponsiveProp<DimensionSize> | string;
|
|
206
|
+
/**
|
|
207
|
+
* The maximum width of the element. Can be given a standard css value (px, rem, em, %),
|
|
208
|
+
* or a [width token](/?path=/docs/foundation-design-tokens--docs#width)
|
|
209
|
+
*/
|
|
210
|
+
maxWidth?: DimensionSize | ResponsiveProp<DimensionSize> | string;
|
|
211
|
+
/**
|
|
212
|
+
* The minimum width of the element. Can be given a standard css value (px, rem, em, %),
|
|
213
|
+
* or a [width token](/?path=/docs/foundation-design-tokens--docs#width)
|
|
214
|
+
*/
|
|
215
|
+
minWidth?: DimensionSize | ResponsiveProp<DimensionSize> | string;
|
|
216
|
+
/**
|
|
217
|
+
* The css overflow behavior of the Box
|
|
218
|
+
*/
|
|
219
|
+
overflow?: CssOverflowValue | ResponsiveProp<CssOverflowValue>;
|
|
220
|
+
/**
|
|
221
|
+
* Amount of space within the element around the Box contents.
|
|
222
|
+
* Can be a single [spacing value](/?path=/docs/foundation-design-tokens--docs#spacing).
|
|
223
|
+
* Can also be a string of [spacing value](/?path=/docs/foundation-design-tokens--docs#spacing)
|
|
224
|
+
* that models itself after the css shorthand property,
|
|
225
|
+
* where you can set the margin area on all four sides of an element. It is shorthand for top, right, bottom, left.
|
|
226
|
+
*/
|
|
227
|
+
padding?: BaseSpacing | ResponsiveProp<BaseSpacing>;
|
|
228
|
+
/**
|
|
229
|
+
* CSS position property.
|
|
230
|
+
*/
|
|
231
|
+
position?: CSS.Property.Position | ResponsiveProp<CSS.Property.Position>;
|
|
232
|
+
/**
|
|
233
|
+
* Set the radius of all corners
|
|
234
|
+
*/
|
|
235
|
+
radius?: BorderRadiusSize | ResponsiveProp<BorderRadiusSize>;
|
|
236
|
+
/**
|
|
237
|
+
* Sets the gaps (gutters) between rows.
|
|
238
|
+
*/
|
|
239
|
+
rowGap?: BaseSpacing | ResponsiveProp<BaseSpacing>;
|
|
240
|
+
/**
|
|
241
|
+
* The size of the drop shadow applied to the Box
|
|
242
|
+
*/
|
|
243
|
+
shadow?: BoxShadowSize | ResponsiveProp<BoxShadowSize>;
|
|
244
|
+
/**
|
|
245
|
+
* CSS Style object
|
|
246
|
+
*/
|
|
247
|
+
style?: CSSProperties;
|
|
248
|
+
/**
|
|
249
|
+
* the alignment of the text
|
|
250
|
+
*/
|
|
251
|
+
textAlign?: CssTextAlignValue | ResponsiveProp<CssTextAlignValue>;
|
|
252
|
+
/**
|
|
253
|
+
* By default, a Box's items will all try to fit onto one line.
|
|
254
|
+
* Change that and allow the items to wrap as needed wrap
|
|
255
|
+
*/
|
|
256
|
+
wrap?: boolean | ResponsiveProp<boolean>;
|
|
257
|
+
/**
|
|
258
|
+
* The width of the element. Can be given a standard css value (px, rem, em, %),
|
|
259
|
+
* or a [width token](/?path=/docs/foundation-design-tokens--docs#width)
|
|
260
|
+
*/
|
|
261
|
+
width?: DimensionSize | ResponsiveProp<DimensionSize> | string;
|
|
262
|
+
/**
|
|
263
|
+
* ZIndex value for the element. Can be one of the predetermined token values.
|
|
264
|
+
* Can be responsive.
|
|
265
|
+
*/
|
|
266
|
+
zIndex?: ZIndexSize | ResponsiveProp<ZIndexSize>;
|
|
267
|
+
/**
|
|
268
|
+
* Additional props to be spread to rendered element
|
|
269
|
+
*/
|
|
270
|
+
[x: string]: any; // eslint-disable-line
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* A `<Box>` is a layout component to build UIs with consistent padding and spacing between
|
|
275
|
+
* elements.
|
|
276
|
+
*/
|
|
277
|
+
export const Box: FC<BoxProps> = forwardRef(
|
|
278
|
+
(
|
|
279
|
+
{
|
|
280
|
+
as = 'div',
|
|
281
|
+
alignItems = undefined,
|
|
282
|
+
alignContent = undefined,
|
|
283
|
+
alignSelf = undefined,
|
|
284
|
+
background = undefined,
|
|
285
|
+
borderColor = undefined,
|
|
286
|
+
borderWidth = undefined,
|
|
287
|
+
children = undefined,
|
|
288
|
+
childGap = undefined,
|
|
289
|
+
className = '',
|
|
290
|
+
color = undefined,
|
|
291
|
+
columnGap = undefined,
|
|
292
|
+
cursor = undefined,
|
|
293
|
+
display = 'flex',
|
|
294
|
+
direction = 'column',
|
|
295
|
+
flex = undefined,
|
|
296
|
+
fontFamily = undefined,
|
|
297
|
+
fontSize = 'inherit',
|
|
298
|
+
focus = undefined,
|
|
299
|
+
fontWeight = undefined,
|
|
300
|
+
gap = undefined,
|
|
301
|
+
height = undefined,
|
|
302
|
+
hover = undefined,
|
|
303
|
+
justifyContent = undefined,
|
|
304
|
+
margin = undefined,
|
|
305
|
+
maxHeight = undefined,
|
|
306
|
+
minHeight = undefined,
|
|
307
|
+
maxWidth = undefined,
|
|
308
|
+
minWidth = undefined,
|
|
309
|
+
overflow = undefined,
|
|
310
|
+
padding = undefined,
|
|
311
|
+
position = undefined,
|
|
312
|
+
radius = undefined,
|
|
313
|
+
rowGap = undefined,
|
|
314
|
+
shadow = undefined,
|
|
315
|
+
style = {},
|
|
316
|
+
textAlign = undefined,
|
|
317
|
+
wrap = undefined,
|
|
318
|
+
width = undefined,
|
|
319
|
+
zIndex = undefined,
|
|
320
|
+
...restProps
|
|
321
|
+
},
|
|
322
|
+
ref
|
|
323
|
+
) => {
|
|
324
|
+
const heightCss = getDimensionCss('h', height);
|
|
325
|
+
const widthCss = getDimensionCss('w', width);
|
|
326
|
+
const maxHeightCss = getDimensionCss('mh', maxHeight);
|
|
327
|
+
const maxWidthCss = getDimensionCss('mw', maxWidth);
|
|
328
|
+
const minHeightCss = getDimensionCss('minh', minHeight);
|
|
329
|
+
const minWidthCss = getDimensionCss('minw', minWidth);
|
|
330
|
+
|
|
331
|
+
const isFlexBox = typeof display === 'string' && display.includes('flex');
|
|
332
|
+
const flexDirectionClasses = isFlexBox
|
|
333
|
+
? generateResponsiveClasses('flex-direction', direction)
|
|
334
|
+
: null;
|
|
335
|
+
|
|
336
|
+
const cssPropertyMap: {
|
|
337
|
+
[key: string]: {
|
|
338
|
+
classPrefix: string;
|
|
339
|
+
transformer:
|
|
340
|
+
| typeof generateResponsiveClasses
|
|
341
|
+
| typeof cssShorthandToClasses;
|
|
342
|
+
};
|
|
343
|
+
} = {
|
|
344
|
+
color: {
|
|
345
|
+
classPrefix: 'font-color',
|
|
346
|
+
transformer: generateResponsiveClasses,
|
|
347
|
+
},
|
|
348
|
+
background: {
|
|
349
|
+
classPrefix: 'background-color',
|
|
350
|
+
transformer: generateResponsiveClasses,
|
|
351
|
+
},
|
|
352
|
+
borderColor: {
|
|
353
|
+
classPrefix: 'border-color',
|
|
354
|
+
transformer: generateResponsiveClasses,
|
|
355
|
+
},
|
|
356
|
+
borderWidth: {
|
|
357
|
+
classPrefix: 'border-width',
|
|
358
|
+
transformer: cssShorthandToClasses,
|
|
359
|
+
},
|
|
360
|
+
shadow: { classPrefix: 'shadow', transformer: generateResponsiveClasses },
|
|
361
|
+
fontSize: {
|
|
362
|
+
classPrefix: 'font-size',
|
|
363
|
+
transformer: generateResponsiveClasses,
|
|
364
|
+
},
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
const getStatefulClasses = (
|
|
368
|
+
stateKey: 'hover' | 'focus',
|
|
369
|
+
values: BoxProps['hover' | 'hover']
|
|
370
|
+
) =>
|
|
371
|
+
values // eslint-disable-line
|
|
372
|
+
? Object.entries(values).map(
|
|
373
|
+
([key, value]) =>
|
|
374
|
+
cssPropertyMap[key].transformer(
|
|
375
|
+
`${stateKey}:${
|
|
376
|
+
cssPropertyMap[key as keyof BoxProps['focus' | 'hover']]
|
|
377
|
+
.classPrefix
|
|
378
|
+
}`,
|
|
379
|
+
value
|
|
380
|
+
) // eslint-disable-line max-len
|
|
381
|
+
)
|
|
382
|
+
: undefined;
|
|
383
|
+
|
|
384
|
+
const hoverClasses = getStatefulClasses('hover', hover);
|
|
385
|
+
const focusClasses = getStatefulClasses('focus', focus);
|
|
386
|
+
|
|
387
|
+
const boxClasses = classNames(
|
|
388
|
+
className,
|
|
389
|
+
cssShorthandToClasses('m', margin),
|
|
390
|
+
cssShorthandToClasses('p', padding),
|
|
391
|
+
cssShorthandToClasses('br', radius),
|
|
392
|
+
cssShorthandToClasses('g', gap),
|
|
393
|
+
cssShorthandToClasses('cg', columnGap),
|
|
394
|
+
cssShorthandToClasses('rg', rowGap),
|
|
395
|
+
heightCss.classes,
|
|
396
|
+
maxHeightCss.classes,
|
|
397
|
+
minHeightCss.classes,
|
|
398
|
+
maxWidthCss.classes,
|
|
399
|
+
minWidthCss.classes,
|
|
400
|
+
widthCss.classes,
|
|
401
|
+
flexDirectionClasses,
|
|
402
|
+
generateResponsiveClasses('display', display),
|
|
403
|
+
generateResponsiveClasses('justify-content', justifyContent),
|
|
404
|
+
generateResponsiveClasses('align-items', alignItems),
|
|
405
|
+
generateResponsiveClasses('align-content', alignContent),
|
|
406
|
+
generateResponsiveClasses('align-self', alignSelf),
|
|
407
|
+
generateResponsiveClasses('font-family', fontFamily),
|
|
408
|
+
generateResponsiveClasses('font-size', fontSize),
|
|
409
|
+
generateResponsiveClasses('overflow', overflow),
|
|
410
|
+
generateResponsiveClasses('shadow', shadow),
|
|
411
|
+
generateResponsiveClasses('flex', flex),
|
|
412
|
+
cssShorthandToClasses('bw', borderWidth),
|
|
413
|
+
generateResponsiveClasses('font-weight', fontWeight),
|
|
414
|
+
generateResponsiveClasses('text-align', textAlign),
|
|
415
|
+
generateResponsiveClasses('position', position),
|
|
416
|
+
generateResponsiveClasses('z-index', zIndex),
|
|
417
|
+
...(hoverClasses ?? []),
|
|
418
|
+
...(focusClasses ?? []),
|
|
419
|
+
{
|
|
420
|
+
'flex-wrap': isFlexBox && wrap,
|
|
421
|
+
'flex-nowrap': isFlexBox && wrap === false,
|
|
422
|
+
[`background-color-${background}`]: background,
|
|
423
|
+
[`font-color-${color}`]: color,
|
|
424
|
+
[`border-color-${borderColor}`]: borderColor,
|
|
425
|
+
[`cursor-${cursor}`]: cursor,
|
|
426
|
+
[styles['box-transition']]: hover || focus,
|
|
427
|
+
}
|
|
428
|
+
);
|
|
429
|
+
|
|
430
|
+
const boxStyles = {
|
|
431
|
+
...style,
|
|
432
|
+
...heightCss.styles,
|
|
433
|
+
...maxHeightCss.styles,
|
|
434
|
+
...maxWidthCss.styles,
|
|
435
|
+
...widthCss.styles,
|
|
436
|
+
...minHeightCss.styles,
|
|
437
|
+
...minWidthCss.styles,
|
|
438
|
+
};
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Creates an object that maps the flex direction to either `right` or `bottom`
|
|
442
|
+
* so a margin can be applied to that side.
|
|
443
|
+
*/
|
|
444
|
+
const generateChildGapDirection = (): ResponsiveProp<string> => {
|
|
445
|
+
let childGapDirection = {};
|
|
446
|
+
|
|
447
|
+
const getChildGapMarginDirection = (d: CssFlexDirectionValue) => {
|
|
448
|
+
let marginDirection = '';
|
|
449
|
+
if (d?.includes('row')) marginDirection = 'right';
|
|
450
|
+
else if (d?.includes('column')) marginDirection = 'bottom';
|
|
451
|
+
|
|
452
|
+
return marginDirection;
|
|
453
|
+
};
|
|
454
|
+
|
|
455
|
+
if (typeof direction === 'string') {
|
|
456
|
+
childGapDirection = { base: getChildGapMarginDirection(direction) };
|
|
457
|
+
} else if (typeof direction === 'object' && direction !== null) {
|
|
458
|
+
childGapDirection = Object.keys(direction).reduce(
|
|
459
|
+
(acc, curr) => ({
|
|
460
|
+
...acc,
|
|
461
|
+
[curr]: getChildGapMarginDirection(
|
|
462
|
+
direction[curr as BreakpointSizeWithBase]
|
|
463
|
+
),
|
|
464
|
+
}),
|
|
465
|
+
{}
|
|
466
|
+
);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
return childGapDirection;
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Shapes the childGap prop into a ResponsiveSpacing object
|
|
474
|
+
* so that we can cross-reference values between direction and childGap values to generate
|
|
475
|
+
* responsive classes.
|
|
476
|
+
*/
|
|
477
|
+
const generateChildGap = (): ResponsiveProp<SpacingSize> => {
|
|
478
|
+
let childGapObj = {};
|
|
479
|
+
|
|
480
|
+
if (typeof childGap === 'string') {
|
|
481
|
+
childGapObj = { base: childGap };
|
|
482
|
+
} else if (typeof childGap === 'object' && childGap !== null) {
|
|
483
|
+
childGapObj = { ...childGap };
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
return childGapObj;
|
|
487
|
+
};
|
|
488
|
+
|
|
489
|
+
const childGapClasses: string[] = [];
|
|
490
|
+
|
|
491
|
+
if (childGap && direction) {
|
|
492
|
+
const childGapDirection = generateChildGapDirection();
|
|
493
|
+
const childGapValues = generateChildGap();
|
|
494
|
+
const breakpoints: BreakpointSizeWithBase[] = [
|
|
495
|
+
'hd',
|
|
496
|
+
'desktop',
|
|
497
|
+
'tablet',
|
|
498
|
+
'base',
|
|
499
|
+
];
|
|
500
|
+
|
|
501
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
502
|
+
const findMatchingBreakpoint = (
|
|
503
|
+
responsiveObj: ResponsiveProp<any>,
|
|
504
|
+
key: BreakpointSizeWithBase
|
|
505
|
+
): string => {
|
|
506
|
+
const index = breakpoints.findIndex((breakpoint) => breakpoint === key);
|
|
507
|
+
let value = '';
|
|
508
|
+
|
|
509
|
+
value = responsiveObj[key];
|
|
510
|
+
|
|
511
|
+
if (!value)
|
|
512
|
+
return findMatchingBreakpoint(responsiveObj, breakpoints[index + 1]);
|
|
513
|
+
|
|
514
|
+
return value;
|
|
515
|
+
};
|
|
516
|
+
|
|
517
|
+
breakpoints.forEach((breakpoint) => {
|
|
518
|
+
const foundDirection = findMatchingBreakpoint(
|
|
519
|
+
childGapDirection,
|
|
520
|
+
breakpoint as BreakpointSizeWithBase
|
|
521
|
+
);
|
|
522
|
+
const foundChildGap = findMatchingBreakpoint(
|
|
523
|
+
childGapValues,
|
|
524
|
+
breakpoint as BreakpointSizeWithBase
|
|
525
|
+
);
|
|
526
|
+
|
|
527
|
+
const classSuffix = breakpoint === 'base' ? '' : `-${breakpoint}`;
|
|
528
|
+
const oppositeDirection =
|
|
529
|
+
foundDirection === 'bottom' ? 'right' : 'bottom';
|
|
530
|
+
|
|
531
|
+
childGapClasses.push(
|
|
532
|
+
`m-${foundDirection}-${foundChildGap}${classSuffix}`
|
|
533
|
+
);
|
|
534
|
+
childGapClasses.push(`m-${oppositeDirection}-0${classSuffix}`);
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Shallow merges existing classes of child node with a className based on the childGap value.
|
|
540
|
+
*/
|
|
541
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
542
|
+
const decorateChildren = (
|
|
543
|
+
child: string | number | ReactElement<any>,
|
|
544
|
+
i: number,
|
|
545
|
+
array: ReactElement<any>[]
|
|
546
|
+
) => {
|
|
547
|
+
if (
|
|
548
|
+
i === array.length - 1 ||
|
|
549
|
+
!child ||
|
|
550
|
+
typeof child === 'string' ||
|
|
551
|
+
typeof child === 'number'
|
|
552
|
+
) {
|
|
553
|
+
return child; // Not gap if child is last element or if the children are strings or numbers.
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
const childClasses = classNames(child.props.className, [
|
|
557
|
+
...new Set(childGapClasses),
|
|
558
|
+
]);
|
|
559
|
+
|
|
560
|
+
return cloneElement(child, {
|
|
561
|
+
className: childClasses,
|
|
562
|
+
key: child.key ?? i,
|
|
563
|
+
});
|
|
564
|
+
};
|
|
565
|
+
|
|
566
|
+
let decoratedChildren = Children.toArray(children).filter(
|
|
567
|
+
(child) => child !== null
|
|
568
|
+
);
|
|
569
|
+
|
|
570
|
+
if (childGapClasses && decoratedChildren.length > 1) {
|
|
571
|
+
decoratedChildren = decoratedChildren.map((value, index, array) =>
|
|
572
|
+
decorateChildren(
|
|
573
|
+
value as string | number | ReactElement<any>, // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
574
|
+
index,
|
|
575
|
+
array as ReactElement<any>[] // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
576
|
+
)
|
|
577
|
+
);
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
const element = getElementType(Box, { as });
|
|
581
|
+
|
|
582
|
+
return createElement(
|
|
583
|
+
element,
|
|
584
|
+
{
|
|
585
|
+
className: boxClasses,
|
|
586
|
+
style: boxStyles,
|
|
587
|
+
ref,
|
|
588
|
+
...restProps,
|
|
589
|
+
},
|
|
590
|
+
children !== null && children !== undefined ? decoratedChildren : null
|
|
591
|
+
);
|
|
592
|
+
}
|
|
593
|
+
);
|
|
594
|
+
|
|
595
|
+
export const boxPropsKeys: (keyof Pick<BoxProps, KnownKeys<BoxProps>>)[] = [
|
|
596
|
+
'as',
|
|
597
|
+
'alignItems',
|
|
598
|
+
'alignContent',
|
|
599
|
+
'alignSelf',
|
|
600
|
+
'background',
|
|
601
|
+
'borderColor',
|
|
602
|
+
'borderWidth',
|
|
603
|
+
'className',
|
|
604
|
+
'childGap',
|
|
605
|
+
'children',
|
|
606
|
+
'color',
|
|
607
|
+
'columnGap',
|
|
608
|
+
'cursor',
|
|
609
|
+
'direction',
|
|
610
|
+
'display',
|
|
611
|
+
'flex',
|
|
612
|
+
'focus',
|
|
613
|
+
'fontFamily',
|
|
614
|
+
'fontSize',
|
|
615
|
+
'fontWeight',
|
|
616
|
+
'gap',
|
|
617
|
+
'height',
|
|
618
|
+
'hover',
|
|
619
|
+
'justifyContent',
|
|
620
|
+
'margin',
|
|
621
|
+
'maxHeight',
|
|
622
|
+
'minHeight',
|
|
623
|
+
'maxWidth',
|
|
624
|
+
'minWidth',
|
|
625
|
+
'overflow',
|
|
626
|
+
'padding',
|
|
627
|
+
'position',
|
|
628
|
+
'radius',
|
|
629
|
+
'rowGap',
|
|
630
|
+
'shadow',
|
|
631
|
+
'style',
|
|
632
|
+
'textAlign',
|
|
633
|
+
'wrap',
|
|
634
|
+
'width',
|
|
635
|
+
'zIndex',
|
|
636
|
+
];
|