@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,231 @@
|
|
|
1
|
+
import React, { forwardRef } from "react";
|
|
2
|
+
import {
|
|
3
|
+
Dialog as MuiDialog,
|
|
4
|
+
type DialogProps as MuiDialogProps,
|
|
5
|
+
DialogTitle as MuiDialogTitle,
|
|
6
|
+
type DialogTitleProps as MuiDialogTitleProps,
|
|
7
|
+
DialogContent as MuiDialogContent,
|
|
8
|
+
type DialogContentProps as MuiDialogContentProps,
|
|
9
|
+
DialogActions as MuiDialogActions,
|
|
10
|
+
type DialogActionsProps as MuiDialogActionsProps,
|
|
11
|
+
IconButton as MuiIconButton,
|
|
12
|
+
} from "@mui/material";
|
|
13
|
+
import {
|
|
14
|
+
filterStylingProps,
|
|
15
|
+
mergeClassNames,
|
|
16
|
+
type RecursicaOverStyled,
|
|
17
|
+
} from "../../utils/filterStylingProps";
|
|
18
|
+
import styles from "./Modal.module.css";
|
|
19
|
+
|
|
20
|
+
// ============================================================
|
|
21
|
+
// MODAL ROOT (Dialog)
|
|
22
|
+
// ============================================================
|
|
23
|
+
|
|
24
|
+
import { type RecursicaModalProps } from "@recursica/adapter-common";
|
|
25
|
+
|
|
26
|
+
export type ModalProps = RecursicaOverStyled<
|
|
27
|
+
Omit<MuiDialogProps, "size" | "radius" | "shadow" | "open"> &
|
|
28
|
+
RecursicaModalProps
|
|
29
|
+
>;
|
|
30
|
+
|
|
31
|
+
const CloseIcon = () => (
|
|
32
|
+
<svg
|
|
33
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
34
|
+
width="20"
|
|
35
|
+
height="20"
|
|
36
|
+
viewBox="0 0 24 24"
|
|
37
|
+
fill="none"
|
|
38
|
+
stroke="currentColor"
|
|
39
|
+
strokeWidth="2"
|
|
40
|
+
strokeLinecap="round"
|
|
41
|
+
strokeLinejoin="round"
|
|
42
|
+
>
|
|
43
|
+
<path d="M18 6L6 18M6 6l12 12" />
|
|
44
|
+
</svg>
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
const ModalRoot = forwardRef<HTMLDivElement, ModalProps>(function ModalRoot(
|
|
48
|
+
{
|
|
49
|
+
overStyled = false,
|
|
50
|
+
opened = false,
|
|
51
|
+
withCloseButton = true,
|
|
52
|
+
title,
|
|
53
|
+
children,
|
|
54
|
+
onClose,
|
|
55
|
+
className,
|
|
56
|
+
...rest
|
|
57
|
+
},
|
|
58
|
+
ref,
|
|
59
|
+
) {
|
|
60
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
61
|
+
|
|
62
|
+
const mergedClassNames = mergeClassNames(
|
|
63
|
+
{ paper: styles.inner },
|
|
64
|
+
(sanitizedProps as Record<string, unknown>).classes as
|
|
65
|
+
| Partial<Record<string, string>>
|
|
66
|
+
| undefined,
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
let footer: React.ReactNode = null;
|
|
70
|
+
const bodyChildren: React.ReactNode[] = [];
|
|
71
|
+
|
|
72
|
+
React.Children.forEach(children, (child) => {
|
|
73
|
+
if (
|
|
74
|
+
React.isValidElement(child) &&
|
|
75
|
+
(child.type === ModalFooter ||
|
|
76
|
+
(child.type as unknown as { displayName?: string })?.displayName ===
|
|
77
|
+
"Modal.Footer")
|
|
78
|
+
) {
|
|
79
|
+
footer = child;
|
|
80
|
+
} else {
|
|
81
|
+
bodyChildren.push(child);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<MuiDialog
|
|
87
|
+
ref={ref}
|
|
88
|
+
{...(sanitizedProps as MuiDialogProps)}
|
|
89
|
+
className={`${styles.root} ${className || ""}`}
|
|
90
|
+
classes={mergedClassNames}
|
|
91
|
+
open={
|
|
92
|
+
opened ||
|
|
93
|
+
((sanitizedProps as Record<string, unknown>).open as boolean) ||
|
|
94
|
+
false
|
|
95
|
+
}
|
|
96
|
+
onClose={onClose}
|
|
97
|
+
>
|
|
98
|
+
{(title || withCloseButton) && (
|
|
99
|
+
<div className={styles.header}>
|
|
100
|
+
{title && <div className={styles.title}>{title}</div>}
|
|
101
|
+
{withCloseButton && (
|
|
102
|
+
<MuiIconButton
|
|
103
|
+
onClick={(e) => onClose?.(e, "backdropClick")}
|
|
104
|
+
className={styles.close}
|
|
105
|
+
>
|
|
106
|
+
<CloseIcon />
|
|
107
|
+
</MuiIconButton>
|
|
108
|
+
)}
|
|
109
|
+
</div>
|
|
110
|
+
)}
|
|
111
|
+
<ModalBody>{bodyChildren}</ModalBody>
|
|
112
|
+
{footer}
|
|
113
|
+
</MuiDialog>
|
|
114
|
+
);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
ModalRoot.displayName = "Modal";
|
|
118
|
+
|
|
119
|
+
// ============================================================
|
|
120
|
+
// MODAL TITLE (DialogTitle)
|
|
121
|
+
// ============================================================
|
|
122
|
+
|
|
123
|
+
export type ModalTitleProps = RecursicaOverStyled<MuiDialogTitleProps>;
|
|
124
|
+
|
|
125
|
+
const ModalTitle = forwardRef<HTMLDivElement, ModalTitleProps>(
|
|
126
|
+
function ModalTitle({ overStyled = false, className, ...rest }, ref) {
|
|
127
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
128
|
+
|
|
129
|
+
return (
|
|
130
|
+
<MuiDialogTitle
|
|
131
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
132
|
+
ref={ref as any}
|
|
133
|
+
{...(sanitizedProps as MuiDialogTitleProps)}
|
|
134
|
+
className={`${styles.title} ${className || ""}`}
|
|
135
|
+
/>
|
|
136
|
+
);
|
|
137
|
+
},
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
ModalTitle.displayName = "Modal.Title";
|
|
141
|
+
|
|
142
|
+
// ============================================================
|
|
143
|
+
// MODAL BODY (DialogContent)
|
|
144
|
+
// ============================================================
|
|
145
|
+
|
|
146
|
+
export type ModalBodyProps = RecursicaOverStyled<MuiDialogContentProps>;
|
|
147
|
+
|
|
148
|
+
const ModalBody = forwardRef<HTMLDivElement, ModalBodyProps>(function ModalBody(
|
|
149
|
+
{ overStyled = false, className, children, ...rest },
|
|
150
|
+
ref,
|
|
151
|
+
) {
|
|
152
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
153
|
+
const internalRef = React.useRef<HTMLDivElement>(null);
|
|
154
|
+
const [scrolledTop, setScrolledTop] = React.useState(false);
|
|
155
|
+
const [scrolledBottom, setScrolledBottom] = React.useState(false);
|
|
156
|
+
|
|
157
|
+
const checkScroll = React.useCallback(() => {
|
|
158
|
+
if (internalRef.current) {
|
|
159
|
+
const { scrollTop, scrollHeight, clientHeight } = internalRef.current;
|
|
160
|
+
setScrolledTop(scrollTop > 0);
|
|
161
|
+
setScrolledBottom(Math.ceil(scrollTop + clientHeight) < scrollHeight);
|
|
162
|
+
}
|
|
163
|
+
}, []);
|
|
164
|
+
|
|
165
|
+
React.useEffect(() => {
|
|
166
|
+
checkScroll();
|
|
167
|
+
window.addEventListener("resize", checkScroll);
|
|
168
|
+
return () => window.removeEventListener("resize", checkScroll);
|
|
169
|
+
}, [checkScroll, children]);
|
|
170
|
+
|
|
171
|
+
return (
|
|
172
|
+
<MuiDialogContent
|
|
173
|
+
ref={(node) => {
|
|
174
|
+
if (typeof ref === "function") ref(node as HTMLDivElement);
|
|
175
|
+
else if (ref)
|
|
176
|
+
(ref as React.MutableRefObject<HTMLDivElement | null>).current =
|
|
177
|
+
node as HTMLDivElement;
|
|
178
|
+
if (internalRef)
|
|
179
|
+
(
|
|
180
|
+
internalRef as React.MutableRefObject<HTMLDivElement | null>
|
|
181
|
+
).current = node as HTMLDivElement;
|
|
182
|
+
}}
|
|
183
|
+
{...(sanitizedProps as MuiDialogContentProps)}
|
|
184
|
+
onScroll={() => checkScroll()}
|
|
185
|
+
data-scrolled-top={scrolledTop || undefined}
|
|
186
|
+
data-scrolled-bottom={scrolledBottom || undefined}
|
|
187
|
+
className={`${styles.content} ${styles.scrollArea} ${className || ""}`}
|
|
188
|
+
>
|
|
189
|
+
{children}
|
|
190
|
+
</MuiDialogContent>
|
|
191
|
+
);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
ModalBody.displayName = "Modal.Body";
|
|
195
|
+
|
|
196
|
+
// ============================================================
|
|
197
|
+
// MODAL FOOTER (DialogActions)
|
|
198
|
+
// ============================================================
|
|
199
|
+
|
|
200
|
+
export type ModalFooterProps = RecursicaOverStyled<MuiDialogActionsProps>;
|
|
201
|
+
|
|
202
|
+
const ModalFooter = forwardRef<HTMLDivElement, ModalFooterProps>(
|
|
203
|
+
function ModalFooter({ overStyled = false, className, ...rest }, ref) {
|
|
204
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
205
|
+
|
|
206
|
+
return (
|
|
207
|
+
<MuiDialogActions
|
|
208
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
209
|
+
ref={ref as any}
|
|
210
|
+
{...(sanitizedProps as MuiDialogActionsProps)}
|
|
211
|
+
className={`${styles.footer} ${className || ""}`}
|
|
212
|
+
/>
|
|
213
|
+
);
|
|
214
|
+
},
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
ModalFooter.displayName = "Modal.Footer";
|
|
218
|
+
|
|
219
|
+
// ============================================================
|
|
220
|
+
// EXPORT COMPOSITION
|
|
221
|
+
// ============================================================
|
|
222
|
+
|
|
223
|
+
export const Modal = ModalRoot as typeof ModalRoot & {
|
|
224
|
+
Title: typeof ModalTitle;
|
|
225
|
+
Body: typeof ModalBody;
|
|
226
|
+
Footer: typeof ModalFooter;
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
Modal.Title = ModalTitle;
|
|
230
|
+
Modal.Body = ModalBody;
|
|
231
|
+
Modal.Footer = ModalFooter;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Modal - Usage Guide
|
|
2
|
+
|
|
3
|
+
This document describes how to integrate and use the `Modal` component in your projects using `@recursica/adapter-mui-v7`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Import Reference
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { Modal } from "@recursica/adapter-mui-v7";
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 2. Basic Example
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import React from "react";
|
|
19
|
+
import { Modal } from "@recursica/adapter-mui-v7";
|
|
20
|
+
|
|
21
|
+
export default function Demo() {
|
|
22
|
+
return (
|
|
23
|
+
<Modal opened={isOpen} onClose={close} title="Modal Title">
|
|
24
|
+
<Text>This is a styled Modal wrapping the native primitive.</Text>
|
|
25
|
+
</Modal>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 3. Design System Integration
|
|
33
|
+
|
|
34
|
+
All Recursica components in the `@recursica/adapter-mui-v7` package adhere strictly to design system spacing, scaling, and behavior patterns.
|
|
35
|
+
|
|
36
|
+
> [!IMPORTANT]
|
|
37
|
+
>
|
|
38
|
+
> - **Anti-override protection**: Rogues style injections (like inline `style` or arbitrary `className`) are automatically blocked by our prop layer unless `overStyled={true}` is explicitly provided.
|
|
39
|
+
> - **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.
|
|
40
|
+
> - **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.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./Modal";
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# NumberInput – implementation notes
|
|
2
|
+
|
|
3
|
+
Decisions and design tweaks specific to the UI Kit's NumberInput wrapped against `@mui/material`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. `InputBase` instead of `TextField` (source-of-truth audit, 2026-08-30)
|
|
8
|
+
|
|
9
|
+
**Decision:** Render the naked field with MUI's `InputBase`, not `TextField`.
|
|
10
|
+
|
|
11
|
+
**Root cause:** The component previously rendered `<TextField>` and passed the CSS-module class
|
|
12
|
+
map (`root`/`input`/`section`/`controls`/`control`) through TextField's own `classes` prop.
|
|
13
|
+
`TextField`'s `classes` type only exposes a single `root` key
|
|
14
|
+
(`@mui/material/TextField/textFieldClasses.d.ts`), and that `root` maps to the outer
|
|
15
|
+
`FormControl` wrapper `TextField` renders around everything — not to the actual `<input>`
|
|
16
|
+
element or its border/background. Every rule in `NumberInput.module.css` scoped to `.input`
|
|
17
|
+
(padding, border-radius, colors, focus box-shadow) or to `.root` (min-height, border, background)
|
|
18
|
+
was therefore never attached to any real DOM node. `TextField`'s default `variant="outlined"`
|
|
19
|
+
also draws its own border via an internal `<fieldset>` (`notchedOutline`) with MUI's own
|
|
20
|
+
default focus/hover treatment, independent of any of our CSS — which is why the focus ring came
|
|
21
|
+
through as MUI's stock primary-color ring instead of the Recursica focus tokens, and why
|
|
22
|
+
border-radius/height/icon-gutter tokens had no visible effect.
|
|
23
|
+
|
|
24
|
+
**Implementation:** Switched to `InputBase`, which supports real `classes.root`/`classes.input`
|
|
25
|
+
slots (`root` = the bordered/backgrounded box InputBase renders around the input + adornments;
|
|
26
|
+
`input` = the actual `<input>` element) — the exact same fix already used by the sibling
|
|
27
|
+
`TextField` (Recursica) component (`src/components/TextField/TextField.tsx`), which this
|
|
28
|
+
implementation now mirrors structurally: border/background/color/font/border-radius moved onto
|
|
29
|
+
`.root`, box geometry (padding) on `.input`, and `.section` (icon/adornment slots) made
|
|
30
|
+
`position: absolute` inset to the root's edges instead of an inline flex sibling, matching how
|
|
31
|
+
Mantine's own `Input.Wrapper` reserves icon-gutter space via `.input`'s dynamic
|
|
32
|
+
`padding-left`/`padding-right` (`--input-left-section-size` / `--input-right-section-size`).
|
|
33
|
+
`data-disabled`/`data-error`/`data-with-left-section`/`data-with-right-section` are now set
|
|
34
|
+
explicitly on `<InputBase>` (previously never set at all, so the `[data-error]`/`[data-disabled]`
|
|
35
|
+
state selectors in the CSS module were dead code too).
|
|
36
|
+
|
|
37
|
+
This one root-cause fix resolves several source-of-truth-audit findings at once:
|
|
38
|
+
|
|
39
|
+
- Focus ring now uses the Recursica focus tokens (was MUI's default blue).
|
|
40
|
+
- `.root`'s border-radius token now actually renders (was invisible; `states` story).
|
|
41
|
+
- `.root`'s min-height token now actually renders, matching Mantine's height exactly instead of
|
|
42
|
+
being taller (`hidden-controls` story) — MUI's own default `TextField` padding/line-height was
|
|
43
|
+
filling the gap our own (unattached) `min-height` was supposed to constrain.
|
|
44
|
+
- Icon-gutter padding (`--input-left-section-size`/`--input-right-section-size`) now actually
|
|
45
|
+
reserves space on `.input`, fixing both the crowded left icon (`with-left-icon`) and the right
|
|
46
|
+
icon sitting further from the edge than Mantine's (`with-right-icon`).
|
|
47
|
+
|
|
48
|
+
**Border-width also switched from a hardcoded `1px` to the existing
|
|
49
|
+
`--recursica_ui-kit_components_number-input_properties_border-size` token** (previously unused
|
|
50
|
+
by this component, in violation of the "no hardcoded sizing" rule — Mantine's own module already
|
|
51
|
+
used it). The per-state `border-size` exemption comments were ported from `mantine-adapter`'s
|
|
52
|
+
`NumberInput.module.css` since disabled/error only ever recolor the border, never resize it.
|
|
53
|
+
|
|
54
|
+
## 2. Icon/adornment section color applies to the whole slot, not just `<svg>` (2026-08-30)
|
|
55
|
+
|
|
56
|
+
**Decision:** `.section[data-position="left"|"right"]` now sets `color` directly, in addition to
|
|
57
|
+
keeping the icon-sizing rule scoped to `:global(svg)`.
|
|
58
|
+
|
|
59
|
+
**Context:** The `with-left-icon`/`with-right-icon` stories pass a plain `<span>$</span>` /
|
|
60
|
+
`<span>%</span>` as the section content, not a real icon component. Mantine's own
|
|
61
|
+
`mantine-Input-section` ships a library-default `color: var(--mantine-color-placeholder)` (a
|
|
62
|
+
generic gray, independent of any Recursica token) that free-rides under any content dropped into
|
|
63
|
+
that slot; our own CSS only ever recolored `:global(svg)` descendants, so plain text fell back to
|
|
64
|
+
inheriting `.root`'s text-color token (near-black) instead. Applying the leading/trailing-icon
|
|
65
|
+
token to the section itself (not just its `<svg>` children) makes any section content —
|
|
66
|
+
icon or plain text — consistently use the Recursica icon-color token.
|
|
67
|
+
|
|
68
|
+
**Caveat (documented, not a further attempt):** The Recursica
|
|
69
|
+
`--recursica_ui-kit_components_number-input_properties_colors_trailing-icon` /
|
|
70
|
+
`_leading-icon` tokens both resolve to `#131313` (near-black) in this token set. Mantine's demo
|
|
71
|
+
stories render a lighter gray only because of the unrelated `--mantine-color-placeholder`
|
|
72
|
+
library default described above — that gray is not backed by any Recursica variable. Since
|
|
73
|
+
hardcoding a copy of Mantine's incidental placeholder-gray would violate the "no hardcoded
|
|
74
|
+
colors" rule, this component now applies the actual token value everywhere a section renders,
|
|
75
|
+
which is the token-correct behavior even though it no longer color-matches Mantine's demo-only
|
|
76
|
+
`<span>` stand-in pixel-for-pixel. If the intent is for real icon color to look lighter than
|
|
77
|
+
`#131313`, that's a token value question for the design system, not an adapter bug.
|
|
78
|
+
|
|
79
|
+
## 3. Numeric-only keystroke filtering (source-of-truth audit, 2026-08-30)
|
|
80
|
+
|
|
81
|
+
**Decision:** Restrict typed/pasted characters to digits, a single decimal point, and (only when
|
|
82
|
+
negative values aren't excluded by `min`) a single leading minus sign.
|
|
83
|
+
|
|
84
|
+
**Root cause:** MUI's `InputBase` has no numeric-parsing behavior built in — unlike Mantine's
|
|
85
|
+
`NumberInput`, which validates/rejects non-numeric characters internally, this component
|
|
86
|
+
previously behaved like a plain text field, silently accepting any input.
|
|
87
|
+
|
|
88
|
+
**Implementation:** `onKeyDown` calls `isAllowedNumericKeystroke` (rejecting anything that isn't
|
|
89
|
+
a digit, a first `-` when `min === undefined || min < 0`, a single `.`, a navigation/editing key,
|
|
90
|
+
or a modifier-held shortcut) before forwarding the event to any caller-supplied `onKeyDown`.
|
|
91
|
+
`onPaste` runs the same allowance against the full pasted string. This is deliberately a
|
|
92
|
+
keystroke gate, not a value-transforming `onChange` wrapper — it never rewrites a caller's
|
|
93
|
+
controlled `value`, only prevents the illegal keystroke from landing in the first place.
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/* Brand-layer exemptions (recursica-allow-brand) — see recursica-token-analyzer README.md.
|
|
2
|
+
* Global hover/focus/disabled state tokens (recursica_variables_scoped.css header, 'Hover & Focus states' / 'Disabled state' — implicit rule for every interactive element; components must not define their own per-component treatment).
|
|
3
|
+
* recursica-allow-brand: --recursica_brand_states_focus_blur
|
|
4
|
+
* recursica-allow-brand: --recursica_brand_states_focus_border-size
|
|
5
|
+
* recursica-allow-brand: --recursica_brand_states_focus_color
|
|
6
|
+
* recursica-allow-brand: --recursica_brand_states_focus_margin
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* LAYOUT SPACING OVERRIDES:
|
|
10
|
+
- Sets the --form-control-margin-bottom spacing hook to map component-specific layout tokens.
|
|
11
|
+
- Also sets the --number-input-control-{max,min}-width hooks consumed inline in NumberInput.tsx,
|
|
12
|
+
since the token schema no longer provides a single layout-agnostic min/max width. */
|
|
13
|
+
.layoutOverride {
|
|
14
|
+
--form-control-margin-bottom: var(
|
|
15
|
+
--recursica_ui-kit_components_number-input_variants_layouts_stacked_properties_top-bottom-margin
|
|
16
|
+
);
|
|
17
|
+
--number-input-control-max-width: var(
|
|
18
|
+
--recursica_ui-kit_components_number-input_variants_layouts_stacked_properties_max-width
|
|
19
|
+
);
|
|
20
|
+
--number-input-control-min-width: var(
|
|
21
|
+
--recursica_ui-kit_components_number-input_variants_layouts_stacked_properties_min-width
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.layoutOverride[data-form-layout="side-by-side"] {
|
|
26
|
+
--form-control-margin-bottom: var(
|
|
27
|
+
--recursica_ui-kit_components_number-input_variants_layouts_side-by-side_properties_top-bottom-margin
|
|
28
|
+
);
|
|
29
|
+
--number-input-control-max-width: var(
|
|
30
|
+
--recursica_ui-kit_components_number-input_variants_layouts_side-by-side_properties_max-width
|
|
31
|
+
);
|
|
32
|
+
--number-input-control-min-width: var(
|
|
33
|
+
--recursica_ui-kit_components_number-input_variants_layouts_side-by-side_properties_min-width
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* HARDCODED VALUES:
|
|
38
|
+
- border-style: solid. Native structural rendering rule.
|
|
39
|
+
- outline: none. Bypassing browser focus rings to rely strictly on Recursica focus states natively.
|
|
40
|
+
- flex/layout: display: flex on the root wrapper safely encapsulating internal section rendering.
|
|
41
|
+
- Controls: Hardcoded to bypass MUI's default borders and backgrounds on the increment/decrement arrows.
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
/* EXEMPTIONS:
|
|
45
|
+
- border-size is constant across disabled/error states — only border-color changes; the
|
|
46
|
+
disabled/error border-size tokens are never applied by design. */
|
|
47
|
+
/* recursica-ignore: --recursica_ui-kit_components_number-input_variants_states_disabled_properties_border-size */
|
|
48
|
+
/* recursica-ignore: --recursica_ui-kit_components_number-input_variants_states_error_properties_border-size */
|
|
49
|
+
|
|
50
|
+
.root {
|
|
51
|
+
display: flex;
|
|
52
|
+
position: relative;
|
|
53
|
+
width: 100%;
|
|
54
|
+
min-height: var(
|
|
55
|
+
--recursica_ui-kit_components_number-input_properties_min-height
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
/* Strict Typography Unification placed on root for MUI InputBase inheritance */
|
|
59
|
+
font-family: var(
|
|
60
|
+
--recursica_ui-kit_components_number-input_properties_text_font-family
|
|
61
|
+
);
|
|
62
|
+
font-size: var(
|
|
63
|
+
--recursica_ui-kit_components_number-input_properties_text_font-size
|
|
64
|
+
);
|
|
65
|
+
font-style: var(
|
|
66
|
+
--recursica_ui-kit_components_number-input_properties_text_font-style
|
|
67
|
+
);
|
|
68
|
+
font-weight: var(
|
|
69
|
+
--recursica_ui-kit_components_number-input_properties_text_font-weight
|
|
70
|
+
);
|
|
71
|
+
letter-spacing: var(
|
|
72
|
+
--recursica_ui-kit_components_number-input_properties_text_letter-spacing
|
|
73
|
+
);
|
|
74
|
+
line-height: var(
|
|
75
|
+
--recursica_ui-kit_components_number-input_properties_text_line-height
|
|
76
|
+
);
|
|
77
|
+
text-decoration: var(
|
|
78
|
+
--recursica_ui-kit_components_number-input_properties_text_text-decoration
|
|
79
|
+
);
|
|
80
|
+
text-transform: var(
|
|
81
|
+
--recursica_ui-kit_components_number-input_properties_text_text-transform
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
/* Box Geometry placed on root so MUI InputBase boundary executes */
|
|
85
|
+
border-radius: var(
|
|
86
|
+
--recursica_ui-kit_components_number-input_properties_border-radius
|
|
87
|
+
);
|
|
88
|
+
border-width: var(
|
|
89
|
+
--recursica_ui-kit_components_number-input_properties_border-size
|
|
90
|
+
);
|
|
91
|
+
border-style: solid;
|
|
92
|
+
|
|
93
|
+
/* Base State Default Execution */
|
|
94
|
+
background-color: var(
|
|
95
|
+
--recursica_ui-kit_components_number-input_properties_colors_background-color
|
|
96
|
+
);
|
|
97
|
+
border-color: var(
|
|
98
|
+
--recursica_ui-kit_components_number-input_properties_colors_border-color
|
|
99
|
+
);
|
|
100
|
+
color: var(
|
|
101
|
+
--recursica_ui-kit_components_number-input_properties_colors_text-color
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
/* Override native Input variables governing section spacing padding mathematics safely */
|
|
105
|
+
--input-left-section-size: calc(
|
|
106
|
+
var(
|
|
107
|
+
--recursica_ui-kit_components_number-input_properties_horizontal-padding
|
|
108
|
+
) +
|
|
109
|
+
var(--recursica_ui-kit_components_number-input_properties_icon-size) +
|
|
110
|
+
var(--recursica_ui-kit_components_number-input_properties_icon-text-gap)
|
|
111
|
+
);
|
|
112
|
+
--input-right-section-size: calc(
|
|
113
|
+
var(
|
|
114
|
+
--recursica_ui-kit_components_number-input_properties_horizontal-padding
|
|
115
|
+
) +
|
|
116
|
+
var(--recursica_ui-kit_components_number-input_properties_icon-size) +
|
|
117
|
+
var(--recursica_ui-kit_components_number-input_properties_icon-text-gap)
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.input {
|
|
122
|
+
/* Structural Overrides */
|
|
123
|
+
width: 100%;
|
|
124
|
+
box-sizing: border-box;
|
|
125
|
+
margin: 0;
|
|
126
|
+
|
|
127
|
+
/* Box Geometry */
|
|
128
|
+
min-height: var(
|
|
129
|
+
--recursica_ui-kit_components_number-input_properties_min-height
|
|
130
|
+
);
|
|
131
|
+
padding-top: var(
|
|
132
|
+
--recursica_ui-kit_components_number-input_properties_vertical-padding
|
|
133
|
+
);
|
|
134
|
+
padding-bottom: var(
|
|
135
|
+
--recursica_ui-kit_components_number-input_properties_vertical-padding
|
|
136
|
+
);
|
|
137
|
+
padding-left: var(
|
|
138
|
+
--recursica_ui-kit_components_number-input_properties_horizontal-padding
|
|
139
|
+
);
|
|
140
|
+
padding-right: var(
|
|
141
|
+
--recursica_ui-kit_components_number-input_properties_horizontal-padding
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
outline: none;
|
|
145
|
+
border: none; /* Because root handles border in MUI */
|
|
146
|
+
background: transparent;
|
|
147
|
+
color: inherit;
|
|
148
|
+
height: auto; /* overrides MUI's 1.1876em */
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.input::placeholder {
|
|
152
|
+
opacity: var(
|
|
153
|
+
--recursica_ui-kit_components_number-input_properties_placeholder-opacity
|
|
154
|
+
);
|
|
155
|
+
color: inherit;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* Dynamic Padding Overrides */
|
|
159
|
+
.root[data-with-left-section="true"] .input {
|
|
160
|
+
padding-left: var(--input-left-section-size);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.root[data-with-right-section="true"] .input {
|
|
164
|
+
padding-right: var(--input-right-section-size);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* Flexible End-Caps (Icons, actions) */
|
|
168
|
+
.section {
|
|
169
|
+
display: flex;
|
|
170
|
+
align-items: center;
|
|
171
|
+
height: 100%;
|
|
172
|
+
position: absolute;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.section[data-position="left"] {
|
|
176
|
+
justify-content: flex-start;
|
|
177
|
+
left: 0;
|
|
178
|
+
padding-left: var(
|
|
179
|
+
--recursica_ui-kit_components_number-input_properties_horizontal-padding
|
|
180
|
+
);
|
|
181
|
+
/* Mantine's native Input.Section slot defaults its own text color to the icon-muted gray
|
|
182
|
+
regardless of whether the slot holds an <svg> or plain text (e.g. a "$"/"%" span) — set it
|
|
183
|
+
here too, not just on :global(svg) below, so non-icon section content matches visually. */
|
|
184
|
+
color: var(
|
|
185
|
+
--recursica_ui-kit_components_number-input_properties_colors_leading-icon
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.section[data-position="right"] {
|
|
190
|
+
justify-content: flex-end;
|
|
191
|
+
right: 0;
|
|
192
|
+
padding-right: var(
|
|
193
|
+
--recursica_ui-kit_components_number-input_properties_horizontal-padding
|
|
194
|
+
);
|
|
195
|
+
color: var(
|
|
196
|
+
--recursica_ui-kit_components_number-input_properties_colors_trailing-icon
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.section :global(svg) {
|
|
201
|
+
width: var(--recursica_ui-kit_components_number-input_properties_icon-size);
|
|
202
|
+
height: var(--recursica_ui-kit_components_number-input_properties_icon-size);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/* -------------------------------------
|
|
206
|
+
CONTROLS (increment/decrement arrows — not currently rendered by this adapter; rules kept
|
|
207
|
+
for structural parity with Mantine's class map and to style them if/when implemented).
|
|
208
|
+
-------------------------------------- */
|
|
209
|
+
|
|
210
|
+
.controls {
|
|
211
|
+
padding-right: var(
|
|
212
|
+
--recursica_ui-kit_components_number-input_properties_horizontal-padding
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.control {
|
|
217
|
+
border: none;
|
|
218
|
+
background: transparent;
|
|
219
|
+
color: var(
|
|
220
|
+
--recursica_ui-kit_components_number-input_properties_colors_trailing-icon
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.control:hover {
|
|
225
|
+
background: transparent;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/* -------------------------------------
|
|
229
|
+
STATE CASCADE ARCHITECTURE
|
|
230
|
+
-------------------------------------- */
|
|
231
|
+
|
|
232
|
+
/* Focus State Mapping (Triggered internally via browser focus rules) */
|
|
233
|
+
/* The token schema no longer provides per-component focus colors; apply the generic focus ring
|
|
234
|
+
tokens as a box-shadow ring instead of a color swap (matches mantine-adapter reference). */
|
|
235
|
+
.root:focus-within,
|
|
236
|
+
.root:focus {
|
|
237
|
+
box-shadow:
|
|
238
|
+
0 0 0 var(--recursica_brand_states_focus_border-size)
|
|
239
|
+
var(--recursica_brand_states_focus_color),
|
|
240
|
+
0 0 var(--recursica_brand_states_focus_blur)
|
|
241
|
+
var(--recursica_brand_states_focus_margin)
|
|
242
|
+
var(--recursica_brand_states_focus_color);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/* Error State Mapping (Propagated strictly down from the wrapper DOM context) */
|
|
246
|
+
.root[data-error="true"] {
|
|
247
|
+
border-color: var(
|
|
248
|
+
--recursica_ui-kit_components_number-input_variants_states_error_properties_colors_border-color
|
|
249
|
+
);
|
|
250
|
+
background-color: var(
|
|
251
|
+
--recursica_ui-kit_components_number-input_variants_states_error_properties_colors_background-color
|
|
252
|
+
);
|
|
253
|
+
color: var(
|
|
254
|
+
--recursica_ui-kit_components_number-input_variants_states_error_properties_colors_text-color
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
.root[data-error="true"] .section[data-position="left"] {
|
|
259
|
+
color: var(
|
|
260
|
+
--recursica_ui-kit_components_number-input_variants_states_error_properties_colors_leading-icon
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.root[data-error="true"] .section[data-position="right"],
|
|
265
|
+
.root[data-error="true"] .control {
|
|
266
|
+
color: var(
|
|
267
|
+
--recursica_ui-kit_components_number-input_variants_states_error_properties_colors_trailing-icon
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/* Disabled State Mapping (Propagated strictly down from the wrapper DOM context) */
|
|
272
|
+
.root[data-disabled="true"] {
|
|
273
|
+
border-color: var(
|
|
274
|
+
--recursica_ui-kit_components_number-input_variants_states_disabled_properties_colors_border-color
|
|
275
|
+
);
|
|
276
|
+
background-color: var(
|
|
277
|
+
--recursica_ui-kit_components_number-input_variants_states_disabled_properties_colors_background-color
|
|
278
|
+
);
|
|
279
|
+
color: var(
|
|
280
|
+
--recursica_ui-kit_components_number-input_variants_states_disabled_properties_colors_text-color
|
|
281
|
+
);
|
|
282
|
+
opacity: var(
|
|
283
|
+
--recursica_ui-kit_components_number-input_variants_states_disabled_properties_opacity
|
|
284
|
+
);
|
|
285
|
+
cursor: not-allowed;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.root[data-disabled="true"] .input {
|
|
289
|
+
cursor: not-allowed;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.root[data-disabled="true"] .section[data-position="left"] {
|
|
293
|
+
color: var(
|
|
294
|
+
--recursica_ui-kit_components_number-input_variants_states_disabled_properties_colors_leading-icon
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
.root[data-disabled="true"] .section[data-position="right"],
|
|
299
|
+
.root[data-disabled="true"] .control {
|
|
300
|
+
color: var(
|
|
301
|
+
--recursica_ui-kit_components_number-input_variants_states_disabled_properties_colors_trailing-icon
|
|
302
|
+
);
|
|
303
|
+
}
|