@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,55 @@
|
|
|
1
|
+
# Slider Implementation Notes
|
|
2
|
+
|
|
3
|
+
This document contains specific design decisions, architectural constraints, and hacks required to bridge the Recursica design system with MUI's underlying `Slider` primitive.
|
|
4
|
+
|
|
5
|
+
## 1. Pointer Clicks Falsely Trigger MUI's `Mui-focusVisible` Ring
|
|
6
|
+
|
|
7
|
+
**Symptom:** Clicking or dragging the thumb showed the keyboard focus ring, which Mantine never shows for a plain mouse interaction.
|
|
8
|
+
|
|
9
|
+
**Root cause:** MUI's `Slider` always programmatically re-focuses its hidden native `<input type="range">` on pointer-down (`focusThumb()` in `useSlider`). Because the focus target (`<input>`) differs from the element the pointer actually interacted with, and because a script-driven `.focus()` call is what browsers use to decide visibility, the native `:focus-visible` heuristic (which MUI's own `isFocusVisible` check relies on) resolves to `true` even for a plain click. Mantine's thumb is a plain `<div tabIndex>` that receives real native focus directly from the click, so the same heuristic correctly resolves to `false` there.
|
|
10
|
+
|
|
11
|
+
**Fix:** `Slider.tsx` tracks pointer-vs-keyboard itself (`onMouseDown` sets a ref, `onFocus` reads it to flag `suppressFocusRing`, `onKeyDown`/`onBlur` clear it — mirroring how real `:focus-visible` re-evaluates on a subsequent keypress). `Slider.module.css` only paints the ring when `[data-suppress-focus-ring="true"]` is absent from `.sliderContainer`.
|
|
12
|
+
|
|
13
|
+
## 2. Disabled Track Stayed Red
|
|
14
|
+
|
|
15
|
+
**Symptom:** Once `disabled` was wired through correctly, the filled track (`.sliderBar`) still rendered the active/red color instead of the disabled grey token.
|
|
16
|
+
|
|
17
|
+
**Root cause:** The base `.sliderBar` rule had `background-color: ... !important`, so the (non-`!important`) `[data-disabled="true"] .sliderBar` override could never win the cascade regardless of source order.
|
|
18
|
+
|
|
19
|
+
**Fix:** Removed the unneeded `!important` flags from the base `.sliderBar` rule — `injectFirst` already makes our CSS-module class beat MUI's native `.MuiSlider-track` via source order alone (same as `.sliderTrack`/`.sliderThumb`/`.sliderMark`, none of which need `!important`).
|
|
20
|
+
|
|
21
|
+
## 3. Assistive Text Rendered as `<div>` Instead of `<span>`
|
|
22
|
+
|
|
23
|
+
**Root cause:** `AssistiveElement.tsx` (adapter-mui-v7) hardcoded a `<div>` around the children text; Mantine's equivalent uses a `<span>`. Not shared via `adapter-common` — each adapter has its own `AssistiveElement`.
|
|
24
|
+
|
|
25
|
+
**Fix:** Changed the inner text wrapper to a `<span>`. No CSS selector depended on the element type (`.text` is a class-only selector and remains a valid flex item as a span).
|
|
26
|
+
|
|
27
|
+
## 4. Mark Label Color
|
|
28
|
+
|
|
29
|
+
**Root cause:** MUI's `.sliderMarkLabel` already inherited the container text color using the min-max-label typography tokens. Mantine's equivalent class (`styles.sliderMarkLabel`) was referenced in `Slider.tsx`'s `classNames` map but was never defined in Mantine's `Slider.module.css`, so Mantine silently fell back to its own default theme grey instead of any recursica token. Fixed in `mantine-adapter` by adding the missing `.sliderMarkLabel` rule (same tokens/inherit-color approach as MUI) rather than copying Mantine's undefined behavior into MUI.
|
|
30
|
+
|
|
31
|
+
## 5. Formatted Current Value, Label Overrides, Trailing Icon
|
|
32
|
+
|
|
33
|
+
**Symptom:** `.currentValue` always rendered the raw numeric value, even when `tooltipLabel` was a formatter function (already used for MUI's own `valueLabelFormat`) — a caller mapping values onto custom text got the formatted tooltip while dragging but the raw number next to the track otherwise. Same bug as `mantine-adapter`.
|
|
34
|
+
|
|
35
|
+
**Fix:** `.currentValue` now runs `resolvedValue` through `tooltipLabel` when it's a function, reusing the same formatter passed to `valueLabelFormat`. Added `minLabel`/`maxLabel` (new `adapter-common` props) to override the `.minMaxGuide` text at either end of the track, and `trailingIcon` (new `adapter-common` prop) to render a second icon opposite the existing `icon`, reusing the same `.iconWrapper` styling.
|
|
36
|
+
|
|
37
|
+
## 6. Dual-Thumb / Range Support
|
|
38
|
+
|
|
39
|
+
**Decision:** Previously requested and declined (see git history for this section) as no use case needed it; reopened with a full spec and implemented. `value`/`defaultValue`/`onChange`/`onChangeEnd` are now typed `number | [number, number]` in `@recursica/adapter-common`'s `RecursicaSliderProps`.
|
|
40
|
+
**Implementation:**
|
|
41
|
+
|
|
42
|
+
- MUI's `Slider` already accepts `number[]` for `value`/`onChange` and renders two thumbs natively, so unlike `mantine-adapter` (which must swap to a separate `RangeSlider` component) this stays the same `<MuiSlider>` — arrays are no longer collapsed to `value[0]`.
|
|
43
|
+
- Internal state (`internalValue`, `resolvedValue`, `inputValue`) generalized from `number` to `number | [number, number]`; range-mode input handlers (`handleLowerInputChange`/`handleUpperInputChange`) clamp each thumb against the other's current value (not the shared `min`/`max`) so the two inputs can't cross.
|
|
44
|
+
- `SliderReadOnlyValue` and the floating `.currentValue` display both render `"lower – upper"` for a range value, running each side through `tooltipLabel` independently (`valueLabelFormat` already handled this per-thumb natively, unchanged).
|
|
45
|
+
- DOM order in range mode (input → leading icon → min label → track → max label → trailing icon → input) mirrors Forge's own Material/Carbon range layouts — see §7 below.
|
|
46
|
+
|
|
47
|
+
## 7. Trailing Icon Order Relative to the Input Field
|
|
48
|
+
|
|
49
|
+
**Decision:** `trailingIcon` previously rendered after the numeric input (`... max label, input, trailing icon`), reversed from Forge's Material/Carbon kits, which always render the trailing icon directly after the max label and before the input.
|
|
50
|
+
**Implementation:** Moved `{trailingIconEl}` before the `showInput` input block in the single-value layout; the range layout was built with this order from the start (input → icon → min label → track → max label → trailing icon → input).
|
|
51
|
+
|
|
52
|
+
## 8. Mark Vertically Off-Center
|
|
53
|
+
|
|
54
|
+
**Decision:** MUI's own mark is `top: 50%; transform: translate(-1px, -50%)` — the `-1px` assumes MUI's built-in 2px dot, the `-50%` is real vertical centering. `.sliderMark` overrode `transform` to `translateX(-50%)` (horizontal-only, meant to mirror the mantine-adapter) without noticing it dropped MUI's vertical `-50%`, leaving the dot hanging below the track's midpoint instead of centered.
|
|
55
|
+
**Implementation:** Changed `.sliderMark`'s transform to `translate(-50%, -50%)` — keeps MUI's vertical centering and swaps the horizontal term to properly center our (non-2px) `step-indicator-width` instead of MUI's hardcoded 1px.
|
|
@@ -0,0 +1,635 @@
|
|
|
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
|
+
/*
|
|
10
|
+
* HARDCODED VALUES:
|
|
11
|
+
* - display: flex; align-items: center; width: 100%; (Standard CSS flexbox layouts for bidirectional components)
|
|
12
|
+
* - flex-grow: 1; flex-shrink: 0; (Layout control structures)
|
|
13
|
+
* - transform: translate(-50%, -50%); on .sliderMark (preserves MUI's own vertical mark
|
|
14
|
+
* centering while re-deriving the horizontal offset for our step-indicator-width token — see
|
|
15
|
+
* .sliderMark below)
|
|
16
|
+
* - transform: translateX(-50%); on .sliderMarkLabel (horizontal-only; matches Mantine's offset
|
|
17
|
+
* mechanism)
|
|
18
|
+
* - outline: none; border-style: solid; (Standard focus reset and border outlines)
|
|
19
|
+
* - Focus ring on thumb/input: the token schema no longer provides per-component focus
|
|
20
|
+
* colors for these (only `active` covers track/step-indicator-color). We apply the generic
|
|
21
|
+
* --recursica_brand_states_focus_* ring tokens (border-size/color/margin/blur) as a box-shadow
|
|
22
|
+
* ring instead of a color swap.
|
|
23
|
+
* - Focus ring on thumb is applied via MUI's own `Mui-focusVisible` class (not native
|
|
24
|
+
* `:focus`/`:focus-visible`, which never match the thumb span — see inline comment).
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/* ==========================================
|
|
28
|
+
1. Baseline, Reset & Layout Overrides
|
|
29
|
+
========================================== */
|
|
30
|
+
|
|
31
|
+
/* Stacked Layout Spacing Override */
|
|
32
|
+
.layoutOverride {
|
|
33
|
+
--form-control-margin-bottom: var(
|
|
34
|
+
--recursica_ui-kit_components_slider_variants_layouts_stacked_properties_top-bottom-margin
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Side-by-Side Layout Spacing Override */
|
|
39
|
+
.layoutOverride[data-form-layout="side-by-side"] {
|
|
40
|
+
--form-control-margin-bottom: var(
|
|
41
|
+
--recursica_ui-kit_components_slider_variants_layouts_side-by-side_properties_top-bottom-margin
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.sliderContainer {
|
|
46
|
+
display: flex;
|
|
47
|
+
align-items: center;
|
|
48
|
+
width: 100%;
|
|
49
|
+
box-sizing: border-box;
|
|
50
|
+
gap: var(--recursica_ui-kit_components_slider_properties_input-gap);
|
|
51
|
+
color: var(--form-field-text-valued);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.sliderTrackWrapper {
|
|
55
|
+
flex-grow: 1;
|
|
56
|
+
display: flex;
|
|
57
|
+
flex-direction: column;
|
|
58
|
+
box-sizing: border-box;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.iconWrapper {
|
|
62
|
+
display: inline-flex;
|
|
63
|
+
align-items: center;
|
|
64
|
+
justify-content: center;
|
|
65
|
+
flex-shrink: 0;
|
|
66
|
+
width: var(--recursica_ui-kit_components_slider_properties_icon-size);
|
|
67
|
+
height: var(--recursica_ui-kit_components_slider_properties_icon-size);
|
|
68
|
+
color: var(--recursica_ui-kit_components_slider_properties_colors_icon-color);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* ==========================================
|
|
72
|
+
2. Slider Tracks, Bars, Thumbs, and Marks
|
|
73
|
+
========================================== */
|
|
74
|
+
|
|
75
|
+
.sliderRoot {
|
|
76
|
+
width: 100%;
|
|
77
|
+
box-sizing: border-box;
|
|
78
|
+
color: inherit;
|
|
79
|
+
font-family: inherit;
|
|
80
|
+
font-size: inherit;
|
|
81
|
+
padding: 0;
|
|
82
|
+
margin: 0;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.sliderTrack {
|
|
86
|
+
height: var(--recursica_ui-kit_components_slider_properties_track-height);
|
|
87
|
+
border-radius: var(
|
|
88
|
+
--recursica_ui-kit_components_slider_properties_track-border-radius
|
|
89
|
+
);
|
|
90
|
+
background-color: var(
|
|
91
|
+
--recursica_ui-kit_components_slider_properties_colors_track
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.sliderBar {
|
|
96
|
+
height: var(--recursica_ui-kit_components_slider_properties_track-height);
|
|
97
|
+
border-radius: var(
|
|
98
|
+
--recursica_ui-kit_components_slider_properties_track-border-radius
|
|
99
|
+
);
|
|
100
|
+
background-color: var(
|
|
101
|
+
--recursica_ui-kit_components_slider_properties_colors_track-active
|
|
102
|
+
);
|
|
103
|
+
border: none;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.sliderThumb {
|
|
107
|
+
box-sizing: border-box;
|
|
108
|
+
width: var(--recursica_ui-kit_components_slider_properties_thumb-size);
|
|
109
|
+
height: var(--recursica_ui-kit_components_slider_properties_thumb-size);
|
|
110
|
+
border-radius: var(
|
|
111
|
+
--recursica_ui-kit_components_slider_properties_thumb-border-radius
|
|
112
|
+
);
|
|
113
|
+
box-shadow: var(
|
|
114
|
+
--recursica_ui-kit_components_slider_properties_thumb-elevation
|
|
115
|
+
);
|
|
116
|
+
background-color: var(
|
|
117
|
+
--recursica_ui-kit_components_slider_properties_colors_thumb
|
|
118
|
+
);
|
|
119
|
+
border: none;
|
|
120
|
+
cursor: pointer;
|
|
121
|
+
outline: none;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.sliderThumb:hover {
|
|
125
|
+
/* Reset MUI's default hover ring (box-shadow) */
|
|
126
|
+
box-shadow: var(
|
|
127
|
+
--recursica_ui-kit_components_slider_properties_thumb-elevation
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/*
|
|
132
|
+
* MUI toggles its own `Mui-focusVisible` class on the thumb (for both keyboard focus and
|
|
133
|
+
* mouse-driven dragging, since MUI's slider routes real DOM focus to a hidden native input,
|
|
134
|
+
* never the visible thumb span) and pairs it with a hardcoded `theme.palette.primary.main`
|
|
135
|
+
* box-shadow ring. Native `:focus`/`:focus-visible` never match the thumb span itself, so we
|
|
136
|
+
* target MUI's own class directly to replace its default-blue ring with the recursica ring.
|
|
137
|
+
*
|
|
138
|
+
* MUI also always programmatically re-focuses that hidden input on pointer interaction, which
|
|
139
|
+
* browsers' `:focus-visible` heuristic treats as keyboard-visible — unlike Mantine's plain div
|
|
140
|
+
* thumb, where a real click correctly resolves to a non-visible focus. `data-suppress-focus-ring`
|
|
141
|
+
* (set in Slider.tsx by tracking pointer-vs-keyboard ourselves) keeps the ring keyboard-only,
|
|
142
|
+
* matching Mantine.
|
|
143
|
+
*/
|
|
144
|
+
.sliderContainer:not([data-suppress-focus-ring="true"])
|
|
145
|
+
.sliderThumb:global(.Mui-focusVisible) {
|
|
146
|
+
outline: none;
|
|
147
|
+
box-shadow:
|
|
148
|
+
var(--recursica_ui-kit_components_slider_properties_thumb-elevation),
|
|
149
|
+
0 0 0 var(--recursica_brand_states_focus_border-size)
|
|
150
|
+
var(--recursica_brand_states_focus_color),
|
|
151
|
+
0 0 var(--recursica_brand_states_focus_blur)
|
|
152
|
+
var(--recursica_brand_states_focus_margin)
|
|
153
|
+
var(--recursica_brand_states_focus_color);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.sliderContainer[data-suppress-focus-ring="true"]
|
|
157
|
+
.sliderThumb:global(.Mui-focusVisible) {
|
|
158
|
+
outline: none;
|
|
159
|
+
box-shadow: var(
|
|
160
|
+
--recursica_ui-kit_components_slider_properties_thumb-elevation
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.sliderMark {
|
|
165
|
+
box-sizing: border-box;
|
|
166
|
+
width: var(
|
|
167
|
+
--recursica_ui-kit_components_slider_properties_step-indicator-width
|
|
168
|
+
);
|
|
169
|
+
height: var(
|
|
170
|
+
--recursica_ui-kit_components_slider_properties_step-indicator-width
|
|
171
|
+
);
|
|
172
|
+
border-radius: var(
|
|
173
|
+
--recursica_ui-kit_components_slider_properties_step-indicator-border-radius
|
|
174
|
+
);
|
|
175
|
+
background-color: var(
|
|
176
|
+
--recursica_ui-kit_components_slider_properties_colors_step-indicator-color
|
|
177
|
+
);
|
|
178
|
+
/* MUI's own mark is `top: 50%; transform: translate(-1px, -50%)` — the -1px assumes its
|
|
179
|
+
built-in 2px-wide dot and the -50% is real vertical centering, not decoration. Overriding
|
|
180
|
+
width/height above without preserving that vertical -50% would leave the dot vertically
|
|
181
|
+
un-centered (it would hang below the track's midpoint); translateX(-50%) alone stomped it.
|
|
182
|
+
translate(-50%, -50%) keeps the vertical centering and swaps the horizontal offset to match
|
|
183
|
+
our (non-2px) step-indicator-width. */
|
|
184
|
+
transform: translate(-50%, -50%);
|
|
185
|
+
border: none;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.sliderMark[data-filled] {
|
|
189
|
+
/* No default-state "-active" step-indicator token exists anymore (only disabled/error define
|
|
190
|
+
one); reusing the active-track color keeps filled marks visually tied to the filled track. */
|
|
191
|
+
background-color: var(
|
|
192
|
+
--recursica_ui-kit_components_slider_properties_colors_track-active
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/*
|
|
197
|
+
* MUI's default markLabel sits ~30-40px below the mark (`top: 30`, `top: 40` under
|
|
198
|
+
* `(pointer: coarse)`) and uses `theme.palette.text.secondary`. Mantine's equivalent label sits
|
|
199
|
+
* right under the mark (a half-step-indicator offset plus a small gap) and has no explicit color,
|
|
200
|
+
* inheriting the container's text color. Reusing the min-max-label typography tokens (the closest
|
|
201
|
+
* existing "small label near the track" token set) and inheriting color keeps this visually
|
|
202
|
+
* consistent with Mantine without a dedicated mark-label token.
|
|
203
|
+
*/
|
|
204
|
+
.sliderMarkLabel {
|
|
205
|
+
top: calc(
|
|
206
|
+
var(--recursica_ui-kit_components_slider_properties_step-indicator-width) /
|
|
207
|
+
2 +
|
|
208
|
+
var(--recursica_ui-kit_globals_form_properties_label-field-gap-vertical)
|
|
209
|
+
);
|
|
210
|
+
transform: translateX(-50%);
|
|
211
|
+
color: inherit;
|
|
212
|
+
|
|
213
|
+
font-family: var(
|
|
214
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_font-family
|
|
215
|
+
);
|
|
216
|
+
font-size: var(
|
|
217
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_font-size
|
|
218
|
+
);
|
|
219
|
+
font-style: var(
|
|
220
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_font-style
|
|
221
|
+
);
|
|
222
|
+
font-weight: var(
|
|
223
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_font-weight
|
|
224
|
+
);
|
|
225
|
+
letter-spacing: var(
|
|
226
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_letter-spacing
|
|
227
|
+
);
|
|
228
|
+
line-height: var(
|
|
229
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_line-height
|
|
230
|
+
);
|
|
231
|
+
text-decoration: var(
|
|
232
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_text-decoration
|
|
233
|
+
);
|
|
234
|
+
text-transform: var(
|
|
235
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_text-transform
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.sliderTooltip {
|
|
240
|
+
background-color: var(--form-field-text-valued) !important;
|
|
241
|
+
color: var(--form-field-background) !important;
|
|
242
|
+
font-size: 12px !important;
|
|
243
|
+
font-weight: 500 !important;
|
|
244
|
+
padding: 4px 8px !important;
|
|
245
|
+
border-radius: 4px !important;
|
|
246
|
+
|
|
247
|
+
/* Reset MUI's default teardrop transform styling */
|
|
248
|
+
transform: translateY(-100%) !important;
|
|
249
|
+
display: flex !important;
|
|
250
|
+
align-items: center !important;
|
|
251
|
+
justify-content: center !important;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.sliderTooltip * {
|
|
255
|
+
/* Prevent MUI's internal rotation hack */
|
|
256
|
+
transform: none !important;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
.sliderTooltip::before {
|
|
260
|
+
/* Hide the default MUI teardrop arrow (if v5 uses before) */
|
|
261
|
+
display: none !important;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/* ==========================================
|
|
265
|
+
3. Min / Max Custom Typography Labels & Floating Active Value
|
|
266
|
+
========================================== */
|
|
267
|
+
|
|
268
|
+
.minMaxGuide {
|
|
269
|
+
font-family: var(
|
|
270
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_font-family
|
|
271
|
+
);
|
|
272
|
+
font-size: var(
|
|
273
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_font-size
|
|
274
|
+
);
|
|
275
|
+
font-style: var(
|
|
276
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_font-style
|
|
277
|
+
);
|
|
278
|
+
font-weight: var(
|
|
279
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_font-weight
|
|
280
|
+
);
|
|
281
|
+
letter-spacing: var(
|
|
282
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_letter-spacing
|
|
283
|
+
);
|
|
284
|
+
line-height: var(
|
|
285
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_line-height
|
|
286
|
+
);
|
|
287
|
+
text-decoration: var(
|
|
288
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_text-decoration
|
|
289
|
+
);
|
|
290
|
+
text-transform: var(
|
|
291
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_text-transform
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/*
|
|
296
|
+
* LAYOUT DECISION: Right-Aligned Floating Current Value Container
|
|
297
|
+
* - Wrapped around the right-side max guide (or icon) as a relative flex context.
|
|
298
|
+
* - This provides the anchor for absolutely positioning the floating current value element
|
|
299
|
+
* above the guide.
|
|
300
|
+
*/
|
|
301
|
+
.rightGuideContainer {
|
|
302
|
+
position: relative;
|
|
303
|
+
display: inline-flex;
|
|
304
|
+
align-items: center;
|
|
305
|
+
justify-content: center;
|
|
306
|
+
flex-shrink: 0;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/*
|
|
310
|
+
* LAYOUT DECISION: Floating Active Value Element
|
|
311
|
+
* - Absolutely positioned directly above the max guide and right-aligned (`right: 0`).
|
|
312
|
+
* - Uses a vertical gap matching the global label-to-component gap variable, ensuring
|
|
313
|
+
* that `.currentValue` is placed in perfect horizontal baseline alignment with the
|
|
314
|
+
* left-aligned form label of the component.
|
|
315
|
+
* - Typography maps back to the slider component's read-only value token definitions.
|
|
316
|
+
* - Inherits the container default/disabled/error text colors naturally.
|
|
317
|
+
*/
|
|
318
|
+
.currentValue {
|
|
319
|
+
position: absolute;
|
|
320
|
+
bottom: calc(
|
|
321
|
+
100% +
|
|
322
|
+
var(--recursica_ui-kit_globals_form_properties_label-field-gap-vertical)
|
|
323
|
+
);
|
|
324
|
+
right: 0;
|
|
325
|
+
white-space: nowrap;
|
|
326
|
+
pointer-events: none;
|
|
327
|
+
display: inline-block;
|
|
328
|
+
width: var(--recursica_ui-kit_components_slider_properties_input-width);
|
|
329
|
+
text-align: right;
|
|
330
|
+
|
|
331
|
+
font-family: var(
|
|
332
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_font-family
|
|
333
|
+
);
|
|
334
|
+
font-size: var(
|
|
335
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_font-size
|
|
336
|
+
);
|
|
337
|
+
font-style: var(
|
|
338
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_font-style
|
|
339
|
+
);
|
|
340
|
+
font-weight: var(
|
|
341
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_font-weight
|
|
342
|
+
);
|
|
343
|
+
letter-spacing: var(
|
|
344
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_letter-spacing
|
|
345
|
+
);
|
|
346
|
+
line-height: var(
|
|
347
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_line-height
|
|
348
|
+
);
|
|
349
|
+
text-decoration: var(
|
|
350
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_text-decoration
|
|
351
|
+
);
|
|
352
|
+
text-transform: var(
|
|
353
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_text-transform
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/* ==========================================
|
|
358
|
+
4. Numeric Input Field
|
|
359
|
+
========================================== */
|
|
360
|
+
|
|
361
|
+
.inputField {
|
|
362
|
+
box-sizing: border-box;
|
|
363
|
+
flex-shrink: 0;
|
|
364
|
+
width: var(--recursica_ui-kit_components_slider_properties_input-width);
|
|
365
|
+
height: var(--recursica_ui-kit_components_slider_properties_input-height);
|
|
366
|
+
border-radius: var(
|
|
367
|
+
--recursica_ui-kit_components_slider_properties_input-border-radius
|
|
368
|
+
);
|
|
369
|
+
border-style: solid;
|
|
370
|
+
border-width: var(
|
|
371
|
+
--recursica_ui-kit_components_slider_properties_input-border-size
|
|
372
|
+
);
|
|
373
|
+
border-color: var(
|
|
374
|
+
--recursica_ui-kit_components_slider_properties_colors_input-border-color
|
|
375
|
+
);
|
|
376
|
+
background-color: var(
|
|
377
|
+
--recursica_ui-kit_components_slider_properties_colors_input-background-color
|
|
378
|
+
);
|
|
379
|
+
color: var(--recursica_ui-kit_components_slider_properties_colors_input-text);
|
|
380
|
+
|
|
381
|
+
font-family: var(
|
|
382
|
+
--recursica_ui-kit_components_slider_properties_input-text_font-family
|
|
383
|
+
);
|
|
384
|
+
font-size: var(
|
|
385
|
+
--recursica_ui-kit_components_slider_properties_input-text_font-size
|
|
386
|
+
);
|
|
387
|
+
font-style: var(
|
|
388
|
+
--recursica_ui-kit_components_slider_properties_input-text_font-style
|
|
389
|
+
);
|
|
390
|
+
font-weight: var(
|
|
391
|
+
--recursica_ui-kit_components_slider_properties_input-text_font-weight
|
|
392
|
+
);
|
|
393
|
+
letter-spacing: var(
|
|
394
|
+
--recursica_ui-kit_components_slider_properties_input-text_letter-spacing
|
|
395
|
+
);
|
|
396
|
+
line-height: var(
|
|
397
|
+
--recursica_ui-kit_components_slider_properties_input-text_line-height
|
|
398
|
+
);
|
|
399
|
+
text-decoration: var(
|
|
400
|
+
--recursica_ui-kit_components_slider_properties_input-text_text-decoration
|
|
401
|
+
);
|
|
402
|
+
text-transform: var(
|
|
403
|
+
--recursica_ui-kit_components_slider_properties_input-text_text-transform
|
|
404
|
+
);
|
|
405
|
+
|
|
406
|
+
padding-left: var(
|
|
407
|
+
--recursica_ui-kit_components_slider_properties_input-padding-left
|
|
408
|
+
);
|
|
409
|
+
padding-right: var(
|
|
410
|
+
--recursica_ui-kit_components_slider_properties_input-padding-right
|
|
411
|
+
);
|
|
412
|
+
padding-top: var(
|
|
413
|
+
--recursica_ui-kit_components_slider_properties_input-padding-vertical
|
|
414
|
+
);
|
|
415
|
+
padding-bottom: var(
|
|
416
|
+
--recursica_ui-kit_components_slider_properties_input-padding-vertical
|
|
417
|
+
);
|
|
418
|
+
text-align: center;
|
|
419
|
+
transition:
|
|
420
|
+
border-color 0.15s ease,
|
|
421
|
+
background-color 0.15s ease;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
.inputField:focus {
|
|
425
|
+
outline: none;
|
|
426
|
+
box-shadow:
|
|
427
|
+
0 0 0 var(--recursica_brand_states_focus_border-size)
|
|
428
|
+
var(--recursica_brand_states_focus_color),
|
|
429
|
+
0 0 var(--recursica_brand_states_focus_blur)
|
|
430
|
+
var(--recursica_brand_states_focus_margin)
|
|
431
|
+
var(--recursica_brand_states_focus_color);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/* Chrome, Safari, Edge, Opera: Hide number spin buttons */
|
|
435
|
+
.inputField::-webkit-outer-spin-button,
|
|
436
|
+
.inputField::-webkit-inner-spin-button {
|
|
437
|
+
-webkit-appearance: none;
|
|
438
|
+
margin: 0;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/* Firefox: Hide number spin buttons */
|
|
442
|
+
.inputField[type="number"] {
|
|
443
|
+
-moz-appearance: textfield;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/* ==========================================
|
|
447
|
+
5. Custom Read-Only Typography Value
|
|
448
|
+
========================================== */
|
|
449
|
+
|
|
450
|
+
.readOnlyValue {
|
|
451
|
+
font-family: var(
|
|
452
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_font-family
|
|
453
|
+
);
|
|
454
|
+
font-size: var(
|
|
455
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_font-size
|
|
456
|
+
);
|
|
457
|
+
font-style: var(
|
|
458
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_font-style
|
|
459
|
+
);
|
|
460
|
+
font-weight: var(
|
|
461
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_font-weight
|
|
462
|
+
);
|
|
463
|
+
letter-spacing: var(
|
|
464
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_letter-spacing
|
|
465
|
+
);
|
|
466
|
+
line-height: var(
|
|
467
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_line-height
|
|
468
|
+
);
|
|
469
|
+
text-decoration: var(
|
|
470
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_text-decoration
|
|
471
|
+
);
|
|
472
|
+
text-transform: var(
|
|
473
|
+
--recursica_ui-kit_components_slider_properties_read-only-value_text-transform
|
|
474
|
+
);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/* ==========================================
|
|
478
|
+
6. State-Specific Overrides (Disabled, Error)
|
|
479
|
+
========================================== */
|
|
480
|
+
|
|
481
|
+
/* Focus states */
|
|
482
|
+
/* The token schema's `active` state (not a separate `focus` state) now covers track/step-indicator
|
|
483
|
+
color while focus is within the slider. Unlike Mantine (whose unfilled track is painted by an
|
|
484
|
+
internal `::before` layer that this rule never actually reaches), MUI's rail element is styled
|
|
485
|
+
directly by `.sliderTrack`, so applying the active-track color here visibly repaints the rail a
|
|
486
|
+
different color for the whole duration of a drag. There is no design requirement for the rail to
|
|
487
|
+
change color while dragging, so the track is intentionally left out of this rule; only the
|
|
488
|
+
step-indicator (mark) is included, matching the token schema's remaining active-state coverage. */
|
|
489
|
+
.sliderRoot:has(.sliderThumb:focus) .sliderMark,
|
|
490
|
+
.sliderRoot:focus-within .sliderMark {
|
|
491
|
+
background-color: var(
|
|
492
|
+
--recursica_ui-kit_components_slider_variants_states_active_properties_colors_step-indicator-color
|
|
493
|
+
);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/* Disabled state */
|
|
497
|
+
.sliderContainer[data-disabled="true"] .iconWrapper {
|
|
498
|
+
color: var(
|
|
499
|
+
--recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_icon-color
|
|
500
|
+
);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
.sliderContainer[data-disabled="true"] .sliderTrack {
|
|
504
|
+
background-color: var(
|
|
505
|
+
--recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_track
|
|
506
|
+
);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
.sliderContainer[data-disabled="true"] .sliderBar {
|
|
510
|
+
background-color: var(
|
|
511
|
+
--recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_track-active
|
|
512
|
+
);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
.sliderContainer[data-disabled="true"] .sliderThumb {
|
|
516
|
+
background-color: var(
|
|
517
|
+
--recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_thumb
|
|
518
|
+
);
|
|
519
|
+
cursor: not-allowed;
|
|
520
|
+
box-shadow: none;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
.sliderContainer[data-disabled="true"] .sliderMark {
|
|
524
|
+
background-color: var(
|
|
525
|
+
--recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_step-indicator-color
|
|
526
|
+
);
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
.sliderContainer[data-disabled="true"] .sliderMark[data-filled] {
|
|
530
|
+
background-color: var(
|
|
531
|
+
--recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_step-indicator-color-active
|
|
532
|
+
);
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
.sliderContainer[data-disabled="true"] {
|
|
536
|
+
color: var(--form-field-disabled-text);
|
|
537
|
+
opacity: var(
|
|
538
|
+
--recursica_ui-kit_components_slider_variants_states_disabled_properties_opacity
|
|
539
|
+
);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
.inputField:disabled {
|
|
543
|
+
cursor: not-allowed;
|
|
544
|
+
background-color: var(
|
|
545
|
+
--recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_input-background-color
|
|
546
|
+
);
|
|
547
|
+
border-color: var(
|
|
548
|
+
--recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_input-border-color
|
|
549
|
+
);
|
|
550
|
+
color: var(
|
|
551
|
+
--recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_input-text
|
|
552
|
+
);
|
|
553
|
+
border-width: var(
|
|
554
|
+
--recursica_ui-kit_components_slider_variants_states_disabled_properties_input-border-size
|
|
555
|
+
);
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
/* Error state */
|
|
559
|
+
.sliderContainer[data-error="true"] .iconWrapper {
|
|
560
|
+
color: var(
|
|
561
|
+
--recursica_ui-kit_components_slider_variants_states_error_properties_colors_icon-color
|
|
562
|
+
);
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
.sliderContainer[data-error="true"] .sliderTrack {
|
|
566
|
+
background-color: var(
|
|
567
|
+
--recursica_ui-kit_components_slider_variants_states_error_properties_colors_track
|
|
568
|
+
);
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
.sliderContainer[data-error="true"] .sliderBar {
|
|
572
|
+
background-color: var(
|
|
573
|
+
--recursica_ui-kit_components_slider_variants_states_error_properties_colors_track-active
|
|
574
|
+
);
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
.sliderContainer[data-error="true"] .sliderThumb {
|
|
578
|
+
background-color: var(
|
|
579
|
+
--recursica_ui-kit_components_slider_variants_states_error_properties_colors_thumb
|
|
580
|
+
);
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
.sliderContainer[data-error="true"] .sliderMark {
|
|
584
|
+
background-color: var(
|
|
585
|
+
--recursica_ui-kit_components_slider_variants_states_error_properties_colors_step-indicator-color
|
|
586
|
+
);
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
.sliderContainer[data-error="true"] .sliderMark[data-filled] {
|
|
590
|
+
background-color: var(
|
|
591
|
+
--recursica_ui-kit_components_slider_variants_states_error_properties_colors_step-indicator-color-active
|
|
592
|
+
);
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
.inputField[data-error="true"] {
|
|
596
|
+
background-color: var(
|
|
597
|
+
--recursica_ui-kit_components_slider_variants_states_error_properties_colors_input-background-color
|
|
598
|
+
);
|
|
599
|
+
border-color: var(
|
|
600
|
+
--recursica_ui-kit_components_slider_variants_states_error_properties_colors_input-border-color
|
|
601
|
+
);
|
|
602
|
+
color: var(
|
|
603
|
+
--recursica_ui-kit_components_slider_variants_states_error_properties_colors_input-text
|
|
604
|
+
);
|
|
605
|
+
border-width: var(
|
|
606
|
+
--recursica_ui-kit_components_slider_variants_states_error_properties_input-border-size
|
|
607
|
+
);
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
/* ==========================================
|
|
611
|
+
7. Side-by-Side Layout Overrides
|
|
612
|
+
========================================== */
|
|
613
|
+
|
|
614
|
+
.sliderContainer[data-form-layout="side-by-side"] .rightGuideContainer {
|
|
615
|
+
position: relative;
|
|
616
|
+
display: inline-flex;
|
|
617
|
+
flex-direction: row;
|
|
618
|
+
align-items: center;
|
|
619
|
+
justify-content: flex-end;
|
|
620
|
+
flex-shrink: 0;
|
|
621
|
+
gap: var(--recursica_ui-kit_components_slider_properties_input-gap);
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
.sliderContainer[data-form-layout="side-by-side"] .currentValue {
|
|
625
|
+
position: static;
|
|
626
|
+
white-space: nowrap;
|
|
627
|
+
pointer-events: none;
|
|
628
|
+
order: 2; /* Positioned to the right of the max label */
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
.sliderContainer[data-form-layout="side-by-side"]
|
|
632
|
+
.rightGuideContainer
|
|
633
|
+
.minMaxGuide {
|
|
634
|
+
order: 1; /* Positioned to the left of the current value */
|
|
635
|
+
}
|