@recursica/mui-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.
Files changed (212) hide show
  1. package/ARCHITECTURE.md +15 -0
  2. package/CHANGELOG.md +15 -0
  3. package/SETUP.md +77 -0
  4. package/USAGE.md +55 -0
  5. package/dist/mui-adapter.cjs +74 -1
  6. package/dist/mui-adapter.cjs.map +1 -1
  7. package/dist/mui-adapter.css +1 -1
  8. package/dist/mui-adapter.js +6863 -205
  9. package/dist/mui-adapter.js.map +1 -1
  10. package/dist/src/components/Accordion/Accordion.d.ts +43 -2
  11. package/dist/src/components/AssistiveElement/AssistiveElement.d.ts +6 -2
  12. package/dist/src/components/Autocomplete/Autocomplete.d.ts +12 -2
  13. package/dist/src/components/Avatar/Avatar.d.ts +10 -3
  14. package/dist/src/components/Badge/Badge.d.ts +10 -3
  15. package/dist/src/components/Breadcrumb/Breadcrumb.d.ts +9 -3
  16. package/dist/src/components/Button/Button.d.ts +2 -17
  17. package/dist/src/components/Card/Card.d.ts +38 -3
  18. package/dist/src/components/Checkbox/Checkbox.d.ts +13 -2
  19. package/dist/src/components/Checkbox/CheckboxGroup.d.ts +18 -0
  20. package/dist/src/components/Checkbox/index.d.ts +5 -1
  21. package/dist/src/components/Chip/Chip.d.ts +9 -2
  22. package/dist/src/components/Container/Container.d.ts +1 -5
  23. package/dist/src/components/DatePicker/DatePicker.d.ts +2 -1
  24. package/dist/src/components/Dropdown/Dropdown.d.ts +12 -2
  25. package/dist/src/components/Flex/Flex.d.ts +2 -22
  26. package/dist/src/components/FormControlLayout/FormControlLayout.d.ts +5 -2
  27. package/dist/src/components/FormControlWrapper/FormControlWrapper.d.ts +9 -2
  28. package/dist/src/components/Group/Group.d.ts +2 -7
  29. package/dist/src/components/HoverCard/HoverCard.d.ts +28 -2
  30. package/dist/src/components/Label/Label.d.ts +6 -2
  31. package/dist/src/components/Link/Link.d.ts +2 -6
  32. package/dist/src/components/Loader/Loader.d.ts +2 -7
  33. package/dist/src/components/Menu/Menu.d.ts +25 -3
  34. package/dist/src/components/Modal/Modal.d.ts +37 -2
  35. package/dist/src/components/NumberInput/NumberInput.d.ts +12 -2
  36. package/dist/src/components/Pagination/Pagination.d.ts +12 -3
  37. package/dist/src/components/Pagination/Pagination.icons.d.ts +8 -0
  38. package/dist/src/components/Panel/Panel.d.ts +52 -3
  39. package/dist/src/components/Radio/Radio.d.ts +13 -3
  40. package/dist/src/components/Radio/RadioGroup.d.ts +9 -0
  41. package/dist/src/components/ReadOnlyField/ReadOnlyBooleanField.d.ts +5 -0
  42. package/dist/src/components/ReadOnlyField/ReadOnlyField.d.ts +4 -2
  43. package/dist/src/components/ReadOnlyField/ReadOnlySwitchField.d.ts +5 -0
  44. package/dist/src/components/ReadOnlyField/ReadOnlyTextField.d.ts +8 -0
  45. package/dist/src/components/ReadOnlyField/WithReadOnlyWrapper.d.ts +28 -0
  46. package/dist/src/components/ReadOnlyField/index.d.ts +1 -0
  47. package/dist/src/components/SegmentedControl/SegmentedControl.d.ts +21 -3
  48. package/dist/src/components/Slider/Slider.d.ts +18 -2
  49. package/dist/src/components/Stack/Stack.d.ts +2 -5
  50. package/dist/src/components/Stepper/Stepper.d.ts +41 -2
  51. package/dist/src/components/Switch/Switch.d.ts +10 -3
  52. package/dist/src/components/Switch/SwitchGroup.d.ts +13 -0
  53. package/dist/src/components/Table/Table.d.ts +2 -1
  54. package/dist/src/components/Tabs/Tabs.d.ts +20 -3
  55. package/dist/src/components/Text/Text.d.ts +2 -16
  56. package/dist/src/components/TextArea/TextArea.d.ts +12 -2
  57. package/dist/src/components/TextField/TextField.d.ts +12 -2
  58. package/dist/src/components/TimePicker/TimePicker.d.ts +2 -1
  59. package/dist/src/components/Timeline/Timeline.d.ts +15 -2
  60. package/dist/src/components/Timeline/TimelineItem.d.ts +18 -0
  61. package/dist/src/components/Title/Title.d.ts +2 -15
  62. package/dist/src/components/Toast/Toast.d.ts +20 -2
  63. package/dist/src/components/Tooltip/Tooltip.d.ts +28 -3
  64. package/dist/src/components/TransferList/TransferList.d.ts +2 -1
  65. package/dist/src/components/Typography/Typography.d.ts +1 -1
  66. package/dist/src/utils/RequireAccessibleLabel.d.ts +1 -18
  67. package/dist/src/utils/filterStylingProps.d.ts +1 -11
  68. package/llms.txt +16 -0
  69. package/package.json +14 -3
  70. package/src/components/Accordion/Accordion.module.css +294 -56
  71. package/src/components/Accordion/Accordion.stories.tsx +131 -21
  72. package/src/components/Accordion/Accordion.tsx +260 -5
  73. package/src/components/AssistiveElement/AssistiveElement.module.css +114 -20
  74. package/src/components/AssistiveElement/AssistiveElement.stories.tsx +60 -20
  75. package/src/components/AssistiveElement/AssistiveElement.tsx +81 -5
  76. package/src/components/Autocomplete/Autocomplete.module.css +319 -42
  77. package/src/components/Autocomplete/Autocomplete.stories.tsx +175 -23
  78. package/src/components/Autocomplete/Autocomplete.tsx +181 -6
  79. package/src/components/Avatar/Avatar.module.css +343 -73
  80. package/src/components/Avatar/Avatar.stories.tsx +94 -22
  81. package/src/components/Avatar/Avatar.tsx +99 -6
  82. package/src/components/Badge/Badge.module.css +127 -29
  83. package/src/components/Badge/Badge.stories.tsx +65 -22
  84. package/src/components/Badge/Badge.tsx +67 -6
  85. package/src/components/Breadcrumb/Breadcrumb.module.css +25 -5
  86. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +57 -22
  87. package/src/components/Breadcrumb/Breadcrumb.tsx +59 -6
  88. package/src/components/Button/Button.module.css +19 -61
  89. package/src/components/Button/Button.stories.tsx +24 -23
  90. package/src/components/Button/Button.tsx +7 -18
  91. package/src/components/Card/Card.module.css +154 -38
  92. package/src/components/Card/Card.stories.tsx +117 -19
  93. package/src/components/Card/Card.tsx +181 -5
  94. package/src/components/Checkbox/Checkbox.module.css +249 -39
  95. package/src/components/Checkbox/Checkbox.stories.tsx +81 -19
  96. package/src/components/Checkbox/Checkbox.tsx +246 -5
  97. package/src/components/Checkbox/CheckboxGroup.stories.tsx +139 -0
  98. package/src/components/Checkbox/CheckboxGroup.tsx +137 -0
  99. package/src/components/Checkbox/index.ts +6 -1
  100. package/src/components/Chip/Chip.module.css +246 -43
  101. package/src/components/Chip/Chip.stories.tsx +101 -21
  102. package/src/components/Chip/Chip.tsx +136 -6
  103. package/src/components/Container/Container.stories.tsx +103 -20
  104. package/src/components/Container/Container.tsx +1 -13
  105. package/src/components/DatePicker/DatePicker.stories.tsx +125 -19
  106. package/src/components/DatePicker/DatePicker.tsx +3 -1
  107. package/src/components/Dropdown/Dropdown.module.css +291 -41
  108. package/src/components/Dropdown/Dropdown.stories.tsx +80 -21
  109. package/src/components/Dropdown/Dropdown.tsx +180 -6
  110. package/src/components/FileInput/FileInput.stories.tsx +2 -19
  111. package/src/components/FileUpload/FileUpload.stories.tsx +2 -19
  112. package/src/components/Flex/Flex.stories.tsx +113 -20
  113. package/src/components/Flex/Flex.tsx +16 -26
  114. package/src/components/FormControlLayout/FormControlLayout.module.css +92 -0
  115. package/src/components/FormControlLayout/FormControlLayout.stories.tsx +67 -20
  116. package/src/components/FormControlLayout/FormControlLayout.tsx +69 -4
  117. package/src/components/FormControlWrapper/FormControlWrapper.module.css +87 -0
  118. package/src/components/FormControlWrapper/FormControlWrapper.stories.tsx +116 -22
  119. package/src/components/FormControlWrapper/FormControlWrapper.tsx +126 -6
  120. package/src/components/Group/Group.stories.tsx +6 -30
  121. package/src/components/Group/Group.tsx +14 -9
  122. package/src/components/HoverCard/HoverCard.module.css +90 -22
  123. package/src/components/HoverCard/HoverCard.stories.tsx +158 -21
  124. package/src/components/HoverCard/HoverCard.tsx +147 -5
  125. package/src/components/Label/Label.module.css +140 -35
  126. package/src/components/Label/Label.stories.tsx +108 -21
  127. package/src/components/Label/Label.tsx +82 -5
  128. package/src/components/Link/Link.module.css +4 -3
  129. package/src/components/Link/Link.stories.tsx +2 -8
  130. package/src/components/Link/Link.tsx +1 -5
  131. package/src/components/Loader/Loader.module.css +1 -2
  132. package/src/components/Loader/Loader.tsx +1 -7
  133. package/src/components/Menu/IMPLEMENTATION_NOTES.md +4 -0
  134. package/src/components/Menu/Menu.module.css +285 -51
  135. package/src/components/Menu/Menu.stories.tsx +229 -25
  136. package/src/components/Menu/Menu.tsx +73 -6
  137. package/src/components/Modal/Modal.module.css +171 -35
  138. package/src/components/Modal/Modal.stories.tsx +66 -22
  139. package/src/components/Modal/Modal.tsx +215 -5
  140. package/src/components/NumberInput/NumberInput.module.css +276 -42
  141. package/src/components/NumberInput/NumberInput.stories.tsx +83 -20
  142. package/src/components/NumberInput/NumberInput.tsx +136 -6
  143. package/src/components/Pagination/IMPLEMENTATION_NOTES.md +3 -0
  144. package/src/components/Pagination/Pagination.icons.tsx +66 -0
  145. package/src/components/Pagination/Pagination.module.css +234 -20
  146. package/src/components/Pagination/Pagination.stories.tsx +34 -21
  147. package/src/components/Pagination/Pagination.tsx +74 -6
  148. package/src/components/Panel/Panel.module.css +206 -38
  149. package/src/components/Panel/Panel.stories.tsx +214 -22
  150. package/src/components/Panel/Panel.tsx +130 -5
  151. package/src/components/Radio/Radio.module.css +235 -37
  152. package/src/components/Radio/Radio.stories.tsx +77 -19
  153. package/src/components/Radio/Radio.tsx +210 -5
  154. package/src/components/Radio/RadioGroup.stories.tsx +117 -0
  155. package/src/components/Radio/RadioGroup.tsx +125 -0
  156. package/src/components/ReadOnlyField/ReadOnlyBooleanField.tsx +21 -0
  157. package/src/components/ReadOnlyField/ReadOnlyField.module.css +53 -15
  158. package/src/components/ReadOnlyField/ReadOnlyField.stories.tsx +147 -19
  159. package/src/components/ReadOnlyField/ReadOnlyField.tsx +105 -5
  160. package/src/components/ReadOnlyField/ReadOnlySwitchField.tsx +21 -0
  161. package/src/components/ReadOnlyField/ReadOnlyTextField.tsx +48 -0
  162. package/src/components/ReadOnlyField/WithReadOnlyWrapper.tsx +93 -0
  163. package/src/components/ReadOnlyField/index.ts +1 -0
  164. package/src/components/SegmentedControl/SegmentedControl.module.css +179 -47
  165. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +102 -20
  166. package/src/components/SegmentedControl/SegmentedControl.tsx +140 -6
  167. package/src/components/Slider/Slider.module.css +539 -86
  168. package/src/components/Slider/Slider.stories.tsx +157 -19
  169. package/src/components/Slider/Slider.tsx +283 -5
  170. package/src/components/Stack/Stack.stories.tsx +4 -25
  171. package/src/components/Stack/Stack.tsx +1 -5
  172. package/src/components/Stepper/IMPLEMENTATION_NOTES.md +4 -0
  173. package/src/components/Stepper/Stepper.module.css +410 -71
  174. package/src/components/Stepper/Stepper.stories.tsx +146 -20
  175. package/src/components/Stepper/Stepper.tsx +147 -6
  176. package/src/components/Switch/Switch.module.css +259 -39
  177. package/src/components/Switch/Switch.stories.tsx +98 -19
  178. package/src/components/Switch/Switch.tsx +200 -6
  179. package/src/components/Switch/SwitchGroup.stories.tsx +132 -0
  180. package/src/components/Switch/SwitchGroup.tsx +120 -0
  181. package/src/components/Table/Table.stories.tsx +1 -19
  182. package/src/components/Table/Table.tsx +3 -1
  183. package/src/components/Tabs/IMPLEMENTATION_NOTES.md +4 -0
  184. package/src/components/Tabs/Tabs.module.css +422 -79
  185. package/src/components/Tabs/Tabs.stories.tsx +156 -20
  186. package/src/components/Tabs/Tabs.tsx +86 -6
  187. package/src/components/Text/Text.stories.tsx +5 -17
  188. package/src/components/Text/Text.tsx +1 -15
  189. package/src/components/TextArea/TextArea.module.css +155 -32
  190. package/src/components/TextArea/TextArea.stories.tsx +80 -21
  191. package/src/components/TextArea/TextArea.tsx +146 -6
  192. package/src/components/TextField/TextField.module.css +261 -42
  193. package/src/components/TextField/TextField.stories.tsx +147 -20
  194. package/src/components/TextField/TextField.tsx +169 -6
  195. package/src/components/TimePicker/TimePicker.stories.tsx +2 -19
  196. package/src/components/TimePicker/TimePicker.tsx +3 -1
  197. package/src/components/Timeline/Timeline.module.css +365 -76
  198. package/src/components/Timeline/Timeline.stories.tsx +114 -21
  199. package/src/components/Timeline/Timeline.tsx +83 -5
  200. package/src/components/Timeline/TimelineItem.tsx +90 -0
  201. package/src/components/Title/Title.stories.tsx +0 -18
  202. package/src/components/Title/Title.tsx +1 -7
  203. package/src/components/Toast/Toast.module.css +166 -28
  204. package/src/components/Toast/Toast.stories.tsx +54 -22
  205. package/src/components/Toast/Toast.tsx +124 -5
  206. package/src/components/Tooltip/Tooltip.module.css +89 -24
  207. package/src/components/Tooltip/Tooltip.stories.tsx +152 -22
  208. package/src/components/Tooltip/Tooltip.tsx +88 -5
  209. package/src/components/TransferList/TransferList.stories.tsx +1 -19
  210. package/src/components/TransferList/TransferList.tsx +3 -1
  211. package/src/utils/RequireAccessibleLabel.ts +1 -12
  212. package/src/utils/filterStylingProps.ts +7 -20
@@ -1,35 +1,118 @@
1
+ import React from "react";
1
2
  import type { Meta, StoryObj } from "@storybook/react";
2
3
  import { Container } from "./Container";
3
- import { ComingSoon } from "@recursica/storybook-template";
4
+ import { Text } from "../Text/Text";
4
5
 
5
- const meta: Meta<typeof Container> = {
6
- title: "UI-Kit/🚧 Container",
6
+ type ContainerStoryProps = React.ComponentProps<typeof Container>;
7
+
8
+ const meta: Meta<ContainerStoryProps> = {
9
+ title: "UI-Kit/Container",
7
10
  component: Container,
8
11
  tags: ["autodocs"],
9
12
  parameters: {
10
- controls: {
11
- include: [
12
- "layer",
13
- "withLayer",
14
- "children",
15
- "component",
16
- "variant",
17
- "size",
18
- "icon",
19
- "disabled",
20
- "href",
21
- "onClick",
22
- "onChange",
23
- "value",
24
- "checked",
13
+ docs: {
14
+ description: {
15
+ component:
16
+ "Container is a generic layout wrapper that safely maps to Mantine's Container, standardizing maximum content widths across the application.",
17
+ },
18
+ },
19
+ },
20
+ args: {
21
+ size: "md",
22
+ fluid: false,
23
+ },
24
+ argTypes: {
25
+ size: {
26
+ control: "select",
27
+ options: [
28
+ "xs",
29
+ "sm",
30
+ "md",
31
+ "lg",
32
+ "xl",
33
+ "rec-sm",
34
+ "rec-default",
35
+ "rec-md",
36
+ "rec-lg",
37
+ "rec-xl",
38
+ "rec-2xl",
25
39
  ],
40
+ description:
41
+ "Maximum width defined by Mantine system sizes or Recursica sizes",
42
+ },
43
+ fluid: {
44
+ control: "boolean",
45
+ description: "If true, overrides size and sets max-width to 100%",
46
+ },
47
+ defaultChecked: {
48
+ table: { disable: true },
26
49
  },
27
50
  },
28
51
  };
29
52
 
30
53
  export default meta;
31
- type Story = StoryObj<typeof Container>;
54
+
55
+ type Story = StoryObj<ContainerStoryProps>;
32
56
 
33
57
  export const Default: Story = {
34
- render: () => <ComingSoon componentName="Container" />,
58
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
59
+ render: ({ withLayer, layer, ...args }: any) => (
60
+ <div style={{ backgroundColor: "#f0f0f0", padding: "16px" }}>
61
+ <Container
62
+ {...args}
63
+ style={{
64
+ backgroundColor: "white",
65
+ padding: "16px",
66
+ border: "1px solid #ccc",
67
+ }}
68
+ >
69
+ <Text>
70
+ This is a Container holding centered content. The background and
71
+ border are added just to demonstrate the layout bounds visually.
72
+ </Text>
73
+ </Container>
74
+ </div>
75
+ ),
76
+ };
77
+
78
+ export const SmallContainer: Story = {
79
+ args: {
80
+ size: "sm",
81
+ },
82
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
83
+ render: ({ withLayer, layer, ...args }: any) => (
84
+ <div style={{ backgroundColor: "#f0f0f0", padding: "16px" }}>
85
+ <Container
86
+ {...args}
87
+ style={{
88
+ backgroundColor: "white",
89
+ padding: "16px",
90
+ border: "1px solid #ccc",
91
+ }}
92
+ >
93
+ <Text>Small Container Layout</Text>
94
+ </Container>
95
+ </div>
96
+ ),
97
+ };
98
+
99
+ export const FluidContainer: Story = {
100
+ args: {
101
+ fluid: true,
102
+ },
103
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
104
+ render: ({ withLayer, layer, ...args }: any) => (
105
+ <div style={{ backgroundColor: "#f0f0f0", padding: "16px" }}>
106
+ <Container
107
+ {...args}
108
+ style={{
109
+ backgroundColor: "white",
110
+ padding: "16px",
111
+ border: "1px solid #ccc",
112
+ }}
113
+ >
114
+ <Text>Fluid Container Layout</Text>
115
+ </Container>
116
+ </div>
117
+ ),
35
118
  };
@@ -11,20 +11,8 @@ import {
11
11
  Container as MUIContainer,
12
12
  type ContainerProps as MUIContainerProps,
13
13
  } from "@mui/material";
14
- import { type RecursicaSpacing } from "../../utils/filterStylingProps";
15
14
 
16
- export interface RecursicaContainerProps {
17
- children?: React.ReactNode;
18
- size?:
19
- | "xs"
20
- | "sm"
21
- | "md"
22
- | "lg"
23
- | "xl"
24
- | RecursicaSpacing
25
- | (string & {})
26
- | number;
27
- }
15
+ import { type RecursicaContainerProps } from "@recursica/adapter-common";
28
16
 
29
17
  export type ContainerProps = Omit<MUIContainerProps, "maxWidth"> &
30
18
  RecursicaContainerProps;
@@ -1,35 +1,141 @@
1
+ import React from "react";
1
2
  import type { Meta, StoryObj } from "@storybook/react";
2
3
  import { DatePicker } from "./DatePicker";
3
- import { ComingSoon } from "@recursica/storybook-template";
4
+ import { formControlArgTypes } from "../../../.storybook/commonArgTypes";
4
5
 
5
6
  const meta: Meta<typeof DatePicker> = {
6
- title: "UI-Kit/🚧 DatePicker",
7
+ title: "UI-Kit/DatePicker",
7
8
  component: DatePicker,
8
9
  tags: ["autodocs"],
9
10
  parameters: {
10
- controls: {
11
- include: [
12
- "layer",
13
- "withLayer",
14
- "children",
15
- "component",
16
- "variant",
17
- "size",
18
- "icon",
19
- "disabled",
20
- "href",
21
- "onClick",
22
- "onChange",
23
- "value",
24
- "checked",
25
- ],
11
+ docs: {
12
+ description: {
13
+ component: `
14
+ The \`DatePicker\` primitive provides a unified calendar date selection input integrated directly into the \`FormControlWrapper\` architecture.
15
+
16
+ ### Architectural Decoupling
17
+ Recursica overrides the internal Mantine \`DatePickerInput\` wrapper defaults, safely injecting the date picker into our rigid structural layout systems. State modifiers (e.g. Focus, Errors, ReadOnly) hook seamlessly back onto our native CSS mapping architecture.
18
+
19
+ ### Examples
20
+ Always structure horizontal architectures via the generic \`formLayout\` parameter.
21
+ \`\`\`tsx
22
+ <DatePicker
23
+ label="Start Date"
24
+ assistiveText="Select the deployment kick-off date."
25
+ formLayout="stacked"
26
+ />
27
+ \`\`\`
28
+ `,
29
+ },
30
+ },
31
+ },
32
+ argTypes: {
33
+ ...formControlArgTypes,
34
+ disabled: {
35
+ control: "boolean",
36
+ description:
37
+ "Maps the formal disabled variable states structurally to the input core.",
38
+ },
39
+ error: {
40
+ control: "text",
41
+ description:
42
+ "Applies the strict error string boundary rendering invalid structures seamlessly.",
43
+ },
44
+ required: {
45
+ control: "boolean",
46
+ },
47
+ label: {
48
+ control: "text",
49
+ },
50
+ assistiveText: {
51
+ control: "text",
52
+ },
53
+ readOnly: {
54
+ control: "boolean",
55
+ description:
56
+ "Toggles structural read-only data presentation explicitly blocking standard component bindings.",
26
57
  },
27
58
  },
28
59
  };
29
60
 
30
61
  export default meta;
62
+
31
63
  type Story = StoryObj<typeof DatePicker>;
32
64
 
33
65
  export const Default: Story = {
34
- render: () => <ComingSoon componentName="DatePicker" />,
66
+ args: {
67
+ disabled: false,
68
+ label: "Project Deadline",
69
+ placeholder: "Select a deadline...",
70
+ assistiveText: "Specify the absolute cutoff for code submission.",
71
+ },
72
+ };
73
+
74
+ export const FormsSideBySide: Story = {
75
+ args: {
76
+ label: "Incident Start Date",
77
+ placeholder: "Pick date...",
78
+ assistiveText: "When did the incident originally occur?",
79
+ formLayout: "side-by-side",
80
+ },
81
+ };
82
+
83
+ export const WithLeadingIcon: Story = {
84
+ args: {
85
+ label: "Launch Date",
86
+ placeholder: "Select launch date...",
87
+ leftSection: (
88
+ <svg
89
+ width="24"
90
+ height="24"
91
+ viewBox="0 0 24 24"
92
+ fill="none"
93
+ stroke="currentColor"
94
+ strokeWidth="2"
95
+ strokeLinecap="round"
96
+ strokeLinejoin="round"
97
+ >
98
+ <rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect>
99
+ <line x1="16" y1="2" x2="16" y2="6"></line>
100
+ <line x1="8" y1="2" x2="8" y2="6"></line>
101
+ <line x1="3" y1="10" x2="21" y2="10"></line>
102
+ </svg>
103
+ ),
104
+ },
105
+ };
106
+
107
+ export const Disabled: Story = {
108
+ args: {
109
+ label: "Disabled Date Range",
110
+ placeholder: "Disabled selection...",
111
+ disabled: true,
112
+ },
113
+ };
114
+
115
+ export const ErrorState: Story = {
116
+ args: {
117
+ label: "Execution Date",
118
+ placeholder: "Pick a valid date...",
119
+ error: "The chosen date conflicts with an existing deployment freeze.",
120
+ required: true,
121
+ },
122
+ };
123
+
124
+ export const StaticReadOnly: Story = {
125
+ args: {
126
+ label: "Static ReadOnly Review",
127
+ placeholder: "Ignored...",
128
+ value: new Date("2026-05-21"),
129
+ readOnly: true,
130
+ },
131
+ };
132
+
133
+ export const EditableReadOnly: Story = {
134
+ args: {
135
+ label: "Editable ReadOnly Review",
136
+ placeholder: "Ignored until active...",
137
+ defaultValue: new Date("2026-06-01"),
138
+ readOnly: true,
139
+ labelWithEditIcon: true,
140
+ },
35
141
  };
@@ -1,7 +1,9 @@
1
1
  import React from "react";
2
2
  import "./DatePicker.module.css";
3
+ import { type RecursicaDatePickerProps } from "@recursica/adapter-common";
3
4
 
4
- export type DatePickerProps = React.HTMLAttributes<HTMLDivElement>;
5
+ export type DatePickerProps = React.HTMLAttributes<HTMLDivElement> &
6
+ RecursicaDatePickerProps;
5
7
 
6
8
  export const DatePicker: React.FC<DatePickerProps> = (props) => {
7
9
  return <div {...props}>DatePicker</div>;
@@ -1,46 +1,296 @@
1
1
  /* EXEMPTIONS:
2
- This component is a placeholder stub. Once fully implemented, its specific
3
- tokens will be fully wired up to direct styles. */
4
-
5
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_border-radius */
6
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_horizontal-padding */
7
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_icon-size */
8
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_icon-text-gap */
9
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_max-width */
10
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_min-height */
11
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_min-width */
12
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_text_font-family */
13
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_text_font-size */
14
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_text_font-style */
15
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_text_font-weight */
16
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_text_letter-spacing */
17
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_text_line-height */
18
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_text_text-decoration */
19
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_text_text-transform */
20
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_properties_vertical-padding */
21
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_layouts_side-by-side_properties_top-bottom-margin */
22
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_layouts_stacked_properties_top-bottom-margin */
2
+ - state-specific border-size variables are ignored because a uniform 1px border is applied globally to prevent
3
+ unexpected layout shift or flickering during focus, disabled, or error state transitions. */
23
4
  /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_default_properties_border-size */
24
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_default_properties_colors_background */
25
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_default_properties_colors_border-color */
26
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_default_properties_colors_leading-icon */
27
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_default_properties_colors_text */
28
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_default_properties_colors_trailing-icon */
29
5
  /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_disabled_properties_border-size */
30
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_disabled_properties_colors_background */
31
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_disabled_properties_colors_border-color */
32
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_disabled_properties_colors_leading-icon */
33
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_disabled_properties_colors_text */
34
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_disabled_properties_colors_trailing-icon */
35
6
  /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_error_properties_border-size */
36
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_error_properties_colors_background */
37
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_error_properties_colors_border-color */
38
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_error_properties_colors_leading-icon */
39
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_error_properties_colors_text */
40
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_error_properties_colors_trailing-icon */
41
7
  /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_focus_properties_border-size */
42
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_focus_properties_colors_background */
43
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_focus_properties_colors_border-color */
44
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_focus_properties_colors_leading-icon */
45
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_focus_properties_colors_text */
46
- /* recursica-ignore: --recursica_ui-kit_components_dropdown_variants_states_focus_properties_colors_trailing-icon */
8
+
9
+ /* LAYOUT SPACING OVERRIDES:
10
+ - Sets the --form-control-margin-bottom spacing hook to map component-specific layout tokens. */
11
+ .layoutOverride {
12
+ --form-control-margin-bottom: var(
13
+ --recursica_ui-kit_components_dropdown_variants_layouts_stacked_properties_top-bottom-margin
14
+ );
15
+ }
16
+
17
+ .layoutOverride[data-form-layout="side-by-side"] {
18
+ --form-control-margin-bottom: var(
19
+ --recursica_ui-kit_components_dropdown_variants_layouts_side-by-side_properties_top-bottom-margin
20
+ );
21
+ }
22
+
23
+ /* HARDCODED VALUES:
24
+ - border-width: 1px. Native geometric boundary for the input box.
25
+ - border-style: solid. Native structural rendering rule.
26
+ - outline: none. Bypassing browser focus rings to rely strictly on Recursica focus states natively.
27
+ - flex/layout: display: flex on the root wrapper safely encapsulating internal section rendering.
28
+ - placeholder opacity: 0.5. The dropdown parameters currently lack a dedicated placeholder-opacity variable.
29
+ */
30
+
31
+ .root {
32
+ display: flex;
33
+ position: relative;
34
+ width: 100%;
35
+ min-height: var(--recursica_ui-kit_components_dropdown_properties_min-height);
36
+
37
+ /* Override Mantine native Input variables governing section spacing padding mathematics safely */
38
+ --input-left-section-size: calc(
39
+ var(--recursica_ui-kit_components_dropdown_properties_horizontal-padding) +
40
+ var(--recursica_ui-kit_components_dropdown_properties_icon-size) +
41
+ var(--recursica_ui-kit_components_dropdown_properties_icon-text-gap)
42
+ );
43
+ --input-right-section-size: calc(
44
+ var(--recursica_ui-kit_components_dropdown_properties_horizontal-padding) +
45
+ var(--recursica_ui-kit_components_dropdown_properties_icon-size) +
46
+ var(--recursica_ui-kit_components_dropdown_properties_icon-text-gap)
47
+ );
48
+ }
49
+
50
+ .input {
51
+ /* Structural Overrides */
52
+ width: 100%;
53
+ box-sizing: border-box;
54
+ margin: 0;
55
+
56
+ /* Box Geometry */
57
+ min-height: var(--recursica_ui-kit_components_dropdown_properties_min-height);
58
+ padding-top: var(
59
+ --recursica_ui-kit_components_dropdown_properties_vertical-padding
60
+ );
61
+ padding-bottom: var(
62
+ --recursica_ui-kit_components_dropdown_properties_vertical-padding
63
+ );
64
+ padding-left: var(
65
+ --recursica_ui-kit_components_dropdown_properties_horizontal-padding
66
+ );
67
+ padding-right: var(
68
+ --recursica_ui-kit_components_dropdown_properties_horizontal-padding
69
+ );
70
+ border-radius: var(
71
+ --recursica_ui-kit_components_dropdown_properties_border-radius
72
+ );
73
+ border-width: 1px;
74
+ border-style: solid;
75
+
76
+ /* Strict Typography Unification */
77
+ font-family: var(
78
+ --recursica_ui-kit_components_dropdown_properties_text_font-family
79
+ );
80
+ font-size: var(
81
+ --recursica_ui-kit_components_dropdown_properties_text_font-size
82
+ );
83
+ font-style: var(
84
+ --recursica_ui-kit_components_dropdown_properties_text_font-style
85
+ );
86
+ font-weight: var(
87
+ --recursica_ui-kit_components_dropdown_properties_text_font-weight
88
+ );
89
+ letter-spacing: var(
90
+ --recursica_ui-kit_components_dropdown_properties_text_letter-spacing
91
+ );
92
+ line-height: var(
93
+ --recursica_ui-kit_components_dropdown_properties_text_line-height
94
+ );
95
+ text-decoration: var(
96
+ --recursica_ui-kit_components_dropdown_properties_text_text-decoration
97
+ );
98
+ text-transform: var(
99
+ --recursica_ui-kit_components_dropdown_properties_text_text-transform
100
+ );
101
+
102
+ /* Base State Default Execution */
103
+ background-color: var(
104
+ --recursica_ui-kit_components_dropdown_variants_states_default_properties_colors_background
105
+ );
106
+ border-color: var(
107
+ --recursica_ui-kit_components_dropdown_variants_states_default_properties_colors_border-color
108
+ );
109
+ color: var(
110
+ --recursica_ui-kit_components_dropdown_variants_states_default_properties_colors_text
111
+ );
112
+
113
+ outline: none;
114
+ }
115
+
116
+ .input::placeholder {
117
+ /* HARDCODE: Dropdown properties currently missing placeholder-opacity tokens from Figma JSON */
118
+ opacity: 0.5;
119
+ color: inherit;
120
+ }
121
+
122
+ /* Dynamic Padding Overrides */
123
+ .root[data-with-left-section] .input {
124
+ padding-left: var(--input-left-section-size);
125
+ }
126
+
127
+ .root[data-with-right-section] .input {
128
+ padding-right: var(--input-right-section-size);
129
+ }
130
+
131
+ /* Flexible End-Caps (Icons, actions) */
132
+ .section {
133
+ display: flex;
134
+ align-items: center;
135
+ height: 100%;
136
+ }
137
+
138
+ .section[data-position="left"] {
139
+ justify-content: flex-start;
140
+ padding-left: var(
141
+ --recursica_ui-kit_components_dropdown_properties_horizontal-padding
142
+ );
143
+ }
144
+
145
+ .section[data-position="right"] {
146
+ justify-content: flex-end;
147
+ padding-right: var(
148
+ --recursica_ui-kit_components_dropdown_properties_horizontal-padding
149
+ );
150
+ }
151
+
152
+ .section :global(svg) {
153
+ width: var(--recursica_ui-kit_components_dropdown_properties_icon-size);
154
+ height: var(--recursica_ui-kit_components_dropdown_properties_icon-size);
155
+ color: var(
156
+ --recursica_ui-kit_components_dropdown_variants_states_default_properties_colors_leading-icon
157
+ );
158
+ }
159
+
160
+ .section[data-position="right"] :global(svg) {
161
+ color: var(
162
+ --recursica_ui-kit_components_dropdown_variants_states_default_properties_colors_trailing-icon
163
+ );
164
+ }
165
+
166
+ /* -------------------------------------
167
+ STATE CASCADE ARCHITECTURE
168
+ -------------------------------------- */
169
+
170
+ /* Focus State Mapping (Triggered internally via browser pseudo-pseudo-class) */
171
+ .input:focus-within,
172
+ .input:focus {
173
+ border-color: var(
174
+ --recursica_ui-kit_components_dropdown_variants_states_focus_properties_colors_border-color
175
+ );
176
+ background-color: var(
177
+ --recursica_ui-kit_components_dropdown_variants_states_focus_properties_colors_background
178
+ );
179
+ color: var(
180
+ --recursica_ui-kit_components_dropdown_variants_states_focus_properties_colors_text
181
+ );
182
+ }
183
+
184
+ .root:focus-within .section[data-position="left"] :global(svg) {
185
+ color: var(
186
+ --recursica_ui-kit_components_dropdown_variants_states_focus_properties_colors_leading-icon
187
+ );
188
+ }
189
+
190
+ .root:focus-within .section[data-position="right"] :global(svg) {
191
+ color: var(
192
+ --recursica_ui-kit_components_dropdown_variants_states_focus_properties_colors_trailing-icon
193
+ );
194
+ }
195
+
196
+ /* Error State Mapping (Propagated strictly down from the wrapper DOM context) */
197
+ .root[data-error] .input {
198
+ border-color: var(
199
+ --recursica_ui-kit_components_dropdown_variants_states_error_properties_colors_border-color
200
+ ) !important;
201
+ background-color: var(
202
+ --recursica_ui-kit_components_dropdown_variants_states_error_properties_colors_background
203
+ ) !important;
204
+ color: var(
205
+ --recursica_ui-kit_components_dropdown_variants_states_error_properties_colors_text
206
+ ) !important;
207
+ }
208
+
209
+ .root[data-error] .section[data-position="left"] :global(svg) {
210
+ color: var(
211
+ --recursica_ui-kit_components_dropdown_variants_states_error_properties_colors_leading-icon
212
+ ) !important;
213
+ }
214
+
215
+ .root[data-error] .section[data-position="right"] :global(svg) {
216
+ color: var(
217
+ --recursica_ui-kit_components_dropdown_variants_states_error_properties_colors_trailing-icon
218
+ ) !important;
219
+ }
220
+
221
+ /* Disabled State Mapping (Propagated strictly down from the wrapper DOM context) */
222
+ .root[data-disabled] .input {
223
+ border-color: var(
224
+ --recursica_ui-kit_components_dropdown_variants_states_disabled_properties_colors_border-color
225
+ ) !important;
226
+ background-color: var(
227
+ --recursica_ui-kit_components_dropdown_variants_states_disabled_properties_colors_background
228
+ ) !important;
229
+ color: var(
230
+ --recursica_ui-kit_components_dropdown_variants_states_disabled_properties_colors_text
231
+ ) !important;
232
+ cursor: not-allowed;
233
+ }
234
+
235
+ .root[data-disabled] .section[data-position="left"] :global(svg) {
236
+ color: var(
237
+ --recursica_ui-kit_components_dropdown_variants_states_disabled_properties_colors_leading-icon
238
+ ) !important;
239
+ }
240
+
241
+ .root[data-disabled] .section[data-position="right"] :global(svg) {
242
+ color: var(
243
+ --recursica_ui-kit_components_dropdown_variants_states_disabled_properties_colors_trailing-icon
244
+ ) !important;
245
+ }
246
+
247
+ /* -------------------------------------
248
+ DROPDOWN & OPTIONS ARCHITECTURE
249
+ -------------------------------------- */
250
+
251
+ .dropdown {
252
+ background-color: var(
253
+ --recursica_ui-kit_components_dropdown_variants_states_default_properties_colors_background
254
+ );
255
+ border: 1px solid
256
+ var(
257
+ --recursica_ui-kit_components_dropdown_variants_states_default_properties_colors_border-color
258
+ );
259
+ border-radius: var(
260
+ --recursica_ui-kit_components_dropdown_properties_border-radius
261
+ );
262
+ overflow: hidden;
263
+ }
264
+
265
+ .option {
266
+ font-family: var(
267
+ --recursica_ui-kit_components_dropdown_properties_text_font-family
268
+ );
269
+ font-size: var(
270
+ --recursica_ui-kit_components_dropdown_properties_text_font-size
271
+ );
272
+ font-weight: var(
273
+ --recursica_ui-kit_components_dropdown_properties_text_font-weight
274
+ );
275
+ color: var(
276
+ --recursica_ui-kit_components_dropdown_variants_states_default_properties_colors_text
277
+ );
278
+ padding: calc(
279
+ var(--recursica_ui-kit_components_dropdown_properties_vertical-padding) *
280
+ 0.75
281
+ )
282
+ var(--recursica_ui-kit_components_dropdown_properties_horizontal-padding);
283
+ cursor: pointer;
284
+ }
285
+
286
+ .option[data-selected="true"],
287
+ .option[data-combobox-selected="true"],
288
+ .option[data-hovered="true"],
289
+ .option:hover {
290
+ background-color: var(
291
+ --recursica_ui-kit_components_dropdown_variants_states_focus_properties_colors_background
292
+ );
293
+ color: var(
294
+ --recursica_ui-kit_components_dropdown_variants_states_focus_properties_colors_text
295
+ );
296
+ }