@ctrl-ui/react 0.8.7 → 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 (351) hide show
  1. package/dist/action-bar.d.ts +15 -7
  2. package/dist/action-bar.js +40 -20
  3. package/dist/activity.js +8 -16
  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 +39 -39
  8. package/dist/blocks/design-canvas-inspector.js +2 -2
  9. package/dist/blocks/design-canvas.d.ts +5 -1
  10. package/dist/blocks/design-canvas.js +200 -94
  11. package/dist/blocks/discussion.d.ts +28 -0
  12. package/dist/blocks/discussion.js +67 -0
  13. package/dist/blocks/file-explorer-data.d.ts +1 -0
  14. package/dist/blocks/file-explorer-data.js +4 -1
  15. package/dist/blocks/file-explorer.d.ts +9 -1
  16. package/dist/blocks/file-explorer.js +461 -192
  17. package/dist/blocks/settings.d.ts +2 -1
  18. package/dist/blocks/settings.js +102 -80
  19. package/dist/blocks/team-chat.d.ts +12 -0
  20. package/dist/blocks/team-chat.js +26 -0
  21. package/dist/blocks/theme-toggle.js +23 -31
  22. package/dist/chat-composer-attachment.d.ts +4 -1
  23. package/dist/chat-composer-attachment.js +35 -10
  24. package/dist/chat-composer-editor/extensions/mention.d.ts +5 -1
  25. package/dist/chat-composer-editor/extensions/mention.js +58 -27
  26. package/dist/chat-composer-editor/ghost.js +2 -4
  27. package/dist/chat-composer-editor/types.d.ts +5 -0
  28. package/dist/chat-composer-editor.d.ts +1 -1
  29. package/dist/chat-composer-editor.js +57 -30
  30. package/dist/chat-composer.d.ts +13 -32
  31. package/dist/chat-composer.js +53 -13
  32. package/dist/chat-layout.d.ts +19 -0
  33. package/dist/chat-layout.js +91 -40
  34. package/dist/chat-message/social.d.ts +26 -0
  35. package/dist/chat-message/social.js +122 -0
  36. package/dist/chat-message.d.ts +28 -29
  37. package/dist/chat-message.js +106 -25
  38. package/dist/context.d.ts +2 -2
  39. package/dist/context.js +39 -24
  40. package/dist/dynamic-notification-canvas-loop.d.ts +24 -0
  41. package/dist/dynamic-notification-canvas-loop.js +113 -0
  42. package/dist/dynamic-notification-glass.js +23 -114
  43. package/dist/dynamic-notification-liquid.js +14 -118
  44. package/dist/dynamic-notification.d.ts +16 -8
  45. package/dist/dynamic-notification.js +86 -23
  46. package/dist/email/email-brand.d.ts +7 -4
  47. package/dist/email/email-brand.js +9 -6
  48. package/dist/email/email-code.d.ts +3 -2
  49. package/dist/email/email-code.js +11 -9
  50. package/dist/email/email-footer.d.ts +5 -3
  51. package/dist/email/email-footer.js +11 -5
  52. package/dist/email/email.d.ts +31 -9
  53. package/dist/email/email.js +50 -26
  54. package/dist/email/templates.d.ts +10 -9
  55. package/dist/email/templates.js +102 -38
  56. package/dist/email/theme.js +1 -1
  57. package/dist/environment-variables.d.ts +4 -2
  58. package/dist/environment-variables.js +52 -32
  59. package/dist/filter-bar/editor.js +20 -8
  60. package/dist/filter-bar/model.d.ts +1 -0
  61. package/dist/filter-bar/model.js +10 -1
  62. package/dist/filter-bar/motion.js +4 -4
  63. package/dist/filter-bar/parts.js +20 -9
  64. package/dist/filter-bar/types.d.ts +1 -0
  65. package/dist/filter-bar.js +20 -14
  66. package/dist/hooks/use-audio-recorder.js +12 -6
  67. package/dist/hooks/use-chat-composer.d.ts +19 -7
  68. package/dist/hooks/use-chat-composer.js +32 -5
  69. package/dist/hooks/use-chat-message.d.ts +28 -2
  70. package/dist/hooks/use-chat-message.js +41 -10
  71. package/dist/hooks/use-chat-thread-scroll.js +43 -7
  72. package/dist/hooks/use-color-area.d.ts +3 -3
  73. package/dist/hooks/use-color-area.js +13 -12
  74. package/dist/hooks/use-copy-to-clipboard.d.ts +2 -1
  75. package/dist/hooks/use-copy-to-clipboard.js +20 -20
  76. package/dist/hooks/use-dynamic-notification.d.ts +6 -2
  77. package/dist/hooks/use-dynamic-notification.js +26 -10
  78. package/dist/hooks/use-mobile.d.ts +3 -2
  79. package/dist/hooks/use-mobile.js +8 -4
  80. package/dist/hooks/use-textarea-trigger-menu.js +2 -1
  81. package/dist/hooks/use-trigger-menu.d.ts +54 -0
  82. package/dist/hooks/use-trigger-menu.js +102 -47
  83. package/dist/hooks/use-user-ask.d.ts +2 -0
  84. package/dist/hooks/use-user-ask.js +35 -41
  85. package/dist/inline-attachment.d.ts +6 -2
  86. package/dist/inline-attachment.js +36 -15
  87. package/dist/inline-citation.d.ts +12 -5
  88. package/dist/inline-citation.js +26 -17
  89. package/dist/knob-contracts/audio-recorder-knobs.d.ts +1 -1
  90. package/dist/knob-contracts/audio-recorder-knobs.js +2 -1
  91. package/dist/knob-contracts/audio-visualizer-knobs.d.ts +1 -1
  92. package/dist/knob-contracts/audio-visualizer-knobs.js +2 -1
  93. package/dist/knob-contracts/avatar-knobs.d.ts +1 -1
  94. package/dist/knob-contracts/avatar-knobs.js +6 -1
  95. package/dist/knob-contracts/badge-knobs.d.ts +1 -1
  96. package/dist/knob-contracts/badge-knobs.js +2 -1
  97. package/dist/knob-contracts/breadcrumb-knobs.d.ts +4 -0
  98. package/dist/knob-contracts/breadcrumb-knobs.js +8 -0
  99. package/dist/knob-contracts/button-knobs.d.ts +1 -1
  100. package/dist/knob-contracts/button-knobs.js +1 -0
  101. package/dist/knob-contracts/chat-message-knobs.d.ts +1 -1
  102. package/dist/knob-contracts/chat-message-knobs.js +8 -1
  103. package/dist/knob-contracts/code-diff-knobs.d.ts +1 -1
  104. package/dist/knob-contracts/code-diff-knobs.js +2 -0
  105. package/dist/knob-contracts/code-knobs.d.ts +1 -1
  106. package/dist/knob-contracts/code-knobs.js +2 -1
  107. package/dist/knob-contracts/dynamic-notification-knobs.d.ts +1 -1
  108. package/dist/knob-contracts/dynamic-notification-knobs.js +2 -0
  109. package/dist/knob-contracts/emoji-picker-knobs.d.ts +4 -0
  110. package/dist/knob-contracts/emoji-picker-knobs.js +10 -0
  111. package/dist/knob-contracts/field-knobs.d.ts +1 -1
  112. package/dist/knob-contracts/field-knobs.js +5 -1
  113. package/dist/knob-contracts/filter-bar-knobs.d.ts +1 -1
  114. package/dist/knob-contracts/filter-bar-knobs.js +1 -2
  115. package/dist/knob-contracts/markdown-knobs.d.ts +1 -1
  116. package/dist/knob-contracts/markdown-knobs.js +3 -1
  117. package/dist/knob-contracts/page-layout-knobs.d.ts +1 -1
  118. package/dist/knob-contracts/page-layout-knobs.js +2 -1
  119. package/dist/knob-contracts/popup-knobs.d.ts +1 -1
  120. package/dist/knob-contracts/popup-knobs.js +27 -0
  121. package/dist/knob-contracts/range-knobs.d.ts +1 -1
  122. package/dist/knob-contracts/range-knobs.js +1 -0
  123. package/dist/knob-contracts/rich-tooltip-knobs.d.ts +1 -1
  124. package/dist/knob-contracts/rich-tooltip-knobs.js +2 -1
  125. package/dist/knob-contracts/sidebar-knobs.d.ts +1 -1
  126. package/dist/knob-contracts/sidebar-knobs.js +27 -2
  127. package/dist/knob-contracts/spinner-knobs.d.ts +1 -1
  128. package/dist/knob-contracts/spinner-knobs.js +1 -1
  129. package/dist/knob-contracts/stepper-knobs.d.ts +1 -1
  130. package/dist/knob-contracts/stepper-knobs.js +4 -1
  131. package/dist/knob-contracts/switch-knobs.d.ts +1 -1
  132. package/dist/knob-contracts/switch-knobs.js +5 -0
  133. package/dist/knob-contracts/table-of-contents-knobs.d.ts +1 -1
  134. package/dist/knob-contracts/table-of-contents-knobs.js +2 -1
  135. package/dist/knob-contracts/tabs-knobs.d.ts +1 -1
  136. package/dist/knob-contracts/tabs-knobs.js +1 -0
  137. package/dist/knob-contracts/tree-knobs.d.ts +1 -1
  138. package/dist/knob-contracts/tree-knobs.js +2 -1
  139. package/dist/lib/cn.js +0 -4
  140. package/dist/lib/contrast.d.ts +1 -0
  141. package/dist/lib/contrast.js +17 -5
  142. package/dist/lib/dropzone-validation.js +41 -28
  143. package/dist/lib/env-file.d.ts +1 -1
  144. package/dist/lib/env-file.js +5 -5
  145. package/dist/lib/motion.d.ts +4 -0
  146. package/dist/lib/motion.js +15 -0
  147. package/dist/lib/phone-input-format.js +1 -1
  148. package/dist/lib/trigger-detect.js +6 -8
  149. package/dist/markdown-block.js +2 -1
  150. package/dist/popup-parts.d.ts +8 -0
  151. package/dist/popup-parts.js +43 -0
  152. package/dist/source-badge.js +3 -1
  153. package/dist/styles/code.css +0 -2
  154. package/dist/styles/effects.css +6 -32
  155. package/dist/styles/index.css +10 -5
  156. package/dist/styles/recipes/accordion.css +9 -6
  157. package/dist/styles/recipes/action-bar.css +0 -15
  158. package/dist/styles/recipes/activity.css +5 -11
  159. package/dist/styles/recipes/alert.css +4 -4
  160. package/dist/styles/recipes/audio-recorder.css +15 -3
  161. package/dist/styles/recipes/audio-visualizer.css +13 -2
  162. package/dist/styles/recipes/avatar.css +78 -1
  163. package/dist/styles/recipes/badge.css +14 -4
  164. package/dist/styles/recipes/breadcrumb.css +77 -0
  165. package/dist/styles/recipes/button-group.css +5 -7
  166. package/dist/styles/recipes/button-states.css +66 -0
  167. package/dist/styles/recipes/button.css +24 -83
  168. package/dist/styles/recipes/calendar.css +17 -23
  169. package/dist/styles/recipes/card.css +2 -2
  170. package/dist/styles/recipes/chat-composer-attachment.css +9 -3
  171. package/dist/styles/recipes/chat-composer.css +7 -10
  172. package/dist/styles/recipes/chat-layout.css +35 -0
  173. package/dist/styles/recipes/chat-message-social.css +123 -0
  174. package/dist/styles/recipes/chat-message.css +157 -37
  175. package/dist/styles/recipes/choice.css +18 -21
  176. package/dist/styles/recipes/code-diff.css +46 -33
  177. package/dist/styles/recipes/code.css +36 -16
  178. package/dist/styles/recipes/collapsible.css +7 -2
  179. package/dist/styles/recipes/color-picker-details.css +3 -4
  180. package/dist/styles/recipes/color-picker-values.css +9 -8
  181. package/dist/styles/recipes/color-picker.css +11 -2
  182. package/dist/styles/recipes/context.css +3 -3
  183. package/dist/styles/recipes/dockable-panel.css +7 -4
  184. package/dist/styles/recipes/dropzone.css +7 -8
  185. package/dist/styles/recipes/dynamic-notification-input.css +8 -5
  186. package/dist/styles/recipes/dynamic-notification-motion.css +12 -21
  187. package/dist/styles/recipes/dynamic-notification.css +40 -26
  188. package/dist/styles/recipes/emoji-picker.css +132 -0
  189. package/dist/styles/recipes/empty.css +5 -4
  190. package/dist/styles/recipes/environment-variables.css +4 -15
  191. package/dist/styles/recipes/field-parts.css +30 -24
  192. package/dist/styles/recipes/field.css +61 -26
  193. package/dist/styles/recipes/filter-bar.css +18 -31
  194. package/dist/styles/recipes/gradient-editor.css +18 -7
  195. package/dist/styles/recipes/infinite-canvas.css +0 -1
  196. package/dist/styles/recipes/inline-attachment.css +3 -3
  197. package/dist/styles/recipes/inline-citation.css +10 -4
  198. package/dist/styles/recipes/item.css +23 -9
  199. package/dist/styles/recipes/markdown-block.css +5 -4
  200. package/dist/styles/recipes/markdown.css +68 -26
  201. package/dist/styles/recipes/morphing-panel.css +8 -8
  202. package/dist/styles/recipes/page-layout.css +20 -12
  203. package/dist/styles/recipes/pagination.css +4 -5
  204. package/dist/styles/recipes/phone-input.css +12 -8
  205. package/dist/styles/recipes/popup-controls.css +166 -33
  206. package/dist/styles/recipes/popup-drawer.css +3 -14
  207. package/dist/styles/recipes/popup-lists.css +128 -27
  208. package/dist/styles/recipes/popup-motion.css +4 -45
  209. package/dist/styles/recipes/popup-toast.css +55 -26
  210. package/dist/styles/recipes/popup.css +139 -141
  211. package/dist/styles/recipes/range.css +54 -18
  212. package/dist/styles/recipes/resizable.css +2 -7
  213. package/dist/styles/recipes/rich-tooltip.css +24 -34
  214. package/dist/styles/recipes/scroll-area.css +8 -1
  215. package/dist/styles/recipes/sidebar-menu.css +149 -34
  216. package/dist/styles/recipes/sidebar-parts.css +154 -0
  217. package/dist/styles/recipes/sidebar.css +187 -128
  218. package/dist/styles/recipes/source-badge.css +1 -1
  219. package/dist/styles/recipes/spinner.css +8 -1
  220. package/dist/styles/recipes/stepper.css +31 -13
  221. package/dist/styles/recipes/switch.css +68 -23
  222. package/dist/styles/recipes/table-of-contents.css +9 -1
  223. package/dist/styles/recipes/table.css +14 -10
  224. package/dist/styles/recipes/tabs.css +17 -12
  225. package/dist/styles/recipes/task-list.css +7 -14
  226. package/dist/styles/recipes/thread-rail.css +42 -19
  227. package/dist/styles/recipes/timeline.css +2 -0
  228. package/dist/styles/recipes/toolbar.css +27 -25
  229. package/dist/styles/recipes/track-highlight.css +10 -7
  230. package/dist/styles/recipes/tree.css +31 -4
  231. package/dist/styles/recipes/user-ask-details.css +0 -1
  232. package/dist/styles/recipes/user-ask.css +4 -4
  233. package/dist/styles/theme.css +37 -16
  234. package/dist/task-list.d.ts +4 -1
  235. package/dist/task-list.js +24 -8
  236. package/dist/thread-rail.d.ts +1 -1
  237. package/dist/thread-rail.js +61 -19
  238. package/dist/transcript-divider.js +2 -1
  239. package/dist/ui/alert-dialog.js +1 -1
  240. package/dist/ui/alert.d.ts +3 -1
  241. package/dist/ui/alert.js +14 -8
  242. package/dist/ui/autocomplete.js +4 -2
  243. package/dist/ui/avatar.d.ts +8 -0
  244. package/dist/ui/avatar.js +23 -3
  245. package/dist/ui/badge.js +1 -1
  246. package/dist/ui/breadcrumb.d.ts +27 -0
  247. package/dist/ui/breadcrumb.js +88 -0
  248. package/dist/ui/button.d.ts +2 -1
  249. package/dist/ui/button.js +3 -3
  250. package/dist/ui/calendar.js +2 -2
  251. package/dist/ui/card.d.ts +3 -1
  252. package/dist/ui/card.js +12 -7
  253. package/dist/ui/checkbox.d.ts +2 -0
  254. package/dist/ui/code-diff.d.ts +1 -1
  255. package/dist/ui/code-diff.js +72 -28
  256. package/dist/ui/code.d.ts +5 -3
  257. package/dist/ui/code.js +28 -29
  258. package/dist/ui/collapsible.js +1 -1
  259. package/dist/ui/color-picker.d.ts +5 -2
  260. package/dist/ui/color-picker.js +85 -37
  261. package/dist/ui/combobox-disabled-selection.d.ts +1 -2
  262. package/dist/ui/combobox-disabled-selection.js +7 -9
  263. package/dist/ui/combobox.js +14 -6
  264. package/dist/ui/command.d.ts +8 -2
  265. package/dist/ui/command.js +30 -14
  266. package/dist/ui/context-menu.js +4 -1
  267. package/dist/ui/dialog.d.ts +2 -1
  268. package/dist/ui/dialog.js +4 -23
  269. package/dist/ui/dockable-panel-geometry.d.ts +1 -0
  270. package/dist/ui/dockable-panel-geometry.js +7 -1
  271. package/dist/ui/dockable-panel.d.ts +9 -6
  272. package/dist/ui/dockable-panel.js +63 -23
  273. package/dist/ui/drawer.js +1 -1
  274. package/dist/ui/dropdown-menu.js +5 -4
  275. package/dist/ui/dropzone.d.ts +2 -2
  276. package/dist/ui/dropzone.js +75 -16
  277. package/dist/ui/emoji-picker.d.ts +18 -0
  278. package/dist/ui/emoji-picker.js +136 -0
  279. package/dist/ui/empty.d.ts +3 -1
  280. package/dist/ui/empty.js +12 -7
  281. package/dist/ui/gradient-editor.d.ts +1 -1
  282. package/dist/ui/gradient-editor.js +37 -21
  283. package/dist/ui/hover-card.js +1 -1
  284. package/dist/ui/infinite-canvas.d.ts +3 -2
  285. package/dist/ui/infinite-canvas.js +63 -19
  286. package/dist/ui/input-group.d.ts +0 -3
  287. package/dist/ui/input-group.js +4 -14
  288. package/dist/ui/input-otp.d.ts +1 -1
  289. package/dist/ui/input-otp.js +32 -15
  290. package/dist/ui/input.js +4 -4
  291. package/dist/ui/item.d.ts +2 -1
  292. package/dist/ui/item.js +12 -8
  293. package/dist/ui/live-status.d.ts +7 -0
  294. package/dist/ui/live-status.js +17 -0
  295. package/dist/ui/markdown-elements.d.ts +6 -0
  296. package/dist/ui/markdown-elements.js +31 -1
  297. package/dist/ui/menubar.js +3 -3
  298. package/dist/ui/morphing-panel.js +3 -2
  299. package/dist/ui/native-select.d.ts +1 -1
  300. package/dist/ui/native-select.js +24 -11
  301. package/dist/ui/navigation-menu.js +1 -1
  302. package/dist/ui/page-layout.d.ts +2 -2
  303. package/dist/ui/page-layout.js +2 -4
  304. package/dist/ui/pagination.d.ts +7 -5
  305. package/dist/ui/pagination.js +19 -13
  306. package/dist/ui/phone-input.d.ts +1 -0
  307. package/dist/ui/phone-input.js +58 -60
  308. package/dist/ui/popover.js +1 -1
  309. package/dist/ui/radio-group.d.ts +2 -0
  310. package/dist/ui/resizable.d.ts +3 -2
  311. package/dist/ui/resizable.js +5 -3
  312. package/dist/ui/responsive-dialog.d.ts +1 -1
  313. package/dist/ui/responsive-dialog.js +4 -21
  314. package/dist/ui/rich-tooltip.d.ts +10 -4
  315. package/dist/ui/rich-tooltip.js +82 -34
  316. package/dist/ui/scroll-area.d.ts +1 -1
  317. package/dist/ui/scroll-area.js +43 -28
  318. package/dist/ui/select.js +1 -1
  319. package/dist/ui/sheet.js +1 -1
  320. package/dist/ui/sidebar-menu.d.ts +5 -1
  321. package/dist/ui/sidebar-menu.js +32 -34
  322. package/dist/ui/sidebar-provider.d.ts +10 -1
  323. package/dist/ui/sidebar-provider.js +39 -14
  324. package/dist/ui/sidebar-resize-rail.js +8 -4
  325. package/dist/ui/sidebar.d.ts +11 -6
  326. package/dist/ui/sidebar.js +47 -24
  327. package/dist/ui/slider.js +31 -22
  328. package/dist/ui/spinner.d.ts +3 -2
  329. package/dist/ui/spinner.js +3 -2
  330. package/dist/ui/stepper.d.ts +8 -1
  331. package/dist/ui/stepper.js +74 -25
  332. package/dist/ui/switch.d.ts +1 -0
  333. package/dist/ui/table-of-contents.d.ts +2 -2
  334. package/dist/ui/table-of-contents.js +20 -8
  335. package/dist/ui/table.js +4 -2
  336. package/dist/ui/textarea.d.ts +1 -1
  337. package/dist/ui/textarea.js +20 -9
  338. package/dist/ui/timeline.d.ts +3 -1
  339. package/dist/ui/timeline.js +17 -9
  340. package/dist/ui/toast.d.ts +11 -5
  341. package/dist/ui/toast.js +101 -55
  342. package/dist/ui/toolbar.d.ts +3 -2
  343. package/dist/ui/toolbar.js +4 -2
  344. package/dist/ui/tooltip.js +4 -21
  345. package/dist/ui/tree.js +121 -81
  346. package/dist/ui/trigger-menu.js +2 -1
  347. package/dist/user-ask.d.ts +10 -5
  348. package/dist/user-ask.js +32 -12
  349. package/package.json +5 -1
  350. package/dist/hooks/use-keyboard-navigation.d.ts +0 -3
  351. package/dist/hooks/use-keyboard-navigation.js +0 -22
@@ -6,7 +6,10 @@ const stepperKnobs = [
6
6
  "--cui-stepper-indicator-border-color",
7
7
  "--cui-stepper-indicator-border-width",
8
8
  "--cui-stepper-separator-background",
9
- "--cui-stepper-title-foreground"
9
+ "--cui-stepper-title-foreground",
10
+ "--cui-stepper-indicator-size",
11
+ "--cui-stepper-indicator-current-border-width",
12
+ "--cui-stepper-title-current-font-weight"
10
13
  ];
11
14
  //#endregion
12
15
  export { stepperKnobs };
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/switch-knobs.d.ts
2
- export declare const switchKnobs: readonly ["--cui-switch-thumb-shadow", "--cui-switch-background", "--cui-switch-hover-background", "--cui-switch-checked-background", "--cui-switch-checked-hover-background", "--cui-switch-thumb-radius", "--cui-switch-thumb-background", "--cui-switch-inline-size", "--cui-switch-height", "--cui-switch-padding", "--cui-switch-thumb-inline-size", "--cui-switch-thumb-press-scale", "--cui-switch-thumb-backdrop-filter"];
2
+ export declare const switchKnobs: readonly ["--cui-switch-thumb-shadow", "--cui-switch-radius", "--cui-switch-shadow", "--cui-switch-background", "--cui-switch-border-color", "--cui-switch-border-width", "--cui-switch-checked-border-color", "--cui-switch-hover-background", "--cui-switch-checked-background", "--cui-switch-checked-hover-background", "--cui-switch-thumb-radius", "--cui-switch-thumb-background", "--cui-switch-inline-size", "--cui-switch-height", "--cui-switch-padding", "--cui-switch-thumb-inline-size", "--cui-switch-thumb-press-scale", "--cui-switch-thumb-backdrop-filter"];
3
3
  export type SwitchKnobStyle = Partial<Record<(typeof switchKnobs)[number], string>>;
4
4
  //#endregion
@@ -1,7 +1,12 @@
1
1
  //#region src/knob-contracts/switch-knobs.ts
2
2
  const switchKnobs = [
3
3
  "--cui-switch-thumb-shadow",
4
+ "--cui-switch-radius",
5
+ "--cui-switch-shadow",
4
6
  "--cui-switch-background",
7
+ "--cui-switch-border-color",
8
+ "--cui-switch-border-width",
9
+ "--cui-switch-checked-border-color",
5
10
  "--cui-switch-hover-background",
6
11
  "--cui-switch-checked-background",
7
12
  "--cui-switch-checked-hover-background",
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/table-of-contents-knobs.d.ts
2
- export declare const tableOfContentsKnobs: readonly ["--cui-table-of-contents-background", "--cui-table-of-contents-border-color", "--cui-table-of-contents-border-width", "--cui-table-of-contents-radius", "--cui-table-of-contents-shadow", "--cui-table-of-contents-backdrop-filter", "--cui-table-of-contents-padding", "--cui-table-of-contents-label-foreground", "--cui-table-of-contents-label-font-size", "--cui-table-of-contents-label-font-weight", "--cui-table-of-contents-label-gap", "--cui-table-of-contents-item-foreground", "--cui-table-of-contents-item-hover-foreground", "--cui-table-of-contents-item-active-foreground", "--cui-table-of-contents-item-font-size", "--cui-table-of-contents-item-line-height", "--cui-table-of-contents-item-font-weight", "--cui-table-of-contents-item-root-font-weight", "--cui-table-of-contents-item-padding-block", "--cui-table-of-contents-item-padding-inline", "--cui-table-of-contents-item-indent-size", "--cui-table-of-contents-rail-stroke", "--cui-table-of-contents-rail-size", "--cui-table-of-contents-trail-stroke", "--cui-table-of-contents-trail-size", "--cui-table-of-contents-indicator-foreground"];
2
+ export declare const tableOfContentsKnobs: readonly ["--cui-table-of-contents-background", "--cui-table-of-contents-border-color", "--cui-table-of-contents-border-width", "--cui-table-of-contents-radius", "--cui-table-of-contents-shadow", "--cui-table-of-contents-backdrop-filter", "--cui-table-of-contents-padding", "--cui-table-of-contents-label-foreground", "--cui-table-of-contents-label-font-size", "--cui-table-of-contents-label-font-weight", "--cui-table-of-contents-label-gap", "--cui-table-of-contents-item-foreground", "--cui-table-of-contents-item-hover-foreground", "--cui-table-of-contents-item-active-foreground", "--cui-table-of-contents-item-font-size", "--cui-table-of-contents-item-line-height", "--cui-table-of-contents-item-font-weight", "--cui-table-of-contents-item-root-font-weight", "--cui-table-of-contents-item-padding-block", "--cui-table-of-contents-item-padding-inline", "--cui-table-of-contents-item-indent-size", "--cui-table-of-contents-rail-stroke", "--cui-table-of-contents-rail-size", "--cui-table-of-contents-trail-stroke", "--cui-table-of-contents-trail-size", "--cui-table-of-contents-indicator-foreground", "--cui-table-of-contents-scroll-inset"];
3
3
  export type TableOfContentsKnobStyle = Partial<Record<(typeof tableOfContentsKnobs)[number], string>>;
4
4
  //#endregion
@@ -25,7 +25,8 @@ const tableOfContentsKnobs = [
25
25
  "--cui-table-of-contents-rail-size",
26
26
  "--cui-table-of-contents-trail-stroke",
27
27
  "--cui-table-of-contents-trail-size",
28
- "--cui-table-of-contents-indicator-foreground"
28
+ "--cui-table-of-contents-indicator-foreground",
29
+ "--cui-table-of-contents-scroll-inset"
29
30
  ];
30
31
  //#endregion
31
32
  export { tableOfContentsKnobs };
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/tabs-knobs.d.ts
2
- export declare const tabsKnobs: readonly ["--cui-tabs-trigger-radius", "--cui-tabs-list-padding", "--cui-tabs-list-radius", "--cui-tabs-list-background", "--cui-tabs-list-backdrop-filter", "--cui-tabs-indicator-background", "--cui-tabs-foreground", "--cui-tabs-active-foreground", "--cui-tabs-indicator-shadow", "--cui-tabs-list-shadow", "--cui-tabs-border-color", "--cui-tabs-border-width"];
2
+ export declare const tabsKnobs: readonly ["--cui-tabs-trigger-radius", "--cui-tabs-list-padding", "--cui-tabs-list-radius", "--cui-tabs-list-background", "--cui-tabs-list-backdrop-filter", "--cui-tabs-indicator-background", "--cui-tabs-foreground", "--cui-tabs-active-foreground", "--cui-tabs-hover-foreground", "--cui-tabs-indicator-shadow", "--cui-tabs-list-shadow", "--cui-tabs-border-color", "--cui-tabs-border-width"];
3
3
  export type TabsKnobStyle = Partial<Record<(typeof tabsKnobs)[number], string>>;
4
4
  //#endregion
@@ -8,6 +8,7 @@ const tabsKnobs = [
8
8
  "--cui-tabs-indicator-background",
9
9
  "--cui-tabs-foreground",
10
10
  "--cui-tabs-active-foreground",
11
+ "--cui-tabs-hover-foreground",
11
12
  "--cui-tabs-indicator-shadow",
12
13
  "--cui-tabs-list-shadow",
13
14
  "--cui-tabs-border-color",
@@ -1,4 +1,4 @@
1
1
  //#region src/knob-contracts/tree-knobs.d.ts
2
- export declare const treeKnobs: readonly ["--cui-tree-item-trigger-radius", "--cui-tree-item-trigger-foreground", "--cui-tree-item-trigger-hover-background", "--cui-tree-item-trigger-hover-foreground", "--cui-tree-item-trigger-selected-background", "--cui-tree-item-trigger-selected-foreground", "--cui-tree-item-trigger-font-size", "--cui-tree-item-trigger-selected-font-weight"];
2
+ export declare const treeKnobs: readonly ["--cui-tree-item-trigger-radius", "--cui-tree-item-trigger-foreground", "--cui-tree-item-trigger-hover-background", "--cui-tree-item-trigger-hover-foreground", "--cui-tree-item-trigger-selected-background", "--cui-tree-item-trigger-selected-foreground", "--cui-tree-item-trigger-font-size", "--cui-tree-item-trigger-selected-font-weight", "--cui-tree-indent-inset"];
3
3
  export type TreeKnobStyle = Partial<Record<(typeof treeKnobs)[number], string>>;
4
4
  //#endregion
@@ -7,7 +7,8 @@ const treeKnobs = [
7
7
  "--cui-tree-item-trigger-selected-background",
8
8
  "--cui-tree-item-trigger-selected-foreground",
9
9
  "--cui-tree-item-trigger-font-size",
10
- "--cui-tree-item-trigger-selected-font-weight"
10
+ "--cui-tree-item-trigger-selected-font-weight",
11
+ "--cui-tree-indent-inset"
11
12
  ];
12
13
  //#endregion
13
14
  export { treeKnobs };
package/dist/lib/cn.js CHANGED
@@ -13,10 +13,6 @@ const twMerge = extendTailwindMerge({
13
13
  "heading-2",
14
14
  "heading-3",
15
15
  "heading-4",
16
- "meta",
17
- "title-sm",
18
- "title-md",
19
- "title-lg",
20
16
  "display"
21
17
  ] }],
22
18
  shadow: [{ shadow: [
@@ -25,5 +25,6 @@ export declare function contrastRatio(a: {
25
25
  export declare function wcagLevels(ratio: number): WcagLevels;
26
26
  export declare function nextFixLevel(levels: WcagLevels): WcagLevel | null;
27
27
  export declare function contrastOf(color: Hsva, background: Rgba): number;
28
+ export declare function formatContrastRatio(ratio: number): string;
28
29
  export declare function fixColorForContrast(color: Hsva, background: Rgba, target?: number): Hsva | null;
29
30
  //#endregion
@@ -29,17 +29,29 @@ function nextFixLevel(levels) {
29
29
  if (!levels.AAA) return "AAA";
30
30
  return null;
31
31
  }
32
+ function paintedOver(color, background) {
33
+ const blend = (channel) => color[channel] * color.a + background[channel] * (1 - color.a);
34
+ return {
35
+ r: blend("r"),
36
+ g: blend("g"),
37
+ b: blend("b"),
38
+ a: 1
39
+ };
40
+ }
32
41
  function contrastOf(color, background) {
33
- return contrastRatio(hsvaToRgba(color), background);
42
+ return contrastRatio(paintedOver(hsvaToRgba(color), background), background);
43
+ }
44
+ function formatContrastRatio(ratio) {
45
+ return (Math.floor(ratio * 100) / 100).toFixed(2);
34
46
  }
35
47
  function fixColorForContrast(color, background, target = AA_RATIO) {
36
48
  const ok = hsvaToOklcha(color);
37
- const ratioAtL = (L) => contrastRatio(hsvaToRgba(oklchaToHsva({
49
+ const ratioAtL = (L) => contrastOf(oklchaToHsva({
38
50
  L,
39
51
  C: ok.C,
40
52
  H: ok.H,
41
- a: 1
42
- })), background);
53
+ a: color.a
54
+ }), background);
43
55
  if (ratioAtL(ok.L) >= target) return null;
44
56
  let best = null;
45
57
  for (let step = 0; step <= 100; step++) {
@@ -61,4 +73,4 @@ function fixColorForContrast(color, background, target = AA_RATIO) {
61
73
  return ratioAtL(0) >= ratioAtL(1) ? pick(0) : pick(1);
62
74
  }
63
75
  //#endregion
64
- export { AAA_RATIO, AA_RATIO, TARGET_RATIO, contrastOf, contrastRatio, fixColorForContrast, luminanceFromRgb, nextFixLevel, wcagLevels };
76
+ export { AAA_RATIO, AA_RATIO, TARGET_RATIO, contrastOf, contrastRatio, fixColorForContrast, formatContrastRatio, luminanceFromRgb, nextFixLevel, wcagLevels };
@@ -60,17 +60,20 @@ async function validateDropzoneFile(file, policy, signal) {
60
60
  const errors = [];
61
61
  const minSize = policy?.minSize ?? DEFAULT_POLICY.minSize;
62
62
  const maxSize = policy?.maxSize ?? DEFAULT_POLICY.maxSize;
63
- if (!isDropzoneFileAccepted(file, policy?.accept)) errors.push({
64
- code: DropzoneErrorCode.FileInvalidType,
65
- message: "File type is not accepted."
66
- });
63
+ if (!isDropzoneFileAccepted(file, policy?.accept)) {
64
+ const accepted = compileDropzoneAccept(policy?.accept)?.split(",").join(", ");
65
+ errors.push({
66
+ code: DropzoneErrorCode.FileInvalidType,
67
+ message: accepted ? `File type is not accepted. Use ${accepted}.` : "File type is not accepted."
68
+ });
69
+ }
67
70
  if (file.size < minSize) errors.push({
68
71
  code: DropzoneErrorCode.FileTooSmall,
69
- message: `File is smaller than the ${formatDropzoneFileSize(minSize)} minimum.`
72
+ message: `File is smaller than the ${formatDropzoneFileSize(minSize)} minimum. Choose a larger file.`
70
73
  });
71
74
  if (file.size > maxSize) errors.push({
72
75
  code: DropzoneErrorCode.FileTooLarge,
73
- message: `File is larger than the ${formatDropzoneFileSize(maxSize)} limit.`
76
+ message: `File is larger than the ${formatDropzoneFileSize(maxSize)} limit. Choose a smaller file.`
74
77
  });
75
78
  if (policy?.validator) {
76
79
  signal.throwIfAborted();
@@ -80,6 +83,30 @@ async function validateDropzoneFile(file, policy, signal) {
80
83
  }
81
84
  return errors;
82
85
  }
86
+ function createDropzoneSelection(currentValue, policy) {
87
+ const appended = getDropzoneSelectionMode(policy) === "append" ? currentValue : [];
88
+ const allowDuplicates = policy?.allowDuplicates ?? false;
89
+ return {
90
+ files: [...appended],
91
+ identities: new Set(allowDuplicates ? [] : appended.map(getDropzoneFileIdentity)),
92
+ allowDuplicates,
93
+ capacity: getDropzoneCapacity(policy)
94
+ };
95
+ }
96
+ function getDropzoneSelectionErrors(file, identity, selection) {
97
+ if (!selection.allowDuplicates && selection.identities.has(identity)) return [{
98
+ code: DropzoneErrorCode.FileAlreadySelected,
99
+ message: `File "${file.name}" is already selected.`
100
+ }];
101
+ if (selection.files.length >= selection.capacity) {
102
+ const { capacity } = selection;
103
+ return [{
104
+ code: DropzoneErrorCode.TooManyFiles,
105
+ message: `Too many files. Choose up to ${capacity} ${capacity === 1 ? "file" : "files"}.`
106
+ }];
107
+ }
108
+ return [];
109
+ }
83
110
  async function processDropzoneFiles(files, currentValue, policy, signal) {
84
111
  signal.throwIfAborted();
85
112
  const validatedFiles = await Promise.all(files.map(async (file) => ({
@@ -90,9 +117,7 @@ async function processDropzoneFiles(files, currentValue, policy, signal) {
90
117
  const acceptedFiles = [];
91
118
  const fileRejections = [];
92
119
  const selectionMode = getDropzoneSelectionMode(policy);
93
- const capacity = getDropzoneCapacity(policy);
94
- const selectedFiles = selectionMode === "append" ? [...currentValue] : [];
95
- const selectedIdentities = new Set(policy?.allowDuplicates ? [] : (selectionMode === "append" ? currentValue : []).map(getDropzoneFileIdentity));
120
+ const selection = createDropzoneSelection(currentValue, policy);
96
121
  for (const { file, errors } of validatedFiles) {
97
122
  if (errors.length > 0) {
98
123
  fileRejections.push({
@@ -102,29 +127,17 @@ async function processDropzoneFiles(files, currentValue, policy, signal) {
102
127
  continue;
103
128
  }
104
129
  const identity = getDropzoneFileIdentity(file);
105
- if (!policy?.allowDuplicates && selectedIdentities.has(identity)) {
130
+ const selectionErrors = getDropzoneSelectionErrors(file, identity, selection);
131
+ if (selectionErrors.length > 0) {
106
132
  fileRejections.push({
107
133
  file,
108
- errors: [{
109
- code: DropzoneErrorCode.FileAlreadySelected,
110
- message: `File "${file.name}" is already selected.`
111
- }]
112
- });
113
- continue;
114
- }
115
- if (selectedFiles.length >= capacity) {
116
- fileRejections.push({
117
- file,
118
- errors: [{
119
- code: DropzoneErrorCode.TooManyFiles,
120
- message: "Too many files."
121
- }]
134
+ errors: selectionErrors
122
135
  });
123
136
  continue;
124
137
  }
125
138
  acceptedFiles.push(file);
126
- selectedFiles.push(file);
127
- selectedIdentities.add(identity);
139
+ selection.files.push(file);
140
+ selection.identities.add(identity);
128
141
  }
129
142
  if (selectionMode === "replace" && acceptedFiles.length === 0) return {
130
143
  acceptedFiles,
@@ -135,8 +148,8 @@ async function processDropzoneFiles(files, currentValue, policy, signal) {
135
148
  return {
136
149
  acceptedFiles,
137
150
  fileRejections,
138
- value: selectedFiles,
139
- removedFiles: selectionMode === "replace" ? getRemovedFiles(currentValue, selectedFiles) : []
151
+ value: selection.files,
152
+ removedFiles: selectionMode === "replace" ? getRemovedFiles(currentValue, selection.files) : []
140
153
  };
141
154
  }
142
155
  function getDropzoneDragVerdict(files, currentValue, policy, options = {}) {
@@ -4,7 +4,7 @@ export interface EnvironmentVariableEntry {
4
4
  value: string;
5
5
  }
6
6
  export declare const ENV_FILE_MAX_SIZE: number;
7
- export declare const DUPLICATE_ENVIRONMENT_VARIABLE_MESSAGE = "Environment variable keys must be unique";
7
+ export declare const DUPLICATE_ENVIRONMENT_VARIABLE_MESSAGE = "Rename or remove the duplicate key.";
8
8
  export declare class DuplicateEnvironmentVariableKeyError extends Error {
9
9
  readonly key: string;
10
10
  constructor(key: string);
@@ -1,6 +1,6 @@
1
1
  //#region src/lib/env-file.ts
2
2
  const ENV_FILE_MAX_SIZE = 65536;
3
- const DUPLICATE_ENVIRONMENT_VARIABLE_MESSAGE = "Environment variable keys must be unique";
3
+ const DUPLICATE_ENVIRONMENT_VARIABLE_MESSAGE = "Rename or remove the duplicate key.";
4
4
  var DuplicateEnvironmentVariableKeyError = class extends Error {
5
5
  key;
6
6
  constructor(key) {
@@ -175,7 +175,7 @@ async function readEnvFile(file, options = {}) {
175
175
  const maxSize = options.maxSize ?? 65536;
176
176
  if (file.size > maxSize) return {
177
177
  ok: false,
178
- error: `File is too large (max ${Math.ceil(maxSize / 1024)} KB).`
178
+ error: `That file is over ${Math.ceil(maxSize / 1024)} KB. Choose a smaller .env file.`
179
179
  };
180
180
  let text;
181
181
  try {
@@ -183,17 +183,17 @@ async function readEnvFile(file, options = {}) {
183
183
  } catch {
184
184
  return {
185
185
  ok: false,
186
- error: "Could not read the selected file. Please try again."
186
+ error: "Couldn't read that file. Try selecting it again."
187
187
  };
188
188
  }
189
189
  if (text.includes("\0")) return {
190
190
  ok: false,
191
- error: "File appears to be binary. Please import a plain-text .env file."
191
+ error: "That file isn't plain text. Choose a .env text file."
192
192
  };
193
193
  const entries = parseEnvFileText(text);
194
194
  if (entries.length === 0) return {
195
195
  ok: false,
196
- error: "No valid environment variables found in the file."
196
+ error: "No variables found. Use one KEY=value per line."
197
197
  };
198
198
  return {
199
199
  ok: true,
@@ -0,0 +1,4 @@
1
+ //#region src/lib/motion.d.ts
2
+ export declare function prefersReducedMotion(node?: Element | null): boolean;
3
+ export declare function readDurationMs(element: Element, token: string): number;
4
+ //#endregion
@@ -0,0 +1,15 @@
1
+ //#region src/lib/motion.ts
2
+ const REDUCED_MOTION_QUERY = "(prefers-reduced-motion: reduce)";
3
+ function prefersReducedMotion(node) {
4
+ return globalThis.matchMedia?.(REDUCED_MOTION_QUERY).matches === true || node?.closest("[data-motion=\"reduced\"]") != null;
5
+ }
6
+ function readDurationMs(element, token) {
7
+ const value = getComputedStyle(element).getPropertyValue(token).trim();
8
+ const amount = Number.parseFloat(value);
9
+ if (!Number.isFinite(amount)) return 0;
10
+ if (value.endsWith("ms")) return amount;
11
+ if (value.endsWith("s")) return amount * 1e3;
12
+ return amount;
13
+ }
14
+ //#endregion
15
+ export { prefersReducedMotion, readDurationMs };
@@ -1,5 +1,5 @@
1
- import { getCountryCallingCode } from "react-phone-number-input/max";
2
1
  import { AsYouType } from "libphonenumber-js/max";
2
+ import { getCountryCallingCode } from "react-phone-number-input/max";
3
3
  //#region src/lib/phone-input-format.ts
4
4
  function normalizePhoneInputText(value, country) {
5
5
  if (!country) return value;
@@ -1,19 +1,14 @@
1
1
  //#region src/lib/trigger-detect.ts
2
- const WHITESPACE = /* @__PURE__ */ new Set([
3
- " ",
4
- "\n",
5
- " ",
6
- "\xA0"
7
- ]);
2
+ const WHITESPACE = /\s/u;
8
3
  function detectTrigger(textBeforeCaret, triggerChars) {
9
4
  const triggerSet = new Set(triggerChars);
10
5
  for (let i = textBeforeCaret.length - 1; i >= 0; i -= 1) {
11
6
  const char = textBeforeCaret.at(i);
12
7
  if (char === void 0) return null;
13
- if (WHITESPACE.has(char)) return null;
8
+ if (WHITESPACE.test(char)) return null;
14
9
  if (triggerSet.has(char)) {
15
10
  const preceding = i === 0 ? "" : textBeforeCaret.at(i - 1) ?? "";
16
- if (preceding === "" || WHITESPACE.has(preceding)) return {
11
+ if (preceding === "" || WHITESPACE.test(preceding)) return {
17
12
  char,
18
13
  query: textBeforeCaret.slice(i + 1),
19
14
  start: i,
@@ -25,6 +20,8 @@ function detectTrigger(textBeforeCaret, triggerChars) {
25
20
  return null;
26
21
  }
27
22
  const MIRROR_PROPERTIES = [
23
+ "direction",
24
+ "writing-mode",
28
25
  "box-sizing",
29
26
  "width",
30
27
  "font-family",
@@ -33,6 +30,7 @@ const MIRROR_PROPERTIES = [
33
30
  "font-style",
34
31
  "font-variant",
35
32
  "letter-spacing",
33
+ "word-spacing",
36
34
  "text-transform",
37
35
  "text-indent",
38
36
  "line-height",
@@ -31,7 +31,7 @@ function MarkdownBlockHeader({ className, ...props }) {
31
31
  "data-control-ui": "markdown-block",
32
32
  "data-control-family": "markdown-block",
33
33
  "data-slot": "header",
34
- className: cn("sticky top-0 z-10 flex items-center justify-between", className),
34
+ className: cn("flex items-center justify-between", className),
35
35
  ...props
36
36
  });
37
37
  }
@@ -51,6 +51,7 @@ function MarkdownBlockTitle({ children = "Markdown", className, ...props }) {
51
51
  children: "MD"
52
52
  }), /* @__PURE__ */ jsx("span", {
53
53
  className: "truncate",
54
+ title: typeof children === "string" ? children : void 0,
54
55
  children
55
56
  })]
56
57
  });
@@ -0,0 +1,8 @@
1
+ import { ButtonProps } from "./ui/button.js";
2
+ //#region src/popup-parts.d.ts
3
+ export type PopupCloseButtonProps = Omit<ButtonProps, "children" | "iconOnly"> & {
4
+ label: string;
5
+ };
6
+ export declare function PopupCloseButton({ label, variant, size, ...props }: PopupCloseButtonProps): import("react").JSX.Element;
7
+ export declare function PopupArrowShape(): import("react").JSX.Element;
8
+ //#endregion
@@ -0,0 +1,43 @@
1
+ "use client";
2
+ import { Button } from "./ui/button.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/popup-parts.tsx
5
+ function PopupCloseButton({ label, variant = "ghost", size = "xs", ...props }) {
6
+ return /* @__PURE__ */ jsxs(Button, {
7
+ "data-popup-part": "close",
8
+ variant,
9
+ size,
10
+ iconOnly: true,
11
+ ...props,
12
+ children: [/* @__PURE__ */ jsx("svg", {
13
+ viewBox: "0 0 16 16",
14
+ "aria-hidden": "true",
15
+ fill: "none",
16
+ children: /* @__PURE__ */ jsx("path", {
17
+ d: "M4 4 12 12M12 4 4 12",
18
+ stroke: "currentColor",
19
+ strokeWidth: "1.4",
20
+ strokeLinecap: "round"
21
+ })
22
+ }), /* @__PURE__ */ jsx("span", {
23
+ className: "sr-only",
24
+ children: label
25
+ })]
26
+ });
27
+ }
28
+ function PopupArrowShape() {
29
+ return /* @__PURE__ */ jsx("svg", {
30
+ "aria-hidden": "true",
31
+ focusable: "false",
32
+ width: "12",
33
+ height: "8",
34
+ viewBox: "0 0 12 8",
35
+ overflow: "visible",
36
+ children: /* @__PURE__ */ jsx("path", {
37
+ d: "M0 7L4 2Q6 0 8 2L12 7L12 8L0 8Z",
38
+ fill: "currentColor"
39
+ })
40
+ });
41
+ }
42
+ //#endregion
43
+ export { PopupArrowShape, PopupCloseButton };
@@ -45,6 +45,7 @@ function SourceFavicon({ faviconSrc, href, imageProps, fallbackProps, className,
45
45
  }
46
46
  function SourceBadge({ faviconSrc, href, children, className, rel, target, ...props }) {
47
47
  const hostname = sourceHostname(href);
48
+ const label = children ?? hostname;
48
49
  return /* @__PURE__ */ jsxs(Badge, {
49
50
  variant: "outline",
50
51
  render: /* @__PURE__ */ jsx("a", {
@@ -63,8 +64,9 @@ function SourceBadge({ faviconSrc, href, children, className, rel, target, ...pr
63
64
  }), /* @__PURE__ */ jsx("span", {
64
65
  "data-control-ui": "source-badge",
65
66
  "data-slot": "label",
67
+ title: typeof label === "string" ? label : void 0,
66
68
  className: "truncate",
67
- children: children ?? hostname
69
+ children: label
68
70
  })]
69
71
  });
70
72
  }
@@ -26,7 +26,6 @@
26
26
  --diff-del-emphasis: oklch(0.87 0.12 22 / 0.8);
27
27
  --diff-del-gutter: oklch(0.92 0.07 22);
28
28
  --diff-del-fg: oklch(0.53 0.16 22);
29
- --diff-context-fg: var(--muted-foreground);
30
29
  --diff-gutter-bg: oklch(from var(--muted) l c h / 0.5);
31
30
  }
32
31
 
@@ -52,6 +51,5 @@
52
51
  --diff-del-emphasis: oklch(0.62 0.18 22 / 0.36);
53
52
  --diff-del-gutter: oklch(0.55 0.14 22 / 0.3);
54
53
  --diff-del-fg: oklch(0.78 0.15 22);
55
- --diff-context-fg: var(--muted-foreground);
56
54
  --diff-gutter-bg: oklch(from var(--muted) l c h / 0.4);
57
55
  }
@@ -5,14 +5,6 @@
5
5
  background-image: linear-gradient(100deg, var(--muted) 30%, oklch(from var(--muted-foreground) l c h / 0.25) 50%, var(--muted) 70%);
6
6
  background-size: 220% 100%;
7
7
  animation: shimmer calc(var(--duration-slow) * 5) var(--ease-standard) infinite;
8
-
9
- /* Reduced motion: hold resting gradient (infinite animation ignores 0ms collapse, must still explicitly) under OS pref + motion kill-switch attribute. */
10
- @media (prefers-reduced-motion: reduce) {
11
- animation: none;
12
- }
13
- :where([data-motion="reduced"]) & {
14
- animation: none;
15
- }
16
8
  }
17
9
 
18
10
  /* shimmer-text — same sweep clipped to text ("AI is generating" treatment); subtle --muted-foreground↔--foreground stops keep it readable. */
@@ -24,14 +16,6 @@
24
16
  -webkit-text-fill-color: transparent;
25
17
  color: transparent;
26
18
  animation: shimmer calc(var(--duration-slow) * 6) var(--ease-standard) infinite;
27
-
28
- /* Reduced motion: static muted-foreground text, no sweep — stilled under OS pref + motion kill-switch (infinite animation ignores 0ms tempo). */
29
- @media (prefers-reduced-motion: reduce) {
30
- animation: none;
31
- }
32
- :where([data-motion="reduced"]) & {
33
- animation: none;
34
- }
35
19
  }
36
20
 
37
21
  @keyframes shimmer {
@@ -69,14 +53,6 @@
69
53
  -webkit-mask-repeat: no-repeat;
70
54
  mask-repeat: no-repeat;
71
55
  animation: aui-halftone calc(var(--duration-slow) * 6) var(--ease-standard) infinite;
72
-
73
- /* Reduced motion: dots hold at their resting radius — still a legible placeholder, just no breathing. */
74
- @media (prefers-reduced-motion: reduce) {
75
- animation: none;
76
- }
77
- :where([data-motion="reduced"]) & {
78
- animation: none;
79
- }
80
56
  }
81
57
 
82
58
  @keyframes aui-halftone {
@@ -106,14 +82,6 @@
106
82
  color: transparent;
107
83
  text-shadow: none;
108
84
  animation: aui-progress-sweep calc(var(--duration-slow) * 12) linear infinite;
109
-
110
- /* Reduced motion: static blocks, no march — stilled under OS pref + motion kill-switch (infinite animation ignores 0ms tempo). */
111
- @media (prefers-reduced-motion: reduce) {
112
- animation: none;
113
- }
114
- :where([data-motion="reduced"]) & {
115
- animation: none;
116
- }
117
85
  }
118
86
 
119
87
  @keyframes aui-progress-sweep {
@@ -124,3 +92,9 @@
124
92
  background-position: -200% 0;
125
93
  }
126
94
  }
95
+
96
+ @keyframes cui-spin {
97
+ to {
98
+ rotate: 360deg;
99
+ }
100
+ }
@@ -1,8 +1,10 @@
1
1
  @import "./theme.css";
2
2
  @import "./recipes/accordion.css";
3
3
  @import "./recipes/button.css";
4
+ @import "./recipes/button-states.css";
4
5
  @import "./recipes/action-bar.css";
5
6
  @import "./recipes/collapsible.css";
7
+ @import "./effects.css";
6
8
  @import "./recipes/progressive-blur.css";
7
9
  @import "./recipes/scroll-area.css";
8
10
  @import "./recipes/activity.css";
@@ -17,16 +19,17 @@
17
19
  @import "./recipes/field-parts.css";
18
20
  @import "./recipes/avatar.css";
19
21
  @import "./recipes/badge.css";
22
+ @import "./recipes/breadcrumb.css";
20
23
  @import "./recipes/track-highlight.css";
21
24
  @import "./recipes/button-group.css";
22
25
  @import "./recipes/calendar.css";
23
26
  @import "./recipes/card.css";
24
- @import "./recipes/chat-layout.css";
25
- @import "./effects.css";
26
27
  @import "./recipes/chat-message.css";
28
+ @import "./recipes/chat-message-social.css";
29
+ @import "./recipes/chat-layout.css";
30
+ @import "./recipes/spinner.css";
27
31
  @import "./recipes/chat-composer.css";
28
32
  @import "./chat-composer-editor.css";
29
- @import "./recipes/spinner.css";
30
33
  @import "./recipes/chat-composer-attachment.css";
31
34
  @import "./recipes/choice.css";
32
35
  @import "./code.css";
@@ -34,29 +37,31 @@
34
37
  @import "./recipes/code-diff.css";
35
38
  @import "./recipes/sidebar.css";
36
39
  @import "./recipes/sidebar-menu.css";
40
+ @import "./recipes/sidebar-parts.css";
37
41
  @import "./recipes/color-picker.css";
38
42
  @import "./recipes/color-picker-details.css";
39
43
  @import "./recipes/color-picker-values.css";
40
44
  @import "./recipes/empty.css";
41
45
  @import "./recipes/context.css";
46
+ @import "./recipes/popup-drawer.css";
42
47
  @import "./recipes/infinite-canvas.css";
43
48
  @import "./recipes/resizable.css";
44
49
  @import "./recipes/separator.css";
45
50
  @import "./recipes/toolbar.css";
46
- @import "./recipes/popup-drawer.css";
51
+ @import "./recipes/kbd.css";
47
52
  @import "./recipes/dockable-panel.css";
48
53
  @import "./recipes/item.css";
49
54
  @import "./recipes/dropzone.css";
50
55
  @import "./recipes/dynamic-notification.css";
51
56
  @import "./recipes/dynamic-notification-input.css";
52
57
  @import "./recipes/dynamic-notification-motion.css";
58
+ @import "./recipes/emoji-picker.css";
53
59
  @import "./recipes/environment-variables.css";
54
60
  @import "./recipes/filter-bar.css";
55
61
  @import "./recipes/gradient-editor.css";
56
62
  @import "./recipes/inline-attachment.css";
57
63
  @import "./recipes/source-badge.css";
58
64
  @import "./recipes/inline-citation.css";
59
- @import "./recipes/kbd.css";
60
65
  @import "./recipes/markdown.css";
61
66
  @import "./recipes/markdown-block.css";
62
67
  @import "./recipes/range.css";