@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,120 @@
|
|
|
1
|
+
# Stepper Implementation Notes
|
|
2
|
+
|
|
3
|
+
- **Compositional API Dropped:** Mantine manages stepper state and content via `<Stepper.Step>` and `<Stepper.Completed>`. MUI delegates content rendering to the developer and focuses purely on the stepper visual layout using `<Step>`, `<StepLabel>`, etc.
|
|
4
|
+
- **Monolithic API Adopted:** Following architectural review, we have abandoned the fabricated context wrappers for `adapter-mui-v7`. We now natively export `Stepper`, `Step`, `StepLabel`, `StepButton`, and `StepConnector` wrapping their `@mui/material` counterparts. Developers are expected to manage the active step logic and content rendering outside the `Stepper` component, consistent with MUI patterns. Storybook tests have been updated to reflect this divergence while retaining core visual compatibility.
|
|
5
|
+
|
|
6
|
+
## Layout fixes (root-caused against mantine's visual reference)
|
|
7
|
+
|
|
8
|
+
Several parts of the original implementation used the correct-looking classes but wired
|
|
9
|
+
them to elements that never carry those classes at runtime, or copy-pasted comments/logic
|
|
10
|
+
from `mantine-adapter` that don't describe how MUI's Stepper actually works. Fixed:
|
|
11
|
+
|
|
12
|
+
- **Horizontal layout uses `alternativeLabel`:** MUI's own `Stepper` prop doc says
|
|
13
|
+
`alternativeLabel` positions the label under the icon — that's exactly Recursica's
|
|
14
|
+
horizontal layout, and it's also what makes `StepConnector`'s `alternativeLabel` variant
|
|
15
|
+
absolutely-position itself relative to each `Step`, centered on the icon. The adapter
|
|
16
|
+
previously never set this prop and instead tried to force column layout via CSS on
|
|
17
|
+
`Step`'s own root, which has no effect (`StepLabel`'s row-vs-column layout is driven
|
|
18
|
+
entirely by the `alternativeLabel` context flag, not by its parent's `flex-direction`).
|
|
19
|
+
Without it, labels rendered beside the icon (row layout) and the connector used the
|
|
20
|
+
non-`alternativeLabel` inline-flex positioning, both very visibly wrong.
|
|
21
|
+
- **Custom `StepIconComponent`:** MUI's default `StepIcon` draws its own self-contained
|
|
22
|
+
circle+check `CheckCircle` SVG (Material's `check_circle` glyph) whenever `completed` is
|
|
23
|
+
true, colored via `theme.palette.primary.main` (blue) — it never reads our tokens and its
|
|
24
|
+
SVG viewBox doesn't scale to `--stepper-indicator-size`. We now pass `RecursicaStepIcon`
|
|
25
|
+
(a plain span + our own inline check glyph, same convention as `Checkbox.tsx`'s `CheckIcon`)
|
|
26
|
+
so the token-driven circle (`.stepIconCircle`) is the only circle ever drawn, and the check
|
|
27
|
+
mark is sized via `--stepper-svg-size` and colored via the `completed-indicator-text` token.
|
|
28
|
+
- **`classes.labelContainer` was never mapped:** all of the `.stepBody` centering/max-width
|
|
29
|
+
CSS (copied verbatim from mantine, where `stepBody` is a real classNames key) was dead code
|
|
30
|
+
for MUI — `StepLabel` calls this slot `labelContainer`, not `stepBody`. Now mapped via
|
|
31
|
+
`classes={{ labelContainer: styles.stepBody }}`.
|
|
32
|
+
- **Vertical connecting line — real primitive doesn't fit, so it's drawn on `.stepIcon`:**
|
|
33
|
+
MUI's vertical `StepConnector` is a sibling with a fixed `minHeight: 24`; it can't stretch to
|
|
34
|
+
match a step's actual rendered height (e.g. a 2-line description), which is exactly why the
|
|
35
|
+
line floated disconnected from both circles. MUI's own answer to this is `StepContent`
|
|
36
|
+
(its `border-left` spans whatever height its content needs) — but Recursica intentionally
|
|
37
|
+
hides `.content` (steppers are structural-only, no per-step content in the DOM). Since
|
|
38
|
+
neither of MUI's two connecting-line primitives fits, the vertical connector is drawn as a
|
|
39
|
+
`.stepIcon::after` pseudo-element instead: `StepLabelRoot` gets `align-items: stretch` (a
|
|
40
|
+
real CSS stretch, not JS measurement) so `.stepIcon` (`iconContainer`) grows to match its
|
|
41
|
+
sibling label column's actual height, and the rail spans `top: indicator-size` down through
|
|
42
|
+
`bottom: calc(-1 * step-gap)` (the step's own padding-bottom, exactly reaching the next
|
|
43
|
+
step's icon). `Stepper.tsx` passes an empty `<></>` as the vertical `connector` since this
|
|
44
|
+
fully replaces its job. This requires zeroing MUI's own hardcoded
|
|
45
|
+
`StepLabelRoot` vertical `padding: 8px 0` (`.root.vertical .stepLabelRoot`) — leaving it in
|
|
46
|
+
place made the rail land 16px short of the next icon.
|
|
47
|
+
- **`:global()` was missing everywhere `.Mui-active`/`.Mui-completed`/`.MuiStepLabel-root` was
|
|
48
|
+
referenced:** in a CSS Module, a bare `.Mui-completed` selector gets scoped/hashed like any
|
|
49
|
+
other local class, so it silently never matches the real global class MUI stamps onto the
|
|
50
|
+
DOM (same pitfall documented in `Button.module.css`/`Switch.module.css` for `.Mui-disabled`/
|
|
51
|
+
`.Mui-checked`). This affected the label/description state-color rules (already present
|
|
52
|
+
before this fix) and the new separator/rail state-color rules — all now wrapped in
|
|
53
|
+
`:global(...)`. While fixing this, the description-color selectors were also corrected to
|
|
54
|
+
use `.stepBody:has(.stepLabel:global(.Mui-completed)) .stepDescription` — the prior
|
|
55
|
+
`:has(~ .Mui-completed)` could never match because `optional`/description renders _after_
|
|
56
|
+
the label in the DOM (not before), and `.MuiStepLabel-root.Mui-completed` could never match
|
|
57
|
+
because MUI only stamps the completed/active state class onto the `label`/`iconContainer`
|
|
58
|
+
slots, never onto `StepLabel`'s own root.
|
|
59
|
+
|
|
60
|
+
## Source-of-truth audit fixes (2026-08-30)
|
|
61
|
+
|
|
62
|
+
- **Horizontal connector gap 16px too wide:** MUI's `.MuiStep-root` hardcodes `padding: 0 8px`
|
|
63
|
+
for horizontal steps. The `alternativeLabel` connector centers itself via `left: -50%; right:
|
|
64
|
+
50%` relative to each `Step`'s _full_ box width, so that padding (8px from each of the two
|
|
65
|
+
neighboring steps) silently widened every gap by 16px beyond the real `stepBody` content width
|
|
66
|
+
(`--stepper-max-text-width`, 200px in both kits). This didn't show up as a broken-looking line
|
|
67
|
+
in isolation (the circle still visually sits on top of the connector, hiding the seam either
|
|
68
|
+
way — see below) but produced a cumulative rightward drift versus mantine's edge-to-edge gap
|
|
69
|
+
(174px vs. mantine's 158px) that grew step over step, which is what actually reads as "shifted
|
|
70
|
+
~30px left" by the third step in a side-by-side comparison. Fixed by zeroing
|
|
71
|
+
`.root.horizontal .step`'s padding.
|
|
72
|
+
- **The MUI connector element is a center-to-center box hidden by the circle on top, not an
|
|
73
|
+
edge-to-edge box like mantine's:** confirmed via `getBoundingClientRect()` — MUI's connector
|
|
74
|
+
literally spans one circle's center to the next's (`left:-50%/right:50%` against each Step's
|
|
75
|
+
own width), with the `Step`'s own icon painted after it in DOM order so it opaquely covers the
|
|
76
|
+
half of the connector underneath each circle. Mantine's connector is a real `flex:1` box with
|
|
77
|
+
negative margins that trims it to true edge-to-edge. Both approaches render identically once
|
|
78
|
+
the step padding above is fixed (verified pixel-for-pixel via live screenshots) — not changed
|
|
79
|
+
further, since MUI's `alternativeLabel` primitive doesn't support an edge-to-edge box directly
|
|
80
|
+
and the visual result already matches.
|
|
81
|
+
- **`ui-kit-stepper--default`'s "Step N content" text belonged to the story, not the component:**
|
|
82
|
+
mui's `Stepper.stories.tsx` rendered an extra `<div>Step {active+1} content</div>` between the
|
|
83
|
+
`Stepper` and the Previous/Next buttons that mantine's equivalent story never had (mantine's
|
|
84
|
+
story passes no children to `Stepper.Step`, so its real `.content` region — hidden by both
|
|
85
|
+
kits' CSS anyway, see "Hide Content" above — stays empty). Removed the extra div from mui's
|
|
86
|
+
story; no component-level bug (mantine's `Stepper` isn't missing a content region — it was
|
|
87
|
+
never asked to render one here).
|
|
88
|
+
- **`Group`'s `gap`/margin-padding shorthand props silently multiplied by MUI's theme spacing
|
|
89
|
+
unit:** the stepper story's `<Group mt={24} justify="center" gap={8}>` expects literal pixels
|
|
90
|
+
(matching mantine's `Group`, which takes raw numbers as-is), but `adapter-mui-v7`'s `Group` passed
|
|
91
|
+
`gap` into `Stack`'s own `spacing` prop and spread `mt`/other margin-padding props straight onto
|
|
92
|
+
`Stack`'s system props — both are MUI spacing shorthands that multiply bare numbers by the
|
|
93
|
+
theme's 8px unit (`gap={8}` → 64px, `mt={24}` → 192px). This was the real cause of "Previous/
|
|
94
|
+
Next buttons spaced farther apart" and an oversized gap between the stepper and the button row.
|
|
95
|
+
Fixed in `Group.tsx`: numeric `gap`/`rowGap`/`columnGap` are now stringified to `px` and applied
|
|
96
|
+
via `sx.gap` directly (bypassing `Stack`'s `spacing` prop entirely), and numeric margin/padding
|
|
97
|
+
shorthand keys (`m`/`mt`/.../`py`) are stringified to `px` before being spread onto `Stack`.
|
|
98
|
+
This only affects call sites that pass bare numbers (none elsewhere in this package at the time
|
|
99
|
+
of this fix — `grep`ped for it) since string/token values were already unaffected.
|
|
100
|
+
- **`ui-kit-stepper--vertical` spacing too tight:** mantine's real per-step vertical spacing isn't
|
|
101
|
+
actually driven by our own `--stepper-step-gap` token at all — mantine/core's _native_,
|
|
102
|
+
unmodified `Stepper.Step` CSS (`node_modules/@mantine/core/styles/Stepper.css`) ships its own
|
|
103
|
+
`min-height: calc(icon-size + mantine-spacing-xl + separator-spacing)` (≈32px + ≈5px on top of
|
|
104
|
+
the icon), which dominates over our `--stepper-step-gap` (12px) padding since it's larger. This
|
|
105
|
+
is an incidental Mantine library default, not a Recursica token/design decision, but it's what
|
|
106
|
+
actually produces mantine's visible spacing — measured at exactly 79px icon-center-to-icon-
|
|
107
|
+
center vs. mui's un-patched 62.2px. Reproduced via `.root.vertical .step:not(:last-of-type) {
|
|
108
|
+
display: flex; min-height: calc(var(--stepper-indicator-size) + 2rem + 0.3125rem); }`
|
|
109
|
+
(`display: flex` is required too, not just `min-height` — without it, `.stepLabelRoot`'s
|
|
110
|
+
existing `align-items: stretch` has nothing taller to stretch to, so the extra height would sit
|
|
111
|
+
as dead space below the row instead of growing `.stepIcon` and, with it, the `.stepIcon::after`
|
|
112
|
+
rail's reach to the next circle). Excludes `:last-of-type`, matching mantine's own `:last-of-
|
|
113
|
+
type { min-height: auto }` reset. Verified via live `getBoundingClientRect()` on both kits:
|
|
114
|
+
icon-to-icon spacing now matches at 79px exactly.
|
|
115
|
+
- **Description color for completed/current steps was correctly implemented in this package** —
|
|
116
|
+
the visual difference reported against mantine's rendering turned out to be a mantine-adapter
|
|
117
|
+
bug (its `data-progress="completed"/"progress"/"pending"` value-matching selectors never
|
|
118
|
+
matched Mantine's real boolean-presence attributes), not a missing/wrong Recursica variable
|
|
119
|
+
here. See `mantine-adapter`'s own `Stepper/IMPLEMENTATION_NOTES.md`. No adapter-mui-v7 change was
|
|
120
|
+
needed for that item.
|
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Recursica Stepper CSS module natively binding to Figma variables.
|
|
3
|
+
|
|
4
|
+
ARCHITECTURE NOTES (see IMPLEMENTATION_NOTES.md for full rationale):
|
|
5
|
+
- Horizontal orientation uses MUI Stepper's own `alternativeLabel` prop (icon on
|
|
6
|
+
top, label centered below, connector absolutely positioned circle-to-circle) —
|
|
7
|
+
this is MUI's real primitive for this exact layout, not a custom column hack.
|
|
8
|
+
- The visible circle/checkmark is rendered by our own `RecursicaStepIcon`
|
|
9
|
+
(`.stepIconCircle` / `.stepCompletedIcon`) instead of MUI's default `StepIcon`,
|
|
10
|
+
which draws its own self-colored (blue) circle+check SVG that never reads
|
|
11
|
+
our tokens.
|
|
12
|
+
- Vertical orientation's connecting line is drawn as a `.stepIcon::after` rail
|
|
13
|
+
(not the `StepConnector` element — see Stepper.tsx) so its length tracks each
|
|
14
|
+
step's actual rendered height, matching mantine's absolutely-positioned
|
|
15
|
+
separator.
|
|
16
|
+
|
|
17
|
+
HARDCODED VALUES:
|
|
18
|
+
- `.stepIconCircle` sets `box-sizing: border-box` so the indicator's border is
|
|
19
|
+
included in `--stepper-indicator-size`, keeping the connector's centering math
|
|
20
|
+
(indicator-size / 2) exact.
|
|
21
|
+
- `--stepper-connector-size` is a local bridge custom property (not a design
|
|
22
|
+
token) used only to let the vertical rail's centering `calc()` reference
|
|
23
|
+
whichever connector-size token is active for the current state.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
.root {
|
|
27
|
+
/* Orientation specific gaps are mapped via data attributes */
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.root.horizontal .steps {
|
|
31
|
+
align-items: flex-start;
|
|
32
|
+
--stepper-step-gap: var(
|
|
33
|
+
--recursica_ui-kit_components_stepper_variants_orientation_horizontal_properties_step-gap
|
|
34
|
+
);
|
|
35
|
+
--stepper-max-text-width: var(
|
|
36
|
+
--recursica_ui-kit_components_stepper_variants_orientation_horizontal_properties_max-text-width
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.root.horizontal .step {
|
|
41
|
+
/* MUI's own `.MuiStep-root` hardcodes `padding: 0 8px` for horizontal Steps.
|
|
42
|
+
The alternativeLabel connector centers itself via `left: -50%; right: 50%`
|
|
43
|
+
relative to each Step's full box width, so this padding silently widened
|
|
44
|
+
every gap by 16px (8px from each neighboring Step) beyond the real
|
|
45
|
+
`stepBody` content width (--stepper-max-text-width), drifting the
|
|
46
|
+
connector length away from mantine's edge-to-edge gap. */
|
|
47
|
+
padding: 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.root.horizontal .stepBody {
|
|
51
|
+
width: var(--stepper-max-text-width);
|
|
52
|
+
display: flex;
|
|
53
|
+
flex-direction: column;
|
|
54
|
+
align-items: center;
|
|
55
|
+
justify-content: flex-start;
|
|
56
|
+
gap: var(
|
|
57
|
+
--recursica_ui-kit_components_stepper_variants_orientation_horizontal_properties_label-description-gap
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.root.horizontal .stepLabel,
|
|
62
|
+
.root.horizontal .stepDescription {
|
|
63
|
+
width: max-content;
|
|
64
|
+
max-width: var(--stepper-max-text-width);
|
|
65
|
+
text-align: center;
|
|
66
|
+
white-space: normal;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.root.horizontal .stepLabel {
|
|
70
|
+
/* Replaces MUI's own hardcoded `margin-top: 16px` (applied via its
|
|
71
|
+
`.Mui-alternativeLabel` state class) with the real indicator-label-gap token. */
|
|
72
|
+
margin-top: var(
|
|
73
|
+
--recursica_ui-kit_components_stepper_variants_orientation_horizontal_properties_indicator-label-gap
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.root.horizontal .separator {
|
|
78
|
+
/* Root only positions the connector; MUI's own `alternativeLabel` variant
|
|
79
|
+
already sets `position: absolute`. Centering is exact because our custom
|
|
80
|
+
StepIconComponent renders a `--stepper-indicator-size` circle flush at the
|
|
81
|
+
top of `.stepIcon`, centered horizontally within the step. */
|
|
82
|
+
top: calc(var(--stepper-indicator-size) / 2);
|
|
83
|
+
left: -50%;
|
|
84
|
+
right: 50%;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.root.horizontal .separatorLine {
|
|
88
|
+
border-top: none; /* replace MUI's default border-top line with a token-driven bar */
|
|
89
|
+
height: var(
|
|
90
|
+
--recursica_ui-kit_components_stepper_properties_upcoming-connector-size
|
|
91
|
+
);
|
|
92
|
+
background-color: var(
|
|
93
|
+
--recursica_ui-kit_components_stepper_properties_colors_upcoming-connector-color
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.root.horizontal .separator:global(.Mui-active) .separatorLine,
|
|
98
|
+
.root.horizontal .separator:global(.Mui-completed) .separatorLine {
|
|
99
|
+
height: var(
|
|
100
|
+
--recursica_ui-kit_components_stepper_properties_completed-connector-size
|
|
101
|
+
);
|
|
102
|
+
background-color: var(
|
|
103
|
+
--recursica_ui-kit_components_stepper_properties_colors_completed-connector-color
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Vertical Orientation */
|
|
108
|
+
.root.vertical {
|
|
109
|
+
--stepper-step-gap: var(
|
|
110
|
+
--recursica_ui-kit_components_stepper_variants_orientation_vertical_properties_step-gap
|
|
111
|
+
);
|
|
112
|
+
--stepper-max-text-width: var(
|
|
113
|
+
--recursica_ui-kit_components_stepper_variants_orientation_vertical_properties_max-text-width
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.root.vertical .step {
|
|
118
|
+
/* Moves the gap inside the step (instead of a margin between steps) so the
|
|
119
|
+
`.stepIcon::after` rail can extend through it into the next step. */
|
|
120
|
+
padding-bottom: var(--stepper-step-gap);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.root.vertical .step:not(:last-of-type) {
|
|
124
|
+
/* Mantine's own `Stepper.Step` (mantine/core's native, unmodified CSS) ships
|
|
125
|
+
a hardcoded `min-height: icon-size + mantine-spacing-xl + separator-spacing`
|
|
126
|
+
(~32px + ~5px on top of the icon) that isn't tied to any Recursica token —
|
|
127
|
+
it's an incidental library default, not a design decision — but it's what
|
|
128
|
+
actually governs mantine's real per-step vertical spacing, independent of
|
|
129
|
+
(and larger than) the `--stepper-step-gap` token's own value. MUI has no
|
|
130
|
+
such native default, so without reproducing it here every vertical step
|
|
131
|
+
renders visibly tighter than mantine's. Matches mantine's own `:last-of-
|
|
132
|
+
type { min-height: auto }` reset by excluding the last step.
|
|
133
|
+
|
|
134
|
+
`display: flex` (Step is `display: block` by default) is required so this
|
|
135
|
+
min-height actually reaches the icon/rail: `.stepLabelRoot`'s existing
|
|
136
|
+
`align-items: stretch` only stretches its flex children to *its own* box
|
|
137
|
+
height, and without this, `.stepLabelRoot` itself would just sit at its
|
|
138
|
+
natural (smaller) content height inside the taller `.step`, leaving the
|
|
139
|
+
`.stepIcon::after` rail exactly as short as it was before this rule. */
|
|
140
|
+
display: flex;
|
|
141
|
+
min-height: calc(var(--stepper-indicator-size) + 2rem + 0.3125rem);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.root.vertical .step:last-of-type {
|
|
145
|
+
padding-bottom: 0;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.root.vertical .stepBody {
|
|
149
|
+
gap: var(
|
|
150
|
+
--recursica_ui-kit_components_stepper_variants_orientation_vertical_properties_label-description-gap
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.root.vertical .stepLabelRoot {
|
|
155
|
+
/* Lets the icon column (`.stepIcon`) stretch to match the label column's
|
|
156
|
+
actual rendered height (multi-line descriptions included), so the
|
|
157
|
+
connecting rail's length always reaches the next step's icon. */
|
|
158
|
+
align-items: stretch;
|
|
159
|
+
/* Replaces MUI's own hardcoded `padding: 8px 0` for vertical orientation —
|
|
160
|
+
without zeroing this, the rail falls 16px short of the next icon (8px
|
|
161
|
+
here + 8px on the next step's own StepLabelRoot). */
|
|
162
|
+
padding: 0;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.root.vertical .stepIcon {
|
|
166
|
+
height: auto;
|
|
167
|
+
/* Replaces MUI's own hardcoded `padding-right: 8px` on the icon container. */
|
|
168
|
+
padding-right: var(
|
|
169
|
+
--recursica_ui-kit_components_stepper_variants_orientation_vertical_properties_indicator-label-gap
|
|
170
|
+
);
|
|
171
|
+
--stepper-connector-size: var(
|
|
172
|
+
--recursica_ui-kit_components_stepper_properties_upcoming-connector-size
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.root.vertical .step:global(.Mui-completed) .stepIcon {
|
|
177
|
+
--stepper-connector-size: var(
|
|
178
|
+
--recursica_ui-kit_components_stepper_properties_completed-connector-size
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.root.vertical .step:not(:last-of-type) .stepIcon::after {
|
|
183
|
+
content: "";
|
|
184
|
+
position: absolute;
|
|
185
|
+
top: var(--stepper-indicator-size);
|
|
186
|
+
bottom: calc(-1 * var(--stepper-step-gap));
|
|
187
|
+
left: calc(50% - (var(--stepper-connector-size) / 2));
|
|
188
|
+
width: var(--stepper-connector-size);
|
|
189
|
+
background-color: var(
|
|
190
|
+
--recursica_ui-kit_components_stepper_properties_colors_upcoming-connector-color
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.root.vertical
|
|
195
|
+
.step:global(.Mui-completed):not(:last-of-type)
|
|
196
|
+
.stepIcon::after {
|
|
197
|
+
background-color: var(
|
|
198
|
+
--recursica_ui-kit_components_stepper_properties_colors_completed-connector-color
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/* Sizes */
|
|
203
|
+
.large {
|
|
204
|
+
--stepper-icon-size: var(
|
|
205
|
+
--recursica_ui-kit_components_stepper_variants_sizes_large_properties_indicator-size
|
|
206
|
+
); /* Maps to Mantine's circle size */
|
|
207
|
+
--stepper-indicator-size: var(
|
|
208
|
+
--recursica_ui-kit_components_stepper_variants_sizes_large_properties_indicator-size
|
|
209
|
+
);
|
|
210
|
+
--stepper-border-size: var(
|
|
211
|
+
--recursica_ui-kit_components_stepper_variants_sizes_large_properties_indicator-border-size
|
|
212
|
+
);
|
|
213
|
+
--stepper-border-radius: var(
|
|
214
|
+
--recursica_ui-kit_components_stepper_variants_sizes_large_properties_indicator-border-radius
|
|
215
|
+
);
|
|
216
|
+
--stepper-font-family: var(
|
|
217
|
+
--recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_font-family
|
|
218
|
+
);
|
|
219
|
+
--stepper-font-size: var(
|
|
220
|
+
--recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_font-size
|
|
221
|
+
);
|
|
222
|
+
--stepper-font-style: var(
|
|
223
|
+
--recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_font-style
|
|
224
|
+
);
|
|
225
|
+
--stepper-font-weight: var(
|
|
226
|
+
--recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_font-weight
|
|
227
|
+
);
|
|
228
|
+
--stepper-letter-spacing: var(
|
|
229
|
+
--recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_letter-spacing
|
|
230
|
+
);
|
|
231
|
+
--stepper-line-height: var(
|
|
232
|
+
--recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_line-height
|
|
233
|
+
);
|
|
234
|
+
--stepper-text-decoration: var(
|
|
235
|
+
--recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_text-decoration
|
|
236
|
+
);
|
|
237
|
+
--stepper-text-transform: var(
|
|
238
|
+
--recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_text-transform
|
|
239
|
+
);
|
|
240
|
+
--stepper-svg-size: var(
|
|
241
|
+
--recursica_ui-kit_components_stepper_variants_sizes_large_properties_completed-icon-size
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.small {
|
|
246
|
+
--stepper-icon-size: var(
|
|
247
|
+
--recursica_ui-kit_components_stepper_variants_sizes_small_properties_indicator-size
|
|
248
|
+
); /* Maps to Mantine's circle size */
|
|
249
|
+
--stepper-indicator-size: var(
|
|
250
|
+
--recursica_ui-kit_components_stepper_variants_sizes_small_properties_indicator-size
|
|
251
|
+
);
|
|
252
|
+
--stepper-border-size: var(
|
|
253
|
+
--recursica_ui-kit_components_stepper_variants_sizes_small_properties_indicator-border-size
|
|
254
|
+
);
|
|
255
|
+
--stepper-border-radius: var(
|
|
256
|
+
--recursica_ui-kit_components_stepper_variants_sizes_small_properties_indicator-border-radius
|
|
257
|
+
);
|
|
258
|
+
--stepper-font-family: var(
|
|
259
|
+
--recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_font-family
|
|
260
|
+
);
|
|
261
|
+
--stepper-font-size: var(
|
|
262
|
+
--recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_font-size
|
|
263
|
+
);
|
|
264
|
+
--stepper-font-style: var(
|
|
265
|
+
--recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_font-style
|
|
266
|
+
);
|
|
267
|
+
--stepper-font-weight: var(
|
|
268
|
+
--recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_font-weight
|
|
269
|
+
);
|
|
270
|
+
--stepper-letter-spacing: var(
|
|
271
|
+
--recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_letter-spacing
|
|
272
|
+
);
|
|
273
|
+
--stepper-line-height: var(
|
|
274
|
+
--recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_line-height
|
|
275
|
+
);
|
|
276
|
+
--stepper-text-decoration: var(
|
|
277
|
+
--recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_text-decoration
|
|
278
|
+
);
|
|
279
|
+
--stepper-text-transform: var(
|
|
280
|
+
--recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_text-transform
|
|
281
|
+
);
|
|
282
|
+
--stepper-svg-size: var(
|
|
283
|
+
--recursica_ui-kit_components_stepper_variants_sizes_small_properties_completed-icon-size
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/* Core Element Structuring using mapped variables */
|
|
288
|
+
.root .stepBody {
|
|
289
|
+
max-width: var(--stepper-max-text-width);
|
|
290
|
+
display: flex;
|
|
291
|
+
flex-direction: column;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.root .stepLabel {
|
|
295
|
+
font-family: var(
|
|
296
|
+
--recursica_ui-kit_components_stepper_properties_label-text_font-family
|
|
297
|
+
);
|
|
298
|
+
font-size: var(
|
|
299
|
+
--recursica_ui-kit_components_stepper_properties_label-text_font-size
|
|
300
|
+
);
|
|
301
|
+
font-style: var(
|
|
302
|
+
--recursica_ui-kit_components_stepper_properties_label-text_font-style
|
|
303
|
+
);
|
|
304
|
+
font-weight: var(
|
|
305
|
+
--recursica_ui-kit_components_stepper_properties_label-text_font-weight
|
|
306
|
+
);
|
|
307
|
+
letter-spacing: var(
|
|
308
|
+
--recursica_ui-kit_components_stepper_properties_label-text_letter-spacing
|
|
309
|
+
);
|
|
310
|
+
line-height: var(
|
|
311
|
+
--recursica_ui-kit_components_stepper_properties_label-text_line-height
|
|
312
|
+
);
|
|
313
|
+
text-decoration: var(
|
|
314
|
+
--recursica_ui-kit_components_stepper_properties_label-text_text-decoration
|
|
315
|
+
);
|
|
316
|
+
text-transform: var(
|
|
317
|
+
--recursica_ui-kit_components_stepper_properties_label-text_text-transform
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.root .stepDescription {
|
|
322
|
+
font-family: var(
|
|
323
|
+
--recursica_ui-kit_components_stepper_properties_description-text_font-family
|
|
324
|
+
);
|
|
325
|
+
font-size: var(
|
|
326
|
+
--recursica_ui-kit_components_stepper_properties_description-text_font-size
|
|
327
|
+
);
|
|
328
|
+
font-style: var(
|
|
329
|
+
--recursica_ui-kit_components_stepper_properties_description-text_font-style
|
|
330
|
+
);
|
|
331
|
+
font-weight: var(
|
|
332
|
+
--recursica_ui-kit_components_stepper_properties_description-text_font-weight
|
|
333
|
+
);
|
|
334
|
+
letter-spacing: var(
|
|
335
|
+
--recursica_ui-kit_components_stepper_properties_description-text_letter-spacing
|
|
336
|
+
);
|
|
337
|
+
line-height: var(
|
|
338
|
+
--recursica_ui-kit_components_stepper_properties_description-text_line-height
|
|
339
|
+
);
|
|
340
|
+
text-decoration: var(
|
|
341
|
+
--recursica_ui-kit_components_stepper_properties_description-text_text-decoration
|
|
342
|
+
);
|
|
343
|
+
text-transform: var(
|
|
344
|
+
--recursica_ui-kit_components_stepper_properties_description-text_text-transform
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/* `.stepIcon` (MUI's `iconContainer` slot) is a layout host only — it never
|
|
349
|
+
renders the visible circle itself, so it can stretch (vertical) without
|
|
350
|
+
distorting it. The circle is `.stepIconCircle`, rendered by our own
|
|
351
|
+
`RecursicaStepIcon` (see Stepper.tsx). */
|
|
352
|
+
.root .stepIcon {
|
|
353
|
+
display: flex;
|
|
354
|
+
flex-direction: column;
|
|
355
|
+
align-items: center;
|
|
356
|
+
justify-content: flex-start;
|
|
357
|
+
position: relative;
|
|
358
|
+
width: var(--stepper-indicator-size);
|
|
359
|
+
flex-shrink: 0;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
.root .stepIconCircle {
|
|
363
|
+
box-sizing: border-box; /* HARDCODE: keep indicator-size math exact incl. border */
|
|
364
|
+
width: var(--stepper-indicator-size);
|
|
365
|
+
height: var(--stepper-indicator-size);
|
|
366
|
+
min-width: var(--stepper-indicator-size);
|
|
367
|
+
min-height: var(--stepper-indicator-size);
|
|
368
|
+
border-style: solid; /* HARDCODE: plain span has no default border-style */
|
|
369
|
+
border-width: var(--stepper-border-size);
|
|
370
|
+
border-radius: 50%; /* Override Figma token to ensure perfectly circular indicators */
|
|
371
|
+
|
|
372
|
+
font-family: var(--stepper-font-family);
|
|
373
|
+
font-size: var(--stepper-font-size);
|
|
374
|
+
font-style: var(--stepper-font-style);
|
|
375
|
+
font-weight: var(--stepper-font-weight);
|
|
376
|
+
letter-spacing: var(--stepper-letter-spacing);
|
|
377
|
+
line-height: var(--stepper-line-height);
|
|
378
|
+
text-decoration: var(--stepper-text-decoration);
|
|
379
|
+
text-transform: var(--stepper-text-transform);
|
|
380
|
+
|
|
381
|
+
display: flex;
|
|
382
|
+
align-items: center;
|
|
383
|
+
justify-content: center;
|
|
384
|
+
/* Upcoming State (Pending) - Default */
|
|
385
|
+
background-color: var(
|
|
386
|
+
--recursica_ui-kit_components_stepper_properties_colors_upcoming-indicator-background-color
|
|
387
|
+
);
|
|
388
|
+
border-color: var(
|
|
389
|
+
--recursica_ui-kit_components_stepper_properties_colors_upcoming-indicator-border-color
|
|
390
|
+
);
|
|
391
|
+
color: var(
|
|
392
|
+
--recursica_ui-kit_components_stepper_properties_colors_upcoming-indicator-text
|
|
393
|
+
);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/* Completed State */
|
|
397
|
+
.root .stepIconCircle[data-completed] {
|
|
398
|
+
background-color: var(
|
|
399
|
+
--recursica_ui-kit_components_stepper_properties_colors_completed-indicator-background-color
|
|
400
|
+
);
|
|
401
|
+
border-color: var(
|
|
402
|
+
--recursica_ui-kit_components_stepper_properties_colors_completed-indicator-border-color
|
|
403
|
+
);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
.root .stepCompletedIcon {
|
|
407
|
+
width: var(--stepper-svg-size);
|
|
408
|
+
height: var(--stepper-svg-size);
|
|
409
|
+
color: var(
|
|
410
|
+
--recursica_ui-kit_components_stepper_properties_colors_completed-indicator-text
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
.root .stepLabel:global(.Mui-completed) {
|
|
415
|
+
color: var(
|
|
416
|
+
--recursica_ui-kit_components_stepper_properties_colors_completed-label-color
|
|
417
|
+
);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
.root .stepBody:has(.stepLabel:global(.Mui-completed)) .stepDescription {
|
|
421
|
+
color: var(
|
|
422
|
+
--recursica_ui-kit_components_stepper_properties_colors_completed-description-color
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/* Current State (Progressing) */
|
|
427
|
+
.root .stepIconCircle[data-active] {
|
|
428
|
+
background-color: var(
|
|
429
|
+
--recursica_ui-kit_components_stepper_properties_colors_current-indicator-background-color
|
|
430
|
+
);
|
|
431
|
+
border-color: var(
|
|
432
|
+
--recursica_ui-kit_components_stepper_properties_colors_current-indicator-border-color
|
|
433
|
+
);
|
|
434
|
+
color: var(
|
|
435
|
+
--recursica_ui-kit_components_stepper_properties_colors_current-indicator-text
|
|
436
|
+
);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
.root .stepLabel:global(.Mui-active) {
|
|
440
|
+
color: var(
|
|
441
|
+
--recursica_ui-kit_components_stepper_properties_colors_current-label-color
|
|
442
|
+
);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
.root .stepBody:has(.stepLabel:global(.Mui-active)) .stepDescription {
|
|
446
|
+
color: var(
|
|
447
|
+
--recursica_ui-kit_components_stepper_properties_colors_current-description-color
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/* Upcoming State (Pending Labels) */
|
|
452
|
+
.root .stepLabel:not(:global(.Mui-active)):not(:global(.Mui-completed)) {
|
|
453
|
+
color: var(
|
|
454
|
+
--recursica_ui-kit_components_stepper_properties_colors_upcoming-label-color
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.root
|
|
459
|
+
.stepBody:not(:has(.stepLabel:global(.Mui-active))):not(
|
|
460
|
+
:has(.stepLabel:global(.Mui-completed))
|
|
461
|
+
)
|
|
462
|
+
.stepDescription {
|
|
463
|
+
color: var(
|
|
464
|
+
--recursica_ui-kit_components_stepper_properties_colors_upcoming-description-color
|
|
465
|
+
);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/* Hide Content
|
|
469
|
+
Recursica Steppers are purely navigational/structural. Content should be managed
|
|
470
|
+
by the parent layout outside of the Stepper DOM.
|
|
471
|
+
*/
|
|
472
|
+
.root .content {
|
|
473
|
+
display: none;
|
|
474
|
+
}
|