@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,75 @@
|
|
|
1
|
+
# Table — Implementation Notes (Internal)
|
|
2
|
+
|
|
3
|
+
## Background
|
|
4
|
+
|
|
5
|
+
Unlike `mantine-adapter`, this package's `Table.module.css` was an empty stub — none of the
|
|
6
|
+
header/cell/footer/row tokens were wired at all (the "table-header/table-footer/table-cell, 88
|
|
7
|
+
tokens" gap from the 2026-08-21 token-analyzer review). This pass writes that CSS from scratch,
|
|
8
|
+
porting the structure/token references already proven out in `mantine-adapter`'s
|
|
9
|
+
`Table.module.css`, adapted to MUI's DOM and class model.
|
|
10
|
+
|
|
11
|
+
## One `Table.Cell`, not separate header/body/footer components
|
|
12
|
+
|
|
13
|
+
MUI's own `TableCell` is a single primitive for header, body, and footer cells — it auto-detects
|
|
14
|
+
which one it is (and whether to render `<th>` or `<td>`) from its ancestor
|
|
15
|
+
(`Table.Head`/`Table.Body`/`Table.Footer`). Recursica's `Table.Cell` mirrors that instead of
|
|
16
|
+
splitting into per-context components (see the Forge reference-implementation review,
|
|
17
|
+
2026-08-22, and direction from Matt the same day: align with the underlying kit's own
|
|
18
|
+
components). Its props cover both concerns: `sorted` (header-only in practice) and `variant`
|
|
19
|
+
(body/footer). `sorted` has no effect on styling unless the cell also carries the header's
|
|
20
|
+
`data-sorted`-driven CSS (i.e. it's meaningless on a body/footer cell) — nothing prevents a
|
|
21
|
+
caller from passing it there by mistake; that's an accepted tradeoff of unifying the three
|
|
22
|
+
contexts into one component, same tradeoff MUI's own `TableCell` makes.
|
|
23
|
+
|
|
24
|
+
## Every sub-component now attaches its own CSS module class
|
|
25
|
+
|
|
26
|
+
Before this change, `Table.Body`/`Table.Cell`/`Table.Container`/`Table.Head`/`Table.Row`/
|
|
27
|
+
`Table.Footer`/`Table.SortLabel` attached no Recursica class at all — only the root `Table` did.
|
|
28
|
+
`Table.Cell` and `Table.Row` now attach `.cell`/`.row` (needed so the CSS in `Table.module.css`
|
|
29
|
+
can select on state, e.g. `.cell[data-disabled="true"]`, instead of bare `td`/`tr` tag
|
|
30
|
+
selectors). `Table.SortLabel` attaches `.sortLabel` (see below). `Body`/`Container`/`Head`/
|
|
31
|
+
`Footer` were left alone — the CSS only needs to reach them structurally (`thead`/`tbody`/
|
|
32
|
+
`tfoot`), so they don't need a class of their own for this to work.
|
|
33
|
+
|
|
34
|
+
## Sort icon comes from `Table.SortLabel`, not `Table.Cell`
|
|
35
|
+
|
|
36
|
+
MUI already has a sortable-header primitive — `TableSortLabel` — that renders its own
|
|
37
|
+
arrow icon and flips it based on `direction`/`active`. `Table.Cell` only sets the sorted-state
|
|
38
|
+
_styling_ (`data-sorted` → background/text/font tokens, matching `mantine-adapter`'s `Table.Th`);
|
|
39
|
+
the icon itself is `Table.SortLabel`'s job, composed by the consumer the same way MUI's own docs
|
|
40
|
+
demonstrate (`<Table.Cell sorted><Table.SortLabel active direction="asc">Name</Table.SortLabel></Table.Cell>`).
|
|
41
|
+
`Table.module.css` re-colors the icon to `inherit` (overriding MUI's default sort-label color)
|
|
42
|
+
and sizes/spaces it with the same `table-header` icon-size/label-sort-gap tokens
|
|
43
|
+
`mantine-adapter` uses for its own inline chevron — see that adapter's `Table.icons.tsx` for the
|
|
44
|
+
Mantine-side equivalent. This is intentionally asymmetric between the two adapters: Mantine has
|
|
45
|
+
no equivalent primitive, so its `Table.Th` renders the chevron itself.
|
|
46
|
+
|
|
47
|
+
## MUI's own `.Mui-selected` background is reset
|
|
48
|
+
|
|
49
|
+
`Table.Row`'s `selected` prop passes straight through to MUI's native `TableRow.selected` (kept
|
|
50
|
+
for the `aria-selected`/`Mui-selected` semantics it drives) _and_ sets `data-selected`. Found via
|
|
51
|
+
screenshot comparison against `mantine-adapter` (2026-08-22): MUI's own default `.Mui-selected`
|
|
52
|
+
row background was compositing underneath our token-driven `.cell` background (semi-transparent
|
|
53
|
+
`color-mix` over MUI's own tint instead of over nothing), producing a visibly different color
|
|
54
|
+
than Mantine's. `Table.module.css` resets `.row:global(.Mui-selected)` to
|
|
55
|
+
`background-color: transparent` so only the Recursica token color shows — same
|
|
56
|
+
override-the-library's-own-styling rule the canonical guide documents for hover.
|
|
57
|
+
|
|
58
|
+
## Currency alignment on header/footer reuses the table-cell token
|
|
59
|
+
|
|
60
|
+
`--recursica_ui-kit_components_table-cell_properties_currency-style_text-align` (`right`) is the
|
|
61
|
+
only currency-style text-align token the UI Kit exports — there's no
|
|
62
|
+
`table-header_properties_currency-style_*` block at all, and the
|
|
63
|
+
`table-footer_properties_currency-style_*` block skips `text-align` specifically.
|
|
64
|
+
`Table.module.css` reuses the table-cell token for both `thead .cell[data-currency="true"]` and
|
|
65
|
+
`tfoot .cell[data-currency="true"]` so header/footer currency cells stay right-aligned in step
|
|
66
|
+
with the body. `Table.Cell` already threads `variant`/`data-currency` through regardless of
|
|
67
|
+
context, so no `Table.tsx` change was needed here (unlike `mantine-adapter`'s `Table.Th`).
|
|
68
|
+
|
|
69
|
+
## Selectable rows (checkboxes)
|
|
70
|
+
|
|
71
|
+
See `mantine-adapter`'s `TABLE_IMPLEMENTATION_NOTES.md` — confirmed 2026-08-22 that neither
|
|
72
|
+
Mantine's nor MUI's base `Table` has a built-in checkbox-selection feature (MUI's only comes via
|
|
73
|
+
`@mui/x-data-grid`, not installed here). `Table.Row`'s `selected` prop maps directly onto MUI's
|
|
74
|
+
own native `TableRow.selected` (which already sets `aria-selected`/`Mui-selected`) plus a
|
|
75
|
+
`data-selected` attribute so our CSS selectors stay identical in shape to `mantine-adapter`'s.
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
/* Brand-layer exemptions (recursica-allow-brand) — see recursica-token-analyzer README.md.
|
|
2
|
+
* Global hover state tokens (recursica_variables_scoped.css header, 'Hover & Focus states' —
|
|
3
|
+
* implicit rule for every interactive element; components must not define their own
|
|
4
|
+
* per-component hover treatment).
|
|
5
|
+
* recursica-allow-brand: --recursica_brand_states_hover_color
|
|
6
|
+
* recursica-allow-brand: --recursica_brand_states_hover_opacity
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* HARDCODED VALUES:
|
|
10
|
+
* - border-collapse: separate; border-spacing: 0; (To support custom border-radius on table elements)
|
|
11
|
+
* - overflow: hidden; (To prevent content from bleeding outside the rounded table border)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
.root {
|
|
15
|
+
border-collapse: separate;
|
|
16
|
+
border-spacing: 0;
|
|
17
|
+
border-radius: var(
|
|
18
|
+
--recursica_ui-kit_components_table_properties_border-radius
|
|
19
|
+
);
|
|
20
|
+
border: var(--recursica_ui-kit_components_table_properties_border-size) solid
|
|
21
|
+
var(--recursica_ui-kit_components_table_properties_colors_border-color);
|
|
22
|
+
overflow: hidden;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* ==========================================
|
|
26
|
+
1. General Cell Dividers & Padding Defaults
|
|
27
|
+
========================================== */
|
|
28
|
+
|
|
29
|
+
.root .cell {
|
|
30
|
+
padding: var(--recursica_ui-kit_components_table_properties_row-padding)
|
|
31
|
+
var(--recursica_ui-kit_components_table_properties_padding);
|
|
32
|
+
border-bottom: var(
|
|
33
|
+
--recursica_ui-kit_components_table_properties_row-divider-size
|
|
34
|
+
)
|
|
35
|
+
solid
|
|
36
|
+
var(--recursica_ui-kit_components_table_properties_colors_row-divider-color);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.root .cell + .cell {
|
|
40
|
+
border-left: var(
|
|
41
|
+
--recursica_ui-kit_components_table_properties_column-divider-size
|
|
42
|
+
)
|
|
43
|
+
solid
|
|
44
|
+
var(
|
|
45
|
+
--recursica_ui-kit_components_table_properties_colors_column-divider-color
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* ==========================================
|
|
50
|
+
2. Row Highlighting & Selection Styles
|
|
51
|
+
========================================== */
|
|
52
|
+
|
|
53
|
+
/* Striped rows */
|
|
54
|
+
.root tbody .row:nth-of-type(even) .cell {
|
|
55
|
+
background-color: color-mix(
|
|
56
|
+
in srgb,
|
|
57
|
+
var(--recursica_ui-kit_components_table_properties_colors_striped-color)
|
|
58
|
+
calc(
|
|
59
|
+
var(
|
|
60
|
+
--recursica_ui-kit_components_table_properties_opacities_striped-opacity
|
|
61
|
+
) *
|
|
62
|
+
100%
|
|
63
|
+
),
|
|
64
|
+
transparent
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* MUI's TableRow applies its own default background when `selected` — reset it so only the
|
|
69
|
+
token-driven .cell background below shows (kept as a genuine `<tr selected>` for the
|
|
70
|
+
aria-selected/Mui-selected semantics MUI derives from it, just not its default coloring). */
|
|
71
|
+
.root tbody .row:global(.Mui-selected) {
|
|
72
|
+
background-color: transparent;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* Selected rows */
|
|
76
|
+
.root tbody .row[data-selected="true"] .cell {
|
|
77
|
+
background-color: color-mix(
|
|
78
|
+
in srgb,
|
|
79
|
+
var(--recursica_ui-kit_components_table_properties_colors_selected-color)
|
|
80
|
+
calc(
|
|
81
|
+
var(
|
|
82
|
+
--recursica_ui-kit_components_table_properties_opacities_selected-opacity
|
|
83
|
+
) *
|
|
84
|
+
100%
|
|
85
|
+
),
|
|
86
|
+
transparent
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* Hover rows */
|
|
91
|
+
/* Table's dedicated highlight-on-hover token was removed from the schema; hover feedback now
|
|
92
|
+
uses the generic cross-component overlay tokens instead. */
|
|
93
|
+
.root tbody .row:hover .cell {
|
|
94
|
+
background-color: color-mix(
|
|
95
|
+
in srgb,
|
|
96
|
+
var(--recursica_brand_states_hover_color)
|
|
97
|
+
calc(var(--recursica_brand_states_hover_opacity) * 100%),
|
|
98
|
+
transparent
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* ==========================================
|
|
103
|
+
3. Table Headers (th)
|
|
104
|
+
========================================== */
|
|
105
|
+
|
|
106
|
+
.root thead .cell {
|
|
107
|
+
background-color: var(
|
|
108
|
+
--recursica_ui-kit_components_table-header_properties_colors_cell-color
|
|
109
|
+
);
|
|
110
|
+
color: var(
|
|
111
|
+
--recursica_ui-kit_components_table-header_properties_colors_text-color
|
|
112
|
+
);
|
|
113
|
+
padding: var(
|
|
114
|
+
--recursica_ui-kit_components_table-header_properties_padding-vertical
|
|
115
|
+
)
|
|
116
|
+
var(
|
|
117
|
+
--recursica_ui-kit_components_table-header_properties_padding-horizontal
|
|
118
|
+
);
|
|
119
|
+
margin-top: var(
|
|
120
|
+
--recursica_ui-kit_components_table-header_properties_vertical-margin
|
|
121
|
+
);
|
|
122
|
+
margin-bottom: var(
|
|
123
|
+
--recursica_ui-kit_components_table-header_properties_vertical-margin
|
|
124
|
+
);
|
|
125
|
+
border-bottom: var(
|
|
126
|
+
--recursica_ui-kit_components_table-header_properties_horizontal-divider-size
|
|
127
|
+
)
|
|
128
|
+
solid
|
|
129
|
+
var(
|
|
130
|
+
--recursica_ui-kit_components_table-header_properties_colors_horizontal-divider-color
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
/* Unsorted text style by default */
|
|
134
|
+
font-family: var(
|
|
135
|
+
--recursica_ui-kit_components_table-header_properties_unsorted-text-style_font-family
|
|
136
|
+
);
|
|
137
|
+
font-size: var(
|
|
138
|
+
--recursica_ui-kit_components_table-header_properties_unsorted-text-style_font-size
|
|
139
|
+
);
|
|
140
|
+
font-style: var(
|
|
141
|
+
--recursica_ui-kit_components_table-header_properties_unsorted-text-style_font-style
|
|
142
|
+
);
|
|
143
|
+
font-weight: var(
|
|
144
|
+
--recursica_ui-kit_components_table-header_properties_unsorted-text-style_font-weight
|
|
145
|
+
);
|
|
146
|
+
letter-spacing: var(
|
|
147
|
+
--recursica_ui-kit_components_table-header_properties_unsorted-text-style_letter-spacing
|
|
148
|
+
);
|
|
149
|
+
line-height: var(
|
|
150
|
+
--recursica_ui-kit_components_table-header_properties_unsorted-text-style_line-height
|
|
151
|
+
);
|
|
152
|
+
text-decoration: var(
|
|
153
|
+
--recursica_ui-kit_components_table-header_properties_unsorted-text-style_text-decoration
|
|
154
|
+
);
|
|
155
|
+
text-transform: var(
|
|
156
|
+
--recursica_ui-kit_components_table-header_properties_unsorted-text-style_text-transform
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.root thead .cell + .cell {
|
|
161
|
+
border-left: var(
|
|
162
|
+
--recursica_ui-kit_components_table-header_properties_vertical-divider-size
|
|
163
|
+
)
|
|
164
|
+
solid
|
|
165
|
+
var(
|
|
166
|
+
--recursica_ui-kit_components_table-header_properties_colors_vertical-divider-color
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* Unsorted specific state overrides */
|
|
171
|
+
.root thead .cell:not([data-sorted="true"]) {
|
|
172
|
+
background-color: var(
|
|
173
|
+
--recursica_ui-kit_components_table-header_properties_colors_unsorted-cell-color
|
|
174
|
+
);
|
|
175
|
+
color: var(
|
|
176
|
+
--recursica_ui-kit_components_table-header_properties_colors_unsorted-text-color
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* Sorted specific state overrides */
|
|
181
|
+
.root thead .cell[data-sorted="true"] {
|
|
182
|
+
background-color: var(
|
|
183
|
+
--recursica_ui-kit_components_table-header_properties_colors_sorted-cell-color
|
|
184
|
+
);
|
|
185
|
+
color: var(
|
|
186
|
+
--recursica_ui-kit_components_table-header_properties_colors_sorted-text-color
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
font-family: var(
|
|
190
|
+
--recursica_ui-kit_components_table-header_properties_sorted-text-style_font-family
|
|
191
|
+
);
|
|
192
|
+
font-size: var(
|
|
193
|
+
--recursica_ui-kit_components_table-header_properties_sorted-text-style_font-size
|
|
194
|
+
);
|
|
195
|
+
font-style: var(
|
|
196
|
+
--recursica_ui-kit_components_table-header_properties_sorted-text-style_font-style
|
|
197
|
+
);
|
|
198
|
+
font-weight: var(
|
|
199
|
+
--recursica_ui-kit_components_table-header_properties_sorted-text-style_font-weight
|
|
200
|
+
);
|
|
201
|
+
letter-spacing: var(
|
|
202
|
+
--recursica_ui-kit_components_table-header_properties_sorted-text-style_letter-spacing
|
|
203
|
+
);
|
|
204
|
+
line-height: var(
|
|
205
|
+
--recursica_ui-kit_components_table-header_properties_sorted-text-style_line-height
|
|
206
|
+
);
|
|
207
|
+
text-decoration: var(
|
|
208
|
+
--recursica_ui-kit_components_table-header_properties_sorted-text-style_text-decoration
|
|
209
|
+
);
|
|
210
|
+
text-transform: var(
|
|
211
|
+
--recursica_ui-kit_components_table-header_properties_sorted-text-style_text-transform
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/* Disabled Header */
|
|
216
|
+
.root thead .cell[data-disabled="true"] {
|
|
217
|
+
background-color: var(
|
|
218
|
+
--recursica_ui-kit_components_table-header_variants_states_disabled_properties_colors_cell-color
|
|
219
|
+
);
|
|
220
|
+
color: var(
|
|
221
|
+
--recursica_ui-kit_components_table-header_variants_states_disabled_properties_colors_text-color
|
|
222
|
+
);
|
|
223
|
+
opacity: var(
|
|
224
|
+
--recursica_ui-kit_components_table-header_variants_states_disabled_properties_opacity
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/* Currency column header alignment override. No dedicated table-header currency-style token
|
|
229
|
+
exists yet, so this reuses the table-cell currency-style text-align token to match the
|
|
230
|
+
currency value cells below it. */
|
|
231
|
+
.root thead .cell[data-currency="true"] {
|
|
232
|
+
text-align: var(
|
|
233
|
+
--recursica_ui-kit_components_table-cell_properties_currency-style_text-align
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* Sort label — MUI's TableSortLabel renders its own arrow icon; re-color it to inherit the
|
|
238
|
+
cell's own text color (instead of MUI's default sort-label color) and size/space it with the
|
|
239
|
+
same tokens Mantine's own inline chevron uses. */
|
|
240
|
+
.sortLabel {
|
|
241
|
+
color: inherit;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.sortLabel:global(.Mui-active) {
|
|
245
|
+
color: inherit;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.sortLabel :global(.MuiTableSortLabel-icon) {
|
|
249
|
+
width: var(--recursica_ui-kit_components_table-header_properties_icon-size);
|
|
250
|
+
height: var(--recursica_ui-kit_components_table-header_properties_icon-size);
|
|
251
|
+
margin-left: var(
|
|
252
|
+
--recursica_ui-kit_components_table-header_properties_label-sort-gap
|
|
253
|
+
);
|
|
254
|
+
color: inherit;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/* ==========================================
|
|
258
|
+
4. Table Cells (td)
|
|
259
|
+
========================================== */
|
|
260
|
+
|
|
261
|
+
.root tbody .cell {
|
|
262
|
+
background-color: var(
|
|
263
|
+
--recursica_ui-kit_components_table-cell_properties_colors_cell-color
|
|
264
|
+
);
|
|
265
|
+
color: var(
|
|
266
|
+
--recursica_ui-kit_components_table-cell_properties_colors_text-color
|
|
267
|
+
);
|
|
268
|
+
padding: var(
|
|
269
|
+
--recursica_ui-kit_components_table-cell_properties_padding-vertical
|
|
270
|
+
)
|
|
271
|
+
var(--recursica_ui-kit_components_table-cell_properties_padding-horizontal);
|
|
272
|
+
max-width: var(--recursica_ui-kit_components_table-cell_properties_max-width);
|
|
273
|
+
|
|
274
|
+
/* Standard text style */
|
|
275
|
+
font-family: var(
|
|
276
|
+
--recursica_ui-kit_components_table-cell_properties_text-style_font-family
|
|
277
|
+
);
|
|
278
|
+
font-size: var(
|
|
279
|
+
--recursica_ui-kit_components_table-cell_properties_text-style_font-size
|
|
280
|
+
);
|
|
281
|
+
font-style: var(
|
|
282
|
+
--recursica_ui-kit_components_table-cell_properties_text-style_font-style
|
|
283
|
+
);
|
|
284
|
+
font-weight: var(
|
|
285
|
+
--recursica_ui-kit_components_table-cell_properties_text-style_font-weight
|
|
286
|
+
);
|
|
287
|
+
letter-spacing: var(
|
|
288
|
+
--recursica_ui-kit_components_table-cell_properties_text-style_letter-spacing
|
|
289
|
+
);
|
|
290
|
+
line-height: var(
|
|
291
|
+
--recursica_ui-kit_components_table-cell_properties_text-style_line-height
|
|
292
|
+
);
|
|
293
|
+
text-align: var(
|
|
294
|
+
--recursica_ui-kit_components_table-cell_properties_text-style_text-align
|
|
295
|
+
);
|
|
296
|
+
text-decoration: var(
|
|
297
|
+
--recursica_ui-kit_components_table-cell_properties_text-style_text-decoration
|
|
298
|
+
);
|
|
299
|
+
text-transform: var(
|
|
300
|
+
--recursica_ui-kit_components_table-cell_properties_text-style_text-transform
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/* Currency formatted cell layout override */
|
|
305
|
+
.root tbody .cell[data-currency="true"] {
|
|
306
|
+
font-family: var(
|
|
307
|
+
--recursica_ui-kit_components_table-cell_properties_currency-style_font-family
|
|
308
|
+
);
|
|
309
|
+
font-size: var(
|
|
310
|
+
--recursica_ui-kit_components_table-cell_properties_currency-style_font-size
|
|
311
|
+
);
|
|
312
|
+
font-style: var(
|
|
313
|
+
--recursica_ui-kit_components_table-cell_properties_currency-style_font-style
|
|
314
|
+
);
|
|
315
|
+
font-weight: var(
|
|
316
|
+
--recursica_ui-kit_components_table-cell_properties_currency-style_font-weight
|
|
317
|
+
);
|
|
318
|
+
letter-spacing: var(
|
|
319
|
+
--recursica_ui-kit_components_table-cell_properties_currency-style_letter-spacing
|
|
320
|
+
);
|
|
321
|
+
line-height: var(
|
|
322
|
+
--recursica_ui-kit_components_table-cell_properties_currency-style_line-height
|
|
323
|
+
);
|
|
324
|
+
text-align: var(
|
|
325
|
+
--recursica_ui-kit_components_table-cell_properties_currency-style_text-align
|
|
326
|
+
);
|
|
327
|
+
text-decoration: var(
|
|
328
|
+
--recursica_ui-kit_components_table-cell_properties_currency-style_text-decoration
|
|
329
|
+
);
|
|
330
|
+
text-transform: var(
|
|
331
|
+
--recursica_ui-kit_components_table-cell_properties_currency-style_text-transform
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/* Disabled Cells */
|
|
336
|
+
.root tbody .row[data-disabled="true"] .cell,
|
|
337
|
+
.root tbody .cell[data-disabled="true"] {
|
|
338
|
+
background-color: var(
|
|
339
|
+
--recursica_ui-kit_components_table-cell_variants_states_disabled_properties_colors_cell-color
|
|
340
|
+
);
|
|
341
|
+
color: var(
|
|
342
|
+
--recursica_ui-kit_components_table-cell_variants_states_disabled_properties_colors_text-color
|
|
343
|
+
);
|
|
344
|
+
opacity: var(
|
|
345
|
+
--recursica_ui-kit_components_table-cell_variants_states_disabled_properties_opacity
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/* ==========================================
|
|
350
|
+
5. Table Footers (tfoot td)
|
|
351
|
+
========================================== */
|
|
352
|
+
|
|
353
|
+
.root tfoot .cell {
|
|
354
|
+
background-color: var(
|
|
355
|
+
--recursica_ui-kit_components_table-footer_properties_colors_cell-color
|
|
356
|
+
);
|
|
357
|
+
color: var(
|
|
358
|
+
--recursica_ui-kit_components_table-footer_properties_colors_text-color
|
|
359
|
+
);
|
|
360
|
+
padding: var(
|
|
361
|
+
--recursica_ui-kit_components_table-footer_properties_padding-vertical
|
|
362
|
+
)
|
|
363
|
+
var(
|
|
364
|
+
--recursica_ui-kit_components_table-footer_properties_padding-horizontal
|
|
365
|
+
);
|
|
366
|
+
margin-top: var(
|
|
367
|
+
--recursica_ui-kit_components_table-footer_properties_vertical-margin
|
|
368
|
+
);
|
|
369
|
+
margin-bottom: var(
|
|
370
|
+
--recursica_ui-kit_components_table-footer_properties_vertical-margin
|
|
371
|
+
);
|
|
372
|
+
border-top: var(
|
|
373
|
+
--recursica_ui-kit_components_table-footer_properties_horizontal-divider-size
|
|
374
|
+
)
|
|
375
|
+
solid
|
|
376
|
+
var(
|
|
377
|
+
--recursica_ui-kit_components_table-footer_properties_colors_horizontal-divider-color
|
|
378
|
+
);
|
|
379
|
+
|
|
380
|
+
/* Footer typography style */
|
|
381
|
+
font-family: var(
|
|
382
|
+
--recursica_ui-kit_components_table-footer_properties_text-style_font-family
|
|
383
|
+
);
|
|
384
|
+
font-size: var(
|
|
385
|
+
--recursica_ui-kit_components_table-footer_properties_text-style_font-size
|
|
386
|
+
);
|
|
387
|
+
font-style: var(
|
|
388
|
+
--recursica_ui-kit_components_table-footer_properties_text-style_font-style
|
|
389
|
+
);
|
|
390
|
+
font-weight: var(
|
|
391
|
+
--recursica_ui-kit_components_table-footer_properties_text-style_font-weight
|
|
392
|
+
);
|
|
393
|
+
letter-spacing: var(
|
|
394
|
+
--recursica_ui-kit_components_table-footer_properties_text-style_letter-spacing
|
|
395
|
+
);
|
|
396
|
+
line-height: var(
|
|
397
|
+
--recursica_ui-kit_components_table-footer_properties_text-style_line-height
|
|
398
|
+
);
|
|
399
|
+
text-decoration: var(
|
|
400
|
+
--recursica_ui-kit_components_table-footer_properties_text-style_text-decoration
|
|
401
|
+
);
|
|
402
|
+
text-transform: var(
|
|
403
|
+
--recursica_ui-kit_components_table-footer_properties_text-style_text-transform
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
.root tfoot .cell + .cell {
|
|
408
|
+
border-left: var(
|
|
409
|
+
--recursica_ui-kit_components_table-footer_properties_vertical-divider-size
|
|
410
|
+
)
|
|
411
|
+
solid
|
|
412
|
+
var(
|
|
413
|
+
--recursica_ui-kit_components_table-footer_properties_colors_vertical-divider-color
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/* Currency formatted footer cell layout override */
|
|
418
|
+
.root tfoot .cell[data-currency="true"] {
|
|
419
|
+
font-family: var(
|
|
420
|
+
--recursica_ui-kit_components_table-footer_properties_currency-style_font-family
|
|
421
|
+
);
|
|
422
|
+
font-size: var(
|
|
423
|
+
--recursica_ui-kit_components_table-footer_properties_currency-style_font-size
|
|
424
|
+
);
|
|
425
|
+
font-style: var(
|
|
426
|
+
--recursica_ui-kit_components_table-footer_properties_currency-style_font-style
|
|
427
|
+
);
|
|
428
|
+
font-weight: var(
|
|
429
|
+
--recursica_ui-kit_components_table-footer_properties_currency-style_font-weight
|
|
430
|
+
);
|
|
431
|
+
letter-spacing: var(
|
|
432
|
+
--recursica_ui-kit_components_table-footer_properties_currency-style_letter-spacing
|
|
433
|
+
);
|
|
434
|
+
line-height: var(
|
|
435
|
+
--recursica_ui-kit_components_table-footer_properties_currency-style_line-height
|
|
436
|
+
);
|
|
437
|
+
/* No table-footer currency-style text-align token exists yet; reuse the table-cell one so
|
|
438
|
+
footer currency cells match the body's right alignment. */
|
|
439
|
+
text-align: var(
|
|
440
|
+
--recursica_ui-kit_components_table-cell_properties_currency-style_text-align
|
|
441
|
+
);
|
|
442
|
+
text-decoration: var(
|
|
443
|
+
--recursica_ui-kit_components_table-footer_properties_currency-style_text-decoration
|
|
444
|
+
);
|
|
445
|
+
text-transform: var(
|
|
446
|
+
--recursica_ui-kit_components_table-footer_properties_currency-style_text-transform
|
|
447
|
+
);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/* Disabled Footer Row/Cells */
|
|
451
|
+
.root tfoot .row[data-disabled="true"] .cell,
|
|
452
|
+
.root tfoot .cell[data-disabled="true"] {
|
|
453
|
+
background-color: var(
|
|
454
|
+
--recursica_ui-kit_components_table-footer_variants_states_disabled_properties_colors_cell-color
|
|
455
|
+
);
|
|
456
|
+
color: var(
|
|
457
|
+
--recursica_ui-kit_components_table-footer_variants_states_disabled_properties_colors_text-color
|
|
458
|
+
);
|
|
459
|
+
opacity: var(
|
|
460
|
+
--recursica_ui-kit_components_table-footer_variants_states_disabled_properties_opacity
|
|
461
|
+
);
|
|
462
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { Table } from "./Table";
|
|
3
|
+
|
|
4
|
+
const meta: Meta<typeof Table> = {
|
|
5
|
+
title: "UI-Kit/Table",
|
|
6
|
+
component: Table,
|
|
7
|
+
tags: ["autodocs"],
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export default meta;
|
|
11
|
+
|
|
12
|
+
type Story = StoryObj<typeof Table>;
|
|
13
|
+
|
|
14
|
+
const elements = [
|
|
15
|
+
{ position: 6, mass: 12.011, symbol: "C", name: "Carbon" },
|
|
16
|
+
{ position: 7, mass: 14.007, symbol: "N", name: "Nitrogen" },
|
|
17
|
+
{ position: 8, mass: 15.999, symbol: "O", name: "Oxygen" },
|
|
18
|
+
{ position: 9, mass: 18.998, symbol: "F", name: "Fluorine" },
|
|
19
|
+
{ position: 10, mass: 20.18, symbol: "Ne", name: "Neon" },
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
export const Default: Story = {
|
|
23
|
+
render: () => {
|
|
24
|
+
const rows = elements.map((element) => (
|
|
25
|
+
<Table.Row key={element.name}>
|
|
26
|
+
<Table.Cell>{element.position}</Table.Cell>
|
|
27
|
+
<Table.Cell>{element.name}</Table.Cell>
|
|
28
|
+
<Table.Cell>{element.symbol}</Table.Cell>
|
|
29
|
+
<Table.Cell>{element.mass}</Table.Cell>
|
|
30
|
+
</Table.Row>
|
|
31
|
+
));
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<Table.Container>
|
|
35
|
+
<Table>
|
|
36
|
+
<Table.Head>
|
|
37
|
+
<Table.Row>
|
|
38
|
+
<Table.Cell>Element position</Table.Cell>
|
|
39
|
+
<Table.Cell>Element name</Table.Cell>
|
|
40
|
+
<Table.Cell>Symbol</Table.Cell>
|
|
41
|
+
<Table.Cell>Atomic mass</Table.Cell>
|
|
42
|
+
</Table.Row>
|
|
43
|
+
</Table.Head>
|
|
44
|
+
<Table.Body>{rows}</Table.Body>
|
|
45
|
+
</Table>
|
|
46
|
+
</Table.Container>
|
|
47
|
+
);
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export const SortedColumn: Story = {
|
|
52
|
+
render: () => {
|
|
53
|
+
const sorted = [...elements].sort((a, b) => a.mass - b.mass);
|
|
54
|
+
const rows = sorted.map((element) => (
|
|
55
|
+
<Table.Row key={element.name}>
|
|
56
|
+
<Table.Cell>{element.position}</Table.Cell>
|
|
57
|
+
<Table.Cell>{element.name}</Table.Cell>
|
|
58
|
+
<Table.Cell>{element.symbol}</Table.Cell>
|
|
59
|
+
<Table.Cell>{element.mass}</Table.Cell>
|
|
60
|
+
</Table.Row>
|
|
61
|
+
));
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<Table.Container>
|
|
65
|
+
<Table>
|
|
66
|
+
<Table.Head>
|
|
67
|
+
<Table.Row>
|
|
68
|
+
<Table.Cell>Element position</Table.Cell>
|
|
69
|
+
<Table.Cell>Element name</Table.Cell>
|
|
70
|
+
<Table.Cell>Symbol</Table.Cell>
|
|
71
|
+
<Table.Cell sorted="asc">
|
|
72
|
+
<Table.SortLabel active direction="asc">
|
|
73
|
+
Atomic mass
|
|
74
|
+
</Table.SortLabel>
|
|
75
|
+
</Table.Cell>
|
|
76
|
+
</Table.Row>
|
|
77
|
+
</Table.Head>
|
|
78
|
+
<Table.Body>{rows}</Table.Body>
|
|
79
|
+
</Table>
|
|
80
|
+
</Table.Container>
|
|
81
|
+
);
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const SelectedAndDisabledRows: Story = {
|
|
86
|
+
render: () => (
|
|
87
|
+
<Table.Container>
|
|
88
|
+
<Table>
|
|
89
|
+
<Table.Head>
|
|
90
|
+
<Table.Row>
|
|
91
|
+
<Table.Cell>Element position</Table.Cell>
|
|
92
|
+
<Table.Cell>Element name</Table.Cell>
|
|
93
|
+
<Table.Cell>Symbol</Table.Cell>
|
|
94
|
+
<Table.Cell>Atomic mass</Table.Cell>
|
|
95
|
+
</Table.Row>
|
|
96
|
+
</Table.Head>
|
|
97
|
+
<Table.Body>
|
|
98
|
+
{elements.map((element, index) => (
|
|
99
|
+
<Table.Row
|
|
100
|
+
key={element.name}
|
|
101
|
+
selected={index === 0}
|
|
102
|
+
disabled={index === elements.length - 1}
|
|
103
|
+
>
|
|
104
|
+
<Table.Cell>{element.position}</Table.Cell>
|
|
105
|
+
<Table.Cell>{element.name}</Table.Cell>
|
|
106
|
+
<Table.Cell>{element.symbol}</Table.Cell>
|
|
107
|
+
<Table.Cell>{element.mass}</Table.Cell>
|
|
108
|
+
</Table.Row>
|
|
109
|
+
))}
|
|
110
|
+
</Table.Body>
|
|
111
|
+
</Table>
|
|
112
|
+
</Table.Container>
|
|
113
|
+
),
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export const CurrencyColumnWithFooter: Story = {
|
|
117
|
+
render: () => {
|
|
118
|
+
const prices = [
|
|
119
|
+
{ item: "Widget", price: 19.99 },
|
|
120
|
+
{ item: "Gadget", price: 49.5 },
|
|
121
|
+
{ item: "Gizmo", price: 9.25 },
|
|
122
|
+
];
|
|
123
|
+
const total = prices.reduce((sum, row) => sum + row.price, 0);
|
|
124
|
+
|
|
125
|
+
return (
|
|
126
|
+
<Table.Container>
|
|
127
|
+
<Table>
|
|
128
|
+
<Table.Head>
|
|
129
|
+
<Table.Row>
|
|
130
|
+
<Table.Cell>Item</Table.Cell>
|
|
131
|
+
<Table.Cell variant="currency">Price</Table.Cell>
|
|
132
|
+
</Table.Row>
|
|
133
|
+
</Table.Head>
|
|
134
|
+
<Table.Body>
|
|
135
|
+
{prices.map((row) => (
|
|
136
|
+
<Table.Row key={row.item}>
|
|
137
|
+
<Table.Cell>{row.item}</Table.Cell>
|
|
138
|
+
<Table.Cell variant="currency">
|
|
139
|
+
${row.price.toFixed(2)}
|
|
140
|
+
</Table.Cell>
|
|
141
|
+
</Table.Row>
|
|
142
|
+
))}
|
|
143
|
+
</Table.Body>
|
|
144
|
+
<Table.Footer>
|
|
145
|
+
<Table.Row>
|
|
146
|
+
<Table.Cell>Total</Table.Cell>
|
|
147
|
+
<Table.Cell variant="currency">${total.toFixed(2)}</Table.Cell>
|
|
148
|
+
</Table.Row>
|
|
149
|
+
</Table.Footer>
|
|
150
|
+
</Table>
|
|
151
|
+
</Table.Container>
|
|
152
|
+
);
|
|
153
|
+
},
|
|
154
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
// Placeholder for future Table component tests. Add tests here if/when needed.
|