@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,9 +1,13 @@
1
1
  import { default as React } from 'react';
2
2
  import { RecursicaOverStyled } from '../../utils/filterStylingProps';
3
- export interface TreeProps extends React.ComponentPropsWithoutRef<"div"> {
4
- overStyled?: boolean;
5
- }
3
+ import { RecursicaTreeProps } from '@recursica/adapter-common';
4
+ export type TreeProps = RecursicaOverStyled<RecursicaTreeProps & Omit<React.ComponentPropsWithoutRef<"ul">, "children">>;
6
5
  /**
7
- * Placeholder component for Tree (Coming Soon).
6
+ * Recursively renders hierarchical `data` as an expandable/selectable tree.
7
+ *
8
+ * **Recursica Abstract:**
9
+ * Wraps Mantine's `Tree` with a fully custom node renderer so every visual aspect (row box
10
+ * model, selected/unselected colors and typography, indent, item spacing) comes from
11
+ * Recursica's `tree` design tokens rather than Mantine's defaults.
8
12
  */
9
- export declare const Tree: React.ForwardRefExoticComponent<RecursicaOverStyled<TreeProps> & React.RefAttributes<HTMLDivElement>>;
13
+ export declare const Tree: React.ForwardRefExoticComponent<TreeProps & React.RefAttributes<HTMLUListElement>>;
@@ -1,4 +1,5 @@
1
1
  export * from './Accordion';
2
+ export * from './AssistiveElement/AssistiveElement';
2
3
  export * from './AutoComplete/AutoComplete';
3
4
  export * from './Avatar';
4
5
  export * from './Badge/Badge';
@@ -172,6 +172,7 @@ export declare const Accordion: typeof rawComponents.Accordion;
172
172
  export declare const AccordionItem: typeof rawComponents.AccordionItem;
173
173
  export declare const AccordionControl: typeof rawComponents.AccordionControl;
174
174
  export declare const AccordionPanel: typeof rawComponents.AccordionPanel;
175
+ export declare const AssistiveElement: typeof rawComponents.AssistiveElement;
175
176
  export declare const AutoComplete: typeof rawComponents.AutoComplete;
176
177
  export declare const Avatar: typeof rawComponents.Avatar;
177
178
  export declare const Badge: typeof rawComponents.Badge;
package/llms.txt CHANGED
@@ -43,6 +43,7 @@ Each component has its own `USAGE.md` documenting its props, adapter-specific be
43
43
  - [Group](src/components/Group/USAGE.md)
44
44
  - [HoverCard](src/components/HoverCard/USAGE.md)
45
45
  - [Label](src/components/Label/USAGE.md)
46
+ - [Layer](src/components/Layer/USAGE.md)
46
47
  - [Link](src/components/Link/USAGE.md)
47
48
  - [Loader](src/components/Loader/USAGE.md)
48
49
  - [Menu](src/components/Menu/USAGE.md)
@@ -53,6 +54,7 @@ Each component has its own `USAGE.md` documenting its props, adapter-specific be
53
54
  - [Popover](src/components/Popover/USAGE.md)
54
55
  - [Radio](src/components/Radio/USAGE.md)
55
56
  - [ReadOnlyField](src/components/ReadOnlyField/USAGE.md)
57
+ - [RecursicaThemeProvider](src/components/RecursicaThemeProvider/USAGE.md)
56
58
  - [SegmentedControl](src/components/SegmentedControl/USAGE.md)
57
59
  - [Slider](src/components/Slider/USAGE.md)
58
60
  - [Stack](src/components/Stack/USAGE.md)
package/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "url": "git+https://github.com/borderux/recursica.git",
14
14
  "directory": "packages/mantine-adapter"
15
15
  },
16
- "version": "0.35.0",
16
+ "version": "0.36.0",
17
17
  "type": "module",
18
18
  "main": "./dist/mantine-adapter.cjs",
19
19
  "module": "./dist/mantine-adapter.js",
@@ -1,3 +1,11 @@
1
+ /* EXEMPTIONS:
2
+ - accordion-header open-appearance background-color/border-color are ignored because Forge does
3
+ not apply a visual swap on expand, even though the token schema defines "open" appearance
4
+ colors distinct from "closed" (see .control below, which intentionally keeps a constant
5
+ background/border across collapsed/expanded). */
6
+ /* recursica-ignore: --recursica_ui-kit_components_accordion-header_variants_appearance_open_properties_colors_background-color */
7
+ /* recursica-ignore: --recursica_ui-kit_components_accordion-header_variants_appearance_open_properties_colors_border-color */
8
+
1
9
  /* ==== ACCORDION CONTAINER ==== */
2
10
  .root {
3
11
  box-sizing: border-box;
@@ -16,7 +24,7 @@
16
24
  --recursica_ui-kit_components_accordion_properties_colors_border-color
17
25
  );
18
26
  background-color: var(
19
- --recursica_ui-kit_components_accordion_properties_colors_background
27
+ --recursica_ui-kit_components_accordion_properties_colors_background-color
20
28
  );
21
29
  box-shadow: var(--recursica_ui-kit_components_accordion_properties_elevation);
22
30
 
@@ -31,7 +39,8 @@
31
39
  /* ==== ACCORDION ITEM ==== */
32
40
  .item {
33
41
  box-sizing: border-box;
34
- margin: 0;
42
+ margin: var(--recursica_ui-kit_components_accordion-item_properties_margin);
43
+ padding: var(--recursica_ui-kit_components_accordion-item_properties_padding);
35
44
  position: relative;
36
45
  transition: all 0.2s ease;
37
46
 
@@ -40,13 +49,13 @@
40
49
 
41
50
  border-style: solid;
42
51
  border-color: var(
43
- --recursica_ui-kit_components_accordion-item_properties_colors_item-border-color
52
+ --recursica_ui-kit_components_accordion-item_properties_colors_border-color
44
53
  );
45
54
  border-width: var(
46
- --recursica_ui-kit_components_accordion-item_properties_item-border-size
55
+ --recursica_ui-kit_components_accordion-item_properties_border-size
47
56
  );
48
57
  border-bottom-color: var(
49
- --recursica_ui-kit_components_accordion_properties_colors_divider
58
+ --recursica_ui-kit_components_accordion_properties_colors_divider-color
50
59
  );
51
60
  border-bottom-width: var(
52
61
  --recursica_ui-kit_components_accordion_properties_divider-size
@@ -55,18 +64,11 @@
55
64
  --recursica_ui-kit_components_accordion-item_properties_border-radius
56
65
  );
57
66
  box-shadow: var(
58
- --recursica_ui-kit_components_accordion-item_properties_elevation-item
59
- );
60
-
61
- background-color: var(
62
- --recursica_ui-kit_components_accordion-item_properties_colors_background-collapsed
63
- );
64
- }
65
- .item[data-active] {
66
- background-color: var(
67
- --recursica_ui-kit_components_accordion-item_properties_colors_background-expanded
67
+ --recursica_ui-kit_components_accordion-item_properties_elevation
68
68
  );
69
69
  }
70
+ /* The collapsed/expanded background now lives on accordion-header (open/closed appearance),
71
+ applied via .control below, rather than on the item wrapper itself. */
70
72
  .noDivider {
71
73
  border-bottom: none !important;
72
74
  border-bottom-width: 0 !important;
@@ -81,56 +83,86 @@
81
83
  justify-content: space-between;
82
84
 
83
85
  /* Re-apply gap defined by UI Kit for icons vs text */
84
- gap: var(--recursica_ui-kit_components_accordion-item_properties_icon-gap);
86
+ gap: var(--recursica_ui-kit_components_accordion-header_properties_icon-gap);
85
87
 
86
88
  /* Strip Mantine's baked padding directly */
87
89
  padding: var(
88
- --recursica_ui-kit_components_accordion-item_properties_header-vertical-padding
90
+ --recursica_ui-kit_components_accordion-header_properties_vertical-padding
89
91
  )
90
92
  var(
91
- --recursica_ui-kit_components_accordion-item_properties_header-horizontal-padding
93
+ --recursica_ui-kit_components_accordion-header_properties_horizontal-padding
92
94
  );
93
- background-color: transparent;
95
+
96
+ /* Background is intentionally constant across collapsed/expanded (Forge doesn't apply a
97
+ background swap on expand, even though the token schema defines an "open" appearance color) */
98
+ background-color: var(
99
+ --recursica_ui-kit_components_accordion-header_variants_appearance_closed_properties_colors_background-color
100
+ );
101
+
102
+ /* Header's own border box, constant across collapsed/expanded (only its closed-state
103
+ border-color is used, matching the background decision above) */
104
+ border-style: solid;
105
+ border-width: var(
106
+ --recursica_ui-kit_components_accordion-header_properties_border-size
107
+ );
108
+ border-radius: var(
109
+ --recursica_ui-kit_components_accordion-header_properties_border-radius
110
+ );
111
+ border-color: var(
112
+ --recursica_ui-kit_components_accordion-header_variants_appearance_closed_properties_colors_border-color
113
+ );
114
+ box-shadow: var(
115
+ --recursica_ui-kit_components_accordion-header_properties_elevation
116
+ );
94
117
 
95
118
  transition: background-color 0.15s ease;
96
119
  position: relative;
97
120
  z-index: 1;
98
121
  color: var(
99
- --recursica_ui-kit_components_accordion-item_properties_colors_text
122
+ --recursica_ui-kit_components_accordion-header_variants_appearance_closed_properties_colors_text-color
100
123
  );
101
124
 
102
125
  /* Header Typography */
103
126
  font-family: var(
104
- --recursica_ui-kit_components_accordion-item_properties_header-text_font-family
127
+ --recursica_ui-kit_components_accordion-header_properties_text_font-family
105
128
  );
106
129
  font-size: var(
107
- --recursica_ui-kit_components_accordion-item_properties_header-text_font-size
130
+ --recursica_ui-kit_components_accordion-header_properties_text_font-size
108
131
  );
109
132
  font-weight: var(
110
- --recursica_ui-kit_components_accordion-item_properties_header-text_font-weight
133
+ --recursica_ui-kit_components_accordion-header_properties_text_font-weight
111
134
  );
112
135
  font-style: var(
113
- --recursica_ui-kit_components_accordion-item_properties_header-text_font-style
136
+ --recursica_ui-kit_components_accordion-header_properties_text_font-style
114
137
  );
115
138
  letter-spacing: var(
116
- --recursica_ui-kit_components_accordion-item_properties_header-text_letter-spacing
139
+ --recursica_ui-kit_components_accordion-header_properties_text_letter-spacing
117
140
  );
118
141
  line-height: var(
119
- --recursica_ui-kit_components_accordion-item_properties_header-text_line-height
142
+ --recursica_ui-kit_components_accordion-header_properties_text_line-height
120
143
  );
121
144
  text-decoration: var(
122
- --recursica_ui-kit_components_accordion-item_properties_header-text_text-decoration
145
+ --recursica_ui-kit_components_accordion-header_properties_text_text-decoration
123
146
  );
124
147
  text-transform: var(
125
- --recursica_ui-kit_components_accordion-item_properties_header-text_text-transform
148
+ --recursica_ui-kit_components_accordion-header_properties_text_text-transform
149
+ );
150
+ }
151
+
152
+ .item[data-active] .control {
153
+ color: var(
154
+ --recursica_ui-kit_components_accordion-header_variants_appearance_open_properties_colors_text-color
126
155
  );
127
156
  }
128
157
 
129
- /* Mantine natively places hover states on the control node.
130
- We explicitly override it with our layer hover tokens via an overlay ::after structure
131
- so we can cleanly utilize the hover-opacity token! */
158
+ /* Mantine natively places hover states on the control node. We explicitly re-apply our own
159
+ constant background (Mantine's native :hover CSS would otherwise show through) and use an
160
+ overlay ::after structure with the generic hover tokens for the actual hover tint; no per-item
161
+ hover-color/hover-opacity tokens exist anymore. */
132
162
  .control:hover {
133
- background-color: transparent;
163
+ background-color: var(
164
+ --recursica_ui-kit_components_accordion-header_variants_appearance_closed_properties_colors_background-color
165
+ );
134
166
  }
135
167
  .control::after {
136
168
  content: "";
@@ -139,37 +171,58 @@
139
171
  border-radius: inherit;
140
172
  z-index: -1;
141
173
  pointer-events: none;
142
- background-color: var(
143
- --recursica_ui-kit_components_accordion-item_properties_hover-color
144
- );
174
+ background-color: var(--recursica_brand_states_hover_color);
145
175
  opacity: 0;
146
176
  transition: opacity 150ms ease;
147
177
  }
148
178
  .control:hover:not(:disabled)::after {
149
- opacity: var(
150
- --recursica_ui-kit_components_accordion-item_properties_hover-opacity
151
- );
179
+ opacity: var(--recursica_brand_states_hover_opacity);
180
+ }
181
+
182
+ /* Recursica focus ring instead of Mantine's default `.mantine-focus-auto:focus-visible` outline
183
+ (same class+pseudo-class specificity, so !important guarantees ours wins regardless of CSS
184
+ import order). */
185
+ .control:focus-visible {
186
+ outline: none !important;
187
+ box-shadow:
188
+ 0 0 0 var(--recursica_brand_states_focus_border-size)
189
+ var(--recursica_brand_states_focus_color),
190
+ 0 0 var(--recursica_brand_states_focus_blur)
191
+ var(--recursica_brand_states_focus_margin)
192
+ var(--recursica_brand_states_focus_color) !important;
152
193
  }
153
194
 
154
195
  /* Label logic inside the Control wrapper */
155
196
  .label {
156
197
  flex: 1;
198
+ min-width: 0; /* HARDCODE: required for text-overflow ellipsis to take effect on a flex child */
157
199
  text-align: left;
158
200
  color: inherit;
159
201
  padding: 0; /* Clear Mantine inner padding */
202
+ overflow: hidden;
203
+ white-space: nowrap;
204
+ text-overflow: ellipsis;
205
+ }
206
+
207
+ /* ==== ICON SLOT (Mantine's leading-icon wrapper) ==== */
208
+ .icon {
209
+ /* HARDCODE: Mantine applies its own margin-inline-start/end around this slot; our own
210
+ icon-gap token (applied as flex `gap` on .control) already provides the spacing. */
211
+ margin-inline-start: 0;
212
+ margin-inline-end: 0;
160
213
  }
161
214
 
162
215
  /* ==== CHEVRON / RIGHT ICON ==== */
163
216
  .chevron {
164
217
  flex-shrink: 0;
165
218
  width: var(
166
- --recursica_ui-kit_components_accordion-item_properties_icon-right-size
219
+ --recursica_ui-kit_components_accordion-header_properties_icon-right-size
167
220
  );
168
221
  height: var(
169
- --recursica_ui-kit_components_accordion-item_properties_icon-right-size
222
+ --recursica_ui-kit_components_accordion-header_properties_icon-right-size
170
223
  );
171
224
  color: var(
172
- --recursica_ui-kit_components_accordion-item_properties_colors_icon
225
+ --recursica_ui-kit_components_accordion-header_variants_appearance_closed_properties_colors_icon-color
173
226
  );
174
227
  margin: 0;
175
228
  transition: transform 200ms ease;
@@ -184,6 +237,9 @@
184
237
  }
185
238
  .item[data-active] .chevron {
186
239
  transform: rotate(180deg);
240
+ color: var(
241
+ --recursica_ui-kit_components_accordion-header_variants_appearance_open_properties_colors_icon-color
242
+ );
187
243
  }
188
244
 
189
245
  /* ==== LEFT ICON / CUSTOM ICONS ==== */
@@ -193,13 +249,18 @@
193
249
  align-items: center;
194
250
  justify-content: center;
195
251
  width: var(
196
- --recursica_ui-kit_components_accordion-item_properties_icon-left-size
252
+ --recursica_ui-kit_components_accordion-header_properties_icon-left-size
197
253
  );
198
254
  height: var(
199
- --recursica_ui-kit_components_accordion-item_properties_icon-left-size
255
+ --recursica_ui-kit_components_accordion-header_properties_icon-left-size
256
+ );
257
+ color: var(
258
+ --recursica_ui-kit_components_accordion-header_variants_appearance_closed_properties_colors_icon-color
200
259
  );
260
+ }
261
+ .item[data-active] .iconLeftWrapper {
201
262
  color: var(
202
- --recursica_ui-kit_components_accordion-item_properties_colors_icon
263
+ --recursica_ui-kit_components_accordion-header_variants_appearance_open_properties_colors_icon-color
203
264
  );
204
265
  }
205
266
  .iconLeftWrapper > * {
@@ -212,24 +273,24 @@
212
273
  .panel {
213
274
  box-sizing: border-box;
214
275
  margin: var(
215
- --recursica_ui-kit_components_accordion-item_properties_content-margin
276
+ --recursica_ui-kit_components_accordion-content_properties_margin
216
277
  );
217
278
  padding: 0; /* Overriding dynamic layout structure */
218
279
  background-color: var(
219
- --recursica_ui-kit_components_accordion-item_properties_colors_content-background
280
+ --recursica_ui-kit_components_accordion-content_properties_colors_background-color
220
281
  );
221
282
  border-style: solid;
222
283
  border-color: var(
223
- --recursica_ui-kit_components_accordion-item_properties_colors_content-border-color
284
+ --recursica_ui-kit_components_accordion-content_properties_colors_border-color
224
285
  );
225
286
  border-width: var(
226
- --recursica_ui-kit_components_accordion-item_properties_content-border-size
287
+ --recursica_ui-kit_components_accordion-content_properties_border-size
227
288
  );
228
289
  border-radius: var(
229
- --recursica_ui-kit_components_accordion-item_properties_content-border-radius
290
+ --recursica_ui-kit_components_accordion-content_properties_border-radius
230
291
  );
231
292
  box-shadow: var(
232
- --recursica_ui-kit_components_accordion-item_properties_elevation-content
293
+ --recursica_ui-kit_components_accordion-content_properties_elevation
233
294
  );
234
295
  }
235
296
 
@@ -238,44 +299,44 @@
238
299
  /* Strip Mantine padding and apply logic directly mapped */
239
300
  padding: 0
240
301
  var(
241
- --recursica_ui-kit_components_accordion-item_properties_content-horizontal-padding
302
+ --recursica_ui-kit_components_accordion-content_properties_horizontal-padding
242
303
  )
243
304
  var(
244
- --recursica_ui-kit_components_accordion-item_properties_content-bottom-padding
305
+ --recursica_ui-kit_components_accordion-content_properties_bottom-padding
245
306
  );
246
307
 
247
308
  /* Apply offset gap explicitly calculated below header */
248
309
  padding-top: var(
249
- --recursica_ui-kit_components_accordion-item_properties_content-top-padding
310
+ --recursica_ui-kit_components_accordion-content_properties_top-padding
250
311
  );
251
312
 
252
313
  color: var(
253
- --recursica_ui-kit_components_accordion-item_properties_colors_content-text
314
+ --recursica_ui-kit_components_accordion-content_properties_colors_text-color
254
315
  );
255
316
 
256
317
  /* Content Typography */
257
318
  font-family: var(
258
- --recursica_ui-kit_components_accordion-item_properties_content-text_font-family
319
+ --recursica_ui-kit_components_accordion-content_properties_text_font-family
259
320
  );
260
321
  font-size: var(
261
- --recursica_ui-kit_components_accordion-item_properties_content-text_font-size
322
+ --recursica_ui-kit_components_accordion-content_properties_text_font-size
262
323
  );
263
324
  font-weight: var(
264
- --recursica_ui-kit_components_accordion-item_properties_content-text_font-weight
325
+ --recursica_ui-kit_components_accordion-content_properties_text_font-weight
265
326
  );
266
327
  font-style: var(
267
- --recursica_ui-kit_components_accordion-item_properties_content-text_font-style
328
+ --recursica_ui-kit_components_accordion-content_properties_text_font-style
268
329
  );
269
330
  letter-spacing: var(
270
- --recursica_ui-kit_components_accordion-item_properties_content-text_letter-spacing
331
+ --recursica_ui-kit_components_accordion-content_properties_text_letter-spacing
271
332
  );
272
333
  line-height: var(
273
- --recursica_ui-kit_components_accordion-item_properties_content-text_line-height
334
+ --recursica_ui-kit_components_accordion-content_properties_text_line-height
274
335
  );
275
336
  text-decoration: var(
276
- --recursica_ui-kit_components_accordion-item_properties_content-text_text-decoration
337
+ --recursica_ui-kit_components_accordion-content_properties_text_text-decoration
277
338
  );
278
339
  text-transform: var(
279
- --recursica_ui-kit_components_accordion-item_properties_content-text_text-transform
340
+ --recursica_ui-kit_components_accordion-content_properties_text_text-transform
280
341
  );
281
342
  }
@@ -65,31 +65,29 @@ export default meta;
65
65
  export const Default: StoryObj<typeof Accordion> = {
66
66
  render: () => {
67
67
  return (
68
- <Layer layer={0} style={{ padding: "24px" }}>
69
- <Accordion defaultValue="item-1" chevron={<ChevronIcon />}>
70
- <Accordion.Item value="item-1">
71
- <Accordion.Control>Billing and Membership</Accordion.Control>
72
- <Accordion.Panel>
73
- You can manage your billing directly from the dashboard tab. All
74
- payments are processed automatically.
75
- </Accordion.Panel>
76
- </Accordion.Item>
68
+ <Accordion defaultValue="item-1" chevron={<ChevronIcon />}>
69
+ <Accordion.Item value="item-1">
70
+ <Accordion.Control>Billing and Membership</Accordion.Control>
71
+ <Accordion.Panel>
72
+ You can manage your billing directly from the dashboard tab. All
73
+ payments are processed automatically.
74
+ </Accordion.Panel>
75
+ </Accordion.Item>
77
76
 
78
- <Accordion.Item value="item-2">
79
- <Accordion.Control>Refund Policy</Accordion.Control>
80
- <Accordion.Panel>
81
- We offer a 30-day money-back guarantee for all new subscriptions.
82
- </Accordion.Panel>
83
- </Accordion.Item>
77
+ <Accordion.Item value="item-2">
78
+ <Accordion.Control>Refund Policy</Accordion.Control>
79
+ <Accordion.Panel>
80
+ We offer a 30-day money-back guarantee for all new subscriptions.
81
+ </Accordion.Panel>
82
+ </Accordion.Item>
84
83
 
85
- <Accordion.Item value="item-3">
86
- <Accordion.Control>Technical Support</Accordion.Control>
87
- <Accordion.Panel>
88
- Our support team is available 24/7 via live chat or email.
89
- </Accordion.Panel>
90
- </Accordion.Item>
91
- </Accordion>
92
- </Layer>
84
+ <Accordion.Item value="item-3">
85
+ <Accordion.Control>Technical Support</Accordion.Control>
86
+ <Accordion.Panel>
87
+ Our support team is available 24/7 via live chat or email.
88
+ </Accordion.Panel>
89
+ </Accordion.Item>
90
+ </Accordion>
93
91
  );
94
92
  },
95
93
  };
@@ -97,32 +95,66 @@ export const Default: StoryObj<typeof Accordion> = {
97
95
  export const WithIcons: StoryObj<typeof Accordion> = {
98
96
  render: () => {
99
97
  return (
100
- <Layer layer={0} style={{ padding: "24px" }}>
101
- <Accordion defaultValue="security" chevron={<ChevronIcon />}>
102
- <Accordion.Item value="security">
98
+ <Accordion defaultValue="security" chevron={<ChevronIcon />}>
99
+ <Accordion.Item value="security">
100
+ <Accordion.Control leftIcon={<SVGIcon />}>
101
+ Security Settings
102
+ </Accordion.Control>
103
+ <Accordion.Panel>
104
+ Enable two-factor authentication (2FA) and monitor active sessions
105
+ below.
106
+ </Accordion.Panel>
107
+ </Accordion.Item>
108
+
109
+ <Accordion.Item value="privacy">
110
+ <Accordion.Control leftIcon={<SVGIcon />}>
111
+ Privacy Configuration
112
+ </Accordion.Control>
113
+ <Accordion.Panel>
114
+ Choose what data is shared with our analytics partners.
115
+ </Accordion.Panel>
116
+ </Accordion.Item>
117
+ </Accordion>
118
+ );
119
+ },
120
+ };
121
+
122
+ export const LongTitleTruncation: StoryObj<typeof Accordion> = {
123
+ render: () => {
124
+ return (
125
+ // `style` is stripped from Accordion itself (only passes through with overStyled);
126
+ // constrain width on a plain wrapper div instead to force truncation.
127
+ <div style={{ maxWidth: 320 }}>
128
+ <Accordion defaultValue="long-title" chevron={<ChevronIcon />}>
129
+ <Accordion.Item value="long-title">
103
130
  <Accordion.Control leftIcon={<SVGIcon />}>
104
- Security Settings
131
+ This is a deliberately very long accordion item title used to
132
+ verify that overflowing text truncates with a CSS ellipsis instead
133
+ of wrapping or overflowing the header
105
134
  </Accordion.Control>
106
135
  <Accordion.Panel>
107
- Enable two-factor authentication (2FA) and monitor active sessions
108
- below.
136
+ The header label above should truncate to a single line with a
137
+ trailing ellipsis (…) rather than wrapping onto multiple lines or
138
+ pushing the chevron out of view.
109
139
  </Accordion.Panel>
110
140
  </Accordion.Item>
111
141
 
112
- <Accordion.Item value="privacy">
142
+ <Accordion.Item value="short-title">
113
143
  <Accordion.Control leftIcon={<SVGIcon />}>
114
- Privacy Configuration
144
+ Short Title
115
145
  </Accordion.Control>
116
146
  <Accordion.Panel>
117
- Choose what data is shared with our analytics partners.
147
+ A short title in the same accordion for visual comparison.
118
148
  </Accordion.Panel>
119
149
  </Accordion.Item>
120
150
  </Accordion>
121
- </Layer>
151
+ </div>
122
152
  );
123
153
  },
124
154
  };
125
155
 
156
+ /** Demonstrates the component nested inside a non-default layer — the one case where an
157
+ * explicit `<Layer>` wrap belongs in a story (see COMPONENT_STORYBOOK_GUIDE.md §9). */
126
158
  export const LayerOne: StoryObj<typeof Accordion> = {
127
159
  render: () => {
128
160
  return (
@@ -41,6 +41,7 @@ const AccordionBase = function Accordion({
41
41
  control: styles.control,
42
42
  label: styles.label,
43
43
  chevron: styles.chevron,
44
+ icon: styles.icon,
44
45
  panel: styles.panel,
45
46
  content: styles.content,
46
47
  };