@recursica/mui-adapter 0.4.0 → 0.6.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 (177) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/mui-adapter.cjs +74 -1
  3. package/dist/mui-adapter.cjs.map +1 -1
  4. package/dist/mui-adapter.css +1 -1
  5. package/dist/mui-adapter.js +6651 -201
  6. package/dist/mui-adapter.js.map +1 -1
  7. package/dist/src/components/Accordion/Accordion.d.ts +63 -2
  8. package/dist/src/components/AssistiveElement/AssistiveElement.d.ts +9 -2
  9. package/dist/src/components/Autocomplete/Autocomplete.d.ts +17 -0
  10. package/dist/src/components/Autocomplete/index.d.ts +1 -0
  11. package/dist/src/components/Avatar/Avatar.d.ts +14 -2
  12. package/dist/src/components/Badge/Badge.d.ts +13 -3
  13. package/dist/src/components/Breadcrumb/Breadcrumb.d.ts +10 -3
  14. package/dist/src/components/Button/Button.d.ts +1 -1
  15. package/dist/src/components/Card/Card.d.ts +40 -3
  16. package/dist/src/components/Checkbox/Checkbox.d.ts +15 -2
  17. package/dist/src/components/Checkbox/CheckboxGroup.d.ts +16 -0
  18. package/dist/src/components/Checkbox/index.d.ts +5 -1
  19. package/dist/src/components/Chip/Chip.d.ts +18 -2
  20. package/dist/src/components/Dropdown/Dropdown.d.ts +23 -3
  21. package/dist/src/components/FormControlLayout/FormControlLayout.d.ts +10 -2
  22. package/dist/src/components/FormControlWrapper/FormControlWrapper.d.ts +24 -2
  23. package/dist/src/components/HoverCard/HoverCard.d.ts +55 -3
  24. package/dist/src/components/Label/Label.d.ts +13 -2
  25. package/dist/src/components/Link/Link.d.ts +1 -1
  26. package/dist/src/components/Menu/Menu.d.ts +99 -3
  27. package/dist/src/components/Modal/Modal.d.ts +36 -2
  28. package/dist/src/components/NumberInput/NumberInput.d.ts +14 -2
  29. package/dist/src/components/Pagination/Pagination.d.ts +44 -2
  30. package/dist/src/components/Pagination/Pagination.icons.d.ts +8 -0
  31. package/dist/src/components/Panel/Panel.d.ts +65 -3
  32. package/dist/src/components/Radio/Radio.d.ts +13 -3
  33. package/dist/src/components/Radio/RadioGroup.d.ts +13 -0
  34. package/dist/src/components/ReadOnlyField/ReadOnlyBooleanField.d.ts +5 -0
  35. package/dist/src/components/ReadOnlyField/ReadOnlyField.d.ts +7 -2
  36. package/dist/src/components/ReadOnlyField/ReadOnlySwitchField.d.ts +5 -0
  37. package/dist/src/components/ReadOnlyField/ReadOnlyTextField.d.ts +8 -0
  38. package/dist/src/components/ReadOnlyField/WithReadOnlyWrapper.d.ts +28 -0
  39. package/dist/src/components/ReadOnlyField/index.d.ts +1 -0
  40. package/dist/src/components/SegmentedControl/SegmentedControl.d.ts +31 -3
  41. package/dist/src/components/Slider/Slider.d.ts +28 -2
  42. package/dist/src/components/Stepper/Stepper.d.ts +21 -2
  43. package/dist/src/components/Switch/Switch.d.ts +10 -3
  44. package/dist/src/components/Switch/SwitchGroup.d.ts +13 -0
  45. package/dist/src/components/Tabs/Tabs.d.ts +35 -3
  46. package/dist/src/components/Text/Text.d.ts +1 -1
  47. package/dist/src/components/TextArea/TextArea.d.ts +18 -2
  48. package/dist/src/components/TextField/TextField.d.ts +16 -2
  49. package/dist/src/components/Timeline/Timeline.d.ts +14 -2
  50. package/dist/src/components/Timeline/TimelineItem.d.ts +29 -0
  51. package/dist/src/components/Title/Title.d.ts +1 -1
  52. package/dist/src/components/Toast/Toast.d.ts +25 -2
  53. package/dist/src/components/Tooltip/Tooltip.d.ts +42 -3
  54. package/dist/src/components/Typography/Typography.d.ts +1 -1
  55. package/dist/src/components/index.d.ts +1 -0
  56. package/package.json +12 -2
  57. package/src/GlobalExemptions.modules.css +13 -0
  58. package/src/components/Accordion/Accordion.module.css +295 -0
  59. package/src/components/Accordion/Accordion.stories.tsx +149 -21
  60. package/src/components/Accordion/Accordion.tsx +264 -4
  61. package/src/components/AssistiveElement/AssistiveElement.module.css +111 -0
  62. package/src/components/AssistiveElement/AssistiveElement.stories.tsx +76 -19
  63. package/src/components/AssistiveElement/AssistiveElement.tsx +85 -4
  64. package/src/components/Autocomplete/Autocomplete.module.css +325 -0
  65. package/src/components/Autocomplete/Autocomplete.stories.tsx +196 -0
  66. package/src/components/Autocomplete/Autocomplete.tsx +201 -0
  67. package/src/components/Autocomplete/index.ts +1 -0
  68. package/src/components/Avatar/Avatar.module.css +344 -0
  69. package/src/components/Avatar/Avatar.stories.tsx +94 -22
  70. package/src/components/Avatar/Avatar.tsx +110 -5
  71. package/src/components/Badge/Badge.module.css +127 -0
  72. package/src/components/Badge/Badge.stories.tsx +65 -22
  73. package/src/components/Badge/Badge.tsx +70 -5
  74. package/src/components/Breadcrumb/Breadcrumb.module.css +26 -0
  75. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +57 -22
  76. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -5
  77. package/src/components/Button/Button.module.css +113 -20
  78. package/src/components/Button/Button.stories.tsx +3 -0
  79. package/src/components/Button/Button.tsx +10 -3
  80. package/src/components/Card/Card.module.css +118 -0
  81. package/src/components/Card/Card.stories.tsx +117 -19
  82. package/src/components/Card/Card.tsx +179 -4
  83. package/src/components/Checkbox/Checkbox.module.css +232 -0
  84. package/src/components/Checkbox/Checkbox.stories.tsx +81 -19
  85. package/src/components/Checkbox/Checkbox.tsx +146 -4
  86. package/src/components/Checkbox/CheckboxGroup.tsx +117 -0
  87. package/src/components/Checkbox/index.ts +6 -1
  88. package/src/components/Chip/Chip.module.css +236 -0
  89. package/src/components/Chip/Chip.stories.tsx +101 -21
  90. package/src/components/Chip/Chip.tsx +138 -5
  91. package/src/components/DatePicker/DatePicker.module.css +42 -0
  92. package/src/components/DatePicker/DatePicker.tsx +1 -0
  93. package/src/components/Dropdown/Dropdown.module.css +296 -0
  94. package/src/components/Dropdown/Dropdown.stories.tsx +80 -21
  95. package/src/components/Dropdown/Dropdown.tsx +182 -5
  96. package/src/components/FileInput/FileInput.module.css +47 -0
  97. package/src/components/FileInput/FileInput.tsx +1 -0
  98. package/src/components/FileUpload/FileUpload.module.css +40 -0
  99. package/src/components/FileUpload/FileUpload.tsx +1 -0
  100. package/src/components/FormControlLayout/FormControlLayout.module.css +92 -0
  101. package/src/components/FormControlLayout/FormControlLayout.stories.tsx +74 -19
  102. package/src/components/FormControlLayout/FormControlLayout.tsx +58 -4
  103. package/src/components/FormControlWrapper/FormControlWrapper.module.css +96 -0
  104. package/src/components/FormControlWrapper/FormControlWrapper.stories.tsx +122 -19
  105. package/src/components/FormControlWrapper/FormControlWrapper.tsx +145 -6
  106. package/src/components/HoverCard/HoverCard.module.css +91 -0
  107. package/src/components/HoverCard/HoverCard.stories.tsx +158 -21
  108. package/src/components/HoverCard/HoverCard.tsx +150 -4
  109. package/src/components/Label/Label.module.css +136 -0
  110. package/src/components/Label/Label.stories.tsx +98 -17
  111. package/src/components/Label/Label.tsx +88 -4
  112. package/src/components/Link/Link.module.css +8 -0
  113. package/src/components/Menu/Menu.module.css +287 -0
  114. package/src/components/Menu/Menu.stories.tsx +307 -21
  115. package/src/components/Menu/Menu.tsx +318 -4
  116. package/src/components/Modal/Modal.module.css +172 -0
  117. package/src/components/Modal/Modal.stories.tsx +66 -22
  118. package/src/components/Modal/Modal.tsx +216 -3
  119. package/src/components/NumberInput/NumberInput.module.css +281 -0
  120. package/src/components/NumberInput/NumberInput.stories.tsx +83 -20
  121. package/src/components/NumberInput/NumberInput.tsx +148 -5
  122. package/src/components/Pagination/Pagination.icons.tsx +66 -0
  123. package/src/components/Pagination/Pagination.module.css +307 -0
  124. package/src/components/Pagination/Pagination.stories.tsx +42 -21
  125. package/src/components/Pagination/Pagination.tsx +193 -4
  126. package/src/components/Panel/Panel.module.css +206 -0
  127. package/src/components/Panel/Panel.stories.tsx +214 -22
  128. package/src/components/Panel/Panel.tsx +153 -4
  129. package/src/components/Radio/Radio.module.css +220 -0
  130. package/src/components/Radio/Radio.stories.tsx +77 -19
  131. package/src/components/Radio/Radio.tsx +178 -4
  132. package/src/components/Radio/RadioGroup.tsx +111 -0
  133. package/src/components/ReadOnlyField/ReadOnlyBooleanField.tsx +21 -0
  134. package/src/components/ReadOnlyField/ReadOnlyField.module.css +54 -0
  135. package/src/components/ReadOnlyField/ReadOnlyField.stories.tsx +175 -16
  136. package/src/components/ReadOnlyField/ReadOnlyField.tsx +109 -4
  137. package/src/components/ReadOnlyField/ReadOnlySwitchField.tsx +21 -0
  138. package/src/components/ReadOnlyField/ReadOnlyTextField.tsx +48 -0
  139. package/src/components/ReadOnlyField/WithReadOnlyWrapper.tsx +93 -0
  140. package/src/components/ReadOnlyField/index.ts +1 -0
  141. package/src/components/SegmentedControl/SegmentedControl.module.css +203 -0
  142. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +102 -20
  143. package/src/components/SegmentedControl/SegmentedControl.tsx +110 -5
  144. package/src/components/Slider/Slider.module.css +542 -0
  145. package/src/components/Slider/Slider.stories.tsx +157 -19
  146. package/src/components/Slider/Slider.tsx +282 -4
  147. package/src/components/Stepper/Stepper.module.css +410 -0
  148. package/src/components/Stepper/Stepper.stories.tsx +132 -19
  149. package/src/components/Stepper/Stepper.tsx +145 -5
  150. package/src/components/Switch/Switch.module.css +238 -0
  151. package/src/components/Switch/Switch.stories.tsx +98 -19
  152. package/src/components/Switch/Switch.tsx +153 -5
  153. package/src/components/Switch/SwitchGroup.tsx +111 -0
  154. package/src/components/Tabs/Tabs.module.css +422 -0
  155. package/src/components/Tabs/Tabs.stories.tsx +138 -19
  156. package/src/components/Tabs/Tabs.tsx +103 -5
  157. package/src/components/TextArea/TextArea.module.css +160 -0
  158. package/src/components/TextArea/TextArea.stories.tsx +80 -21
  159. package/src/components/TextArea/TextArea.tsx +156 -5
  160. package/src/components/TextField/TextField.module.css +266 -0
  161. package/src/components/TextField/TextField.stories.tsx +168 -15
  162. package/src/components/TextField/TextField.tsx +171 -5
  163. package/src/components/TimePicker/TimePicker.module.css +41 -0
  164. package/src/components/TimePicker/TimePicker.tsx +1 -0
  165. package/src/components/Timeline/Timeline.module.css +367 -0
  166. package/src/components/Timeline/Timeline.stories.tsx +114 -21
  167. package/src/components/Timeline/Timeline.tsx +80 -4
  168. package/src/components/Timeline/TimelineItem.tsx +101 -0
  169. package/src/components/Toast/Toast.module.css +170 -0
  170. package/src/components/Toast/Toast.stories.tsx +54 -22
  171. package/src/components/Toast/Toast.tsx +90 -4
  172. package/src/components/Tooltip/Tooltip.module.css +90 -0
  173. package/src/components/Tooltip/Tooltip.stories.tsx +152 -22
  174. package/src/components/Tooltip/Tooltip.tsx +114 -4
  175. package/src/components/TransferList/TransferList.module.css +38 -0
  176. package/src/components/TransferList/TransferList.tsx +1 -0
  177. package/src/components/index.ts +1 -0
@@ -0,0 +1,410 @@
1
+ /*
2
+ Recursica Stepper CSS module natively binding to Figma variables.
3
+
4
+ HARDCODED CSS NOTE:
5
+ For horizontal layout, Mantine natively renders the text horizontally alongside the icon.
6
+ To achieve Recursica's layout where horizontal orientation stacks text below the icon,
7
+ we force `.step` to be a column, `.stepBody` to remove margin and text-align center,
8
+ and the `.separator`'s margin-top is dynamically calculated `calc((indicator-size / 2) - 1px)`
9
+ to ensure it continues to align with the vertical center of the indicator rather than the
10
+ whole step wrapper.
11
+ */
12
+
13
+ .root {
14
+ /* Orientation specific gaps are mapped via data attributes */
15
+ }
16
+
17
+ .root.horizontal .steps {
18
+ align-items: flex-start;
19
+ --stepper-step-gap: var(
20
+ --recursica_ui-kit_components_stepper_variants_orientation_horizontal_properties_step-gap
21
+ );
22
+ --stepper-max-text-width: var(
23
+ --recursica_ui-kit_components_stepper_variants_orientation_horizontal_properties_max-text-width
24
+ );
25
+ }
26
+
27
+ .root.horizontal .step {
28
+ flex-direction: column;
29
+ align-items: center;
30
+ gap: var(
31
+ --recursica_ui-kit_components_stepper_variants_orientation_horizontal_properties_indicator-label-gap
32
+ );
33
+ }
34
+
35
+ .root.horizontal .stepBody {
36
+ width: var(--stepper-max-text-width);
37
+ display: flex;
38
+ flex-direction: column;
39
+ align-items: center;
40
+ justify-content: flex-start;
41
+ margin-left: 0; /* Mantine natively applies a margin-inline-start */
42
+ gap: var(
43
+ --recursica_ui-kit_components_stepper_variants_orientation_horizontal_properties_label-description-gap
44
+ );
45
+ }
46
+
47
+ .root.horizontal .stepLabel,
48
+ .root.horizontal .stepDescription {
49
+ width: max-content;
50
+ max-width: var(--stepper-max-text-width);
51
+ text-align: center;
52
+ white-space: normal;
53
+ }
54
+
55
+ .root.horizontal .separator {
56
+ align-self: flex-start; /* Force to top regardless of container alignment */
57
+ margin-top: calc(var(--stepper-indicator-size) / 2 - 1px);
58
+ margin-left: calc(
59
+ -1 * (var(--stepper-max-text-width) - var(--stepper-indicator-size)) / 2
60
+ );
61
+ margin-right: calc(
62
+ -1 * (var(--stepper-max-text-width) - var(--stepper-indicator-size)) / 2
63
+ );
64
+ }
65
+
66
+ /* Vertical Orientation */
67
+ .root.vertical {
68
+ --stepper-step-gap: var(
69
+ --recursica_ui-kit_components_stepper_variants_orientation_vertical_properties_step-gap
70
+ );
71
+ --separator-spacing: 0px; /* Force the line to touch the circle */
72
+ --stepper-max-text-width: var(
73
+ --recursica_ui-kit_components_stepper_variants_orientation_vertical_properties_max-text-width
74
+ );
75
+ }
76
+
77
+ .root.vertical .step {
78
+ gap: var(
79
+ --recursica_ui-kit_components_stepper_variants_orientation_vertical_properties_indicator-label-gap
80
+ );
81
+ margin-top: 0 !important; /* Remove Mantine's gap */
82
+ padding-bottom: var(
83
+ --stepper-step-gap
84
+ ); /* Move gap inside the step so the separator line can stretch through it */
85
+ }
86
+
87
+ .root.vertical .step:last-of-type {
88
+ padding-bottom: 0;
89
+ }
90
+
91
+ .root.vertical .stepBody {
92
+ gap: var(
93
+ --recursica_ui-kit_components_stepper_variants_orientation_vertical_properties_label-description-gap
94
+ );
95
+ }
96
+
97
+ /* Sizes */
98
+ .large {
99
+ --stepper-icon-size: var(
100
+ --recursica_ui-kit_components_stepper_variants_sizes_large_properties_indicator-size
101
+ ); /* Maps to Mantine's circle size */
102
+ --stepper-indicator-size: var(
103
+ --recursica_ui-kit_components_stepper_variants_sizes_large_properties_indicator-size
104
+ );
105
+ --stepper-border-size: var(
106
+ --recursica_ui-kit_components_stepper_variants_sizes_large_properties_indicator-border-size
107
+ );
108
+ --stepper-border-radius: var(
109
+ --recursica_ui-kit_components_stepper_variants_sizes_large_properties_indicator-border-radius
110
+ );
111
+ --stepper-font-family: var(
112
+ --recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_font-family
113
+ );
114
+ --stepper-font-size: var(
115
+ --recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_font-size
116
+ );
117
+ --stepper-font-style: var(
118
+ --recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_font-style
119
+ );
120
+ --stepper-font-weight: var(
121
+ --recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_font-weight
122
+ );
123
+ --stepper-letter-spacing: var(
124
+ --recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_letter-spacing
125
+ );
126
+ --stepper-line-height: var(
127
+ --recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_line-height
128
+ );
129
+ --stepper-text-decoration: var(
130
+ --recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_text-decoration
131
+ );
132
+ --stepper-text-transform: var(
133
+ --recursica_ui-kit_components_stepper_variants_sizes_large_properties_step-number-text_text-transform
134
+ );
135
+ --stepper-svg-size: var(
136
+ --recursica_ui-kit_components_stepper_variants_sizes_large_properties_completed-icon-size
137
+ );
138
+ }
139
+
140
+ .small {
141
+ --stepper-icon-size: var(
142
+ --recursica_ui-kit_components_stepper_variants_sizes_small_properties_indicator-size
143
+ ); /* Maps to Mantine's circle size */
144
+ --stepper-indicator-size: var(
145
+ --recursica_ui-kit_components_stepper_variants_sizes_small_properties_indicator-size
146
+ );
147
+ --stepper-border-size: var(
148
+ --recursica_ui-kit_components_stepper_variants_sizes_small_properties_indicator-border-size
149
+ );
150
+ --stepper-border-radius: var(
151
+ --recursica_ui-kit_components_stepper_variants_sizes_small_properties_indicator-border-radius
152
+ );
153
+ --stepper-font-family: var(
154
+ --recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_font-family
155
+ );
156
+ --stepper-font-size: var(
157
+ --recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_font-size
158
+ );
159
+ --stepper-font-style: var(
160
+ --recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_font-style
161
+ );
162
+ --stepper-font-weight: var(
163
+ --recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_font-weight
164
+ );
165
+ --stepper-letter-spacing: var(
166
+ --recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_letter-spacing
167
+ );
168
+ --stepper-line-height: var(
169
+ --recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_line-height
170
+ );
171
+ --stepper-text-decoration: var(
172
+ --recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_text-decoration
173
+ );
174
+ --stepper-text-transform: var(
175
+ --recursica_ui-kit_components_stepper_variants_sizes_small_properties_step-number-text_text-transform
176
+ );
177
+ --stepper-svg-size: var(
178
+ --recursica_ui-kit_components_stepper_variants_sizes_small_properties_completed-icon-size
179
+ );
180
+ }
181
+
182
+ /* Core Element Structuring using mapped variables */
183
+ .root .step {
184
+ /* Default to Mantine's native flex behavior (stretch) so the vertical separator spans the full height */
185
+ }
186
+
187
+ .root .stepBody {
188
+ max-width: var(--stepper-max-text-width);
189
+ display: flex;
190
+ flex-direction: column;
191
+ }
192
+
193
+ .root .stepLabel {
194
+ font-family: var(
195
+ --recursica_ui-kit_components_stepper_properties_label-text_font-family
196
+ );
197
+ font-size: var(
198
+ --recursica_ui-kit_components_stepper_properties_label-text_font-size
199
+ );
200
+ font-style: var(
201
+ --recursica_ui-kit_components_stepper_properties_label-text_font-style
202
+ );
203
+ font-weight: var(
204
+ --recursica_ui-kit_components_stepper_properties_label-text_font-weight
205
+ );
206
+ letter-spacing: var(
207
+ --recursica_ui-kit_components_stepper_properties_label-text_letter-spacing
208
+ );
209
+ line-height: var(
210
+ --recursica_ui-kit_components_stepper_properties_label-text_line-height
211
+ );
212
+ text-decoration: var(
213
+ --recursica_ui-kit_components_stepper_properties_label-text_text-decoration
214
+ );
215
+ text-transform: var(
216
+ --recursica_ui-kit_components_stepper_properties_label-text_text-transform
217
+ );
218
+ }
219
+
220
+ .root .stepDescription {
221
+ font-family: var(
222
+ --recursica_ui-kit_components_stepper_properties_description-text_font-family
223
+ );
224
+ font-size: var(
225
+ --recursica_ui-kit_components_stepper_properties_description-text_font-size
226
+ );
227
+ font-style: var(
228
+ --recursica_ui-kit_components_stepper_properties_description-text_font-style
229
+ );
230
+ font-weight: var(
231
+ --recursica_ui-kit_components_stepper_properties_description-text_font-weight
232
+ );
233
+ letter-spacing: var(
234
+ --recursica_ui-kit_components_stepper_properties_description-text_letter-spacing
235
+ );
236
+ line-height: var(
237
+ --recursica_ui-kit_components_stepper_properties_description-text_line-height
238
+ );
239
+ text-decoration: var(
240
+ --recursica_ui-kit_components_stepper_properties_description-text_text-decoration
241
+ );
242
+ text-transform: var(
243
+ --recursica_ui-kit_components_stepper_properties_description-text_text-transform
244
+ );
245
+ }
246
+
247
+ .root .stepIcon {
248
+ width: var(--stepper-indicator-size);
249
+ height: var(--stepper-indicator-size);
250
+ min-width: var(--stepper-indicator-size);
251
+ min-height: var(--stepper-indicator-size);
252
+ border-width: var(--stepper-border-size);
253
+ border-radius: 50%; /* Override Figma token to ensure perfectly circular indicators */
254
+
255
+ font-family: var(--stepper-font-family);
256
+ font-size: var(--stepper-font-size);
257
+ font-style: var(--stepper-font-style);
258
+ font-weight: var(--stepper-font-weight);
259
+ letter-spacing: var(--stepper-letter-spacing);
260
+ line-height: var(--stepper-line-height);
261
+ text-decoration: var(--stepper-text-decoration);
262
+ text-transform: var(--stepper-text-transform);
263
+
264
+ display: flex;
265
+ align-items: center;
266
+ justify-content: center;
267
+ /* Font details are implicitly mapped by sizes, but colors map to states */
268
+ /* Upcoming State (Pending) - Default */
269
+ background-color: var(
270
+ --recursica_ui-kit_components_stepper_properties_colors_upcoming-indicator-background
271
+ );
272
+ border-color: var(
273
+ --recursica_ui-kit_components_stepper_properties_colors_upcoming-indicator-border-color
274
+ );
275
+ color: var(
276
+ --recursica_ui-kit_components_stepper_properties_colors_upcoming-indicator-text
277
+ );
278
+ }
279
+
280
+ /* Completed State */
281
+ .root .stepIcon.Mui-completed,
282
+ .root .stepIcon:has(.Mui-completed) {
283
+ background-color: var(
284
+ --recursica_ui-kit_components_stepper_properties_colors_completed-indicator-background
285
+ );
286
+ border-color: var(
287
+ --recursica_ui-kit_components_stepper_properties_colors_completed-indicator-border-color
288
+ );
289
+ }
290
+
291
+ .root .stepCompletedIcon {
292
+ color: var(
293
+ --recursica_ui-kit_components_stepper_properties_colors_completed-indicator-text
294
+ );
295
+ }
296
+
297
+ .root .stepCompletedIcon svg {
298
+ width: var(--stepper-svg-size);
299
+ height: var(--stepper-svg-size);
300
+ }
301
+
302
+ .root .stepLabel.Mui-completed {
303
+ color: var(
304
+ --recursica_ui-kit_components_stepper_properties_colors_completed-label-color
305
+ );
306
+ }
307
+
308
+ .root .stepDescription:has(~ .Mui-completed),
309
+ .root .MuiStepLabel-root.Mui-completed .stepDescription {
310
+ color: var(
311
+ --recursica_ui-kit_components_stepper_properties_colors_completed-description-color
312
+ );
313
+ }
314
+
315
+ /* Current State (Progressing) */
316
+ .root .stepIcon.Mui-active,
317
+ .root .stepIcon:has(.Mui-active) {
318
+ background-color: var(
319
+ --recursica_ui-kit_components_stepper_properties_colors_current-indicator-background
320
+ );
321
+ border-color: var(
322
+ --recursica_ui-kit_components_stepper_properties_colors_current-indicator-border-color
323
+ );
324
+ color: var(
325
+ --recursica_ui-kit_components_stepper_properties_colors_current-indicator-text
326
+ );
327
+ }
328
+
329
+ .root .stepLabel.Mui-active {
330
+ color: var(
331
+ --recursica_ui-kit_components_stepper_properties_colors_current-label-color
332
+ );
333
+ }
334
+
335
+ .root .stepDescription:has(~ .Mui-active),
336
+ .root .MuiStepLabel-root.Mui-active .stepDescription {
337
+ color: var(
338
+ --recursica_ui-kit_components_stepper_properties_colors_current-description-color
339
+ );
340
+ }
341
+
342
+ /* Upcoming State (Pending Labels) */
343
+ .root .stepLabel:not(.Mui-active):not(.Mui-completed) {
344
+ color: var(
345
+ --recursica_ui-kit_components_stepper_properties_colors_upcoming-label-color
346
+ );
347
+ }
348
+
349
+ .root .MuiStepLabel-root:not(.Mui-active):not(.Mui-completed) .stepDescription {
350
+ color: var(
351
+ --recursica_ui-kit_components_stepper_properties_colors_upcoming-description-color
352
+ );
353
+ }
354
+
355
+ /* Horizontal Separator */
356
+ .root .separator {
357
+ margin: 0 var(--stepper-step-gap); /* Apply the gap logic to the separator natively */
358
+ background-color: var(
359
+ --recursica_ui-kit_components_stepper_properties_colors_upcoming-connector-color
360
+ );
361
+ height: var(
362
+ --recursica_ui-kit_components_stepper_properties_upcoming-connector-size
363
+ );
364
+ border: none;
365
+ min-width: 20px;
366
+ flex: 1;
367
+ }
368
+
369
+ .root .separator.Mui-active,
370
+ .root .separator.Mui-completed {
371
+ background-color: var(
372
+ --recursica_ui-kit_components_stepper_properties_colors_completed-connector-color
373
+ );
374
+ height: var(
375
+ --recursica_ui-kit_components_stepper_properties_completed-connector-size
376
+ );
377
+ }
378
+
379
+ /* Vertical Separator */
380
+ .root .verticalSeparator {
381
+ border-inline-start: var(
382
+ --recursica_ui-kit_components_stepper_properties_upcoming-connector-size
383
+ )
384
+ solid
385
+ var(
386
+ --recursica_ui-kit_components_stepper_properties_colors_upcoming-connector-color
387
+ );
388
+ top: var(
389
+ --stepper-icon-size
390
+ ); /* Overrides Mantine's gap math to force the line to touch the icon */
391
+ }
392
+
393
+ .root .verticalSeparator.Mui-active,
394
+ .root .verticalSeparator.Mui-completed {
395
+ border-inline-start: var(
396
+ --recursica_ui-kit_components_stepper_properties_completed-connector-size
397
+ )
398
+ solid
399
+ var(
400
+ --recursica_ui-kit_components_stepper_properties_colors_completed-connector-color
401
+ );
402
+ }
403
+
404
+ /* Hide Content
405
+ Recursica Steppers are purely navigational/structural. Content should be managed
406
+ by the parent layout outside of the Stepper DOM.
407
+ */
408
+ .root .content {
409
+ display: none;
410
+ }
@@ -1,28 +1,41 @@
1
+ import React, { useState } from "react";
1
2
  import type { Meta, StoryObj } from "@storybook/react";
2
3
  import { Stepper } from "./Stepper";
3
- import { ComingSoon } from "@recursica/storybook-template";
4
+ import { Button } from "../Button/Button";
5
+ import { Group } from "../Group/Group";
6
+ import { Flex } from "../Flex/Flex";
4
7
 
5
8
  const meta: Meta<typeof Stepper> = {
6
- title: "UI-Kit/🚧 Stepper",
9
+ title: "UI-Kit/Stepper",
7
10
  component: Stepper,
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",
25
- ],
13
+ layout: "centered",
14
+ docs: {
15
+ description: {
16
+ component: `
17
+ The \`Stepper\` component provides a visual progression interface strictly mapped to Recursica's UI-Kit.
18
+ This component wraps Mantine's \`Stepper\` and natively enforces Figma tokens for sizes, colors, gaps, and states (\`completed\`, \`current\`, \`upcoming\`).
19
+
20
+ ### Layout & Orientation
21
+ Orientation dictates how the steps flow:
22
+ - **horizontal**: Steps render side-by-side.
23
+ - **vertical**: Steps stack vertically, mapping seamlessly to the vertical gap tokens.
24
+ `,
25
+ },
26
+ },
27
+ },
28
+ argTypes: {
29
+ size: {
30
+ control: "radio",
31
+ options: ["small", "large"],
32
+ },
33
+ orientation: {
34
+ control: "radio",
35
+ options: ["horizontal", "vertical"],
36
+ },
37
+ defaultChecked: {
38
+ table: { disable: true },
26
39
  },
27
40
  },
28
41
  };
@@ -30,6 +43,106 @@ const meta: Meta<typeof Stepper> = {
30
43
  export default meta;
31
44
  type Story = StoryObj<typeof Stepper>;
32
45
 
46
+ const InteractiveStepper = (args: React.ComponentProps<typeof Stepper>) => {
47
+ const [active, setActive] = useState(1);
48
+ const nextStep = () =>
49
+ setActive((current) => (current < 3 ? current + 1 : current));
50
+ const prevStep = () =>
51
+ setActive((current) => (current > 0 ? current - 1 : current));
52
+
53
+ return (
54
+ <Flex direction="column" w={600}>
55
+ <Stepper {...args} active={active} onStepClick={setActive}>
56
+ <Stepper.Step
57
+ label="First step"
58
+ description="Create an account and set up your billing profile"
59
+ />
60
+ <Stepper.Step
61
+ label="Second step"
62
+ description="Verify email and ensure all notification preferences are correct"
63
+ />
64
+ <Stepper.Step label="Final step" description="Get full access" />
65
+ <Stepper.Completed>
66
+ Completed, click back button to get to previous step
67
+ </Stepper.Completed>
68
+ </Stepper>
69
+
70
+ <Group mt={24} justify="center" gap={8}>
71
+ <Button variant="outline" onClick={prevStep} disabled={active === 0}>
72
+ Previous step
73
+ </Button>
74
+ <Button variant="outline" onClick={nextStep} disabled={active === 3}>
75
+ Next step
76
+ </Button>
77
+ </Group>
78
+ </Flex>
79
+ );
80
+ };
81
+
33
82
  export const Default: Story = {
34
- render: () => <ComingSoon componentName="Stepper" />,
83
+ render: (args) => <InteractiveStepper {...args} />,
84
+ args: {
85
+ size: "large",
86
+ orientation: "horizontal",
87
+ },
88
+ };
89
+
90
+ export const Small: Story = {
91
+ render: (args) => <InteractiveStepper {...args} />,
92
+ args: {
93
+ size: "small",
94
+ orientation: "horizontal",
95
+ },
96
+ };
97
+
98
+ export const Vertical: Story = {
99
+ render: (args) => <InteractiveStepper {...args} />,
100
+ args: {
101
+ size: "large",
102
+ orientation: "vertical",
103
+ },
104
+ };
105
+
106
+ const StressTestStepper = (args: React.ComponentProps<typeof Stepper>) => {
107
+ const [active, setActive] = useState(1);
108
+ const nextStep = () =>
109
+ setActive((current) => (current < 3 ? current + 1 : current));
110
+ const prevStep = () =>
111
+ setActive((current) => (current > 0 ? current - 1 : current));
112
+
113
+ return (
114
+ <Flex direction="column" w={600}>
115
+ <Stepper {...args} active={active} onStepClick={setActive}>
116
+ <Stepper.Step
117
+ label="This is an extremely long step title designed to test how the layout handles multiline text wrapping and constraints"
118
+ description="Create an account and set up your billing profile"
119
+ />
120
+ <Stepper.Step
121
+ label="Second step"
122
+ description="Verify email and ensure all notification preferences are correct"
123
+ />
124
+ <Stepper.Step label="Final step" />
125
+ <Stepper.Completed>
126
+ Completed, click back button to get to previous step
127
+ </Stepper.Completed>
128
+ </Stepper>
129
+
130
+ <Group mt={24} justify="center" gap={8}>
131
+ <Button variant="outline" onClick={prevStep} disabled={active === 0}>
132
+ Previous step
133
+ </Button>
134
+ <Button variant="outline" onClick={nextStep} disabled={active === 3}>
135
+ Next step
136
+ </Button>
137
+ </Group>
138
+ </Flex>
139
+ );
140
+ };
141
+
142
+ export const LayoutStressTest: Story = {
143
+ render: (args) => <StressTestStepper {...args} />,
144
+ args: {
145
+ size: "large",
146
+ orientation: "horizontal",
147
+ },
35
148
  };