@multicomma/arkcn 0.1.2 → 0.1.3

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 (148) hide show
  1. package/package.json +1 -1
  2. package/registry/index.json +1 -1
  3. package/registry/items/accordion.json +302 -0
  4. package/registry/items/activity-feed.json +408 -0
  5. package/registry/items/alert-dialog.json +676 -0
  6. package/registry/items/alert.json +113 -0
  7. package/registry/items/angle-slider.json +378 -0
  8. package/registry/items/app-shell.json +2654 -1
  9. package/registry/items/aspect-ratio.json +36 -0
  10. package/registry/items/attachment.json +299 -1
  11. package/registry/items/avatar.json +213 -0
  12. package/registry/items/badge.json +44 -0
  13. package/registry/items/breadcrumb.json +191 -0
  14. package/registry/items/bubble.json +146 -0
  15. package/registry/items/button-group.json +110 -0
  16. package/registry/items/button.json +52 -0
  17. package/registry/items/calendar.json +499 -1
  18. package/registry/items/canvas.json +446 -1
  19. package/registry/items/card.json +192 -0
  20. package/registry/items/carousel.json +208 -1
  21. package/registry/items/cascader.json +797 -1
  22. package/registry/items/chart.json +1764 -1
  23. package/registry/items/chat.json +993 -0
  24. package/registry/items/checkbox.json +503 -0
  25. package/registry/items/clipboard.json +308 -0
  26. package/registry/items/collapsible.json +226 -0
  27. package/registry/items/color-picker.json +1261 -0
  28. package/registry/items/combobox.json +1123 -1
  29. package/registry/items/command.json +837 -1
  30. package/registry/items/comment-thread.json +952 -1
  31. package/registry/items/context-menu.json +1344 -1
  32. package/registry/items/data-grid.json +449 -1
  33. package/registry/items/data-table.json +1310 -1
  34. package/registry/items/date-input.json +476 -0
  35. package/registry/items/dialog.json +592 -0
  36. package/registry/items/direction.json +29 -1
  37. package/registry/items/drawer.json +797 -0
  38. package/registry/items/dropdown-menu.json +1311 -1
  39. package/registry/items/editable.json +503 -0
  40. package/registry/items/empty.json +166 -0
  41. package/registry/items/field.json +286 -1
  42. package/registry/items/file-upload.json +638 -0
  43. package/registry/items/floating-panel.json +720 -0
  44. package/registry/items/floating-toolbar.json +43 -0
  45. package/registry/items/format.json +109 -0
  46. package/registry/items/gantt.json +773 -1
  47. package/registry/items/hooks/use-mobile.json +1 -0
  48. package/registry/items/hotkeys.json +99 -1
  49. package/registry/items/hover-card.json +357 -0
  50. package/registry/items/image-cropper.json +431 -0
  51. package/registry/items/input-group.json +189 -0
  52. package/registry/items/input-otp.json +181 -0
  53. package/registry/items/input.json +28 -0
  54. package/registry/items/item.json +308 -0
  55. package/registry/items/json-tree-view.json +336 -0
  56. package/registry/items/kanban.json +624 -1
  57. package/registry/items/kbd.json +54 -0
  58. package/registry/items/label.json +28 -0
  59. package/registry/items/lib/controllable.json +1 -0
  60. package/registry/items/lib/data-table-adapter.json +1 -0
  61. package/registry/items/lib/drag-preview.json +1 -0
  62. package/registry/items/lib/form.json +1 -0
  63. package/registry/items/lib/history.json +1 -0
  64. package/registry/items/lib/row-layout.json +1 -0
  65. package/registry/items/lib/table.json +1 -0
  66. package/registry/items/lib/time.json +1 -0
  67. package/registry/items/lib/utils.json +1 -0
  68. package/registry/items/live-region.json +43 -0
  69. package/registry/items/marker.json +96 -0
  70. package/registry/items/marquee.json +300 -0
  71. package/registry/items/menubar.json +1282 -1
  72. package/registry/items/message.json +166 -0
  73. package/registry/items/navigation-menu.json +561 -1
  74. package/registry/items/node-graph.json +1037 -1
  75. package/registry/items/number-input.json +519 -0
  76. package/registry/items/pagination.json +244 -1
  77. package/registry/items/password-input.json +311 -0
  78. package/registry/items/popconfirm.json +566 -0
  79. package/registry/items/popover.json +615 -0
  80. package/registry/items/progress.json +516 -0
  81. package/registry/items/qr-code.json +249 -0
  82. package/registry/items/query-builder.json +1368 -1
  83. package/registry/items/radio-group.json +362 -0
  84. package/registry/items/rating-group.json +304 -0
  85. package/registry/items/resizable.json +242 -1
  86. package/registry/items/rich-text-editor.json +934 -1
  87. package/registry/items/scheduler.json +1013 -1
  88. package/registry/items/scroll-area.json +227 -0
  89. package/registry/items/segment-group.json +363 -0
  90. package/registry/items/select.json +956 -0
  91. package/registry/items/separator.json +45 -1
  92. package/registry/items/sheet.json +592 -0
  93. package/registry/items/sidebar.json +785 -1
  94. package/registry/items/signature-pad.json +330 -0
  95. package/registry/items/skeleton.json +28 -0
  96. package/registry/items/slider.json +799 -0
  97. package/registry/items/sonner.json +135 -0
  98. package/registry/items/spinner.json +28 -0
  99. package/registry/items/steps.json +483 -0
  100. package/registry/items/swap.json +107 -0
  101. package/registry/items/switch.json +362 -0
  102. package/registry/items/table.json +210 -0
  103. package/registry/items/tabs.json +326 -0
  104. package/registry/items/tags-input.json +640 -0
  105. package/registry/items/textarea.json +28 -0
  106. package/registry/items/timer.json +289 -0
  107. package/registry/items/toc.json +372 -0
  108. package/registry/items/toggle-group.json +214 -1
  109. package/registry/items/toggle.json +124 -0
  110. package/registry/items/tooltip.json +417 -0
  111. package/registry/items/tour.json +498 -0
  112. package/registry/items/transfer-list.json +609 -1
  113. package/registry/items/tree-select.json +742 -1
  114. package/registry/items/tree-view.json +794 -0
  115. package/registry/items/virtual-list.json +214 -1
  116. package/src/components/ui/app-shell.tsx +11 -0
  117. package/src/components/ui/attachment.tsx +1 -0
  118. package/src/components/ui/calendar.tsx +1 -0
  119. package/src/components/ui/canvas.tsx +8 -0
  120. package/src/components/ui/carousel.tsx +3 -0
  121. package/src/components/ui/cascader.tsx +1 -0
  122. package/src/components/ui/chart.tsx +10 -0
  123. package/src/components/ui/combobox.tsx +3 -0
  124. package/src/components/ui/command.tsx +1 -0
  125. package/src/components/ui/comment-thread.tsx +11 -0
  126. package/src/components/ui/context-menu.tsx +6 -0
  127. package/src/components/ui/data-grid.tsx +8 -0
  128. package/src/components/ui/data-table.tsx +6 -0
  129. package/src/components/ui/direction.tsx +2 -0
  130. package/src/components/ui/dropdown-menu.tsx +6 -0
  131. package/src/components/ui/field.tsx +1 -0
  132. package/src/components/ui/gantt.tsx +15 -0
  133. package/src/components/ui/hotkeys.tsx +3 -0
  134. package/src/components/ui/kanban.tsx +3 -0
  135. package/src/components/ui/menubar.tsx +6 -0
  136. package/src/components/ui/navigation-menu.tsx +1 -0
  137. package/src/components/ui/node-graph.tsx +23 -0
  138. package/src/components/ui/pagination.tsx +1 -0
  139. package/src/components/ui/query-builder.tsx +7 -0
  140. package/src/components/ui/resizable.tsx +1 -0
  141. package/src/components/ui/rich-text-editor.tsx +54 -0
  142. package/src/components/ui/scheduler.tsx +26 -0
  143. package/src/components/ui/separator.tsx +1 -0
  144. package/src/components/ui/sidebar.tsx +5 -0
  145. package/src/components/ui/toggle-group.tsx +3 -0
  146. package/src/components/ui/transfer-list.tsx +11 -0
  147. package/src/components/ui/tree-select.tsx +5 -0
  148. package/src/components/ui/virtual-list.tsx +7 -0
@@ -58,6 +58,2659 @@
58
58
  "AppShellSidebarHeader",
59
59
  "useAppShell"
60
60
  ],
61
+ "parts": [
62
+ {
63
+ "name": "AppShell",
64
+ "props": [
65
+ {
66
+ "name": "children",
67
+ "type": "ReactNode",
68
+ "required": false,
69
+ "description": "Content rendered inside the part.",
70
+ "from": "arkcn"
71
+ },
72
+ {
73
+ "name": "collapsible",
74
+ "type": "SidebarCollapsible",
75
+ "required": false,
76
+ "description": "Controlled sidebar collapse mode: `offcanvas`, `icon`, or `none`.",
77
+ "from": "arkcn"
78
+ },
79
+ {
80
+ "name": "defaultCollapsible",
81
+ "type": "SidebarCollapsible",
82
+ "required": false,
83
+ "default": "\"icon\"",
84
+ "description": "Initial collapse mode when uncontrolled.",
85
+ "from": "arkcn"
86
+ },
87
+ {
88
+ "name": "defaultOpen",
89
+ "type": "boolean",
90
+ "required": false,
91
+ "description": "The initial open state when uncontrolled.",
92
+ "from": "arkcn"
93
+ },
94
+ {
95
+ "name": "defaultVariant",
96
+ "type": "SidebarVariant",
97
+ "required": false,
98
+ "default": "\"inset\"",
99
+ "description": "Initial sidebar variant when uncontrolled.",
100
+ "from": "arkcn"
101
+ },
102
+ {
103
+ "name": "onCollapsibleChange",
104
+ "type": "((collapsible: SidebarCollapsible) => void)",
105
+ "required": false,
106
+ "description": "Called when the collapse mode changes.",
107
+ "from": "arkcn"
108
+ },
109
+ {
110
+ "name": "onOpenChange",
111
+ "type": "((open: boolean) => void)",
112
+ "required": false,
113
+ "description": "Called when the open state changes.",
114
+ "from": "arkcn"
115
+ },
116
+ {
117
+ "name": "onVariantChange",
118
+ "type": "((variant: SidebarVariant) => void)",
119
+ "required": false,
120
+ "description": "Called when the sidebar variant changes.",
121
+ "from": "arkcn"
122
+ },
123
+ {
124
+ "name": "open",
125
+ "type": "boolean",
126
+ "required": false,
127
+ "description": "The controlled open state.",
128
+ "from": "arkcn"
129
+ },
130
+ {
131
+ "name": "searchShortcut",
132
+ "type": "boolean",
133
+ "required": false,
134
+ "default": "true",
135
+ "description": "Toggle the search dialog with Cmd/Ctrl+K.",
136
+ "from": "arkcn"
137
+ },
138
+ {
139
+ "name": "variant",
140
+ "type": "SidebarVariant",
141
+ "required": false,
142
+ "description": "Visual variant, styled with `cva`; sets a `data-variant` attribute.",
143
+ "from": "arkcn"
144
+ },
145
+ {
146
+ "name": "className",
147
+ "type": "string",
148
+ "required": false,
149
+ "description": "Extra classes merged into the part's own classes with `cn`.",
150
+ "from": "@types/react"
151
+ },
152
+ {
153
+ "name": "style",
154
+ "type": "CSSProperties",
155
+ "required": false,
156
+ "description": "Inline styles applied to the rendered element.",
157
+ "from": "@types/react"
158
+ }
159
+ ]
160
+ },
161
+ {
162
+ "name": "AppShellBrand",
163
+ "props": [
164
+ {
165
+ "name": "asChild",
166
+ "type": "boolean",
167
+ "required": false,
168
+ "description": "Render the child element instead of the default one, merging props and behaviour onto it.",
169
+ "from": "arkcn"
170
+ },
171
+ {
172
+ "name": "isActive",
173
+ "type": "boolean",
174
+ "required": false,
175
+ "description": "Marks the current item.",
176
+ "from": "arkcn"
177
+ },
178
+ {
179
+ "name": "size",
180
+ "type": "\"default\" | \"sm\" | \"lg\" | null",
181
+ "required": false,
182
+ "description": "Size variant; sets a `data-size` attribute.",
183
+ "from": "arkcn"
184
+ },
185
+ {
186
+ "name": "tooltip",
187
+ "type": "string | (TooltipContentProps & RefAttributes<HTMLDivElement>)",
188
+ "required": false,
189
+ "description": "Tooltip content shown on hover, or `false` to disable it.",
190
+ "from": "arkcn"
191
+ },
192
+ {
193
+ "name": "variant",
194
+ "type": "\"default\" | \"outline\" | null",
195
+ "required": false,
196
+ "description": "Visual variant, styled with `cva`; sets a `data-variant` attribute.",
197
+ "from": "arkcn"
198
+ },
199
+ {
200
+ "name": "children",
201
+ "type": "ReactNode",
202
+ "required": false,
203
+ "description": "Content rendered inside the part.",
204
+ "from": "@types/react"
205
+ },
206
+ {
207
+ "name": "className",
208
+ "type": "string",
209
+ "required": false,
210
+ "description": "Extra classes merged into the part's own classes with `cn`.",
211
+ "from": "@types/react"
212
+ },
213
+ {
214
+ "name": "style",
215
+ "type": "CSSProperties",
216
+ "required": false,
217
+ "description": "Inline styles applied to the rendered element.",
218
+ "from": "@types/react"
219
+ }
220
+ ]
221
+ },
222
+ {
223
+ "name": "AppShellBrandChevron",
224
+ "props": [
225
+ {
226
+ "name": "absoluteStrokeWidth",
227
+ "type": "boolean",
228
+ "required": false,
229
+ "from": "lucide-react"
230
+ },
231
+ {
232
+ "name": "children",
233
+ "type": "ReactNode",
234
+ "required": false,
235
+ "description": "Content rendered inside the part.",
236
+ "from": "@types/react"
237
+ },
238
+ {
239
+ "name": "className",
240
+ "type": "string",
241
+ "required": false,
242
+ "description": "Extra classes merged into the part's own classes with `cn`.",
243
+ "from": "@types/react"
244
+ },
245
+ {
246
+ "name": "size",
247
+ "type": "string | number",
248
+ "required": false,
249
+ "description": "Size variant; sets a `data-size` attribute.",
250
+ "from": "lucide-react"
251
+ },
252
+ {
253
+ "name": "style",
254
+ "type": "CSSProperties",
255
+ "required": false,
256
+ "description": "Inline styles applied to the rendered element.",
257
+ "from": "@types/react"
258
+ }
259
+ ]
260
+ },
261
+ {
262
+ "name": "AppShellBrandDescription",
263
+ "props": [
264
+ {
265
+ "name": "children",
266
+ "type": "ReactNode",
267
+ "required": false,
268
+ "description": "Content rendered inside the part.",
269
+ "from": "@types/react"
270
+ },
271
+ {
272
+ "name": "className",
273
+ "type": "string",
274
+ "required": false,
275
+ "description": "Extra classes merged into the part's own classes with `cn`.",
276
+ "from": "@types/react"
277
+ },
278
+ {
279
+ "name": "style",
280
+ "type": "CSSProperties",
281
+ "required": false,
282
+ "description": "Inline styles applied to the rendered element.",
283
+ "from": "@types/react"
284
+ }
285
+ ]
286
+ },
287
+ {
288
+ "name": "AppShellBrandLogo",
289
+ "props": [
290
+ {
291
+ "name": "children",
292
+ "type": "ReactNode",
293
+ "required": false,
294
+ "description": "Content rendered inside the part.",
295
+ "from": "@types/react"
296
+ },
297
+ {
298
+ "name": "className",
299
+ "type": "string",
300
+ "required": false,
301
+ "description": "Extra classes merged into the part's own classes with `cn`.",
302
+ "from": "@types/react"
303
+ },
304
+ {
305
+ "name": "style",
306
+ "type": "CSSProperties",
307
+ "required": false,
308
+ "description": "Inline styles applied to the rendered element.",
309
+ "from": "@types/react"
310
+ }
311
+ ]
312
+ },
313
+ {
314
+ "name": "AppShellBrandText",
315
+ "props": [
316
+ {
317
+ "name": "children",
318
+ "type": "ReactNode",
319
+ "required": false,
320
+ "description": "Content rendered inside the part.",
321
+ "from": "@types/react"
322
+ },
323
+ {
324
+ "name": "className",
325
+ "type": "string",
326
+ "required": false,
327
+ "description": "Extra classes merged into the part's own classes with `cn`.",
328
+ "from": "@types/react"
329
+ },
330
+ {
331
+ "name": "style",
332
+ "type": "CSSProperties",
333
+ "required": false,
334
+ "description": "Inline styles applied to the rendered element.",
335
+ "from": "@types/react"
336
+ }
337
+ ]
338
+ },
339
+ {
340
+ "name": "AppShellBrandTitle",
341
+ "props": [
342
+ {
343
+ "name": "children",
344
+ "type": "ReactNode",
345
+ "required": false,
346
+ "description": "Content rendered inside the part.",
347
+ "from": "@types/react"
348
+ },
349
+ {
350
+ "name": "className",
351
+ "type": "string",
352
+ "required": false,
353
+ "description": "Extra classes merged into the part's own classes with `cn`.",
354
+ "from": "@types/react"
355
+ },
356
+ {
357
+ "name": "style",
358
+ "type": "CSSProperties",
359
+ "required": false,
360
+ "description": "Inline styles applied to the rendered element.",
361
+ "from": "@types/react"
362
+ }
363
+ ]
364
+ },
365
+ {
366
+ "name": "AppShellCommandDialog",
367
+ "props": [
368
+ {
369
+ "name": "className",
370
+ "type": "string",
371
+ "required": false,
372
+ "description": "Extra classes merged into the part's own classes with `cn`.",
373
+ "from": "arkcn"
374
+ },
375
+ {
376
+ "name": "description",
377
+ "type": "string",
378
+ "required": false,
379
+ "description": "Description text.",
380
+ "from": "arkcn"
381
+ },
382
+ {
383
+ "name": "showCloseButton",
384
+ "type": "boolean",
385
+ "required": false,
386
+ "description": "Render the close button.",
387
+ "from": "arkcn"
388
+ },
389
+ {
390
+ "name": "title",
391
+ "type": "string",
392
+ "required": false,
393
+ "description": "Title text.",
394
+ "from": "arkcn"
395
+ },
396
+ {
397
+ "name": "aria-label",
398
+ "type": "string",
399
+ "required": false,
400
+ "description": "Human readable label for the dialog, in event the dialog title is not rendered",
401
+ "from": "@zag-js/dialog"
402
+ },
403
+ {
404
+ "name": "children",
405
+ "type": "ReactNode",
406
+ "required": false,
407
+ "description": "Content rendered inside the part.",
408
+ "from": "@ark-ui/react"
409
+ },
410
+ {
411
+ "name": "closeOnEscape",
412
+ "type": "boolean",
413
+ "required": false,
414
+ "default": "true",
415
+ "description": "Whether to close the dialog when the escape key is pressed",
416
+ "from": "@zag-js/dialog"
417
+ },
418
+ {
419
+ "name": "closeOnInteractOutside",
420
+ "type": "boolean",
421
+ "required": false,
422
+ "default": "true",
423
+ "description": "Whether to close the dialog when the outside is clicked",
424
+ "from": "@zag-js/dialog"
425
+ },
426
+ {
427
+ "name": "defaultOpen",
428
+ "type": "boolean",
429
+ "required": false,
430
+ "default": "false",
431
+ "description": "The initial open state of the dialog when rendered.\nUse when you don't need to control the open state of the dialog.",
432
+ "from": "@zag-js/dialog"
433
+ },
434
+ {
435
+ "name": "defaultTriggerValue",
436
+ "type": "string | null",
437
+ "required": false,
438
+ "description": "The initial active trigger value when rendered.\nUse when you don't need to control the active trigger value.",
439
+ "from": "@zag-js/dialog"
440
+ },
441
+ {
442
+ "name": "finalFocusEl",
443
+ "type": "(() => MaybeElement)",
444
+ "required": false,
445
+ "description": "Element to receive focus when the dialog is closed",
446
+ "from": "@zag-js/dialog"
447
+ },
448
+ {
449
+ "name": "hideMode",
450
+ "type": "HideMode",
451
+ "required": false,
452
+ "default": "'display-none'",
453
+ "description": "How to hide content when mounted but not present.\n- `'display-none'`: HTML `hidden` attribute. Effects stay alive.\n- `'activity'`: React 19 `<Activity mode=\"hidden\">`. Effects pause. Requires React 19+.",
454
+ "from": "@ark-ui/react"
455
+ },
456
+ {
457
+ "name": "id",
458
+ "type": "string",
459
+ "required": false,
460
+ "description": "The unique identifier of the machine.",
461
+ "from": "@zag-js/types"
462
+ },
463
+ {
464
+ "name": "ids",
465
+ "type": "ElementIds",
466
+ "required": false,
467
+ "description": "The ids of the elements in the dialog. Useful for composition.",
468
+ "from": "@zag-js/dialog"
469
+ },
470
+ {
471
+ "name": "immediate",
472
+ "type": "boolean",
473
+ "required": false,
474
+ "description": "Whether to synchronize the present change immediately or defer it to the next frame",
475
+ "from": "@zag-js/presence"
476
+ },
477
+ {
478
+ "name": "initialFocusEl",
479
+ "type": "(() => MaybeElement)",
480
+ "required": false,
481
+ "description": "Element to receive focus when the dialog is opened",
482
+ "from": "@zag-js/dialog"
483
+ },
484
+ {
485
+ "name": "lazyMount",
486
+ "type": "boolean",
487
+ "required": false,
488
+ "default": "false",
489
+ "description": "Whether to enable lazy mounting",
490
+ "from": "@ark-ui/react"
491
+ },
492
+ {
493
+ "name": "modal",
494
+ "type": "boolean",
495
+ "required": false,
496
+ "default": "true",
497
+ "description": "Whether to prevent pointer interaction outside the element and hide all content below it",
498
+ "from": "@zag-js/dialog"
499
+ },
500
+ {
501
+ "name": "onEnterComplete",
502
+ "type": "VoidFunction",
503
+ "required": false,
504
+ "description": "Function called when the animation ends in the open state",
505
+ "from": "@zag-js/presence"
506
+ },
507
+ {
508
+ "name": "onEscapeKeyDown",
509
+ "type": "((event: KeyboardEvent) => void)",
510
+ "required": false,
511
+ "description": "Function called when the escape key is pressed",
512
+ "from": "@zag-js/dismissable"
513
+ },
514
+ {
515
+ "name": "onExitComplete",
516
+ "type": "VoidFunction",
517
+ "required": false,
518
+ "description": "Function called when the animation ends in the closed state",
519
+ "from": "@zag-js/presence"
520
+ },
521
+ {
522
+ "name": "onFocusOutside",
523
+ "type": "((event: FocusOutsideEvent) => void)",
524
+ "required": false,
525
+ "description": "Function called when the focus is moved outside the component",
526
+ "from": "@zag-js/interact-outside"
527
+ },
528
+ {
529
+ "name": "onInteractOutside",
530
+ "type": "((event: InteractOutsideEvent) => void)",
531
+ "required": false,
532
+ "description": "Function called when an interaction happens outside the component",
533
+ "from": "@zag-js/interact-outside"
534
+ },
535
+ {
536
+ "name": "onPointerDownOutside",
537
+ "type": "((event: PointerDownOutsideEvent) => void)",
538
+ "required": false,
539
+ "description": "Function called when the pointer is pressed down outside the component",
540
+ "from": "@zag-js/interact-outside"
541
+ },
542
+ {
543
+ "name": "onRequestDismiss",
544
+ "type": "((event: LayerDismissEvent) => void)",
545
+ "required": false,
546
+ "description": "Function called when this layer is closed due to a parent layer being closed",
547
+ "from": "@zag-js/dismissable"
548
+ },
549
+ {
550
+ "name": "onTriggerValueChange",
551
+ "type": "((details: TriggerValueChangeDetails) => void)",
552
+ "required": false,
553
+ "description": "Function to call when the active trigger changes",
554
+ "from": "@zag-js/dialog"
555
+ },
556
+ {
557
+ "name": "persistentElements",
558
+ "type": "(() => Element | null)[]",
559
+ "required": false,
560
+ "description": "Returns the persistent elements that:\n- should not have pointer-events disabled\n- should not trigger the dismiss event",
561
+ "from": "@zag-js/dismissable"
562
+ },
563
+ {
564
+ "name": "present",
565
+ "type": "boolean",
566
+ "required": false,
567
+ "description": "Whether the node is present (controlled by the user)",
568
+ "from": "@zag-js/presence"
569
+ },
570
+ {
571
+ "name": "preventScroll",
572
+ "type": "boolean",
573
+ "required": false,
574
+ "default": "true",
575
+ "description": "Whether to prevent scrolling behind the dialog when it's opened",
576
+ "from": "@zag-js/dialog"
577
+ },
578
+ {
579
+ "name": "restoreFocus",
580
+ "type": "boolean",
581
+ "required": false,
582
+ "description": "Whether to restore focus to the element that had focus before the dialog was opened",
583
+ "from": "@zag-js/dialog"
584
+ },
585
+ {
586
+ "name": "role",
587
+ "type": "\"dialog\" | \"alertdialog\"",
588
+ "required": false,
589
+ "default": "\"dialog\"",
590
+ "description": "The dialog's role",
591
+ "from": "@zag-js/dialog"
592
+ },
593
+ {
594
+ "name": "skipAnimationOnMount",
595
+ "type": "boolean",
596
+ "required": false,
597
+ "default": "false",
598
+ "description": "Whether to allow the initial presence animation.",
599
+ "from": "@ark-ui/react"
600
+ },
601
+ {
602
+ "name": "trapFocus",
603
+ "type": "boolean",
604
+ "required": false,
605
+ "default": "true",
606
+ "description": "Whether to trap focus inside the dialog when it's opened",
607
+ "from": "@zag-js/dialog"
608
+ },
609
+ {
610
+ "name": "triggerValue",
611
+ "type": "string | null",
612
+ "required": false,
613
+ "description": "The controlled active trigger value",
614
+ "from": "@zag-js/dialog"
615
+ },
616
+ {
617
+ "name": "unmountOnExit",
618
+ "type": "boolean",
619
+ "required": false,
620
+ "default": "false",
621
+ "description": "Whether to unmount on exit.",
622
+ "from": "@ark-ui/react"
623
+ }
624
+ ]
625
+ },
626
+ {
627
+ "name": "AppShellContent",
628
+ "props": [
629
+ {
630
+ "name": "children",
631
+ "type": "ReactNode",
632
+ "required": false,
633
+ "description": "Content rendered inside the part.",
634
+ "from": "@types/react"
635
+ },
636
+ {
637
+ "name": "className",
638
+ "type": "string",
639
+ "required": false,
640
+ "description": "Extra classes merged into the part's own classes with `cn`.",
641
+ "from": "@types/react"
642
+ },
643
+ {
644
+ "name": "style",
645
+ "type": "CSSProperties",
646
+ "required": false,
647
+ "description": "Inline styles applied to the rendered element.",
648
+ "from": "@types/react"
649
+ }
650
+ ]
651
+ },
652
+ {
653
+ "name": "AppShellHeader",
654
+ "props": [
655
+ {
656
+ "name": "fixed",
657
+ "type": "boolean",
658
+ "required": false,
659
+ "default": "false",
660
+ "description": "Pin the header, or size the main area to the viewport so the page scrolls inside it.",
661
+ "from": "arkcn"
662
+ },
663
+ {
664
+ "name": "children",
665
+ "type": "ReactNode",
666
+ "required": false,
667
+ "description": "Content rendered inside the part.",
668
+ "from": "@types/react"
669
+ },
670
+ {
671
+ "name": "className",
672
+ "type": "string",
673
+ "required": false,
674
+ "description": "Extra classes merged into the part's own classes with `cn`.",
675
+ "from": "@types/react"
676
+ },
677
+ {
678
+ "name": "style",
679
+ "type": "CSSProperties",
680
+ "required": false,
681
+ "description": "Inline styles applied to the rendered element.",
682
+ "from": "@types/react"
683
+ }
684
+ ]
685
+ },
686
+ {
687
+ "name": "AppShellHeaderActions",
688
+ "props": [
689
+ {
690
+ "name": "children",
691
+ "type": "ReactNode",
692
+ "required": false,
693
+ "description": "Content rendered inside the part.",
694
+ "from": "@types/react"
695
+ },
696
+ {
697
+ "name": "className",
698
+ "type": "string",
699
+ "required": false,
700
+ "description": "Extra classes merged into the part's own classes with `cn`.",
701
+ "from": "@types/react"
702
+ },
703
+ {
704
+ "name": "style",
705
+ "type": "CSSProperties",
706
+ "required": false,
707
+ "description": "Inline styles applied to the rendered element.",
708
+ "from": "@types/react"
709
+ }
710
+ ]
711
+ },
712
+ {
713
+ "name": "AppShellMain",
714
+ "props": [
715
+ {
716
+ "name": "fixed",
717
+ "type": "boolean",
718
+ "required": false,
719
+ "default": "false",
720
+ "description": "Pin the header, or size the main area to the viewport so the page scrolls inside it.",
721
+ "from": "arkcn"
722
+ },
723
+ {
724
+ "name": "fluid",
725
+ "type": "boolean",
726
+ "required": false,
727
+ "default": "false",
728
+ "description": "Let the main area use the full width instead of the content max width.",
729
+ "from": "arkcn"
730
+ },
731
+ {
732
+ "name": "children",
733
+ "type": "ReactNode",
734
+ "required": false,
735
+ "description": "Content rendered inside the part.",
736
+ "from": "@types/react"
737
+ },
738
+ {
739
+ "name": "className",
740
+ "type": "string",
741
+ "required": false,
742
+ "description": "Extra classes merged into the part's own classes with `cn`.",
743
+ "from": "@types/react"
744
+ },
745
+ {
746
+ "name": "style",
747
+ "type": "CSSProperties",
748
+ "required": false,
749
+ "description": "Inline styles applied to the rendered element.",
750
+ "from": "@types/react"
751
+ }
752
+ ]
753
+ },
754
+ {
755
+ "name": "AppShellNav",
756
+ "props": [
757
+ {
758
+ "name": "children",
759
+ "type": "ReactNode",
760
+ "required": false,
761
+ "description": "Content rendered inside the part.",
762
+ "from": "@types/react"
763
+ },
764
+ {
765
+ "name": "className",
766
+ "type": "string",
767
+ "required": false,
768
+ "description": "Extra classes merged into the part's own classes with `cn`.",
769
+ "from": "@types/react"
770
+ },
771
+ {
772
+ "name": "style",
773
+ "type": "CSSProperties",
774
+ "required": false,
775
+ "description": "Inline styles applied to the rendered element.",
776
+ "from": "@types/react"
777
+ }
778
+ ]
779
+ },
780
+ {
781
+ "name": "AppShellNavBadge",
782
+ "props": [
783
+ {
784
+ "name": "asChild",
785
+ "type": "boolean",
786
+ "required": false,
787
+ "description": "Render the child element instead of the default one, merging props and behaviour onto it.",
788
+ "from": "arkcn"
789
+ },
790
+ {
791
+ "name": "variant",
792
+ "type": "\"link\" | \"default\" | \"outline\" | \"secondary\" | \"ghost\" | \"destructive\" | null",
793
+ "required": false,
794
+ "description": "Visual variant, styled with `cva`; sets a `data-variant` attribute.",
795
+ "from": "arkcn"
796
+ },
797
+ {
798
+ "name": "children",
799
+ "type": "ReactNode",
800
+ "required": false,
801
+ "description": "Content rendered inside the part.",
802
+ "from": "@types/react"
803
+ },
804
+ {
805
+ "name": "className",
806
+ "type": "string",
807
+ "required": false,
808
+ "description": "Extra classes merged into the part's own classes with `cn`.",
809
+ "from": "@types/react"
810
+ },
811
+ {
812
+ "name": "style",
813
+ "type": "CSSProperties",
814
+ "required": false,
815
+ "description": "Inline styles applied to the rendered element.",
816
+ "from": "@types/react"
817
+ }
818
+ ]
819
+ },
820
+ {
821
+ "name": "AppShellNavCollapsible",
822
+ "props": [
823
+ {
824
+ "name": "trigger",
825
+ "type": "ReactNode",
826
+ "required": true,
827
+ "description": "Element rendered as the trigger for the collapsible group.",
828
+ "from": "arkcn"
829
+ },
830
+ {
831
+ "name": "active",
832
+ "type": "boolean",
833
+ "required": false,
834
+ "default": "false",
835
+ "description": "Whether the part is the active one; sets `data-active`.",
836
+ "from": "arkcn"
837
+ },
838
+ {
839
+ "name": "defaultOpen",
840
+ "type": "boolean",
841
+ "required": false,
842
+ "description": "The initial open state when uncontrolled.",
843
+ "from": "arkcn"
844
+ },
845
+ {
846
+ "name": "menu",
847
+ "type": "ReactNode",
848
+ "required": false,
849
+ "description": "Rendered inside the flyout when the sidebar is collapsed to icons.",
850
+ "from": "arkcn"
851
+ },
852
+ {
853
+ "name": "tooltip",
854
+ "type": "string",
855
+ "required": false,
856
+ "description": "Tooltip content shown on hover, or `false` to disable it.",
857
+ "from": "arkcn"
858
+ },
859
+ {
860
+ "name": "children",
861
+ "type": "ReactNode",
862
+ "required": false,
863
+ "description": "Content rendered inside the part.",
864
+ "from": "@types/react"
865
+ },
866
+ {
867
+ "name": "className",
868
+ "type": "string",
869
+ "required": false,
870
+ "description": "Extra classes merged into the part's own classes with `cn`.",
871
+ "from": "@types/react"
872
+ },
873
+ {
874
+ "name": "style",
875
+ "type": "CSSProperties",
876
+ "required": false,
877
+ "description": "Inline styles applied to the rendered element.",
878
+ "from": "@types/react"
879
+ }
880
+ ]
881
+ },
882
+ {
883
+ "name": "AppShellNavItem",
884
+ "props": [
885
+ {
886
+ "name": "children",
887
+ "type": "ReactNode",
888
+ "required": false,
889
+ "description": "Content rendered inside the part.",
890
+ "from": "@types/react"
891
+ },
892
+ {
893
+ "name": "className",
894
+ "type": "string",
895
+ "required": false,
896
+ "description": "Extra classes merged into the part's own classes with `cn`.",
897
+ "from": "@types/react"
898
+ },
899
+ {
900
+ "name": "style",
901
+ "type": "CSSProperties",
902
+ "required": false,
903
+ "description": "Inline styles applied to the rendered element.",
904
+ "from": "@types/react"
905
+ }
906
+ ]
907
+ },
908
+ {
909
+ "name": "AppShellNavLabel",
910
+ "props": [
911
+ {
912
+ "name": "asChild",
913
+ "type": "boolean",
914
+ "required": false,
915
+ "description": "Render the child element instead of the default one, merging props and behaviour onto it.",
916
+ "from": "arkcn"
917
+ },
918
+ {
919
+ "name": "children",
920
+ "type": "ReactNode",
921
+ "required": false,
922
+ "description": "Content rendered inside the part.",
923
+ "from": "@types/react"
924
+ },
925
+ {
926
+ "name": "className",
927
+ "type": "string",
928
+ "required": false,
929
+ "description": "Extra classes merged into the part's own classes with `cn`.",
930
+ "from": "@types/react"
931
+ },
932
+ {
933
+ "name": "style",
934
+ "type": "CSSProperties",
935
+ "required": false,
936
+ "description": "Inline styles applied to the rendered element.",
937
+ "from": "@types/react"
938
+ }
939
+ ]
940
+ },
941
+ {
942
+ "name": "AppShellNavLink",
943
+ "props": [
944
+ {
945
+ "name": "active",
946
+ "type": "boolean",
947
+ "required": false,
948
+ "default": "false",
949
+ "description": "Whether the part is the active one; sets `data-active`.",
950
+ "from": "arkcn"
951
+ },
952
+ {
953
+ "name": "asChild",
954
+ "type": "boolean",
955
+ "required": false,
956
+ "default": "true",
957
+ "description": "Render the child element instead of the default one, merging props and behaviour onto it.",
958
+ "from": "arkcn"
959
+ },
960
+ {
961
+ "name": "size",
962
+ "type": "\"default\" | \"sm\" | \"lg\" | null",
963
+ "required": false,
964
+ "description": "Size variant; sets a `data-size` attribute.",
965
+ "from": "arkcn"
966
+ },
967
+ {
968
+ "name": "tooltip",
969
+ "type": "string | (TooltipContentProps & RefAttributes<HTMLDivElement>)",
970
+ "required": false,
971
+ "description": "Tooltip content shown on hover, or `false` to disable it.",
972
+ "from": "arkcn"
973
+ },
974
+ {
975
+ "name": "variant",
976
+ "type": "\"default\" | \"outline\" | null",
977
+ "required": false,
978
+ "description": "Visual variant, styled with `cva`; sets a `data-variant` attribute.",
979
+ "from": "arkcn"
980
+ },
981
+ {
982
+ "name": "children",
983
+ "type": "ReactNode",
984
+ "required": false,
985
+ "description": "Content rendered inside the part.",
986
+ "from": "@types/react"
987
+ },
988
+ {
989
+ "name": "className",
990
+ "type": "string",
991
+ "required": false,
992
+ "description": "Extra classes merged into the part's own classes with `cn`.",
993
+ "from": "@types/react"
994
+ },
995
+ {
996
+ "name": "style",
997
+ "type": "CSSProperties",
998
+ "required": false,
999
+ "description": "Inline styles applied to the rendered element.",
1000
+ "from": "@types/react"
1001
+ }
1002
+ ]
1003
+ },
1004
+ {
1005
+ "name": "AppShellNavList",
1006
+ "props": [
1007
+ {
1008
+ "name": "children",
1009
+ "type": "ReactNode",
1010
+ "required": false,
1011
+ "description": "Content rendered inside the part.",
1012
+ "from": "@types/react"
1013
+ },
1014
+ {
1015
+ "name": "className",
1016
+ "type": "string",
1017
+ "required": false,
1018
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1019
+ "from": "@types/react"
1020
+ },
1021
+ {
1022
+ "name": "style",
1023
+ "type": "CSSProperties",
1024
+ "required": false,
1025
+ "description": "Inline styles applied to the rendered element.",
1026
+ "from": "@types/react"
1027
+ }
1028
+ ]
1029
+ },
1030
+ {
1031
+ "name": "AppShellNavMenuLink",
1032
+ "props": [
1033
+ {
1034
+ "name": "active",
1035
+ "type": "boolean",
1036
+ "required": false,
1037
+ "default": "false",
1038
+ "description": "Whether the part is the active one; sets `data-active`.",
1039
+ "from": "arkcn"
1040
+ },
1041
+ {
1042
+ "name": "inset",
1043
+ "type": "boolean",
1044
+ "required": false,
1045
+ "description": "Indent the item to align with items that have an indicator.",
1046
+ "from": "arkcn"
1047
+ },
1048
+ {
1049
+ "name": "value",
1050
+ "type": "string",
1051
+ "required": false,
1052
+ "description": "The controlled value.",
1053
+ "from": "arkcn"
1054
+ },
1055
+ {
1056
+ "name": "variant",
1057
+ "type": "\"default\" | \"destructive\"",
1058
+ "required": false,
1059
+ "description": "Visual variant, styled with `cva`; sets a `data-variant` attribute.",
1060
+ "from": "arkcn"
1061
+ },
1062
+ {
1063
+ "name": "asChild",
1064
+ "type": "boolean",
1065
+ "required": false,
1066
+ "default": "true",
1067
+ "description": "Use the provided child element as the default rendered element, combining their props and behavior.",
1068
+ "from": "@ark-ui/react"
1069
+ },
1070
+ {
1071
+ "name": "children",
1072
+ "type": "ReactNode",
1073
+ "required": false,
1074
+ "description": "Content rendered inside the part.",
1075
+ "from": "@types/react"
1076
+ },
1077
+ {
1078
+ "name": "className",
1079
+ "type": "string",
1080
+ "required": false,
1081
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1082
+ "from": "@types/react"
1083
+ },
1084
+ {
1085
+ "name": "closeOnSelect",
1086
+ "type": "boolean",
1087
+ "required": false,
1088
+ "description": "Whether the menu should be closed when the option is selected.",
1089
+ "from": "@zag-js/menu"
1090
+ },
1091
+ {
1092
+ "name": "disabled",
1093
+ "type": "boolean",
1094
+ "required": false,
1095
+ "description": "Whether the menu item is disabled",
1096
+ "from": "@zag-js/menu"
1097
+ },
1098
+ {
1099
+ "name": "onSelect",
1100
+ "type": "VoidFunction",
1101
+ "required": false,
1102
+ "description": "The function to call when the item is selected",
1103
+ "from": "@ark-ui/react"
1104
+ },
1105
+ {
1106
+ "name": "style",
1107
+ "type": "CSSProperties",
1108
+ "required": false,
1109
+ "description": "Inline styles applied to the rendered element.",
1110
+ "from": "@types/react"
1111
+ },
1112
+ {
1113
+ "name": "valueText",
1114
+ "type": "string",
1115
+ "required": false,
1116
+ "description": "The textual value of the option. Used in typeahead navigation of the menu.\nIf not provided, the text content of the menu item will be used.",
1117
+ "from": "@zag-js/menu"
1118
+ }
1119
+ ]
1120
+ },
1121
+ {
1122
+ "name": "AppShellNavSubItem",
1123
+ "props": [
1124
+ {
1125
+ "name": "children",
1126
+ "type": "ReactNode",
1127
+ "required": false,
1128
+ "description": "Content rendered inside the part.",
1129
+ "from": "@types/react"
1130
+ },
1131
+ {
1132
+ "name": "className",
1133
+ "type": "string",
1134
+ "required": false,
1135
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1136
+ "from": "@types/react"
1137
+ },
1138
+ {
1139
+ "name": "style",
1140
+ "type": "CSSProperties",
1141
+ "required": false,
1142
+ "description": "Inline styles applied to the rendered element.",
1143
+ "from": "@types/react"
1144
+ }
1145
+ ]
1146
+ },
1147
+ {
1148
+ "name": "AppShellNavSubLink",
1149
+ "props": [
1150
+ {
1151
+ "name": "active",
1152
+ "type": "boolean",
1153
+ "required": false,
1154
+ "default": "false",
1155
+ "description": "Whether the part is the active one; sets `data-active`.",
1156
+ "from": "arkcn"
1157
+ },
1158
+ {
1159
+ "name": "asChild",
1160
+ "type": "boolean",
1161
+ "required": false,
1162
+ "default": "true",
1163
+ "description": "Render the child element instead of the default one, merging props and behaviour onto it.",
1164
+ "from": "arkcn"
1165
+ },
1166
+ {
1167
+ "name": "size",
1168
+ "type": "\"sm\" | \"md\"",
1169
+ "required": false,
1170
+ "description": "Size variant; sets a `data-size` attribute.",
1171
+ "from": "arkcn"
1172
+ },
1173
+ {
1174
+ "name": "children",
1175
+ "type": "ReactNode",
1176
+ "required": false,
1177
+ "description": "Content rendered inside the part.",
1178
+ "from": "@types/react"
1179
+ },
1180
+ {
1181
+ "name": "className",
1182
+ "type": "string",
1183
+ "required": false,
1184
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1185
+ "from": "@types/react"
1186
+ },
1187
+ {
1188
+ "name": "style",
1189
+ "type": "CSSProperties",
1190
+ "required": false,
1191
+ "description": "Inline styles applied to the rendered element.",
1192
+ "from": "@types/react"
1193
+ }
1194
+ ]
1195
+ },
1196
+ {
1197
+ "name": "AppShellNotificationItem",
1198
+ "props": [
1199
+ {
1200
+ "name": "asChild",
1201
+ "type": "boolean",
1202
+ "required": false,
1203
+ "description": "Render the item's child (e.g. an anchor or button) as the interactive surface.",
1204
+ "from": "arkcn"
1205
+ },
1206
+ {
1207
+ "name": "unread",
1208
+ "type": "boolean",
1209
+ "required": false,
1210
+ "description": "Mark the notification unread; sets `data-unread` and shows the indicator.",
1211
+ "from": "arkcn"
1212
+ },
1213
+ {
1214
+ "name": "children",
1215
+ "type": "ReactNode",
1216
+ "required": false,
1217
+ "description": "Content rendered inside the part.",
1218
+ "from": "@types/react"
1219
+ },
1220
+ {
1221
+ "name": "className",
1222
+ "type": "string",
1223
+ "required": false,
1224
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1225
+ "from": "@types/react"
1226
+ },
1227
+ {
1228
+ "name": "style",
1229
+ "type": "CSSProperties",
1230
+ "required": false,
1231
+ "description": "Inline styles applied to the rendered element.",
1232
+ "from": "@types/react"
1233
+ }
1234
+ ]
1235
+ },
1236
+ {
1237
+ "name": "AppShellNotificationItemContent",
1238
+ "props": [
1239
+ {
1240
+ "name": "children",
1241
+ "type": "ReactNode",
1242
+ "required": false,
1243
+ "description": "Content rendered inside the part.",
1244
+ "from": "@types/react"
1245
+ },
1246
+ {
1247
+ "name": "className",
1248
+ "type": "string",
1249
+ "required": false,
1250
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1251
+ "from": "@types/react"
1252
+ },
1253
+ {
1254
+ "name": "style",
1255
+ "type": "CSSProperties",
1256
+ "required": false,
1257
+ "description": "Inline styles applied to the rendered element.",
1258
+ "from": "@types/react"
1259
+ }
1260
+ ]
1261
+ },
1262
+ {
1263
+ "name": "AppShellNotificationItemDescription",
1264
+ "props": [
1265
+ {
1266
+ "name": "children",
1267
+ "type": "ReactNode",
1268
+ "required": false,
1269
+ "description": "Content rendered inside the part.",
1270
+ "from": "@types/react"
1271
+ },
1272
+ {
1273
+ "name": "className",
1274
+ "type": "string",
1275
+ "required": false,
1276
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1277
+ "from": "@types/react"
1278
+ },
1279
+ {
1280
+ "name": "style",
1281
+ "type": "CSSProperties",
1282
+ "required": false,
1283
+ "description": "Inline styles applied to the rendered element.",
1284
+ "from": "@types/react"
1285
+ }
1286
+ ]
1287
+ },
1288
+ {
1289
+ "name": "AppShellNotificationItemIcon",
1290
+ "props": [
1291
+ {
1292
+ "name": "children",
1293
+ "type": "ReactNode",
1294
+ "required": false,
1295
+ "description": "Content rendered inside the part.",
1296
+ "from": "@types/react"
1297
+ },
1298
+ {
1299
+ "name": "className",
1300
+ "type": "string",
1301
+ "required": false,
1302
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1303
+ "from": "@types/react"
1304
+ },
1305
+ {
1306
+ "name": "style",
1307
+ "type": "CSSProperties",
1308
+ "required": false,
1309
+ "description": "Inline styles applied to the rendered element.",
1310
+ "from": "@types/react"
1311
+ }
1312
+ ]
1313
+ },
1314
+ {
1315
+ "name": "AppShellNotificationItemIndicator",
1316
+ "props": [
1317
+ {
1318
+ "name": "children",
1319
+ "type": "ReactNode",
1320
+ "required": false,
1321
+ "description": "Content rendered inside the part.",
1322
+ "from": "@types/react"
1323
+ },
1324
+ {
1325
+ "name": "className",
1326
+ "type": "string",
1327
+ "required": false,
1328
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1329
+ "from": "@types/react"
1330
+ },
1331
+ {
1332
+ "name": "style",
1333
+ "type": "CSSProperties",
1334
+ "required": false,
1335
+ "description": "Inline styles applied to the rendered element.",
1336
+ "from": "@types/react"
1337
+ }
1338
+ ]
1339
+ },
1340
+ {
1341
+ "name": "AppShellNotificationItemTime",
1342
+ "props": [
1343
+ {
1344
+ "name": "children",
1345
+ "type": "ReactNode",
1346
+ "required": false,
1347
+ "description": "Content rendered inside the part.",
1348
+ "from": "@types/react"
1349
+ },
1350
+ {
1351
+ "name": "className",
1352
+ "type": "string",
1353
+ "required": false,
1354
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1355
+ "from": "@types/react"
1356
+ },
1357
+ {
1358
+ "name": "style",
1359
+ "type": "CSSProperties",
1360
+ "required": false,
1361
+ "description": "Inline styles applied to the rendered element.",
1362
+ "from": "@types/react"
1363
+ }
1364
+ ]
1365
+ },
1366
+ {
1367
+ "name": "AppShellNotificationItemTitle",
1368
+ "props": [
1369
+ {
1370
+ "name": "children",
1371
+ "type": "ReactNode",
1372
+ "required": false,
1373
+ "description": "Content rendered inside the part.",
1374
+ "from": "@types/react"
1375
+ },
1376
+ {
1377
+ "name": "className",
1378
+ "type": "string",
1379
+ "required": false,
1380
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1381
+ "from": "@types/react"
1382
+ },
1383
+ {
1384
+ "name": "style",
1385
+ "type": "CSSProperties",
1386
+ "required": false,
1387
+ "description": "Inline styles applied to the rendered element.",
1388
+ "from": "@types/react"
1389
+ }
1390
+ ]
1391
+ },
1392
+ {
1393
+ "name": "AppShellNotifications",
1394
+ "props": [
1395
+ {
1396
+ "name": "autoFocus",
1397
+ "type": "boolean",
1398
+ "required": false,
1399
+ "default": "true",
1400
+ "description": "Whether to automatically set focus on the first focusable\ncontent within the popover when opened.",
1401
+ "from": "@zag-js/popover"
1402
+ },
1403
+ {
1404
+ "name": "children",
1405
+ "type": "ReactNode",
1406
+ "required": false,
1407
+ "description": "Content rendered inside the part.",
1408
+ "from": "@ark-ui/react"
1409
+ },
1410
+ {
1411
+ "name": "closeOnEscape",
1412
+ "type": "boolean",
1413
+ "required": false,
1414
+ "default": "true",
1415
+ "description": "Whether to close the popover when the escape key is pressed.",
1416
+ "from": "@zag-js/popover"
1417
+ },
1418
+ {
1419
+ "name": "closeOnInteractOutside",
1420
+ "type": "boolean",
1421
+ "required": false,
1422
+ "default": "true",
1423
+ "description": "Whether to close the popover when the user clicks outside of the popover.",
1424
+ "from": "@zag-js/popover"
1425
+ },
1426
+ {
1427
+ "name": "defaultOpen",
1428
+ "type": "boolean",
1429
+ "required": false,
1430
+ "description": "The initial open state of the popover when rendered.\nUse when you don't need to control the open state of the popover.",
1431
+ "from": "@zag-js/popover"
1432
+ },
1433
+ {
1434
+ "name": "defaultTriggerValue",
1435
+ "type": "string | null",
1436
+ "required": false,
1437
+ "description": "The initial trigger value when rendered.\nUse when you don't need to control the trigger value.",
1438
+ "from": "@zag-js/popover"
1439
+ },
1440
+ {
1441
+ "name": "finalFocusEl",
1442
+ "type": "(() => MaybeElement)",
1443
+ "required": false,
1444
+ "description": "Element to receive focus when the popover is closed.",
1445
+ "from": "@zag-js/popover"
1446
+ },
1447
+ {
1448
+ "name": "hideMode",
1449
+ "type": "HideMode",
1450
+ "required": false,
1451
+ "default": "'display-none'",
1452
+ "description": "How to hide content when mounted but not present.\n- `'display-none'`: HTML `hidden` attribute. Effects stay alive.\n- `'activity'`: React 19 `<Activity mode=\"hidden\">`. Effects pause. Requires React 19+.",
1453
+ "from": "@ark-ui/react"
1454
+ },
1455
+ {
1456
+ "name": "id",
1457
+ "type": "string",
1458
+ "required": false,
1459
+ "description": "The unique identifier of the machine.",
1460
+ "from": "@zag-js/types"
1461
+ },
1462
+ {
1463
+ "name": "ids",
1464
+ "type": "ElementIds",
1465
+ "required": false,
1466
+ "description": "The ids of the elements in the popover. Useful for composition.",
1467
+ "from": "@zag-js/popover"
1468
+ },
1469
+ {
1470
+ "name": "immediate",
1471
+ "type": "boolean",
1472
+ "required": false,
1473
+ "description": "Whether to synchronize the present change immediately or defer it to the next frame",
1474
+ "from": "@zag-js/presence"
1475
+ },
1476
+ {
1477
+ "name": "initialFocusEl",
1478
+ "type": "(() => HTMLElement | null)",
1479
+ "required": false,
1480
+ "description": "The element to focus on when the popover is opened.",
1481
+ "from": "@zag-js/popover"
1482
+ },
1483
+ {
1484
+ "name": "lazyMount",
1485
+ "type": "boolean",
1486
+ "required": false,
1487
+ "default": "false",
1488
+ "description": "Whether to enable lazy mounting",
1489
+ "from": "@ark-ui/react"
1490
+ },
1491
+ {
1492
+ "name": "modal",
1493
+ "type": "boolean",
1494
+ "required": false,
1495
+ "default": "false",
1496
+ "description": "Whether the popover should be modal. When set to `true`:\n- interaction with outside elements will be disabled\n- only popover content will be visible to screen readers\n- scrolling is blocked\n- focus is trapped within the popover",
1497
+ "from": "@zag-js/popover"
1498
+ },
1499
+ {
1500
+ "name": "onEnterComplete",
1501
+ "type": "VoidFunction",
1502
+ "required": false,
1503
+ "description": "Function called when the animation ends in the open state",
1504
+ "from": "@zag-js/presence"
1505
+ },
1506
+ {
1507
+ "name": "onEscapeKeyDown",
1508
+ "type": "((event: KeyboardEvent) => void)",
1509
+ "required": false,
1510
+ "description": "Function called when the escape key is pressed",
1511
+ "from": "@zag-js/dismissable"
1512
+ },
1513
+ {
1514
+ "name": "onExitComplete",
1515
+ "type": "VoidFunction",
1516
+ "required": false,
1517
+ "description": "Function called when the animation ends in the closed state",
1518
+ "from": "@zag-js/presence"
1519
+ },
1520
+ {
1521
+ "name": "onFocusOutside",
1522
+ "type": "((event: FocusOutsideEvent) => void)",
1523
+ "required": false,
1524
+ "description": "Function called when the focus is moved outside the component",
1525
+ "from": "@zag-js/interact-outside"
1526
+ },
1527
+ {
1528
+ "name": "onInteractOutside",
1529
+ "type": "((event: InteractOutsideEvent) => void)",
1530
+ "required": false,
1531
+ "description": "Function called when an interaction happens outside the component",
1532
+ "from": "@zag-js/interact-outside"
1533
+ },
1534
+ {
1535
+ "name": "onOpenChange",
1536
+ "type": "((details: OpenChangeDetails) => void)",
1537
+ "required": false,
1538
+ "description": "Function invoked when the popover opens or closes",
1539
+ "from": "@zag-js/popover"
1540
+ },
1541
+ {
1542
+ "name": "onPointerDownOutside",
1543
+ "type": "((event: PointerDownOutsideEvent) => void)",
1544
+ "required": false,
1545
+ "description": "Function called when the pointer is pressed down outside the component",
1546
+ "from": "@zag-js/interact-outside"
1547
+ },
1548
+ {
1549
+ "name": "onRequestDismiss",
1550
+ "type": "((event: LayerDismissEvent) => void)",
1551
+ "required": false,
1552
+ "description": "Function called when this layer is closed due to a parent layer being closed",
1553
+ "from": "@zag-js/dismissable"
1554
+ },
1555
+ {
1556
+ "name": "onTriggerValueChange",
1557
+ "type": "((details: TriggerValueChangeDetails) => void)",
1558
+ "required": false,
1559
+ "description": "Function called when the trigger value changes.",
1560
+ "from": "@zag-js/popover"
1561
+ },
1562
+ {
1563
+ "name": "open",
1564
+ "type": "boolean",
1565
+ "required": false,
1566
+ "description": "The controlled open state of the popover",
1567
+ "from": "@zag-js/popover"
1568
+ },
1569
+ {
1570
+ "name": "persistentElements",
1571
+ "type": "(() => Element | null)[]",
1572
+ "required": false,
1573
+ "description": "Returns the persistent elements that:\n- should not have pointer-events disabled\n- should not trigger the dismiss event",
1574
+ "from": "@zag-js/dismissable"
1575
+ },
1576
+ {
1577
+ "name": "portalled",
1578
+ "type": "boolean",
1579
+ "required": false,
1580
+ "default": "true",
1581
+ "description": "Whether the popover is portalled. This will proxy the tabbing behavior regardless of the DOM position\nof the popover content.",
1582
+ "from": "@zag-js/popover"
1583
+ },
1584
+ {
1585
+ "name": "positioning",
1586
+ "type": "PositioningOptions",
1587
+ "required": false,
1588
+ "description": "The user provided options used to position the popover content",
1589
+ "from": "@zag-js/popover"
1590
+ },
1591
+ {
1592
+ "name": "present",
1593
+ "type": "boolean",
1594
+ "required": false,
1595
+ "description": "Whether the node is present (controlled by the user)",
1596
+ "from": "@zag-js/presence"
1597
+ },
1598
+ {
1599
+ "name": "restoreFocus",
1600
+ "type": "boolean",
1601
+ "required": false,
1602
+ "default": "true",
1603
+ "description": "Whether to restore focus to the element that had focus before the popover was opened.",
1604
+ "from": "@zag-js/popover"
1605
+ },
1606
+ {
1607
+ "name": "skipAnimationOnMount",
1608
+ "type": "boolean",
1609
+ "required": false,
1610
+ "default": "false",
1611
+ "description": "Whether to allow the initial presence animation.",
1612
+ "from": "@ark-ui/react"
1613
+ },
1614
+ {
1615
+ "name": "translations",
1616
+ "type": "IntlTranslations",
1617
+ "required": false,
1618
+ "description": "Specifies the localized strings that identifies the accessibility elements and their states",
1619
+ "from": "@zag-js/popover"
1620
+ },
1621
+ {
1622
+ "name": "triggerValue",
1623
+ "type": "string | null",
1624
+ "required": false,
1625
+ "description": "The controlled trigger value",
1626
+ "from": "@zag-js/popover"
1627
+ },
1628
+ {
1629
+ "name": "unmountOnExit",
1630
+ "type": "boolean",
1631
+ "required": false,
1632
+ "default": "false",
1633
+ "description": "Whether to unmount on exit.",
1634
+ "from": "@ark-ui/react"
1635
+ }
1636
+ ]
1637
+ },
1638
+ {
1639
+ "name": "AppShellNotificationsActionTrigger",
1640
+ "props": [
1641
+ {
1642
+ "name": "asChild",
1643
+ "type": "boolean",
1644
+ "required": false,
1645
+ "description": "Render the child element instead of the default one, merging props and behaviour onto it.",
1646
+ "from": "arkcn"
1647
+ },
1648
+ {
1649
+ "name": "size",
1650
+ "type": "\"default\" | \"xs\" | \"sm\" | \"lg\" | \"icon\" | \"icon-xs\" | \"icon-sm\" | \"icon-lg\" | null",
1651
+ "required": false,
1652
+ "default": "\"sm\"",
1653
+ "description": "Size variant; sets a `data-size` attribute.",
1654
+ "from": "arkcn"
1655
+ },
1656
+ {
1657
+ "name": "variant",
1658
+ "type": "\"link\" | \"default\" | \"outline\" | \"secondary\" | \"ghost\" | \"destructive\" | null",
1659
+ "required": false,
1660
+ "default": "\"link\"",
1661
+ "description": "Visual variant, styled with `cva`; sets a `data-variant` attribute.",
1662
+ "from": "arkcn"
1663
+ },
1664
+ {
1665
+ "name": "children",
1666
+ "type": "ReactNode",
1667
+ "required": false,
1668
+ "description": "Content rendered inside the part.",
1669
+ "from": "@types/react"
1670
+ },
1671
+ {
1672
+ "name": "className",
1673
+ "type": "string",
1674
+ "required": false,
1675
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1676
+ "from": "@types/react"
1677
+ },
1678
+ {
1679
+ "name": "style",
1680
+ "type": "CSSProperties",
1681
+ "required": false,
1682
+ "description": "Inline styles applied to the rendered element.",
1683
+ "from": "@types/react"
1684
+ }
1685
+ ]
1686
+ },
1687
+ {
1688
+ "name": "AppShellNotificationsContent",
1689
+ "props": [
1690
+ {
1691
+ "name": "asChild",
1692
+ "type": "boolean",
1693
+ "required": false,
1694
+ "description": "Use the provided child element as the default rendered element, combining their props and behavior.",
1695
+ "from": "@ark-ui/react"
1696
+ },
1697
+ {
1698
+ "name": "children",
1699
+ "type": "ReactNode",
1700
+ "required": false,
1701
+ "description": "Content rendered inside the part.",
1702
+ "from": "@types/react"
1703
+ },
1704
+ {
1705
+ "name": "className",
1706
+ "type": "string",
1707
+ "required": false,
1708
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1709
+ "from": "@types/react"
1710
+ },
1711
+ {
1712
+ "name": "style",
1713
+ "type": "CSSProperties",
1714
+ "required": false,
1715
+ "description": "Inline styles applied to the rendered element.",
1716
+ "from": "@types/react"
1717
+ }
1718
+ ]
1719
+ },
1720
+ {
1721
+ "name": "AppShellNotificationsEmpty",
1722
+ "props": [
1723
+ {
1724
+ "name": "children",
1725
+ "type": "ReactNode",
1726
+ "required": false,
1727
+ "description": "Content rendered inside the part.",
1728
+ "from": "@types/react"
1729
+ },
1730
+ {
1731
+ "name": "className",
1732
+ "type": "string",
1733
+ "required": false,
1734
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1735
+ "from": "@types/react"
1736
+ },
1737
+ {
1738
+ "name": "style",
1739
+ "type": "CSSProperties",
1740
+ "required": false,
1741
+ "description": "Inline styles applied to the rendered element.",
1742
+ "from": "@types/react"
1743
+ }
1744
+ ]
1745
+ },
1746
+ {
1747
+ "name": "AppShellNotificationsFooter",
1748
+ "props": [
1749
+ {
1750
+ "name": "children",
1751
+ "type": "ReactNode",
1752
+ "required": false,
1753
+ "description": "Content rendered inside the part.",
1754
+ "from": "@types/react"
1755
+ },
1756
+ {
1757
+ "name": "className",
1758
+ "type": "string",
1759
+ "required": false,
1760
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1761
+ "from": "@types/react"
1762
+ },
1763
+ {
1764
+ "name": "style",
1765
+ "type": "CSSProperties",
1766
+ "required": false,
1767
+ "description": "Inline styles applied to the rendered element.",
1768
+ "from": "@types/react"
1769
+ }
1770
+ ]
1771
+ },
1772
+ {
1773
+ "name": "AppShellNotificationsHeader",
1774
+ "props": [
1775
+ {
1776
+ "name": "children",
1777
+ "type": "ReactNode",
1778
+ "required": false,
1779
+ "description": "Content rendered inside the part.",
1780
+ "from": "@types/react"
1781
+ },
1782
+ {
1783
+ "name": "className",
1784
+ "type": "string",
1785
+ "required": false,
1786
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1787
+ "from": "@types/react"
1788
+ },
1789
+ {
1790
+ "name": "style",
1791
+ "type": "CSSProperties",
1792
+ "required": false,
1793
+ "description": "Inline styles applied to the rendered element.",
1794
+ "from": "@types/react"
1795
+ }
1796
+ ]
1797
+ },
1798
+ {
1799
+ "name": "AppShellNotificationsList",
1800
+ "props": [
1801
+ {
1802
+ "name": "children",
1803
+ "type": "ReactNode",
1804
+ "required": false,
1805
+ "description": "Content rendered inside the part.",
1806
+ "from": "@types/react"
1807
+ },
1808
+ {
1809
+ "name": "className",
1810
+ "type": "string",
1811
+ "required": false,
1812
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1813
+ "from": "@types/react"
1814
+ },
1815
+ {
1816
+ "name": "style",
1817
+ "type": "CSSProperties",
1818
+ "required": false,
1819
+ "description": "Inline styles applied to the rendered element.",
1820
+ "from": "@types/react"
1821
+ }
1822
+ ]
1823
+ },
1824
+ {
1825
+ "name": "AppShellNotificationsTitle",
1826
+ "props": [
1827
+ {
1828
+ "name": "children",
1829
+ "type": "ReactNode",
1830
+ "required": false,
1831
+ "description": "Content rendered inside the part.",
1832
+ "from": "@types/react"
1833
+ },
1834
+ {
1835
+ "name": "className",
1836
+ "type": "string",
1837
+ "required": false,
1838
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1839
+ "from": "@types/react"
1840
+ },
1841
+ {
1842
+ "name": "style",
1843
+ "type": "CSSProperties",
1844
+ "required": false,
1845
+ "description": "Inline styles applied to the rendered element.",
1846
+ "from": "@types/react"
1847
+ }
1848
+ ]
1849
+ },
1850
+ {
1851
+ "name": "AppShellNotificationsTrigger",
1852
+ "props": [
1853
+ {
1854
+ "name": "asChild",
1855
+ "type": "boolean",
1856
+ "required": false,
1857
+ "description": "Render the child element instead of the default one, merging props and behaviour onto it.",
1858
+ "from": "arkcn"
1859
+ },
1860
+ {
1861
+ "name": "count",
1862
+ "type": "number",
1863
+ "required": false,
1864
+ "default": "0",
1865
+ "description": "Unread count shown as a badge; hidden when 0.",
1866
+ "from": "arkcn"
1867
+ },
1868
+ {
1869
+ "name": "max",
1870
+ "type": "number",
1871
+ "required": false,
1872
+ "default": "99",
1873
+ "description": "Cap for the badge count; larger counts render as `max+`.",
1874
+ "from": "arkcn"
1875
+ },
1876
+ {
1877
+ "name": "size",
1878
+ "type": "\"default\" | \"xs\" | \"sm\" | \"lg\" | \"icon\" | \"icon-xs\" | \"icon-sm\" | \"icon-lg\" | null",
1879
+ "required": false,
1880
+ "description": "Size variant; sets a `data-size` attribute.",
1881
+ "from": "arkcn"
1882
+ },
1883
+ {
1884
+ "name": "variant",
1885
+ "type": "\"link\" | \"default\" | \"outline\" | \"secondary\" | \"ghost\" | \"destructive\" | null",
1886
+ "required": false,
1887
+ "description": "Visual variant, styled with `cva`; sets a `data-variant` attribute.",
1888
+ "from": "arkcn"
1889
+ },
1890
+ {
1891
+ "name": "children",
1892
+ "type": "ReactNode",
1893
+ "required": false,
1894
+ "description": "Content rendered inside the part.",
1895
+ "from": "@types/react"
1896
+ },
1897
+ {
1898
+ "name": "className",
1899
+ "type": "string",
1900
+ "required": false,
1901
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1902
+ "from": "@types/react"
1903
+ },
1904
+ {
1905
+ "name": "style",
1906
+ "type": "CSSProperties",
1907
+ "required": false,
1908
+ "description": "Inline styles applied to the rendered element.",
1909
+ "from": "@types/react"
1910
+ }
1911
+ ]
1912
+ },
1913
+ {
1914
+ "name": "AppShellSearch",
1915
+ "props": [
1916
+ {
1917
+ "name": "asChild",
1918
+ "type": "boolean",
1919
+ "required": false,
1920
+ "description": "Render the child element instead of the default one, merging props and behaviour onto it.",
1921
+ "from": "arkcn"
1922
+ },
1923
+ {
1924
+ "name": "placeholder",
1925
+ "type": "string",
1926
+ "required": false,
1927
+ "default": "\"Search\"",
1928
+ "description": "Text shown while there is no value.",
1929
+ "from": "arkcn"
1930
+ },
1931
+ {
1932
+ "name": "size",
1933
+ "type": "\"default\" | \"xs\" | \"sm\" | \"lg\" | \"icon\" | \"icon-xs\" | \"icon-sm\" | \"icon-lg\" | null",
1934
+ "required": false,
1935
+ "description": "Size variant; sets a `data-size` attribute.",
1936
+ "from": "arkcn"
1937
+ },
1938
+ {
1939
+ "name": "variant",
1940
+ "type": "\"link\" | \"default\" | \"outline\" | \"secondary\" | \"ghost\" | \"destructive\" | null",
1941
+ "required": false,
1942
+ "description": "Visual variant, styled with `cva`; sets a `data-variant` attribute.",
1943
+ "from": "arkcn"
1944
+ },
1945
+ {
1946
+ "name": "children",
1947
+ "type": "ReactNode",
1948
+ "required": false,
1949
+ "description": "Content rendered inside the part.",
1950
+ "from": "@types/react"
1951
+ },
1952
+ {
1953
+ "name": "className",
1954
+ "type": "string",
1955
+ "required": false,
1956
+ "description": "Extra classes merged into the part's own classes with `cn`.",
1957
+ "from": "@types/react"
1958
+ },
1959
+ {
1960
+ "name": "style",
1961
+ "type": "CSSProperties",
1962
+ "required": false,
1963
+ "description": "Inline styles applied to the rendered element.",
1964
+ "from": "@types/react"
1965
+ }
1966
+ ]
1967
+ },
1968
+ {
1969
+ "name": "AppShellSidebar",
1970
+ "props": [
1971
+ {
1972
+ "name": "collapsible",
1973
+ "type": "\"icon\" | \"offcanvas\" | \"none\"",
1974
+ "required": false,
1975
+ "description": "Collapse mode: `offcanvas`, `icon`, or `none`.",
1976
+ "from": "arkcn"
1977
+ },
1978
+ {
1979
+ "name": "side",
1980
+ "type": "\"left\" | \"right\"",
1981
+ "required": false,
1982
+ "description": "Which side of the anchor or container the part sits on.",
1983
+ "from": "arkcn"
1984
+ },
1985
+ {
1986
+ "name": "variant",
1987
+ "type": "\"sidebar\" | \"floating\" | \"inset\"",
1988
+ "required": false,
1989
+ "description": "Visual variant, styled with `cva`; sets a `data-variant` attribute.",
1990
+ "from": "arkcn"
1991
+ },
1992
+ {
1993
+ "name": "children",
1994
+ "type": "ReactNode",
1995
+ "required": false,
1996
+ "description": "Content rendered inside the part.",
1997
+ "from": "@types/react"
1998
+ },
1999
+ {
2000
+ "name": "className",
2001
+ "type": "string",
2002
+ "required": false,
2003
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2004
+ "from": "@types/react"
2005
+ },
2006
+ {
2007
+ "name": "style",
2008
+ "type": "CSSProperties",
2009
+ "required": false,
2010
+ "description": "Inline styles applied to the rendered element.",
2011
+ "from": "@types/react"
2012
+ }
2013
+ ]
2014
+ },
2015
+ {
2016
+ "name": "AppShellSkipLink",
2017
+ "props": [
2018
+ {
2019
+ "name": "children",
2020
+ "type": "ReactNode",
2021
+ "required": false,
2022
+ "default": "\"Skip to main content\"",
2023
+ "description": "Content rendered inside the part.",
2024
+ "from": "@types/react"
2025
+ },
2026
+ {
2027
+ "name": "className",
2028
+ "type": "string",
2029
+ "required": false,
2030
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2031
+ "from": "@types/react"
2032
+ },
2033
+ {
2034
+ "name": "style",
2035
+ "type": "CSSProperties",
2036
+ "required": false,
2037
+ "description": "Inline styles applied to the rendered element.",
2038
+ "from": "@types/react"
2039
+ }
2040
+ ]
2041
+ },
2042
+ {
2043
+ "name": "AppShellThemeToggle",
2044
+ "props": [
2045
+ {
2046
+ "name": "onThemeChange",
2047
+ "type": "(theme: Theme) => void",
2048
+ "required": true,
2049
+ "description": "Called with the next theme when the toggle is used.",
2050
+ "from": "arkcn"
2051
+ },
2052
+ {
2053
+ "name": "theme",
2054
+ "type": "Theme",
2055
+ "required": true,
2056
+ "description": "Current theme: `light`, `dark`, or `system`.",
2057
+ "from": "arkcn"
2058
+ },
2059
+ {
2060
+ "name": "asChild",
2061
+ "type": "boolean",
2062
+ "required": false,
2063
+ "description": "Render the child element instead of the default one, merging props and behaviour onto it.",
2064
+ "from": "arkcn"
2065
+ },
2066
+ {
2067
+ "name": "size",
2068
+ "type": "\"default\" | \"xs\" | \"sm\" | \"lg\" | \"icon\" | \"icon-xs\" | \"icon-sm\" | \"icon-lg\" | null",
2069
+ "required": false,
2070
+ "description": "Size variant; sets a `data-size` attribute.",
2071
+ "from": "arkcn"
2072
+ },
2073
+ {
2074
+ "name": "variant",
2075
+ "type": "\"link\" | \"default\" | \"outline\" | \"secondary\" | \"ghost\" | \"destructive\" | null",
2076
+ "required": false,
2077
+ "description": "Visual variant, styled with `cva`; sets a `data-variant` attribute.",
2078
+ "from": "arkcn"
2079
+ },
2080
+ {
2081
+ "name": "children",
2082
+ "type": "ReactNode",
2083
+ "required": false,
2084
+ "description": "Content rendered inside the part.",
2085
+ "from": "@types/react"
2086
+ },
2087
+ {
2088
+ "name": "className",
2089
+ "type": "string",
2090
+ "required": false,
2091
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2092
+ "from": "@types/react"
2093
+ },
2094
+ {
2095
+ "name": "style",
2096
+ "type": "CSSProperties",
2097
+ "required": false,
2098
+ "description": "Inline styles applied to the rendered element.",
2099
+ "from": "@types/react"
2100
+ }
2101
+ ]
2102
+ },
2103
+ {
2104
+ "name": "AppShellTopNav",
2105
+ "props": [
2106
+ {
2107
+ "name": "children",
2108
+ "type": "ReactNode",
2109
+ "required": false,
2110
+ "description": "Content rendered inside the part.",
2111
+ "from": "@types/react"
2112
+ },
2113
+ {
2114
+ "name": "className",
2115
+ "type": "string",
2116
+ "required": false,
2117
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2118
+ "from": "@types/react"
2119
+ },
2120
+ {
2121
+ "name": "style",
2122
+ "type": "CSSProperties",
2123
+ "required": false,
2124
+ "description": "Inline styles applied to the rendered element.",
2125
+ "from": "@types/react"
2126
+ }
2127
+ ]
2128
+ },
2129
+ {
2130
+ "name": "AppShellTopNavLink",
2131
+ "props": [
2132
+ {
2133
+ "name": "active",
2134
+ "type": "boolean",
2135
+ "required": false,
2136
+ "default": "false",
2137
+ "description": "Whether the part is the active one; sets `data-active`.",
2138
+ "from": "arkcn"
2139
+ },
2140
+ {
2141
+ "name": "children",
2142
+ "type": "ReactNode",
2143
+ "required": false,
2144
+ "description": "Content rendered inside the part.",
2145
+ "from": "@types/react"
2146
+ },
2147
+ {
2148
+ "name": "className",
2149
+ "type": "string",
2150
+ "required": false,
2151
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2152
+ "from": "@types/react"
2153
+ },
2154
+ {
2155
+ "name": "style",
2156
+ "type": "CSSProperties",
2157
+ "required": false,
2158
+ "description": "Inline styles applied to the rendered element.",
2159
+ "from": "@types/react"
2160
+ }
2161
+ ]
2162
+ },
2163
+ {
2164
+ "name": "AppShellTopNavMenu",
2165
+ "props": [
2166
+ {
2167
+ "name": "className",
2168
+ "type": "string",
2169
+ "required": false,
2170
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2171
+ "from": "arkcn"
2172
+ },
2173
+ {
2174
+ "name": "anchorPoint",
2175
+ "type": "Point | null",
2176
+ "required": false,
2177
+ "description": "The positioning point for the menu. Can be set by the context menu trigger or the button trigger.",
2178
+ "from": "@zag-js/menu"
2179
+ },
2180
+ {
2181
+ "name": "aria-label",
2182
+ "type": "string",
2183
+ "required": false,
2184
+ "description": "The accessibility label for the menu",
2185
+ "from": "@zag-js/menu"
2186
+ },
2187
+ {
2188
+ "name": "children",
2189
+ "type": "ReactNode",
2190
+ "required": false,
2191
+ "description": "Content rendered inside the part.",
2192
+ "from": "@ark-ui/react"
2193
+ },
2194
+ {
2195
+ "name": "closeOnSelect",
2196
+ "type": "boolean",
2197
+ "required": false,
2198
+ "default": "true",
2199
+ "description": "Whether to close the menu when an option is selected",
2200
+ "from": "@zag-js/menu"
2201
+ },
2202
+ {
2203
+ "name": "composite",
2204
+ "type": "boolean",
2205
+ "required": false,
2206
+ "default": "true",
2207
+ "description": "Whether the menu is a composed with other composite widgets like a combobox or tabs",
2208
+ "from": "@zag-js/menu"
2209
+ },
2210
+ {
2211
+ "name": "defaultHighlightedValue",
2212
+ "type": "string | null",
2213
+ "required": false,
2214
+ "description": "The initial highlighted value of the menu item when rendered.\nUse when you don't need to control the highlighted value of the menu item.",
2215
+ "from": "@zag-js/menu"
2216
+ },
2217
+ {
2218
+ "name": "defaultOpen",
2219
+ "type": "boolean",
2220
+ "required": false,
2221
+ "description": "The initial open state of the menu when rendered.\nUse when you don't need to control the open state of the menu.",
2222
+ "from": "@zag-js/menu"
2223
+ },
2224
+ {
2225
+ "name": "defaultTriggerValue",
2226
+ "type": "string | null",
2227
+ "required": false,
2228
+ "description": "The initial trigger value when rendered.\nUse when you don't need to control the trigger value.",
2229
+ "from": "@zag-js/menu"
2230
+ },
2231
+ {
2232
+ "name": "hideMode",
2233
+ "type": "HideMode",
2234
+ "required": false,
2235
+ "default": "'display-none'",
2236
+ "description": "How to hide content when mounted but not present.\n- `'display-none'`: HTML `hidden` attribute. Effects stay alive.\n- `'activity'`: React 19 `<Activity mode=\"hidden\">`. Effects pause. Requires React 19+.",
2237
+ "from": "@ark-ui/react"
2238
+ },
2239
+ {
2240
+ "name": "highlightedValue",
2241
+ "type": "string | null",
2242
+ "required": false,
2243
+ "description": "The controlled highlighted value of the menu item.",
2244
+ "from": "@zag-js/menu"
2245
+ },
2246
+ {
2247
+ "name": "id",
2248
+ "type": "string",
2249
+ "required": false,
2250
+ "description": "The unique identifier of the machine.",
2251
+ "from": "@zag-js/types"
2252
+ },
2253
+ {
2254
+ "name": "ids",
2255
+ "type": "ElementIds",
2256
+ "required": false,
2257
+ "description": "The ids of the elements in the menu. Useful for composition.",
2258
+ "from": "@zag-js/menu"
2259
+ },
2260
+ {
2261
+ "name": "immediate",
2262
+ "type": "boolean",
2263
+ "required": false,
2264
+ "description": "Whether to synchronize the present change immediately or defer it to the next frame",
2265
+ "from": "@zag-js/presence"
2266
+ },
2267
+ {
2268
+ "name": "lazyMount",
2269
+ "type": "boolean",
2270
+ "required": false,
2271
+ "default": "false",
2272
+ "description": "Whether to enable lazy mounting",
2273
+ "from": "@ark-ui/react"
2274
+ },
2275
+ {
2276
+ "name": "loopFocus",
2277
+ "type": "boolean",
2278
+ "required": false,
2279
+ "default": "false",
2280
+ "description": "Whether to loop the keyboard navigation.",
2281
+ "from": "@zag-js/menu"
2282
+ },
2283
+ {
2284
+ "name": "navigate",
2285
+ "type": "((details: NavigateDetails) => void) | null",
2286
+ "required": false,
2287
+ "description": "Function to navigate to the selected item if it's an anchor element",
2288
+ "from": "@zag-js/menu"
2289
+ },
2290
+ {
2291
+ "name": "onEnterComplete",
2292
+ "type": "VoidFunction",
2293
+ "required": false,
2294
+ "description": "Function called when the animation ends in the open state",
2295
+ "from": "@zag-js/presence"
2296
+ },
2297
+ {
2298
+ "name": "onEscapeKeyDown",
2299
+ "type": "((event: KeyboardEvent) => void)",
2300
+ "required": false,
2301
+ "description": "Function called when the escape key is pressed",
2302
+ "from": "@zag-js/dismissable"
2303
+ },
2304
+ {
2305
+ "name": "onExitComplete",
2306
+ "type": "VoidFunction",
2307
+ "required": false,
2308
+ "description": "Function called when the animation ends in the closed state",
2309
+ "from": "@zag-js/presence"
2310
+ },
2311
+ {
2312
+ "name": "onFocusOutside",
2313
+ "type": "((event: FocusOutsideEvent) => void)",
2314
+ "required": false,
2315
+ "description": "Function called when the focus is moved outside the component",
2316
+ "from": "@zag-js/interact-outside"
2317
+ },
2318
+ {
2319
+ "name": "onHighlightChange",
2320
+ "type": "((details: HighlightChangeDetails) => void)",
2321
+ "required": false,
2322
+ "description": "Function called when the highlighted menu item changes.",
2323
+ "from": "@zag-js/menu"
2324
+ },
2325
+ {
2326
+ "name": "onInteractOutside",
2327
+ "type": "((event: InteractOutsideEvent) => void)",
2328
+ "required": false,
2329
+ "description": "Function called when an interaction happens outside the component",
2330
+ "from": "@zag-js/interact-outside"
2331
+ },
2332
+ {
2333
+ "name": "onOpenChange",
2334
+ "type": "((details: OpenChangeDetails) => void)",
2335
+ "required": false,
2336
+ "description": "Function called when the menu opens or closes",
2337
+ "from": "@zag-js/menu"
2338
+ },
2339
+ {
2340
+ "name": "onPointerDownOutside",
2341
+ "type": "((event: PointerDownOutsideEvent) => void)",
2342
+ "required": false,
2343
+ "description": "Function called when the pointer is pressed down outside the component",
2344
+ "from": "@zag-js/interact-outside"
2345
+ },
2346
+ {
2347
+ "name": "onRequestDismiss",
2348
+ "type": "((event: LayerDismissEvent) => void)",
2349
+ "required": false,
2350
+ "description": "Function called when this layer is closed due to a parent layer being closed",
2351
+ "from": "@zag-js/dismissable"
2352
+ },
2353
+ {
2354
+ "name": "onSelect",
2355
+ "type": "((details: SelectionDetails) => void)",
2356
+ "required": false,
2357
+ "description": "Function called when a menu item is selected.",
2358
+ "from": "@zag-js/menu"
2359
+ },
2360
+ {
2361
+ "name": "onTriggerValueChange",
2362
+ "type": "((details: TriggerValueChangeDetails) => void)",
2363
+ "required": false,
2364
+ "description": "Function called when the trigger value changes.",
2365
+ "from": "@zag-js/menu"
2366
+ },
2367
+ {
2368
+ "name": "open",
2369
+ "type": "boolean",
2370
+ "required": false,
2371
+ "description": "The controlled open state of the menu",
2372
+ "from": "@zag-js/menu"
2373
+ },
2374
+ {
2375
+ "name": "positioning",
2376
+ "type": "PositioningOptions",
2377
+ "required": false,
2378
+ "description": "The options used to dynamically position the menu",
2379
+ "from": "@zag-js/menu"
2380
+ },
2381
+ {
2382
+ "name": "present",
2383
+ "type": "boolean",
2384
+ "required": false,
2385
+ "description": "Whether the node is present (controlled by the user)",
2386
+ "from": "@zag-js/presence"
2387
+ },
2388
+ {
2389
+ "name": "skipAnimationOnMount",
2390
+ "type": "boolean",
2391
+ "required": false,
2392
+ "default": "false",
2393
+ "description": "Whether to allow the initial presence animation.",
2394
+ "from": "@ark-ui/react"
2395
+ },
2396
+ {
2397
+ "name": "triggerValue",
2398
+ "type": "string | null",
2399
+ "required": false,
2400
+ "description": "The controlled trigger value",
2401
+ "from": "@zag-js/menu"
2402
+ },
2403
+ {
2404
+ "name": "typeahead",
2405
+ "type": "boolean",
2406
+ "required": false,
2407
+ "default": "true",
2408
+ "description": "Whether the pressing printable characters should trigger typeahead navigation",
2409
+ "from": "@zag-js/menu"
2410
+ },
2411
+ {
2412
+ "name": "unmountOnExit",
2413
+ "type": "boolean",
2414
+ "required": false,
2415
+ "default": "false",
2416
+ "description": "Whether to unmount on exit.",
2417
+ "from": "@ark-ui/react"
2418
+ }
2419
+ ]
2420
+ },
2421
+ {
2422
+ "name": "AppShellUser",
2423
+ "props": [
2424
+ {
2425
+ "name": "asChild",
2426
+ "type": "boolean",
2427
+ "required": false,
2428
+ "description": "Render the child element instead of the default one, merging props and behaviour onto it.",
2429
+ "from": "arkcn"
2430
+ },
2431
+ {
2432
+ "name": "isActive",
2433
+ "type": "boolean",
2434
+ "required": false,
2435
+ "description": "Marks the current item.",
2436
+ "from": "arkcn"
2437
+ },
2438
+ {
2439
+ "name": "size",
2440
+ "type": "\"default\" | \"sm\" | \"lg\" | null",
2441
+ "required": false,
2442
+ "description": "Size variant; sets a `data-size` attribute.",
2443
+ "from": "arkcn"
2444
+ },
2445
+ {
2446
+ "name": "tooltip",
2447
+ "type": "string | (TooltipContentProps & RefAttributes<HTMLDivElement>)",
2448
+ "required": false,
2449
+ "description": "Tooltip content shown on hover, or `false` to disable it.",
2450
+ "from": "arkcn"
2451
+ },
2452
+ {
2453
+ "name": "variant",
2454
+ "type": "\"default\" | \"outline\" | null",
2455
+ "required": false,
2456
+ "description": "Visual variant, styled with `cva`; sets a `data-variant` attribute.",
2457
+ "from": "arkcn"
2458
+ },
2459
+ {
2460
+ "name": "children",
2461
+ "type": "ReactNode",
2462
+ "required": false,
2463
+ "description": "Content rendered inside the part.",
2464
+ "from": "@types/react"
2465
+ },
2466
+ {
2467
+ "name": "className",
2468
+ "type": "string",
2469
+ "required": false,
2470
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2471
+ "from": "@types/react"
2472
+ },
2473
+ {
2474
+ "name": "style",
2475
+ "type": "CSSProperties",
2476
+ "required": false,
2477
+ "description": "Inline styles applied to the rendered element.",
2478
+ "from": "@types/react"
2479
+ }
2480
+ ]
2481
+ },
2482
+ {
2483
+ "name": "AppShellUserAvatar",
2484
+ "props": [
2485
+ {
2486
+ "name": "fallback",
2487
+ "type": "ReactNode",
2488
+ "required": true,
2489
+ "description": "Text shown while the avatar image is missing or loading.",
2490
+ "from": "arkcn"
2491
+ },
2492
+ {
2493
+ "name": "alt",
2494
+ "type": "string",
2495
+ "required": false,
2496
+ "description": "Alternative text for the avatar image.",
2497
+ "from": "arkcn"
2498
+ },
2499
+ {
2500
+ "name": "size",
2501
+ "type": "\"default\" | \"sm\" | \"lg\"",
2502
+ "required": false,
2503
+ "description": "Size variant; sets a `data-size` attribute.",
2504
+ "from": "arkcn"
2505
+ },
2506
+ {
2507
+ "name": "src",
2508
+ "type": "string",
2509
+ "required": false,
2510
+ "description": "Avatar image URL.",
2511
+ "from": "arkcn"
2512
+ },
2513
+ {
2514
+ "name": "asChild",
2515
+ "type": "boolean",
2516
+ "required": false,
2517
+ "description": "Use the provided child element as the default rendered element, combining their props and behavior.",
2518
+ "from": "@ark-ui/react"
2519
+ },
2520
+ {
2521
+ "name": "children",
2522
+ "type": "ReactNode",
2523
+ "required": false,
2524
+ "description": "Content rendered inside the part.",
2525
+ "from": "@types/react"
2526
+ },
2527
+ {
2528
+ "name": "className",
2529
+ "type": "string",
2530
+ "required": false,
2531
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2532
+ "from": "@types/react"
2533
+ },
2534
+ {
2535
+ "name": "ids",
2536
+ "type": "ElementIds",
2537
+ "required": false,
2538
+ "description": "The ids of the elements in the avatar. Useful for composition.",
2539
+ "from": "@zag-js/avatar"
2540
+ },
2541
+ {
2542
+ "name": "onStatusChange",
2543
+ "type": "((details: StatusChangeDetails) => void)",
2544
+ "required": false,
2545
+ "description": "Functional called when the image loading status changes.",
2546
+ "from": "@zag-js/avatar"
2547
+ },
2548
+ {
2549
+ "name": "style",
2550
+ "type": "CSSProperties",
2551
+ "required": false,
2552
+ "description": "Inline styles applied to the rendered element.",
2553
+ "from": "@types/react"
2554
+ }
2555
+ ]
2556
+ },
2557
+ {
2558
+ "name": "AppShellUserEmail",
2559
+ "props": [
2560
+ {
2561
+ "name": "children",
2562
+ "type": "ReactNode",
2563
+ "required": false,
2564
+ "description": "Content rendered inside the part.",
2565
+ "from": "@types/react"
2566
+ },
2567
+ {
2568
+ "name": "className",
2569
+ "type": "string",
2570
+ "required": false,
2571
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2572
+ "from": "@types/react"
2573
+ },
2574
+ {
2575
+ "name": "style",
2576
+ "type": "CSSProperties",
2577
+ "required": false,
2578
+ "description": "Inline styles applied to the rendered element.",
2579
+ "from": "@types/react"
2580
+ }
2581
+ ]
2582
+ },
2583
+ {
2584
+ "name": "AppShellUserName",
2585
+ "props": [
2586
+ {
2587
+ "name": "children",
2588
+ "type": "ReactNode",
2589
+ "required": false,
2590
+ "description": "Content rendered inside the part.",
2591
+ "from": "@types/react"
2592
+ },
2593
+ {
2594
+ "name": "className",
2595
+ "type": "string",
2596
+ "required": false,
2597
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2598
+ "from": "@types/react"
2599
+ },
2600
+ {
2601
+ "name": "style",
2602
+ "type": "CSSProperties",
2603
+ "required": false,
2604
+ "description": "Inline styles applied to the rendered element.",
2605
+ "from": "@types/react"
2606
+ }
2607
+ ]
2608
+ },
2609
+ {
2610
+ "name": "AppShellUserText",
2611
+ "props": [
2612
+ {
2613
+ "name": "children",
2614
+ "type": "ReactNode",
2615
+ "required": false,
2616
+ "description": "Content rendered inside the part.",
2617
+ "from": "@types/react"
2618
+ },
2619
+ {
2620
+ "name": "className",
2621
+ "type": "string",
2622
+ "required": false,
2623
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2624
+ "from": "@types/react"
2625
+ },
2626
+ {
2627
+ "name": "style",
2628
+ "type": "CSSProperties",
2629
+ "required": false,
2630
+ "description": "Inline styles applied to the rendered element.",
2631
+ "from": "@types/react"
2632
+ }
2633
+ ]
2634
+ },
2635
+ {
2636
+ "name": "AppShellSidebarContent",
2637
+ "props": [
2638
+ {
2639
+ "name": "children",
2640
+ "type": "ReactNode",
2641
+ "required": false,
2642
+ "description": "Content rendered inside the part.",
2643
+ "from": "@types/react"
2644
+ },
2645
+ {
2646
+ "name": "className",
2647
+ "type": "string",
2648
+ "required": false,
2649
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2650
+ "from": "@types/react"
2651
+ },
2652
+ {
2653
+ "name": "style",
2654
+ "type": "CSSProperties",
2655
+ "required": false,
2656
+ "description": "Inline styles applied to the rendered element.",
2657
+ "from": "@types/react"
2658
+ }
2659
+ ]
2660
+ },
2661
+ {
2662
+ "name": "AppShellSidebarFooter",
2663
+ "props": [
2664
+ {
2665
+ "name": "children",
2666
+ "type": "ReactNode",
2667
+ "required": false,
2668
+ "description": "Content rendered inside the part.",
2669
+ "from": "@types/react"
2670
+ },
2671
+ {
2672
+ "name": "className",
2673
+ "type": "string",
2674
+ "required": false,
2675
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2676
+ "from": "@types/react"
2677
+ },
2678
+ {
2679
+ "name": "style",
2680
+ "type": "CSSProperties",
2681
+ "required": false,
2682
+ "description": "Inline styles applied to the rendered element.",
2683
+ "from": "@types/react"
2684
+ }
2685
+ ]
2686
+ },
2687
+ {
2688
+ "name": "AppShellSidebarHeader",
2689
+ "props": [
2690
+ {
2691
+ "name": "children",
2692
+ "type": "ReactNode",
2693
+ "required": false,
2694
+ "description": "Content rendered inside the part.",
2695
+ "from": "@types/react"
2696
+ },
2697
+ {
2698
+ "name": "className",
2699
+ "type": "string",
2700
+ "required": false,
2701
+ "description": "Extra classes merged into the part's own classes with `cn`.",
2702
+ "from": "@types/react"
2703
+ },
2704
+ {
2705
+ "name": "style",
2706
+ "type": "CSSProperties",
2707
+ "required": false,
2708
+ "description": "Inline styles applied to the rendered element.",
2709
+ "from": "@types/react"
2710
+ }
2711
+ ]
2712
+ }
2713
+ ],
61
2714
  "dependencies": {
62
2715
  "lucide-react": "^1.41.0"
63
2716
  },
@@ -77,7 +2730,7 @@
77
2730
  "files": [
78
2731
  {
79
2732
  "path": "components/ui/app-shell.tsx",
80
- "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n BellIcon,\n CheckIcon,\n ChevronRightIcon,\n ChevronsUpDownIcon,\n MenuIcon,\n MoonIcon,\n SearchIcon,\n SunIcon,\n} from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@/components/ui/collapsible\"\nimport { CommandDialog } from \"@/components/ui/command\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { Kbd } from \"@/components/ui/kbd\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\"\nimport { Separator } from \"@/components/ui/separator\"\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInset,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarTrigger,\n useSidebar,\n} from \"@/components/ui/sidebar\"\n\n/* -------------------------------------------------------------------------- */\n/* Root */\n/* -------------------------------------------------------------------------- */\n\ntype SidebarVariant = \"sidebar\" | \"floating\" | \"inset\"\ntype SidebarCollapsible = \"offcanvas\" | \"icon\" | \"none\"\n\ntype AppShellContextValue = {\n variant: SidebarVariant\n setVariant: (variant: SidebarVariant) => void\n collapsible: SidebarCollapsible\n setCollapsible: (collapsible: SidebarCollapsible) => void\n searchOpen: boolean\n setSearchOpen: React.Dispatch<React.SetStateAction<boolean>>\n}\n\nconst AppShellContext = React.createContext<AppShellContextValue | null>(null)\n\nfunction useAppShell() {\n const ctx = React.useContext(AppShellContext)\n if (!ctx) throw new Error(\"useAppShell must be used within <AppShell>\")\n return ctx\n}\n\n/**\n * Root of the shell. Owns the sidebar open state (via `SidebarProvider`), the\n * sidebar variant and collapse mode, and the global search open state with its\n * Cmd/Ctrl+K shortcut. Routing, theming, and data are the consumer's.\n */\nfunction AppShell({\n variant: variantProp,\n defaultVariant = \"inset\",\n onVariantChange,\n collapsible: collapsibleProp,\n defaultCollapsible = \"icon\",\n onCollapsibleChange,\n searchShortcut = true,\n children,\n ...sidebarProviderProps\n}: Omit<React.ComponentProps<typeof SidebarProvider>, \"children\"> & {\n variant?: SidebarVariant\n defaultVariant?: SidebarVariant\n onVariantChange?: (variant: SidebarVariant) => void\n collapsible?: SidebarCollapsible\n defaultCollapsible?: SidebarCollapsible\n onCollapsibleChange?: (collapsible: SidebarCollapsible) => void\n /** Toggle the search dialog with Cmd/Ctrl+K. */\n searchShortcut?: boolean\n children?: React.ReactNode\n}) {\n const [variantState, setVariantState] = React.useState(defaultVariant)\n const [collapsibleState, setCollapsibleState] = React.useState(defaultCollapsible)\n const [searchOpen, setSearchOpen] = React.useState(false)\n const variant = variantProp ?? variantState\n const collapsible = collapsibleProp ?? collapsibleState\n\n React.useEffect(() => {\n if (!searchShortcut) return\n const down = (event: KeyboardEvent) => {\n if (event.key === \"k\" && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n setSearchOpen((open) => !open)\n }\n }\n document.addEventListener(\"keydown\", down)\n return () => document.removeEventListener(\"keydown\", down)\n }, [searchShortcut])\n\n const ctx = React.useMemo<AppShellContextValue>(\n () => ({\n variant,\n setVariant: (next) => {\n if (variantProp === undefined) setVariantState(next)\n onVariantChange?.(next)\n },\n collapsible,\n setCollapsible: (next) => {\n if (collapsibleProp === undefined) setCollapsibleState(next)\n onCollapsibleChange?.(next)\n },\n searchOpen,\n setSearchOpen,\n }),\n [variant, variantProp, onVariantChange, collapsible, collapsibleProp, onCollapsibleChange, searchOpen]\n )\n\n return (\n <AppShellContext.Provider value={ctx}>\n <SidebarProvider {...sidebarProviderProps}>{children}</SidebarProvider>\n </AppShellContext.Provider>\n )\n}\n\nfunction AppShellSkipLink({\n className,\n href = \"#content\",\n children = \"Skip to main content\",\n ...props\n}: React.ComponentProps<\"a\">) {\n return (\n <a\n data-slot=\"app-shell-skip-link\"\n href={href}\n className={cn(\n \"fixed inset-s-44 z-999 -translate-y-52 rounded-md bg-primary px-4 py-2 text-sm font-medium whitespace-nowrap text-primary-foreground opacity-95 shadow-sm transition focus:translate-y-3 focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none\",\n className\n )}\n {...props}\n >\n {children}\n </a>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* Sidebar */\n/* -------------------------------------------------------------------------- */\n\nfunction AppShellSidebar({ variant, collapsible, children, ...props }: React.ComponentProps<typeof Sidebar>) {\n const shell = useAppShell()\n return (\n <Sidebar\n data-slot=\"app-shell-sidebar\"\n variant={variant ?? shell.variant}\n collapsible={collapsible ?? shell.collapsible}\n {...props}\n >\n {children}\n <SidebarRail />\n </Sidebar>\n )\n}\n\n/* Brand / team switcher trigger ------------------------------------------- */\n\nfunction AppShellBrand({ className, ...props }: React.ComponentProps<typeof SidebarMenuButton>) {\n return (\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton\n data-slot=\"app-shell-brand\"\n size=\"lg\"\n className={cn(\"data-open:bg-sidebar-accent data-open:text-sidebar-accent-foreground\", className)}\n {...props}\n />\n </SidebarMenuItem>\n </SidebarMenu>\n )\n}\n\nfunction AppShellBrandLogo({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-brand-logo\"\n className={cn(\n \"flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground [&_svg]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AppShellBrandText({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-brand-text\"\n className={cn(\"grid flex-1 text-start text-sm/tight\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellBrandTitle({ className, ...props }: React.ComponentProps<\"span\">) {\n return <span data-slot=\"app-shell-brand-title\" className={cn(\"truncate font-semibold\", className)} {...props} />\n}\n\nfunction AppShellBrandDescription({ className, ...props }: React.ComponentProps<\"span\">) {\n return <span data-slot=\"app-shell-brand-description\" className={cn(\"truncate text-xs\", className)} {...props} />\n}\n\nfunction AppShellBrandChevron({ className, ...props }: React.ComponentProps<typeof ChevronsUpDownIcon>) {\n return <ChevronsUpDownIcon data-slot=\"app-shell-brand-chevron\" className={cn(\"ms-auto\", className)} {...props} />\n}\n\n/* Navigation --------------------------------------------------------------- */\n\nfunction AppShellNav({ ...props }: React.ComponentProps<typeof SidebarGroup>) {\n return <SidebarGroup data-slot=\"app-shell-nav\" {...props} />\n}\n\nfunction AppShellNavLabel({ ...props }: React.ComponentProps<typeof SidebarGroupLabel>) {\n return <SidebarGroupLabel data-slot=\"app-shell-nav-label\" {...props} />\n}\n\nfunction AppShellNavList({ ...props }: React.ComponentProps<typeof SidebarMenu>) {\n return <SidebarMenu data-slot=\"app-shell-nav-list\" {...props} />\n}\n\nfunction AppShellNavItem({ ...props }: React.ComponentProps<typeof SidebarMenuItem>) {\n return <SidebarMenuItem data-slot=\"app-shell-nav-item\" {...props} />\n}\n\n/**\n * A top-level navigation link. Pass the link element as the child with\n * `asChild` (default) so any router's link works. `active` marks the current\n * route; `tooltip` shows when the sidebar is collapsed to icons.\n */\nfunction AppShellNavLink({\n active = false,\n asChild = true,\n onClick,\n ...props\n}: Omit<React.ComponentProps<typeof SidebarMenuButton>, \"isActive\"> & {\n active?: boolean\n}) {\n const { setOpenMobile } = useSidebar()\n return (\n <SidebarMenuButton\n data-slot=\"app-shell-nav-link\"\n asChild={asChild}\n isActive={active}\n onClick={(event) => {\n onClick?.(event)\n setOpenMobile(false)\n }}\n {...props}\n />\n )\n}\n\nfunction AppShellNavBadge({ className, ...props }: React.ComponentProps<typeof Badge>) {\n return (\n <Badge\n data-slot=\"app-shell-nav-badge\"\n className={cn(\"ms-auto rounded-full px-1 py-0 text-xs\", className)}\n {...props}\n />\n )\n}\n\n/**\n * A navigation item with children. Expanded sidebar: a collapsible sub-list.\n * Icon-collapsed sidebar on desktop: a flyout menu. Supply `trigger` for the\n * button content and `menu` for the flyout items; `children` is the sub-list.\n */\nfunction AppShellNavCollapsible({\n active = false,\n defaultOpen,\n tooltip,\n trigger,\n menu,\n children,\n ...props\n}: React.ComponentProps<typeof SidebarMenuItem> & {\n active?: boolean\n defaultOpen?: boolean\n tooltip?: string\n trigger: React.ReactNode\n /** Rendered inside the flyout when the sidebar is collapsed to icons. */\n menu?: React.ReactNode\n}) {\n const { state, isMobile } = useSidebar()\n\n if (state === \"collapsed\" && !isMobile) {\n return (\n <SidebarMenuItem data-slot=\"app-shell-nav-collapsible\" {...props}>\n <DropdownMenu positioning={{ placement: \"right-start\", gutter: 4 }}>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton tooltip={tooltip} isActive={active}>\n {trigger}\n <ChevronRightIcon className=\"ms-auto\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent data-slot=\"app-shell-nav-flyout\">\n <DropdownMenuGroup>\n {tooltip && (\n <>\n <DropdownMenuLabel>{tooltip}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n </>\n )}\n {menu}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n )\n }\n\n return (\n <Collapsible\n defaultOpen={defaultOpen ?? active}\n className=\"group/collapsible\"\n unmountOnExit={false}\n lazyMount={false}\n >\n <SidebarMenuItem data-slot=\"app-shell-nav-collapsible\" {...props}>\n <CollapsibleTrigger asChild>\n <SidebarMenuButton tooltip={tooltip} isActive={active}>\n {trigger}\n <ChevronRightIcon className=\"ms-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90 rtl:rotate-180\" />\n </SidebarMenuButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenuSub data-slot=\"app-shell-nav-sublist\">{children}</SidebarMenuSub>\n </CollapsibleContent>\n </SidebarMenuItem>\n </Collapsible>\n )\n}\n\nfunction AppShellNavSubItem({ ...props }: React.ComponentProps<typeof SidebarMenuSubItem>) {\n return <SidebarMenuSubItem data-slot=\"app-shell-nav-subitem\" {...props} />\n}\n\nfunction AppShellNavSubLink({\n active = false,\n asChild = true,\n onClick,\n ...props\n}: Omit<React.ComponentProps<typeof SidebarMenuSubButton>, \"isActive\"> & { active?: boolean }) {\n const { setOpenMobile } = useSidebar()\n return (\n <SidebarMenuSubButton\n data-slot=\"app-shell-nav-sublink\"\n asChild={asChild}\n isActive={active}\n onClick={(event) => {\n onClick?.(event)\n setOpenMobile(false)\n }}\n {...props}\n />\n )\n}\n\n/** A flyout menu entry for the icon-collapsed state. */\nfunction AppShellNavMenuLink({\n active = false,\n className,\n asChild = true,\n ...props\n}: React.ComponentProps<typeof DropdownMenuItem> & { active?: boolean }) {\n return (\n <DropdownMenuItem\n data-slot=\"app-shell-nav-menu-link\"\n asChild={asChild}\n className={cn(active && \"bg-secondary\", className)}\n {...props}\n />\n )\n}\n\n/* User footer trigger ------------------------------------------------------ */\n\nfunction AppShellUser({ className, ...props }: React.ComponentProps<typeof SidebarMenuButton>) {\n return (\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton\n data-slot=\"app-shell-user\"\n size=\"lg\"\n className={cn(\"data-open:bg-sidebar-accent data-open:text-sidebar-accent-foreground\", className)}\n {...props}\n />\n </SidebarMenuItem>\n </SidebarMenu>\n )\n}\n\nfunction AppShellUserAvatar({\n src,\n alt,\n fallback,\n className,\n ...props\n}: React.ComponentProps<typeof Avatar> & { src?: string; alt?: string; fallback: React.ReactNode }) {\n return (\n <Avatar data-slot=\"app-shell-user-avatar\" className={cn(\"rounded-lg\", className)} {...props}>\n {src && <AvatarImage src={src} alt={alt} />}\n <AvatarFallback className=\"rounded-lg\">{fallback}</AvatarFallback>\n </Avatar>\n )\n}\n\nfunction AppShellUserText({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"app-shell-user-text\" className={cn(\"grid flex-1 text-start text-sm/tight\", className)} {...props} />\n )\n}\n\nfunction AppShellUserName({ className, ...props }: React.ComponentProps<\"span\">) {\n return <span data-slot=\"app-shell-user-name\" className={cn(\"truncate font-semibold\", className)} {...props} />\n}\n\nfunction AppShellUserEmail({ className, ...props }: React.ComponentProps<\"span\">) {\n return <span data-slot=\"app-shell-user-email\" className={cn(\"truncate text-xs\", className)} {...props} />\n}\n\n/* -------------------------------------------------------------------------- */\n/* Content area: header, main */\n/* -------------------------------------------------------------------------- */\n\nfunction AppShellContent({ className, ...props }: React.ComponentProps<typeof SidebarInset>) {\n return (\n <SidebarInset\n data-slot=\"app-shell-content\"\n id=\"content\"\n className={cn(\n \"@container/content\",\n \"has-data-[layout=fixed]:h-svh\",\n \"peer-data-[variant=inset]:has-data-[layout=fixed]:h-[calc(100svh-(var(--spacing)*4))]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AppShellHeader({\n className,\n fixed = false,\n children,\n ...props\n}: React.ComponentProps<\"header\"> & { fixed?: boolean }) {\n const [scrolled, setScrolled] = React.useState(false)\n React.useEffect(() => {\n if (!fixed) return\n const onScroll = () => setScrolled((document.body.scrollTop || document.documentElement.scrollTop) > 10)\n onScroll()\n document.addEventListener(\"scroll\", onScroll, { passive: true })\n return () => document.removeEventListener(\"scroll\", onScroll)\n }, [fixed])\n return (\n <header\n data-slot=\"app-shell-header\"\n data-fixed={fixed ? \"\" : undefined}\n data-scrolled={scrolled ? \"\" : undefined}\n className={cn(\n // Solid background; the top corners follow the inset card's radius so the\n // header never squares off the rounded content area.\n \"z-50 h-16 rounded-t-[inherit] bg-background\",\n fixed && \"peer/header sticky top-0 w-[inherit]\",\n fixed && scrolled ? \"shadow-sm\" : \"shadow-none\",\n className\n )}\n {...props}\n >\n <div\n className={cn(\n \"relative flex h-full items-center gap-3 p-4 sm:gap-4\",\n fixed &&\n scrolled &&\n \"after:absolute after:inset-0 after:-z-10 after:rounded-[inherit] after:bg-background/60 after:backdrop-blur-lg\"\n )}\n >\n <SidebarTrigger variant=\"outline\" className=\"max-md:scale-125\" />\n <Separator orientation=\"vertical\" className=\"h-6\" />\n {children}\n </div>\n </header>\n )\n}\n\nfunction AppShellHeaderActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-header-actions\"\n className={cn(\"ms-auto flex items-center gap-3 sm:gap-4\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellMain({\n className,\n fixed = false,\n fluid = false,\n ...props\n}: React.ComponentProps<\"main\"> & { fixed?: boolean; fluid?: boolean }) {\n return (\n <main\n data-slot=\"app-shell-main\"\n data-layout={fixed ? \"fixed\" : \"auto\"}\n className={cn(\n \"px-4 py-6\",\n fixed && \"flex grow flex-col overflow-hidden\",\n !fluid && \"@7xl/content:mx-auto @7xl/content:w-full @7xl/content:max-w-7xl\",\n className\n )}\n {...props}\n />\n )\n}\n\n/* Top nav (secondary, in the header) --------------------------------------- */\n\nfunction AppShellTopNav({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n data-slot=\"app-shell-top-nav\"\n className={cn(\"hidden items-center gap-4 lg:flex xl:gap-6\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellTopNavLink({ active = false, className, ...props }: React.ComponentProps<\"a\"> & { active?: boolean }) {\n return (\n <a\n data-slot=\"app-shell-top-nav-link\"\n data-active={active ? \"\" : undefined}\n className={cn(\n \"text-sm font-medium text-muted-foreground transition-colors hover:text-primary data-active:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\n/** The small-screen counterpart of `AppShellTopNav`: the same links in a menu. */\nfunction AppShellTopNavMenu({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenu> & { className?: string }) {\n return (\n <DropdownMenu positioning={{ placement: \"bottom-start\" }} {...props}>\n <DropdownMenuTrigger asChild>\n <Button\n data-slot=\"app-shell-top-nav-menu-trigger\"\n size=\"icon\"\n variant=\"outline\"\n className={cn(\"md:size-7 lg:hidden\", className)}\n >\n <MenuIcon />\n <span className=\"sr-only\">Toggle navigation menu</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>{children}</DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* Search and command menu */\n/* -------------------------------------------------------------------------- */\n\nfunction AppShellSearch({\n className,\n placeholder = \"Search\",\n onClick,\n asChild,\n children,\n ...props\n}: React.ComponentProps<typeof Button> & { placeholder?: string }) {\n const shell = useAppShell()\n return (\n <Button\n data-slot=\"app-shell-search\"\n variant=\"outline\"\n asChild={asChild}\n className={cn(\n \"group relative h-8 w-full flex-1 justify-start rounded-md bg-muted/25 text-sm font-normal text-muted-foreground shadow-none hover:bg-accent sm:w-40 sm:pe-12 md:flex-none lg:w-52 xl:w-64\",\n className\n )}\n aria-keyshortcuts=\"Meta+K Control+K\"\n onClick={(event) => {\n onClick?.(event)\n if (!event.defaultPrevented) shell.setSearchOpen(true)\n }}\n {...props}\n >\n {asChild\n ? children\n : (children ?? (\n <>\n <SearchIcon aria-hidden className=\"absolute inset-s-1.5 top-1/2 size-4 -translate-y-1/2\" />\n <span className=\"ms-4\">{placeholder}</span>\n <Kbd className=\"pointer-events-none absolute inset-e-1.5 top-1.5 hidden sm:flex\">⌘K</Kbd>\n </>\n ))}\n </Button>\n )\n}\n\n/** A `CommandDialog` bound to the shell's search state. */\nfunction AppShellCommandDialog({\n ...props\n}: Omit<React.ComponentProps<typeof CommandDialog>, \"open\" | \"onOpenChange\">) {\n const shell = useAppShell()\n return <CommandDialog open={shell.searchOpen} onOpenChange={({ open }) => shell.setSearchOpen(open)} {...props} />\n}\n\n/* -------------------------------------------------------------------------- */\n/* Notifications */\n/* -------------------------------------------------------------------------- */\n\n/**\n * A header notifications popover. Data-agnostic: the consumer renders the\n * items and owns read state; pass `count` to the trigger for the unread badge.\n */\nfunction AppShellNotifications({ positioning, ...props }: React.ComponentProps<typeof Popover>) {\n return (\n <Popover\n data-slot=\"app-shell-notifications\"\n positioning={{ placement: \"bottom-end\", gutter: 8, ...positioning }}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationsTrigger({\n count = 0,\n max = 99,\n className,\n children,\n asChild,\n ...props\n}: React.ComponentProps<typeof Button> & {\n /** Unread count shown as a badge; hidden when 0. */\n count?: number\n max?: number\n}) {\n const label = count > max ? `${max}+` : String(count)\n return (\n <PopoverTrigger asChild>\n <Button\n data-slot=\"app-shell-notifications-trigger\"\n data-unread={count > 0 ? \"\" : undefined}\n variant=\"ghost\"\n size=\"icon-lg\"\n asChild={asChild}\n className={cn(\"relative scale-95 rounded-full\", className)}\n aria-label={count > 0 ? `Notifications, ${label} unread` : \"Notifications\"}\n {...props}\n >\n {asChild ? children : (children ?? <BellIcon className=\"size-[1.2rem]\" />)}\n {!asChild && count > 0 && (\n <span\n data-slot=\"app-shell-notifications-badge\"\n aria-hidden\n className=\"absolute inset-e-0.5 top-0.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-destructive px-1 text-[10px] leading-none font-medium text-white ring-2 ring-background\"\n >\n {label}\n </span>\n )}\n </Button>\n </PopoverTrigger>\n )\n}\n\nfunction AppShellNotificationsContent({ className, ...props }: React.ComponentProps<typeof PopoverContent>) {\n return (\n <PopoverContent\n data-slot=\"app-shell-notifications-content\"\n className={cn(\"w-80 gap-0 p-0 sm:w-96\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationsHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-notifications-header\"\n className={cn(\"flex items-center justify-between gap-2 border-b px-3.5 py-2.5\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationsTitle({ className, ...props }: React.ComponentProps<\"h3\">) {\n return <h3 data-slot=\"app-shell-notifications-title\" className={cn(\"text-sm font-semibold\", className)} {...props} />\n}\n\n/** A small text action for the header or footer, e.g. \"Mark all as read\". */\nfunction AppShellNotificationsActionTrigger({\n className,\n variant = \"link\",\n size = \"sm\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n return (\n <Button\n data-slot=\"app-shell-notifications-action-trigger\"\n variant={variant}\n size={size}\n className={cn(\"h-auto p-0 text-xs text-muted-foreground hover:text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationsList({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"app-shell-notifications-list\"\n className={cn(\"no-scrollbar flex max-h-96 flex-col gap-0.5 overflow-y-auto p-1\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationItem({\n unread,\n asChild,\n className,\n children,\n ...props\n}: React.ComponentProps<\"li\"> & {\n unread?: boolean\n /** Render the item's child (e.g. an anchor or button) as the interactive surface. */\n asChild?: boolean\n}) {\n const itemClassName = cn(\n \"group/notification relative flex w-full cursor-default gap-3 rounded-md px-2.5 py-2 text-start text-sm outline-hidden transition-colors select-none hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground data-unread:bg-primary/5 dark:data-unread:bg-primary/10\",\n className\n )\n const inner =\n asChild && React.isValidElement(children)\n ? React.cloneElement(children as React.ReactElement<Record<string, unknown>>, {\n \"data-slot\": \"app-shell-notification-item-surface\",\n \"data-unread\": unread ? \"\" : undefined,\n className: cn(itemClassName, (children as React.ReactElement<{ className?: string }>).props.className),\n })\n : children\n return (\n <li\n data-slot=\"app-shell-notification-item\"\n data-unread={unread ? \"\" : undefined}\n className={asChild ? \"flex\" : itemClassName}\n {...props}\n >\n {inner}\n </li>\n )\n}\n\nfunction AppShellNotificationItemIcon({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-notification-item-icon\"\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground [&_svg]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationItemContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-notification-item-content\"\n className={cn(\"flex min-w-0 flex-1 flex-col gap-0.5\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationItemTitle({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"app-shell-notification-item-title\"\n className={cn(\"truncate leading-tight font-medium group-data-unread/notification:text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationItemDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"app-shell-notification-item-description\"\n className={cn(\"line-clamp-2 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationItemTime({ className, ...props }: React.ComponentProps<\"time\">) {\n return (\n <time\n data-slot=\"app-shell-notification-item-time\"\n className={cn(\"text-[11px] text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\n/** The unread dot; renders only inside an unread item. */\nfunction AppShellNotificationItemIndicator({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"app-shell-notification-item-indicator\"\n aria-hidden\n className={cn(\n \"mt-1.5 hidden size-2 shrink-0 rounded-full bg-primary group-data-unread/notification:block\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationsEmpty({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-notifications-empty\"\n className={cn(\n \"flex flex-col items-center justify-center gap-1 px-4 py-10 text-center text-sm text-muted-foreground [&_svg]:mb-1 [&_svg]:size-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationsFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-notifications-footer\"\n className={cn(\"flex items-center justify-center border-t px-3.5 py-2\", className)}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* Theme toggle */\n/* -------------------------------------------------------------------------- */\n\ntype Theme = \"light\" | \"dark\" | \"system\"\n\nfunction AppShellThemeToggle({\n theme,\n onThemeChange,\n className,\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"onChange\"> & {\n theme: Theme\n onThemeChange: (theme: Theme) => void\n}) {\n return (\n <DropdownMenu positioning={{ placement: \"bottom-end\" }}>\n <DropdownMenuTrigger asChild>\n <Button\n data-slot=\"app-shell-theme-toggle\"\n variant=\"ghost\"\n size=\"icon-lg\"\n className={cn(\"scale-95 rounded-full\", className)}\n {...props}\n >\n <SunIcon className=\"size-[1.2rem] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <MoonIcon className=\"absolute size-[1.2rem] scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n <span className=\"sr-only\">Toggle theme</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {([\"light\", \"dark\", \"system\"] as const).map((option) => (\n <DropdownMenuItem key={option} value={option} onSelect={() => onThemeChange(option)}>\n <span className=\"capitalize\">{option}</span>\n <CheckIcon className={cn(\"ms-auto size-3.5\", theme !== option && \"invisible\")} />\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport {\n AppShell,\n AppShellBrand,\n AppShellBrandChevron,\n AppShellBrandDescription,\n AppShellBrandLogo,\n AppShellBrandText,\n AppShellBrandTitle,\n AppShellCommandDialog,\n AppShellContent,\n AppShellHeader,\n AppShellHeaderActions,\n AppShellMain,\n AppShellNav,\n AppShellNavBadge,\n AppShellNavCollapsible,\n AppShellNavItem,\n AppShellNavLabel,\n AppShellNavLink,\n AppShellNavList,\n AppShellNavMenuLink,\n AppShellNavSubItem,\n AppShellNavSubLink,\n AppShellNotificationItem,\n AppShellNotificationItemContent,\n AppShellNotificationItemDescription,\n AppShellNotificationItemIcon,\n AppShellNotificationItemIndicator,\n AppShellNotificationItemTime,\n AppShellNotificationItemTitle,\n AppShellNotifications,\n AppShellNotificationsActionTrigger,\n AppShellNotificationsContent,\n AppShellNotificationsEmpty,\n AppShellNotificationsFooter,\n AppShellNotificationsHeader,\n AppShellNotificationsList,\n AppShellNotificationsTitle,\n AppShellNotificationsTrigger,\n AppShellSearch,\n AppShellSidebar,\n AppShellSkipLink,\n AppShellThemeToggle,\n AppShellTopNav,\n AppShellTopNavLink,\n AppShellTopNavMenu,\n AppShellUser,\n AppShellUserAvatar,\n AppShellUserEmail,\n AppShellUserName,\n AppShellUserText,\n SidebarContent as AppShellSidebarContent,\n SidebarFooter as AppShellSidebarFooter,\n SidebarHeader as AppShellSidebarHeader,\n useAppShell,\n type SidebarCollapsible,\n type SidebarVariant,\n type Theme,\n}\n"
2733
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n BellIcon,\n CheckIcon,\n ChevronRightIcon,\n ChevronsUpDownIcon,\n MenuIcon,\n MoonIcon,\n SearchIcon,\n SunIcon,\n} from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@/components/ui/collapsible\"\nimport { CommandDialog } from \"@/components/ui/command\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { Kbd } from \"@/components/ui/kbd\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\"\nimport { Separator } from \"@/components/ui/separator\"\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInset,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarTrigger,\n useSidebar,\n} from \"@/components/ui/sidebar\"\n\n/* -------------------------------------------------------------------------- */\n/* Root */\n/* -------------------------------------------------------------------------- */\n\ntype SidebarVariant = \"sidebar\" | \"floating\" | \"inset\"\ntype SidebarCollapsible = \"offcanvas\" | \"icon\" | \"none\"\n\ntype AppShellContextValue = {\n variant: SidebarVariant\n setVariant: (variant: SidebarVariant) => void\n /** Controlled sidebar collapse mode: `offcanvas`, `icon`, or `none`. */\n collapsible: SidebarCollapsible\n setCollapsible: (collapsible: SidebarCollapsible) => void\n searchOpen: boolean\n setSearchOpen: React.Dispatch<React.SetStateAction<boolean>>\n}\n\nconst AppShellContext = React.createContext<AppShellContextValue | null>(null)\n\nfunction useAppShell() {\n const ctx = React.useContext(AppShellContext)\n if (!ctx) throw new Error(\"useAppShell must be used within <AppShell>\")\n return ctx\n}\n\n/**\n * Root of the shell. Owns the sidebar open state (via `SidebarProvider`), the\n * sidebar variant and collapse mode, and the global search open state with its\n * Cmd/Ctrl+K shortcut. Routing, theming, and data are the consumer's.\n */\nfunction AppShell({\n variant: variantProp,\n defaultVariant = \"inset\",\n onVariantChange,\n collapsible: collapsibleProp,\n defaultCollapsible = \"icon\",\n onCollapsibleChange,\n searchShortcut = true,\n children,\n ...sidebarProviderProps\n}: Omit<React.ComponentProps<typeof SidebarProvider>, \"children\"> & {\n variant?: SidebarVariant\n /** Initial sidebar variant when uncontrolled. */\n defaultVariant?: SidebarVariant\n /** Called when the sidebar variant changes. */\n onVariantChange?: (variant: SidebarVariant) => void\n /** Controlled sidebar collapse mode: `offcanvas`, `icon`, or `none`. */\n collapsible?: SidebarCollapsible\n /** Initial collapse mode when uncontrolled. */\n defaultCollapsible?: SidebarCollapsible\n /** Called when the collapse mode changes. */\n onCollapsibleChange?: (collapsible: SidebarCollapsible) => void\n /** Toggle the search dialog with Cmd/Ctrl+K. */\n searchShortcut?: boolean\n children?: React.ReactNode\n}) {\n const [variantState, setVariantState] = React.useState(defaultVariant)\n const [collapsibleState, setCollapsibleState] = React.useState(defaultCollapsible)\n const [searchOpen, setSearchOpen] = React.useState(false)\n const variant = variantProp ?? variantState\n const collapsible = collapsibleProp ?? collapsibleState\n\n React.useEffect(() => {\n if (!searchShortcut) return\n const down = (event: KeyboardEvent) => {\n if (event.key === \"k\" && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n setSearchOpen((open) => !open)\n }\n }\n document.addEventListener(\"keydown\", down)\n return () => document.removeEventListener(\"keydown\", down)\n }, [searchShortcut])\n\n const ctx = React.useMemo<AppShellContextValue>(\n () => ({\n variant,\n setVariant: (next) => {\n if (variantProp === undefined) setVariantState(next)\n onVariantChange?.(next)\n },\n collapsible,\n setCollapsible: (next) => {\n if (collapsibleProp === undefined) setCollapsibleState(next)\n onCollapsibleChange?.(next)\n },\n searchOpen,\n setSearchOpen,\n }),\n [variant, variantProp, onVariantChange, collapsible, collapsibleProp, onCollapsibleChange, searchOpen]\n )\n\n return (\n <AppShellContext.Provider value={ctx}>\n <SidebarProvider {...sidebarProviderProps}>{children}</SidebarProvider>\n </AppShellContext.Provider>\n )\n}\n\nfunction AppShellSkipLink({\n className,\n href = \"#content\",\n children = \"Skip to main content\",\n ...props\n}: React.ComponentProps<\"a\">) {\n return (\n <a\n data-slot=\"app-shell-skip-link\"\n href={href}\n className={cn(\n \"fixed inset-s-44 z-999 -translate-y-52 rounded-md bg-primary px-4 py-2 text-sm font-medium whitespace-nowrap text-primary-foreground opacity-95 shadow-sm transition focus:translate-y-3 focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none\",\n className\n )}\n {...props}\n >\n {children}\n </a>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* Sidebar */\n/* -------------------------------------------------------------------------- */\n\nfunction AppShellSidebar({ variant, collapsible, children, ...props }: React.ComponentProps<typeof Sidebar>) {\n const shell = useAppShell()\n return (\n <Sidebar\n data-slot=\"app-shell-sidebar\"\n variant={variant ?? shell.variant}\n collapsible={collapsible ?? shell.collapsible}\n {...props}\n >\n {children}\n <SidebarRail />\n </Sidebar>\n )\n}\n\n/* Brand / team switcher trigger ------------------------------------------- */\n\nfunction AppShellBrand({ className, ...props }: React.ComponentProps<typeof SidebarMenuButton>) {\n return (\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton\n data-slot=\"app-shell-brand\"\n size=\"lg\"\n className={cn(\"data-open:bg-sidebar-accent data-open:text-sidebar-accent-foreground\", className)}\n {...props}\n />\n </SidebarMenuItem>\n </SidebarMenu>\n )\n}\n\nfunction AppShellBrandLogo({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-brand-logo\"\n className={cn(\n \"flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground [&_svg]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AppShellBrandText({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-brand-text\"\n className={cn(\"grid flex-1 text-start text-sm/tight\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellBrandTitle({ className, ...props }: React.ComponentProps<\"span\">) {\n return <span data-slot=\"app-shell-brand-title\" className={cn(\"truncate font-semibold\", className)} {...props} />\n}\n\nfunction AppShellBrandDescription({ className, ...props }: React.ComponentProps<\"span\">) {\n return <span data-slot=\"app-shell-brand-description\" className={cn(\"truncate text-xs\", className)} {...props} />\n}\n\nfunction AppShellBrandChevron({ className, ...props }: React.ComponentProps<typeof ChevronsUpDownIcon>) {\n return <ChevronsUpDownIcon data-slot=\"app-shell-brand-chevron\" className={cn(\"ms-auto\", className)} {...props} />\n}\n\n/* Navigation --------------------------------------------------------------- */\n\nfunction AppShellNav({ ...props }: React.ComponentProps<typeof SidebarGroup>) {\n return <SidebarGroup data-slot=\"app-shell-nav\" {...props} />\n}\n\nfunction AppShellNavLabel({ ...props }: React.ComponentProps<typeof SidebarGroupLabel>) {\n return <SidebarGroupLabel data-slot=\"app-shell-nav-label\" {...props} />\n}\n\nfunction AppShellNavList({ ...props }: React.ComponentProps<typeof SidebarMenu>) {\n return <SidebarMenu data-slot=\"app-shell-nav-list\" {...props} />\n}\n\nfunction AppShellNavItem({ ...props }: React.ComponentProps<typeof SidebarMenuItem>) {\n return <SidebarMenuItem data-slot=\"app-shell-nav-item\" {...props} />\n}\n\n/**\n * A top-level navigation link. Pass the link element as the child with\n * `asChild` (default) so any router's link works. `active` marks the current\n * route; `tooltip` shows when the sidebar is collapsed to icons.\n */\nfunction AppShellNavLink({\n active = false,\n asChild = true,\n onClick,\n ...props\n}: Omit<React.ComponentProps<typeof SidebarMenuButton>, \"isActive\"> & {\n active?: boolean\n}) {\n const { setOpenMobile } = useSidebar()\n return (\n <SidebarMenuButton\n data-slot=\"app-shell-nav-link\"\n asChild={asChild}\n isActive={active}\n onClick={(event) => {\n onClick?.(event)\n setOpenMobile(false)\n }}\n {...props}\n />\n )\n}\n\nfunction AppShellNavBadge({ className, ...props }: React.ComponentProps<typeof Badge>) {\n return (\n <Badge\n data-slot=\"app-shell-nav-badge\"\n className={cn(\"ms-auto rounded-full px-1 py-0 text-xs\", className)}\n {...props}\n />\n )\n}\n\n/**\n * A navigation item with children. Expanded sidebar: a collapsible sub-list.\n * Icon-collapsed sidebar on desktop: a flyout menu. Supply `trigger` for the\n * button content and `menu` for the flyout items; `children` is the sub-list.\n */\nfunction AppShellNavCollapsible({\n active = false,\n defaultOpen,\n tooltip,\n trigger,\n menu,\n children,\n ...props\n}: React.ComponentProps<typeof SidebarMenuItem> & {\n active?: boolean\n defaultOpen?: boolean\n tooltip?: string\n /** Element rendered as the trigger for the collapsible group. */\n trigger: React.ReactNode\n /** Rendered inside the flyout when the sidebar is collapsed to icons. */\n menu?: React.ReactNode\n}) {\n const { state, isMobile } = useSidebar()\n\n if (state === \"collapsed\" && !isMobile) {\n return (\n <SidebarMenuItem data-slot=\"app-shell-nav-collapsible\" {...props}>\n <DropdownMenu positioning={{ placement: \"right-start\", gutter: 4 }}>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton tooltip={tooltip} isActive={active}>\n {trigger}\n <ChevronRightIcon className=\"ms-auto\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent data-slot=\"app-shell-nav-flyout\">\n <DropdownMenuGroup>\n {tooltip && (\n <>\n <DropdownMenuLabel>{tooltip}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n </>\n )}\n {menu}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n )\n }\n\n return (\n <Collapsible\n defaultOpen={defaultOpen ?? active}\n className=\"group/collapsible\"\n unmountOnExit={false}\n lazyMount={false}\n >\n <SidebarMenuItem data-slot=\"app-shell-nav-collapsible\" {...props}>\n <CollapsibleTrigger asChild>\n <SidebarMenuButton tooltip={tooltip} isActive={active}>\n {trigger}\n <ChevronRightIcon className=\"ms-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90 rtl:rotate-180\" />\n </SidebarMenuButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenuSub data-slot=\"app-shell-nav-sublist\">{children}</SidebarMenuSub>\n </CollapsibleContent>\n </SidebarMenuItem>\n </Collapsible>\n )\n}\n\nfunction AppShellNavSubItem({ ...props }: React.ComponentProps<typeof SidebarMenuSubItem>) {\n return <SidebarMenuSubItem data-slot=\"app-shell-nav-subitem\" {...props} />\n}\n\nfunction AppShellNavSubLink({\n active = false,\n asChild = true,\n onClick,\n ...props\n}: Omit<React.ComponentProps<typeof SidebarMenuSubButton>, \"isActive\"> & { active?: boolean }) {\n const { setOpenMobile } = useSidebar()\n return (\n <SidebarMenuSubButton\n data-slot=\"app-shell-nav-sublink\"\n asChild={asChild}\n isActive={active}\n onClick={(event) => {\n onClick?.(event)\n setOpenMobile(false)\n }}\n {...props}\n />\n )\n}\n\n/** A flyout menu entry for the icon-collapsed state. */\nfunction AppShellNavMenuLink({\n active = false,\n className,\n asChild = true,\n ...props\n}: React.ComponentProps<typeof DropdownMenuItem> & { active?: boolean }) {\n return (\n <DropdownMenuItem\n data-slot=\"app-shell-nav-menu-link\"\n asChild={asChild}\n className={cn(active && \"bg-secondary\", className)}\n {...props}\n />\n )\n}\n\n/* User footer trigger ------------------------------------------------------ */\n\nfunction AppShellUser({ className, ...props }: React.ComponentProps<typeof SidebarMenuButton>) {\n return (\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton\n data-slot=\"app-shell-user\"\n size=\"lg\"\n className={cn(\"data-open:bg-sidebar-accent data-open:text-sidebar-accent-foreground\", className)}\n {...props}\n />\n </SidebarMenuItem>\n </SidebarMenu>\n )\n}\n\nfunction AppShellUserAvatar({\n src,\n alt,\n fallback,\n className,\n ...props\n}: React.ComponentProps<typeof Avatar> & { src?: string; alt?: string; fallback: React.ReactNode }) {\n return (\n <Avatar data-slot=\"app-shell-user-avatar\" className={cn(\"rounded-lg\", className)} {...props}>\n {src && <AvatarImage src={src} alt={alt} />}\n <AvatarFallback className=\"rounded-lg\">{fallback}</AvatarFallback>\n </Avatar>\n )\n}\n\nfunction AppShellUserText({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"app-shell-user-text\" className={cn(\"grid flex-1 text-start text-sm/tight\", className)} {...props} />\n )\n}\n\nfunction AppShellUserName({ className, ...props }: React.ComponentProps<\"span\">) {\n return <span data-slot=\"app-shell-user-name\" className={cn(\"truncate font-semibold\", className)} {...props} />\n}\n\nfunction AppShellUserEmail({ className, ...props }: React.ComponentProps<\"span\">) {\n return <span data-slot=\"app-shell-user-email\" className={cn(\"truncate text-xs\", className)} {...props} />\n}\n\n/* -------------------------------------------------------------------------- */\n/* Content area: header, main */\n/* -------------------------------------------------------------------------- */\n\nfunction AppShellContent({ className, ...props }: React.ComponentProps<typeof SidebarInset>) {\n return (\n <SidebarInset\n data-slot=\"app-shell-content\"\n id=\"content\"\n className={cn(\n \"@container/content\",\n \"has-data-[layout=fixed]:h-svh\",\n \"peer-data-[variant=inset]:has-data-[layout=fixed]:h-[calc(100svh-(var(--spacing)*4))]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AppShellHeader({\n className,\n fixed = false,\n children,\n ...props\n}: React.ComponentProps<\"header\"> & { fixed?: boolean }) {\n const [scrolled, setScrolled] = React.useState(false)\n React.useEffect(() => {\n if (!fixed) return\n const onScroll = () => setScrolled((document.body.scrollTop || document.documentElement.scrollTop) > 10)\n onScroll()\n document.addEventListener(\"scroll\", onScroll, { passive: true })\n return () => document.removeEventListener(\"scroll\", onScroll)\n }, [fixed])\n return (\n <header\n data-slot=\"app-shell-header\"\n data-fixed={fixed ? \"\" : undefined}\n data-scrolled={scrolled ? \"\" : undefined}\n className={cn(\n // Solid background; the top corners follow the inset card's radius so the\n // header never squares off the rounded content area.\n \"z-50 h-16 rounded-t-[inherit] bg-background\",\n fixed && \"peer/header sticky top-0 w-[inherit]\",\n fixed && scrolled ? \"shadow-sm\" : \"shadow-none\",\n className\n )}\n {...props}\n >\n <div\n className={cn(\n \"relative flex h-full items-center gap-3 p-4 sm:gap-4\",\n fixed &&\n scrolled &&\n \"after:absolute after:inset-0 after:-z-10 after:rounded-[inherit] after:bg-background/60 after:backdrop-blur-lg\"\n )}\n >\n <SidebarTrigger variant=\"outline\" className=\"max-md:scale-125\" />\n <Separator orientation=\"vertical\" className=\"h-6\" />\n {children}\n </div>\n </header>\n )\n}\n\nfunction AppShellHeaderActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-header-actions\"\n className={cn(\"ms-auto flex items-center gap-3 sm:gap-4\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellMain({\n className,\n fixed = false,\n fluid = false,\n ...props\n}: React.ComponentProps<\"main\"> & { fixed?: boolean; fluid?: boolean }) {\n return (\n <main\n data-slot=\"app-shell-main\"\n data-layout={fixed ? \"fixed\" : \"auto\"}\n className={cn(\n \"px-4 py-6\",\n fixed && \"flex grow flex-col overflow-hidden\",\n !fluid && \"@7xl/content:mx-auto @7xl/content:w-full @7xl/content:max-w-7xl\",\n className\n )}\n {...props}\n />\n )\n}\n\n/* Top nav (secondary, in the header) --------------------------------------- */\n\nfunction AppShellTopNav({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n data-slot=\"app-shell-top-nav\"\n className={cn(\"hidden items-center gap-4 lg:flex xl:gap-6\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellTopNavLink({ active = false, className, ...props }: React.ComponentProps<\"a\"> & { active?: boolean }) {\n return (\n <a\n data-slot=\"app-shell-top-nav-link\"\n data-active={active ? \"\" : undefined}\n className={cn(\n \"text-sm font-medium text-muted-foreground transition-colors hover:text-primary data-active:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\n/** The small-screen counterpart of `AppShellTopNav`: the same links in a menu. */\nfunction AppShellTopNavMenu({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenu> & { className?: string }) {\n return (\n <DropdownMenu positioning={{ placement: \"bottom-start\" }} {...props}>\n <DropdownMenuTrigger asChild>\n <Button\n data-slot=\"app-shell-top-nav-menu-trigger\"\n size=\"icon\"\n variant=\"outline\"\n className={cn(\"md:size-7 lg:hidden\", className)}\n >\n <MenuIcon />\n <span className=\"sr-only\">Toggle navigation menu</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>{children}</DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* Search and command menu */\n/* -------------------------------------------------------------------------- */\n\nfunction AppShellSearch({\n className,\n placeholder = \"Search\",\n onClick,\n asChild,\n children,\n ...props\n}: React.ComponentProps<typeof Button> & { placeholder?: string }) {\n const shell = useAppShell()\n return (\n <Button\n data-slot=\"app-shell-search\"\n variant=\"outline\"\n asChild={asChild}\n className={cn(\n \"group relative h-8 w-full flex-1 justify-start rounded-md bg-muted/25 text-sm font-normal text-muted-foreground shadow-none hover:bg-accent sm:w-40 sm:pe-12 md:flex-none lg:w-52 xl:w-64\",\n className\n )}\n aria-keyshortcuts=\"Meta+K Control+K\"\n onClick={(event) => {\n onClick?.(event)\n if (!event.defaultPrevented) shell.setSearchOpen(true)\n }}\n {...props}\n >\n {asChild\n ? children\n : (children ?? (\n <>\n <SearchIcon aria-hidden className=\"absolute inset-s-1.5 top-1/2 size-4 -translate-y-1/2\" />\n <span className=\"ms-4\">{placeholder}</span>\n <Kbd className=\"pointer-events-none absolute inset-e-1.5 top-1.5 hidden sm:flex\">⌘K</Kbd>\n </>\n ))}\n </Button>\n )\n}\n\n/** A `CommandDialog` bound to the shell's search state. */\nfunction AppShellCommandDialog({\n ...props\n}: Omit<React.ComponentProps<typeof CommandDialog>, \"open\" | \"onOpenChange\">) {\n const shell = useAppShell()\n return <CommandDialog open={shell.searchOpen} onOpenChange={({ open }) => shell.setSearchOpen(open)} {...props} />\n}\n\n/* -------------------------------------------------------------------------- */\n/* Notifications */\n/* -------------------------------------------------------------------------- */\n\n/**\n * A header notifications popover. Data-agnostic: the consumer renders the\n * items and owns read state; pass `count` to the trigger for the unread badge.\n */\nfunction AppShellNotifications({ positioning, ...props }: React.ComponentProps<typeof Popover>) {\n return (\n <Popover\n data-slot=\"app-shell-notifications\"\n positioning={{ placement: \"bottom-end\", gutter: 8, ...positioning }}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationsTrigger({\n count = 0,\n max = 99,\n className,\n children,\n asChild,\n ...props\n}: React.ComponentProps<typeof Button> & {\n /** Unread count shown as a badge; hidden when 0. */\n count?: number\n /** Cap for the badge count; larger counts render as `max+`. */\n max?: number\n}) {\n const label = count > max ? `${max}+` : String(count)\n return (\n <PopoverTrigger asChild>\n <Button\n data-slot=\"app-shell-notifications-trigger\"\n data-unread={count > 0 ? \"\" : undefined}\n variant=\"ghost\"\n size=\"icon-lg\"\n asChild={asChild}\n className={cn(\"relative scale-95 rounded-full\", className)}\n aria-label={count > 0 ? `Notifications, ${label} unread` : \"Notifications\"}\n {...props}\n >\n {asChild ? children : (children ?? <BellIcon className=\"size-[1.2rem]\" />)}\n {!asChild && count > 0 && (\n <span\n data-slot=\"app-shell-notifications-badge\"\n aria-hidden\n className=\"absolute inset-e-0.5 top-0.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-destructive px-1 text-[10px] leading-none font-medium text-white ring-2 ring-background\"\n >\n {label}\n </span>\n )}\n </Button>\n </PopoverTrigger>\n )\n}\n\nfunction AppShellNotificationsContent({ className, ...props }: React.ComponentProps<typeof PopoverContent>) {\n return (\n <PopoverContent\n data-slot=\"app-shell-notifications-content\"\n className={cn(\"w-80 gap-0 p-0 sm:w-96\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationsHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-notifications-header\"\n className={cn(\"flex items-center justify-between gap-2 border-b px-3.5 py-2.5\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationsTitle({ className, ...props }: React.ComponentProps<\"h3\">) {\n return <h3 data-slot=\"app-shell-notifications-title\" className={cn(\"text-sm font-semibold\", className)} {...props} />\n}\n\n/** A small text action for the header or footer, e.g. \"Mark all as read\". */\nfunction AppShellNotificationsActionTrigger({\n className,\n variant = \"link\",\n size = \"sm\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n return (\n <Button\n data-slot=\"app-shell-notifications-action-trigger\"\n variant={variant}\n size={size}\n className={cn(\"h-auto p-0 text-xs text-muted-foreground hover:text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationsList({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"app-shell-notifications-list\"\n className={cn(\"no-scrollbar flex max-h-96 flex-col gap-0.5 overflow-y-auto p-1\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationItem({\n unread,\n asChild,\n className,\n children,\n ...props\n}: React.ComponentProps<\"li\"> & {\n /** Mark the notification unread; sets `data-unread` and shows the indicator. */\n unread?: boolean\n /** Render the item's child (e.g. an anchor or button) as the interactive surface. */\n asChild?: boolean\n}) {\n const itemClassName = cn(\n \"group/notification relative flex w-full cursor-default gap-3 rounded-md px-2.5 py-2 text-start text-sm outline-hidden transition-colors select-none hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground data-unread:bg-primary/5 dark:data-unread:bg-primary/10\",\n className\n )\n const inner =\n asChild && React.isValidElement(children)\n ? React.cloneElement(children as React.ReactElement<Record<string, unknown>>, {\n \"data-slot\": \"app-shell-notification-item-surface\",\n \"data-unread\": unread ? \"\" : undefined,\n className: cn(itemClassName, (children as React.ReactElement<{ className?: string }>).props.className),\n })\n : children\n return (\n <li\n data-slot=\"app-shell-notification-item\"\n data-unread={unread ? \"\" : undefined}\n className={asChild ? \"flex\" : itemClassName}\n {...props}\n >\n {inner}\n </li>\n )\n}\n\nfunction AppShellNotificationItemIcon({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-notification-item-icon\"\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground [&_svg]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationItemContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-notification-item-content\"\n className={cn(\"flex min-w-0 flex-1 flex-col gap-0.5\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationItemTitle({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"app-shell-notification-item-title\"\n className={cn(\"truncate leading-tight font-medium group-data-unread/notification:text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationItemDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"app-shell-notification-item-description\"\n className={cn(\"line-clamp-2 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationItemTime({ className, ...props }: React.ComponentProps<\"time\">) {\n return (\n <time\n data-slot=\"app-shell-notification-item-time\"\n className={cn(\"text-[11px] text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\n/** The unread dot; renders only inside an unread item. */\nfunction AppShellNotificationItemIndicator({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"app-shell-notification-item-indicator\"\n aria-hidden\n className={cn(\n \"mt-1.5 hidden size-2 shrink-0 rounded-full bg-primary group-data-unread/notification:block\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationsEmpty({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-notifications-empty\"\n className={cn(\n \"flex flex-col items-center justify-center gap-1 px-4 py-10 text-center text-sm text-muted-foreground [&_svg]:mb-1 [&_svg]:size-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AppShellNotificationsFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"app-shell-notifications-footer\"\n className={cn(\"flex items-center justify-center border-t px-3.5 py-2\", className)}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* Theme toggle */\n/* -------------------------------------------------------------------------- */\n\ntype Theme = \"light\" | \"dark\" | \"system\"\n\nfunction AppShellThemeToggle({\n theme,\n onThemeChange,\n className,\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"onChange\"> & {\n /** Current theme: `light`, `dark`, or `system`. */\n theme: Theme\n /** Called with the next theme when the toggle is used. */\n onThemeChange: (theme: Theme) => void\n}) {\n return (\n <DropdownMenu positioning={{ placement: \"bottom-end\" }}>\n <DropdownMenuTrigger asChild>\n <Button\n data-slot=\"app-shell-theme-toggle\"\n variant=\"ghost\"\n size=\"icon-lg\"\n className={cn(\"scale-95 rounded-full\", className)}\n {...props}\n >\n <SunIcon className=\"size-[1.2rem] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <MoonIcon className=\"absolute size-[1.2rem] scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n <span className=\"sr-only\">Toggle theme</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {([\"light\", \"dark\", \"system\"] as const).map((option) => (\n <DropdownMenuItem key={option} value={option} onSelect={() => onThemeChange(option)}>\n <span className=\"capitalize\">{option}</span>\n <CheckIcon className={cn(\"ms-auto size-3.5\", theme !== option && \"invisible\")} />\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport {\n AppShell,\n AppShellBrand,\n AppShellBrandChevron,\n AppShellBrandDescription,\n AppShellBrandLogo,\n AppShellBrandText,\n AppShellBrandTitle,\n AppShellCommandDialog,\n AppShellContent,\n AppShellHeader,\n AppShellHeaderActions,\n AppShellMain,\n AppShellNav,\n AppShellNavBadge,\n AppShellNavCollapsible,\n AppShellNavItem,\n AppShellNavLabel,\n AppShellNavLink,\n AppShellNavList,\n AppShellNavMenuLink,\n AppShellNavSubItem,\n AppShellNavSubLink,\n AppShellNotificationItem,\n AppShellNotificationItemContent,\n AppShellNotificationItemDescription,\n AppShellNotificationItemIcon,\n AppShellNotificationItemIndicator,\n AppShellNotificationItemTime,\n AppShellNotificationItemTitle,\n AppShellNotifications,\n AppShellNotificationsActionTrigger,\n AppShellNotificationsContent,\n AppShellNotificationsEmpty,\n AppShellNotificationsFooter,\n AppShellNotificationsHeader,\n AppShellNotificationsList,\n AppShellNotificationsTitle,\n AppShellNotificationsTrigger,\n AppShellSearch,\n AppShellSidebar,\n AppShellSkipLink,\n AppShellThemeToggle,\n AppShellTopNav,\n AppShellTopNavLink,\n AppShellTopNavMenu,\n AppShellUser,\n AppShellUserAvatar,\n AppShellUserEmail,\n AppShellUserName,\n AppShellUserText,\n SidebarContent as AppShellSidebarContent,\n SidebarFooter as AppShellSidebarFooter,\n SidebarHeader as AppShellSidebarHeader,\n useAppShell,\n type SidebarCollapsible,\n type SidebarVariant,\n type Theme,\n}\n"
81
2734
  }
82
2735
  ],
83
2736
  "docs": "## App shell\n`src/components/ui/app-shell.tsx` is a compositional, router-agnostic shell built on\n`sidebar.tsx` (shadcn-admin layout): `AppShell` (context: sidebar variant/collapsible,\nsearch open state, `searchShortcut` for cmd/ctrl+K), `AppShellSidebar` + `AppShellBrand*`,\n`AppShellNav*` (groups, links with `active`, badges, `AppShellNavCollapsible` that becomes\na dropdown flyout when the sidebar is icon-collapsed), `AppShellUser*`, `AppShellContent`,\n`AppShellHeader` (fixed/sticky with scroll shadow, includes the sidebar trigger),\n`AppShellHeaderActions`, `AppShellMain` (`fixed` = viewport-height, `fluid` = full width),\n`AppShellTopNav*`, `AppShellSearch` + `AppShellCommandDialog` (bound to shell search\nstate; nest a `Command` inside), `AppShellNotifications*` (Popover-based bell with a `count`\nbadge on the trigger; header/title/action, list, `AppShellNotificationItem` with `unread` +\n`asChild` surface, icon/content/title/description/time/indicator, empty, footer; data and read\nstate are the consumer's), and `AppShellThemeToggle` (`theme`/`onThemeChange`, no theme\nlibrary assumed). Header icon buttons use `size=\"icon-lg\"` (size-9, `scale-95 rounded-full`)\nand `AppShellHeaderActions` uses the header's `gap-3 sm:gap-4` to match shadcn-admin. Navigation is plain anchors with `asChild` so any router works.\n`src/demo/shell/` is the reference (nav data, hash router, team/user menus, command menu)\nand `src/app.tsx` wraps every demo route in it. `AppShellDemo` takes `headerStart` for\npage-specific header content (the dashboard passes its `AppShellTopNav` + `AppShellTopNavMenu`)."