@womp/kookie-ui 0.23.0 → 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 (463) hide show
  1. package/components.css +190 -185
  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/index.d.ts +1 -1
  72. package/dist/cjs/components/index.d.ts.map +1 -1
  73. package/dist/cjs/components/index.js +2 -10
  74. package/dist/cjs/components/index.js.map +4 -4
  75. package/dist/cjs/components/message-scroller.d.ts.map +1 -1
  76. package/dist/cjs/components/message-scroller.js +1 -1
  77. package/dist/cjs/components/message-scroller.js.map +4 -4
  78. package/dist/cjs/components/navbar.d.ts.map +1 -1
  79. package/dist/cjs/components/navbar.js +1 -1
  80. package/dist/cjs/components/navbar.js.map +3 -3
  81. package/dist/cjs/components/notice.d.ts +4 -1
  82. package/dist/cjs/components/notice.d.ts.map +1 -1
  83. package/dist/cjs/components/notice.js +1 -1
  84. package/dist/cjs/components/notice.js.map +4 -4
  85. package/dist/cjs/components/progress.d.ts.map +1 -1
  86. package/dist/cjs/components/progress.js +1 -1
  87. package/dist/cjs/components/progress.js.map +3 -3
  88. package/dist/cjs/components/schemas/button.schema.d.ts +2 -2
  89. package/dist/cjs/components/schemas/toggle.schema.d.ts +1 -1
  90. package/dist/cjs/components/scroll-area.d.ts +3 -1
  91. package/dist/cjs/components/scroll-area.d.ts.map +1 -1
  92. package/dist/cjs/components/scroll-area.js +1 -1
  93. package/dist/cjs/components/scroll-area.js.map +4 -4
  94. package/dist/cjs/components/segmented-control.d.ts +3 -1
  95. package/dist/cjs/components/segmented-control.d.ts.map +1 -1
  96. package/dist/cjs/components/segmented-control.js +1 -1
  97. package/dist/cjs/components/segmented-control.js.map +3 -3
  98. package/dist/cjs/components/select.d.ts.map +1 -1
  99. package/dist/cjs/components/select.js +1 -1
  100. package/dist/cjs/components/select.js.map +3 -3
  101. package/dist/cjs/components/separator.d.ts.map +1 -1
  102. package/dist/cjs/components/separator.js +1 -1
  103. package/dist/cjs/components/separator.js.map +3 -3
  104. package/dist/cjs/components/sheet.d.ts +1 -0
  105. package/dist/cjs/components/sheet.d.ts.map +1 -1
  106. package/dist/cjs/components/sheet.js +1 -1
  107. package/dist/cjs/components/sheet.js.map +3 -3
  108. package/dist/cjs/components/shell.d.ts +12 -1
  109. package/dist/cjs/components/shell.d.ts.map +1 -1
  110. package/dist/cjs/components/shell.js +1 -1
  111. package/dist/cjs/components/shell.js.map +4 -4
  112. package/dist/cjs/components/sidebar.d.ts.map +1 -1
  113. package/dist/cjs/components/sidebar.js +1 -1
  114. package/dist/cjs/components/sidebar.js.map +4 -4
  115. package/dist/cjs/components/slider.d.ts.map +1 -1
  116. package/dist/cjs/components/slider.js +1 -1
  117. package/dist/cjs/components/slider.js.map +3 -3
  118. package/dist/cjs/components/spinner.d.ts.map +1 -1
  119. package/dist/cjs/components/spinner.js +1 -1
  120. package/dist/cjs/components/spinner.js.map +3 -3
  121. package/dist/cjs/components/table.d.ts.map +1 -1
  122. package/dist/cjs/components/table.js +1 -1
  123. package/dist/cjs/components/table.js.map +4 -4
  124. package/dist/cjs/components/tabs.d.ts.map +1 -1
  125. package/dist/cjs/components/tabs.js +1 -1
  126. package/dist/cjs/components/tabs.js.map +2 -2
  127. package/dist/cjs/components/text-area.js +1 -1
  128. package/dist/cjs/components/text-area.js.map +2 -2
  129. package/dist/cjs/components/text-field.js +2 -2
  130. package/dist/cjs/components/text-field.js.map +2 -2
  131. package/dist/cjs/components/toggle.d.ts +3 -2
  132. package/dist/cjs/components/toggle.d.ts.map +1 -1
  133. package/dist/cjs/components/toggle.js +1 -9
  134. package/dist/cjs/components/toggle.js.map +4 -4
  135. package/dist/cjs/components/toolbar.d.ts +80 -8
  136. package/dist/cjs/components/toolbar.d.ts.map +1 -1
  137. package/dist/cjs/components/toolbar.js +1 -1
  138. package/dist/cjs/components/toolbar.js.map +4 -4
  139. package/dist/cjs/components/virtual-menu.d.ts +3 -5
  140. package/dist/cjs/components/virtual-menu.d.ts.map +1 -1
  141. package/dist/cjs/components/virtual-menu.js +1 -1
  142. package/dist/cjs/components/virtual-menu.js.map +3 -3
  143. package/dist/cjs/helpers/extract-margin-props.d.ts +7 -7
  144. package/dist/cjs/hooks/use-scroll-edges.d.ts +4 -2
  145. package/dist/cjs/hooks/use-scroll-edges.d.ts.map +1 -1
  146. package/dist/cjs/hooks/use-scroll-edges.js +1 -1
  147. package/dist/cjs/hooks/use-scroll-edges.js.map +3 -3
  148. package/dist/cjs/index.js +5 -5
  149. package/dist/cjs/index.js.map +4 -4
  150. package/dist/cjs/props/index.js +1 -1
  151. package/dist/cjs/props/index.js.map +2 -2
  152. package/dist/esm/chunk-3VTS4C63.js +2 -0
  153. package/dist/esm/chunk-3VTS4C63.js.map +7 -0
  154. package/dist/esm/chunk-3WE4E2WQ.js +2 -0
  155. package/dist/esm/chunk-3WE4E2WQ.js.map +7 -0
  156. package/dist/esm/chunk-3XUY5WFA.js +2 -0
  157. package/dist/esm/chunk-3XUY5WFA.js.map +7 -0
  158. package/dist/esm/chunk-3XZOE2IQ.js +2 -0
  159. package/dist/esm/chunk-3XZOE2IQ.js.map +7 -0
  160. package/dist/esm/chunk-432YLNB3.js +2 -0
  161. package/dist/esm/chunk-432YLNB3.js.map +7 -0
  162. package/dist/esm/chunk-4QKZYCCH.js +2 -0
  163. package/dist/esm/chunk-4QKZYCCH.js.map +7 -0
  164. package/dist/esm/chunk-4R5EMVB3.js +2 -0
  165. package/dist/esm/chunk-4R5EMVB3.js.map +7 -0
  166. package/dist/esm/chunk-4ZOVV3TY.js +2 -0
  167. package/dist/esm/chunk-4ZOVV3TY.js.map +7 -0
  168. package/dist/esm/{chunk-IX5HIHVI.js → chunk-62ZGP4ET.js} +2 -2
  169. package/dist/esm/{chunk-IX5HIHVI.js.map → chunk-62ZGP4ET.js.map} +3 -3
  170. package/dist/esm/chunk-BGAJ2MDF.js +2 -0
  171. package/dist/esm/chunk-BGAJ2MDF.js.map +7 -0
  172. package/dist/esm/chunk-CHPT42BY.js +2 -0
  173. package/dist/esm/{chunk-Y3JYEEFB.js.map → chunk-CHPT42BY.js.map} +2 -2
  174. package/dist/esm/{chunk-KS4U4VPH.js → chunk-CMHUK7OG.js} +2 -2
  175. package/dist/esm/{chunk-KS4U4VPH.js.map → chunk-CMHUK7OG.js.map} +2 -2
  176. package/dist/esm/chunk-CN6F4REJ.js +2 -0
  177. package/dist/esm/chunk-CN6F4REJ.js.map +7 -0
  178. package/dist/esm/chunk-DUTZUWZP.js +2 -0
  179. package/dist/esm/chunk-DUTZUWZP.js.map +7 -0
  180. package/dist/esm/chunk-FDJV5RXX.js +2 -0
  181. package/dist/esm/chunk-FDJV5RXX.js.map +7 -0
  182. package/dist/esm/chunk-G2JD52O5.js +2 -0
  183. package/dist/esm/{chunk-23KT3D2Z.js.map → chunk-G2JD52O5.js.map} +3 -3
  184. package/dist/esm/{chunk-6DDOR73D.js → chunk-G4ETY2NP.js} +2 -2
  185. package/dist/esm/chunk-GPOCLDBR.js +2 -0
  186. package/dist/esm/chunk-GPOCLDBR.js.map +7 -0
  187. package/dist/esm/chunk-GYP66ZK2.js +2 -0
  188. package/dist/esm/chunk-GYP66ZK2.js.map +7 -0
  189. package/dist/esm/chunk-H5BYPX6V.js +2 -0
  190. package/dist/esm/chunk-H5BYPX6V.js.map +7 -0
  191. package/dist/esm/chunk-H5G7UECV.js +2 -0
  192. package/dist/esm/chunk-H5G7UECV.js.map +7 -0
  193. package/dist/esm/chunk-I4FLQELQ.js +2 -0
  194. package/dist/esm/chunk-I4FLQELQ.js.map +7 -0
  195. package/dist/esm/chunk-JYQGCXXI.js +2 -0
  196. package/dist/esm/chunk-JYQGCXXI.js.map +7 -0
  197. package/dist/esm/chunk-KA5UE2VN.js +2 -0
  198. package/dist/esm/chunk-KA5UE2VN.js.map +7 -0
  199. package/dist/esm/{chunk-QGCXTULQ.js → chunk-KEGCX5VM.js} +2 -2
  200. package/dist/esm/chunk-KVHKPUZ2.js +2 -0
  201. package/dist/esm/chunk-KVHKPUZ2.js.map +7 -0
  202. package/dist/esm/{chunk-FFG32ERA.js → chunk-N3WBEQWL.js} +3 -3
  203. package/dist/esm/chunk-N3WBEQWL.js.map +7 -0
  204. package/dist/esm/{chunk-HKPXDQ2B.js → chunk-NC3CJUE3.js} +2 -2
  205. package/dist/esm/chunk-P2MV6HLA.js +2 -0
  206. package/dist/esm/{chunk-7SS4UUJH.js.map → chunk-P2MV6HLA.js.map} +3 -3
  207. package/dist/esm/chunk-PALE5UWK.js +2 -0
  208. package/dist/esm/{chunk-DSPYHO3L.js.map → chunk-PALE5UWK.js.map} +2 -2
  209. package/dist/esm/chunk-PDMCLVYT.js +2 -0
  210. package/dist/esm/chunk-PDMCLVYT.js.map +7 -0
  211. package/dist/esm/chunk-PM6QY3JO.js +2 -0
  212. package/dist/esm/{chunk-ZEX2DECM.js.map → chunk-PM6QY3JO.js.map} +3 -3
  213. package/dist/esm/chunk-RKZVXVBN.js +2 -0
  214. package/dist/esm/chunk-RKZVXVBN.js.map +7 -0
  215. package/dist/esm/chunk-TXQZ5HLV.js +2 -0
  216. package/dist/esm/chunk-TXQZ5HLV.js.map +7 -0
  217. package/dist/esm/chunk-UKASIY6M.js +2 -0
  218. package/dist/esm/chunk-UKASIY6M.js.map +7 -0
  219. package/dist/esm/{chunk-OJQNLROL.js → chunk-UY6WJUNA.js} +2 -2
  220. package/dist/esm/chunk-V5O3TF57.js +2 -0
  221. package/dist/esm/{chunk-3KQE2PSJ.js.map → chunk-V5O3TF57.js.map} +3 -3
  222. package/dist/esm/chunk-VUNCI6A6.js +2 -0
  223. package/dist/esm/chunk-VUNCI6A6.js.map +7 -0
  224. package/dist/esm/{chunk-JBHRV364.js → chunk-VUPIJNG2.js} +2 -2
  225. package/dist/esm/chunk-W6BN5QLH.js +2 -0
  226. package/dist/esm/{chunk-ZNDCZM5A.js.map → chunk-W6BN5QLH.js.map} +2 -2
  227. package/dist/esm/chunk-WG5ORTIW.js +2 -0
  228. package/dist/esm/chunk-WG5ORTIW.js.map +7 -0
  229. package/dist/esm/chunk-WMVR2XBR.js +2 -0
  230. package/dist/esm/{chunk-XKSU3NLG.js.map → chunk-WMVR2XBR.js.map} +2 -2
  231. package/dist/esm/{chunk-NNZTSXKH.js → chunk-WX7SX5BN.js} +2 -2
  232. package/dist/esm/chunk-XOACTIBL.js +2 -0
  233. package/dist/esm/chunk-XOACTIBL.js.map +7 -0
  234. package/dist/esm/components/_internal/base-button.d.ts +11 -1
  235. package/dist/esm/components/_internal/base-button.d.ts.map +1 -1
  236. package/dist/esm/components/_internal/base-button.js +1 -1
  237. package/dist/esm/components/_internal/menu-context.d.ts +2 -0
  238. package/dist/esm/components/_internal/menu-context.d.ts.map +1 -1
  239. package/dist/esm/components/_internal/menu-context.js +1 -1
  240. package/dist/esm/components/_internal/pane-chrome.d.ts +17 -2
  241. package/dist/esm/components/_internal/pane-chrome.d.ts.map +1 -1
  242. package/dist/esm/components/_internal/pane-chrome.js +1 -1
  243. package/dist/esm/components/_internal/shell-bottom.js +1 -1
  244. package/dist/esm/components/_internal/shell-inspector.js +1 -1
  245. package/dist/esm/components/_internal/shell-sidebar.js +1 -1
  246. package/dist/esm/components/accordion.d.ts +2 -2
  247. package/dist/esm/components/accordion.d.ts.map +1 -1
  248. package/dist/esm/components/accordion.js +1 -1
  249. package/dist/esm/components/alert-dialog.d.ts.map +1 -1
  250. package/dist/esm/components/alert-dialog.js +1 -1
  251. package/dist/esm/components/avatar.d.ts +1 -1
  252. package/dist/esm/components/avatar.d.ts.map +1 -1
  253. package/dist/esm/components/avatar.js +1 -1
  254. package/dist/esm/components/avatar.props.d.ts +8 -0
  255. package/dist/esm/components/avatar.props.d.ts.map +1 -1
  256. package/dist/esm/components/avatar.props.js +1 -1
  257. package/dist/esm/components/blockquote.d.ts +1 -1
  258. package/dist/esm/components/blockquote.d.ts.map +1 -1
  259. package/dist/esm/components/blockquote.js +1 -1
  260. package/dist/esm/components/button.js +1 -1
  261. package/dist/esm/components/chatbar.d.ts.map +1 -1
  262. package/dist/esm/components/chatbar.js +1 -1
  263. package/dist/esm/components/checkbox-group.d.ts.map +1 -1
  264. package/dist/esm/components/checkbox-group.js +1 -1
  265. package/dist/esm/components/checkbox-group.primitive.d.ts +12 -5
  266. package/dist/esm/components/checkbox-group.primitive.d.ts.map +1 -1
  267. package/dist/esm/components/checkbox-group.primitive.js +1 -1
  268. package/dist/esm/components/checkbox.js +1 -1
  269. package/dist/esm/components/chip.d.ts.map +1 -1
  270. package/dist/esm/components/chip.js +1 -1
  271. package/dist/esm/components/code.d.ts.map +1 -1
  272. package/dist/esm/components/code.js +1 -1
  273. package/dist/esm/components/combobox.js +1 -1
  274. package/dist/esm/components/context-menu.d.ts.map +1 -1
  275. package/dist/esm/components/context-menu.js +1 -1
  276. package/dist/esm/components/dialog.d.ts +1 -1
  277. package/dist/esm/components/dialog.d.ts.map +1 -1
  278. package/dist/esm/components/dialog.js +1 -1
  279. package/dist/esm/components/dropdown-menu.d.ts.map +1 -1
  280. package/dist/esm/components/dropdown-menu.js +1 -1
  281. package/dist/esm/components/icons.d.ts +3 -1
  282. package/dist/esm/components/icons.d.ts.map +1 -1
  283. package/dist/esm/components/icons.js +1 -1
  284. package/dist/esm/components/index.d.ts +1 -1
  285. package/dist/esm/components/index.d.ts.map +1 -1
  286. package/dist/esm/components/index.js +1 -1
  287. package/dist/esm/components/message-scroller.d.ts.map +1 -1
  288. package/dist/esm/components/message-scroller.js +1 -1
  289. package/dist/esm/components/navbar.d.ts.map +1 -1
  290. package/dist/esm/components/navbar.js +1 -1
  291. package/dist/esm/components/notice.d.ts +4 -1
  292. package/dist/esm/components/notice.d.ts.map +1 -1
  293. package/dist/esm/components/notice.js +1 -1
  294. package/dist/esm/components/progress.d.ts.map +1 -1
  295. package/dist/esm/components/progress.js +1 -1
  296. package/dist/esm/components/schemas/button.schema.d.ts +2 -2
  297. package/dist/esm/components/schemas/toggle.schema.d.ts +1 -1
  298. package/dist/esm/components/scroll-area.d.ts +3 -1
  299. package/dist/esm/components/scroll-area.d.ts.map +1 -1
  300. package/dist/esm/components/scroll-area.js +1 -1
  301. package/dist/esm/components/segmented-control.d.ts +3 -1
  302. package/dist/esm/components/segmented-control.d.ts.map +1 -1
  303. package/dist/esm/components/segmented-control.js +1 -1
  304. package/dist/esm/components/select.d.ts.map +1 -1
  305. package/dist/esm/components/select.js +1 -1
  306. package/dist/esm/components/separator.d.ts.map +1 -1
  307. package/dist/esm/components/separator.js +1 -1
  308. package/dist/esm/components/sheet.d.ts +1 -0
  309. package/dist/esm/components/sheet.d.ts.map +1 -1
  310. package/dist/esm/components/sheet.js +1 -1
  311. package/dist/esm/components/shell.d.ts +12 -1
  312. package/dist/esm/components/shell.d.ts.map +1 -1
  313. package/dist/esm/components/shell.js +1 -1
  314. package/dist/esm/components/sidebar.d.ts.map +1 -1
  315. package/dist/esm/components/sidebar.js +1 -1
  316. package/dist/esm/components/slider.d.ts.map +1 -1
  317. package/dist/esm/components/slider.js +1 -1
  318. package/dist/esm/components/spinner.d.ts.map +1 -1
  319. package/dist/esm/components/spinner.js +1 -1
  320. package/dist/esm/components/table.d.ts.map +1 -1
  321. package/dist/esm/components/table.js +1 -1
  322. package/dist/esm/components/tabs.d.ts.map +1 -1
  323. package/dist/esm/components/tabs.js +1 -1
  324. package/dist/esm/components/text-area.js +1 -1
  325. package/dist/esm/components/text-field.js +1 -1
  326. package/dist/esm/components/toggle.d.ts +3 -2
  327. package/dist/esm/components/toggle.d.ts.map +1 -1
  328. package/dist/esm/components/toggle.js +1 -1
  329. package/dist/esm/components/toolbar.d.ts +80 -8
  330. package/dist/esm/components/toolbar.d.ts.map +1 -1
  331. package/dist/esm/components/toolbar.js +1 -1
  332. package/dist/esm/components/virtual-menu.d.ts +3 -5
  333. package/dist/esm/components/virtual-menu.d.ts.map +1 -1
  334. package/dist/esm/components/virtual-menu.js +1 -1
  335. package/dist/esm/helpers/extract-margin-props.d.ts +7 -7
  336. package/dist/esm/hooks/index.js +1 -1
  337. package/dist/esm/hooks/use-scroll-edges.d.ts +4 -2
  338. package/dist/esm/hooks/use-scroll-edges.d.ts.map +1 -1
  339. package/dist/esm/hooks/use-scroll-edges.js +1 -1
  340. package/dist/esm/index.js +1 -1
  341. package/dist/esm/props/index.js +1 -1
  342. package/package.json +1 -1
  343. package/src/components/_internal/base-button.tsx +51 -12
  344. package/src/components/_internal/base-sidebar-menu.css +8 -0
  345. package/src/components/_internal/menu-context.tsx +11 -0
  346. package/src/components/_internal/pane-chrome.tsx +45 -8
  347. package/src/components/accordion.css +35 -3
  348. package/src/components/accordion.tsx +12 -16
  349. package/src/components/alert-dialog.tsx +59 -161
  350. package/src/components/avatar.props.tsx +6 -0
  351. package/src/components/avatar.tsx +57 -71
  352. package/src/components/blockquote.tsx +8 -9
  353. package/src/components/chatbar.tsx +27 -20
  354. package/src/components/checkbox-group.primitive.tsx +40 -51
  355. package/src/components/checkbox-group.tsx +1 -9
  356. package/src/components/chip.css +18 -20
  357. package/src/components/chip.tsx +3 -4
  358. package/src/components/code.tsx +3 -2
  359. package/src/components/context-menu.tsx +23 -5
  360. package/src/components/dialog.tsx +59 -160
  361. package/src/components/dropdown-menu.tsx +8 -5
  362. package/src/components/icons.tsx +11 -1
  363. package/src/components/index.tsx +7 -0
  364. package/src/components/message-scroller.tsx +48 -26
  365. package/src/components/navbar.tsx +34 -69
  366. package/src/components/notice.tsx +6 -3
  367. package/src/components/progress.tsx +6 -3
  368. package/src/components/scroll-area.css +28 -2
  369. package/src/components/scroll-area.tsx +49 -3
  370. package/src/components/segmented-control.css +8 -130
  371. package/src/components/segmented-control.tsx +36 -5
  372. package/src/components/select.tsx +23 -3
  373. package/src/components/separator.tsx +13 -1
  374. package/src/components/sheet.css +7 -6
  375. package/src/components/sheet.tsx +76 -143
  376. package/src/components/shell.css +14 -0
  377. package/src/components/shell.tsx +29 -8
  378. package/src/components/sidebar.tsx +27 -16
  379. package/src/components/slider.tsx +51 -32
  380. package/src/components/spinner.tsx +10 -2
  381. package/src/components/table.tsx +18 -5
  382. package/src/components/tabs.css +34 -0
  383. package/src/components/tabs.tsx +0 -2
  384. package/src/components/text-area.css +2 -1
  385. package/src/components/text-area.tsx +1 -1
  386. package/src/components/text-field.tsx +1 -1
  387. package/src/components/toggle.tsx +21 -39
  388. package/src/components/toolbar.css +34 -0
  389. package/src/components/toolbar.tsx +432 -23
  390. package/src/components/virtual-menu.tsx +110 -37
  391. package/src/hooks/use-scroll-edges.ts +11 -2
  392. package/src/styles/utilities/truncate.css +10 -0
  393. package/styles.css +195 -185
  394. package/utilities.css +5 -0
  395. package/dist/esm/chunk-23KT3D2Z.js +0 -2
  396. package/dist/esm/chunk-3JA7SJDT.js +0 -2
  397. package/dist/esm/chunk-3JA7SJDT.js.map +0 -7
  398. package/dist/esm/chunk-3KQE2PSJ.js +0 -2
  399. package/dist/esm/chunk-5BWLY27A.js +0 -2
  400. package/dist/esm/chunk-5BWLY27A.js.map +0 -7
  401. package/dist/esm/chunk-6CK7UTNH.js +0 -2
  402. package/dist/esm/chunk-6CK7UTNH.js.map +0 -7
  403. package/dist/esm/chunk-6RK26HIY.js +0 -2
  404. package/dist/esm/chunk-6RK26HIY.js.map +0 -7
  405. package/dist/esm/chunk-7ESWH773.js +0 -2
  406. package/dist/esm/chunk-7ESWH773.js.map +0 -7
  407. package/dist/esm/chunk-7SS4UUJH.js +0 -2
  408. package/dist/esm/chunk-AB3QCCUM.js +0 -2
  409. package/dist/esm/chunk-AB3QCCUM.js.map +0 -7
  410. package/dist/esm/chunk-BEP4AH5V.js +0 -2
  411. package/dist/esm/chunk-BEP4AH5V.js.map +0 -7
  412. package/dist/esm/chunk-BOL3VVSN.js +0 -2
  413. package/dist/esm/chunk-BOL3VVSN.js.map +0 -7
  414. package/dist/esm/chunk-DBROSD2J.js +0 -2
  415. package/dist/esm/chunk-DBROSD2J.js.map +0 -7
  416. package/dist/esm/chunk-DSPYHO3L.js +0 -2
  417. package/dist/esm/chunk-E2D2VWUI.js +0 -2
  418. package/dist/esm/chunk-E2D2VWUI.js.map +0 -7
  419. package/dist/esm/chunk-EMNSA65L.js +0 -2
  420. package/dist/esm/chunk-EMNSA65L.js.map +0 -7
  421. package/dist/esm/chunk-FFG32ERA.js.map +0 -7
  422. package/dist/esm/chunk-FHPHEIYJ.js +0 -2
  423. package/dist/esm/chunk-FHPHEIYJ.js.map +0 -7
  424. package/dist/esm/chunk-FJFBM7HW.js +0 -2
  425. package/dist/esm/chunk-FJFBM7HW.js.map +0 -7
  426. package/dist/esm/chunk-FYT7TYGS.js +0 -2
  427. package/dist/esm/chunk-FYT7TYGS.js.map +0 -7
  428. package/dist/esm/chunk-GLV7VGBH.js +0 -2
  429. package/dist/esm/chunk-GLV7VGBH.js.map +0 -7
  430. package/dist/esm/chunk-HIKMKGPT.js +0 -2
  431. package/dist/esm/chunk-HIKMKGPT.js.map +0 -7
  432. package/dist/esm/chunk-L2R62BOB.js +0 -2
  433. package/dist/esm/chunk-L2R62BOB.js.map +0 -7
  434. package/dist/esm/chunk-LHIS3UKQ.js +0 -2
  435. package/dist/esm/chunk-LHIS3UKQ.js.map +0 -7
  436. package/dist/esm/chunk-NQDMTOGB.js +0 -2
  437. package/dist/esm/chunk-NQDMTOGB.js.map +0 -7
  438. package/dist/esm/chunk-Q6MFPATL.js +0 -2
  439. package/dist/esm/chunk-Q6MFPATL.js.map +0 -7
  440. package/dist/esm/chunk-QOHJIF25.js +0 -2
  441. package/dist/esm/chunk-QOHJIF25.js.map +0 -7
  442. package/dist/esm/chunk-R4XJNQX5.js +0 -2
  443. package/dist/esm/chunk-R4XJNQX5.js.map +0 -7
  444. package/dist/esm/chunk-UE3HATOA.js +0 -2
  445. package/dist/esm/chunk-UE3HATOA.js.map +0 -7
  446. package/dist/esm/chunk-V32EP3S7.js +0 -2
  447. package/dist/esm/chunk-V32EP3S7.js.map +0 -7
  448. package/dist/esm/chunk-XKSU3NLG.js +0 -2
  449. package/dist/esm/chunk-XRCMPBAY.js +0 -2
  450. package/dist/esm/chunk-XRCMPBAY.js.map +0 -7
  451. package/dist/esm/chunk-Y3JYEEFB.js +0 -2
  452. package/dist/esm/chunk-YZM54IJE.js +0 -2
  453. package/dist/esm/chunk-YZM54IJE.js.map +0 -7
  454. package/dist/esm/chunk-ZEX2DECM.js +0 -2
  455. package/dist/esm/chunk-ZJI2IK7C.js +0 -2
  456. package/dist/esm/chunk-ZJI2IK7C.js.map +0 -7
  457. package/dist/esm/chunk-ZNDCZM5A.js +0 -2
  458. /package/dist/esm/{chunk-6DDOR73D.js.map → chunk-G4ETY2NP.js.map} +0 -0
  459. /package/dist/esm/{chunk-QGCXTULQ.js.map → chunk-KEGCX5VM.js.map} +0 -0
  460. /package/dist/esm/{chunk-HKPXDQ2B.js.map → chunk-NC3CJUE3.js.map} +0 -0
  461. /package/dist/esm/{chunk-OJQNLROL.js.map → chunk-UY6WJUNA.js.map} +0 -0
  462. /package/dist/esm/{chunk-JBHRV364.js.map → chunk-VUPIJNG2.js.map} +0 -0
  463. /package/dist/esm/{chunk-NNZTSXKH.js.map → chunk-WX7SX5BN.js.map} +0 -0
@@ -97,6 +97,23 @@ function wrapTextNodes(node: React.ReactNode): React.ReactNode {
97
97
  return node;
98
98
  }
99
99
 
100
+ // Arrow Up and Down move between the visible buttons of the same sidebar, as a
101
+ // convenience on top of Tab. Sub-menu triggers take part, so the one-item Accordion
102
+ // behind each sub-menu doesn't keep focus on its own trigger.
103
+ function focusAdjacentSidebarButton(event: React.KeyboardEvent<HTMLElement>) {
104
+ if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;
105
+ const scope = event.currentTarget.closest('.kui-SidebarContent, .kui-SidebarSearchPopover');
106
+ const buttons = scope
107
+ ? Array.from(scope.querySelectorAll<HTMLElement>('.kui-SidebarMenuButton')).filter((el) => el.offsetParent !== null)
108
+ : [];
109
+ const index = buttons.indexOf(event.currentTarget);
110
+ const next = buttons[index + (event.key === 'ArrowDown' ? 1 : -1)];
111
+ if (index !== -1 && next) {
112
+ event.preventDefault();
113
+ next.focus();
114
+ }
115
+ }
116
+
100
117
  const SidebarMenuButton = React.forwardRef<HTMLButtonElement, SidebarMenuButtonProps>(
101
118
  ({ asChild = false, isActive = false, shortcut, badge, className, children, onKeyDown, ...props }, forwardedRef) => {
102
119
  const visual = useSidebarVisual();
@@ -105,22 +122,10 @@ const SidebarMenuButton = React.forwardRef<HTMLButtonElement, SidebarMenuButtonP
105
122
 
106
123
  const Comp = asChild ? Slot : 'button';
107
124
 
108
- // Enter and Space are left to the native button or link. Arrow keys move between
109
- // the visible buttons of the same sidebar, as a convenience on top of Tab.
125
+ // Enter and Space are left to the native button or link.
110
126
  const handleKeyDown = React.useCallback(
111
127
  (event: React.KeyboardEvent<HTMLButtonElement>) => {
112
- if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
113
- const scope = event.currentTarget.closest('.kui-SidebarContent, .kui-SidebarSearchPopover');
114
- const buttons = scope
115
- ? Array.from(scope.querySelectorAll<HTMLElement>('.kui-SidebarMenuButton')).filter((el) => el.offsetParent !== null)
116
- : [];
117
- const index = buttons.indexOf(event.currentTarget);
118
- const next = buttons[index + (event.key === 'ArrowDown' ? 1 : -1)];
119
- if (index !== -1 && next) {
120
- event.preventDefault();
121
- next.focus();
122
- }
123
- }
128
+ focusAdjacentSidebarButton(event);
124
129
  onKeyDown?.(event);
125
130
  },
126
131
  [onKeyDown],
@@ -262,7 +267,7 @@ interface SidebarMenuSubTriggerProps extends React.ComponentPropsWithoutRef<type
262
267
  }
263
268
 
264
269
  const SidebarMenuSubTrigger = React.forwardRef<React.ElementRef<typeof Accordion.Trigger>, SidebarMenuSubTriggerProps>(
265
- ({ asChild = false, className, children, ...props }, forwardedRef) => {
270
+ ({ asChild = false, className, children, onKeyDown, ...props }, forwardedRef) => {
266
271
  const mode = React.useContext(SidebarSubMenuModeContext);
267
272
 
268
273
  if (mode === 'dropdown') {
@@ -270,6 +275,7 @@ const SidebarMenuSubTrigger = React.forwardRef<React.ElementRef<typeof Accordion
270
275
  <DropdownMenu.Trigger>
271
276
  <button
272
277
  {...(props as any)}
278
+ onKeyDown={onKeyDown}
273
279
  ref={forwardedRef as any}
274
280
  type="button"
275
281
  aria-haspopup="menu"
@@ -286,6 +292,11 @@ const SidebarMenuSubTrigger = React.forwardRef<React.ElementRef<typeof Accordion
286
292
  <div>
287
293
  <Accordion.Trigger
288
294
  {...props}
295
+ onKeyDown={(event) => {
296
+ // Runs before the Accordion's own arrow handling, which would keep focus here.
297
+ focusAdjacentSidebarButton(event);
298
+ onKeyDown?.(event);
299
+ }}
289
300
  ref={forwardedRef}
290
301
  asChild={asChild}
291
302
  className={classNames('kui-reset', 'kui-BaseMenuItem', 'kui-SidebarMenuButton', 'kui-SidebarMenuSubTrigger', className)}
@@ -357,7 +368,7 @@ const SidebarMenuSubContent = React.forwardRef<React.ElementRef<typeof Accordion
357
368
 
358
369
  return (
359
370
  <Accordion.Content {...props} ref={forwardedRef} className={classNames('kui-SidebarMenuSubContent', className)}>
360
- <div className="kui-SidebarMenuSubList">{children}</div>
371
+ <ul className="kui-SidebarMenuSubList">{children}</ul>
361
372
  </Accordion.Content>
362
373
  );
363
374
  });
@@ -26,18 +26,34 @@ const Slider = React.forwardRef<SliderElement, SliderProps>((ownProps, forwarded
26
26
  props,
27
27
  sliderPropDefs,
28
28
  );
29
- const { ticks, showTickLabels, snapToTicks, unit } = props;
30
-
31
- const min = sliderProps.min ?? 0;
32
- const max = sliderProps.max ?? 100;
33
-
34
- // Current value for accessibility
35
- const currentValue = sliderProps.value ?? sliderProps.defaultValue ?? [min];
36
- const isRange = Array.isArray(currentValue) && currentValue.length > 1;
29
+ const {
30
+ ticks,
31
+ unit,
32
+ value: valueProp,
33
+ defaultValue,
34
+ onValueChange,
35
+ onValueCommit,
36
+ 'aria-label': ariaLabel,
37
+ 'aria-labelledby': ariaLabelledBy,
38
+ ...rootProps
39
+ } = sliderProps;
40
+ const { showTickLabels, snapToTicks } = props;
41
+
42
+ const min = rootProps.min ?? 0;
43
+ const max = rootProps.max ?? 100;
44
+
45
+ // The slider keeps its own copy of the value when uncontrolled, so the handles, their
46
+ // labels and a tick press all read the current value rather than the first one.
47
+ const [uncontrolledValue, setUncontrolledValue] = React.useState<number[]>(
48
+ () => defaultValue ?? [min],
49
+ );
50
+ const isControlled = valueProp !== undefined;
51
+ const currentValue = isControlled ? valueProp : uncontrolledValue;
52
+ const tickIdPrefix = React.useId();
37
53
 
38
54
  // For snapping to ticks, we need to handle this differently
39
55
  // Radix slider doesn't support arbitrary step values, so we'll handle snapping in the onValueChange
40
- const step = sliderProps.step;
56
+ const step = rootProps.step;
41
57
 
42
58
  // Optimized snap-to-ticks with memoized sorted ticks
43
59
  const sortedTicks = React.useMemo(
@@ -108,7 +124,6 @@ const Slider = React.forwardRef<SliderElement, SliderProps>((ownProps, forwarded
108
124
  const announceRef = React.useRef<HTMLDivElement>(null);
109
125
  const announceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);
110
126
 
111
- const { onValueChange } = sliderProps;
112
127
  // Handle value changes with snapping
113
128
  const handleValueChange = React.useCallback(
114
129
  (newValue: number[]) => {
@@ -131,9 +146,10 @@ const Slider = React.forwardRef<SliderElement, SliderProps>((ownProps, forwarded
131
146
  }, 1000);
132
147
  }
133
148
 
149
+ if (!isControlled) setUncontrolledValue(finalValue);
134
150
  onValueChange?.(finalValue);
135
151
  },
136
- [snapToTicks, ticks, snapToNearestTick, formatValueText, onValueChange],
152
+ [snapToTicks, ticks, snapToNearestTick, formatValueText, onValueChange, isControlled],
137
153
  );
138
154
 
139
155
  // Cleanup timeout on unmount
@@ -159,35 +175,30 @@ const Slider = React.forwardRef<SliderElement, SliderProps>((ownProps, forwarded
159
175
  data-accent-color={color}
160
176
  data-radius={radius}
161
177
  ref={forwardedRef}
162
- {...sliderProps}
178
+ {...rootProps}
179
+ value={currentValue}
163
180
  step={step}
164
181
  onValueChange={handleValueChange}
182
+ onValueCommit={onValueCommit}
165
183
  asChild={false}
166
184
  className={classNames('kui-SliderRoot', className)}
167
- // Essential ARIA attributes for WCAG 2.2 AA compliance
168
- aria-valuemin={min}
169
- aria-valuemax={max}
170
- aria-valuenow={Array.isArray(currentValue) ? currentValue[0] : (currentValue as number)}
171
- aria-valuetext={formatValueText(currentValue as number[])}
172
- aria-label={props['aria-label'] || `${isRange ? 'Range' : 'Value'} slider`}
173
185
  >
174
186
  <SliderPrimitive.Track className="kui-SliderTrack">
175
187
  <SliderPrimitive.Range
176
188
  className="kui-SliderRange"
177
- data-inverted={sliderProps.inverted ? '' : undefined}
189
+ data-inverted={rootProps.inverted ? '' : undefined}
178
190
  />
179
191
  </SliderPrimitive.Track>
180
- {(sliderProps.value ?? sliderProps.defaultValue ?? []).map((value, index) => (
192
+ {currentValue.map((value, index) => (
181
193
  <SliderPrimitive.Thumb
182
194
  key={index}
183
195
  className="kui-SliderThumb"
184
196
  {...(tabIndex !== undefined ? { tabIndex } : undefined)}
185
- aria-label={
186
- isRange
187
- ? `${index === 0 ? 'Minimum' : index === 1 ? 'Maximum' : `Thumb ${index + 1}`} value: ${unit ? `${value} ${unit}` : value}`
188
- : `Slider value: ${unit ? `${value} ${unit}` : value}`
189
- }
190
- aria-valuetext={unit ? `${value} ${unit}` : value.toString()}
197
+ // The caller's name goes to every handle. Without one, Radix names the two
198
+ // handles of a range "Minimum" and "Maximum".
199
+ aria-label={ariaLabel}
200
+ aria-labelledby={ariaLabelledBy}
201
+ aria-valuetext={unit ? `${value} ${unit}` : undefined}
191
202
  />
192
203
  ))}
193
204
  </SliderPrimitive.Root>
@@ -201,15 +212,23 @@ const Slider = React.forwardRef<SliderElement, SliderProps>((ownProps, forwarded
201
212
  // Only `left` varies per tick; the centring transform lives in `.kui-SliderTick`.
202
213
  style={{ left: `${tick.percentage}%` }}
203
214
  onClick={() => {
204
- const currentValues = sliderProps.value ?? sliderProps.defaultValue ?? [min];
205
- const newValue = Array.isArray(currentValues)
206
- ? currentValues.map(() => tick.value)
207
- : [tick.value];
215
+ // Move only the handle nearest the tick. When handles share a value, a
216
+ // tick above it moves the last of them and a tick below moves the first.
217
+ let nearest = 0;
218
+ currentValue.forEach((v, i) => {
219
+ const distance = Math.abs(v - tick.value);
220
+ const best = Math.abs(currentValue[nearest] - tick.value);
221
+ if (distance < best || (distance === best && tick.value > v)) nearest = i;
222
+ });
223
+ const newValue = currentValue
224
+ .map((v, i) => (i === nearest ? tick.value : v))
225
+ .sort((x, y) => x - y);
208
226
 
209
227
  handleValueChange(newValue);
228
+ onValueCommit?.(newValue);
210
229
  }}
211
230
  aria-label={`Set to ${tick.label || (unit ? `${tick.value} ${unit}` : tick.value)}`}
212
- aria-describedby={tick.label ? undefined : `tick-${tick.index}-value`}
231
+ aria-describedby={tick.label ? undefined : `${tickIdPrefix}-tick-${tick.index}`}
213
232
  type="button"
214
233
  >
215
234
  <div className="kui-SliderTickMark" />
@@ -217,7 +236,7 @@ const Slider = React.forwardRef<SliderElement, SliderProps>((ownProps, forwarded
217
236
  <div className="kui-SliderTickLabel">{tick.label}</div>
218
237
  )}
219
238
  {!tick.label && (
220
- <span id={`tick-${tick.index}-value`} className="sr-only">
239
+ <span id={`${tickIdPrefix}-tick-${tick.index}`} className="kui-sr-only">
221
240
  {unit ? `${tick.value} ${unit}` : tick.value}
222
241
  </span>
223
242
  )}
@@ -21,8 +21,16 @@ const Spinner = React.forwardRef<SpinnerElement, SpinnerProps>((props, forwarded
21
21
 
22
22
  if (!loading) return children;
23
23
 
24
+ // Decorative unless named: a named spinner is a status message, an unnamed one is hidden.
25
+ const named =
26
+ spinnerProps['aria-label'] !== undefined || spinnerProps['aria-labelledby'] !== undefined;
27
+
24
28
  const spinner = (
25
- <span {...spinnerProps} ref={forwardedRef} className={classNames('kui-Spinner', className)}>
29
+ <span
30
+ role={named ? 'status' : undefined}
31
+ aria-hidden={named ? undefined : true}
32
+ {...spinnerProps}
33
+ ref={forwardedRef} className={classNames('kui-Spinner', className)}>
26
34
  <span className="kui-SpinnerWheel">
27
35
  <span className="kui-SpinnerLeaf" />
28
36
  <span className="kui-SpinnerLeaf" />
@@ -40,7 +48,7 @@ const Spinner = React.forwardRef<SpinnerElement, SpinnerProps>((props, forwarded
40
48
 
41
49
  return (
42
50
  <Flex asChild position="relative" align="center" justify="center">
43
- <span>
51
+ <span aria-busy="true">
44
52
  {/**
45
53
  * `display: contents` removes the content from the accessibility tree in some browsers,
46
54
  * so we force remove it with `aria-hidden`
@@ -18,10 +18,16 @@ interface TableRootProps
18
18
  const TableRoot = React.forwardRef<TableRootElement, TableRootProps>((ownProps, forwardedRef) => {
19
19
  const props = useThemeSizeProps(ownProps, tableRootPropDefs.size);
20
20
  const { layout: layoutPropDef, ...rootPropDefs } = tableRootPropDefs;
21
- const { className, children, layout, ...rootProps } = extractProps(
22
- props,
23
- rootPropDefs
24
- );
21
+ const {
22
+ className,
23
+ children,
24
+ layout,
25
+ // The table is what gets named, not the scroll wrapper around it.
26
+ 'aria-label': ariaLabel,
27
+ 'aria-labelledby': ariaLabelledBy,
28
+ 'aria-describedby': ariaDescribedBy,
29
+ ...rootProps
30
+ } = extractProps(props, rootPropDefs);
25
31
  const tableLayoutClassNames = getResponsiveClassNames({
26
32
  value: layout,
27
33
  className: tableRootPropDefs.layout.className,
@@ -30,7 +36,14 @@ const TableRoot = React.forwardRef<TableRootElement, TableRootProps>((ownProps,
30
36
  return (
31
37
  <div ref={forwardedRef} className={classNames('kui-TableRoot', className)} {...rootProps}>
32
38
  <ScrollArea>
33
- <table className={classNames('kui-TableRootTable', tableLayoutClassNames)}>{children}</table>
39
+ <table
40
+ className={classNames('kui-TableRootTable', tableLayoutClassNames)}
41
+ aria-label={ariaLabel}
42
+ aria-labelledby={ariaLabelledBy}
43
+ aria-describedby={ariaDescribedBy}
44
+ >
45
+ {children}
46
+ </table>
34
47
  </ScrollArea>
35
48
  </div>
36
49
  );
@@ -9,3 +9,37 @@
9
9
  outline: var(--focus-ring-width, 2px) solid var(--focus-8);
10
10
  outline-offset: var(--focus-ring-offset, 2px);
11
11
  }
12
+
13
+ /*
14
+ * Vertical: the list is a column beside the panels, its hairline on the inline end, and the
15
+ * active line runs down that edge.
16
+ */
17
+ .kui-TabsRoot:where([data-orientation='vertical']) {
18
+ display: flex;
19
+ }
20
+
21
+ .kui-TabsList:where([data-orientation='vertical']) {
22
+ flex-direction: column;
23
+ flex-shrink: 0;
24
+ overflow-x: hidden;
25
+ overflow-y: auto;
26
+ box-shadow: inset calc(-1 * var(--border-width-standard)) 0 0 0 var(--neutral-a5);
27
+
28
+ &:where(:dir(rtl)) {
29
+ box-shadow: inset var(--border-width-standard) 0 0 0 var(--neutral-a5);
30
+ }
31
+
32
+ :where(&) .kui-TabsTrigger {
33
+ justify-content: flex-start;
34
+ }
35
+
36
+ :where(&) .kui-TabsTrigger:where([data-state='active'])::before {
37
+ top: 0;
38
+ bottom: 0;
39
+ left: auto;
40
+ right: auto;
41
+ inset-inline-end: 0;
42
+ width: var(--focus-ring-width, 2px);
43
+ height: auto;
44
+ }
45
+ }
@@ -86,8 +86,6 @@ const TabsContent = React.forwardRef<TabsContentElement, TabsContentProps>(
86
86
  {...contentProps}
87
87
  ref={forwardedRef}
88
88
  className={classNames('kui-TabsContent', className)}
89
- aria-live="polite"
90
- aria-atomic="true"
91
89
  />
92
90
  );
93
91
  },
@@ -28,8 +28,9 @@
28
28
  font-style: normal;
29
29
  text-align: start;
30
30
 
31
- /* Allows the `resize` property to work on the div */
31
+ /* Allows the `resize` property to work on the div. Vertical by default, as in v2; the `resize` prop overrides it. */
32
32
  overflow: hidden;
33
+ resize: vertical;
33
34
 
34
35
  isolation: isolate;
35
36
 
@@ -52,7 +52,6 @@ const TextArea = React.forwardRef<TextAreaElement, TextAreaProps>((ownProps, for
52
52
  const {
53
53
  error,
54
54
  errorMessage,
55
-
56
55
  required,
57
56
  'aria-describedby': _ariaDescribedby,
58
57
  'aria-labelledby': _ariaLabelledby,
@@ -72,6 +71,7 @@ const TextArea = React.forwardRef<TextAreaElement, TextAreaProps>((ownProps, for
72
71
  className="kui-reset kui-TextAreaInput"
73
72
  ref={forwardedRef}
74
73
  {...nativeTextAreaProps}
74
+ required={required || undefined}
75
75
  {...ariaProps}
76
76
  />
77
77
  {textAreaProps.errorMessage && (
@@ -91,7 +91,7 @@ const TextFieldRoot = React.forwardRef<TextFieldRootElement, TextFieldRootProps>
91
91
  })}
92
92
  onPointerDown={handlePointerDown}
93
93
  >
94
- <input spellCheck="false" {...nativeInputProps} {...ariaProps} ref={composeRefs(inputRef, forwardedRef)} className="kui-reset kui-TextFieldInput" />
94
+ <input {...nativeInputProps} required={required || undefined} {...ariaProps} ref={composeRefs(inputRef, forwardedRef)} className="kui-reset kui-TextFieldInput" />
95
95
  {children}
96
96
  {inputProps.errorMessage && (
97
97
  <div id={errorId} className="kui-TextFieldErrorMessage" role="alert">
@@ -3,7 +3,6 @@ import classNames from 'classnames';
3
3
  import { Toggle as TogglePrimitive } from 'radix-ui';
4
4
  import { Button } from './button.js';
5
5
  import type { ButtonIconOnlyProps, ButtonProps, ButtonRankProps } from './button.js';
6
- import { useToggleState } from '../hooks/use-toggle-state.js';
7
6
 
8
7
  type ToggleOwnProps = {
9
8
  /** Whether the toggle is on. The controlled counterpart of `defaultPressed`. */
@@ -15,10 +14,11 @@ type ToggleOwnProps = {
15
14
  };
16
15
 
17
16
  /**
18
- * Toggle takes every `Button` prop except `as`. Set `iconOnly` for a square toggle holding only
17
+ * Toggle takes every `Button` prop except `as` and `done`: a toggle's state is `pressed`, and a
18
+ * tick in place of its icon would read as a second state. Set `iconOnly` for a square toggle holding only
19
19
  * an icon; the type then requires `aria-label` or `aria-labelledby`.
20
20
  */
21
- type ToggleProps = Omit<ButtonProps<'button'>, 'as' | 'variant' | 'emphasis' | 'iconOnly'> &
21
+ type ToggleProps = Omit<ButtonProps<'button'>, 'as' | 'variant' | 'emphasis' | 'iconOnly' | 'done'> &
22
22
  ButtonRankProps &
23
23
  ButtonIconOnlyProps &
24
24
  ToggleOwnProps;
@@ -43,46 +43,28 @@ type ToggleElement = React.ElementRef<typeof Button>;
43
43
  */
44
44
  const Toggle = React.forwardRef<ToggleElement, ToggleProps>(
45
45
  ({ pressed, onPressedChange, defaultPressed, children, className, ...buttonProps }, forwardedRef) => {
46
- const { 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy } = buttonProps as {
47
- 'aria-label'?: string;
48
- 'aria-labelledby'?: string;
49
- };
50
-
51
- // The label behind aria-labelledby is read once per id, not on every press.
52
- const cachedLabelRef = React.useRef<string | null>(null);
46
+ // `done` is not a Toggle prop; a call that slips past the type drops it rather than showing a tick.
47
+ delete (buttonProps as { done?: boolean }).done;
48
+ // aria-pressed is the whole announcement: a screen reader reads the new state on its own.
49
+ const warnedRef = React.useRef(false);
53
50
  React.useEffect(() => {
54
- cachedLabelRef.current = null;
55
- }, [ariaLabelledBy]);
56
-
57
- /**
58
- * The name announced when the pressed state changes: aria-label, then the label
59
- * aria-labelledby points at, then visible text.
60
- */
61
- const getAccessibleName = React.useCallback(() => {
62
- if (ariaLabel) return ariaLabel;
63
- if (ariaLabelledBy) {
64
- if (cachedLabelRef.current === null) {
65
- cachedLabelRef.current = document.getElementById(ariaLabelledBy)?.textContent || 'Toggle';
66
- }
67
- return cachedLabelRef.current;
51
+ if (
52
+ process.env.NODE_ENV === 'development' &&
53
+ pressed !== undefined &&
54
+ onPressedChange === undefined &&
55
+ !warnedRef.current
56
+ ) {
57
+ warnedRef.current = true;
58
+ console.warn(
59
+ 'Toggle: You provided a `pressed` prop without an `onPressedChange` handler. ' +
60
+ 'This will result in a read-only toggle button. If you want the button to be interactive, ' +
61
+ 'you should provide an `onPressedChange` handler.',
62
+ );
68
63
  }
69
- if (typeof children === 'string') return children;
70
- if (React.isValidElement(children) && typeof (children.props as { children?: unknown })?.children === 'string') {
71
- return (children.props as { children: string }).children;
72
- }
73
- return 'Toggle';
74
- }, [ariaLabel, ariaLabelledBy, children]);
75
-
76
- // Shared toggle state hook: accessibility announcements and controlled-state warnings.
77
- const { handlePressedChange } = useToggleState({
78
- pressed,
79
- onPressedChange,
80
- getAccessibleName,
81
- componentName: 'Toggle',
82
- });
64
+ }, [pressed, onPressedChange]);
83
65
 
84
66
  return (
85
- <TogglePrimitive.Root pressed={pressed} onPressedChange={handlePressedChange} defaultPressed={defaultPressed} asChild>
67
+ <TogglePrimitive.Root pressed={pressed} onPressedChange={onPressedChange} defaultPressed={defaultPressed} asChild>
86
68
  <Button {...(buttonProps as ButtonProps)} ref={forwardedRef} className={classNames('kui-Toggle', className)}>
87
69
  {children}
88
70
  </Button>
@@ -90,6 +90,40 @@
90
90
  border-radius: max(0px, calc(var(--toolbar-radius) - var(--toolbar-group-inset)));
91
91
  }
92
92
 
93
+ /* * * * * * * * * * * * * * * * * * * */
94
+ /* */
95
+ /* Overflow */
96
+ /* */
97
+ /* * * * * * * * * * * * * * * * * * * */
98
+
99
+ /* Takes the room the row leaves and packs its controls at the end, so the ones that don't fit
100
+ move into the "More" menu from the end. The empty part of it lets clicks through. */
101
+ .kui-ToolbarOverflow {
102
+ display: flex;
103
+ align-items: center;
104
+ justify-content: flex-end;
105
+ gap: var(--toolbar-gap);
106
+ flex: 1 1 0%;
107
+ min-width: 0;
108
+ pointer-events: none;
109
+
110
+ & > * {
111
+ pointer-events: auto;
112
+ }
113
+ }
114
+
115
+ /* One seat per child, so a child that renders nothing keeps every index in place. A seat never
116
+ shrinks, because its width is the measurement; an empty one leaves the layout and its gaps. */
117
+ .kui-ToolbarOverflowSeat {
118
+ display: flex;
119
+ align-items: center;
120
+ flex: none;
121
+
122
+ &:where(:empty) {
123
+ display: none;
124
+ }
125
+ }
126
+
93
127
  /* * * * * * * * * * * * * * * * * * * */
94
128
  /* */
95
129
  /* Separator */