@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,49 @@
|
|
|
1
|
+
# Timeline - Usage Guide
|
|
2
|
+
|
|
3
|
+
This document describes how to integrate and use the `Timeline` component in your projects using `@recursica/adapter-mantine-v8`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Import Reference
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { Timeline } from "@recursica/adapter-mantine-v8";
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 2. Basic Example
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import React from "react";
|
|
19
|
+
import { Timeline } from "@recursica/adapter-mantine-v8";
|
|
20
|
+
|
|
21
|
+
export default function Demo() {
|
|
22
|
+
return (
|
|
23
|
+
<Timeline active={1}>
|
|
24
|
+
<Timeline.Item title="Step 1">Created branch</Timeline.Item>
|
|
25
|
+
<Timeline.Item title="Step 2">Pushed changes</Timeline.Item>
|
|
26
|
+
</Timeline>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 3. Design System Integration
|
|
34
|
+
|
|
35
|
+
All Recursica components in the `@recursica/adapter-mantine-v8` package adhere strictly to design system spacing, scaling, and behavior patterns.
|
|
36
|
+
|
|
37
|
+
> [!IMPORTANT]
|
|
38
|
+
>
|
|
39
|
+
> - **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.
|
|
40
|
+
> - **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.
|
|
41
|
+
> - **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.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 4. Key Integration Features & Constraints
|
|
46
|
+
|
|
47
|
+
`Timeline.Item` accepts a `timestamp` prop that renders below the item's content, and a `bulletVariant` prop (`"default" | "avatar" | "icon" | "icon-alternative"`) to control the bullet's appearance. The `lineWidth` and `bulletSize` props are not configurable, since geometry is controlled by the design system tokens.
|
|
48
|
+
|
|
49
|
+
A known limitation: when using `bulletVariant="avatar"`, the avatar bullet always renders at the default bullet size rather than a custom size.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Toast – Implementation Notes
|
|
2
|
+
|
|
3
|
+
Decisions and design tweaks tailored for the UI Kit's Toast wrapped against `@mantine/core`'s `Notification` component.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Standalone Visual Wrapper
|
|
8
|
+
|
|
9
|
+
**Decision:** We wrap `@mantine/core`'s standalone `Notification` component instead of wrapping the `@mantine/notifications` provider.
|
|
10
|
+
|
|
11
|
+
**Implementation:** The UI Kit provides variables for the `Toast` component itself (e.g., `--recursica_ui-kit_components_toast_*`). We use these variables to style the standard Mantine `Notification` element. This allows developers to use `<Toast>` manually if they want a static or inline message.
|
|
12
|
+
|
|
13
|
+
If dynamic popups are required, developers can configure `@mantine/notifications` to utilize this component or use its classes.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 2. Variant Mapping via `data-variant`
|
|
18
|
+
|
|
19
|
+
**Decision:** `variant` props (`"default" | "error" | "success"`) are mapped directly to `data-variant` on the Mantine root `Box`.
|
|
20
|
+
|
|
21
|
+
**Implementation:** Mantine's `Notification` doesn't inherently support our custom variants out of the box in the way we want them styled. By passing `data-variant` directly to the `Box`, we can explicitly target the root element in our `Toast.module.css` (e.g., `.root[data-variant="success"]`) and pipe in the corresponding UI Kit layer colors.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 3. Minimal CSS Override Philosophy
|
|
26
|
+
|
|
27
|
+
**Decision:** The CSS module only overrides visual design tokens (colors, typography, padding, borders, shadows).
|
|
28
|
+
|
|
29
|
+
**Implementation:** We defer layout structure, icon rendering, loader transitions, and close button mechanics to Mantine. The `border-style: none;` is hardcoded to reset any underlying styles from Mantine's defaults, ensuring a clean mapping of elevation and shadows.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 4. Unsupported `loading` State
|
|
34
|
+
|
|
35
|
+
**Decision:** The native `loading` state is explicitly stripped and bypassed from the `<Toast />` component wrapper.
|
|
36
|
+
|
|
37
|
+
**Implementation:** Mantine's `Notification` inherently supports a `loading={true}` state that natively spins up a loader instead of an icon. However, Recursica's UI Kit strictly does not define structural tokens for loader states inside toasts.
|
|
38
|
+
Instead of attempting to tightly couple the internal `Loader` abstraction or mapping variables incorrectly, the `loading` property is explicitly omitted and `false`-enforced from the public API.
|
|
39
|
+
If consumers explicitly require a loading toast, they must manually inject a `<Loader />` component into the `icon` slot.
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/* HARDCODED VALUES:
|
|
2
|
+
- border-style: solid. Baseline so the per-variant border-color tokens actually render.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/* EXEMPTIONS:
|
|
6
|
+
- elevation_layer-1/2/3 are ignored: a toast's elevation doesn't depend on the layer it's
|
|
7
|
+
summoned from — all four layer variants resolve to the same brand elevation value, so
|
|
8
|
+
layer-0 (already wired below) is the correct, layer-agnostic choice for all of them. */
|
|
9
|
+
/* recursica-ignore: --recursica_ui-kit_components_toast_properties_elevation_layer-1 */
|
|
10
|
+
/* recursica-ignore: --recursica_ui-kit_components_toast_properties_elevation_layer-2 */
|
|
11
|
+
/* recursica-ignore: --recursica_ui-kit_components_toast_properties_elevation_layer-3 */
|
|
12
|
+
|
|
13
|
+
/* ======================================
|
|
14
|
+
TOAST / NOTIFICATION ROOT
|
|
15
|
+
====================================== */
|
|
16
|
+
|
|
17
|
+
.root {
|
|
18
|
+
border-radius: var(
|
|
19
|
+
--recursica_ui-kit_components_toast_properties_border-radius
|
|
20
|
+
);
|
|
21
|
+
border-width: var(--recursica_ui-kit_components_toast_properties_border-size);
|
|
22
|
+
border-style: solid;
|
|
23
|
+
border-color: var(
|
|
24
|
+
--recursica_ui-kit_components_toast_variants_styles_default_properties_colors_border-color
|
|
25
|
+
);
|
|
26
|
+
box-shadow: var(
|
|
27
|
+
--recursica_ui-kit_components_toast_properties_elevation_layer-0
|
|
28
|
+
);
|
|
29
|
+
padding: var(--recursica_ui-kit_components_toast_properties_vertical-padding)
|
|
30
|
+
var(--recursica_ui-kit_components_toast_properties_horizontal-padding);
|
|
31
|
+
min-width: var(--recursica_ui-kit_components_toast_properties_min-width);
|
|
32
|
+
max-width: var(--recursica_ui-kit_components_toast_properties_max-width);
|
|
33
|
+
min-height: var(--recursica_ui-kit_components_toast_properties_min-height);
|
|
34
|
+
|
|
35
|
+
/* Default Variant (Base) */
|
|
36
|
+
background-color: var(
|
|
37
|
+
--recursica_ui-kit_components_toast_variants_styles_default_properties_colors_background-color
|
|
38
|
+
);
|
|
39
|
+
gap: var(--recursica_ui-kit_components_toast_properties_spacing);
|
|
40
|
+
|
|
41
|
+
/* Hide Mantine's native colored vertical line */
|
|
42
|
+
&::before {
|
|
43
|
+
display: none;
|
|
44
|
+
content: none;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
& .icon {
|
|
48
|
+
width: var(--recursica_ui-kit_components_toast_properties_icon) !important;
|
|
49
|
+
height: var(--recursica_ui-kit_components_toast_properties_icon) !important;
|
|
50
|
+
margin-right: 0 !important; /* Override Mantine's native spacing in favor of flex gap */
|
|
51
|
+
background-color: transparent !important; /* Remove Mantine's native circle background */
|
|
52
|
+
|
|
53
|
+
color: var(
|
|
54
|
+
--recursica_ui-kit_components_toast_variants_styles_default_properties_colors_text-color
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
& .loader {
|
|
59
|
+
margin-right: 0 !important; /* Override native spacing */
|
|
60
|
+
}
|
|
61
|
+
& .title,
|
|
62
|
+
& .description {
|
|
63
|
+
color: var(
|
|
64
|
+
--recursica_ui-kit_components_toast_variants_styles_default_properties_colors_text-color
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
& .closeButton {
|
|
68
|
+
color: var(
|
|
69
|
+
--recursica_ui-kit_components_toast_variants_styles_default_properties_colors_button
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* Error Variant styling */
|
|
74
|
+
&[data-variant="error"] {
|
|
75
|
+
background-color: var(
|
|
76
|
+
--recursica_ui-kit_components_toast_variants_styles_error_properties_colors_background-color
|
|
77
|
+
);
|
|
78
|
+
border-color: var(
|
|
79
|
+
--recursica_ui-kit_components_toast_variants_styles_error_properties_colors_border-color
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
& .icon {
|
|
83
|
+
color: var(
|
|
84
|
+
--recursica_ui-kit_components_toast_variants_styles_error_properties_colors_text-color
|
|
85
|
+
) !important;
|
|
86
|
+
}
|
|
87
|
+
& .title,
|
|
88
|
+
& .description {
|
|
89
|
+
color: var(
|
|
90
|
+
--recursica_ui-kit_components_toast_variants_styles_error_properties_colors_text-color
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
& .closeButton {
|
|
94
|
+
color: var(
|
|
95
|
+
--recursica_ui-kit_components_toast_variants_styles_error_properties_colors_button
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* Success Variant styling */
|
|
101
|
+
&[data-variant="success"] {
|
|
102
|
+
background-color: var(
|
|
103
|
+
--recursica_ui-kit_components_toast_variants_styles_success_properties_colors_background-color
|
|
104
|
+
);
|
|
105
|
+
border-color: var(
|
|
106
|
+
--recursica_ui-kit_components_toast_variants_styles_success_properties_colors_border-color
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
& .icon {
|
|
110
|
+
color: var(
|
|
111
|
+
--recursica_ui-kit_components_toast_variants_styles_success_properties_colors_text-color
|
|
112
|
+
) !important;
|
|
113
|
+
}
|
|
114
|
+
& .title,
|
|
115
|
+
& .description {
|
|
116
|
+
color: var(
|
|
117
|
+
--recursica_ui-kit_components_toast_variants_styles_success_properties_colors_text-color
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
& .closeButton {
|
|
121
|
+
color: var(
|
|
122
|
+
--recursica_ui-kit_components_toast_variants_styles_success_properties_colors_button
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* ======================================
|
|
129
|
+
TOAST BODY
|
|
130
|
+
====================================== */
|
|
131
|
+
|
|
132
|
+
.body {
|
|
133
|
+
/* No extra gap here, root handles icon-to-text, body can handle title-to-description if needed */
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.title {
|
|
137
|
+
font-family: var(
|
|
138
|
+
--recursica_ui-kit_components_toast_properties_text_font-family
|
|
139
|
+
);
|
|
140
|
+
font-size: var(--recursica_ui-kit_components_toast_properties_text_font-size);
|
|
141
|
+
font-style: var(
|
|
142
|
+
--recursica_ui-kit_components_toast_properties_text_font-style
|
|
143
|
+
);
|
|
144
|
+
font-weight: var(
|
|
145
|
+
--recursica_ui-kit_components_toast_properties_text_font-weight
|
|
146
|
+
);
|
|
147
|
+
letter-spacing: var(
|
|
148
|
+
--recursica_ui-kit_components_toast_properties_text_letter-spacing
|
|
149
|
+
);
|
|
150
|
+
line-height: var(
|
|
151
|
+
--recursica_ui-kit_components_toast_properties_text_line-height
|
|
152
|
+
);
|
|
153
|
+
text-decoration: var(
|
|
154
|
+
--recursica_ui-kit_components_toast_properties_text_text-decoration
|
|
155
|
+
);
|
|
156
|
+
text-transform: var(
|
|
157
|
+
--recursica_ui-kit_components_toast_properties_text_text-transform
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.description {
|
|
162
|
+
font-family: var(
|
|
163
|
+
--recursica_ui-kit_components_toast_properties_text_font-family
|
|
164
|
+
);
|
|
165
|
+
font-size: var(--recursica_ui-kit_components_toast_properties_text_font-size);
|
|
166
|
+
font-style: var(
|
|
167
|
+
--recursica_ui-kit_components_toast_properties_text_font-style
|
|
168
|
+
);
|
|
169
|
+
font-weight: var(
|
|
170
|
+
--recursica_ui-kit_components_toast_properties_text_font-weight
|
|
171
|
+
);
|
|
172
|
+
letter-spacing: var(
|
|
173
|
+
--recursica_ui-kit_components_toast_properties_text_letter-spacing
|
|
174
|
+
);
|
|
175
|
+
line-height: var(
|
|
176
|
+
--recursica_ui-kit_components_toast_properties_text_line-height
|
|
177
|
+
);
|
|
178
|
+
text-decoration: var(
|
|
179
|
+
--recursica_ui-kit_components_toast_properties_text_text-decoration
|
|
180
|
+
);
|
|
181
|
+
text-transform: var(
|
|
182
|
+
--recursica_ui-kit_components_toast_properties_text_text-transform
|
|
183
|
+
);
|
|
184
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { Toast } from "./Toast";
|
|
3
|
+
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
+
type ToastStoryArgs = Record<string, any>;
|
|
6
|
+
|
|
7
|
+
const meta = {
|
|
8
|
+
title: "UI-Kit/Toast",
|
|
9
|
+
component: Toast,
|
|
10
|
+
tags: ["autodocs"],
|
|
11
|
+
parameters: {
|
|
12
|
+
docs: {
|
|
13
|
+
description: {
|
|
14
|
+
component:
|
|
15
|
+
"The `Toast` component is a standalone visual component wrapping Mantine's `Notification`. Note that this component is visually decoupled from `@mantine/notifications` and is meant to be used when you need to render a static or manually-controlled notification panel. If you need dynamic notification popups, you should use `@mantine/notifications` and configure its provider to use our styles.",
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
argTypes: {
|
|
20
|
+
title: {
|
|
21
|
+
control: "text",
|
|
22
|
+
description: "Title displayed above the message body",
|
|
23
|
+
},
|
|
24
|
+
children: {
|
|
25
|
+
control: "text",
|
|
26
|
+
description: "Main notification message",
|
|
27
|
+
},
|
|
28
|
+
withCloseButton: {
|
|
29
|
+
control: "boolean",
|
|
30
|
+
description: "Whether the close button is visible",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
} satisfies Meta<typeof Toast>;
|
|
34
|
+
|
|
35
|
+
export default meta;
|
|
36
|
+
type Story = StoryObj<typeof meta>;
|
|
37
|
+
|
|
38
|
+
export const Default: Story = {
|
|
39
|
+
args: {
|
|
40
|
+
variant: "default",
|
|
41
|
+
title: "Update Available",
|
|
42
|
+
children:
|
|
43
|
+
"A new version of the application is available to download. Please restart your browser to apply the latest security patches and feature updates. If you ignore this message, the update will automatically install during your next session.",
|
|
44
|
+
withCloseButton: true,
|
|
45
|
+
},
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
47
|
+
render: ({ withLayer, layer, ...args }: ToastStoryArgs) => {
|
|
48
|
+
return <Toast {...args} />;
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export const WithIcon: Story = {
|
|
53
|
+
args: {
|
|
54
|
+
variant: "default",
|
|
55
|
+
title: "Action Required",
|
|
56
|
+
children:
|
|
57
|
+
"You must complete your profile setup before accessing this feature.",
|
|
58
|
+
icon: "⚠️",
|
|
59
|
+
},
|
|
60
|
+
parameters: {
|
|
61
|
+
controls: { disable: true },
|
|
62
|
+
},
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
64
|
+
render: ({ withLayer, layer, ...args }: ToastStoryArgs) => {
|
|
65
|
+
return <Toast {...args} />;
|
|
66
|
+
},
|
|
67
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
// Placeholder for future Toast component tests. Add tests here if/when needed.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import {
|
|
3
|
+
Notification as MantineNotification,
|
|
4
|
+
type NotificationProps as MantineNotificationProps,
|
|
5
|
+
} from "@mantine/core";
|
|
6
|
+
import {
|
|
7
|
+
filterStylingProps,
|
|
8
|
+
omitUnsupportedProps,
|
|
9
|
+
mergeClassNames,
|
|
10
|
+
type RecursicaOverStyled,
|
|
11
|
+
} from "../../utils/filterStylingProps";
|
|
12
|
+
import styles from "./Toast.module.css";
|
|
13
|
+
|
|
14
|
+
import { type RecursicaToastProps } from "@recursica/adapter-common";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Toast component wrapping Mantine's Notification.
|
|
18
|
+
*
|
|
19
|
+
* Can be used as a standalone visual component to display a notification or message.
|
|
20
|
+
*/
|
|
21
|
+
export type ToastProps = RecursicaOverStyled<
|
|
22
|
+
Omit<MantineNotificationProps, "color" | "radius" | "variant" | "loading"> &
|
|
23
|
+
RecursicaToastProps
|
|
24
|
+
>;
|
|
25
|
+
|
|
26
|
+
export const Toast = React.forwardRef<HTMLDivElement, ToastProps>(
|
|
27
|
+
function Toast(
|
|
28
|
+
{
|
|
29
|
+
overStyled = false,
|
|
30
|
+
variant = "default",
|
|
31
|
+
withCloseButton = true,
|
|
32
|
+
...rest
|
|
33
|
+
},
|
|
34
|
+
ref,
|
|
35
|
+
) {
|
|
36
|
+
// Props this component intentionally doesn't support — deleted at runtime so they can't leak
|
|
37
|
+
// through even if a caller forces them via plain JavaScript, bypassing the `Omit<>` above.
|
|
38
|
+
const UNSUPPORTED_PROPS = [
|
|
39
|
+
"color", // Colors are token-driven via `data-variant`; Mantine's native palette isn't exposed.
|
|
40
|
+
"radius", // Toast corner radius is controlled by design tokens, not a raw radius prop.
|
|
41
|
+
"loading", // Toast never renders a loading state; always forced off via `loading={false}` below.
|
|
42
|
+
] as const satisfies readonly (keyof MantineNotificationProps)[];
|
|
43
|
+
|
|
44
|
+
const sanitizedProps = omitUnsupportedProps(
|
|
45
|
+
filterStylingProps(rest, overStyled),
|
|
46
|
+
UNSUPPORTED_PROPS,
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
// Bind CSS module classes to Mantine's internal classNames API
|
|
50
|
+
const mergedClassNames = mergeClassNames(
|
|
51
|
+
{
|
|
52
|
+
root: styles.root,
|
|
53
|
+
body: styles.body,
|
|
54
|
+
title: styles.title,
|
|
55
|
+
description: styles.description,
|
|
56
|
+
closeButton: styles.closeButton,
|
|
57
|
+
icon: styles.icon,
|
|
58
|
+
loader: styles.loader,
|
|
59
|
+
},
|
|
60
|
+
(sanitizedProps as Record<string, unknown>).classNames as
|
|
61
|
+
| Partial<Record<string, string>>
|
|
62
|
+
| undefined,
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<MantineNotification
|
|
67
|
+
ref={ref}
|
|
68
|
+
{...(sanitizedProps as unknown as Omit<
|
|
69
|
+
MantineNotificationProps,
|
|
70
|
+
"color" | "radius" | "variant" | "loading"
|
|
71
|
+
>)}
|
|
72
|
+
withCloseButton={withCloseButton}
|
|
73
|
+
withBorder={false} // Border is handled via CSS or tokens if needed
|
|
74
|
+
data-variant={variant}
|
|
75
|
+
classNames={mergedClassNames}
|
|
76
|
+
loading={false}
|
|
77
|
+
/>
|
|
78
|
+
);
|
|
79
|
+
},
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
Toast.displayName = "Toast";
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Toast - Usage Guide
|
|
2
|
+
|
|
3
|
+
This document describes how to integrate and use the `Toast` component in your projects using `@recursica/adapter-mantine-v8`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Import Reference
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { Toast } from "@recursica/adapter-mantine-v8";
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 2. Basic Example
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import React from "react";
|
|
19
|
+
import { Toast } from "@recursica/adapter-mantine-v8";
|
|
20
|
+
|
|
21
|
+
export default function Demo() {
|
|
22
|
+
return (
|
|
23
|
+
<Toast
|
|
24
|
+
title="Success"
|
|
25
|
+
message="Your action completed successfully"
|
|
26
|
+
variant="success"
|
|
27
|
+
/>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 3. Design System Integration
|
|
35
|
+
|
|
36
|
+
All Recursica components in the `@recursica/adapter-mantine-v8` package adhere strictly to design system spacing, scaling, and behavior patterns.
|
|
37
|
+
|
|
38
|
+
> [!IMPORTANT]
|
|
39
|
+
>
|
|
40
|
+
> - **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.
|
|
41
|
+
> - **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.
|
|
42
|
+
> - **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.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 4. Key Integration Features & Constraints
|
|
47
|
+
|
|
48
|
+
`Toast` can be used directly for a static or inline message, or wired up to `@mantine/notifications` for dynamic popups. The `variant` prop (`"default" | "error" | "success"`) controls the toast's color treatment.
|
|
49
|
+
|
|
50
|
+
The `loading` state is not supported. If a loading toast is needed, pass a `<Loader />` component into the `icon` slot instead.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./Toast";
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Tooltip – Implementation Notes
|
|
2
|
+
|
|
3
|
+
Decisions and design tweaks strictly tailored for the UI Kit's Tooltip wrapped against `@mantine/core`. This is a living document that tracks _why_ specific logic decisions exist.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Single Component API (Not Composable)
|
|
8
|
+
|
|
9
|
+
**Decision:** Unlike HoverCard (which uses `HoverCard` + `HoverCard.Target` + `HoverCard.Dropdown`), Tooltip is a single wrapper component.
|
|
10
|
+
|
|
11
|
+
**Implementation:** Mantine's `Tooltip` takes content via a `label` prop and wraps the trigger element as `children`. There are no separate Target/Dropdown sub-components. The Recursica wrapper preserves this exact API.
|
|
12
|
+
|
|
13
|
+
**Static sub-components:** `Tooltip.Floating` and `Tooltip.Group` are exposed as pass-through references to Mantine's implementations. These do not receive Recursica styling treatment — they are utility wrappers for cursor-following tooltips and shared delay grouping respectively.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 2. Token Namespace: `tooltip`
|
|
18
|
+
|
|
19
|
+
**Decision:** The CSS module exclusively uses variables from the `--recursica_ui-kit_components_tooltip_*` namespace.
|
|
20
|
+
|
|
21
|
+
**Implementation:** The Recursica token system defines the `tooltip` namespace covering:
|
|
22
|
+
|
|
23
|
+
- Geometry: border-radius, border-size, min-width, min-height, max-width, padding
|
|
24
|
+
- Typography: text_font-\* (family, size, style, weight, letter-spacing, line-height, text-decoration, text-transform)
|
|
25
|
+
- Colors (layer-aware): background, border-color, text
|
|
26
|
+
- Elevation: box-shadow
|
|
27
|
+
- Beak: beak-size (16px), beak-inset (8px)
|
|
28
|
+
|
|
29
|
+
No tokens from other component namespaces are referenced.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 3. Hardcoded Values
|
|
34
|
+
|
|
35
|
+
### `border-style: solid` (CSS module)
|
|
36
|
+
|
|
37
|
+
Mantine renders the tooltip using its `Box` component, which does not set `border-style` natively. Without this hardcoded value, the border-width and border-color tokens would have no visible effect. Same pattern as Menu and HoverCard dropdowns.
|
|
38
|
+
|
|
39
|
+
### `arrowSize` defaulted to `16` (Tooltip.tsx)
|
|
40
|
+
|
|
41
|
+
Mantine's `arrowSize` prop is a JavaScript number used for inline style calculations: it sets `width`, `height`, and a positioning offset (`-arrowSize/2`) directly on the arrow `<div>` element. These inline styles cannot be overridden via CSS without `!important`, and the positioning offset has no CSS equivalent. The beak size cannot be fully CSS-driven.
|
|
42
|
+
|
|
43
|
+
The default value `16` matches the Recursica `beak-size` token (`--recursica_ui-kit_components_tooltip_properties_beak-size: 16px`). Developers can override `arrowSize` if needed. This is documented as an open issue in `docs/COMPONENT_ISSUES.md`.
|
|
44
|
+
|
|
45
|
+
**Note:** Mantine calls this the "arrow"; Recursica calls it the "beak". The Recursica prop `withBeak` (defaulting to `true`) maps to Mantine's `withArrow`. Both are accepted; `withBeak` takes precedence.
|
|
46
|
+
|
|
47
|
+
### `multiline={true}` (Tooltip.tsx)
|
|
48
|
+
|
|
49
|
+
Mantine's `multiline` prop controls whether tooltip text wraps (`white-space: nowrap` when false). Recursica always enables multiline because the design system defines a `max-width` token (300px) — text should wrap naturally within that constraint rather than overflowing. The `multiline` prop is not exposed to developers.
|
|
50
|
+
|
|
51
|
+
### Flexbox centering (CSS module)
|
|
52
|
+
|
|
53
|
+
`display: flex; align-items: center; justify-content: center;` is applied to the `.tooltip` class. This ensures text is vertically and horizontally centered within the `min-height: 48px` container defined by the design token. Without this, text sits at the top of the tooltip.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 4. Recursica `withBeak` Prop
|
|
58
|
+
|
|
59
|
+
**Decision:** `withBeak` is the official Recursica prop for controlling beak visibility, defaulting to `true`.
|
|
60
|
+
|
|
61
|
+
**Implementation:** Both `withBeak` and Mantine's `withArrow` are accepted. Resolution order: `withBeak ?? withArrow`. When both are provided, `withBeak` takes precedence. The default of `true` means tooltips show the beak by default, matching the Recursica design intent.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 5. ClassNames Binding
|
|
66
|
+
|
|
67
|
+
**Decision:** CSS module classes are bound via the `classNames` prop on Mantine's Tooltip root.
|
|
68
|
+
|
|
69
|
+
**Implementation:** The stylesNames for Tooltip are `tooltip` (the container) and `arrow` (the beak). Both are mapped to their respective CSS module classes: `{ tooltip: styles.tooltip, arrow: styles.arrow }`. Consumer-provided `classNames` are merged additively when `overStyled` is true.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 6. Tooltip.Floating and Tooltip.Group
|
|
74
|
+
|
|
75
|
+
**Decision:** These static sub-components are direct pass-throughs to Mantine with no Recursica styling.
|
|
76
|
+
|
|
77
|
+
**Implementation:** `Tooltip.Floating` follows the cursor and uses a different rendering mechanism than standard Tooltip. `Tooltip.Group` is a utility for shared delay timing. Neither has Recursica design tokens defined, so they remain unstyled pass-throughs. If tokens are added in the future, they can be wrapped independently.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 7. Default Position Override
|
|
82
|
+
|
|
83
|
+
**Decision:** Recursica defaults `position` to `"top"`. Mantine defaults to `"bottom"`.
|
|
84
|
+
|
|
85
|
+
**Implementation:** The `position="top"` default is set on the Mantine root element before the prop spread, so developer-provided `position` values still take precedence. This aligns with Recursica's design intent for overlay components to appear above their trigger by default.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/* HARDCODED VALUES:
|
|
2
|
+
- border-style: solid. Structural rendering rule for the tooltip border (Mantine uses Box
|
|
3
|
+
which may not set border-style natively). Same pattern as Menu / HoverCard.
|
|
4
|
+
- arrowSize defaults to 16 in Tooltip.tsx. Mantine uses arrowSize for inline width/height
|
|
5
|
+
and positioning (-arrowSize/2) calculations that cannot be CSS-driven. The default matches
|
|
6
|
+
the Recursica beak-size token (16px).
|
|
7
|
+
- arrow inset/offset is Mantine's own default (no arrowOffset override) — same "must be a JS
|
|
8
|
+
prop, not CSS-driven" constraint as arrowSize.
|
|
9
|
+
- All structural layout (display, position, overflow) is deferred to Mantine's native
|
|
10
|
+
behavior. We only override visual design tokens (colors, typography, spacing, borders).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/* EXEMPTIONS:
|
|
14
|
+
- beak-size/beak-inset are ignored: the arrow's size and position are Mantine's own
|
|
15
|
+
`arrowSize`/`arrowOffset` JS props, not CSS-driven — see HARDCODED VALUES above. */
|
|
16
|
+
/* recursica-ignore: --recursica_ui-kit_components_tooltip_properties_beak-size */
|
|
17
|
+
/* recursica-ignore: --recursica_ui-kit_components_tooltip_properties_beak-inset */
|
|
18
|
+
|
|
19
|
+
/* ======================================
|
|
20
|
+
TOOLTIP CONTAINER
|
|
21
|
+
====================================== */
|
|
22
|
+
|
|
23
|
+
.tooltip {
|
|
24
|
+
background-color: var(
|
|
25
|
+
--recursica_ui-kit_components_tooltip_properties_colors_background-color
|
|
26
|
+
);
|
|
27
|
+
border-style: solid; /* HARDCODE: Mantine Box does not set border-style natively */
|
|
28
|
+
border-width: var(
|
|
29
|
+
--recursica_ui-kit_components_tooltip_properties_border-size
|
|
30
|
+
);
|
|
31
|
+
border-color: var(
|
|
32
|
+
--recursica_ui-kit_components_tooltip_properties_colors_border-color
|
|
33
|
+
);
|
|
34
|
+
border-radius: var(
|
|
35
|
+
--recursica_ui-kit_components_tooltip_properties_border-radius
|
|
36
|
+
);
|
|
37
|
+
box-shadow: var(--recursica_ui-kit_components_tooltip_properties_elevation);
|
|
38
|
+
|
|
39
|
+
min-width: var(--recursica_ui-kit_components_tooltip_properties_min-width);
|
|
40
|
+
min-height: var(--recursica_ui-kit_components_tooltip_properties_min-height);
|
|
41
|
+
max-width: var(--recursica_ui-kit_components_tooltip_properties_max-width);
|
|
42
|
+
|
|
43
|
+
padding: var(
|
|
44
|
+
--recursica_ui-kit_components_tooltip_properties_vertical-padding
|
|
45
|
+
)
|
|
46
|
+
var(--recursica_ui-kit_components_tooltip_properties_horizontal-padding);
|
|
47
|
+
|
|
48
|
+
/* Vertically center text within min-height container */
|
|
49
|
+
display: flex;
|
|
50
|
+
align-items: center;
|
|
51
|
+
|
|
52
|
+
/* Typography */
|
|
53
|
+
font-family: var(
|
|
54
|
+
--recursica_ui-kit_components_tooltip_properties_text_font-family
|
|
55
|
+
);
|
|
56
|
+
font-size: var(
|
|
57
|
+
--recursica_ui-kit_components_tooltip_properties_text_font-size
|
|
58
|
+
);
|
|
59
|
+
font-style: var(
|
|
60
|
+
--recursica_ui-kit_components_tooltip_properties_text_font-style
|
|
61
|
+
);
|
|
62
|
+
font-weight: var(
|
|
63
|
+
--recursica_ui-kit_components_tooltip_properties_text_font-weight
|
|
64
|
+
);
|
|
65
|
+
letter-spacing: var(
|
|
66
|
+
--recursica_ui-kit_components_tooltip_properties_text_letter-spacing
|
|
67
|
+
);
|
|
68
|
+
line-height: var(
|
|
69
|
+
--recursica_ui-kit_components_tooltip_properties_text_line-height
|
|
70
|
+
);
|
|
71
|
+
text-decoration: var(
|
|
72
|
+
--recursica_ui-kit_components_tooltip_properties_text_text-decoration
|
|
73
|
+
);
|
|
74
|
+
text-transform: var(
|
|
75
|
+
--recursica_ui-kit_components_tooltip_properties_text_text-transform
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
color: var(
|
|
79
|
+
--recursica_ui-kit_components_tooltip_properties_colors_text-color
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* ======================================
|
|
84
|
+
ARROW / BEAK
|
|
85
|
+
====================================== */
|
|
86
|
+
|
|
87
|
+
.arrow {
|
|
88
|
+
border-color: var(
|
|
89
|
+
--recursica_ui-kit_components_tooltip_properties_colors_border-color
|
|
90
|
+
);
|
|
91
|
+
}
|