@recursica/mantine-adapter 0.6.0 → 0.8.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.
Files changed (167) hide show
  1. package/.storybook/commonArgTypes.ts +148 -0
  2. package/CHANGELOG.md +75 -0
  3. package/dist/mantine-adapter.cjs +1 -1
  4. package/dist/mantine-adapter.cjs.map +1 -1
  5. package/dist/mantine-adapter.css +1 -1
  6. package/dist/mantine-adapter.js +1085 -687
  7. package/dist/mantine-adapter.js.map +1 -1
  8. package/dist/src/components/Checkbox/CheckboxGroup.d.ts +1 -1
  9. package/dist/src/components/Chip/Chip.d.ts +14 -2
  10. package/dist/src/components/Container/Container.d.ts +14 -0
  11. package/dist/src/components/Dropdown/Dropdown.d.ts +10 -2
  12. package/dist/src/components/Flex/Flex.d.ts +17 -0
  13. package/dist/src/components/Group/Group.d.ts +17 -0
  14. package/dist/src/components/Stack/Stack.d.ts +15 -0
  15. package/dist/src/components/TextArea/TextArea.d.ts +14 -2
  16. package/dist/src/components/index.d.ts +6 -0
  17. package/package.json +5 -2
  18. package/src/OverStyling.stories.tsx +174 -0
  19. package/src/Version.stories.tsx +56 -0
  20. package/src/components/Accordion/ACCORDION_IMPLEMENTATION_NOTES.md +48 -0
  21. package/src/components/Accordion/Accordion.module.css +261 -0
  22. package/src/components/Accordion/Accordion.stories.tsx +145 -0
  23. package/src/components/Accordion/Accordion.tsx +200 -0
  24. package/src/components/Accordion/index.ts +1 -0
  25. package/src/components/AssistiveElement/AssistiveElement.module.css +111 -0
  26. package/src/components/AssistiveElement/AssistiveElement.stories.tsx +73 -0
  27. package/src/components/AssistiveElement/AssistiveElement.tsx +91 -0
  28. package/src/components/Avatar/AVATAR_IMPLEMENTATION_NOTES.md +24 -0
  29. package/src/components/Avatar/Avatar.module.css +340 -0
  30. package/src/components/Avatar/Avatar.stories.tsx +102 -0
  31. package/src/components/Avatar/Avatar.tsx +100 -0
  32. package/src/components/Avatar/index.ts +1 -0
  33. package/src/components/Badge/BADGE_IMPLEMENTATION_NOTES.md +18 -0
  34. package/src/components/Badge/Badge.module.css +124 -0
  35. package/src/components/Badge/Badge.stories.tsx +77 -0
  36. package/src/components/Badge/Badge.tsx +66 -0
  37. package/src/components/Breadcrumb/BREADCRUMB_IMPLEMENTATION_NOTES.md +14 -0
  38. package/src/components/Breadcrumb/Breadcrumb.module.css +26 -0
  39. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +77 -0
  40. package/src/components/Breadcrumb/Breadcrumb.tsx +64 -0
  41. package/src/components/Button/Button.module.css +275 -0
  42. package/src/components/Button/Button.stories.tsx +105 -0
  43. package/src/components/Button/Button.tsx +122 -0
  44. package/src/components/Button/IMPLEMENTATION_NOTES.md +45 -0
  45. package/src/components/Button/index.ts +1 -0
  46. package/src/components/Card/CARD_IMPLEMENTATION_NOTES.md +10 -0
  47. package/src/components/Card/Card.module.css +60 -0
  48. package/src/components/Card/Card.stories.tsx +141 -0
  49. package/src/components/Card/Card.tsx +176 -0
  50. package/src/components/Checkbox/CHECKBOX_IMPLEMENTATION_NOTES.md +25 -0
  51. package/src/components/Checkbox/Checkbox.module.css +204 -0
  52. package/src/components/Checkbox/Checkbox.stories.tsx +73 -0
  53. package/src/components/Checkbox/Checkbox.tsx +111 -0
  54. package/src/components/Checkbox/CheckboxGroup.stories.tsx +138 -0
  55. package/src/components/Checkbox/CheckboxGroup.tsx +140 -0
  56. package/src/components/Chip/CHIP_IMPLEMENTATION_NOTES.md +35 -0
  57. package/src/components/Chip/Chip.module.css +218 -0
  58. package/src/components/Chip/Chip.stories.tsx +115 -0
  59. package/src/components/Chip/Chip.tsx +143 -0
  60. package/src/components/Container/CONTAINER_IMPLEMENTATION_NOTES.md +4 -0
  61. package/src/components/Container/Container.module.css +7 -0
  62. package/src/components/Container/Container.stories.tsx +102 -0
  63. package/src/components/Container/Container.tsx +63 -0
  64. package/src/components/DatePicker/DatePicker.stories.tsx +22 -0
  65. package/src/components/DatePicker/DatePicker.tsx +7 -0
  66. package/src/components/Dropdown/DROPDOWN_IMPLEMENTATION_NOTES.md +7 -0
  67. package/src/components/Dropdown/Dropdown.module.css +272 -0
  68. package/src/components/Dropdown/Dropdown.stories.tsx +94 -0
  69. package/src/components/Dropdown/Dropdown.tsx +186 -0
  70. package/src/components/FileInput/FileInput.stories.tsx +22 -0
  71. package/src/components/FileInput/FileInput.tsx +7 -0
  72. package/src/components/FileUpload/FileUpload.stories.tsx +22 -0
  73. package/src/components/FileUpload/FileUpload.tsx +7 -0
  74. package/src/components/Flex/FLEX_IMPLEMENTATION_NOTES.md +4 -0
  75. package/src/components/Flex/Flex.module.css +7 -0
  76. package/src/components/Flex/Flex.stories.tsx +125 -0
  77. package/src/components/Flex/Flex.tsx +68 -0
  78. package/src/components/FormControlWrapper/FORMCONTROLWRAPPER_IMPLEMENTATION_NOTES.md +32 -0
  79. package/src/components/FormControlWrapper/FormControlWrapper.module.css +46 -0
  80. package/src/components/FormControlWrapper/FormControlWrapper.stories.tsx +116 -0
  81. package/src/components/FormControlWrapper/FormControlWrapper.tsx +170 -0
  82. package/src/components/Group/GROUP_IMPLEMENTATION_NOTES.md +4 -0
  83. package/src/components/Group/Group.module.css +7 -0
  84. package/src/components/Group/Group.stories.tsx +117 -0
  85. package/src/components/Group/Group.tsx +68 -0
  86. package/src/components/HoverCard/HoverCard.stories.tsx +17 -0
  87. package/src/components/HoverCard/HoverCard.tsx +7 -0
  88. package/src/components/Label/LABEL_IMPLEMENTATION_NOTES.md +48 -0
  89. package/src/components/Label/Label.module.css +177 -0
  90. package/src/components/Label/Label.stories.tsx +123 -0
  91. package/src/components/Label/Label.tsx +132 -0
  92. package/src/components/Label/index.ts +1 -0
  93. package/src/components/Link/Link.stories.tsx +17 -0
  94. package/src/components/Link/Link.tsx +7 -0
  95. package/src/components/Loader/Loader.stories.tsx +17 -0
  96. package/src/components/Loader/Loader.tsx +7 -0
  97. package/src/components/Menu/Menu.stories.tsx +17 -0
  98. package/src/components/Menu/Menu.tsx +7 -0
  99. package/src/components/Modal/Modal.stories.tsx +17 -0
  100. package/src/components/Modal/Modal.tsx +7 -0
  101. package/src/components/NumberInput/NumberInput.stories.tsx +22 -0
  102. package/src/components/NumberInput/NumberInput.tsx +7 -0
  103. package/src/components/Pagination/Pagination.stories.tsx +17 -0
  104. package/src/components/Pagination/Pagination.tsx +7 -0
  105. package/src/components/Panel/Panel.stories.tsx +17 -0
  106. package/src/components/Panel/Panel.tsx +7 -0
  107. package/src/components/Popover/Popover.stories.tsx +17 -0
  108. package/src/components/Popover/Popover.tsx +7 -0
  109. package/src/components/Radio/Radio.stories.tsx +22 -0
  110. package/src/components/Radio/Radio.tsx +7 -0
  111. package/src/components/ReadOnlyField/READ_ONLY_FIELD_IMPLEMENTATION_NOTES.md +15 -0
  112. package/src/components/ReadOnlyField/ReadOnlyField.module.css +49 -0
  113. package/src/components/ReadOnlyField/ReadOnlyField.stories.tsx +120 -0
  114. package/src/components/ReadOnlyField/ReadOnlyField.tsx +75 -0
  115. package/src/components/ReadOnlyField/ReadOnlyTextField.tsx +46 -0
  116. package/src/components/ReadOnlyField/WithReadOnlyWrapper.tsx +85 -0
  117. package/src/components/ReadOnlyField/index.ts +3 -0
  118. package/src/components/Search/Search.stories.tsx +17 -0
  119. package/src/components/Search/Search.tsx +7 -0
  120. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +22 -0
  121. package/src/components/SegmentedControl/SegmentedControl.tsx +7 -0
  122. package/src/components/Slider/Slider.stories.tsx +22 -0
  123. package/src/components/Slider/Slider.tsx +7 -0
  124. package/src/components/Stack/STACK_IMPLEMENTATION_NOTES.md +4 -0
  125. package/src/components/Stack/Stack.module.css +7 -0
  126. package/src/components/Stack/Stack.stories.tsx +105 -0
  127. package/src/components/Stack/Stack.tsx +66 -0
  128. package/src/components/Stepper/Stepper.stories.tsx +17 -0
  129. package/src/components/Stepper/Stepper.tsx +7 -0
  130. package/src/components/Switch/Switch.stories.tsx +22 -0
  131. package/src/components/Switch/Switch.tsx +7 -0
  132. package/src/components/Table/Table.stories.tsx +17 -0
  133. package/src/components/Table/Table.tsx +7 -0
  134. package/src/components/Tabs/Tabs.stories.tsx +17 -0
  135. package/src/components/Tabs/Tabs.tsx +7 -0
  136. package/src/components/Text/Text.stories.tsx +88 -0
  137. package/src/components/Text/Text.tsx +54 -0
  138. package/src/components/TextArea/TEXTAREA_IMPLEMENTATION_NOTES.md +7 -0
  139. package/src/components/TextArea/TextArea.module.css +225 -0
  140. package/src/components/TextArea/TextArea.stories.tsx +94 -0
  141. package/src/components/TextArea/TextArea.tsx +164 -0
  142. package/src/components/TextField/TEXTFIELD_IMPLEMENTATION_NOTES.md +19 -0
  143. package/src/components/TextField/TextField.module.css +225 -0
  144. package/src/components/TextField/TextField.stories.tsx +162 -0
  145. package/src/components/TextField/TextField.tsx +138 -0
  146. package/src/components/TimePicker/TimePicker.stories.tsx +22 -0
  147. package/src/components/TimePicker/TimePicker.tsx +7 -0
  148. package/src/components/Timeline/Timeline.stories.tsx +17 -0
  149. package/src/components/Timeline/Timeline.tsx +7 -0
  150. package/src/components/Title/Title.stories.tsx +63 -0
  151. package/src/components/Title/Title.tsx +45 -0
  152. package/src/components/Toast/Toast.stories.tsx +17 -0
  153. package/src/components/Toast/Toast.tsx +7 -0
  154. package/src/components/Tooltip/Tooltip.stories.tsx +17 -0
  155. package/src/components/Tooltip/Tooltip.tsx +7 -0
  156. package/src/components/TransferList/TransferList.stories.tsx +17 -0
  157. package/src/components/TransferList/TransferList.tsx +7 -0
  158. package/src/components/index.ts +45 -0
  159. package/src/env.d.ts +7 -0
  160. package/src/index.ts +3 -0
  161. package/src/types/index.ts +9 -0
  162. package/src/types/mantine.d.ts +7 -0
  163. package/src/types/scss-modules.d.ts +9 -0
  164. package/src/utils/ColorSchemeWrapper.tsx +27 -0
  165. package/src/utils/copyToClipboard.ts +36 -0
  166. package/src/utils/filterStylingProps.ts +139 -0
  167. package/src/utils/index.ts +1 -0
@@ -0,0 +1,105 @@
1
+ import React from "react";
2
+ import type { Meta, StoryObj } from "@storybook/react";
3
+ import { Stack } from "./Stack";
4
+ import { Button } from "../Button";
5
+ import { Text } from "../Text/Text";
6
+
7
+ type StackStoryProps = React.ComponentProps<typeof Stack>;
8
+
9
+ const meta: Meta<StackStoryProps> = {
10
+ title: "UI-Kit/Stack",
11
+ component: Stack,
12
+ tags: ["autodocs"],
13
+ parameters: {
14
+ docs: {
15
+ description: {
16
+ component:
17
+ "Stack is a flex vertical layout container that maps directly to Mantine's Stack component allowing safe layout property passing.",
18
+ },
19
+ },
20
+ },
21
+ args: {
22
+ gap: "rec-default",
23
+ align: "stretch",
24
+ justify: "flex-start",
25
+ },
26
+ argTypes: {
27
+ gap: {
28
+ control: "select",
29
+ options: [
30
+ "rec-none",
31
+ "rec-sm",
32
+ "rec-default",
33
+ "rec-md",
34
+ "rec-lg",
35
+ "rec-xl",
36
+ "rec-2xl",
37
+ "xs",
38
+ "sm",
39
+ "md",
40
+ "lg",
41
+ "xl",
42
+ ],
43
+ description: "Gap between elements",
44
+ },
45
+ align: {
46
+ control: "select",
47
+ options: ["flex-start", "center", "flex-end", "stretch"],
48
+ description: "Align-items property",
49
+ },
50
+ justify: {
51
+ control: "select",
52
+ options: [
53
+ "flex-start",
54
+ "center",
55
+ "flex-end",
56
+ "space-between",
57
+ "space-around",
58
+ ],
59
+ description: "Justify-content property",
60
+ },
61
+ defaultChecked: {
62
+ table: { disable: true },
63
+ },
64
+ },
65
+ };
66
+
67
+ export default meta;
68
+
69
+ type Story = StoryObj<StackStoryProps>;
70
+
71
+ export const Default: Story = {
72
+ render: (args) => (
73
+ <Stack {...args}>
74
+ <Button variant="solid">Primary Block</Button>
75
+ <Button variant="outline">Secondary Block</Button>
76
+ <Text>Text element within Stack</Text>
77
+ </Stack>
78
+ ),
79
+ };
80
+
81
+ export const StaticGapSmall: Story = {
82
+ args: {
83
+ gap: "rec-sm",
84
+ },
85
+ render: (args) => (
86
+ <Stack {...args}>
87
+ <Button variant="solid">Item 1</Button>
88
+ <Button variant="solid">Item 2</Button>
89
+ <Button variant="solid">Item 3</Button>
90
+ </Stack>
91
+ ),
92
+ };
93
+
94
+ export const StaticGapLarge: Story = {
95
+ args: {
96
+ gap: "rec-xl",
97
+ },
98
+ render: (args) => (
99
+ <Stack {...args}>
100
+ <Button variant="solid">Item 1</Button>
101
+ <Button variant="solid">Item 2</Button>
102
+ <Button variant="solid">Item 3</Button>
103
+ </Stack>
104
+ ),
105
+ };
@@ -0,0 +1,66 @@
1
+ import React, { forwardRef } from "react";
2
+ import {
3
+ Stack as MantineStack,
4
+ type StackProps as MantineStackProps,
5
+ } from "@mantine/core";
6
+ import {
7
+ filterStylingProps,
8
+ type RecursicaOverStyled,
9
+ type RecursicaSpacing,
10
+ } from "../../utils/filterStylingProps";
11
+ import styles from "./Stack.module.css";
12
+
13
+ export interface RecursicaStackProps {
14
+ /**
15
+ * Children components inside the stack
16
+ */
17
+ children?: React.ReactNode;
18
+ gap?: MantineStackProps["gap"] | RecursicaSpacing;
19
+ }
20
+
21
+ /**
22
+ * Stack flex layout wrapper
23
+ */
24
+ export type StackProps = RecursicaOverStyled<
25
+ MantineStackProps & RecursicaStackProps
26
+ >;
27
+
28
+ export const Stack = forwardRef<HTMLDivElement, StackProps>(function Stack(
29
+ { children, overStyled = false, gap = "rec-default", ...rest },
30
+ ref,
31
+ ) {
32
+ const sanitizedProps = filterStylingProps({ ...rest, gap }, overStyled);
33
+ const restRecord = sanitizedProps as Record<string, unknown>;
34
+
35
+ const mergedClassNames: Partial<Record<string, string>> = {
36
+ root: styles.root,
37
+ };
38
+
39
+ const classNamesProp = restRecord.classNames;
40
+ if (
41
+ classNamesProp &&
42
+ typeof classNamesProp === "object" &&
43
+ !Array.isArray(classNamesProp)
44
+ ) {
45
+ const o = classNamesProp as Partial<Record<string, string>>;
46
+ mergedClassNames.root = o.root ? `${styles.root} ${o.root}` : styles.root;
47
+ }
48
+
49
+ const classNameProp = restRecord.className as string | undefined;
50
+ const finalClass = classNameProp
51
+ ? `${styles.root} ${classNameProp}`
52
+ : styles.root;
53
+
54
+ return (
55
+ <MantineStack
56
+ ref={ref}
57
+ className={finalClass}
58
+ classNames={mergedClassNames}
59
+ {...sanitizedProps}
60
+ >
61
+ {children}
62
+ </MantineStack>
63
+ );
64
+ });
65
+
66
+ Stack.displayName = "Stack";
@@ -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,7 @@
1
+ import React from "react";
2
+
3
+ export type StepperProps = React.HTMLAttributes<HTMLDivElement>;
4
+
5
+ export const Stepper: React.FC<StepperProps> = (props) => {
6
+ return <div {...props}>Stepper</div>;
7
+ };
@@ -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,7 @@
1
+ import React from "react";
2
+
3
+ export type SwitchProps = React.HTMLAttributes<HTMLDivElement>;
4
+
5
+ export const Switch: React.FC<SwitchProps> = (props) => {
6
+ return <div {...props}>Switch</div>;
7
+ };
@@ -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,7 @@
1
+ import React from "react";
2
+
3
+ export type TableProps = React.HTMLAttributes<HTMLDivElement>;
4
+
5
+ export const Table: React.FC<TableProps> = (props) => {
6
+ return <div {...props}>Table</div>;
7
+ };
@@ -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,7 @@
1
+ import React from "react";
2
+
3
+ export type TabsProps = React.HTMLAttributes<HTMLDivElement>;
4
+
5
+ export const Tabs: React.FC<TabsProps> = (props) => {
6
+ return <div {...props}>Tabs</div>;
7
+ };
@@ -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,7 @@
1
+ # TextArea Implementation Notes
2
+
3
+ The `TextArea` component is mapped explicitly to Mantine's `<Textarea>` following the same strict encapsulation rules as `TextField`.
4
+
5
+ 1. **Naked Primitive Mapping:** Mantine's `Textarea` natively executes macro-label generation. To decouple it, we explicitly disable internal labels (`label={undefined}`) and inject it purely inside our generic `FormControlWrapper`.
6
+ 2. **Text Field Token Re-Use:** Because text areas fundamentally share the same box-geometry, text, and state definitions as single-line inputs, it strictly implements the `--recursica_ui-kit_components_text-field_...` variables natively.
7
+ 3. **Autosize Handling:** The component supports Mantine's raw `autosize`, `minRows`, and `maxRows` parameters out of the box dynamically via property passthrough.
@@ -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
+ }