@womp/kookie-ui 0.7.0 → 0.8.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 (464) hide show
  1. package/components.css +538 -493
  2. package/dist/cjs/components/_internal/base-menu.utils.js +1 -1
  3. package/dist/cjs/components/_internal/base-menu.utils.js.map +3 -3
  4. package/dist/cjs/components/_internal/menu-context.js +1 -1
  5. package/dist/cjs/components/_internal/menu-context.js.map +3 -3
  6. package/dist/cjs/components/_internal/shell-bottom.d.ts +6 -7
  7. package/dist/cjs/components/_internal/shell-bottom.d.ts.map +1 -1
  8. package/dist/cjs/components/_internal/shell-bottom.js +1 -1
  9. package/dist/cjs/components/_internal/shell-bottom.js.map +4 -4
  10. package/dist/cjs/components/_internal/shell-handles.d.ts +9 -0
  11. package/dist/cjs/components/_internal/shell-handles.d.ts.map +1 -1
  12. package/dist/cjs/components/_internal/shell-handles.js +1 -1
  13. package/dist/cjs/components/_internal/shell-handles.js.map +3 -3
  14. package/dist/cjs/components/_internal/shell-inspector.d.ts +4 -6
  15. package/dist/cjs/components/_internal/shell-inspector.d.ts.map +1 -1
  16. package/dist/cjs/components/_internal/shell-inspector.js +1 -1
  17. package/dist/cjs/components/_internal/shell-inspector.js.map +4 -4
  18. package/dist/cjs/components/_internal/shell-pane.d.ts +70 -0
  19. package/dist/cjs/components/_internal/shell-pane.d.ts.map +1 -0
  20. package/dist/cjs/components/_internal/shell-pane.js +2 -0
  21. package/dist/cjs/components/_internal/shell-pane.js.map +7 -0
  22. package/dist/cjs/components/_internal/shell-resizable.d.ts +48 -0
  23. package/dist/cjs/components/_internal/shell-resizable.d.ts.map +1 -0
  24. package/dist/cjs/components/_internal/shell-resizable.js +2 -0
  25. package/dist/cjs/components/_internal/shell-resizable.js.map +7 -0
  26. package/dist/cjs/components/_internal/shell-resize.d.ts +11 -3
  27. package/dist/cjs/components/_internal/shell-resize.d.ts.map +1 -1
  28. package/dist/cjs/components/_internal/shell-resize.js +1 -1
  29. package/dist/cjs/components/_internal/shell-resize.js.map +2 -2
  30. package/dist/cjs/components/_internal/shell-rest.d.ts +27 -0
  31. package/dist/cjs/components/_internal/shell-rest.d.ts.map +1 -0
  32. package/dist/cjs/components/_internal/shell-rest.js +2 -0
  33. package/dist/cjs/components/_internal/shell-rest.js.map +7 -0
  34. package/dist/cjs/components/_internal/shell-sidebar.d.ts +7 -12
  35. package/dist/cjs/components/_internal/shell-sidebar.d.ts.map +1 -1
  36. package/dist/cjs/components/_internal/shell-sidebar.js +1 -1
  37. package/dist/cjs/components/_internal/shell-sidebar.js.map +4 -4
  38. package/dist/cjs/components/_internal/shell-store.d.ts +99 -0
  39. package/dist/cjs/components/_internal/shell-store.d.ts.map +1 -0
  40. package/dist/cjs/components/_internal/shell-store.js +2 -0
  41. package/dist/cjs/components/_internal/shell-store.js.map +7 -0
  42. package/dist/cjs/components/context-menu.js +1 -1
  43. package/dist/cjs/components/context-menu.js.map +3 -3
  44. package/dist/cjs/components/dropdown-menu.js +1 -1
  45. package/dist/cjs/components/dropdown-menu.js.map +3 -3
  46. package/dist/cjs/components/index.js +5 -5
  47. package/dist/cjs/components/index.js.map +4 -4
  48. package/dist/cjs/components/schemas/index.js +1 -1
  49. package/dist/cjs/components/schemas/index.js.map +3 -3
  50. package/dist/cjs/components/schemas/shell.schema.d.ts +277 -229
  51. package/dist/cjs/components/schemas/shell.schema.d.ts.map +1 -1
  52. package/dist/cjs/components/schemas/shell.schema.js +1 -1
  53. package/dist/cjs/components/schemas/shell.schema.js.map +3 -3
  54. package/dist/cjs/components/shell.context.d.ts +25 -114
  55. package/dist/cjs/components/shell.context.d.ts.map +1 -1
  56. package/dist/cjs/components/shell.context.js +1 -1
  57. package/dist/cjs/components/shell.context.js.map +4 -4
  58. package/dist/cjs/components/shell.d.ts +42 -21
  59. package/dist/cjs/components/shell.d.ts.map +1 -1
  60. package/dist/cjs/components/shell.hooks.d.ts +7 -23
  61. package/dist/cjs/components/shell.hooks.d.ts.map +1 -1
  62. package/dist/cjs/components/shell.hooks.js +1 -1
  63. package/dist/cjs/components/shell.hooks.js.map +4 -4
  64. package/dist/cjs/components/shell.js +1 -1
  65. package/dist/cjs/components/shell.js.map +4 -4
  66. package/dist/cjs/components/shell.types.d.ts +19 -2
  67. package/dist/cjs/components/shell.types.d.ts.map +1 -1
  68. package/dist/cjs/components/shell.types.js +1 -1
  69. package/dist/cjs/components/shell.types.js.map +3 -3
  70. package/dist/cjs/components/sidebar.js.map +3 -3
  71. package/dist/cjs/hooks/use-breakpoint.d.ts +5 -0
  72. package/dist/cjs/hooks/use-breakpoint.d.ts.map +1 -1
  73. package/dist/cjs/hooks/use-breakpoint.js +1 -1
  74. package/dist/cjs/hooks/use-breakpoint.js.map +3 -3
  75. package/dist/cjs/index.js +5 -5
  76. package/dist/cjs/index.js.map +4 -4
  77. package/dist/esm/{chunk-HJU4I34X.js → chunk-25X75TI7.js} +2 -2
  78. package/dist/esm/{chunk-4XKK32M4.js → chunk-26I257HE.js} +2 -2
  79. package/dist/esm/chunk-2EQWBT2S.js +2 -0
  80. package/dist/esm/chunk-2EQWBT2S.js.map +7 -0
  81. package/dist/esm/{chunk-GLERJXVS.js → chunk-2Q7BJ7YG.js} +2 -2
  82. package/dist/esm/{chunk-CJ27XP5Z.js → chunk-3AOFY2B4.js} +2 -2
  83. package/dist/esm/chunk-3J6AUDID.js +2 -0
  84. package/dist/esm/chunk-3J6AUDID.js.map +7 -0
  85. package/dist/esm/{chunk-7EWFBWBS.js → chunk-3PTSRBVY.js} +2 -2
  86. package/dist/esm/chunk-3XSB7YIM.js +2 -0
  87. package/dist/esm/{chunk-FMBECDL4.js.map → chunk-3XSB7YIM.js.map} +3 -3
  88. package/dist/esm/{chunk-O2U6RJTB.js → chunk-44JZYS7A.js} +2 -2
  89. package/dist/esm/{chunk-CTA5ODAO.js → chunk-4WU2WKUJ.js} +2 -2
  90. package/dist/esm/{chunk-KZWNGWIM.js → chunk-5M7STAH3.js} +2 -2
  91. package/dist/esm/{chunk-5WRCK4R7.js → chunk-5TAHT6VC.js} +2 -2
  92. package/dist/esm/{chunk-RNTCHVFI.js → chunk-6J6YX2VX.js} +2 -2
  93. package/dist/esm/{chunk-AGSSWWFI.js → chunk-7FKKGUHK.js} +2 -2
  94. package/dist/esm/{chunk-WHFJ4JUN.js → chunk-7NYODT3Z.js} +2 -2
  95. package/dist/esm/{chunk-NVDXXGVW.js → chunk-7PMMYHZV.js} +2 -2
  96. package/dist/esm/chunk-A2XVR7GL.js +2 -0
  97. package/dist/esm/chunk-A2XVR7GL.js.map +7 -0
  98. package/dist/esm/chunk-ADXZNG4F.js +2 -0
  99. package/dist/esm/chunk-ADXZNG4F.js.map +7 -0
  100. package/dist/esm/chunk-AGNIFHOE.js +2 -0
  101. package/dist/esm/chunk-AGNIFHOE.js.map +7 -0
  102. package/dist/esm/{chunk-KJUDZCYK.js → chunk-AIHQ3MVK.js} +2 -2
  103. package/dist/esm/{chunk-UBOOUDS4.js → chunk-AO32NT75.js} +2 -2
  104. package/dist/esm/chunk-BZZXXZ3O.js +2 -0
  105. package/dist/esm/chunk-BZZXXZ3O.js.map +7 -0
  106. package/dist/esm/{chunk-JDGJSNWT.js → chunk-C5RVO3C3.js} +2 -2
  107. package/dist/esm/{chunk-IHK3H2OM.js → chunk-CBNTPHYK.js} +2 -2
  108. package/dist/esm/{chunk-BBJUB52V.js → chunk-CRBOJ7N7.js} +2 -2
  109. package/dist/esm/{chunk-VHECAEUP.js → chunk-DCIQHXAR.js} +2 -2
  110. package/dist/esm/{chunk-43A5GUSI.js → chunk-EHBAK3LQ.js} +2 -2
  111. package/dist/esm/{chunk-K3UAS7RW.js → chunk-F3AXE27Q.js} +2 -2
  112. package/dist/esm/{chunk-KFR3CK24.js → chunk-FB3PD4Z3.js} +2 -2
  113. package/dist/esm/{chunk-MCPRXVKZ.js → chunk-FEAOFF77.js} +2 -2
  114. package/dist/esm/{chunk-VZSQATP6.js → chunk-G4YKBAZT.js} +2 -2
  115. package/dist/esm/{chunk-ECXGQQJB.js → chunk-GDAKJS64.js} +2 -2
  116. package/dist/esm/{chunk-VR7ZAFYN.js → chunk-GGSJXOKR.js} +2 -2
  117. package/dist/esm/chunk-GM7KMQDI.js +2 -0
  118. package/dist/esm/chunk-GMHA5CFH.js +2 -0
  119. package/dist/esm/chunk-GMHA5CFH.js.map +7 -0
  120. package/dist/esm/{chunk-CESYMTJQ.js → chunk-H4GR4262.js} +2 -2
  121. package/dist/esm/{chunk-WXQIIKWV.js → chunk-HBIF43PT.js} +2 -2
  122. package/dist/esm/chunk-HCNO7PX6.js +2 -0
  123. package/dist/esm/chunk-HCNO7PX6.js.map +7 -0
  124. package/dist/esm/{chunk-2264DHUW.js → chunk-HMSSFU6I.js} +2 -2
  125. package/dist/esm/chunk-HWQ3NTJP.js +2 -0
  126. package/dist/esm/chunk-HWQ3NTJP.js.map +7 -0
  127. package/dist/esm/{chunk-S5C5YRBS.js → chunk-IDUVJJYG.js} +2 -2
  128. package/dist/esm/{chunk-CIYF56YS.js → chunk-IK3MQHA5.js} +2 -2
  129. package/dist/esm/{chunk-CKMMUHKE.js → chunk-JDEBKA56.js} +2 -2
  130. package/dist/esm/{chunk-E67CIG6A.js → chunk-JDWCQ2XP.js} +2 -2
  131. package/dist/esm/{chunk-L3BWTV7I.js → chunk-JQSZF3E2.js} +2 -2
  132. package/dist/esm/{chunk-MEO7MJMQ.js → chunk-JQW4XYBS.js} +2 -2
  133. package/dist/esm/{chunk-KMPE7TJ6.js → chunk-JRFZ535T.js} +2 -2
  134. package/dist/esm/{chunk-CDG5WH4U.js → chunk-KEEPKI2X.js} +2 -2
  135. package/dist/esm/{chunk-GAV3NHYL.js → chunk-KV4SZP3F.js} +2 -2
  136. package/dist/esm/{chunk-FG7XM7KJ.js → chunk-LJCUPAOI.js} +2 -2
  137. package/dist/esm/{chunk-N4GTDLRD.js → chunk-MBCQA7UZ.js} +2 -2
  138. package/dist/esm/chunk-MM5IHQFM.js +2 -0
  139. package/dist/esm/{chunk-Y5RCH23Z.js → chunk-NQXRWBQM.js} +2 -2
  140. package/dist/esm/{chunk-CSKZZOI2.js → chunk-NTNMJX5M.js} +2 -2
  141. package/dist/esm/{chunk-V27ZAN3E.js → chunk-NV3P2CKH.js} +2 -2
  142. package/dist/esm/{chunk-4ME6O27S.js → chunk-O4CSXNST.js} +2 -2
  143. package/dist/esm/chunk-ODCVOXEV.js +2 -0
  144. package/dist/esm/{chunk-W2FOBR5Q.js → chunk-OEEF6KJG.js} +2 -2
  145. package/dist/esm/{chunk-ABSKRHVM.js → chunk-OJSOX3AX.js} +2 -2
  146. package/dist/esm/{chunk-JGLAE5G7.js → chunk-OQU2SKLN.js} +2 -2
  147. package/dist/esm/{chunk-PZ7OYATT.js → chunk-OTKQN2KY.js} +2 -2
  148. package/dist/esm/{chunk-QWVU2TW4.js → chunk-P27KV2LS.js} +2 -2
  149. package/dist/esm/{chunk-JUY7CBSL.js → chunk-PBFSBHBS.js} +2 -2
  150. package/dist/esm/{chunk-DSJY5RI3.js → chunk-PDUHBDFC.js} +2 -2
  151. package/dist/esm/{chunk-MTOLKA6S.js → chunk-POG3YABW.js} +2 -2
  152. package/dist/esm/chunk-PYHEBG5I.js +2 -0
  153. package/dist/esm/chunk-PYHEBG5I.js.map +7 -0
  154. package/dist/esm/{chunk-GO7OHBHW.js → chunk-PYXMGEO7.js} +2 -2
  155. package/dist/esm/{chunk-VNH7BJOA.js → chunk-QEGEUD4D.js} +2 -2
  156. package/dist/esm/chunk-QEL55MLF.js +2 -0
  157. package/dist/esm/{chunk-MS5J4MF6.js → chunk-QJVAS7AK.js} +2 -2
  158. package/dist/esm/chunk-ROSWI2CL.js +2 -0
  159. package/dist/esm/chunk-ROSWI2CL.js.map +7 -0
  160. package/dist/esm/{chunk-KCWESYMR.js → chunk-RY67WG3O.js} +2 -2
  161. package/dist/esm/{chunk-IFM4EMZB.js → chunk-TLGXIWAS.js} +2 -2
  162. package/dist/esm/{chunk-6FLLFCBU.js → chunk-UBSLEGQZ.js} +2 -2
  163. package/dist/esm/{chunk-VBI3AWPT.js → chunk-UNWPH3SO.js} +2 -2
  164. package/dist/esm/chunk-V5ZSDDVZ.js +2 -0
  165. package/dist/esm/chunk-V5ZSDDVZ.js.map +7 -0
  166. package/dist/esm/{chunk-X7V3V3W4.js → chunk-VTIL55SR.js} +2 -2
  167. package/dist/esm/{chunk-ALWNS44Q.js → chunk-W2LD2YE6.js} +2 -2
  168. package/dist/esm/{chunk-2I7QRVJ5.js → chunk-WGWUEU4K.js} +2 -2
  169. package/dist/esm/{chunk-EPTYNVCU.js → chunk-WIDJYVZF.js} +2 -2
  170. package/dist/esm/{chunk-OLAWVEAI.js → chunk-WJBOOAIO.js} +2 -2
  171. package/dist/esm/{chunk-7FC7HF76.js → chunk-WQCB7KSH.js} +2 -2
  172. package/dist/esm/{chunk-YBSRX63K.js → chunk-WZFVTC7P.js} +2 -2
  173. package/dist/esm/chunk-XDDKT4NF.js +2 -0
  174. package/dist/esm/{chunk-KFA53SVQ.js → chunk-YA5DF67M.js} +2 -2
  175. package/dist/esm/chunk-YA5DF67M.js.map +7 -0
  176. package/dist/esm/chunk-YAQBIO2B.js +2 -0
  177. package/dist/esm/chunk-YAQBIO2B.js.map +7 -0
  178. package/dist/esm/{chunk-OFUNVHZ5.js → chunk-YG66IRW4.js} +2 -2
  179. package/dist/esm/{chunk-WGYUWEQV.js → chunk-YVSM2LGS.js} +2 -2
  180. package/dist/esm/{chunk-4NTGF22C.js → chunk-Z7AZNMNX.js} +2 -2
  181. package/dist/esm/chunk-ZJ33QP5N.js +2 -0
  182. package/dist/esm/{chunk-OGXZHAQL.js → chunk-ZW26J2SA.js} +2 -2
  183. package/dist/esm/components/_internal/base-button.js +1 -1
  184. package/dist/esm/components/_internal/base-menu.utils.js +1 -1
  185. package/dist/esm/components/_internal/menu-context.js +1 -1
  186. package/dist/esm/components/_internal/shell-bottom.d.ts +6 -7
  187. package/dist/esm/components/_internal/shell-bottom.d.ts.map +1 -1
  188. package/dist/esm/components/_internal/shell-bottom.js +1 -1
  189. package/dist/esm/components/_internal/shell-handles.d.ts +9 -0
  190. package/dist/esm/components/_internal/shell-handles.d.ts.map +1 -1
  191. package/dist/esm/components/_internal/shell-handles.js +1 -1
  192. package/dist/esm/components/_internal/shell-inspector.d.ts +4 -6
  193. package/dist/esm/components/_internal/shell-inspector.d.ts.map +1 -1
  194. package/dist/esm/components/_internal/shell-inspector.js +1 -1
  195. package/dist/esm/components/_internal/shell-pane.d.ts +70 -0
  196. package/dist/esm/components/_internal/shell-pane.d.ts.map +1 -0
  197. package/dist/esm/components/_internal/shell-pane.js +2 -0
  198. package/dist/esm/components/_internal/shell-resizable.d.ts +48 -0
  199. package/dist/esm/components/_internal/shell-resizable.d.ts.map +1 -0
  200. package/dist/esm/components/_internal/shell-resizable.js +2 -0
  201. package/dist/esm/components/_internal/shell-resizable.js.map +7 -0
  202. package/dist/esm/components/_internal/shell-resize.d.ts +11 -3
  203. package/dist/esm/components/_internal/shell-resize.d.ts.map +1 -1
  204. package/dist/esm/components/_internal/shell-resize.js +1 -1
  205. package/dist/esm/components/_internal/shell-rest.d.ts +27 -0
  206. package/dist/esm/components/_internal/shell-rest.d.ts.map +1 -0
  207. package/dist/esm/components/_internal/shell-rest.js +2 -0
  208. package/dist/esm/components/_internal/shell-rest.js.map +7 -0
  209. package/dist/esm/components/_internal/shell-sidebar.d.ts +7 -12
  210. package/dist/esm/components/_internal/shell-sidebar.d.ts.map +1 -1
  211. package/dist/esm/components/_internal/shell-sidebar.js +1 -1
  212. package/dist/esm/components/_internal/shell-store.d.ts +99 -0
  213. package/dist/esm/components/_internal/shell-store.d.ts.map +1 -0
  214. package/dist/esm/components/_internal/shell-store.js +2 -0
  215. package/dist/esm/components/_internal/shell-store.js.map +7 -0
  216. package/dist/esm/components/accordion.js +1 -1
  217. package/dist/esm/components/alert-dialog.js +1 -1
  218. package/dist/esm/components/avatar.js +1 -1
  219. package/dist/esm/components/badge.js +1 -1
  220. package/dist/esm/components/blockquote.js +1 -1
  221. package/dist/esm/components/blockquote.props.js +1 -1
  222. package/dist/esm/components/box.js +1 -1
  223. package/dist/esm/components/button.js +1 -1
  224. package/dist/esm/components/callout.js +1 -1
  225. package/dist/esm/components/card.js +1 -1
  226. package/dist/esm/components/chatbar.js +1 -1
  227. package/dist/esm/components/checkbox-cards.js +1 -1
  228. package/dist/esm/components/checkbox-group.js +1 -1
  229. package/dist/esm/components/checkbox.js +1 -1
  230. package/dist/esm/components/code.js +1 -1
  231. package/dist/esm/components/code.props.js +1 -1
  232. package/dist/esm/components/combobox.js +1 -1
  233. package/dist/esm/components/container.js +1 -1
  234. package/dist/esm/components/context-menu.js +1 -1
  235. package/dist/esm/components/data-list.js +1 -1
  236. package/dist/esm/components/dialog.js +1 -1
  237. package/dist/esm/components/dropdown-menu.js +1 -1
  238. package/dist/esm/components/em.js +1 -1
  239. package/dist/esm/components/em.props.js +1 -1
  240. package/dist/esm/components/flex.js +1 -1
  241. package/dist/esm/components/grid.js +1 -1
  242. package/dist/esm/components/heading.js +1 -1
  243. package/dist/esm/components/heading.props.js +1 -1
  244. package/dist/esm/components/hover-card.js +1 -1
  245. package/dist/esm/components/icon-button.js +1 -1
  246. package/dist/esm/components/image.js +1 -1
  247. package/dist/esm/components/index.js +1 -1
  248. package/dist/esm/components/inset.js +1 -1
  249. package/dist/esm/components/kbd.js +1 -1
  250. package/dist/esm/components/link.js +1 -1
  251. package/dist/esm/components/link.props.js +1 -1
  252. package/dist/esm/components/navbar.js +1 -1
  253. package/dist/esm/components/popover.js +1 -1
  254. package/dist/esm/components/progress.js +1 -1
  255. package/dist/esm/components/quote.js +1 -1
  256. package/dist/esm/components/quote.props.js +1 -1
  257. package/dist/esm/components/radio-cards.js +1 -1
  258. package/dist/esm/components/radio-group.js +1 -1
  259. package/dist/esm/components/radio.js +1 -1
  260. package/dist/esm/components/schemas/index.js +1 -1
  261. package/dist/esm/components/schemas/shell.schema.d.ts +277 -229
  262. package/dist/esm/components/schemas/shell.schema.d.ts.map +1 -1
  263. package/dist/esm/components/schemas/shell.schema.js +1 -1
  264. package/dist/esm/components/scroll-area.js +1 -1
  265. package/dist/esm/components/section.js +1 -1
  266. package/dist/esm/components/segmented-control.js +1 -1
  267. package/dist/esm/components/select.js +1 -1
  268. package/dist/esm/components/separator.js +1 -1
  269. package/dist/esm/components/sheet.js +1 -1
  270. package/dist/esm/components/shell.context.d.ts +25 -114
  271. package/dist/esm/components/shell.context.d.ts.map +1 -1
  272. package/dist/esm/components/shell.context.js +1 -1
  273. package/dist/esm/components/shell.d.ts +42 -21
  274. package/dist/esm/components/shell.d.ts.map +1 -1
  275. package/dist/esm/components/shell.hooks.d.ts +7 -23
  276. package/dist/esm/components/shell.hooks.d.ts.map +1 -1
  277. package/dist/esm/components/shell.hooks.js +1 -1
  278. package/dist/esm/components/shell.js +1 -1
  279. package/dist/esm/components/shell.types.d.ts +19 -2
  280. package/dist/esm/components/shell.types.d.ts.map +1 -1
  281. package/dist/esm/components/shell.types.js +1 -1
  282. package/dist/esm/components/sidebar.js +1 -1
  283. package/dist/esm/components/skeleton.js +1 -1
  284. package/dist/esm/components/slider.js +1 -1
  285. package/dist/esm/components/spinner.js +1 -1
  286. package/dist/esm/components/strong.js +1 -1
  287. package/dist/esm/components/strong.props.js +1 -1
  288. package/dist/esm/components/switch.js +1 -1
  289. package/dist/esm/components/tab-nav.js +1 -1
  290. package/dist/esm/components/table.js +1 -1
  291. package/dist/esm/components/tabs.js +1 -1
  292. package/dist/esm/components/text-area.js +1 -1
  293. package/dist/esm/components/text-field.js +1 -1
  294. package/dist/esm/components/text.js +1 -1
  295. package/dist/esm/components/text.props.js +1 -1
  296. package/dist/esm/components/theme-panel.js +1 -1
  297. package/dist/esm/components/toggle-button.js +1 -1
  298. package/dist/esm/components/toggle-icon-button.js +1 -1
  299. package/dist/esm/components/toolbar.js +1 -1
  300. package/dist/esm/components/tooltip.js +1 -1
  301. package/dist/esm/components/user-card.js +1 -1
  302. package/dist/esm/components/virtual-menu.js +1 -1
  303. package/dist/esm/helpers/extract-props.js +1 -1
  304. package/dist/esm/helpers/get-margin-styles.js +1 -1
  305. package/dist/esm/helpers/get-responsive-styles.js +1 -1
  306. package/dist/esm/helpers/index.js +1 -1
  307. package/dist/esm/hooks/index.js +1 -1
  308. package/dist/esm/hooks/use-breakpoint.d.ts +5 -0
  309. package/dist/esm/hooks/use-breakpoint.d.ts.map +1 -1
  310. package/dist/esm/hooks/use-breakpoint.js +1 -1
  311. package/dist/esm/index.js +1 -1
  312. package/dist/esm/props/index.js +1 -1
  313. package/package.json +7 -2
  314. package/schemas/index.json +1655 -0
  315. package/schemas/shell-bottom.d.ts +2 -0
  316. package/schemas/shell-bottom.json +180 -76
  317. package/schemas/shell-content.d.ts +2 -0
  318. package/schemas/shell-content.json +11 -5
  319. package/schemas/shell-handle.d.ts +2 -0
  320. package/schemas/shell-handle.json +7 -5
  321. package/schemas/shell-header.d.ts +2 -0
  322. package/schemas/shell-header.json +9 -10
  323. package/schemas/shell-inspector.d.ts +2 -0
  324. package/schemas/shell-inspector.json +183 -79
  325. package/schemas/shell-panel.d.ts +2 -0
  326. package/schemas/shell-panel.json +180 -76
  327. package/schemas/shell-rail.d.ts +2 -0
  328. package/schemas/shell-rail.json +137 -64
  329. package/schemas/shell-root.d.ts +2 -0
  330. package/schemas/shell-root.json +11 -9
  331. package/schemas/shell-sidebar.d.ts +2 -0
  332. package/schemas/shell-sidebar.json +274 -85
  333. package/schemas/shell-trigger.d.ts +2 -0
  334. package/schemas/shell-trigger.json +29 -17
  335. package/src/components/_internal/shell-bottom.tsx +92 -361
  336. package/src/components/_internal/shell-handles.tsx +193 -108
  337. package/src/components/_internal/shell-inspector.tsx +93 -360
  338. package/src/components/_internal/shell-pane.tsx +283 -0
  339. package/src/components/_internal/shell-resizable.tsx +263 -0
  340. package/src/components/_internal/shell-resize.tsx +11 -3
  341. package/src/components/_internal/shell-rest.ts +45 -0
  342. package/src/components/_internal/shell-sidebar.tsx +130 -441
  343. package/src/components/_internal/shell-store.tsx +204 -0
  344. package/src/components/schemas/shell.schema.ts +162 -153
  345. package/src/components/shell.context.tsx +112 -124
  346. package/src/components/shell.css +637 -496
  347. package/src/components/shell.hooks.ts +12 -170
  348. package/src/components/shell.tsx +566 -1497
  349. package/src/components/shell.types.ts +22 -2
  350. package/src/hooks/use-breakpoint.ts +9 -0
  351. package/styles.css +538 -493
  352. package/dist/cjs/components/_internal/shell-prop-helpers.d.ts +0 -7
  353. package/dist/cjs/components/_internal/shell-prop-helpers.d.ts.map +0 -1
  354. package/dist/cjs/components/_internal/shell-prop-helpers.js +0 -2
  355. package/dist/cjs/components/_internal/shell-prop-helpers.js.map +0 -7
  356. package/dist/esm/chunk-2SZZ75RJ.js +0 -2
  357. package/dist/esm/chunk-2SZZ75RJ.js.map +0 -7
  358. package/dist/esm/chunk-4JQZUQY7.js +0 -2
  359. package/dist/esm/chunk-5LXFJMFB.js +0 -2
  360. package/dist/esm/chunk-5LXFJMFB.js.map +0 -7
  361. package/dist/esm/chunk-CECQNGUL.js +0 -2
  362. package/dist/esm/chunk-CECQNGUL.js.map +0 -7
  363. package/dist/esm/chunk-CEIK5U6C.js +0 -2
  364. package/dist/esm/chunk-CEIK5U6C.js.map +0 -7
  365. package/dist/esm/chunk-EE2IH2GL.js +0 -2
  366. package/dist/esm/chunk-EE2IH2GL.js.map +0 -7
  367. package/dist/esm/chunk-FMBECDL4.js +0 -2
  368. package/dist/esm/chunk-HSAG7C53.js +0 -2
  369. package/dist/esm/chunk-JJKQ7CGI.js +0 -2
  370. package/dist/esm/chunk-KFA53SVQ.js.map +0 -7
  371. package/dist/esm/chunk-KRDP5SQ7.js +0 -2
  372. package/dist/esm/chunk-KRDP5SQ7.js.map +0 -7
  373. package/dist/esm/chunk-M6DJRFJZ.js +0 -2
  374. package/dist/esm/chunk-M6DJRFJZ.js.map +0 -7
  375. package/dist/esm/chunk-MCQCG6AS.js +0 -2
  376. package/dist/esm/chunk-NIQT45PJ.js +0 -2
  377. package/dist/esm/chunk-NNO7M466.js +0 -2
  378. package/dist/esm/chunk-NNO7M466.js.map +0 -7
  379. package/dist/esm/chunk-SNHEJU2S.js +0 -2
  380. package/dist/esm/chunk-SNHEJU2S.js.map +0 -7
  381. package/dist/esm/chunk-TLWTUKKL.js +0 -2
  382. package/dist/esm/chunk-TLWTUKKL.js.map +0 -7
  383. package/dist/esm/chunk-XI5YXUCK.js +0 -2
  384. package/dist/esm/components/_internal/shell-prop-helpers.d.ts +0 -7
  385. package/dist/esm/components/_internal/shell-prop-helpers.d.ts.map +0 -1
  386. package/dist/esm/components/_internal/shell-prop-helpers.js +0 -2
  387. package/src/components/_internal/shell-prop-helpers.ts +0 -54
  388. /package/dist/esm/{chunk-HJU4I34X.js.map → chunk-25X75TI7.js.map} +0 -0
  389. /package/dist/esm/{chunk-4XKK32M4.js.map → chunk-26I257HE.js.map} +0 -0
  390. /package/dist/esm/{chunk-GLERJXVS.js.map → chunk-2Q7BJ7YG.js.map} +0 -0
  391. /package/dist/esm/{chunk-CJ27XP5Z.js.map → chunk-3AOFY2B4.js.map} +0 -0
  392. /package/dist/esm/{chunk-7EWFBWBS.js.map → chunk-3PTSRBVY.js.map} +0 -0
  393. /package/dist/esm/{chunk-O2U6RJTB.js.map → chunk-44JZYS7A.js.map} +0 -0
  394. /package/dist/esm/{chunk-CTA5ODAO.js.map → chunk-4WU2WKUJ.js.map} +0 -0
  395. /package/dist/esm/{chunk-KZWNGWIM.js.map → chunk-5M7STAH3.js.map} +0 -0
  396. /package/dist/esm/{chunk-5WRCK4R7.js.map → chunk-5TAHT6VC.js.map} +0 -0
  397. /package/dist/esm/{chunk-RNTCHVFI.js.map → chunk-6J6YX2VX.js.map} +0 -0
  398. /package/dist/esm/{chunk-AGSSWWFI.js.map → chunk-7FKKGUHK.js.map} +0 -0
  399. /package/dist/esm/{chunk-WHFJ4JUN.js.map → chunk-7NYODT3Z.js.map} +0 -0
  400. /package/dist/esm/{chunk-NVDXXGVW.js.map → chunk-7PMMYHZV.js.map} +0 -0
  401. /package/dist/esm/{chunk-KJUDZCYK.js.map → chunk-AIHQ3MVK.js.map} +0 -0
  402. /package/dist/esm/{chunk-UBOOUDS4.js.map → chunk-AO32NT75.js.map} +0 -0
  403. /package/dist/esm/{chunk-JDGJSNWT.js.map → chunk-C5RVO3C3.js.map} +0 -0
  404. /package/dist/esm/{chunk-IHK3H2OM.js.map → chunk-CBNTPHYK.js.map} +0 -0
  405. /package/dist/esm/{chunk-BBJUB52V.js.map → chunk-CRBOJ7N7.js.map} +0 -0
  406. /package/dist/esm/{chunk-VHECAEUP.js.map → chunk-DCIQHXAR.js.map} +0 -0
  407. /package/dist/esm/{chunk-43A5GUSI.js.map → chunk-EHBAK3LQ.js.map} +0 -0
  408. /package/dist/esm/{chunk-K3UAS7RW.js.map → chunk-F3AXE27Q.js.map} +0 -0
  409. /package/dist/esm/{chunk-KFR3CK24.js.map → chunk-FB3PD4Z3.js.map} +0 -0
  410. /package/dist/esm/{chunk-MCPRXVKZ.js.map → chunk-FEAOFF77.js.map} +0 -0
  411. /package/dist/esm/{chunk-VZSQATP6.js.map → chunk-G4YKBAZT.js.map} +0 -0
  412. /package/dist/esm/{chunk-ECXGQQJB.js.map → chunk-GDAKJS64.js.map} +0 -0
  413. /package/dist/esm/{chunk-VR7ZAFYN.js.map → chunk-GGSJXOKR.js.map} +0 -0
  414. /package/dist/esm/{chunk-4JQZUQY7.js.map → chunk-GM7KMQDI.js.map} +0 -0
  415. /package/dist/esm/{chunk-CESYMTJQ.js.map → chunk-H4GR4262.js.map} +0 -0
  416. /package/dist/esm/{chunk-WXQIIKWV.js.map → chunk-HBIF43PT.js.map} +0 -0
  417. /package/dist/esm/{chunk-2264DHUW.js.map → chunk-HMSSFU6I.js.map} +0 -0
  418. /package/dist/esm/{chunk-S5C5YRBS.js.map → chunk-IDUVJJYG.js.map} +0 -0
  419. /package/dist/esm/{chunk-CIYF56YS.js.map → chunk-IK3MQHA5.js.map} +0 -0
  420. /package/dist/esm/{chunk-CKMMUHKE.js.map → chunk-JDEBKA56.js.map} +0 -0
  421. /package/dist/esm/{chunk-E67CIG6A.js.map → chunk-JDWCQ2XP.js.map} +0 -0
  422. /package/dist/esm/{chunk-L3BWTV7I.js.map → chunk-JQSZF3E2.js.map} +0 -0
  423. /package/dist/esm/{chunk-MEO7MJMQ.js.map → chunk-JQW4XYBS.js.map} +0 -0
  424. /package/dist/esm/{chunk-KMPE7TJ6.js.map → chunk-JRFZ535T.js.map} +0 -0
  425. /package/dist/esm/{chunk-CDG5WH4U.js.map → chunk-KEEPKI2X.js.map} +0 -0
  426. /package/dist/esm/{chunk-GAV3NHYL.js.map → chunk-KV4SZP3F.js.map} +0 -0
  427. /package/dist/esm/{chunk-FG7XM7KJ.js.map → chunk-LJCUPAOI.js.map} +0 -0
  428. /package/dist/esm/{chunk-N4GTDLRD.js.map → chunk-MBCQA7UZ.js.map} +0 -0
  429. /package/dist/esm/{chunk-JJKQ7CGI.js.map → chunk-MM5IHQFM.js.map} +0 -0
  430. /package/dist/esm/{chunk-Y5RCH23Z.js.map → chunk-NQXRWBQM.js.map} +0 -0
  431. /package/dist/esm/{chunk-CSKZZOI2.js.map → chunk-NTNMJX5M.js.map} +0 -0
  432. /package/dist/esm/{chunk-V27ZAN3E.js.map → chunk-NV3P2CKH.js.map} +0 -0
  433. /package/dist/esm/{chunk-4ME6O27S.js.map → chunk-O4CSXNST.js.map} +0 -0
  434. /package/dist/esm/{chunk-HSAG7C53.js.map → chunk-ODCVOXEV.js.map} +0 -0
  435. /package/dist/esm/{chunk-W2FOBR5Q.js.map → chunk-OEEF6KJG.js.map} +0 -0
  436. /package/dist/esm/{chunk-ABSKRHVM.js.map → chunk-OJSOX3AX.js.map} +0 -0
  437. /package/dist/esm/{chunk-JGLAE5G7.js.map → chunk-OQU2SKLN.js.map} +0 -0
  438. /package/dist/esm/{chunk-PZ7OYATT.js.map → chunk-OTKQN2KY.js.map} +0 -0
  439. /package/dist/esm/{chunk-QWVU2TW4.js.map → chunk-P27KV2LS.js.map} +0 -0
  440. /package/dist/esm/{chunk-JUY7CBSL.js.map → chunk-PBFSBHBS.js.map} +0 -0
  441. /package/dist/esm/{chunk-DSJY5RI3.js.map → chunk-PDUHBDFC.js.map} +0 -0
  442. /package/dist/esm/{chunk-MTOLKA6S.js.map → chunk-POG3YABW.js.map} +0 -0
  443. /package/dist/esm/{chunk-GO7OHBHW.js.map → chunk-PYXMGEO7.js.map} +0 -0
  444. /package/dist/esm/{chunk-VNH7BJOA.js.map → chunk-QEGEUD4D.js.map} +0 -0
  445. /package/dist/esm/{chunk-MCQCG6AS.js.map → chunk-QEL55MLF.js.map} +0 -0
  446. /package/dist/esm/{chunk-MS5J4MF6.js.map → chunk-QJVAS7AK.js.map} +0 -0
  447. /package/dist/esm/{chunk-KCWESYMR.js.map → chunk-RY67WG3O.js.map} +0 -0
  448. /package/dist/esm/{chunk-IFM4EMZB.js.map → chunk-TLGXIWAS.js.map} +0 -0
  449. /package/dist/esm/{chunk-6FLLFCBU.js.map → chunk-UBSLEGQZ.js.map} +0 -0
  450. /package/dist/esm/{chunk-VBI3AWPT.js.map → chunk-UNWPH3SO.js.map} +0 -0
  451. /package/dist/esm/{chunk-X7V3V3W4.js.map → chunk-VTIL55SR.js.map} +0 -0
  452. /package/dist/esm/{chunk-ALWNS44Q.js.map → chunk-W2LD2YE6.js.map} +0 -0
  453. /package/dist/esm/{chunk-2I7QRVJ5.js.map → chunk-WGWUEU4K.js.map} +0 -0
  454. /package/dist/esm/{chunk-EPTYNVCU.js.map → chunk-WIDJYVZF.js.map} +0 -0
  455. /package/dist/esm/{chunk-OLAWVEAI.js.map → chunk-WJBOOAIO.js.map} +0 -0
  456. /package/dist/esm/{chunk-7FC7HF76.js.map → chunk-WQCB7KSH.js.map} +0 -0
  457. /package/dist/esm/{chunk-YBSRX63K.js.map → chunk-WZFVTC7P.js.map} +0 -0
  458. /package/dist/esm/{chunk-XI5YXUCK.js.map → chunk-XDDKT4NF.js.map} +0 -0
  459. /package/dist/esm/{chunk-OFUNVHZ5.js.map → chunk-YG66IRW4.js.map} +0 -0
  460. /package/dist/esm/{chunk-WGYUWEQV.js.map → chunk-YVSM2LGS.js.map} +0 -0
  461. /package/dist/esm/{chunk-4NTGF22C.js.map → chunk-Z7AZNMNX.js.map} +0 -0
  462. /package/dist/esm/{chunk-NIQT45PJ.js.map → chunk-ZJ33QP5N.js.map} +0 -0
  463. /package/dist/esm/{chunk-OGXZHAQL.js.map → chunk-ZW26J2SA.js.map} +0 -0
  464. /package/dist/esm/components/_internal/{shell-prop-helpers.js.map → shell-pane.js.map} +0 -0
@@ -1,62 +1,64 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  import classNames from 'classnames';
3
- import * as Sheet from '../sheet.js';
4
- import { VisuallyHidden } from '../visually-hidden.js';
5
- import { useSidebarMode, usePresentation, usePeek, useShellActions, useComposition, useInset } from '../shell.context.js';
6
- import { useResponsivePresentation, useResponsiveInitialState } from '../shell.hooks.js';
5
+ import { useComposedRefs } from 'radix-ui/internal';
7
6
  import { PaneResizeContext } from './shell-resize.js';
8
- import { extractPaneDomProps } from './shell-prop-helpers.js';
9
- import { SidebarHandle, PaneHandle } from './shell-handles.js';
10
- import type { Breakpoint, PaneMode, PaneSizePersistence, SidebarMode, Responsive, PaneBaseProps, CSSPropertiesWithVars } from '../shell.types.js';
11
- import { _BREAKPOINTS } from '../shell.types.js';
12
- import { normalizeToPx } from '../../helpers/normalize-to-px.js';
13
-
14
- type SidebarPaneProps = PaneBaseProps & {
15
- mode?: PaneMode;
16
- defaultMode?: any;
17
- onModeChange?: (mode: PaneMode | SidebarMode) => void;
18
- };
19
-
20
- type SidebarStateChangeMeta = { reason: 'init' | 'toggle' | 'responsive' };
7
+ import { PaneHandle, SidebarHandle } from './shell-handles.js';
8
+ import { usePane, paneAttributes, usePresentationTable } from './shell-pane.js';
9
+ import { splitHandles, useResizablePane, type SizeChangeMeta } from './shell-resizable.js';
10
+ import { useInsetRegistration, warnOnce, type PaneValue } from './shell-store.js';
11
+ import { navigationRest, startAnchoredGrowth, withoutRemovedPaneProps } from './shell-rest.js';
12
+ import { readBreakpoint } from '../../hooks/use-breakpoint.js';
13
+ import type { Breakpoint, CSSPropertiesWithVars, PaneBaseProps, Responsive, SidebarMode } from '../shell.types.js';
14
+
15
+ type SidebarStateChangeMeta = { reason: 'init' | 'toggle' | 'responsive' | 'dismiss' };
21
16
  type SidebarControlledProps = { state: Responsive<SidebarMode>; onStateChange?: (state: SidebarMode, meta: SidebarStateChangeMeta) => void; defaultState?: never };
22
17
  type SidebarUncontrolledProps = { defaultState?: SidebarMode | Partial<Record<Breakpoint, SidebarMode>>; onStateChange?: (state: SidebarMode, meta: SidebarStateChangeMeta) => void; state?: never };
23
- type SidebarPublicProps = Omit<SidebarPaneProps, 'mode' | 'defaultMode' | 'onModeChange'> & {
24
- // removed legacy mode props
18
+ type SidebarPublicProps = PaneBaseProps & {
25
19
  thinSize?: number;
20
+ /** `both` toggles through collapsed, thin and expanded; `single` between collapsed and the default. */
26
21
  toggleModes?: 'both' | 'single';
27
- // size API (width when expanded)
28
22
  size?: number | string;
29
23
  defaultSize?: number | string;
30
- onSizeChange?: (size: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => void;
24
+ onSizeChange?: (size: number, meta: SizeChangeMeta) => void;
31
25
  sizeUpdate?: 'throttle' | 'debounce';
32
26
  sizeUpdateMs?: number;
33
- /** When true, adds margin and triggers gray backdrop on Shell. */
27
+ /** When true, adds margin and triggers the gray backdrop on the Shell. */
34
28
  inset?: boolean;
35
29
  } & (SidebarControlledProps | SidebarUncontrolledProps);
36
30
 
37
31
  type SidebarComponent = React.ForwardRefExoticComponent<SidebarPublicProps & React.RefAttributes<HTMLDivElement>> & { Handle: typeof SidebarHandle };
38
32
 
39
- const SIDEBAR_DOM_PROP_KEYS = [
40
- 'className',
41
- 'children',
42
- 'state',
43
- 'defaultState',
44
- 'onStateChange',
45
- 'thinSize',
46
- 'toggleModes',
47
- 'size',
48
- 'defaultSize',
49
- 'onSizeChange',
50
- 'sizeUpdate',
51
- 'sizeUpdateMs',
52
- 'style',
53
- 'inset',
54
- ] as const satisfies readonly (keyof SidebarPublicProps)[];
33
+ const toValue = (mode: SidebarMode): PaneValue => (mode === 'collapsed' ? 'closed' : mode === 'thin' ? 'thin' : 'open');
34
+ const toMode = (value: PaneValue): SidebarMode => (value === 'closed' ? 'collapsed' : value === 'thin' ? 'thin' : 'expanded');
35
+
36
+ function modeToValue(state: Responsive<SidebarMode> | undefined): PaneValue | Partial<Record<Breakpoint, PaneValue>> | undefined {
37
+ if (state === undefined) return undefined;
38
+ if (typeof state === 'string') return toValue(state);
39
+ const map: Partial<Record<Breakpoint, PaneValue>> = {};
40
+ for (const [bp, mode] of Object.entries(state) as Array<[Breakpoint, SidebarMode | undefined]>) {
41
+ if (mode !== undefined) map[bp] = toValue(mode);
42
+ }
43
+ return map;
44
+ }
55
45
 
56
- export const Sidebar = React.forwardRef<HTMLDivElement, SidebarPublicProps>((initialProps, ref) => {
46
+ const SIDEBAR_PROP_NAMES = { controlled: 'state', default: 'defaultState' };
47
+
48
+ /** Since 0.8.0 the Sidebar is in the frame from 768px up, the boundary kookie-ui-v2 uses everywhere. It was 1024px. */
49
+ const SIDEBAR_DEFAULT_PRESENTATION = { initial: 'overlay', sm: 'fixed' } as const;
50
+
51
+ const toggleBoth = (current: PaneValue): PaneValue => (current === 'closed' ? 'thin' : current === 'thin' ? 'open' : 'closed');
52
+ const toggleSingle = (current: PaneValue, defaultHere: PaneValue | undefined): PaneValue => {
53
+ const target: PaneValue = defaultHere === 'thin' ? 'thin' : 'open';
54
+ if (current === 'closed') return target;
55
+ return current === target ? 'closed' : target;
56
+ };
57
+
58
+ export const Sidebar = React.forwardRef<HTMLDivElement, SidebarPublicProps>((props, ref) => {
57
59
  const {
58
60
  className,
59
- presentation = { initial: 'overlay', md: 'fixed' },
61
+ presentation = SIDEBAR_DEFAULT_PRESENTATION,
60
62
  expandedSize = 288,
61
63
  minSize = 200,
62
64
  maxSize = 400,
@@ -75,7 +77,7 @@ export const Sidebar = React.forwardRef<HTMLDivElement, SidebarPublicProps>((ini
75
77
  children,
76
78
  style,
77
79
  thinSize = 64,
78
- toggleModes,
80
+ toggleModes = 'both',
79
81
  state,
80
82
  defaultState,
81
83
  onStateChange,
@@ -85,418 +87,105 @@ export const Sidebar = React.forwardRef<HTMLDivElement, SidebarPublicProps>((ini
85
87
  sizeUpdate,
86
88
  sizeUpdateMs = 50,
87
89
  inset,
88
- } = initialProps;
89
- const sidebarDomProps = extractPaneDomProps(initialProps, SIDEBAR_DOM_PROP_KEYS);
90
- const { sidebarMode, setSidebarMode } = useSidebarMode();
91
- const { currentBreakpointReady } = usePresentation();
92
- const { peekTarget } = usePeek();
93
- const { togglePane, setSidebarToggleComputer } = useShellActions();
94
- const { setHasSidebar } = useComposition();
95
- const { registerInset, unregisterInset } = useInset();
96
-
97
- // Register/unregister inset
98
- React.useLayoutEffect(() => {
99
- if (inset) {
100
- registerInset('sidebar');
101
- return () => unregisterInset('sidebar');
102
- }
103
- }, [inset, registerInset, unregisterInset]);
104
- const resolvedPresentation = useResponsivePresentation(presentation);
105
- const isOverlay = resolvedPresentation === 'overlay';
106
- const isStacked = resolvedPresentation === 'stacked';
107
- // Phase sequencing is now CSS-driven; no JS-managed phase
108
- const localRef = React.useRef<HTMLDivElement | null>(null);
109
- const setRef = React.useCallback(
110
- (node: HTMLDivElement | null) => {
111
- localRef.current = node;
112
- if (typeof ref === 'function') ref(node);
113
- else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;
114
- },
115
- [ref],
116
- );
117
- const childArray = React.Children.toArray(children) as React.ReactElement[];
118
- const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === SidebarHandle);
119
- const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === SidebarHandle));
120
-
121
- // Ref for debounce cleanup
122
- const debounceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);
123
- // Cleanup debounce timeout on unmount or when dependencies change
124
- React.useEffect(() => {
125
- return () => {
126
- if (debounceTimeoutRef.current) {
127
- clearTimeout(debounceTimeoutRef.current);
128
- debounceTimeoutRef.current = null;
129
- }
130
- };
131
- }, [onSizeChange, sizeUpdate, sizeUpdateMs]);
132
- // Throttled/debounced emitter for onSizeChange
133
- const emitSizeChange = React.useMemo(() => {
134
- const cb = onSizeChange as undefined | ((s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => void);
135
- const strategy = sizeUpdate as undefined | 'throttle' | 'debounce';
136
- const ms = sizeUpdateMs ?? 50;
137
- if (!cb) return () => {};
138
- if (strategy === 'debounce') {
139
- return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => {
140
- if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);
141
- debounceTimeoutRef.current = setTimeout(() => {
142
- cb(s, meta);
143
- debounceTimeoutRef.current = null;
144
- }, ms);
145
- };
146
- }
147
- if (strategy === 'throttle') {
148
- let last = 0;
149
- return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => {
150
- const now = Date.now();
151
- if (now - last >= ms) {
152
- last = now;
153
- cb(s, meta);
154
- }
155
- };
156
- }
157
- return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => cb(s, meta);
158
- }, [onSizeChange, sizeUpdate, sizeUpdateMs]);
159
-
160
- // Register with shell
161
- const sidebarId = React.useId();
162
- React.useEffect(() => {
163
- setHasSidebar(true);
164
- return () => {
165
- setHasSidebar(false);
166
- };
167
- }, [setHasSidebar, sidebarId]);
168
-
169
- // Dev guards
170
- const wasControlledRef = React.useRef<boolean | null>(null);
171
- if (process.env.NODE_ENV !== 'production') {
172
- if (typeof state !== 'undefined' && typeof defaultState !== 'undefined') {
173
- console.error('Shell.Sidebar: Do not pass both `state` and `defaultState`. Choose one.');
174
- }
175
- if (typeof size !== 'undefined' && typeof defaultSize !== 'undefined') {
176
- console.error('Shell.Sidebar: Do not pass both `size` and `defaultSize`. Choose one.');
177
- }
178
- }
179
-
180
- // Warn on mode switch between controlled/uncontrolled
181
- React.useEffect(() => {
182
- const isControlled = typeof state !== 'undefined';
183
- if (wasControlledRef.current === null) {
184
- wasControlledRef.current = isControlled;
185
- return;
186
- }
187
- if (wasControlledRef.current !== isControlled) {
188
- console.warn('Shell.Sidebar: Switching between controlled and uncontrolled `state` is not supported.');
189
- wasControlledRef.current = isControlled;
190
- }
191
- }, [state]);
192
-
193
- // Stable ref for onStateChange to avoid effect dep churn
194
- const onStateChangeRef = React.useRef(onStateChange);
195
- const stateRef = React.useRef(state);
196
- React.useLayoutEffect(() => {
197
- onStateChangeRef.current = onStateChange;
198
- stateRef.current = state;
199
- });
200
-
201
- // Resolve responsive controlled state at top level
202
- const stateIsResponsive = typeof state === 'object' && state !== null;
203
- const { resolvedControlled: resolvedSidebarControlled, resolvedDefault: resolvedSidebarDefault } = useResponsiveInitialState<SidebarMode>({
204
- controlledValue: state,
205
- defaultValue: defaultState,
206
- currentValue: sidebarMode as SidebarMode,
207
- setValue: setSidebarMode,
208
- breakpointReady: currentBreakpointReady,
209
- controlledIsResponsive: stateIsResponsive,
210
- onResponsiveChange: (next) => onStateChangeRef.current?.(next, { reason: 'responsive' }),
211
- onInit: (initial) => onStateChangeRef.current?.(initial, { reason: 'init' }),
90
+ id,
91
+ ...domProps
92
+ } = props;
93
+
94
+ const { table, attributes } = usePresentationTable(presentation, 'fixed');
95
+ const pane = usePane({
96
+ name: 'sidebar',
97
+ label: 'Sidebar',
98
+ propNames: SIDEBAR_PROP_NAMES,
99
+ id,
100
+ controlled: modeToValue(state),
101
+ defaultValue: modeToValue(defaultState),
102
+ presentationTable: table,
103
+ builtIn: navigationRest,
104
+ onChange: (value, reason) => onStateChange?.(toMode(value), { reason }),
105
+ toggleNext: toggleModes === 'single' ? toggleSingle : toggleBoth,
106
+ onExpand,
107
+ onCollapse,
108
+ size: expandedSize,
212
109
  });
110
+ useInsetRegistration('sidebar', inset);
213
111
 
214
- // Emit mode changes. In controlled mode, skip when mode matches the controlled prop.
215
- const lastNotifyModeRef = React.useRef<SidebarMode | null>(null);
216
- const lastResolvedSidebarControlledRef = React.useRef<SidebarMode | undefined>(undefined);
217
112
  React.useEffect(() => {
218
- const current = sidebarMode as SidebarMode;
219
- const prevMode = lastNotifyModeRef.current;
220
- const prevResolvedControlled = lastResolvedSidebarControlledRef.current;
221
- const controlledChanged = prevResolvedControlled !== resolvedSidebarControlled;
222
-
223
- if (prevMode !== null && prevMode !== current) {
224
- const isControlled = typeof stateRef.current !== 'undefined';
225
-
226
- if (!isControlled || (!controlledChanged && current !== resolvedSidebarControlled)) {
227
- onStateChangeRef.current?.(current, { reason: 'toggle' });
228
- }
229
- }
230
-
231
- lastNotifyModeRef.current = current;
232
- lastResolvedSidebarControlledRef.current = resolvedSidebarControlled;
233
- }, [sidebarMode, resolvedSidebarControlled]);
234
-
235
- // Track previous mode to only fire callbacks on actual user-initiated state transitions.
236
- // We wait for breakpointReady to ensure the initial state sync from useResponsiveInitialState
237
- // is complete before enabling callbacks. This avoids spurious callbacks during initialization.
238
- // Use callback refs to avoid re-running effect when inline callbacks change.
239
- const onExpandRef = React.useRef(onExpand);
240
- const onCollapseRef = React.useRef(onCollapse);
241
- React.useLayoutEffect(() => {
242
- onExpandRef.current = onExpand;
243
- onCollapseRef.current = onCollapse;
113
+ if (snapPoints !== undefined || collapseThreshold !== undefined || paneId !== undefined || persistence !== undefined) {
114
+ warnOnce('Shell.Sidebar: `snapPoints`, `collapseThreshold`, `paneId` and `persistence` are deprecated and are removed in 1.0. Keep the size in your own state with `size`/`onSizeChange`.');
115
+ }
116
+ }, [snapPoints, collapseThreshold, paneId, persistence]);
117
+
118
+ const elementRef = React.useRef<HTMLElement | null>(null);
119
+ const composedRef = useComposedRefs(ref, pane.setElement, elementRef);
120
+
121
+ const resize = useResizablePane({
122
+ name: 'sidebar',
123
+ elementId: pane.id,
124
+ elementRef,
125
+ cssVarName: '--sidebar-size',
126
+ orientation: 'vertical',
127
+ edge: 'end',
128
+ growth: startAnchoredGrowth,
129
+ expandedSize,
130
+ minSize,
131
+ maxSize,
132
+ resizable,
133
+ collapsible,
134
+ size,
135
+ defaultSize,
136
+ onSizeChange,
137
+ sizeUpdate,
138
+ sizeUpdateMs,
139
+ onResize,
140
+ onResizeStart,
141
+ onResizeEnd,
142
+ snapPoints,
143
+ snapTolerance,
144
+ collapseThreshold,
145
+ paneId,
146
+ persistence,
147
+ overlaying: pane.overlaying,
148
+ overlayingNow: () => table[readBreakpoint()] === 'overlay',
149
+ requestCollapse: () => pane.setValue('closed', 'toggle'),
150
+ requestToggle: () => pane.toggle('toggle'),
244
151
  });
245
152
 
246
- const prevSidebarModeRef = React.useRef<SidebarMode | null>(null);
247
- const hasInitializedRef = React.useRef(false);
248
- React.useEffect(() => {
249
- const currentMode = sidebarMode as SidebarMode;
250
-
251
- // Wait for breakpoint to be ready before enabling callbacks
252
- if (!currentBreakpointReady) {
253
- prevSidebarModeRef.current = currentMode;
254
- return;
255
- }
256
-
257
- // Skip the first run after breakpoint is ready - this captures the post-sync state
258
- if (!hasInitializedRef.current) {
259
- hasInitializedRef.current = true;
260
- prevSidebarModeRef.current = currentMode;
261
- return;
262
- }
263
-
264
- const prevMode = prevSidebarModeRef.current;
265
-
266
- // Only fire on actual state transitions
267
- if (prevMode !== null && prevMode !== currentMode) {
268
- // onExpand: when becoming visible (collapsed → thin/expanded)
269
- if (prevMode === 'collapsed' && currentMode !== 'collapsed') {
270
- onExpandRef.current?.();
271
- }
272
- // onCollapse: when becoming hidden (any → collapsed)
273
- else if (currentMode === 'collapsed') {
274
- onCollapseRef.current?.();
275
- }
276
- prevSidebarModeRef.current = currentMode;
277
- }
278
- }, [sidebarMode, currentBreakpointReady]);
279
-
280
- // Option A: thin is width-only; content remains visible whenever not collapsed
281
- const isContentVisible = sidebarMode !== 'collapsed';
282
-
283
- // Default persistence if paneId provided and none supplied (fixed only)
284
- const persistenceAdapter = React.useMemo(() => {
285
- if (!paneId || persistence) return persistence;
286
- const key = `kookie-ui:shell:sidebar:${paneId}`;
287
- const adapter: PaneSizePersistence = {
288
- load: () => {
289
- if (typeof window === 'undefined') return undefined;
290
- try {
291
- const v = window.localStorage.getItem(key);
292
- return v ? Number(v) : undefined;
293
- } catch (err) {
294
- if (process.env.NODE_ENV !== 'production') {
295
- console.warn('Shell.Sidebar: failed to load persisted size', err);
296
- }
297
- return undefined;
298
- }
299
- },
300
- save: (size: number) => {
301
- if (typeof window === 'undefined') return;
302
- try {
303
- window.localStorage.setItem(key, String(size));
304
- } catch (err) {
305
- if (process.env.NODE_ENV !== 'production') {
306
- console.warn('Shell.Sidebar: failed to save persisted size', err);
307
- }
308
- }
309
- },
310
- };
311
- return adapter;
312
- }, [paneId, persistence]);
313
-
314
- React.useEffect(() => {
315
- let mounted = true;
316
- (async () => {
317
- if (!resizable || !persistenceAdapter?.load || isOverlay) return;
318
- const loaded = await persistenceAdapter.load();
319
- if (mounted && typeof loaded === 'number' && localRef.current) {
320
- localRef.current.style.setProperty('--sidebar-size', `${loaded}px`);
321
- onResize?.(loaded);
322
- }
323
- })();
324
- return () => {
325
- mounted = false;
326
- };
327
- }, [resizable, persistenceAdapter, onResize, isOverlay]);
328
-
329
- // Register custom toggle behavior based on toggleModes (both|single)
330
- const resolveDefaultSidebarMode = React.useCallback((): SidebarMode => {
331
- const resolved = resolvedSidebarDefault ?? (typeof defaultState === 'string' ? defaultState : undefined) ?? 'expanded';
332
- return resolved === 'thin' || resolved === 'expanded' ? resolved : 'expanded';
333
- }, [resolvedSidebarDefault, defaultState]);
334
-
335
- React.useEffect(() => {
336
- if (!setSidebarToggleComputer) return;
337
- const strategy: 'both' | 'single' = toggleModes ?? 'both';
338
- const compute = (current: SidebarMode): SidebarMode => {
339
- if (strategy === 'both') {
340
- if (current === 'collapsed') return 'thin';
341
- if (current === 'thin') return 'expanded';
342
- return 'collapsed';
343
- }
344
- const target = resolveDefaultSidebarMode();
345
- if (current === 'collapsed') return target;
346
- if (current === target) return 'collapsed';
347
- return target;
348
- };
349
- setSidebarToggleComputer(compute);
350
- return () => {
351
- setSidebarToggleComputer?.((cur) => (cur === 'collapsed' ? 'thin' : cur === 'thin' ? 'expanded' : 'collapsed'));
352
- };
353
- }, [setSidebarToggleComputer, toggleModes, resolveDefaultSidebarMode]);
354
-
355
- const lastOverlayWidthRef = React.useRef<number>(expandedSize);
356
- const lastOverlayModeRef = React.useRef<SidebarMode>('expanded');
357
- React.useEffect(() => {
358
- if (sidebarMode !== 'collapsed') {
359
- lastOverlayModeRef.current = sidebarMode as SidebarMode;
360
- lastOverlayWidthRef.current = sidebarMode === 'thin' ? thinSize : expandedSize;
361
- }
362
- }, [sidebarMode, thinSize, expandedSize]);
363
-
364
- // Remove responsive default mode behavior entirely
365
-
366
- const handleEl =
367
- resizable && !isOverlay && sidebarMode === 'expanded' ? (
368
- <PaneResizeContext.Provider
369
- value={{
370
- containerRef: localRef,
371
- cssVarName: '--sidebar-size',
372
- minSize,
373
- maxSize,
374
- defaultSize: expandedSize,
375
- orientation: 'vertical',
376
- edge: 'end',
377
- computeNext: (client, startClient, startSize) => {
378
- const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';
379
- const delta = client - startClient;
380
- return startSize + (isRtl ? -delta : delta);
381
- },
382
- onResize,
383
- onResizeStart,
384
- onResizeEnd: (size) => {
385
- onResizeEnd?.(size);
386
- emitSizeChange(size, { reason: 'resize' });
387
- persistenceAdapter?.save?.(size);
388
- },
389
- target: 'sidebar',
390
- collapsible,
391
- snapPoints,
392
- snapTolerance: snapTolerance ?? 8,
393
- collapseThreshold,
394
- requestCollapse: () => setSidebarMode('collapsed'),
395
- requestToggle: () => togglePane('sidebar'),
396
- }}
397
- >
398
- {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}
399
- </PaneResizeContext.Provider>
153
+ const { handles, content } = splitHandles(children, SidebarHandle);
154
+ // A thin sidebar has no handle: the thin width is a mode, not a size.
155
+ const handle =
156
+ resizable && pane.value !== 'closed' && pane.value !== 'thin' && !pane.overlaying ? (
157
+ <PaneResizeContext.Provider value={resize}>{handles.length > 0 ? handles : <PaneHandle />}</PaneResizeContext.Provider>
400
158
  ) : null;
401
159
 
402
- // Normalize CSS lengths to px helper
403
- const normalizeSizeToPx = React.useCallback((value: number | string | undefined) => normalizeToPx(value, 'horizontal'), []);
404
-
405
- // Apply defaultSize on mount when uncontrolled
406
- React.useEffect(() => {
407
- if (!localRef.current) return;
408
- if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {
409
- const px = normalizeSizeToPx(defaultSize);
410
- if (typeof px === 'number' && Number.isFinite(px)) {
411
- const minPx = typeof minSize === 'number' ? minSize : undefined;
412
- const maxPx = typeof maxSize === 'number' ? maxSize : undefined;
413
- const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));
414
- localRef.current.style.setProperty('--sidebar-size', `${clamped}px`);
415
- emitSizeChange(clamped, { reason: 'init' });
416
- }
417
- }
418
- // eslint-disable-next-line react-hooks/exhaustive-deps
419
- }, []);
420
-
421
- // Controlled size sync
422
- const controlledSize = size;
423
- React.useEffect(() => {
424
- if (!localRef.current) return;
425
- if (typeof controlledSize === 'undefined') return;
426
- const px = normalizeSizeToPx(controlledSize);
427
- if (typeof px === 'number' && Number.isFinite(px)) {
428
- const minPx = typeof minSize === 'number' ? minSize : undefined;
429
- const maxPx = typeof maxSize === 'number' ? maxSize : undefined;
430
- const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));
431
- localRef.current.style.setProperty('--sidebar-size', `${clamped}px`);
432
- emitSizeChange(clamped, { reason: 'controlled' });
433
- }
434
- }, [controlledSize, minSize, maxSize, normalizeSizeToPx, emitSizeChange]);
160
+ // A peek previews the width the next toggle would open to.
161
+ const peekWidth = pane.peeking
162
+ ? (toggleModes === 'single' ? toggleSingle : toggleBoth)('closed', pane.defaultHereNow()) === 'thin'
163
+ ? `${thinSize}px`
164
+ : `var(--sidebar-size, ${expandedSize}px)`
165
+ : undefined;
435
166
 
436
- // Memoize peek styles to avoid IIFE recreation on every render
437
- const peekStyles = React.useMemo((): CSSPropertiesWithVars | undefined => {
438
- if (!(peekTarget === 'sidebar' && sidebarMode === 'collapsed' && !isOverlay)) {
439
- return undefined;
440
- }
441
- const strategy: 'both' | 'single' = toggleModes ?? 'both';
442
- const current = sidebarMode as SidebarMode;
443
- let next: SidebarMode;
444
- if (strategy === 'both') {
445
- next = current === 'collapsed' ? 'thin' : current === 'thin' ? 'expanded' : 'collapsed';
446
- } else {
447
- const target = resolveDefaultSidebarMode();
448
- next = current === 'collapsed' ? target : 'collapsed';
449
- }
450
- if (next === 'thin') {
451
- return { '--peek-sidebar-width': `${thinSize}px` } as CSSPropertiesWithVars;
452
- }
453
- return { '--peek-sidebar-width': `var(--sidebar-size, ${expandedSize}px)` } as CSSPropertiesWithVars;
454
- }, [peekTarget, sidebarMode, isOverlay, toggleModes, resolveDefaultSidebarMode, thinSize, expandedSize]);
455
-
456
- if (isOverlay) {
457
- const open = sidebarMode !== 'collapsed';
458
- return (
459
- <Sheet.Root open={open} onOpenChange={(o) => setSidebarMode(o ? 'expanded' : 'collapsed')}>
460
- <Sheet.Content
461
- side="start"
462
- style={{ padding: 0 }}
463
- aria-label="Navigation"
464
- aria-describedby={undefined}
465
- width={{
466
- initial: `${open ? (sidebarMode === 'thin' ? thinSize : expandedSize) : lastOverlayWidthRef.current}px`,
467
- }}
468
- >
469
- <VisuallyHidden>
470
- <Sheet.Title>Navigation</Sheet.Title>
471
- </VisuallyHidden>
472
- {contentChildren}
473
- </Sheet.Content>
474
- </Sheet.Root>
475
- );
476
- }
477
167
  return (
478
168
  <div
479
- {...sidebarDomProps}
480
- ref={setRef}
481
- className={classNames('rt-ShellSidebar', className)}
482
- data-mode={sidebarMode}
483
- data-peek={peekTarget === 'sidebar' || undefined}
484
- data-presentation={currentBreakpointReady ? resolvedPresentation : undefined}
485
- data-open={(currentBreakpointReady && isStacked && isContentVisible) || undefined}
169
+ {...withoutRemovedPaneProps(domProps)}
170
+ id={pane.id}
171
+ ref={composedRef}
172
+ className={classNames('rt-ShellPane', 'rt-ShellSidebar', className)}
173
+ {...paneAttributes(pane, attributes)}
486
174
  data-inset={inset || undefined}
487
- style={{
488
- ...style,
489
- '--sidebar-size': `${expandedSize}px`,
490
- '--sidebar-thin-size': `${thinSize}px`,
491
- '--sidebar-min-size': `${minSize}px`,
492
- '--sidebar-max-size': `${maxSize}px`,
493
- ...peekStyles,
494
- } as CSSPropertiesWithVars}
175
+ tabIndex={pane.overlaying ? -1 : domProps.tabIndex}
176
+ style={
177
+ {
178
+ ...style,
179
+ '--sidebar-expanded-size': `${expandedSize}px`,
180
+ '--sidebar-thin-size': `${thinSize}px`,
181
+ '--sidebar-min-size': `${minSize}px`,
182
+ '--sidebar-max-size': `${maxSize}px`,
183
+ ...(peekWidth ? { '--peek-sidebar-width': peekWidth } : {}),
184
+ } as CSSPropertiesWithVars
185
+ }
495
186
  >
496
- <div className="rt-ShellSidebarContent" data-visible={isContentVisible || undefined}>
497
- {contentChildren}
498
- </div>
499
- {handleEl}
187
+ <div className="rt-ShellSidebarContent">{content}</div>
188
+ {handle}
500
189
  </div>
501
190
  );
502
191
  }) as SidebarComponent;