@recursica/mui-adapter 0.3.0 → 0.5.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 (93) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/mui-adapter.cjs +1 -1
  3. package/dist/mui-adapter.cjs.map +1 -1
  4. package/dist/mui-adapter.css +1 -1
  5. package/dist/mui-adapter.js +216 -178
  6. package/dist/mui-adapter.js.map +1 -1
  7. package/dist/src/components/Autocomplete/Autocomplete.d.ts +3 -0
  8. package/dist/src/components/Autocomplete/index.d.ts +1 -0
  9. package/dist/src/components/Button/Button.d.ts +9 -2
  10. package/dist/src/components/Loader/Loader.d.ts +9 -2
  11. package/dist/src/components/index.d.ts +1 -0
  12. package/package.json +5 -2
  13. package/src/GlobalExemptions.modules.css +13 -0
  14. package/src/components/Accordion/Accordion.module.css +56 -0
  15. package/src/components/Accordion/Accordion.tsx +1 -0
  16. package/src/components/AssistiveElement/AssistiveElement.module.css +20 -0
  17. package/src/components/AssistiveElement/AssistiveElement.tsx +1 -0
  18. package/src/components/Autocomplete/Autocomplete.module.css +47 -0
  19. package/src/components/Autocomplete/Autocomplete.stories.tsx +35 -0
  20. package/src/components/Autocomplete/Autocomplete.tsx +8 -0
  21. package/src/components/Autocomplete/index.ts +1 -0
  22. package/src/components/Avatar/Avatar.module.css +74 -0
  23. package/src/components/Avatar/Avatar.tsx +1 -0
  24. package/src/components/Badge/Badge.module.css +29 -0
  25. package/src/components/Badge/Badge.tsx +1 -0
  26. package/src/components/Breadcrumb/Breadcrumb.module.css +6 -0
  27. package/src/components/Breadcrumb/Breadcrumb.tsx +1 -0
  28. package/src/components/Button/BUTTON_IMPLEMENTATION_NOTES.md +16 -0
  29. package/src/components/Button/Button.module.css +154 -18
  30. package/src/components/Button/Button.stories.tsx +48 -0
  31. package/src/components/Button/Button.tsx +35 -3
  32. package/src/components/Card/Card.module.css +38 -0
  33. package/src/components/Card/Card.tsx +1 -0
  34. package/src/components/Checkbox/Checkbox.module.css +39 -0
  35. package/src/components/Checkbox/Checkbox.tsx +1 -0
  36. package/src/components/Chip/Chip.module.css +51 -0
  37. package/src/components/Chip/Chip.tsx +1 -0
  38. package/src/components/DatePicker/DatePicker.module.css +42 -0
  39. package/src/components/DatePicker/DatePicker.tsx +1 -0
  40. package/src/components/Dropdown/Dropdown.module.css +46 -0
  41. package/src/components/Dropdown/Dropdown.tsx +1 -0
  42. package/src/components/FileInput/FileInput.module.css +47 -0
  43. package/src/components/FileInput/FileInput.tsx +1 -0
  44. package/src/components/FileUpload/FileUpload.module.css +40 -0
  45. package/src/components/FileUpload/FileUpload.tsx +1 -0
  46. package/src/components/HoverCard/HoverCard.module.css +23 -0
  47. package/src/components/HoverCard/HoverCard.tsx +1 -0
  48. package/src/components/Label/Label.module.css +35 -0
  49. package/src/components/Label/Label.tsx +1 -0
  50. package/src/components/Link/Link.module.css +8 -0
  51. package/src/components/Loader/LOADER_IMPLEMENTATION_NOTES.md +25 -0
  52. package/src/components/Loader/Loader.module.css +166 -0
  53. package/src/components/Loader/Loader.stories.tsx +90 -22
  54. package/src/components/Loader/Loader.tsx +69 -5
  55. package/src/components/Menu/Menu.module.css +53 -0
  56. package/src/components/Menu/Menu.tsx +1 -0
  57. package/src/components/Modal/Modal.module.css +36 -0
  58. package/src/components/Modal/Modal.tsx +1 -0
  59. package/src/components/NumberInput/NumberInput.module.css +47 -0
  60. package/src/components/NumberInput/NumberInput.tsx +1 -0
  61. package/src/components/Pagination/Pagination.module.css +81 -0
  62. package/src/components/Pagination/Pagination.tsx +1 -0
  63. package/src/components/Panel/Panel.module.css +38 -0
  64. package/src/components/Panel/Panel.tsx +1 -0
  65. package/src/components/Radio/Radio.module.css +37 -0
  66. package/src/components/Radio/Radio.tsx +1 -0
  67. package/src/components/ReadOnlyField/ReadOnlyField.module.css +16 -0
  68. package/src/components/ReadOnlyField/ReadOnlyField.tsx +1 -0
  69. package/src/components/SegmentedControl/SegmentedControl.module.css +47 -0
  70. package/src/components/SegmentedControl/SegmentedControl.tsx +1 -0
  71. package/src/components/Slider/Slider.module.css +86 -0
  72. package/src/components/Slider/Slider.tsx +1 -0
  73. package/src/components/Stepper/Stepper.module.css +71 -0
  74. package/src/components/Stepper/Stepper.tsx +1 -0
  75. package/src/components/Switch/Switch.module.css +39 -0
  76. package/src/components/Switch/Switch.tsx +1 -0
  77. package/src/components/Tabs/Tabs.module.css +79 -0
  78. package/src/components/Tabs/Tabs.tsx +1 -0
  79. package/src/components/TextArea/TextArea.module.css +37 -0
  80. package/src/components/TextArea/TextArea.tsx +1 -0
  81. package/src/components/TextField/TextField.module.css +47 -0
  82. package/src/components/TextField/TextField.tsx +1 -0
  83. package/src/components/TimePicker/TimePicker.module.css +41 -0
  84. package/src/components/TimePicker/TimePicker.tsx +1 -0
  85. package/src/components/Timeline/Timeline.module.css +78 -0
  86. package/src/components/Timeline/Timeline.tsx +1 -0
  87. package/src/components/Toast/Toast.module.css +32 -0
  88. package/src/components/Toast/Toast.tsx +1 -0
  89. package/src/components/Tooltip/Tooltip.module.css +25 -0
  90. package/src/components/Tooltip/Tooltip.tsx +1 -0
  91. package/src/components/TransferList/TransferList.module.css +38 -0
  92. package/src/components/TransferList/TransferList.tsx +1 -0
  93. package/src/components/index.ts +1 -0
@@ -0,0 +1,74 @@
1
+ /* EXEMPTIONS:
2
+ This component is a placeholder stub. Once fully implemented, its specific
3
+ tokens will be fully wired up to direct styles. */
4
+
5
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_properties_elevation */
6
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_default_properties_border-size */
7
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_default_properties_height */
8
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_default_properties_icon-size */
9
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_font-family */
10
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_font-size */
11
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_font-style */
12
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_font-weight */
13
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_letter-spacing */
14
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_line-height */
15
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_text-decoration */
16
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_text-transform */
17
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_default_properties_width */
18
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_large_properties_border-size */
19
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_large_properties_height */
20
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_large_properties_icon-size */
21
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_font-family */
22
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_font-size */
23
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_font-style */
24
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_font-weight */
25
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_letter-spacing */
26
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_line-height */
27
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_text-decoration */
28
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_text-transform */
29
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_large_properties_width */
30
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_small_properties_border-size */
31
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_small_properties_height */
32
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_small_properties_icon-size */
33
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_font-family */
34
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_font-size */
35
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_font-style */
36
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_font-weight */
37
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_letter-spacing */
38
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_line-height */
39
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_text-decoration */
40
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_text-transform */
41
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_sizes_small_properties_width */
42
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_properties_border-radius */
43
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_properties_padding */
44
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_ghost_properties_border-size */
45
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_ghost_properties_colors_background */
46
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_ghost_properties_colors_border-color */
47
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_ghost_properties_colors_icon-color */
48
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_outline_properties_border-size */
49
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_outline_properties_colors_background */
50
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_outline_properties_colors_border-color */
51
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_outline_properties_colors_icon-color */
52
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_solid_properties_border-size */
53
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_solid_properties_colors_background */
54
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_solid_properties_colors_border-color */
55
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_solid_properties_colors_icon-color */
56
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_image_properties_border-radius */
57
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_image_properties_border-size */
58
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_image_properties_colors_background */
59
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_image_properties_colors_border-color */
60
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_image_properties_padding */
61
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_properties_border-radius */
62
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_properties_padding */
63
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_ghost_properties_border-size */
64
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_ghost_properties_colors_background */
65
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_ghost_properties_colors_border-color */
66
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_ghost_properties_colors_text-color */
67
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_outline_properties_border-size */
68
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_outline_properties_colors_background */
69
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_outline_properties_colors_border-color */
70
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_outline_properties_colors_text-color */
71
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_solid_properties_border-size */
72
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_solid_properties_colors_background */
73
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_solid_properties_colors_border-color */
74
+ /* recursica-ignore: --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_solid_properties_colors_text-color */
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import "./Avatar.module.css";
2
3
 
3
4
  export type AvatarProps = React.HTMLAttributes<HTMLDivElement>;
4
5
 
@@ -0,0 +1,29 @@
1
+ /* EXEMPTIONS:
2
+ This component is a placeholder stub. Once fully implemented, its specific
3
+ tokens will be fully wired up to direct styles. */
4
+
5
+ /* recursica-ignore: --recursica_ui-kit_components_badge_properties_border-radius */
6
+ /* recursica-ignore: --recursica_ui-kit_components_badge_properties_border-size */
7
+ /* recursica-ignore: --recursica_ui-kit_components_badge_properties_elevation */
8
+ /* recursica-ignore: --recursica_ui-kit_components_badge_properties_padding-horizontal */
9
+ /* recursica-ignore: --recursica_ui-kit_components_badge_properties_padding-vertical */
10
+ /* recursica-ignore: --recursica_ui-kit_components_badge_properties_text_font-family */
11
+ /* recursica-ignore: --recursica_ui-kit_components_badge_properties_text_font-size */
12
+ /* recursica-ignore: --recursica_ui-kit_components_badge_properties_text_font-style */
13
+ /* recursica-ignore: --recursica_ui-kit_components_badge_properties_text_font-weight */
14
+ /* recursica-ignore: --recursica_ui-kit_components_badge_properties_text_letter-spacing */
15
+ /* recursica-ignore: --recursica_ui-kit_components_badge_properties_text_line-height */
16
+ /* recursica-ignore: --recursica_ui-kit_components_badge_properties_text_text-decoration */
17
+ /* recursica-ignore: --recursica_ui-kit_components_badge_properties_text_text-transform */
18
+ /* recursica-ignore: --recursica_ui-kit_components_badge_variants_styles_alert_properties_colors_background */
19
+ /* recursica-ignore: --recursica_ui-kit_components_badge_variants_styles_alert_properties_colors_border-color */
20
+ /* recursica-ignore: --recursica_ui-kit_components_badge_variants_styles_alert_properties_colors_text */
21
+ /* recursica-ignore: --recursica_ui-kit_components_badge_variants_styles_primary-color_properties_colors_background */
22
+ /* recursica-ignore: --recursica_ui-kit_components_badge_variants_styles_primary-color_properties_colors_border-color */
23
+ /* recursica-ignore: --recursica_ui-kit_components_badge_variants_styles_primary-color_properties_colors_text */
24
+ /* recursica-ignore: --recursica_ui-kit_components_badge_variants_styles_success_properties_colors_background */
25
+ /* recursica-ignore: --recursica_ui-kit_components_badge_variants_styles_success_properties_colors_border-color */
26
+ /* recursica-ignore: --recursica_ui-kit_components_badge_variants_styles_success_properties_colors_text */
27
+ /* recursica-ignore: --recursica_ui-kit_components_badge_variants_styles_warning_properties_colors_background */
28
+ /* recursica-ignore: --recursica_ui-kit_components_badge_variants_styles_warning_properties_colors_border-color */
29
+ /* recursica-ignore: --recursica_ui-kit_components_badge_variants_styles_warning_properties_colors_text */
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import "./Badge.module.css";
2
3
 
3
4
  export type BadgeProps = React.HTMLAttributes<HTMLDivElement>;
4
5
 
@@ -0,0 +1,6 @@
1
+ /* EXEMPTIONS:
2
+ This component is a placeholder stub. Once fully implemented, its specific
3
+ tokens will be fully wired up to direct styles. */
4
+
5
+ /* recursica-ignore: --recursica_ui-kit_components_breadcrumb_properties_item-gap */
6
+ /* recursica-ignore: --recursica_ui-kit_components_breadcrumb_properties_padding */
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import "./Breadcrumb.module.css";
2
3
 
3
4
  export type BreadcrumbProps = React.HTMLAttributes<HTMLDivElement>;
4
5
 
@@ -15,3 +15,19 @@ We explicitly pass `disableRipple` and `disableElevation` to block MUI's dynamic
15
15
  **Accessibility:**
16
16
 
17
17
  - We inject a development-time warning explicitly requiring `aria-label` when the component detects an icon-only configuration.
18
+
19
+ ---
20
+
21
+ ## Loader color contrast
22
+
23
+ **Decision:** When a Button is in a loading state, the `Recursica Loader` component is injected via the `loadingIndicator` prop. The `Loader` component strictly defines its own colors and styles per variant, meaning it does not automatically inherit the text color (`currentColor`) from the Button.
24
+
25
+ **Constraint:** This can lead to contrast issues (e.g., a blue dots loader inside a solid blue button). Design has explicitly decided not to address this at the moment. As such, developers using the `loading` prop must be aware that the loader's color is fixed by its internal tokens, not by the button's context.
26
+
27
+ ---
28
+
29
+ ## Loading state enforces disabled state
30
+
31
+ **Decision:** When `loading={true}` is passed to the Button, the component explicitly forces `disabled={true}` natively on the underlying element.
32
+
33
+ **Implementation:** This ensures that loading buttons automatically inherit the brand theme disabled opacities (via the `:disabled` CSS pseudo-class) rather than relying solely on MUI's internal loading opacity adjustments.
@@ -44,7 +44,7 @@
44
44
  }
45
45
 
46
46
  /* Internal layout logic for Truncation */
47
- .root > * {
47
+ .root > *:not(:global(.MuiButton-loadingIndicator)) {
48
48
  min-width: 0;
49
49
  position: relative;
50
50
  z-index: 1;
@@ -66,42 +66,101 @@
66
66
  font-size: inherit;
67
67
  line-height: inherit;
68
68
  }
69
+ .root[data-loading="true"] .labelText {
70
+ visibility: hidden;
71
+ }
72
+
73
+ /*
74
+ * Keep the loader fully opaque, but make the background transparent
75
+ * to create contrast for solid variants without changing the loader color.
76
+ */
77
+ .root[data-loading="true"] {
78
+ opacity: 1 !important;
79
+ }
80
+
81
+ .root[data-size="default"][data-variant="solid"][data-loading="true"] {
82
+ background-color: color-mix(
83
+ in srgb,
84
+ var(
85
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_colors_background
86
+ )
87
+ calc(
88
+ var(
89
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_disabled-opacity
90
+ ) *
91
+ 100%
92
+ ),
93
+ transparent
94
+ ) !important;
95
+ }
96
+
97
+ .root[data-size="small"][data-variant="solid"][data-loading="true"] {
98
+ background-color: color-mix(
99
+ in srgb,
100
+ var(
101
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_colors_background
102
+ )
103
+ calc(
104
+ var(
105
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_disabled-opacity
106
+ ) *
107
+ 100%
108
+ ),
109
+ transparent
110
+ ) !important;
111
+ }
69
112
 
70
113
  /* ==== SIZES ==== */
71
114
  .root[data-size="default"] {
72
- border-radius: var(
73
- --recursica_ui-kit_components_button_variants_sizes_default_properties_border-radius
74
- );
75
115
  height: var(
76
116
  --recursica_ui-kit_components_button_variants_sizes_default_properties_height
77
117
  );
118
+ }
119
+ .root[data-size="default"][data-content="label"] {
120
+ border-radius: var(
121
+ --recursica_ui-kit_components_button_variants_content_label_variants_sizes_default_properties_border-radius
122
+ );
78
123
  min-width: var(
79
- --recursica_ui-kit_components_button_variants_sizes_default_properties_min-width
124
+ --recursica_ui-kit_components_button_variants_content_label_variants_sizes_default_properties_min-width
80
125
  );
81
126
  padding: 0
82
127
  var(
83
- --recursica_ui-kit_components_button_variants_sizes_default_properties_horizontal-padding
128
+ --recursica_ui-kit_components_button_variants_content_label_variants_sizes_default_properties_horizontal-padding
84
129
  );
85
130
  }
86
- .root[data-size="default"] .labelText {
87
- max-width: var(
88
- --recursica_ui-kit_components_button_variants_sizes_default_properties_max-label-width
131
+ .root[data-size="default"][data-content="icon-label"] {
132
+ border-radius: var(
133
+ --recursica_ui-kit_components_button_variants_content_icon-label_variants_sizes_default_properties_border-radius
134
+ );
135
+ min-width: var(
136
+ --recursica_ui-kit_components_button_variants_content_icon-label_variants_sizes_default_properties_min-width
89
137
  );
138
+ padding: 0
139
+ var(
140
+ --recursica_ui-kit_components_button_variants_content_icon-label_variants_sizes_default_properties_horizontal-padding
141
+ );
90
142
  }
91
- .root[data-size="small"] {
143
+ .root[data-size="default"][data-content="icon-only"] {
92
144
  border-radius: var(
93
- --recursica_ui-kit_components_button_variants_sizes_small_properties_border-radius
94
- );
95
- height: var(
96
- --recursica_ui-kit_components_button_variants_sizes_small_properties_height
145
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_default_properties_border-radius
97
146
  );
98
147
  min-width: var(
99
- --recursica_ui-kit_components_button_variants_sizes_small_properties_min-width
148
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_default_properties_min-width
100
149
  );
101
150
  padding: 0
102
151
  var(
103
- --recursica_ui-kit_components_button_variants_sizes_small_properties_horizontal-padding
152
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_default_properties_horizontal-padding
104
153
  );
154
+ }
155
+ .root[data-size="default"] .labelText {
156
+ max-width: var(
157
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_max-label-width
158
+ );
159
+ }
160
+ .root[data-size="small"] {
161
+ height: var(
162
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_height
163
+ );
105
164
 
106
165
  /* Override specific typography for small */
107
166
  font-family: var(
@@ -123,6 +182,42 @@
123
182
  )
124
183
  );
125
184
  }
185
+ .root[data-size="small"][data-content="label"] {
186
+ border-radius: var(
187
+ --recursica_ui-kit_components_button_variants_content_label_variants_sizes_small_properties_border-radius
188
+ );
189
+ min-width: var(
190
+ --recursica_ui-kit_components_button_variants_content_label_variants_sizes_small_properties_min-width
191
+ );
192
+ padding: 0
193
+ var(
194
+ --recursica_ui-kit_components_button_variants_content_label_variants_sizes_small_properties_horizontal-padding
195
+ );
196
+ }
197
+ .root[data-size="small"][data-content="icon-label"] {
198
+ border-radius: var(
199
+ --recursica_ui-kit_components_button_variants_content_icon-label_variants_sizes_small_properties_border-radius
200
+ );
201
+ min-width: var(
202
+ --recursica_ui-kit_components_button_variants_content_icon-label_variants_sizes_small_properties_min-width
203
+ );
204
+ padding: 0
205
+ var(
206
+ --recursica_ui-kit_components_button_variants_content_icon-label_variants_sizes_small_properties_horizontal-padding
207
+ );
208
+ }
209
+ .root[data-size="small"][data-content="icon-only"] {
210
+ border-radius: var(
211
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_small_properties_border-radius
212
+ );
213
+ min-width: var(
214
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_small_properties_min-width
215
+ );
216
+ padding: 0
217
+ var(
218
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_small_properties_horizontal-padding
219
+ );
220
+ }
126
221
  .root[data-size="small"] .labelText {
127
222
  max-width: var(
128
223
  --recursica_ui-kit_components_button_variants_sizes_small_properties_max-label-width
@@ -175,8 +270,11 @@
175
270
  }
176
271
 
177
272
  /* Icon-only logic overrides */
178
- .root[data-icon-only] .MuiButton-startIcon,
179
- .root[data-icon-only] .MuiButton-endIcon {
273
+ .root[data-content="icon-only"] .labelText {
274
+ display: none;
275
+ }
276
+ .root[data-content="icon-only"] .MuiButton-startIcon,
277
+ .root[data-content="icon-only"] .MuiButton-endIcon {
180
278
  margin-right: 0;
181
279
  margin-left: 0;
182
280
  }
@@ -245,10 +343,18 @@
245
343
  --recursica_ui-kit_components_button_variants_styles_solid_properties_colors_text
246
344
  );
247
345
  }
346
+ .root[data-variant="solid"] .iconWrapper {
347
+ color: var(
348
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_colors_icon-color
349
+ );
350
+ }
248
351
  .root[data-variant="solid"]:hover:not(:disabled):not(:global(.Mui-disabled)) {
249
352
  color: var(
250
353
  --recursica_ui-kit_components_button_variants_styles_solid_properties_colors_text-hover
251
354
  );
355
+ box-shadow: var(
356
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_hover-elevation
357
+ );
252
358
  }
253
359
 
254
360
  /* OUTLINE */
@@ -269,10 +375,18 @@
269
375
  --recursica_ui-kit_components_button_variants_styles_outline_properties_colors_text
270
376
  );
271
377
  }
378
+ .root[data-variant="outline"] .iconWrapper {
379
+ color: var(
380
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_colors_icon-color
381
+ );
382
+ }
272
383
  .root[data-variant="outline"]:hover:not(:disabled):not(:global(.Mui-disabled)) {
273
384
  color: var(
274
385
  --recursica_ui-kit_components_button_variants_styles_outline_properties_colors_text-hover
275
386
  );
387
+ box-shadow: var(
388
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_hover-elevation
389
+ );
276
390
  }
277
391
 
278
392
  /* TEXT */
@@ -293,8 +407,30 @@
293
407
  --recursica_ui-kit_components_button_variants_styles_text_properties_colors_text
294
408
  );
295
409
  }
410
+ .root[data-variant="text"] .iconWrapper {
411
+ color: var(
412
+ --recursica_ui-kit_components_button_variants_styles_text_properties_colors_icon-color
413
+ );
414
+ }
296
415
  .root[data-variant="text"]:hover:not(:disabled):not(:global(.Mui-disabled)) {
297
416
  color: var(
298
417
  --recursica_ui-kit_components_button_variants_styles_text_properties_colors_text-hover
299
418
  );
419
+ box-shadow: var(
420
+ --recursica_ui-kit_components_button_variants_styles_text_properties_hover-elevation
421
+ );
300
422
  }
423
+
424
+ /* EXEMPTIONS:
425
+ These general button properties are redundant because visual mapping has been refactored
426
+ to content-specific variables (_content_label_sizes_... etc.) or are handled by design defaults. */
427
+ /* recursica-ignore: --recursica_ui-kit_components_button_variants_sizes_default_properties_horizontal-padding */
428
+ /* recursica-ignore: --recursica_ui-kit_components_button_variants_sizes_default_properties_min-width */
429
+ /* recursica-ignore: --recursica_ui-kit_components_button_variants_sizes_small_properties_horizontal-padding */
430
+ /* recursica-ignore: --recursica_ui-kit_components_button_variants_sizes_small_properties_hover-opacity */
431
+ /* recursica-ignore: --recursica_ui-kit_components_button_variants_sizes_small_properties_min-width */
432
+ /* recursica-ignore: --recursica_ui-kit_components_button_variants_sizes_small_properties_text_font-style */
433
+ /* recursica-ignore: --recursica_ui-kit_components_button_variants_sizes_small_properties_text_letter-spacing */
434
+ /* recursica-ignore: --recursica_ui-kit_components_button_variants_sizes_small_properties_text_line-height */
435
+ /* recursica-ignore: --recursica_ui-kit_components_button_variants_sizes_small_properties_text_text-decoration */
436
+ /* recursica-ignore: --recursica_ui-kit_components_button_variants_sizes_small_properties_text_text-transform */
@@ -10,6 +10,9 @@ const meta: Meta<ButtonStoryProps> = {
10
10
  component: Button,
11
11
  tags: ["autodocs"],
12
12
  argTypes: {
13
+ disabled: {
14
+ control: "boolean",
15
+ },
13
16
  variant: {
14
17
  control: "select",
15
18
  options: ["solid", "outline", "text"],
@@ -20,6 +23,30 @@ const meta: Meta<ButtonStoryProps> = {
20
23
  options: ["default", "small"],
21
24
  description: "The size of the button",
22
25
  },
26
+ loading: {
27
+ control: "boolean",
28
+ description: "Sets the button to a loading state",
29
+ },
30
+ useRecursicaLoader: {
31
+ control: "boolean",
32
+ description:
33
+ "Use the Recursica Loader component instead of the default Mantine loader",
34
+ },
35
+ loaderVariant: {
36
+ control: "select",
37
+ options: ["oval", "bars", "dots"],
38
+ description: "The visual variant of the Recursica Loader",
39
+ },
40
+ loaderSize: {
41
+ control: "select",
42
+ options: [undefined, "sm", "md", "lg", "small", "default", "large"],
43
+ description: "The size variant for the loader",
44
+ },
45
+ },
46
+ args: {
47
+ useRecursicaLoader: true,
48
+ loaderVariant: "oval",
49
+ loaderSize: undefined,
23
50
  },
24
51
  parameters: {
25
52
  controls: {
@@ -37,6 +64,10 @@ const meta: Meta<ButtonStoryProps> = {
37
64
  "onChange",
38
65
  "value",
39
66
  "checked",
67
+ "loading",
68
+ "useRecursicaLoader",
69
+ "loaderVariant",
70
+ "loaderSize",
40
71
  ],
41
72
  },
42
73
  },
@@ -145,3 +176,20 @@ export const TruncatedLabel: Story = {
145
176
  </div>
146
177
  ),
147
178
  };
179
+
180
+ export const Loading: Story = {
181
+ args: {
182
+ children: "Saving Changes",
183
+ variant: "solid",
184
+ size: "default",
185
+ loading: true,
186
+ },
187
+ parameters: {
188
+ docs: {
189
+ description: {
190
+ story:
191
+ "When `loading={true}` is applied, the Button injects the Recursica `<Loader />` component. Per Recursica design rules, placing a Button in a loading state automatically forces the `disabled={true}` state on the underlying element. This ensures the button immediately receives the brand theme disabled opacities without relying solely on semantic logic.",
192
+ },
193
+ },
194
+ },
195
+ };
@@ -1,4 +1,6 @@
1
1
  import React, { forwardRef } from "react";
2
+ import { Loader } from "../Loader/Loader";
3
+ import type { RecursicaLoaderProps } from "../Loader/Loader";
2
4
  import {
3
5
  Button as MuiButton,
4
6
  type ButtonProps as MuiButtonProps,
@@ -17,6 +19,12 @@ export interface RecursicaButtonProps {
17
19
  * For polymorphic support (e.g., `component="a"`), native to MUI.
18
20
  */
19
21
  component?: React.ElementType;
22
+ /** Which Recursica Loader variant to use */
23
+ loaderVariant?: RecursicaLoaderProps["variant"];
24
+ /** The size variant for the loader */
25
+ loaderSize?: RecursicaLoaderProps["size"];
26
+ /** Whether to use the Recursica loader or fallback to the Mantine loader */
27
+ useRecursicaLoader?: boolean;
20
28
  }
21
29
 
22
30
  export type ButtonProps = RecursicaOverStyled<
@@ -54,6 +62,9 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
54
62
  icon,
55
63
  children,
56
64
  overStyled = false,
65
+ loaderVariant = "oval",
66
+ loaderSize,
67
+ useRecursicaLoader = true,
57
68
  ...rest
58
69
  },
59
70
  ref,
@@ -67,8 +78,15 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
67
78
 
68
79
  const hasStartIcon = !!icon || !!restRecord["startIcon"];
69
80
  const hasEndIcon = !!restRecord["endIcon"];
70
- const isIconOnly =
71
- (hasStartIcon || hasEndIcon) && !hasVisibleChildren(children);
81
+ const hasVisibleText = hasVisibleChildren(children);
82
+ const isIconOnly = (hasStartIcon || hasEndIcon) && !hasVisibleText;
83
+
84
+ let contentType = "label";
85
+ if (isIconOnly) {
86
+ contentType = "icon-only";
87
+ } else if (hasStartIcon || hasEndIcon) {
88
+ contentType = "icon-label";
89
+ }
72
90
 
73
91
  if (
74
92
  typeof process !== "undefined" &&
@@ -91,12 +109,24 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
91
109
  // However, Mui Button requires some string, but we can just leave it as standard or ignore since
92
110
  // our CSS resets its properties anyway, but to be clean we just don't pass variant to MUI.
93
111
 
112
+ const resolvedLoaderSize =
113
+ loaderSize ?? (size === "small" ? "small" : "default");
114
+
115
+ let loadingIndicator = restRecord.loadingIndicator as React.ReactNode;
116
+ if (useRecursicaLoader) {
117
+ loadingIndicator = (
118
+ <Loader variant={loaderVariant} size={resolvedLoaderSize} />
119
+ );
120
+ }
121
+
94
122
  return (
95
123
  <MuiButton
96
124
  ref={ref}
97
125
  disableRipple
98
126
  disableElevation
99
127
  className={finalClass}
128
+ loading={!!restRecord.loading}
129
+ loadingIndicator={loadingIndicator}
100
130
  startIcon={
101
131
  icon != null ? (
102
132
  <span className={styles.iconWrapper} aria-hidden>
@@ -106,8 +136,10 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
106
136
  }
107
137
  data-variant={variant}
108
138
  data-size={size}
109
- {...(isIconOnly ? { "data-icon-only": "" } : {})}
139
+ data-content={contentType}
140
+ {...(restRecord.loading ? { "data-loading": "true" } : {})}
110
141
  {...sanitizedProps}
142
+ disabled={!!restRecord.disabled || !!restRecord.loading}
111
143
  >
112
144
  <span className={styles.labelText}>{children}</span>
113
145
  </MuiButton>
@@ -0,0 +1,38 @@
1
+ /* EXEMPTIONS:
2
+ This component is a placeholder stub. Once fully implemented, its specific
3
+ tokens will be fully wired up to direct styles. */
4
+
5
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_borders_border-radius */
6
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_borders_border-size */
7
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_colors_background */
8
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_colors_border-color */
9
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_colors_content */
10
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_colors_divider-color */
11
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_colors_footer-background */
12
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_colors_header-background */
13
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_colors_title */
14
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_content-style_fontFamily */
15
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_content-style_fontSize */
16
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_content-style_fontStyle */
17
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_content-style_fontWeight */
18
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_content-style_letterSpacing */
19
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_content-style_lineHeight */
20
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_content-style_textCase */
21
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_content-style_textDecoration */
22
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_divider-size */
23
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_elevations_elevation */
24
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_footer-padding */
25
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_header-padding */
26
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_header-style_fontFamily */
27
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_header-style_fontSize */
28
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_header-style_fontStyle */
29
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_header-style_fontWeight */
30
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_header-style_letterSpacing */
31
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_header-style_lineHeight */
32
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_header-style_textCase */
33
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_header-style_textDecoration */
34
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_max-width */
35
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_min-width */
36
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_padding */
37
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_section-gap */
38
+ /* recursica-ignore: --recursica_ui-kit_components_card_properties_vertical-gutter */
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import "./Card.module.css";
2
3
 
3
4
  export type CardProps = React.HTMLAttributes<HTMLDivElement>;
4
5
 
@@ -0,0 +1,39 @@
1
+ /* EXEMPTIONS:
2
+ This component is a placeholder stub. Once fully implemented, its specific
3
+ tokens will be fully wired up to direct styles. */
4
+
5
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-group_properties_item-gap */
6
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-group_properties_padding */
7
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-group_variants_layouts_side-by-side_properties_gutter */
8
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-group_variants_layouts_side-by-side_properties_top-bottom-margin */
9
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-group_variants_layouts_side-by-side_properties_vertical-padding */
10
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-group_variants_layouts_stacked_properties_label-field-gap */
11
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-group_variants_layouts_stacked_properties_top-bottom-margin */
12
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-item_properties_colors_disabled-text */
13
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-item_properties_colors_text */
14
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-item_properties_disabled-opacity */
15
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-item_properties_label-gap */
16
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-item_properties_max-width */
17
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-item_properties_text_font-family */
18
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-item_properties_text_font-size */
19
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-item_properties_text_font-style */
20
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-item_properties_text_font-weight */
21
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-item_properties_text_letter-spacing */
22
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-item_properties_text_line-height */
23
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-item_properties_text_text-decoration */
24
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox-item_properties_text_text-transform */
25
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_border-radius */
26
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_border-size */
27
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_colors_background-checked */
28
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_colors_background-indeterminate */
29
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_colors_background-unchecked */
30
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_colors_border-checked */
31
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_colors_border-indeterminate */
32
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_colors_border-unchecked */
33
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_colors_disabled-background */
34
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_colors_disabled-border */
35
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_colors_disabled-icon */
36
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_colors_icon-color */
37
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_disabled-opacity */
38
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_icon-size */
39
+ /* recursica-ignore: --recursica_ui-kit_components_checkbox_properties_size */
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import "./Checkbox.module.css";
2
3
 
3
4
  export type CheckboxProps = React.HTMLAttributes<HTMLDivElement>;
4
5