@kushagradhawan/kookie-ui 0.1.41 → 0.1.43

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 (144) hide show
  1. package/README.md +257 -60
  2. package/components.css +398 -91
  3. package/dist/cjs/components/schemas/base-button.schema.d.ts +319 -0
  4. package/dist/cjs/components/schemas/base-button.schema.d.ts.map +1 -0
  5. package/dist/cjs/components/schemas/base-button.schema.js +2 -0
  6. package/dist/cjs/components/schemas/base-button.schema.js.map +7 -0
  7. package/dist/cjs/components/schemas/button.schema.d.ts +686 -0
  8. package/dist/cjs/components/schemas/button.schema.d.ts.map +1 -0
  9. package/dist/cjs/components/schemas/button.schema.js +2 -0
  10. package/dist/cjs/components/schemas/button.schema.js.map +7 -0
  11. package/dist/cjs/components/schemas/icon-button.schema.d.ts +329 -0
  12. package/dist/cjs/components/schemas/icon-button.schema.d.ts.map +1 -0
  13. package/dist/cjs/components/schemas/icon-button.schema.js +2 -0
  14. package/dist/cjs/components/schemas/icon-button.schema.js.map +7 -0
  15. package/dist/cjs/components/schemas/index.d.ts +52 -0
  16. package/dist/cjs/components/schemas/index.d.ts.map +1 -0
  17. package/dist/cjs/components/schemas/index.js +2 -0
  18. package/dist/cjs/components/schemas/index.js.map +7 -0
  19. package/dist/cjs/components/schemas/toggle-button.schema.d.ts +1172 -0
  20. package/dist/cjs/components/schemas/toggle-button.schema.d.ts.map +1 -0
  21. package/dist/cjs/components/schemas/toggle-button.schema.js +2 -0
  22. package/dist/cjs/components/schemas/toggle-button.schema.js.map +7 -0
  23. package/dist/cjs/components/schemas/toggle-icon-button.schema.d.ts +563 -0
  24. package/dist/cjs/components/schemas/toggle-icon-button.schema.d.ts.map +1 -0
  25. package/dist/cjs/components/schemas/toggle-icon-button.schema.js +2 -0
  26. package/dist/cjs/components/schemas/toggle-icon-button.schema.js.map +7 -0
  27. package/dist/cjs/components/sheet.d.ts +1 -1
  28. package/dist/cjs/components/sheet.d.ts.map +1 -1
  29. package/dist/cjs/components/sheet.js +1 -1
  30. package/dist/cjs/components/sheet.js.map +3 -3
  31. package/dist/cjs/components/shell.d.ts +125 -164
  32. package/dist/cjs/components/shell.d.ts.map +1 -1
  33. package/dist/cjs/components/shell.js +1 -1
  34. package/dist/cjs/components/shell.js.map +3 -3
  35. package/dist/cjs/components/sidebar.d.ts +1 -7
  36. package/dist/cjs/components/sidebar.d.ts.map +1 -1
  37. package/dist/cjs/components/sidebar.js +1 -1
  38. package/dist/cjs/components/sidebar.js.map +3 -3
  39. package/dist/cjs/components/theme.d.ts +3 -0
  40. package/dist/cjs/components/theme.d.ts.map +1 -1
  41. package/dist/cjs/components/theme.js +1 -1
  42. package/dist/cjs/components/theme.js.map +3 -3
  43. package/dist/cjs/components/theme.props.d.ts +10 -0
  44. package/dist/cjs/components/theme.props.d.ts.map +1 -1
  45. package/dist/cjs/components/theme.props.js +1 -1
  46. package/dist/cjs/components/theme.props.js.map +3 -3
  47. package/dist/cjs/helpers/font-config.d.ts +96 -0
  48. package/dist/cjs/helpers/font-config.d.ts.map +1 -0
  49. package/dist/cjs/helpers/font-config.js +3 -0
  50. package/dist/cjs/helpers/font-config.js.map +7 -0
  51. package/dist/cjs/helpers/index.d.ts +1 -0
  52. package/dist/cjs/helpers/index.d.ts.map +1 -1
  53. package/dist/cjs/helpers/index.js +1 -1
  54. package/dist/cjs/helpers/index.js.map +2 -2
  55. package/dist/esm/components/schemas/base-button.schema.d.ts +319 -0
  56. package/dist/esm/components/schemas/base-button.schema.d.ts.map +1 -0
  57. package/dist/esm/components/schemas/base-button.schema.js +2 -0
  58. package/dist/esm/components/schemas/base-button.schema.js.map +7 -0
  59. package/dist/esm/components/schemas/button.schema.d.ts +686 -0
  60. package/dist/esm/components/schemas/button.schema.d.ts.map +1 -0
  61. package/dist/esm/components/schemas/button.schema.js +2 -0
  62. package/dist/esm/components/schemas/button.schema.js.map +7 -0
  63. package/dist/esm/components/schemas/icon-button.schema.d.ts +329 -0
  64. package/dist/esm/components/schemas/icon-button.schema.d.ts.map +1 -0
  65. package/dist/esm/components/schemas/icon-button.schema.js +2 -0
  66. package/dist/esm/components/schemas/icon-button.schema.js.map +7 -0
  67. package/dist/esm/components/schemas/index.d.ts +52 -0
  68. package/dist/esm/components/schemas/index.d.ts.map +1 -0
  69. package/dist/esm/components/schemas/index.js +2 -0
  70. package/dist/esm/components/schemas/index.js.map +7 -0
  71. package/dist/esm/components/schemas/toggle-button.schema.d.ts +1172 -0
  72. package/dist/esm/components/schemas/toggle-button.schema.d.ts.map +1 -0
  73. package/dist/esm/components/schemas/toggle-button.schema.js +2 -0
  74. package/dist/esm/components/schemas/toggle-button.schema.js.map +7 -0
  75. package/dist/esm/components/schemas/toggle-icon-button.schema.d.ts +563 -0
  76. package/dist/esm/components/schemas/toggle-icon-button.schema.d.ts.map +1 -0
  77. package/dist/esm/components/schemas/toggle-icon-button.schema.js +2 -0
  78. package/dist/esm/components/schemas/toggle-icon-button.schema.js.map +7 -0
  79. package/dist/esm/components/sheet.d.ts +1 -1
  80. package/dist/esm/components/sheet.d.ts.map +1 -1
  81. package/dist/esm/components/sheet.js +1 -1
  82. package/dist/esm/components/sheet.js.map +3 -3
  83. package/dist/esm/components/shell.d.ts +125 -164
  84. package/dist/esm/components/shell.d.ts.map +1 -1
  85. package/dist/esm/components/shell.js +1 -1
  86. package/dist/esm/components/shell.js.map +3 -3
  87. package/dist/esm/components/sidebar.d.ts +1 -7
  88. package/dist/esm/components/sidebar.d.ts.map +1 -1
  89. package/dist/esm/components/sidebar.js +1 -1
  90. package/dist/esm/components/sidebar.js.map +3 -3
  91. package/dist/esm/components/theme.d.ts +3 -0
  92. package/dist/esm/components/theme.d.ts.map +1 -1
  93. package/dist/esm/components/theme.js +1 -1
  94. package/dist/esm/components/theme.js.map +3 -3
  95. package/dist/esm/components/theme.props.d.ts +10 -0
  96. package/dist/esm/components/theme.props.d.ts.map +1 -1
  97. package/dist/esm/components/theme.props.js +1 -1
  98. package/dist/esm/components/theme.props.js.map +3 -3
  99. package/dist/esm/helpers/font-config.d.ts +96 -0
  100. package/dist/esm/helpers/font-config.d.ts.map +1 -0
  101. package/dist/esm/helpers/font-config.js +3 -0
  102. package/dist/esm/helpers/font-config.js.map +7 -0
  103. package/dist/esm/helpers/index.d.ts +1 -0
  104. package/dist/esm/helpers/index.d.ts.map +1 -1
  105. package/dist/esm/helpers/index.js +1 -1
  106. package/dist/esm/helpers/index.js.map +2 -2
  107. package/package.json +23 -3
  108. package/schemas/base-button.d.ts +2 -0
  109. package/schemas/base-button.json +284 -0
  110. package/schemas/button.d.ts +2 -0
  111. package/schemas/button.json +535 -0
  112. package/schemas/icon-button.d.ts +2 -0
  113. package/schemas/icon-button.json +318 -0
  114. package/schemas/index.d.ts +2 -0
  115. package/schemas/index.json +2016 -0
  116. package/schemas/schemas.d.ts +29 -0
  117. package/schemas/toggle-button.d.ts +2 -0
  118. package/schemas/toggle-button.json +543 -0
  119. package/schemas/toggle-icon-button.d.ts +2 -0
  120. package/schemas/toggle-icon-button.json +326 -0
  121. package/schemas-json.d.ts +12 -0
  122. package/src/components/_internal/base-sidebar-menu.css +3 -8
  123. package/src/components/_internal/base-sidebar.css +1 -2
  124. package/src/components/schemas/base-button.schema.ts +339 -0
  125. package/src/components/schemas/button.schema.ts +198 -0
  126. package/src/components/schemas/icon-button.schema.ts +142 -0
  127. package/src/components/schemas/index.ts +68 -0
  128. package/src/components/schemas/toggle-button.schema.ts +122 -0
  129. package/src/components/schemas/toggle-icon-button.schema.ts +195 -0
  130. package/src/components/sheet.css +39 -19
  131. package/src/components/sheet.tsx +62 -3
  132. package/src/components/shell.css +510 -89
  133. package/src/components/shell.tsx +2055 -928
  134. package/src/components/sidebar.css +126 -65
  135. package/src/components/sidebar.tsx +5 -24
  136. package/src/components/theme.props.tsx +8 -0
  137. package/src/components/theme.tsx +16 -0
  138. package/src/helpers/font-config.ts +167 -0
  139. package/src/helpers/index.ts +1 -0
  140. package/src/styles/fonts.css +16 -13
  141. package/src/styles/tokens/typography.css +27 -4
  142. package/styles.css +410 -91
  143. package/tokens/base.css +12 -0
  144. package/tokens.css +12 -0
@@ -69,7 +69,7 @@
69
69
  .rt-SidebarContainer:where(.rt-variant-outline) {
70
70
  background-color: var(--color-panel);
71
71
  backdrop-filter: var(--backdrop-filter-panel);
72
-
72
+
73
73
  /* Component-level overrides (higher specificity) - remap --color-panel */
74
74
  &:where([data-panel-background='solid']) {
75
75
  --color-panel: var(--color-panel-solid);
@@ -84,18 +84,18 @@
84
84
  --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
85
85
  --backdrop-filter-components: blur(var(--backdrop-blur-components));
86
86
  }
87
-
87
+
88
88
  /* Floating sidebars get full inset border */
89
- :where(.rt-SidebarRoot[data-type="floating"]) & {
89
+ :where(.rt-SidebarRoot[data-type='floating']) & {
90
90
  box-shadow: inset 0 0 0 1px var(--gray-a6);
91
91
  }
92
-
92
+
93
93
  /* Non-floating sidebars get border only on the content-facing side */
94
- :where(.rt-SidebarRoot[data-type="sidebar"][data-side="left"]) & {
94
+ :where(.rt-SidebarRoot[data-type='sidebar'][data-side='left']) & {
95
95
  box-shadow: inset -1px 0 0 0 var(--gray-a6);
96
96
  }
97
-
98
- :where(.rt-SidebarRoot[data-type="sidebar"][data-side="right"]) & {
97
+
98
+ :where(.rt-SidebarRoot[data-type='sidebar'][data-side='right']) & {
99
99
  box-shadow: inset 1px 0 0 0 var(--gray-a6);
100
100
  }
101
101
  }
@@ -134,7 +134,7 @@
134
134
  .rt-SidebarContainer:where(.rt-variant-surface) {
135
135
  /* Base state: neutral gray background (maintains sidebar neutrality) */
136
136
  background-color: var(--gray-1);
137
-
137
+
138
138
  /* Theme-level translucent override */
139
139
  :where([data-panel-background='translucent']) & {
140
140
  background-color: color-mix(in srgb, var(--gray-a1), var(--gray-1) 60%);
@@ -155,31 +155,31 @@
155
155
  --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
156
156
  --backdrop-filter-components: blur(var(--backdrop-blur-components));
157
157
  }
158
-
158
+
159
159
  /* Inset border like Card surface variant */
160
160
  /* Floating sidebars get full inset border */
161
- :where(.rt-SidebarRoot[data-type="floating"]) & {
161
+ :where(.rt-SidebarRoot[data-type='floating']) & {
162
162
  box-shadow: inset 0 0 0 1px var(--gray-6);
163
-
163
+
164
164
  /* Theme-level translucent override */
165
165
  :where([data-panel-background='translucent']) & {
166
166
  box-shadow: inset 0 0 0 1px var(--gray-a6);
167
167
  }
168
168
  }
169
-
169
+
170
170
  /* Non-floating sidebars get border only on the content-facing side */
171
- :where(.rt-SidebarRoot[data-type="sidebar"][data-side="left"]) & {
171
+ :where(.rt-SidebarRoot[data-type='sidebar'][data-side='left']) & {
172
172
  box-shadow: inset -1px 0 0 0 var(--gray-6);
173
-
173
+
174
174
  /* Theme-level translucent override */
175
175
  :where([data-panel-background='translucent']) & {
176
176
  box-shadow: inset -1px 0 0 0 var(--gray-a6);
177
177
  }
178
178
  }
179
-
180
- :where(.rt-SidebarRoot[data-type="sidebar"][data-side="right"]) & {
179
+
180
+ :where(.rt-SidebarRoot[data-type='sidebar'][data-side='right']) & {
181
181
  box-shadow: inset 1px 0 0 0 var(--gray-6);
182
-
182
+
183
183
  /* Theme-level translucent override */
184
184
  :where([data-panel-background='translucent']) & {
185
185
  box-shadow: inset 1px 0 0 0 var(--gray-a6);
@@ -195,7 +195,7 @@
195
195
  gap: var(--space-2);
196
196
  padding: var(--base-menu-content-padding);
197
197
  min-height: var(--base-menu-item-height);
198
-
198
+
199
199
  /* Make MenuButtons expand to full width */
200
200
  & :where(.rt-SidebarMenuButton) {
201
201
  flex: 1;
@@ -209,7 +209,7 @@
209
209
  gap: var(--space-2);
210
210
  padding: var(--base-menu-content-padding);
211
211
  min-height: var(--base-menu-item-height);
212
-
212
+
213
213
  /* Make MenuButtons expand to full width */
214
214
  & :where(.rt-SidebarMenuButton) {
215
215
  flex: 1;
@@ -217,33 +217,85 @@
217
217
  }
218
218
 
219
219
  /* Flex utilities for header/footer layouts */
220
- .rt-SidebarHeader:where(.rt-flex-row) { flex-direction: row; }
221
- .rt-SidebarHeader:where(.rt-flex-col) { flex-direction: column; }
222
- .rt-SidebarHeader:where(.rt-items-center) { align-items: center; }
223
- .rt-SidebarHeader:where(.rt-items-start) { align-items: flex-start; }
224
- .rt-SidebarHeader:where(.rt-items-end) { align-items: flex-end; }
225
- .rt-SidebarHeader:where(.rt-justify-between) { justify-content: space-between; }
226
- .rt-SidebarHeader:where(.rt-justify-center) { justify-content: center; }
227
- .rt-SidebarHeader:where(.rt-justify-start) { justify-content: flex-start; }
228
- .rt-SidebarHeader:where(.rt-justify-end) { justify-content: flex-end; }
229
- .rt-SidebarHeader:where(.rt-gap-1) { gap: var(--space-1); }
230
- .rt-SidebarHeader:where(.rt-gap-2) { gap: var(--space-2); }
231
- .rt-SidebarHeader:where(.rt-gap-3) { gap: var(--space-3); }
232
- .rt-SidebarHeader:where(.rt-gap-4) { gap: var(--space-4); }
233
-
234
- .rt-SidebarFooter:where(.rt-flex-row) { flex-direction: row; }
235
- .rt-SidebarFooter:where(.rt-flex-col) { flex-direction: column; }
236
- .rt-SidebarFooter:where(.rt-items-center) { align-items: center; }
237
- .rt-SidebarFooter:where(.rt-items-start) { align-items: flex-start; }
238
- .rt-SidebarFooter:where(.rt-items-end) { align-items: flex-end; }
239
- .rt-SidebarFooter:where(.rt-justify-between) { justify-content: space-between; }
240
- .rt-SidebarFooter:where(.rt-justify-center) { justify-content: center; }
241
- .rt-SidebarFooter:where(.rt-justify-start) { justify-content: flex-start; }
242
- .rt-SidebarFooter:where(.rt-justify-end) { justify-content: flex-end; }
243
- .rt-SidebarFooter:where(.rt-gap-1) { gap: var(--space-1); }
244
- .rt-SidebarFooter:where(.rt-gap-2) { gap: var(--space-2); }
245
- .rt-SidebarFooter:where(.rt-gap-3) { gap: var(--space-3); }
246
- .rt-SidebarFooter:where(.rt-gap-4) { gap: var(--space-4); }
220
+ .rt-SidebarHeader:where(.rt-flex-row) {
221
+ flex-direction: row;
222
+ }
223
+ .rt-SidebarHeader:where(.rt-flex-col) {
224
+ flex-direction: column;
225
+ }
226
+ .rt-SidebarHeader:where(.rt-items-center) {
227
+ align-items: center;
228
+ }
229
+ .rt-SidebarHeader:where(.rt-items-start) {
230
+ align-items: flex-start;
231
+ }
232
+ .rt-SidebarHeader:where(.rt-items-end) {
233
+ align-items: flex-end;
234
+ }
235
+ .rt-SidebarHeader:where(.rt-justify-between) {
236
+ justify-content: space-between;
237
+ }
238
+ .rt-SidebarHeader:where(.rt-justify-center) {
239
+ justify-content: center;
240
+ }
241
+ .rt-SidebarHeader:where(.rt-justify-start) {
242
+ justify-content: flex-start;
243
+ }
244
+ .rt-SidebarHeader:where(.rt-justify-end) {
245
+ justify-content: flex-end;
246
+ }
247
+ .rt-SidebarHeader:where(.rt-gap-1) {
248
+ gap: var(--space-1);
249
+ }
250
+ .rt-SidebarHeader:where(.rt-gap-2) {
251
+ gap: var(--space-2);
252
+ }
253
+ .rt-SidebarHeader:where(.rt-gap-3) {
254
+ gap: var(--space-3);
255
+ }
256
+ .rt-SidebarHeader:where(.rt-gap-4) {
257
+ gap: var(--space-4);
258
+ }
259
+
260
+ .rt-SidebarFooter:where(.rt-flex-row) {
261
+ flex-direction: row;
262
+ }
263
+ .rt-SidebarFooter:where(.rt-flex-col) {
264
+ flex-direction: column;
265
+ }
266
+ .rt-SidebarFooter:where(.rt-items-center) {
267
+ align-items: center;
268
+ }
269
+ .rt-SidebarFooter:where(.rt-items-start) {
270
+ align-items: flex-start;
271
+ }
272
+ .rt-SidebarFooter:where(.rt-items-end) {
273
+ align-items: flex-end;
274
+ }
275
+ .rt-SidebarFooter:where(.rt-justify-between) {
276
+ justify-content: space-between;
277
+ }
278
+ .rt-SidebarFooter:where(.rt-justify-center) {
279
+ justify-content: center;
280
+ }
281
+ .rt-SidebarFooter:where(.rt-justify-start) {
282
+ justify-content: flex-start;
283
+ }
284
+ .rt-SidebarFooter:where(.rt-justify-end) {
285
+ justify-content: flex-end;
286
+ }
287
+ .rt-SidebarFooter:where(.rt-gap-1) {
288
+ gap: var(--space-1);
289
+ }
290
+ .rt-SidebarFooter:where(.rt-gap-2) {
291
+ gap: var(--space-2);
292
+ }
293
+ .rt-SidebarFooter:where(.rt-gap-3) {
294
+ gap: var(--space-3);
295
+ }
296
+ .rt-SidebarFooter:where(.rt-gap-4) {
297
+ gap: var(--space-4);
298
+ }
247
299
 
248
300
  /* Header/Footer Menu Button Support */
249
301
  .rt-SidebarHeader :where(.rt-SidebarMenuButton),
@@ -266,21 +318,22 @@
266
318
  text-align: left;
267
319
  cursor: var(--cursor-menu-item);
268
320
  user-select: none;
269
-
321
+
270
322
  /* Header/Footer-specific styling */
271
323
  justify-content: flex-start;
272
-
324
+
273
325
  /* Transitions */
274
- transition: background var(--motion-duration-small) var(--motion-ease-standard),
275
- box-shadow var(--motion-duration-small) var(--motion-ease-standard),
276
- filter var(--motion-duration-small) var(--motion-ease-standard);
277
-
326
+ transition:
327
+ background var(--motion-duration-small) var(--motion-ease-standard),
328
+ box-shadow var(--motion-duration-small) var(--motion-ease-standard),
329
+ filter var(--motion-duration-small) var(--motion-ease-standard);
330
+
278
331
  /* Focus state */
279
332
  &:where(:focus-visible) {
280
333
  outline: 2px solid var(--focus-8);
281
334
  outline-offset: 2px;
282
335
  }
283
-
336
+
284
337
  /* Reduced motion support */
285
338
  @media (prefers-reduced-motion: reduce) {
286
339
  transition: none;
@@ -397,15 +450,17 @@
397
450
  /* Sub-trigger transitions - match base menu */
398
451
  & :where(.rt-SidebarMenuSubTrigger) {
399
452
  transition: var(--transition-menu);
400
-
453
+
401
454
  /* Reduced motion support */
402
455
  @media (prefers-reduced-motion: reduce) {
403
456
  transition: none;
404
457
  }
405
-
458
+
406
459
  /* Remove backdrop-filter transitions in translucent mode to prevent flickering */
407
460
  :where([data-panel-background='translucent']) & {
408
- transition: background var(--duration-1) var(--ease-1), color var(--duration-2) var(--ease-1);
461
+ transition:
462
+ background var(--duration-1) var(--ease-1),
463
+ color var(--duration-2) var(--ease-1);
409
464
  }
410
465
  }
411
466
 
@@ -413,7 +468,7 @@
413
468
  & :where(.rt-SidebarMenuSubTrigger[data-state='open']) {
414
469
  /* Base state: solid gray for solid panels */
415
470
  background-color: var(--gray-3);
416
-
471
+
417
472
  /* Theme-level translucent override */
418
473
  :where([data-panel-background='translucent']) & {
419
474
  background-color: var(--gray-a3);
@@ -435,7 +490,9 @@
435
490
  & :where(.rt-SidebarMenuButton) {
436
491
  /* Remove backdrop-filter transitions in translucent mode to prevent flickering */
437
492
  :where([data-panel-background='translucent']) & {
438
- transition: background var(--duration-1) var(--ease-1), color var(--duration-2) var(--ease-1);
493
+ transition:
494
+ background var(--duration-1) var(--ease-1),
495
+ color var(--duration-2) var(--ease-1);
439
496
  }
440
497
  }
441
498
 
@@ -576,15 +633,17 @@
576
633
  /* Sub-trigger transitions - match base menu */
577
634
  & :where(.rt-SidebarMenuSubTrigger) {
578
635
  transition: var(--transition-menu);
579
-
636
+
580
637
  /* Reduced motion support */
581
638
  @media (prefers-reduced-motion: reduce) {
582
639
  transition: none;
583
640
  }
584
-
641
+
585
642
  /* Remove backdrop-filter transitions in translucent mode to prevent flickering */
586
643
  :where([data-panel-background='translucent']) & {
587
- transition: background var(--duration-1) var(--ease-1), color var(--duration-2) var(--ease-1);
644
+ transition:
645
+ background var(--duration-1) var(--ease-1),
646
+ color var(--duration-2) var(--ease-1);
588
647
  }
589
648
  }
590
649
 
@@ -592,7 +651,7 @@
592
651
  & :where(.rt-SidebarMenuSubTrigger[data-state='open']) {
593
652
  /* Base state: solid accent for solid panels */
594
653
  background-color: var(--accent-3);
595
-
654
+
596
655
  /* Theme-level translucent override */
597
656
  :where([data-panel-background='translucent']) & {
598
657
  background-color: var(--accent-a3);
@@ -614,7 +673,9 @@
614
673
  & :where(.rt-SidebarMenuButton) {
615
674
  /* Remove backdrop-filter transitions in translucent mode to prevent flickering */
616
675
  :where([data-panel-background='translucent']) & {
617
- transition: background var(--duration-1) var(--ease-1), color var(--duration-2) var(--ease-1);
676
+ transition:
677
+ background var(--duration-1) var(--ease-1),
678
+ color var(--duration-2) var(--ease-1);
618
679
  }
619
680
  }
620
681
 
@@ -622,7 +683,7 @@
622
683
  & :where(.rt-SidebarMenuButton[data-highlighted]) {
623
684
  /* Base state: solid accent for solid panels */
624
685
  background-color: var(--accent-4);
625
-
686
+
626
687
  /* Theme-level translucent override */
627
688
  :where([data-panel-background='translucent']) & {
628
689
  background-color: var(--accent-a4);
@@ -677,4 +738,4 @@
677
738
  }
678
739
  }
679
740
 
680
- /* Removed old icon-only collapsed mode rules in favor of Shell rail mode */
741
+ /* Removed old icon-only collapsed mode rules in favor of Shell rail mode */
@@ -39,21 +39,7 @@ function useSidebarVisual() {
39
39
  return React.useContext(SidebarVisualContext);
40
40
  }
41
41
 
42
- // Context detection for Shell.Sidebar integration
43
- type ShellSidebarSectionContextValue = {
44
- side: 'start' | 'end';
45
- section: 'rail' | 'panel';
46
- };
47
-
48
- // Create a context that Shell.Sidebar can provide
49
- const ShellSidebarSectionContext = React.createContext<ShellSidebarSectionContextValue | null>(
50
- null,
51
- );
52
-
53
- // This context comes from Shell.Sidebar when Sidebar is used within Shell
54
- function useShellSidebarSection(): ShellSidebarSectionContextValue | null {
55
- return React.useContext(ShellSidebarSectionContext);
56
- }
42
+ // Sidebar is now independent of Shell - no integration needed
57
43
 
58
44
  // Main Sidebar component
59
45
  type SidebarOwnProps = GetPropDefTypes<typeof sidebarPropDefs>;
@@ -79,9 +65,8 @@ const Sidebar = React.forwardRef<HTMLDivElement, SidebarProps>((props, forwarded
79
65
  const { asChild: _, panelBackground: __, ...safeRootProps } = rootProps; // Remove asChild and panelBackground from DOM props
80
66
  const resolvedColor = color || themeContext.accentColor;
81
67
 
82
- // Detect Shell.Sidebar context to auto-resolve layout
83
- const shellSection = useShellSidebarSection();
84
- const resolvedLayout = layout || shellSection?.section || 'panel'; // Default to 'panel' if no context
68
+ // Resolve layout (default to 'panel')
69
+ const resolvedLayout = layout || 'panel';
85
70
 
86
71
  // Update context with current props - we'll pass the resolved values
87
72
  const resolvedSize = typeof size === 'object' ? size.initial || '2' : size;
@@ -153,7 +138,7 @@ const SidebarContent = React.forwardRef<HTMLDivElement, SidebarContentProps>(
153
138
  className,
154
139
  )}
155
140
  >
156
- {children}
141
+ <div className="rt-BaseMenuViewport">{children}</div>
157
142
  </div>
158
143
  </ScrollArea>
159
144
  );
@@ -258,7 +243,7 @@ const SidebarMenu = React.forwardRef<HTMLUListElement, SidebarMenuProps>(
258
243
  {...props}
259
244
  ref={forwardedRef}
260
245
  role="menu"
261
- className={classNames('rt-BaseMenuViewport', 'rt-SidebarMenu', className)}
246
+ className={classNames('rt-SidebarMenu', className)}
262
247
  />
263
248
  ),
264
249
  );
@@ -615,8 +600,4 @@ export type {
615
600
  SidebarHeaderProps as HeaderProps,
616
601
  SidebarFooterProps as FooterProps,
617
602
  BadgeConfig,
618
- ShellSidebarSectionContextValue,
619
603
  };
620
-
621
- // Export context for Shell.Sidebar integration
622
- export { ShellSidebarSectionContext };
@@ -8,6 +8,7 @@ const appearances = ['inherit', 'light', 'dark'] as const;
8
8
  const panelBackgrounds = ['solid', 'translucent'] as const;
9
9
  const materials = ['solid', 'translucent'] as const;
10
10
  const scalings = ['90%', '95%', '100%', '105%', '110%'] as const;
11
+ const fontFamilies = ['sans', 'mono'] as const;
11
12
 
12
13
  const themePropDefs = {
13
14
  ...asChildPropDef,
@@ -71,6 +72,12 @@ const themePropDefs = {
71
72
  * https://www.radix-ui.com/themes/docs/theme/layout
72
73
  */
73
74
  scaling: { type: 'enum', values: scalings, default: '100%' },
75
+ /**
76
+ * Sets the font family for the theme.
77
+ *
78
+ * @default 'sans'
79
+ */
80
+ fontFamily: { type: 'enum', values: fontFamilies, default: 'sans' },
74
81
  } satisfies {
75
82
  hasBackground: PropDef<boolean>;
76
83
  appearance: PropDef<(typeof appearances)[number]>;
@@ -80,6 +87,7 @@ const themePropDefs = {
80
87
  panelBackground: PropDef<(typeof panelBackgrounds)[number]>;
81
88
  radius: PropDef<(typeof radii)[number]>;
82
89
  scaling: PropDef<(typeof scalings)[number]>;
90
+ fontFamily: PropDef<(typeof fontFamilies)[number]>;
83
91
  };
84
92
 
85
93
  type ThemeOwnProps = GetPropDefTypes<typeof themePropDefs & typeof asChildPropDef>;
@@ -19,6 +19,7 @@ type ThemeMaterial = (typeof themePropDefs.material.values)[number];
19
19
  type ThemePanelBackground = (typeof themePropDefs.panelBackground.values)[number];
20
20
  type ThemeRadius = (typeof themePropDefs.radius.values)[number];
21
21
  type ThemeScaling = (typeof themePropDefs.scaling.values)[number];
22
+ type ThemeFontFamily = (typeof themePropDefs.fontFamily.values)[number];
22
23
 
23
24
  interface ThemeChangeHandlers {
24
25
  onAppearanceChange: (appearance: ThemeAppearance) => void;
@@ -28,6 +29,7 @@ interface ThemeChangeHandlers {
28
29
  onPanelBackgroundChange: (panelBackground: ThemePanelBackground) => void;
29
30
  onRadiusChange: (radius: ThemeRadius) => void;
30
31
  onScalingChange: (scaling: ThemeScaling) => void;
32
+ onFontFamilyChange: (fontFamily: ThemeFontFamily) => void;
31
33
  }
32
34
 
33
35
  interface ThemeContextValue extends ThemeChangeHandlers {
@@ -39,6 +41,7 @@ interface ThemeContextValue extends ThemeChangeHandlers {
39
41
  panelBackground: ThemePanelBackground;
40
42
  radius: ThemeRadius;
41
43
  scaling: ThemeScaling;
44
+ fontFamily: ThemeFontFamily;
42
45
  }
43
46
  const ThemeContext = React.createContext<ThemeContextValue | undefined>(undefined);
44
47
 
@@ -77,6 +80,7 @@ const ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(
77
80
  panelBackground: panelBackgroundProp = themePropDefs.panelBackground.default,
78
81
  radius: radiusProp = themePropDefs.radius.default,
79
82
  scaling: scalingProp = themePropDefs.scaling.default,
83
+ fontFamily: fontFamilyProp = themePropDefs.fontFamily.default,
80
84
  hasBackground = themePropDefs.hasBackground.default,
81
85
  ...rootProps
82
86
  } = props;
@@ -115,6 +119,9 @@ const ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(
115
119
  const [scaling, setScaling] = React.useState(scalingProp);
116
120
  React.useEffect(() => setScaling(scalingProp), [scalingProp]);
117
121
 
122
+ const [fontFamily, setFontFamily] = React.useState(fontFamilyProp);
123
+ React.useEffect(() => setFontFamily(fontFamilyProp), [fontFamilyProp]);
124
+
118
125
  return (
119
126
  <ThemeImpl
120
127
  {...rootProps}
@@ -129,6 +136,7 @@ const ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(
129
136
  panelBackground={panelBackground}
130
137
  radius={radius}
131
138
  scaling={scaling}
139
+ fontFamily={fontFamily}
132
140
  //
133
141
  onAppearanceChange={setAppearance}
134
142
  onAccentColorChange={setAccentColor}
@@ -137,6 +145,7 @@ const ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(
137
145
  onPanelBackgroundChange={setPanelBackground}
138
146
  onRadiusChange={setRadius}
139
147
  onScalingChange={setScaling}
148
+ onFontFamilyChange={setFontFamily}
140
149
  />
141
150
  );
142
151
  },
@@ -167,6 +176,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
167
176
  themePropDefs.panelBackground.default,
168
177
  radius = props.radius ?? context?.radius ?? themePropDefs.radius.default,
169
178
  scaling = props.scaling ?? context?.scaling ?? themePropDefs.scaling.default,
179
+ fontFamily = props.fontFamily ?? context?.fontFamily ?? themePropDefs.fontFamily.default,
170
180
  //
171
181
  onAppearanceChange = noop,
172
182
  onAccentColorChange = noop,
@@ -175,6 +185,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
175
185
  onPanelBackgroundChange = noop,
176
186
  onRadiusChange = noop,
177
187
  onScalingChange = noop,
188
+ onFontFamilyChange = noop,
178
189
  //
179
190
  ...themeProps
180
191
  } = props;
@@ -195,6 +206,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
195
206
  panelBackground,
196
207
  radius,
197
208
  scaling,
209
+ fontFamily,
198
210
  //
199
211
  onAppearanceChange,
200
212
  onAccentColorChange,
@@ -203,6 +215,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
203
215
  onPanelBackgroundChange,
204
216
  onRadiusChange,
205
217
  onScalingChange,
218
+ onFontFamilyChange,
206
219
  }),
207
220
  [
208
221
  appearance,
@@ -213,6 +226,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
213
226
  panelBackground,
214
227
  radius,
215
228
  scaling,
229
+ fontFamily,
216
230
  //
217
231
  onAppearanceChange,
218
232
  onAccentColorChange,
@@ -221,6 +235,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
221
235
  onPanelBackgroundChange,
222
236
  onRadiusChange,
223
237
  onScalingChange,
238
+ onFontFamilyChange,
224
239
  ],
225
240
  )}
226
241
  >
@@ -234,6 +249,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
234
249
  data-panel-background={panelBackground}
235
250
  data-radius={radius}
236
251
  data-scaling={scaling}
252
+ data-font-family={fontFamily}
237
253
  ref={forwardedRef}
238
254
  {...themeProps}
239
255
  className={classNames(