@womp/kookie-ui 0.22.1 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/components.css +247 -187
  2. package/dist/cjs/components/_internal/base-button.d.ts +11 -1
  3. package/dist/cjs/components/_internal/base-button.d.ts.map +1 -1
  4. package/dist/cjs/components/_internal/base-button.js +1 -1
  5. package/dist/cjs/components/_internal/base-button.js.map +4 -4
  6. package/dist/cjs/components/_internal/menu-context.d.ts +2 -0
  7. package/dist/cjs/components/_internal/menu-context.d.ts.map +1 -1
  8. package/dist/cjs/components/_internal/menu-context.js +1 -1
  9. package/dist/cjs/components/_internal/menu-context.js.map +3 -3
  10. package/dist/cjs/components/_internal/pane-chrome.d.ts +17 -2
  11. package/dist/cjs/components/_internal/pane-chrome.d.ts.map +1 -1
  12. package/dist/cjs/components/_internal/pane-chrome.js +1 -1
  13. package/dist/cjs/components/_internal/pane-chrome.js.map +4 -4
  14. package/dist/cjs/components/_internal/shell-sidebar.js +1 -1
  15. package/dist/cjs/components/_internal/shell-sidebar.js.map +4 -4
  16. package/dist/cjs/components/accordion.d.ts +2 -2
  17. package/dist/cjs/components/accordion.d.ts.map +1 -1
  18. package/dist/cjs/components/accordion.js +1 -1
  19. package/dist/cjs/components/accordion.js.map +4 -4
  20. package/dist/cjs/components/alert-dialog.d.ts.map +1 -1
  21. package/dist/cjs/components/alert-dialog.js +1 -1
  22. package/dist/cjs/components/alert-dialog.js.map +3 -3
  23. package/dist/cjs/components/avatar.d.ts +1 -1
  24. package/dist/cjs/components/avatar.d.ts.map +1 -1
  25. package/dist/cjs/components/avatar.js +1 -1
  26. package/dist/cjs/components/avatar.js.map +3 -3
  27. package/dist/cjs/components/avatar.props.d.ts +8 -0
  28. package/dist/cjs/components/avatar.props.d.ts.map +1 -1
  29. package/dist/cjs/components/avatar.props.js +1 -1
  30. package/dist/cjs/components/avatar.props.js.map +2 -2
  31. package/dist/cjs/components/blockquote.d.ts +1 -1
  32. package/dist/cjs/components/blockquote.d.ts.map +1 -1
  33. package/dist/cjs/components/blockquote.js +1 -1
  34. package/dist/cjs/components/blockquote.js.map +4 -4
  35. package/dist/cjs/components/button.js +1 -1
  36. package/dist/cjs/components/button.js.map +4 -4
  37. package/dist/cjs/components/chatbar.d.ts.map +1 -1
  38. package/dist/cjs/components/chatbar.js +1 -1
  39. package/dist/cjs/components/chatbar.js.map +4 -4
  40. package/dist/cjs/components/checkbox-group.d.ts.map +1 -1
  41. package/dist/cjs/components/checkbox-group.js +1 -1
  42. package/dist/cjs/components/checkbox-group.js.map +3 -3
  43. package/dist/cjs/components/checkbox-group.primitive.d.ts +12 -5
  44. package/dist/cjs/components/checkbox-group.primitive.d.ts.map +1 -1
  45. package/dist/cjs/components/checkbox-group.primitive.js +1 -1
  46. package/dist/cjs/components/checkbox-group.primitive.js.map +3 -3
  47. package/dist/cjs/components/checkbox.js +1 -1
  48. package/dist/cjs/components/checkbox.js.map +3 -3
  49. package/dist/cjs/components/chip.d.ts.map +1 -1
  50. package/dist/cjs/components/chip.js +1 -1
  51. package/dist/cjs/components/chip.js.map +3 -3
  52. package/dist/cjs/components/code.d.ts.map +1 -1
  53. package/dist/cjs/components/code.js +1 -1
  54. package/dist/cjs/components/code.js.map +2 -2
  55. package/dist/cjs/components/combobox.js +1 -1
  56. package/dist/cjs/components/combobox.js.map +3 -3
  57. package/dist/cjs/components/context-menu.d.ts.map +1 -1
  58. package/dist/cjs/components/context-menu.js +1 -1
  59. package/dist/cjs/components/context-menu.js.map +4 -4
  60. package/dist/cjs/components/dialog.d.ts +1 -1
  61. package/dist/cjs/components/dialog.d.ts.map +1 -1
  62. package/dist/cjs/components/dialog.js +1 -1
  63. package/dist/cjs/components/dialog.js.map +3 -3
  64. package/dist/cjs/components/dropdown-menu.d.ts.map +1 -1
  65. package/dist/cjs/components/dropdown-menu.js +1 -1
  66. package/dist/cjs/components/dropdown-menu.js.map +4 -4
  67. package/dist/cjs/components/icons.d.ts +3 -1
  68. package/dist/cjs/components/icons.d.ts.map +1 -1
  69. package/dist/cjs/components/icons.js +1 -1
  70. package/dist/cjs/components/icons.js.map +3 -3
  71. package/dist/cjs/components/image.d.ts +23 -0
  72. package/dist/cjs/components/image.d.ts.map +1 -0
  73. package/dist/cjs/components/image.js +2 -0
  74. package/dist/cjs/components/image.js.map +7 -0
  75. package/dist/cjs/components/image.props.d.ts +19 -0
  76. package/dist/cjs/components/image.props.d.ts.map +1 -0
  77. package/dist/cjs/components/image.props.js +2 -0
  78. package/dist/cjs/components/image.props.js.map +7 -0
  79. package/dist/cjs/components/index.d.ts +2 -1
  80. package/dist/cjs/components/index.d.ts.map +1 -1
  81. package/dist/cjs/components/index.js +2 -10
  82. package/dist/cjs/components/index.js.map +4 -4
  83. package/dist/cjs/components/message-scroller.d.ts.map +1 -1
  84. package/dist/cjs/components/message-scroller.js +1 -1
  85. package/dist/cjs/components/message-scroller.js.map +4 -4
  86. package/dist/cjs/components/navbar.d.ts.map +1 -1
  87. package/dist/cjs/components/navbar.js +1 -1
  88. package/dist/cjs/components/navbar.js.map +3 -3
  89. package/dist/cjs/components/notice.d.ts +4 -1
  90. package/dist/cjs/components/notice.d.ts.map +1 -1
  91. package/dist/cjs/components/notice.js +1 -1
  92. package/dist/cjs/components/notice.js.map +4 -4
  93. package/dist/cjs/components/progress.d.ts.map +1 -1
  94. package/dist/cjs/components/progress.js +1 -1
  95. package/dist/cjs/components/progress.js.map +3 -3
  96. package/dist/cjs/components/schemas/button.schema.d.ts +2 -2
  97. package/dist/cjs/components/schemas/toggle.schema.d.ts +1 -1
  98. package/dist/cjs/components/scroll-area.d.ts +3 -1
  99. package/dist/cjs/components/scroll-area.d.ts.map +1 -1
  100. package/dist/cjs/components/scroll-area.js +1 -1
  101. package/dist/cjs/components/scroll-area.js.map +4 -4
  102. package/dist/cjs/components/segmented-control.d.ts +3 -1
  103. package/dist/cjs/components/segmented-control.d.ts.map +1 -1
  104. package/dist/cjs/components/segmented-control.js +1 -1
  105. package/dist/cjs/components/segmented-control.js.map +3 -3
  106. package/dist/cjs/components/select.d.ts +1 -2
  107. package/dist/cjs/components/select.d.ts.map +1 -1
  108. package/dist/cjs/components/select.js +1 -1
  109. package/dist/cjs/components/select.js.map +3 -3
  110. package/dist/cjs/components/separator.d.ts.map +1 -1
  111. package/dist/cjs/components/separator.js +1 -1
  112. package/dist/cjs/components/separator.js.map +3 -3
  113. package/dist/cjs/components/sheet.d.ts +1 -0
  114. package/dist/cjs/components/sheet.d.ts.map +1 -1
  115. package/dist/cjs/components/sheet.js +1 -1
  116. package/dist/cjs/components/sheet.js.map +3 -3
  117. package/dist/cjs/components/shell.d.ts +12 -1
  118. package/dist/cjs/components/shell.d.ts.map +1 -1
  119. package/dist/cjs/components/shell.js +1 -1
  120. package/dist/cjs/components/shell.js.map +4 -4
  121. package/dist/cjs/components/sidebar.d.ts.map +1 -1
  122. package/dist/cjs/components/sidebar.js +1 -1
  123. package/dist/cjs/components/sidebar.js.map +4 -4
  124. package/dist/cjs/components/slider.d.ts.map +1 -1
  125. package/dist/cjs/components/slider.js +1 -1
  126. package/dist/cjs/components/slider.js.map +3 -3
  127. package/dist/cjs/components/spinner.d.ts.map +1 -1
  128. package/dist/cjs/components/spinner.js +1 -1
  129. package/dist/cjs/components/spinner.js.map +3 -3
  130. package/dist/cjs/components/table.d.ts.map +1 -1
  131. package/dist/cjs/components/table.js +1 -1
  132. package/dist/cjs/components/table.js.map +4 -4
  133. package/dist/cjs/components/tabs.d.ts.map +1 -1
  134. package/dist/cjs/components/tabs.js +1 -1
  135. package/dist/cjs/components/tabs.js.map +2 -2
  136. package/dist/cjs/components/text-area.js +1 -1
  137. package/dist/cjs/components/text-area.js.map +2 -2
  138. package/dist/cjs/components/text-field.js +2 -2
  139. package/dist/cjs/components/text-field.js.map +2 -2
  140. package/dist/cjs/components/toggle.d.ts +3 -2
  141. package/dist/cjs/components/toggle.d.ts.map +1 -1
  142. package/dist/cjs/components/toggle.js +1 -9
  143. package/dist/cjs/components/toggle.js.map +4 -4
  144. package/dist/cjs/components/toolbar.d.ts +80 -8
  145. package/dist/cjs/components/toolbar.d.ts.map +1 -1
  146. package/dist/cjs/components/toolbar.js +1 -1
  147. package/dist/cjs/components/toolbar.js.map +4 -4
  148. package/dist/cjs/components/virtual-menu.d.ts +3 -5
  149. package/dist/cjs/components/virtual-menu.d.ts.map +1 -1
  150. package/dist/cjs/components/virtual-menu.js +1 -1
  151. package/dist/cjs/components/virtual-menu.js.map +3 -3
  152. package/dist/cjs/helpers/extract-margin-props.d.ts +7 -7
  153. package/dist/cjs/hooks/use-scroll-edges.d.ts +4 -2
  154. package/dist/cjs/hooks/use-scroll-edges.d.ts.map +1 -1
  155. package/dist/cjs/hooks/use-scroll-edges.js +1 -1
  156. package/dist/cjs/hooks/use-scroll-edges.js.map +3 -3
  157. package/dist/cjs/index.js +5 -5
  158. package/dist/cjs/index.js.map +4 -4
  159. package/dist/cjs/props/index.js +1 -1
  160. package/dist/cjs/props/index.js.map +2 -2
  161. package/dist/esm/chunk-3VTS4C63.js +2 -0
  162. package/dist/esm/chunk-3VTS4C63.js.map +7 -0
  163. package/dist/esm/chunk-3WE4E2WQ.js +2 -0
  164. package/dist/esm/chunk-3WE4E2WQ.js.map +7 -0
  165. package/dist/esm/chunk-3XUY5WFA.js +2 -0
  166. package/dist/esm/chunk-3XUY5WFA.js.map +7 -0
  167. package/dist/esm/chunk-3XZOE2IQ.js +2 -0
  168. package/dist/esm/chunk-3XZOE2IQ.js.map +7 -0
  169. package/dist/esm/chunk-432YLNB3.js +2 -0
  170. package/dist/esm/chunk-432YLNB3.js.map +7 -0
  171. package/dist/esm/chunk-4QKZYCCH.js +2 -0
  172. package/dist/esm/chunk-4QKZYCCH.js.map +7 -0
  173. package/dist/esm/chunk-4R5EMVB3.js +2 -0
  174. package/dist/esm/chunk-4R5EMVB3.js.map +7 -0
  175. package/dist/esm/chunk-4ZOVV3TY.js +2 -0
  176. package/dist/esm/chunk-4ZOVV3TY.js.map +7 -0
  177. package/dist/esm/{chunk-IX5HIHVI.js → chunk-62ZGP4ET.js} +2 -2
  178. package/dist/esm/{chunk-IX5HIHVI.js.map → chunk-62ZGP4ET.js.map} +3 -3
  179. package/dist/esm/chunk-BGAJ2MDF.js +2 -0
  180. package/dist/esm/chunk-BGAJ2MDF.js.map +7 -0
  181. package/dist/esm/chunk-CHPT42BY.js +2 -0
  182. package/dist/esm/{chunk-Y3JYEEFB.js.map → chunk-CHPT42BY.js.map} +2 -2
  183. package/dist/esm/{chunk-KS4U4VPH.js → chunk-CMHUK7OG.js} +2 -2
  184. package/dist/esm/{chunk-KS4U4VPH.js.map → chunk-CMHUK7OG.js.map} +2 -2
  185. package/dist/esm/chunk-CN6F4REJ.js +2 -0
  186. package/dist/esm/chunk-CN6F4REJ.js.map +7 -0
  187. package/dist/esm/chunk-DUTZUWZP.js +2 -0
  188. package/dist/esm/chunk-DUTZUWZP.js.map +7 -0
  189. package/dist/esm/chunk-EZYXYLR2.js +2 -0
  190. package/dist/esm/chunk-EZYXYLR2.js.map +7 -0
  191. package/dist/esm/chunk-FDJV5RXX.js +2 -0
  192. package/dist/esm/chunk-FDJV5RXX.js.map +7 -0
  193. package/dist/esm/chunk-G2JD52O5.js +2 -0
  194. package/dist/esm/{chunk-23KT3D2Z.js.map → chunk-G2JD52O5.js.map} +3 -3
  195. package/dist/esm/{chunk-PNAB6KCN.js → chunk-G4ETY2NP.js} +2 -2
  196. package/dist/esm/{chunk-PNAB6KCN.js.map → chunk-G4ETY2NP.js.map} +1 -1
  197. package/dist/esm/chunk-GPOCLDBR.js +2 -0
  198. package/dist/esm/chunk-GPOCLDBR.js.map +7 -0
  199. package/dist/esm/chunk-GYP66ZK2.js +2 -0
  200. package/dist/esm/chunk-GYP66ZK2.js.map +7 -0
  201. package/dist/esm/chunk-H5BYPX6V.js +2 -0
  202. package/dist/esm/chunk-H5BYPX6V.js.map +7 -0
  203. package/dist/esm/chunk-H5G7UECV.js +2 -0
  204. package/dist/esm/chunk-H5G7UECV.js.map +7 -0
  205. package/dist/esm/chunk-I4FLQELQ.js +2 -0
  206. package/dist/esm/chunk-I4FLQELQ.js.map +7 -0
  207. package/dist/esm/chunk-JYQGCXXI.js +2 -0
  208. package/dist/esm/chunk-JYQGCXXI.js.map +7 -0
  209. package/dist/esm/chunk-KA5UE2VN.js +2 -0
  210. package/dist/esm/chunk-KA5UE2VN.js.map +7 -0
  211. package/dist/esm/{chunk-T62PRLPN.js → chunk-KEGCX5VM.js} +2 -2
  212. package/dist/esm/chunk-KVHKPUZ2.js +2 -0
  213. package/dist/esm/chunk-KVHKPUZ2.js.map +7 -0
  214. package/dist/esm/chunk-M7I6ISPL.js +2 -0
  215. package/dist/esm/chunk-M7I6ISPL.js.map +7 -0
  216. package/dist/esm/chunk-MYYXOFU5.js +1 -0
  217. package/dist/esm/{chunk-FFG32ERA.js → chunk-N3WBEQWL.js} +3 -3
  218. package/dist/esm/chunk-N3WBEQWL.js.map +7 -0
  219. package/dist/esm/{chunk-HKPXDQ2B.js → chunk-NC3CJUE3.js} +2 -2
  220. package/dist/esm/chunk-P2MV6HLA.js +2 -0
  221. package/dist/esm/{chunk-7SS4UUJH.js.map → chunk-P2MV6HLA.js.map} +3 -3
  222. package/dist/esm/chunk-PALE5UWK.js +2 -0
  223. package/dist/esm/{chunk-DSPYHO3L.js.map → chunk-PALE5UWK.js.map} +2 -2
  224. package/dist/esm/chunk-PDMCLVYT.js +2 -0
  225. package/dist/esm/chunk-PDMCLVYT.js.map +7 -0
  226. package/dist/esm/chunk-PM6QY3JO.js +2 -0
  227. package/dist/esm/{chunk-TJL47GIO.js.map → chunk-PM6QY3JO.js.map} +3 -3
  228. package/dist/esm/chunk-RKZVXVBN.js +2 -0
  229. package/dist/esm/chunk-RKZVXVBN.js.map +7 -0
  230. package/dist/esm/chunk-TXQZ5HLV.js +2 -0
  231. package/dist/esm/chunk-TXQZ5HLV.js.map +7 -0
  232. package/dist/esm/chunk-UKASIY6M.js +2 -0
  233. package/dist/esm/chunk-UKASIY6M.js.map +7 -0
  234. package/dist/esm/{chunk-OJQNLROL.js → chunk-UY6WJUNA.js} +2 -2
  235. package/dist/esm/chunk-V5O3TF57.js +2 -0
  236. package/dist/esm/{chunk-3KQE2PSJ.js.map → chunk-V5O3TF57.js.map} +3 -3
  237. package/dist/esm/chunk-VUNCI6A6.js +2 -0
  238. package/dist/esm/chunk-VUNCI6A6.js.map +7 -0
  239. package/dist/esm/{chunk-JBHRV364.js → chunk-VUPIJNG2.js} +2 -2
  240. package/dist/esm/chunk-W6BN5QLH.js +2 -0
  241. package/dist/esm/{chunk-ZNDCZM5A.js.map → chunk-W6BN5QLH.js.map} +2 -2
  242. package/dist/esm/chunk-WG5ORTIW.js +2 -0
  243. package/dist/esm/chunk-WG5ORTIW.js.map +7 -0
  244. package/dist/esm/chunk-WMVR2XBR.js +2 -0
  245. package/dist/esm/{chunk-XKSU3NLG.js.map → chunk-WMVR2XBR.js.map} +2 -2
  246. package/dist/esm/{chunk-NNZTSXKH.js → chunk-WX7SX5BN.js} +2 -2
  247. package/dist/esm/chunk-XOACTIBL.js +2 -0
  248. package/dist/esm/chunk-XOACTIBL.js.map +7 -0
  249. package/dist/esm/components/_internal/base-button.d.ts +11 -1
  250. package/dist/esm/components/_internal/base-button.d.ts.map +1 -1
  251. package/dist/esm/components/_internal/base-button.js +1 -1
  252. package/dist/esm/components/_internal/menu-context.d.ts +2 -0
  253. package/dist/esm/components/_internal/menu-context.d.ts.map +1 -1
  254. package/dist/esm/components/_internal/menu-context.js +1 -1
  255. package/dist/esm/components/_internal/pane-chrome.d.ts +17 -2
  256. package/dist/esm/components/_internal/pane-chrome.d.ts.map +1 -1
  257. package/dist/esm/components/_internal/pane-chrome.js +1 -1
  258. package/dist/esm/components/_internal/shell-bottom.js +1 -1
  259. package/dist/esm/components/_internal/shell-inspector.js +1 -1
  260. package/dist/esm/components/_internal/shell-sidebar.js +1 -1
  261. package/dist/esm/components/accordion.d.ts +2 -2
  262. package/dist/esm/components/accordion.d.ts.map +1 -1
  263. package/dist/esm/components/accordion.js +1 -1
  264. package/dist/esm/components/alert-dialog.d.ts.map +1 -1
  265. package/dist/esm/components/alert-dialog.js +1 -1
  266. package/dist/esm/components/avatar.d.ts +1 -1
  267. package/dist/esm/components/avatar.d.ts.map +1 -1
  268. package/dist/esm/components/avatar.js +1 -1
  269. package/dist/esm/components/avatar.props.d.ts +8 -0
  270. package/dist/esm/components/avatar.props.d.ts.map +1 -1
  271. package/dist/esm/components/avatar.props.js +1 -1
  272. package/dist/esm/components/blockquote.d.ts +1 -1
  273. package/dist/esm/components/blockquote.d.ts.map +1 -1
  274. package/dist/esm/components/blockquote.js +1 -1
  275. package/dist/esm/components/button.js +1 -1
  276. package/dist/esm/components/chatbar.d.ts.map +1 -1
  277. package/dist/esm/components/chatbar.js +1 -1
  278. package/dist/esm/components/checkbox-group.d.ts.map +1 -1
  279. package/dist/esm/components/checkbox-group.js +1 -1
  280. package/dist/esm/components/checkbox-group.primitive.d.ts +12 -5
  281. package/dist/esm/components/checkbox-group.primitive.d.ts.map +1 -1
  282. package/dist/esm/components/checkbox-group.primitive.js +1 -1
  283. package/dist/esm/components/checkbox.js +1 -1
  284. package/dist/esm/components/chip.d.ts.map +1 -1
  285. package/dist/esm/components/chip.js +1 -1
  286. package/dist/esm/components/code.d.ts.map +1 -1
  287. package/dist/esm/components/code.js +1 -1
  288. package/dist/esm/components/combobox.js +1 -1
  289. package/dist/esm/components/context-menu.d.ts.map +1 -1
  290. package/dist/esm/components/context-menu.js +1 -1
  291. package/dist/esm/components/dialog.d.ts +1 -1
  292. package/dist/esm/components/dialog.d.ts.map +1 -1
  293. package/dist/esm/components/dialog.js +1 -1
  294. package/dist/esm/components/dropdown-menu.d.ts.map +1 -1
  295. package/dist/esm/components/dropdown-menu.js +1 -1
  296. package/dist/esm/components/icons.d.ts +3 -1
  297. package/dist/esm/components/icons.d.ts.map +1 -1
  298. package/dist/esm/components/icons.js +1 -1
  299. package/dist/esm/components/image.d.ts +23 -0
  300. package/dist/esm/components/image.d.ts.map +1 -0
  301. package/dist/esm/components/image.js +2 -0
  302. package/dist/esm/components/image.js.map +7 -0
  303. package/dist/esm/components/image.props.d.ts +19 -0
  304. package/dist/esm/components/image.props.d.ts.map +1 -0
  305. package/dist/esm/components/image.props.js +2 -0
  306. package/dist/esm/components/image.props.js.map +7 -0
  307. package/dist/esm/components/index.d.ts +2 -1
  308. package/dist/esm/components/index.d.ts.map +1 -1
  309. package/dist/esm/components/index.js +1 -1
  310. package/dist/esm/components/message-scroller.d.ts.map +1 -1
  311. package/dist/esm/components/message-scroller.js +1 -1
  312. package/dist/esm/components/navbar.d.ts.map +1 -1
  313. package/dist/esm/components/navbar.js +1 -1
  314. package/dist/esm/components/notice.d.ts +4 -1
  315. package/dist/esm/components/notice.d.ts.map +1 -1
  316. package/dist/esm/components/notice.js +1 -1
  317. package/dist/esm/components/progress.d.ts.map +1 -1
  318. package/dist/esm/components/progress.js +1 -1
  319. package/dist/esm/components/schemas/button.schema.d.ts +2 -2
  320. package/dist/esm/components/schemas/toggle.schema.d.ts +1 -1
  321. package/dist/esm/components/scroll-area.d.ts +3 -1
  322. package/dist/esm/components/scroll-area.d.ts.map +1 -1
  323. package/dist/esm/components/scroll-area.js +1 -1
  324. package/dist/esm/components/segmented-control.d.ts +3 -1
  325. package/dist/esm/components/segmented-control.d.ts.map +1 -1
  326. package/dist/esm/components/segmented-control.js +1 -1
  327. package/dist/esm/components/select.d.ts +1 -2
  328. package/dist/esm/components/select.d.ts.map +1 -1
  329. package/dist/esm/components/select.js +1 -1
  330. package/dist/esm/components/separator.d.ts.map +1 -1
  331. package/dist/esm/components/separator.js +1 -1
  332. package/dist/esm/components/sheet.d.ts +1 -0
  333. package/dist/esm/components/sheet.d.ts.map +1 -1
  334. package/dist/esm/components/sheet.js +1 -1
  335. package/dist/esm/components/shell.d.ts +12 -1
  336. package/dist/esm/components/shell.d.ts.map +1 -1
  337. package/dist/esm/components/shell.js +1 -1
  338. package/dist/esm/components/sidebar.d.ts.map +1 -1
  339. package/dist/esm/components/sidebar.js +1 -1
  340. package/dist/esm/components/slider.d.ts.map +1 -1
  341. package/dist/esm/components/slider.js +1 -1
  342. package/dist/esm/components/spinner.d.ts.map +1 -1
  343. package/dist/esm/components/spinner.js +1 -1
  344. package/dist/esm/components/table.d.ts.map +1 -1
  345. package/dist/esm/components/table.js +1 -1
  346. package/dist/esm/components/tabs.d.ts.map +1 -1
  347. package/dist/esm/components/tabs.js +1 -1
  348. package/dist/esm/components/text-area.js +1 -1
  349. package/dist/esm/components/text-field.js +1 -1
  350. package/dist/esm/components/toggle.d.ts +3 -2
  351. package/dist/esm/components/toggle.d.ts.map +1 -1
  352. package/dist/esm/components/toggle.js +1 -1
  353. package/dist/esm/components/toolbar.d.ts +80 -8
  354. package/dist/esm/components/toolbar.d.ts.map +1 -1
  355. package/dist/esm/components/toolbar.js +1 -1
  356. package/dist/esm/components/virtual-menu.d.ts +3 -5
  357. package/dist/esm/components/virtual-menu.d.ts.map +1 -1
  358. package/dist/esm/components/virtual-menu.js +1 -1
  359. package/dist/esm/helpers/extract-margin-props.d.ts +7 -7
  360. package/dist/esm/helpers/index.js +1 -1
  361. package/dist/esm/hooks/index.js +1 -1
  362. package/dist/esm/hooks/use-scroll-edges.d.ts +4 -2
  363. package/dist/esm/hooks/use-scroll-edges.d.ts.map +1 -1
  364. package/dist/esm/hooks/use-scroll-edges.js +1 -1
  365. package/dist/esm/index.js +1 -1
  366. package/dist/esm/props/index.js +1 -1
  367. package/package.json +1 -1
  368. package/src/components/_internal/base-button.css +6 -0
  369. package/src/components/_internal/base-button.tsx +56 -17
  370. package/src/components/_internal/base-sidebar-menu.css +8 -0
  371. package/src/components/_internal/menu-context.tsx +11 -0
  372. package/src/components/_internal/pane-chrome.tsx +45 -8
  373. package/src/components/accordion.css +35 -4
  374. package/src/components/accordion.tsx +12 -16
  375. package/src/components/alert-dialog.tsx +59 -161
  376. package/src/components/avatar.props.tsx +6 -0
  377. package/src/components/avatar.tsx +57 -71
  378. package/src/components/blockquote.tsx +8 -9
  379. package/src/components/chatbar.tsx +27 -20
  380. package/src/components/checkbox-group.primitive.tsx +40 -51
  381. package/src/components/checkbox-group.tsx +1 -9
  382. package/src/components/chip.css +18 -20
  383. package/src/components/chip.tsx +3 -4
  384. package/src/components/code.tsx +3 -2
  385. package/src/components/combobox.css +13 -0
  386. package/src/components/context-menu.tsx +23 -5
  387. package/src/components/dialog.tsx +59 -160
  388. package/src/components/dropdown-menu.tsx +8 -5
  389. package/src/components/icons.tsx +11 -1
  390. package/src/components/image.css +33 -0
  391. package/src/components/image.props.ts +18 -0
  392. package/src/components/image.tsx +71 -0
  393. package/src/components/index.css +1 -0
  394. package/src/components/index.tsx +8 -0
  395. package/src/components/message-scroller.tsx +48 -26
  396. package/src/components/navbar.tsx +34 -69
  397. package/src/components/notice.tsx +6 -3
  398. package/src/components/progress.tsx +6 -3
  399. package/src/components/scroll-area.css +28 -2
  400. package/src/components/scroll-area.tsx +49 -3
  401. package/src/components/segmented-control.css +8 -130
  402. package/src/components/segmented-control.tsx +36 -5
  403. package/src/components/select.tsx +100 -32
  404. package/src/components/separator.tsx +13 -1
  405. package/src/components/sheet.css +7 -6
  406. package/src/components/sheet.tsx +76 -143
  407. package/src/components/shell.css +26 -0
  408. package/src/components/shell.tsx +29 -8
  409. package/src/components/sidebar.tsx +27 -16
  410. package/src/components/slider.css +1 -0
  411. package/src/components/slider.tsx +54 -44
  412. package/src/components/spinner.css +19 -1
  413. package/src/components/spinner.tsx +21 -11
  414. package/src/components/table.tsx +18 -5
  415. package/src/components/tabs.css +34 -0
  416. package/src/components/tabs.tsx +0 -2
  417. package/src/components/text-area.css +2 -1
  418. package/src/components/text-area.tsx +1 -1
  419. package/src/components/text-field.tsx +1 -1
  420. package/src/components/toggle.tsx +21 -39
  421. package/src/components/toolbar.css +34 -0
  422. package/src/components/toolbar.tsx +432 -23
  423. package/src/components/virtual-menu.tsx +110 -37
  424. package/src/hooks/use-scroll-edges.ts +11 -2
  425. package/src/styles/tokens/color.css +1 -22
  426. package/src/styles/utilities/truncate.css +10 -0
  427. package/styles.css +252 -208
  428. package/tokens/base.css +0 -21
  429. package/tokens.css +0 -21
  430. package/utilities.css +5 -0
  431. package/dist/esm/chunk-23KT3D2Z.js +0 -2
  432. package/dist/esm/chunk-3JA7SJDT.js +0 -2
  433. package/dist/esm/chunk-3JA7SJDT.js.map +0 -7
  434. package/dist/esm/chunk-3KQE2PSJ.js +0 -2
  435. package/dist/esm/chunk-3YWVE5GL.js +0 -2
  436. package/dist/esm/chunk-3YWVE5GL.js.map +0 -7
  437. package/dist/esm/chunk-5BWLY27A.js +0 -2
  438. package/dist/esm/chunk-5BWLY27A.js.map +0 -7
  439. package/dist/esm/chunk-6CK7UTNH.js +0 -2
  440. package/dist/esm/chunk-6CK7UTNH.js.map +0 -7
  441. package/dist/esm/chunk-6RK26HIY.js +0 -2
  442. package/dist/esm/chunk-6RK26HIY.js.map +0 -7
  443. package/dist/esm/chunk-7ESWH773.js +0 -2
  444. package/dist/esm/chunk-7ESWH773.js.map +0 -7
  445. package/dist/esm/chunk-7SS4UUJH.js +0 -2
  446. package/dist/esm/chunk-A3YQIJDA.js +0 -2
  447. package/dist/esm/chunk-A3YQIJDA.js.map +0 -7
  448. package/dist/esm/chunk-AB3QCCUM.js +0 -2
  449. package/dist/esm/chunk-AB3QCCUM.js.map +0 -7
  450. package/dist/esm/chunk-BEP4AH5V.js +0 -2
  451. package/dist/esm/chunk-BEP4AH5V.js.map +0 -7
  452. package/dist/esm/chunk-D3U4MWDZ.js +0 -1
  453. package/dist/esm/chunk-DBROSD2J.js +0 -2
  454. package/dist/esm/chunk-DBROSD2J.js.map +0 -7
  455. package/dist/esm/chunk-DSPYHO3L.js +0 -2
  456. package/dist/esm/chunk-E2D2VWUI.js +0 -2
  457. package/dist/esm/chunk-E2D2VWUI.js.map +0 -7
  458. package/dist/esm/chunk-EMNSA65L.js +0 -2
  459. package/dist/esm/chunk-EMNSA65L.js.map +0 -7
  460. package/dist/esm/chunk-FFG32ERA.js.map +0 -7
  461. package/dist/esm/chunk-FHPHEIYJ.js +0 -2
  462. package/dist/esm/chunk-FHPHEIYJ.js.map +0 -7
  463. package/dist/esm/chunk-FJFBM7HW.js +0 -2
  464. package/dist/esm/chunk-FJFBM7HW.js.map +0 -7
  465. package/dist/esm/chunk-HIKMKGPT.js +0 -2
  466. package/dist/esm/chunk-HIKMKGPT.js.map +0 -7
  467. package/dist/esm/chunk-IJRBX6EV.js +0 -2
  468. package/dist/esm/chunk-IJRBX6EV.js.map +0 -7
  469. package/dist/esm/chunk-KMDXIZAG.js +0 -2
  470. package/dist/esm/chunk-KMDXIZAG.js.map +0 -7
  471. package/dist/esm/chunk-LC5AK2ZD.js +0 -2
  472. package/dist/esm/chunk-LC5AK2ZD.js.map +0 -7
  473. package/dist/esm/chunk-LHIS3UKQ.js +0 -2
  474. package/dist/esm/chunk-LHIS3UKQ.js.map +0 -7
  475. package/dist/esm/chunk-NLXJZJNN.js +0 -2
  476. package/dist/esm/chunk-NLXJZJNN.js.map +0 -7
  477. package/dist/esm/chunk-QOHJIF25.js +0 -2
  478. package/dist/esm/chunk-QOHJIF25.js.map +0 -7
  479. package/dist/esm/chunk-R4XJNQX5.js +0 -2
  480. package/dist/esm/chunk-R4XJNQX5.js.map +0 -7
  481. package/dist/esm/chunk-TJL47GIO.js +0 -2
  482. package/dist/esm/chunk-V32EP3S7.js +0 -2
  483. package/dist/esm/chunk-V32EP3S7.js.map +0 -7
  484. package/dist/esm/chunk-WKSXMFFF.js +0 -2
  485. package/dist/esm/chunk-WKSXMFFF.js.map +0 -7
  486. package/dist/esm/chunk-XKSU3NLG.js +0 -2
  487. package/dist/esm/chunk-Y3JYEEFB.js +0 -2
  488. package/dist/esm/chunk-YK3ZUMRQ.js +0 -2
  489. package/dist/esm/chunk-YK3ZUMRQ.js.map +0 -7
  490. package/dist/esm/chunk-YZM54IJE.js +0 -2
  491. package/dist/esm/chunk-YZM54IJE.js.map +0 -7
  492. package/dist/esm/chunk-ZJI2IK7C.js +0 -2
  493. package/dist/esm/chunk-ZJI2IK7C.js.map +0 -7
  494. package/dist/esm/chunk-ZNDCZM5A.js +0 -2
  495. /package/dist/esm/{chunk-T62PRLPN.js.map → chunk-KEGCX5VM.js.map} +0 -0
  496. /package/dist/esm/{chunk-D3U4MWDZ.js.map → chunk-MYYXOFU5.js.map} +0 -0
  497. /package/dist/esm/{chunk-HKPXDQ2B.js.map → chunk-NC3CJUE3.js.map} +0 -0
  498. /package/dist/esm/{chunk-OJQNLROL.js.map → chunk-UY6WJUNA.js.map} +0 -0
  499. /package/dist/esm/{chunk-JBHRV364.js.map → chunk-VUPIJNG2.js.map} +0 -0
  500. /package/dist/esm/{chunk-NNZTSXKH.js.map → chunk-WX7SX5BN.js.map} +0 -0
@@ -20,6 +20,11 @@ const avatarPropDefs = {
20
20
  * Cannot be used together with `badge`.
21
21
  */
22
22
  status: { type: 'enum', values: accentColors, default: undefined },
23
+ /**
24
+ * The words the status dot stands for, such as "Online". A screen reader reads them with the
25
+ * avatar. Without it the dot is hidden from screen readers.
26
+ */
27
+ statusLabel: { type: 'string', default: undefined },
23
28
  /**
24
29
  * Custom badge content. Renders at the bottom-right corner.
25
30
  * Cannot be used together with `status`.
@@ -36,6 +41,7 @@ const avatarPropDefs = {
36
41
  variant: PropDef<(typeof variants)[number]>;
37
42
  fallback: PropDef<React.ReactNode>;
38
43
  status: PropDef<(typeof accentColors)[number] | undefined>;
44
+ statusLabel: PropDef<string | undefined>;
39
45
  badge: PropDef<React.ReactNode>;
40
46
  fit: PropDef<(typeof objectFitValues)[number]>;
41
47
  };
@@ -13,43 +13,38 @@ import type { ComponentPropsWithout, RemovedProps } from '../helpers/component-p
13
13
  import type { GetPropDefTypes } from '../props/prop-def.js';
14
14
 
15
15
  interface AvatarProps extends AvatarImplProps {}
16
- const Avatar = React.forwardRef<AvatarImplElement, AvatarProps>((ownProps, forwardedRef) => {
16
+ const Avatar = React.forwardRef<AvatarElement, AvatarProps>((ownProps, forwardedRef) => {
17
17
  // An unset size follows the Theme, like a control. Sizes above 4 are only explicit.
18
18
  const props = useThemeSizeProps(ownProps, avatarPropDefs.size);
19
- const {
20
- asChild,
21
- children,
22
- className,
23
- style,
24
- color,
25
- radius,
26
- status,
27
- badge,
28
- ...imageProps
29
- } = extractProps(props, avatarPropDefs);
19
+ const { asChild, children, className, style, color, radius, status, statusLabel, badge, ...imageProps } = extractProps(props, avatarPropDefs);
30
20
 
31
21
  if (process.env.NODE_ENV !== 'production') {
32
22
  if (status !== undefined && badge !== undefined) {
33
- console.warn(
34
- 'Avatar: Cannot use both `status` and `badge` props together. ' +
35
- 'The `badge` prop will be used and `status` will be ignored.'
36
- );
23
+ console.warn('Avatar: Cannot use both `status` and `badge` props together. ' + 'The `badge` prop will be used and `status` will be ignored.');
37
24
  }
38
25
  }
39
26
 
40
27
  // Cheap boolean checks — no memoization needed
41
- const isDisabled =
42
- asChild &&
43
- children != null &&
44
- React.isValidElement(children) &&
45
- ((children.props as any).disabled === true ||
46
- (children.props as any)['data-disabled'] === true);
28
+ const isDisabled = asChild && children != null && React.isValidElement(children) && ((children.props as any).disabled === true || (children.props as any)['data-disabled'] === true);
47
29
 
48
30
  const hasIndicator = badge !== undefined || status !== undefined;
49
31
 
32
+ const indicator =
33
+ badge !== undefined ? (
34
+ <span className="kui-AvatarBadge">{badge}</span>
35
+ ) : status !== undefined ? (
36
+ <span
37
+ className="kui-AvatarStatus"
38
+ data-accent-color={status}
39
+ role={statusLabel ? 'img' : undefined}
40
+ aria-label={statusLabel || undefined}
41
+ aria-hidden={statusLabel ? undefined : true}
42
+ />
43
+ ) : null;
44
+
50
45
  return (
51
- // TODO as a rule, should we rather spread the props on root?
52
46
  <AvatarPrimitive.Root
47
+ ref={forwardedRef}
53
48
  data-accent-color={color}
54
49
  data-radius={radius}
55
50
  data-disabled={isDisabled || undefined}
@@ -58,67 +53,58 @@ const Avatar = React.forwardRef<AvatarImplElement, AvatarProps>((ownProps, forwa
58
53
  style={style}
59
54
  asChild={asChild}
60
55
  >
61
- {getSubtree({ asChild, children }, <AvatarImpl ref={forwardedRef} {...imageProps} />)}
62
- {badge !== undefined ? (
63
- <span className="kui-AvatarBadge">{badge}</span>
64
- ) : status !== undefined ? (
65
- <span className="kui-AvatarStatus" data-accent-color={status} />
66
- ) : null}
56
+ {/* With asChild, Slot takes exactly one child, so the indicator goes inside it. */}
57
+ {getSubtree(
58
+ { asChild, children },
59
+ <>
60
+ <AvatarImpl {...imageProps} />
61
+ {indicator}
62
+ </>,
63
+ )}
67
64
  </AvatarPrimitive.Root>
68
65
  );
69
66
  });
70
67
  Avatar.displayName = 'Avatar';
71
68
 
72
- type AvatarImplElement = React.ElementRef<typeof AvatarPrimitive.Image>;
69
+ type AvatarElement = React.ElementRef<typeof AvatarPrimitive.Root>;
73
70
  type AvatarOwnProps = GetPropDefTypes<typeof avatarPropDefs>;
74
71
 
75
- interface AvatarImplProps
76
- extends ComponentPropsWithout<typeof AvatarPrimitive.Image, RemovedProps>,
77
- AvatarOwnProps {
72
+ interface AvatarImplProps extends ComponentPropsWithout<typeof AvatarPrimitive.Image, RemovedProps>, AvatarOwnProps {
78
73
  // TODO: See if we can automate making prop defs with `required: true` non nullable
79
74
  fallback: NonNullable<AvatarOwnProps['fallback']>;
80
75
  }
81
76
 
82
- const AvatarImpl = React.memo(
83
- React.forwardRef<AvatarImplElement, AvatarImplProps>(
84
- ({ fallback, onLoadingStatusChange, ...imageProps }, forwardedRef) => {
85
- const [status, setStatus] = React.useState<'idle' | 'loading' | 'loaded' | 'error'>('idle');
77
+ const AvatarImpl = React.memo(({ fallback, onLoadingStatusChange, ...imageProps }: AvatarImplProps) => {
78
+ const [status, setStatus] = React.useState<'idle' | 'loading' | 'loaded' | 'error'>('idle');
86
79
 
87
- const handleLoadingStatusChange = React.useCallback(
88
- (newStatus: 'idle' | 'loading' | 'loaded' | 'error') => {
89
- onLoadingStatusChange?.(newStatus);
90
- setStatus(newStatus);
91
- },
92
- [onLoadingStatusChange],
93
- );
94
-
95
- return (
96
- <>
97
- {status === 'idle' || status === 'loading' ? <span className="kui-AvatarFallback" /> : null}
98
-
99
- {status === 'error' ? (
100
- <AvatarPrimitive.Fallback
101
- className={classNames('kui-AvatarFallback', {
102
- 'kui-one-letter': typeof fallback === 'string' && fallback.length === 1,
103
- 'kui-two-letters': typeof fallback === 'string' && fallback.length === 2,
104
- })}
105
- delayMs={0}
106
- >
107
- {fallback}
108
- </AvatarPrimitive.Fallback>
109
- ) : null}
110
-
111
- <AvatarPrimitive.Image
112
- ref={forwardedRef}
113
- className="kui-AvatarImage"
114
- {...imageProps}
115
- onLoadingStatusChange={handleLoadingStatusChange}
116
- />
117
- </>
118
- );
80
+ const handleLoadingStatusChange = React.useCallback(
81
+ (newStatus: 'idle' | 'loading' | 'loaded' | 'error') => {
82
+ onLoadingStatusChange?.(newStatus);
83
+ setStatus(newStatus);
119
84
  },
120
- ),
121
- );
85
+ [onLoadingStatusChange],
86
+ );
87
+
88
+ return (
89
+ <>
90
+ {status === 'idle' || status === 'loading' ? <span className="kui-AvatarFallback" /> : null}
91
+
92
+ {status === 'error' ? (
93
+ <AvatarPrimitive.Fallback
94
+ className={classNames('kui-AvatarFallback', {
95
+ 'kui-one-letter': typeof fallback === 'string' && fallback.length === 1,
96
+ 'kui-two-letters': typeof fallback === 'string' && fallback.length === 2,
97
+ })}
98
+ delayMs={0}
99
+ >
100
+ {fallback}
101
+ </AvatarPrimitive.Fallback>
102
+ ) : null}
103
+
104
+ <AvatarPrimitive.Image className="kui-AvatarImage" {...imageProps} onLoadingStatusChange={handleLoadingStatusChange} />
105
+ </>
106
+ );
107
+ });
122
108
 
123
109
  AvatarImpl.displayName = 'AvatarImpl';
124
110
 
@@ -2,9 +2,9 @@ import * as React from 'react';
2
2
  import classNames from 'classnames';
3
3
  import { Slot } from 'radix-ui';
4
4
 
5
- import { Text } from './text.js';
5
+ import { blockquotePropDefs } from './blockquote.props.js';
6
+ import { extractProps } from '../helpers/extract-props.js';
6
7
 
7
- import type { blockquotePropDefs } from './blockquote.props.js';
8
8
  import type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';
9
9
  import type { GetPropDefTypes } from '../props/prop-def.js';
10
10
 
@@ -14,17 +14,16 @@ interface BlockquoteProps
14
14
  extends ComponentPropsWithout<'blockquote', RemovedProps>,
15
15
  BlockQuoteOwnProps {}
16
16
  const Blockquote = React.forwardRef<BlockquoteElement, BlockquoteProps>((props, forwardedRef) => {
17
- const { asChild, children, className, ...blockquoteProps } = props;
17
+ // Only Blockquote's own props style it. It wears Text's classes, so it reads like Text.
18
+ const { asChild, className, color, ...blockquoteProps } = extractProps(props, blockquotePropDefs);
18
19
  const Comp = asChild ? Slot.Root : 'blockquote';
19
20
  return (
20
- <Text
21
- asChild
21
+ <Comp
22
+ data-accent-color={color}
22
23
  {...blockquoteProps}
23
24
  ref={forwardedRef}
24
- className={classNames('kui-Blockquote', className)}
25
- >
26
- <Comp>{children}</Comp>
27
- </Text>
25
+ className={classNames('kui-Text', 'kui-Blockquote', className)}
26
+ />
28
27
  );
29
28
  });
30
29
  Blockquote.displayName = 'Blockquote';
@@ -4,7 +4,7 @@ import { useComposedRefs } from 'radix-ui/internal';
4
4
  import { useDropzone } from 'react-dropzone';
5
5
 
6
6
  import { Button } from './button.js';
7
- import { CloseIcon, FileTextIcon } from './icons.js';
7
+ import { CloseIcon, FileTextIcon, PaperclipIcon } from './icons.js';
8
8
  import { Flex } from './flex.js';
9
9
  import { ScrollArea } from './scroll-area.js';
10
10
  import { Slot } from './slot.js';
@@ -1216,28 +1216,35 @@ interface AttachTriggerProps extends React.ComponentPropsWithoutRef<'button'> {
1216
1216
  }
1217
1217
 
1218
1218
  const AttachTrigger = React.forwardRef<HTMLButtonElement, AttachTriggerProps>((props, forwardedRef) => {
1219
- const { asChild, accept, multiple, disabled: disabledProp, onPointerDown, onClick, ...buttonProps } = props;
1219
+ // The HTML `color` attribute is dropped: Button reads `color` as an accent colour.
1220
+ const { asChild, accept, multiple, disabled: disabledProp, onPointerDown, onClick, children, color: _color, ...buttonProps } = props;
1220
1221
  const ctx = useChatbarContext();
1221
1222
  const disabled = disabledProp || ctx.disabled || ctx.readOnly;
1222
- const Comp = asChild ? Slot : 'button';
1223
+ const triggerProps = {
1224
+ ...buttonProps,
1225
+ ref: forwardedRef,
1226
+ className: classNames('kui-ChatbarAttachTrigger', buttonProps.className),
1227
+ type: buttonProps.type ?? 'button',
1228
+ 'aria-label': buttonProps['aria-label'] ?? 'Add attachments',
1229
+ disabled,
1230
+ onPointerDown: (event: React.PointerEvent<HTMLButtonElement>) => {
1231
+ onPointerDown?.(event);
1232
+ if (!disabled && !event.defaultPrevented) ctx.beginFilePickerPress();
1233
+ },
1234
+ onClick: (event: React.MouseEvent<HTMLButtonElement>) => {
1235
+ onClick?.(event);
1236
+ if (disabled || event.defaultPrevented) return;
1237
+ ctx.openFilePicker({ accept, multiple });
1238
+ },
1239
+ } as const;
1240
+
1241
+ if (asChild) return <Slot {...triggerProps}>{children}</Slot>;
1242
+
1243
+ // Without asChild, the trigger is a quiet icon-only Button at the Chatbar's size.
1223
1244
  return (
1224
- <Comp
1225
- {...buttonProps}
1226
- ref={forwardedRef}
1227
- className={classNames('kui-ChatbarAttachTrigger', buttonProps.className)}
1228
- type={buttonProps.type ?? 'button'}
1229
- aria-label={buttonProps['aria-label'] ?? 'Add attachments'}
1230
- disabled={disabled}
1231
- onPointerDown={(event: React.PointerEvent<HTMLButtonElement>) => {
1232
- onPointerDown?.(event);
1233
- if (!disabled && !event.defaultPrevented) ctx.beginFilePickerPress();
1234
- }}
1235
- onClick={(event: React.MouseEvent<HTMLButtonElement>) => {
1236
- onClick?.(event);
1237
- if (disabled || event.defaultPrevented) return;
1238
- ctx.openFilePicker({ accept, multiple });
1239
- }}
1240
- />
1245
+ <Button iconOnly emphasis="quiet" color="gray" size={ctx.size} {...triggerProps}>
1246
+ {children ?? <PaperclipIcon aria-hidden />}
1247
+ </Button>
1241
1248
  );
1242
1249
  });
1243
1250
  AttachTrigger.displayName = 'Chatbar.AttachTrigger';
@@ -2,13 +2,7 @@
2
2
 
3
3
  import * as React from 'react';
4
4
  import { Checkbox as CheckboxPrimitive, Direction } from 'radix-ui';
5
- import {
6
- Context,
7
- Primitive,
8
- useComposedRefs,
9
- RovingFocus,
10
- useControllableState,
11
- } from 'radix-ui/internal';
5
+ import { Context, Primitive, useControllableState } from 'radix-ui/internal';
12
6
 
13
7
  const { useDirection } = Direction;
14
8
 
@@ -20,9 +14,8 @@ const CHECKBOX_GROUP_NAME = 'CheckboxGroup';
20
14
  type ScopedProps<P> = P & { __scopeCheckboxGroup?: Context.Scope };
21
15
  const [createCheckboxGroupContext, createCheckboxGroupScope] = Context.createContextScope(
22
16
  CHECKBOX_GROUP_NAME,
23
- [RovingFocus.createRovingFocusGroupScope, CheckboxPrimitive.createCheckboxScope],
17
+ [CheckboxPrimitive.createCheckboxScope],
24
18
  );
25
- const useRovingFocusGroupScope = RovingFocus.createRovingFocusGroupScope();
26
19
  const useCheckboxScope = CheckboxPrimitive.createCheckboxScope();
27
20
 
28
21
  type CheckboxGroupContextValue = {
@@ -38,15 +31,22 @@ const [CheckboxGroupProvider, useCheckboxGroupContext] =
38
31
  createCheckboxGroupContext<CheckboxGroupContextValue>(CHECKBOX_GROUP_NAME);
39
32
 
40
33
  type CheckboxGroupElement = React.ElementRef<typeof Primitive.div>;
41
- type RovingFocusGroupProps = React.ComponentPropsWithoutRef<typeof RovingFocus.Root>;
42
34
  type PrimitiveDivProps = React.ComponentPropsWithoutRef<typeof Primitive.div>;
43
35
  interface CheckboxGroupProps extends PrimitiveDivProps {
44
36
  name?: CheckboxGroupContextValue['name'];
45
37
  required?: React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>['required'];
46
38
  disabled?: React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>['disabled'];
47
- dir?: RovingFocusGroupProps['dir'];
48
- orientation?: RovingFocusGroupProps['orientation'];
49
- loop?: RovingFocusGroupProps['loop'];
39
+ dir?: 'ltr' | 'rtl';
40
+ /**
41
+ * @deprecated Has no effect. Each checkbox is its own tab stop, as with native checkboxes,
42
+ * so there is no arrow-key navigation to orient.
43
+ */
44
+ orientation?: 'horizontal' | 'vertical';
45
+ /**
46
+ * @deprecated Has no effect. Each checkbox is its own tab stop, as with native checkboxes,
47
+ * so there is no arrow-key navigation to loop.
48
+ */
49
+ loop?: boolean;
50
50
  defaultValue?: string[];
51
51
  value?: CheckboxGroupContextValue['value'];
52
52
  onValueChange?: (value: string[]) => void;
@@ -61,13 +61,12 @@ const CheckboxGroup = React.forwardRef<CheckboxGroupElement, CheckboxGroupProps>
61
61
  value: valueProp,
62
62
  required = false,
63
63
  disabled = false,
64
- orientation,
64
+ orientation: _orientation,
65
65
  dir,
66
- loop = true,
66
+ loop: _loop,
67
67
  onValueChange,
68
68
  ...groupProps
69
69
  } = props;
70
- const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeCheckboxGroup);
71
70
  const direction = useDirection(dir);
72
71
  const [value = [], setValue] = useControllableState({
73
72
  prop: valueProp,
@@ -96,21 +95,13 @@ const CheckboxGroup = React.forwardRef<CheckboxGroupElement, CheckboxGroupProps>
96
95
  onItemCheck={handleItemCheck}
97
96
  onItemUncheck={handleItemUncheck}
98
97
  >
99
- <RovingFocus.Root
100
- asChild
101
- {...rovingFocusGroupScope}
102
- orientation={orientation}
98
+ <Primitive.div
99
+ role="group"
100
+ data-disabled={disabled ? '' : undefined}
103
101
  dir={direction}
104
- loop={loop}
105
- >
106
- <Primitive.div
107
- role="group"
108
- data-disabled={disabled ? '' : undefined}
109
- dir={direction}
110
- {...groupProps}
111
- ref={forwardedRef}
112
- />
113
- </RovingFocus.Root>
102
+ {...groupProps}
103
+ ref={forwardedRef}
104
+ />
114
105
  </CheckboxGroupProvider>
115
106
  );
116
107
  },
@@ -136,31 +127,29 @@ const CheckboxGroupItem = React.forwardRef<CheckboxGroupItemElement, CheckboxGro
136
127
  const { __scopeCheckboxGroup, disabled, ...itemProps } = props;
137
128
  const context = useCheckboxGroupContext(ITEM_NAME, __scopeCheckboxGroup);
138
129
  const isDisabled = context.disabled || disabled;
139
- const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeCheckboxGroup);
140
130
  const checkboxScope = useCheckboxScope(__scopeCheckboxGroup);
141
- const ref = React.useRef<React.ElementRef<typeof CheckboxPrimitive.Root>>(null);
142
- const composedRefs = useComposedRefs(forwardedRef, ref);
143
131
  const checked = context.value?.includes(itemProps.value);
132
+ // A required group needs at least one box checked, not every box: the items are
133
+ // required only while none is checked.
134
+ const isRequired = context.required && (context.value?.length ?? 0) === 0;
144
135
 
145
136
  return (
146
- <RovingFocus.Item asChild {...rovingFocusGroupScope} focusable={!isDisabled} active={checked}>
147
- <CheckboxPrimitive.Root
148
- name={context.name}
149
- disabled={isDisabled}
150
- required={context.required}
151
- checked={checked}
152
- {...checkboxScope}
153
- {...itemProps}
154
- ref={composedRefs}
155
- onCheckedChange={(checked) => {
156
- if (checked) {
157
- context.onItemCheck(props.value);
158
- } else {
159
- context.onItemUncheck(props.value);
160
- }
161
- }}
162
- />
163
- </RovingFocus.Item>
137
+ <CheckboxPrimitive.Root
138
+ name={context.name}
139
+ disabled={isDisabled}
140
+ required={isRequired}
141
+ checked={checked}
142
+ {...checkboxScope}
143
+ {...itemProps}
144
+ ref={forwardedRef}
145
+ onCheckedChange={(checked) => {
146
+ if (checked) {
147
+ context.onItemCheck(props.value);
148
+ } else {
149
+ context.onItemUncheck(props.value);
150
+ }
151
+ }}
152
+ />
164
153
  );
165
154
  },
166
155
  );
@@ -76,21 +76,13 @@ const CheckboxGroupItem = React.forwardRef<CheckboxGroupItemElement, CheckboxGro
76
76
  const { __scopeCheckboxGroup, children, className, style, ...props } = _props;
77
77
  const { size } = useCheckboxGroupContext('CheckboxGroupItem', __scopeCheckboxGroup);
78
78
 
79
- // Helper to safely convert size to Text-compatible size
80
- const getTextSize = (sizeValue: any): '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' => {
81
- if (typeof sizeValue === 'string' && /^[1-9]$/.test(sizeValue)) {
82
- return sizeValue as any;
83
- }
84
- return '3';
85
- };
86
-
87
79
  // Render `<Text as="label">` if children are provided, otherwise render
88
80
  // the solo checkbox to allow building out your custom layouts with it.
89
81
  if (children) {
90
82
  return (
91
83
  <Text
92
84
  as="label"
93
- size={getTextSize(size)}
85
+ size={size}
94
86
  className={classNames('kui-CheckboxGroupItem', className)}
95
87
  style={style}
96
88
  >
@@ -19,6 +19,20 @@
19
19
 
20
20
  isolation: isolate;
21
21
 
22
+ /* An icon is one line tall, so it never changes the chip's height. */
23
+ /* stylelint-disable-next-line selector-max-type */
24
+ & :where(svg) {
25
+ flex: none;
26
+ width: var(--chip-icon-size);
27
+ height: var(--chip-icon-size);
28
+ }
29
+
30
+ /* A chip with a tooltip is focusable, and shows the ring every control does. */
31
+ &:where(:focus-visible) {
32
+ outline: var(--focus-ring-width) solid var(--focus-8);
33
+ outline-offset: var(--focus-ring-offset);
34
+ }
35
+
22
36
  /* Forced colors support */
23
37
  @media (forced-colors: active) {
24
38
  border: 1px solid CanvasText;
@@ -37,6 +51,7 @@
37
51
  @breakpoints {
38
52
  .kui-Chip {
39
53
  &:where(.kui-r-size-1) {
54
+ --chip-icon-size: var(--icon-size-1);
40
55
  font-size: var(--font-size-1);
41
56
  line-height: var(--line-height-1);
42
57
  letter-spacing: var(--letter-spacing-1);
@@ -45,6 +60,7 @@
45
60
  border-radius: max(calc(var(--radius-1) * var(--spacing-multiplier-medium)), var(--radius-full));
46
61
  }
47
62
  &:where(.kui-r-size-2) {
63
+ --chip-icon-size: var(--icon-size-2);
48
64
  font-size: var(--font-size-1);
49
65
  line-height: var(--line-height-1);
50
66
  letter-spacing: var(--letter-spacing-1);
@@ -57,6 +73,7 @@
57
73
  }
58
74
  }
59
75
  &:where(.kui-r-size-3) {
76
+ --chip-icon-size: var(--icon-size-3);
60
77
  font-size: var(--font-size-2);
61
78
  line-height: var(--line-height-2);
62
79
  letter-spacing: var(--letter-spacing-2);
@@ -70,6 +87,7 @@
70
87
  }
71
88
  }
72
89
  &:where(.kui-r-size-4) {
90
+ --chip-icon-size: var(--icon-size-4);
73
91
  font-size: var(--font-size-3);
74
92
  line-height: var(--line-height-3);
75
93
  letter-spacing: var(--letter-spacing-3);
@@ -95,14 +113,6 @@
95
113
  .kui-Chip:where(.kui-variant-solid) {
96
114
  background-color: var(--accent-solid);
97
115
  color: var(--accent-solid-contrast);
98
-
99
- &:where([data-disabled]) {
100
- color: var(--neutral-a8);
101
- background-color: var(--neutral-a3);
102
- outline: none;
103
- filter: none;
104
- cursor: default;
105
- }
106
116
  }
107
117
 
108
118
  /* surface */
@@ -117,22 +127,10 @@
117
127
 
118
128
  .kui-Chip:where(.kui-variant-soft, .kui-variant-ghost) {
119
129
  color: var(--accent-ink);
120
-
121
- &:where([data-disabled]) {
122
- color: var(--neutral-a8);
123
- background-color: var(--neutral-a3);
124
- cursor: default;
125
- }
126
130
  }
127
131
 
128
132
  .kui-Chip:where(.kui-variant-soft) {
129
133
  background-color: var(--accent-3);
130
-
131
- &:where([data-disabled]) {
132
- color: var(--neutral-a8);
133
- background-color: var(--neutral-a3);
134
- cursor: default;
135
- }
136
134
  }
137
135
 
138
136
  /* outline */
@@ -41,15 +41,14 @@ const Chip = React.forwardRef<ChipElement, ChipProps>((props, forwardedRef) => {
41
41
  ...chipProps
42
42
  } = extractProps(props, chipPropDefs);
43
43
 
44
-
45
-
46
- // Memoize component variable to prevent unnecessary re-renders
47
- const Comp = React.useMemo(() => (asChild ? Slot.Root : 'span'), [asChild]);
44
+ const Comp = asChild ? Slot.Root : 'span';
48
45
 
49
46
  const chip = (
50
47
  <Comp
51
48
  data-accent-color={color}
52
49
  data-radius={radius}
50
+ // A tooltip opens on focus, so a chip that has one joins the tab order.
51
+ tabIndex={tooltip ? 0 : undefined}
53
52
  {...chipProps}
54
53
  ref={forwardedRef}
55
54
  className={classNames('kui-reset', 'kui-Chip', className)}
@@ -18,8 +18,9 @@ const Code = React.forwardRef<CodeElement, CodeProps>((props, forwardedRef) => {
18
18
  props,
19
19
  codePropDefs,
20
20
  );
21
- // Code ghost color prop should work as text color by default
22
- const resolvedColor = props.variant === 'ghost' ? color || undefined : color;
21
+ // A ghost Code has no fill, so it rests on the surrounding text colour: only a colour the caller
22
+ // set reaches it, never the gray default.
23
+ const resolvedColor = props.variant === 'ghost' && !props.color ? undefined : color;
23
24
  const Comp = asChild ? Slot.Root : 'code';
24
25
  return (
25
26
  <Comp
@@ -12,6 +12,10 @@
12
12
  .kui-ComboboxContent {
13
13
  --combobox-list-max-height: calc(300px * var(--scale));
14
14
 
15
+ /* Stops the list's scroll chaining to the page. Not user-scrollable (overflow: hidden), so
16
+ Chromium does not composite it the way it does a scroller with this property. */
17
+ overscroll-behavior: contain;
18
+
15
19
  min-width: var(--radix-popover-trigger-width);
16
20
  max-height: var(--radix-popover-content-available-height);
17
21
  transform-origin: var(--radix-popover-content-transform-origin);
@@ -55,6 +59,15 @@
55
59
  scrollbar-color: var(--neutral-a8) transparent;
56
60
  }
57
61
 
62
+ /* Chromium (the only engine with -webkit-app-region) composites a scroller whose
63
+ overscroll-behavior is not auto, even when the list fits: 2 layers. There the content above
64
+ stops the chain. WebKit ignores an ancestor that is not user-scrollable, so it keeps `contain`. */
65
+ @supports (-webkit-app-region: drag) {
66
+ .kui-ComboboxScrollArea {
67
+ overscroll-behavior: auto;
68
+ }
69
+ }
70
+
58
71
  .kui-ComboboxList {
59
72
  outline: 0;
60
73
  }
@@ -4,11 +4,11 @@
4
4
  */
5
5
  'use client';
6
6
 
7
- import { warnDeprecated } from '../helpers/warn-deprecated.js';
8
7
  import * as React from 'react';
9
8
  import { VirtualMenu } from './virtual-menu.js';
10
9
  import classNames from 'classnames';
11
10
  import { ContextMenu as ContextMenuPrimitive, Slot } from 'radix-ui';
11
+ import { useCallbackRef } from 'radix-ui/internal';
12
12
 
13
13
  import { ScrollArea } from './scroll-area.js';
14
14
  import {
@@ -23,7 +23,7 @@ import { ThickCheckIcon, ThickChevronRightIcon, ThickDotIcon } from './icons.js'
23
23
  import { extractProps } from '../helpers/extract-props.js';
24
24
  import { useThemeSizeProps } from '../helpers/theme-size.js';
25
25
  import { requireReactElement } from '../helpers/require-react-element.js';
26
- import { MenuProvider } from './_internal/menu-context.js';
26
+ import { MenuCloseProvider, MenuProvider } from './_internal/menu-context.js';
27
27
  import {
28
28
  MenuShortcut,
29
29
  getMenuAlignOffset,
@@ -36,9 +36,27 @@ import type { GetPropDefTypes, Responsive } from '../props/prop-def.js';
36
36
 
37
37
  interface ContextMenuRootProps
38
38
  extends React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Root> {}
39
- const ContextMenuRoot: React.FC<ContextMenuRootProps> = (props) => (
40
- <ContextMenuPrimitive.Root {...props} />
41
- );
39
+ const ContextMenuRoot: React.FC<ContextMenuRootProps> = (props) => {
40
+ const { open: openProp, onOpenChange } = props;
41
+ const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);
42
+ const open = openProp ?? uncontrolledOpen;
43
+
44
+ const handleOpenChangeProp = useCallbackRef(onOpenChange);
45
+ const handleOpenChange = React.useCallback(
46
+ (next: boolean) => {
47
+ setUncontrolledOpen(next);
48
+ handleOpenChangeProp(next);
49
+ },
50
+ [handleOpenChangeProp],
51
+ );
52
+ const close = React.useCallback(() => handleOpenChange(false), [handleOpenChange]);
53
+
54
+ return (
55
+ <MenuCloseProvider value={close}>
56
+ <ContextMenuPrimitive.Root {...props} open={open} onOpenChange={handleOpenChange} />
57
+ </MenuCloseProvider>
58
+ );
59
+ };
42
60
  ContextMenuRoot.displayName = 'ContextMenu.Root';
43
61
 
44
62
  type ContextMenuTriggerElement = React.ElementRef<typeof ContextMenuPrimitive.Trigger>;