@recursica/adapter-mui-v7 1.0.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/.storybook/commonArgTypes.ts +148 -0
- package/ARCHITECTURE.md +18 -0
- package/CHANGELOG.md +582 -0
- package/LICENSE +21 -0
- package/OVERSTYLING.md +59 -0
- package/README.md +70 -0
- package/SETUP.md +92 -0
- package/USAGE.md +57 -0
- package/dist/adapter-mui-v7.cjs +292 -0
- package/dist/adapter-mui-v7.cjs.map +1 -0
- package/dist/adapter-mui-v7.css +1 -0
- package/dist/adapter-mui-v7.js +40757 -0
- package/dist/adapter-mui-v7.js.map +1 -0
- package/dist/index.d.ts +2350 -0
- package/dist/vite.svg +1 -0
- package/docs/PHILOSOPHY.md +39 -0
- package/llms.txt +76 -0
- package/package.json +151 -0
- package/recursica_brand.json +2677 -0
- package/recursica_tokens.json +799 -0
- package/recursica_ui-kit.json +14981 -0
- package/recursica_variables_scoped.css +30489 -0
- package/src/GlobalExemptions.modules.css +7 -0
- package/src/Introduction.stories.tsx +184 -0
- package/src/OverStyling.tsx +87 -0
- package/src/Version.tsx +37 -0
- package/src/components/Accordion/ACCORDION_IMPLEMENTATION_NOTES.md +107 -0
- package/src/components/Accordion/Accordion.module.css +362 -0
- package/src/components/Accordion/Accordion.stories.tsx +198 -0
- package/src/components/Accordion/Accordion.test.tsx +1 -0
- package/src/components/Accordion/Accordion.tsx +285 -0
- package/src/components/Accordion/USAGE.md +43 -0
- package/src/components/Accordion/index.ts +1 -0
- package/src/components/AssistiveElement/ASSISTIVEELEMENT_IMPLEMENTATION_NOTES.md +59 -0
- package/src/components/AssistiveElement/AssistiveElement.module.css +121 -0
- package/src/components/AssistiveElement/AssistiveElement.stories.tsx +68 -0
- package/src/components/AssistiveElement/AssistiveElement.test.tsx +1 -0
- package/src/components/AssistiveElement/AssistiveElement.tsx +94 -0
- package/src/components/AssistiveElement/USAGE.md +36 -0
- package/src/components/AssistiveElement/index.ts +1 -0
- package/src/components/AutoComplete/AutoComplete.module.css +456 -0
- package/src/components/AutoComplete/AutoComplete.stories.tsx +336 -0
- package/src/components/AutoComplete/AutoComplete.test.tsx +1 -0
- package/src/components/AutoComplete/AutoComplete.tsx +266 -0
- package/src/components/AutoComplete/IMPLEMENTATION_NOTES.md +37 -0
- package/src/components/AutoComplete/USAGE.md +68 -0
- package/src/components/AutoComplete/index.ts +1 -0
- package/src/components/Avatar/AVATAR_IMPLEMENTATION_NOTES.md +36 -0
- package/src/components/Avatar/Avatar.module.css +336 -0
- package/src/components/Avatar/Avatar.stories.tsx +92 -0
- package/src/components/Avatar/Avatar.test.tsx +1 -0
- package/src/components/Avatar/Avatar.tsx +88 -0
- package/src/components/Avatar/USAGE.md +38 -0
- package/src/components/Avatar/index.ts +1 -0
- package/src/components/Badge/Badge.module.css +115 -0
- package/src/components/Badge/Badge.stories.tsx +78 -0
- package/src/components/Badge/Badge.test.tsx +1 -0
- package/src/components/Badge/Badge.tsx +61 -0
- package/src/components/Badge/USAGE.md +40 -0
- package/src/components/Badge/index.ts +1 -0
- package/src/components/Breadcrumb/BREADCRUMB_IMPLEMENTATION_NOTES.md +51 -0
- package/src/components/Breadcrumb/Breadcrumb.module.css +51 -0
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +114 -0
- package/src/components/Breadcrumb/Breadcrumb.test.tsx +1 -0
- package/src/components/Breadcrumb/Breadcrumb.tsx +70 -0
- package/src/components/Breadcrumb/USAGE.md +42 -0
- package/src/components/Breadcrumb/index.ts +1 -0
- package/src/components/Button/BUTTON_IMPLEMENTATION_NOTES.md +123 -0
- package/src/components/Button/Button.module.css +413 -0
- package/src/components/Button/Button.stories.tsx +196 -0
- package/src/components/Button/Button.styleIsolation.dom.test.tsx +98 -0
- package/src/components/Button/Button.tsx +156 -0
- package/src/components/Button/USAGE.md +46 -0
- package/src/components/Button/index.ts +1 -0
- package/src/components/Card/CARD_IMPLEMENTATION_NOTES.md +15 -0
- package/src/components/Card/Card.module.css +155 -0
- package/src/components/Card/Card.stories.tsx +131 -0
- package/src/components/Card/Card.test.tsx +1 -0
- package/src/components/Card/Card.tsx +202 -0
- package/src/components/Card/USAGE.md +57 -0
- package/src/components/Card/index.ts +1 -0
- package/src/components/Checkbox/CHECKBOX_IMPLEMENTATION_NOTES.md +14 -0
- package/src/components/Checkbox/Checkbox.module.css +286 -0
- package/src/components/Checkbox/Checkbox.stories.tsx +97 -0
- package/src/components/Checkbox/Checkbox.test.tsx +1 -0
- package/src/components/Checkbox/Checkbox.tsx +259 -0
- package/src/components/Checkbox/CheckboxGroup.stories.tsx +139 -0
- package/src/components/Checkbox/CheckboxGroup.tsx +148 -0
- package/src/components/Checkbox/USAGE.md +36 -0
- package/src/components/Checkbox/index.ts +6 -0
- package/src/components/Chip/CHIP_IMPLEMENTATION_NOTES.md +102 -0
- package/src/components/Chip/Chip.module.css +283 -0
- package/src/components/Chip/Chip.stories.tsx +154 -0
- package/src/components/Chip/Chip.test.tsx +1 -0
- package/src/components/Chip/Chip.tsx +168 -0
- package/src/components/Chip/USAGE.md +55 -0
- package/src/components/Chip/index.ts +1 -0
- package/src/components/Container/Container.stories.tsx +118 -0
- package/src/components/Container/Container.test.tsx +1 -0
- package/src/components/Container/Container.tsx +51 -0
- package/src/components/Container/IMPLEMENTATION_NOTES.md +5 -0
- package/src/components/Container/USAGE.md +48 -0
- package/src/components/Container/index.ts +1 -0
- package/src/components/DatePicker/DATEPICKER_IMPLEMENTATION_NOTES.md +29 -0
- package/src/components/DatePicker/DatePicker.icons.tsx +35 -0
- package/src/components/DatePicker/DatePicker.module.css +464 -0
- package/src/components/DatePicker/DatePicker.stories.tsx +163 -0
- package/src/components/DatePicker/DatePicker.test.tsx +1 -0
- package/src/components/DatePicker/DatePicker.tsx +229 -0
- package/src/components/DatePicker/USAGE.md +49 -0
- package/src/components/DatePicker/index.ts +1 -0
- package/src/components/Dropdown/BareDropdown.tsx +168 -0
- package/src/components/Dropdown/DROPDOWN_IMPLEMENTATION_NOTES.md +45 -0
- package/src/components/Dropdown/Dropdown.icons.tsx +33 -0
- package/src/components/Dropdown/Dropdown.module.css +535 -0
- package/src/components/Dropdown/Dropdown.stories.tsx +252 -0
- package/src/components/Dropdown/Dropdown.test.tsx +1 -0
- package/src/components/Dropdown/Dropdown.tsx +319 -0
- package/src/components/Dropdown/USAGE.md +68 -0
- package/src/components/Dropdown/index.ts +1 -0
- package/src/components/FileInput/FILEINPUT_IMPLEMENTATION_NOTES.md +153 -0
- package/src/components/FileInput/FileInput.module.css +268 -0
- package/src/components/FileInput/FileInput.stories.tsx +313 -0
- package/src/components/FileInput/FileInput.test.tsx +1 -0
- package/src/components/FileInput/FileInput.tsx +415 -0
- package/src/components/FileInput/USAGE.md +145 -0
- package/src/components/FileInput/index.ts +1 -0
- package/src/components/FileUpload/FILEUPLOAD_IMPLEMENTATION_NOTES.md +249 -0
- package/src/components/FileUpload/FileUpload.module.css +200 -0
- package/src/components/FileUpload/FileUpload.stories.tsx +362 -0
- package/src/components/FileUpload/FileUpload.test.tsx +1 -0
- package/src/components/FileUpload/FileUpload.tsx +352 -0
- package/src/components/FileUpload/USAGE.md +199 -0
- package/src/components/FileUpload/index.ts +1 -0
- package/src/components/Flex/Flex.stories.tsx +128 -0
- package/src/components/Flex/Flex.test.tsx +1 -0
- package/src/components/Flex/Flex.tsx +89 -0
- package/src/components/Flex/USAGE.md +41 -0
- package/src/components/Flex/index.ts +1 -0
- package/src/components/FormControlLayout/FormControlLayout.module.css +92 -0
- package/src/components/FormControlLayout/FormControlLayout.stories.tsx +118 -0
- package/src/components/FormControlLayout/FormControlLayout.test.tsx +1 -0
- package/src/components/FormControlLayout/FormControlLayout.tsx +72 -0
- package/src/components/FormControlLayout/USAGE.md +40 -0
- package/src/components/FormControlLayout/index.ts +1 -0
- package/src/components/FormControlWrapper/FORMCONTROLWRAPPER_IMPLEMENTATION_NOTES.md +35 -0
- package/src/components/FormControlWrapper/FormControlWrapper.module.css +87 -0
- package/src/components/FormControlWrapper/FormControlWrapper.stories.tsx +129 -0
- package/src/components/FormControlWrapper/FormControlWrapper.test.tsx +1 -0
- package/src/components/FormControlWrapper/FormControlWrapper.tsx +149 -0
- package/src/components/FormControlWrapper/USAGE.md +40 -0
- package/src/components/FormControlWrapper/index.ts +1 -0
- package/src/components/Grid/Grid.module.css +72 -0
- package/src/components/Grid/Grid.stories.tsx +161 -0
- package/src/components/Grid/Grid.test.tsx +1 -0
- package/src/components/Grid/Grid.tsx +155 -0
- package/src/components/Grid/IMPLEMENTATION_NOTES.md +24 -0
- package/src/components/Grid/USAGE.md +53 -0
- package/src/components/Grid/index.ts +1 -0
- package/src/components/Group/Group.stories.tsx +120 -0
- package/src/components/Group/Group.test.tsx +1 -0
- package/src/components/Group/Group.tsx +116 -0
- package/src/components/Group/USAGE.md +41 -0
- package/src/components/Group/index.ts +1 -0
- package/src/components/Heading/Heading.stories.tsx +50 -0
- package/src/components/Heading/Heading.test.tsx +1 -0
- package/src/components/Heading/Heading.tsx +28 -0
- package/src/components/Heading/USAGE.md +36 -0
- package/src/components/Heading/index.ts +1 -0
- package/src/components/HoverCard/HoverCard.module.css +107 -0
- package/src/components/HoverCard/HoverCard.stories.tsx +172 -0
- package/src/components/HoverCard/HoverCard.test.tsx +1 -0
- package/src/components/HoverCard/HoverCard.tsx +145 -0
- package/src/components/HoverCard/USAGE.md +45 -0
- package/src/components/HoverCard/index.ts +1 -0
- package/src/components/Label/LABEL_IMPLEMENTATION_NOTES.md +27 -0
- package/src/components/Label/Label.module.css +169 -0
- package/src/components/Label/Label.stories.tsx +131 -0
- package/src/components/Label/Label.test.tsx +1 -0
- package/src/components/Label/Label.tsx +96 -0
- package/src/components/Label/USAGE.md +36 -0
- package/src/components/Label/index.ts +1 -0
- package/src/components/Layer/USAGE.md +50 -0
- package/src/components/Link/LINK_IMPLEMENTATION_NOTES.md +9 -0
- package/src/components/Link/Link.module.css +105 -0
- package/src/components/Link/Link.stories.tsx +58 -0
- package/src/components/Link/Link.test.tsx +1 -0
- package/src/components/Link/Link.tsx +45 -0
- package/src/components/Link/USAGE.md +40 -0
- package/src/components/Link/index.ts +1 -0
- package/src/components/Loader/LOADER_IMPLEMENTATION_NOTES.md +25 -0
- package/src/components/Loader/Loader.animate.dom.test.tsx +72 -0
- package/src/components/Loader/Loader.module.css +175 -0
- package/src/components/Loader/Loader.stories.tsx +123 -0
- package/src/components/Loader/Loader.test.tsx +1 -0
- package/src/components/Loader/Loader.tsx +72 -0
- package/src/components/Loader/USAGE.md +42 -0
- package/src/components/Loader/index.ts +1 -0
- package/src/components/Menu/IMPLEMENTATION_NOTES.md +5 -0
- package/src/components/Menu/Menu.module.css +283 -0
- package/src/components/Menu/Menu.stories.tsx +405 -0
- package/src/components/Menu/Menu.test.tsx +1 -0
- package/src/components/Menu/Menu.tsx +103 -0
- package/src/components/Menu/USAGE.md +53 -0
- package/src/components/Menu/index.ts +1 -0
- package/src/components/Modal/MODAL_IMPLEMENTATION_NOTES.md +31 -0
- package/src/components/Modal/Modal.module.css +302 -0
- package/src/components/Modal/Modal.stories.tsx +105 -0
- package/src/components/Modal/Modal.test.tsx +1 -0
- package/src/components/Modal/Modal.tsx +231 -0
- package/src/components/Modal/USAGE.md +40 -0
- package/src/components/Modal/index.ts +1 -0
- package/src/components/NumberInput/NUMBER_INPUT_IMPLEMENTATION_NOTES.md +93 -0
- package/src/components/NumberInput/NumberInput.module.css +303 -0
- package/src/components/NumberInput/NumberInput.stories.tsx +96 -0
- package/src/components/NumberInput/NumberInput.test.tsx +1 -0
- package/src/components/NumberInput/NumberInput.tsx +273 -0
- package/src/components/NumberInput/USAGE.md +36 -0
- package/src/components/NumberInput/index.ts +1 -0
- package/src/components/Pagination/IMPLEMENTATION_NOTES.md +40 -0
- package/src/components/Pagination/Pagination.icons.tsx +66 -0
- package/src/components/Pagination/Pagination.module.css +197 -0
- package/src/components/Pagination/Pagination.stories.tsx +48 -0
- package/src/components/Pagination/Pagination.test.tsx +1 -0
- package/src/components/Pagination/Pagination.tsx +123 -0
- package/src/components/Pagination/USAGE.md +36 -0
- package/src/components/Pagination/index.ts +1 -0
- package/src/components/Panel/PANEL_IMPLEMENTATION_NOTES.md +133 -0
- package/src/components/Panel/Panel.module.css +231 -0
- package/src/components/Panel/Panel.stories.tsx +227 -0
- package/src/components/Panel/Panel.test.tsx +1 -0
- package/src/components/Panel/Panel.tsx +186 -0
- package/src/components/Panel/USAGE.md +46 -0
- package/src/components/Panel/index.ts +1 -0
- package/src/components/Popover/IMPLEMENTATION_NOTES.md +22 -0
- package/src/components/Popover/Popover.module.css +118 -0
- package/src/components/Popover/Popover.stories.tsx +133 -0
- package/src/components/Popover/Popover.test.tsx +1 -0
- package/src/components/Popover/Popover.tsx +267 -0
- package/src/components/Popover/USAGE.md +69 -0
- package/src/components/Popover/index.ts +1 -0
- package/src/components/Radio/RADIO_IMPLEMENTATION_NOTES.md +12 -0
- package/src/components/Radio/Radio.module.css +247 -0
- package/src/components/Radio/Radio.stories.tsx +93 -0
- package/src/components/Radio/Radio.test.tsx +1 -0
- package/src/components/Radio/Radio.tsx +223 -0
- package/src/components/Radio/RadioGroup.stories.tsx +117 -0
- package/src/components/Radio/RadioGroup.tsx +122 -0
- package/src/components/Radio/USAGE.md +36 -0
- package/src/components/Radio/index.ts +2 -0
- package/src/components/ReadOnlyField/ReadOnlyBooleanField.tsx +21 -0
- package/src/components/ReadOnlyField/ReadOnlyField.module.css +54 -0
- package/src/components/ReadOnlyField/ReadOnlyField.stories.tsx +163 -0
- package/src/components/ReadOnlyField/ReadOnlyField.test.tsx +1 -0
- package/src/components/ReadOnlyField/ReadOnlyField.tsx +108 -0
- package/src/components/ReadOnlyField/ReadOnlySwitchField.tsx +21 -0
- package/src/components/ReadOnlyField/ReadOnlyTextField.tsx +48 -0
- package/src/components/ReadOnlyField/USAGE.md +36 -0
- package/src/components/ReadOnlyField/WithReadOnlyWrapper.tsx +93 -0
- package/src/components/ReadOnlyField/index.ts +2 -0
- package/src/components/RecursicaThemeProvider/USAGE.md +60 -0
- package/src/components/SegmentedControl/IMPLEMENTATION_NOTES.md +14 -0
- package/src/components/SegmentedControl/SegmentedControl.module.css +201 -0
- package/src/components/SegmentedControl/SegmentedControl.stories.tsx +106 -0
- package/src/components/SegmentedControl/SegmentedControl.test.tsx +1 -0
- package/src/components/SegmentedControl/SegmentedControl.tsx +149 -0
- package/src/components/SegmentedControl/USAGE.md +49 -0
- package/src/components/SegmentedControl/index.ts +1 -0
- package/src/components/Slider/IMPLEMENTATION_NOTES.md +55 -0
- package/src/components/Slider/Slider.module.css +635 -0
- package/src/components/Slider/Slider.stories.tsx +282 -0
- package/src/components/Slider/Slider.test.tsx +1 -0
- package/src/components/Slider/Slider.tsx +435 -0
- package/src/components/Slider/USAGE.md +56 -0
- package/src/components/Slider/index.ts +1 -0
- package/src/components/Stack/Stack.stories.tsx +108 -0
- package/src/components/Stack/Stack.test.tsx +1 -0
- package/src/components/Stack/Stack.tsx +43 -0
- package/src/components/Stack/USAGE.md +41 -0
- package/src/components/Stack/index.ts +1 -0
- package/src/components/Stepper/IMPLEMENTATION_NOTES.md +120 -0
- package/src/components/Stepper/Stepper.module.css +474 -0
- package/src/components/Stepper/Stepper.stories.tsx +157 -0
- package/src/components/Stepper/Stepper.test.tsx +1 -0
- package/src/components/Stepper/Stepper.tsx +240 -0
- package/src/components/Stepper/USAGE.md +45 -0
- package/src/components/Stepper/index.ts +1 -0
- package/src/components/Switch/SWITCH_IMPLEMENTATION_NOTES.md +147 -0
- package/src/components/Switch/Switch.module.css +346 -0
- package/src/components/Switch/Switch.stories.tsx +114 -0
- package/src/components/Switch/Switch.test.tsx +1 -0
- package/src/components/Switch/Switch.tsx +294 -0
- package/src/components/Switch/SwitchGroup.stories.tsx +132 -0
- package/src/components/Switch/SwitchGroup.tsx +156 -0
- package/src/components/Switch/USAGE.md +36 -0
- package/src/components/Switch/index.ts +2 -0
- package/src/components/Table/TABLE_IMPLEMENTATION_NOTES.md +75 -0
- package/src/components/Table/Table.module.css +462 -0
- package/src/components/Table/Table.stories.tsx +154 -0
- package/src/components/Table/Table.test.tsx +1 -0
- package/src/components/Table/Table.tsx +250 -0
- package/src/components/Table/USAGE.md +90 -0
- package/src/components/Table/index.ts +1 -0
- package/src/components/Tabs/IMPLEMENTATION_NOTES.md +76 -0
- package/src/components/Tabs/Tabs.module.css +801 -0
- package/src/components/Tabs/Tabs.stories.tsx +174 -0
- package/src/components/Tabs/Tabs.test.tsx +1 -0
- package/src/components/Tabs/Tabs.tsx +103 -0
- package/src/components/Tabs/USAGE.md +61 -0
- package/src/components/Tabs/index.ts +1 -0
- package/src/components/Text/TEXT_IMPLEMENTATION_NOTES.md +10 -0
- package/src/components/Text/Text.stories.tsx +75 -0
- package/src/components/Text/Text.test.tsx +1 -0
- package/src/components/Text/Text.tsx +19 -0
- package/src/components/Text/USAGE.md +40 -0
- package/src/components/Text/index.ts +1 -0
- package/src/components/TextArea/TEXTAREA_IMPLEMENTATION_NOTES.md +42 -0
- package/src/components/TextArea/TextArea.module.css +203 -0
- package/src/components/TextArea/TextArea.stories.tsx +94 -0
- package/src/components/TextArea/TextArea.test.tsx +1 -0
- package/src/components/TextArea/TextArea.tsx +162 -0
- package/src/components/TextArea/USAGE.md +38 -0
- package/src/components/TextArea/index.ts +1 -0
- package/src/components/TextField/TextField.module.css +271 -0
- package/src/components/TextField/TextField.stories.tsx +162 -0
- package/src/components/TextField/TextField.test.tsx +1 -0
- package/src/components/TextField/TextField.tsx +182 -0
- package/src/components/TextField/USAGE.md +38 -0
- package/src/components/TextField/index.ts +1 -0
- package/src/components/TimePicker/TIMEPICKER_IMPLEMENTATION_NOTES.md +89 -0
- package/src/components/TimePicker/TimePicker.module.css +262 -0
- package/src/components/TimePicker/TimePicker.stories.tsx +155 -0
- package/src/components/TimePicker/TimePicker.test.tsx +1 -0
- package/src/components/TimePicker/TimePicker.tsx +277 -0
- package/src/components/TimePicker/USAGE.md +61 -0
- package/src/components/TimePicker/index.ts +1 -0
- package/src/components/Timeline/IMPLEMENTATION_NOTES.md +42 -0
- package/src/components/Timeline/Timeline.module.css +363 -0
- package/src/components/Timeline/Timeline.stories.tsx +128 -0
- package/src/components/Timeline/Timeline.test.tsx +1 -0
- package/src/components/Timeline/Timeline.tsx +90 -0
- package/src/components/Timeline/TimelineItem.tsx +95 -0
- package/src/components/Timeline/USAGE.md +41 -0
- package/src/components/Timeline/index.ts +2 -0
- package/src/components/Toast/TOAST_IMPLEMENTATION_NOTES.md +37 -0
- package/src/components/Toast/Toast.module.css +193 -0
- package/src/components/Toast/Toast.stories.tsx +67 -0
- package/src/components/Toast/Toast.test.tsx +1 -0
- package/src/components/Toast/Toast.tsx +121 -0
- package/src/components/Toast/USAGE.md +42 -0
- package/src/components/Toast/index.ts +1 -0
- package/src/components/Tooltip/Tooltip.module.css +83 -0
- package/src/components/Tooltip/Tooltip.stories.tsx +165 -0
- package/src/components/Tooltip/Tooltip.test.tsx +1 -0
- package/src/components/Tooltip/Tooltip.tsx +78 -0
- package/src/components/Tooltip/USAGE.md +40 -0
- package/src/components/Tooltip/index.ts +1 -0
- package/src/components/TransferList/TRANSFERLIST_IMPLEMENTATION_NOTES.md +140 -0
- package/src/components/TransferList/TransferList.module.css +174 -0
- package/src/components/TransferList/TransferList.stories.tsx +121 -0
- package/src/components/TransferList/TransferList.test.tsx +1 -0
- package/src/components/TransferList/TransferList.tsx +419 -0
- package/src/components/TransferList/USAGE.md +77 -0
- package/src/components/TransferList/index.ts +1 -0
- package/src/components/Tree/IMPLEMENTATION_NOTES.md +53 -0
- package/src/components/Tree/Tree.module.css +272 -0
- package/src/components/Tree/Tree.stories.tsx +104 -0
- package/src/components/Tree/Tree.test.tsx +1 -0
- package/src/components/Tree/Tree.tsx +298 -0
- package/src/components/Tree/USAGE.md +99 -0
- package/src/components/Tree/index.ts +1 -0
- package/src/components/Typography/TYPOGRAPHY_IMPLEMENTATION_NOTES.md +17 -0
- package/src/components/Typography/Typography.module.css +13 -0
- package/src/components/Typography/Typography.test.tsx +1 -0
- package/src/components/Typography/Typography.tsx +43 -0
- package/src/components/Typography/USAGE.md +40 -0
- package/src/components/Typography/index.ts +1 -0
- package/src/components/index.ts +50 -0
- package/src/env.d.ts +7 -0
- package/src/index.ts +194 -0
- package/src/types/index.ts +9 -0
- package/src/types/scss-modules.d.ts +9 -0
- package/src/utils/ColorSchemeWrapper.tsx +23 -0
- package/src/utils/RequireAccessibleLabel.ts +1 -0
- package/src/utils/copyToClipboard.ts +36 -0
- package/src/utils/filterStylingProps.test.ts +85 -0
- package/src/utils/filterStylingProps.ts +143 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/renderRichOption.tsx +51 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import React, { forwardRef, useEffect, useState } from "react";
|
|
2
|
+
import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
|
|
3
|
+
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
|
|
4
|
+
import {
|
|
5
|
+
TimePicker as MuiTimePicker,
|
|
6
|
+
type TimePickerProps as MuiTimePickerProps,
|
|
7
|
+
} from "@mui/x-date-pickers/TimePicker";
|
|
8
|
+
import dayjs, { type Dayjs } from "dayjs";
|
|
9
|
+
import customParseFormat from "dayjs/plugin/customParseFormat";
|
|
10
|
+
import { type ReadOnlyControlProps } from "@recursica/adapter-common";
|
|
11
|
+
import {
|
|
12
|
+
filterStylingProps,
|
|
13
|
+
type RecursicaOverStyled,
|
|
14
|
+
} from "../../utils/filterStylingProps";
|
|
15
|
+
import { type RecursicaFormControlWrapperProps } from "../FormControlWrapper/FormControlWrapper";
|
|
16
|
+
import { WithReadOnlyWrapper } from "../ReadOnlyField/WithReadOnlyWrapper";
|
|
17
|
+
import { BareDropdown } from "../Dropdown/BareDropdown";
|
|
18
|
+
import styles from "./TimePicker.module.css";
|
|
19
|
+
|
|
20
|
+
import { type RecursicaTimePickerProps as BaseRecursicaTimePickerProps } from "@recursica/adapter-common";
|
|
21
|
+
|
|
22
|
+
// Required for dayjs's 2-arg `dayjs(value, format)` string-parsing signature used by `toDayjs`
|
|
23
|
+
// below — without this, dayjs silently ignores the format string and falls back to native `Date`
|
|
24
|
+
// parsing, which fails on a bare "HH:mm" time string (no date component) and returns an Invalid
|
|
25
|
+
// Date. This went unnoticed until a real initial `value`/`defaultValue` needed parsing (every
|
|
26
|
+
// interactive test before that produced Dayjs objects directly from the field's own onChange,
|
|
27
|
+
// never exercising this path).
|
|
28
|
+
dayjs.extend(customParseFormat);
|
|
29
|
+
|
|
30
|
+
const TIME_FORMAT_SECONDS = "HH:mm:ss";
|
|
31
|
+
const TIME_FORMAT_MINUTES = "HH:mm";
|
|
32
|
+
const AM_PM_DATA = [
|
|
33
|
+
{ value: "AM", label: "AM" },
|
|
34
|
+
{ value: "PM", label: "PM" },
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
/** Parses a Recursica "HH:mm" / "HH:mm:ss" string into a Dayjs instance, or undefined if not set. */
|
|
38
|
+
function toDayjs(value: string | undefined): Dayjs | undefined {
|
|
39
|
+
if (!value) return undefined;
|
|
40
|
+
const format = value.length > 5 ? TIME_FORMAT_SECONDS : TIME_FORMAT_MINUTES;
|
|
41
|
+
return dayjs(value, format);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Formats an "HH:mm"/"HH:mm:ss" 24-hour value as a 12-hour + AM/PM string for read-only display
|
|
46
|
+
* (e.g. "14:30" -> "2:30 PM") — the raw 24-hour string was being shown as-is in read-only mode,
|
|
47
|
+
* with no AM/PM, unlike the interactive composite. Returns undefined if not parseable.
|
|
48
|
+
*/
|
|
49
|
+
function formatReadOnlyTime(value: string | undefined): string | undefined {
|
|
50
|
+
const parsed = toDayjs(value);
|
|
51
|
+
if (!parsed) return value;
|
|
52
|
+
return parsed.format(value && value.length > 5 ? "h:mm:ss A" : "h:mm A");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface RecursicaTimePickerProps
|
|
56
|
+
extends Omit<
|
|
57
|
+
MuiTimePickerProps,
|
|
58
|
+
| "value"
|
|
59
|
+
| "defaultValue"
|
|
60
|
+
| "onChange"
|
|
61
|
+
| "minTime"
|
|
62
|
+
| "maxTime"
|
|
63
|
+
| "views"
|
|
64
|
+
| "format"
|
|
65
|
+
| "style"
|
|
66
|
+
>,
|
|
67
|
+
Pick<
|
|
68
|
+
RecursicaFormControlWrapperProps,
|
|
69
|
+
| "label"
|
|
70
|
+
| "error"
|
|
71
|
+
| "required"
|
|
72
|
+
| "id"
|
|
73
|
+
| "assistiveText"
|
|
74
|
+
| "assistiveWithIcon"
|
|
75
|
+
| "formLayout"
|
|
76
|
+
| "labelSize"
|
|
77
|
+
| "labelAlignment"
|
|
78
|
+
| "labelOptionalText"
|
|
79
|
+
| "labelWithEditIcon"
|
|
80
|
+
| "onLabelEditClick"
|
|
81
|
+
>,
|
|
82
|
+
ReadOnlyControlProps,
|
|
83
|
+
BaseRecursicaTimePickerProps {
|
|
84
|
+
/** Selected time as an "HH:mm" (or "HH:mm:ss" with `withSeconds`) string, matching the mantine-adapter convention. */
|
|
85
|
+
value?: string;
|
|
86
|
+
/** Uncontrolled initial time as an "HH:mm" (or "HH:mm:ss" with `withSeconds`) string. */
|
|
87
|
+
defaultValue?: string;
|
|
88
|
+
/** Fires with the new time as an "HH:mm" (or "HH:mm:ss" with `withSeconds`) string, or `null` if cleared. */
|
|
89
|
+
onChange?: (value: string | null) => void;
|
|
90
|
+
/** Caller-provided inline style, passed through to the FormControlWrapper root. */
|
|
91
|
+
style?: React.CSSProperties;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export type TimePickerProps = RecursicaOverStyled<RecursicaTimePickerProps>;
|
|
95
|
+
|
|
96
|
+
export const TimePicker = forwardRef<HTMLDivElement, TimePickerProps>(
|
|
97
|
+
function TimePicker(props, ref) {
|
|
98
|
+
const {
|
|
99
|
+
overStyled = false,
|
|
100
|
+
formLayout = "stacked",
|
|
101
|
+
|
|
102
|
+
// Label & Wrapper Maps
|
|
103
|
+
labelSize,
|
|
104
|
+
labelAlignment,
|
|
105
|
+
labelOptionalText,
|
|
106
|
+
labelWithEditIcon,
|
|
107
|
+
onLabelEditClick,
|
|
108
|
+
|
|
109
|
+
label,
|
|
110
|
+
assistiveText,
|
|
111
|
+
assistiveWithIcon,
|
|
112
|
+
error,
|
|
113
|
+
required,
|
|
114
|
+
id,
|
|
115
|
+
className,
|
|
116
|
+
style,
|
|
117
|
+
disabled,
|
|
118
|
+
readOnly,
|
|
119
|
+
readOnlyComponent,
|
|
120
|
+
emptyValueComponent,
|
|
121
|
+
value,
|
|
122
|
+
defaultValue,
|
|
123
|
+
onChange,
|
|
124
|
+
withSeconds,
|
|
125
|
+
minTime,
|
|
126
|
+
maxTime,
|
|
127
|
+
leftSection,
|
|
128
|
+
...rest
|
|
129
|
+
} = props;
|
|
130
|
+
|
|
131
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
132
|
+
|
|
133
|
+
// Internal full 24-hour value. Needed (unlike every other component in this adapter) because
|
|
134
|
+
// the time field and the AM/PM BareDropdown both mutate the same conceptual value — see
|
|
135
|
+
// TIMEPICKER_IMPLEMENTATION_NOTES.md.
|
|
136
|
+
const [internalValue, setInternalValue] = useState<Dayjs | null>(
|
|
137
|
+
() => toDayjs(value) ?? toDayjs(defaultValue) ?? null,
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
useEffect(() => {
|
|
141
|
+
if (value !== undefined) {
|
|
142
|
+
setInternalValue(toDayjs(value) ?? null);
|
|
143
|
+
}
|
|
144
|
+
}, [value]);
|
|
145
|
+
|
|
146
|
+
const isPM = internalValue ? internalValue.hour() >= 12 : false;
|
|
147
|
+
|
|
148
|
+
const wrapperClass = className
|
|
149
|
+
? `${styles.layoutOverride} ${className}`
|
|
150
|
+
: styles.layoutOverride;
|
|
151
|
+
|
|
152
|
+
const startAdornment = leftSection ? (
|
|
153
|
+
<div className={styles.section} data-position="left">
|
|
154
|
+
{leftSection}
|
|
155
|
+
</div>
|
|
156
|
+
) : undefined;
|
|
157
|
+
|
|
158
|
+
const emitChange = (next: Dayjs | null) => {
|
|
159
|
+
setInternalValue(next);
|
|
160
|
+
onChange?.(
|
|
161
|
+
next
|
|
162
|
+
? next.format(withSeconds ? TIME_FORMAT_SECONDS : TIME_FORMAT_MINUTES)
|
|
163
|
+
: null,
|
|
164
|
+
);
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
const handleFieldChange = (next: Dayjs | null) => {
|
|
168
|
+
emitChange(next);
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
const handleMeridiemChange = (next: string | null) => {
|
|
172
|
+
if (!internalValue || !next) return;
|
|
173
|
+
const wantsPM = next === "PM";
|
|
174
|
+
const currentHour = internalValue.hour();
|
|
175
|
+
const currentlyPM = currentHour >= 12;
|
|
176
|
+
if (wantsPM === currentlyPM) return;
|
|
177
|
+
const nextHour = wantsPM ? currentHour + 12 : currentHour - 12;
|
|
178
|
+
emitChange(internalValue.hour(nextHour));
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
return (
|
|
182
|
+
<WithReadOnlyWrapper
|
|
183
|
+
ref={ref}
|
|
184
|
+
className={wrapperClass}
|
|
185
|
+
style={style as React.CSSProperties}
|
|
186
|
+
controlMaxWidth={undefined}
|
|
187
|
+
controlMinWidth={undefined}
|
|
188
|
+
overStyled={overStyled as true}
|
|
189
|
+
formLayout={formLayout}
|
|
190
|
+
labelSize={labelSize}
|
|
191
|
+
labelAlignment={labelAlignment}
|
|
192
|
+
labelOptionalText={labelOptionalText}
|
|
193
|
+
labelWithEditIcon={labelWithEditIcon}
|
|
194
|
+
onLabelEditClick={onLabelEditClick}
|
|
195
|
+
label={label}
|
|
196
|
+
assistiveText={assistiveText}
|
|
197
|
+
assistiveWithIcon={assistiveWithIcon}
|
|
198
|
+
error={error}
|
|
199
|
+
required={required}
|
|
200
|
+
id={id}
|
|
201
|
+
readOnly={readOnly}
|
|
202
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
203
|
+
readOnlyComponent={readOnlyComponent as any}
|
|
204
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
205
|
+
emptyValueComponent={(emptyValueComponent as any) || undefined}
|
|
206
|
+
readOnlyType="text"
|
|
207
|
+
readOnlyValue={formatReadOnlyTime(
|
|
208
|
+
value !== undefined ? value : defaultValue,
|
|
209
|
+
)}
|
|
210
|
+
readOnlyNativeProps={props}
|
|
211
|
+
activeComponent={
|
|
212
|
+
/* Naked field execution safely decoupled from MUI X's own label/error macro handling.
|
|
213
|
+
format="hh:mm" is always on (12-hour digits, no native meridiem section) — this is the
|
|
214
|
+
only way this component operates, not a user choice. The AM/PM BareDropdown next to it
|
|
215
|
+
is the only AM/PM control; see TIMEPICKER_IMPLEMENTATION_NOTES.md. */
|
|
216
|
+
<div
|
|
217
|
+
className={styles.root}
|
|
218
|
+
data-error={error ? "true" : undefined}
|
|
219
|
+
data-with-left-section={leftSection ? "true" : undefined}
|
|
220
|
+
>
|
|
221
|
+
<LocalizationProvider dateAdapter={AdapterDayjs}>
|
|
222
|
+
<MuiTimePicker
|
|
223
|
+
{...(sanitizedProps as unknown as Partial<MuiTimePickerProps>)}
|
|
224
|
+
value={internalValue}
|
|
225
|
+
onChange={handleFieldChange}
|
|
226
|
+
disabled={disabled}
|
|
227
|
+
format={`hh:${withSeconds ? "mm:ss" : "mm"}`}
|
|
228
|
+
views={
|
|
229
|
+
withSeconds
|
|
230
|
+
? ["hours", "minutes", "seconds"]
|
|
231
|
+
: ["hours", "minutes"]
|
|
232
|
+
}
|
|
233
|
+
minTime={toDayjs(minTime)}
|
|
234
|
+
maxTime={toDayjs(maxTime)}
|
|
235
|
+
// No open-picker button: the popup clock/list view it opens isn't styled to
|
|
236
|
+
// Recursica tokens (see TIMEPICKER_IMPLEMENTATION_NOTES.md) — showing an affordance
|
|
237
|
+
// to open an unstyled popup would be worse than not showing one. Typing directly
|
|
238
|
+
// into the field's masked hour/minute segments is the only interaction. leftSection
|
|
239
|
+
// (below) is purely decorative, unrelated to this button.
|
|
240
|
+
slots={{ openPickerButton: () => null }}
|
|
241
|
+
slotProps={{
|
|
242
|
+
field: {
|
|
243
|
+
className: styles.field,
|
|
244
|
+
},
|
|
245
|
+
textField: {
|
|
246
|
+
slotProps: {
|
|
247
|
+
input: {
|
|
248
|
+
startAdornment,
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
}}
|
|
253
|
+
/>
|
|
254
|
+
</LocalizationProvider>
|
|
255
|
+
<BareDropdown
|
|
256
|
+
overStyled
|
|
257
|
+
className={styles.amPmSelect}
|
|
258
|
+
// Dropdown.module.css's own .root sets width: 100% (correct for a standalone
|
|
259
|
+
// Dropdown filling its form-control column) — overStyled lets us override just the
|
|
260
|
+
// width via inline style, keeping every other Recursica style (border, colors,
|
|
261
|
+
// padding) intact. See TIMEPICKER_IMPLEMENTATION_NOTES.md.
|
|
262
|
+
style={{ width: "fit-content" }}
|
|
263
|
+
data={AM_PM_DATA}
|
|
264
|
+
value={isPM ? "PM" : "AM"}
|
|
265
|
+
onChange={handleMeridiemChange}
|
|
266
|
+
disabled={disabled}
|
|
267
|
+
error={!!error}
|
|
268
|
+
aria-label="AM or PM"
|
|
269
|
+
/>
|
|
270
|
+
</div>
|
|
271
|
+
}
|
|
272
|
+
/>
|
|
273
|
+
);
|
|
274
|
+
},
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
TimePicker.displayName = "TimePicker";
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# TimePicker - Usage Guide
|
|
2
|
+
|
|
3
|
+
This document describes how to integrate and use the `TimePicker` component in your projects using `@recursica/adapter-mui-v7`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Import Reference
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { TimePicker } from "@recursica/adapter-mui-v7";
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`TimePicker` requires `@mui/x-date-pickers` (optional peer dependency) to be installed alongside `@mui/material`. See [SETUP.md](../../../SETUP.md).
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 2. Basic Example
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import React from "react";
|
|
21
|
+
import { TimePicker } from "@recursica/adapter-mui-v7";
|
|
22
|
+
|
|
23
|
+
export default function Demo() {
|
|
24
|
+
return <TimePicker label="Select Time" />;
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`TimePicker`'s value is a plain `"HH:mm"` string (matching `@recursica/mantine-adapter`'s convention) — always 24-hour. Pass `withSeconds` to add a seconds segment (`"HH:mm:ss"`), and `minTime`/`maxTime` (in the same string format) to bound the allowed range.
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
<TimePicker
|
|
32
|
+
label="Precise Time"
|
|
33
|
+
withSeconds
|
|
34
|
+
minTime="09:00:00"
|
|
35
|
+
maxTime="17:00:00"
|
|
36
|
+
onChange={(value) => console.log(value)} // "HH:mm:ss" | null
|
|
37
|
+
/>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
> [!IMPORTANT] > **Recursica-specific behavior:** `TimePicker` always renders a 12-hour field with a dedicated AM/PM `Dropdown`-style selector next to it — a deviation from `@mui/x-date-pickers`'s own default (24-hour, or a single field with an inline meridiem section) and **not configurable**. There is no prop to switch to a plain 24-hour field; this is the only way the component operates.
|
|
41
|
+
|
|
42
|
+
The AM/PM control visually matches Recursica's `Dropdown` component exactly, rather than a plain native `<select>`.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 3. Design System Integration
|
|
47
|
+
|
|
48
|
+
All Recursica components in the `@recursica/adapter-mui-v7` package adhere strictly to design system spacing, scaling, and behavior patterns.
|
|
49
|
+
|
|
50
|
+
> [!IMPORTANT]
|
|
51
|
+
>
|
|
52
|
+
> - **Anti-override protection**: Rogue style injections (like inline `style` or arbitrary `className`) are automatically blocked by our prop layer unless `overStyled={true}` is explicitly provided.
|
|
53
|
+
> - **No Direct Layers**: Do not pass a `layer` prop to this component. To place it on a specific visual layer, wrap it in a `<Layer layer={0|1|2|3}>` component natively.
|
|
54
|
+
> - **Variables and Theming**: Styling is entirely determined by local CSS variables defined in `recursica_variables_scoped.css` and mapped in the component's CSS module.
|
|
55
|
+
> - **Known limitation**: the closed field is fully token-driven; the open clock/list dropdown currently renders with MUI's default styling (no Figma token spec exists for it yet).
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 4. Read-Only Mode
|
|
60
|
+
|
|
61
|
+
Pass `readOnly` to render the current value as static text, matching every other Recursica form control. The value is formatted as 12-hour + AM/PM (e.g. `"14:30"` displays as `"2:30 PM"`).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./TimePicker";
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Timeline Implementation Notes
|
|
2
|
+
|
|
3
|
+
## Architecture
|
|
4
|
+
|
|
5
|
+
Unlike Mantine, `@mui/lab`'s `TimelineItem` has no built-in bullet/connector — it only
|
|
6
|
+
composes whatever you nest inside it. `TimelineItem.tsx` renders `TimelineSeparator` >
|
|
7
|
+
`TimelineDot` (`.itemBullet`) + `TimelineConnector` (`.itemConnector`), and `TimelineContent`
|
|
8
|
+
(`.itemBody`) containing the `title`/description/`timestamp` nodes, to reproduce Mantine's
|
|
9
|
+
single-component bullet + connecting-line structure.
|
|
10
|
+
|
|
11
|
+
- `Timeline.tsx` computes `active`/`isLast` per item (Mui has no `active` concept at all) and
|
|
12
|
+
injects them into each `Timeline.Item` as internal `__active`/`__isLast` props, mirroring
|
|
13
|
+
Mantine's own `cloneElement` pattern for propagating active state down to children.
|
|
14
|
+
- `data-active` / `data-variant` are set directly on `TimelineItem`'s real `li` root and
|
|
15
|
+
consumed via plain descendant selectors (`.item[data-active] .itemBullet`, etc.) in
|
|
16
|
+
`Timeline.module.css` — Mui's `TimelineItem` only defines a `root` classes slot, so (unlike
|
|
17
|
+
Mantine) passing a `classes` object with `item`/`itemBullet`/`itemBody`/... keys is a no-op;
|
|
18
|
+
those class names must be applied as plain `className`s on the elements we render ourselves.
|
|
19
|
+
- The last item omits `TimelineConnector` entirely so no trailing line renders past it.
|
|
20
|
+
- `Timeline.module.css` neutralizes Mui's `TimelineItem::before` opposite-content spacer
|
|
21
|
+
(`flex: 0; padding: 0`), which otherwise pushes the separator/content right since this
|
|
22
|
+
adapter never renders `TimelineOppositeContent`.
|
|
23
|
+
|
|
24
|
+
## Limitations & Missing Tokens
|
|
25
|
+
|
|
26
|
+
- **Avatar Bullet Size**: There is no specific pixel variable provided for the Avatar bullet size in the UI kit tokens (`avatar-size` evaluates to `"default"`). To maintain exact mathematical centering with the connector line, the CSS falls back to inheriting the `default` bullet size (`20px`) for avatar nodes natively. If users supply a custom sized `img` tag, it must adhere to inline structural constraints or flex mappings.
|
|
27
|
+
|
|
28
|
+
## Connector fell short of the next bullet (source-of-truth audit, 2026-08-30)
|
|
29
|
+
|
|
30
|
+
`.root` spaces items with a real flex `gap` (`item-gap`) instead of Mui's own zero-gap default,
|
|
31
|
+
so each `<li>` sits with actual whitespace before the next one. `TimelineConnector` is Mui's own
|
|
32
|
+
`flex: 1` element that only fills its _own_ `<li>`'s content height (bounded by `TimelineItem`'s
|
|
33
|
+
row `align-items: stretch` matching `TimelineContent`'s height) — it always ended flush with its
|
|
34
|
+
own item's bottom edge, `item-gap` short of the next item's bullet. Fixed with `margin-bottom:
|
|
35
|
+
calc(-1 * item-gap)` on `.itemConnector`: flexbox's remaining-space distribution accounts for
|
|
36
|
+
margins when growing a `flex: 1` item, so a negative margin here hands the connector that much
|
|
37
|
+
extra grow height while pulling the _container's_ own computed size back in by the same amount —
|
|
38
|
+
net effect, the rendered line's box is genuinely `item-gap` taller and visually reaches the next
|
|
39
|
+
bullet, confirmed via `getBoundingClientRect()` (connector height 58.8px → 90.8px, exactly +32px
|
|
40
|
+
== the `item-gap` token value). Mantine's equivalent isn't a flex gap at all — it overrides
|
|
41
|
+
Mantine's own `--mantine-spacing-xl` (which natively drives both `.item`'s margin-top and the
|
|
42
|
+
connector's negative-bottom bridging offset together) — but the net visual result matches.
|