@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,149 @@
|
|
|
1
|
+
import { cssShorthandToClasses } from './cssShorthandToClasses';
|
|
2
|
+
import { SPACING_OPTIONS } from './tokens';
|
|
3
|
+
|
|
4
|
+
describe('cssShorthandToClasses', () => {
|
|
5
|
+
describe('token values', () => {
|
|
6
|
+
SPACING_OPTIONS.map((token) =>
|
|
7
|
+
test(`returns expected css object if token ${token} is passed`, () => {
|
|
8
|
+
const spacingClasses = cssShorthandToClasses('p', token);
|
|
9
|
+
|
|
10
|
+
expect(spacingClasses).toEqual([`p-${token}`]);
|
|
11
|
+
})
|
|
12
|
+
);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
describe('2 values', () => {
|
|
16
|
+
test('returns expected css object if vertical and horizontal spacing values are passed', () => {
|
|
17
|
+
const spacingClasses = cssShorthandToClasses('p', 'xs sm');
|
|
18
|
+
|
|
19
|
+
expect(spacingClasses).toEqual(['p-v-xs', 'p-h-sm']);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('returns expected css object if vertical and horizontal are set to 0', () => {
|
|
23
|
+
const spacingClasses = cssShorthandToClasses('p', '0 0');
|
|
24
|
+
|
|
25
|
+
expect(spacingClasses).toEqual(['p-v-0', 'p-h-0']);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('returns expected css object if gap is set to sm lg', () => {
|
|
29
|
+
const classes = cssShorthandToClasses('g', 'sm lg');
|
|
30
|
+
|
|
31
|
+
expect(classes).toEqual(['rg-sm', 'cg-lg']);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('returns expected css object if border radius are set to sm lg', () => {
|
|
35
|
+
const classes = cssShorthandToClasses('br', 'sm lg');
|
|
36
|
+
|
|
37
|
+
expect(classes).toEqual([
|
|
38
|
+
'br-top-left-sm',
|
|
39
|
+
'br-bottom-right-sm',
|
|
40
|
+
'br-top-right-lg',
|
|
41
|
+
'br-bottom-left-lg',
|
|
42
|
+
]);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
describe('3 values', () => {
|
|
47
|
+
test('returns expected css object if top, horizontal and bottom spacing values are passed', () => {
|
|
48
|
+
const spacingClasses = cssShorthandToClasses('p', 'xs sm lg');
|
|
49
|
+
|
|
50
|
+
expect(spacingClasses).toEqual(['p-top-xs', 'p-h-sm', 'p-bottom-lg']);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('returns expected css object if top, horizontal and bottom spacing values are set to 0', () => {
|
|
54
|
+
const spacingClasses = cssShorthandToClasses('p', '0 0 0');
|
|
55
|
+
|
|
56
|
+
expect(spacingClasses).toEqual(['p-top-0', 'p-h-0', 'p-bottom-0']);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('returns expected css object if border radius are set to sm lg', () => {
|
|
60
|
+
const classes = cssShorthandToClasses('br', 'sm md lg');
|
|
61
|
+
|
|
62
|
+
expect(classes).toEqual([
|
|
63
|
+
'br-top-left-sm',
|
|
64
|
+
'br-top-right-md',
|
|
65
|
+
'br-bottom-left-md',
|
|
66
|
+
'br-bottom-right-lg',
|
|
67
|
+
]);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe('4 values', () => {
|
|
72
|
+
test('returns expected css object if top, right, bottom, left spacing values are passed', () => {
|
|
73
|
+
const spacingClasses = cssShorthandToClasses('p', 'xs sm lg md');
|
|
74
|
+
|
|
75
|
+
expect(spacingClasses).toEqual([
|
|
76
|
+
'p-top-xs',
|
|
77
|
+
'p-right-sm',
|
|
78
|
+
'p-bottom-lg',
|
|
79
|
+
'p-left-md',
|
|
80
|
+
]);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('returns expected css object if top, right, bottom, left spacing values are set to 0', () => {
|
|
84
|
+
const spacingClasses = cssShorthandToClasses('p', '0 0 0 0');
|
|
85
|
+
|
|
86
|
+
expect(spacingClasses).toEqual([
|
|
87
|
+
'p-top-0',
|
|
88
|
+
'p-right-0',
|
|
89
|
+
'p-bottom-0',
|
|
90
|
+
'p-left-0',
|
|
91
|
+
]);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
test('returns expected css object if border radius are set to xs sm md lg', () => {
|
|
95
|
+
const classes = cssShorthandToClasses('br', 'xs sm md lg');
|
|
96
|
+
|
|
97
|
+
expect(classes).toEqual([
|
|
98
|
+
'br-top-left-xs',
|
|
99
|
+
'br-top-right-sm',
|
|
100
|
+
'br-bottom-right-md',
|
|
101
|
+
'br-bottom-left-lg',
|
|
102
|
+
]);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
describe('Responsive Classes', () => {
|
|
107
|
+
test('returns expected css object if an object is passed with spacing for particular breakpoints', () => {
|
|
108
|
+
const spacingClasses = cssShorthandToClasses('p', {
|
|
109
|
+
base: 'md lg',
|
|
110
|
+
tablet: 'sm md lg xl',
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
expect(spacingClasses).toEqual([
|
|
114
|
+
'p-v-md',
|
|
115
|
+
'p-h-lg',
|
|
116
|
+
'p-top-sm-tablet',
|
|
117
|
+
'p-right-md-tablet',
|
|
118
|
+
'p-bottom-lg-tablet',
|
|
119
|
+
'p-left-xl-tablet',
|
|
120
|
+
]);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test('returns expected css object if an object is passed with spacing 0 for particular breakpoints', () => {
|
|
124
|
+
const spacingClasses = cssShorthandToClasses('p', {
|
|
125
|
+
base: '3xl 0',
|
|
126
|
+
desktop: '0 3xl',
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
expect(spacingClasses).toEqual([
|
|
130
|
+
'p-v-3xl',
|
|
131
|
+
'p-h-0',
|
|
132
|
+
'p-v-0-desktop',
|
|
133
|
+
'p-h-3xl-desktop',
|
|
134
|
+
]);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
test('returns expected classes if inherit is passed', () => {
|
|
139
|
+
const spacingClasses = cssShorthandToClasses('p', 'inherit');
|
|
140
|
+
|
|
141
|
+
expect(spacingClasses).toEqual(['p-inherit']);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test('returns expected classes if margin is inherit is passed', () => {
|
|
145
|
+
const spacingClasses = cssShorthandToClasses('m', 'inherit');
|
|
146
|
+
|
|
147
|
+
expect(spacingClasses).toEqual(['m-inherit']);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { ResponsiveProp, BreakpointSizeWithBase } from '../types';
|
|
2
|
+
|
|
3
|
+
export function isValidSpacingValue(
|
|
4
|
+
value?: string | ResponsiveProp<string | undefined>
|
|
5
|
+
): boolean {
|
|
6
|
+
if (
|
|
7
|
+
value === undefined ||
|
|
8
|
+
value === null ||
|
|
9
|
+
(typeof value !== 'string' && typeof value !== 'object')
|
|
10
|
+
) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function generateBaseClasses(
|
|
18
|
+
attribute: string | undefined,
|
|
19
|
+
value?: string | ResponsiveProp<string | undefined>
|
|
20
|
+
): string[] {
|
|
21
|
+
if (typeof value !== 'string') return [];
|
|
22
|
+
|
|
23
|
+
const trimmedValue = value.trim();
|
|
24
|
+
|
|
25
|
+
if (trimmedValue !== value) {
|
|
26
|
+
// eslint-disable-next-line no-console
|
|
27
|
+
console.warn(`
|
|
28
|
+
Hyphen Components: It seems you've passed an incorrect
|
|
29
|
+
shorthand value as a prop in your component. The value
|
|
30
|
+
has extra whitespace either at the beginning or the end of it.
|
|
31
|
+
We have trimmed this whitespace, but please double-check that
|
|
32
|
+
the prop value is correct.
|
|
33
|
+
attribute: "${attribute}"
|
|
34
|
+
value: "${value}"
|
|
35
|
+
`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const classes: string[] = [];
|
|
39
|
+
let shorthand: { [key: number]: string[] };
|
|
40
|
+
|
|
41
|
+
if (attribute === 'br') {
|
|
42
|
+
shorthand = {
|
|
43
|
+
/* top-left-and-bottom-right | top-right-and-bottom-left */
|
|
44
|
+
2: ['top-left', 'top-right'],
|
|
45
|
+
/* top-left | top-right-and-bottom-left | bottom-right */
|
|
46
|
+
3: ['top-left', 'top-right', 'bottom-right'],
|
|
47
|
+
4: ['top-left', 'top-right', 'bottom-right', 'bottom-left'],
|
|
48
|
+
};
|
|
49
|
+
} else if (attribute === 'g') {
|
|
50
|
+
shorthand = { 2: ['rg', 'cg'] };
|
|
51
|
+
} else {
|
|
52
|
+
shorthand = {
|
|
53
|
+
2: ['v', 'h'],
|
|
54
|
+
3: ['top', 'h', 'bottom'],
|
|
55
|
+
4: ['top', 'right', 'bottom', 'left'],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (trimmedValue.includes(' ') && trimmedValue.split(' ').length > 1) {
|
|
60
|
+
const sides = trimmedValue.split(' ');
|
|
61
|
+
|
|
62
|
+
if (sides.length > 4) {
|
|
63
|
+
// eslint-disable-next-line no-console
|
|
64
|
+
console.warn(`
|
|
65
|
+
Hyphen Components: It seems you've passed an incorrect
|
|
66
|
+
shorthand value as a prop in your component. The value
|
|
67
|
+
has more than four string components. While it will not break anything,
|
|
68
|
+
please double-check your prop values to ensure the expected result is correct.
|
|
69
|
+
attribute: "${attribute}"
|
|
70
|
+
value: "${value}"
|
|
71
|
+
`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const trimmedSides = sides.slice(0, 4);
|
|
75
|
+
|
|
76
|
+
// br = border radius -- the corner logic is different than sides.
|
|
77
|
+
if (attribute === 'br') {
|
|
78
|
+
trimmedSides.forEach((v, index) => {
|
|
79
|
+
classes.push(
|
|
80
|
+
`${attribute}-${shorthand[trimmedSides.length][index]}-${v}`
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
if (trimmedSides.length === 3 && index === 1) {
|
|
84
|
+
classes.push(`${attribute}-bottom-left-${trimmedSides[index]}`);
|
|
85
|
+
} else if (trimmedSides.length === 2 && index === 0) {
|
|
86
|
+
classes.push(`${attribute}-bottom-right-${trimmedSides[index]}`);
|
|
87
|
+
} else if (trimmedSides.length === 2 && index === 1) {
|
|
88
|
+
classes.push(`${attribute}-bottom-left-${trimmedSides[index]}`);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
} else if (attribute === 'g') {
|
|
92
|
+
trimmedSides.forEach((v, index) => {
|
|
93
|
+
classes.push(`${shorthand[trimmedSides.length][index]}-${v}`);
|
|
94
|
+
});
|
|
95
|
+
} else {
|
|
96
|
+
trimmedSides.forEach((v, index) => {
|
|
97
|
+
classes.push(
|
|
98
|
+
`${attribute}-${shorthand[trimmedSides.length][index]}-${v}`
|
|
99
|
+
);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
classes.push(`${attribute}-${trimmedValue}`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return classes;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function cssShorthandToClasses(
|
|
110
|
+
attribute: string,
|
|
111
|
+
value?: string | ResponsiveProp<string | undefined>
|
|
112
|
+
): string[] {
|
|
113
|
+
if (!isValidSpacingValue(value)) return [];
|
|
114
|
+
|
|
115
|
+
const classes: string[] = [];
|
|
116
|
+
|
|
117
|
+
if (typeof value === 'object') {
|
|
118
|
+
Object.keys(value).forEach((key) => {
|
|
119
|
+
const baseClasses = generateBaseClasses(
|
|
120
|
+
attribute,
|
|
121
|
+
value[key as BreakpointSizeWithBase]
|
|
122
|
+
);
|
|
123
|
+
const responsiveClasses = baseClasses?.map((baseClass) =>
|
|
124
|
+
key === 'base' ? baseClass : `${baseClass}-${key}`
|
|
125
|
+
);
|
|
126
|
+
classes.push(...responsiveClasses);
|
|
127
|
+
});
|
|
128
|
+
} else if (typeof value === 'string') {
|
|
129
|
+
classes.push(...generateBaseClasses(attribute, value));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return classes;
|
|
133
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { generateResponsiveClasses } from './generateResponsiveClasses';
|
|
2
|
+
|
|
3
|
+
describe('generateResponsiveClasses', () => {
|
|
4
|
+
test('it generates a base class when passed a single string value', () => {
|
|
5
|
+
const generatedClass = generateResponsiveClasses(
|
|
6
|
+
'align-items',
|
|
7
|
+
'flex-start'
|
|
8
|
+
);
|
|
9
|
+
|
|
10
|
+
expect(generatedClass).toEqual(['align-items-flex-start']);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test('it generates responsive classes when an keyed object is passed', () => {
|
|
14
|
+
const generatedClass = generateResponsiveClasses('align-items', {
|
|
15
|
+
tablet: 'flex-start',
|
|
16
|
+
hd: 'flex-end',
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
expect(generatedClass).toEqual([
|
|
20
|
+
'align-items-flex-start-tablet',
|
|
21
|
+
'align-items-flex-end-hd',
|
|
22
|
+
]);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ResponsiveProp, BreakpointSizeWithBase } from '../types';
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line
|
|
4
|
+
export function generateResponsiveClasses(
|
|
5
|
+
classRoot: string,
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
7
|
+
value: ResponsiveProp<any> | string | undefined
|
|
8
|
+
): string[] {
|
|
9
|
+
if (
|
|
10
|
+
value === null ||
|
|
11
|
+
(typeof value !== 'string' && typeof value !== 'object')
|
|
12
|
+
)
|
|
13
|
+
return [];
|
|
14
|
+
|
|
15
|
+
const classes: string[] = [];
|
|
16
|
+
|
|
17
|
+
if (typeof value === 'object') {
|
|
18
|
+
Object.keys(value).forEach((key) => {
|
|
19
|
+
const baseClass = `${classRoot}-${value[key as BreakpointSizeWithBase]}`;
|
|
20
|
+
const responsiveClass =
|
|
21
|
+
key === 'base' ? baseClass : `${baseClass}-${key}`;
|
|
22
|
+
|
|
23
|
+
classes.push(responsiveClass);
|
|
24
|
+
});
|
|
25
|
+
} else if (typeof value === 'string') {
|
|
26
|
+
classes.push(`${classRoot}-${value}`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return classes;
|
|
30
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { getAutoCompleteValue } from './getAutoCompleteValue';
|
|
2
|
+
|
|
3
|
+
describe('getAutoCompleteValue', () => {
|
|
4
|
+
test('it returns expected value when passed on', () => {
|
|
5
|
+
const value = getAutoCompleteValue('on');
|
|
6
|
+
|
|
7
|
+
expect(value).toEqual('on');
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
test('it returns expected value when passed off', () => {
|
|
11
|
+
const value = getAutoCompleteValue('off');
|
|
12
|
+
|
|
13
|
+
expect(value).toEqual('off');
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test('it returns expected value when passed true', () => {
|
|
17
|
+
const value = getAutoCompleteValue(true);
|
|
18
|
+
|
|
19
|
+
expect(value).toEqual('on');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('it returns expected value when passed false', () => {
|
|
23
|
+
const value = getAutoCompleteValue(false);
|
|
24
|
+
|
|
25
|
+
expect(value).toEqual('off');
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
2
|
+
export function getAutoCompleteValue(value: string | boolean): string {
|
|
3
|
+
if (!value || (typeof value !== 'boolean' && typeof value !== 'string')) {
|
|
4
|
+
return 'off';
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
if (typeof value === 'boolean' && value) {
|
|
8
|
+
return 'on';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Key } from 'react';
|
|
2
|
+
import { Column } from '../types';
|
|
3
|
+
|
|
4
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
5
|
+
export const getColumnKeys = (columns: Column[]): Key[] => {
|
|
6
|
+
const INTERNAL_KEY_PREFIX = 'columnKeyPrefix';
|
|
7
|
+
const columnKeys: React.Key[] = [];
|
|
8
|
+
const keys: Record<any, boolean> = {};
|
|
9
|
+
|
|
10
|
+
columns.forEach((column) => {
|
|
11
|
+
const { key, dataKey } = column || {};
|
|
12
|
+
const shapedDataKey = dataKey?.includes(' ')
|
|
13
|
+
? dataKey.split(' ').join('-')
|
|
14
|
+
: dataKey;
|
|
15
|
+
|
|
16
|
+
let mergedKey = key || shapedDataKey || INTERNAL_KEY_PREFIX;
|
|
17
|
+
|
|
18
|
+
while (keys[mergedKey as any]) {
|
|
19
|
+
mergedKey = `${mergedKey}_next`;
|
|
20
|
+
}
|
|
21
|
+
keys[mergedKey as any] = true;
|
|
22
|
+
|
|
23
|
+
columnKeys.push(mergedKey);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
return columnKeys;
|
|
27
|
+
};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { getDimensionCss } from './getDimensionCss';
|
|
2
|
+
import { HEIGHT_OPTIONS, WIDTH_OPTIONS } from './tokens';
|
|
3
|
+
|
|
4
|
+
describe('getDimensionCss', () => {
|
|
5
|
+
test('returns expected css object if width css value is passed', () => {
|
|
6
|
+
const spacingCss = getDimensionCss('w', '20px');
|
|
7
|
+
|
|
8
|
+
expect(spacingCss).toEqual({
|
|
9
|
+
classes: [],
|
|
10
|
+
styles: {
|
|
11
|
+
width: '20px',
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test('returns expected css object if height css value is passed', () => {
|
|
17
|
+
const spacingCss = getDimensionCss('h', '42rem');
|
|
18
|
+
|
|
19
|
+
expect(spacingCss).toEqual({
|
|
20
|
+
classes: [],
|
|
21
|
+
styles: {
|
|
22
|
+
height: '42rem',
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('returns expected css object if max width css value is passed', () => {
|
|
28
|
+
const spacingCss = getDimensionCss('mw', '20px');
|
|
29
|
+
|
|
30
|
+
expect(spacingCss).toEqual({
|
|
31
|
+
classes: [],
|
|
32
|
+
styles: {
|
|
33
|
+
maxWidth: '20px',
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('returns expected css object if min width css value is passed', () => {
|
|
39
|
+
const spacingCss = getDimensionCss('minw', '20px');
|
|
40
|
+
|
|
41
|
+
expect(spacingCss).toEqual({
|
|
42
|
+
classes: [],
|
|
43
|
+
styles: {
|
|
44
|
+
minWidth: '20px',
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('returns expected css object if max height css value is passed', () => {
|
|
50
|
+
const spacingCss = getDimensionCss('mh', '42rem');
|
|
51
|
+
|
|
52
|
+
expect(spacingCss).toEqual({
|
|
53
|
+
classes: [],
|
|
54
|
+
styles: {
|
|
55
|
+
maxHeight: '42rem',
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test('returns expected css object if min height css value is passed', () => {
|
|
61
|
+
const spacingCss = getDimensionCss('minh', '42rem');
|
|
62
|
+
|
|
63
|
+
expect(spacingCss).toEqual({
|
|
64
|
+
classes: [],
|
|
65
|
+
styles: {
|
|
66
|
+
minHeight: '42rem',
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe('width', () => {
|
|
72
|
+
WIDTH_OPTIONS.map((token) =>
|
|
73
|
+
test(`returns expected css object if ${token} width value is passed`, () => {
|
|
74
|
+
const spacingCss = getDimensionCss('w', token);
|
|
75
|
+
|
|
76
|
+
expect(spacingCss).toEqual({
|
|
77
|
+
classes: [`w-${token}`],
|
|
78
|
+
styles: undefined,
|
|
79
|
+
});
|
|
80
|
+
})
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
describe('height', () => {
|
|
85
|
+
HEIGHT_OPTIONS.map((token) =>
|
|
86
|
+
test(`returns expected css object if ${token} width value is passed`, () => {
|
|
87
|
+
const spacingCss = getDimensionCss('h', token);
|
|
88
|
+
|
|
89
|
+
expect(spacingCss).toEqual({
|
|
90
|
+
classes: [`h-${token}`],
|
|
91
|
+
styles: undefined,
|
|
92
|
+
});
|
|
93
|
+
})
|
|
94
|
+
);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
describe('max width', () => {
|
|
98
|
+
WIDTH_OPTIONS.map((token) =>
|
|
99
|
+
test(`returns expected css object if ${token} max width value is passed`, () => {
|
|
100
|
+
const spacingCss = getDimensionCss('mw', token);
|
|
101
|
+
|
|
102
|
+
expect(spacingCss).toEqual({
|
|
103
|
+
classes: [`mw-${token}`],
|
|
104
|
+
styles: undefined,
|
|
105
|
+
});
|
|
106
|
+
})
|
|
107
|
+
);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe('min width', () => {
|
|
111
|
+
WIDTH_OPTIONS.map((token) =>
|
|
112
|
+
test(`returns expected css object if ${token} min width value is passed`, () => {
|
|
113
|
+
const spacingCss = getDimensionCss('minw', token);
|
|
114
|
+
|
|
115
|
+
expect(spacingCss).toEqual({
|
|
116
|
+
classes: [`minw-${token}`],
|
|
117
|
+
styles: undefined,
|
|
118
|
+
});
|
|
119
|
+
})
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe('max height', () => {
|
|
124
|
+
HEIGHT_OPTIONS.map((token) =>
|
|
125
|
+
test(`returns expected css object if ${token} max height value is passed`, () => {
|
|
126
|
+
const spacingCss = getDimensionCss('mh', token);
|
|
127
|
+
|
|
128
|
+
expect(spacingCss).toEqual({
|
|
129
|
+
classes: [`mh-${token}`],
|
|
130
|
+
styles: undefined,
|
|
131
|
+
});
|
|
132
|
+
})
|
|
133
|
+
);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
describe('min height', () => {
|
|
137
|
+
HEIGHT_OPTIONS.map((token) =>
|
|
138
|
+
test(`returns expected css object if ${token} min height value is passed`, () => {
|
|
139
|
+
const spacingCss = getDimensionCss('minh', token);
|
|
140
|
+
|
|
141
|
+
expect(spacingCss).toEqual({
|
|
142
|
+
classes: [`minh-${token}`],
|
|
143
|
+
styles: undefined,
|
|
144
|
+
});
|
|
145
|
+
})
|
|
146
|
+
);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { CSSProperties } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
StylesAndClasses,
|
|
4
|
+
CssDimensionAbbreviation,
|
|
5
|
+
ResponsiveProp,
|
|
6
|
+
DimensionSize,
|
|
7
|
+
} from '../types';
|
|
8
|
+
import { doesStringIncludeCssUnit } from './doesStringIncludeCssUnit';
|
|
9
|
+
import { generateResponsiveClasses } from './generateResponsiveClasses';
|
|
10
|
+
|
|
11
|
+
export function getDimensionStyles(
|
|
12
|
+
dimension: CssDimensionAbbreviation,
|
|
13
|
+
value?: DimensionSize | ResponsiveProp<DimensionSize> | string
|
|
14
|
+
): { [key: string]: string } | undefined {
|
|
15
|
+
if (value === undefined) return value;
|
|
16
|
+
|
|
17
|
+
let styles;
|
|
18
|
+
// value is a css unit so set its style property
|
|
19
|
+
if (typeof value === 'string' && doesStringIncludeCssUnit(value)) {
|
|
20
|
+
switch (dimension) {
|
|
21
|
+
case 'h':
|
|
22
|
+
styles = { height: value };
|
|
23
|
+
break;
|
|
24
|
+
case 'mw':
|
|
25
|
+
styles = { maxWidth: value };
|
|
26
|
+
break;
|
|
27
|
+
case 'mh':
|
|
28
|
+
styles = { maxHeight: value };
|
|
29
|
+
break;
|
|
30
|
+
case 'minw':
|
|
31
|
+
styles = { minWidth: value };
|
|
32
|
+
break;
|
|
33
|
+
case 'minh':
|
|
34
|
+
styles = { minHeight: value };
|
|
35
|
+
break;
|
|
36
|
+
default:
|
|
37
|
+
styles = { width: value };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return styles;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function getDimensionClasses(
|
|
44
|
+
dimension: CssDimensionAbbreviation,
|
|
45
|
+
value?: DimensionSize | ResponsiveProp<DimensionSize> | string
|
|
46
|
+
): string[] | undefined {
|
|
47
|
+
if (value === undefined) return value;
|
|
48
|
+
|
|
49
|
+
const classes = [];
|
|
50
|
+
if (
|
|
51
|
+
(typeof value === 'string' && !doesStringIncludeCssUnit(value)) ||
|
|
52
|
+
(typeof value === 'object' &&
|
|
53
|
+
Object.values(value).every((v) => !doesStringIncludeCssUnit(v)))
|
|
54
|
+
) {
|
|
55
|
+
classes.push(...generateResponsiveClasses(dimension, value));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return classes;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Returns an object of styles and class names that correspond with the given value
|
|
62
|
+
* @param {CssDimensionAbbreviation} dimension width or height
|
|
63
|
+
* @param {string} [value] value of the dimension
|
|
64
|
+
*/
|
|
65
|
+
export function getDimensionCss(
|
|
66
|
+
dimension: CssDimensionAbbreviation,
|
|
67
|
+
value?: DimensionSize | ResponsiveProp<DimensionSize> | string
|
|
68
|
+
): StylesAndClasses<CSSProperties> {
|
|
69
|
+
return {
|
|
70
|
+
styles: getDimensionStyles(dimension, value),
|
|
71
|
+
classes: getDimensionClasses(dimension, value),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { getElementType } from './getElementType';
|
|
2
|
+
|
|
3
|
+
const MockComponent = () =>
|
|
4
|
+
({
|
|
5
|
+
defaultProps: {
|
|
6
|
+
as: 'h4',
|
|
7
|
+
},
|
|
8
|
+
} as any);
|
|
9
|
+
|
|
10
|
+
const getDefault = () => 'p';
|
|
11
|
+
|
|
12
|
+
describe('Get Element Type', () => {
|
|
13
|
+
test('function returns element type if provided by props', () => {
|
|
14
|
+
const elementType = getElementType(MockComponent(), { as: 'h1' });
|
|
15
|
+
|
|
16
|
+
expect(elementType).toBe('h1');
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('function returns default element type if provided by defaultProps', () => {
|
|
20
|
+
const elementType = getElementType(MockComponent(), {});
|
|
21
|
+
|
|
22
|
+
expect(elementType).toBe('h4');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test('function returns default element based on getDefault function if provided', () => {
|
|
26
|
+
const elementType = getElementType(MockComponent(), {}, getDefault);
|
|
27
|
+
|
|
28
|
+
expect(elementType).toBe('p');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('function returns an anchor element if href is included in props', () => {
|
|
32
|
+
const elementType = getElementType(MockComponent(), { href: 'myurl' });
|
|
33
|
+
|
|
34
|
+
expect(elementType).toBe('a');
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('function returns a div if no defaultProps or props are provided', () => {
|
|
38
|
+
const elementType = getElementType({} as any, {}, () => '');
|
|
39
|
+
|
|
40
|
+
expect(elementType).toBe('div');
|
|
41
|
+
});
|
|
42
|
+
});
|