@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,197 @@
|
|
|
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_disabled
|
|
4
|
+
* recursica-allow-brand: --recursica_brand_states_hover_color
|
|
5
|
+
* recursica-allow-brand: --recursica_brand_states_hover_opacity
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
.root {
|
|
9
|
+
display: flex;
|
|
10
|
+
align-items: center;
|
|
11
|
+
gap: var(--recursica_ui-kit_components_pagination_properties_item-gap);
|
|
12
|
+
|
|
13
|
+
/* Mantine's own native Pagination CSS defines `--pagination-control-size` (their
|
|
14
|
+
internal size scale) on the DOM already, which mantine-adapter's `.baseIcon`
|
|
15
|
+
below reads directly. MUI has no equivalent variable, so it's bridged here to
|
|
16
|
+
the same Button height token `.control` itself is sized from, keeping the
|
|
17
|
+
chevron glyphs proportional to the actual rendered circle size. */
|
|
18
|
+
--pagination-control-size: var(
|
|
19
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_height
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.control {
|
|
24
|
+
box-sizing: border-box;
|
|
25
|
+
margin: 0;
|
|
26
|
+
border-style: solid;
|
|
27
|
+
position: relative;
|
|
28
|
+
transition: all 0.2s ease;
|
|
29
|
+
overflow: hidden;
|
|
30
|
+
display: inline-flex;
|
|
31
|
+
align-items: center;
|
|
32
|
+
justify-content: center;
|
|
33
|
+
|
|
34
|
+
/* Typography */
|
|
35
|
+
font-family: var(
|
|
36
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-family
|
|
37
|
+
);
|
|
38
|
+
font-size: var(
|
|
39
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-size
|
|
40
|
+
);
|
|
41
|
+
font-style: var(
|
|
42
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-style
|
|
43
|
+
);
|
|
44
|
+
font-weight: var(
|
|
45
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-weight
|
|
46
|
+
);
|
|
47
|
+
letter-spacing: var(
|
|
48
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_letter-spacing
|
|
49
|
+
);
|
|
50
|
+
line-height: var(
|
|
51
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_line-height
|
|
52
|
+
);
|
|
53
|
+
text-decoration: var(
|
|
54
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_text-decoration
|
|
55
|
+
);
|
|
56
|
+
text-transform: var(
|
|
57
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_text-transform
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
/* Dimensions */
|
|
61
|
+
border-radius: var(
|
|
62
|
+
--recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_default_properties_border-radius
|
|
63
|
+
);
|
|
64
|
+
height: var(
|
|
65
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_height
|
|
66
|
+
);
|
|
67
|
+
min-width: var(
|
|
68
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_min-width
|
|
69
|
+
);
|
|
70
|
+
padding: 0
|
|
71
|
+
var(
|
|
72
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_horizontal-padding
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
/* Base Inactive Style: Outline */
|
|
76
|
+
border-width: var(
|
|
77
|
+
--recursica_ui-kit_components_button_variants_styles_outline_properties_border-size
|
|
78
|
+
);
|
|
79
|
+
box-shadow: var(
|
|
80
|
+
--recursica_ui-kit_components_button_variants_styles_outline_properties_elevation
|
|
81
|
+
);
|
|
82
|
+
background-color: var(
|
|
83
|
+
--recursica_ui-kit_components_button_variants_styles_outline_properties_colors_background-color
|
|
84
|
+
);
|
|
85
|
+
border-color: var(
|
|
86
|
+
--recursica_ui-kit_components_button_variants_styles_outline_properties_colors_border-color
|
|
87
|
+
);
|
|
88
|
+
color: var(
|
|
89
|
+
--recursica_ui-kit_components_button_variants_styles_outline_properties_colors_text-color
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.control:disabled {
|
|
94
|
+
opacity: var(--recursica_brand_states_disabled);
|
|
95
|
+
cursor: not-allowed;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* Hover Overlay: no per-variant hover-color/hover-opacity tokens exist anymore; use the
|
|
99
|
+
generic overlay tokens shared across components (same as Button). */
|
|
100
|
+
.control::after {
|
|
101
|
+
content: "";
|
|
102
|
+
position: absolute;
|
|
103
|
+
inset: 0;
|
|
104
|
+
border-radius: inherit;
|
|
105
|
+
z-index: 0;
|
|
106
|
+
pointer-events: none;
|
|
107
|
+
transition: opacity 150ms ease;
|
|
108
|
+
opacity: 0;
|
|
109
|
+
background-color: var(--recursica_brand_states_hover_color);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.control:hover:not(:disabled)::after {
|
|
113
|
+
opacity: var(--recursica_brand_states_hover_opacity);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/* Active Style: Solid */
|
|
117
|
+
.control[data-active] {
|
|
118
|
+
border-width: var(
|
|
119
|
+
--recursica_ui-kit_components_button_variants_styles_solid_properties_border-size
|
|
120
|
+
);
|
|
121
|
+
box-shadow: var(
|
|
122
|
+
--recursica_ui-kit_components_button_variants_styles_solid_properties_elevation
|
|
123
|
+
);
|
|
124
|
+
background-color: var(
|
|
125
|
+
--recursica_ui-kit_components_button_variants_styles_solid_properties_colors_background-color
|
|
126
|
+
);
|
|
127
|
+
border-color: var(
|
|
128
|
+
--recursica_ui-kit_components_button_variants_styles_solid_properties_colors_border-color
|
|
129
|
+
);
|
|
130
|
+
color: var(
|
|
131
|
+
--recursica_ui-kit_components_button_variants_styles_solid_properties_colors_text-color
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* Navigation Style: Text */
|
|
136
|
+
.control[data-variant="text"] {
|
|
137
|
+
border-width: var(
|
|
138
|
+
--recursica_ui-kit_components_button_variants_styles_text_properties_border-size
|
|
139
|
+
);
|
|
140
|
+
box-shadow: var(
|
|
141
|
+
--recursica_ui-kit_components_button_variants_styles_text_properties_elevation
|
|
142
|
+
);
|
|
143
|
+
background-color: var(
|
|
144
|
+
--recursica_ui-kit_components_button_variants_styles_text_properties_colors_background-color
|
|
145
|
+
);
|
|
146
|
+
border-color: var(
|
|
147
|
+
--recursica_ui-kit_components_button_variants_styles_text_properties_colors_border-color
|
|
148
|
+
);
|
|
149
|
+
color: var(
|
|
150
|
+
--recursica_ui-kit_components_button_variants_styles_text_properties_colors_text-color
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
/* Also explicitly inherit navigation sizes incase they differ from pages */
|
|
154
|
+
border-radius: var(
|
|
155
|
+
--recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_default_properties_border-radius
|
|
156
|
+
);
|
|
157
|
+
height: var(
|
|
158
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_height
|
|
159
|
+
);
|
|
160
|
+
min-width: var(
|
|
161
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_min-width
|
|
162
|
+
);
|
|
163
|
+
padding: 0
|
|
164
|
+
var(
|
|
165
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_horizontal-padding
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* Dots */
|
|
170
|
+
.dots {
|
|
171
|
+
display: inline-flex;
|
|
172
|
+
align-items: center;
|
|
173
|
+
justify-content: center;
|
|
174
|
+
height: var(
|
|
175
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_height
|
|
176
|
+
);
|
|
177
|
+
min-width: var(
|
|
178
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_min-width
|
|
179
|
+
);
|
|
180
|
+
color: var(
|
|
181
|
+
--recursica_ui-kit_components_pagination_properties_colors_dots-color
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/* Icon Styles */
|
|
186
|
+
.iconWithLabel {
|
|
187
|
+
display: flex;
|
|
188
|
+
align-items: center;
|
|
189
|
+
gap: var(
|
|
190
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_icon-text-gap
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.baseIcon {
|
|
195
|
+
width: calc(var(--pagination-control-size) / 1.8);
|
|
196
|
+
height: calc(var(--pagination-control-size) / 1.8);
|
|
197
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { Pagination } from "./Pagination";
|
|
3
|
+
|
|
4
|
+
const meta: Meta<typeof Pagination> = {
|
|
5
|
+
title: "UI-Kit/Pagination",
|
|
6
|
+
component: Pagination,
|
|
7
|
+
tags: ["autodocs"],
|
|
8
|
+
argTypes: {
|
|
9
|
+
total: { control: "number" },
|
|
10
|
+
withEdges: { control: "boolean" },
|
|
11
|
+
withControls: { control: "boolean" },
|
|
12
|
+
disabled: { control: "boolean" },
|
|
13
|
+
withLabels: {
|
|
14
|
+
control: "boolean",
|
|
15
|
+
description: "Toggle text labels alongside icons",
|
|
16
|
+
},
|
|
17
|
+
defaultChecked: { table: { disable: true } },
|
|
18
|
+
},
|
|
19
|
+
args: {
|
|
20
|
+
total: 10,
|
|
21
|
+
withEdges: false,
|
|
22
|
+
withControls: true,
|
|
23
|
+
withLabels: false,
|
|
24
|
+
},
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars
|
|
26
|
+
render: ({ withLayer, layer, ...args }: any) => {
|
|
27
|
+
return <Pagination {...args} />;
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export default meta;
|
|
32
|
+
|
|
33
|
+
type Story = StoryObj<typeof Pagination>;
|
|
34
|
+
|
|
35
|
+
export const Default: Story = {};
|
|
36
|
+
|
|
37
|
+
export const WithEdges: Story = {
|
|
38
|
+
args: {
|
|
39
|
+
withEdges: true,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const WithTextLabels: Story = {
|
|
44
|
+
args: {
|
|
45
|
+
withEdges: true,
|
|
46
|
+
withLabels: true,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
// Placeholder for future Pagination component tests. Add tests here if/when needed.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { forwardRef, type ComponentProps } from "react";
|
|
2
|
+
import {
|
|
3
|
+
Pagination as MuiPagination,
|
|
4
|
+
PaginationItem,
|
|
5
|
+
type PaginationProps as MuiPaginationProps,
|
|
6
|
+
type PaginationRenderItemParams,
|
|
7
|
+
} from "@mui/material";
|
|
8
|
+
import {
|
|
9
|
+
filterStylingProps,
|
|
10
|
+
mergeClassNames,
|
|
11
|
+
type RecursicaOverStyled,
|
|
12
|
+
} from "../../utils/filterStylingProps";
|
|
13
|
+
import styles from "./Pagination.module.css";
|
|
14
|
+
import {
|
|
15
|
+
PaginationIcon,
|
|
16
|
+
NextWithLabel,
|
|
17
|
+
PrevWithLabel,
|
|
18
|
+
FirstWithLabel,
|
|
19
|
+
LastWithLabel,
|
|
20
|
+
} from "./Pagination.icons";
|
|
21
|
+
|
|
22
|
+
import { type RecursicaPaginationProps } from "@recursica/adapter-common";
|
|
23
|
+
|
|
24
|
+
export type PaginationProps = RecursicaOverStyled<
|
|
25
|
+
MuiPaginationProps & RecursicaPaginationProps
|
|
26
|
+
>;
|
|
27
|
+
|
|
28
|
+
function usePaginationClassNames(restRecord: Record<string, unknown>): {
|
|
29
|
+
className: string;
|
|
30
|
+
classNames: Partial<Record<string, string>>;
|
|
31
|
+
} {
|
|
32
|
+
const mergedClassNames = mergeClassNames(
|
|
33
|
+
{ root: styles.root, ul: styles.ul },
|
|
34
|
+
restRecord.classNames as Partial<Record<string, string>> | undefined,
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
const classNameProp = restRecord.className as string | undefined;
|
|
38
|
+
const finalClass = classNameProp
|
|
39
|
+
? `${styles.root} ${classNameProp}`
|
|
40
|
+
: styles.root;
|
|
41
|
+
|
|
42
|
+
return { className: finalClass, classNames: mergedClassNames };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Plain (non-labeled) icon slots — MUI's own default `NavigateBefore`/`NavigateNext`/
|
|
46
|
+
// `FirstPage`/`LastPage` icons never read our tokens, so every nav control is always
|
|
47
|
+
// replaced with our own `PaginationIcon` regardless of `withLabels`.
|
|
48
|
+
const iconSlots = {
|
|
49
|
+
next: (p: ComponentProps<"svg">) => <PaginationIcon {...p} type="next" />,
|
|
50
|
+
previous: (p: ComponentProps<"svg">) => <PaginationIcon {...p} type="prev" />,
|
|
51
|
+
first: (p: ComponentProps<"svg">) => <PaginationIcon {...p} type="first" />,
|
|
52
|
+
last: (p: ComponentProps<"svg">) => <PaginationIcon {...p} type="last" />,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const labeledIconSlots = {
|
|
56
|
+
next: NextWithLabel,
|
|
57
|
+
previous: PrevWithLabel,
|
|
58
|
+
first: FirstWithLabel,
|
|
59
|
+
last: LastWithLabel,
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const _Pagination = forwardRef<HTMLDivElement, PaginationProps>(
|
|
63
|
+
function Pagination(props, ref) {
|
|
64
|
+
const {
|
|
65
|
+
overStyled = false,
|
|
66
|
+
withLabels = false,
|
|
67
|
+
total,
|
|
68
|
+
withEdges,
|
|
69
|
+
withControls,
|
|
70
|
+
...rest
|
|
71
|
+
} = props;
|
|
72
|
+
|
|
73
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
74
|
+
const stylingParams = usePaginationClassNames(
|
|
75
|
+
sanitizedProps as Record<string, unknown>,
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
const renderItem = (item: PaginationRenderItemParams) => {
|
|
79
|
+
if (item.type === "start-ellipsis" || item.type === "end-ellipsis") {
|
|
80
|
+
return <PaginationItem {...item} className={styles.dots} />;
|
|
81
|
+
}
|
|
82
|
+
const isNavigation = item.type !== "page";
|
|
83
|
+
// `disableRipple` is a genuine `ButtonBase` prop `PaginationItemPage` forwards
|
|
84
|
+
// at runtime, but MUI's own `PaginationItem` type declarations don't expose it
|
|
85
|
+
// (same category of MUI type-gap other components in this adapter cast around,
|
|
86
|
+
// e.g. `Card.tsx`/`Radio.tsx`'s `as unknown as MuiXProps`).
|
|
87
|
+
const itemProps: Record<string, unknown> = {
|
|
88
|
+
...item,
|
|
89
|
+
disableRipple: true,
|
|
90
|
+
className: styles.control,
|
|
91
|
+
"data-active": item.selected || undefined,
|
|
92
|
+
"data-variant": isNavigation ? "text" : undefined,
|
|
93
|
+
slots: withLabels ? labeledIconSlots : iconSlots,
|
|
94
|
+
};
|
|
95
|
+
return (
|
|
96
|
+
<PaginationItem
|
|
97
|
+
{...(itemProps as unknown as ComponentProps<typeof PaginationItem>)}
|
|
98
|
+
/>
|
|
99
|
+
);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
return (
|
|
103
|
+
<div ref={ref} className={stylingParams.className}>
|
|
104
|
+
<MuiPagination
|
|
105
|
+
{...(sanitizedProps as MuiPaginationProps)}
|
|
106
|
+
count={total}
|
|
107
|
+
showFirstButton={withEdges}
|
|
108
|
+
showLastButton={withEdges}
|
|
109
|
+
hidePrevButton={withControls === false ? true : undefined}
|
|
110
|
+
hideNextButton={withControls === false ? true : undefined}
|
|
111
|
+
classes={stylingParams.classNames}
|
|
112
|
+
renderItem={renderItem}
|
|
113
|
+
/>
|
|
114
|
+
</div>
|
|
115
|
+
);
|
|
116
|
+
},
|
|
117
|
+
);
|
|
118
|
+
_Pagination.displayName = "Pagination";
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Recursica Pagination component wrapping Mui's Pagination.
|
|
122
|
+
*/
|
|
123
|
+
export const Pagination = _Pagination;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Pagination - Usage Guide
|
|
2
|
+
|
|
3
|
+
This document describes how to integrate and use the `Pagination` component in your projects using `@recursica/adapter-mui-v7`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Import Reference
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { Pagination } from "@recursica/adapter-mui-v7";
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 2. Basic Example
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import React from "react";
|
|
19
|
+
import { Pagination } from "@recursica/adapter-mui-v7";
|
|
20
|
+
|
|
21
|
+
export default function Demo() {
|
|
22
|
+
return <Pagination total={10} value={activePage} onChange={setPage} />;
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 3. Design System Integration
|
|
29
|
+
|
|
30
|
+
All Recursica components in the `@recursica/adapter-mui-v7` package adhere strictly to design system spacing, scaling, and behavior patterns.
|
|
31
|
+
|
|
32
|
+
> [!IMPORTANT]
|
|
33
|
+
>
|
|
34
|
+
> - **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.
|
|
35
|
+
> - **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.
|
|
36
|
+
> - **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 "./Pagination";
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Panel – Implementation Notes
|
|
2
|
+
|
|
3
|
+
Decisions and design tweaks strictly tailored for the UI Kit's Panel wrapped against `@mui/material`. This is a living document that tracks _why_ specific logic decisions exist.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Mapping to MUI Drawer
|
|
8
|
+
|
|
9
|
+
**Decision:** Panel maps to MUI's `Drawer` component, not `Paper` or `Card`.
|
|
10
|
+
|
|
11
|
+
**Implementation:** Per the Recursica design system specification, "Panels slide in or expand from the edge of the screen to reveal additional content or functionality." This is the exact behavior of MUI's `Drawer` component, which provides:
|
|
12
|
+
|
|
13
|
+
- Slide-in animation from any screen edge (using the `anchor` prop)
|
|
14
|
+
- Backdrop/overlay support
|
|
15
|
+
- Focus trap and overlay portal management
|
|
16
|
+
- Internal scroll lock when open
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 2. Token Namespace: `panel`
|
|
21
|
+
|
|
22
|
+
**Decision:** The CSS module exclusively uses variables from the `--recursica_ui-kit_components_panel_*` namespace.
|
|
23
|
+
|
|
24
|
+
**Implementation:** The Recursica token system defines the `panel` namespace covering:
|
|
25
|
+
|
|
26
|
+
- Geometry: border-radius, border-size, min-width (200px), max-width (960px)
|
|
27
|
+
- Content padding: content-horizontal-padding (xl), content-vertical-padding (lg)
|
|
28
|
+
- Header/Footer padding: header-footer-horizontal-padding (xl), header-footer-vertical-padding (md)
|
|
29
|
+
- Spacing: header-close-gap (md), footer-button-gap (md)
|
|
30
|
+
- Divider: divider-size (1px), divider-color
|
|
31
|
+
- Elevation: elevation-3
|
|
32
|
+
- Colors (layer-aware): background, border-color, content, divider-color, header-footer-background, title
|
|
33
|
+
- Non-CSS: header-style ("h3")
|
|
34
|
+
|
|
35
|
+
No tokens from other component namespaces are referenced.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 3. Default Placement Override
|
|
40
|
+
|
|
41
|
+
**Decision:** Use `placement` instead of `position` for configuring slide-out direction, and default it to `"right"`.
|
|
42
|
+
|
|
43
|
+
**Implementation:** The prop was renamed from `position` to `placement` to prevent collision with the CSS `position` keyword, which is strictly blocked by the styling gatekeeper (`BLOCKED_STYLING_KEYS`). This allows configuring the drawer direction natively while maintaining strict design-system boundaries. The `placement="right"` default is mapped internally to MUI Drawer's `anchor` prop before any other sanitized props are applied. Right-side panels are the most common pattern for supplementary content, settings, and detail views.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 4. Custom Panel.Footer
|
|
48
|
+
|
|
49
|
+
**Decision:** A custom `Panel.Footer` sub-component is provided. MUI's Drawer does not have a native footer.
|
|
50
|
+
|
|
51
|
+
**Implementation:** `Panel.Footer` is a `<div>` with styling referencing Recursica CSS variables for:
|
|
52
|
+
|
|
53
|
+
- `header-footer-background` and `header-footer-padding` tokens
|
|
54
|
+
- Top divider using `divider-size` and `divider-color`
|
|
55
|
+
- `footer-button-gap` for action button spacing
|
|
56
|
+
- `margin-top: auto` to push the footer to the bottom
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 5. Visibility Mapping (`opened` -> `open`)
|
|
61
|
+
|
|
62
|
+
**Decision:** Accept `opened` prop to match the standard Recursica component API.
|
|
63
|
+
|
|
64
|
+
**Implementation:** MUI Drawer natively expects the `open` boolean prop. The wrapper maps the incoming framework-agnostic `opened` prop to MUI's `open={Boolean(opened)}`, allowing consistent usage across both adapter implementations.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Panel covered the whole viewport with no header (Matt Massey, 2026-08-30)
|
|
69
|
+
|
|
70
|
+
**Symptom:** `ui-kit-panel--default` rendered as an unstyled white box covering the entire
|
|
71
|
+
viewport (full width and height, no border/radius/shadow, no dark overlay), with no header,
|
|
72
|
+
title, or close button visible at all — not merely off-screen, never rendered.
|
|
73
|
+
|
|
74
|
+
**Root cause:** Two compounding bugs, both from writing this component as if MUI's `Drawer`
|
|
75
|
+
had Mantine's convenience API:
|
|
76
|
+
|
|
77
|
+
1. `classes={{ content, header, title, body, inner }}` — MUI's `Drawer` `classes` prop only
|
|
78
|
+
recognizes its own slot names (`root`, `paper`, `docked`, `paperAnchorRight`, ...). It has no
|
|
79
|
+
`content`/`header`/`title`/`body`/`inner` slots the way Mantine's `classNames` does, so every
|
|
80
|
+
key in that object was silently ignored — none of this file's CSS Module classes were ever
|
|
81
|
+
attached to any DOM node. Confirmed via the rendered Paper's `className`: only MUI's own
|
|
82
|
+
default `MuiPaper-root MuiDrawer-paper MuiDrawer-paperAnchorRight` classes were present.
|
|
83
|
+
2. `title`, `withOverlay`, `withCloseButton` were spread straight through onto `<MuiDrawer>` as
|
|
84
|
+
if it were Mantine's `<Drawer title="..." withCloseButton>`, which builds a Header/Title/
|
|
85
|
+
CloseButton internally from those props. MUI's `Drawer` has no such feature — it only takes
|
|
86
|
+
`children`. `title` landed as a plain HTML `title` (tooltip) attribute on the root div;
|
|
87
|
+
`withOverlay`/`withCloseButton` were dropped entirely (not valid DOM or Drawer props). No
|
|
88
|
+
header ever rendered.
|
|
89
|
+
|
|
90
|
+
Both bugs together meant Paper had zero width/height/border constraints of its own (MUI's
|
|
91
|
+
default temporary-variant Paper only fixes position, not size) and no header to visually anchor
|
|
92
|
+
against — hence "covers the whole viewport."
|
|
93
|
+
|
|
94
|
+
**Fix:** Rebuilt Panel the same way `Modal.tsx` builds its header/body/footer — as real JSX
|
|
95
|
+
children of `<MuiDrawer>`, not through the `classes` prop:
|
|
96
|
+
|
|
97
|
+
- `title`, `withOverlay`, `withCloseButton`, `onClose`, `children` are now destructured and used
|
|
98
|
+
directly: a manually-built `.header` div (title + close `IconButton`, only rendered when
|
|
99
|
+
`title` or `withCloseButton` is set) and `.body` div wrap the real children; `withOverlay`
|
|
100
|
+
maps to MUI's own `hideBackdrop={!withOverlay}`.
|
|
101
|
+
- `classes` now only maps `paper` (MUI's actual slot) to a new `.paper` rule that zeroes out
|
|
102
|
+
Paper's own default background/box-shadow, so the box-model chrome (border, radius, shadow,
|
|
103
|
+
`min-width`/`max-width` bounds) lives entirely on the new `.content` wrapper div rendered
|
|
104
|
+
inside Paper — mirroring where Mantine's own `.content` slot sits (it wraps header/body
|
|
105
|
+
already), just as an explicit element instead of a slot name MUI doesn't have.
|
|
106
|
+
- Added `display: flex` + `justify-content: space-between` to `.header` and a `.close` rule —
|
|
107
|
+
Mantine's own `Drawer.Header` is flex out of the box; this manually-built div needed it
|
|
108
|
+
declared. No dedicated close-button token namespace exists for Panel (Mantine's own Panel
|
|
109
|
+
doesn't style one either — it renders Mantine's plain default `CloseButton`), so `.close` only
|
|
110
|
+
sets `flex-shrink: 0` and reuses a plain `IconButton`.
|
|
111
|
+
- Removed the `.inner { left: 0 }` rule — that was a Mantine-only positioning hack (`Drawer.Inner`
|
|
112
|
+
has no MUI equivalent; MUI's own `paperAnchorLeft`/`paperAnchorRight` classes already position
|
|
113
|
+
Paper correctly).
|
|
114
|
+
|
|
115
|
+
Verified live in Storybook against `@recursica/mantine-adapter`'s Panel for `Default`,
|
|
116
|
+
`LeftPlacement`, `ScrollableContent`, and `LongTitle` — header renders, close button works,
|
|
117
|
+
title truncation and the sticky scrolling footer all behave correctly. Width is now bounded by
|
|
118
|
+
`--recursica_ui-kit_components_panel_properties_min-width`/`max-width` (200–960px) via
|
|
119
|
+
shrink-to-fit, same mechanism as Modal's `.content`; this is narrower/wider than mantine's own
|
|
120
|
+
default rendered width in some stories, because Mantine's Panel CSS (identical file, shared
|
|
121
|
+
copy) never added the `flex: 0 1 auto` override Mantine's own Modal has to make width
|
|
122
|
+
content-driven instead of Mantine's fixed `--drawer-size` default — that's a source-of-truth-side
|
|
123
|
+
gap, out of scope here.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## `.titleTruncate` descender clipping (Matt Massey, 2026-08-28)
|
|
128
|
+
|
|
129
|
+
`.titleTruncate` used plain `overflow: hidden` to make `text-overflow: ellipsis` work, which also
|
|
130
|
+
clips descenders (e.g. the "g" in a long title) whenever `text_line-height` is tighter than the
|
|
131
|
+
font's natural ascent+descent. Switched to `overflow: clip; overflow-clip-margin: 0.35em;` — same
|
|
132
|
+
truncation, but ink can bleed slightly past the line box before it's actually clipped.
|
|
133
|
+
Project-wide fix; see Chip's `CHIP_IMPLEMENTATION_NOTES.md` for the original discovery.
|