@recursica/adapter-mantine-v8 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 +688 -0
- package/LICENSE +21 -0
- package/OVERSTYLING.md +56 -0
- package/README.md +70 -0
- package/SETUP.md +93 -0
- package/USAGE.md +57 -0
- package/dist/adapter-mantine-v8.cjs +12 -0
- package/dist/adapter-mantine-v8.cjs.map +1 -0
- package/dist/adapter-mantine-v8.css +1 -0
- package/dist/adapter-mantine-v8.js +5759 -0
- package/dist/adapter-mantine-v8.js.map +1 -0
- package/dist/index.d.ts +2095 -0
- package/dist/test.html +1 -0
- package/dist/vite.svg +1 -0
- package/docs/PHILOSOPHY.md +39 -0
- package/llms.txt +74 -0
- package/package.json +131 -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 +154 -0
- package/src/OverStyling.tsx +79 -0
- package/src/Version.tsx +44 -0
- package/src/components/Accordion/ACCORDION_IMPLEMENTATION_NOTES.md +72 -0
- package/src/components/Accordion/Accordion.module.css +367 -0
- package/src/components/Accordion/Accordion.stories.tsx +189 -0
- package/src/components/Accordion/Accordion.test.tsx +1 -0
- package/src/components/Accordion/Accordion.tsx +220 -0
- package/src/components/Accordion/USAGE.md +51 -0
- package/src/components/Accordion/index.ts +1 -0
- package/src/components/AssistiveElement/ASSISTIVEELEMENT_IMPLEMENTATION_NOTES.md +45 -0
- package/src/components/AssistiveElement/AssistiveElement.module.css +111 -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 +93 -0
- package/src/components/AssistiveElement/USAGE.md +36 -0
- package/src/components/AutoComplete/AUTOCOMPLETE_IMPLEMENTATION_NOTES.md +42 -0
- package/src/components/AutoComplete/AutoComplete.module.css +430 -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 +179 -0
- package/src/components/AutoComplete/USAGE.md +80 -0
- package/src/components/Avatar/AVATAR_IMPLEMENTATION_NOTES.md +34 -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 +108 -0
- package/src/components/Avatar/USAGE.md +38 -0
- package/src/components/Avatar/index.ts +1 -0
- package/src/components/Badge/BADGE_IMPLEMENTATION_NOTES.md +18 -0
- package/src/components/Badge/Badge.module.css +127 -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 +64 -0
- package/src/components/Badge/USAGE.md +56 -0
- package/src/components/Breadcrumb/BREADCRUMB_IMPLEMENTATION_NOTES.md +47 -0
- package/src/components/Breadcrumb/Breadcrumb.module.css +48 -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 +85 -0
- package/src/components/Breadcrumb/USAGE.md +55 -0
- package/src/components/Breadcrumb/markCurrentPageItem.test.ts +49 -0
- package/src/components/Button/Button.module.css +446 -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 +184 -0
- package/src/components/Button/IMPLEMENTATION_NOTES.md +109 -0
- package/src/components/Button/USAGE.md +80 -0
- package/src/components/Button/index.ts +1 -0
- package/src/components/Card/CARD_IMPLEMENTATION_NOTES.md +17 -0
- package/src/components/Card/Card.module.css +119 -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 +248 -0
- package/src/components/Card/USAGE.md +63 -0
- package/src/components/Checkbox/CHECKBOX_IMPLEMENTATION_NOTES.md +25 -0
- package/src/components/Checkbox/Checkbox.module.css +267 -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 +151 -0
- package/src/components/Checkbox/CheckboxGroup.stories.tsx +139 -0
- package/src/components/Checkbox/CheckboxGroup.tsx +147 -0
- package/src/components/Checkbox/USAGE.md +48 -0
- package/src/components/Chip/CHIP_IMPLEMENTATION_NOTES.md +110 -0
- package/src/components/Chip/Chip.module.css +288 -0
- package/src/components/Chip/Chip.stories.tsx +128 -0
- package/src/components/Chip/Chip.test.tsx +1 -0
- package/src/components/Chip/Chip.tsx +157 -0
- package/src/components/Chip/USAGE.md +55 -0
- package/src/components/Container/CONTAINER_IMPLEMENTATION_NOTES.md +4 -0
- package/src/components/Container/Container.module.css +7 -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 +69 -0
- package/src/components/Container/USAGE.md +47 -0
- package/src/components/DatePicker/DATEPICKER_IMPLEMENTATION_NOTES.md +31 -0
- package/src/components/DatePicker/DatePicker.icons.tsx +27 -0
- package/src/components/DatePicker/DatePicker.module.css +566 -0
- package/src/components/DatePicker/DatePicker.stories.tsx +158 -0
- package/src/components/DatePicker/DatePicker.test.tsx +1 -0
- package/src/components/DatePicker/DatePicker.tsx +218 -0
- package/src/components/DatePicker/USAGE.md +49 -0
- package/src/components/Dropdown/BareDropdown.tsx +97 -0
- package/src/components/Dropdown/DROPDOWN_IMPLEMENTATION_NOTES.md +12 -0
- package/src/components/Dropdown/Dropdown.module.css +477 -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 +213 -0
- package/src/components/Dropdown/USAGE.md +69 -0
- package/src/components/FileInput/FILEINPUT_IMPLEMENTATION_NOTES.md +153 -0
- package/src/components/FileInput/FileInput.module.css +280 -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 +417 -0
- package/src/components/FileInput/USAGE.md +145 -0
- package/src/components/FileUpload/FILEUPLOAD_IMPLEMENTATION_NOTES.md +244 -0
- package/src/components/FileUpload/FileUpload.module.css +205 -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 +354 -0
- package/src/components/FileUpload/USAGE.md +199 -0
- package/src/components/Flex/FLEX_IMPLEMENTATION_NOTES.md +4 -0
- package/src/components/Flex/Flex.module.css +7 -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 +75 -0
- package/src/components/Flex/USAGE.md +48 -0
- package/src/components/FormControlLayout/FormControlLayout.module.css +90 -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 +74 -0
- package/src/components/FormControlLayout/USAGE.md +40 -0
- package/src/components/FormControlWrapper/FORMCONTROLWRAPPER_IMPLEMENTATION_NOTES.md +32 -0
- package/src/components/FormControlWrapper/FormControlWrapper.module.css +75 -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 +151 -0
- package/src/components/FormControlWrapper/USAGE.md +47 -0
- package/src/components/Grid/GRID_IMPLEMENTATION_NOTES.md +18 -0
- package/src/components/Grid/Grid.module.css +11 -0
- package/src/components/Grid/Grid.stories.tsx +206 -0
- package/src/components/Grid/Grid.test.tsx +1 -0
- package/src/components/Grid/Grid.tsx +140 -0
- package/src/components/Grid/USAGE.md +47 -0
- package/src/components/Group/GROUP_IMPLEMENTATION_NOTES.md +4 -0
- package/src/components/Group/Group.module.css +7 -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 +60 -0
- package/src/components/Group/USAGE.md +48 -0
- package/src/components/Heading/HEADING_IMPLEMENTATION_NOTES.md +18 -0
- package/src/components/Heading/Heading.module.css +13 -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 +52 -0
- package/src/components/Heading/USAGE.md +36 -0
- package/src/components/HoverCard/HOVERCARD_IMPLEMENTATION_NOTES.md +77 -0
- package/src/components/HoverCard/HoverCard.module.css +90 -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 +133 -0
- package/src/components/HoverCard/USAGE.md +52 -0
- package/src/components/Label/LABEL_IMPLEMENTATION_NOTES.md +48 -0
- package/src/components/Label/Label.module.css +141 -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 +113 -0
- package/src/components/Label/USAGE.md +47 -0
- package/src/components/Label/index.ts +1 -0
- package/src/components/Layer/USAGE.md +54 -0
- package/src/components/Link/IMPLEMENTATION_NOTES.md +19 -0
- package/src/components/Link/Link.module.css +110 -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 +67 -0
- package/src/components/Link/USAGE.md +56 -0
- package/src/components/Link/index.ts +1 -0
- package/src/components/Loader/LOADER_IMPLEMENTATION_NOTES.md +24 -0
- package/src/components/Loader/Loader.animate.dom.test.tsx +82 -0
- package/src/components/Loader/Loader.module.css +63 -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 +69 -0
- package/src/components/Loader/USAGE.md +44 -0
- package/src/components/Menu/MENU_IMPLEMENTATION_NOTES.md +88 -0
- package/src/components/Menu/Menu.module.css +280 -0
- package/src/components/Menu/Menu.stories.tsx +371 -0
- package/src/components/Menu/Menu.test.tsx +1 -0
- package/src/components/Menu/Menu.tsx +373 -0
- package/src/components/Menu/USAGE.md +55 -0
- package/src/components/Modal/MODAL_IMPLEMENTATION_NOTES.md +32 -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 +368 -0
- package/src/components/Modal/USAGE.md +58 -0
- package/src/components/Modal/index.ts +1 -0
- package/src/components/NumberInput/NUMBER_INPUT_IMPLEMENTATION_NOTES.md +24 -0
- package/src/components/NumberInput/NumberInput.module.css +302 -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 +157 -0
- package/src/components/NumberInput/USAGE.md +52 -0
- package/src/components/Pagination/IMPLEMENTATION_NOTES.md +16 -0
- package/src/components/Pagination/Pagination.icons.tsx +66 -0
- package/src/components/Pagination/Pagination.module.css +188 -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 +265 -0
- package/src/components/Pagination/USAGE.md +36 -0
- package/src/components/Pagination/index.ts +5 -0
- package/src/components/Panel/PANEL_IMPLEMENTATION_NOTES.md +116 -0
- package/src/components/Panel/Panel.module.css +209 -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 +269 -0
- package/src/components/Panel/USAGE.md +56 -0
- package/src/components/Popover/IMPLEMENTATION_NOTES.md +77 -0
- package/src/components/Popover/Popover.module.css +86 -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 +142 -0
- package/src/components/Popover/USAGE.md +61 -0
- package/src/components/Popover/index.ts +1 -0
- package/src/components/Radio/Radio.module.css +231 -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 +168 -0
- package/src/components/Radio/RadioGroup.stories.tsx +117 -0
- package/src/components/Radio/RadioGroup.tsx +124 -0
- package/src/components/Radio/USAGE.md +36 -0
- package/src/components/ReadOnlyField/READ_ONLY_FIELD_IMPLEMENTATION_NOTES.md +15 -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 +114 -0
- package/src/components/ReadOnlyField/ReadOnlySwitchField.tsx +21 -0
- package/src/components/ReadOnlyField/ReadOnlyTextField.tsx +48 -0
- package/src/components/ReadOnlyField/USAGE.md +44 -0
- package/src/components/ReadOnlyField/WithReadOnlyWrapper.tsx +93 -0
- package/src/components/ReadOnlyField/index.ts +5 -0
- package/src/components/RecursicaThemeProvider/USAGE.md +60 -0
- package/src/components/SegmentedControl/IMPLEMENTATION_NOTES.md +25 -0
- package/src/components/SegmentedControl/SegmentedControl.module.css +185 -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 +110 -0
- package/src/components/SegmentedControl/USAGE.md +55 -0
- package/src/components/Slider/IMPLEMENTATION_NOTES.md +92 -0
- package/src/components/Slider/Slider.module.css +588 -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 +391 -0
- package/src/components/Slider/USAGE.md +56 -0
- package/src/components/Stack/STACK_IMPLEMENTATION_NOTES.md +4 -0
- package/src/components/Stack/Stack.module.css +7 -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 +62 -0
- package/src/components/Stack/USAGE.md +48 -0
- package/src/components/Stepper/IMPLEMENTATION_NOTES.md +28 -0
- package/src/components/Stepper/Stepper.module.css +404 -0
- package/src/components/Stepper/Stepper.stories.tsx +148 -0
- package/src/components/Stepper/Stepper.test.tsx +1 -0
- package/src/components/Stepper/Stepper.tsx +93 -0
- package/src/components/Stepper/USAGE.md +41 -0
- package/src/components/Switch/SWITCH_IMPLEMENTATION_NOTES.md +64 -0
- package/src/components/Switch/Switch.module.css +279 -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 +177 -0
- package/src/components/Switch/SwitchGroup.stories.tsx +132 -0
- package/src/components/Switch/SwitchGroup.tsx +127 -0
- package/src/components/Switch/USAGE.md +42 -0
- package/src/components/Table/TABLE_IMPLEMENTATION_NOTES.md +78 -0
- package/src/components/Table/Table.icons.tsx +40 -0
- package/src/components/Table/Table.module.css +444 -0
- package/src/components/Table/Table.stories.tsx +140 -0
- package/src/components/Table/Table.test.tsx +1 -0
- package/src/components/Table/Table.tsx +243 -0
- package/src/components/Table/USAGE.md +78 -0
- package/src/components/Tabs/IMPLEMENTATION_NOTES.md +27 -0
- package/src/components/Tabs/Tabs.module.css +591 -0
- package/src/components/Tabs/Tabs.stories.tsx +154 -0
- package/src/components/Tabs/Tabs.test.tsx +1 -0
- package/src/components/Tabs/Tabs.tsx +114 -0
- package/src/components/Tabs/USAGE.md +45 -0
- package/src/components/Text/TEXT_IMPLEMENTATION_NOTES.md +12 -0
- package/src/components/Text/Text.module.css +13 -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 +53 -0
- package/src/components/Text/USAGE.md +40 -0
- package/src/components/TextArea/TEXTAREA_IMPLEMENTATION_NOTES.md +7 -0
- package/src/components/TextArea/TextArea.module.css +183 -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 +137 -0
- package/src/components/TextArea/USAGE.md +48 -0
- package/src/components/TextField/TEXTFIELD_IMPLEMENTATION_NOTES.md +19 -0
- package/src/components/TextField/TextField.module.css +264 -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 +139 -0
- package/src/components/TextField/USAGE.md +44 -0
- package/src/components/TimePicker/TIMEPICKER_IMPLEMENTATION_NOTES.md +119 -0
- package/src/components/TimePicker/TimePicker.module.css +291 -0
- package/src/components/TimePicker/TimePicker.stories.tsx +141 -0
- package/src/components/TimePicker/TimePicker.test.tsx +1 -0
- package/src/components/TimePicker/TimePicker.tsx +304 -0
- package/src/components/TimePicker/USAGE.md +57 -0
- package/src/components/Timeline/TIMELINE_IMPLEMENTATION_NOTES.md +13 -0
- package/src/components/Timeline/Timeline.module.css +373 -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 +73 -0
- package/src/components/Timeline/TimelineItem.tsx +79 -0
- package/src/components/Timeline/USAGE.md +49 -0
- package/src/components/Toast/TOAST_IMPLEMENTATION_NOTES.md +39 -0
- package/src/components/Toast/Toast.module.css +184 -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 +82 -0
- package/src/components/Toast/USAGE.md +50 -0
- package/src/components/Toast/index.ts +1 -0
- package/src/components/Tooltip/TOOLTIP_IMPLEMENTATION_NOTES.md +85 -0
- package/src/components/Tooltip/Tooltip.module.css +91 -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 +117 -0
- package/src/components/Tooltip/USAGE.md +80 -0
- package/src/components/TransferList/TRANSFERLIST_IMPLEMENTATION_NOTES.md +111 -0
- package/src/components/TransferList/TransferList.module.css +182 -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/Tree/IMPLEMENTATION_NOTES.md +48 -0
- package/src/components/Tree/Tree.module.css +232 -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 +220 -0
- package/src/components/Tree/USAGE.md +96 -0
- package/src/components/Tree/index.ts +1 -0
- package/src/components/index.ts +52 -0
- package/src/env.d.ts +7 -0
- package/src/index.ts +179 -0
- package/src/types/index.ts +9 -0
- package/src/types/mantine.d.ts +7 -0
- package/src/types/scss-modules.d.ts +9 -0
- package/src/utils/ColorSchemeWrapper.tsx +27 -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 +150 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/renderRichOption.tsx +65 -0
|
@@ -0,0 +1,188 @@
|
|
|
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
|
+
|
|
14
|
+
.control {
|
|
15
|
+
box-sizing: border-box;
|
|
16
|
+
margin: 0;
|
|
17
|
+
border-style: solid;
|
|
18
|
+
position: relative;
|
|
19
|
+
transition: all 0.2s ease;
|
|
20
|
+
overflow: hidden;
|
|
21
|
+
display: inline-flex;
|
|
22
|
+
align-items: center;
|
|
23
|
+
justify-content: center;
|
|
24
|
+
|
|
25
|
+
/* Typography */
|
|
26
|
+
font-family: var(
|
|
27
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-family
|
|
28
|
+
);
|
|
29
|
+
font-size: var(
|
|
30
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-size
|
|
31
|
+
);
|
|
32
|
+
font-style: var(
|
|
33
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-style
|
|
34
|
+
);
|
|
35
|
+
font-weight: var(
|
|
36
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-weight
|
|
37
|
+
);
|
|
38
|
+
letter-spacing: var(
|
|
39
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_letter-spacing
|
|
40
|
+
);
|
|
41
|
+
line-height: var(
|
|
42
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_line-height
|
|
43
|
+
);
|
|
44
|
+
text-decoration: var(
|
|
45
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_text-decoration
|
|
46
|
+
);
|
|
47
|
+
text-transform: var(
|
|
48
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_text_text-transform
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
/* Dimensions */
|
|
52
|
+
border-radius: var(
|
|
53
|
+
--recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_default_properties_border-radius
|
|
54
|
+
);
|
|
55
|
+
height: var(
|
|
56
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_height
|
|
57
|
+
);
|
|
58
|
+
min-width: var(
|
|
59
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_min-width
|
|
60
|
+
);
|
|
61
|
+
padding: 0
|
|
62
|
+
var(
|
|
63
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_horizontal-padding
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
/* Base Inactive Style: Outline */
|
|
67
|
+
border-width: var(
|
|
68
|
+
--recursica_ui-kit_components_button_variants_styles_outline_properties_border-size
|
|
69
|
+
);
|
|
70
|
+
box-shadow: var(
|
|
71
|
+
--recursica_ui-kit_components_button_variants_styles_outline_properties_elevation
|
|
72
|
+
);
|
|
73
|
+
background-color: var(
|
|
74
|
+
--recursica_ui-kit_components_button_variants_styles_outline_properties_colors_background-color
|
|
75
|
+
);
|
|
76
|
+
border-color: var(
|
|
77
|
+
--recursica_ui-kit_components_button_variants_styles_outline_properties_colors_border-color
|
|
78
|
+
);
|
|
79
|
+
color: var(
|
|
80
|
+
--recursica_ui-kit_components_button_variants_styles_outline_properties_colors_text-color
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.control:disabled {
|
|
85
|
+
opacity: var(--recursica_brand_states_disabled);
|
|
86
|
+
cursor: not-allowed;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* Hover Overlay: no per-variant hover-color/hover-opacity tokens exist anymore; use the
|
|
90
|
+
generic overlay tokens shared across components (same as Button). */
|
|
91
|
+
.control::after {
|
|
92
|
+
content: "";
|
|
93
|
+
position: absolute;
|
|
94
|
+
inset: 0;
|
|
95
|
+
border-radius: inherit;
|
|
96
|
+
z-index: 0;
|
|
97
|
+
pointer-events: none;
|
|
98
|
+
transition: opacity 150ms ease;
|
|
99
|
+
opacity: 0;
|
|
100
|
+
background-color: var(--recursica_brand_states_hover_color);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.control:hover:not(:disabled)::after {
|
|
104
|
+
opacity: var(--recursica_brand_states_hover_opacity);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Active Style: Solid */
|
|
108
|
+
.control[data-active] {
|
|
109
|
+
border-width: var(
|
|
110
|
+
--recursica_ui-kit_components_button_variants_styles_solid_properties_border-size
|
|
111
|
+
);
|
|
112
|
+
box-shadow: var(
|
|
113
|
+
--recursica_ui-kit_components_button_variants_styles_solid_properties_elevation
|
|
114
|
+
);
|
|
115
|
+
background-color: var(
|
|
116
|
+
--recursica_ui-kit_components_button_variants_styles_solid_properties_colors_background-color
|
|
117
|
+
);
|
|
118
|
+
border-color: var(
|
|
119
|
+
--recursica_ui-kit_components_button_variants_styles_solid_properties_colors_border-color
|
|
120
|
+
);
|
|
121
|
+
color: var(
|
|
122
|
+
--recursica_ui-kit_components_button_variants_styles_solid_properties_colors_text-color
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* Navigation Style: Text */
|
|
127
|
+
.control[data-variant="text"] {
|
|
128
|
+
border-width: var(
|
|
129
|
+
--recursica_ui-kit_components_button_variants_styles_text_properties_border-size
|
|
130
|
+
);
|
|
131
|
+
box-shadow: var(
|
|
132
|
+
--recursica_ui-kit_components_button_variants_styles_text_properties_elevation
|
|
133
|
+
);
|
|
134
|
+
background-color: var(
|
|
135
|
+
--recursica_ui-kit_components_button_variants_styles_text_properties_colors_background-color
|
|
136
|
+
);
|
|
137
|
+
border-color: var(
|
|
138
|
+
--recursica_ui-kit_components_button_variants_styles_text_properties_colors_border-color
|
|
139
|
+
);
|
|
140
|
+
color: var(
|
|
141
|
+
--recursica_ui-kit_components_button_variants_styles_text_properties_colors_text-color
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
/* Also explicitly inherit navigation sizes incase they differ from pages */
|
|
145
|
+
border-radius: var(
|
|
146
|
+
--recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_default_properties_border-radius
|
|
147
|
+
);
|
|
148
|
+
height: var(
|
|
149
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_height
|
|
150
|
+
);
|
|
151
|
+
min-width: var(
|
|
152
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_min-width
|
|
153
|
+
);
|
|
154
|
+
padding: 0
|
|
155
|
+
var(
|
|
156
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_horizontal-padding
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* Dots */
|
|
161
|
+
.dots {
|
|
162
|
+
display: inline-flex;
|
|
163
|
+
align-items: center;
|
|
164
|
+
justify-content: center;
|
|
165
|
+
height: var(
|
|
166
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_height
|
|
167
|
+
);
|
|
168
|
+
min-width: var(
|
|
169
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_min-width
|
|
170
|
+
);
|
|
171
|
+
color: var(
|
|
172
|
+
--recursica_ui-kit_components_pagination_properties_colors_dots-color
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* Icon Styles */
|
|
177
|
+
.iconWithLabel {
|
|
178
|
+
display: flex;
|
|
179
|
+
align-items: center;
|
|
180
|
+
gap: var(
|
|
181
|
+
--recursica_ui-kit_components_button_variants_sizes_default_properties_icon-text-gap
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.baseIcon {
|
|
186
|
+
width: calc(var(--pagination-control-size) / 1.8);
|
|
187
|
+
height: calc(var(--pagination-control-size) / 1.8);
|
|
188
|
+
}
|
|
@@ -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,265 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import React, { forwardRef } from "react";
|
|
3
|
+
import {
|
|
4
|
+
Pagination as MantinePagination,
|
|
5
|
+
type PaginationProps as MantinePaginationProps,
|
|
6
|
+
type PaginationRootProps as MantinePaginationRootProps,
|
|
7
|
+
type PaginationControlProps as MantinePaginationControlProps,
|
|
8
|
+
type PaginationDotsProps as MantinePaginationDotsProps,
|
|
9
|
+
} from "@mantine/core";
|
|
10
|
+
import {
|
|
11
|
+
filterStylingProps,
|
|
12
|
+
withCallerOverride,
|
|
13
|
+
mergeClassNames,
|
|
14
|
+
type RecursicaOverStyled,
|
|
15
|
+
} from "../../utils/filterStylingProps";
|
|
16
|
+
import styles from "./Pagination.module.css";
|
|
17
|
+
import {
|
|
18
|
+
NextWithLabel,
|
|
19
|
+
PrevWithLabel,
|
|
20
|
+
FirstWithLabel,
|
|
21
|
+
LastWithLabel,
|
|
22
|
+
PaginationIcon,
|
|
23
|
+
} from "./Pagination.icons";
|
|
24
|
+
|
|
25
|
+
import { type RecursicaPaginationProps } from "@recursica/adapter-common";
|
|
26
|
+
|
|
27
|
+
export type PaginationProps = RecursicaOverStyled<
|
|
28
|
+
MantinePaginationProps & RecursicaPaginationProps
|
|
29
|
+
>;
|
|
30
|
+
|
|
31
|
+
export type PaginationRootProps =
|
|
32
|
+
RecursicaOverStyled<MantinePaginationRootProps>;
|
|
33
|
+
|
|
34
|
+
export type PaginationEdgeProps<T extends React.ElementType> =
|
|
35
|
+
RecursicaOverStyled<
|
|
36
|
+
React.ComponentProps<T> & {
|
|
37
|
+
/** If set to true, displays text labels alongside the icon. */
|
|
38
|
+
withLabel?: boolean;
|
|
39
|
+
icon?: any;
|
|
40
|
+
}
|
|
41
|
+
>;
|
|
42
|
+
|
|
43
|
+
function usePaginationClassNames(restRecord: Record<string, unknown>): {
|
|
44
|
+
className: string;
|
|
45
|
+
classNames: Partial<Record<string, string>>;
|
|
46
|
+
} {
|
|
47
|
+
const mergedClassNames = mergeClassNames(
|
|
48
|
+
{
|
|
49
|
+
root: styles.root,
|
|
50
|
+
control: styles.control,
|
|
51
|
+
dots: styles.dots,
|
|
52
|
+
},
|
|
53
|
+
restRecord.classNames as Partial<Record<string, string>> | undefined,
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const classNameProp = restRecord.className as string | undefined;
|
|
57
|
+
const finalClass = classNameProp
|
|
58
|
+
? `${styles.root} ${classNameProp}`
|
|
59
|
+
: styles.root;
|
|
60
|
+
|
|
61
|
+
return { className: finalClass, classNames: mergedClassNames };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const _PaginationRoot = forwardRef<HTMLDivElement, PaginationRootProps>(
|
|
65
|
+
function PaginationRoot({ overStyled = false, ...rest }, ref) {
|
|
66
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
67
|
+
const stylingParams = usePaginationClassNames(
|
|
68
|
+
sanitizedProps as Record<string, unknown>,
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<MantinePagination.Root
|
|
73
|
+
ref={ref}
|
|
74
|
+
{...(sanitizedProps as MantinePaginationRootProps)}
|
|
75
|
+
className={stylingParams.className}
|
|
76
|
+
classNames={stylingParams.classNames}
|
|
77
|
+
/>
|
|
78
|
+
);
|
|
79
|
+
},
|
|
80
|
+
);
|
|
81
|
+
_PaginationRoot.displayName = "Pagination.Root";
|
|
82
|
+
|
|
83
|
+
const _PaginationNext = forwardRef<
|
|
84
|
+
HTMLButtonElement,
|
|
85
|
+
PaginationEdgeProps<typeof MantinePagination.Next>
|
|
86
|
+
>(function PaginationNext(
|
|
87
|
+
{ overStyled = false, withLabel, icon, ...rest },
|
|
88
|
+
ref,
|
|
89
|
+
) {
|
|
90
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
91
|
+
const computedIcon = withLabel ? NextWithLabel : undefined;
|
|
92
|
+
return (
|
|
93
|
+
<MantinePagination.Next
|
|
94
|
+
ref={ref}
|
|
95
|
+
{...sanitizedProps}
|
|
96
|
+
data-variant="text"
|
|
97
|
+
icon={withCallerOverride(computedIcon, icon) as any}
|
|
98
|
+
/>
|
|
99
|
+
);
|
|
100
|
+
});
|
|
101
|
+
_PaginationNext.displayName = "Pagination.Next";
|
|
102
|
+
|
|
103
|
+
const _PaginationPrevious = forwardRef<
|
|
104
|
+
HTMLButtonElement,
|
|
105
|
+
PaginationEdgeProps<typeof MantinePagination.Previous>
|
|
106
|
+
>(function PaginationPrevious(
|
|
107
|
+
{ overStyled = false, withLabel, icon, ...rest },
|
|
108
|
+
ref,
|
|
109
|
+
) {
|
|
110
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
111
|
+
const computedIcon = withLabel ? PrevWithLabel : undefined;
|
|
112
|
+
return (
|
|
113
|
+
<MantinePagination.Previous
|
|
114
|
+
ref={ref}
|
|
115
|
+
{...sanitizedProps}
|
|
116
|
+
data-variant="text"
|
|
117
|
+
icon={withCallerOverride(computedIcon, icon) as any}
|
|
118
|
+
/>
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
_PaginationPrevious.displayName = "Pagination.Previous";
|
|
122
|
+
|
|
123
|
+
const _PaginationFirst = forwardRef<
|
|
124
|
+
HTMLButtonElement,
|
|
125
|
+
PaginationEdgeProps<typeof MantinePagination.First>
|
|
126
|
+
>(function PaginationFirst(
|
|
127
|
+
{ overStyled = false, withLabel, icon, ...rest },
|
|
128
|
+
ref,
|
|
129
|
+
) {
|
|
130
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
131
|
+
const computedIcon = withLabel ? FirstWithLabel : undefined;
|
|
132
|
+
return (
|
|
133
|
+
<MantinePagination.First
|
|
134
|
+
ref={ref}
|
|
135
|
+
{...sanitizedProps}
|
|
136
|
+
data-variant="text"
|
|
137
|
+
icon={withCallerOverride(computedIcon, icon) as any}
|
|
138
|
+
/>
|
|
139
|
+
);
|
|
140
|
+
});
|
|
141
|
+
_PaginationFirst.displayName = "Pagination.First";
|
|
142
|
+
|
|
143
|
+
const _PaginationLast = forwardRef<
|
|
144
|
+
HTMLButtonElement,
|
|
145
|
+
PaginationEdgeProps<typeof MantinePagination.Last>
|
|
146
|
+
>(function PaginationLast(
|
|
147
|
+
{ overStyled = false, withLabel, icon, ...rest },
|
|
148
|
+
ref,
|
|
149
|
+
) {
|
|
150
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
151
|
+
const computedIcon = withLabel ? LastWithLabel : undefined;
|
|
152
|
+
return (
|
|
153
|
+
<MantinePagination.Last
|
|
154
|
+
ref={ref}
|
|
155
|
+
{...sanitizedProps}
|
|
156
|
+
data-variant="text"
|
|
157
|
+
icon={withCallerOverride(computedIcon, icon) as any}
|
|
158
|
+
/>
|
|
159
|
+
);
|
|
160
|
+
});
|
|
161
|
+
_PaginationLast.displayName = "Pagination.Last";
|
|
162
|
+
|
|
163
|
+
const _Pagination = forwardRef<HTMLDivElement, PaginationProps>(
|
|
164
|
+
function Pagination(
|
|
165
|
+
{ overStyled = false, getControlProps, withLabels, ...rest },
|
|
166
|
+
ref,
|
|
167
|
+
) {
|
|
168
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
169
|
+
const stylingParams = usePaginationClassNames(
|
|
170
|
+
sanitizedProps as Record<string, unknown>,
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
const mergedGetControlProps = (
|
|
174
|
+
control: "first" | "previous" | "last" | "next",
|
|
175
|
+
) => {
|
|
176
|
+
const baseProps = { "data-variant": "text" };
|
|
177
|
+
if (getControlProps) {
|
|
178
|
+
return { ...baseProps, ...getControlProps(control) };
|
|
179
|
+
}
|
|
180
|
+
return baseProps;
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
const labelsIcons = withLabels
|
|
184
|
+
? {
|
|
185
|
+
nextIcon: NextWithLabel,
|
|
186
|
+
previousIcon: PrevWithLabel,
|
|
187
|
+
firstIcon: FirstWithLabel,
|
|
188
|
+
lastIcon: LastWithLabel,
|
|
189
|
+
}
|
|
190
|
+
: {};
|
|
191
|
+
|
|
192
|
+
return (
|
|
193
|
+
<MantinePagination
|
|
194
|
+
ref={ref}
|
|
195
|
+
{...labelsIcons}
|
|
196
|
+
{...(sanitizedProps as MantinePaginationProps)}
|
|
197
|
+
className={stylingParams.className}
|
|
198
|
+
classNames={stylingParams.classNames}
|
|
199
|
+
getControlProps={mergedGetControlProps}
|
|
200
|
+
/>
|
|
201
|
+
);
|
|
202
|
+
},
|
|
203
|
+
);
|
|
204
|
+
_Pagination.displayName = "Pagination";
|
|
205
|
+
|
|
206
|
+
export type PaginationControlProps =
|
|
207
|
+
RecursicaOverStyled<MantinePaginationControlProps>;
|
|
208
|
+
|
|
209
|
+
const _PaginationControl = forwardRef<
|
|
210
|
+
HTMLButtonElement,
|
|
211
|
+
PaginationControlProps
|
|
212
|
+
>(function PaginationControl({ overStyled = false, ...rest }, ref) {
|
|
213
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
214
|
+
return (
|
|
215
|
+
<MantinePagination.Control
|
|
216
|
+
ref={ref}
|
|
217
|
+
{...(sanitizedProps as unknown as MantinePaginationControlProps)}
|
|
218
|
+
/>
|
|
219
|
+
);
|
|
220
|
+
});
|
|
221
|
+
_PaginationControl.displayName = "Pagination.Control";
|
|
222
|
+
|
|
223
|
+
export type PaginationDotsProps =
|
|
224
|
+
RecursicaOverStyled<MantinePaginationDotsProps>;
|
|
225
|
+
|
|
226
|
+
const _PaginationDots = forwardRef<HTMLDivElement, PaginationDotsProps>(
|
|
227
|
+
function PaginationDots({ overStyled = false, ...rest }, ref) {
|
|
228
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
229
|
+
return (
|
|
230
|
+
<MantinePagination.Dots
|
|
231
|
+
ref={ref}
|
|
232
|
+
{...(sanitizedProps as unknown as MantinePaginationDotsProps)}
|
|
233
|
+
/>
|
|
234
|
+
);
|
|
235
|
+
},
|
|
236
|
+
);
|
|
237
|
+
_PaginationDots.displayName = "Pagination.Dots";
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Recursica Pagination component wrapping Mantine's Pagination.
|
|
241
|
+
*/
|
|
242
|
+
export const Pagination = _Pagination as typeof _Pagination & {
|
|
243
|
+
Root: typeof _PaginationRoot;
|
|
244
|
+
Items: typeof MantinePagination.Items;
|
|
245
|
+
Control: typeof _PaginationControl;
|
|
246
|
+
Dots: typeof _PaginationDots;
|
|
247
|
+
Next: typeof _PaginationNext;
|
|
248
|
+
Previous: typeof _PaginationPrevious;
|
|
249
|
+
First: typeof _PaginationFirst;
|
|
250
|
+
Last: typeof _PaginationLast;
|
|
251
|
+
Icon: typeof PaginationIcon;
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
Pagination.Root = _PaginationRoot;
|
|
255
|
+
// Pagination.Items has no styling props of its own (just a `dotsIcon` prop, no
|
|
256
|
+
// `style`/`className`/BoxProps), so re-exporting Mantine's implementation
|
|
257
|
+
// directly is not a styling-gate gap.
|
|
258
|
+
Pagination.Items = MantinePagination.Items;
|
|
259
|
+
Pagination.Control = _PaginationControl;
|
|
260
|
+
Pagination.Dots = _PaginationDots;
|
|
261
|
+
Pagination.Next = _PaginationNext;
|
|
262
|
+
Pagination.Previous = _PaginationPrevious;
|
|
263
|
+
Pagination.First = _PaginationFirst;
|
|
264
|
+
Pagination.Last = _PaginationLast;
|
|
265
|
+
Pagination.Icon = PaginationIcon;
|
|
@@ -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-mantine-v8`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Import Reference
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { Pagination } from "@recursica/adapter-mantine-v8";
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 2. Basic Example
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import React from "react";
|
|
19
|
+
import { Pagination } from "@recursica/adapter-mantine-v8";
|
|
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-mantine-v8` 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,116 @@
|
|
|
1
|
+
# Panel – Implementation Notes
|
|
2
|
+
|
|
3
|
+
Decisions and design tweaks strictly tailored for the UI Kit's Panel wrapped against `@mantine/core`. This is a living document that tracks _why_ specific logic decisions exist.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Mapping to Mantine Drawer
|
|
8
|
+
|
|
9
|
+
**Decision:** Panel maps to Mantine'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 Mantine's `Drawer` component, which provides:
|
|
12
|
+
|
|
13
|
+
- Slide-in animation from any screen edge
|
|
14
|
+
- Overlay/backdrop
|
|
15
|
+
- Portal rendering
|
|
16
|
+
- Focus trapping
|
|
17
|
+
- Scroll locking
|
|
18
|
+
- Close button and title in header
|
|
19
|
+
|
|
20
|
+
Paper and Card are static containers; Drawer is an overlay that matches Panel's defined behavior.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 2. Token Namespace: `panel`
|
|
25
|
+
|
|
26
|
+
**Decision:** The CSS module exclusively uses variables from the `--recursica_ui-kit_components_panel_*` namespace.
|
|
27
|
+
|
|
28
|
+
**Implementation:** The Recursica token system defines the `panel` namespace covering:
|
|
29
|
+
|
|
30
|
+
- Geometry: border-radius, border-size, min-width (200px), max-width (960px)
|
|
31
|
+
- Content padding: content-horizontal-padding (xl), content-vertical-padding (lg)
|
|
32
|
+
- Header/Footer padding: header-footer-horizontal-padding (xl), header-footer-vertical-padding (md)
|
|
33
|
+
- Spacing: header-close-gap (md), footer-button-gap (md)
|
|
34
|
+
- Divider: divider-size (1px), divider-color
|
|
35
|
+
- Elevation: elevation-3
|
|
36
|
+
- Colors (layer-aware): background, border-color, content, divider-color, header-footer-background, title
|
|
37
|
+
- Non-CSS: header-style ("h3") — see §7
|
|
38
|
+
|
|
39
|
+
No tokens from other component namespaces are referenced.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 3. ClassNames Mapping to Drawer
|
|
44
|
+
|
|
45
|
+
**Decision:** Panel maps CSS module classes to Mantine Drawer's stylesNames.
|
|
46
|
+
|
|
47
|
+
**Implementation:** The Drawer stylesNames used are:
|
|
48
|
+
|
|
49
|
+
- `content` — Outer container (background, border, elevation)
|
|
50
|
+
- `header` — Title bar with close button (padding, divider, gap)
|
|
51
|
+
- `title` — Title text color
|
|
52
|
+
- `body` — Scrollable content area (padding)
|
|
53
|
+
|
|
54
|
+
Other stylesNames (`overlay`, `root`, `inner`, `close`) are left to Mantine defaults.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 4. Default Placement Override
|
|
59
|
+
|
|
60
|
+
**Decision:** Use `placement` instead of `position` for configuring slide-out direction, and default it to `"right"`.
|
|
61
|
+
|
|
62
|
+
**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 Mantine Drawer's `position` prop before any other sanitized props are applied. Right-side panels are the most common pattern for supplementary content, settings, and detail views.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 5. Custom Panel.Footer
|
|
67
|
+
|
|
68
|
+
**Decision:** A custom `Panel.Footer` sub-component is provided. Mantine's Drawer does not have a native footer.
|
|
69
|
+
|
|
70
|
+
**Implementation:** `Panel.Footer` is a `<div>` with inline styles referencing Recursica CSS variables for:
|
|
71
|
+
|
|
72
|
+
- `header-footer-background` and `header-footer-padding` tokens
|
|
73
|
+
- Top divider using `divider-size` and `divider-color`
|
|
74
|
+
- `footer-button-gap` for action button spacing
|
|
75
|
+
- `margin-top: auto` to push the footer to the bottom
|
|
76
|
+
|
|
77
|
+
Inline styles are used instead of a CSS module class because the footer is rendered inside the Drawer's `<body>` element, and the CSS variables are applied to the body's parent container. The inline styles ensure the footer correctly references the panel tokens regardless of DOM position.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 6. Hardcoded Values
|
|
82
|
+
|
|
83
|
+
### `border-style: solid` (CSS module, `.content`)
|
|
84
|
+
|
|
85
|
+
Mantine's Drawer content does not set `border-style` natively. Without this, the border-width and border-color tokens have no visible effect. Same pattern as Card, Menu, HoverCard, Tooltip.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 7. `header-style` Typography Utility Class
|
|
90
|
+
|
|
91
|
+
**Decision:** The `header-style` token exports as the string `"h3"`, so we use the generated global utility class `.recursica_brand_typography_h3`.
|
|
92
|
+
|
|
93
|
+
**Implementation:** The PostCSS compiler generates `.recursica_brand_typography_<typeName>` classes at the bottom of the scoped variables file to apply full typography definitions without assigning variables inline. We apply this to the `.title` class via `composes: recursica_brand_typography_h3 from global;`.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 8. Panel Types: Standard vs Scrollable
|
|
98
|
+
|
|
99
|
+
**Decision:** Both standard and scrollable types are supported natively.
|
|
100
|
+
|
|
101
|
+
**Implementation:** Per the Recursica specification:
|
|
102
|
+
|
|
103
|
+
- **Standard** — All content visible without scrolling. The default behavior when content fits.
|
|
104
|
+
- **Scrollable** — Internal scrollbar enabled when content exceeds the panel height. Header and footer CTAs remain pinned.
|
|
105
|
+
|
|
106
|
+
Mantine's Drawer handles this automatically — the `body` section scrolls when content overflows, while the `header` remains fixed. The `Panel.Footer` uses `margin-top: auto` to stay at the bottom.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## `.titleTruncate` descender clipping (Matt Massey, 2026-08-28)
|
|
111
|
+
|
|
112
|
+
`.titleTruncate` used plain `overflow: hidden` to make `text-overflow: ellipsis` work, which also
|
|
113
|
+
clips descenders (e.g. the "g" in a long title) whenever `text_line-height` is tighter than the
|
|
114
|
+
font's natural ascent+descent. Switched to `overflow: clip; overflow-clip-margin: 0.35em;` — same
|
|
115
|
+
truncation, but ink can bleed slightly past the line box before it's actually clipped.
|
|
116
|
+
Project-wide fix; see Chip's `CHIP_IMPLEMENTATION_NOTES.md` for the original discovery.
|