@ctrl-ui/react 0.8.6 → 0.8.8

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 (376) hide show
  1. package/dist/action-bar.d.ts +15 -7
  2. package/dist/action-bar.js +39 -19
  3. package/dist/activity.js +7 -15
  4. package/dist/audio-recorder.d.ts +14 -4
  5. package/dist/audio-recorder.js +82 -29
  6. package/dist/audio-visualizer.js +1 -1
  7. package/dist/blocks/coding-agent.js +54 -57
  8. package/dist/blocks/design-canvas-data.d.ts +32 -0
  9. package/dist/blocks/design-canvas-data.js +100 -0
  10. package/dist/blocks/design-canvas-inspector.d.ts +8 -0
  11. package/dist/blocks/design-canvas-inspector.js +238 -0
  12. package/dist/blocks/design-canvas.d.ts +21 -0
  13. package/dist/blocks/design-canvas.js +452 -0
  14. package/dist/blocks/discussion.d.ts +28 -0
  15. package/dist/blocks/discussion.js +67 -0
  16. package/dist/blocks/file-explorer-data.d.ts +1 -0
  17. package/dist/blocks/file-explorer-data.js +4 -1
  18. package/dist/blocks/file-explorer.d.ts +9 -1
  19. package/dist/blocks/file-explorer.js +461 -192
  20. package/dist/blocks/settings.d.ts +2 -1
  21. package/dist/blocks/settings.js +101 -79
  22. package/dist/blocks/team-chat.d.ts +12 -0
  23. package/dist/blocks/team-chat.js +26 -0
  24. package/dist/blocks/theme-toggle.js +23 -31
  25. package/dist/chat-composer-attachment.d.ts +12 -3
  26. package/dist/chat-composer-attachment.js +61 -19
  27. package/dist/chat-composer-editor/extensions/mention.d.ts +5 -1
  28. package/dist/chat-composer-editor/extensions/mention.js +58 -27
  29. package/dist/chat-composer-editor/ghost.js +2 -4
  30. package/dist/chat-composer-editor/types.d.ts +5 -0
  31. package/dist/chat-composer-editor.d.ts +1 -1
  32. package/dist/chat-composer-editor.js +71 -28
  33. package/dist/chat-composer.d.ts +13 -32
  34. package/dist/chat-composer.js +54 -13
  35. package/dist/chat-layout.d.ts +19 -0
  36. package/dist/chat-layout.js +96 -32
  37. package/dist/chat-message/social.d.ts +26 -0
  38. package/dist/chat-message/social.js +122 -0
  39. package/dist/chat-message.d.ts +28 -29
  40. package/dist/chat-message.js +106 -25
  41. package/dist/context.d.ts +2 -2
  42. package/dist/context.js +38 -23
  43. package/dist/dynamic-notification-canvas-loop.d.ts +24 -0
  44. package/dist/dynamic-notification-canvas-loop.js +113 -0
  45. package/dist/dynamic-notification-glass.js +23 -114
  46. package/dist/dynamic-notification-liquid.js +14 -118
  47. package/dist/dynamic-notification.d.ts +16 -8
  48. package/dist/dynamic-notification.js +85 -22
  49. package/dist/email/email-brand.d.ts +7 -4
  50. package/dist/email/email-brand.js +9 -6
  51. package/dist/email/email-code.d.ts +3 -2
  52. package/dist/email/email-code.js +11 -9
  53. package/dist/email/email-footer.d.ts +5 -3
  54. package/dist/email/email-footer.js +11 -5
  55. package/dist/email/email.d.ts +31 -9
  56. package/dist/email/email.js +50 -26
  57. package/dist/email/templates.d.ts +10 -9
  58. package/dist/email/templates.js +102 -38
  59. package/dist/email/theme.js +1 -1
  60. package/dist/environment-variables.d.ts +4 -2
  61. package/dist/environment-variables.js +52 -32
  62. package/dist/filter-bar/context.d.ts +32 -0
  63. package/dist/filter-bar/context.js +11 -0
  64. package/dist/filter-bar/editor.d.ts +14 -0
  65. package/dist/filter-bar/editor.js +216 -0
  66. package/dist/filter-bar/model.d.ts +10 -0
  67. package/dist/filter-bar/model.js +57 -0
  68. package/dist/filter-bar/motion.d.ts +10 -0
  69. package/dist/filter-bar/motion.js +84 -0
  70. package/dist/filter-bar/parts.d.ts +19 -0
  71. package/dist/filter-bar/parts.js +244 -0
  72. package/dist/filter-bar/types.d.ts +54 -0
  73. package/dist/filter-bar/types.js +0 -0
  74. package/dist/filter-bar.d.ts +27 -0
  75. package/dist/filter-bar.js +310 -0
  76. package/dist/hooks/use-audio-recorder.js +12 -6
  77. package/dist/hooks/use-chat-composer.d.ts +21 -7
  78. package/dist/hooks/use-chat-composer.js +32 -5
  79. package/dist/hooks/use-chat-message.d.ts +28 -2
  80. package/dist/hooks/use-chat-message.js +41 -10
  81. package/dist/hooks/use-chat-thread-scroll.js +43 -7
  82. package/dist/hooks/use-color-area.d.ts +3 -3
  83. package/dist/hooks/use-color-area.js +13 -12
  84. package/dist/hooks/use-copy-to-clipboard.d.ts +2 -1
  85. package/dist/hooks/use-copy-to-clipboard.js +20 -20
  86. package/dist/hooks/use-dropzone.d.ts +7 -4
  87. package/dist/hooks/use-dropzone.js +34 -3
  88. package/dist/hooks/use-dynamic-notification.d.ts +6 -2
  89. package/dist/hooks/use-dynamic-notification.js +26 -10
  90. package/dist/hooks/use-mobile.d.ts +3 -2
  91. package/dist/hooks/use-mobile.js +8 -4
  92. package/dist/hooks/use-textarea-trigger-menu.js +2 -1
  93. package/dist/hooks/use-trigger-menu.d.ts +54 -0
  94. package/dist/hooks/use-trigger-menu.js +102 -47
  95. package/dist/hooks/use-user-ask.d.ts +2 -0
  96. package/dist/hooks/use-user-ask.js +35 -41
  97. package/dist/inline-attachment.d.ts +6 -2
  98. package/dist/inline-attachment.js +44 -29
  99. package/dist/inline-citation.d.ts +12 -5
  100. package/dist/inline-citation.js +25 -16
  101. package/dist/knob-contracts/audio-recorder-knobs.d.ts +1 -1
  102. package/dist/knob-contracts/audio-recorder-knobs.js +2 -1
  103. package/dist/knob-contracts/audio-visualizer-knobs.d.ts +1 -1
  104. package/dist/knob-contracts/audio-visualizer-knobs.js +2 -1
  105. package/dist/knob-contracts/avatar-knobs.d.ts +1 -1
  106. package/dist/knob-contracts/avatar-knobs.js +6 -1
  107. package/dist/knob-contracts/badge-knobs.d.ts +1 -1
  108. package/dist/knob-contracts/badge-knobs.js +2 -1
  109. package/dist/knob-contracts/breadcrumb-knobs.d.ts +4 -0
  110. package/dist/knob-contracts/breadcrumb-knobs.js +8 -0
  111. package/dist/knob-contracts/button-knobs.d.ts +1 -1
  112. package/dist/knob-contracts/button-knobs.js +1 -0
  113. package/dist/knob-contracts/chat-layout-knobs.d.ts +1 -1
  114. package/dist/knob-contracts/chat-layout-knobs.js +2 -1
  115. package/dist/knob-contracts/chat-message-knobs.d.ts +1 -1
  116. package/dist/knob-contracts/chat-message-knobs.js +8 -1
  117. package/dist/knob-contracts/choice-knobs.d.ts +1 -1
  118. package/dist/knob-contracts/choice-knobs.js +1 -0
  119. package/dist/knob-contracts/code-diff-knobs.d.ts +1 -1
  120. package/dist/knob-contracts/code-diff-knobs.js +2 -0
  121. package/dist/knob-contracts/code-knobs.d.ts +1 -1
  122. package/dist/knob-contracts/code-knobs.js +2 -1
  123. package/dist/knob-contracts/collapsible-knobs.d.ts +1 -1
  124. package/dist/knob-contracts/collapsible-knobs.js +1 -1
  125. package/dist/knob-contracts/dynamic-notification-knobs.d.ts +1 -1
  126. package/dist/knob-contracts/dynamic-notification-knobs.js +2 -0
  127. package/dist/knob-contracts/emoji-picker-knobs.d.ts +4 -0
  128. package/dist/knob-contracts/emoji-picker-knobs.js +10 -0
  129. package/dist/knob-contracts/field-knobs.d.ts +1 -1
  130. package/dist/knob-contracts/field-knobs.js +5 -1
  131. package/dist/knob-contracts/filter-bar-knobs.d.ts +4 -0
  132. package/dist/knob-contracts/filter-bar-knobs.js +15 -0
  133. package/dist/knob-contracts/infinite-canvas-knobs.d.ts +1 -1
  134. package/dist/knob-contracts/infinite-canvas-knobs.js +3 -0
  135. package/dist/knob-contracts/markdown-knobs.d.ts +1 -1
  136. package/dist/knob-contracts/markdown-knobs.js +3 -1
  137. package/dist/knob-contracts/page-layout-knobs.d.ts +1 -1
  138. package/dist/knob-contracts/page-layout-knobs.js +4 -1
  139. package/dist/knob-contracts/popup-knobs.d.ts +1 -1
  140. package/dist/knob-contracts/popup-knobs.js +28 -0
  141. package/dist/knob-contracts/range-knobs.d.ts +1 -1
  142. package/dist/knob-contracts/range-knobs.js +1 -0
  143. package/dist/knob-contracts/rich-tooltip-knobs.d.ts +1 -1
  144. package/dist/knob-contracts/rich-tooltip-knobs.js +2 -1
  145. package/dist/knob-contracts/sidebar-knobs.d.ts +1 -1
  146. package/dist/knob-contracts/sidebar-knobs.js +27 -2
  147. package/dist/knob-contracts/spinner-knobs.d.ts +1 -1
  148. package/dist/knob-contracts/spinner-knobs.js +1 -1
  149. package/dist/knob-contracts/stepper-knobs.d.ts +1 -1
  150. package/dist/knob-contracts/stepper-knobs.js +4 -1
  151. package/dist/knob-contracts/switch-knobs.d.ts +1 -1
  152. package/dist/knob-contracts/switch-knobs.js +5 -0
  153. package/dist/knob-contracts/table-of-contents-knobs.d.ts +1 -1
  154. package/dist/knob-contracts/table-of-contents-knobs.js +4 -5
  155. package/dist/knob-contracts/tabs-knobs.d.ts +1 -1
  156. package/dist/knob-contracts/tabs-knobs.js +1 -0
  157. package/dist/knob-contracts/tree-knobs.d.ts +1 -1
  158. package/dist/knob-contracts/tree-knobs.js +2 -1
  159. package/dist/lib/cn.js +0 -4
  160. package/dist/lib/contrast.d.ts +1 -0
  161. package/dist/lib/contrast.js +17 -5
  162. package/dist/lib/dropzone-validation.js +41 -28
  163. package/dist/lib/env-file.d.ts +1 -1
  164. package/dist/lib/env-file.js +5 -5
  165. package/dist/lib/motion.d.ts +4 -0
  166. package/dist/lib/motion.js +15 -0
  167. package/dist/lib/trigger-detect.js +6 -8
  168. package/dist/markdown-block.js +13 -8
  169. package/dist/popup-parts.d.ts +8 -0
  170. package/dist/popup-parts.js +43 -0
  171. package/dist/scripts/contrast-eval.js +5 -4
  172. package/dist/source-badge.js +3 -1
  173. package/dist/styles/code.css +0 -2
  174. package/dist/styles/effects.css +6 -32
  175. package/dist/styles/index.css +14 -8
  176. package/dist/styles/recipes/accordion.css +9 -6
  177. package/dist/styles/recipes/action-bar.css +0 -15
  178. package/dist/styles/recipes/activity.css +5 -11
  179. package/dist/styles/recipes/alert.css +4 -4
  180. package/dist/styles/recipes/audio-recorder.css +15 -3
  181. package/dist/styles/recipes/audio-visualizer.css +13 -2
  182. package/dist/styles/recipes/avatar.css +78 -1
  183. package/dist/styles/recipes/badge.css +14 -4
  184. package/dist/styles/recipes/breadcrumb.css +77 -0
  185. package/dist/styles/recipes/button-group.css +6 -8
  186. package/dist/styles/recipes/button-states.css +66 -0
  187. package/dist/styles/recipes/button.css +26 -85
  188. package/dist/styles/recipes/calendar.css +17 -23
  189. package/dist/styles/recipes/card.css +2 -2
  190. package/dist/styles/recipes/chat-composer-attachment.css +9 -3
  191. package/dist/styles/recipes/chat-composer.css +21 -16
  192. package/dist/styles/recipes/chat-layout.css +64 -2
  193. package/dist/styles/recipes/chat-message-social.css +123 -0
  194. package/dist/styles/recipes/chat-message.css +157 -37
  195. package/dist/styles/recipes/choice.css +25 -21
  196. package/dist/styles/recipes/code-diff.css +51 -26
  197. package/dist/styles/recipes/code.css +44 -18
  198. package/dist/styles/recipes/collapsible.css +43 -1
  199. package/dist/styles/recipes/color-picker-details.css +3 -4
  200. package/dist/styles/recipes/color-picker-values.css +9 -8
  201. package/dist/styles/recipes/color-picker.css +23 -4
  202. package/dist/styles/recipes/context.css +3 -3
  203. package/dist/styles/recipes/dockable-panel.css +18 -7
  204. package/dist/styles/recipes/dropzone.css +7 -8
  205. package/dist/styles/recipes/dynamic-notification-input.css +8 -5
  206. package/dist/styles/recipes/dynamic-notification-motion.css +12 -21
  207. package/dist/styles/recipes/dynamic-notification.css +40 -26
  208. package/dist/styles/recipes/emoji-picker.css +132 -0
  209. package/dist/styles/recipes/empty.css +5 -4
  210. package/dist/styles/recipes/environment-variables.css +4 -15
  211. package/dist/styles/recipes/field-parts.css +89 -21
  212. package/dist/styles/recipes/field.css +83 -26
  213. package/dist/styles/recipes/filter-bar.css +161 -0
  214. package/dist/styles/recipes/gradient-editor.css +18 -7
  215. package/dist/styles/recipes/infinite-canvas.css +51 -4
  216. package/dist/styles/recipes/inline-attachment.css +9 -4
  217. package/dist/styles/recipes/inline-citation.css +10 -4
  218. package/dist/styles/recipes/item.css +23 -9
  219. package/dist/styles/recipes/markdown-block.css +5 -4
  220. package/dist/styles/recipes/markdown.css +68 -26
  221. package/dist/styles/recipes/morphing-panel.css +8 -8
  222. package/dist/styles/recipes/page-layout.css +36 -10
  223. package/dist/styles/recipes/pagination.css +5 -6
  224. package/dist/styles/recipes/phone-input.css +12 -8
  225. package/dist/styles/recipes/popup-controls.css +175 -26
  226. package/dist/styles/recipes/popup-drawer.css +35 -44
  227. package/dist/styles/recipes/popup-lists.css +139 -29
  228. package/dist/styles/recipes/popup-motion.css +4 -45
  229. package/dist/styles/recipes/popup-toast.css +55 -26
  230. package/dist/styles/recipes/popup.css +149 -153
  231. package/dist/styles/recipes/range.css +55 -19
  232. package/dist/styles/recipes/resizable.css +36 -7
  233. package/dist/styles/recipes/rich-tooltip.css +24 -34
  234. package/dist/styles/recipes/scroll-area.css +8 -1
  235. package/dist/styles/recipes/sidebar-menu.css +149 -34
  236. package/dist/styles/recipes/sidebar-parts.css +154 -0
  237. package/dist/styles/recipes/sidebar.css +187 -128
  238. package/dist/styles/recipes/source-badge.css +1 -1
  239. package/dist/styles/recipes/spinner.css +12 -1
  240. package/dist/styles/recipes/stepper.css +31 -13
  241. package/dist/styles/recipes/switch.css +68 -23
  242. package/dist/styles/recipes/table-of-contents.css +49 -41
  243. package/dist/styles/recipes/table.css +14 -10
  244. package/dist/styles/recipes/tabs.css +38 -12
  245. package/dist/styles/recipes/task-list.css +7 -14
  246. package/dist/styles/recipes/thread-rail.css +42 -19
  247. package/dist/styles/recipes/timeline.css +2 -0
  248. package/dist/styles/recipes/toolbar.css +27 -25
  249. package/dist/styles/recipes/track-highlight.css +12 -8
  250. package/dist/styles/recipes/transcript-divider.css +2 -2
  251. package/dist/styles/recipes/tree.css +31 -4
  252. package/dist/styles/recipes/user-ask-details.css +0 -1
  253. package/dist/styles/recipes/user-ask.css +4 -4
  254. package/dist/styles/theme.css +287 -107
  255. package/dist/task-list.d.ts +4 -1
  256. package/dist/task-list.js +24 -8
  257. package/dist/thread-rail.d.ts +1 -1
  258. package/dist/thread-rail.js +61 -19
  259. package/dist/transcript-divider.js +2 -1
  260. package/dist/ui/alert.d.ts +3 -1
  261. package/dist/ui/alert.js +14 -8
  262. package/dist/ui/autocomplete.js +7 -1
  263. package/dist/ui/avatar.d.ts +8 -0
  264. package/dist/ui/avatar.js +23 -3
  265. package/dist/ui/badge.js +1 -1
  266. package/dist/ui/breadcrumb.d.ts +27 -0
  267. package/dist/ui/breadcrumb.js +88 -0
  268. package/dist/ui/button.d.ts +2 -1
  269. package/dist/ui/button.js +1 -1
  270. package/dist/ui/calendar.js +2 -2
  271. package/dist/ui/card.d.ts +3 -1
  272. package/dist/ui/card.js +12 -7
  273. package/dist/ui/checkbox-group.js +1 -1
  274. package/dist/ui/checkbox.d.ts +2 -0
  275. package/dist/ui/code-diff.d.ts +1 -1
  276. package/dist/ui/code-diff.js +71 -27
  277. package/dist/ui/code.d.ts +5 -3
  278. package/dist/ui/code.js +27 -28
  279. package/dist/ui/color-picker.d.ts +5 -2
  280. package/dist/ui/color-picker.js +84 -36
  281. package/dist/ui/combobox-disabled-selection.d.ts +1 -2
  282. package/dist/ui/combobox-disabled-selection.js +7 -8
  283. package/dist/ui/combobox.d.ts +5 -23
  284. package/dist/ui/combobox.js +36 -16
  285. package/dist/ui/command.d.ts +8 -2
  286. package/dist/ui/command.js +39 -15
  287. package/dist/ui/context-menu.js +3 -0
  288. package/dist/ui/dialog.d.ts +2 -1
  289. package/dist/ui/dialog.js +3 -22
  290. package/dist/ui/dockable-panel-geometry.d.ts +1 -0
  291. package/dist/ui/dockable-panel-geometry.js +7 -1
  292. package/dist/ui/dockable-panel.d.ts +9 -6
  293. package/dist/ui/dockable-panel.js +81 -33
  294. package/dist/ui/drawer.d.ts +7 -4
  295. package/dist/ui/drawer.js +35 -22
  296. package/dist/ui/dropdown-menu.js +4 -3
  297. package/dist/ui/dropzone.d.ts +5 -3
  298. package/dist/ui/dropzone.js +78 -17
  299. package/dist/ui/emoji-picker.d.ts +18 -0
  300. package/dist/ui/emoji-picker.js +136 -0
  301. package/dist/ui/empty.d.ts +3 -1
  302. package/dist/ui/empty.js +12 -7
  303. package/dist/ui/field.js +1 -1
  304. package/dist/ui/gradient-editor.d.ts +1 -1
  305. package/dist/ui/gradient-editor.js +37 -21
  306. package/dist/ui/infinite-canvas.d.ts +13 -1
  307. package/dist/ui/infinite-canvas.js +139 -20
  308. package/dist/ui/input-group.d.ts +2 -4
  309. package/dist/ui/input-group.js +13 -14
  310. package/dist/ui/input-otp.d.ts +1 -1
  311. package/dist/ui/input-otp.js +32 -15
  312. package/dist/ui/input.js +11 -2
  313. package/dist/ui/item.d.ts +2 -1
  314. package/dist/ui/item.js +11 -7
  315. package/dist/ui/live-status.d.ts +7 -0
  316. package/dist/ui/live-status.js +17 -0
  317. package/dist/ui/markdown-elements.d.ts +6 -0
  318. package/dist/ui/markdown-elements.js +42 -9
  319. package/dist/ui/menubar.js +2 -2
  320. package/dist/ui/morphing-panel.js +2 -1
  321. package/dist/ui/native-select.d.ts +1 -1
  322. package/dist/ui/native-select.js +24 -11
  323. package/dist/ui/number-field.d.ts +1 -1
  324. package/dist/ui/number-field.js +13 -2
  325. package/dist/ui/page-layout.d.ts +2 -2
  326. package/dist/ui/page-layout.js +2 -4
  327. package/dist/ui/pagination.d.ts +7 -5
  328. package/dist/ui/pagination.js +19 -13
  329. package/dist/ui/phone-input.d.ts +1 -0
  330. package/dist/ui/phone-input.js +56 -58
  331. package/dist/ui/radio-group.d.ts +3 -0
  332. package/dist/ui/radio-group.js +11 -1
  333. package/dist/ui/resizable.d.ts +20 -2
  334. package/dist/ui/resizable.js +130 -8
  335. package/dist/ui/responsive-dialog.d.ts +1 -1
  336. package/dist/ui/responsive-dialog.js +9 -23
  337. package/dist/ui/rich-tooltip.d.ts +10 -4
  338. package/dist/ui/rich-tooltip.js +81 -33
  339. package/dist/ui/scroll-area.d.ts +4 -1
  340. package/dist/ui/scroll-area.js +44 -28
  341. package/dist/ui/select.d.ts +2 -1
  342. package/dist/ui/select.js +57 -32
  343. package/dist/ui/sidebar-menu.d.ts +5 -1
  344. package/dist/ui/sidebar-menu.js +31 -33
  345. package/dist/ui/sidebar-provider.d.ts +10 -1
  346. package/dist/ui/sidebar-provider.js +38 -13
  347. package/dist/ui/sidebar-resize-rail.js +7 -3
  348. package/dist/ui/sidebar.d.ts +11 -6
  349. package/dist/ui/sidebar.js +46 -23
  350. package/dist/ui/slider.js +31 -22
  351. package/dist/ui/spinner.d.ts +3 -2
  352. package/dist/ui/spinner.js +3 -2
  353. package/dist/ui/stepper.d.ts +8 -1
  354. package/dist/ui/stepper.js +74 -25
  355. package/dist/ui/switch.d.ts +1 -0
  356. package/dist/ui/table-of-contents.d.ts +5 -4
  357. package/dist/ui/table-of-contents.js +143 -52
  358. package/dist/ui/table.js +15 -9
  359. package/dist/ui/textarea.d.ts +1 -1
  360. package/dist/ui/textarea.js +20 -9
  361. package/dist/ui/timeline.d.ts +3 -1
  362. package/dist/ui/timeline.js +17 -9
  363. package/dist/ui/toast.d.ts +11 -5
  364. package/dist/ui/toast.js +100 -54
  365. package/dist/ui/toggle.d.ts +1 -1
  366. package/dist/ui/toggle.js +2 -1
  367. package/dist/ui/toolbar.d.ts +3 -2
  368. package/dist/ui/toolbar.js +4 -2
  369. package/dist/ui/tooltip.js +3 -20
  370. package/dist/ui/tree.js +120 -80
  371. package/dist/ui/trigger-menu.js +7 -2
  372. package/dist/user-ask.d.ts +10 -5
  373. package/dist/user-ask.js +31 -11
  374. package/package.json +5 -1
  375. package/dist/hooks/use-keyboard-navigation.d.ts +0 -3
  376. package/dist/hooks/use-keyboard-navigation.js +0 -22
@@ -9,9 +9,10 @@ export type SettingsBlockProps = Omit<ComponentProps<"div">, "children"> & {
9
9
  onActivePageChange?: (pageId: string) => void;
10
10
  backAction?: ReactNode;
11
11
  searchPlaceholder?: string;
12
+ searchLabel?: string;
12
13
  layout?: "viewport" | "contained";
13
14
  };
14
- export declare function SettingsBlock({ pages, activePageId, defaultActivePageId, onActivePageChange, backAction, searchPlaceholder, layout, className, style, ...props }: SettingsBlockProps): import("react").JSX.Element;
15
+ export declare function SettingsBlock({ pages, activePageId, defaultActivePageId, onActivePageChange, backAction, searchPlaceholder, searchLabel, layout, className, style, ...props }: SettingsBlockProps): import("react").JSX.Element;
15
16
  export declare function SettingsBackAction({ children, ...props }: Omit<ComponentProps<typeof Button>, "children"> & {
16
17
  children?: ReactNode;
17
18
  }): import("react").JSX.Element;
@@ -1,19 +1,22 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { Button } from "../ui/button.js";
4
+ import { LiveStatus } from "../ui/live-status.js";
4
5
  import { ScrollArea } from "../ui/scroll-area.js";
5
- import { InputGroup, InputGroupAddon, InputGroupInput } from "../ui/input-group.js";
6
+ import { prefersReducedMotion } from "../lib/motion.js";
7
+ import { InputGroup, InputGroupAddon } from "../ui/input-group.js";
8
+ import { Input } from "../ui/input.js";
6
9
  import { SidebarProvider, useSidebar } from "../ui/sidebar-provider.js";
7
10
  import { SidebarGroup, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem } from "../ui/sidebar-menu.js";
8
11
  import { Sidebar, SidebarContent, SidebarHeader, SidebarInset, SidebarTrigger } from "../ui/sidebar.js";
9
- import { Empty, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from "../ui/empty.js";
12
+ import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from "../ui/empty.js";
10
13
  import { searchSettings } from "./settings-data.js";
11
14
  import { Field, FieldContent, FieldDescription, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet } from "../ui/field.js";
12
15
  import { useEffect, useId, useState } from "react";
13
16
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
14
17
  import { ArrowLeftIcon, SearchIcon, XIcon } from "lucide-react";
15
18
  //#region src/blocks/settings.tsx
16
- function SettingsBlock({ pages, activePageId, defaultActivePageId, onActivePageChange, backAction, searchPlaceholder = "Search settings", layout = "viewport", className, style, ...props }) {
19
+ function SettingsBlock({ pages, activePageId, defaultActivePageId, onActivePageChange, backAction, searchPlaceholder = "Search settings", searchLabel = "Search settings", layout = "viewport", className, style, ...props }) {
17
20
  const [internalPageId, setInternalPageId] = useState(defaultActivePageId ?? pages[0]?.id);
18
21
  const [query, setQuery] = useState("");
19
22
  const [pendingTarget, setPendingTarget] = useState(null);
@@ -30,8 +33,8 @@ function SettingsBlock({ pages, activePageId, defaultActivePageId, onActivePageC
30
33
  ...style
31
34
  };
32
35
  return /* @__PURE__ */ jsx(SidebarProvider, {
33
- "data-settings-layout": layout,
34
- className: cn("overflow-hidden bg-background text-foreground", layout === "viewport" ? "h-svh min-h-svh" : "relative h-full min-h-0", className),
36
+ layout,
37
+ className: cn("bg-background text-foreground", layout === "viewport" && "h-svh overflow-hidden", className),
35
38
  style: providerStyle,
36
39
  ...props,
37
40
  children: /* @__PURE__ */ jsx(SettingsShell, {
@@ -41,7 +44,7 @@ function SettingsBlock({ pages, activePageId, defaultActivePageId, onActivePageC
41
44
  results,
42
45
  backAction,
43
46
  searchPlaceholder,
44
- contained: layout === "contained",
47
+ searchLabel,
45
48
  instanceId,
46
49
  pendingTarget,
47
50
  onPendingTargetChange: setPendingTarget,
@@ -50,7 +53,7 @@ function SettingsBlock({ pages, activePageId, defaultActivePageId, onActivePageC
50
53
  })
51
54
  });
52
55
  }
53
- function SettingsShell({ pages, currentPage, query, results, backAction, searchPlaceholder, contained, instanceId, pendingTarget, onPendingTargetChange, onPageChange, onQueryChange }) {
56
+ function SettingsShell({ pages, currentPage, query, results, backAction, searchPlaceholder, searchLabel, instanceId, pendingTarget, onPendingTargetChange, onPageChange, onQueryChange }) {
54
57
  const { setOpenMobile } = useSidebar();
55
58
  useEffect(() => {
56
59
  if (!pendingTarget || currentPage?.id !== pendingTarget.pageId) return;
@@ -59,7 +62,7 @@ function SettingsShell({ pages, currentPage, query, results, backAction, searchP
59
62
  const control = document.getElementById(pendingTarget.controlId);
60
63
  row?.scrollIntoView({
61
64
  block: "center",
62
- behavior: window.matchMedia("(prefers-reduced-motion: reduce)").matches ? "auto" : "smooth"
65
+ behavior: prefersReducedMotion(row) ? "auto" : "smooth"
63
66
  });
64
67
  (control instanceof HTMLElement ? control : row)?.focus({ preventScroll: true });
65
68
  onPendingTargetChange(null);
@@ -83,62 +86,71 @@ function SettingsShell({ pages, currentPage, query, results, backAction, searchP
83
86
  });
84
87
  navigate(result.page.id);
85
88
  }
86
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs(Sidebar, {
87
- collapsible: "offcanvas",
88
- className: contained ? "absolute! inset-y-0! h-full" : void 0,
89
- children: [/* @__PURE__ */ jsxs(SidebarHeader, {
90
- className: "gap-3 border-b border-sidebar-border p-3",
91
- children: [backAction ? /* @__PURE__ */ jsx("div", {
92
- className: "min-w-0",
93
- children: backAction
94
- }) : null, /* @__PURE__ */ jsx(SettingsSearch, {
95
- value: query,
96
- placeholder: searchPlaceholder,
97
- onValueChange: onQueryChange
98
- })]
99
- }), /* @__PURE__ */ jsx(SidebarContent, { children: query.trim() ? /* @__PURE__ */ jsx(SettingsSearchNavigation, {
100
- results,
101
- onSelect: openResult
102
- }) : /* @__PURE__ */ jsx(SettingsPageNavigation, {
103
- pages,
104
- activePageId: currentPage?.id,
105
- onSelect: navigate
106
- }) })]
107
- }), /* @__PURE__ */ jsxs(SidebarInset, {
108
- className: "h-full min-h-0 min-w-0",
109
- children: [/* @__PURE__ */ jsxs("header", {
110
- className: "flex h-12 shrink-0 items-center gap-2 border-b px-3 md:hidden",
111
- children: [/* @__PURE__ */ jsx(SidebarTrigger, {}), /* @__PURE__ */ jsx("span", {
112
- className: "truncate text-label font-medium",
113
- children: currentPage?.title ?? "Settings"
89
+ const trimmedQuery = query.trim();
90
+ const resultCount = `${results.length} ${results.length === 1 ? "setting" : "settings"} found`;
91
+ const searchStatus = results.length > 0 ? resultCount : "No matching settings";
92
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
93
+ /* @__PURE__ */ jsx(LiveStatus, { message: trimmedQuery ? searchStatus : "" }),
94
+ /* @__PURE__ */ jsxs(Sidebar, {
95
+ collapsible: "offcanvas",
96
+ children: [/* @__PURE__ */ jsxs(SidebarHeader, {
97
+ className: "gap-3 border-b border-sidebar-border p-3",
98
+ children: [backAction ? /* @__PURE__ */ jsx("div", {
99
+ className: "min-w-0",
100
+ children: backAction
101
+ }) : null, /* @__PURE__ */ jsx(SettingsSearch, {
102
+ value: query,
103
+ label: searchLabel,
104
+ placeholder: searchPlaceholder,
105
+ onValueChange: onQueryChange
106
+ })]
107
+ }), /* @__PURE__ */ jsx(SidebarContent, { children: trimmedQuery ? /* @__PURE__ */ jsx(SettingsSearchNavigation, {
108
+ results,
109
+ onSelect: openResult,
110
+ onClear: () => onQueryChange("")
111
+ }) : /* @__PURE__ */ jsx(SettingsPageNavigation, {
112
+ pages,
113
+ activePageId: currentPage?.id,
114
+ onSelect: navigate
115
+ }) })]
116
+ }),
117
+ /* @__PURE__ */ jsxs(SidebarInset, {
118
+ className: "h-full min-h-0 min-w-0",
119
+ children: [/* @__PURE__ */ jsxs("header", {
120
+ className: "flex h-12 shrink-0 items-center gap-2 border-b px-3 lg:hidden",
121
+ children: [/* @__PURE__ */ jsx(SidebarTrigger, {}), /* @__PURE__ */ jsx("span", {
122
+ className: "truncate text-label font-medium",
123
+ title: currentPage?.title,
124
+ children: currentPage?.title ?? "Settings"
125
+ })]
126
+ }), /* @__PURE__ */ jsx(ScrollArea, {
127
+ className: "min-h-0 flex-1",
128
+ lockAxis: "x",
129
+ children: currentPage ? /* @__PURE__ */ jsx(SettingsPage, {
130
+ page: currentPage,
131
+ instanceId
132
+ }) : /* @__PURE__ */ jsx(SettingsEmpty, {
133
+ title: "No settings",
134
+ description: "Add a settings page to populate this space."
135
+ })
114
136
  })]
115
- }), /* @__PURE__ */ jsx(ScrollArea, {
116
- className: "min-h-0 flex-1",
117
- lockAxis: "x",
118
- children: currentPage ? /* @__PURE__ */ jsx(SettingsPage, {
119
- page: currentPage,
120
- instanceId
121
- }) : /* @__PURE__ */ jsx(SettingsEmpty, {
122
- title: "No settings",
123
- description: "Add a settings page to populate this space."
124
- })
125
- })]
126
- })] });
137
+ })
138
+ ] });
127
139
  }
128
- function SettingsSearch({ value, placeholder, onValueChange }) {
140
+ function SettingsSearch({ value, label, placeholder, onValueChange }) {
129
141
  return /* @__PURE__ */ jsxs(InputGroup, {
130
142
  size: "sm",
131
143
  children: [
132
144
  /* @__PURE__ */ jsx(InputGroupAddon, {
133
- className: "pl-2.5",
145
+ className: "ps-2.5",
134
146
  children: /* @__PURE__ */ jsx(SearchIcon, {
135
147
  className: "size-3.5",
136
148
  "aria-hidden": "true"
137
149
  })
138
150
  }),
139
- /* @__PURE__ */ jsx(InputGroupInput, {
151
+ /* @__PURE__ */ jsx(Input, {
140
152
  type: "search",
141
- "aria-label": placeholder,
153
+ "aria-label": label,
142
154
  placeholder,
143
155
  value,
144
156
  onChange: (event) => onValueChange(event.currentTarget.value)
@@ -148,9 +160,12 @@ function SettingsSearch({ value, placeholder, onValueChange }) {
148
160
  size: "xs",
149
161
  iconOnly: true,
150
162
  "aria-label": "Clear settings search",
151
- className: "mr-1",
163
+ className: "me-1",
152
164
  onClick: () => onValueChange(""),
153
- children: /* @__PURE__ */ jsx(XIcon, { className: "size-3.5" })
165
+ children: /* @__PURE__ */ jsx(XIcon, {
166
+ className: "size-3.5",
167
+ "aria-hidden": "true"
168
+ })
154
169
  }) : null
155
170
  ]
156
171
  });
@@ -163,10 +178,16 @@ function SettingsPageNavigation({ pages, activePageId, onSelect }) {
163
178
  children: [page.icon, /* @__PURE__ */ jsx("span", { children: page.title })]
164
179
  }) }, page.id)) })] });
165
180
  }
166
- function SettingsSearchNavigation({ results, onSelect }) {
181
+ function SettingsSearchNavigation({ results, onSelect, onClear }) {
167
182
  if (results.length === 0) return /* @__PURE__ */ jsx(SettingsEmpty, {
168
183
  title: "No matching settings",
169
- description: "Try another name or keyword."
184
+ description: "Try another name or keyword.",
185
+ action: /* @__PURE__ */ jsx(Button, {
186
+ variant: "surface",
187
+ size: "sm",
188
+ onClick: onClear,
189
+ children: "Clear search"
190
+ })
170
191
  });
171
192
  const groups = /* @__PURE__ */ new Map();
172
193
  for (const result of results) {
@@ -177,28 +198,22 @@ function SettingsSearchNavigation({ results, onSelect }) {
177
198
  group.results.push(result);
178
199
  groups.set(result.page.id, group);
179
200
  }
180
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("span", {
181
- className: "sr-only",
182
- role: "status",
183
- "aria-live": "polite",
184
- children: [
185
- results.length,
186
- " ",
187
- results.length === 1 ? "setting" : "settings",
188
- " found"
189
- ]
190
- }), [...groups.values()].map((group) => /* @__PURE__ */ jsxs(SidebarGroup, { children: [/* @__PURE__ */ jsxs(SidebarGroupLabel, { children: [group.page.icon, /* @__PURE__ */ jsx("span", { children: group.page.title })] }), /* @__PURE__ */ jsx(SidebarMenu, { children: group.results.map((result) => /* @__PURE__ */ jsx(SidebarMenuItem, { children: /* @__PURE__ */ jsx(SidebarMenuButton, {
201
+ return /* @__PURE__ */ jsx(Fragment$1, { children: [...groups.values()].map((group) => /* @__PURE__ */ jsxs(SidebarGroup, { children: [/* @__PURE__ */ jsxs(SidebarGroupLabel, { children: [group.page.icon, /* @__PURE__ */ jsx("span", { children: group.page.title })] }), /* @__PURE__ */ jsx(SidebarMenu, { children: group.results.map((result) => /* @__PURE__ */ jsx(SidebarMenuItem, { children: /* @__PURE__ */ jsx(SidebarMenuButton, {
191
202
  size: "sm",
192
- className: "h-auto min-h-[var(--control-h-sm)] py-1.5",
203
+ className: "h-auto min-h-(--control-h-sm) py-1.5",
193
204
  onClick: () => onSelect(result),
194
- children: /* @__PURE__ */ jsx("span", { children: result.setting.title })
195
- }) }, `${result.section.id}/${result.setting.id}`)) })] }, group.page.id))] });
205
+ children: /* @__PURE__ */ jsx("span", {
206
+ title: result.setting.title,
207
+ children: result.setting.title
208
+ })
209
+ }) }, `${result.section.id}/${result.setting.id}`)) })] }, group.page.id)) });
196
210
  }
197
211
  function SettingsPage({ page, instanceId }) {
212
+ const { layout } = useSidebar();
198
213
  return /* @__PURE__ */ jsxs("div", {
199
214
  className: "mx-auto flex w-full max-w-4xl flex-col gap-10 px-5 py-8 md:px-10 md:py-12",
200
- children: [/* @__PURE__ */ jsx("h1", {
201
- className: "text-heading font-semibold text-foreground text-balance",
215
+ children: [/* @__PURE__ */ jsx(layout === "contained" ? "h2" : "h1", {
216
+ className: "text-heading-2 text-foreground text-balance",
202
217
  children: page.title
203
218
  }), page.sections.map((section) => /* @__PURE__ */ jsxs(FieldSet, {
204
219
  className: "gap-3",
@@ -244,17 +259,20 @@ function SettingsRow({ pageId, sectionId, setting, instanceId, separated }) {
244
259
  })]
245
260
  })] });
246
261
  }
247
- function SettingsEmpty({ title, description }) {
248
- return /* @__PURE__ */ jsx(Empty, {
262
+ function SettingsEmpty({ title, description, action }) {
263
+ return /* @__PURE__ */ jsxs(Empty, {
249
264
  className: "min-h-40 gap-3 p-4",
250
- children: /* @__PURE__ */ jsxs(EmptyHeader, { children: [
265
+ children: [/* @__PURE__ */ jsxs(EmptyHeader, { children: [
251
266
  /* @__PURE__ */ jsx(EmptyMedia, {
252
267
  className: "mb-0 size-8",
253
- children: /* @__PURE__ */ jsx(SearchIcon, { className: "size-4" })
268
+ children: /* @__PURE__ */ jsx(SearchIcon, {
269
+ className: "size-4",
270
+ "aria-hidden": "true"
271
+ })
254
272
  }),
255
273
  /* @__PURE__ */ jsx(EmptyTitle, { children: title }),
256
274
  /* @__PURE__ */ jsx(EmptyDescription, { children: description })
257
- ] })
275
+ ] }), action ? /* @__PURE__ */ jsx(EmptyContent, { children: action }) : null]
258
276
  });
259
277
  }
260
278
  function settingDomIds(instanceId, pageId, sectionId, settingId) {
@@ -275,9 +293,13 @@ function SettingsBackAction({ children = "Back to app", ...props }) {
275
293
  return /* @__PURE__ */ jsxs(Button, {
276
294
  variant: "quiet",
277
295
  size: "sm",
278
- className: "-ml-1 justify-start gap-2",
296
+ className: "-ms-1 justify-start gap-2",
279
297
  ...props,
280
- children: [/* @__PURE__ */ jsx(ArrowLeftIcon, { className: "size-4" }), children]
298
+ children: [/* @__PURE__ */ jsx(ArrowLeftIcon, {
299
+ className: "size-4",
300
+ "data-icon-dir": "inline",
301
+ "aria-hidden": "true"
302
+ }), children]
281
303
  });
282
304
  }
283
305
  //#endregion
@@ -0,0 +1,12 @@
1
+ import { SidebarProvider } from "../ui/sidebar-provider.js";
2
+ import "../ui/sidebar.js";
3
+ import { ComponentProps, ReactNode } from "react";
4
+ //#region src/blocks/team-chat.d.ts
5
+ export type TeamChatBlockProps = Omit<ComponentProps<typeof SidebarProvider>, "children"> & {
6
+ sidebar: ReactNode;
7
+ children: ReactNode;
8
+ thread?: ReactNode;
9
+ threadLabel?: string;
10
+ };
11
+ export declare function TeamChatBlock({ sidebar, children, thread, threadLabel, className, ...props }: TeamChatBlockProps): import("react").JSX.Element;
12
+ //#endregion
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { SidebarProvider } from "../ui/sidebar-provider.js";
4
+ import { SidebarInset } from "../ui/sidebar.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/blocks/team-chat.tsx
7
+ function TeamChatBlock({ sidebar, children, thread, threadLabel = "Thread", className, ...props }) {
8
+ const threadIsOpen = thread !== void 0 && thread !== null;
9
+ return /* @__PURE__ */ jsxs(SidebarProvider, {
10
+ className: cn("bg-background text-foreground", className),
11
+ ...props,
12
+ children: [sidebar, /* @__PURE__ */ jsxs(SidebarInset, {
13
+ className: "@container/team-chat flex h-full min-h-0 min-w-0 flex-row",
14
+ children: [/* @__PURE__ */ jsx("div", {
15
+ className: cn("flex min-h-0 min-w-0 flex-1 flex-col", threadIsOpen && "@max-3xl/team-chat:hidden"),
16
+ children
17
+ }), threadIsOpen ? /* @__PURE__ */ jsx("aside", {
18
+ "aria-label": threadLabel,
19
+ className: "flex min-h-0 w-full min-w-0 flex-col border-border @3xl/team-chat:w-[min(26rem,45%)] @3xl/team-chat:shrink-0 @3xl/team-chat:border-s",
20
+ children: thread
21
+ }) : null]
22
+ })]
23
+ });
24
+ }
25
+ //#endregion
26
+ export { TeamChatBlock };
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { Button } from "../ui/button.js";
3
- import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger } from "../ui/dropdown-menu.js";
3
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger } from "../ui/dropdown-menu.js";
4
4
  import { Switch } from "../ui/switch.js";
5
5
  import { useId } from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
- import { CheckIcon, ChevronDownIcon, MonitorIcon, MoonIcon, SunIcon } from "lucide-react";
7
+ import { ChevronDownIcon, MonitorIcon, MoonIcon, SunIcon } from "lucide-react";
8
8
  //#region src/blocks/theme-toggle.tsx
9
9
  const systemThemeOption = {
10
10
  value: "system",
@@ -53,7 +53,7 @@ function ThemeSwitch({ value, onValueChange, onValue = "dark", offValue = "light
53
53
  checkedIcon: checkedIcon ?? defaultSwitchCheckedIcon,
54
54
  uncheckedIcon: uncheckedIcon ?? defaultSwitchUncheckedIcon,
55
55
  onCheckedChange: (checked) => onValueChange(checked ? onValue : offValue),
56
- "aria-label": ariaLabel ?? "Dark mode",
56
+ "aria-label": ariaLabel ?? `${currentThemeOption(onValue, defaultThemeOptions).label} mode`,
57
57
  ...props
58
58
  });
59
59
  }
@@ -61,10 +61,9 @@ function ThemeSegmentedSwitch({ value, onValueChange, options = defaultThemeOpti
61
61
  const generatedName = useId();
62
62
  const choices = controlOptions(options);
63
63
  const currentValue = effectiveThemeValue(value, choices);
64
- const activeIndex = Math.max(0, choices.findIndex((option) => option.value === currentValue));
65
64
  const indicatorStyle = {
66
- width: `calc((100% - var(--_theme-switch-padding) * 2) / ${choices.length})`,
67
- transform: `translateX(${activeIndex * 100}%)`
65
+ "--_theme-switch-index": Math.max(0, choices.findIndex((option) => option.value === currentValue)),
66
+ width: `calc((100% - var(--_theme-switch-padding) * 2) / ${choices.length})`
68
67
  };
69
68
  return /* @__PURE__ */ jsxs("div", {
70
69
  role: "radiogroup",
@@ -80,7 +79,7 @@ function ThemeSegmentedSwitch({ value, onValueChange, options = defaultThemeOpti
80
79
  "data-control-ui": "theme-toggle",
81
80
  "data-control-family": "theme-toggle",
82
81
  "data-slot": "indicator",
83
- className: "pointer-events-none absolute inset-y-(--_theme-switch-padding) left-(--_theme-switch-padding) rounded-(--_theme-switch-radius) bg-background shadow-(--shadow-sm) transition-transform duration-(--duration-base) ease-(--ease-standard)",
82
+ className: "pointer-events-none absolute inset-y-(--_theme-switch-padding) start-(--_theme-switch-padding) translate-x-[calc(var(--_theme-switch-index)*100%)] rounded-(--_theme-switch-radius) bg-background shadow-(--shadow-sm) transition-transform duration-(--duration-base) ease-(--ease-standard) rtl:translate-x-[calc(var(--_theme-switch-index)*-100%)]",
84
83
  style: indicatorStyle
85
84
  }), choices.map((option) => {
86
85
  const selected = option.value === currentValue;
@@ -92,7 +91,7 @@ function ThemeSegmentedSwitch({ value, onValueChange, options = defaultThemeOpti
92
91
  "data-control": "true",
93
92
  "data-selected": selected ? "true" : void 0,
94
93
  "data-disabled": option.disabled ? "true" : void 0,
95
- className: classes("relative z-[1] inline-flex h-(--control-h-xs) cursor-pointer items-center justify-center gap-1.5 rounded-(--_theme-switch-radius) px-1.5 text-label font-medium transition-colors duration-(--duration-fast) ease-(--ease-standard) hover:text-foreground data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-45 data-[selected=true]:text-foreground", showLabels ? "min-w-20" : "w-(--control-h-xs)"),
94
+ className: classes("relative z-[1] inline-flex h-(--control-h-xs) cursor-pointer items-center justify-center gap-1.5 rounded-(--_theme-switch-radius) px-1.5 text-label font-medium transition-colors duration-(--duration-fast) ease-(--ease-standard) not-data-[disabled=true]:hover:text-foreground data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-(--disabled-opacity) data-[selected=true]:text-foreground", showLabels ? "min-w-20" : "w-(--control-h-xs)"),
96
95
  children: [
97
96
  /* @__PURE__ */ jsx("input", {
98
97
  type: "radio",
@@ -140,7 +139,7 @@ function ThemeDropdown({ value, onValueChange, options = defaultThemeOptions, la
140
139
  const current = currentThemeOption(value, options);
141
140
  const CurrentIcon = current.icon;
142
141
  return /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsxs(DropdownMenuTrigger, {
143
- "aria-label": ariaLabel ?? label,
142
+ "aria-label": ariaLabel ?? `${label}: ${current.label}`,
144
143
  className: classes("min-w-36 gap-2", className),
145
144
  ...props,
146
145
  children: [
@@ -157,33 +156,26 @@ function ThemeDropdown({ value, onValueChange, options = defaultThemeOptions, la
157
156
  "aria-hidden": true
158
157
  })
159
158
  ]
160
- }), /* @__PURE__ */ jsxs(DropdownMenuContent, {
159
+ }), /* @__PURE__ */ jsx(DropdownMenuContent, {
161
160
  className: "min-w-40",
162
- children: [/* @__PURE__ */ jsx(DropdownMenuLabel, { children: label }), options.map((option) => {
163
- const selected = option.value === value;
164
- const Icon = option.icon;
165
- return /* @__PURE__ */ jsxs(DropdownMenuItem, {
166
- disabled: option.disabled,
167
- onClick: () => onValueChange(option.value),
168
- children: [
169
- /* @__PURE__ */ jsx(Icon, {
161
+ children: /* @__PURE__ */ jsxs(DropdownMenuRadioGroup, {
162
+ value,
163
+ onValueChange,
164
+ children: [/* @__PURE__ */ jsx(DropdownMenuLabel, { children: label }), options.map((option) => {
165
+ const Icon = option.icon;
166
+ return /* @__PURE__ */ jsxs(DropdownMenuRadioItem, {
167
+ value: option.value,
168
+ disabled: option.disabled,
169
+ children: [/* @__PURE__ */ jsx(Icon, {
170
170
  className: "size-3.5",
171
171
  "aria-hidden": true
172
- }),
173
- /* @__PURE__ */ jsx("span", {
172
+ }), /* @__PURE__ */ jsx("span", {
174
173
  className: "min-w-0 flex-1 truncate",
175
174
  children: option.label
176
- }),
177
- selected ? /* @__PURE__ */ jsx(CheckIcon, {
178
- className: "size-3.5",
179
- "aria-hidden": true
180
- }) : /* @__PURE__ */ jsx("span", {
181
- className: "size-3.5",
182
- "aria-hidden": true
183
- })
184
- ]
185
- }, option.value);
186
- })]
175
+ })]
176
+ }, option.value);
177
+ })]
178
+ })
187
179
  })] });
188
180
  }
189
181
  //#endregion
@@ -13,8 +13,14 @@ export type ChatComposerAttachmentsProps = ComponentProps<"div"> & {
13
13
  style?: CSSProperties & ChatComposerAttachmentKnobStyle;
14
14
  };
15
15
  export declare function ChatComposerAttachments({ label, className, viewportClassName, children, ...props }: ChatComposerAttachmentsProps): import("react").JSX.Element;
16
- export type ChatComposerAttachmentProps = Omit<ComponentProps<"li">, "style"> & {
16
+ type ChatComposerAttachmentSource = {
17
+ file: File;
18
+ name?: string;
19
+ } | {
20
+ file?: undefined;
17
21
  name: string;
22
+ };
23
+ export type ChatComposerAttachmentProps = Omit<ComponentProps<"li">, "style"> & ChatComposerAttachmentSource & {
18
24
  type?: string;
19
25
  description?: ReactNode;
20
26
  status?: ChatComposerAttachmentStatus;
@@ -24,9 +30,12 @@ export type ChatComposerAttachmentProps = Omit<ComponentProps<"li">, "style"> &
24
30
  variant?: ChatComposerAttachmentVariant;
25
31
  onRemove?: () => void;
26
32
  removeLabel?: string;
33
+ errorLabel?: string;
34
+ uploadedLabel?: (name: string) => string;
35
+ uploadFailedLabel?: (name: string) => string;
27
36
  style?: CSSProperties & ChatComposerAttachmentKnobStyle;
28
37
  };
29
- export declare function ChatComposerAttachment({ name, type, description, status, progress: progressInput, previewUrl, kind, variant, onRemove, removeLabel, className, children, role, "aria-label": ariaLabel, ...props }: ChatComposerAttachmentProps): import("react").JSX.Element;
38
+ export declare function ChatComposerAttachment({ file, name: nameInput, type: typeInput, description, status, progress: progressInput, previewUrl: previewUrlInput, kind, variant, onRemove, removeLabel, errorLabel, uploadedLabel, uploadFailedLabel, className, children, "aria-label": ariaLabel, ...props }: ChatComposerAttachmentProps): import("react").JSX.Element;
30
39
  export type ChatComposerAttachmentPreviewProps = Omit<ComponentProps<"div">, "style"> & {
31
40
  style?: CSSProperties & ChatComposerAttachmentKnobStyle;
32
41
  };
@@ -50,5 +59,5 @@ export declare function ChatComposerAttachmentRemove({ className, onClick, child
50
59
  export type ChatComposerAttachmentProgressProps = Omit<ComponentProps<"div">, "style"> & {
51
60
  style?: CSSProperties & ChatComposerAttachmentKnobStyle;
52
61
  };
53
- export declare function ChatComposerAttachmentProgress({ className, children, style, ...props }: ChatComposerAttachmentProgressProps): import("react").JSX.Element | null;
62
+ export declare function ChatComposerAttachmentProgress({ className, children, ...props }: ChatComposerAttachmentProgressProps): import("react").JSX.Element | null;
54
63
  //#endregion