@recursica/mantine-adapter 0.35.0 → 0.36.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 (65) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/SETUP.md +1 -1
  3. package/dist/mantine-adapter.cjs +2 -2
  4. package/dist/mantine-adapter.cjs.map +1 -1
  5. package/dist/mantine-adapter.css +1 -1
  6. package/dist/mantine-adapter.js +1385 -1300
  7. package/dist/mantine-adapter.js.map +1 -1
  8. package/dist/src/components/Tree/Tree.d.ts +9 -5
  9. package/dist/src/components/index.d.ts +1 -0
  10. package/dist/src/index.d.ts +1 -0
  11. package/llms.txt +2 -0
  12. package/package.json +1 -1
  13. package/src/components/Accordion/Accordion.module.css +123 -62
  14. package/src/components/Accordion/Accordion.stories.tsx +65 -33
  15. package/src/components/Accordion/Accordion.tsx +1 -0
  16. package/src/components/AutoComplete/AutoComplete.module.css +50 -49
  17. package/src/components/AutoComplete/AutoComplete.tsx +2 -2
  18. package/src/components/Avatar/Avatar.module.css +7 -7
  19. package/src/components/Badge/Badge.module.css +8 -8
  20. package/src/components/Button/Button.module.css +22 -89
  21. package/src/components/Card/Card.module.css +3 -3
  22. package/src/components/Checkbox/Checkbox.module.css +54 -15
  23. package/src/components/Chip/Chip.module.css +27 -26
  24. package/src/components/DatePicker/DatePicker.module.css +25 -30
  25. package/src/components/Dropdown/Dropdown.module.css +47 -44
  26. package/src/components/Dropdown/Dropdown.tsx +2 -2
  27. package/src/components/FormControlWrapper/FormControlWrapper.module.css +12 -12
  28. package/src/components/HoverCard/HoverCard.module.css +1 -1
  29. package/src/components/Label/Label.module.css +7 -3
  30. package/src/components/Layer/USAGE.md +54 -0
  31. package/src/components/Link/IMPLEMENTATION_NOTES.md +2 -9
  32. package/src/components/Link/Link.module.css +15 -76
  33. package/src/components/Link/USAGE.md +2 -9
  34. package/src/components/Loader/Loader.module.css +3 -3
  35. package/src/components/Menu/Menu.module.css +34 -41
  36. package/src/components/Modal/Modal.module.css +27 -11
  37. package/src/components/NumberInput/NumberInput.module.css +39 -37
  38. package/src/components/NumberInput/NumberInput.tsx +2 -2
  39. package/src/components/Pagination/Pagination.module.css +10 -43
  40. package/src/components/Panel/Panel.module.css +3 -3
  41. package/src/components/Popover/Popover.module.css +1 -1
  42. package/src/components/Radio/Radio.module.css +31 -14
  43. package/src/components/ReadOnlyField/ReadOnlyField.module.css +1 -1
  44. package/src/components/RecursicaThemeProvider/USAGE.md +60 -0
  45. package/src/components/SegmentedControl/SegmentedControl.module.css +29 -29
  46. package/src/components/Slider/IMPLEMENTATION_NOTES.md +9 -0
  47. package/src/components/Slider/Slider.module.css +44 -48
  48. package/src/components/Stepper/Stepper.module.css +3 -3
  49. package/src/components/Switch/Switch.module.css +26 -10
  50. package/src/components/Table/Table.module.css +53 -21
  51. package/src/components/Tabs/Tabs.module.css +309 -170
  52. package/src/components/TextArea/TextArea.module.css +36 -21
  53. package/src/components/TextArea/TextArea.tsx +2 -2
  54. package/src/components/TextField/TextField.module.css +38 -35
  55. package/src/components/TextField/TextField.tsx +2 -2
  56. package/src/components/Timeline/Timeline.module.css +41 -34
  57. package/src/components/Toast/Toast.module.css +19 -11
  58. package/src/components/Tooltip/Tooltip.module.css +4 -2
  59. package/src/components/Tree/IMPLEMENTATION_NOTES.md +17 -0
  60. package/src/components/Tree/Tree.module.css +173 -39
  61. package/src/components/Tree/Tree.stories.tsx +81 -4
  62. package/src/components/Tree/Tree.tsx +117 -15
  63. package/src/components/Tree/USAGE.md +36 -3
  64. package/src/components/index.ts +1 -0
  65. package/src/index.ts +3 -0
@@ -1,23 +1,36 @@
1
1
  /* EXEMPTIONS:
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. */
4
- /* recursica-ignore: --recursica_ui-kit_components_textarea_variants_states_default_properties_border-size */
2
+ - border-size variables are ignored because a uniform 1px border is applied globally to prevent
3
+ unexpected layout shift or flickering during focused, disabled, or error state transitions. */
4
+ /* recursica-ignore: --recursica_ui-kit_components_textarea_properties_border-size */
5
5
  /* recursica-ignore: --recursica_ui-kit_components_textarea_variants_states_disabled_properties_border-size */
6
6
  /* recursica-ignore: --recursica_ui-kit_components_textarea_variants_states_error_properties_border-size */
7
- /* recursica-ignore: --recursica_ui-kit_components_textarea_variants_states_focus_properties_border-size */
8
7
 
9
8
  /* LAYOUT SPACING OVERRIDES:
10
- - Sets the --form-control-margin-bottom spacing hook to map component-specific layout tokens. */
9
+ - Sets the --form-control-margin-bottom spacing hook to map component-specific layout tokens.
10
+ - Also sets the --textarea-control-{max,min}-width hooks consumed inline in TextArea.tsx, since
11
+ the token schema no longer provides a single layout-agnostic min/max width. */
11
12
  .layoutOverride {
12
13
  --form-control-margin-bottom: var(
13
14
  --recursica_ui-kit_components_textarea_variants_layouts_stacked_properties_top-bottom-margin
14
15
  );
16
+ --textarea-control-max-width: var(
17
+ --recursica_ui-kit_components_textarea_variants_layouts_stacked_properties_max-width
18
+ );
19
+ --textarea-control-min-width: var(
20
+ --recursica_ui-kit_components_textarea_variants_layouts_stacked_properties_min-width
21
+ );
15
22
  }
16
23
 
17
24
  .layoutOverride[data-form-layout="side-by-side"] {
18
25
  --form-control-margin-bottom: var(
19
26
  --recursica_ui-kit_components_textarea_variants_layouts_side-by-side_properties_top-bottom-margin
20
27
  );
28
+ --textarea-control-max-width: var(
29
+ --recursica_ui-kit_components_textarea_variants_layouts_side-by-side_properties_max-width
30
+ );
31
+ --textarea-control-min-width: var(
32
+ --recursica_ui-kit_components_textarea_variants_layouts_side-by-side_properties_min-width
33
+ );
21
34
  }
22
35
 
23
36
  /* HARDCODED VALUES:
@@ -95,13 +108,13 @@
95
108
 
96
109
  /* Base State Default Execution */
97
110
  background-color: var(
98
- --recursica_ui-kit_components_textarea_variants_states_default_properties_colors_background
111
+ --recursica_ui-kit_components_textarea_properties_colors_background-color
99
112
  );
100
113
  border-color: var(
101
- --recursica_ui-kit_components_textarea_variants_states_default_properties_colors_border-color
114
+ --recursica_ui-kit_components_textarea_properties_colors_border-color
102
115
  );
103
116
  color: var(
104
- --recursica_ui-kit_components_textarea_variants_states_default_properties_colors_text
117
+ --recursica_ui-kit_components_textarea_properties_colors_text-color
105
118
  );
106
119
 
107
120
  outline: none;
@@ -119,17 +132,16 @@
119
132
  -------------------------------------- */
120
133
 
121
134
  /* Focus State Mapping (Triggered internally via browser focus rules) */
135
+ /* The token schema no longer provides per-component focus colors; apply the generic focus ring
136
+ tokens as a box-shadow ring instead of a color swap. */
122
137
  .input:focus-within,
123
138
  .input:focus {
124
- border-color: var(
125
- --recursica_ui-kit_components_textarea_variants_states_focus_properties_colors_border-color
126
- );
127
- background-color: var(
128
- --recursica_ui-kit_components_textarea_variants_states_focus_properties_colors_background
129
- );
130
- color: var(
131
- --recursica_ui-kit_components_textarea_variants_states_focus_properties_colors_text
132
- );
139
+ box-shadow:
140
+ 0 0 0 var(--recursica_brand_states_focus_border-size)
141
+ var(--recursica_brand_states_focus_color),
142
+ 0 0 var(--recursica_brand_states_focus_blur)
143
+ var(--recursica_brand_states_focus_margin)
144
+ var(--recursica_brand_states_focus_color);
133
145
  }
134
146
 
135
147
  /* Error State Mapping (Propagated strictly down from the wrapper DOM context) */
@@ -138,10 +150,10 @@
138
150
  --recursica_ui-kit_components_textarea_variants_states_error_properties_colors_border-color
139
151
  ) !important;
140
152
  background-color: var(
141
- --recursica_ui-kit_components_textarea_variants_states_error_properties_colors_background
153
+ --recursica_ui-kit_components_textarea_variants_states_error_properties_colors_background-color
142
154
  ) !important;
143
155
  color: var(
144
- --recursica_ui-kit_components_textarea_variants_states_error_properties_colors_text
156
+ --recursica_ui-kit_components_textarea_variants_states_error_properties_colors_text-color
145
157
  ) !important;
146
158
  }
147
159
 
@@ -151,10 +163,13 @@
151
163
  --recursica_ui-kit_components_textarea_variants_states_disabled_properties_colors_border-color
152
164
  ) !important;
153
165
  background-color: var(
154
- --recursica_ui-kit_components_textarea_variants_states_disabled_properties_colors_background
166
+ --recursica_ui-kit_components_textarea_variants_states_disabled_properties_colors_background-color
155
167
  ) !important;
156
168
  color: var(
157
- --recursica_ui-kit_components_textarea_variants_states_disabled_properties_colors_text
169
+ --recursica_ui-kit_components_textarea_variants_states_disabled_properties_colors_text-color
170
+ ) !important;
171
+ opacity: var(
172
+ --recursica_ui-kit_components_textarea_variants_states_disabled_properties_opacity
158
173
  ) !important;
159
174
  cursor: not-allowed;
160
175
  }
@@ -95,8 +95,8 @@ export const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(
95
95
  <WithReadOnlyWrapper
96
96
  className={wrapperClass}
97
97
  style={style as React.CSSProperties}
98
- controlMaxWidth="var(--recursica_ui-kit_components_textarea_properties_max-width)"
99
- controlMinWidth="var(--recursica_ui-kit_components_textarea_properties_min-width)"
98
+ controlMaxWidth="var(--textarea-control-max-width)"
99
+ controlMinWidth="var(--textarea-control-min-width)"
100
100
  overStyled={overStyled as true}
101
101
  formLayout={formLayout}
102
102
  labelSize={labelSize}
@@ -1,23 +1,36 @@
1
1
  /* EXEMPTIONS:
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. */
4
- /* recursica-ignore: --recursica_ui-kit_components_text-field_variants_states_default_properties_border-size */
2
+ - border-size variables are ignored because a uniform 1px border is applied globally to prevent
3
+ unexpected layout shift or flickering during focused, disabled, or error state transitions. */
4
+ /* recursica-ignore: --recursica_ui-kit_components_text-field_properties_border-size */
5
5
  /* recursica-ignore: --recursica_ui-kit_components_text-field_variants_states_disabled_properties_border-size */
6
6
  /* recursica-ignore: --recursica_ui-kit_components_text-field_variants_states_error_properties_border-size */
7
- /* recursica-ignore: --recursica_ui-kit_components_text-field_variants_states_focus_properties_border-size */
8
7
 
9
8
  /* LAYOUT SPACING OVERRIDES:
10
- - Sets the --form-control-margin-bottom spacing hook to map component-specific layout tokens. */
9
+ - Sets the --form-control-margin-bottom spacing hook to map component-specific layout tokens.
10
+ - Also sets the --text-field-control-{max,min}-width hooks consumed inline in TextField.tsx,
11
+ since the token schema no longer provides a single layout-agnostic min/max width. */
11
12
  .layoutOverride {
12
13
  --form-control-margin-bottom: var(
13
14
  --recursica_ui-kit_components_text-field_variants_layouts_stacked_properties_top-bottom-margin
14
15
  );
16
+ --text-field-control-max-width: var(
17
+ --recursica_ui-kit_components_text-field_variants_layouts_stacked_properties_max-width
18
+ );
19
+ --text-field-control-min-width: var(
20
+ --recursica_ui-kit_components_text-field_variants_layouts_stacked_properties_min-width
21
+ );
15
22
  }
16
23
 
17
24
  .layoutOverride[data-form-layout="side-by-side"] {
18
25
  --form-control-margin-bottom: var(
19
26
  --recursica_ui-kit_components_text-field_variants_layouts_side-by-side_properties_top-bottom-margin
20
27
  );
28
+ --text-field-control-max-width: var(
29
+ --recursica_ui-kit_components_text-field_variants_layouts_side-by-side_properties_max-width
30
+ );
31
+ --text-field-control-min-width: var(
32
+ --recursica_ui-kit_components_text-field_variants_layouts_side-by-side_properties_min-width
33
+ );
21
34
  }
22
35
 
23
36
  /* HARDCODED VALUES:
@@ -108,13 +121,13 @@
108
121
 
109
122
  /* Base State Default Execution */
110
123
  background-color: var(
111
- --recursica_ui-kit_components_text-field_variants_states_default_properties_colors_background
124
+ --recursica_ui-kit_components_text-field_properties_colors_background-color
112
125
  );
113
126
  border-color: var(
114
- --recursica_ui-kit_components_text-field_variants_states_default_properties_colors_border-color
127
+ --recursica_ui-kit_components_text-field_properties_colors_border-color
115
128
  );
116
129
  color: var(
117
- --recursica_ui-kit_components_text-field_variants_states_default_properties_colors_text
130
+ --recursica_ui-kit_components_text-field_properties_colors_text-color
118
131
  );
119
132
 
120
133
  outline: none;
@@ -161,13 +174,13 @@
161
174
  width: var(--recursica_ui-kit_components_text-field_properties_icon-size);
162
175
  height: var(--recursica_ui-kit_components_text-field_properties_icon-size);
163
176
  color: var(
164
- --recursica_ui-kit_components_text-field_variants_states_default_properties_colors_leading-icon
177
+ --recursica_ui-kit_components_text-field_properties_colors_leading-icon
165
178
  );
166
179
  }
167
180
 
168
181
  .section[data-position="right"] :global(svg) {
169
182
  color: var(
170
- --recursica_ui-kit_components_text-field_variants_states_default_properties_colors_trailing-icon
183
+ --recursica_ui-kit_components_text-field_properties_colors_trailing-icon
171
184
  );
172
185
  }
173
186
 
@@ -176,29 +189,16 @@
176
189
  -------------------------------------- */
177
190
 
178
191
  /* Focus State Mapping (Triggered internally via browser pseudo-pseudo-class) */
192
+ /* The token schema no longer provides per-component focus colors; apply the generic focus ring
193
+ tokens as a box-shadow ring instead of a color swap. */
179
194
  .input:focus-within,
180
195
  .input:focus {
181
- border-color: var(
182
- --recursica_ui-kit_components_text-field_variants_states_focus_properties_colors_border-color
183
- );
184
- background-color: var(
185
- --recursica_ui-kit_components_text-field_variants_states_focus_properties_colors_background
186
- );
187
- color: var(
188
- --recursica_ui-kit_components_text-field_variants_states_focus_properties_colors_text
189
- );
190
- }
191
-
192
- .root:focus-within .section[data-position="left"] :global(svg) {
193
- color: var(
194
- --recursica_ui-kit_components_text-field_variants_states_focus_properties_colors_leading-icon
195
- );
196
- }
197
-
198
- .root:focus-within .section[data-position="right"] :global(svg) {
199
- color: var(
200
- --recursica_ui-kit_components_text-field_variants_states_focus_properties_colors_trailing-icon
201
- );
196
+ box-shadow:
197
+ 0 0 0 var(--recursica_brand_states_focus_border-size)
198
+ var(--recursica_brand_states_focus_color),
199
+ 0 0 var(--recursica_brand_states_focus_blur)
200
+ var(--recursica_brand_states_focus_margin)
201
+ var(--recursica_brand_states_focus_color);
202
202
  }
203
203
 
204
204
  /* Error State Mapping (Propagated strictly down from the wrapper DOM context) */
@@ -207,10 +207,10 @@
207
207
  --recursica_ui-kit_components_text-field_variants_states_error_properties_colors_border-color
208
208
  ) !important;
209
209
  background-color: var(
210
- --recursica_ui-kit_components_text-field_variants_states_error_properties_colors_background
210
+ --recursica_ui-kit_components_text-field_variants_states_error_properties_colors_background-color
211
211
  ) !important;
212
212
  color: var(
213
- --recursica_ui-kit_components_text-field_variants_states_error_properties_colors_text
213
+ --recursica_ui-kit_components_text-field_variants_states_error_properties_colors_text-color
214
214
  ) !important;
215
215
  }
216
216
 
@@ -232,10 +232,13 @@
232
232
  --recursica_ui-kit_components_text-field_variants_states_disabled_properties_colors_border-color
233
233
  ) !important;
234
234
  background-color: var(
235
- --recursica_ui-kit_components_text-field_variants_states_disabled_properties_colors_background
235
+ --recursica_ui-kit_components_text-field_variants_states_disabled_properties_colors_background-color
236
236
  ) !important;
237
237
  color: var(
238
- --recursica_ui-kit_components_text-field_variants_states_disabled_properties_colors_text
238
+ --recursica_ui-kit_components_text-field_variants_states_disabled_properties_colors_text-color
239
+ ) !important;
240
+ opacity: var(
241
+ --recursica_ui-kit_components_text-field_variants_states_disabled_properties_opacity
239
242
  ) !important;
240
243
  cursor: not-allowed;
241
244
  }
@@ -101,8 +101,8 @@ export const TextField = forwardRef<HTMLInputElement, TextFieldProps>(
101
101
  <WithReadOnlyWrapper
102
102
  className={wrapperClass}
103
103
  style={style as React.CSSProperties}
104
- controlMaxWidth="var(--recursica_ui-kit_components_text-field_properties_max-width)"
105
- controlMinWidth="var(--recursica_ui-kit_components_text-field_properties_min-width)"
104
+ controlMaxWidth="var(--text-field-control-max-width)"
105
+ controlMinWidth="var(--text-field-control-min-width)"
106
106
  overStyled={overStyled as true}
107
107
  formLayout={formLayout}
108
108
  labelSize={labelSize}
@@ -7,17 +7,24 @@
7
7
  .root {
8
8
  display: flex;
9
9
  flex-direction: column;
10
+ /* Mantine drives item spacing (.item's margin-top) AND the connector line's bridging offset
11
+ (.item::before's negative bottom) off the SAME --mantine-spacing-xl variable. Overriding it
12
+ here (rather than adding a flex gap) keeps both in sync automatically instead of introducing
13
+ a visible break in the connector line. */
14
+ --mantine-spacing-xl: var(
15
+ --recursica_ui-kit_components_timeline_properties_item-gap
16
+ );
10
17
  }
11
18
 
12
19
  .item {
13
20
  /* Mantine uses these vars to calculate the exact left: position of the connector line */
14
21
  --tl-line-width: var(
15
- --recursica_ui-kit_components_timeline_properties_inactive-connector-size
22
+ --recursica_ui-kit_components_timeline_variants_selection-states_inactive_properties_connector-size
16
23
  ) !important;
17
24
 
18
25
  &[data-active] {
19
26
  --tl-line-width: var(
20
- --recursica_ui-kit_components_timeline_properties_active-connector-size
27
+ --recursica_ui-kit_components_timeline_variants_selection-states_active_properties_connector-size
21
28
  ) !important;
22
29
  }
23
30
 
@@ -47,20 +54,20 @@
47
54
  /* Inactive connector */
48
55
  &::before {
49
56
  border-left-width: var(
50
- --recursica_ui-kit_components_timeline_properties_inactive-connector-size
57
+ --recursica_ui-kit_components_timeline_variants_selection-states_inactive_properties_connector-size
51
58
  ) !important;
52
59
  border-left-color: var(
53
- --recursica_ui-kit_components_timeline_properties_colors_inactive-connector-color
60
+ --recursica_ui-kit_components_timeline_variants_selection-states_inactive_properties_colors_connector-color
54
61
  ) !important;
55
62
  }
56
63
 
57
64
  /* Active connector */
58
65
  &[data-active]::before {
59
66
  border-left-width: var(
60
- --recursica_ui-kit_components_timeline_properties_active-connector-size
67
+ --recursica_ui-kit_components_timeline_variants_selection-states_active_properties_connector-size
61
68
  ) !important;
62
69
  border-left-color: var(
63
- --recursica_ui-kit_components_timeline_properties_colors_active-connector-color
70
+ --recursica_ui-kit_components_timeline_variants_selection-states_active_properties_colors_connector-color
64
71
  ) !important;
65
72
  }
66
73
  }
@@ -89,18 +96,18 @@
89
96
  ) !important;
90
97
 
91
98
  background-color: var(
92
- --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_colors_inactive-background
99
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_variants_selection-states_inactive_properties_colors_background-color
93
100
  ) !important;
94
101
  border-color: var(
95
- --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_colors_inactive-border-color
102
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_variants_selection-states_inactive_properties_colors_border-color
96
103
  ) !important;
97
104
  }
98
105
  :global(.mantine-Timeline-item)[data-variant="default"][data-active] & {
99
106
  background-color: var(
100
- --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_colors_active-background
107
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_variants_selection-states_active_properties_colors_background-color
101
108
  ) !important;
102
109
  border-color: var(
103
- --recursica_ui-kit_components_timeline-bullet_variants_types_default_properties_colors_active-border-color
110
+ --recursica_ui-kit_components_timeline-bullet_variants_types_default_variants_selection-states_active_properties_colors_border-color
104
111
  ) !important;
105
112
  }
106
113
 
@@ -120,13 +127,13 @@
120
127
  ) !important;
121
128
 
122
129
  background-color: var(
123
- --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_colors_inactive-background
130
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_variants_selection-states_inactive_properties_colors_background-color
124
131
  ) !important;
125
132
  border-color: var(
126
- --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_colors_inactive-border-color
133
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_variants_selection-states_inactive_properties_colors_border-color
127
134
  ) !important;
128
135
  color: var(
129
- --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_colors_inactive-icon-color
136
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_variants_selection-states_inactive_properties_colors_icon-color
130
137
  ) !important;
131
138
 
132
139
  /* Propagate icon size */
@@ -144,13 +151,13 @@
144
151
  }
145
152
  :global(.mantine-Timeline-item)[data-variant="icon"][data-active] & {
146
153
  background-color: var(
147
- --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_colors_active-background
154
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_variants_selection-states_active_properties_colors_background-color
148
155
  ) !important;
149
156
  border-color: var(
150
- --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_colors_active-border-color
157
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_variants_selection-states_active_properties_colors_border-color
151
158
  ) !important;
152
159
  color: var(
153
- --recursica_ui-kit_components_timeline-bullet_variants_types_icon_properties_colors_active-icon-color
160
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon_variants_selection-states_active_properties_colors_icon-color
154
161
  ) !important;
155
162
  }
156
163
 
@@ -170,13 +177,13 @@
170
177
  ) !important;
171
178
 
172
179
  background-color: var(
173
- --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_colors_inactive-background
180
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_variants_selection-states_inactive_properties_colors_background-color
174
181
  ) !important;
175
182
  border-color: var(
176
- --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_colors_inactive-border-color
183
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_variants_selection-states_inactive_properties_colors_border-color
177
184
  ) !important;
178
185
  color: var(
179
- --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_colors_inactive-icon-color
186
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_variants_selection-states_inactive_properties_colors_icon-color
180
187
  ) !important;
181
188
 
182
189
  font-size: var(
@@ -194,13 +201,13 @@
194
201
  :global(.mantine-Timeline-item)[data-variant="icon-alternative"][data-active]
195
202
  & {
196
203
  background-color: var(
197
- --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_colors_active-background
204
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_variants_selection-states_active_properties_colors_background-color
198
205
  ) !important;
199
206
  border-color: var(
200
- --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_colors_active-border-color
207
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_variants_selection-states_active_properties_colors_border-color
201
208
  ) !important;
202
209
  color: var(
203
- --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_properties_colors_active-icon-color
210
+ --recursica_ui-kit_components_timeline-bullet_variants_types_icon-alternative_variants_selection-states_active_properties_colors_icon-color
204
211
  ) !important;
205
212
  }
206
213
 
@@ -214,25 +221,25 @@
214
221
  --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_border-size
215
222
  ) !important;
216
223
  opacity: var(
217
- --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_inactive-avatar-opacity
224
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_variants_selection-states_inactive_properties_avatar-opacity
218
225
  ) !important;
219
226
 
220
227
  background-color: var(
221
- --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_colors_inactive-background
228
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_variants_selection-states_inactive_properties_colors_background-color
222
229
  ) !important;
223
230
  border-color: var(
224
- --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_colors_inactive-border-color
231
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_variants_selection-states_inactive_properties_colors_border-color
225
232
  ) !important;
226
233
  }
227
234
  :global(.mantine-Timeline-item)[data-variant="avatar"][data-active] & {
228
235
  opacity: var(
229
- --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_active-avatar-opacity
236
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_variants_selection-states_active_properties_avatar-opacity
230
237
  ) !important;
231
238
  background-color: var(
232
- --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_colors_active-background
239
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_variants_selection-states_active_properties_colors_background-color
233
240
  ) !important;
234
241
  border-color: var(
235
- --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_colors_active-border-color
242
+ --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_variants_selection-states_active_properties_colors_border-color
236
243
  ) !important;
237
244
  }
238
245
  }
@@ -270,13 +277,13 @@
270
277
 
271
278
  /* Inactive Title Color */
272
279
  color: var(
273
- --recursica_ui-kit_components_timeline_properties_colors_inactive-title-color
280
+ --recursica_ui-kit_components_timeline_variants_selection-states_inactive_properties_colors_title-color
274
281
  ) !important;
275
282
 
276
283
  /* Active Title Color */
277
284
  :global(.mantine-Timeline-item)[data-active] & {
278
285
  color: var(
279
- --recursica_ui-kit_components_timeline_properties_colors_active-title-color
286
+ --recursica_ui-kit_components_timeline_variants_selection-states_active_properties_colors_title-color
280
287
  ) !important;
281
288
  }
282
289
  }
@@ -319,12 +326,12 @@
319
326
  );
320
327
 
321
328
  color: var(
322
- --recursica_ui-kit_components_timeline_properties_colors_inactive-description-color
329
+ --recursica_ui-kit_components_timeline_variants_selection-states_inactive_properties_colors_description-color
323
330
  );
324
331
 
325
332
  :global(.mantine-Timeline-item)[data-active] & {
326
333
  color: var(
327
- --recursica_ui-kit_components_timeline_properties_colors_active-description-color
334
+ --recursica_ui-kit_components_timeline_variants_selection-states_active_properties_colors_description-color
328
335
  );
329
336
  }
330
337
  }
@@ -356,12 +363,12 @@
356
363
  );
357
364
 
358
365
  color: var(
359
- --recursica_ui-kit_components_timeline_properties_colors_inactive-timestamp-color
366
+ --recursica_ui-kit_components_timeline_variants_selection-states_inactive_properties_colors_timestamp-color
360
367
  );
361
368
 
362
369
  :global(.mantine-Timeline-item)[data-active] & {
363
370
  color: var(
364
- --recursica_ui-kit_components_timeline_properties_colors_active-timestamp-color
371
+ --recursica_ui-kit_components_timeline_variants_selection-states_active_properties_colors_timestamp-color
365
372
  );
366
373
  }
367
374
  }
@@ -6,7 +6,7 @@
6
6
  /* recursica-ignore: --recursica_ui-kit_components_toast_properties_elevation_layer-3 */
7
7
 
8
8
  /* HARDCODED VALUES:
9
- - border-style: none. To ensure the notification doesn't render unwanted borders unless specified.
9
+ - border-style: solid. Baseline so the per-variant border-color tokens actually render.
10
10
  */
11
11
 
12
12
  /* ======================================
@@ -19,7 +19,9 @@
19
19
  );
20
20
  border-width: var(--recursica_ui-kit_components_toast_properties_border-size);
21
21
  border-style: solid;
22
- border-color: transparent;
22
+ border-color: var(
23
+ --recursica_ui-kit_components_toast_variants_styles_default_properties_colors_border-color
24
+ );
23
25
  box-shadow: var(
24
26
  --recursica_ui-kit_components_toast_properties_elevation_layer-0
25
27
  );
@@ -31,7 +33,7 @@
31
33
 
32
34
  /* Default Variant (Base) */
33
35
  background-color: var(
34
- --recursica_ui-kit_components_toast_variants_styles_default_properties_colors_background
36
+ --recursica_ui-kit_components_toast_variants_styles_default_properties_colors_background-color
35
37
  );
36
38
  gap: var(--recursica_ui-kit_components_toast_properties_spacing);
37
39
 
@@ -48,7 +50,7 @@
48
50
  background-color: transparent !important; /* Remove Mantine's native circle background */
49
51
 
50
52
  color: var(
51
- --recursica_ui-kit_components_toast_variants_styles_default_properties_colors_text
53
+ --recursica_ui-kit_components_toast_variants_styles_default_properties_colors_text-color
52
54
  );
53
55
  }
54
56
 
@@ -58,7 +60,7 @@
58
60
  & .title,
59
61
  & .description {
60
62
  color: var(
61
- --recursica_ui-kit_components_toast_variants_styles_default_properties_colors_text
63
+ --recursica_ui-kit_components_toast_variants_styles_default_properties_colors_text-color
62
64
  );
63
65
  }
64
66
  & .closeButton {
@@ -70,18 +72,21 @@
70
72
  /* Error Variant styling */
71
73
  &[data-variant="error"] {
72
74
  background-color: var(
73
- --recursica_ui-kit_components_toast_variants_styles_error_properties_colors_background
75
+ --recursica_ui-kit_components_toast_variants_styles_error_properties_colors_background-color
76
+ );
77
+ border-color: var(
78
+ --recursica_ui-kit_components_toast_variants_styles_error_properties_colors_border-color
74
79
  );
75
80
 
76
81
  & .icon {
77
82
  color: var(
78
- --recursica_ui-kit_components_toast_variants_styles_error_properties_colors_text
83
+ --recursica_ui-kit_components_toast_variants_styles_error_properties_colors_text-color
79
84
  ) !important;
80
85
  }
81
86
  & .title,
82
87
  & .description {
83
88
  color: var(
84
- --recursica_ui-kit_components_toast_variants_styles_error_properties_colors_text
89
+ --recursica_ui-kit_components_toast_variants_styles_error_properties_colors_text-color
85
90
  );
86
91
  }
87
92
  & .closeButton {
@@ -94,18 +99,21 @@
94
99
  /* Success Variant styling */
95
100
  &[data-variant="success"] {
96
101
  background-color: var(
97
- --recursica_ui-kit_components_toast_variants_styles_success_properties_colors_background
102
+ --recursica_ui-kit_components_toast_variants_styles_success_properties_colors_background-color
103
+ );
104
+ border-color: var(
105
+ --recursica_ui-kit_components_toast_variants_styles_success_properties_colors_border-color
98
106
  );
99
107
 
100
108
  & .icon {
101
109
  color: var(
102
- --recursica_ui-kit_components_toast_variants_styles_success_properties_colors_text
110
+ --recursica_ui-kit_components_toast_variants_styles_success_properties_colors_text-color
103
111
  ) !important;
104
112
  }
105
113
  & .title,
106
114
  & .description {
107
115
  color: var(
108
- --recursica_ui-kit_components_toast_variants_styles_success_properties_colors_text
116
+ --recursica_ui-kit_components_toast_variants_styles_success_properties_colors_text-color
109
117
  );
110
118
  }
111
119
  & .closeButton {
@@ -23,7 +23,7 @@
23
23
 
24
24
  .tooltip {
25
25
  background-color: var(
26
- --recursica_ui-kit_components_tooltip_properties_colors_background
26
+ --recursica_ui-kit_components_tooltip_properties_colors_background-color
27
27
  );
28
28
  border-style: solid; /* HARDCODE: Mantine Box does not set border-style natively */
29
29
  border-width: var(
@@ -76,7 +76,9 @@
76
76
  --recursica_ui-kit_components_tooltip_properties_text_text-transform
77
77
  );
78
78
 
79
- color: var(--recursica_ui-kit_components_tooltip_properties_colors_text);
79
+ color: var(
80
+ --recursica_ui-kit_components_tooltip_properties_colors_text-color
81
+ );
80
82
  }
81
83
 
82
84
  /* ======================================
@@ -0,0 +1,17 @@
1
+ # Tree Implementation Notes
2
+
3
+ - **Fully custom `renderNode`, not Mantine's default row markup.** Mantine's `Tree` renders each node as `<li {...getStyles("node")}>{renderNode ? renderNode(payload) : <div {...elementProps}>{node.label}</div>}{subtree}</li>`. We always pass a custom `renderNode` (never rely on the fallback) so every visual property — box model, colors, typography, the expand chevron — is fully token-driven rather than inheriting Mantine's own `Tree.module.css` defaults (which include Mantine's own light/dark `[data-selected]` background using its own gray palette).
4
+
5
+ - **`elementProps` already carries the important behavioral wiring.** Mantine's `renderNode` payload includes an `elementProps` object with `onClick` (combined expand+select handler, respecting `expandOnClick`/`selectOnClick`), `data-selected`, `data-value`, and `data-hovered` (set on keyboard/mouse hover via Mantine's internal `hoveredNode` state). We spread these directly onto our own `.row` div rather than reimplementing click/keyboard behavior — only the `className` is overridden with our own token-driven class.
6
+
7
+ - **The chevron is a decorative element inside the same clickable row, not a separate `<button>`.** The design tokens include a `button-node-gap` token (implying a "button" next to the node label in Figma), but structurally the whole row is already the click target via `elementProps.onClick` (which correctly bundles Mantine's `expandOnClick`/`selectOnClick` logic). Making the chevron its own nested interactive `<button>` inside an `<li>` that Mantine already treats as keyboard-focusable (`tabIndex`, arrow-key handling in `TreeNode.tsx`) would create nested-focusable-element accessibility problems for no real benefit. `button-node-gap` is used as the CSS `gap` between the (decorative) chevron and the label inside `.row` instead.
8
+
9
+ - **No dedicated icon-color/icon-size token exists for Tree.** The expand chevron is an inline SVG using `stroke="currentColor"`, sized at `1em` (relative to the row's own tokened `font-size`). This means it automatically tracks whichever text-color token (selected/unselected) is active on `.row` — no new token was invented, and no hardcoded color was used.
10
+
11
+ - **KNOWN GAP (2026-08-06): Forge's own preview shows a red chevron with more chevron-to-label spacing than what's currently implemented here.** Re-verified against both the compiled `recursica_variables_scoped.css` and the raw `recursica_ui-kit.json` (synced the same day) — the `tree` schema genuinely has no `icon-color` property anywhere (only `background-color`/`border-color`/`text-color` per selection state, and neither references any red/`core-colors.alert` palette), and `button-node-gap` resolves to `brand.dimensions.general.sm` = 4px, which is exactly what `.row`'s `gap` uses. This was confirmed _not_ to be a mapping bug on our side. Most likely explanation: the chevron in the Figma source isn't bound to a variable at all (Forge previews commonly flag unbound properties in a warning color), and/or its real icon asset has different intrinsic spacing than our hand-drawn placeholder glyph. Needs a Forge/design follow-up — a bound icon-color variable and a confirmed intended gap value — before this can be fixed with a real token rather than a hardcoded guess.
12
+
13
+ - **`--level-offset` override needs `!important`.** Mantine's `Tree` computes each node's indent via a `--level-offset` CSS variable, resolved internally through its `createVarsResolver` mechanism and applied as a scoped rule on the root `<ul>` (same category of override as `Timeline`'s `--mantine-spacing-xl` / `--tl-line-width`). We override it on `.root` with `!important` to reliably beat Mantine's own generated rule regardless of stylesheet insertion order, rather than passing a `levelOffset` prop from TSX (which would mean setting a design-token value from TSX, against `COMPONENT_DEV_GUIDE.md`'s "no custom properties set from TSX for styling" rule).
14
+
15
+ - **`onSelectedChange` is a Recursica addition, not a Mantine API.** Mantine's `useTree()` controller tracks `selectedState` but has no change callback of its own. We watch `tree.selectedState` with a `useEffect` and fire `onSelectedChange` when it changes. This is a behavioral callback, not a design-token reactivity concern, so it doesn't conflict with `COMPONENT_DEV_GUIDE.md §7`'s rule against using `useEffect` for token/styling reactivity.
16
+
17
+ - **Deliberately not implemented (no tokens back them):** checkbox/indeterminate node state (Mantine's `Tree` supports `checkNode`/`isNodeIndeterminate`, but the Figma UI Kit's `tree` tokens only define `selected`/`unselected`, not a checked state) and per-node `disabled` (no token, and no `disabled` field in Mantine's `TreeNodeData` either). If either is needed later, it needs a token/schema addition first, not a component-level workaround.