@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
@@ -12,196 +12,95 @@ import { requireReactElement } from '../helpers/require-react-element.js';
12
12
  import { useBodyPointerEventsCleanup } from '../hooks/use-body-pointer-events-cleanup.js';
13
13
 
14
14
  import type { DialogContentOwnProps } from './dialog.props.js';
15
- import type {
16
- ComponentPropsWithout,
17
- RemovedProps,
18
- ComponentPropsAs,
19
- } from '../helpers/component-props.js';
15
+ import type { ComponentPropsWithout, RemovedProps, ComponentPropsAs } from '../helpers/component-props.js';
20
16
 
21
17
  interface DialogRootProps extends ComponentPropsWithout<typeof DialogPrimitive.Root, 'modal'> {}
22
18
  const DialogRoot: React.FC<DialogRootProps> = (props) => <DialogPrimitive.Root {...props} modal />;
23
19
  DialogRoot.displayName = 'Dialog.Root';
24
20
 
25
21
  type DialogTriggerElement = React.ElementRef<typeof DialogPrimitive.Trigger>;
26
- interface DialogTriggerProps
27
- extends ComponentPropsWithout<typeof DialogPrimitive.Trigger, RemovedProps> {}
28
- const DialogTrigger = React.forwardRef<DialogTriggerElement, DialogTriggerProps>(
29
- ({ children, ...props }, forwardedRef) => (
30
- <DialogPrimitive.Trigger {...props} ref={forwardedRef} asChild>
31
- {requireReactElement(children)}
32
- </DialogPrimitive.Trigger>
33
- ),
34
- );
22
+ interface DialogTriggerProps extends ComponentPropsWithout<typeof DialogPrimitive.Trigger, RemovedProps> {}
23
+ const DialogTrigger = React.forwardRef<DialogTriggerElement, DialogTriggerProps>(({ children, ...props }, forwardedRef) => (
24
+ <DialogPrimitive.Trigger {...props} ref={forwardedRef} asChild>
25
+ {requireReactElement(children)}
26
+ </DialogPrimitive.Trigger>
27
+ ));
35
28
  DialogTrigger.displayName = 'Dialog.Trigger';
36
29
 
37
30
  // Split once at module scope. `extractProps` memoises on the identity of the
38
31
  // prop def objects it is handed, so rebuilding these per render would recompile
39
32
  // them on every render.
40
- const {
41
- align: alignPropDef,
42
- ...contentPropDefs
43
- } = dialogContentPropDefs;
33
+ const { align: alignPropDef, ...contentPropDefs } = dialogContentPropDefs;
44
34
  const alignPropDefs = { align: alignPropDef };
45
35
 
46
36
  type DialogContentElement = React.ElementRef<typeof DialogPrimitive.Content>;
47
- interface DialogContentProps
48
- extends ComponentPropsWithout<typeof DialogPrimitive.Content, RemovedProps>,
49
- DialogContentOwnProps {
37
+ interface DialogContentProps extends ComponentPropsWithout<typeof DialogPrimitive.Content, RemovedProps>, DialogContentOwnProps {
50
38
  container?: React.ComponentPropsWithoutRef<typeof DialogPrimitive.Portal>['container'];
51
39
  }
52
- const DialogContent = React.forwardRef<DialogContentElement, DialogContentProps>(
53
- ({ align, ...ownProps }, forwardedRef) => {
54
- const props = useThemeSizeProps(ownProps, contentPropDefs.size);
55
- const { className: alignClassName } = extractProps({ align }, alignPropDefs);
56
-
57
- const {
58
- className,
59
- forceMount,
60
- container,
61
- ...contentProps
62
- } = extractProps(props, contentPropDefs);
63
-
64
- // Focus management
65
- const contentRef = React.useRef<HTMLDivElement>(null);
66
- const combinedRef = React.useMemo(
67
- () => (node: HTMLDivElement | null) => {
68
- contentRef.current = node;
69
- if (typeof forwardedRef === 'function') {
70
- forwardedRef(node);
71
- } else if (forwardedRef) {
72
- forwardedRef.current = node;
73
- }
74
- },
75
- [forwardedRef],
76
- );
77
-
78
- // Cleanup stuck pointer-events on body
79
- useBodyPointerEventsCleanup();
80
-
81
- // Focus trap effect
82
- React.useEffect(() => {
83
- // SSR safety - only run on client
84
- if (typeof window === 'undefined') return;
85
-
86
- const content = contentRef.current;
87
- if (!content) return;
88
-
89
- const focusableElements = content.querySelectorAll(
90
- 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])',
91
- );
92
-
93
- if (focusableElements.length === 0) return;
94
-
95
- const firstElement = focusableElements[0] as HTMLElement;
96
- const lastElement = focusableElements[focusableElements.length - 1] as HTMLElement;
97
-
98
- const handleKeyDown = (event: KeyboardEvent) => {
99
- if (event.key === 'Tab') {
100
- if (event.shiftKey) {
101
- if (document.activeElement === firstElement) {
102
- event.preventDefault();
103
- lastElement.focus();
104
- }
105
- } else {
106
- if (document.activeElement === lastElement) {
107
- event.preventDefault();
108
- firstElement.focus();
109
- }
110
- }
111
- }
112
- };
113
-
114
- content.addEventListener('keydown', handleKeyDown);
115
-
116
- // Focus first element when dialog opens
117
- firstElement.focus();
118
-
119
- return () => {
120
- content.removeEventListener('keydown', handleKeyDown);
121
- };
122
- }, []);
123
-
124
- return (
125
- <DialogPrimitive.Portal container={container} forceMount={forceMount}>
126
- <Theme asChild>
127
- <DialogPrimitive.Overlay className="kui-BaseDialogOverlay kui-DialogOverlay">
128
- <div className="kui-BaseDialogScroll kui-DialogScroll">
129
- <div
130
- className={`kui-BaseDialogScrollPadding kui-DialogScrollPadding ${alignClassName}`}
131
- >
132
- <DialogPrimitive.Content
133
- {...contentProps}
134
- ref={combinedRef}
135
- className={classNames('kui-BaseDialogContent', 'kui-DialogContent', className)}
136
- tabIndex={-1}
137
- role="dialog"
138
- aria-modal="true"
139
- onCloseAutoFocus={(event) => {
140
- // Prevent default focus behavior
141
- event.preventDefault();
142
- // Restore pointer-events to body (Radix UI fix for issue #1241)
143
- document.body.style.pointerEvents = '';
144
- }}
145
- />
146
- {/* ARIA live region for screen reader announcements */}
147
- <div
148
- aria-live="polite"
149
- aria-atomic="true"
150
- className="kui-sr-only"
151
- id="dialog-announcement"
152
- />
153
- </div>
40
+ const DialogContent = React.forwardRef<DialogContentElement, DialogContentProps>(({ align, ...ownProps }, forwardedRef) => {
41
+ const props = useThemeSizeProps(ownProps, contentPropDefs.size);
42
+ const { className: alignClassName } = extractProps({ align }, alignPropDefs);
43
+
44
+ const { className, forceMount, container, onCloseAutoFocus, ...contentProps } = extractProps(props, contentPropDefs);
45
+
46
+ // Cleanup stuck pointer-events on body
47
+ useBodyPointerEventsCleanup();
48
+
49
+ return (
50
+ <DialogPrimitive.Portal container={container} forceMount={forceMount}>
51
+ <Theme asChild>
52
+ <DialogPrimitive.Overlay className="kui-BaseDialogOverlay kui-DialogOverlay">
53
+ <div className="kui-BaseDialogScroll kui-DialogScroll">
54
+ <div className={`kui-BaseDialogScrollPadding kui-DialogScrollPadding ${alignClassName}`}>
55
+ <DialogPrimitive.Content
56
+ {...contentProps}
57
+ ref={forwardedRef}
58
+ className={classNames('kui-BaseDialogContent', 'kui-DialogContent', className)}
59
+ aria-modal="true"
60
+ onCloseAutoFocus={(event) => {
61
+ // Radix returns focus to the trigger unless the caller prevents it.
62
+ onCloseAutoFocus?.(event);
63
+ // Restore pointer-events to body (Radix UI fix for issue #1241)
64
+ document.body.style.pointerEvents = '';
65
+ }}
66
+ />
154
67
  </div>
155
- </DialogPrimitive.Overlay>
156
- </Theme>
157
- </DialogPrimitive.Portal>
158
- );
159
- },
160
- );
68
+ </div>
69
+ </DialogPrimitive.Overlay>
70
+ </Theme>
71
+ </DialogPrimitive.Portal>
72
+ );
73
+ });
161
74
  DialogContent.displayName = 'Dialog.Content';
162
75
 
163
76
  type DialogTitleElement = React.ElementRef<typeof Heading>;
164
77
  type DialogTitleProps = ComponentPropsWithout<typeof Heading, 'asChild'>;
165
- const DialogTitle = React.forwardRef<DialogTitleElement, DialogTitleProps>(
166
- (props, forwardedRef) => (
167
- <DialogPrimitive.Title asChild>
168
- <Heading size="5" trim="start" {...props} asChild={false} ref={forwardedRef} />
169
- </DialogPrimitive.Title>
170
- ),
171
- );
78
+ const DialogTitle = React.forwardRef<DialogTitleElement, DialogTitleProps>((props, forwardedRef) => (
79
+ <DialogPrimitive.Title asChild>
80
+ <Heading size="5" trim="start" {...props} asChild={false} ref={forwardedRef} />
81
+ </DialogPrimitive.Title>
82
+ ));
172
83
  DialogTitle.displayName = 'Dialog.Title';
173
84
 
174
85
  type DialogDescriptionElement = HTMLParagraphElement;
175
86
  type DialogDescriptionProps = ComponentPropsAs<typeof Text, 'p'>;
176
- const DialogDescription = React.forwardRef<DialogDescriptionElement, DialogDescriptionProps>(
177
- (props, forwardedRef) => (
178
- <DialogPrimitive.Description asChild>
179
- <Text as="p" size="3" {...props} asChild={false} ref={forwardedRef} />
180
- </DialogPrimitive.Description>
181
- ),
182
- );
87
+ const DialogDescription = React.forwardRef<DialogDescriptionElement, DialogDescriptionProps>((props, forwardedRef) => (
88
+ <DialogPrimitive.Description asChild>
89
+ <Text as="p" size="3" {...props} asChild={false} ref={forwardedRef} />
90
+ </DialogPrimitive.Description>
91
+ ));
183
92
  DialogDescription.displayName = 'Dialog.Description';
184
93
 
185
94
  type DialogCloseElement = React.ElementRef<typeof DialogPrimitive.Close>;
186
- interface DialogCloseProps
187
- extends ComponentPropsWithout<typeof DialogPrimitive.Close, RemovedProps> {}
188
- const DialogClose = React.forwardRef<DialogCloseElement, DialogCloseProps>(
189
- ({ children, ...props }, forwardedRef) => (
190
- <DialogPrimitive.Close {...props} ref={forwardedRef} asChild>
191
- {requireReactElement(children)}
192
- </DialogPrimitive.Close>
193
- ),
194
- );
95
+ interface DialogCloseProps extends ComponentPropsWithout<typeof DialogPrimitive.Close, RemovedProps> {}
96
+ const DialogClose = React.forwardRef<DialogCloseElement, DialogCloseProps>(({ children, ...props }, forwardedRef) => (
97
+ <DialogPrimitive.Close {...props} ref={forwardedRef} asChild>
98
+ {requireReactElement(children)}
99
+ </DialogPrimitive.Close>
100
+ ));
195
101
  DialogClose.displayName = 'Dialog.Close';
196
102
 
197
- export {
198
- DialogRoot as Root,
199
- DialogTrigger as Trigger,
200
- DialogContent as Content,
201
- DialogTitle as Title,
202
- DialogDescription as Description,
203
- DialogClose as Close,
204
- };
103
+ export { DialogRoot as Root, DialogTrigger as Trigger, DialogContent as Content, DialogTitle as Title, DialogDescription as Description, DialogClose as Close };
205
104
 
206
105
  export type {
207
106
  DialogRootProps as RootProps,
@@ -1,6 +1,5 @@
1
1
  'use client';
2
2
 
3
- import { warnDeprecated } from '../helpers/warn-deprecated.js';
4
3
  import * as React from 'react';
5
4
  import { VirtualMenu } from './virtual-menu.js';
6
5
  import classNames from 'classnames';
@@ -30,7 +29,7 @@ import {
30
29
  useStackEntry,
31
30
  useSubContext,
32
31
  } from './_internal/dropdown-menu-drill-down.js';
33
- import { MenuProvider } from './_internal/menu-context.js';
32
+ import { MenuCloseProvider, MenuProvider } from './_internal/menu-context.js';
34
33
  import {
35
34
  MenuShortcut,
36
35
  getMenuAlignOffset,
@@ -66,9 +65,13 @@ const DropdownMenuRoot: React.FC<DropdownMenuRootProps> = (props) => {
66
65
  [handleOpenChangeProp],
67
66
  );
68
67
 
68
+ const close = React.useCallback(() => handleOpenChange(false), [handleOpenChange]);
69
+
69
70
  return (
70
71
  <DropdownMenuOpenContext.Provider value={open}>
71
- <DropdownMenuPrimitive.Root {...props} onOpenChange={handleOpenChange} />
72
+ <MenuCloseProvider value={close}>
73
+ <DropdownMenuPrimitive.Root {...props} open={open} onOpenChange={handleOpenChange} />
74
+ </MenuCloseProvider>
72
75
  </DropdownMenuOpenContext.Provider>
73
76
  );
74
77
  };
@@ -338,7 +341,7 @@ const DropdownMenuRadioItem = React.forwardRef<
338
341
  className,
339
342
  )}
340
343
  >
341
- {children}
344
+ <Slot.Slottable>{children}</Slot.Slottable>
342
345
  <DropdownMenuPrimitive.ItemIndicator className="kui-BaseMenuItemIndicator kui-DropdownMenuItemIndicator">
343
346
  <ThickDotIcon className="kui-BaseMenuItemIndicatorIcon kui-DropdownMenuItemIndicatorIcon" />
344
347
  </DropdownMenuPrimitive.ItemIndicator>
@@ -379,7 +382,7 @@ const DropdownMenuCheckboxItem = React.forwardRef<
379
382
  className,
380
383
  )}
381
384
  >
382
- {children}
385
+ <Slot.Slottable>{children}</Slot.Slottable>
383
386
  <DropdownMenuPrimitive.ItemIndicator className="kui-BaseMenuItemIndicator kui-DropdownMenuItemIndicator">
384
387
  <ThickCheckIcon className="kui-BaseMenuItemIndicatorIcon kui-DropdownMenuItemIndicatorIcon" />
385
388
  </DropdownMenuPrimitive.ItemIndicator>
@@ -146,4 +146,14 @@ const FileTextIcon = React.forwardRef<IconElement, IconProps>((_props, _forwarde
146
146
  });
147
147
  FileTextIcon.displayName = 'FileTextIcon';
148
148
 
149
- export { CloseIcon, PaperclipIcon, FileIcon, FileTextIcon };
149
+ /** The tick a button shows in place of its icon while `done`. Drawn on the 24 grid at the icon set's stroke. */
150
+ const TickIcon = React.forwardRef<IconElement, IconProps>((props, forwardedRef) => {
151
+ return (
152
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" {...props} ref={forwardedRef}>
153
+ <path d="M5 12.75L9.5 17.25L19 7.25" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
154
+ </svg>
155
+ );
156
+ });
157
+ TickIcon.displayName = 'TickIcon';
158
+
159
+ export { CloseIcon, PaperclipIcon, FileIcon, FileTextIcon, TickIcon };
@@ -0,0 +1,33 @@
1
+ /*
2
+ * Image: one <img>. It fills its box by `fit`, takes the theme's corner, rests on a quiet
3
+ * neutral fill until it has loaded, so the box holds its place and a failed image keeps it.
4
+ * No fade-in: v1 has had no motion since 0.15. The fill clears once loaded so a transparent
5
+ * picture shows what is behind it.
6
+ */
7
+ .kui-Image {
8
+ display: block;
9
+ max-width: 100%;
10
+ object-fit: var(--image-object-fit, cover);
11
+ border-radius: var(--radius-2);
12
+ background-color: var(--neutral-a3);
13
+ }
14
+
15
+ .kui-Image:where([data-status='loaded']) {
16
+ background-color: transparent;
17
+ }
18
+
19
+ .kui-Image:where(.kui-r-fit-cover) {
20
+ --image-object-fit: cover;
21
+ }
22
+ .kui-Image:where(.kui-r-fit-contain) {
23
+ --image-object-fit: contain;
24
+ }
25
+ .kui-Image:where(.kui-r-fit-fill) {
26
+ --image-object-fit: fill;
27
+ }
28
+ .kui-Image:where(.kui-r-fit-scale-down) {
29
+ --image-object-fit: scale-down;
30
+ }
31
+ .kui-Image:where(.kui-r-fit-none) {
32
+ --image-object-fit: none;
33
+ }
@@ -0,0 +1,18 @@
1
+ import { radiusPropDef } from '../props/radius.prop.js';
2
+
3
+ import type { PropDef } from '../props/prop-def.js';
4
+
5
+ const objectFitValues = ['cover', 'contain', 'fill', 'scale-down', 'none'] as const;
6
+
7
+ const imagePropDefs = {
8
+ ...radiusPropDef,
9
+ /**
10
+ * How the picture fills its box, as CSS `object-fit`.
11
+ * @link https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit
12
+ */
13
+ fit: { type: 'enum', className: 'kui-r-fit', values: objectFitValues, default: 'cover' },
14
+ } satisfies {
15
+ fit: PropDef<(typeof objectFitValues)[number]>;
16
+ };
17
+
18
+ export { imagePropDefs };
@@ -0,0 +1,71 @@
1
+ import * as React from 'react';
2
+ import classNames from 'classnames';
3
+ import { useComposedRefs, useLayoutEffect } from 'radix-ui/internal';
4
+
5
+ import { imagePropDefs } from './image.props.js';
6
+ import { extractProps } from '../helpers/extract-props.js';
7
+ import { widthPropDefs } from '../props/width.props.js';
8
+ import { heightPropDefs } from '../props/height.props.js';
9
+
10
+ import type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';
11
+ import type { WidthProps } from '../props/width.props.js';
12
+ import type { HeightProps } from '../props/height.props.js';
13
+ import type { GetPropDefTypes } from '../props/prop-def.js';
14
+
15
+ type ImageElement = React.ElementRef<'img'>;
16
+ type ImageOwnProps = GetPropDefTypes<typeof imagePropDefs>;
17
+ type ImageStatus = 'loading' | 'loaded' | 'error';
18
+
19
+ interface ImageProps extends ComponentPropsWithout<'img', RemovedProps | 'width' | 'height' | 'src' | 'alt'>, WidthProps, HeightProps, ImageOwnProps {
20
+ src: string;
21
+ /** Required. Pass `""` for a decorative picture. */
22
+ alt: string;
23
+ }
24
+
25
+ /**
26
+ * A plain `<img>` that loads lazily, fills its box by `fit` and takes the theme's corner.
27
+ * One element and no wrapper: `width`, `height`, `className` and `style` all land on the
28
+ * `<img>` itself.
29
+ *
30
+ * Until it loads it rests on a quiet neutral fill, which is also what stays if it fails.
31
+ */
32
+ const Image = React.forwardRef<ImageElement, ImageProps>((props, forwardedRef) => {
33
+ const { className, alt, radius, loading = 'lazy', decoding = 'async', onLoad, onError, ...imageProps } = extractProps(props, imagePropDefs, widthPropDefs, heightPropDefs);
34
+
35
+ const [status, setStatus] = React.useState<ImageStatus>('loading');
36
+ const ref = React.useRef<HTMLImageElement>(null);
37
+
38
+ // A cached image, or one that finished before hydration, never fires onLoad for us.
39
+ useLayoutEffect(() => {
40
+ const img = ref.current;
41
+ if (img?.complete) setStatus(img.naturalWidth > 0 ? 'loaded' : 'error');
42
+ else setStatus('loading');
43
+ }, [props.src]);
44
+
45
+ const setRefs = useComposedRefs(ref, forwardedRef);
46
+
47
+ return (
48
+ <img
49
+ {...imageProps}
50
+ ref={setRefs}
51
+ alt={alt}
52
+ loading={loading}
53
+ decoding={decoding}
54
+ data-radius={radius}
55
+ data-status={status}
56
+ className={classNames('kui-Image', className)}
57
+ onLoad={(event) => {
58
+ setStatus('loaded');
59
+ onLoad?.(event);
60
+ }}
61
+ onError={(event) => {
62
+ setStatus('error');
63
+ onError?.(event);
64
+ }}
65
+ />
66
+ );
67
+ });
68
+ Image.displayName = 'Image';
69
+
70
+ export { Image };
71
+ export type { ImageProps };
@@ -20,6 +20,7 @@
20
20
  @import './dropdown-menu.css';
21
21
  @import './combobox.css';
22
22
  @import './heading.css';
23
+ @import './image.css';
23
24
  @import './kbd.css';
24
25
  @import './link.css';
25
26
  @import './navbar.css';
@@ -24,6 +24,7 @@ export {
24
24
  ThickChevronRightIcon,
25
25
  ThickDividerHorizontalIcon,
26
26
  } from './icons.js';
27
+ export { Image, type ImageProps } from './image.js';
27
28
  export { Kbd, type KbdProps } from './kbd.js';
28
29
  export { Link, type LinkProps } from './link.js';
29
30
  export * as Navbar from './navbar.js';
@@ -54,11 +55,18 @@ export {
54
55
  ToolbarButton,
55
56
  ToolbarSeparator,
56
57
  ToolbarTitle,
58
+ ToolbarOverflow,
59
+ ToolbarSlot,
60
+ ToolbarFill,
61
+ useToolbarOverflow,
57
62
  type ToolbarProps,
58
63
  type ToolbarGroupProps,
59
64
  type ToolbarButtonProps,
60
65
  type ToolbarSeparatorProps,
61
66
  type ToolbarTitleProps,
67
+ type ToolbarOverflowProps,
68
+ type ToolbarSlotProps,
69
+ type ToolbarFillProps,
62
70
  } from './toolbar.js';
63
71
  export { Tooltip, type TooltipProps } from './tooltip.js';
64
72
  export { VirtualMenu, type VirtualMenuProps, type VirtualMenuItemProps, type VirtualMenuRenderItemProps } from './virtual-menu.js';
@@ -144,32 +144,54 @@ type ButtonProps = Omit<KuiButtonProps, 'aria-label' | 'aria-labelledby' | 'vari
144
144
  * Place it inside `Root`, after the viewport. It sits over the viewport's bottom edge.
145
145
  */
146
146
  const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
147
- ({ direction = 'end', behavior, className, children, size, variant = 'surface', emphasis, color = 'gray', radius = 'full', 'aria-label': label, ...props }, forwardedRef) => (
148
- <Primitive.Button
149
- direction={direction}
150
- {...(behavior ? { behavior } : {})}
151
- render={
152
- <KuiButton
153
- iconOnly
154
- {...props}
155
- ref={forwardedRef}
156
- size={size}
157
- {...(emphasis ? { emphasis } : { variant })}
158
- color={color}
159
- radius={radius}
160
- aria-label={label ?? (direction === 'end' ? 'Jump to the latest' : 'Jump to the first')}
161
- className={classNames('kui-MessageScrollerButton', className)}
162
- data-direction={direction}
163
- >
164
- {children ?? (
165
- <svg width="15" height="15" viewBox="0 0 15 15" fill="none" aria-hidden style={direction === 'start' ? { transform: 'rotate(180deg)' } : undefined}>
166
- <path d="M7.5 2.5v10M3.5 8.5l4 4 4-4" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
167
- </svg>
168
- )}
169
- </KuiButton>
170
- }
171
- />
172
- ),
147
+ (
148
+ { direction = 'end', behavior = 'smooth', className, children, size, variant = 'surface', emphasis, color = 'gray', radius = 'full', 'aria-label': label, onClick, ...props },
149
+ forwardedRef,
150
+ ) => {
151
+ const { scrollToEnd, scrollToStart } = useMessageScroller();
152
+
153
+ // The primitive blurs the button on click, which drops keyboard focus to the page. Kookie
154
+ // jumps itself and moves focus to the viewport instead, since the button hides at the end.
155
+ const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
156
+ onClick?.(event);
157
+ if (event.defaultPrevented) return;
158
+ event.preventDefault();
159
+ const viewport = event.currentTarget
160
+ .closest('.kui-MessageScrollerRoot')
161
+ ?.querySelector<HTMLElement>('.kui-MessageScrollerViewport');
162
+ viewport?.focus({ preventScroll: true });
163
+ if (direction === 'start') scrollToStart({ behavior });
164
+ else scrollToEnd({ behavior });
165
+ };
166
+
167
+ return (
168
+ <Primitive.Button
169
+ direction={direction}
170
+ behavior={behavior}
171
+ onClick={handleClick}
172
+ render={
173
+ <KuiButton
174
+ iconOnly
175
+ {...props}
176
+ ref={forwardedRef}
177
+ size={size}
178
+ {...(emphasis ? { emphasis } : { variant })}
179
+ color={color}
180
+ radius={radius}
181
+ aria-label={label ?? (direction === 'end' ? 'Jump to the latest' : 'Jump to the first')}
182
+ className={classNames('kui-MessageScrollerButton', className)}
183
+ data-direction={direction}
184
+ >
185
+ {children ?? (
186
+ <svg width="15" height="15" viewBox="0 0 15 15" fill="none" aria-hidden style={direction === 'start' ? { transform: 'rotate(180deg)' } : undefined}>
187
+ <path d="M7.5 2.5v10M3.5 8.5l4 4 4-4" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
188
+ </svg>
189
+ )}
190
+ </KuiButton>
191
+ }
192
+ />
193
+ );
194
+ },
173
195
  );
174
196
  Button.displayName = 'MessageScroller.Button';
175
197