@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,367 @@
1
+ /* EXEMPTIONS:
2
+ - timeline-bullet_variants_types_avatar_properties_avatar-size is ignored because under the avatar timeline variant,
3
+ the bullet container size uses fallback bullet-size configurations to maintain vertical alignment with the
4
+ inactive/active connector line, while the nested Avatar subcomponent handles its own sizing natively. */
5
+ /* recursica-ignore: --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_avatar-size */
6
+
7
+ .root {
8
+ display: flex;
9
+ flex-direction: column;
10
+ }
11
+
12
+ .item {
13
+ /* Mantine uses these vars to calculate the exact left: position of the connector line */
14
+ --tl-line-width: var(
15
+ --recursica_ui-kit_components_timeline_properties_inactive-connector-size
16
+ ) !important;
17
+
18
+ &[data-active] {
19
+ --tl-line-width: var(
20
+ --recursica_ui-kit_components_timeline_properties_active-connector-size
21
+ ) !important;
22
+ }
23
+
24
+ &[data-variant="default"] {
25
+ --tl-bullet-size: var(
26
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_bullet-size
27
+ ) !important;
28
+ }
29
+ &[data-variant="icon"] {
30
+ --tl-bullet-size: var(
31
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_bullet-size
32
+ ) !important;
33
+ }
34
+ &[data-variant="icon-alternative"] {
35
+ --tl-bullet-size: var(
36
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_bullet-size
37
+ ) !important;
38
+ }
39
+ &[data-variant="avatar"] {
40
+ /* Avatar sizing fallback to default to maintain connector alignment */
41
+ --tl-bullet-size: var(
42
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_bullet-size
43
+ ) !important;
44
+ }
45
+
46
+ /* Control connector lines via the item ::before pseudo-element */
47
+ /* Inactive connector */
48
+ &::before {
49
+ border-left-width: var(
50
+ --recursica_ui-kit_components_timeline_properties_inactive-connector-size
51
+ ) !important;
52
+ border-left-color: var(
53
+ --recursica_ui-kit_components_timeline_properties_colors_inactive-connector-color
54
+ ) !important;
55
+ }
56
+
57
+ /* Active connector */
58
+ &[data-active]::before {
59
+ border-left-width: var(
60
+ --recursica_ui-kit_components_timeline_properties_active-connector-size
61
+ ) !important;
62
+ border-left-color: var(
63
+ --recursica_ui-kit_components_timeline_properties_colors_active-connector-color
64
+ ) !important;
65
+ }
66
+ }
67
+
68
+ .itemBody {
69
+ /* Space between the bullet and the content */
70
+ padding-left: var(
71
+ --recursica_ui-kit_components_timeline_properties_bullet-content-gap
72
+ ) !important;
73
+ }
74
+
75
+ .itemBullet {
76
+ /* Default Variant */
77
+ :global(.mantine-Timeline-item)[data-variant="default"] & {
78
+ width: var(
79
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_bullet-size
80
+ ) !important;
81
+ height: var(
82
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_bullet-size
83
+ ) !important;
84
+ border-radius: var(
85
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_border-radius
86
+ ) !important;
87
+ border-width: var(
88
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_border-size
89
+ ) !important;
90
+
91
+ background-color: var(
92
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_colors_inactive-background
93
+ ) !important;
94
+ border-color: var(
95
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_colors_inactive-border-color
96
+ ) !important;
97
+ }
98
+ :global(.mantine-Timeline-item)[data-variant="default"][data-active] & {
99
+ background-color: var(
100
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_colors_active-background
101
+ ) !important;
102
+ border-color: var(
103
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_colors_active-border-color
104
+ ) !important;
105
+ }
106
+
107
+ /* Icon Variant */
108
+ :global(.mantine-Timeline-item)[data-variant="icon"] & {
109
+ width: var(
110
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_bullet-size
111
+ ) !important;
112
+ height: var(
113
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_bullet-size
114
+ ) !important;
115
+ border-radius: var(
116
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_border-radius
117
+ ) !important;
118
+ border-width: var(
119
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_border-size
120
+ ) !important;
121
+
122
+ background-color: var(
123
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_colors_inactive-background
124
+ ) !important;
125
+ border-color: var(
126
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_colors_inactive-border-color
127
+ ) !important;
128
+ color: var(
129
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_colors_inactive-icon-color
130
+ ) !important;
131
+
132
+ /* Propagate icon size */
133
+ font-size: var(
134
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_icon-size
135
+ );
136
+ & svg {
137
+ width: var(
138
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_icon-size
139
+ );
140
+ height: var(
141
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_icon-size
142
+ );
143
+ }
144
+ }
145
+ :global(.mantine-Timeline-item)[data-variant="icon"][data-active] & {
146
+ background-color: var(
147
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_colors_active-background
148
+ ) !important;
149
+ border-color: var(
150
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_colors_active-border-color
151
+ ) !important;
152
+ color: var(
153
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_colors_active-icon-color
154
+ ) !important;
155
+ }
156
+
157
+ /* Icon Alternative Variant */
158
+ :global(.mantine-Timeline-item)[data-variant="icon-alternative"] & {
159
+ width: var(
160
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_bullet-size
161
+ ) !important;
162
+ height: var(
163
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_bullet-size
164
+ ) !important;
165
+ border-radius: var(
166
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_border-radius
167
+ ) !important;
168
+ border-width: var(
169
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_border-size
170
+ ) !important;
171
+
172
+ background-color: var(
173
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_colors_inactive-background
174
+ ) !important;
175
+ border-color: var(
176
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_colors_inactive-border-color
177
+ ) !important;
178
+ color: var(
179
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_colors_inactive-icon-color
180
+ ) !important;
181
+
182
+ font-size: var(
183
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_icon-size
184
+ );
185
+ & svg {
186
+ width: var(
187
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_icon-size
188
+ );
189
+ height: var(
190
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_icon-size
191
+ );
192
+ }
193
+ }
194
+ :global(.mantine-Timeline-item)[data-variant="icon-alternative"][data-active]
195
+ & {
196
+ background-color: var(
197
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_colors_active-background
198
+ ) !important;
199
+ border-color: var(
200
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_colors_active-border-color
201
+ ) !important;
202
+ color: var(
203
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_colors_active-icon-color
204
+ ) !important;
205
+ }
206
+
207
+ /* Avatar Variant */
208
+ :global(.mantine-Timeline-item)[data-variant="avatar"] & {
209
+ /* Avatar sizing is often governed by the avatar itself, but we'll apply the radius and opacity */
210
+ border-radius: var(
211
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_border-radius
212
+ ) !important;
213
+ border-width: var(
214
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_border-size
215
+ ) !important;
216
+ opacity: var(
217
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_inactive-avatar-opacity
218
+ ) !important;
219
+
220
+ background-color: var(
221
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_colors_inactive-background
222
+ ) !important;
223
+ border-color: var(
224
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_colors_inactive-border-color
225
+ ) !important;
226
+ }
227
+ :global(.mantine-Timeline-item)[data-variant="avatar"][data-active] & {
228
+ opacity: var(
229
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_active-avatar-opacity
230
+ ) !important;
231
+ background-color: var(
232
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_colors_active-background
233
+ ) !important;
234
+ border-color: var(
235
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_colors_active-border-color
236
+ ) !important;
237
+ }
238
+ }
239
+
240
+ .itemTitle {
241
+ font-family: var(
242
+ --recursica_ui-kit_components_timeline_properties_title-text_font-family
243
+ );
244
+ font-size: var(
245
+ --recursica_ui-kit_components_timeline_properties_title-text_font-size
246
+ );
247
+ font-style: var(
248
+ --recursica_ui-kit_components_timeline_properties_title-text_font-style
249
+ );
250
+ font-weight: var(
251
+ --recursica_ui-kit_components_timeline_properties_title-text_font-weight
252
+ );
253
+ letter-spacing: var(
254
+ --recursica_ui-kit_components_timeline_properties_title-text_letter-spacing
255
+ );
256
+ line-height: var(
257
+ --recursica_ui-kit_components_timeline_properties_title-text_line-height
258
+ );
259
+ text-decoration: var(
260
+ --recursica_ui-kit_components_timeline_properties_title-text_text-decoration
261
+ );
262
+ text-transform: var(
263
+ --recursica_ui-kit_components_timeline_properties_title-text_text-transform
264
+ );
265
+
266
+ /* Title Description Gap */
267
+ margin-bottom: var(
268
+ --recursica_ui-kit_components_timeline_properties_title-description-gap
269
+ ) !important;
270
+
271
+ /* Inactive Title Color */
272
+ color: var(
273
+ --recursica_ui-kit_components_timeline_properties_colors_inactive-title-color
274
+ ) !important;
275
+
276
+ /* Active Title Color */
277
+ :global(.mantine-Timeline-item)[data-active] & {
278
+ color: var(
279
+ --recursica_ui-kit_components_timeline_properties_colors_active-title-color
280
+ ) !important;
281
+ }
282
+ }
283
+
284
+ .itemContent {
285
+ display: flex;
286
+ flex-direction: column;
287
+ gap: var(
288
+ --recursica_ui-kit_components_timeline_properties_description-timestamp-gap
289
+ );
290
+ max-width: var(
291
+ --recursica_ui-kit_components_timeline_properties_max-text-width
292
+ );
293
+ }
294
+
295
+ .description {
296
+ font-family: var(
297
+ --recursica_ui-kit_components_timeline_properties_description-text_font-family
298
+ );
299
+ font-size: var(
300
+ --recursica_ui-kit_components_timeline_properties_description-text_font-size
301
+ );
302
+ font-style: var(
303
+ --recursica_ui-kit_components_timeline_properties_description-text_font-style
304
+ );
305
+ font-weight: var(
306
+ --recursica_ui-kit_components_timeline_properties_description-text_font-weight
307
+ );
308
+ letter-spacing: var(
309
+ --recursica_ui-kit_components_timeline_properties_description-text_letter-spacing
310
+ );
311
+ line-height: var(
312
+ --recursica_ui-kit_components_timeline_properties_description-text_line-height
313
+ );
314
+ text-decoration: var(
315
+ --recursica_ui-kit_components_timeline_properties_description-text_text-decoration
316
+ );
317
+ text-transform: var(
318
+ --recursica_ui-kit_components_timeline_properties_description-text_text-transform
319
+ );
320
+
321
+ color: var(
322
+ --recursica_ui-kit_components_timeline_properties_colors_inactive-description-color
323
+ );
324
+
325
+ :global(.mantine-Timeline-item)[data-active] & {
326
+ color: var(
327
+ --recursica_ui-kit_components_timeline_properties_colors_active-description-color
328
+ );
329
+ }
330
+ }
331
+
332
+ .timestamp {
333
+ font-family: var(
334
+ --recursica_ui-kit_components_timeline_properties_timestamp-text_font-family
335
+ );
336
+ font-size: var(
337
+ --recursica_ui-kit_components_timeline_properties_timestamp-text_font-size
338
+ );
339
+ font-style: var(
340
+ --recursica_ui-kit_components_timeline_properties_timestamp-text_font-style
341
+ );
342
+ font-weight: var(
343
+ --recursica_ui-kit_components_timeline_properties_timestamp-text_font-weight
344
+ );
345
+ letter-spacing: var(
346
+ --recursica_ui-kit_components_timeline_properties_timestamp-text_letter-spacing
347
+ );
348
+ line-height: var(
349
+ --recursica_ui-kit_components_timeline_properties_timestamp-text_line-height
350
+ );
351
+ text-decoration: var(
352
+ --recursica_ui-kit_components_timeline_properties_timestamp-text_text-decoration
353
+ );
354
+ text-transform: var(
355
+ --recursica_ui-kit_components_timeline_properties_timestamp-text_text-transform
356
+ );
357
+
358
+ color: var(
359
+ --recursica_ui-kit_components_timeline_properties_colors_inactive-timestamp-color
360
+ );
361
+
362
+ :global(.mantine-Timeline-item)[data-active] & {
363
+ color: var(
364
+ --recursica_ui-kit_components_timeline_properties_colors_active-timestamp-color
365
+ );
366
+ }
367
+ }
@@ -1,35 +1,128 @@
1
1
  import type { Meta, StoryObj } from "@storybook/react";
2
2
  import { Timeline } from "./Timeline";
3
- import { ComingSoon } from "@recursica/storybook-template";
4
3
 
5
4
  const meta: Meta<typeof Timeline> = {
6
- title: "UI-Kit/🚧 Timeline",
5
+ title: "UI-Kit/Timeline",
7
6
  component: Timeline,
8
7
  tags: ["autodocs"],
9
- 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
- ],
26
- },
8
+ argTypes: {
9
+ defaultChecked: { table: { disable: true } },
27
10
  },
28
11
  };
29
12
 
30
13
  export default meta;
14
+
31
15
  type Story = StoryObj<typeof Timeline>;
32
16
 
33
17
  export const Default: Story = {
34
- render: () => <ComingSoon componentName="Timeline" />,
18
+ args: {
19
+ active: 1,
20
+ },
21
+ render: (args) => (
22
+ <Timeline {...args}>
23
+ <Timeline.Item
24
+ title="Commit created"
25
+ timestamp="Yesterday"
26
+ bulletVariant="default"
27
+ >
28
+ You pushed 3 new commits to the repository.
29
+ </Timeline.Item>
30
+ <Timeline.Item
31
+ title="Pull request opened"
32
+ timestamp="2 days ago"
33
+ bulletVariant="default"
34
+ >
35
+ You opened a pull request for the feature branch.
36
+ </Timeline.Item>
37
+ <Timeline.Item
38
+ title="Code review completed"
39
+ timestamp="1 week ago"
40
+ bulletVariant="default"
41
+ >
42
+ Your pull request was approved by 2 reviewers.
43
+ </Timeline.Item>
44
+ <Timeline.Item
45
+ title="Branch merged"
46
+ timestamp="2 weeks ago"
47
+ bulletVariant="default"
48
+ >
49
+ Your feature branch was successfully merged into main.
50
+ </Timeline.Item>
51
+ </Timeline>
52
+ ),
53
+ };
54
+
55
+ export const BulletVariants: Story = {
56
+ args: {
57
+ active: 1,
58
+ },
59
+ render: (args) => (
60
+ <Timeline {...args}>
61
+ <Timeline.Item
62
+ title="Default Bullet"
63
+ timestamp="Standard configuration"
64
+ bulletVariant="default"
65
+ >
66
+ The default un-configured structural dot.
67
+ </Timeline.Item>
68
+ <Timeline.Item
69
+ title="Icon Bullet"
70
+ timestamp="Standard sized icons"
71
+ bulletVariant="icon"
72
+ bullet={
73
+ <svg
74
+ viewBox="0 0 24 24"
75
+ fill="none"
76
+ stroke="currentColor"
77
+ strokeWidth="2"
78
+ strokeLinecap="round"
79
+ strokeLinejoin="round"
80
+ >
81
+ <polyline points="20 6 9 17 4 12"></polyline>
82
+ </svg>
83
+ }
84
+ >
85
+ A standard structural icon node mapping.
86
+ </Timeline.Item>
87
+ <Timeline.Item
88
+ title="Alternative Icon"
89
+ timestamp="Larger structural bounds"
90
+ bulletVariant="icon-alternative"
91
+ bullet={
92
+ <svg
93
+ viewBox="0 0 24 24"
94
+ fill="none"
95
+ stroke="currentColor"
96
+ strokeWidth="2"
97
+ strokeLinecap="round"
98
+ strokeLinejoin="round"
99
+ >
100
+ <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
101
+ </svg>
102
+ }
103
+ >
104
+ A slightly larger alternative bounding box for specialized icons.
105
+ </Timeline.Item>
106
+ <Timeline.Item
107
+ title="Avatar Bullet"
108
+ timestamp="Profile pictures"
109
+ bulletVariant="avatar"
110
+ bullet={
111
+ <img
112
+ src="https://avatars.githubusercontent.com/u/10353856?s=460&v=4"
113
+ alt="avatar"
114
+ style={{
115
+ width: "100%",
116
+ height: "100%",
117
+ objectFit: "cover",
118
+ borderRadius: "inherit",
119
+ }}
120
+ />
121
+ }
122
+ >
123
+ Avatar mappings inherently drop borders and leverage specific opacity
124
+ states.
125
+ </Timeline.Item>
126
+ </Timeline>
127
+ ),
35
128
  };
@@ -1,7 +1,83 @@
1
1
  import React from "react";
2
+ import MuiTimeline, {
3
+ type TimelineProps as MuiTimelineProps,
4
+ } from "@mui/lab/Timeline";
5
+ import {
6
+ filterStylingProps,
7
+ type RecursicaOverStyled,
8
+ } from "../../utils/filterStylingProps";
9
+ import styles from "./Timeline.module.css";
10
+ import { TimelineItem } from "./TimelineItem";
2
11
 
3
- export type TimelineProps = React.HTMLAttributes<HTMLDivElement>;
12
+ /**
13
+ * Properties for the strictly-tokenized Timeline component.
14
+ * Native Mui abstract properties like `color`, `radius`, `bulletSize`, and `lineWidth`
15
+ * have been stripped out to strictly enforce the structural mappings of the Recursica UI Kit.
16
+ */
17
+ export type TimelineProps = RecursicaOverStyled<
18
+ Omit<MuiTimelineProps, "color" | "radius" | "bulletSize" | "lineWidth">
19
+ >;
4
20
 
5
- export const Timeline: React.FC<TimelineProps> = (props) => {
6
- return <div {...props}>Timeline</div>;
7
- };
21
+ interface TimelineComponent
22
+ extends React.ForwardRefExoticComponent<
23
+ TimelineProps & React.RefAttributes<HTMLDivElement>
24
+ > {
25
+ Item: typeof TimelineItem;
26
+ }
27
+
28
+ /**
29
+ * The `Timeline` component displays a list of events in chronological order.
30
+ *
31
+ * **Recursica Abstract:**
32
+ * This component acts as a structural wrapper around Mui's `<Timeline>`.
33
+ * It forces alignment and geometry strictly via the UI Kit's `.itemBullet` and connector definitions.
34
+ *
35
+ * @example
36
+ * ```tsx
37
+ * <Timeline active={1}>
38
+ * <Timeline.Item title="Event 1" timestamp="Yesterday">Description</Timeline.Item>
39
+ * </Timeline>
40
+ * ```
41
+ */
42
+ const TimelineInner = React.forwardRef<HTMLUListElement, TimelineProps>(
43
+ function Timeline({ overStyled = false, ...rest }, ref) {
44
+ const sanitizedProps = filterStylingProps(rest, overStyled);
45
+
46
+ const mergedClassNames: Partial<Record<string, string>> = {
47
+ root: styles.root,
48
+ };
49
+
50
+ const classNamesProp = (sanitizedProps as Record<string, unknown>)
51
+ .classNames;
52
+ if (
53
+ classNamesProp &&
54
+ typeof classNamesProp === "object" &&
55
+ !Array.isArray(classNamesProp)
56
+ ) {
57
+ const o = classNamesProp as Record<string, string>;
58
+ Object.keys(o).forEach((key) => {
59
+ if (mergedClassNames[key]) {
60
+ mergedClassNames[key] = `${mergedClassNames[key]} ${o[key]}`;
61
+ } else {
62
+ mergedClassNames[key] = o[key];
63
+ }
64
+ });
65
+ }
66
+
67
+ return (
68
+ <MuiTimeline
69
+ ref={ref}
70
+ classes={mergedClassNames}
71
+ {...(sanitizedProps as unknown as Omit<
72
+ MuiTimelineProps,
73
+ "color" | "radius" | "bulletSize" | "lineWidth"
74
+ >)}
75
+ />
76
+ );
77
+ },
78
+ );
79
+
80
+ TimelineInner.displayName = "Timeline";
81
+
82
+ export const Timeline = TimelineInner as TimelineComponent;
83
+ Timeline.Item = TimelineItem;
@@ -0,0 +1,101 @@
1
+ import React from "react";
2
+ import MuiTimelineItem, {
3
+ type TimelineItemProps as MuiTimelineItemProps,
4
+ } from "@mui/lab/TimelineItem";
5
+ import {
6
+ filterStylingProps,
7
+ type RecursicaOverStyled,
8
+ } from "../../utils/filterStylingProps";
9
+ import styles from "./Timeline.module.css";
10
+
11
+ export interface RecursicaTimelineItemProps {
12
+ /**
13
+ * Timestamp text displayed below the description.
14
+ */
15
+ timestamp?: React.ReactNode;
16
+ /**
17
+ * The structural styling variant of the bullet container.
18
+ * Maps to the UI Kit structural tokens.
19
+ * @default "default"
20
+ */
21
+ bulletVariant?: "default" | "avatar" | "icon" | "icon-alternative";
22
+ }
23
+
24
+ export type TimelineItemProps = RecursicaOverStyled<
25
+ Omit<MuiTimelineItemProps, "radius" | "color" | "lineVariant"> &
26
+ RecursicaTimelineItemProps
27
+ >;
28
+
29
+ /**
30
+ * The individual item component for the Timeline.
31
+ *
32
+ * **Recursica Abstract:**
33
+ * The `Timeline.Item` has been extended to support a `timestamp` string natively,
34
+ * rendering it below the body content. It also accepts a `bulletVariant` to morph
35
+ * the structural dimensions of the node circle automatically.
36
+ */
37
+ export const TimelineItem = React.forwardRef<HTMLDivElement, TimelineItemProps>(
38
+ function TimelineItem(
39
+ {
40
+ overStyled = false,
41
+ timestamp,
42
+ bulletVariant = "default",
43
+ children,
44
+ ...rest
45
+ },
46
+ ref,
47
+ ) {
48
+ const sanitizedProps = filterStylingProps(rest, overStyled);
49
+
50
+ const mergedClassNames: Partial<Record<string, string>> = {
51
+ item: styles.item,
52
+ itemBody: styles.itemBody,
53
+ itemContent: styles.itemContent,
54
+ itemBullet: styles.itemBullet,
55
+ itemTitle: styles.itemTitle,
56
+ };
57
+
58
+ const classNamesProp = (sanitizedProps as Record<string, unknown>)
59
+ .classNames;
60
+ if (
61
+ classNamesProp &&
62
+ typeof classNamesProp === "object" &&
63
+ !Array.isArray(classNamesProp)
64
+ ) {
65
+ const o = classNamesProp as Record<string, string>;
66
+ Object.keys(o).forEach((key) => {
67
+ if (mergedClassNames[key]) {
68
+ mergedClassNames[key] = `${mergedClassNames[key]} ${o[key]}`;
69
+ } else {
70
+ mergedClassNames[key] = o[key];
71
+ }
72
+ });
73
+ }
74
+
75
+ // Embed timestamp inside children if provided, wrapped in a specific class
76
+ const content = timestamp ? (
77
+ <>
78
+ {children && <div className={styles.description}>{children}</div>}
79
+ <div className={styles.timestamp}>{timestamp}</div>
80
+ </>
81
+ ) : (
82
+ children
83
+ );
84
+
85
+ return (
86
+ <MuiTimelineItem
87
+ ref={ref}
88
+ classes={mergedClassNames}
89
+ data-variant={bulletVariant}
90
+ {...(sanitizedProps as unknown as Omit<
91
+ MuiTimelineItemProps,
92
+ "radius" | "color" | "lineVariant"
93
+ >)}
94
+ >
95
+ {content}
96
+ </MuiTimelineItem>
97
+ );
98
+ },
99
+ );
100
+
101
+ TimelineItem.displayName = "TimelineItem";