@recursica/mantine-adapter 0.5.0 → 0.7.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/CHANGELOG.md +69 -0
- package/dist/mantine-adapter.cjs +1 -1
- package/dist/mantine-adapter.cjs.map +1 -1
- package/dist/mantine-adapter.css +1 -1
- package/dist/mantine-adapter.js +1076 -266
- package/dist/mantine-adapter.js.map +1 -1
- package/dist/src/components/Accordion/Accordion.d.ts +13 -28
- package/dist/src/components/AssistiveElement/AssistiveElement.d.ts +10 -0
- package/dist/src/components/Avatar/Avatar.d.ts +1 -1
- package/dist/src/components/Breadcrumb/Breadcrumb.d.ts +6 -3
- package/dist/src/components/Button/Button.d.ts +1 -1
- package/dist/src/components/Card/Card.d.ts +38 -3
- package/dist/src/components/Checkbox/Checkbox.d.ts +11 -3
- package/dist/src/components/Checkbox/CheckboxGroup.d.ts +9 -0
- package/dist/src/components/Chip/Chip.d.ts +14 -2
- package/dist/src/components/FormControlWrapper/FormControlWrapper.d.ts +18 -0
- package/dist/src/components/Label/Label.d.ts +21 -0
- package/dist/src/components/Label/index.d.ts +1 -0
- package/dist/src/components/ReadOnlyField/ReadOnlyField.d.ts +19 -2
- package/dist/src/components/ReadOnlyField/ReadOnlyTextField.d.ts +8 -0
- package/dist/src/components/ReadOnlyField/WithReadOnlyWrapper.d.ts +22 -0
- package/dist/src/components/ReadOnlyField/index.d.ts +3 -0
- package/dist/src/components/Text/Text.d.ts +17 -0
- package/dist/src/components/TextField/TextField.d.ts +8 -2
- package/dist/src/components/Title/Title.d.ts +13 -0
- package/dist/src/components/index.d.ts +3 -1
- package/dist/src/utils/ColorSchemeWrapper.d.ts +3 -0
- package/dist/src/utils/filterStylingProps.d.ts +6 -2
- package/package.json +9 -5
- package/src/OverStyling.stories.tsx +174 -0
- package/src/Version.stories.tsx +56 -0
- package/src/components/Accordion/ACCORDION_IMPLEMENTATION_NOTES.md +48 -0
- package/src/components/Accordion/Accordion.module.css +261 -0
- package/src/components/Accordion/Accordion.stories.tsx +145 -0
- package/src/components/Accordion/Accordion.tsx +200 -0
- package/src/components/Accordion/index.ts +1 -0
- package/src/components/AssistiveElement/AssistiveElement.module.css +111 -0
- package/src/components/AssistiveElement/AssistiveElement.stories.tsx +73 -0
- package/src/components/AssistiveElement/AssistiveElement.tsx +91 -0
- package/src/components/Avatar/AVATAR_IMPLEMENTATION_NOTES.md +24 -0
- package/src/components/Avatar/Avatar.module.css +340 -0
- package/src/components/Avatar/Avatar.stories.tsx +102 -0
- package/src/components/Avatar/Avatar.tsx +100 -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 +124 -0
- package/src/components/Badge/Badge.stories.tsx +77 -0
- package/src/components/Badge/Badge.tsx +66 -0
- package/src/components/Breadcrumb/BREADCRUMB_IMPLEMENTATION_NOTES.md +14 -0
- package/src/components/Breadcrumb/Breadcrumb.module.css +26 -0
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +77 -0
- package/src/components/Breadcrumb/Breadcrumb.tsx +64 -0
- package/src/components/Button/Button.module.css +275 -0
- package/src/components/Button/Button.stories.tsx +105 -0
- package/src/components/Button/Button.tsx +122 -0
- package/src/components/Button/IMPLEMENTATION_NOTES.md +45 -0
- package/src/components/Button/index.ts +1 -0
- package/src/components/Card/CARD_IMPLEMENTATION_NOTES.md +10 -0
- package/src/components/Card/Card.module.css +60 -0
- package/src/components/Card/Card.stories.tsx +141 -0
- package/src/components/Card/Card.tsx +176 -0
- package/src/components/Checkbox/CHECKBOX_IMPLEMENTATION_NOTES.md +25 -0
- package/src/components/Checkbox/Checkbox.module.css +204 -0
- package/src/components/Checkbox/Checkbox.stories.tsx +73 -0
- package/src/components/Checkbox/Checkbox.tsx +111 -0
- package/src/components/Checkbox/CheckboxGroup.stories.tsx +138 -0
- package/src/components/Checkbox/CheckboxGroup.tsx +140 -0
- package/src/components/Chip/CHIP_IMPLEMENTATION_NOTES.md +35 -0
- package/src/components/Chip/Chip.module.css +218 -0
- package/src/components/Chip/Chip.stories.tsx +115 -0
- package/src/components/Chip/Chip.tsx +143 -0
- package/src/components/DatePicker/DatePicker.stories.tsx +22 -0
- package/src/components/DatePicker/DatePicker.tsx +7 -0
- package/src/components/Dropdown/Dropdown.stories.tsx +22 -0
- package/src/components/Dropdown/Dropdown.tsx +7 -0
- package/src/components/FileInput/FileInput.stories.tsx +22 -0
- package/src/components/FileInput/FileInput.tsx +7 -0
- package/src/components/FileUpload/FileUpload.stories.tsx +22 -0
- package/src/components/FileUpload/FileUpload.tsx +7 -0
- package/src/components/FormControlWrapper/FORMCONTROLWRAPPER_IMPLEMENTATION_NOTES.md +32 -0
- package/src/components/FormControlWrapper/FormControlWrapper.module.css +46 -0
- package/src/components/FormControlWrapper/FormControlWrapper.stories.tsx +116 -0
- package/src/components/FormControlWrapper/FormControlWrapper.tsx +170 -0
- package/src/components/HoverCard/HoverCard.stories.tsx +17 -0
- package/src/components/HoverCard/HoverCard.tsx +7 -0
- package/src/components/Label/LABEL_IMPLEMENTATION_NOTES.md +48 -0
- package/src/components/Label/Label.module.css +177 -0
- package/src/components/Label/Label.stories.tsx +123 -0
- package/src/components/Label/Label.tsx +132 -0
- package/src/components/Label/index.ts +1 -0
- package/src/components/Link/Link.stories.tsx +17 -0
- package/src/components/Link/Link.tsx +7 -0
- package/src/components/Loader/Loader.stories.tsx +17 -0
- package/src/components/Loader/Loader.tsx +7 -0
- package/src/components/Menu/Menu.stories.tsx +17 -0
- package/src/components/Menu/Menu.tsx +7 -0
- package/src/components/Modal/Modal.stories.tsx +17 -0
- package/src/components/Modal/Modal.tsx +7 -0
- package/src/components/NumberInput/NumberInput.stories.tsx +22 -0
- package/src/components/NumberInput/NumberInput.tsx +7 -0
- package/src/components/Pagination/Pagination.stories.tsx +17 -0
- package/src/components/Pagination/Pagination.tsx +7 -0
- package/src/components/Panel/Panel.stories.tsx +17 -0
- package/src/components/Panel/Panel.tsx +7 -0
- package/src/components/Popover/Popover.stories.tsx +17 -0
- package/src/components/Popover/Popover.tsx +7 -0
- package/src/components/Radio/Radio.stories.tsx +22 -0
- package/src/components/Radio/Radio.tsx +7 -0
- package/src/components/ReadOnlyField/READ_ONLY_FIELD_IMPLEMENTATION_NOTES.md +15 -0
- package/src/components/ReadOnlyField/ReadOnlyField.module.css +49 -0
- package/src/components/ReadOnlyField/ReadOnlyField.stories.tsx +120 -0
- package/src/components/ReadOnlyField/ReadOnlyField.tsx +75 -0
- package/src/components/ReadOnlyField/ReadOnlyTextField.tsx +46 -0
- package/src/components/ReadOnlyField/WithReadOnlyWrapper.tsx +85 -0
- package/src/components/ReadOnlyField/index.ts +3 -0
- package/src/components/Search/Search.stories.tsx +17 -0
- package/src/components/Search/Search.tsx +7 -0
- package/src/components/SegmentedControl/SegmentedControl.stories.tsx +22 -0
- package/src/components/SegmentedControl/SegmentedControl.tsx +7 -0
- package/src/components/Slider/Slider.stories.tsx +22 -0
- package/src/components/Slider/Slider.tsx +7 -0
- package/src/components/Stepper/Stepper.stories.tsx +17 -0
- package/src/components/Stepper/Stepper.tsx +7 -0
- package/src/components/Switch/Switch.stories.tsx +22 -0
- package/src/components/Switch/Switch.tsx +7 -0
- package/src/components/Table/Table.stories.tsx +17 -0
- package/src/components/Table/Table.tsx +7 -0
- package/src/components/Tabs/Tabs.stories.tsx +17 -0
- package/src/components/Tabs/Tabs.tsx +7 -0
- package/src/components/Text/Text.stories.tsx +88 -0
- package/src/components/Text/Text.tsx +54 -0
- package/src/components/TextArea/TextArea.stories.tsx +22 -0
- package/src/components/TextArea/TextArea.tsx +7 -0
- package/src/components/TextField/TEXTFIELD_IMPLEMENTATION_NOTES.md +19 -0
- package/src/components/TextField/TextField.module.css +225 -0
- package/src/components/TextField/TextField.stories.tsx +162 -0
- package/src/components/TextField/TextField.tsx +138 -0
- package/src/components/TimePicker/TimePicker.stories.tsx +22 -0
- package/src/components/TimePicker/TimePicker.tsx +7 -0
- package/src/components/Timeline/Timeline.stories.tsx +17 -0
- package/src/components/Timeline/Timeline.tsx +7 -0
- package/src/components/Title/Title.stories.tsx +63 -0
- package/src/components/Title/Title.tsx +45 -0
- package/src/components/Toast/Toast.stories.tsx +17 -0
- package/src/components/Toast/Toast.tsx +7 -0
- package/src/components/Tooltip/Tooltip.stories.tsx +17 -0
- package/src/components/Tooltip/Tooltip.tsx +7 -0
- package/src/components/TransferList/TransferList.stories.tsx +17 -0
- package/src/components/TransferList/TransferList.tsx +7 -0
- package/src/components/index.ts +39 -0
- package/src/env.d.ts +7 -0
- package/src/index.ts +3 -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/copyToClipboard.ts +36 -0
- package/src/utils/filterStylingProps.ts +139 -0
- package/src/utils/index.ts +1 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { SegmentedControl } from "./SegmentedControl";
|
|
3
|
+
import { ComingSoon } from "@recursica/storybook-template";
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof SegmentedControl> = {
|
|
6
|
+
title: "UI-Kit/🚧 SegmentedControl",
|
|
7
|
+
component: SegmentedControl,
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
argTypes: {
|
|
10
|
+
disabled: {
|
|
11
|
+
control: "boolean",
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default meta;
|
|
17
|
+
|
|
18
|
+
type Story = StoryObj<typeof SegmentedControl>;
|
|
19
|
+
|
|
20
|
+
export const Default: Story = {
|
|
21
|
+
render: () => <ComingSoon componentName="SegmentedControl" />,
|
|
22
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { Slider } from "./Slider";
|
|
3
|
+
import { ComingSoon } from "@recursica/storybook-template";
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof Slider> = {
|
|
6
|
+
title: "UI-Kit/🚧 Slider",
|
|
7
|
+
component: Slider,
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
argTypes: {
|
|
10
|
+
disabled: {
|
|
11
|
+
control: "boolean",
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default meta;
|
|
17
|
+
|
|
18
|
+
type Story = StoryObj<typeof Slider>;
|
|
19
|
+
|
|
20
|
+
export const Default: Story = {
|
|
21
|
+
render: () => <ComingSoon componentName="Slider" />,
|
|
22
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { Stepper } from "./Stepper";
|
|
3
|
+
import { ComingSoon } from "@recursica/storybook-template";
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof Stepper> = {
|
|
6
|
+
title: "UI-Kit/🚧 Stepper",
|
|
7
|
+
component: Stepper,
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default meta;
|
|
12
|
+
|
|
13
|
+
type Story = StoryObj<typeof Stepper>;
|
|
14
|
+
|
|
15
|
+
export const Default: Story = {
|
|
16
|
+
render: () => <ComingSoon componentName="Stepper" />,
|
|
17
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { Switch } from "./Switch";
|
|
3
|
+
import { ComingSoon } from "@recursica/storybook-template";
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof Switch> = {
|
|
6
|
+
title: "UI-Kit/🚧 Switch",
|
|
7
|
+
component: Switch,
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
argTypes: {
|
|
10
|
+
disabled: {
|
|
11
|
+
control: "boolean",
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default meta;
|
|
17
|
+
|
|
18
|
+
type Story = StoryObj<typeof Switch>;
|
|
19
|
+
|
|
20
|
+
export const Default: Story = {
|
|
21
|
+
render: () => <ComingSoon componentName="Switch" />,
|
|
22
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { Table } from "./Table";
|
|
3
|
+
import { ComingSoon } from "@recursica/storybook-template";
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof Table> = {
|
|
6
|
+
title: "UI-Kit/🚧 Table",
|
|
7
|
+
component: Table,
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default meta;
|
|
12
|
+
|
|
13
|
+
type Story = StoryObj<typeof Table>;
|
|
14
|
+
|
|
15
|
+
export const Default: Story = {
|
|
16
|
+
render: () => <ComingSoon componentName="Table" />,
|
|
17
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { Tabs } from "./Tabs";
|
|
3
|
+
import { ComingSoon } from "@recursica/storybook-template";
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof Tabs> = {
|
|
6
|
+
title: "UI-Kit/🚧 Tabs",
|
|
7
|
+
component: Tabs,
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default meta;
|
|
12
|
+
|
|
13
|
+
type Story = StoryObj<typeof Tabs>;
|
|
14
|
+
|
|
15
|
+
export const Default: Story = {
|
|
16
|
+
render: () => <ComingSoon componentName="Tabs" />,
|
|
17
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { Text } from "./Text";
|
|
3
|
+
import { Layer } from "@recursica/adapter-common";
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof Text> = {
|
|
6
|
+
title: "UI-Kit/Text",
|
|
7
|
+
component: Text,
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
parameters: {
|
|
10
|
+
docs: {
|
|
11
|
+
description: {
|
|
12
|
+
component:
|
|
13
|
+
"The standard `<Text>` component controls common body sizing scales and implicit paragraphs governed by the active theme layer. For semantic headings (`h1` through `h6`), use `<Title>` instead.",
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
argTypes: {
|
|
18
|
+
variant: {
|
|
19
|
+
control: "select",
|
|
20
|
+
options: [
|
|
21
|
+
"body",
|
|
22
|
+
"body-small",
|
|
23
|
+
"caption",
|
|
24
|
+
"overline",
|
|
25
|
+
"subtitle",
|
|
26
|
+
"subtitle-small",
|
|
27
|
+
],
|
|
28
|
+
description:
|
|
29
|
+
"Controls the standard logical boundary definitions natively extracted from Figma.",
|
|
30
|
+
},
|
|
31
|
+
c: {
|
|
32
|
+
control: "text",
|
|
33
|
+
description:
|
|
34
|
+
"Standard Mantine color string mapped via internal boundaries. Example: `dimmed`",
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export default meta;
|
|
40
|
+
|
|
41
|
+
type Story = StoryObj<typeof Text>;
|
|
42
|
+
|
|
43
|
+
export const Default: Story = {
|
|
44
|
+
args: {
|
|
45
|
+
variant: "body",
|
|
46
|
+
children:
|
|
47
|
+
"This is standard body typography controlled by the central UI-kit boundaries exclusively.",
|
|
48
|
+
},
|
|
49
|
+
render: ({ ...args }) => (
|
|
50
|
+
<Layer layer={0} style={{ padding: "48px" }}>
|
|
51
|
+
<Text {...args} />
|
|
52
|
+
</Layer>
|
|
53
|
+
),
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export const StaticVariations: Story = {
|
|
57
|
+
args: {},
|
|
58
|
+
render: () => (
|
|
59
|
+
<Layer
|
|
60
|
+
layer={0}
|
|
61
|
+
style={{
|
|
62
|
+
padding: "48px",
|
|
63
|
+
display: "flex",
|
|
64
|
+
flexDirection: "column",
|
|
65
|
+
gap: "16px",
|
|
66
|
+
}}
|
|
67
|
+
>
|
|
68
|
+
<Text variant="body">
|
|
69
|
+
Body (Base paragraph and generic information flow)
|
|
70
|
+
</Text>
|
|
71
|
+
<Text variant="body-small">
|
|
72
|
+
Body Small (Compacted list items and helper blocks)
|
|
73
|
+
</Text>
|
|
74
|
+
<Text variant="caption">
|
|
75
|
+
Caption (Data table descriptions or micro-labels)
|
|
76
|
+
</Text>
|
|
77
|
+
<Text variant="overline">
|
|
78
|
+
Overline (Card contextual pre-headers and categorical tags)
|
|
79
|
+
</Text>
|
|
80
|
+
<Text variant="subtitle">
|
|
81
|
+
Subtitle (Minor sub-headers avoiding heavy display weights)
|
|
82
|
+
</Text>
|
|
83
|
+
<Text variant="subtitle-small">
|
|
84
|
+
Subtitle Small (Section anchors deep in hierarchy)
|
|
85
|
+
</Text>
|
|
86
|
+
</Layer>
|
|
87
|
+
),
|
|
88
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { forwardRef, type ReactNode } from "react";
|
|
2
|
+
import {
|
|
3
|
+
Text as MantineText,
|
|
4
|
+
type TextProps as MantineTextProps,
|
|
5
|
+
} from "@mantine/core";
|
|
6
|
+
import {
|
|
7
|
+
filterStylingProps,
|
|
8
|
+
type RecursicaOverStyled,
|
|
9
|
+
} from "../../utils/filterStylingProps";
|
|
10
|
+
|
|
11
|
+
export type TextVariant =
|
|
12
|
+
| "body"
|
|
13
|
+
| "body-small"
|
|
14
|
+
| "caption"
|
|
15
|
+
| "overline"
|
|
16
|
+
| "subtitle"
|
|
17
|
+
| "subtitle-small";
|
|
18
|
+
|
|
19
|
+
export type RecursicaTextProps = Omit<MantineTextProps, "variant"> & {
|
|
20
|
+
/**
|
|
21
|
+
* The explicit typography hierarchy dictated by Recursica's global design tokens.
|
|
22
|
+
*/
|
|
23
|
+
variant?: TextVariant;
|
|
24
|
+
children?: ReactNode;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type TextProps = RecursicaOverStyled<RecursicaTextProps>;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A generalized typographical wrapper limiting text properties to bounded Recursica UI-kit tokens inherently.
|
|
31
|
+
* Do not use for semantic headings; use the explicit `<Title>` component for `<h1>` - `<h6>`.
|
|
32
|
+
*/
|
|
33
|
+
export const Text = forwardRef<HTMLDivElement, TextProps>(function Text(
|
|
34
|
+
{ overStyled = false, variant = "body", ...rest },
|
|
35
|
+
ref,
|
|
36
|
+
) {
|
|
37
|
+
const sanitizedProps = filterStylingProps(rest, overStyled);
|
|
38
|
+
const classNameProp = (sanitizedProps as Record<string, unknown>)
|
|
39
|
+
.className as string | undefined;
|
|
40
|
+
|
|
41
|
+
const typographyClass = `recursica_brand_typography_${variant}`;
|
|
42
|
+
const mergedClassName = classNameProp
|
|
43
|
+
? `${typographyClass} ${classNameProp}`
|
|
44
|
+
: typographyClass;
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<MantineText
|
|
48
|
+
ref={ref}
|
|
49
|
+
className={mergedClassName}
|
|
50
|
+
{...(sanitizedProps as unknown as MantineTextProps)}
|
|
51
|
+
/>
|
|
52
|
+
);
|
|
53
|
+
});
|
|
54
|
+
Text.displayName = "Text";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { TextArea } from "./TextArea";
|
|
3
|
+
import { ComingSoon } from "@recursica/storybook-template";
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof TextArea> = {
|
|
6
|
+
title: "UI-Kit/🚧 TextArea",
|
|
7
|
+
component: TextArea,
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
argTypes: {
|
|
10
|
+
disabled: {
|
|
11
|
+
control: "boolean",
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default meta;
|
|
17
|
+
|
|
18
|
+
type Story = StoryObj<typeof TextArea>;
|
|
19
|
+
|
|
20
|
+
export const Default: Story = {
|
|
21
|
+
render: () => <ComingSoon componentName="TextArea" />,
|
|
22
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# TextField Implementation Notes
|
|
2
|
+
|
|
3
|
+
## Architectural philosophy
|
|
4
|
+
|
|
5
|
+
The `TextField` primitive intentionally ignores Mantine's built-in `<TextInput>` structure in favor of directly binding against `<Input>`.
|
|
6
|
+
|
|
7
|
+
### 1. Bypassing `Input.Wrapper`
|
|
8
|
+
|
|
9
|
+
Because `<TextInput>` inherently renders Mantine's `Input.Wrapper` underneath the hood, utilizing it natively double-wraps our layouts causing massive DOM bloat and margin collapsing errors. By leveraging the completely naked `<Input>` primitive natively natively alongside `FormControlWrapper`, we retain full logical control of where the `label` maps, avoiding dual label conflicts or mis-aligned asterisks securely.
|
|
10
|
+
|
|
11
|
+
### 2. State Hooks (`wrapperProps`)
|
|
12
|
+
|
|
13
|
+
Because we target `<Input>`, all dynamic UI modifiers (`disabled`, `error`, etc) must strictly be applied to the `.root` CSS module to correctly style the internal `<input>` boxes AND the nested `.[data-position]` icon sections simultaneously.
|
|
14
|
+
|
|
15
|
+
To accomplish this safely without spilling random pseudo-variables onto the input parameters, we exclusively use Mantine's `<Input wrapperProps={{...}}>` block natively locking `.root[data-error]` to correctly map Recursica UI variable hooks without breaking the DOM hierarchy natively.
|
|
16
|
+
|
|
17
|
+
### 3. Component Definition Intersections
|
|
18
|
+
|
|
19
|
+
To strictly acquire native HTML typings, `TextField.tsx` explicitly extracts `React.ComponentPropsWithoutRef<"input">`. However, to prevent Typescript strict union collisions with overlapping Mantine definitions over functional `style` components and custom mappings natively, we meticulously omit (`Pick<InputWrapperProps, ...>`) explicit base elements to guarantee that strictly Recursica styles traverse the array flawlessly.
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/* HARDCODED VALUES:
|
|
2
|
+
- border-width: 1px. Native geometric boundary for the input box.
|
|
3
|
+
- border-style: solid. Native structural rendering rule.
|
|
4
|
+
- outline: none. Bypassing browser focus rings to rely strictly on Recursica focus states natively.
|
|
5
|
+
- flex/layout: display: flex on the root wrapper safely encapsulating internal section rendering.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
.root {
|
|
9
|
+
display: flex;
|
|
10
|
+
position: relative;
|
|
11
|
+
width: 100%;
|
|
12
|
+
min-height: var(
|
|
13
|
+
--recursica_ui-kit_components_text-field_properties_min-height
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
/* Override Mantine native Input variables governing section spacing padding mathematics safely */
|
|
17
|
+
--input-left-section-size: calc(
|
|
18
|
+
var(--recursica_ui-kit_components_text-field_properties_icon-size) +
|
|
19
|
+
(
|
|
20
|
+
var(
|
|
21
|
+
--recursica_ui-kit_components_text-field_properties_horizontal-padding
|
|
22
|
+
) *
|
|
23
|
+
2
|
|
24
|
+
)
|
|
25
|
+
);
|
|
26
|
+
--input-right-section-size: calc(
|
|
27
|
+
var(--recursica_ui-kit_components_text-field_properties_icon-size) +
|
|
28
|
+
(
|
|
29
|
+
var(
|
|
30
|
+
--recursica_ui-kit_components_text-field_properties_horizontal-padding
|
|
31
|
+
) *
|
|
32
|
+
2
|
|
33
|
+
)
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.input {
|
|
38
|
+
/* Structural Overrides */
|
|
39
|
+
width: 100%;
|
|
40
|
+
box-sizing: border-box;
|
|
41
|
+
margin: 0;
|
|
42
|
+
|
|
43
|
+
/* Box Geometry */
|
|
44
|
+
min-height: var(
|
|
45
|
+
--recursica_ui-kit_components_text-field_properties_min-height
|
|
46
|
+
);
|
|
47
|
+
padding-top: var(
|
|
48
|
+
--recursica_ui-kit_components_text-field_properties_vertical-padding
|
|
49
|
+
);
|
|
50
|
+
padding-bottom: var(
|
|
51
|
+
--recursica_ui-kit_components_text-field_properties_vertical-padding
|
|
52
|
+
);
|
|
53
|
+
padding-left: var(
|
|
54
|
+
--recursica_ui-kit_components_text-field_properties_horizontal-padding
|
|
55
|
+
);
|
|
56
|
+
padding-right: var(
|
|
57
|
+
--recursica_ui-kit_components_text-field_properties_horizontal-padding
|
|
58
|
+
);
|
|
59
|
+
border-radius: var(
|
|
60
|
+
--recursica_ui-kit_components_text-field_properties_border-radius
|
|
61
|
+
);
|
|
62
|
+
border-width: 1px;
|
|
63
|
+
border-style: solid;
|
|
64
|
+
|
|
65
|
+
/* Strict Typography Unification */
|
|
66
|
+
font-family: var(
|
|
67
|
+
--recursica_ui-kit_components_text-field_properties_text_font-family
|
|
68
|
+
);
|
|
69
|
+
font-size: var(
|
|
70
|
+
--recursica_ui-kit_components_text-field_properties_text_font-size
|
|
71
|
+
);
|
|
72
|
+
font-style: var(
|
|
73
|
+
--recursica_ui-kit_components_text-field_properties_text_font-style
|
|
74
|
+
);
|
|
75
|
+
font-weight: var(
|
|
76
|
+
--recursica_ui-kit_components_text-field_properties_text_font-weight
|
|
77
|
+
);
|
|
78
|
+
letter-spacing: var(
|
|
79
|
+
--recursica_ui-kit_components_text-field_properties_text_letter-spacing
|
|
80
|
+
);
|
|
81
|
+
line-height: var(
|
|
82
|
+
--recursica_ui-kit_components_text-field_properties_text_line-height
|
|
83
|
+
);
|
|
84
|
+
text-decoration: var(
|
|
85
|
+
--recursica_ui-kit_components_text-field_properties_text_text-decoration
|
|
86
|
+
);
|
|
87
|
+
text-transform: var(
|
|
88
|
+
--recursica_ui-kit_components_text-field_properties_text_text-transform
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
/* Base State Default Execution */
|
|
92
|
+
background-color: var(
|
|
93
|
+
--recursica_ui-kit_components_text-field_variants_states_default_properties_colors_background
|
|
94
|
+
);
|
|
95
|
+
border-color: var(
|
|
96
|
+
--recursica_ui-kit_components_text-field_variants_states_default_properties_colors_border-color
|
|
97
|
+
);
|
|
98
|
+
color: var(
|
|
99
|
+
--recursica_ui-kit_components_text-field_variants_states_default_properties_colors_text
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
outline: none;
|
|
103
|
+
transition:
|
|
104
|
+
border-color 0.15s ease,
|
|
105
|
+
background-color 0.15s ease;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.input::placeholder {
|
|
109
|
+
opacity: var(
|
|
110
|
+
--recursica_ui-kit_components_text-field_properties_placeholder-opacity
|
|
111
|
+
);
|
|
112
|
+
color: inherit;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* Dynamic Padding Overrides */
|
|
116
|
+
.root[data-with-left-section] .input {
|
|
117
|
+
padding-left: var(--input-left-section-size);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.root[data-with-right-section] .input {
|
|
121
|
+
padding-right: var(--input-right-section-size);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* Flexible End-Caps (Icons, actions) */
|
|
125
|
+
.section {
|
|
126
|
+
display: flex;
|
|
127
|
+
align-items: center;
|
|
128
|
+
justify-content: center;
|
|
129
|
+
height: 100%;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.section :global(svg) {
|
|
133
|
+
width: var(--recursica_ui-kit_components_text-field_properties_icon-size);
|
|
134
|
+
height: var(--recursica_ui-kit_components_text-field_properties_icon-size);
|
|
135
|
+
color: var(
|
|
136
|
+
--recursica_ui-kit_components_text-field_variants_states_default_properties_colors_leading-icon
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.section[data-position="right"] :global(svg) {
|
|
141
|
+
color: var(
|
|
142
|
+
--recursica_ui-kit_components_text-field_variants_states_default_properties_colors_trailing-icon
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/* -------------------------------------
|
|
147
|
+
STATE CASCADE ARCHITECTURE
|
|
148
|
+
-------------------------------------- */
|
|
149
|
+
|
|
150
|
+
/* Focus State Mapping (Triggered internally via browser pseudo-pseudo-class) */
|
|
151
|
+
.input:focus-within,
|
|
152
|
+
.input:focus {
|
|
153
|
+
border-color: var(
|
|
154
|
+
--recursica_ui-kit_components_text-field_variants_states_focus_properties_colors_border-color
|
|
155
|
+
);
|
|
156
|
+
background-color: var(
|
|
157
|
+
--recursica_ui-kit_components_text-field_variants_states_focus_properties_colors_background
|
|
158
|
+
);
|
|
159
|
+
color: var(
|
|
160
|
+
--recursica_ui-kit_components_text-field_variants_states_focus_properties_colors_text
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.root:focus-within .section[data-position="left"] :global(svg) {
|
|
165
|
+
color: var(
|
|
166
|
+
--recursica_ui-kit_components_text-field_variants_states_focus_properties_colors_leading-icon
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.root:focus-within .section[data-position="right"] :global(svg) {
|
|
171
|
+
color: var(
|
|
172
|
+
--recursica_ui-kit_components_text-field_variants_states_focus_properties_colors_trailing-icon
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* Error State Mapping (Propagated strictly down from the wrapper DOM context) */
|
|
177
|
+
.root[data-error] .input {
|
|
178
|
+
border-color: var(
|
|
179
|
+
--recursica_ui-kit_components_text-field_variants_states_error_properties_colors_border-color
|
|
180
|
+
) !important;
|
|
181
|
+
background-color: var(
|
|
182
|
+
--recursica_ui-kit_components_text-field_variants_states_error_properties_colors_background
|
|
183
|
+
) !important;
|
|
184
|
+
color: var(
|
|
185
|
+
--recursica_ui-kit_components_text-field_variants_states_error_properties_colors_text
|
|
186
|
+
) !important;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.root[data-error] .section[data-position="left"] :global(svg) {
|
|
190
|
+
color: var(
|
|
191
|
+
--recursica_ui-kit_components_text-field_variants_states_error_properties_colors_leading-icon
|
|
192
|
+
) !important;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.root[data-error] .section[data-position="right"] :global(svg) {
|
|
196
|
+
color: var(
|
|
197
|
+
--recursica_ui-kit_components_text-field_variants_states_error_properties_colors_trailing-icon
|
|
198
|
+
) !important;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* Disabled State Mapping (Propagated strictly down from the wrapper DOM context) */
|
|
202
|
+
.root[data-disabled] .input {
|
|
203
|
+
border-color: var(
|
|
204
|
+
--recursica_ui-kit_components_text-field_variants_states_disabled_properties_colors_border-color
|
|
205
|
+
) !important;
|
|
206
|
+
background-color: var(
|
|
207
|
+
--recursica_ui-kit_components_text-field_variants_states_disabled_properties_colors_background
|
|
208
|
+
) !important;
|
|
209
|
+
color: var(
|
|
210
|
+
--recursica_ui-kit_components_text-field_variants_states_disabled_properties_colors_text
|
|
211
|
+
) !important;
|
|
212
|
+
cursor: not-allowed;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.root[data-disabled] .section[data-position="left"] :global(svg) {
|
|
216
|
+
color: var(
|
|
217
|
+
--recursica_ui-kit_components_text-field_variants_states_disabled_properties_colors_leading-icon
|
|
218
|
+
) !important;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.root[data-disabled] .section[data-position="right"] :global(svg) {
|
|
222
|
+
color: var(
|
|
223
|
+
--recursica_ui-kit_components_text-field_variants_states_disabled_properties_colors_trailing-icon
|
|
224
|
+
) !important;
|
|
225
|
+
}
|