@kushagradhawan/kookie-ui 0.3.21 → 0.3.23

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 (548) hide show
  1. package/components.css +264 -329
  2. package/dist/cjs/components/_internal/base-button.d.ts.map +1 -1
  3. package/dist/cjs/components/_internal/base-button.js +1 -1
  4. package/dist/cjs/components/_internal/base-button.js.map +4 -4
  5. package/dist/cjs/components/_internal/dropdown-menu-drill-down.js +1 -1
  6. package/dist/cjs/components/_internal/dropdown-menu-drill-down.js.map +3 -3
  7. package/dist/cjs/components/_internal/shell-bottom.js +1 -1
  8. package/dist/cjs/components/_internal/shell-bottom.js.map +4 -4
  9. package/dist/cjs/components/_internal/shell-handles.d.ts.map +1 -1
  10. package/dist/cjs/components/_internal/shell-handles.js +1 -1
  11. package/dist/cjs/components/_internal/shell-handles.js.map +3 -3
  12. package/dist/cjs/components/_internal/shell-inspector.js +1 -1
  13. package/dist/cjs/components/_internal/shell-inspector.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.map +1 -1
  17. package/dist/cjs/components/accordion.js +1 -1
  18. package/dist/cjs/components/accordion.js.map +4 -4
  19. package/dist/cjs/components/alert-dialog.d.ts.map +1 -1
  20. package/dist/cjs/components/alert-dialog.js +1 -1
  21. package/dist/cjs/components/alert-dialog.js.map +4 -4
  22. package/dist/cjs/components/avatar.js +1 -1
  23. package/dist/cjs/components/avatar.js.map +4 -4
  24. package/dist/cjs/components/badge.d.ts.map +1 -1
  25. package/dist/cjs/components/badge.js +1 -1
  26. package/dist/cjs/components/badge.js.map +4 -4
  27. package/dist/cjs/components/blockquote.js +1 -1
  28. package/dist/cjs/components/blockquote.js.map +4 -4
  29. package/dist/cjs/components/box.js +1 -1
  30. package/dist/cjs/components/box.js.map +4 -4
  31. package/dist/cjs/components/button.js +1 -1
  32. package/dist/cjs/components/button.js.map +4 -4
  33. package/dist/cjs/components/callout.js +1 -1
  34. package/dist/cjs/components/callout.js.map +4 -4
  35. package/dist/cjs/components/card.js +1 -1
  36. package/dist/cjs/components/card.js.map +4 -4
  37. package/dist/cjs/components/chatbar.js +2 -2
  38. package/dist/cjs/components/chatbar.js.map +4 -4
  39. package/dist/cjs/components/checkbox-cards.js +1 -1
  40. package/dist/cjs/components/checkbox-cards.js.map +4 -4
  41. package/dist/cjs/components/checkbox-group.js +1 -1
  42. package/dist/cjs/components/checkbox-group.js.map +4 -4
  43. package/dist/cjs/components/checkbox.js +1 -1
  44. package/dist/cjs/components/checkbox.js.map +4 -4
  45. package/dist/cjs/components/code.js +1 -1
  46. package/dist/cjs/components/code.js.map +4 -4
  47. package/dist/cjs/components/combobox.js +1 -1
  48. package/dist/cjs/components/combobox.js.map +4 -4
  49. package/dist/cjs/components/container.js +1 -1
  50. package/dist/cjs/components/container.js.map +4 -4
  51. package/dist/cjs/components/context-menu.d.ts.map +1 -1
  52. package/dist/cjs/components/context-menu.js +1 -1
  53. package/dist/cjs/components/context-menu.js.map +4 -4
  54. package/dist/cjs/components/data-list.js +1 -1
  55. package/dist/cjs/components/data-list.js.map +4 -4
  56. package/dist/cjs/components/dialog.d.ts.map +1 -1
  57. package/dist/cjs/components/dialog.js +1 -1
  58. package/dist/cjs/components/dialog.js.map +4 -4
  59. package/dist/cjs/components/dropdown-menu.d.ts.map +1 -1
  60. package/dist/cjs/components/dropdown-menu.js +1 -1
  61. package/dist/cjs/components/dropdown-menu.js.map +4 -4
  62. package/dist/cjs/components/em.js +1 -1
  63. package/dist/cjs/components/em.js.map +4 -4
  64. package/dist/cjs/components/flex.js +1 -1
  65. package/dist/cjs/components/flex.js.map +4 -4
  66. package/dist/cjs/components/grid.js +1 -1
  67. package/dist/cjs/components/grid.js.map +4 -4
  68. package/dist/cjs/components/heading.js +1 -1
  69. package/dist/cjs/components/heading.js.map +4 -4
  70. package/dist/cjs/components/hover-card.js +1 -1
  71. package/dist/cjs/components/hover-card.js.map +4 -4
  72. package/dist/cjs/components/icon-button.js +2 -2
  73. package/dist/cjs/components/icon-button.js.map +4 -4
  74. package/dist/cjs/components/image.js +1 -1
  75. package/dist/cjs/components/image.js.map +4 -4
  76. package/dist/cjs/components/index.js +5 -5
  77. package/dist/cjs/components/index.js.map +4 -4
  78. package/dist/cjs/components/inset.js +1 -1
  79. package/dist/cjs/components/inset.js.map +4 -4
  80. package/dist/cjs/components/kbd.js +1 -1
  81. package/dist/cjs/components/kbd.js.map +4 -4
  82. package/dist/cjs/components/link.js +1 -1
  83. package/dist/cjs/components/link.js.map +4 -4
  84. package/dist/cjs/components/navbar.js +1 -1
  85. package/dist/cjs/components/navbar.js.map +4 -4
  86. package/dist/cjs/components/popover.js +1 -1
  87. package/dist/cjs/components/popover.js.map +4 -4
  88. package/dist/cjs/components/progress.js +1 -1
  89. package/dist/cjs/components/progress.js.map +4 -4
  90. package/dist/cjs/components/quote.js +1 -1
  91. package/dist/cjs/components/quote.js.map +4 -4
  92. package/dist/cjs/components/radio-cards.js +1 -1
  93. package/dist/cjs/components/radio-cards.js.map +4 -4
  94. package/dist/cjs/components/radio-group.js +1 -1
  95. package/dist/cjs/components/radio-group.js.map +4 -4
  96. package/dist/cjs/components/radio.js +1 -1
  97. package/dist/cjs/components/radio.js.map +4 -4
  98. package/dist/cjs/components/schemas/base-button.schema.d.ts +2 -2
  99. package/dist/cjs/components/schemas/button.schema.d.ts +2 -2
  100. package/dist/cjs/components/schemas/icon-button.schema.d.ts +4 -4
  101. package/dist/cjs/components/schemas/shell.schema.d.ts +2 -2
  102. package/dist/cjs/components/schemas/toggle-button.schema.d.ts +6 -6
  103. package/dist/cjs/components/schemas/toggle-icon-button.schema.d.ts +8 -8
  104. package/dist/cjs/components/scroll-area.js +1 -1
  105. package/dist/cjs/components/scroll-area.js.map +4 -4
  106. package/dist/cjs/components/section.js +1 -1
  107. package/dist/cjs/components/section.js.map +4 -4
  108. package/dist/cjs/components/segmented-control.js +1 -1
  109. package/dist/cjs/components/segmented-control.js.map +4 -4
  110. package/dist/cjs/components/select.js +1 -1
  111. package/dist/cjs/components/select.js.map +4 -4
  112. package/dist/cjs/components/separator.js +1 -1
  113. package/dist/cjs/components/separator.js.map +4 -4
  114. package/dist/cjs/components/sheet.d.ts.map +1 -1
  115. package/dist/cjs/components/sheet.js +1 -1
  116. package/dist/cjs/components/sheet.js.map +4 -4
  117. package/dist/cjs/components/shell.d.ts.map +1 -1
  118. package/dist/cjs/components/shell.js +1 -1
  119. package/dist/cjs/components/shell.js.map +4 -4
  120. package/dist/cjs/components/sidebar.js +1 -1
  121. package/dist/cjs/components/sidebar.js.map +4 -4
  122. package/dist/cjs/components/skeleton.js +1 -1
  123. package/dist/cjs/components/skeleton.js.map +4 -4
  124. package/dist/cjs/components/slider.js +1 -1
  125. package/dist/cjs/components/slider.js.map +4 -4
  126. package/dist/cjs/components/spinner.js +1 -1
  127. package/dist/cjs/components/spinner.js.map +4 -4
  128. package/dist/cjs/components/strong.js +1 -1
  129. package/dist/cjs/components/strong.js.map +4 -4
  130. package/dist/cjs/components/switch.js +1 -1
  131. package/dist/cjs/components/switch.js.map +4 -4
  132. package/dist/cjs/components/tab-nav.js +1 -1
  133. package/dist/cjs/components/tab-nav.js.map +4 -4
  134. package/dist/cjs/components/table.js +1 -1
  135. package/dist/cjs/components/table.js.map +4 -4
  136. package/dist/cjs/components/tabs.js +1 -1
  137. package/dist/cjs/components/tabs.js.map +4 -4
  138. package/dist/cjs/components/text-area.js +1 -1
  139. package/dist/cjs/components/text-area.js.map +4 -4
  140. package/dist/cjs/components/text-field.js +2 -2
  141. package/dist/cjs/components/text-field.js.map +4 -4
  142. package/dist/cjs/components/text.js +1 -1
  143. package/dist/cjs/components/text.js.map +4 -4
  144. package/dist/cjs/components/theme-panel.js +3 -3
  145. package/dist/cjs/components/theme-panel.js.map +4 -4
  146. package/dist/cjs/components/theme.d.ts.map +1 -1
  147. package/dist/cjs/components/theme.js +1 -1
  148. package/dist/cjs/components/theme.js.map +4 -4
  149. package/dist/cjs/components/toggle-button.js +2 -2
  150. package/dist/cjs/components/toggle-button.js.map +4 -4
  151. package/dist/cjs/components/toggle-icon-button.js +3 -3
  152. package/dist/cjs/components/toggle-icon-button.js.map +4 -4
  153. package/dist/cjs/components/toolbar.js +1 -1
  154. package/dist/cjs/components/toolbar.js.map +4 -4
  155. package/dist/cjs/components/tooltip.js +1 -1
  156. package/dist/cjs/components/tooltip.js.map +4 -4
  157. package/dist/cjs/components/user-card.js +1 -1
  158. package/dist/cjs/components/user-card.js.map +4 -4
  159. package/dist/cjs/helpers/compile-prop-defs.d.ts +49 -0
  160. package/dist/cjs/helpers/compile-prop-defs.d.ts.map +1 -0
  161. package/dist/cjs/helpers/compile-prop-defs.js +2 -0
  162. package/dist/cjs/helpers/compile-prop-defs.js.map +7 -0
  163. package/dist/cjs/helpers/extract-props.d.ts.map +1 -1
  164. package/dist/cjs/helpers/extract-props.js +1 -1
  165. package/dist/cjs/helpers/extract-props.js.map +4 -4
  166. package/dist/cjs/helpers/get-margin-styles.d.ts.map +1 -1
  167. package/dist/cjs/helpers/get-margin-styles.js +1 -1
  168. package/dist/cjs/helpers/get-margin-styles.js.map +3 -3
  169. package/dist/cjs/helpers/get-responsive-styles.d.ts +5 -2
  170. package/dist/cjs/helpers/get-responsive-styles.d.ts.map +1 -1
  171. package/dist/cjs/helpers/get-responsive-styles.js +1 -1
  172. package/dist/cjs/helpers/get-responsive-styles.js.map +3 -3
  173. package/dist/cjs/helpers/index.js +2 -2
  174. package/dist/cjs/helpers/index.js.map +4 -4
  175. package/dist/cjs/helpers/use-deprecation-warning.d.ts +10 -0
  176. package/dist/cjs/helpers/use-deprecation-warning.d.ts.map +1 -0
  177. package/dist/cjs/helpers/use-deprecation-warning.js +2 -0
  178. package/dist/cjs/helpers/use-deprecation-warning.js.map +7 -0
  179. package/dist/cjs/hooks/index.js +2 -2
  180. package/dist/cjs/hooks/index.js.map +3 -3
  181. package/dist/cjs/hooks/use-body-pointer-events-cleanup.d.ts.map +1 -1
  182. package/dist/cjs/hooks/use-body-pointer-events-cleanup.js +1 -1
  183. package/dist/cjs/hooks/use-body-pointer-events-cleanup.js.map +3 -3
  184. package/dist/cjs/hooks/use-breakpoint.d.ts +7 -3
  185. package/dist/cjs/hooks/use-breakpoint.d.ts.map +1 -1
  186. package/dist/cjs/hooks/use-breakpoint.js +1 -1
  187. package/dist/cjs/hooks/use-breakpoint.js.map +3 -3
  188. package/dist/cjs/hooks/use-prop-synced-state.d.ts +14 -0
  189. package/dist/cjs/hooks/use-prop-synced-state.d.ts.map +1 -0
  190. package/dist/cjs/hooks/use-prop-synced-state.js +2 -0
  191. package/dist/cjs/hooks/use-prop-synced-state.js.map +7 -0
  192. package/dist/cjs/index.js +5 -5
  193. package/dist/cjs/index.js.map +4 -4
  194. package/dist/esm/{chunk-RQ2ZPMHJ.js → chunk-22HGLMPQ.js} +2 -2
  195. package/dist/esm/{chunk-WYA4IRU6.js → chunk-25WZA7ZU.js} +2 -2
  196. package/dist/esm/chunk-2UPAYDKR.js +2 -0
  197. package/dist/esm/chunk-2UPAYDKR.js.map +7 -0
  198. package/dist/esm/{chunk-XHQGMOXV.js → chunk-36ZQVP7F.js} +2 -2
  199. package/dist/esm/{chunk-K3R4AH3E.js → chunk-3MWWP4MW.js} +2 -2
  200. package/dist/esm/{chunk-HQ35PM4O.js → chunk-43A5GUSI.js} +2 -2
  201. package/dist/esm/{chunk-Z5DQ6FSA.js → chunk-4AQTUBVP.js} +2 -2
  202. package/dist/esm/{chunk-25U7DENY.js → chunk-4BBOHEF4.js} +2 -2
  203. package/dist/esm/chunk-4CKDU6FY.js +2 -0
  204. package/dist/esm/chunk-4CKDU6FY.js.map +7 -0
  205. package/dist/esm/{chunk-ZSEFZM5H.js → chunk-4IY2PR6N.js} +2 -2
  206. package/dist/esm/{chunk-QLIELX4I.js → chunk-4ME6O27S.js} +2 -2
  207. package/dist/esm/chunk-4XJY6FIK.js +2 -0
  208. package/dist/esm/chunk-4XJY6FIK.js.map +7 -0
  209. package/dist/esm/{chunk-JQOFJNCV.js → chunk-4YFJWXL2.js} +2 -2
  210. package/dist/esm/{chunk-DNI4QRXQ.js → chunk-5IBGFL6O.js} +2 -2
  211. package/dist/esm/chunk-5TXQLK4G.js +2 -0
  212. package/dist/esm/chunk-5TXQLK4G.js.map +7 -0
  213. package/dist/esm/{chunk-IPJUHVM6.js → chunk-666GX7O5.js} +2 -2
  214. package/dist/esm/chunk-6FLLFCBU.js +2 -0
  215. package/dist/esm/chunk-6FLLFCBU.js.map +7 -0
  216. package/dist/esm/{chunk-DJBPM5QK.js → chunk-7FC7HF76.js} +2 -2
  217. package/dist/esm/{chunk-SVLY6B5F.js → chunk-7QDTSBJF.js} +2 -2
  218. package/dist/esm/chunk-AX5S56DS.js +2 -0
  219. package/dist/esm/chunk-AX5S56DS.js.map +7 -0
  220. package/dist/esm/{chunk-DK5MHD6I.js → chunk-B24BDVG2.js} +2 -2
  221. package/dist/esm/{chunk-WZCZHCVE.js → chunk-BJYUPIXO.js} +2 -2
  222. package/dist/esm/{chunk-BJTJUIYJ.js → chunk-CRWYCLTE.js} +2 -2
  223. package/dist/esm/{chunk-OHJVFZMH.js → chunk-CSKZZOI2.js} +2 -2
  224. package/dist/esm/chunk-D5N627TH.js +2 -0
  225. package/dist/esm/chunk-D5N627TH.js.map +7 -0
  226. package/dist/esm/{chunk-ADYTQCZX.js → chunk-D6B7IMZU.js} +2 -2
  227. package/dist/esm/chunk-DL2O3GKG.js +2 -0
  228. package/dist/esm/chunk-DL2O3GKG.js.map +7 -0
  229. package/dist/esm/{chunk-USGTBZ43.js → chunk-E67CIG6A.js} +2 -2
  230. package/dist/esm/{chunk-42HFGCHX.js → chunk-ETMLMDW4.js} +2 -2
  231. package/dist/esm/{chunk-7CBAHIVG.js → chunk-F2HYQ3ZR.js} +2 -2
  232. package/dist/esm/{chunk-YUZPSUJE.js → chunk-F7IYL2VW.js} +2 -2
  233. package/dist/esm/{chunk-FVCWNSRU.js → chunk-FHOCUZDR.js} +2 -2
  234. package/dist/esm/{chunk-7MURQ6CR.js → chunk-FLFAXVFB.js} +2 -2
  235. package/dist/esm/{chunk-APRBRAOT.js → chunk-FOEZLQTW.js} +2 -2
  236. package/dist/esm/{chunk-WNSPLWRV.js → chunk-GJSGKE7B.js} +2 -2
  237. package/dist/esm/{chunk-OGOOZLUD.js → chunk-GLERJXVS.js} +2 -2
  238. package/dist/esm/{chunk-6VGPTAHM.js → chunk-GWXVETMF.js} +2 -2
  239. package/dist/esm/{chunk-ES7MK2MM.js → chunk-GYBLXQ4R.js} +2 -2
  240. package/dist/esm/{chunk-4OBMRJHC.js → chunk-H7ST535H.js} +2 -2
  241. package/dist/esm/{chunk-QLZ5XAW6.js → chunk-HF5WY5YE.js} +2 -2
  242. package/dist/esm/chunk-ICIGZ3N7.js +2 -0
  243. package/dist/esm/chunk-ICIGZ3N7.js.map +7 -0
  244. package/dist/esm/{chunk-RDP4UQ42.js → chunk-IEWCQU2S.js} +2 -2
  245. package/dist/esm/{chunk-XLOHPURR.js → chunk-IHK3H2OM.js} +2 -2
  246. package/dist/esm/{chunk-3F6I7YOR.js → chunk-JDGJSNWT.js} +2 -2
  247. package/dist/esm/chunk-JQQIPEGY.js +2 -0
  248. package/dist/esm/chunk-JQQIPEGY.js.map +7 -0
  249. package/dist/esm/chunk-JR2YOGII.js +2 -0
  250. package/dist/esm/chunk-JR2YOGII.js.map +7 -0
  251. package/dist/esm/chunk-JUY7CBSL.js +2 -0
  252. package/dist/esm/chunk-JUY7CBSL.js.map +7 -0
  253. package/dist/esm/{chunk-VF5TRT3H.js → chunk-KKM6T5P7.js} +2 -2
  254. package/dist/esm/{chunk-ZHYOJNWV.js → chunk-LKAK5GXF.js} +2 -2
  255. package/dist/esm/chunk-LOGJJF4I.js +2 -0
  256. package/dist/esm/chunk-LOGJJF4I.js.map +7 -0
  257. package/dist/esm/{chunk-JCYI4NTV.js → chunk-MBCBP73P.js} +2 -2
  258. package/dist/esm/{chunk-UYNYUR7O.js → chunk-MBE2YSBU.js} +2 -2
  259. package/dist/esm/chunk-MHANZINI.js +2 -0
  260. package/dist/esm/chunk-MHANZINI.js.map +7 -0
  261. package/dist/esm/chunk-MRECKC4D.js +2 -0
  262. package/dist/esm/chunk-MRECKC4D.js.map +7 -0
  263. package/dist/esm/{chunk-H2G446JG.js → chunk-NMKPFUNP.js} +2 -2
  264. package/dist/esm/{chunk-4N5JU7XQ.js → chunk-O3CDWEZA.js} +2 -2
  265. package/dist/esm/{chunk-TEULZKBM.js → chunk-OGXZHAQL.js} +2 -2
  266. package/dist/esm/{chunk-2AEELIG6.js → chunk-OWAUCLRT.js} +2 -2
  267. package/dist/esm/{chunk-7CXVHFMQ.js → chunk-P7HYVJSU.js} +2 -2
  268. package/dist/esm/{chunk-4532RT2B.js → chunk-P7IAHW4V.js} +2 -2
  269. package/dist/esm/{chunk-M3ZYJANH.js → chunk-PQZXQ4ST.js} +2 -2
  270. package/dist/esm/{chunk-SGU4HUHF.js → chunk-PTLFMWCN.js} +2 -2
  271. package/dist/esm/chunk-S2HA3W3V.js +2 -0
  272. package/dist/esm/chunk-S2HA3W3V.js.map +7 -0
  273. package/dist/esm/{chunk-E6IWYD3U.js → chunk-S5C5YRBS.js} +2 -2
  274. package/dist/esm/{chunk-A24PYRVV.js → chunk-SO67YEVQ.js} +2 -2
  275. package/dist/esm/chunk-TLWTUKKL.js +2 -0
  276. package/dist/esm/chunk-TLWTUKKL.js.map +7 -0
  277. package/dist/esm/{chunk-HACQF6F4.js → chunk-TOOSHJOA.js} +2 -2
  278. package/dist/esm/{chunk-QOWA5LK5.js → chunk-U2X2CAW4.js} +2 -2
  279. package/dist/esm/{chunk-U7AASKZI.js → chunk-UVCH7QKO.js} +2 -2
  280. package/dist/esm/{chunk-GWYFT3EI.js → chunk-VLO7NXSP.js} +2 -2
  281. package/dist/esm/{chunk-DXI5P5O4.js → chunk-VX6ARMWP.js} +2 -2
  282. package/dist/esm/chunk-WAURCNAS.js +2 -0
  283. package/dist/esm/chunk-WAURCNAS.js.map +7 -0
  284. package/dist/esm/{chunk-EJWAAFCI.js → chunk-WO43WW3A.js} +2 -2
  285. package/dist/esm/{chunk-GLC4QJBF.js → chunk-WTYNFBFV.js} +2 -2
  286. package/dist/esm/{chunk-6FAICIYS.js → chunk-XMRIRFM7.js} +2 -2
  287. package/dist/esm/chunk-YV2KYHGR.js +2 -0
  288. package/dist/esm/chunk-YV2KYHGR.js.map +7 -0
  289. package/dist/esm/{chunk-UIEUZLZZ.js → chunk-ZY6SQWHT.js} +2 -2
  290. package/dist/esm/components/_internal/base-button.d.ts.map +1 -1
  291. package/dist/esm/components/_internal/base-button.js +1 -1
  292. package/dist/esm/components/_internal/dropdown-menu-drill-down.js +1 -1
  293. package/dist/esm/components/_internal/shell-bottom.js +1 -1
  294. package/dist/esm/components/_internal/shell-handles.d.ts.map +1 -1
  295. package/dist/esm/components/_internal/shell-handles.js +1 -1
  296. package/dist/esm/components/_internal/shell-inspector.js +1 -1
  297. package/dist/esm/components/_internal/shell-sidebar.js +1 -1
  298. package/dist/esm/components/accordion.d.ts.map +1 -1
  299. package/dist/esm/components/accordion.js +1 -1
  300. package/dist/esm/components/alert-dialog.d.ts.map +1 -1
  301. package/dist/esm/components/alert-dialog.js +1 -1
  302. package/dist/esm/components/avatar.js +1 -1
  303. package/dist/esm/components/badge.d.ts.map +1 -1
  304. package/dist/esm/components/badge.js +1 -1
  305. package/dist/esm/components/blockquote.js +1 -1
  306. package/dist/esm/components/box.js +1 -1
  307. package/dist/esm/components/button.js +1 -1
  308. package/dist/esm/components/callout.js +1 -1
  309. package/dist/esm/components/card.js +1 -1
  310. package/dist/esm/components/chatbar.js +1 -1
  311. package/dist/esm/components/checkbox-cards.js +1 -1
  312. package/dist/esm/components/checkbox-group.js +1 -1
  313. package/dist/esm/components/checkbox.js +1 -1
  314. package/dist/esm/components/code.js +1 -1
  315. package/dist/esm/components/combobox.js +1 -1
  316. package/dist/esm/components/container.js +1 -1
  317. package/dist/esm/components/context-menu.d.ts.map +1 -1
  318. package/dist/esm/components/context-menu.js +1 -1
  319. package/dist/esm/components/data-list.js +1 -1
  320. package/dist/esm/components/dialog.d.ts.map +1 -1
  321. package/dist/esm/components/dialog.js +1 -1
  322. package/dist/esm/components/dropdown-menu.d.ts.map +1 -1
  323. package/dist/esm/components/dropdown-menu.js +1 -1
  324. package/dist/esm/components/em.js +1 -1
  325. package/dist/esm/components/flex.js +1 -1
  326. package/dist/esm/components/grid.js +1 -1
  327. package/dist/esm/components/heading.js +1 -1
  328. package/dist/esm/components/hover-card.js +1 -1
  329. package/dist/esm/components/icon-button.js +1 -1
  330. package/dist/esm/components/image.js +1 -1
  331. package/dist/esm/components/index.js +1 -1
  332. package/dist/esm/components/inset.js +1 -1
  333. package/dist/esm/components/kbd.js +1 -1
  334. package/dist/esm/components/link.js +1 -1
  335. package/dist/esm/components/navbar.js +1 -1
  336. package/dist/esm/components/popover.js +1 -1
  337. package/dist/esm/components/progress.js +1 -1
  338. package/dist/esm/components/quote.js +1 -1
  339. package/dist/esm/components/radio-cards.js +1 -1
  340. package/dist/esm/components/radio-group.js +1 -1
  341. package/dist/esm/components/radio.js +1 -1
  342. package/dist/esm/components/schemas/base-button.schema.d.ts +2 -2
  343. package/dist/esm/components/schemas/button.schema.d.ts +2 -2
  344. package/dist/esm/components/schemas/icon-button.schema.d.ts +4 -4
  345. package/dist/esm/components/schemas/shell.schema.d.ts +2 -2
  346. package/dist/esm/components/schemas/toggle-button.schema.d.ts +6 -6
  347. package/dist/esm/components/schemas/toggle-icon-button.schema.d.ts +8 -8
  348. package/dist/esm/components/scroll-area.js +1 -1
  349. package/dist/esm/components/section.js +1 -1
  350. package/dist/esm/components/segmented-control.js +1 -1
  351. package/dist/esm/components/select.js +1 -1
  352. package/dist/esm/components/separator.js +1 -1
  353. package/dist/esm/components/sheet.d.ts.map +1 -1
  354. package/dist/esm/components/sheet.js +1 -1
  355. package/dist/esm/components/shell.d.ts.map +1 -1
  356. package/dist/esm/components/shell.js +1 -1
  357. package/dist/esm/components/sidebar.js +1 -1
  358. package/dist/esm/components/skeleton.js +1 -1
  359. package/dist/esm/components/slider.js +1 -1
  360. package/dist/esm/components/spinner.js +1 -1
  361. package/dist/esm/components/strong.js +1 -1
  362. package/dist/esm/components/switch.js +1 -1
  363. package/dist/esm/components/tab-nav.js +1 -1
  364. package/dist/esm/components/table.js +1 -1
  365. package/dist/esm/components/tabs.js +1 -1
  366. package/dist/esm/components/text-area.js +1 -1
  367. package/dist/esm/components/text-field.js +1 -1
  368. package/dist/esm/components/text.js +1 -1
  369. package/dist/esm/components/theme-panel.js +1 -1
  370. package/dist/esm/components/theme.d.ts.map +1 -1
  371. package/dist/esm/components/theme.js +1 -1
  372. package/dist/esm/components/toggle-button.js +1 -1
  373. package/dist/esm/components/toggle-icon-button.js +1 -1
  374. package/dist/esm/components/toolbar.js +1 -1
  375. package/dist/esm/components/tooltip.js +1 -1
  376. package/dist/esm/components/user-card.js +1 -1
  377. package/dist/esm/helpers/compile-prop-defs.d.ts +49 -0
  378. package/dist/esm/helpers/compile-prop-defs.d.ts.map +1 -0
  379. package/dist/esm/helpers/compile-prop-defs.js +2 -0
  380. package/dist/esm/helpers/compile-prop-defs.js.map +7 -0
  381. package/dist/esm/helpers/extract-props.d.ts.map +1 -1
  382. package/dist/esm/helpers/extract-props.js +1 -1
  383. package/dist/esm/helpers/get-margin-styles.d.ts.map +1 -1
  384. package/dist/esm/helpers/get-margin-styles.js +1 -1
  385. package/dist/esm/helpers/get-responsive-styles.d.ts +5 -2
  386. package/dist/esm/helpers/get-responsive-styles.d.ts.map +1 -1
  387. package/dist/esm/helpers/get-responsive-styles.js +1 -1
  388. package/dist/esm/helpers/index.js +1 -1
  389. package/dist/esm/helpers/use-deprecation-warning.d.ts +10 -0
  390. package/dist/esm/helpers/use-deprecation-warning.d.ts.map +1 -0
  391. package/dist/esm/helpers/use-deprecation-warning.js +2 -0
  392. package/dist/esm/helpers/use-deprecation-warning.js.map +7 -0
  393. package/dist/esm/hooks/index.js +1 -1
  394. package/dist/esm/hooks/use-body-pointer-events-cleanup.d.ts.map +1 -1
  395. package/dist/esm/hooks/use-body-pointer-events-cleanup.js +1 -1
  396. package/dist/esm/hooks/use-breakpoint.d.ts +7 -3
  397. package/dist/esm/hooks/use-breakpoint.d.ts.map +1 -1
  398. package/dist/esm/hooks/use-breakpoint.js +1 -1
  399. package/dist/esm/hooks/use-prop-synced-state.d.ts +14 -0
  400. package/dist/esm/hooks/use-prop-synced-state.d.ts.map +1 -0
  401. package/dist/esm/hooks/use-prop-synced-state.js +2 -0
  402. package/dist/esm/hooks/use-prop-synced-state.js.map +7 -0
  403. package/dist/esm/index.js +1 -1
  404. package/package.json +2 -1
  405. package/schemas/base-button.json +0 -1
  406. package/schemas/button.json +0 -1
  407. package/schemas/icon-button.json +0 -1
  408. package/schemas/index.json +0 -6
  409. package/schemas/toggle-button.json +0 -1
  410. package/schemas/toggle-icon-button.json +0 -1
  411. package/src/components/_internal/base-button.css +2 -2
  412. package/src/components/_internal/base-button.tsx +3 -58
  413. package/src/components/_internal/base-card.css +19 -4
  414. package/src/components/_internal/base-checkbox.css +2 -2
  415. package/src/components/_internal/base-dialog.css +7 -13
  416. package/src/components/_internal/base-menu.css +7 -0
  417. package/src/components/_internal/base-radio.css +2 -2
  418. package/src/components/_internal/base-sidebar.css +7 -0
  419. package/src/components/_internal/base-tab-list.css +2 -2
  420. package/src/components/_internal/shell-handles.tsx +27 -0
  421. package/src/components/accordion.css +6 -6
  422. package/src/components/accordion.tsx +2 -8
  423. package/src/components/alert-dialog.tsx +22 -20
  424. package/src/components/avatar.css +2 -2
  425. package/src/components/badge.css +2 -2
  426. package/src/components/badge.tsx +2 -8
  427. package/src/components/callout.css +2 -2
  428. package/src/components/chatbar.css +1 -1
  429. package/src/components/context-menu.tsx +2 -8
  430. package/src/components/dialog.tsx +46 -72
  431. package/src/components/dropdown-menu.tsx +2 -8
  432. package/src/components/popover.css +7 -0
  433. package/src/components/progress.css +21 -8
  434. package/src/components/segmented-control.css +2 -2
  435. package/src/components/select.css +9 -2
  436. package/src/components/sheet.tsx +31 -28
  437. package/src/components/shell.css +106 -69
  438. package/src/components/shell.tsx +168 -97
  439. package/src/components/slider.css +2 -2
  440. package/src/components/switch.css +2 -2
  441. package/src/components/table.css +7 -0
  442. package/src/components/text-area.css +2 -2
  443. package/src/components/text-field.css +2 -2
  444. package/src/components/theme.tsx +35 -34
  445. package/src/helpers/compile-prop-defs.ts +121 -0
  446. package/src/helpers/extract-props.ts +104 -83
  447. package/src/helpers/get-margin-styles.ts +38 -71
  448. package/src/helpers/get-responsive-styles.ts +37 -38
  449. package/src/helpers/use-deprecation-warning.ts +26 -0
  450. package/src/hooks/use-body-pointer-events-cleanup.ts +36 -6
  451. package/src/hooks/use-breakpoint.ts +94 -53
  452. package/src/hooks/use-prop-synced-state.ts +24 -0
  453. package/src/styles/tokens/blur.css +28 -0
  454. package/src/styles/tokens/color.css +3 -3
  455. package/src/styles/tokens/constants.css +11 -0
  456. package/styles.css +280 -332
  457. package/tokens/base.css +13 -3
  458. package/tokens.css +16 -3
  459. package/dist/esm/chunk-2SS3FA3N.js +0 -2
  460. package/dist/esm/chunk-2SS3FA3N.js.map +0 -7
  461. package/dist/esm/chunk-5U2Q23K3.js +0 -2
  462. package/dist/esm/chunk-5U2Q23K3.js.map +0 -7
  463. package/dist/esm/chunk-6ELPYR73.js +0 -2
  464. package/dist/esm/chunk-6ELPYR73.js.map +0 -7
  465. package/dist/esm/chunk-DZ4H2KTP.js +0 -2
  466. package/dist/esm/chunk-DZ4H2KTP.js.map +0 -7
  467. package/dist/esm/chunk-H4MMVAGQ.js +0 -2
  468. package/dist/esm/chunk-H4MMVAGQ.js.map +0 -7
  469. package/dist/esm/chunk-HURTSXRY.js +0 -2
  470. package/dist/esm/chunk-HURTSXRY.js.map +0 -7
  471. package/dist/esm/chunk-ITRVKLYU.js +0 -2
  472. package/dist/esm/chunk-ITRVKLYU.js.map +0 -7
  473. package/dist/esm/chunk-KCAFSCOV.js +0 -2
  474. package/dist/esm/chunk-KCAFSCOV.js.map +0 -7
  475. package/dist/esm/chunk-KMPBTEZH.js +0 -2
  476. package/dist/esm/chunk-KMPBTEZH.js.map +0 -7
  477. package/dist/esm/chunk-LN5SP46K.js +0 -2
  478. package/dist/esm/chunk-LN5SP46K.js.map +0 -7
  479. package/dist/esm/chunk-Q73Y5O5P.js +0 -2
  480. package/dist/esm/chunk-Q73Y5O5P.js.map +0 -7
  481. package/dist/esm/chunk-RMBS6CAO.js +0 -2
  482. package/dist/esm/chunk-RMBS6CAO.js.map +0 -7
  483. package/dist/esm/chunk-UUX42HBM.js +0 -2
  484. package/dist/esm/chunk-UUX42HBM.js.map +0 -7
  485. package/dist/esm/chunk-X7BD5FLE.js +0 -2
  486. package/dist/esm/chunk-X7BD5FLE.js.map +0 -7
  487. package/dist/esm/chunk-YEA646GM.js +0 -2
  488. package/dist/esm/chunk-YEA646GM.js.map +0 -7
  489. package/dist/esm/chunk-ZMEXIPWM.js +0 -2
  490. package/dist/esm/chunk-ZMEXIPWM.js.map +0 -7
  491. /package/dist/esm/{chunk-RQ2ZPMHJ.js.map → chunk-22HGLMPQ.js.map} +0 -0
  492. /package/dist/esm/{chunk-WYA4IRU6.js.map → chunk-25WZA7ZU.js.map} +0 -0
  493. /package/dist/esm/{chunk-XHQGMOXV.js.map → chunk-36ZQVP7F.js.map} +0 -0
  494. /package/dist/esm/{chunk-K3R4AH3E.js.map → chunk-3MWWP4MW.js.map} +0 -0
  495. /package/dist/esm/{chunk-HQ35PM4O.js.map → chunk-43A5GUSI.js.map} +0 -0
  496. /package/dist/esm/{chunk-Z5DQ6FSA.js.map → chunk-4AQTUBVP.js.map} +0 -0
  497. /package/dist/esm/{chunk-25U7DENY.js.map → chunk-4BBOHEF4.js.map} +0 -0
  498. /package/dist/esm/{chunk-ZSEFZM5H.js.map → chunk-4IY2PR6N.js.map} +0 -0
  499. /package/dist/esm/{chunk-QLIELX4I.js.map → chunk-4ME6O27S.js.map} +0 -0
  500. /package/dist/esm/{chunk-JQOFJNCV.js.map → chunk-4YFJWXL2.js.map} +0 -0
  501. /package/dist/esm/{chunk-DNI4QRXQ.js.map → chunk-5IBGFL6O.js.map} +0 -0
  502. /package/dist/esm/{chunk-IPJUHVM6.js.map → chunk-666GX7O5.js.map} +0 -0
  503. /package/dist/esm/{chunk-DJBPM5QK.js.map → chunk-7FC7HF76.js.map} +0 -0
  504. /package/dist/esm/{chunk-SVLY6B5F.js.map → chunk-7QDTSBJF.js.map} +0 -0
  505. /package/dist/esm/{chunk-DK5MHD6I.js.map → chunk-B24BDVG2.js.map} +0 -0
  506. /package/dist/esm/{chunk-WZCZHCVE.js.map → chunk-BJYUPIXO.js.map} +0 -0
  507. /package/dist/esm/{chunk-BJTJUIYJ.js.map → chunk-CRWYCLTE.js.map} +0 -0
  508. /package/dist/esm/{chunk-OHJVFZMH.js.map → chunk-CSKZZOI2.js.map} +0 -0
  509. /package/dist/esm/{chunk-ADYTQCZX.js.map → chunk-D6B7IMZU.js.map} +0 -0
  510. /package/dist/esm/{chunk-USGTBZ43.js.map → chunk-E67CIG6A.js.map} +0 -0
  511. /package/dist/esm/{chunk-42HFGCHX.js.map → chunk-ETMLMDW4.js.map} +0 -0
  512. /package/dist/esm/{chunk-7CBAHIVG.js.map → chunk-F2HYQ3ZR.js.map} +0 -0
  513. /package/dist/esm/{chunk-YUZPSUJE.js.map → chunk-F7IYL2VW.js.map} +0 -0
  514. /package/dist/esm/{chunk-FVCWNSRU.js.map → chunk-FHOCUZDR.js.map} +0 -0
  515. /package/dist/esm/{chunk-7MURQ6CR.js.map → chunk-FLFAXVFB.js.map} +0 -0
  516. /package/dist/esm/{chunk-APRBRAOT.js.map → chunk-FOEZLQTW.js.map} +0 -0
  517. /package/dist/esm/{chunk-WNSPLWRV.js.map → chunk-GJSGKE7B.js.map} +0 -0
  518. /package/dist/esm/{chunk-OGOOZLUD.js.map → chunk-GLERJXVS.js.map} +0 -0
  519. /package/dist/esm/{chunk-6VGPTAHM.js.map → chunk-GWXVETMF.js.map} +0 -0
  520. /package/dist/esm/{chunk-ES7MK2MM.js.map → chunk-GYBLXQ4R.js.map} +0 -0
  521. /package/dist/esm/{chunk-4OBMRJHC.js.map → chunk-H7ST535H.js.map} +0 -0
  522. /package/dist/esm/{chunk-QLZ5XAW6.js.map → chunk-HF5WY5YE.js.map} +0 -0
  523. /package/dist/esm/{chunk-RDP4UQ42.js.map → chunk-IEWCQU2S.js.map} +0 -0
  524. /package/dist/esm/{chunk-XLOHPURR.js.map → chunk-IHK3H2OM.js.map} +0 -0
  525. /package/dist/esm/{chunk-3F6I7YOR.js.map → chunk-JDGJSNWT.js.map} +0 -0
  526. /package/dist/esm/{chunk-VF5TRT3H.js.map → chunk-KKM6T5P7.js.map} +0 -0
  527. /package/dist/esm/{chunk-ZHYOJNWV.js.map → chunk-LKAK5GXF.js.map} +0 -0
  528. /package/dist/esm/{chunk-JCYI4NTV.js.map → chunk-MBCBP73P.js.map} +0 -0
  529. /package/dist/esm/{chunk-UYNYUR7O.js.map → chunk-MBE2YSBU.js.map} +0 -0
  530. /package/dist/esm/{chunk-H2G446JG.js.map → chunk-NMKPFUNP.js.map} +0 -0
  531. /package/dist/esm/{chunk-4N5JU7XQ.js.map → chunk-O3CDWEZA.js.map} +0 -0
  532. /package/dist/esm/{chunk-TEULZKBM.js.map → chunk-OGXZHAQL.js.map} +0 -0
  533. /package/dist/esm/{chunk-2AEELIG6.js.map → chunk-OWAUCLRT.js.map} +0 -0
  534. /package/dist/esm/{chunk-7CXVHFMQ.js.map → chunk-P7HYVJSU.js.map} +0 -0
  535. /package/dist/esm/{chunk-4532RT2B.js.map → chunk-P7IAHW4V.js.map} +0 -0
  536. /package/dist/esm/{chunk-M3ZYJANH.js.map → chunk-PQZXQ4ST.js.map} +0 -0
  537. /package/dist/esm/{chunk-SGU4HUHF.js.map → chunk-PTLFMWCN.js.map} +0 -0
  538. /package/dist/esm/{chunk-E6IWYD3U.js.map → chunk-S5C5YRBS.js.map} +0 -0
  539. /package/dist/esm/{chunk-A24PYRVV.js.map → chunk-SO67YEVQ.js.map} +0 -0
  540. /package/dist/esm/{chunk-HACQF6F4.js.map → chunk-TOOSHJOA.js.map} +0 -0
  541. /package/dist/esm/{chunk-QOWA5LK5.js.map → chunk-U2X2CAW4.js.map} +0 -0
  542. /package/dist/esm/{chunk-U7AASKZI.js.map → chunk-UVCH7QKO.js.map} +0 -0
  543. /package/dist/esm/{chunk-GWYFT3EI.js.map → chunk-VLO7NXSP.js.map} +0 -0
  544. /package/dist/esm/{chunk-DXI5P5O4.js.map → chunk-VX6ARMWP.js.map} +0 -0
  545. /package/dist/esm/{chunk-EJWAAFCI.js.map → chunk-WO43WW3A.js.map} +0 -0
  546. /package/dist/esm/{chunk-GLC4QJBF.js.map → chunk-WTYNFBFV.js.map} +0 -0
  547. /package/dist/esm/{chunk-6FAICIYS.js.map → chunk-XMRIRFM7.js.map} +0 -0
  548. /package/dist/esm/{chunk-UIEUZLZZ.js.map → chunk-ZY6SQWHT.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/components/shell.tsx", "../../../src/components/sheet.tsx", "../../../src/props/as-child.prop.ts", "../../../src/props/width.props.ts", "../../../src/props/height.props.ts", "../../../src/components/dialog.props.tsx", "../../../src/components/theme.tsx", "../../../src/helpers/get-matching-gray-color.ts", "../../../src/props/color.prop.ts", "../../../src/props/radius.prop.ts", "../../../src/components/theme.props.tsx", "../../../src/components/heading.tsx", "../../../src/props/high-contrast.prop.ts", "../../../src/props/leading-trim.prop.ts", "../../../src/props/text-align.prop.ts", "../../../src/props/text-wrap.prop.ts", "../../../src/props/truncate.prop.ts", "../../../src/props/font-family.prop.ts", "../../../src/props/weight.prop.ts", "../../../src/components/heading.props.tsx", "../../../src/helpers/extract-props.ts", "../../../src/props/prop-def.ts", "../../../src/helpers/has-own-property.ts", "../../../src/helpers/is-responsive-object.ts", "../../../src/helpers/get-responsive-styles.ts", "../../../src/helpers/merge-styles.ts", "../../../src/props/margin.props.ts", "../../../src/components/text.tsx", "../../../src/components/text.props.tsx", "../../../src/helpers/require-react-element.ts", "../../../src/hooks/use-body-pointer-events-cleanup.ts", "../../../src/components/visually-hidden.tsx", "../../../src/components/shell.hooks.ts", "../../../src/components/shell.types.ts", "../../../src/components/shell.context.tsx", "../../../src/components/_internal/shell-resize.tsx", "../../../src/components/_internal/shell-handles.tsx", "../../../src/components/_internal/shell-prop-helpers.ts", "../../../src/components/_internal/shell-sidebar.tsx", "../../../src/helpers/normalize-to-px.ts", "../../../src/components/_internal/shell-bottom.tsx", "../../../src/components/_internal/shell-inspector.tsx", "../../../src/hooks/use-breakpoint.ts"],
4
- "sourcesContent": ["/**\n * Shell Component - Layout Engine + Chrome\n *\n * Philosophy:\n * - Shell = layout engine + chrome\n * - Manages layout state: expanded/collapsed, fixed/overlay, sizes\n * - Does not manage content/navigation state\n * - Provides unstyled primitives (slots, triggers)\n * - Enforces composition rules (Rail \u2194 Panel dependency, Sidebar exclusivity)\n *\n * Core Slots:\n * - Header: global top bar\n * - Rail: slim nav strip\n * - Panel: sidebar next to rail\n * - Sidebar: alternative to Rail+Panel (exclusive)\n * - Content: main work area\n * - Inspector: right-side panel\n * - Bottom: bottom panel\n *\n * Composition Rules:\n * - Rail + Panel: valid together (Rail collapse \u2192 Panel collapse)\n * - Sidebar: cannot coexist with Rail or Panel\n * - Content: always required\n * - Inspector/Bottom: optional, independent\n */\n'use client';\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from './sheet.js';\nimport { VisuallyHidden } from './visually-hidden.js';\nimport { useResponsivePresentation, useResponsiveInitialState } from './shell.hooks.js';\nimport { PaneResizeContext } from './_internal/shell-resize.js';\nimport { PaneHandle, PanelHandle } from './_internal/shell-handles.js';\nimport { omitPaneProps, extractPaneDomProps, mapResponsiveBooleanToPaneMode } from './_internal/shell-prop-helpers.js';\nimport { Sidebar } from './_internal/shell-sidebar.js';\nimport { Bottom } from './_internal/shell-bottom.js';\nimport { Inspector } from './_internal/shell-inspector.js';\nimport type { PresentationValue, ResponsivePresentation, PaneMode, SidebarMode, PaneSizePersistence, Breakpoint, PaneTarget, Responsive, PaneBaseProps, CSSPropertiesWithVars } from './shell.types.js';\nimport { normalizeToPx } from '../helpers/normalize-to-px.js';\nimport { useBreakpoint } from '../hooks/use-breakpoint.js';\nimport {\n ShellProvider,\n useShell,\n LeftModeContext,\n useLeftMode,\n PanelModeContext,\n usePanelMode,\n SidebarModeContext,\n useSidebarMode,\n InspectorModeContext,\n useInspectorMode,\n BottomModeContext,\n useBottomMode,\n PresentationContext,\n PeekContext,\n usePeek,\n ActionsContext,\n useShellActions,\n CompositionContext,\n InsetContext,\n useInset,\n type InsetPaneId,\n} from './shell.context.js';\n\n// Shell context is provided via ShellProvider (see shell.context.tsx)\n\n// Pane resize context moved to ./_internal/shell-resize\n\n// Local PaneHandle moved to ./_internal/shell-handles\n// Removed local PaneHandle implementation; using internal PaneHandle\n\n// Composed Handle wrappers per pane\n// Handles moved to ./_internal/shell-handles\n\n// Hook to resolve responsive presentation\n// useResponsivePresentation moved to shell.hooks.ts\n\n// Hook to resolve responsive mode defaults\n// Removed: defaultMode responsiveness\n\n// useBreakpoint hook moved to ../hooks/use-breakpoint.ts\n\n// Reducer-based pane state management to simplify cascading rules\ntype PaneState = {\n leftMode: PaneMode;\n panelMode: PaneMode;\n sidebarMode: SidebarMode;\n inspectorMode: PaneMode;\n bottomMode: PaneMode;\n};\n\ntype PaneAction =\n | { type: 'SET_LEFT_MODE'; mode: PaneMode }\n | { type: 'SET_PANEL_MODE'; mode: PaneMode }\n | { type: 'SET_SIDEBAR_MODE'; mode: SidebarMode }\n | { type: 'SET_INSPECTOR_MODE'; mode: PaneMode }\n | { type: 'SET_BOTTOM_MODE'; mode: PaneMode }\n | { type: 'TOGGLE_PANE'; target: PaneTarget }\n | { type: 'EXPAND_PANE'; target: PaneTarget }\n | { type: 'COLLAPSE_PANE'; target: PaneTarget };\n\nconst SHELL_SLOT = Symbol('rtShellSlot');\n\nfunction assignShellSlot<T extends React.ComponentType<any>>(component: T, slot: string): T {\n (component as any)[SHELL_SLOT] = slot;\n return component;\n}\n\n/**\n * Check if an element matches a component by type or displayName.\n * Uses displayName comparison to handle minification scenarios.\n */\nconst isShellComponentType = (el: React.ReactElement, comp: React.ComponentType & { displayName?: string }): boolean =>\n React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n\n// Tag imported slot components so isType remains stable after minification\nassignShellSlot(Sidebar as any, 'Shell.Sidebar');\nassignShellSlot(Inspector as any, 'Shell.Inspector');\nassignShellSlot(Bottom as any, 'Shell.Bottom');\n\nfunction paneReducer(state: PaneState, action: PaneAction): PaneState {\n switch (action.type) {\n case 'SET_LEFT_MODE': {\n if (action.mode === 'collapsed') {\n if (state.leftMode === 'collapsed' && state.panelMode === 'collapsed') return state;\n return { ...state, leftMode: 'collapsed', panelMode: 'collapsed' };\n }\n if (state.leftMode === action.mode) return state;\n return { ...state, leftMode: action.mode };\n }\n case 'SET_PANEL_MODE': {\n if (action.mode === 'expanded' && state.leftMode !== 'expanded') {\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n }\n if (state.panelMode === action.mode) return state;\n return { ...state, panelMode: action.mode };\n }\n case 'SET_SIDEBAR_MODE':\n if (state.sidebarMode === action.mode) return state;\n return { ...state, sidebarMode: action.mode };\n case 'SET_INSPECTOR_MODE':\n if (state.inspectorMode === action.mode) return state;\n return { ...state, inspectorMode: action.mode };\n case 'SET_BOTTOM_MODE':\n if (state.bottomMode === action.mode) return state;\n return { ...state, bottomMode: action.mode };\n case 'TOGGLE_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n return { ...state, leftMode: state.leftMode === 'expanded' ? 'collapsed' : 'expanded', panelMode: state.leftMode === 'expanded' ? 'collapsed' : state.panelMode };\n case 'panel': {\n if (state.leftMode === 'collapsed') {\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n }\n return { ...state, panelMode: state.panelMode === 'expanded' ? 'collapsed' : 'expanded' };\n }\n case 'sidebar': {\n const next: SidebarMode = state.sidebarMode === 'collapsed' ? 'expanded' : state.sidebarMode === 'expanded' ? 'collapsed' : 'expanded';\n return { ...state, sidebarMode: next };\n }\n case 'inspector':\n return { ...state, inspectorMode: state.inspectorMode === 'expanded' ? 'collapsed' : 'expanded' };\n case 'bottom':\n return { ...state, bottomMode: state.bottomMode === 'expanded' ? 'collapsed' : 'expanded' };\n default:\n return state;\n }\n }\n case 'EXPAND_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n if (state.leftMode === 'expanded') return state;\n return { ...state, leftMode: 'expanded' };\n case 'panel':\n if (state.leftMode === 'expanded' && state.panelMode === 'expanded') return state;\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n case 'sidebar':\n if (state.sidebarMode === 'expanded') return state;\n return { ...state, sidebarMode: 'expanded' };\n case 'inspector':\n if (state.inspectorMode === 'expanded') return state;\n return { ...state, inspectorMode: 'expanded' };\n case 'bottom':\n if (state.bottomMode === 'expanded') return state;\n return { ...state, bottomMode: 'expanded' };\n default:\n return state;\n }\n }\n case 'COLLAPSE_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n if (state.leftMode === 'collapsed' && state.panelMode === 'collapsed') return state;\n return { ...state, leftMode: 'collapsed', panelMode: 'collapsed' };\n case 'panel':\n if (state.panelMode === 'collapsed') return state;\n return { ...state, panelMode: 'collapsed' };\n case 'sidebar':\n if (state.sidebarMode === 'collapsed') return state;\n return { ...state, sidebarMode: 'collapsed' };\n case 'inspector':\n if (state.inspectorMode === 'collapsed') return state;\n return { ...state, inspectorMode: 'collapsed' };\n case 'bottom':\n if (state.bottomMode === 'collapsed') return state;\n return { ...state, bottomMode: 'collapsed' };\n default:\n return state;\n }\n }\n }\n return state;\n}\n\n// Root Component\ninterface ShellRootProps extends React.ComponentPropsWithoutRef<'div'> {\n children: React.ReactNode;\n height?: 'full' | 'auto' | string | number;\n}\n\nconst Root = React.forwardRef<HTMLDivElement, ShellRootProps>(({ className, children, height = 'full', ...props }, ref) => {\n const { breakpoint: currentBreakpoint, ready: currentBreakpointReady } = useBreakpoint();\n\n // Store hasPanelDefaultOpen for use in passthrough props (computed once during lazy init)\n const hasPanelDefaultOpenRef = React.useRef<boolean>(false);\n\n // Pane state management via reducer with lazy initialization\n // This computation only runs once on mount, not on every render\n const [paneState, dispatchPane] = React.useReducer(paneReducer, children, (initialChildren) => {\n const childArray = React.Children.toArray(initialChildren) as React.ReactElement[];\n\n // Compute initial defaults from immediate children (one-time, uncontrolled defaults)\n const hasPanelDefaultOpen = childArray.some(\n (el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Panel' && Boolean((el as any).props?.defaultOpen),\n );\n // Store for use in passthrough props\n hasPanelDefaultOpenRef.current = hasPanelDefaultOpen;\n\n // Rail defaults to open (true) unless explicitly set to false\n // Supports responsive objects: { initial: false, md: true }\n const railEl = childArray.find((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Rail');\n const railDefaultOpen = railEl ? (railEl as any).props?.defaultOpen : undefined;\n const hasRailDefaultOpen = (() => {\n if (!railEl) return false;\n if (railDefaultOpen === undefined) return true; // Default to open\n if (typeof railDefaultOpen === 'boolean') return railDefaultOpen;\n // Responsive object - use 'initial' value, or first defined value, or default true\n if (typeof railDefaultOpen === 'object') {\n return railDefaultOpen.initial ?? Object.values(railDefaultOpen)[0] ?? true;\n }\n return true;\n })();\n\n const hasInspectorDefaultOpen = childArray.some(\n (el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Inspector' && Boolean((el as any).props?.defaultOpen),\n );\n const hasInspectorOpenControlled = childArray.some(\n (el) =>\n React.isValidElement(el) &&\n (el as any).type?.displayName === 'Shell.Inspector' &&\n typeof (el as any).props?.open !== 'undefined' &&\n Boolean((el as any).props?.open),\n );\n\n // Detect Panel controlled open state for initial reducer state\n const hasPanelOpenControlled = childArray.some((el) => {\n if (!React.isValidElement(el) || (el as any).type?.displayName !== 'Shell.Panel') return false;\n const openProp = (el as any).props?.open;\n if (typeof openProp === 'undefined') return false;\n if (typeof openProp === 'boolean') return openProp;\n // Responsive object - check 'initial' or first truthy value\n if (typeof openProp === 'object' && openProp !== null) {\n return openProp.initial ?? Object.values(openProp)[0] ?? false;\n }\n return false;\n });\n\n // Detect Sidebar initial state from props\n const getSidebarInitialState = (): SidebarMode => {\n const sidebarEl = childArray.find((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Sidebar');\n if (!sidebarEl) return 'expanded';\n const sidebarProps = (sidebarEl as any).props;\n // Check controlled state first\n if (typeof sidebarProps?.state !== 'undefined') {\n if (typeof sidebarProps.state === 'string') return sidebarProps.state as SidebarMode;\n // Responsive object - use 'initial' breakpoint or first defined value\n if (typeof sidebarProps.state === 'object') {\n return (sidebarProps.state.initial ?? Object.values(sidebarProps.state)[0] ?? 'expanded') as SidebarMode;\n }\n }\n // Check defaultState\n if (typeof sidebarProps?.defaultState !== 'undefined') {\n if (typeof sidebarProps.defaultState === 'string') return sidebarProps.defaultState as SidebarMode;\n if (typeof sidebarProps.defaultState === 'object') {\n return (sidebarProps.defaultState.initial ?? Object.values(sidebarProps.defaultState)[0] ?? 'expanded') as SidebarMode;\n }\n }\n return 'expanded';\n };\n\n // Detect Bottom initial state from props\n const getBottomInitialState = (): PaneMode => {\n const bottomEl = childArray.find((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Bottom');\n if (!bottomEl) return 'collapsed';\n const bottomProps = (bottomEl as any).props;\n // Check controlled open first\n if (typeof bottomProps?.open !== 'undefined') {\n if (typeof bottomProps.open === 'boolean') return bottomProps.open ? 'expanded' : 'collapsed';\n // Responsive object - use 'initial' breakpoint or first defined value\n if (typeof bottomProps.open === 'object') {\n const val = bottomProps.open.initial ?? Object.values(bottomProps.open)[0];\n return val ? 'expanded' : 'collapsed';\n }\n }\n // Check defaultOpen\n if (typeof bottomProps?.defaultOpen !== 'undefined') {\n return bottomProps.defaultOpen ? 'expanded' : 'collapsed';\n }\n return 'collapsed';\n };\n\n return {\n leftMode: hasPanelDefaultOpen || hasPanelOpenControlled || hasRailDefaultOpen ? 'expanded' : ('collapsed' as PaneMode),\n panelMode: hasPanelDefaultOpen || hasPanelOpenControlled ? 'expanded' : ('collapsed' as PaneMode),\n sidebarMode: getSidebarInitialState(),\n inspectorMode: hasInspectorDefaultOpen || hasInspectorOpenControlled ? 'expanded' : ('collapsed' as PaneMode),\n bottomMode: getBottomInitialState(),\n };\n });\n const setLeftMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_LEFT_MODE', mode }), []);\n const setPanelMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_PANEL_MODE', mode }), []);\n const setSidebarMode = React.useCallback((mode: SidebarMode) => dispatchPane({ type: 'SET_SIDEBAR_MODE', mode }), []);\n const setInspectorMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_INSPECTOR_MODE', mode }), []);\n const setBottomMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_BOTTOM_MODE', mode }), []);\n\n // Removed: defaultMode responsiveness and manual change tracking\n\n // Composition detection\n const [hasLeft, setHasLeft] = React.useState(false);\n const [hasSidebar, setHasSidebar] = React.useState(false);\n\n // Customizable sidebar toggle sequencing\n const sidebarToggleComputerRef = React.useRef<(current: SidebarMode) => SidebarMode>((current) => (current === 'collapsed' ? 'thin' : current === 'thin' ? 'expanded' : 'collapsed'));\n const setSidebarToggleComputer = React.useCallback((fn: (current: SidebarMode) => SidebarMode) => {\n sidebarToggleComputerRef.current = fn;\n }, []);\n\n // Reducer handles left\u2192panel cascade; no effect needed\n\n // Composition validation\n React.useLayoutEffect(() => {\n if (hasSidebar && hasLeft) {\n console.warn('Shell: Sidebar cannot coexist with Rail or Panel. Use either Rail+Panel OR Sidebar.');\n }\n }, [hasSidebar, hasLeft]);\n\n // Left presentation + defaults from children\n const [devLeftPres, setDevLeftPres] = React.useState<PresentationValue | undefined>(undefined);\n const onLeftPres = React.useCallback((p: PresentationValue) => setDevLeftPres(p), []);\n const railDefaultSizeRef = React.useRef<number>(64);\n const panelDefaultSizeRef = React.useRef<number>(288);\n const onRailDefaults = React.useCallback((size: number) => {\n railDefaultSizeRef.current = size;\n }, []);\n const onPanelDefaults = React.useCallback((size: number) => {\n panelDefaultSizeRef.current = size;\n }, []);\n\n // Determine children presence for left composition\n const hasLeftChildren = React.useMemo(() => {\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n return childArray.some((el) => isShellComponentType(el, Rail) || isShellComponentType(el, Panel));\n }, [children]);\n\n const hasSidebarChildren = React.useMemo(() => {\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n return childArray.some((el) => isShellComponentType(el, Sidebar));\n }, [children]);\n\n // Keep a ref to sidebar mode so togglePane doesn't depend on it,\n // preventing ActionsContext churn on every sidebar mode change\n const sidebarModeRef = React.useRef(paneState.sidebarMode);\n sidebarModeRef.current = paneState.sidebarMode;\n\n const togglePane = React.useCallback(\n (target: PaneTarget) => {\n if (target === 'sidebar') {\n const next = sidebarToggleComputerRef.current(sidebarModeRef.current as SidebarMode);\n setSidebarMode(next);\n return;\n }\n dispatchPane({ type: 'TOGGLE_PANE', target });\n },\n [setSidebarMode],\n );\n\n const expandPane = React.useCallback(\n (target: PaneTarget) => {\n if (target === 'sidebar') return setSidebarMode('expanded');\n dispatchPane({ type: 'EXPAND_PANE', target });\n },\n [setSidebarMode],\n );\n\n const collapsePane = React.useCallback(\n (target: PaneTarget) => {\n if (target === 'sidebar') return setSidebarMode('collapsed');\n dispatchPane({ type: 'COLLAPSE_PANE', target });\n },\n [setSidebarMode],\n );\n\n const baseContextValue = React.useMemo(\n () => ({\n leftMode: paneState.leftMode,\n setLeftMode,\n panelMode: paneState.panelMode,\n setPanelMode,\n sidebarMode: paneState.sidebarMode,\n setSidebarMode,\n inspectorMode: paneState.inspectorMode,\n setInspectorMode,\n bottomMode: paneState.bottomMode,\n setBottomMode,\n hasLeft,\n setHasLeft,\n hasSidebar,\n setHasSidebar,\n currentBreakpoint,\n currentBreakpointReady,\n leftResolvedPresentation: devLeftPres,\n togglePane,\n expandPane,\n collapsePane,\n setSidebarToggleComputer,\n onLeftPres,\n onRailDefaults,\n onPanelDefaults,\n }),\n [\n paneState.leftMode,\n setLeftMode,\n paneState.panelMode,\n setPanelMode,\n paneState.sidebarMode,\n setSidebarMode,\n paneState.inspectorMode,\n setInspectorMode,\n paneState.bottomMode,\n setBottomMode,\n hasLeft,\n hasSidebar,\n currentBreakpoint,\n currentBreakpointReady,\n devLeftPres,\n togglePane,\n expandPane,\n collapsePane,\n setSidebarToggleComputer,\n onLeftPres,\n onRailDefaults,\n onPanelDefaults,\n ],\n );\n\n // Organize children by type \u2014 single pass instead of 7 filter calls\n const { headerEls, railEls, panelEls, sidebarEls, contentEls, inspectorEls, bottomEls } = React.useMemo(() => {\n const result = {\n headerEls: [] as React.ReactElement[],\n railEls: [] as React.ReactElement[],\n panelEls: [] as React.ReactElement[],\n sidebarEls: [] as React.ReactElement[],\n contentEls: [] as React.ReactElement[],\n inspectorEls: [] as React.ReactElement[],\n bottomEls: [] as React.ReactElement[],\n };\n for (const el of React.Children.toArray(children) as React.ReactElement[]) {\n if (isShellComponentType(el, Header)) result.headerEls.push(el);\n else if (isShellComponentType(el, Rail)) result.railEls.push(el);\n else if (isShellComponentType(el, Panel)) result.panelEls.push(el);\n else if (isShellComponentType(el, Sidebar)) result.sidebarEls.push(el);\n else if (isShellComponentType(el, Content)) result.contentEls.push(el);\n else if (isShellComponentType(el, Inspector)) result.inspectorEls.push(el);\n else if (isShellComponentType(el, Bottom)) result.bottomEls.push(el);\n }\n return result;\n }, [children]);\n\n // Controlled sync in Root: mirror first Rail/Panel open if provided\n const firstRailOpen = (railEls[0] as any)?.props?.open;\n const resolvedFirstRailOpen = React.useMemo(() => {\n if (typeof firstRailOpen === 'undefined') return undefined;\n if (typeof firstRailOpen === 'boolean') return firstRailOpen;\n if (typeof firstRailOpen !== 'object' || firstRailOpen === null) return Boolean(firstRailOpen);\n\n const responsive = firstRailOpen as Partial<Record<Breakpoint, boolean>>;\n if (responsive[currentBreakpoint] !== undefined) return responsive[currentBreakpoint];\n\n const fallbackOrder: Breakpoint[] = ['xl', 'lg', 'md', 'sm', 'xs', 'initial'];\n const startIdx = fallbackOrder.indexOf(currentBreakpoint);\n for (let i = startIdx + 1; i < fallbackOrder.length; i++) {\n const bp = fallbackOrder[i];\n if (responsive[bp] !== undefined) return responsive[bp];\n }\n return undefined;\n }, [firstRailOpen, currentBreakpoint]);\n\n const firstPanelOpen = (panelEls[0] as any)?.props?.open;\n const resolvedFirstPanelOpen = React.useMemo(() => {\n if (typeof firstPanelOpen === 'undefined') return undefined;\n if (typeof firstPanelOpen === 'boolean') return firstPanelOpen;\n if (typeof firstPanelOpen !== 'object' || firstPanelOpen === null) return Boolean(firstPanelOpen);\n\n const responsive = firstPanelOpen as Partial<Record<Breakpoint, boolean>>;\n if (responsive[currentBreakpoint] !== undefined) return responsive[currentBreakpoint];\n\n const fallbackOrder: Breakpoint[] = ['xl', 'lg', 'md', 'sm', 'xs', 'initial'];\n const startIdx = fallbackOrder.indexOf(currentBreakpoint);\n for (let i = startIdx + 1; i < fallbackOrder.length; i++) {\n const bp = fallbackOrder[i];\n if (responsive[bp] !== undefined) return responsive[bp];\n }\n return undefined;\n }, [firstPanelOpen, currentBreakpoint]);\n\n const controlSeqRef = React.useRef(0);\n const lastRailChangeRef = React.useRef(0);\n const lastPanelChangeRef = React.useRef(0);\n const lastRailOpenRef = React.useRef<boolean | undefined>(resolvedFirstRailOpen);\n const lastPanelOpenRef = React.useRef<boolean | undefined>(resolvedFirstPanelOpen);\n\n React.useLayoutEffect(() => {\n if (resolvedFirstRailOpen === undefined) {\n lastRailOpenRef.current = undefined;\n return;\n }\n if (lastRailOpenRef.current === resolvedFirstRailOpen) return;\n lastRailOpenRef.current = resolvedFirstRailOpen;\n lastRailChangeRef.current = ++controlSeqRef.current;\n }, [resolvedFirstRailOpen]);\n\n React.useLayoutEffect(() => {\n if (resolvedFirstPanelOpen === undefined) {\n lastPanelOpenRef.current = undefined;\n return;\n }\n if (lastPanelOpenRef.current === resolvedFirstPanelOpen) return;\n lastPanelOpenRef.current = resolvedFirstPanelOpen;\n lastPanelChangeRef.current = ++controlSeqRef.current;\n }, [resolvedFirstPanelOpen]);\n\n React.useLayoutEffect(() => {\n if (typeof resolvedFirstRailOpen === 'undefined') return;\n setLeftMode(resolvedFirstRailOpen ? 'expanded' : 'collapsed');\n }, [resolvedFirstRailOpen, setLeftMode]);\n\n const railOnOpenChange = (railEls[0] as any)?.props?.onOpenChange as\n | ((open: boolean, meta: { reason: 'init' | 'toggle' | 'responsive' | 'panel' }) => void)\n | undefined;\n const panelOnOpenChange = (panelEls[0] as any)?.props?.onOpenChange as\n | ((open: boolean, meta: { reason: 'toggle' | 'left' | 'init' | 'responsive' }) => void)\n | undefined;\n const lastConflictRef = React.useRef<{ railSeq: number; panelSeq: number; action: 'open-rail' | 'close-panel' } | null>(null);\n\n React.useLayoutEffect(() => {\n if (resolvedFirstRailOpen !== false || resolvedFirstPanelOpen !== true) {\n lastConflictRef.current = null;\n return;\n }\n\n const panelWins = lastPanelChangeRef.current > lastRailChangeRef.current;\n const action: 'open-rail' | 'close-panel' = panelWins ? 'open-rail' : 'close-panel';\n const lastConflict = lastConflictRef.current;\n if (lastConflict && lastConflict.railSeq === lastRailChangeRef.current && lastConflict.panelSeq === lastPanelChangeRef.current && lastConflict.action === action) {\n return;\n }\n lastConflictRef.current = { railSeq: lastRailChangeRef.current, panelSeq: lastPanelChangeRef.current, action };\n\n if (panelWins) {\n railOnOpenChange?.(true, { reason: 'panel' });\n } else {\n panelOnOpenChange?.(false, { reason: 'left' });\n }\n }, [resolvedFirstRailOpen, resolvedFirstPanelOpen, railOnOpenChange, panelOnOpenChange]);\n\n const leftControlledOpen = resolvedFirstRailOpen;\n\n const heightStyle = React.useMemo(() => {\n if (height === 'full') return { height: '100vh' };\n if (height === 'auto') return { height: 'auto' };\n if (typeof height === 'string') return { height };\n if (typeof height === 'number') return { height: `${height}px` };\n return {};\n }, [height]);\n\n // Peek state (layout-only overlay without mode changes)\n const [peekTarget, setPeekTarget] = React.useState<PaneTarget | null>(null);\n const peekPane = React.useCallback((target: PaneTarget) => setPeekTarget(target), []);\n const clearPeek = React.useCallback(() => setPeekTarget(null), []);\n\n // Memoized slice context values to avoid notifying unrelated consumers\n const presentationCtxValue = React.useMemo(() => ({ currentBreakpoint, currentBreakpointReady, leftResolvedPresentation: devLeftPres }), [currentBreakpoint, currentBreakpointReady, devLeftPres]);\n const leftModeCtxValue = React.useMemo(() => ({ leftMode: paneState.leftMode, setLeftMode }), [paneState.leftMode, setLeftMode]);\n const panelModeCtxValue = React.useMemo(() => ({ panelMode: paneState.panelMode, setPanelMode }), [paneState.panelMode, setPanelMode]);\n const sidebarModeCtxValue = React.useMemo(() => ({ sidebarMode: paneState.sidebarMode, setSidebarMode }), [paneState.sidebarMode, setSidebarMode]);\n const inspectorModeCtxValue = React.useMemo(() => ({ inspectorMode: paneState.inspectorMode, setInspectorMode }), [paneState.inspectorMode, setInspectorMode]);\n const bottomModeCtxValue = React.useMemo(() => ({ bottomMode: paneState.bottomMode, setBottomMode }), [paneState.bottomMode, setBottomMode]);\n const compositionCtxValue = React.useMemo(() => ({ hasLeft, setHasLeft, hasSidebar, setHasSidebar }), [hasLeft, setHasLeft, hasSidebar, setHasSidebar]);\n\n // Inset state management\n const [insetPanes, setInsetPanes] = React.useState<Set<InsetPaneId>>(new Set());\n const registerInset = React.useCallback((id: InsetPaneId) => {\n setInsetPanes((prev) => {\n if (prev.has(id)) return prev;\n const next = new Set(prev);\n next.add(id);\n return next;\n });\n }, []);\n const unregisterInset = React.useCallback((id: InsetPaneId) => {\n setInsetPanes((prev) => {\n if (!prev.has(id)) return prev;\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, []);\n const hasAnyInset = insetPanes.size > 0;\n const insetCtxValue = React.useMemo(\n () => ({ insetPanes, registerInset, unregisterInset, hasAnyInset }),\n [insetPanes, registerInset, unregisterInset, hasAnyInset],\n );\n const peekCtxValue = React.useMemo(() => ({ peekTarget, setPeekTarget, peekPane, clearPeek }), [peekTarget, setPeekTarget, peekPane, clearPeek]);\n const actionsCtxValue = React.useMemo(() => ({ togglePane, expandPane, collapsePane, setSidebarToggleComputer }), [togglePane, expandPane, collapsePane, setSidebarToggleComputer]);\n\n // Memoized full context value for ShellProvider to prevent unnecessary effect re-runs\n const shellContextValue = React.useMemo(\n () => ({\n ...baseContextValue,\n leftControlledOpen,\n peekTarget,\n setPeekTarget,\n peekPane,\n clearPeek,\n }),\n [baseContextValue, leftControlledOpen, peekTarget, setPeekTarget, peekPane, clearPeek],\n );\n\n // Memoize the Left content to avoid recreating the IIFE on every render\n const leftContent = React.useMemo(() => {\n if (!hasLeftChildren || hasSidebarChildren) return null;\n const firstRail = railEls[0] as any;\n const firstPanel = panelEls[0] as any;\n const leftInset = Boolean(firstRail?.props?.inset) || Boolean(firstPanel?.props?.inset);\n const passthroughProps = firstRail\n ? {\n // Notification passthrough used by Left; not spread to DOM in Left\n onOpenChange: firstRail.props?.onOpenChange,\n open: firstRail.props?.open,\n defaultOpen: firstRail.props?.defaultOpen,\n presentation: firstRail.props?.presentation,\n collapsible: firstRail.props?.collapsible,\n onExpand: firstRail.props?.onExpand,\n onCollapse: firstRail.props?.onCollapse,\n inset: leftInset,\n }\n : { defaultOpen: hasPanelDefaultOpenRef.current ? true : undefined, inset: leftInset };\n return (\n <Left {...(passthroughProps as any)}>\n {railEls}\n {panelEls}\n </Left>\n );\n }, [hasLeftChildren, hasSidebarChildren, railEls, panelEls]);\n\n return (\n <div {...props} ref={ref} className={classNames('rt-ShellRoot', className)} style={{ ...heightStyle, ...props.style }}>\n <ShellProvider value={shellContextValue}>\n <PresentationContext.Provider value={presentationCtxValue}>\n <LeftModeContext.Provider value={leftModeCtxValue}>\n <PanelModeContext.Provider value={panelModeCtxValue}>\n <SidebarModeContext.Provider value={sidebarModeCtxValue}>\n <InspectorModeContext.Provider value={inspectorModeCtxValue}>\n <BottomModeContext.Provider value={bottomModeCtxValue}>\n <CompositionContext.Provider value={compositionCtxValue}>\n <PeekContext.Provider value={peekCtxValue}>\n <ActionsContext.Provider value={actionsCtxValue}>\n <InsetContext.Provider value={insetCtxValue}>\n {headerEls}\n <div\n className=\"rt-ShellBody\"\n data-peek-target={peekTarget ?? undefined}\n data-has-inset={hasAnyInset || undefined}\n style={\n peekTarget === 'rail' || peekTarget === 'panel'\n ? ({\n '--peek-rail-width': `${railDefaultSizeRef.current}px`,\n } as CSSPropertiesWithVars)\n : undefined\n }\n >\n {leftContent ?? sidebarEls}\n {contentEls}\n {inspectorEls}\n </div>\n {bottomEls}\n </InsetContext.Provider>\n </ActionsContext.Provider>\n </PeekContext.Provider>\n </CompositionContext.Provider>\n </BottomModeContext.Provider>\n </InspectorModeContext.Provider>\n </SidebarModeContext.Provider>\n </PanelModeContext.Provider>\n </LeftModeContext.Provider>\n </PresentationContext.Provider>\n </ShellProvider>\n </div>\n );\n}) as PanelComponent;\nRoot.displayName = 'Shell.Root';\n\n// Header\ninterface ShellHeaderProps extends React.ComponentPropsWithoutRef<'header'> {\n height?: number;\n}\n\nconst Header = React.forwardRef<HTMLElement, ShellHeaderProps>(({ className, height = 64, style, ...props }, ref) => (\n <header\n {...props}\n ref={ref}\n className={classNames('rt-ShellHeader', className)}\n style={{\n ...style,\n '--shell-header-height': `${height}px`,\n } as CSSPropertiesWithVars}\n />\n));\nHeader.displayName = 'Shell.Header';\n\n// Pane Props Interface (shared by Panel, Sidebar, Inspector, Bottom)\ntype PaneProps = PaneBaseProps;\n\n// Left container (auto-created for Rail+Panel)\ninterface LeftProps extends React.ComponentPropsWithoutRef<'div'> {\n presentation?: ResponsivePresentation;\n // New: passthrough from Rail\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, meta: { reason: 'init' | 'toggle' | 'panel' | 'responsive' }) => void;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n mode?: never;\n defaultMode?: never;\n onModeChange?: never;\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n}\n\n// Rail (special case)\ntype LeftOpenChangeMeta = { reason: 'init' | 'toggle' | 'responsive' | 'panel' };\n\ntype RailControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: LeftOpenChangeMeta) => void; defaultOpen?: never };\ntype RailUncontrolledProps = { defaultOpen?: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: LeftOpenChangeMeta) => void; open?: never };\n\ntype RailProps = React.ComponentPropsWithoutRef<'div'> & {\n presentation?: ResponsivePresentation;\n expandedSize?: number;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n /** When true, adds margin to Rail+Panel and triggers gray backdrop on Shell. */\n inset?: boolean;\n} & (RailControlledProps | RailUncontrolledProps);\n\n// Left container - behaves like Inspector but contains Rail+Panel\nconst LEFT_DOM_OMIT_PROPS = ['open', 'defaultOpen', 'onOpenChange', 'mode', 'defaultMode', 'onModeChange'] as const;\n\nconst Left = React.forwardRef<HTMLDivElement, LeftProps>((initialProps, ref) => {\n const { className, presentation = { initial: 'fixed', sm: 'fixed' }, collapsible: _collapsible = true, onExpand, onCollapse, children, style, inset, ...restProps } = initialProps;\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useEffect(() => {\n if (inset) {\n registerInset('left');\n return () => unregisterInset('left');\n }\n }, [inset, registerInset, unregisterInset]);\n const propsOpen = restProps.open;\n const propsDefaultOpen = restProps.defaultOpen;\n const propsOnOpenChange = restProps.onOpenChange;\n const domProps = omitPaneProps(restProps, LEFT_DOM_OMIT_PROPS);\n const shell = useShell();\n const { setHasLeft } = shell;\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n const localRef = React.useRef<HTMLDivElement | null>(null);\n // Publish resolved presentation so Root can gate peeking in overlay\n React.useEffect(() => {\n shell.onLeftPres?.(resolvedPresentation);\n }, [shell, resolvedPresentation]);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n\n // Register with shell\n React.useEffect(() => {\n setHasLeft(true);\n return () => setHasLeft(false);\n }, [setHasLeft]);\n\n const lastLeftModeRef = React.useRef<PaneMode | null>(null);\n const lastResolvedLeftControlledRef = React.useRef<PaneMode | undefined>(undefined);\n const normalizedLeftControlled = React.useMemo(() => {\n if (typeof propsOpen === 'undefined') return undefined;\n return propsOpen ? 'expanded' : 'collapsed';\n }, [propsOpen]);\n const normalizedLeftDefault = React.useMemo(() => mapResponsiveBooleanToPaneMode(propsDefaultOpen), [propsDefaultOpen]);\n\n // Stable refs for notification callbacks to avoid effect dep churn\n const propsOnOpenChangeRef = React.useRef(propsOnOpenChange);\n const propsOpenRef = React.useRef(propsOpen);\n React.useLayoutEffect(() => {\n propsOnOpenChangeRef.current = propsOnOpenChange;\n propsOpenRef.current = propsOpen;\n });\n\n const { resolvedControlled: resolvedLeftControlled } = useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedLeftControlled,\n defaultValue: normalizedLeftDefault,\n currentValue: shell.leftMode,\n setValue: shell.setLeftMode,\n breakpointReady: shell.currentBreakpointReady,\n onInit: (initial) => propsOnOpenChangeRef.current?.(initial === 'expanded', { reason: 'init' }),\n });\n\n // Emit mode changes for user/internal transitions.\n // In controlled mode, skip when the mode matches the controlled prop (prop-driven sync).\n const prevPanelModeRef = React.useRef<PaneMode | null>(null);\n React.useEffect(() => {\n const prevLeftMode = lastLeftModeRef.current;\n const prevPanelMode = prevPanelModeRef.current;\n\n const prevResolvedControlled = lastResolvedLeftControlledRef.current;\n const controlledChanged = prevResolvedControlled !== resolvedLeftControlled;\n\n if (prevLeftMode !== null && prevLeftMode !== shell.leftMode) {\n const isControlled = typeof propsOpenRef.current !== 'undefined';\n const controlledTarget = resolvedLeftControlled === undefined ? undefined : resolvedLeftControlled === 'expanded';\n const nextOpen = shell.leftMode === 'expanded';\n\n // In controlled mode, only notify when internal mode diverges from the\n // controlled prop \u2014 that means a trigger/cascade changed it, not a prop sync.\n if (!isControlled || (!controlledChanged && nextOpen !== controlledTarget)) {\n let reason: LeftOpenChangeMeta['reason'] = 'toggle';\n const panelDrivenOpen = prevPanelMode !== null && prevPanelMode !== shell.panelMode && prevLeftMode === 'collapsed' && shell.leftMode === 'expanded' && shell.panelMode === 'expanded';\n if (panelDrivenOpen) {\n reason = 'panel';\n }\n propsOnOpenChangeRef.current?.(nextOpen, { reason });\n }\n }\n\n lastLeftModeRef.current = shell.leftMode;\n prevPanelModeRef.current = shell.panelMode;\n lastResolvedLeftControlledRef.current = resolvedLeftControlled;\n }, [shell.leftMode, shell.panelMode, resolvedLeftControlled]);\n\n // Emit expand/collapse events.\n // Use callback refs to avoid re-running effect when inline callbacks change,\n // matching the pattern used by Inspector and Bottom.\n const onExpandRef = React.useRef(onExpand);\n const onCollapseRef = React.useRef(onCollapse);\n React.useLayoutEffect(() => {\n onExpandRef.current = onExpand;\n onCollapseRef.current = onCollapse;\n });\n\n const prevLeftModeForCallbackRef = React.useRef<PaneMode | null>(null);\n const hasLeftInitializedRef = React.useRef(false);\n React.useEffect(() => {\n const currentMode = shell.leftMode;\n\n if (!shell.currentBreakpointReady) {\n prevLeftModeForCallbackRef.current = currentMode;\n return;\n }\n\n if (!hasLeftInitializedRef.current) {\n hasLeftInitializedRef.current = true;\n prevLeftModeForCallbackRef.current = currentMode;\n return;\n }\n\n const prevMode = prevLeftModeForCallbackRef.current;\n\n if (prevMode !== null && prevMode !== currentMode) {\n if (currentMode === 'expanded') {\n onExpandRef.current?.();\n } else if (currentMode === 'collapsed') {\n onCollapseRef.current?.();\n }\n prevLeftModeForCallbackRef.current = currentMode;\n }\n }, [shell.leftMode, shell.currentBreakpointReady]);\n\n const _isExpanded = shell.leftMode === 'expanded';\n\n // Left is not resizable; width derives from Rail/Panel.\n\n if (isOverlay) {\n const open = shell.leftMode === 'expanded';\n // Compute overlay width from child Rail/Panel expanded sizes\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const railEl = childArray.find((el) => isShellComponentType(el, Rail));\n const panelEl = childArray.find((el) => isShellComponentType(el, Panel));\n const railSize = typeof (railEl as any)?.props?.expandedSize === 'number' ? (railEl as any).props.expandedSize : 64;\n const panelSize = typeof (panelEl as any)?.props?.expandedSize === 'number' ? (panelEl as any).props.expandedSize : 288;\n const hasRail = Boolean(railEl);\n const hasPanel = Boolean(panelEl);\n const overlayPx = (hasRail ? railSize : 0) + (shell.panelMode === 'expanded' && hasPanel ? panelSize : 0);\n return (\n <Sheet.Root open={open} onOpenChange={(o) => shell.setLeftMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content\n side=\"start\"\n style={{ padding: 0 }}\n aria-label=\"Navigation\"\n aria-describedby={undefined}\n width={{\n initial: `${overlayPx}px`,\n }}\n >\n <VisuallyHidden>\n <Sheet.Title>Navigation</Sheet.Title>\n </VisuallyHidden>\n <div className=\"rt-ShellLeft\">{children}</div>\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n if (isStacked) {\n const open = shell.leftMode === 'expanded';\n // Compute floating width from child Rail/Panel expanded sizes (like overlay)\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const railEl = childArray.find((el) => isShellComponentType(el, Rail));\n const panelEl = childArray.find((el) => isShellComponentType(el, Panel));\n const _railSize = typeof (railEl as any)?.props?.expandedSize === 'number' ? (railEl as any).props.expandedSize : 64;\n const _panelSize = typeof (panelEl as any)?.props?.expandedSize === 'number' ? (panelEl as any).props.expandedSize : 288;\n const _hasRail = Boolean(railEl);\n const _hasPanel = Boolean(panelEl);\n const _includePanel = _hasPanel && (shell.panelMode === 'expanded' || shell.peekTarget === 'panel');\n\n // Strip control props from DOM spread\n return (\n <div\n {...domProps}\n ref={setRef}\n className={classNames('rt-ShellLeft', className)}\n data-mode={shell.leftMode}\n data-peek={shell.peekTarget === 'left' || shell.peekTarget === 'rail' || shell.peekTarget === 'panel' || undefined}\n data-presentation={resolvedPresentation}\n data-inset={inset || undefined}\n style={{\n ...style,\n }}\n data-open={open || undefined}\n >\n {children}\n </div>\n );\n }\n\n // Strip control/legacy props from DOM spread\n return (\n <div\n {...domProps}\n ref={setRef}\n className={classNames('rt-ShellLeft', className)}\n data-mode={shell.leftMode}\n data-peek={shell.peekTarget === 'left' || shell.peekTarget === 'rail' || shell.peekTarget === 'panel' || undefined}\n data-presentation={resolvedPresentation}\n data-inset={inset || undefined}\n style={{\n ...style,\n }}\n >\n {children}\n </div>\n );\n});\nLeft.displayName = 'Shell.Left';\nassignShellSlot(Left as any, 'Shell.Left');\n\nconst Rail = React.forwardRef<HTMLDivElement, RailProps>((initialProps, ref) => {\n const { className, presentation, expandedSize = 64, collapsible, onExpand, onCollapse, children, style, open, defaultOpen, onOpenChange, inset: _inset, ...domProps } = initialProps;\n const shell = useShell();\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Rail: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n }\n\n // Warn on controlled/uncontrolled mode switch\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Rail: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n // Register expanded size with Left container\n React.useEffect(() => {\n shell.onRailDefaults?.(expandedSize);\n }, [shell, expandedSize]);\n\n const isExpanded = shell.leftMode === 'expanded';\n\n // Strip unknown open/defaultOpen props from DOM by not spreading them\n return (\n <div\n {...domProps}\n ref={ref}\n className={classNames('rt-ShellRail', className)}\n data-mode={shell.leftMode}\n data-peek={(shell.currentBreakpointReady && shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail') || undefined}\n style={{\n ...style,\n '--rail-size': `${expandedSize}px`,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellRailContent\" data-visible={(shell.currentBreakpointReady && (isExpanded || (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail'))) || undefined}>\n {children}\n </div>\n </div>\n );\n});\nRail.displayName = 'Shell.Rail';\nassignShellSlot(Rail as any, 'Shell.Rail');\n\n// Panel\ntype HandleComponent = React.ForwardRefExoticComponent<React.ComponentPropsWithoutRef<'div'> & React.RefAttributes<HTMLDivElement>>;\n\ntype PanelOpenChangeMeta = { reason: 'toggle' | 'left' | 'init' | 'responsive' };\ntype PanelControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: PanelOpenChangeMeta) => void; defaultOpen?: never };\ntype PanelUncontrolledProps = { defaultOpen?: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: PanelOpenChangeMeta) => void; open?: never };\n\ntype PanelSizeControlledProps = { size: number | string; defaultSize?: never };\ntype PanelSizeUncontrolledProps = { defaultSize?: number | string; size?: never };\n\ntype PanelSizeChangeMeta = { reason: 'init' | 'resize' | 'controlled' };\ntype PanelPublicProps = Omit<PaneProps, 'presentation' | 'defaultMode'> &\n (PanelControlledProps | PanelUncontrolledProps) &\n (PanelSizeControlledProps | PanelSizeUncontrolledProps) & {\n onSizeChange?: (size: number, meta: PanelSizeChangeMeta) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n /** When true, adds margin to Rail+Panel and triggers gray backdrop on Shell. */\n inset?: boolean;\n };\ntype PanelComponent = React.ForwardRefExoticComponent<PanelPublicProps & React.RefAttributes<HTMLDivElement>> & {\n Handle: HandleComponent;\n};\n\ntype _SidebarComponent = React.ForwardRefExoticComponent<\n (Omit<PaneProps, 'mode' | 'defaultMode' | 'onModeChange'> & {\n state?: Responsive<SidebarMode>;\n defaultState?: SidebarMode;\n onStateChange?: (mode: SidebarMode) => void;\n thinSize?: number;\n toggleModes?: 'both' | 'single';\n }) &\n React.RefAttributes<HTMLDivElement>\n> & { Handle: HandleComponent };\n\ntype _InspectorComponent = React.ForwardRefExoticComponent<PaneProps & React.RefAttributes<HTMLDivElement>> & { Handle: HandleComponent };\n\ntype _BottomComponent = React.ForwardRefExoticComponent<PaneProps & React.RefAttributes<HTMLDivElement>> & { Handle: HandleComponent };\n\nconst PANEL_DOM_PROP_KEYS = [\n 'className',\n 'children',\n 'defaultOpen',\n 'open',\n 'onOpenChange',\n 'size',\n 'defaultSize',\n 'onSizeChange',\n 'sizeUpdate',\n 'sizeUpdateMs',\n 'style',\n] as const satisfies readonly (keyof PanelPublicProps)[];\n\nconst Panel = assignShellSlot(\n React.forwardRef<HTMLDivElement, PanelPublicProps>((initialProps, ref) => {\n const {\n className,\n defaultOpen,\n open,\n onOpenChange,\n size,\n defaultSize,\n expandedSize = 288,\n minSize,\n maxSize,\n resizable,\n collapsible = true,\n onExpand: _onExpand,\n onCollapse: _onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n } = initialProps;\n const panelDomProps = extractPaneDomProps(initialProps, PANEL_DOM_PROP_KEYS);\n // Ref for debounce cleanup\n const debounceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // Cleanup debounce timeout on unmount or when dependencies change\n React.useLayoutEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = null;\n }\n };\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n // Throttled/debounced emitter for onSizeChange\n const emitSizeChange = React.useMemo(() => {\n if (!onSizeChange) return () => {};\n if (sizeUpdate === 'debounce') {\n const fn = (s: number, meta: PanelSizeChangeMeta) => {\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = setTimeout(() => {\n onSizeChange?.(s, meta);\n debounceTimeoutRef.current = null;\n }, sizeUpdateMs);\n };\n return fn;\n }\n if (sizeUpdate === 'throttle') {\n let last = 0;\n return (s: number, meta: PanelSizeChangeMeta) => {\n const now = Date.now();\n if (now - last >= sizeUpdateMs) {\n last = now;\n onSizeChange?.(s, meta);\n }\n };\n }\n return (s: number, meta: PanelSizeChangeMeta) => onSizeChange?.(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n const shell = useShell();\n const prevPanelModeRef = React.useRef<PaneMode | null>(null);\n const prevLeftModeRef = React.useRef<PaneMode | null>(null);\n const lastResolvedPanelControlledRef = React.useRef<PaneMode | undefined>(undefined);\n // Dev-only runtime guard\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Panel: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n if (typeof size !== 'undefined' && typeof defaultSize !== 'undefined') {\n console.error('Shell.Panel: Do not pass both `size` and `defaultSize`. Choose one.');\n }\n }\n\n // Normalize responsive open/defaultOpen to PaneMode\n const normalizedControlledOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(open), [open]);\n const normalizedDefaultOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(defaultOpen), [defaultOpen]);\n const openIsResponsive = typeof open === 'object' && open !== null;\n\n // Stable ref for onOpenChange to avoid effect dep churn\n const onOpenChangeRef = React.useRef(onOpenChange);\n React.useLayoutEffect(() => {\n onOpenChangeRef.current = onOpenChange;\n });\n\n // Use responsive initial state hook for proper breakpoint handling\n const { resolvedControlled: resolvedPanelControlled } = useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedControlledOpen,\n defaultValue: normalizedDefaultOpen,\n currentValue: shell.panelMode,\n setValue: (mode) => {\n // Ensure Left is expanded when Panel is expanded unless Rail is controlled closed\n if (mode === 'expanded' && shell.leftMode !== 'expanded' && shell.leftControlledOpen !== false) {\n shell.setLeftMode('expanded');\n }\n shell.setPanelMode(mode);\n },\n breakpointReady: shell.currentBreakpointReady,\n controlledIsResponsive: openIsResponsive,\n onResponsiveChange: (next) => onOpenChangeRef.current?.(next === 'expanded', { reason: 'responsive' }),\n onInit: (initial) => {\n if (typeof open === 'undefined') {\n onOpenChangeRef.current?.(initial === 'expanded', { reason: 'init' });\n }\n },\n });\n\n // Dev-only warning if switching controlled/uncontrolled between renders\n const wasControlledRef = React.useRef<boolean | null>(null);\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Panel: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n React.useEffect(() => {\n shell.onPanelDefaults?.(expandedSize);\n }, [shell, expandedSize]);\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === PanelHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === PanelHandle));\n\n const isOverlay = shell.leftResolvedPresentation === 'overlay';\n\n // Normalize CSS lengths to px helper\n const normalizeSizeToPx = React.useCallback((value: number | string | undefined) => normalizeToPx(value, 'horizontal'), []);\n\n // Derive a default persistence adapter from paneId if none provided\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:panel:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n try {\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Panel: failed to load persisted size', err);\n }\n return undefined;\n }\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, String(size));\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Panel: failed to save persisted size', err);\n }\n }\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n // Load persisted size if configured (only in fixed presentation)\n React.useEffect(() => {\n let mounted = true;\n (async () => {\n if (!resizable || !persistenceAdapter?.load || isOverlay) return;\n const loaded = await persistenceAdapter.load();\n if (mounted && typeof loaded === 'number' && localRef.current) {\n localRef.current.style.setProperty('--panel-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n // In overlay, ensure panel uses the fixed expandedSize, ignoring any persisted size\n React.useEffect(() => {\n if (!localRef.current) return;\n if (isOverlay) {\n localRef.current.style.setProperty('--panel-size', `${expandedSize}px`);\n }\n }, [isOverlay, expandedSize]);\n\n // Apply defaultSize on mount when uncontrolled\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeSizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n // Clamp to min/max if provided\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--panel-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // Intentionally run only on mount - defaultSize is an uncontrolled initial value\n // that should not trigger re-application when props change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined') return;\n const px = normalizeSizeToPx(size);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--panel-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [size, minSize, maxSize, normalizeSizeToPx, emitSizeChange]);\n\n // Ensure Left container width is auto whenever Panel is expanded in fixed presentation\n React.useEffect(() => {\n if (!localRef.current) return;\n if (shell.leftResolvedPresentation !== 'overlay' && shell.leftMode === 'expanded' && shell.panelMode === 'expanded') {\n const leftEl = (localRef.current.parentElement as HTMLElement) || null;\n try {\n leftEl?.style.removeProperty('width');\n } catch (e) {\n // Style manipulation can fail in edge cases (e.g., detached elements)\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[Shell.Panel] Style cleanup warning:', e);\n }\n }\n }\n }, [shell.leftResolvedPresentation, shell.leftMode, shell.panelMode]);\n\n const isExpanded = shell.leftMode === 'expanded' && shell.panelMode === 'expanded';\n\n // Notify on internal toggles and left cascade.\n // In controlled mode, skip when the mode matches the controlled prop (prop-driven sync).\n React.useEffect(() => {\n const prevPanel = prevPanelModeRef.current;\n const prevLeft = prevLeftModeRef.current;\n const prevResolvedControlled = lastResolvedPanelControlledRef.current;\n const controlledChanged = prevResolvedControlled !== resolvedPanelControlled;\n if (prevPanel !== null && prevPanel !== shell.panelMode) {\n const nextOpen = shell.panelMode === 'expanded';\n const isControlled = typeof open !== 'undefined';\n const controlledTarget = resolvedPanelControlled === undefined ? undefined : resolvedPanelControlled === 'expanded';\n\n if (!isControlled || (!controlledChanged && nextOpen !== controlledTarget)) {\n let reason: PanelOpenChangeMeta['reason'] = 'toggle';\n if (prevLeft !== shell.leftMode && shell.leftMode === 'collapsed' && !nextOpen) {\n reason = 'left';\n }\n onOpenChangeRef.current?.(nextOpen, { reason });\n }\n }\n prevPanelModeRef.current = shell.panelMode;\n prevLeftModeRef.current = shell.leftMode;\n lastResolvedPanelControlledRef.current = resolvedPanelControlled;\n }, [shell.panelMode, shell.leftMode, open, resolvedPanelControlled]);\n\n // Provide resizer handle when fixed (not overlay)\n const handleEl =\n resizable && shell.leftResolvedPresentation !== 'overlay' && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--panel-size',\n minSize: typeof minSize === 'number' ? minSize : 100,\n maxSize: typeof maxSize === 'number' ? maxSize : 800,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'end',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n return startSize + (isRtl ? -delta : delta);\n },\n onResize,\n onResizeStart: (size) => {\n // Ensure Left container is not stuck with a fixed width in stacked\n const panelEl = localRef.current as HTMLElement | null;\n const leftEl = panelEl?.parentElement as HTMLElement | null;\n try {\n leftEl?.style.removeProperty('width');\n } catch (e) {\n // Style manipulation can fail in edge cases\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[Shell.Panel] Resize start style cleanup warning:', e);\n }\n }\n onResizeStart?.(size);\n },\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'panel',\n collapsible: Boolean(collapsible),\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setPanelMode('collapsed'),\n requestToggle: () => shell.togglePane('panel'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n return (\n <div\n {...panelDomProps}\n ref={setRef}\n className={classNames('rt-ShellPanel', className)}\n data-mode={shell.panelMode}\n data-visible={(shell.currentBreakpointReady && (isExpanded || (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel'))) || undefined}\n data-peek={(shell.currentBreakpointReady && shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel') || undefined}\n style={{\n ...style,\n '--panel-size': `${expandedSize}px`,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellPanelContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n }),\n 'Shell.Panel',\n) as PanelComponent;\nPanel.displayName = 'Shell.Panel';\nPanel.Handle = PanelHandle;\n\n// Sidebar moved to ./_internal/shell-sidebar\n\n// Content (always required)\ninterface ShellContentProps extends React.ComponentPropsWithoutRef<'main'> {\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n}\n\nconst Content = React.forwardRef<HTMLElement, ShellContentProps>(({ className, inset, ...props }, ref) => {\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useEffect(() => {\n if (inset) {\n registerInset('content');\n return () => unregisterInset('content');\n }\n }, [inset, registerInset, unregisterInset]);\n\n return <main {...props} ref={ref} className={classNames('rt-ShellContent', className)} data-inset={inset || undefined} />;\n});\nContent.displayName = 'Shell.Content';\nassignShellSlot(Content as any, 'Shell.Content');\n\n// Inspector moved to ./_internal/shell-inspector\n\n// Bottom\n// Bottom moved to ./_internal/shell-bottom\n// (Bottom implementation extracted)\n\n// Trigger\n// PaneTarget type moved to shell.types.ts\ntype TriggerAction = 'toggle' | 'expand' | 'collapse';\n\ninterface TriggerProps extends React.ComponentPropsWithoutRef<'button'> {\n target: PaneTarget;\n action?: TriggerAction;\n /**\n * Whether to show peek preview on hover when the target pane is collapsed.\n * Defaults to false.\n */\n peekOnHover?: boolean;\n}\n\nconst Trigger = React.forwardRef<HTMLButtonElement, TriggerProps>(({ target, action = 'toggle', peekOnHover, onClick, onMouseEnter, onMouseLeave, children, ...props }, ref) => {\n // Slice hooks \u2014 Trigger only re-renders when its target pane's slice changes,\n // not on every unrelated shell state update (peek, composition, presentation, etc.)\n const { leftMode } = useLeftMode();\n const { panelMode } = usePanelMode();\n const { sidebarMode } = useSidebarMode();\n const { inspectorMode } = useInspectorMode();\n const { bottomMode } = useBottomMode();\n const { peekTarget, clearPeek, peekPane } = usePeek();\n const { togglePane, expandPane, collapsePane } = useShellActions();\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n // Clear any active peek on this target before toggling to avoid sticky peek state\n if (peekTarget === target) {\n clearPeek();\n }\n\n switch (action) {\n case 'toggle':\n togglePane(target);\n break;\n case 'expand':\n expandPane(target);\n break;\n case 'collapse':\n collapsePane(target);\n break;\n }\n },\n [peekTarget, clearPeek, togglePane, expandPane, collapsePane, target, action, onClick],\n );\n\n const isCollapsed = (() => {\n switch (target) {\n case 'left':\n case 'rail':\n return leftMode === 'collapsed';\n case 'panel':\n return leftMode === 'collapsed' || panelMode === 'collapsed';\n case 'sidebar':\n return sidebarMode === 'collapsed';\n case 'inspector':\n return inspectorMode === 'collapsed';\n case 'bottom':\n return bottomMode === 'collapsed';\n }\n })();\n\n const handleMouseEnter = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseEnter?.(event);\n if (!peekOnHover || !isCollapsed) return;\n peekPane(target);\n },\n [onMouseEnter, peekOnHover, isCollapsed, peekPane, target],\n );\n\n const handleMouseLeave = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseLeave?.(event);\n if (!peekOnHover) return;\n if (peekTarget === target) {\n clearPeek();\n }\n },\n [onMouseLeave, peekOnHover, peekTarget, clearPeek, target],\n );\n\n return (\n <button\n {...props}\n ref={ref}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n data-shell-trigger={target}\n data-shell-action={action}\n aria-expanded={!isCollapsed}\n >\n {children}\n </button>\n );\n});\nTrigger.displayName = 'Shell.Trigger';\n\n// Exports\nexport {\n Root,\n Header,\n Left,\n Rail,\n Panel,\n Sidebar,\n Content,\n Inspector,\n Bottom,\n Trigger,\n useShell,\n useSidebarMode,\n useResponsivePresentation,\n type PaneMode,\n type SidebarMode,\n type ResponsivePresentation,\n type PaneTarget,\n type TriggerAction,\n};\n", "'use client';\n\n/**\n * Sheet\n *\n * A side-placed overlay built on top of Radix Dialog. It inherits accessibility,\n * focus management, overlay behavior, and sizing scales from the base dialog, and\n * adds side placement and slide motion suited for navigation panels and drawers.\n *\n * Structure mirrors Dialog:\n * - Root, Trigger, Content, Title, Description, Close\n *\n * Notes\n * - Side: set with `side` on `Sheet.Content`. Aliases: `left` \u2192 `start`, `right` \u2192 `end`.\n * - Sizing: reuses Dialog content prop defs (width/min/max/height/size). Default Dialog\n * maxWidth clamping is removed for Sheets.\n * - Material: use `material` (solid | translucent). Deprecated `panelBackground` falls back\n * in dev with a warning.\n * - A11y: provide an accessible name via `Sheet.Title` or `aria-label` on `Sheet.Content`.\n *\n * Example\n * <Sheet.Root>\n * <Sheet.Trigger>\n * <Button>Open</Button>\n * </Sheet.Trigger>\n * <Sheet.Content side=\"end\" width={{ initial: '280px', md: '360px' }}>\n * <Sheet.Title>Details</Sheet.Title>\n * ...\n * <Sheet.Close>\n * <Button>Close</Button>\n * </Sheet.Close>\n * </Sheet.Content>\n * </Sheet.Root>\n */\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { Dialog as DialogPrimitive } from 'radix-ui';\n\nimport { dialogContentPropDefs } from './dialog.props.js';\nimport type { DialogContentOwnProps } from './dialog.props.js';\nimport { Theme } from './theme.js';\nimport { Heading } from './heading.js';\nimport { Text } from './text.js';\nimport { extractProps } from '../helpers/extract-props.js';\nimport { requireReactElement } from '../helpers/require-react-element.js';\nimport { useBodyPointerEventsCleanup } from '../hooks/use-body-pointer-events-cleanup.js';\n\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\nimport type { HeadingProps } from './heading.js';\n\n/**\n * Supported sides for the Sheet.\n * Aliases are normalized RTL-aware: `left` \u2192 `start`, `right` \u2192 `end`.\n */\ntype SheetSide = 'start' | 'end' | 'top' | 'bottom' | 'left' | 'right';\n\n/**\n * Sheet is a side-placed overlay built on the Dialog primitive.\n * It reuses Dialog's accessibility, focus, overlay, and size scales, while adding side placement and slide motion.\n */\n\n// Root\n/**\n * Props for `Sheet.Root` (Radix Dialog root with `modal` forced on).\n */\ninterface SheetRootProps extends ComponentPropsWithout<typeof DialogPrimitive.Root, 'modal'> {}\nconst Root: React.FC<SheetRootProps> = (props) => <DialogPrimitive.Root {...props} modal />;\nRoot.displayName = 'Sheet.Root';\n\n// Trigger\n/** Element type for `Sheet.Trigger`. */\ntype SheetTriggerElement = React.ElementRef<typeof DialogPrimitive.Trigger>;\n/** Props for `Sheet.Trigger` (expects a single element child). */\ninterface SheetTriggerProps\n extends ComponentPropsWithout<typeof DialogPrimitive.Trigger, RemovedProps> {}\nconst Trigger = React.forwardRef<SheetTriggerElement, SheetTriggerProps>(\n ({ children, ...props }, ref) => (\n <DialogPrimitive.Trigger {...props} ref={ref} asChild>\n {requireReactElement(children)}\n </DialogPrimitive.Trigger>\n ),\n);\nTrigger.displayName = 'Sheet.Trigger';\n\n// Content\n/** Element type for `Sheet.Content`. */\ntype SheetContentElement = React.ElementRef<typeof DialogPrimitive.Content>;\ninterface SheetContentProps\n extends ComponentPropsWithout<typeof DialogPrimitive.Content, RemovedProps>,\n DialogContentOwnProps {\n /** Side where the Sheet should appear. `left`/`right` alias to `start`/`end`. */\n side?: SheetSide;\n /** Optional DOM container to portal into. Defaults to `document.body`. */\n container?: React.ComponentPropsWithoutRef<typeof DialogPrimitive.Portal>['container'];\n}\n\n/**\n * Renders the Sheet panel. Normalizes left/right to logical start/end and\n * forwards dialog sizing props. Provide an accessible name via `Sheet.Title`\n * or `aria-label`.\n */\nconst Content = React.forwardRef<SheetContentElement, SheetContentProps>(\n (allProps, forwardedRef) => {\n const {\n side = 'start',\n forceMount,\n container,\n className,\n panelBackground: panelBackgroundProp,\n material: materialProp,\n ...restProps\n } = allProps;\n const normalizedSideMap: Record<SheetSide, 'start' | 'end' | 'top' | 'bottom'> = {\n left: 'start',\n right: 'end',\n start: 'start',\n end: 'end',\n top: 'top',\n bottom: 'bottom',\n };\n const normalizedSide = normalizedSideMap[side];\n // Reuse dialog content prop defs for size/width/height tokens, but handle\n // material/panelBackground explicitly to avoid forwarding unknown DOM props.\n const {\n align: _alignPropDef,\n panelBackground: panelBackgroundPropDef,\n material: materialPropDef,\n ...propDefs\n } = dialogContentPropDefs;\n\n // Extract panelBackground and material together (remove from DOM props)\n const { panelBackground: resolvedPanelBackground, material: resolvedMaterial } = extractProps(\n { panelBackground: panelBackgroundProp, material: materialProp },\n { panelBackground: panelBackgroundPropDef, material: materialPropDef },\n );\n\n const materialValue = React.useMemo(() => {\n if (resolvedPanelBackground !== undefined) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use the `material` prop instead.',\n );\n }\n }\n return resolvedMaterial ?? resolvedPanelBackground;\n }, [resolvedMaterial, resolvedPanelBackground]);\n\n // Now extract remaining props using dialog defs so size/width/height classnames are applied\n // Override dialog's default maxWidth (600px) to avoid clamping Sheet by default\n // Match dialog.tsx: extract once and avoid leaking panel/material\n const { default: _mwDefault, ...maxWidthWithoutDefault } = propDefs.maxWidth;\n const sheetPropDefs = {\n ...propDefs,\n maxWidth: maxWidthWithoutDefault,\n } as typeof propDefs;\n const { className: extractedClassName, ...contentProps } = extractProps(\n restProps,\n sheetPropDefs,\n );\n\n // Dev-only a11y guard: ensure label is provided via Title or aria-label\n if (process.env.NODE_ENV !== 'production') {\n const children = (contentProps as any).children as React.ReactNode;\n const hasAriaLabel = typeof (contentProps as any)['aria-label'] === 'string';\n let hasTitle = false;\n if (children) {\n for (const child of React.Children.toArray(children)) {\n if (React.isValidElement(child) && child.type === Title) {\n hasTitle = true;\n break;\n }\n }\n }\n if (!hasTitle && !hasAriaLabel) {\n console.warn(\n 'Sheet.Content: Missing accessible name. Include Sheet.Title as a child or provide aria-label.',\n );\n }\n }\n\n // Focus management and stuck pointer-events cleanup like Dialog\n const contentRef = React.useRef<HTMLDivElement>(null);\n const combinedRef = React.useMemo(\n () => (node: HTMLDivElement | null) => {\n contentRef.current = node;\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else if (forwardedRef) {\n (forwardedRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n },\n [forwardedRef],\n );\n\n useBodyPointerEventsCleanup();\n\n React.useEffect(() => {\n if (typeof window === 'undefined') return;\n const content = contentRef.current;\n if (!content) return;\n\n const focusableElements = content.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n\n if (focusableElements.length === 0) return;\n\n const firstElement = focusableElements[0] as HTMLElement;\n const lastElement = focusableElements[focusableElements.length - 1] as HTMLElement;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Tab') {\n if (event.shiftKey) {\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n }\n } else if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n }\n };\n\n content.addEventListener('keydown', handleKeyDown);\n firstElement.focus();\n\n return () => {\n content.removeEventListener('keydown', handleKeyDown);\n };\n }, []);\n\n return (\n <DialogPrimitive.Portal container={container} forceMount={forceMount}>\n <Theme asChild>\n <DialogPrimitive.Overlay className=\"rt-BaseDialogOverlay rt-DialogOverlay rt-SheetOverlay\">\n <DialogPrimitive.Content\n {...contentProps}\n ref={combinedRef}\n className={classNames(\n 'rt-BaseDialogContent',\n 'rt-SheetContent',\n className,\n extractedClassName,\n )}\n data-side={normalizedSide}\n data-material={materialValue}\n data-panel-background={materialValue}\n tabIndex={-1}\n role=\"dialog\"\n aria-modal=\"true\"\n />\n </DialogPrimitive.Overlay>\n </Theme>\n </DialogPrimitive.Portal>\n );\n },\n);\nContent.displayName = 'Sheet.Content';\n\n// Title - renders as Heading with sensible defaults\ntype SheetTitleElement = React.ElementRef<typeof Heading>;\ntype SheetTitleProps = HeadingProps;\n/** Accessible title for the Sheet. Renders as Heading with sensible defaults. */\nconst Title = React.forwardRef<SheetTitleElement, SheetTitleProps>(\n ({ size = '4', weight = 'medium', ...props }, ref) => (\n <DialogPrimitive.Title asChild>\n <Heading ref={ref} size={size} weight={weight} {...props} />\n </DialogPrimitive.Title>\n ),\n);\nTitle.displayName = 'Sheet.Title';\n\n// Description - renders as Text with sensible defaults\ntype SheetDescriptionElement = React.ElementRef<typeof Text>;\ntype SheetDescriptionProps = React.ComponentPropsWithoutRef<typeof Text>;\n/** Supplementary description text for Sheet content. Renders as Text with sensible defaults. */\nconst Description = React.forwardRef<SheetDescriptionElement, SheetDescriptionProps>(\n ({ size = '2', color = 'gray', ...rest }, ref) => (\n <DialogPrimitive.Description asChild>\n <Text ref={ref} size={size} color={color} {...rest} />\n </DialogPrimitive.Description>\n ),\n);\nDescription.displayName = 'Sheet.Description';\n\ntype SheetCloseElement = React.ElementRef<typeof DialogPrimitive.Close>;\ninterface SheetCloseProps\n extends ComponentPropsWithout<typeof DialogPrimitive.Close, RemovedProps> {}\n/** Close button for the Sheet. Expects a single element child rendered via `asChild`. */\nconst Close = React.forwardRef<SheetCloseElement, SheetCloseProps>(\n ({ children, ...props }, ref) => (\n <DialogPrimitive.Close {...props} ref={ref} asChild>\n {requireReactElement(children)}\n </DialogPrimitive.Close>\n ),\n);\nClose.displayName = 'Sheet.Close';\n\nexport { Root, Trigger, Content, Title, Description, Close };\nexport type {\n SheetRootProps as RootProps,\n SheetTriggerProps as TriggerProps,\n SheetContentProps as ContentProps,\n SheetTitleProps as TitleProps,\n SheetDescriptionProps as DescriptionProps,\n SheetCloseProps as CloseProps,\n};\n", "import type { PropDef } from './prop-def.js';\n\nconst asChildPropDef = {\n /**\n * Composes the component into its immediate child instead of rendering its own HTML element.\n * You\u2019ll have to provide a single React Element child.\n */\n asChild: {\n type: 'boolean',\n },\n} satisfies {\n asChild: PropDef<boolean>;\n};\n\nexport { asChildPropDef };\n", "import type { GetPropDefTypes, PropDef } from './prop-def.js';\n\nconst widthPropDefs = {\n /**\n * Sets the CSS **width** property.\n * Supports CSS strings and responsive objects.\n *\n * @example\n * width=\"100px\"\n * width={{ md: '100vw', xl: '1400px' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/width\n */\n width: {\n type: 'string',\n className: 'rt-r-w',\n customProperties: ['--width'],\n responsive: true,\n },\n /**\n * Sets the CSS **min-width** property.\n * Supports CSS strings and responsive objects.\n *\n * @example\n * minWidth=\"100px\"\n * minWidth={{ md: '100vw', xl: '1400px' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/min-width\n */\n minWidth: {\n type: 'string',\n className: 'rt-r-min-w',\n customProperties: ['--min-width'],\n responsive: true,\n },\n /**\n * Sets the CSS **max-width** property.\n * Supports CSS strings and responsive objects.\n *\n * @example\n * maxWidth=\"100px\"\n * maxWidth={{ md: '100vw', xl: '1400px' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/max-width\n */\n maxWidth: {\n type: 'string',\n className: 'rt-r-max-w',\n customProperties: ['--max-width'],\n responsive: true,\n },\n} satisfies {\n width: PropDef<string>;\n minWidth: PropDef<string>;\n maxWidth: PropDef<string>;\n};\n\ntype WidthProps = GetPropDefTypes<typeof widthPropDefs>;\n\nexport { widthPropDefs };\nexport type { WidthProps };\n", "import type { PropDef, GetPropDefTypes } from './prop-def.js';\n\nconst heightPropDefs = {\n /**\n * Sets the CSS **height** property.\n * Supports CSS strings and responsive objects.\n *\n * @example\n * height=\"100px\"\n * height={{ md: '100vh', xl: '600px' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/height\n */\n height: {\n type: 'string',\n className: 'rt-r-h',\n customProperties: ['--height'],\n responsive: true,\n },\n /**\n * Sets the CSS **min-height** property.\n * Supports CSS strings and responsive objects.\n *\n * @example\n * minHeight=\"100px\"\n * minHeight={{ md: '100vh', xl: '600px' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/min-height\n */\n minHeight: {\n type: 'string',\n className: 'rt-r-min-h',\n customProperties: ['--min-height'],\n responsive: true,\n },\n /**\n * Sets the CSS **max-height** property.\n * Supports CSS strings and responsive objects.\n *\n * @example\n * maxHeight=\"100px\"\n * maxHeight={{ md: '100vh', xl: '600px' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/max-height\n */\n maxHeight: {\n type: 'string',\n className: 'rt-r-max-h',\n customProperties: ['--max-height'],\n responsive: true,\n },\n} satisfies {\n height: PropDef<string>;\n minHeight: PropDef<string>;\n maxHeight: PropDef<string>;\n};\n\ntype HeightProps = GetPropDefTypes<typeof heightPropDefs>;\n\nexport { heightPropDefs };\nexport type { HeightProps };\n", "import { asChildPropDef } from '../props/as-child.prop.js';\nimport { widthPropDefs } from '../props/width.props.js';\nimport { heightPropDefs } from '../props/height.props.js';\n\nimport type { PropDef, GetPropDefTypes } from '../props/prop-def.js';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst alignValues = ['start', 'center'] as const;\nconst contentSizes = ['1', '2', '3', '4'] as const;\nconst panelBackgrounds = ['solid', 'translucent'] as const;\nconst materials = ['solid', 'translucent'] as const;\n\nconst dialogContentPropDefs = {\n ...asChildPropDef,\n align: {\n type: 'enum',\n className: 'rt-r-align',\n values: ['start', 'center'],\n default: 'center',\n },\n size: {\n type: 'enum',\n className: 'rt-r-size',\n values: contentSizes,\n default: '3',\n responsive: true,\n },\n panelBackground: { type: 'enum', values: panelBackgrounds, default: undefined },\n material: { type: 'enum', values: materials, default: undefined },\n width: widthPropDefs.width,\n minWidth: widthPropDefs.minWidth,\n maxWidth: { ...widthPropDefs.maxWidth, default: '600px' },\n ...heightPropDefs,\n} satisfies {\n align: PropDef<(typeof alignValues)[number]>;\n size: PropDef<(typeof contentSizes)[number]>;\n panelBackground: PropDef<(typeof panelBackgrounds)[number] | undefined>;\n material: PropDef<(typeof materials)[number] | undefined>;\n width: PropDef<string>;\n minWidth: PropDef<string>;\n maxWidth: PropDef<string>;\n};\n\ntype DialogContentOwnProps = GetPropDefTypes<\n typeof dialogContentPropDefs & typeof asChildPropDef & typeof widthPropDefs\n>;\n\nexport { dialogContentPropDefs };\nexport type { DialogContentOwnProps };\n", "'use client';\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { Direction, Slot, Tooltip as TooltipPrimitive } from 'radix-ui';\n\nimport { getMatchingGrayColor } from '../helpers/get-matching-gray-color.js';\nimport { themePropDefs } from './theme.props.js';\n\nimport type { ThemeOwnProps } from './theme.props.js';\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\n\nconst noop = () => {};\n\ntype ThemeAppearance = (typeof themePropDefs.appearance.values)[number];\ntype ThemeAccentColor = (typeof themePropDefs.accentColor.values)[number];\ntype ThemeGrayColor = (typeof themePropDefs.grayColor.values)[number];\ntype ThemeMaterial = (typeof themePropDefs.material.values)[number];\ntype ThemePanelBackground = (typeof themePropDefs.panelBackground.values)[number];\ntype ThemeRadius = (typeof themePropDefs.radius.values)[number];\ntype ThemeScaling = (typeof themePropDefs.scaling.values)[number];\ntype ThemeFontFamily = (typeof themePropDefs.fontFamily.values)[number];\n\ninterface ThemeChangeHandlers {\n onAppearanceChange: (appearance: ThemeAppearance) => void;\n onAccentColorChange: (accentColor: ThemeAccentColor) => void;\n onGrayColorChange: (grayColor: ThemeGrayColor) => void;\n onMaterialChange: (material: ThemeMaterial) => void;\n onPanelBackgroundChange: (panelBackground: ThemePanelBackground) => void;\n onRadiusChange: (radius: ThemeRadius) => void;\n onScalingChange: (scaling: ThemeScaling) => void;\n onFontFamilyChange: (fontFamily: ThemeFontFamily) => void;\n}\n\ninterface ThemeContextValue extends ThemeChangeHandlers {\n appearance: ThemeAppearance;\n accentColor: ThemeAccentColor;\n grayColor: ThemeGrayColor;\n resolvedGrayColor: ThemeGrayColor;\n material: ThemeMaterial;\n panelBackground: ThemePanelBackground;\n radius: ThemeRadius;\n scaling: ThemeScaling;\n fontFamily: ThemeFontFamily;\n}\n// Default theme values used when components render outside a Theme provider\nconst defaultThemeContext: ThemeContextValue = {\n appearance: themePropDefs.appearance.default,\n accentColor: themePropDefs.accentColor.default,\n grayColor: themePropDefs.grayColor.default,\n resolvedGrayColor: themePropDefs.grayColor.default,\n material: themePropDefs.material.default,\n panelBackground: themePropDefs.panelBackground.default,\n radius: themePropDefs.radius.default,\n scaling: themePropDefs.scaling.default,\n fontFamily: themePropDefs.fontFamily.default,\n onAppearanceChange: noop,\n onAccentColorChange: noop,\n onGrayColorChange: noop,\n onMaterialChange: noop,\n onPanelBackgroundChange: noop,\n onRadiusChange: noop,\n onScalingChange: noop,\n onFontFamilyChange: noop,\n};\n\nconst ThemeContext = React.createContext<ThemeContextValue | undefined>(undefined);\n\nfunction useThemeContext() {\n const context = React.useContext(ThemeContext);\n // Return default context if used outside Theme provider (e.g., during SSR)\n return context ?? defaultThemeContext;\n}\n\ninterface ThemeProps extends ThemeImplPublicProps {}\nconst Theme = React.forwardRef<ThemeImplElement, ThemeProps>((props, forwardedRef) => {\n const context = React.useContext(ThemeContext);\n const isRoot = context === undefined;\n if (isRoot) {\n return (\n <TooltipPrimitive.Provider delayDuration={200}>\n <Direction.Provider dir=\"ltr\">\n <ThemeRoot {...props} ref={forwardedRef} />\n </Direction.Provider>\n </TooltipPrimitive.Provider>\n );\n }\n return <ThemeImpl {...props} ref={forwardedRef} />;\n});\nTheme.displayName = 'Theme';\n\nconst ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(\n (props, forwardedRef) => {\n const {\n appearance: appearanceProp = themePropDefs.appearance.default,\n accentColor: accentColorProp = themePropDefs.accentColor.default,\n grayColor: grayColorProp = themePropDefs.grayColor.default,\n material: materialProp = themePropDefs.material.default,\n panelBackground: panelBackgroundProp = themePropDefs.panelBackground.default,\n radius: radiusProp = themePropDefs.radius.default,\n scaling: scalingProp = themePropDefs.scaling.default,\n fontFamily: fontFamilyProp = themePropDefs.fontFamily.default,\n hasBackground = themePropDefs.hasBackground.default,\n ...rootProps\n } = props;\n\n // Show deprecation warning for panelBackground when used\n React.useEffect(() => {\n if (props.panelBackground !== undefined) {\n console.warn(\n 'Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.',\n );\n }\n }, [props.panelBackground]);\n\n const [appearance, setAppearance] = React.useState(appearanceProp);\n React.useEffect(() => setAppearance(appearanceProp), [appearanceProp]);\n\n const [accentColor, setAccentColor] = React.useState(accentColorProp);\n React.useEffect(() => setAccentColor(accentColorProp), [accentColorProp]);\n\n const [grayColor, setGrayColor] = React.useState(grayColorProp);\n React.useEffect(() => setGrayColor(grayColorProp), [grayColorProp]);\n\n // Material takes precedence over panelBackground\n const effectiveMaterial =\n materialProp !== themePropDefs.material.default ? materialProp : panelBackgroundProp;\n const [material, setMaterial] = React.useState(effectiveMaterial);\n React.useEffect(() => setMaterial(effectiveMaterial), [effectiveMaterial]);\n\n // Keep panelBackground in sync with material for backward compatibility\n const [panelBackground, setPanelBackground] = React.useState(panelBackgroundProp);\n React.useEffect(() => setPanelBackground(material), [material]);\n\n const [radius, setRadius] = React.useState(radiusProp);\n React.useEffect(() => setRadius(radiusProp), [radiusProp]);\n\n const [scaling, setScaling] = React.useState(scalingProp);\n React.useEffect(() => setScaling(scalingProp), [scalingProp]);\n\n const [fontFamily, setFontFamily] = React.useState(fontFamilyProp);\n React.useEffect(() => setFontFamily(fontFamilyProp), [fontFamilyProp]);\n\n return (\n <ThemeImpl\n {...rootProps}\n ref={forwardedRef}\n isRoot\n hasBackground={hasBackground}\n //\n appearance={appearance}\n accentColor={accentColor}\n grayColor={grayColor}\n material={material}\n panelBackground={panelBackground}\n radius={radius}\n scaling={scaling}\n fontFamily={fontFamily}\n //\n onAppearanceChange={setAppearance}\n onAccentColorChange={setAccentColor}\n onGrayColorChange={setGrayColor}\n onMaterialChange={setMaterial}\n onPanelBackgroundChange={setPanelBackground}\n onRadiusChange={setRadius}\n onScalingChange={setScaling}\n onFontFamilyChange={setFontFamily}\n />\n );\n },\n);\nThemeRoot.displayName = 'ThemeRoot';\n\ntype ThemeImplElement = React.ElementRef<'div'>;\ninterface ThemeImplProps extends ThemeImplPublicProps, ThemeImplPrivateProps {}\ninterface ThemeImplPublicProps\n extends ComponentPropsWithout<'div', RemovedProps | 'dir'>,\n ThemeOwnProps {}\ninterface ThemeImplPrivateProps extends Partial<ThemeChangeHandlers> {\n isRoot?: boolean;\n}\nfunction getClientOS(): 'windows' | 'macos' | 'linux' | undefined {\n if (typeof navigator === 'undefined') return undefined;\n const ua = navigator.userAgent;\n if (ua.includes('Win')) return 'windows';\n if (ua.includes('Mac')) return 'macos';\n if (ua.includes('Linux')) return 'linux';\n return undefined;\n}\n\nconst ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, forwardedRef) => {\n const context = React.useContext(ThemeContext);\n const {\n asChild,\n isRoot,\n hasBackground: hasBackgroundProp,\n //\n appearance = props.appearance ?? context?.appearance ?? themePropDefs.appearance.default,\n accentColor = props.accentColor ?? context?.accentColor ?? themePropDefs.accentColor.default,\n grayColor = props.grayColor ?? context?.resolvedGrayColor ?? themePropDefs.grayColor.default,\n material = props.material ?? context?.material ?? themePropDefs.material.default,\n panelBackground = props.panelBackground ??\n context?.panelBackground ??\n themePropDefs.panelBackground.default,\n radius = props.radius ?? context?.radius ?? themePropDefs.radius.default,\n scaling = props.scaling ?? context?.scaling ?? themePropDefs.scaling.default,\n fontFamily = props.fontFamily ?? context?.fontFamily ?? themePropDefs.fontFamily.default,\n //\n onAppearanceChange = noop,\n onAccentColorChange = noop,\n onGrayColorChange = noop,\n onMaterialChange = noop,\n onPanelBackgroundChange = noop,\n onRadiusChange = noop,\n onScalingChange = noop,\n onFontFamilyChange = noop,\n //\n ...themeProps\n } = props;\n const Comp = asChild ? Slot.Root : 'div';\n const resolvedGrayColor = grayColor === 'auto' ? getMatchingGrayColor(accentColor) : grayColor;\n const isExplicitAppearance = props.appearance === 'light' || props.appearance === 'dark';\n const hasBackground =\n hasBackgroundProp === undefined ? isRoot || isExplicitAppearance : hasBackgroundProp;\n\n const [clientOS, setClientOS] = React.useState<ReturnType<typeof getClientOS>>(undefined);\n React.useEffect(() => {\n if (isRoot) setClientOS(getClientOS());\n }, [isRoot]);\n\n return (\n <ThemeContext.Provider\n value={React.useMemo(\n () => ({\n appearance,\n accentColor,\n grayColor,\n resolvedGrayColor,\n material,\n panelBackground,\n radius,\n scaling,\n fontFamily,\n //\n onAppearanceChange,\n onAccentColorChange,\n onGrayColorChange,\n onMaterialChange,\n onPanelBackgroundChange,\n onRadiusChange,\n onScalingChange,\n onFontFamilyChange,\n }),\n [\n appearance,\n accentColor,\n grayColor,\n resolvedGrayColor,\n material,\n panelBackground,\n radius,\n scaling,\n fontFamily,\n //\n onAppearanceChange,\n onAccentColorChange,\n onGrayColorChange,\n onMaterialChange,\n onPanelBackgroundChange,\n onRadiusChange,\n onScalingChange,\n onFontFamilyChange,\n ],\n )}\n >\n <Comp\n data-is-root-theme={isRoot ? 'true' : 'false'}\n data-accent-color={accentColor}\n data-gray-color={resolvedGrayColor}\n // for nested `Theme` background\n data-has-background={hasBackground ? 'true' : 'false'}\n data-material={material}\n data-panel-background={panelBackground}\n data-radius={radius}\n data-scaling={scaling}\n data-font-family={fontFamily}\n data-os={isRoot ? clientOS : undefined}\n ref={forwardedRef}\n {...themeProps}\n className={classNames(\n 'radix-themes',\n {\n light: appearance === 'light',\n dark: appearance === 'dark',\n },\n themeProps.className,\n )}\n />\n </ThemeContext.Provider>\n );\n});\nThemeImpl.displayName = 'ThemeImpl';\n\nexport { Theme, ThemeContext, useThemeContext };\nexport type { ThemeProps, ThemeContextValue };\n", "import type { accentColors } from '../props/color.prop.js';\n\ntype ThemeAccentColor = (typeof accentColors)[number];\n\nexport function getMatchingGrayColor(accentColor: ThemeAccentColor) {\n switch (accentColor) {\n case 'tomato':\n case 'red':\n case 'ruby':\n case 'crimson':\n case 'pink':\n case 'plum':\n case 'purple':\n case 'violet':\n return 'mauve';\n case 'iris':\n case 'indigo':\n case 'blue':\n case 'sky':\n case 'cyan':\n return 'slate';\n case 'teal':\n case 'jade':\n case 'mint':\n case 'green':\n return 'sage';\n case 'grass':\n case 'lime':\n return 'olive';\n case 'yellow':\n case 'amber':\n case 'orange':\n case 'brown':\n case 'gold':\n case 'bronze':\n return 'sand';\n case 'gray':\n return 'gray';\n }\n}\n", "import type { PropDef } from './prop-def.js';\n\n// prettier-ignore\nconst accentColors = ['gray', 'gold', 'bronze', 'brown', 'yellow', 'amber', 'orange', 'tomato', 'red', 'ruby', 'crimson', 'pink', 'plum', 'purple', 'violet', 'iris', 'indigo', 'blue', 'cyan', 'teal', 'jade', 'green', 'grass', 'lime', 'mint', 'sky'] as const;\n\nconst grayColors = ['auto', 'gray', 'mauve', 'slate', 'sage', 'olive', 'sand'] as const;\n\nconst colorPropDef = {\n color: {\n type: 'enum',\n values: accentColors,\n default: undefined as (typeof accentColors)[number] | undefined,\n },\n} satisfies {\n color: PropDef<(typeof accentColors)[number]>;\n};\n\n// 1. When used on components that compose Text, sets the color of the text to the current accent.\n// 2. Defines accent color for descendant text components\u00A0with `highContrast={true}`.\nconst accentColorPropDef = {\n color: {\n type: 'enum',\n values: accentColors,\n default: '' as (typeof accentColors)[number],\n },\n} satisfies {\n color: PropDef<(typeof accentColors)[number]>;\n};\n\nexport {\n accentColorPropDef,\n colorPropDef,\n //\n accentColors,\n grayColors,\n};\n", "import type { PropDef } from './prop-def.js';\n\nconst radii = ['none', 'small', 'medium', 'large', 'full'] as const;\n\nconst radiusPropDef = {\n radius: {\n type: 'enum',\n values: radii,\n default: undefined,\n },\n} satisfies {\n radius: PropDef<(typeof radii)[number]>;\n};\n\nexport { radiusPropDef, radii };\n", "import { asChildPropDef } from '../props/as-child.prop.js';\nimport { accentColors, grayColors } from '../props/color.prop.js';\nimport { radii } from '../props/radius.prop.js';\n\nimport type { GetPropDefTypes, PropDef } from '../props/prop-def.js';\n\nconst appearances = ['inherit', 'light', 'dark'] as const;\nconst panelBackgrounds = ['solid', 'translucent'] as const;\nconst materials = ['solid', 'translucent'] as const;\nconst scalings = ['90%', '95%', '100%', '105%', '110%'] as const;\nconst fontFamilies = ['sans', 'mono', 'serif'] as const;\n\nconst themePropDefs = {\n ...asChildPropDef,\n /**\n * Whether to apply background color to the Theme element.\n *\n * Defaults to true for the root Theme and for Theme elements that\n * have an explicit light or dark appearance prop.\n */\n hasBackground: { type: 'boolean', default: true },\n /**\n * Sets the color scheme of the theme, typcially referred to as light and dark mode.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/dark-mode\n */\n appearance: { type: 'enum', values: appearances, default: 'inherit' },\n /**\n * Selects one of the accent color options to use in the Theme.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/color\n */\n accentColor: { type: 'enum', values: accentColors, default: 'blue' },\n /**\n * Selects one of the gray color options to use in the Theme.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/color\n */\n grayColor: { type: 'enum', values: grayColors, default: 'slate' },\n /**\n * Controls whether to use a solid or translucent background color on panelled\n * elements such as Card or Table is solid or translucent.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/visual-style\n */\n material: { type: 'enum', values: materials, default: 'translucent' },\n /**\n * Controls whether to use a solid or translucent background color on panelled\n * elements such as Card or Table is solid or translucent.\n *\n * @deprecated Use `material` prop instead. This prop will be removed in a future version.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/visual-style\n */\n panelBackground: { type: 'enum', values: panelBackgrounds, default: 'translucent' },\n /**\n * Sets the default radius of the components.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/visual-style\n */\n radius: { type: 'enum', values: radii, default: 'medium' },\n /**\n * Sets a scaling multiplier for values like spacing, font sizes, line heights, etc. are scaled.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/layout\n */\n scaling: { type: 'enum', values: scalings, default: '100%' },\n /**\n * Sets the font family for the theme.\n *\n * @default 'sans'\n */\n fontFamily: { type: 'enum', values: fontFamilies, default: 'sans' },\n} satisfies {\n hasBackground: PropDef<boolean>;\n appearance: PropDef<(typeof appearances)[number]>;\n accentColor: PropDef<(typeof accentColors)[number]>;\n grayColor: PropDef<(typeof grayColors)[number]>;\n material: PropDef<(typeof materials)[number]>;\n panelBackground: PropDef<(typeof panelBackgrounds)[number]>;\n radius: PropDef<(typeof radii)[number]>;\n scaling: PropDef<(typeof scalings)[number]>;\n fontFamily: PropDef<(typeof fontFamilies)[number]>;\n};\n\ntype ThemeOwnProps = GetPropDefTypes<typeof themePropDefs & typeof asChildPropDef>;\n\nexport { themePropDefs };\nexport type { ThemeOwnProps };\n", "import * as React from 'react';\nimport { Slot } from 'radix-ui';\n\nimport { headingPropDefs } from './heading.props.js';\nimport { extractProps } from '../helpers/extract-props.js';\nimport { marginPropDefs } from '../props/margin.props.js';\n\nimport type { MarginProps } from '../props/margin.props.js';\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\nimport type { GetPropDefTypes } from '../props/prop-def.js';\n\ntype HeadingElement = React.ElementRef<'h1'>;\ntype HeadingOwnProps = GetPropDefTypes<typeof headingPropDefs>;\ninterface CommonHeadingProps extends MarginProps, HeadingOwnProps {}\ntype HeadingH1Props = { as?: 'h1' } & ComponentPropsWithout<'h1', RemovedProps>;\ntype HeadingH2Props = { as: 'h2' } & ComponentPropsWithout<'h2', RemovedProps>;\ntype HeadingH3Props = { as: 'h3' } & ComponentPropsWithout<'h3', RemovedProps>;\ntype HeadingH4Props = { as: 'h4' } & ComponentPropsWithout<'h4', RemovedProps>;\ntype HeadingH5Props = { as: 'h5' } & ComponentPropsWithout<'h5', RemovedProps>;\ntype HeadingH6Props = { as: 'h6' } & ComponentPropsWithout<'h6', RemovedProps>;\ntype HeadingProps = CommonHeadingProps &\n (HeadingH1Props | HeadingH2Props | HeadingH3Props | HeadingH4Props | HeadingH5Props | HeadingH6Props);\n\n// Pre-merge prop definitions at module level to avoid per-render allocation\nconst mergedPropDefs = { ...headingPropDefs, ...marginPropDefs };\n\nconst Heading = React.memo(\n React.forwardRef<HeadingElement, HeadingProps>((props, forwardedRef) => {\n const {\n children,\n className,\n asChild,\n as: Tag = 'h1',\n color,\n ...headingProps\n } = extractProps(props, mergedPropDefs);\n\n const combinedClassName = className ? `rt-Heading ${className}` : 'rt-Heading';\n\n if (asChild) {\n return (\n <Slot.Root\n data-accent-color={color}\n {...headingProps}\n ref={forwardedRef}\n className={combinedClassName}\n >\n {children}\n </Slot.Root>\n );\n }\n\n return (\n <Tag\n data-accent-color={color}\n {...(headingProps as React.HTMLAttributes<HTMLHeadingElement>)}\n ref={forwardedRef as any}\n className={combinedClassName}\n >\n {children}\n </Tag>\n );\n })\n);\nHeading.displayName = 'Heading';\n\nexport { Heading };\nexport type { HeadingProps };\n", "import type { PropDef } from './prop-def.js';\n\nconst highContrastPropDef = {\n highContrast: {\n type: 'boolean',\n className: 'rt-high-contrast',\n default: undefined,\n },\n} satisfies {\n highContrast: PropDef<boolean>;\n};\n\nexport { highContrastPropDef };\n", "import type { PropDef } from './prop-def.js';\n\nconst leadingTrimValues = ['normal', 'start', 'end', 'both'] as const;\n\nconst leadingTrimPropDef = {\n trim: {\n type: 'enum',\n className: 'rt-r-lt',\n values: leadingTrimValues,\n responsive: true,\n },\n} satisfies {\n trim: PropDef<(typeof leadingTrimValues)[number]>;\n};\n\nexport { leadingTrimPropDef };\n", "import type { PropDef } from './prop-def.js';\n\nconst textAlignValues = ['left', 'center', 'right'] as const;\n\nconst textAlignPropDef = {\n align: {\n type: 'enum',\n className: 'rt-r-ta',\n values: textAlignValues,\n responsive: true,\n },\n} satisfies {\n align: PropDef<(typeof textAlignValues)[number]>;\n};\n\nexport { textAlignPropDef };\n", "import type { PropDef } from './prop-def.js';\n\nconst textWrapValues = ['wrap', 'nowrap', 'pretty', 'balance'] as const;\n\nconst textWrapPropDef = {\n wrap: {\n type: 'enum',\n className: 'rt-r-tw',\n values: textWrapValues,\n responsive: true,\n },\n} satisfies {\n wrap: PropDef<(typeof textWrapValues)[number]>;\n};\n\nexport { textWrapPropDef };\n", "import type { PropDef } from './prop-def.js';\n\nconst truncatePropDef = {\n truncate: {\n type: 'boolean',\n className: 'rt-truncate',\n },\n} satisfies {\n truncate: PropDef<boolean>;\n};\n\nexport { truncatePropDef };\n", "import type { PropDef } from './prop-def.js';\n\nconst fontFamilies = ['sans', 'mono', 'serif'] as const;\n\nconst fontFamilyPropDef = {\n font: {\n type: 'enum',\n className: 'rt-r-ff',\n values: fontFamilies,\n },\n} satisfies {\n font: PropDef<(typeof fontFamilies)[number]>;\n};\n\nexport { fontFamilyPropDef };\n", "import type { PropDef } from './prop-def.js';\n\nconst weights = ['thin', 'extralight', 'light', 'regular', 'medium', 'semibold', 'bold', 'extrabold'] as const;\n\nconst weightPropDef = {\n weight: {\n type: 'enum',\n className: 'rt-r-weight',\n values: weights,\n responsive: true,\n },\n} satisfies {\n weight: PropDef<(typeof weights)[number]>;\n};\n\nexport { weightPropDef };\n", "import { asChildPropDef } from '../props/as-child.prop.js';\nimport { colorPropDef } from '../props/color.prop.js';\nimport { highContrastPropDef } from '../props/high-contrast.prop.js';\nimport { leadingTrimPropDef } from '../props/leading-trim.prop.js';\nimport { textAlignPropDef } from '../props/text-align.prop.js';\nimport { textWrapPropDef } from '../props/text-wrap.prop.js';\nimport { truncatePropDef } from '../props/truncate.prop.js';\nimport { fontFamilyPropDef } from '../props/font-family.prop.js';\nimport { weightPropDef } from '../props/weight.prop.js';\n\nimport type { PropDef } from '../props/prop-def.js';\n\nconst as = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const;\nconst sizes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'] as const;\n\nconst headingPropDefs = {\n as: { type: 'enum', values: as, default: 'h1' },\n ...asChildPropDef,\n size: {\n type: 'enum',\n className: 'rt-r-size',\n values: sizes,\n default: '6',\n responsive: true,\n },\n ...fontFamilyPropDef,\n ...weightPropDef,\n ...textAlignPropDef,\n ...leadingTrimPropDef,\n ...truncatePropDef,\n ...textWrapPropDef,\n ...colorPropDef,\n ...highContrastPropDef,\n} satisfies {\n as: PropDef<(typeof as)[number]>;\n size: PropDef<(typeof sizes)[number]>;\n};\n\nexport { headingPropDefs };\n", "import classNames from 'classnames';\n\nimport { getResponsiveClassNames, getResponsiveStyles } from './get-responsive-styles.js';\nimport { isResponsiveObject } from './is-responsive-object.js';\nimport { mergeStyles } from './merge-styles.js';\n\nimport type * as React from 'react';\nimport type { PropDef } from '../props/prop-def.js';\n\ntype PropDefsWithClassName<T> = T extends Record<string, PropDef>\n ? { [K in keyof T]: T[K] extends { className: string } ? K : never }[keyof T]\n : never;\n\nfunction mergePropDefs<T extends Record<string, PropDef>[]>(...args: T): Record<string, PropDef> {\n return Object.assign({}, ...args);\n}\n\n/**\n * Takes props, checks them against prop defs that have a `className` on them,\n * adds necessary CSS classes and inline styles, and returns the props without\n * the corresponding prop defs that were used to formulate the new `className`\n * and `style` values. Also applies prop def defaults to every prop.\n */\nfunction extractProps<\n P extends { className?: string; style?: React.CSSProperties; [key: string]: any },\n T extends Record<string, PropDef>[]\n>(\n props: P,\n ...propDefs: T\n): Omit<P & { className?: string; style?: React.CSSProperties }, PropDefsWithClassName<T[number]>> {\n let className: string | undefined;\n let style: ReturnType<typeof mergeStyles>;\n const extractedProps = { ...props };\n const allPropDefs = mergePropDefs(...propDefs);\n\n for (const key in allPropDefs) {\n let value = extractedProps[key];\n const propDef = allPropDefs[key];\n\n // Apply prop def defaults\n if (propDef.default !== undefined && value === undefined) {\n value = propDef.default;\n }\n\n // Apply the default value if the value is not a valid enum value\n if (propDef.type === 'enum') {\n const values = [propDef.default, ...propDef.values];\n\n if (!values.includes(value) && !isResponsiveObject(value)) {\n value = propDef.default;\n }\n }\n\n // Apply the value with defaults\n (extractedProps as Record<string, any>)[key] = value;\n\n if ('className' in propDef && propDef.className) {\n delete extractedProps[key];\n\n const isResponsivePropDef = 'responsive' in propDef;\n // Make sure we are not threading through responsive values for non-responsive prop defs\n if (!value || (isResponsiveObject(value) && !isResponsivePropDef)) {\n continue;\n }\n\n if (isResponsiveObject(value)) {\n // Apply prop def defaults to the `initial` breakpoint\n if (propDef.default !== undefined && value.initial === undefined) {\n value.initial = propDef.default;\n }\n\n // Apply the default value to the `initial` breakpoint when it is not a valid enum value\n if (propDef.type === 'enum') {\n const values = [propDef.default, ...propDef.values];\n\n if (!values.includes(value.initial)) {\n value.initial = propDef.default;\n }\n }\n }\n\n if (propDef.type === 'enum') {\n const propClassName = getResponsiveClassNames({\n allowArbitraryValues: false,\n value,\n className: propDef.className,\n propValues: propDef.values,\n parseValue: propDef.parseValue,\n });\n\n className = classNames(className, propClassName);\n continue;\n }\n\n if (propDef.type === 'string' || propDef.type === 'enum | string') {\n const propDefValues = propDef.type === 'string' ? [] : propDef.values;\n\n const [propClassNames, propCustomProperties] = getResponsiveStyles({\n className: propDef.className,\n customProperties: propDef.customProperties,\n propValues: propDefValues,\n parseValue: propDef.parseValue,\n value,\n });\n\n style = mergeStyles(style, propCustomProperties);\n className = classNames(className, propClassNames);\n continue;\n }\n\n if (propDef.type === 'boolean' && value) {\n // TODO handle responsive boolean props\n className = classNames(className, propDef.className);\n continue;\n }\n }\n }\n\n extractedProps.className = classNames(className, props.className);\n extractedProps.style = mergeStyles(style, props.style);\n return extractedProps;\n}\n\nexport { extractProps };\n", "import type React from 'react';\n\n// Creates a union type of string literals with strings, but retains intellisense for the literals.\n// Union<string, 'foo' | 'bar'> => string | Omit<string, 'foo' | 'bar'>\ntype Union<S = string, T extends string | number = string> = T | Omit<S, T>;\n\nconst breakpoints = ['initial', 'xs', 'sm', 'md', 'lg', 'xl'] as const;\nconst breakpointSet: Set<string> = new Set(breakpoints);\ntype Breakpoint = (typeof breakpoints)[number];\ntype Responsive<T> = T | Partial<Record<Breakpoint, T>>;\n\ntype BooleanPropDef = {\n type: 'boolean';\n default?: boolean;\n required?: boolean;\n className?: string;\n};\ntype StringPropDef = {\n type: 'string';\n default?: string;\n required?: boolean;\n};\ntype ReactNodePropDef = {\n type: 'ReactNode';\n default?: React.ReactNode;\n required?: boolean;\n};\ntype EnumPropDef<T> = {\n type: 'enum';\n values: readonly T[];\n default?: T;\n required?: boolean;\n};\ntype EnumOrStringPropDef<T> = {\n type: 'enum | string';\n values: readonly T[];\n default?: T | string;\n required?: boolean;\n};\n\ntype NonStylingPropDef = {\n className?: never;\n customProperties?: never;\n parseValue?: never;\n};\n\ntype StylingPropDef = {\n className: string;\n parseValue?: (value: string) => string | undefined;\n};\n\ntype ArbitraryStylingPropDef = {\n className: string;\n customProperties: `--${string}`[];\n parseValue?: (value: string) => string | undefined;\n};\n\ntype RegularPropDef<T> =\n | ReactNodePropDef\n | BooleanPropDef\n | (StringPropDef & ArbitraryStylingPropDef)\n | (StringPropDef & NonStylingPropDef)\n | (EnumPropDef<T> & StylingPropDef)\n | (EnumPropDef<T> & NonStylingPropDef)\n | (EnumOrStringPropDef<T> & ArbitraryStylingPropDef)\n | (EnumOrStringPropDef<T> & NonStylingPropDef);\ntype ResponsivePropDef<T = any> = RegularPropDef<T> & { responsive: true };\ntype PropDef<T = any> = RegularPropDef<T> | ResponsivePropDef<T>;\n\n// prettier-ignore\ntype GetPropDefType<Def> =\n Def extends BooleanPropDef ? (Def extends ResponsivePropDef ? Responsive<boolean> : boolean)\n : Def extends StringPropDef ? (Def extends ResponsivePropDef ? Responsive<string> : string)\n : Def extends ReactNodePropDef ? (Def extends ResponsivePropDef ? Responsive<React.ReactNode> : React.ReactNode)\n : Def extends EnumOrStringPropDef<infer Type> ?\n Def extends ResponsivePropDef<infer Type extends string> ? Responsive<Union<string, Type>> : Type\n : Def extends EnumPropDef<infer Type> ? (Def extends ResponsivePropDef<infer Type> ? Responsive<Type> : Type)\n : never;\n\ntype GetPropDefTypes<P> = {\n [K in keyof P]?: GetPropDefType<P[K]>;\n};\n\nexport { breakpoints, breakpointSet };\nexport type {\n PropDef,\n GetPropDefTypes,\n ResponsivePropDef,\n //\n Breakpoint,\n Responsive,\n Union,\n};\n", "/** A util to check whether the object has a key, while inferring the correct key type */\nfunction hasOwnProperty<K extends string | number | symbol>(\n obj: Record<K, unknown>,\n key: string | number | symbol\n): key is K {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport { hasOwnProperty };\n", "import type { Responsive, Breakpoint } from '../props/prop-def.js';\n\n// Use a Set for O(1) lookup instead of array.includes() which is O(n)\nconst breakpointSet = new Set<string>(['initial', 'xs', 'sm', 'md', 'lg', 'xl']);\n\nexport function isResponsiveObject<Value extends string>(\n obj: Responsive<Value | Omit<string, Value>> | undefined\n): obj is Record<Breakpoint, string> {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n // Use for...in to avoid Object.keys() array allocation\n for (const key in obj) {\n if (breakpointSet.has(key)) {\n return true;\n }\n }\n return false;\n}\n", "import { breakpointSet } from '../props/prop-def.js';\nimport { hasOwnProperty } from './has-own-property.js';\nimport { isResponsiveObject } from './is-responsive-object.js';\n\nimport type { Responsive, Union } from '../props/prop-def.js';\n\ninterface GetResponsiveStylesOptions {\n className: string;\n customProperties: `--${string}`[];\n value: Responsive<Union> | Responsive<string> | undefined;\n propValues: string[] | readonly string[];\n parseValue?: (value: string) => string | undefined;\n}\n\nfunction getResponsiveStyles({ className, customProperties, ...args }: GetResponsiveStylesOptions) {\n const responsiveClassNames = getResponsiveClassNames({\n allowArbitraryValues: true,\n className,\n ...args,\n });\n\n const responsiveCustomProperties = getResponsiveCustomProperties({ customProperties, ...args });\n return [responsiveClassNames, responsiveCustomProperties] as const;\n}\n\ninterface GetResponsiveClassNamesOptions {\n allowArbitraryValues?: boolean;\n className: string;\n value: Responsive<Union> | Responsive<string> | undefined;\n propValues: string[] | readonly string[];\n parseValue?: (value: string) => string | undefined;\n}\n\nfunction getResponsiveClassNames({\n allowArbitraryValues,\n value,\n className,\n propValues,\n parseValue = (value) => value,\n}: GetResponsiveClassNamesOptions): string | undefined {\n const classNames: string[] = [];\n\n if (!value) {\n return undefined;\n }\n\n if (typeof value === 'string' && propValues.includes(value)) {\n return getBaseClassName(className, value, parseValue);\n }\n\n if (isResponsiveObject(value)) {\n const object = value;\n\n for (const bp in object) {\n // Make sure we are not iterating over keys that aren't breakpoints\n if (!hasOwnProperty(object, bp) || !breakpointSet.has(bp)) {\n continue;\n }\n\n const value = object[bp];\n\n if (value !== undefined) {\n if (propValues.includes(value)) {\n const baseClassName = getBaseClassName(className, value, parseValue);\n const bpClassName = bp === 'initial' ? baseClassName : `${bp}:${baseClassName}`;\n classNames.push(bpClassName);\n } else if (allowArbitraryValues) {\n const bpClassName = bp === 'initial' ? className : `${bp}:${className}`;\n classNames.push(bpClassName);\n }\n }\n }\n\n return classNames.join(' ');\n }\n\n if (allowArbitraryValues) {\n return className;\n }\n}\n\nfunction getBaseClassName(\n className: string,\n value: string,\n parseValue: (value: string) => string | undefined\n): string {\n const delimiter = className ? '-' : '';\n const matchedValue = parseValue(value);\n const isNegative = matchedValue?.startsWith('-');\n const minus = isNegative ? '-' : '';\n const absoluteValue = isNegative ? matchedValue?.substring(1) : matchedValue;\n return `${minus}${className}${delimiter}${absoluteValue}`;\n}\n\ninterface GetResponsiveCustomPropertiesOptions {\n customProperties: `--${string}`[];\n value: Responsive<Union> | Responsive<string> | undefined;\n propValues: string[] | readonly string[];\n parseValue?: (value: string) => string | undefined;\n}\n\nfunction getResponsiveCustomProperties({\n customProperties,\n value,\n propValues,\n parseValue = (value) => value,\n}: GetResponsiveCustomPropertiesOptions) {\n let styles: Record<string, string | undefined> = {};\n\n // Don't generate custom properties if the value is not arbitrary\n if (!value || (typeof value === 'string' && propValues.includes(value))) {\n return undefined;\n }\n\n if (typeof value === 'string') {\n styles = Object.fromEntries(customProperties.map((prop) => [prop, value]));\n }\n\n if (isResponsiveObject(value)) {\n const object = value;\n\n for (const bp in object) {\n // Make sure we are not iterating over keys that aren't breakpoints\n if (!hasOwnProperty(object, bp) || !breakpointSet.has(bp)) {\n continue;\n }\n\n const value = object[bp];\n\n // Don't generate a custom property if the value is not arbitrary\n if (propValues.includes(value)) {\n continue;\n }\n\n for (const customProperty of customProperties) {\n const bpProperty = bp === 'initial' ? customProperty : `${customProperty}-${bp}`;\n styles[bpProperty] = value;\n }\n }\n }\n\n for (const key in styles) {\n const value = styles[key];\n if (value !== undefined) {\n styles[key] = parseValue(value);\n }\n }\n\n return styles;\n}\n\nexport { getResponsiveStyles, getResponsiveCustomProperties, getResponsiveClassNames };\n", "type InlineStyle =\n | React.CSSProperties\n | Record<string, string | number | null | undefined>\n | undefined;\n\n// Merges CSS styles like `classNames` merges CSS classes\n// Optimized to avoid object spread in loop - uses Object.assign for in-place mutation\nexport function mergeStyles(...styles: Array<InlineStyle>): InlineStyle {\n let result: Record<string, string | number | null | undefined> | undefined;\n\n for (const style of styles) {\n if (style) {\n if (result === undefined) {\n // First non-empty style - create result object\n result = {};\n }\n Object.assign(result, style);\n }\n }\n\n return result;\n}\n", "import type { PropDef, GetPropDefTypes } from './prop-def.js';\n\n// prettier-ignore\nconst marginValues = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '-1', '-2', '-3', '-4', '-5', '-6', '-7', '-8', '-9', '-10', '-11', '-12'] as const;\n\nconst marginPropDefs = {\n /**\n * Sets the CSS **margin** property.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * m=\"4\"\n * m=\"100px\"\n * m={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin\n */\n m: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-m',\n customProperties: ['--m'],\n },\n /**\n * Sets the CSS **margin-left** and **margin-right** properties.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * mx=\"4\"\n * mx=\"100px\"\n * mx={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-left\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-right\n */\n mx: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-mx',\n customProperties: ['--ml', '--mr'],\n },\n /**\n * Sets the CSS **margin-top** and **margin-bottom** properties.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * my=\"4\"\n * my=\"100px\"\n * my={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-top\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-bottom\n */\n my: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-my',\n customProperties: ['--mt', '--mb'],\n },\n /**\n * Sets the CSS **margin-top** property.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * mt=\"4\"\n * mt=\"100px\"\n * mt={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-top\n */\n mt: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-mt',\n customProperties: ['--mt'],\n },\n /**\n * Sets the CSS **margin-right** property.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * mr=\"4\"\n * mr=\"100px\"\n * mr={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-right\n */\n mr: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-mr',\n customProperties: ['--mr'],\n },\n /**\n * Sets the CSS **margin-bottom** property.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * mb=\"4\"\n * mb=\"100px\"\n * mb={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-bottom\n */\n mb: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-mb',\n customProperties: ['--mb'],\n },\n /**\n * Sets the CSS **margin-left** property.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * ml=\"4\"\n * ml=\"100px\"\n * ml={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-left\n */\n ml: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-ml',\n customProperties: ['--ml'],\n },\n} satisfies {\n m: PropDef<(typeof marginValues)[number]>;\n mx: PropDef<(typeof marginValues)[number]>;\n my: PropDef<(typeof marginValues)[number]>;\n mt: PropDef<(typeof marginValues)[number]>;\n mr: PropDef<(typeof marginValues)[number]>;\n mb: PropDef<(typeof marginValues)[number]>;\n ml: PropDef<(typeof marginValues)[number]>;\n};\n\ntype MarginProps = GetPropDefTypes<typeof marginPropDefs>;\n\nexport { marginPropDefs };\nexport type { MarginProps };\n", "import * as React from 'react';\nimport { Slot } from 'radix-ui';\n\nimport { extractProps } from '../helpers/extract-props.js';\nimport { marginPropDefs } from '../props/margin.props.js';\nimport { textPropDefs } from './text.props.js';\n\nimport type { MarginProps } from '../props/margin.props.js';\nimport type { GetPropDefTypes } from '../props/prop-def.js';\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\n\ntype TextElement = React.ElementRef<'span'>;\ntype TextOwnProps = GetPropDefTypes<typeof textPropDefs>;\ninterface CommonTextProps extends MarginProps, TextOwnProps {}\ntype TextSpanProps = { as?: 'span' } & ComponentPropsWithout<'span', RemovedProps>;\ntype TextDivProps = { as: 'div' } & ComponentPropsWithout<'div', RemovedProps>;\ntype TextLabelProps = { as: 'label' } & ComponentPropsWithout<'label', RemovedProps>;\ntype TextPProps = { as: 'p' } & ComponentPropsWithout<'p', RemovedProps>;\ntype TextProps = CommonTextProps & (TextSpanProps | TextDivProps | TextLabelProps | TextPProps);\n\n// Pre-merge prop definitions at module level to avoid per-render allocation\nconst mergedPropDefs = { ...textPropDefs, ...marginPropDefs };\n\nconst Text = React.memo(\n React.forwardRef<TextElement, TextProps>((props, forwardedRef) => {\n const {\n children,\n className,\n asChild,\n as: Tag = 'span',\n color,\n ...textProps\n } = extractProps(props, mergedPropDefs);\n\n const combinedClassName = className ? `rt-Text ${className}` : 'rt-Text';\n\n if (asChild) {\n return (\n <Slot.Root\n data-accent-color={color}\n {...textProps}\n ref={forwardedRef}\n className={combinedClassName}\n >\n {children}\n </Slot.Root>\n );\n }\n\n return (\n <Tag\n data-accent-color={color}\n {...(textProps as React.HTMLAttributes<HTMLElement>)}\n ref={forwardedRef as any}\n className={combinedClassName}\n >\n {children}\n </Tag>\n );\n })\n);\nText.displayName = 'Text';\n\nexport { Text };\nexport type { TextProps };\n", "import { asChildPropDef } from '../props/as-child.prop.js';\nimport { colorPropDef } from '../props/color.prop.js';\nimport { highContrastPropDef } from '../props/high-contrast.prop.js';\nimport { leadingTrimPropDef } from '../props/leading-trim.prop.js';\nimport { textAlignPropDef } from '../props/text-align.prop.js';\nimport { textWrapPropDef } from '../props/text-wrap.prop.js';\nimport { truncatePropDef } from '../props/truncate.prop.js';\nimport { fontFamilyPropDef } from '../props/font-family.prop.js';\nimport { weightPropDef } from '../props/weight.prop.js';\n\nimport type { PropDef } from '../props/prop-def.js';\n\nconst as = ['span', 'div', 'label', 'p'] as const;\nconst sizes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'] as const;\n\nconst textPropDefs = {\n as: { type: 'enum', values: as, default: 'span' },\n ...asChildPropDef,\n size: {\n type: 'enum',\n className: 'rt-r-size',\n values: sizes,\n responsive: true,\n },\n ...fontFamilyPropDef,\n ...weightPropDef,\n ...textAlignPropDef,\n ...leadingTrimPropDef,\n ...truncatePropDef,\n ...textWrapPropDef,\n ...colorPropDef,\n ...highContrastPropDef,\n} satisfies {\n as: PropDef<(typeof as)[number]>;\n size: PropDef<(typeof sizes)[number]>;\n};\n\nexport { textPropDefs };\n", "import * as React from 'react';\n\n/** A function that throws an error when a value isn't a valid React Element, otherwise returns the value */\nexport const requireReactElement = <T extends React.ReactNode>(children: T): T => {\n const isReactElement = React.isValidElement(children);\n\n if (!isReactElement) {\n throw Error(\n `Expected a single React Element child, but got: ${React.Children.toArray(children)\n .map((child) =>\n typeof child === 'object' && 'type' in child && typeof child.type === 'string'\n ? child.type\n : typeof child\n )\n .join(', ')}`\n );\n }\n\n return children;\n};\n", "import * as React from 'react';\n\nlet cleanupInstalled = false;\n\n/**\n * Hook to cleanup stuck pointer-events: none on document.body\n *\n * This addresses an issue where react-remove-scroll (used by Radix UI Dialog)\n * sometimes fails to restore body pointer-events after dialog closes,\n * leaving the page unclickable.\n */\nexport function useBodyPointerEventsCleanup() {\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n if (cleanupInstalled) return;\n\n cleanupInstalled = true;\n\n const hasOpenModal = (): boolean => {\n // Check for open dialogs/alertdialogs\n const hasDialogs = Boolean(\n document.querySelector(\n '[role=\"dialog\"][aria-modal=\"true\"], [role=\"alertdialog\"][aria-modal=\"true\"]',\n ),\n );\n\n // Also check for any Radix overlays that are still mounted\n const hasRadixOverlays = Boolean(\n document.querySelector('[data-radix-popper-content-wrapper], [data-state=\"open\"]'),\n );\n\n return hasDialogs || hasRadixOverlays;\n };\n\n const forceCleanup = () => {\n // Aggressive cleanup - remove pointer-events regardless\n if (document.body.style.pointerEvents === 'none') {\n console.log('[KookieUI] Force cleaning stuck pointer-events: none from body');\n document.body.style.pointerEvents = '';\n\n // Also remove any scroll-lock related attributes\n document.body.removeAttribute('data-scroll-locked');\n document.body.removeAttribute('data-remove-scroll');\n\n // Remove any classes that might be causing issues\n document.body.classList.remove('ReactModal__Body--open');\n }\n };\n\n const safeCleanup = () => {\n if (document.body.style.pointerEvents === 'none' && !hasOpenModal()) {\n console.log('[KookieUI] Safe cleaning stuck pointer-events: none from body');\n document.body.style.pointerEvents = '';\n }\n };\n\n // Force cleanup on any click outside modal content\n const onDocumentClick = (event: Event) => {\n const target = event.target as Element;\n if (\n target &&\n !target.closest(\n '[role=\"dialog\"], [role=\"alertdialog\"], [data-radix-popper-content-wrapper]',\n )\n ) {\n // Clicked outside any modal - force cleanup after a short delay\n setTimeout(forceCleanup, 100);\n }\n };\n\n // Force cleanup on ESC key\n const onEscapeKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setTimeout(forceCleanup, 200);\n }\n };\n\n // Safe cleanup on other interactions\n const onInteraction = () => {\n setTimeout(safeCleanup, 50);\n };\n\n // Install global listeners\n document.addEventListener('click', onDocumentClick, true);\n document.addEventListener('keydown', onEscapeKey, true);\n document.addEventListener('pointerup', onInteraction, true);\n document.addEventListener('transitionend', onInteraction, true);\n document.addEventListener('animationend', onInteraction, true);\n\n // Watch for DOM changes that might indicate overlay removal\n const observer = new MutationObserver(() => {\n setTimeout(safeCleanup, 0);\n });\n observer.observe(document.body, { childList: true, subtree: true, attributes: true });\n\n // Fallback periodic cleanup\n const intervalId = setInterval(() => {\n if (document.body.style.pointerEvents === 'none' && !hasOpenModal()) {\n console.log('[KookieUI] Periodic cleanup of stuck pointer-events');\n document.body.style.pointerEvents = '';\n }\n }, 1000);\n\n // Initial cleanup\n setTimeout(safeCleanup, 100);\n\n // Cleanup function (keep listeners for app lifetime)\n return () => {\n clearInterval(intervalId);\n };\n }, []);\n}\n", "import { VisuallyHidden as VisuallyHiddenPrimitive } from 'radix-ui';\nexport const VisuallyHidden = VisuallyHiddenPrimitive.Root;\nexport const Root = VisuallyHiddenPrimitive.Root;\nexport type VisuallyHiddenProps = VisuallyHiddenPrimitive.VisuallyHiddenProps;\n", "import * as React from 'react';\nimport type { Breakpoint, PresentationValue, ResponsivePresentation } from './shell.types.js';\nimport { _BREAKPOINTS } from './shell.types.js';\nimport { useShell } from './shell.context.js';\n\nfunction useResponsivePresentation(presentation: ResponsivePresentation): PresentationValue {\n const { currentBreakpoint } = useShell();\n\n return React.useMemo(() => {\n if (typeof presentation === 'string') {\n return presentation;\n }\n\n if (presentation[currentBreakpoint]) {\n return presentation[currentBreakpoint]!;\n }\n\n const bpKeys = Object.keys(_BREAKPOINTS) as Array<keyof typeof _BREAKPOINTS>;\n const order: Breakpoint[] = ([...bpKeys].reverse() as Breakpoint[]).concat('initial' as Breakpoint);\n const startIdx = order.indexOf(currentBreakpoint as Breakpoint);\n\n for (let i = startIdx + 1; i < order.length; i++) {\n const bp = order[i];\n if (presentation[bp]) {\n return presentation[bp]!;\n }\n }\n\n return 'fixed';\n }, [presentation, currentBreakpoint]);\n}\n\n/**\n * Resolve a responsive value (T or responsive map keyed by breakpoints) against the current Shell breakpoint.\n * If no value is defined for the current breakpoint, search smaller breakpoints down to 'initial'.\n * Returns undefined when passed a responsive map with no matching key across the chain.\n */\nfunction useResponsiveValue<T>(value: T | Partial<Record<Breakpoint, T>> | undefined): T | undefined {\n const { currentBreakpoint } = useShell();\n\n return React.useMemo(() => {\n if (value == null) return undefined;\n // Primitive value\n if (typeof value !== 'object') {\n return value as T;\n }\n\n const map = value as Partial<Record<Breakpoint, T>>;\n if (map[currentBreakpoint as Breakpoint] !== undefined) {\n return map[currentBreakpoint as Breakpoint] as T;\n }\n\n const bpKeys = Object.keys(_BREAKPOINTS) as Array<keyof typeof _BREAKPOINTS>;\n const order: Breakpoint[] = ([...bpKeys].reverse() as Breakpoint[]).concat('initial' as Breakpoint);\n const startIdx = order.indexOf(currentBreakpoint as Breakpoint);\n\n for (let i = startIdx + 1; i < order.length; i++) {\n const bp = order[i];\n if (map[bp] !== undefined) {\n return map[bp] as T;\n }\n }\n\n return undefined;\n }, [value, currentBreakpoint]);\n}\n\ntype ResponsiveStateValue<T> = T | Partial<Record<Breakpoint, T>>;\n\ninterface UseResponsiveInitialStateOptions<T> {\n controlledValue?: ResponsiveStateValue<T>;\n defaultValue?: ResponsiveStateValue<T>;\n currentValue: T;\n setValue: (value: T) => void;\n breakpointReady: boolean;\n onInit?: (value: T) => void;\n onResponsiveChange?: (value: T) => void;\n controlledIsResponsive?: boolean;\n}\n\ninterface UseResponsiveInitialStateResult<T> {\n resolvedControlled?: T;\n resolvedDefault?: T;\n}\n\nfunction useResponsiveInitialState<T>({\n controlledValue,\n defaultValue,\n currentValue,\n setValue,\n breakpointReady,\n onInit,\n onResponsiveChange,\n controlledIsResponsive = false,\n}: UseResponsiveInitialStateOptions<T>): UseResponsiveInitialStateResult<T> {\n const resolvedControlled = useResponsiveValue(controlledValue);\n const resolvedDefault = useResponsiveValue(defaultValue);\n\n const lastControlledRef = React.useRef<T | undefined>(undefined);\n const pendingSyncRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestControlledRef = React.useRef<T | undefined>(resolvedControlled);\n const latestValueRef = React.useRef(currentValue);\n const setValueRef = React.useRef(setValue);\n\n React.useLayoutEffect(() => {\n latestControlledRef.current = resolvedControlled;\n latestValueRef.current = currentValue;\n setValueRef.current = setValue;\n });\n\n React.useEffect(() => {\n if (resolvedControlled === undefined) return;\n\n const prevControlled = lastControlledRef.current;\n const controlledChanged = prevControlled !== resolvedControlled;\n lastControlledRef.current = resolvedControlled;\n\n if (currentValue === resolvedControlled) {\n if (pendingSyncRef.current) {\n clearTimeout(pendingSyncRef.current);\n pendingSyncRef.current = null;\n }\n if (controlledIsResponsive) {\n onResponsiveChange?.(resolvedControlled);\n }\n return;\n }\n\n if (controlledChanged) {\n if (pendingSyncRef.current) {\n clearTimeout(pendingSyncRef.current);\n pendingSyncRef.current = null;\n }\n setValue(resolvedControlled);\n if (controlledIsResponsive) {\n onResponsiveChange?.(resolvedControlled);\n }\n return;\n }\n\n if (!pendingSyncRef.current) {\n pendingSyncRef.current = setTimeout(() => {\n pendingSyncRef.current = null;\n const latestControlled = latestControlledRef.current;\n const latestValue = latestValueRef.current;\n if (latestControlled === undefined) return;\n if (latestValue === latestControlled) return;\n setValueRef.current(latestControlled);\n }, 0);\n }\n }, [resolvedControlled, currentValue, setValue, onResponsiveChange, controlledIsResponsive]);\n\n React.useEffect(() => {\n return () => {\n if (pendingSyncRef.current) {\n clearTimeout(pendingSyncRef.current);\n pendingSyncRef.current = null;\n }\n };\n }, []);\n\n const didInitRef = React.useRef(false);\n React.useEffect(() => {\n if (didInitRef.current) return;\n if (!breakpointReady) return;\n if (typeof controlledValue !== 'undefined') return;\n if (resolvedDefault === undefined) return;\n didInitRef.current = true;\n if (currentValue !== resolvedDefault) {\n setValue(resolvedDefault);\n }\n onInit?.(resolvedDefault);\n }, [breakpointReady, controlledValue, resolvedDefault, currentValue, setValue, onInit]);\n\n return { resolvedControlled, resolvedDefault };\n}\n\nexport { useResponsivePresentation, useResponsiveValue, useResponsiveInitialState };\n", "import type * as React from 'react';\n\nexport type PresentationValue = 'fixed' | 'overlay' | 'stacked';\n\nexport type ResponsivePresentation = PresentationValue | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', PresentationValue>>;\n\nexport type PaneMode = 'expanded' | 'collapsed';\nexport type SidebarMode = 'collapsed' | 'thin' | 'expanded';\n\nexport type ResponsiveMode = PaneMode | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', PaneMode>>;\n\nexport type ResponsiveSidebarMode = SidebarMode | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', SidebarMode>>;\n\nexport type Responsive<T> = T | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', T>>;\n\nexport type PaneSizePersistence = {\n load?: () => number | Promise<number | undefined> | undefined;\n save?: (size: number) => void | Promise<void>;\n};\n\nexport interface PaneBaseProps extends React.ComponentPropsWithoutRef<'div'> {\n presentation?: ResponsivePresentation;\n expandedSize?: number;\n minSize?: number;\n maxSize?: number;\n height?: string | number;\n resizable?: boolean;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n onResize?: (size: number) => void;\n resizer?: React.ReactNode;\n onResizeStart?: (size: number) => void;\n onResizeEnd?: (size: number) => void;\n snapPoints?: number[];\n snapTolerance?: number;\n collapseThreshold?: number;\n paneId?: string;\n persistence?: PaneSizePersistence;\n}\n\nexport const _BREAKPOINTS = {\n xs: '(min-width: 520px)',\n sm: '(min-width: 768px)',\n md: '(min-width: 1024px)',\n lg: '(min-width: 1280px)',\n xl: '(min-width: 1640px)',\n} as const;\n\nexport type Breakpoint = 'initial' | keyof typeof _BREAKPOINTS;\n\nexport type PaneTarget = 'left' | 'rail' | 'panel' | 'sidebar' | 'inspector' | 'bottom';\n\n/**\n * CSS custom property key type for type-safe style objects.\n * Allows any string prefixed with '--'.\n */\nexport type CSSCustomProperty = `--${string}`;\n\n/**\n * Style object that supports CSS custom properties.\n */\nexport type CSSPropertiesWithVars = React.CSSProperties & {\n [key: CSSCustomProperty]: string | number | undefined;\n};\n", "import * as React from 'react';\nimport type { Breakpoint, PresentationValue, SidebarMode, PaneMode, PaneTarget } from './shell.types.js';\n\nexport interface ShellContextValue {\n // Pane states\n leftMode: PaneMode;\n setLeftMode: (mode: PaneMode) => void;\n /** When Rail is controlled, this reflects the resolved open state for the current breakpoint. */\n leftControlledOpen?: boolean;\n panelMode: PaneMode; // Panel state within left container\n setPanelMode: (mode: PaneMode) => void;\n sidebarMode: SidebarMode;\n setSidebarMode: (mode: SidebarMode) => void;\n inspectorMode: PaneMode;\n setInspectorMode: (mode: PaneMode) => void;\n bottomMode: PaneMode;\n setBottomMode: (mode: PaneMode) => void;\n\n // Peek state (layout-only, ephemeral)\n peekTarget: PaneTarget | null;\n setPeekTarget: (target: PaneTarget | null) => void;\n peekPane: (target: PaneTarget) => void;\n clearPeek: () => void;\n\n // Composition detection\n hasLeft: boolean;\n setHasLeft: (has: boolean) => void;\n hasSidebar: boolean;\n setHasSidebar: (has: boolean) => void;\n\n // Presentation resolution\n currentBreakpoint: Breakpoint;\n currentBreakpointReady: boolean;\n leftResolvedPresentation?: PresentationValue;\n\n // Actions\n togglePane: (target: PaneTarget) => void;\n expandPane: (target: PaneTarget) => void;\n collapsePane: (target: PaneTarget) => void;\n // Toggle customization\n setSidebarToggleComputer?: (fn: (current: SidebarMode) => SidebarMode) => void;\n // Dev-only hooks for presentation warnings\n onLeftPres?: (p: PresentationValue) => void;\n // Sizing info for overlay grouping\n onLeftDefaults?: (size: number) => void;\n onRailDefaults?: (size: number) => void;\n onPanelDefaults?: (size: number) => void;\n}\n\nconst ShellContext = React.createContext<ShellContextValue | null>(null);\n\n/** @internal Shell root context. Prefer slice hooks (useSidebarMode, useShellActions, etc.). */\nexport function useShell() {\n const ctx = React.useContext(ShellContext);\n if (!ctx) throw new Error('Shell components must be used within <Shell.Root>');\n return ctx;\n}\n\nexport function ShellProvider({ value, children }: { value: ShellContextValue; children: React.ReactNode }) {\n return <ShellContext.Provider value={value}>{children}</ShellContext.Provider>;\n}\n\n// Phase 7: Split contexts for render isolation\n\n// Pane mode slice contexts\ntype ModeSetter<T> = (mode: T) => void;\n\nexport const LeftModeContext = React.createContext<{ leftMode: PaneMode; setLeftMode: ModeSetter<PaneMode> } | null>(null);\nexport function useLeftMode() {\n const ctx = React.useContext(LeftModeContext);\n if (!ctx) throw new Error('useLeftMode must be used within Shell.Root');\n return ctx;\n}\n\nexport const PanelModeContext = React.createContext<{ panelMode: PaneMode; setPanelMode: ModeSetter<PaneMode> } | null>(null);\nexport function usePanelMode() {\n const ctx = React.useContext(PanelModeContext);\n if (!ctx) throw new Error('usePanelMode must be used within Shell.Root');\n return ctx;\n}\n\nexport const SidebarModeContext = React.createContext<{ sidebarMode: SidebarMode; setSidebarMode: ModeSetter<SidebarMode> } | null>(null);\nexport function useSidebarMode() {\n const ctx = React.useContext(SidebarModeContext);\n if (!ctx) throw new Error('useSidebarMode must be used within Shell.Root');\n return ctx;\n}\n\nexport const InspectorModeContext = React.createContext<{ inspectorMode: PaneMode; setInspectorMode: ModeSetter<PaneMode> } | null>(null);\nexport function useInspectorMode() {\n const ctx = React.useContext(InspectorModeContext);\n if (!ctx) throw new Error('useInspectorMode must be used within Shell.Root');\n return ctx;\n}\n\nexport const BottomModeContext = React.createContext<{ bottomMode: PaneMode; setBottomMode: ModeSetter<PaneMode> } | null>(null);\nexport function useBottomMode() {\n const ctx = React.useContext(BottomModeContext);\n if (!ctx) throw new Error('useBottomMode must be used within Shell.Root');\n return ctx;\n}\n\n// Presentation slice\nexport const PresentationContext = React.createContext<{ currentBreakpoint: Breakpoint; currentBreakpointReady: boolean; leftResolvedPresentation?: PresentationValue } | null>(null);\nexport function usePresentation() {\n const ctx = React.useContext(PresentationContext);\n if (!ctx) throw new Error('usePresentation must be used within Shell.Root');\n return ctx;\n}\n\n// Peek slice\nexport const PeekContext = React.createContext<{ peekTarget: PaneTarget | null; setPeekTarget: (t: PaneTarget | null) => void; peekPane: (t: PaneTarget) => void; clearPeek: () => void } | null>(\n null,\n);\nexport function usePeek() {\n const ctx = React.useContext(PeekContext);\n if (!ctx) throw new Error('usePeek must be used within Shell.Root');\n return ctx;\n}\n\n// Actions slice (stable callbacks)\nexport const ActionsContext = React.createContext<{\n togglePane: (t: PaneTarget) => void;\n expandPane: (t: PaneTarget) => void;\n collapsePane: (t: PaneTarget) => void;\n setSidebarToggleComputer?: (fn: (current: SidebarMode) => SidebarMode) => void;\n} | null>(null);\nexport function useShellActions() {\n const ctx = React.useContext(ActionsContext);\n if (!ctx) throw new Error('useShellActions must be used within Shell.Root');\n return ctx;\n}\n\n// Composition slice\nexport const CompositionContext = React.createContext<{ hasLeft: boolean; setHasLeft: (v: boolean) => void; hasSidebar: boolean; setHasSidebar: (v: boolean) => void } | null>(null);\nexport function useComposition() {\n const ctx = React.useContext(CompositionContext);\n if (!ctx) throw new Error('useComposition must be used within Shell.Root');\n return ctx;\n}\n\n// Inset slice - tracks which panes have inset for gray backdrop\nexport type InsetPaneId = 'left' | 'sidebar' | 'content' | 'inspector' | 'bottom';\nexport const InsetContext = React.createContext<{\n insetPanes: Set<InsetPaneId>;\n registerInset: (id: InsetPaneId) => void;\n unregisterInset: (id: InsetPaneId) => void;\n hasAnyInset: boolean;\n} | null>(null);\nexport function useInset() {\n const ctx = React.useContext(InsetContext);\n if (!ctx) throw new Error('useInset must be used within Shell.Root');\n return ctx;\n}\n", "import * as React from 'react';\n\nexport interface PaneResizeContextValue {\n containerRef: React.RefObject<HTMLDivElement | null>;\n cssVarName: string;\n minSize: number;\n maxSize: number;\n defaultSize: number;\n orientation: 'vertical' | 'horizontal';\n edge: 'start' | 'end';\n computeNext: (clientPos: number, startClientPos: number, startSize: number) => number;\n onResize?: (size: number) => void;\n onResizeStart?: (size: number) => void;\n onResizeEnd?: (size: number) => void;\n target: 'left' | 'rail' | 'panel' | 'sidebar' | 'inspector' | 'bottom';\n collapsible: boolean;\n snapPoints?: number[];\n snapTolerance: number;\n collapseThreshold?: number;\n requestCollapse?: () => void;\n requestToggle?: () => void;\n}\n\nexport const PaneResizeContext = React.createContext<PaneResizeContextValue | null>(null);\n\nexport function usePaneResize() {\n const ctx = React.useContext(PaneResizeContext);\n if (!ctx) throw new Error('Shell.Handle must be used within a resizable pane');\n return ctx;\n}\n", "import * as React from 'react';\nimport classNames from 'classnames';\nimport { usePaneResize } from './shell-resize.js';\n\nexport const PaneHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>(({ className, children, ...props }, ref) => {\n const {\n containerRef,\n cssVarName,\n minSize,\n maxSize,\n defaultSize,\n orientation,\n edge,\n computeNext,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n collapsible,\n target,\n requestCollapse,\n requestToggle,\n } = usePaneResize();\n\n const activeCleanupRef = React.useRef<(() => void) | null>(null);\n React.useEffect(\n () => () => {\n try {\n activeCleanupRef.current?.();\n } catch {}\n activeCleanupRef.current = null;\n },\n [],\n );\n\n const ariaOrientation = orientation;\n\n // Generate accessible label from target\n const targetLabel = target.charAt(0).toUpperCase() + target.slice(1);\n const ariaLabel = `Resize ${targetLabel} pane`;\n\n return (\n <div\n {...props}\n ref={ref}\n className={classNames('rt-ShellResizer', className)}\n data-orientation={orientation}\n data-edge={edge}\n role=\"slider\"\n aria-label={ariaLabel}\n aria-orientation={ariaOrientation}\n aria-valuemin={minSize}\n aria-valuemax={maxSize}\n aria-valuenow={defaultSize}\n tabIndex={0}\n onPointerDown={(e) => {\n if (!containerRef.current) return;\n e.preventDefault();\n const container = containerRef.current;\n const handleEl = e.currentTarget as HTMLElement;\n const pointerId = e.pointerId;\n try {\n activeCleanupRef.current?.();\n } catch {}\n container.setAttribute('data-resizing', '');\n try {\n handleEl.setPointerCapture(pointerId);\n } catch {}\n const startClient = orientation === 'vertical' ? e.clientX : e.clientY;\n const startSize = parseFloat(getComputedStyle(container).getPropertyValue(cssVarName) || `${defaultSize}`);\n const clamp = (v: number) => Math.min(Math.max(v, minSize), maxSize);\n const body = document.body;\n const prevCursor = body.style.cursor;\n const prevUserSelect = body.style.userSelect;\n body.style.cursor = orientation === 'vertical' ? 'col-resize' : 'row-resize';\n body.style.userSelect = 'none';\n onResizeStart?.(startSize);\n const handleMove = (ev: PointerEvent) => {\n const client = orientation === 'vertical' ? ev.clientX : ev.clientY;\n const next = clamp(computeNext(client, startClient, startSize));\n container.style.setProperty(cssVarName, `${next}px`);\n handleEl.setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n };\n const cleanup = () => {\n try {\n handleEl.releasePointerCapture(pointerId);\n } catch {}\n window.removeEventListener('pointermove', handleMove as EventListener);\n document.removeEventListener('pointermove', handleMove as EventListener);\n window.removeEventListener('mousemove', handleMove as EventListener);\n document.removeEventListener('mousemove', handleMove as EventListener);\n handleEl.removeEventListener('pointermove', handleMove as EventListener);\n window.removeEventListener('pointerup', handleUp as EventListener);\n document.removeEventListener('pointerup', handleUp as EventListener);\n window.removeEventListener('mouseup', handleUp as EventListener);\n document.removeEventListener('mouseup', handleUp as EventListener);\n window.removeEventListener('pointercancel', handleUp as EventListener);\n document.removeEventListener('pointercancel', handleUp as EventListener);\n window.removeEventListener('keydown', handleKey as EventListener);\n handleEl.removeEventListener('lostpointercapture', handleUp as EventListener);\n container.removeAttribute('data-resizing');\n body.style.cursor = prevCursor;\n body.style.userSelect = prevUserSelect;\n activeCleanupRef.current = null;\n };\n const handleUp = () => {\n const finalSize = parseFloat(getComputedStyle(container).getPropertyValue(cssVarName) || `${defaultSize}`);\n let snapped = finalSize;\n if (snapPoints && snapPoints.length) {\n const nearest = snapPoints.reduce((acc, p) => (Math.abs(p - finalSize) < Math.abs(acc - finalSize) ? p : acc), snapPoints[0]);\n if (Math.abs(nearest - finalSize) <= (snapTolerance ?? 8)) {\n snapped = nearest;\n container.style.setProperty(cssVarName, `${snapped}px`);\n handleEl.setAttribute('aria-valuenow', String(snapped));\n onResize?.(snapped);\n }\n }\n if (collapsible && typeof collapseThreshold === 'number' && finalSize <= collapseThreshold) {\n requestCollapse?.();\n }\n onResizeEnd?.(snapped);\n cleanup();\n };\n const handleKey = (kev: KeyboardEvent) => {\n if (kev.key === 'Escape') {\n container.style.setProperty(cssVarName, `${startSize}px`);\n handleEl.setAttribute('aria-valuenow', String(startSize));\n onResizeEnd?.(startSize);\n cleanup();\n }\n };\n window.addEventListener('pointermove', handleMove as EventListener);\n document.addEventListener('pointermove', handleMove as EventListener);\n // Fallbacks for environments that don't fully support PointerEvent on window\n window.addEventListener('mousemove', handleMove as EventListener);\n document.addEventListener('mousemove', handleMove as EventListener);\n handleEl.addEventListener('pointermove', handleMove as EventListener);\n window.addEventListener('pointerup', handleUp as EventListener);\n document.addEventListener('pointerup', handleUp as EventListener);\n window.addEventListener('mouseup', handleUp as EventListener);\n document.addEventListener('mouseup', handleUp as EventListener);\n window.addEventListener('pointercancel', handleUp as EventListener);\n document.addEventListener('pointercancel', handleUp as EventListener);\n window.addEventListener('keydown', handleKey as EventListener);\n handleEl.addEventListener('lostpointercapture', handleUp as EventListener);\n activeCleanupRef.current = cleanup;\n }}\n onDoubleClick={() => {\n if (collapsible) requestToggle?.();\n }}\n onKeyDown={(e) => {\n if (!containerRef.current) return;\n const container = containerRef.current;\n const rawCurrent = getComputedStyle(container).getPropertyValue(cssVarName);\n const parsedCurrent = Number.parseFloat(rawCurrent.trim());\n const current = Number.isFinite(parsedCurrent) ? parsedCurrent : defaultSize;\n const clamp = (v: number) => Math.min(Math.max(v, minSize), maxSize);\n const step = e.shiftKey ? 32 : 8;\n let delta = 0;\n if (orientation === 'vertical') {\n const docDir = typeof document !== 'undefined' ? document.dir : undefined;\n const cssDir = getComputedStyle(container).direction;\n const hasRtlAncestor = !!(container.closest && container.closest('[dir=\"rtl\"]'));\n const isRtl = docDir === 'rtl' || cssDir === 'rtl' || hasRtlAncestor;\n if (e.key === 'ArrowRight')\n delta = isRtl ? -step : step; // inline-end\n else if (e.key === 'ArrowLeft') delta = isRtl ? step : -step; // inline-start\n } else {\n if (e.key === 'ArrowDown') delta = step;\n else if (e.key === 'ArrowUp') delta = -step;\n }\n if (e.key === 'Home') {\n e.preventDefault();\n onResizeStart?.(current);\n const next = clamp(minSize);\n container.style.setProperty(cssVarName, `${next}px`);\n (e.currentTarget as HTMLElement).setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n onResizeEnd?.(next);\n return;\n }\n if (e.key === 'End') {\n e.preventDefault();\n onResizeStart?.(current);\n const next = clamp(maxSize);\n container.style.setProperty(cssVarName, `${next}px`);\n (e.currentTarget as HTMLElement).setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n onResizeEnd?.(next);\n return;\n }\n if (delta !== 0) {\n e.preventDefault();\n onResizeStart?.(current);\n const signedDelta = orientation === 'vertical' ? (edge === 'start' ? -delta : delta) : delta;\n const next = clamp(current + signedDelta);\n container.style.setProperty(cssVarName, `${next}px`);\n (e.currentTarget as HTMLElement).setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n onResizeEnd?.(next);\n }\n }}\n >\n {children}\n </div>\n );\n});\nPaneHandle.displayName = 'Shell.Handle';\n\nexport const PanelHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>((props, ref) => <PaneHandle {...props} ref={ref} />);\nPanelHandle.displayName = 'Shell.Panel.Handle';\n\nexport const SidebarHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>((props, ref) => <PaneHandle {...props} ref={ref} />);\nSidebarHandle.displayName = 'Shell.Sidebar.Handle';\n\nexport const InspectorHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>((props, ref) => <PaneHandle {...props} ref={ref} />);\nInspectorHandle.displayName = 'Shell.Inspector.Handle';\n\nexport const BottomHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>((props, ref) => <PaneHandle {...props} ref={ref} />);\nBottomHandle.displayName = 'Shell.Bottom.Handle';\n", "import type { Breakpoint, PaneMode } from '../shell.types.js';\n\ntype KeyList<T> = readonly (keyof T)[];\n\nexport function omitPaneProps<T extends object, K extends KeyList<T>>(source: T, keys: K) {\n const omitSet = new Set<keyof T>(keys as readonly (keyof T)[]);\n const result: Partial<T> = {};\n (Object.keys(source) as Array<keyof T>).forEach((key) => {\n if (!omitSet.has(key)) {\n result[key] = source[key];\n }\n });\n return result as Omit<T, K[number]>;\n}\n\nconst PANE_BASE_INTERNAL_PROPS = [\n 'presentation',\n 'expandedSize',\n 'minSize',\n 'maxSize',\n 'resizable',\n 'collapsible',\n 'onExpand',\n 'onCollapse',\n 'onResize',\n 'resizer',\n 'onResizeStart',\n 'onResizeEnd',\n 'snapPoints',\n 'snapTolerance',\n 'collapseThreshold',\n 'paneId',\n 'persistence',\n 'inset',\n] as const;\n\nexport function extractPaneDomProps<T extends object, Extra extends KeyList<T> | undefined = undefined>(source: T, extraKeys?: Extra) {\n const omitKeys = extraKeys ? [...PANE_BASE_INTERNAL_PROPS, ...extraKeys] : [...PANE_BASE_INTERNAL_PROPS];\n return omitPaneProps(source, omitKeys as ReadonlyArray<keyof T>);\n}\n\nexport function mapResponsiveBooleanToPaneMode(value?: boolean | Partial<Record<Breakpoint, boolean>>): PaneMode | Partial<Record<Breakpoint, PaneMode>> | undefined {\n if (value == null) return undefined;\n if (typeof value === 'object') {\n const mapped: Partial<Record<Breakpoint, PaneMode>> = {};\n (Object.entries(value) as Array<[string, boolean]>).forEach(([bp, val]) => {\n if (typeof val === 'boolean') {\n mapped[bp as Breakpoint] = val ? 'expanded' : 'collapsed';\n }\n });\n return mapped;\n }\n return value ? 'expanded' : 'collapsed';\n}\n", "import * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from '../sheet.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { useSidebarMode, usePresentation, usePeek, useShellActions, useComposition, useInset } from '../shell.context.js';\nimport { useResponsivePresentation, useResponsiveInitialState } from '../shell.hooks.js';\nimport { PaneResizeContext } from './shell-resize.js';\nimport { extractPaneDomProps } from './shell-prop-helpers.js';\nimport { SidebarHandle, PaneHandle } from './shell-handles.js';\nimport type { Breakpoint, PaneMode, PaneSizePersistence, SidebarMode, Responsive, PaneBaseProps, CSSPropertiesWithVars } from '../shell.types.js';\nimport { _BREAKPOINTS } from '../shell.types.js';\nimport { normalizeToPx } from '../../helpers/normalize-to-px.js';\n\ntype SidebarPaneProps = PaneBaseProps & {\n mode?: PaneMode;\n defaultMode?: any;\n onModeChange?: (mode: PaneMode | SidebarMode) => void;\n};\n\ntype SidebarStateChangeMeta = { reason: 'init' | 'toggle' | 'responsive' };\ntype SidebarControlledProps = { state: Responsive<SidebarMode>; onStateChange?: (state: SidebarMode, meta: SidebarStateChangeMeta) => void; defaultState?: never };\ntype SidebarUncontrolledProps = { defaultState?: SidebarMode | Partial<Record<Breakpoint, SidebarMode>>; onStateChange?: (state: SidebarMode, meta: SidebarStateChangeMeta) => void; state?: never };\ntype SidebarPublicProps = Omit<SidebarPaneProps, 'mode' | 'defaultMode' | 'onModeChange'> & {\n // removed legacy mode props\n thinSize?: number;\n toggleModes?: 'both' | 'single';\n // size API (width when expanded)\n size?: number | string;\n defaultSize?: number | string;\n onSizeChange?: (size: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n} & (SidebarControlledProps | SidebarUncontrolledProps);\n\ntype SidebarComponent = React.ForwardRefExoticComponent<SidebarPublicProps & React.RefAttributes<HTMLDivElement>> & { Handle: typeof SidebarHandle };\n\nconst SIDEBAR_DOM_PROP_KEYS = [\n 'className',\n 'children',\n 'state',\n 'defaultState',\n 'onStateChange',\n 'thinSize',\n 'toggleModes',\n 'size',\n 'defaultSize',\n 'onSizeChange',\n 'sizeUpdate',\n 'sizeUpdateMs',\n 'style',\n 'inset',\n] as const satisfies readonly (keyof SidebarPublicProps)[];\n\nexport const Sidebar = React.forwardRef<HTMLDivElement, SidebarPublicProps>((initialProps, ref) => {\n const {\n className,\n presentation = { initial: 'overlay', md: 'fixed' },\n expandedSize = 288,\n minSize = 200,\n maxSize = 400,\n resizable = false,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n thinSize = 64,\n toggleModes,\n state,\n defaultState,\n onStateChange,\n size,\n defaultSize,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n inset,\n } = initialProps;\n const sidebarDomProps = extractPaneDomProps(initialProps, SIDEBAR_DOM_PROP_KEYS);\n const { sidebarMode, setSidebarMode } = useSidebarMode();\n const { currentBreakpointReady } = usePresentation();\n const { peekTarget } = usePeek();\n const { togglePane, setSidebarToggleComputer } = useShellActions();\n const { setHasSidebar } = useComposition();\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useLayoutEffect(() => {\n if (inset) {\n registerInset('sidebar');\n return () => unregisterInset('sidebar');\n }\n }, [inset, registerInset, unregisterInset]);\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n // Phase sequencing is now CSS-driven; no JS-managed phase\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === SidebarHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === SidebarHandle));\n\n // Ref for debounce cleanup\n const debounceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // Cleanup debounce timeout on unmount or when dependencies change\n React.useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = null;\n }\n };\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n // Throttled/debounced emitter for onSizeChange\n const emitSizeChange = React.useMemo(() => {\n const cb = onSizeChange as undefined | ((s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => void);\n const strategy = sizeUpdate as undefined | 'throttle' | 'debounce';\n const ms = sizeUpdateMs ?? 50;\n if (!cb) return () => {};\n if (strategy === 'debounce') {\n return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => {\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = setTimeout(() => {\n cb(s, meta);\n debounceTimeoutRef.current = null;\n }, ms);\n };\n }\n if (strategy === 'throttle') {\n let last = 0;\n return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n cb(s, meta);\n }\n };\n }\n return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => cb(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n\n // Register with shell\n const sidebarId = React.useId();\n React.useEffect(() => {\n setHasSidebar(true);\n return () => {\n setHasSidebar(false);\n };\n }, [setHasSidebar, sidebarId]);\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof state !== 'undefined' && typeof defaultState !== 'undefined') {\n console.error('Shell.Sidebar: Do not pass both `state` and `defaultState`. Choose one.');\n }\n if (typeof size !== 'undefined' && typeof defaultSize !== 'undefined') {\n console.error('Shell.Sidebar: Do not pass both `size` and `defaultSize`. Choose one.');\n }\n }\n\n // Warn on mode switch between controlled/uncontrolled\n React.useEffect(() => {\n const isControlled = typeof state !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Sidebar: Switching between controlled and uncontrolled `state` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [state]);\n\n // Stable ref for onStateChange to avoid effect dep churn\n const onStateChangeRef = React.useRef(onStateChange);\n const stateRef = React.useRef(state);\n React.useLayoutEffect(() => {\n onStateChangeRef.current = onStateChange;\n stateRef.current = state;\n });\n\n // Resolve responsive controlled state at top level\n const stateIsResponsive = typeof state === 'object' && state !== null;\n const { resolvedControlled: resolvedSidebarControlled, resolvedDefault: resolvedSidebarDefault } = useResponsiveInitialState<SidebarMode>({\n controlledValue: state,\n defaultValue: defaultState,\n currentValue: sidebarMode as SidebarMode,\n setValue: setSidebarMode,\n breakpointReady: currentBreakpointReady,\n controlledIsResponsive: stateIsResponsive,\n onResponsiveChange: (next) => onStateChangeRef.current?.(next, { reason: 'responsive' }),\n onInit: (initial) => onStateChangeRef.current?.(initial, { reason: 'init' }),\n });\n\n // Emit mode changes. In controlled mode, skip when mode matches the controlled prop.\n const lastNotifyModeRef = React.useRef<SidebarMode | null>(null);\n const lastResolvedSidebarControlledRef = React.useRef<SidebarMode | undefined>(undefined);\n React.useEffect(() => {\n const current = sidebarMode as SidebarMode;\n const prevMode = lastNotifyModeRef.current;\n const prevResolvedControlled = lastResolvedSidebarControlledRef.current;\n const controlledChanged = prevResolvedControlled !== resolvedSidebarControlled;\n\n if (prevMode !== null && prevMode !== current) {\n const isControlled = typeof stateRef.current !== 'undefined';\n\n if (!isControlled || (!controlledChanged && current !== resolvedSidebarControlled)) {\n onStateChangeRef.current?.(current, { reason: 'toggle' });\n }\n }\n\n lastNotifyModeRef.current = current;\n lastResolvedSidebarControlledRef.current = resolvedSidebarControlled;\n }, [sidebarMode, resolvedSidebarControlled]);\n\n // Track previous mode to only fire callbacks on actual user-initiated state transitions.\n // We wait for breakpointReady to ensure the initial state sync from useResponsiveInitialState\n // is complete before enabling callbacks. This avoids spurious callbacks during initialization.\n // Use callback refs to avoid re-running effect when inline callbacks change.\n const onExpandRef = React.useRef(onExpand);\n const onCollapseRef = React.useRef(onCollapse);\n React.useLayoutEffect(() => {\n onExpandRef.current = onExpand;\n onCollapseRef.current = onCollapse;\n });\n\n const prevSidebarModeRef = React.useRef<SidebarMode | null>(null);\n const hasInitializedRef = React.useRef(false);\n React.useEffect(() => {\n const currentMode = sidebarMode as SidebarMode;\n\n // Wait for breakpoint to be ready before enabling callbacks\n if (!currentBreakpointReady) {\n prevSidebarModeRef.current = currentMode;\n return;\n }\n\n // Skip the first run after breakpoint is ready - this captures the post-sync state\n if (!hasInitializedRef.current) {\n hasInitializedRef.current = true;\n prevSidebarModeRef.current = currentMode;\n return;\n }\n\n const prevMode = prevSidebarModeRef.current;\n\n // Only fire on actual state transitions\n if (prevMode !== null && prevMode !== currentMode) {\n // onExpand: when becoming visible (collapsed \u2192 thin/expanded)\n if (prevMode === 'collapsed' && currentMode !== 'collapsed') {\n onExpandRef.current?.();\n }\n // onCollapse: when becoming hidden (any \u2192 collapsed)\n else if (currentMode === 'collapsed') {\n onCollapseRef.current?.();\n }\n prevSidebarModeRef.current = currentMode;\n }\n }, [sidebarMode, currentBreakpointReady]);\n\n // Option A: thin is width-only; content remains visible whenever not collapsed\n const isContentVisible = sidebarMode !== 'collapsed';\n\n // Default persistence if paneId provided and none supplied (fixed only)\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:sidebar:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n try {\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Sidebar: failed to load persisted size', err);\n }\n return undefined;\n }\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, String(size));\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Sidebar: failed to save persisted size', err);\n }\n }\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n React.useEffect(() => {\n let mounted = true;\n (async () => {\n if (!resizable || !persistenceAdapter?.load || isOverlay) return;\n const loaded = await persistenceAdapter.load();\n if (mounted && typeof loaded === 'number' && localRef.current) {\n localRef.current.style.setProperty('--sidebar-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n // Register custom toggle behavior based on toggleModes (both|single)\n const resolveDefaultSidebarMode = React.useCallback((): SidebarMode => {\n const resolved = resolvedSidebarDefault ?? (typeof defaultState === 'string' ? defaultState : undefined) ?? 'expanded';\n return resolved === 'thin' || resolved === 'expanded' ? resolved : 'expanded';\n }, [resolvedSidebarDefault, defaultState]);\n\n React.useEffect(() => {\n if (!setSidebarToggleComputer) return;\n const strategy: 'both' | 'single' = toggleModes ?? 'both';\n const compute = (current: SidebarMode): SidebarMode => {\n if (strategy === 'both') {\n if (current === 'collapsed') return 'thin';\n if (current === 'thin') return 'expanded';\n return 'collapsed';\n }\n const target = resolveDefaultSidebarMode();\n if (current === 'collapsed') return target;\n if (current === target) return 'collapsed';\n return target;\n };\n setSidebarToggleComputer(compute);\n return () => {\n setSidebarToggleComputer?.((cur) => (cur === 'collapsed' ? 'thin' : cur === 'thin' ? 'expanded' : 'collapsed'));\n };\n }, [setSidebarToggleComputer, toggleModes, resolveDefaultSidebarMode]);\n\n const lastOverlayWidthRef = React.useRef<number>(expandedSize);\n const lastOverlayModeRef = React.useRef<SidebarMode>('expanded');\n React.useEffect(() => {\n if (sidebarMode !== 'collapsed') {\n lastOverlayModeRef.current = sidebarMode as SidebarMode;\n lastOverlayWidthRef.current = sidebarMode === 'thin' ? thinSize : expandedSize;\n }\n }, [sidebarMode, thinSize, expandedSize]);\n\n // Remove responsive default mode behavior entirely\n\n const handleEl =\n resizable && !isOverlay && sidebarMode === 'expanded' ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--sidebar-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'end',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n return startSize + (isRtl ? -delta : delta);\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'sidebar',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => setSidebarMode('collapsed'),\n requestToggle: () => togglePane('sidebar'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n // Normalize CSS lengths to px helper\n const normalizeSizeToPx = React.useCallback((value: number | string | undefined) => normalizeToPx(value, 'horizontal'), []);\n\n // Apply defaultSize on mount when uncontrolled\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeSizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--sidebar-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync\n const controlledSize = size;\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof controlledSize === 'undefined') return;\n const px = normalizeSizeToPx(controlledSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--sidebar-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [controlledSize, minSize, maxSize, normalizeSizeToPx, emitSizeChange]);\n\n // Memoize peek styles to avoid IIFE recreation on every render\n const peekStyles = React.useMemo((): CSSPropertiesWithVars | undefined => {\n if (!(peekTarget === 'sidebar' && sidebarMode === 'collapsed' && !isOverlay)) {\n return undefined;\n }\n const strategy: 'both' | 'single' = toggleModes ?? 'both';\n const current = sidebarMode as SidebarMode;\n let next: SidebarMode;\n if (strategy === 'both') {\n next = current === 'collapsed' ? 'thin' : current === 'thin' ? 'expanded' : 'collapsed';\n } else {\n const target = resolveDefaultSidebarMode();\n next = current === 'collapsed' ? target : 'collapsed';\n }\n if (next === 'thin') {\n return { '--peek-sidebar-width': `${thinSize}px` } as CSSPropertiesWithVars;\n }\n return { '--peek-sidebar-width': `var(--sidebar-size, ${expandedSize}px)` } as CSSPropertiesWithVars;\n }, [peekTarget, sidebarMode, isOverlay, toggleModes, resolveDefaultSidebarMode, thinSize, expandedSize]);\n\n if (isOverlay) {\n const open = sidebarMode !== 'collapsed';\n return (\n <Sheet.Root open={open} onOpenChange={(o) => setSidebarMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content\n side=\"start\"\n style={{ padding: 0 }}\n aria-label=\"Navigation\"\n aria-describedby={undefined}\n width={{\n initial: `${open ? (sidebarMode === 'thin' ? thinSize : expandedSize) : lastOverlayWidthRef.current}px`,\n }}\n >\n <VisuallyHidden>\n <Sheet.Title>Navigation</Sheet.Title>\n </VisuallyHidden>\n {contentChildren}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n return (\n <div\n {...sidebarDomProps}\n ref={setRef}\n className={classNames('rt-ShellSidebar', className)}\n data-mode={sidebarMode}\n data-peek={peekTarget === 'sidebar' || undefined}\n data-presentation={currentBreakpointReady ? resolvedPresentation : undefined}\n data-open={(currentBreakpointReady && isStacked && isContentVisible) || undefined}\n data-inset={inset || undefined}\n style={{\n ...style,\n '--sidebar-size': `${expandedSize}px`,\n '--sidebar-thin-size': `${thinSize}px`,\n '--sidebar-min-size': `${minSize}px`,\n '--sidebar-max-size': `${maxSize}px`,\n ...peekStyles,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellSidebarContent\" data-visible={isContentVisible || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n}) as SidebarComponent;\n\nSidebar.displayName = 'Shell.Sidebar';\nSidebar.Handle = SidebarHandle;\n", "/**\n * Normalize CSS length values to pixels.\n * Supports: px, rem, %, and bare numbers.\n *\n * @param value - The value to normalize (number, string, or undefined)\n * @param orientation - 'horizontal' for width-based % or 'vertical' for height-based %\n * @returns The value in pixels, or undefined if invalid\n */\nexport function normalizeToPx(\n value: number | string | undefined,\n orientation: 'horizontal' | 'vertical' = 'horizontal',\n): number | undefined {\n if (value == null) return undefined;\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n\n const str = String(value).trim();\n if (!str) return undefined;\n\n // px: direct parse\n if (str.endsWith('px')) return Number.parseFloat(str);\n\n // rem: multiply by root font size\n if (str.endsWith('rem')) {\n const rem = Number.parseFloat(getComputedStyle(document.documentElement).fontSize || '16') || 16;\n return Number.parseFloat(str) * rem;\n }\n\n // %: calculate based on viewport dimension\n if (str.endsWith('%')) {\n const pct = Number.parseFloat(str);\n const base =\n orientation === 'horizontal'\n ? document.documentElement.clientWidth || window.innerWidth || 0\n : document.documentElement.clientHeight || window.innerHeight || 0;\n return (pct / 100) * base;\n }\n\n // Bare number-like string\n const n = Number.parseFloat(str);\n return Number.isFinite(n) ? n : undefined;\n}\n\n", "import * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from '../sheet.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { useBottomMode, usePresentation, usePeek, useShellActions, useInset } from '../shell.context.js';\nimport { useResponsivePresentation, useResponsiveInitialState } from '../shell.hooks.js';\nimport { PaneResizeContext } from './shell-resize.js';\nimport { BottomHandle, PaneHandle } from './shell-handles.js';\nimport { _BREAKPOINTS } from '../shell.types.js';\nimport type { Breakpoint, PaneMode, PaneSizePersistence, PaneBaseProps, CSSPropertiesWithVars } from '../shell.types.js';\nimport { extractPaneDomProps, mapResponsiveBooleanToPaneMode } from './shell-prop-helpers.js';\nimport { normalizeToPx } from '../../helpers/normalize-to-px.js';\n\ntype BottomOpenChangeMeta = { reason: 'init' | 'toggle' | 'responsive' };\ntype BottomControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: BottomOpenChangeMeta) => void; defaultOpen?: never };\ntype BottomUncontrolledProps = { defaultOpen?: boolean; onOpenChange?: (open: boolean, meta: BottomOpenChangeMeta) => void; open?: never };\ntype BottomSizeControlledProps = { size: number | string; defaultSize?: never };\ntype BottomSizeUncontrolledProps = { defaultSize?: number | string; size?: never };\ntype BottomSizeChangeMeta = { reason: 'init' | 'resize' | 'controlled' };\ntype BottomPublicProps = PaneBaseProps &\n (BottomControlledProps | BottomUncontrolledProps) &\n (BottomSizeControlledProps | BottomSizeUncontrolledProps) & {\n onSizeChange?: (size: number, meta: BottomSizeChangeMeta) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n };\n\ntype BottomComponent = React.ForwardRefExoticComponent<BottomPublicProps & React.RefAttributes<HTMLDivElement>> & { Handle: typeof BottomHandle };\n\nconst BOTTOM_DOM_PROP_KEYS = [\n 'className',\n 'children',\n 'defaultOpen',\n 'open',\n 'onOpenChange',\n 'size',\n 'defaultSize',\n 'onSizeChange',\n 'sizeUpdate',\n 'sizeUpdateMs',\n 'style',\n 'inset',\n] as const satisfies readonly (keyof BottomPublicProps)[];\n\nexport const Bottom = React.forwardRef<HTMLDivElement, BottomPublicProps>((initialProps, ref) => {\n const {\n className,\n presentation = 'fixed',\n defaultOpen,\n open,\n onOpenChange,\n expandedSize = 200,\n minSize = 100,\n maxSize = 400,\n resizable = false,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n size,\n defaultSize,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n inset,\n } = initialProps;\n const bottomDomProps = extractPaneDomProps(initialProps, BOTTOM_DOM_PROP_KEYS);\n const { bottomMode, setBottomMode } = useBottomMode();\n const { currentBreakpointReady } = usePresentation();\n const { peekTarget } = usePeek();\n const { togglePane } = useShellActions();\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useLayoutEffect(() => {\n if (inset) {\n registerInset('bottom');\n return () => unregisterInset('bottom');\n }\n }, [inset, registerInset, unregisterInset]);\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === BottomHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === BottomHandle));\n\n // Stable ref for onOpenChange to avoid effect dep churn\n const onOpenChangeRef = React.useRef(onOpenChange);\n const openRef = React.useRef(open);\n React.useLayoutEffect(() => {\n onOpenChangeRef.current = onOpenChange;\n openRef.current = open;\n });\n\n const normalizedControlledOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(open), [open]);\n const normalizedDefaultOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(defaultOpen), [defaultOpen]);\n const openIsResponsive = typeof open === 'object' && open !== null;\n const { resolvedControlled: resolvedBottomControlled } = useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedControlledOpen,\n defaultValue: normalizedDefaultOpen,\n currentValue: bottomMode,\n setValue: setBottomMode,\n breakpointReady: currentBreakpointReady,\n controlledIsResponsive: openIsResponsive,\n onResponsiveChange: (next) => onOpenChangeRef.current?.(next === 'expanded', { reason: 'responsive' }),\n onInit: (initial) => {\n if (typeof openRef.current === 'undefined') {\n onOpenChangeRef.current?.(initial === 'expanded', { reason: 'init' });\n }\n },\n });\n\n // Ref for debounce cleanup\n const debounceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // Cleanup debounce timeout on unmount or when dependencies change\n React.useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = null;\n }\n };\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n // Throttled/debounced emitter for onSizeChange\n const emitSizeChange = React.useMemo(() => {\n const cb = onSizeChange as undefined | ((s: number, meta: BottomSizeChangeMeta) => void);\n const strategy = sizeUpdate as undefined | 'throttle' | 'debounce';\n const ms = sizeUpdateMs ?? 50;\n if (!cb) return () => {};\n if (strategy === 'debounce') {\n return (s: number, meta: BottomSizeChangeMeta) => {\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = setTimeout(() => {\n cb(s, meta);\n debounceTimeoutRef.current = null;\n }, ms);\n };\n }\n if (strategy === 'throttle') {\n let last = 0;\n return (s: number, meta: BottomSizeChangeMeta) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n cb(s, meta);\n }\n };\n }\n return (s: number, meta: BottomSizeChangeMeta) => cb(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Bottom: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n if (typeof size !== 'undefined' && typeof defaultSize !== 'undefined') {\n console.error('Shell.Bottom: Do not pass both `size` and `defaultSize`. Choose one.');\n }\n }\n\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Bottom: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n // Emit mode changes. In controlled mode, skip when mode matches the controlled prop.\n const lastBottomModeRef = React.useRef<PaneMode | null>(null);\n const lastResolvedBottomControlledRef = React.useRef<PaneMode | undefined>(undefined);\n React.useEffect(() => {\n const prevMode = lastBottomModeRef.current;\n const prevResolvedControlled = lastResolvedBottomControlledRef.current;\n const controlledChanged = prevResolvedControlled !== resolvedBottomControlled;\n\n if (prevMode !== null && prevMode !== bottomMode) {\n const nextOpen = bottomMode === 'expanded';\n const isControlled = typeof openRef.current !== 'undefined';\n const controlledTarget = resolvedBottomControlled === undefined ? undefined : resolvedBottomControlled === 'expanded';\n\n if (!isControlled || (!controlledChanged && nextOpen !== controlledTarget)) {\n onOpenChangeRef.current?.(nextOpen, { reason: 'toggle' });\n }\n }\n\n lastBottomModeRef.current = bottomMode;\n lastResolvedBottomControlledRef.current = resolvedBottomControlled;\n }, [bottomMode, resolvedBottomControlled]);\n\n // Track previous mode to only fire callbacks on actual user-initiated state transitions.\n // We wait for breakpointReady to ensure the initial state sync from useResponsiveInitialState\n // is complete before enabling callbacks. This avoids spurious callbacks during initialization.\n // Use callback refs to avoid re-running effect when inline callbacks change.\n const onExpandRef = React.useRef(onExpand);\n const onCollapseRef = React.useRef(onCollapse);\n React.useLayoutEffect(() => {\n onExpandRef.current = onExpand;\n onCollapseRef.current = onCollapse;\n });\n\n const prevBottomModeRef = React.useRef<PaneMode | null>(null);\n const hasInitializedRef = React.useRef(false);\n React.useEffect(() => {\n const currentMode = bottomMode;\n\n // Wait for breakpoint to be ready before enabling callbacks\n if (!currentBreakpointReady) {\n prevBottomModeRef.current = currentMode;\n return;\n }\n\n // Skip the first run after breakpoint is ready - this captures the post-sync state\n if (!hasInitializedRef.current) {\n hasInitializedRef.current = true;\n prevBottomModeRef.current = currentMode;\n return;\n }\n\n const prevMode = prevBottomModeRef.current;\n\n // Only fire on actual state transitions\n if (prevMode !== null && prevMode !== currentMode) {\n if (currentMode === 'expanded') {\n onExpandRef.current?.();\n } else if (currentMode === 'collapsed') {\n onCollapseRef.current?.();\n }\n prevBottomModeRef.current = currentMode;\n }\n }, [bottomMode, currentBreakpointReady]);\n\n const isExpanded = bottomMode === 'expanded';\n\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:bottom:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n try {\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Bottom: failed to load persisted size', err);\n }\n return undefined;\n }\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, String(size));\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Bottom: failed to save persisted size', err);\n }\n }\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n React.useEffect(() => {\n let mounted = true;\n if (!resizable || !persistenceAdapter?.load || isOverlay) return undefined;\n const loaded = persistenceAdapter.load();\n const applyLoaded = (value?: number) => {\n if (!mounted || typeof value !== 'number' || !localRef.current) return;\n localRef.current.style.setProperty('--bottom-size', `${value}px`);\n onResize?.(value);\n };\n if (loaded instanceof Promise) {\n loaded.then(applyLoaded).catch((err) => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Bottom: failed to load persisted size', err);\n }\n });\n } else {\n applyLoaded(loaded);\n }\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n const handleEl =\n resizable && !isOverlay && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--bottom-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'horizontal',\n edge: 'start',\n computeNext: (client, startClient, startSize) => {\n const delta = client - startClient;\n return startSize - delta;\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'bottom',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => setBottomMode('collapsed'),\n requestToggle: () => togglePane('bottom'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n // Strip control/size props from DOM spread (moved above overlay return to keep hook order consistent)\n // Normalize CSS lengths to px helper\n const normalizeSizeToPx = React.useCallback((value: number | string | undefined) => normalizeToPx(value, 'vertical'), []);\n\n // Apply defaultSize on mount when uncontrolled (moved above overlay return)\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeSizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--bottom-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync (moved above overlay return)\n const controlledSize = size;\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof controlledSize === 'undefined') return;\n const px = normalizeSizeToPx(controlledSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--bottom-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [controlledSize, minSize, maxSize, normalizeSizeToPx, emitSizeChange]);\n\n if (isOverlay) {\n const open = bottomMode === 'expanded';\n return (\n <Sheet.Root open={open} onOpenChange={(o) => setBottomMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content side=\"bottom\" style={{ padding: 0 }} aria-label=\"Bottom panel\" aria-describedby={undefined} height={{ initial: `${expandedSize}px` }}>\n <VisuallyHidden>\n <Sheet.Title>Bottom panel</Sheet.Title>\n </VisuallyHidden>\n {contentChildren}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n return (\n <div\n {...bottomDomProps}\n ref={setRef}\n className={classNames('rt-ShellBottom', className)}\n data-mode={bottomMode}\n data-peek={peekTarget === 'bottom' || undefined}\n data-presentation={currentBreakpointReady ? resolvedPresentation : undefined}\n data-open={(currentBreakpointReady && isStacked && isExpanded) || undefined}\n data-inset={inset || undefined}\n style={{\n ...style,\n '--bottom-size': `${expandedSize}px`,\n '--bottom-min-size': `${minSize}px`,\n '--bottom-max-size': `${maxSize}px`,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellBottomContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n}) as BottomComponent;\nBottom.displayName = 'Shell.Bottom';\nBottom.Handle = BottomHandle;\n", "import * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from '../sheet.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { useInspectorMode, usePresentation, usePeek, useShellActions, useInset } from '../shell.context.js';\nimport { useResponsivePresentation, useResponsiveInitialState } from '../shell.hooks.js';\nimport { PaneResizeContext } from './shell-resize.js';\nimport { InspectorHandle, PaneHandle } from './shell-handles.js';\nimport { _BREAKPOINTS } from '../shell.types.js';\nimport type { Breakpoint, PaneMode, PaneSizePersistence, PaneBaseProps, CSSPropertiesWithVars } from '../shell.types.js';\nimport { extractPaneDomProps, mapResponsiveBooleanToPaneMode } from './shell-prop-helpers.js';\nimport { normalizeToPx } from '../../helpers/normalize-to-px.js';\n\ntype InspectorOpenChangeMeta = { reason: 'init' | 'toggle' | 'responsive' };\ntype InspectorControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: InspectorOpenChangeMeta) => void; defaultOpen?: never };\ntype InspectorUncontrolledProps = { defaultOpen?: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: InspectorOpenChangeMeta) => void; open?: never };\ntype InspectorSizeChangeMeta = { reason: 'init' | 'resize' | 'controlled' };\ntype InspectorSizeControlledProps = { size: number | string; defaultSize?: never };\ntype InspectorSizeUncontrolledProps = { defaultSize?: number | string; size?: never };\ntype InspectorPublicProps = PaneBaseProps &\n (InspectorControlledProps | InspectorUncontrolledProps) &\n (InspectorSizeControlledProps | InspectorSizeUncontrolledProps) & {\n onSizeChange?: (size: number, meta: InspectorSizeChangeMeta) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n };\n\ntype InspectorComponent = React.ForwardRefExoticComponent<InspectorPublicProps & React.RefAttributes<HTMLDivElement>> & { Handle: typeof InspectorHandle };\n\nconst INSPECTOR_DOM_PROP_KEYS = [\n 'className',\n 'children',\n 'defaultOpen',\n 'open',\n 'onOpenChange',\n 'size',\n 'defaultSize',\n 'onSizeChange',\n 'sizeUpdate',\n 'sizeUpdateMs',\n 'style',\n 'inset',\n] as const satisfies readonly (keyof InspectorPublicProps)[];\n\nexport const Inspector = React.forwardRef<HTMLDivElement, InspectorPublicProps>((initialProps, ref) => {\n const {\n className,\n presentation = { initial: 'overlay', lg: 'fixed' },\n defaultOpen,\n open,\n onOpenChange,\n expandedSize = 320,\n minSize = 200,\n maxSize = 500,\n resizable = false,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n size,\n defaultSize,\n inset,\n } = initialProps;\n const inspectorDomProps = extractPaneDomProps(initialProps, INSPECTOR_DOM_PROP_KEYS);\n const { inspectorMode, setInspectorMode } = useInspectorMode();\n const { currentBreakpointReady } = usePresentation();\n const { peekTarget } = usePeek();\n const { togglePane } = useShellActions();\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useLayoutEffect(() => {\n if (inset) {\n registerInset('inspector');\n return () => unregisterInset('inspector');\n }\n }, [inset, registerInset, unregisterInset]);\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === InspectorHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === InspectorHandle));\n\n // Stable ref for onOpenChange to avoid effect dep churn\n const onOpenChangeRef = React.useRef(onOpenChange);\n const openRef = React.useRef(open);\n React.useLayoutEffect(() => {\n onOpenChangeRef.current = onOpenChange;\n openRef.current = open;\n });\n\n const normalizedControlledOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(open), [open]);\n const normalizedDefaultOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(defaultOpen), [defaultOpen]);\n const openIsResponsive = typeof open === 'object' && open !== null;\n const { resolvedControlled: resolvedInspectorControlled } = useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedControlledOpen,\n defaultValue: normalizedDefaultOpen,\n currentValue: inspectorMode,\n setValue: setInspectorMode,\n breakpointReady: currentBreakpointReady,\n controlledIsResponsive: openIsResponsive,\n onResponsiveChange: (next) => onOpenChangeRef.current?.(next === 'expanded', { reason: 'responsive' }),\n onInit: (initial) => {\n if (typeof openRef.current === 'undefined') {\n onOpenChangeRef.current?.(initial === 'expanded', { reason: 'init' });\n }\n },\n });\n\n // Ref for debounce cleanup\n const debounceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // Cleanup debounce timeout on unmount or when dependencies change\n React.useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = null;\n }\n };\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n // Throttled/debounced emitter for onSizeChange\n const emitSizeChange = React.useMemo(() => {\n const cb = onSizeChange as undefined | ((s: number, meta: InspectorSizeChangeMeta) => void);\n const strategy = sizeUpdate as undefined | 'throttle' | 'debounce';\n const ms = sizeUpdateMs ?? 50;\n if (!cb) return () => {};\n if (strategy === 'debounce') {\n return (s: number, meta: InspectorSizeChangeMeta) => {\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = setTimeout(() => {\n cb(s, meta);\n debounceTimeoutRef.current = null;\n }, ms);\n };\n }\n if (strategy === 'throttle') {\n let last = 0;\n return (s: number, meta: InspectorSizeChangeMeta) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n cb(s, meta);\n }\n };\n }\n return (s: number, meta: InspectorSizeChangeMeta) => cb(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Inspector: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n }\n\n // Warn on controlled/uncontrolled mode switch\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Inspector: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n // Emit mode changes. In controlled mode, skip when mode matches the controlled prop.\n const lastInspectorModeRef = React.useRef<PaneMode | null>(null);\n const lastResolvedInspectorControlledRef = React.useRef<PaneMode | undefined>(undefined);\n React.useEffect(() => {\n const prevInspectorMode = lastInspectorModeRef.current;\n const prevResolvedControlled = lastResolvedInspectorControlledRef.current;\n const controlledChanged = prevResolvedControlled !== resolvedInspectorControlled;\n\n if (prevInspectorMode !== null && prevInspectorMode !== inspectorMode) {\n const nextOpen = inspectorMode === 'expanded';\n const isControlled = typeof openRef.current !== 'undefined';\n const controlledTarget = resolvedInspectorControlled === undefined ? undefined : resolvedInspectorControlled === 'expanded';\n\n if (!isControlled || (!controlledChanged && nextOpen !== controlledTarget)) {\n onOpenChangeRef.current?.(nextOpen, { reason: 'toggle' });\n }\n }\n\n lastInspectorModeRef.current = inspectorMode;\n lastResolvedInspectorControlledRef.current = resolvedInspectorControlled;\n }, [inspectorMode, resolvedInspectorControlled]);\n\n // Track previous mode to only fire callbacks on actual user-initiated state transitions.\n // We wait for breakpointReady to ensure the initial state sync from useResponsiveInitialState\n // is complete before enabling callbacks. This avoids spurious callbacks during initialization.\n // Use callback refs to avoid re-running effect when inline callbacks change.\n const onExpandRef = React.useRef(onExpand);\n const onCollapseRef = React.useRef(onCollapse);\n React.useLayoutEffect(() => {\n onExpandRef.current = onExpand;\n onCollapseRef.current = onCollapse;\n });\n\n const prevInspectorModeRef = React.useRef<PaneMode | null>(null);\n const hasInitializedRef = React.useRef(false);\n React.useEffect(() => {\n const currentMode = inspectorMode;\n\n // Wait for breakpoint to be ready before enabling callbacks\n if (!currentBreakpointReady) {\n prevInspectorModeRef.current = currentMode;\n return;\n }\n\n // Skip the first run after breakpoint is ready - this captures the post-sync state\n if (!hasInitializedRef.current) {\n hasInitializedRef.current = true;\n prevInspectorModeRef.current = currentMode;\n return;\n }\n\n const prevMode = prevInspectorModeRef.current;\n\n // Only fire on actual state transitions\n if (prevMode !== null && prevMode !== currentMode) {\n if (currentMode === 'expanded') {\n onExpandRef.current?.();\n } else if (currentMode === 'collapsed') {\n onCollapseRef.current?.();\n }\n prevInspectorModeRef.current = currentMode;\n }\n }, [inspectorMode, currentBreakpointReady]);\n\n const isExpanded = inspectorMode === 'expanded';\n\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:inspector:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n try {\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Inspector: failed to load persisted size', err);\n }\n return undefined;\n }\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, String(size));\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Inspector: failed to save persisted size', err);\n }\n }\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n React.useEffect(() => {\n let mounted = true;\n if (!resizable || !persistenceAdapter?.load || isOverlay) return undefined;\n const loaded = persistenceAdapter.load();\n const applyLoaded = (value?: number) => {\n if (!mounted || typeof value !== 'number' || !localRef.current) return;\n localRef.current.style.setProperty('--inspector-size', `${value}px`);\n onResize?.(value);\n };\n if (loaded instanceof Promise) {\n loaded.then(applyLoaded).catch((err) => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Inspector: failed to load persisted size', err);\n }\n });\n } else {\n applyLoaded(loaded);\n }\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n const handleEl =\n resizable && !isOverlay && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--inspector-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'start',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n return startSize + (isRtl ? delta : -delta);\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'inspector',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => setInspectorMode('collapsed'),\n requestToggle: () => togglePane('inspector'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n // Normalize CSS lengths to px helper\n const normalizeSizeToPx = React.useCallback((value: number | string | undefined) => normalizeToPx(value, 'horizontal'), []);\n\n // Apply defaultSize on mount when uncontrolled\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeSizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--inspector-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync\n const controlledSize = size;\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof controlledSize === 'undefined') return;\n const px = normalizeSizeToPx(controlledSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--inspector-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [controlledSize, minSize, maxSize, normalizeSizeToPx, emitSizeChange]);\n\n if (isOverlay) {\n const open = inspectorMode === 'expanded';\n return (\n <Sheet.Root open={open} onOpenChange={(o) => setInspectorMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content side=\"end\" style={{ padding: 0 }} aria-label=\"Inspector\" aria-describedby={undefined} width={{ initial: `${expandedSize}px` }}>\n <VisuallyHidden>\n <Sheet.Title>Inspector</Sheet.Title>\n </VisuallyHidden>\n {contentChildren}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n // Strip control/size props from DOM spread\n return (\n <div\n {...inspectorDomProps}\n ref={setRef}\n className={classNames('rt-ShellInspector', className)}\n data-mode={inspectorMode}\n data-peek={peekTarget === 'inspector' || undefined}\n data-presentation={currentBreakpointReady ? resolvedPresentation : undefined}\n data-open={(currentBreakpointReady && isStacked && isExpanded) || undefined}\n data-inset={inset || undefined}\n style={{\n ...style,\n '--inspector-size': `${expandedSize}px`,\n '--inspector-min-size': `${minSize}px`,\n '--inspector-max-size': `${maxSize}px`,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellInspectorContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n}) as InspectorComponent;\n\nInspector.displayName = 'Shell.Inspector';\nInspector.Handle = InspectorHandle;\n", "'use client';\n\nimport * as React from 'react';\nimport { _BREAKPOINTS, type Breakpoint } from '../components/shell.types.js';\n\n/**\n * Hook to get the current breakpoint based on window width.\n * Returns 'initial' on the server and during initial hydration.\n * Uses shared breakpoint values from shell.types.js.\n */\nexport function useBreakpoint(): { breakpoint: Breakpoint; ready: boolean } {\n const [currentBp, setCurrentBp] = React.useState<Breakpoint>('initial');\n const [ready, setReady] = React.useState(false);\n\n React.useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const queries = Object.entries(_BREAKPOINTS) as [keyof typeof _BREAKPOINTS, string][];\n const mqls = queries.map(([k, q]) => [k, window.matchMedia(q)] as const);\n\n // Accept optional event param to satisfy MediaQueryList listener signature\n const compute = (_e?: MediaQueryListEvent) => {\n // Highest matched wins\n const matched = mqls.filter(([, m]) => m.matches).map(([k]) => k);\n const next = (matched[matched.length - 1] as Breakpoint | undefined) ?? 'initial';\n setCurrentBp(next);\n setReady(true);\n };\n\n compute();\n const cleanups: Array<() => void> = [];\n mqls.forEach(([, m]) => {\n const mm = m as MediaQueryList & {\n addEventListener?: (type: 'change', listener: (e: MediaQueryListEvent) => void) => void;\n removeEventListener?: (type: 'change', listener: (e: MediaQueryListEvent) => void) => void;\n addListener?: (listener: (e: MediaQueryListEvent) => void) => void;\n removeListener?: (listener: (e: MediaQueryListEvent) => void) => void;\n };\n if (typeof mm.addEventListener === 'function' && typeof mm.removeEventListener === 'function') {\n mm.addEventListener('change', compute);\n cleanups.push(() => mm.removeEventListener?.('change', compute));\n } else if (typeof mm.addListener === 'function' && typeof mm.removeListener === 'function') {\n mm.addListener(compute);\n cleanups.push(() => mm.removeListener?.(compute));\n }\n });\n\n return () => {\n cleanups.forEach((fn) => {\n try {\n fn();\n } catch (e) {\n // MediaQueryList cleanup can fail in edge cases (e.g., already removed)\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[useBreakpoint] MediaQueryList cleanup warning:', e);\n }\n }\n });\n };\n }, []);\n\n return { breakpoint: currentBp, ready };\n}\n"],
5
- "mappings": "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",
6
- "names": ["shell_exports", "__export", "Bottom", "Content", "Header", "Inspector", "Left", "Panel", "Rail", "Root", "Sidebar", "Trigger", "useResponsivePresentation", "useShell", "useSidebarMode", "__toCommonJS", "React", "import_classnames", "React", "import_classnames", "import_radix_ui", "asChildPropDef", "widthPropDefs", "heightPropDefs", "contentSizes", "panelBackgrounds", "materials", "dialogContentPropDefs", "asChildPropDef", "widthPropDefs", "heightPropDefs", "React", "import_classnames", "import_radix_ui", "getMatchingGrayColor", "accentColor", "accentColors", "grayColors", "colorPropDef", "radii", "appearances", "panelBackgrounds", "materials", "scalings", "fontFamilies", "themePropDefs", "asChildPropDef", "accentColors", "grayColors", "radii", "noop", "defaultThemeContext", "themePropDefs", "ThemeContext", "Theme", "props", "forwardedRef", "ThemeContext", "TooltipPrimitive", "ThemeRoot", "ThemeImpl", "appearanceProp", "themePropDefs", "accentColorProp", "grayColorProp", "materialProp", "panelBackgroundProp", "radiusProp", "scalingProp", "fontFamilyProp", "hasBackground", "rootProps", "appearance", "setAppearance", "accentColor", "setAccentColor", "grayColor", "setGrayColor", "effectiveMaterial", "material", "setMaterial", "panelBackground", "setPanelBackground", "radius", "setRadius", "scaling", "setScaling", "fontFamily", "setFontFamily", "getClientOS", "ua", "context", "asChild", "isRoot", "hasBackgroundProp", "onAppearanceChange", "noop", "onAccentColorChange", "onGrayColorChange", "onMaterialChange", "onPanelBackgroundChange", "onRadiusChange", "onScalingChange", "onFontFamilyChange", "themeProps", "Comp", "resolvedGrayColor", "getMatchingGrayColor", "isExplicitAppearance", "clientOS", "setClientOS", "classNames", "React", "import_radix_ui", "highContrastPropDef", "leadingTrimValues", "leadingTrimPropDef", "textAlignValues", "textAlignPropDef", "textWrapValues", "textWrapPropDef", "truncatePropDef", "fontFamilies", "fontFamilyPropDef", "weights", "weightPropDef", "as", "sizes", "headingPropDefs", "asChildPropDef", "fontFamilyPropDef", "weightPropDef", "textAlignPropDef", "leadingTrimPropDef", "truncatePropDef", "textWrapPropDef", "colorPropDef", "highContrastPropDef", "import_classnames", "breakpoints", "breakpointSet", "hasOwnProperty", "obj", "key", "breakpointSet", "isResponsiveObject", "obj", "key", "getResponsiveStyles", "className", "customProperties", "args", "responsiveClassNames", "getResponsiveClassNames", "responsiveCustomProperties", "getResponsiveCustomProperties", "allowArbitraryValues", "value", "propValues", "parseValue", "classNames", "getBaseClassName", "isResponsiveObject", "object", "bp", "hasOwnProperty", "breakpointSet", "baseClassName", "bpClassName", "delimiter", "matchedValue", "isNegative", "minus", "absoluteValue", "styles", "prop", "customProperty", "bpProperty", "key", "mergeStyles", "styles", "result", "style", "mergePropDefs", "args", "extractProps", "props", "propDefs", "className", "style", "extractedProps", "allPropDefs", "key", "value", "propDef", "isResponsiveObject", "isResponsivePropDef", "propClassName", "getResponsiveClassNames", "classNames", "propDefValues", "propClassNames", "propCustomProperties", "getResponsiveStyles", "mergeStyles", "marginValues", "marginPropDefs", "mergedPropDefs", "headingPropDefs", "marginPropDefs", "Heading", "props", "forwardedRef", "children", "className", "asChild", "Tag", "color", "headingProps", "extractProps", "combinedClassName", "React", "import_radix_ui", "as", "sizes", "textPropDefs", "asChildPropDef", "fontFamilyPropDef", "weightPropDef", "textAlignPropDef", "leadingTrimPropDef", "truncatePropDef", "textWrapPropDef", "colorPropDef", "highContrastPropDef", "mergedPropDefs", "textPropDefs", "marginPropDefs", "Text", "props", "forwardedRef", "children", "className", "asChild", "Tag", "color", "textProps", "extractProps", "combinedClassName", "React", "requireReactElement", "children", "child", "React", "cleanupInstalled", "useBodyPointerEventsCleanup", "hasOpenModal", "hasDialogs", "hasRadixOverlays", "forceCleanup", "safeCleanup", "onDocumentClick", "event", "target", "onEscapeKey", "onInteraction", "intervalId", "Root", "props", "DialogPrimitive", "Trigger", "children", "ref", "requireReactElement", "Content", "allProps", "forwardedRef", "side", "forceMount", "container", "className", "panelBackgroundProp", "materialProp", "restProps", "normalizedSide", "_alignPropDef", "panelBackgroundPropDef", "materialPropDef", "propDefs", "dialogContentPropDefs", "resolvedPanelBackground", "resolvedMaterial", "extractProps", "materialValue", "_mwDefault", "maxWidthWithoutDefault", "sheetPropDefs", "extractedClassName", "contentProps", "contentRef", "combinedRef", "node", "useBodyPointerEventsCleanup", "content", "focusableElements", "firstElement", "lastElement", "handleKeyDown", "event", "Theme", "classNames", "Title", "size", "weight", "Heading", "Description", "color", "rest", "Text", "Close", "import_radix_ui", "VisuallyHidden", "VisuallyHiddenPrimitive", "Root", "React", "_BREAKPOINTS", "React", "ShellContext", "useShell", "ctx", "ShellProvider", "value", "children", "LeftModeContext", "useLeftMode", "PanelModeContext", "usePanelMode", "SidebarModeContext", "useSidebarMode", "InspectorModeContext", "useInspectorMode", "BottomModeContext", "useBottomMode", "PresentationContext", "usePresentation", "PeekContext", "usePeek", "ActionsContext", "useShellActions", "CompositionContext", "useComposition", "InsetContext", "useInset", "useResponsivePresentation", "presentation", "currentBreakpoint", "useShell", "order", "_BREAKPOINTS", "startIdx", "i", "bp", "useResponsiveValue", "value", "map", "useResponsiveInitialState", "controlledValue", "defaultValue", "currentValue", "setValue", "breakpointReady", "onInit", "onResponsiveChange", "controlledIsResponsive", "resolvedControlled", "resolvedDefault", "lastControlledRef", "pendingSyncRef", "latestControlledRef", "latestValueRef", "setValueRef", "controlledChanged", "latestControlled", "latestValue", "didInitRef", "React", "PaneResizeContext", "usePaneResize", "ctx", "React", "import_classnames", "PaneHandle", "className", "children", "props", "ref", "containerRef", "cssVarName", "minSize", "maxSize", "defaultSize", "orientation", "edge", "computeNext", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "collapsible", "target", "requestCollapse", "requestToggle", "usePaneResize", "activeCleanupRef", "ariaOrientation", "ariaLabel", "classNames", "e", "container", "handleEl", "pointerId", "startClient", "startSize", "clamp", "v", "body", "prevCursor", "prevUserSelect", "handleMove", "ev", "client", "next", "cleanup", "handleUp", "handleKey", "finalSize", "snapped", "nearest", "acc", "p", "kev", "rawCurrent", "parsedCurrent", "current", "step", "delta", "docDir", "cssDir", "hasRtlAncestor", "isRtl", "signedDelta", "PanelHandle", "SidebarHandle", "InspectorHandle", "BottomHandle", "omitPaneProps", "source", "keys", "omitSet", "result", "key", "PANE_BASE_INTERNAL_PROPS", "extractPaneDomProps", "extraKeys", "omitKeys", "mapResponsiveBooleanToPaneMode", "value", "mapped", "bp", "val", "React", "import_classnames", "normalizeToPx", "value", "orientation", "str", "rem", "pct", "base", "n", "SIDEBAR_DOM_PROP_KEYS", "Sidebar", "initialProps", "ref", "className", "presentation", "expandedSize", "minSize", "maxSize", "resizable", "collapsible", "onExpand", "onCollapse", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "children", "style", "thinSize", "toggleModes", "state", "defaultState", "onStateChange", "size", "defaultSize", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "inset", "sidebarDomProps", "extractPaneDomProps", "sidebarMode", "setSidebarMode", "useSidebarMode", "currentBreakpointReady", "usePresentation", "peekTarget", "usePeek", "togglePane", "setSidebarToggleComputer", "useShellActions", "setHasSidebar", "useComposition", "registerInset", "unregisterInset", "useInset", "resolvedPresentation", "useResponsivePresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "childArray", "handleChildren", "el", "SidebarHandle", "contentChildren", "debounceTimeoutRef", "emitSizeChange", "cb", "strategy", "ms", "s", "meta", "last", "now", "sidebarId", "wasControlledRef", "isControlled", "onStateChangeRef", "stateRef", "stateIsResponsive", "resolvedSidebarControlled", "resolvedSidebarDefault", "useResponsiveInitialState", "next", "initial", "lastNotifyModeRef", "lastResolvedSidebarControlledRef", "current", "prevMode", "controlledChanged", "onExpandRef", "onCollapseRef", "prevSidebarModeRef", "hasInitializedRef", "currentMode", "isContentVisible", "persistenceAdapter", "key", "v", "mounted", "loaded", "resolveDefaultSidebarMode", "resolved", "target", "cur", "lastOverlayWidthRef", "lastOverlayModeRef", "handleEl", "PaneResizeContext", "client", "startClient", "startSize", "isRtl", "delta", "i", "PaneHandle", "normalizeSizeToPx", "value", "normalizeToPx", "px", "clamped", "controlledSize", "peekStyles", "open", "Root", "o", "Content", "VisuallyHidden", "Title", "classNames", "React", "import_classnames", "BOTTOM_DOM_PROP_KEYS", "Bottom", "initialProps", "ref", "className", "presentation", "defaultOpen", "open", "onOpenChange", "expandedSize", "minSize", "maxSize", "resizable", "collapsible", "onExpand", "onCollapse", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "children", "style", "size", "defaultSize", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "inset", "bottomDomProps", "extractPaneDomProps", "bottomMode", "setBottomMode", "useBottomMode", "currentBreakpointReady", "usePresentation", "peekTarget", "usePeek", "togglePane", "useShellActions", "registerInset", "unregisterInset", "useInset", "resolvedPresentation", "useResponsivePresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "childArray", "handleChildren", "el", "BottomHandle", "contentChildren", "onOpenChangeRef", "openRef", "normalizedControlledOpen", "mapResponsiveBooleanToPaneMode", "normalizedDefaultOpen", "openIsResponsive", "resolvedBottomControlled", "useResponsiveInitialState", "next", "initial", "debounceTimeoutRef", "emitSizeChange", "cb", "strategy", "ms", "s", "meta", "last", "now", "wasControlledRef", "isControlled", "lastBottomModeRef", "lastResolvedBottomControlledRef", "prevMode", "controlledChanged", "nextOpen", "onExpandRef", "onCollapseRef", "prevBottomModeRef", "hasInitializedRef", "currentMode", "isExpanded", "persistenceAdapter", "key", "v", "mounted", "loaded", "applyLoaded", "value", "err", "handleEl", "PaneResizeContext", "client", "startClient", "startSize", "delta", "i", "PaneHandle", "normalizeSizeToPx", "normalizeToPx", "px", "clamped", "controlledSize", "Root", "o", "Content", "VisuallyHidden", "Title", "classNames", "React", "import_classnames", "INSPECTOR_DOM_PROP_KEYS", "Inspector", "initialProps", "ref", "className", "presentation", "defaultOpen", "open", "onOpenChange", "expandedSize", "minSize", "maxSize", "resizable", "collapsible", "onExpand", "onCollapse", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "children", "style", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "size", "defaultSize", "inset", "inspectorDomProps", "extractPaneDomProps", "inspectorMode", "setInspectorMode", "useInspectorMode", "currentBreakpointReady", "usePresentation", "peekTarget", "usePeek", "togglePane", "useShellActions", "registerInset", "unregisterInset", "useInset", "resolvedPresentation", "useResponsivePresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "childArray", "handleChildren", "el", "InspectorHandle", "contentChildren", "onOpenChangeRef", "openRef", "normalizedControlledOpen", "mapResponsiveBooleanToPaneMode", "normalizedDefaultOpen", "openIsResponsive", "resolvedInspectorControlled", "useResponsiveInitialState", "next", "initial", "debounceTimeoutRef", "emitSizeChange", "cb", "strategy", "ms", "s", "meta", "last", "now", "wasControlledRef", "isControlled", "lastInspectorModeRef", "lastResolvedInspectorControlledRef", "prevInspectorMode", "controlledChanged", "nextOpen", "onExpandRef", "onCollapseRef", "prevInspectorModeRef", "hasInitializedRef", "currentMode", "prevMode", "isExpanded", "persistenceAdapter", "key", "v", "mounted", "loaded", "applyLoaded", "value", "err", "handleEl", "PaneResizeContext", "client", "startClient", "startSize", "isRtl", "delta", "i", "PaneHandle", "normalizeSizeToPx", "normalizeToPx", "px", "clamped", "controlledSize", "Root", "o", "Content", "VisuallyHidden", "Title", "classNames", "React", "useBreakpoint", "currentBp", "setCurrentBp", "ready", "setReady", "mqls", "_BREAKPOINTS", "k", "q", "compute", "_e", "matched", "m", "next", "cleanups", "mm", "fn", "SHELL_SLOT", "assignShellSlot", "component", "slot", "isShellComponentType", "el", "comp", "Sidebar", "Inspector", "Bottom", "paneReducer", "state", "action", "next", "Root", "className", "children", "height", "props", "ref", "currentBreakpoint", "currentBreakpointReady", "useBreakpoint", "hasPanelDefaultOpenRef", "paneState", "dispatchPane", "initialChildren", "childArray", "hasPanelDefaultOpen", "railEl", "railDefaultOpen", "hasRailDefaultOpen", "hasInspectorDefaultOpen", "hasInspectorOpenControlled", "hasPanelOpenControlled", "openProp", "getSidebarInitialState", "sidebarEl", "sidebarProps", "getBottomInitialState", "bottomEl", "bottomProps", "setLeftMode", "mode", "setPanelMode", "setSidebarMode", "setInspectorMode", "setBottomMode", "hasLeft", "setHasLeft", "hasSidebar", "setHasSidebar", "sidebarToggleComputerRef", "current", "setSidebarToggleComputer", "fn", "devLeftPres", "setDevLeftPres", "onLeftPres", "p", "railDefaultSizeRef", "panelDefaultSizeRef", "onRailDefaults", "size", "onPanelDefaults", "hasLeftChildren", "Rail", "Panel", "hasSidebarChildren", "sidebarModeRef", "togglePane", "target", "expandPane", "collapsePane", "baseContextValue", "headerEls", "railEls", "panelEls", "sidebarEls", "contentEls", "inspectorEls", "bottomEls", "result", "Header", "Content", "firstRailOpen", "resolvedFirstRailOpen", "responsive", "fallbackOrder", "startIdx", "i", "bp", "firstPanelOpen", "resolvedFirstPanelOpen", "controlSeqRef", "lastRailChangeRef", "lastPanelChangeRef", "lastRailOpenRef", "lastPanelOpenRef", "railOnOpenChange", "panelOnOpenChange", "lastConflictRef", "panelWins", "lastConflict", "leftControlledOpen", "heightStyle", "peekTarget", "setPeekTarget", "peekPane", "clearPeek", "presentationCtxValue", "leftModeCtxValue", "panelModeCtxValue", "sidebarModeCtxValue", "inspectorModeCtxValue", "bottomModeCtxValue", "compositionCtxValue", "insetPanes", "setInsetPanes", "registerInset", "id", "prev", "unregisterInset", "hasAnyInset", "insetCtxValue", "peekCtxValue", "actionsCtxValue", "shellContextValue", "leftContent", "firstRail", "firstPanel", "leftInset", "passthroughProps", "Left", "classNames", "ShellProvider", "PresentationContext", "LeftModeContext", "PanelModeContext", "SidebarModeContext", "InspectorModeContext", "BottomModeContext", "CompositionContext", "PeekContext", "ActionsContext", "InsetContext", "style", "LEFT_DOM_OMIT_PROPS", "initialProps", "presentation", "_collapsible", "onExpand", "onCollapse", "inset", "restProps", "useInset", "propsOpen", "propsDefaultOpen", "propsOnOpenChange", "domProps", "omitPaneProps", "shell", "useShell", "resolvedPresentation", "useResponsivePresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "lastLeftModeRef", "lastResolvedLeftControlledRef", "normalizedLeftControlled", "normalizedLeftDefault", "mapResponsiveBooleanToPaneMode", "propsOnOpenChangeRef", "propsOpenRef", "resolvedLeftControlled", "useResponsiveInitialState", "initial", "prevPanelModeRef", "prevLeftMode", "prevPanelMode", "controlledChanged", "isControlled", "controlledTarget", "nextOpen", "reason", "onExpandRef", "onCollapseRef", "prevLeftModeForCallbackRef", "hasLeftInitializedRef", "currentMode", "prevMode", "_isExpanded", "open", "panelEl", "railSize", "panelSize", "hasRail", "hasPanel", "overlayPx", "o", "VisuallyHidden", "Title", "_railSize", "_panelSize", "_hasRail", "_includePanel", "expandedSize", "collapsible", "defaultOpen", "onOpenChange", "_inset", "wasControlledRef", "isExpanded", "PANEL_DOM_PROP_KEYS", "defaultSize", "minSize", "maxSize", "resizable", "_onExpand", "_onCollapse", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "panelDomProps", "extractPaneDomProps", "debounceTimeoutRef", "emitSizeChange", "s", "meta", "last", "now", "prevLeftModeRef", "lastResolvedPanelControlledRef", "normalizedControlledOpen", "normalizedDefaultOpen", "openIsResponsive", "onOpenChangeRef", "resolvedPanelControlled", "handleChildren", "PanelHandle", "contentChildren", "normalizeSizeToPx", "value", "normalizeToPx", "persistenceAdapter", "key", "v", "mounted", "loaded", "px", "clamped", "leftEl", "prevPanel", "prevLeft", "handleEl", "PaneResizeContext", "client", "startClient", "startSize", "isRtl", "delta", "PaneHandle", "Trigger", "peekOnHover", "onClick", "onMouseEnter", "onMouseLeave", "leftMode", "useLeftMode", "panelMode", "usePanelMode", "sidebarMode", "useSidebarMode", "inspectorMode", "useInspectorMode", "bottomMode", "useBottomMode", "usePeek", "useShellActions", "handleClick", "event", "isCollapsed", "handleMouseEnter", "handleMouseLeave"]
3
+ "sources": ["../../../src/components/shell.tsx", "../../../src/components/sheet.tsx", "../../../src/props/as-child.prop.ts", "../../../src/props/width.props.ts", "../../../src/props/height.props.ts", "../../../src/components/dialog.props.tsx", "../../../src/components/theme.tsx", "../../../src/helpers/get-matching-gray-color.ts", "../../../src/hooks/use-prop-synced-state.ts", "../../../src/helpers/use-deprecation-warning.ts", "../../../src/props/color.prop.ts", "../../../src/props/radius.prop.ts", "../../../src/components/theme.props.tsx", "../../../src/components/heading.tsx", "../../../src/props/high-contrast.prop.ts", "../../../src/props/leading-trim.prop.ts", "../../../src/props/text-align.prop.ts", "../../../src/props/text-wrap.prop.ts", "../../../src/props/truncate.prop.ts", "../../../src/props/font-family.prop.ts", "../../../src/props/weight.prop.ts", "../../../src/components/heading.props.tsx", "../../../src/helpers/extract-props.ts", "../../../src/helpers/compile-prop-defs.ts", "../../../src/props/prop-def.ts", "../../../src/helpers/has-own-property.ts", "../../../src/helpers/is-responsive-object.ts", "../../../src/helpers/get-responsive-styles.ts", "../../../src/helpers/merge-styles.ts", "../../../src/props/margin.props.ts", "../../../src/components/text.tsx", "../../../src/components/text.props.tsx", "../../../src/helpers/require-react-element.ts", "../../../src/hooks/use-body-pointer-events-cleanup.ts", "../../../src/components/visually-hidden.tsx", "../../../src/components/shell.hooks.ts", "../../../src/components/shell.types.ts", "../../../src/components/shell.context.tsx", "../../../src/components/_internal/shell-resize.tsx", "../../../src/components/_internal/shell-handles.tsx", "../../../src/components/_internal/shell-prop-helpers.ts", "../../../src/components/_internal/shell-sidebar.tsx", "../../../src/helpers/normalize-to-px.ts", "../../../src/components/_internal/shell-bottom.tsx", "../../../src/components/_internal/shell-inspector.tsx", "../../../src/hooks/use-breakpoint.ts"],
4
+ "sourcesContent": ["/**\n * Shell Component - Layout Engine + Chrome\n *\n * Philosophy:\n * - Shell = layout engine + chrome\n * - Manages layout state: expanded/collapsed, fixed/overlay, sizes\n * - Does not manage content/navigation state\n * - Provides unstyled primitives (slots, triggers)\n * - Enforces composition rules (Rail \u2194 Panel dependency, Sidebar exclusivity)\n *\n * Core Slots:\n * - Header: global top bar\n * - Rail: slim nav strip\n * - Panel: sidebar next to rail\n * - Sidebar: alternative to Rail+Panel (exclusive)\n * - Content: main work area\n * - Inspector: right-side panel\n * - Bottom: bottom panel\n *\n * Composition Rules:\n * - Rail + Panel: valid together (Rail collapse \u2192 Panel collapse)\n * - Sidebar: cannot coexist with Rail or Panel\n * - Content: always required\n * - Inspector/Bottom: optional, independent\n */\n'use client';\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from './sheet.js';\nimport { VisuallyHidden } from './visually-hidden.js';\nimport { useResponsivePresentation, useResponsiveInitialState } from './shell.hooks.js';\nimport { PaneResizeContext } from './_internal/shell-resize.js';\nimport { PaneHandle, PanelHandle } from './_internal/shell-handles.js';\nimport { omitPaneProps, extractPaneDomProps, mapResponsiveBooleanToPaneMode } from './_internal/shell-prop-helpers.js';\nimport { Sidebar } from './_internal/shell-sidebar.js';\nimport { Bottom } from './_internal/shell-bottom.js';\nimport { Inspector } from './_internal/shell-inspector.js';\nimport { _BREAKPOINTS } from './shell.types.js';\nimport type { PresentationValue, ResponsivePresentation, PaneMode, SidebarMode, PaneSizePersistence, Breakpoint, PaneTarget, Responsive, PaneBaseProps, CSSPropertiesWithVars } from './shell.types.js';\nimport { normalizeToPx } from '../helpers/normalize-to-px.js';\nimport { useBreakpoint } from '../hooks/use-breakpoint.js';\nimport {\n ShellProvider,\n useShell,\n LeftModeContext,\n useLeftMode,\n PanelModeContext,\n usePanelMode,\n SidebarModeContext,\n useSidebarMode,\n InspectorModeContext,\n useInspectorMode,\n BottomModeContext,\n useBottomMode,\n PresentationContext,\n PeekContext,\n usePeek,\n ActionsContext,\n useShellActions,\n CompositionContext,\n InsetContext,\n useInset,\n type InsetPaneId,\n} from './shell.context.js';\n\n// Shell context is provided via ShellProvider (see shell.context.tsx)\n\n// Pane resize context moved to ./_internal/shell-resize\n\n// Local PaneHandle moved to ./_internal/shell-handles\n// Removed local PaneHandle implementation; using internal PaneHandle\n\n// Composed Handle wrappers per pane\n// Handles moved to ./_internal/shell-handles\n\n// Hook to resolve responsive presentation\n// useResponsivePresentation moved to shell.hooks.ts\n\n// Hook to resolve responsive mode defaults\n// Removed: defaultMode responsiveness\n\n// useBreakpoint hook moved to ../hooks/use-breakpoint.ts\n\n// Reducer-based pane state management to simplify cascading rules\ntype PaneState = {\n leftMode: PaneMode;\n panelMode: PaneMode;\n sidebarMode: SidebarMode;\n inspectorMode: PaneMode;\n bottomMode: PaneMode;\n};\n\ntype PaneAction =\n | { type: 'SET_LEFT_MODE'; mode: PaneMode }\n | { type: 'SET_PANEL_MODE'; mode: PaneMode }\n | { type: 'SET_SIDEBAR_MODE'; mode: SidebarMode }\n | { type: 'SET_INSPECTOR_MODE'; mode: PaneMode }\n | { type: 'SET_BOTTOM_MODE'; mode: PaneMode }\n | { type: 'TOGGLE_PANE'; target: PaneTarget }\n | { type: 'EXPAND_PANE'; target: PaneTarget }\n | { type: 'COLLAPSE_PANE'; target: PaneTarget };\n\nconst SHELL_SLOT = Symbol('rtShellSlot');\n\nfunction assignShellSlot<T extends React.ComponentType<any>>(component: T, slot: string): T {\n (component as any)[SHELL_SLOT] = slot;\n return component;\n}\n\n/**\n * Check if an element matches a component by type or displayName.\n * Uses displayName comparison to handle minification scenarios.\n */\nconst isShellComponentType = (el: React.ReactElement, comp: React.ComponentType & { displayName?: string }): boolean =>\n React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n\n// Tag imported slot components so isType remains stable after minification\nassignShellSlot(Sidebar as any, 'Shell.Sidebar');\nassignShellSlot(Inspector as any, 'Shell.Inspector');\nassignShellSlot(Bottom as any, 'Shell.Bottom');\n\nfunction paneReducer(state: PaneState, action: PaneAction): PaneState {\n switch (action.type) {\n case 'SET_LEFT_MODE': {\n if (action.mode === 'collapsed') {\n if (state.leftMode === 'collapsed' && state.panelMode === 'collapsed') return state;\n return { ...state, leftMode: 'collapsed', panelMode: 'collapsed' };\n }\n if (state.leftMode === action.mode) return state;\n return { ...state, leftMode: action.mode };\n }\n case 'SET_PANEL_MODE': {\n if (action.mode === 'expanded' && state.leftMode !== 'expanded') {\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n }\n if (state.panelMode === action.mode) return state;\n return { ...state, panelMode: action.mode };\n }\n case 'SET_SIDEBAR_MODE':\n if (state.sidebarMode === action.mode) return state;\n return { ...state, sidebarMode: action.mode };\n case 'SET_INSPECTOR_MODE':\n if (state.inspectorMode === action.mode) return state;\n return { ...state, inspectorMode: action.mode };\n case 'SET_BOTTOM_MODE':\n if (state.bottomMode === action.mode) return state;\n return { ...state, bottomMode: action.mode };\n case 'TOGGLE_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n return { ...state, leftMode: state.leftMode === 'expanded' ? 'collapsed' : 'expanded', panelMode: state.leftMode === 'expanded' ? 'collapsed' : state.panelMode };\n case 'panel': {\n if (state.leftMode === 'collapsed') {\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n }\n return { ...state, panelMode: state.panelMode === 'expanded' ? 'collapsed' : 'expanded' };\n }\n case 'sidebar': {\n const next: SidebarMode = state.sidebarMode === 'collapsed' ? 'expanded' : state.sidebarMode === 'expanded' ? 'collapsed' : 'expanded';\n return { ...state, sidebarMode: next };\n }\n case 'inspector':\n return { ...state, inspectorMode: state.inspectorMode === 'expanded' ? 'collapsed' : 'expanded' };\n case 'bottom':\n return { ...state, bottomMode: state.bottomMode === 'expanded' ? 'collapsed' : 'expanded' };\n default:\n return state;\n }\n }\n case 'EXPAND_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n if (state.leftMode === 'expanded') return state;\n return { ...state, leftMode: 'expanded' };\n case 'panel':\n if (state.leftMode === 'expanded' && state.panelMode === 'expanded') return state;\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n case 'sidebar':\n if (state.sidebarMode === 'expanded') return state;\n return { ...state, sidebarMode: 'expanded' };\n case 'inspector':\n if (state.inspectorMode === 'expanded') return state;\n return { ...state, inspectorMode: 'expanded' };\n case 'bottom':\n if (state.bottomMode === 'expanded') return state;\n return { ...state, bottomMode: 'expanded' };\n default:\n return state;\n }\n }\n case 'COLLAPSE_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n if (state.leftMode === 'collapsed' && state.panelMode === 'collapsed') return state;\n return { ...state, leftMode: 'collapsed', panelMode: 'collapsed' };\n case 'panel':\n if (state.panelMode === 'collapsed') return state;\n return { ...state, panelMode: 'collapsed' };\n case 'sidebar':\n if (state.sidebarMode === 'collapsed') return state;\n return { ...state, sidebarMode: 'collapsed' };\n case 'inspector':\n if (state.inspectorMode === 'collapsed') return state;\n return { ...state, inspectorMode: 'collapsed' };\n case 'bottom':\n if (state.bottomMode === 'collapsed') return state;\n return { ...state, bottomMode: 'collapsed' };\n default:\n return state;\n }\n }\n }\n return state;\n}\n\n// Root Component\ninterface ShellRootProps extends React.ComponentPropsWithoutRef<'div'> {\n children: React.ReactNode;\n height?: 'full' | 'auto' | string | number;\n}\n\n/**\n * Read the pane modes a set of Shell children asks for.\n *\n * Runs once at mount, for the reducer's initial state, and again whenever a\n * pane family enters after mount. Pure - it only reads the children's props.\n */\n/**\n * Pick the entry of a responsive map that applies at `breakpoint`, falling\n * back down the scale the way useResponsiveValue does. With no breakpoint it\n * takes `initial`, which is what the mount path has always done.\n */\nfunction pickResponsive<T>(map: Partial<Record<Breakpoint, T>>, breakpoint?: Breakpoint): T | undefined {\n if (breakpoint === undefined) return (map.initial ?? Object.values(map)[0]) as T | undefined;\n if (map[breakpoint] !== undefined) return map[breakpoint];\n\n const bpKeys = Object.keys(_BREAKPOINTS) as Array<keyof typeof _BREAKPOINTS>;\n const order: Breakpoint[] = ([...bpKeys].reverse() as Breakpoint[]).concat('initial' as Breakpoint);\n for (let i = order.indexOf(breakpoint) + 1; i < order.length; i++) {\n if (map[order[i]] !== undefined) return map[order[i]];\n }\n return undefined;\n}\n\nfunction readPaneStateFromChildren(initialChildren: React.ReactNode, breakpoint?: Breakpoint): PaneState & { hasPanelDefaultOpen: boolean } {\n const childArray = React.Children.toArray(initialChildren) as React.ReactElement[];\n\n // Compute initial defaults from immediate children (one-time, uncontrolled defaults)\n const hasPanelDefaultOpen = childArray.some(\n (el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Panel' && Boolean((el as any).props?.defaultOpen),\n );\n\n // Rail defaults to open (true) unless explicitly set to false\n // Supports responsive objects: { initial: false, md: true }\n const railEl = childArray.find((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Rail');\n const railDefaultOpen = railEl ? (railEl as any).props?.defaultOpen : undefined;\n const hasRailDefaultOpen = (() => {\n if (!railEl) return false;\n if (railDefaultOpen === undefined) return true; // Default to open\n if (typeof railDefaultOpen === 'boolean') return railDefaultOpen;\n // Responsive object - use 'initial' value, or first defined value, or default true\n if (typeof railDefaultOpen === 'object') {\n return railDefaultOpen.initial ?? Object.values(railDefaultOpen)[0] ?? true;\n }\n return true;\n })();\n\n const hasInspectorDefaultOpen = childArray.some(\n (el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Inspector' && Boolean((el as any).props?.defaultOpen),\n );\n const hasInspectorOpenControlled = childArray.some(\n (el) =>\n React.isValidElement(el) &&\n (el as any).type?.displayName === 'Shell.Inspector' &&\n typeof (el as any).props?.open !== 'undefined' &&\n Boolean((el as any).props?.open),\n );\n\n // Detect Panel controlled open state for initial reducer state\n const hasPanelOpenControlled = childArray.some((el) => {\n if (!React.isValidElement(el) || (el as any).type?.displayName !== 'Shell.Panel') return false;\n const openProp = (el as any).props?.open;\n if (typeof openProp === 'undefined') return false;\n if (typeof openProp === 'boolean') return openProp;\n // Responsive object - check 'initial' or first truthy value\n if (typeof openProp === 'object' && openProp !== null) {\n return openProp.initial ?? Object.values(openProp)[0] ?? false;\n }\n return false;\n });\n\n // Detect Sidebar initial state from props\n const getSidebarInitialState = (): SidebarMode => {\n const sidebarEl = childArray.find((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Sidebar');\n if (!sidebarEl) return 'expanded';\n const sidebarProps = (sidebarEl as any).props;\n // Check controlled state first\n if (typeof sidebarProps?.state !== 'undefined') {\n if (typeof sidebarProps.state === 'string') return sidebarProps.state as SidebarMode;\n // Responsive object - use 'initial' breakpoint or first defined value\n if (typeof sidebarProps.state === 'object') {\n return (pickResponsive<SidebarMode>(sidebarProps.state, breakpoint) ?? 'expanded') as SidebarMode;\n }\n }\n // Check defaultState\n if (typeof sidebarProps?.defaultState !== 'undefined') {\n if (typeof sidebarProps.defaultState === 'string') return sidebarProps.defaultState as SidebarMode;\n if (typeof sidebarProps.defaultState === 'object') {\n return (pickResponsive<SidebarMode>(sidebarProps.defaultState, breakpoint) ?? 'expanded') as SidebarMode;\n }\n }\n return 'expanded';\n };\n\n // Detect Bottom initial state from props\n const getBottomInitialState = (): PaneMode => {\n const bottomEl = childArray.find((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Bottom');\n if (!bottomEl) return 'collapsed';\n const bottomProps = (bottomEl as any).props;\n // Check controlled open first\n if (typeof bottomProps?.open !== 'undefined') {\n if (typeof bottomProps.open === 'boolean') return bottomProps.open ? 'expanded' : 'collapsed';\n // Responsive object - use 'initial' breakpoint or first defined value\n if (typeof bottomProps.open === 'object') {\n const val = bottomProps.open.initial ?? Object.values(bottomProps.open)[0];\n return val ? 'expanded' : 'collapsed';\n }\n }\n // Check defaultOpen\n if (typeof bottomProps?.defaultOpen !== 'undefined') {\n return bottomProps.defaultOpen ? 'expanded' : 'collapsed';\n }\n return 'collapsed';\n };\n\n return {\n hasPanelDefaultOpen,\n leftMode: hasPanelDefaultOpen || hasPanelOpenControlled || hasRailDefaultOpen ? 'expanded' : ('collapsed' as PaneMode),\n panelMode: hasPanelDefaultOpen || hasPanelOpenControlled ? 'expanded' : ('collapsed' as PaneMode),\n sidebarMode: getSidebarInitialState(),\n inspectorMode: hasInspectorDefaultOpen || hasInspectorOpenControlled ? 'expanded' : ('collapsed' as PaneMode),\n bottomMode: getBottomInitialState(),\n };\n}\n\nconst Root = React.forwardRef<HTMLDivElement, ShellRootProps>(({ className, children, height = 'full', ...props }, ref) => {\n const { breakpoint: currentBreakpoint, ready: currentBreakpointReady } = useBreakpoint();\n\n // Store hasPanelDefaultOpen for use in passthrough props (computed once during lazy init)\n const hasPanelDefaultOpenRef = React.useRef<boolean>(false);\n\n // Pane state management via reducer with lazy initialization\n // This computation only runs once on mount, not on every render\n const [paneState, dispatchPane] = React.useReducer(paneReducer, children, (initialChildren) => {\n const { hasPanelDefaultOpen, ...modes } = readPaneStateFromChildren(initialChildren);\n // Store for use in passthrough props\n hasPanelDefaultOpenRef.current = hasPanelDefaultOpen;\n return modes;\n });\n const setLeftMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_LEFT_MODE', mode }), []);\n const setPanelMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_PANEL_MODE', mode }), []);\n const setSidebarMode = React.useCallback((mode: SidebarMode) => dispatchPane({ type: 'SET_SIDEBAR_MODE', mode }), []);\n const setInspectorMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_INSPECTOR_MODE', mode }), []);\n const setBottomMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_BOTTOM_MODE', mode }), []);\n\n // Removed: defaultMode responsiveness and manual change tracking\n\n // Composition detection\n const [hasLeft, setHasLeft] = React.useState(false);\n const [hasSidebar, setHasSidebar] = React.useState(false);\n\n // Customizable sidebar toggle sequencing\n const sidebarToggleComputerRef = React.useRef<(current: SidebarMode) => SidebarMode>((current) => (current === 'collapsed' ? 'thin' : current === 'thin' ? 'expanded' : 'collapsed'));\n const setSidebarToggleComputer = React.useCallback((fn: (current: SidebarMode) => SidebarMode) => {\n sidebarToggleComputerRef.current = fn;\n }, []);\n\n // Reducer handles left\u2192panel cascade; no effect needed\n\n // Composition validation\n React.useLayoutEffect(() => {\n if (hasSidebar && hasLeft) {\n console.warn('Shell: Sidebar cannot coexist with Rail or Panel. Use either Rail+Panel OR Sidebar.');\n }\n }, [hasSidebar, hasLeft]);\n\n // Left presentation + defaults from children\n const [devLeftPres, setDevLeftPres] = React.useState<PresentationValue | undefined>(undefined);\n const onLeftPres = React.useCallback((p: PresentationValue) => setDevLeftPres(p), []);\n const railDefaultSizeRef = React.useRef<number>(64);\n const panelDefaultSizeRef = React.useRef<number>(288);\n const onRailDefaults = React.useCallback((size: number) => {\n railDefaultSizeRef.current = size;\n }, []);\n const onPanelDefaults = React.useCallback((size: number) => {\n panelDefaultSizeRef.current = size;\n }, []);\n\n // Determine children presence for left composition\n const hasLeftChildren = React.useMemo(() => {\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n return childArray.some((el) => isShellComponentType(el, Rail) || isShellComponentType(el, Panel));\n }, [children]);\n\n const hasSidebarChildren = React.useMemo(() => {\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n return childArray.some((el) => isShellComponentType(el, Sidebar));\n }, [children]);\n\n // Re-read the defaults when a pane family enters after mount.\n //\n // The initial modes are computed once, from the children present at mount.\n // That is right until an app swaps families at runtime - a Sidebar giving\n // way to Rail+Panel on one route, and back on the next. The entering pane\n // then renders against the mode left behind by the family that just went:\n // a Rail mounting 'collapsed', at width 0, with its content faded out, put\n // right one layout effect later. The reader sees a flicker in place where\n // the pane should have been there already.\n //\n // Adjusting state during render keeps this out of the paint: React re-runs\n // Root before the children render, so the entering pane never sees the\n // mode of the family it replaced. The ref guard is what makes the update\n // terminate - it fires only on the edge, never on a steady render.\n const enteredFamilyRef = React.useRef({ left: hasLeftChildren, sidebar: hasSidebarChildren });\n if (enteredFamilyRef.current.left !== hasLeftChildren || enteredFamilyRef.current.sidebar !== hasSidebarChildren) {\n const leftEntered = hasLeftChildren && !enteredFamilyRef.current.left;\n const sidebarEntered = hasSidebarChildren && !enteredFamilyRef.current.sidebar;\n enteredFamilyRef.current = { left: hasLeftChildren, sidebar: hasSidebarChildren };\n\n if (leftEntered || sidebarEntered) {\n // The live breakpoint, not the mount default: a responsive\n // defaultState like { initial: 'collapsed', md: 'expanded' } must be\n // read for the width the reader is on. Taking `initial` would send a\n // desktop sidebar in collapsed and let its own start-up effect open it\n // again after the paint, which is the blink this whole block exists to\n // remove.\n const { hasPanelDefaultOpen, ...modes } = readPaneStateFromChildren(children, currentBreakpoint as Breakpoint);\n if (leftEntered) {\n hasPanelDefaultOpenRef.current = hasPanelDefaultOpen;\n // Only when the mode actually differs, so a family that enters\n // already in the right mode dispatches nothing.\n if (modes.leftMode !== paneState.leftMode) dispatchPane({ type: 'SET_LEFT_MODE', mode: modes.leftMode });\n if (modes.panelMode !== paneState.panelMode) dispatchPane({ type: 'SET_PANEL_MODE', mode: modes.panelMode });\n }\n if (sidebarEntered && modes.sidebarMode !== paneState.sidebarMode) {\n dispatchPane({ type: 'SET_SIDEBAR_MODE', mode: modes.sidebarMode });\n }\n }\n }\n\n // Keep a ref to sidebar mode so togglePane doesn't depend on it,\n // preventing ActionsContext churn on every sidebar mode change\n const sidebarModeRef = React.useRef(paneState.sidebarMode);\n sidebarModeRef.current = paneState.sidebarMode;\n\n const togglePane = React.useCallback(\n (target: PaneTarget) => {\n if (target === 'sidebar') {\n const next = sidebarToggleComputerRef.current(sidebarModeRef.current as SidebarMode);\n setSidebarMode(next);\n return;\n }\n dispatchPane({ type: 'TOGGLE_PANE', target });\n },\n [setSidebarMode],\n );\n\n const expandPane = React.useCallback(\n (target: PaneTarget) => {\n if (target === 'sidebar') return setSidebarMode('expanded');\n dispatchPane({ type: 'EXPAND_PANE', target });\n },\n [setSidebarMode],\n );\n\n const collapsePane = React.useCallback(\n (target: PaneTarget) => {\n if (target === 'sidebar') return setSidebarMode('collapsed');\n dispatchPane({ type: 'COLLAPSE_PANE', target });\n },\n [setSidebarMode],\n );\n\n const baseContextValue = React.useMemo(\n () => ({\n leftMode: paneState.leftMode,\n setLeftMode,\n panelMode: paneState.panelMode,\n setPanelMode,\n sidebarMode: paneState.sidebarMode,\n setSidebarMode,\n inspectorMode: paneState.inspectorMode,\n setInspectorMode,\n bottomMode: paneState.bottomMode,\n setBottomMode,\n hasLeft,\n setHasLeft,\n hasSidebar,\n setHasSidebar,\n currentBreakpoint,\n currentBreakpointReady,\n leftResolvedPresentation: devLeftPres,\n togglePane,\n expandPane,\n collapsePane,\n setSidebarToggleComputer,\n onLeftPres,\n onRailDefaults,\n onPanelDefaults,\n }),\n [\n paneState.leftMode,\n setLeftMode,\n paneState.panelMode,\n setPanelMode,\n paneState.sidebarMode,\n setSidebarMode,\n paneState.inspectorMode,\n setInspectorMode,\n paneState.bottomMode,\n setBottomMode,\n hasLeft,\n hasSidebar,\n currentBreakpoint,\n currentBreakpointReady,\n devLeftPres,\n togglePane,\n expandPane,\n collapsePane,\n setSidebarToggleComputer,\n onLeftPres,\n onRailDefaults,\n onPanelDefaults,\n ],\n );\n\n // Organize children by type \u2014 single pass instead of 7 filter calls\n const { headerEls, railEls, panelEls, sidebarEls, contentEls, inspectorEls, bottomEls } = React.useMemo(() => {\n const result = {\n headerEls: [] as React.ReactElement[],\n railEls: [] as React.ReactElement[],\n panelEls: [] as React.ReactElement[],\n sidebarEls: [] as React.ReactElement[],\n contentEls: [] as React.ReactElement[],\n inspectorEls: [] as React.ReactElement[],\n bottomEls: [] as React.ReactElement[],\n };\n for (const el of React.Children.toArray(children) as React.ReactElement[]) {\n if (isShellComponentType(el, Header)) result.headerEls.push(el);\n else if (isShellComponentType(el, Rail)) result.railEls.push(el);\n else if (isShellComponentType(el, Panel)) result.panelEls.push(el);\n else if (isShellComponentType(el, Sidebar)) result.sidebarEls.push(el);\n else if (isShellComponentType(el, Content)) result.contentEls.push(el);\n else if (isShellComponentType(el, Inspector)) result.inspectorEls.push(el);\n else if (isShellComponentType(el, Bottom)) result.bottomEls.push(el);\n }\n return result;\n }, [children]);\n\n // Controlled sync in Root: mirror first Rail/Panel open if provided\n const firstRailOpen = (railEls[0] as any)?.props?.open;\n const resolvedFirstRailOpen = React.useMemo(() => {\n if (typeof firstRailOpen === 'undefined') return undefined;\n if (typeof firstRailOpen === 'boolean') return firstRailOpen;\n if (typeof firstRailOpen !== 'object' || firstRailOpen === null) return Boolean(firstRailOpen);\n\n const responsive = firstRailOpen as Partial<Record<Breakpoint, boolean>>;\n if (responsive[currentBreakpoint] !== undefined) return responsive[currentBreakpoint];\n\n const fallbackOrder: Breakpoint[] = ['xl', 'lg', 'md', 'sm', 'xs', 'initial'];\n const startIdx = fallbackOrder.indexOf(currentBreakpoint);\n for (let i = startIdx + 1; i < fallbackOrder.length; i++) {\n const bp = fallbackOrder[i];\n if (responsive[bp] !== undefined) return responsive[bp];\n }\n return undefined;\n }, [firstRailOpen, currentBreakpoint]);\n\n const firstPanelOpen = (panelEls[0] as any)?.props?.open;\n const resolvedFirstPanelOpen = React.useMemo(() => {\n if (typeof firstPanelOpen === 'undefined') return undefined;\n if (typeof firstPanelOpen === 'boolean') return firstPanelOpen;\n if (typeof firstPanelOpen !== 'object' || firstPanelOpen === null) return Boolean(firstPanelOpen);\n\n const responsive = firstPanelOpen as Partial<Record<Breakpoint, boolean>>;\n if (responsive[currentBreakpoint] !== undefined) return responsive[currentBreakpoint];\n\n const fallbackOrder: Breakpoint[] = ['xl', 'lg', 'md', 'sm', 'xs', 'initial'];\n const startIdx = fallbackOrder.indexOf(currentBreakpoint);\n for (let i = startIdx + 1; i < fallbackOrder.length; i++) {\n const bp = fallbackOrder[i];\n if (responsive[bp] !== undefined) return responsive[bp];\n }\n return undefined;\n }, [firstPanelOpen, currentBreakpoint]);\n\n const controlSeqRef = React.useRef(0);\n const lastRailChangeRef = React.useRef(0);\n const lastPanelChangeRef = React.useRef(0);\n const lastRailOpenRef = React.useRef<boolean | undefined>(resolvedFirstRailOpen);\n const lastPanelOpenRef = React.useRef<boolean | undefined>(resolvedFirstPanelOpen);\n\n React.useLayoutEffect(() => {\n if (resolvedFirstRailOpen === undefined) {\n lastRailOpenRef.current = undefined;\n return;\n }\n if (lastRailOpenRef.current === resolvedFirstRailOpen) return;\n lastRailOpenRef.current = resolvedFirstRailOpen;\n lastRailChangeRef.current = ++controlSeqRef.current;\n }, [resolvedFirstRailOpen]);\n\n React.useLayoutEffect(() => {\n if (resolvedFirstPanelOpen === undefined) {\n lastPanelOpenRef.current = undefined;\n return;\n }\n if (lastPanelOpenRef.current === resolvedFirstPanelOpen) return;\n lastPanelOpenRef.current = resolvedFirstPanelOpen;\n lastPanelChangeRef.current = ++controlSeqRef.current;\n }, [resolvedFirstPanelOpen]);\n\n React.useLayoutEffect(() => {\n if (typeof resolvedFirstRailOpen === 'undefined') return;\n setLeftMode(resolvedFirstRailOpen ? 'expanded' : 'collapsed');\n }, [resolvedFirstRailOpen, setLeftMode]);\n\n const railOnOpenChange = (railEls[0] as any)?.props?.onOpenChange as\n | ((open: boolean, meta: { reason: 'init' | 'toggle' | 'responsive' | 'panel' }) => void)\n | undefined;\n const panelOnOpenChange = (panelEls[0] as any)?.props?.onOpenChange as\n | ((open: boolean, meta: { reason: 'toggle' | 'left' | 'init' | 'responsive' }) => void)\n | undefined;\n const lastConflictRef = React.useRef<{ railSeq: number; panelSeq: number; action: 'open-rail' | 'close-panel' } | null>(null);\n\n React.useLayoutEffect(() => {\n if (resolvedFirstRailOpen !== false || resolvedFirstPanelOpen !== true) {\n lastConflictRef.current = null;\n return;\n }\n\n const panelWins = lastPanelChangeRef.current > lastRailChangeRef.current;\n const action: 'open-rail' | 'close-panel' = panelWins ? 'open-rail' : 'close-panel';\n const lastConflict = lastConflictRef.current;\n if (lastConflict && lastConflict.railSeq === lastRailChangeRef.current && lastConflict.panelSeq === lastPanelChangeRef.current && lastConflict.action === action) {\n return;\n }\n lastConflictRef.current = { railSeq: lastRailChangeRef.current, panelSeq: lastPanelChangeRef.current, action };\n\n if (panelWins) {\n railOnOpenChange?.(true, { reason: 'panel' });\n } else {\n panelOnOpenChange?.(false, { reason: 'left' });\n }\n }, [resolvedFirstRailOpen, resolvedFirstPanelOpen, railOnOpenChange, panelOnOpenChange]);\n\n const leftControlledOpen = resolvedFirstRailOpen;\n\n const heightStyle = React.useMemo(() => {\n if (height === 'full') return { height: '100vh' };\n if (height === 'auto') return { height: 'auto' };\n if (typeof height === 'string') return { height };\n if (typeof height === 'number') return { height: `${height}px` };\n return {};\n }, [height]);\n\n // Peek state (layout-only overlay without mode changes)\n const [peekTarget, setPeekTarget] = React.useState<PaneTarget | null>(null);\n const peekPane = React.useCallback((target: PaneTarget) => setPeekTarget(target), []);\n const clearPeek = React.useCallback(() => setPeekTarget(null), []);\n\n // Memoized slice context values to avoid notifying unrelated consumers\n const presentationCtxValue = React.useMemo(() => ({ currentBreakpoint, currentBreakpointReady, leftResolvedPresentation: devLeftPres }), [currentBreakpoint, currentBreakpointReady, devLeftPres]);\n const leftModeCtxValue = React.useMemo(() => ({ leftMode: paneState.leftMode, setLeftMode }), [paneState.leftMode, setLeftMode]);\n const panelModeCtxValue = React.useMemo(() => ({ panelMode: paneState.panelMode, setPanelMode }), [paneState.panelMode, setPanelMode]);\n const sidebarModeCtxValue = React.useMemo(() => ({ sidebarMode: paneState.sidebarMode, setSidebarMode }), [paneState.sidebarMode, setSidebarMode]);\n const inspectorModeCtxValue = React.useMemo(() => ({ inspectorMode: paneState.inspectorMode, setInspectorMode }), [paneState.inspectorMode, setInspectorMode]);\n const bottomModeCtxValue = React.useMemo(() => ({ bottomMode: paneState.bottomMode, setBottomMode }), [paneState.bottomMode, setBottomMode]);\n const compositionCtxValue = React.useMemo(() => ({ hasLeft, setHasLeft, hasSidebar, setHasSidebar }), [hasLeft, setHasLeft, hasSidebar, setHasSidebar]);\n\n // Inset state management\n const [insetPanes, setInsetPanes] = React.useState<Set<InsetPaneId>>(new Set());\n const registerInset = React.useCallback((id: InsetPaneId) => {\n setInsetPanes((prev) => {\n if (prev.has(id)) return prev;\n const next = new Set(prev);\n next.add(id);\n return next;\n });\n }, []);\n const unregisterInset = React.useCallback((id: InsetPaneId) => {\n setInsetPanes((prev) => {\n if (!prev.has(id)) return prev;\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, []);\n const hasAnyInset = insetPanes.size > 0;\n const insetCtxValue = React.useMemo(\n () => ({ insetPanes, registerInset, unregisterInset, hasAnyInset }),\n [insetPanes, registerInset, unregisterInset, hasAnyInset],\n );\n const peekCtxValue = React.useMemo(() => ({ peekTarget, setPeekTarget, peekPane, clearPeek }), [peekTarget, setPeekTarget, peekPane, clearPeek]);\n const actionsCtxValue = React.useMemo(() => ({ togglePane, expandPane, collapsePane, setSidebarToggleComputer }), [togglePane, expandPane, collapsePane, setSidebarToggleComputer]);\n\n // Memoized full context value for ShellProvider to prevent unnecessary effect re-runs\n const shellContextValue = React.useMemo(\n () => ({\n ...baseContextValue,\n leftControlledOpen,\n peekTarget,\n setPeekTarget,\n peekPane,\n clearPeek,\n }),\n [baseContextValue, leftControlledOpen, peekTarget, setPeekTarget, peekPane, clearPeek],\n );\n\n // Memoize the Left content to avoid recreating the IIFE on every render\n const leftContent = React.useMemo(() => {\n if (!hasLeftChildren || hasSidebarChildren) return null;\n const firstRail = railEls[0] as any;\n const firstPanel = panelEls[0] as any;\n const leftInset = Boolean(firstRail?.props?.inset) || Boolean(firstPanel?.props?.inset);\n const passthroughProps = firstRail\n ? {\n // Notification passthrough used by Left; not spread to DOM in Left\n onOpenChange: firstRail.props?.onOpenChange,\n open: firstRail.props?.open,\n defaultOpen: firstRail.props?.defaultOpen,\n presentation: firstRail.props?.presentation,\n collapsible: firstRail.props?.collapsible,\n onExpand: firstRail.props?.onExpand,\n onCollapse: firstRail.props?.onCollapse,\n inset: leftInset,\n }\n : { defaultOpen: hasPanelDefaultOpenRef.current ? true : undefined, inset: leftInset };\n return (\n <Left {...(passthroughProps as any)}>\n {railEls}\n {panelEls}\n </Left>\n );\n }, [hasLeftChildren, hasSidebarChildren, railEls, panelEls]);\n\n return (\n <div {...props} ref={ref} className={classNames('rt-ShellRoot', className)} style={{ ...heightStyle, ...props.style }}>\n <ShellProvider value={shellContextValue}>\n <PresentationContext.Provider value={presentationCtxValue}>\n <LeftModeContext.Provider value={leftModeCtxValue}>\n <PanelModeContext.Provider value={panelModeCtxValue}>\n <SidebarModeContext.Provider value={sidebarModeCtxValue}>\n <InspectorModeContext.Provider value={inspectorModeCtxValue}>\n <BottomModeContext.Provider value={bottomModeCtxValue}>\n <CompositionContext.Provider value={compositionCtxValue}>\n <PeekContext.Provider value={peekCtxValue}>\n <ActionsContext.Provider value={actionsCtxValue}>\n <InsetContext.Provider value={insetCtxValue}>\n {headerEls}\n <div\n className=\"rt-ShellBody\"\n data-peek-target={peekTarget ?? undefined}\n data-has-inset={hasAnyInset || undefined}\n style={\n peekTarget === 'rail' || peekTarget === 'panel'\n ? ({\n '--peek-rail-width': `${railDefaultSizeRef.current}px`,\n } as CSSPropertiesWithVars)\n : undefined\n }\n >\n {leftContent ?? sidebarEls}\n {contentEls}\n {inspectorEls}\n </div>\n {bottomEls}\n </InsetContext.Provider>\n </ActionsContext.Provider>\n </PeekContext.Provider>\n </CompositionContext.Provider>\n </BottomModeContext.Provider>\n </InspectorModeContext.Provider>\n </SidebarModeContext.Provider>\n </PanelModeContext.Provider>\n </LeftModeContext.Provider>\n </PresentationContext.Provider>\n </ShellProvider>\n </div>\n );\n}) as PanelComponent;\nRoot.displayName = 'Shell.Root';\n\n// Header\ninterface ShellHeaderProps extends React.ComponentPropsWithoutRef<'header'> {\n height?: number;\n}\n\nconst Header = React.forwardRef<HTMLElement, ShellHeaderProps>(({ className, height = 64, style, ...props }, ref) => (\n <header\n {...props}\n ref={ref}\n className={classNames('rt-ShellHeader', className)}\n style={{\n ...style,\n '--shell-header-height': `${height}px`,\n } as CSSPropertiesWithVars}\n />\n));\nHeader.displayName = 'Shell.Header';\n\n// Pane Props Interface (shared by Panel, Sidebar, Inspector, Bottom)\ntype PaneProps = PaneBaseProps;\n\n// Left container (auto-created for Rail+Panel)\ninterface LeftProps extends React.ComponentPropsWithoutRef<'div'> {\n presentation?: ResponsivePresentation;\n // New: passthrough from Rail\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, meta: { reason: 'init' | 'toggle' | 'panel' | 'responsive' }) => void;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n mode?: never;\n defaultMode?: never;\n onModeChange?: never;\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n}\n\n// Rail (special case)\ntype LeftOpenChangeMeta = { reason: 'init' | 'toggle' | 'responsive' | 'panel' };\n\ntype RailControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: LeftOpenChangeMeta) => void; defaultOpen?: never };\ntype RailUncontrolledProps = { defaultOpen?: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: LeftOpenChangeMeta) => void; open?: never };\n\ntype RailProps = React.ComponentPropsWithoutRef<'div'> & {\n presentation?: ResponsivePresentation;\n expandedSize?: number;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n /** When true, adds margin to Rail+Panel and triggers gray backdrop on Shell. */\n inset?: boolean;\n} & (RailControlledProps | RailUncontrolledProps);\n\n// Left container - behaves like Inspector but contains Rail+Panel\nconst LEFT_DOM_OMIT_PROPS = ['open', 'defaultOpen', 'onOpenChange', 'mode', 'defaultMode', 'onModeChange'] as const;\n\nconst Left = React.forwardRef<HTMLDivElement, LeftProps>((initialProps, ref) => {\n const { className, presentation = { initial: 'fixed', sm: 'fixed' }, collapsible: _collapsible = true, onExpand, onCollapse, children, style, inset, ...restProps } = initialProps;\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useEffect(() => {\n if (inset) {\n registerInset('left');\n return () => unregisterInset('left');\n }\n }, [inset, registerInset, unregisterInset]);\n const propsOpen = restProps.open;\n const propsDefaultOpen = restProps.defaultOpen;\n const propsOnOpenChange = restProps.onOpenChange;\n const domProps = omitPaneProps(restProps, LEFT_DOM_OMIT_PROPS);\n const shell = useShell();\n const { setHasLeft } = shell;\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n const localRef = React.useRef<HTMLDivElement | null>(null);\n // Publish resolved presentation so Root can gate peeking in overlay\n React.useEffect(() => {\n shell.onLeftPres?.(resolvedPresentation);\n }, [shell, resolvedPresentation]);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n\n // Register with shell\n React.useEffect(() => {\n setHasLeft(true);\n return () => setHasLeft(false);\n }, [setHasLeft]);\n\n const lastLeftModeRef = React.useRef<PaneMode | null>(null);\n const lastResolvedLeftControlledRef = React.useRef<PaneMode | undefined>(undefined);\n const normalizedLeftControlled = React.useMemo(() => {\n if (typeof propsOpen === 'undefined') return undefined;\n return propsOpen ? 'expanded' : 'collapsed';\n }, [propsOpen]);\n const normalizedLeftDefault = React.useMemo(() => mapResponsiveBooleanToPaneMode(propsDefaultOpen), [propsDefaultOpen]);\n\n // Stable refs for notification callbacks to avoid effect dep churn\n const propsOnOpenChangeRef = React.useRef(propsOnOpenChange);\n const propsOpenRef = React.useRef(propsOpen);\n React.useLayoutEffect(() => {\n propsOnOpenChangeRef.current = propsOnOpenChange;\n propsOpenRef.current = propsOpen;\n });\n\n const { resolvedControlled: resolvedLeftControlled } = useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedLeftControlled,\n defaultValue: normalizedLeftDefault,\n currentValue: shell.leftMode,\n setValue: shell.setLeftMode,\n breakpointReady: shell.currentBreakpointReady,\n onInit: (initial) => propsOnOpenChangeRef.current?.(initial === 'expanded', { reason: 'init' }),\n });\n\n // Emit mode changes for user/internal transitions.\n // In controlled mode, skip when the mode matches the controlled prop (prop-driven sync).\n const prevPanelModeRef = React.useRef<PaneMode | null>(null);\n React.useEffect(() => {\n const prevLeftMode = lastLeftModeRef.current;\n const prevPanelMode = prevPanelModeRef.current;\n\n const prevResolvedControlled = lastResolvedLeftControlledRef.current;\n const controlledChanged = prevResolvedControlled !== resolvedLeftControlled;\n\n if (prevLeftMode !== null && prevLeftMode !== shell.leftMode) {\n const isControlled = typeof propsOpenRef.current !== 'undefined';\n const controlledTarget = resolvedLeftControlled === undefined ? undefined : resolvedLeftControlled === 'expanded';\n const nextOpen = shell.leftMode === 'expanded';\n\n // In controlled mode, only notify when internal mode diverges from the\n // controlled prop \u2014 that means a trigger/cascade changed it, not a prop sync.\n if (!isControlled || (!controlledChanged && nextOpen !== controlledTarget)) {\n let reason: LeftOpenChangeMeta['reason'] = 'toggle';\n const panelDrivenOpen = prevPanelMode !== null && prevPanelMode !== shell.panelMode && prevLeftMode === 'collapsed' && shell.leftMode === 'expanded' && shell.panelMode === 'expanded';\n if (panelDrivenOpen) {\n reason = 'panel';\n }\n propsOnOpenChangeRef.current?.(nextOpen, { reason });\n }\n }\n\n lastLeftModeRef.current = shell.leftMode;\n prevPanelModeRef.current = shell.panelMode;\n lastResolvedLeftControlledRef.current = resolvedLeftControlled;\n }, [shell.leftMode, shell.panelMode, resolvedLeftControlled]);\n\n // Emit expand/collapse events.\n // Use callback refs to avoid re-running effect when inline callbacks change,\n // matching the pattern used by Inspector and Bottom.\n const onExpandRef = React.useRef(onExpand);\n const onCollapseRef = React.useRef(onCollapse);\n React.useLayoutEffect(() => {\n onExpandRef.current = onExpand;\n onCollapseRef.current = onCollapse;\n });\n\n const prevLeftModeForCallbackRef = React.useRef<PaneMode | null>(null);\n const hasLeftInitializedRef = React.useRef(false);\n React.useEffect(() => {\n const currentMode = shell.leftMode;\n\n if (!shell.currentBreakpointReady) {\n prevLeftModeForCallbackRef.current = currentMode;\n return;\n }\n\n if (!hasLeftInitializedRef.current) {\n hasLeftInitializedRef.current = true;\n prevLeftModeForCallbackRef.current = currentMode;\n return;\n }\n\n const prevMode = prevLeftModeForCallbackRef.current;\n\n if (prevMode !== null && prevMode !== currentMode) {\n if (currentMode === 'expanded') {\n onExpandRef.current?.();\n } else if (currentMode === 'collapsed') {\n onCollapseRef.current?.();\n }\n prevLeftModeForCallbackRef.current = currentMode;\n }\n }, [shell.leftMode, shell.currentBreakpointReady]);\n\n const _isExpanded = shell.leftMode === 'expanded';\n\n // Left is not resizable; width derives from Rail/Panel.\n\n if (isOverlay) {\n const open = shell.leftMode === 'expanded';\n // Compute overlay width from child Rail/Panel expanded sizes\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const railEl = childArray.find((el) => isShellComponentType(el, Rail));\n const panelEl = childArray.find((el) => isShellComponentType(el, Panel));\n const railSize = typeof (railEl as any)?.props?.expandedSize === 'number' ? (railEl as any).props.expandedSize : 64;\n const panelSize = typeof (panelEl as any)?.props?.expandedSize === 'number' ? (panelEl as any).props.expandedSize : 288;\n const hasRail = Boolean(railEl);\n const hasPanel = Boolean(panelEl);\n const overlayPx = (hasRail ? railSize : 0) + (shell.panelMode === 'expanded' && hasPanel ? panelSize : 0);\n return (\n <Sheet.Root open={open} onOpenChange={(o) => shell.setLeftMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content\n side=\"start\"\n style={{ padding: 0 }}\n aria-label=\"Navigation\"\n aria-describedby={undefined}\n width={{\n initial: `${overlayPx}px`,\n }}\n >\n <VisuallyHidden>\n <Sheet.Title>Navigation</Sheet.Title>\n </VisuallyHidden>\n <div className=\"rt-ShellLeft\">{children}</div>\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n if (isStacked) {\n const open = shell.leftMode === 'expanded';\n // Compute floating width from child Rail/Panel expanded sizes (like overlay)\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const railEl = childArray.find((el) => isShellComponentType(el, Rail));\n const panelEl = childArray.find((el) => isShellComponentType(el, Panel));\n const _railSize = typeof (railEl as any)?.props?.expandedSize === 'number' ? (railEl as any).props.expandedSize : 64;\n const _panelSize = typeof (panelEl as any)?.props?.expandedSize === 'number' ? (panelEl as any).props.expandedSize : 288;\n const _hasRail = Boolean(railEl);\n const _hasPanel = Boolean(panelEl);\n const _includePanel = _hasPanel && (shell.panelMode === 'expanded' || shell.peekTarget === 'panel');\n\n // Strip control props from DOM spread\n return (\n <div\n {...domProps}\n ref={setRef}\n className={classNames('rt-ShellLeft', className)}\n data-mode={shell.leftMode}\n data-peek={shell.peekTarget === 'left' || shell.peekTarget === 'rail' || shell.peekTarget === 'panel' || undefined}\n data-presentation={resolvedPresentation}\n data-inset={inset || undefined}\n style={{\n ...style,\n }}\n data-open={open || undefined}\n >\n {children}\n </div>\n );\n }\n\n // Strip control/legacy props from DOM spread\n return (\n <div\n {...domProps}\n ref={setRef}\n className={classNames('rt-ShellLeft', className)}\n data-mode={shell.leftMode}\n data-peek={shell.peekTarget === 'left' || shell.peekTarget === 'rail' || shell.peekTarget === 'panel' || undefined}\n data-presentation={resolvedPresentation}\n data-inset={inset || undefined}\n style={{\n ...style,\n }}\n >\n {children}\n </div>\n );\n});\nLeft.displayName = 'Shell.Left';\nassignShellSlot(Left as any, 'Shell.Left');\n\nconst Rail = React.forwardRef<HTMLDivElement, RailProps>((initialProps, ref) => {\n const { className, presentation, expandedSize = 64, collapsible, onExpand, onCollapse, children, style, open, defaultOpen, onOpenChange, inset: _inset, ...domProps } = initialProps;\n const shell = useShell();\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Rail: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n }\n\n // Warn on controlled/uncontrolled mode switch\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Rail: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n // Register expanded size with Left container\n React.useEffect(() => {\n shell.onRailDefaults?.(expandedSize);\n }, [shell, expandedSize]);\n\n const isExpanded = shell.leftMode === 'expanded';\n\n // Strip unknown open/defaultOpen props from DOM by not spreading them\n return (\n <div\n {...domProps}\n ref={ref}\n className={classNames('rt-ShellRail', className)}\n data-mode={shell.leftMode}\n data-peek={(shell.currentBreakpointReady && shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail') || undefined}\n style={{\n ...style,\n '--rail-size': `${expandedSize}px`,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellRailContent\" data-visible={(shell.currentBreakpointReady && (isExpanded || (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail'))) || undefined}>\n {children}\n </div>\n </div>\n );\n});\nRail.displayName = 'Shell.Rail';\nassignShellSlot(Rail as any, 'Shell.Rail');\n\n// Panel\ntype HandleComponent = React.ForwardRefExoticComponent<React.ComponentPropsWithoutRef<'div'> & React.RefAttributes<HTMLDivElement>>;\n\ntype PanelOpenChangeMeta = { reason: 'toggle' | 'left' | 'init' | 'responsive' };\ntype PanelControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: PanelOpenChangeMeta) => void; defaultOpen?: never };\ntype PanelUncontrolledProps = { defaultOpen?: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: PanelOpenChangeMeta) => void; open?: never };\n\ntype PanelSizeControlledProps = { size: number | string; defaultSize?: never };\ntype PanelSizeUncontrolledProps = { defaultSize?: number | string; size?: never };\n\ntype PanelSizeChangeMeta = { reason: 'init' | 'resize' | 'controlled' };\ntype PanelPublicProps = Omit<PaneProps, 'presentation' | 'defaultMode'> &\n (PanelControlledProps | PanelUncontrolledProps) &\n (PanelSizeControlledProps | PanelSizeUncontrolledProps) & {\n onSizeChange?: (size: number, meta: PanelSizeChangeMeta) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n /** When true, adds margin to Rail+Panel and triggers gray backdrop on Shell. */\n inset?: boolean;\n };\ntype PanelComponent = React.ForwardRefExoticComponent<PanelPublicProps & React.RefAttributes<HTMLDivElement>> & {\n Handle: HandleComponent;\n};\n\ntype _SidebarComponent = React.ForwardRefExoticComponent<\n (Omit<PaneProps, 'mode' | 'defaultMode' | 'onModeChange'> & {\n state?: Responsive<SidebarMode>;\n defaultState?: SidebarMode;\n onStateChange?: (mode: SidebarMode) => void;\n thinSize?: number;\n toggleModes?: 'both' | 'single';\n }) &\n React.RefAttributes<HTMLDivElement>\n> & { Handle: HandleComponent };\n\ntype _InspectorComponent = React.ForwardRefExoticComponent<PaneProps & React.RefAttributes<HTMLDivElement>> & { Handle: HandleComponent };\n\ntype _BottomComponent = React.ForwardRefExoticComponent<PaneProps & React.RefAttributes<HTMLDivElement>> & { Handle: HandleComponent };\n\nconst PANEL_DOM_PROP_KEYS = [\n 'className',\n 'children',\n 'defaultOpen',\n 'open',\n 'onOpenChange',\n 'size',\n 'defaultSize',\n 'onSizeChange',\n 'sizeUpdate',\n 'sizeUpdateMs',\n 'style',\n] as const satisfies readonly (keyof PanelPublicProps)[];\n\nconst Panel = assignShellSlot(\n React.forwardRef<HTMLDivElement, PanelPublicProps>((initialProps, ref) => {\n const {\n className,\n defaultOpen,\n open,\n onOpenChange,\n size,\n defaultSize,\n expandedSize = 288,\n minSize,\n maxSize,\n resizable,\n collapsible = true,\n onExpand: _onExpand,\n onCollapse: _onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n } = initialProps;\n const panelDomProps = extractPaneDomProps(initialProps, PANEL_DOM_PROP_KEYS);\n // Ref for debounce cleanup\n const debounceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // Cleanup debounce timeout on unmount or when dependencies change\n React.useLayoutEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = null;\n }\n };\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n // Throttled/debounced emitter for onSizeChange\n const emitSizeChange = React.useMemo(() => {\n if (!onSizeChange) return () => {};\n if (sizeUpdate === 'debounce') {\n const fn = (s: number, meta: PanelSizeChangeMeta) => {\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = setTimeout(() => {\n onSizeChange?.(s, meta);\n debounceTimeoutRef.current = null;\n }, sizeUpdateMs);\n };\n return fn;\n }\n if (sizeUpdate === 'throttle') {\n let last = 0;\n return (s: number, meta: PanelSizeChangeMeta) => {\n const now = Date.now();\n if (now - last >= sizeUpdateMs) {\n last = now;\n onSizeChange?.(s, meta);\n }\n };\n }\n return (s: number, meta: PanelSizeChangeMeta) => onSizeChange?.(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n const shell = useShell();\n const prevPanelModeRef = React.useRef<PaneMode | null>(null);\n const prevLeftModeRef = React.useRef<PaneMode | null>(null);\n const lastResolvedPanelControlledRef = React.useRef<PaneMode | undefined>(undefined);\n // Dev-only runtime guard\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Panel: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n if (typeof size !== 'undefined' && typeof defaultSize !== 'undefined') {\n console.error('Shell.Panel: Do not pass both `size` and `defaultSize`. Choose one.');\n }\n }\n\n // Normalize responsive open/defaultOpen to PaneMode\n const normalizedControlledOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(open), [open]);\n const normalizedDefaultOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(defaultOpen), [defaultOpen]);\n const openIsResponsive = typeof open === 'object' && open !== null;\n\n // Stable ref for onOpenChange to avoid effect dep churn\n const onOpenChangeRef = React.useRef(onOpenChange);\n React.useLayoutEffect(() => {\n onOpenChangeRef.current = onOpenChange;\n });\n\n // Use responsive initial state hook for proper breakpoint handling\n const { resolvedControlled: resolvedPanelControlled } = useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedControlledOpen,\n defaultValue: normalizedDefaultOpen,\n currentValue: shell.panelMode,\n setValue: (mode) => {\n // Ensure Left is expanded when Panel is expanded unless Rail is controlled closed\n if (mode === 'expanded' && shell.leftMode !== 'expanded' && shell.leftControlledOpen !== false) {\n shell.setLeftMode('expanded');\n }\n shell.setPanelMode(mode);\n },\n breakpointReady: shell.currentBreakpointReady,\n controlledIsResponsive: openIsResponsive,\n onResponsiveChange: (next) => onOpenChangeRef.current?.(next === 'expanded', { reason: 'responsive' }),\n onInit: (initial) => {\n if (typeof open === 'undefined') {\n onOpenChangeRef.current?.(initial === 'expanded', { reason: 'init' });\n }\n },\n });\n\n // Dev-only warning if switching controlled/uncontrolled between renders\n const wasControlledRef = React.useRef<boolean | null>(null);\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Panel: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n React.useEffect(() => {\n shell.onPanelDefaults?.(expandedSize);\n }, [shell, expandedSize]);\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === PanelHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === PanelHandle));\n\n const isOverlay = shell.leftResolvedPresentation === 'overlay';\n\n // Normalize CSS lengths to px helper\n const normalizeSizeToPx = React.useCallback((value: number | string | undefined) => normalizeToPx(value, 'horizontal'), []);\n\n // Derive a default persistence adapter from paneId if none provided\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:panel:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n try {\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Panel: failed to load persisted size', err);\n }\n return undefined;\n }\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, String(size));\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Panel: failed to save persisted size', err);\n }\n }\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n // Load persisted size if configured (only in fixed presentation)\n React.useEffect(() => {\n let mounted = true;\n (async () => {\n if (!resizable || !persistenceAdapter?.load || isOverlay) return;\n const loaded = await persistenceAdapter.load();\n if (mounted && typeof loaded === 'number' && localRef.current) {\n localRef.current.style.setProperty('--panel-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n // In overlay, ensure panel uses the fixed expandedSize, ignoring any persisted size\n React.useEffect(() => {\n if (!localRef.current) return;\n if (isOverlay) {\n localRef.current.style.setProperty('--panel-size', `${expandedSize}px`);\n }\n }, [isOverlay, expandedSize]);\n\n // Apply defaultSize on mount when uncontrolled\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeSizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n // Clamp to min/max if provided\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--panel-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // Intentionally run only on mount - defaultSize is an uncontrolled initial value\n // that should not trigger re-application when props change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined') return;\n const px = normalizeSizeToPx(size);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--panel-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [size, minSize, maxSize, normalizeSizeToPx, emitSizeChange]);\n\n // Ensure Left container width is auto whenever Panel is expanded in fixed presentation\n React.useEffect(() => {\n if (!localRef.current) return;\n if (shell.leftResolvedPresentation !== 'overlay' && shell.leftMode === 'expanded' && shell.panelMode === 'expanded') {\n const leftEl = (localRef.current.parentElement as HTMLElement) || null;\n try {\n leftEl?.style.removeProperty('width');\n } catch (e) {\n // Style manipulation can fail in edge cases (e.g., detached elements)\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[Shell.Panel] Style cleanup warning:', e);\n }\n }\n }\n }, [shell.leftResolvedPresentation, shell.leftMode, shell.panelMode]);\n\n const isExpanded = shell.leftMode === 'expanded' && shell.panelMode === 'expanded';\n\n // Notify on internal toggles and left cascade.\n // In controlled mode, skip when the mode matches the controlled prop (prop-driven sync).\n React.useEffect(() => {\n const prevPanel = prevPanelModeRef.current;\n const prevLeft = prevLeftModeRef.current;\n const prevResolvedControlled = lastResolvedPanelControlledRef.current;\n const controlledChanged = prevResolvedControlled !== resolvedPanelControlled;\n if (prevPanel !== null && prevPanel !== shell.panelMode) {\n const nextOpen = shell.panelMode === 'expanded';\n const isControlled = typeof open !== 'undefined';\n const controlledTarget = resolvedPanelControlled === undefined ? undefined : resolvedPanelControlled === 'expanded';\n\n if (!isControlled || (!controlledChanged && nextOpen !== controlledTarget)) {\n let reason: PanelOpenChangeMeta['reason'] = 'toggle';\n if (prevLeft !== shell.leftMode && shell.leftMode === 'collapsed' && !nextOpen) {\n reason = 'left';\n }\n onOpenChangeRef.current?.(nextOpen, { reason });\n }\n }\n prevPanelModeRef.current = shell.panelMode;\n prevLeftModeRef.current = shell.leftMode;\n lastResolvedPanelControlledRef.current = resolvedPanelControlled;\n }, [shell.panelMode, shell.leftMode, open, resolvedPanelControlled]);\n\n // Provide resizer handle when fixed (not overlay)\n const handleEl =\n resizable && shell.leftResolvedPresentation !== 'overlay' && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--panel-size',\n minSize: typeof minSize === 'number' ? minSize : 100,\n maxSize: typeof maxSize === 'number' ? maxSize : 800,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'end',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n return startSize + (isRtl ? -delta : delta);\n },\n onResize,\n onResizeStart: (size) => {\n // Ensure Left container is not stuck with a fixed width in stacked\n const panelEl = localRef.current as HTMLElement | null;\n const leftEl = panelEl?.parentElement as HTMLElement | null;\n try {\n leftEl?.style.removeProperty('width');\n } catch (e) {\n // Style manipulation can fail in edge cases\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[Shell.Panel] Resize start style cleanup warning:', e);\n }\n }\n onResizeStart?.(size);\n },\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'panel',\n collapsible: Boolean(collapsible),\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setPanelMode('collapsed'),\n requestToggle: () => shell.togglePane('panel'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n return (\n <div\n {...panelDomProps}\n ref={setRef}\n className={classNames('rt-ShellPanel', className)}\n data-mode={shell.panelMode}\n data-visible={(shell.currentBreakpointReady && (isExpanded || (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel'))) || undefined}\n data-peek={(shell.currentBreakpointReady && shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel') || undefined}\n style={{\n ...style,\n '--panel-size': `${expandedSize}px`,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellPanelContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n }),\n 'Shell.Panel',\n) as PanelComponent;\nPanel.displayName = 'Shell.Panel';\nPanel.Handle = PanelHandle;\n\n// Sidebar moved to ./_internal/shell-sidebar\n\n// Content (always required)\ninterface ShellContentProps extends React.ComponentPropsWithoutRef<'main'> {\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n}\n\nconst Content = React.forwardRef<HTMLElement, ShellContentProps>(({ className, inset, ...props }, ref) => {\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useEffect(() => {\n if (inset) {\n registerInset('content');\n return () => unregisterInset('content');\n }\n }, [inset, registerInset, unregisterInset]);\n\n return <main {...props} ref={ref} className={classNames('rt-ShellContent', className)} data-inset={inset || undefined} />;\n});\nContent.displayName = 'Shell.Content';\nassignShellSlot(Content as any, 'Shell.Content');\n\n// Inspector moved to ./_internal/shell-inspector\n\n// Bottom\n// Bottom moved to ./_internal/shell-bottom\n// (Bottom implementation extracted)\n\n// Trigger\n// PaneTarget type moved to shell.types.ts\ntype TriggerAction = 'toggle' | 'expand' | 'collapse';\n\ninterface TriggerProps extends React.ComponentPropsWithoutRef<'button'> {\n target: PaneTarget;\n action?: TriggerAction;\n /**\n * Whether to show peek preview on hover when the target pane is collapsed.\n * Defaults to false.\n */\n peekOnHover?: boolean;\n}\n\nconst Trigger = React.forwardRef<HTMLButtonElement, TriggerProps>(({ target, action = 'toggle', peekOnHover, onClick, onMouseEnter, onMouseLeave, children, ...props }, ref) => {\n // Slice hooks \u2014 Trigger only re-renders when its target pane's slice changes,\n // not on every unrelated shell state update (peek, composition, presentation, etc.)\n const { leftMode } = useLeftMode();\n const { panelMode } = usePanelMode();\n const { sidebarMode } = useSidebarMode();\n const { inspectorMode } = useInspectorMode();\n const { bottomMode } = useBottomMode();\n const { peekTarget, clearPeek, peekPane } = usePeek();\n const { togglePane, expandPane, collapsePane } = useShellActions();\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n // Clear any active peek on this target before toggling to avoid sticky peek state\n if (peekTarget === target) {\n clearPeek();\n }\n\n switch (action) {\n case 'toggle':\n togglePane(target);\n break;\n case 'expand':\n expandPane(target);\n break;\n case 'collapse':\n collapsePane(target);\n break;\n }\n },\n [peekTarget, clearPeek, togglePane, expandPane, collapsePane, target, action, onClick],\n );\n\n const isCollapsed = (() => {\n switch (target) {\n case 'left':\n case 'rail':\n return leftMode === 'collapsed';\n case 'panel':\n return leftMode === 'collapsed' || panelMode === 'collapsed';\n case 'sidebar':\n return sidebarMode === 'collapsed';\n case 'inspector':\n return inspectorMode === 'collapsed';\n case 'bottom':\n return bottomMode === 'collapsed';\n }\n })();\n\n const handleMouseEnter = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseEnter?.(event);\n if (!peekOnHover || !isCollapsed) return;\n peekPane(target);\n },\n [onMouseEnter, peekOnHover, isCollapsed, peekPane, target],\n );\n\n const handleMouseLeave = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseLeave?.(event);\n if (!peekOnHover) return;\n if (peekTarget === target) {\n clearPeek();\n }\n },\n [onMouseLeave, peekOnHover, peekTarget, clearPeek, target],\n );\n\n return (\n <button\n {...props}\n ref={ref}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n data-shell-trigger={target}\n data-shell-action={action}\n aria-expanded={!isCollapsed}\n >\n {children}\n </button>\n );\n});\nTrigger.displayName = 'Shell.Trigger';\n\n// Exports\nexport {\n Root,\n Header,\n Left,\n Rail,\n Panel,\n Sidebar,\n Content,\n Inspector,\n Bottom,\n Trigger,\n useShell,\n useSidebarMode,\n useResponsivePresentation,\n type PaneMode,\n type SidebarMode,\n type ResponsivePresentation,\n type PaneTarget,\n type TriggerAction,\n};\n", "'use client';\n\n/**\n * Sheet\n *\n * A side-placed overlay built on top of Radix Dialog. It inherits accessibility,\n * focus management, overlay behavior, and sizing scales from the base dialog, and\n * adds side placement and slide motion suited for navigation panels and drawers.\n *\n * Structure mirrors Dialog:\n * - Root, Trigger, Content, Title, Description, Close\n *\n * Notes\n * - Side: set with `side` on `Sheet.Content`. Aliases: `left` \u2192 `start`, `right` \u2192 `end`.\n * - Sizing: reuses Dialog content prop defs (width/min/max/height/size). Default Dialog\n * maxWidth clamping is removed for Sheets.\n * - Material: use `material` (solid | translucent). Deprecated `panelBackground` falls back\n * in dev with a warning.\n * - A11y: provide an accessible name via `Sheet.Title` or `aria-label` on `Sheet.Content`.\n *\n * Example\n * <Sheet.Root>\n * <Sheet.Trigger>\n * <Button>Open</Button>\n * </Sheet.Trigger>\n * <Sheet.Content side=\"end\" width={{ initial: '280px', md: '360px' }}>\n * <Sheet.Title>Details</Sheet.Title>\n * ...\n * <Sheet.Close>\n * <Button>Close</Button>\n * </Sheet.Close>\n * </Sheet.Content>\n * </Sheet.Root>\n */\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { Dialog as DialogPrimitive } from 'radix-ui';\n\nimport { dialogContentPropDefs } from './dialog.props.js';\nimport type { DialogContentOwnProps } from './dialog.props.js';\nimport { Theme } from './theme.js';\nimport { Heading } from './heading.js';\nimport { Text } from './text.js';\nimport { extractProps } from '../helpers/extract-props.js';\nimport { useDeprecatedPanelBackgroundWarning } from '../helpers/use-deprecation-warning.js';\nimport { requireReactElement } from '../helpers/require-react-element.js';\nimport { useBodyPointerEventsCleanup } from '../hooks/use-body-pointer-events-cleanup.js';\n\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\nimport type { HeadingProps } from './heading.js';\n\n/**\n * Supported sides for the Sheet.\n * Aliases are normalized RTL-aware: `left` \u2192 `start`, `right` \u2192 `end`.\n */\ntype SheetSide = 'start' | 'end' | 'top' | 'bottom' | 'left' | 'right';\n\n/**\n * Sheet is a side-placed overlay built on the Dialog primitive.\n * It reuses Dialog's accessibility, focus, overlay, and size scales, while adding side placement and slide motion.\n */\n\n// Root\n/**\n * Props for `Sheet.Root` (Radix Dialog root with `modal` forced on).\n */\ninterface SheetRootProps extends ComponentPropsWithout<typeof DialogPrimitive.Root, 'modal'> {}\nconst Root: React.FC<SheetRootProps> = (props) => <DialogPrimitive.Root {...props} modal />;\nRoot.displayName = 'Sheet.Root';\n\n// Trigger\n/** Element type for `Sheet.Trigger`. */\ntype SheetTriggerElement = React.ElementRef<typeof DialogPrimitive.Trigger>;\n/** Props for `Sheet.Trigger` (expects a single element child). */\ninterface SheetTriggerProps\n extends ComponentPropsWithout<typeof DialogPrimitive.Trigger, RemovedProps> {}\nconst Trigger = React.forwardRef<SheetTriggerElement, SheetTriggerProps>(\n ({ children, ...props }, ref) => (\n <DialogPrimitive.Trigger {...props} ref={ref} asChild>\n {requireReactElement(children)}\n </DialogPrimitive.Trigger>\n ),\n);\nTrigger.displayName = 'Sheet.Trigger';\n\n// Content\n/** Element type for `Sheet.Content`. */\n// Reuse dialog content prop defs for size/width/height tokens, but handle\n// material/panelBackground explicitly to avoid forwarding unknown DOM props.\n// Built once at module scope: `extractProps` memoises on the identity of the\n// prop def objects it is handed, so rebuilding these per render would recompile\n// them every time a sheet renders.\nconst {\n align: _alignPropDef,\n panelBackground: panelBackgroundPropDef,\n material: materialPropDef,\n ...dialogPropDefsForSheet\n} = dialogContentPropDefs;\n\nconst materialPropDefs = {\n panelBackground: panelBackgroundPropDef,\n material: materialPropDef,\n};\n\n// Override dialog's default maxWidth (600px) to avoid clamping Sheet by default\nconst { default: _mwDefault, ...maxWidthWithoutDefault } = dialogPropDefsForSheet.maxWidth;\nconst sheetPropDefs = {\n ...dialogPropDefsForSheet,\n maxWidth: maxWidthWithoutDefault,\n} as typeof dialogPropDefsForSheet;\n\ntype SheetContentElement = React.ElementRef<typeof DialogPrimitive.Content>;\ninterface SheetContentProps\n extends ComponentPropsWithout<typeof DialogPrimitive.Content, RemovedProps>,\n DialogContentOwnProps {\n /** Side where the Sheet should appear. `left`/`right` alias to `start`/`end`. */\n side?: SheetSide;\n /** Optional DOM container to portal into. Defaults to `document.body`. */\n container?: React.ComponentPropsWithoutRef<typeof DialogPrimitive.Portal>['container'];\n}\n\n/**\n * Renders the Sheet panel. Normalizes left/right to logical start/end and\n * forwards dialog sizing props. Provide an accessible name via `Sheet.Title`\n * or `aria-label`.\n */\nconst Content = React.forwardRef<SheetContentElement, SheetContentProps>(\n (allProps, forwardedRef) => {\n const {\n side = 'start',\n forceMount,\n container,\n className,\n panelBackground: panelBackgroundProp,\n material: materialProp,\n ...restProps\n } = allProps;\n const normalizedSideMap: Record<SheetSide, 'start' | 'end' | 'top' | 'bottom'> = {\n left: 'start',\n right: 'end',\n start: 'start',\n end: 'end',\n top: 'top',\n bottom: 'bottom',\n };\n const normalizedSide = normalizedSideMap[side];\n // Extract panelBackground and material together (remove from DOM props)\n const { panelBackground: resolvedPanelBackground, material: resolvedMaterial } = extractProps(\n { panelBackground: panelBackgroundProp, material: materialProp },\n materialPropDefs,\n );\n\n useDeprecatedPanelBackgroundWarning(panelBackgroundProp);\n\n // Material takes precedence over the deprecated panelBackground\n const materialValue = resolvedMaterial ?? resolvedPanelBackground;\n\n // Size/width/height class names come from the dialog defs \u2014 see `sheetPropDefs`.\n const { className: extractedClassName, ...contentProps } = extractProps(\n restProps,\n sheetPropDefs,\n );\n\n // Dev-only a11y guard: ensure label is provided via Title or aria-label\n if (process.env.NODE_ENV !== 'production') {\n const children = (contentProps as any).children as React.ReactNode;\n const hasAriaLabel = typeof (contentProps as any)['aria-label'] === 'string';\n let hasTitle = false;\n if (children) {\n for (const child of React.Children.toArray(children)) {\n if (React.isValidElement(child) && child.type === Title) {\n hasTitle = true;\n break;\n }\n }\n }\n if (!hasTitle && !hasAriaLabel) {\n console.warn(\n 'Sheet.Content: Missing accessible name. Include Sheet.Title as a child or provide aria-label.',\n );\n }\n }\n\n // Focus management and stuck pointer-events cleanup like Dialog\n const contentRef = React.useRef<HTMLDivElement>(null);\n const combinedRef = React.useMemo(\n () => (node: HTMLDivElement | null) => {\n contentRef.current = node;\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else if (forwardedRef) {\n (forwardedRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n },\n [forwardedRef],\n );\n\n useBodyPointerEventsCleanup();\n\n React.useEffect(() => {\n if (typeof window === 'undefined') return;\n const content = contentRef.current;\n if (!content) return;\n\n const focusableElements = content.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n\n if (focusableElements.length === 0) return;\n\n const firstElement = focusableElements[0] as HTMLElement;\n const lastElement = focusableElements[focusableElements.length - 1] as HTMLElement;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Tab') {\n if (event.shiftKey) {\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n }\n } else if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n }\n };\n\n content.addEventListener('keydown', handleKeyDown);\n firstElement.focus();\n\n return () => {\n content.removeEventListener('keydown', handleKeyDown);\n };\n }, []);\n\n return (\n <DialogPrimitive.Portal container={container} forceMount={forceMount}>\n <Theme asChild>\n <DialogPrimitive.Overlay className=\"rt-BaseDialogOverlay rt-DialogOverlay rt-SheetOverlay\">\n <DialogPrimitive.Content\n {...contentProps}\n ref={combinedRef}\n className={classNames(\n 'rt-BaseDialogContent',\n 'rt-SheetContent',\n className,\n extractedClassName,\n )}\n data-side={normalizedSide}\n data-material={materialValue}\n data-panel-background={materialValue}\n tabIndex={-1}\n role=\"dialog\"\n aria-modal=\"true\"\n />\n </DialogPrimitive.Overlay>\n </Theme>\n </DialogPrimitive.Portal>\n );\n },\n);\nContent.displayName = 'Sheet.Content';\n\n// Title - renders as Heading with sensible defaults\ntype SheetTitleElement = React.ElementRef<typeof Heading>;\ntype SheetTitleProps = HeadingProps;\n/** Accessible title for the Sheet. Renders as Heading with sensible defaults. */\nconst Title = React.forwardRef<SheetTitleElement, SheetTitleProps>(\n ({ size = '4', weight = 'medium', ...props }, ref) => (\n <DialogPrimitive.Title asChild>\n <Heading ref={ref} size={size} weight={weight} {...props} />\n </DialogPrimitive.Title>\n ),\n);\nTitle.displayName = 'Sheet.Title';\n\n// Description - renders as Text with sensible defaults\ntype SheetDescriptionElement = React.ElementRef<typeof Text>;\ntype SheetDescriptionProps = React.ComponentPropsWithoutRef<typeof Text>;\n/** Supplementary description text for Sheet content. Renders as Text with sensible defaults. */\nconst Description = React.forwardRef<SheetDescriptionElement, SheetDescriptionProps>(\n ({ size = '2', color = 'gray', ...rest }, ref) => (\n <DialogPrimitive.Description asChild>\n <Text ref={ref} size={size} color={color} {...rest} />\n </DialogPrimitive.Description>\n ),\n);\nDescription.displayName = 'Sheet.Description';\n\ntype SheetCloseElement = React.ElementRef<typeof DialogPrimitive.Close>;\ninterface SheetCloseProps\n extends ComponentPropsWithout<typeof DialogPrimitive.Close, RemovedProps> {}\n/** Close button for the Sheet. Expects a single element child rendered via `asChild`. */\nconst Close = React.forwardRef<SheetCloseElement, SheetCloseProps>(\n ({ children, ...props }, ref) => (\n <DialogPrimitive.Close {...props} ref={ref} asChild>\n {requireReactElement(children)}\n </DialogPrimitive.Close>\n ),\n);\nClose.displayName = 'Sheet.Close';\n\nexport { Root, Trigger, Content, Title, Description, Close };\nexport type {\n SheetRootProps as RootProps,\n SheetTriggerProps as TriggerProps,\n SheetContentProps as ContentProps,\n SheetTitleProps as TitleProps,\n SheetDescriptionProps as DescriptionProps,\n SheetCloseProps as CloseProps,\n};\n", "import type { PropDef } from './prop-def.js';\n\nconst asChildPropDef = {\n /**\n * Composes the component into its immediate child instead of rendering its own HTML element.\n * You\u2019ll have to provide a single React Element child.\n */\n asChild: {\n type: 'boolean',\n },\n} satisfies {\n asChild: PropDef<boolean>;\n};\n\nexport { asChildPropDef };\n", "import type { GetPropDefTypes, PropDef } from './prop-def.js';\n\nconst widthPropDefs = {\n /**\n * Sets the CSS **width** property.\n * Supports CSS strings and responsive objects.\n *\n * @example\n * width=\"100px\"\n * width={{ md: '100vw', xl: '1400px' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/width\n */\n width: {\n type: 'string',\n className: 'rt-r-w',\n customProperties: ['--width'],\n responsive: true,\n },\n /**\n * Sets the CSS **min-width** property.\n * Supports CSS strings and responsive objects.\n *\n * @example\n * minWidth=\"100px\"\n * minWidth={{ md: '100vw', xl: '1400px' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/min-width\n */\n minWidth: {\n type: 'string',\n className: 'rt-r-min-w',\n customProperties: ['--min-width'],\n responsive: true,\n },\n /**\n * Sets the CSS **max-width** property.\n * Supports CSS strings and responsive objects.\n *\n * @example\n * maxWidth=\"100px\"\n * maxWidth={{ md: '100vw', xl: '1400px' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/max-width\n */\n maxWidth: {\n type: 'string',\n className: 'rt-r-max-w',\n customProperties: ['--max-width'],\n responsive: true,\n },\n} satisfies {\n width: PropDef<string>;\n minWidth: PropDef<string>;\n maxWidth: PropDef<string>;\n};\n\ntype WidthProps = GetPropDefTypes<typeof widthPropDefs>;\n\nexport { widthPropDefs };\nexport type { WidthProps };\n", "import type { PropDef, GetPropDefTypes } from './prop-def.js';\n\nconst heightPropDefs = {\n /**\n * Sets the CSS **height** property.\n * Supports CSS strings and responsive objects.\n *\n * @example\n * height=\"100px\"\n * height={{ md: '100vh', xl: '600px' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/height\n */\n height: {\n type: 'string',\n className: 'rt-r-h',\n customProperties: ['--height'],\n responsive: true,\n },\n /**\n * Sets the CSS **min-height** property.\n * Supports CSS strings and responsive objects.\n *\n * @example\n * minHeight=\"100px\"\n * minHeight={{ md: '100vh', xl: '600px' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/min-height\n */\n minHeight: {\n type: 'string',\n className: 'rt-r-min-h',\n customProperties: ['--min-height'],\n responsive: true,\n },\n /**\n * Sets the CSS **max-height** property.\n * Supports CSS strings and responsive objects.\n *\n * @example\n * maxHeight=\"100px\"\n * maxHeight={{ md: '100vh', xl: '600px' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/max-height\n */\n maxHeight: {\n type: 'string',\n className: 'rt-r-max-h',\n customProperties: ['--max-height'],\n responsive: true,\n },\n} satisfies {\n height: PropDef<string>;\n minHeight: PropDef<string>;\n maxHeight: PropDef<string>;\n};\n\ntype HeightProps = GetPropDefTypes<typeof heightPropDefs>;\n\nexport { heightPropDefs };\nexport type { HeightProps };\n", "import { asChildPropDef } from '../props/as-child.prop.js';\nimport { widthPropDefs } from '../props/width.props.js';\nimport { heightPropDefs } from '../props/height.props.js';\n\nimport type { PropDef, GetPropDefTypes } from '../props/prop-def.js';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst alignValues = ['start', 'center'] as const;\nconst contentSizes = ['1', '2', '3', '4'] as const;\nconst panelBackgrounds = ['solid', 'translucent'] as const;\nconst materials = ['solid', 'translucent'] as const;\n\nconst dialogContentPropDefs = {\n ...asChildPropDef,\n align: {\n type: 'enum',\n className: 'rt-r-align',\n values: ['start', 'center'],\n default: 'center',\n },\n size: {\n type: 'enum',\n className: 'rt-r-size',\n values: contentSizes,\n default: '3',\n responsive: true,\n },\n panelBackground: { type: 'enum', values: panelBackgrounds, default: undefined },\n material: { type: 'enum', values: materials, default: undefined },\n width: widthPropDefs.width,\n minWidth: widthPropDefs.minWidth,\n maxWidth: { ...widthPropDefs.maxWidth, default: '600px' },\n ...heightPropDefs,\n} satisfies {\n align: PropDef<(typeof alignValues)[number]>;\n size: PropDef<(typeof contentSizes)[number]>;\n panelBackground: PropDef<(typeof panelBackgrounds)[number] | undefined>;\n material: PropDef<(typeof materials)[number] | undefined>;\n width: PropDef<string>;\n minWidth: PropDef<string>;\n maxWidth: PropDef<string>;\n};\n\ntype DialogContentOwnProps = GetPropDefTypes<\n typeof dialogContentPropDefs & typeof asChildPropDef & typeof widthPropDefs\n>;\n\nexport { dialogContentPropDefs };\nexport type { DialogContentOwnProps };\n", "'use client';\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { Direction, Slot, Tooltip as TooltipPrimitive } from 'radix-ui';\nimport { useComposedRefs, useLayoutEffect } from 'radix-ui/internal';\n\nimport { getMatchingGrayColor } from '../helpers/get-matching-gray-color.js';\nimport { usePropSyncedState } from '../hooks/use-prop-synced-state.js';\nimport { useDeprecatedPanelBackgroundWarning } from '../helpers/use-deprecation-warning.js';\nimport { themePropDefs } from './theme.props.js';\n\nimport type { ThemeOwnProps } from './theme.props.js';\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\n\nconst noop = () => {};\n\ntype ThemeAppearance = (typeof themePropDefs.appearance.values)[number];\ntype ThemeAccentColor = (typeof themePropDefs.accentColor.values)[number];\ntype ThemeGrayColor = (typeof themePropDefs.grayColor.values)[number];\ntype ThemeMaterial = (typeof themePropDefs.material.values)[number];\ntype ThemePanelBackground = (typeof themePropDefs.panelBackground.values)[number];\ntype ThemeRadius = (typeof themePropDefs.radius.values)[number];\ntype ThemeScaling = (typeof themePropDefs.scaling.values)[number];\ntype ThemeFontFamily = (typeof themePropDefs.fontFamily.values)[number];\n\ninterface ThemeChangeHandlers {\n onAppearanceChange: (appearance: ThemeAppearance) => void;\n onAccentColorChange: (accentColor: ThemeAccentColor) => void;\n onGrayColorChange: (grayColor: ThemeGrayColor) => void;\n onMaterialChange: (material: ThemeMaterial) => void;\n onPanelBackgroundChange: (panelBackground: ThemePanelBackground) => void;\n onRadiusChange: (radius: ThemeRadius) => void;\n onScalingChange: (scaling: ThemeScaling) => void;\n onFontFamilyChange: (fontFamily: ThemeFontFamily) => void;\n}\n\ninterface ThemeContextValue extends ThemeChangeHandlers {\n appearance: ThemeAppearance;\n accentColor: ThemeAccentColor;\n grayColor: ThemeGrayColor;\n resolvedGrayColor: ThemeGrayColor;\n material: ThemeMaterial;\n panelBackground: ThemePanelBackground;\n radius: ThemeRadius;\n scaling: ThemeScaling;\n fontFamily: ThemeFontFamily;\n}\n// Default theme values used when components render outside a Theme provider\nconst defaultThemeContext: ThemeContextValue = {\n appearance: themePropDefs.appearance.default,\n accentColor: themePropDefs.accentColor.default,\n grayColor: themePropDefs.grayColor.default,\n resolvedGrayColor: themePropDefs.grayColor.default,\n material: themePropDefs.material.default,\n panelBackground: themePropDefs.panelBackground.default,\n radius: themePropDefs.radius.default,\n scaling: themePropDefs.scaling.default,\n fontFamily: themePropDefs.fontFamily.default,\n onAppearanceChange: noop,\n onAccentColorChange: noop,\n onGrayColorChange: noop,\n onMaterialChange: noop,\n onPanelBackgroundChange: noop,\n onRadiusChange: noop,\n onScalingChange: noop,\n onFontFamilyChange: noop,\n};\n\nconst ThemeContext = React.createContext<ThemeContextValue | undefined>(undefined);\n\nfunction useThemeContext() {\n const context = React.useContext(ThemeContext);\n // Return default context if used outside Theme provider (e.g., during SSR)\n return context ?? defaultThemeContext;\n}\n\ninterface ThemeProps extends ThemeImplPublicProps {}\nconst Theme = React.forwardRef<ThemeImplElement, ThemeProps>((props, forwardedRef) => {\n const context = React.useContext(ThemeContext);\n const isRoot = context === undefined;\n if (isRoot) {\n return (\n <TooltipPrimitive.Provider delayDuration={200}>\n <Direction.Provider dir=\"ltr\">\n <ThemeRoot {...props} ref={forwardedRef} />\n </Direction.Provider>\n </TooltipPrimitive.Provider>\n );\n }\n return <ThemeImpl {...props} ref={forwardedRef} />;\n});\nTheme.displayName = 'Theme';\n\nconst ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(\n (props, forwardedRef) => {\n const {\n appearance: appearanceProp = themePropDefs.appearance.default,\n accentColor: accentColorProp = themePropDefs.accentColor.default,\n grayColor: grayColorProp = themePropDefs.grayColor.default,\n material: materialProp = themePropDefs.material.default,\n panelBackground: panelBackgroundProp = themePropDefs.panelBackground.default,\n radius: radiusProp = themePropDefs.radius.default,\n scaling: scalingProp = themePropDefs.scaling.default,\n fontFamily: fontFamilyProp = themePropDefs.fontFamily.default,\n hasBackground = themePropDefs.hasBackground.default,\n ...rootProps\n } = props;\n\n useDeprecatedPanelBackgroundWarning(props.panelBackground);\n\n // Each of these follows its prop but stays independently settable, so\n // `ThemePanel` can change the theme at runtime. Syncing during render\n // rather than in an effect matters here: an effect would commit the old\n // theme first and re-render every consumer of the context a second time.\n const [appearance, setAppearance] = usePropSyncedState(appearanceProp);\n const [accentColor, setAccentColor] = usePropSyncedState(accentColorProp);\n const [grayColor, setGrayColor] = usePropSyncedState(grayColorProp);\n\n // Material takes precedence over panelBackground\n const effectiveMaterial =\n materialProp !== themePropDefs.material.default ? materialProp : panelBackgroundProp;\n const [material, setMaterial] = usePropSyncedState(effectiveMaterial);\n\n // Keep panelBackground in sync with material for backward compatibility\n const [panelBackground, setPanelBackground] = usePropSyncedState(material);\n\n const [radius, setRadius] = usePropSyncedState(radiusProp);\n const [scaling, setScaling] = usePropSyncedState(scalingProp);\n const [fontFamily, setFontFamily] = usePropSyncedState(fontFamilyProp);\n\n return (\n <ThemeImpl\n {...rootProps}\n ref={forwardedRef}\n isRoot\n hasBackground={hasBackground}\n //\n appearance={appearance}\n accentColor={accentColor}\n grayColor={grayColor}\n material={material}\n panelBackground={panelBackground}\n radius={radius}\n scaling={scaling}\n fontFamily={fontFamily}\n //\n onAppearanceChange={setAppearance}\n onAccentColorChange={setAccentColor}\n onGrayColorChange={setGrayColor}\n onMaterialChange={setMaterial}\n onPanelBackgroundChange={setPanelBackground}\n onRadiusChange={setRadius}\n onScalingChange={setScaling}\n onFontFamilyChange={setFontFamily}\n />\n );\n },\n);\nThemeRoot.displayName = 'ThemeRoot';\n\ntype ThemeImplElement = React.ElementRef<'div'>;\ninterface ThemeImplProps extends ThemeImplPublicProps, ThemeImplPrivateProps {}\ninterface ThemeImplPublicProps\n extends ComponentPropsWithout<'div', RemovedProps | 'dir'>,\n ThemeOwnProps {}\ninterface ThemeImplPrivateProps extends Partial<ThemeChangeHandlers> {\n isRoot?: boolean;\n}\nfunction getClientOS(): 'windows' | 'macos' | 'linux' | undefined {\n if (typeof navigator === 'undefined') return undefined;\n const ua = navigator.userAgent;\n if (ua.includes('Win')) return 'windows';\n if (ua.includes('Mac')) return 'macos';\n if (ua.includes('Linux')) return 'linux';\n return undefined;\n}\n\nconst ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, forwardedRef) => {\n const context = React.useContext(ThemeContext);\n const {\n asChild,\n isRoot,\n hasBackground: hasBackgroundProp,\n //\n appearance = props.appearance ?? context?.appearance ?? themePropDefs.appearance.default,\n accentColor = props.accentColor ?? context?.accentColor ?? themePropDefs.accentColor.default,\n grayColor = props.grayColor ?? context?.resolvedGrayColor ?? themePropDefs.grayColor.default,\n material = props.material ?? context?.material ?? themePropDefs.material.default,\n panelBackground = props.panelBackground ??\n context?.panelBackground ??\n themePropDefs.panelBackground.default,\n radius = props.radius ?? context?.radius ?? themePropDefs.radius.default,\n scaling = props.scaling ?? context?.scaling ?? themePropDefs.scaling.default,\n fontFamily = props.fontFamily ?? context?.fontFamily ?? themePropDefs.fontFamily.default,\n //\n onAppearanceChange = noop,\n onAccentColorChange = noop,\n onGrayColorChange = noop,\n onMaterialChange = noop,\n onPanelBackgroundChange = noop,\n onRadiusChange = noop,\n onScalingChange = noop,\n onFontFamilyChange = noop,\n //\n ...themeProps\n } = props;\n const Comp = asChild ? Slot.Root : 'div';\n const resolvedGrayColor = grayColor === 'auto' ? getMatchingGrayColor(accentColor) : grayColor;\n const isExplicitAppearance = props.appearance === 'light' || props.appearance === 'dark';\n const hasBackground =\n hasBackgroundProp === undefined ? isRoot || isExplicitAppearance : hasBackgroundProp;\n\n // `data-os` can only be resolved on the client. Writing it straight to the\n // DOM keeps it out of the server markup \u2014 so hydration still matches \u2014 without\n // spending a render pass, and a state update here would re-render the whole\n // application on mount.\n const rootRef = React.useRef<ThemeImplElement>(null);\n const composedRef = useComposedRefs(forwardedRef, rootRef);\n const hasExplicitOS = 'data-os' in themeProps;\n\n useLayoutEffect(() => {\n if (!isRoot || hasExplicitOS) return;\n const node = rootRef.current;\n if (!node) return;\n\n const os = getClientOS();\n if (!os) return;\n node.setAttribute('data-os', os);\n return () => node.removeAttribute('data-os');\n }, [isRoot, hasExplicitOS]);\n\n return (\n <ThemeContext.Provider\n value={React.useMemo(\n () => ({\n appearance,\n accentColor,\n grayColor,\n resolvedGrayColor,\n material,\n panelBackground,\n radius,\n scaling,\n fontFamily,\n //\n onAppearanceChange,\n onAccentColorChange,\n onGrayColorChange,\n onMaterialChange,\n onPanelBackgroundChange,\n onRadiusChange,\n onScalingChange,\n onFontFamilyChange,\n }),\n [\n appearance,\n accentColor,\n grayColor,\n resolvedGrayColor,\n material,\n panelBackground,\n radius,\n scaling,\n fontFamily,\n //\n onAppearanceChange,\n onAccentColorChange,\n onGrayColorChange,\n onMaterialChange,\n onPanelBackgroundChange,\n onRadiusChange,\n onScalingChange,\n onFontFamilyChange,\n ],\n )}\n >\n <Comp\n data-is-root-theme={isRoot ? 'true' : 'false'}\n data-accent-color={accentColor}\n data-gray-color={resolvedGrayColor}\n // for nested `Theme` background\n data-has-background={hasBackground ? 'true' : 'false'}\n data-material={material}\n data-panel-background={panelBackground}\n data-radius={radius}\n data-scaling={scaling}\n data-font-family={fontFamily}\n ref={composedRef}\n {...themeProps}\n className={classNames(\n 'radix-themes',\n {\n light: appearance === 'light',\n dark: appearance === 'dark',\n },\n themeProps.className,\n )}\n />\n </ThemeContext.Provider>\n );\n});\nThemeImpl.displayName = 'ThemeImpl';\n\nexport { Theme, ThemeContext, useThemeContext };\nexport type { ThemeProps, ThemeContextValue };\n", "import type { accentColors } from '../props/color.prop.js';\n\ntype ThemeAccentColor = (typeof accentColors)[number];\n\nexport function getMatchingGrayColor(accentColor: ThemeAccentColor) {\n switch (accentColor) {\n case 'tomato':\n case 'red':\n case 'ruby':\n case 'crimson':\n case 'pink':\n case 'plum':\n case 'purple':\n case 'violet':\n return 'mauve';\n case 'iris':\n case 'indigo':\n case 'blue':\n case 'sky':\n case 'cyan':\n return 'slate';\n case 'teal':\n case 'jade':\n case 'mint':\n case 'green':\n return 'sage';\n case 'grass':\n case 'lime':\n return 'olive';\n case 'yellow':\n case 'amber':\n case 'orange':\n case 'brown':\n case 'gold':\n case 'bronze':\n return 'sand';\n case 'gray':\n return 'gray';\n }\n}\n", "import * as React from 'react';\n\n/**\n * State that tracks a prop but can also be set imperatively \u2014 the shape `Theme`\n * needs, where a prop sets the value and `ThemePanel` can change it at runtime.\n *\n * Adjusts state during render rather than syncing in a `useEffect`. An effect\n * would commit one render carrying the *old* value and schedule a second one,\n * which for a provider means every consumer renders twice and the browser can\n * paint the stale value in between.\n *\n * @see https://react.dev/reference/react/useState#storing-information-from-previous-renders\n */\nexport function usePropSyncedState<T>(propValue: T) {\n const [value, setValue] = React.useState(propValue);\n const [previousPropValue, setPreviousPropValue] = React.useState(propValue);\n\n if (!Object.is(propValue, previousPropValue)) {\n setPreviousPropValue(propValue);\n setValue(propValue);\n }\n\n return [value, setValue] as const;\n}\n", "import * as React from 'react';\n\nconst PANEL_BACKGROUND_MESSAGE = 'Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.';\n\nconst warned = new Set<string>();\n\nfunction warnOnce(message: string) {\n if (warned.has(message)) return;\n warned.add(message);\n console.warn(message);\n}\n\n/**\n * Warns, in development only, that `panelBackground` is deprecated.\n *\n * The `process.env.NODE_ENV` check is a compile-time constant, so a production\n * bundle minifies the effect body away to an empty function instead of reading\n * props and formatting a message per mounted component. The message is also\n * logged once per session rather than once per component instance.\n */\nexport function useDeprecatedPanelBackgroundWarning(panelBackground: unknown) {\n React.useEffect(() => {\n if (process.env.NODE_ENV === 'production') return;\n if (panelBackground !== undefined) warnOnce(PANEL_BACKGROUND_MESSAGE);\n }, [panelBackground]);\n}\n", "import type { PropDef } from './prop-def.js';\n\n// prettier-ignore\nconst accentColors = ['gray', 'gold', 'bronze', 'brown', 'yellow', 'amber', 'orange', 'tomato', 'red', 'ruby', 'crimson', 'pink', 'plum', 'purple', 'violet', 'iris', 'indigo', 'blue', 'cyan', 'teal', 'jade', 'green', 'grass', 'lime', 'mint', 'sky'] as const;\n\nconst grayColors = ['auto', 'gray', 'mauve', 'slate', 'sage', 'olive', 'sand'] as const;\n\nconst colorPropDef = {\n color: {\n type: 'enum',\n values: accentColors,\n default: undefined as (typeof accentColors)[number] | undefined,\n },\n} satisfies {\n color: PropDef<(typeof accentColors)[number]>;\n};\n\n// 1. When used on components that compose Text, sets the color of the text to the current accent.\n// 2. Defines accent color for descendant text components\u00A0with `highContrast={true}`.\nconst accentColorPropDef = {\n color: {\n type: 'enum',\n values: accentColors,\n default: '' as (typeof accentColors)[number],\n },\n} satisfies {\n color: PropDef<(typeof accentColors)[number]>;\n};\n\nexport {\n accentColorPropDef,\n colorPropDef,\n //\n accentColors,\n grayColors,\n};\n", "import type { PropDef } from './prop-def.js';\n\nconst radii = ['none', 'small', 'medium', 'large', 'full'] as const;\n\nconst radiusPropDef = {\n radius: {\n type: 'enum',\n values: radii,\n default: undefined,\n },\n} satisfies {\n radius: PropDef<(typeof radii)[number]>;\n};\n\nexport { radiusPropDef, radii };\n", "import { asChildPropDef } from '../props/as-child.prop.js';\nimport { accentColors, grayColors } from '../props/color.prop.js';\nimport { radii } from '../props/radius.prop.js';\n\nimport type { GetPropDefTypes, PropDef } from '../props/prop-def.js';\n\nconst appearances = ['inherit', 'light', 'dark'] as const;\nconst panelBackgrounds = ['solid', 'translucent'] as const;\nconst materials = ['solid', 'translucent'] as const;\nconst scalings = ['90%', '95%', '100%', '105%', '110%'] as const;\nconst fontFamilies = ['sans', 'mono', 'serif'] as const;\n\nconst themePropDefs = {\n ...asChildPropDef,\n /**\n * Whether to apply background color to the Theme element.\n *\n * Defaults to true for the root Theme and for Theme elements that\n * have an explicit light or dark appearance prop.\n */\n hasBackground: { type: 'boolean', default: true },\n /**\n * Sets the color scheme of the theme, typcially referred to as light and dark mode.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/dark-mode\n */\n appearance: { type: 'enum', values: appearances, default: 'inherit' },\n /**\n * Selects one of the accent color options to use in the Theme.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/color\n */\n accentColor: { type: 'enum', values: accentColors, default: 'blue' },\n /**\n * Selects one of the gray color options to use in the Theme.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/color\n */\n grayColor: { type: 'enum', values: grayColors, default: 'slate' },\n /**\n * Controls whether to use a solid or translucent background color on panelled\n * elements such as Card or Table is solid or translucent.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/visual-style\n */\n material: { type: 'enum', values: materials, default: 'translucent' },\n /**\n * Controls whether to use a solid or translucent background color on panelled\n * elements such as Card or Table is solid or translucent.\n *\n * @deprecated Use `material` prop instead. This prop will be removed in a future version.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/visual-style\n */\n panelBackground: { type: 'enum', values: panelBackgrounds, default: 'translucent' },\n /**\n * Sets the default radius of the components.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/visual-style\n */\n radius: { type: 'enum', values: radii, default: 'medium' },\n /**\n * Sets a scaling multiplier for values like spacing, font sizes, line heights, etc. are scaled.\n *\n * @link\n * https://www.radix-ui.com/themes/docs/theme/layout\n */\n scaling: { type: 'enum', values: scalings, default: '100%' },\n /**\n * Sets the font family for the theme.\n *\n * @default 'sans'\n */\n fontFamily: { type: 'enum', values: fontFamilies, default: 'sans' },\n} satisfies {\n hasBackground: PropDef<boolean>;\n appearance: PropDef<(typeof appearances)[number]>;\n accentColor: PropDef<(typeof accentColors)[number]>;\n grayColor: PropDef<(typeof grayColors)[number]>;\n material: PropDef<(typeof materials)[number]>;\n panelBackground: PropDef<(typeof panelBackgrounds)[number]>;\n radius: PropDef<(typeof radii)[number]>;\n scaling: PropDef<(typeof scalings)[number]>;\n fontFamily: PropDef<(typeof fontFamilies)[number]>;\n};\n\ntype ThemeOwnProps = GetPropDefTypes<typeof themePropDefs & typeof asChildPropDef>;\n\nexport { themePropDefs };\nexport type { ThemeOwnProps };\n", "import * as React from 'react';\nimport { Slot } from 'radix-ui';\n\nimport { headingPropDefs } from './heading.props.js';\nimport { extractProps } from '../helpers/extract-props.js';\nimport { marginPropDefs } from '../props/margin.props.js';\n\nimport type { MarginProps } from '../props/margin.props.js';\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\nimport type { GetPropDefTypes } from '../props/prop-def.js';\n\ntype HeadingElement = React.ElementRef<'h1'>;\ntype HeadingOwnProps = GetPropDefTypes<typeof headingPropDefs>;\ninterface CommonHeadingProps extends MarginProps, HeadingOwnProps {}\ntype HeadingH1Props = { as?: 'h1' } & ComponentPropsWithout<'h1', RemovedProps>;\ntype HeadingH2Props = { as: 'h2' } & ComponentPropsWithout<'h2', RemovedProps>;\ntype HeadingH3Props = { as: 'h3' } & ComponentPropsWithout<'h3', RemovedProps>;\ntype HeadingH4Props = { as: 'h4' } & ComponentPropsWithout<'h4', RemovedProps>;\ntype HeadingH5Props = { as: 'h5' } & ComponentPropsWithout<'h5', RemovedProps>;\ntype HeadingH6Props = { as: 'h6' } & ComponentPropsWithout<'h6', RemovedProps>;\ntype HeadingProps = CommonHeadingProps &\n (HeadingH1Props | HeadingH2Props | HeadingH3Props | HeadingH4Props | HeadingH5Props | HeadingH6Props);\n\n// Pre-merge prop definitions at module level to avoid per-render allocation\nconst mergedPropDefs = { ...headingPropDefs, ...marginPropDefs };\n\nconst Heading = React.memo(\n React.forwardRef<HeadingElement, HeadingProps>((props, forwardedRef) => {\n const {\n children,\n className,\n asChild,\n as: Tag = 'h1',\n color,\n ...headingProps\n } = extractProps(props, mergedPropDefs);\n\n const combinedClassName = className ? `rt-Heading ${className}` : 'rt-Heading';\n\n if (asChild) {\n return (\n <Slot.Root\n data-accent-color={color}\n {...headingProps}\n ref={forwardedRef}\n className={combinedClassName}\n >\n {children}\n </Slot.Root>\n );\n }\n\n return (\n <Tag\n data-accent-color={color}\n {...(headingProps as React.HTMLAttributes<HTMLHeadingElement>)}\n ref={forwardedRef as any}\n className={combinedClassName}\n >\n {children}\n </Tag>\n );\n })\n);\nHeading.displayName = 'Heading';\n\nexport { Heading };\nexport type { HeadingProps };\n", "import type { PropDef } from './prop-def.js';\n\nconst highContrastPropDef = {\n highContrast: {\n type: 'boolean',\n className: 'rt-high-contrast',\n default: undefined,\n },\n} satisfies {\n highContrast: PropDef<boolean>;\n};\n\nexport { highContrastPropDef };\n", "import type { PropDef } from './prop-def.js';\n\nconst leadingTrimValues = ['normal', 'start', 'end', 'both'] as const;\n\nconst leadingTrimPropDef = {\n trim: {\n type: 'enum',\n className: 'rt-r-lt',\n values: leadingTrimValues,\n responsive: true,\n },\n} satisfies {\n trim: PropDef<(typeof leadingTrimValues)[number]>;\n};\n\nexport { leadingTrimPropDef };\n", "import type { PropDef } from './prop-def.js';\n\nconst textAlignValues = ['left', 'center', 'right'] as const;\n\nconst textAlignPropDef = {\n align: {\n type: 'enum',\n className: 'rt-r-ta',\n values: textAlignValues,\n responsive: true,\n },\n} satisfies {\n align: PropDef<(typeof textAlignValues)[number]>;\n};\n\nexport { textAlignPropDef };\n", "import type { PropDef } from './prop-def.js';\n\nconst textWrapValues = ['wrap', 'nowrap', 'pretty', 'balance'] as const;\n\nconst textWrapPropDef = {\n wrap: {\n type: 'enum',\n className: 'rt-r-tw',\n values: textWrapValues,\n responsive: true,\n },\n} satisfies {\n wrap: PropDef<(typeof textWrapValues)[number]>;\n};\n\nexport { textWrapPropDef };\n", "import type { PropDef } from './prop-def.js';\n\nconst truncatePropDef = {\n truncate: {\n type: 'boolean',\n className: 'rt-truncate',\n },\n} satisfies {\n truncate: PropDef<boolean>;\n};\n\nexport { truncatePropDef };\n", "import type { PropDef } from './prop-def.js';\n\nconst fontFamilies = ['sans', 'mono', 'serif'] as const;\n\nconst fontFamilyPropDef = {\n font: {\n type: 'enum',\n className: 'rt-r-ff',\n values: fontFamilies,\n },\n} satisfies {\n font: PropDef<(typeof fontFamilies)[number]>;\n};\n\nexport { fontFamilyPropDef };\n", "import type { PropDef } from './prop-def.js';\n\nconst weights = ['thin', 'extralight', 'light', 'regular', 'medium', 'semibold', 'bold', 'extrabold'] as const;\n\nconst weightPropDef = {\n weight: {\n type: 'enum',\n className: 'rt-r-weight',\n values: weights,\n responsive: true,\n },\n} satisfies {\n weight: PropDef<(typeof weights)[number]>;\n};\n\nexport { weightPropDef };\n", "import { asChildPropDef } from '../props/as-child.prop.js';\nimport { colorPropDef } from '../props/color.prop.js';\nimport { highContrastPropDef } from '../props/high-contrast.prop.js';\nimport { leadingTrimPropDef } from '../props/leading-trim.prop.js';\nimport { textAlignPropDef } from '../props/text-align.prop.js';\nimport { textWrapPropDef } from '../props/text-wrap.prop.js';\nimport { truncatePropDef } from '../props/truncate.prop.js';\nimport { fontFamilyPropDef } from '../props/font-family.prop.js';\nimport { weightPropDef } from '../props/weight.prop.js';\n\nimport type { PropDef } from '../props/prop-def.js';\n\nconst as = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const;\nconst sizes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'] as const;\n\nconst headingPropDefs = {\n as: { type: 'enum', values: as, default: 'h1' },\n ...asChildPropDef,\n size: {\n type: 'enum',\n className: 'rt-r-size',\n values: sizes,\n default: '6',\n responsive: true,\n },\n ...fontFamilyPropDef,\n ...weightPropDef,\n ...textAlignPropDef,\n ...leadingTrimPropDef,\n ...truncatePropDef,\n ...textWrapPropDef,\n ...colorPropDef,\n ...highContrastPropDef,\n} satisfies {\n as: PropDef<(typeof as)[number]>;\n size: PropDef<(typeof sizes)[number]>;\n};\n\nexport { headingPropDefs };\n", "import classNames from 'classnames';\n\nimport { getCompiledPropDefs } from './compile-prop-defs.js';\nimport { getResponsiveClassNames, getResponsiveStyles } from './get-responsive-styles.js';\nimport { isResponsiveObject } from './is-responsive-object.js';\nimport { mergeStyles } from './merge-styles.js';\n\nimport type { CompiledPropDef } from './compile-prop-defs.js';\nimport type * as React from 'react';\nimport type { PropDef } from '../props/prop-def.js';\n\ntype PropDefsWithClassName<T> = T extends Record<string, PropDef> ? { [K in keyof T]: T[K] extends { className: string } ? K : never }[keyof T] : never;\n\ntype ResponsiveValue = Record<string, string | undefined>;\n\n/**\n * Fills in the `initial` breakpoint of a responsive value from the prop def's\n * default, and coerces an invalid `initial` enum value back to that default.\n *\n * Returns the value untouched when nothing needs changing, and a copy otherwise\n * \u2014 callers routinely hoist responsive objects to module scope, so mutating the\n * caller's object would corrupt it for every later render.\n */\nfunction normalizeResponsiveValue(value: ResponsiveValue, propDef: CompiledPropDef) {\n let initial = value.initial;\n let changed = false;\n\n if (propDef.hasDefault && initial === undefined) {\n initial = propDef.default as string | undefined;\n changed = true;\n }\n\n if (propDef.enumValueSet !== undefined && !propDef.enumValueSet.has(initial)) {\n initial = propDef.default as string | undefined;\n changed = true;\n }\n\n return changed ? { ...value, initial } : value;\n}\n\n/**\n * Takes props, checks them against prop defs that have a `className` on them,\n * adds necessary CSS classes and inline styles, and returns the props without\n * the corresponding prop defs that were used to formulate the new `className`\n * and `style` values. Also applies prop def defaults to every prop.\n */\nfunction extractProps<P extends { className?: string; style?: React.CSSProperties; [key: string]: any }, T extends Record<string, PropDef>[]>(\n props: P,\n ...propDefs: T\n): Omit<P & { className?: string; style?: React.CSSProperties }, PropDefsWithClassName<T[number]>> {\n const { styling, passthrough, stylingKeys } = getCompiledPropDefs(propDefs);\n\n // Copy the props that survive to the element rather than spreading and then\n // deleting the styling keys. Deleting off a spread demotes the object to\n // dictionary mode in V8, and this object is on the render path of every\n // component in the library.\n const extractedProps: Record<string, any> = {};\n for (const key in props) {\n if (stylingKeys.has(key)) continue;\n extractedProps[key] = props[key];\n }\n\n for (let i = 0; i < passthrough.length; i++) {\n const propDef = passthrough[i];\n const value = extractedProps[propDef.key];\n\n if (value === undefined) {\n if (propDef.hasDefault) extractedProps[propDef.key] = propDef.default;\n continue;\n }\n\n // Fall back to the default when the value is not a valid enum value\n if (propDef.enumValueSet !== undefined && !propDef.enumValueSet.has(value) && !isResponsiveObject(value)) {\n extractedProps[propDef.key] = propDef.default;\n }\n }\n\n let style: ReturnType<typeof mergeStyles>;\n const classes: string[] = [];\n\n for (let i = 0; i < styling.length; i++) {\n const propDef = styling[i];\n let value = props[propDef.key];\n\n // Apply prop def defaults\n if (value === undefined && propDef.hasDefault) {\n value = propDef.default;\n }\n\n // Apply the default value if the value is not a valid enum value\n if (propDef.enumValueSet !== undefined && !propDef.enumValueSet.has(value) && !isResponsiveObject(value)) {\n value = propDef.default;\n }\n\n if (!value) continue;\n\n if (isResponsiveObject(value)) {\n // Make sure we are not threading through responsive values for non-responsive prop defs\n if (!propDef.responsive) continue;\n value = normalizeResponsiveValue(value, propDef);\n }\n\n if (propDef.type === 'enum') {\n const propClassName = getResponsiveClassNames({\n allowArbitraryValues: false,\n value,\n className: propDef.className!,\n propValues: propDef.values,\n propValueSet: propDef.valueSet,\n parseValue: propDef.parseValue,\n });\n\n if (propClassName) classes.push(propClassName);\n continue;\n }\n\n if (propDef.type === 'string' || propDef.type === 'enum | string') {\n const [propClassNames, propCustomProperties] = getResponsiveStyles({\n className: propDef.className!,\n customProperties: propDef.customProperties!,\n // `string` prop defs have no enum values, so every value is arbitrary\n propValues: propDef.type === 'string' ? [] : propDef.values,\n propValueSet: propDef.type === 'string' ? undefined : propDef.valueSet,\n parseValue: propDef.parseValue,\n value,\n });\n\n if (propCustomProperties) style = mergeStyles(style, propCustomProperties);\n if (propClassNames) classes.push(propClassNames);\n continue;\n }\n\n if (propDef.type === 'boolean') {\n // TODO handle responsive boolean props\n classes.push(propDef.className!);\n continue;\n }\n }\n\n extractedProps.className = classNames(classes.length > 0 ? classes.join(' ') : undefined, props.className);\n extractedProps.style = mergeStyles(style, props.style);\n return extractedProps as ReturnType<typeof extractProps<P, T>>;\n}\n\nexport { extractProps };\n", "import type { PropDef } from '../props/prop-def.js';\n\n/**\n * A prop def pre-processed into the exact shape `extractProps` needs at render\n * time. Everything that can be derived from the static prop def \u2014 enum\n * membership sets, whether the def is responsive, whether it carries a default\n * \u2014 is computed once here instead of on every render.\n */\ninterface CompiledPropDef {\n key: string;\n type: PropDef['type'];\n default: unknown;\n hasDefault: boolean;\n responsive: boolean;\n className?: string;\n customProperties?: `--${string}`[];\n parseValue?: (value: string) => string | undefined;\n /** The prop def's own enum values, kept for the responsive class name helpers. */\n values: readonly string[];\n /** O(1) membership for `values`. */\n valueSet: ReadonlySet<string>;\n /**\n * `values` plus the default, used to coerce invalid enum values back to the\n * default. Only present for `type: 'enum'` \u2014 `'enum | string'` props accept\n * arbitrary strings and must not be coerced.\n */\n enumValueSet?: ReadonlySet<unknown>;\n}\n\ninterface CompiledPropDefs {\n /** Defs that contribute a class name and/or custom properties. */\n styling: CompiledPropDef[];\n /**\n * Defs that pass through to the element but still need a default applied or\n * an invalid enum value coerced. Defs that can do neither are omitted\n * entirely \u2014 they are already correct as passed.\n */\n passthrough: CompiledPropDef[];\n /** Keys consumed by `styling`, so they can be skipped when copying props. */\n stylingKeys: ReadonlySet<string>;\n}\n\nconst EMPTY_VALUES: readonly string[] = [];\nconst EMPTY_SET: ReadonlySet<string> = new Set();\n\nfunction compile(propDefs: readonly Record<string, PropDef>[]): CompiledPropDefs {\n const merged: Record<string, PropDef> = Object.assign({}, ...propDefs);\n const styling: CompiledPropDef[] = [];\n const passthrough: CompiledPropDef[] = [];\n const stylingKeys = new Set<string>();\n\n for (const key in merged) {\n // The PropDef union is narrowed per-field below; reading the optional\n // members off the union directly is what the runtime actually needs.\n const def = merged[key] as PropDef & {\n default?: unknown;\n values?: readonly string[];\n className?: string;\n customProperties?: `--${string}`[];\n parseValue?: (value: string) => string | undefined;\n responsive?: true;\n };\n\n const values = def.values ?? EMPTY_VALUES;\n const compiled: CompiledPropDef = {\n key,\n type: def.type,\n default: def.default,\n hasDefault: def.default !== undefined,\n responsive: 'responsive' in def,\n className: def.className,\n customProperties: def.customProperties,\n parseValue: def.parseValue,\n values,\n valueSet: values.length > 0 ? new Set(values) : EMPTY_SET,\n enumValueSet: def.type === 'enum' ? new Set<unknown>([def.default, ...values]) : undefined,\n };\n\n if (def.className) {\n styling.push(compiled);\n stylingKeys.add(key);\n } else if (compiled.hasDefault || def.type === 'enum') {\n // Anything else is copied through untouched, so there is nothing to do.\n passthrough.push(compiled);\n }\n }\n\n return { styling, passthrough, stylingKeys };\n}\n\ninterface CacheNode {\n children: WeakMap<object, CacheNode>;\n compiled?: CompiledPropDefs;\n}\n\nconst cacheRoot: CacheNode = { children: new WeakMap() };\n\n/**\n * Compiles a set of prop defs, memoized on the identity of the prop def objects\n * themselves. Components always pass the same module-level constants, so after\n * the first render of a given component this is a couple of WeakMap lookups\n * instead of merging 50-odd prop defs into a fresh object.\n */\nfunction getCompiledPropDefs(propDefs: readonly Record<string, PropDef>[]): CompiledPropDefs {\n let node = cacheRoot;\n\n for (let i = 0; i < propDefs.length; i++) {\n const propDef = propDefs[i];\n let child = node.children.get(propDef);\n if (child === undefined) {\n child = { children: new WeakMap() };\n node.children.set(propDef, child);\n }\n node = child;\n }\n\n return (node.compiled ??= compile(propDefs));\n}\n\nexport { getCompiledPropDefs };\nexport type { CompiledPropDef, CompiledPropDefs };\n", "import type React from 'react';\n\n// Creates a union type of string literals with strings, but retains intellisense for the literals.\n// Union<string, 'foo' | 'bar'> => string | Omit<string, 'foo' | 'bar'>\ntype Union<S = string, T extends string | number = string> = T | Omit<S, T>;\n\nconst breakpoints = ['initial', 'xs', 'sm', 'md', 'lg', 'xl'] as const;\nconst breakpointSet: Set<string> = new Set(breakpoints);\ntype Breakpoint = (typeof breakpoints)[number];\ntype Responsive<T> = T | Partial<Record<Breakpoint, T>>;\n\ntype BooleanPropDef = {\n type: 'boolean';\n default?: boolean;\n required?: boolean;\n className?: string;\n};\ntype StringPropDef = {\n type: 'string';\n default?: string;\n required?: boolean;\n};\ntype ReactNodePropDef = {\n type: 'ReactNode';\n default?: React.ReactNode;\n required?: boolean;\n};\ntype EnumPropDef<T> = {\n type: 'enum';\n values: readonly T[];\n default?: T;\n required?: boolean;\n};\ntype EnumOrStringPropDef<T> = {\n type: 'enum | string';\n values: readonly T[];\n default?: T | string;\n required?: boolean;\n};\n\ntype NonStylingPropDef = {\n className?: never;\n customProperties?: never;\n parseValue?: never;\n};\n\ntype StylingPropDef = {\n className: string;\n parseValue?: (value: string) => string | undefined;\n};\n\ntype ArbitraryStylingPropDef = {\n className: string;\n customProperties: `--${string}`[];\n parseValue?: (value: string) => string | undefined;\n};\n\ntype RegularPropDef<T> =\n | ReactNodePropDef\n | BooleanPropDef\n | (StringPropDef & ArbitraryStylingPropDef)\n | (StringPropDef & NonStylingPropDef)\n | (EnumPropDef<T> & StylingPropDef)\n | (EnumPropDef<T> & NonStylingPropDef)\n | (EnumOrStringPropDef<T> & ArbitraryStylingPropDef)\n | (EnumOrStringPropDef<T> & NonStylingPropDef);\ntype ResponsivePropDef<T = any> = RegularPropDef<T> & { responsive: true };\ntype PropDef<T = any> = RegularPropDef<T> | ResponsivePropDef<T>;\n\n// prettier-ignore\ntype GetPropDefType<Def> =\n Def extends BooleanPropDef ? (Def extends ResponsivePropDef ? Responsive<boolean> : boolean)\n : Def extends StringPropDef ? (Def extends ResponsivePropDef ? Responsive<string> : string)\n : Def extends ReactNodePropDef ? (Def extends ResponsivePropDef ? Responsive<React.ReactNode> : React.ReactNode)\n : Def extends EnumOrStringPropDef<infer Type> ?\n Def extends ResponsivePropDef<infer Type extends string> ? Responsive<Union<string, Type>> : Type\n : Def extends EnumPropDef<infer Type> ? (Def extends ResponsivePropDef<infer Type> ? Responsive<Type> : Type)\n : never;\n\ntype GetPropDefTypes<P> = {\n [K in keyof P]?: GetPropDefType<P[K]>;\n};\n\nexport { breakpoints, breakpointSet };\nexport type {\n PropDef,\n GetPropDefTypes,\n ResponsivePropDef,\n //\n Breakpoint,\n Responsive,\n Union,\n};\n", "/** A util to check whether the object has a key, while inferring the correct key type */\nfunction hasOwnProperty<K extends string | number | symbol>(\n obj: Record<K, unknown>,\n key: string | number | symbol\n): key is K {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport { hasOwnProperty };\n", "import type { Responsive, Breakpoint } from '../props/prop-def.js';\n\n// Use a Set for O(1) lookup instead of array.includes() which is O(n)\nconst breakpointSet = new Set<string>(['initial', 'xs', 'sm', 'md', 'lg', 'xl']);\n\nexport function isResponsiveObject<Value extends string>(\n obj: Responsive<Value | Omit<string, Value>> | undefined\n): obj is Record<Breakpoint, string> {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n // Use for...in to avoid Object.keys() array allocation\n for (const key in obj) {\n if (breakpointSet.has(key)) {\n return true;\n }\n }\n return false;\n}\n", "import { breakpointSet } from '../props/prop-def.js';\nimport { hasOwnProperty } from './has-own-property.js';\nimport { isResponsiveObject } from './is-responsive-object.js';\n\nimport type { Responsive, Union } from '../props/prop-def.js';\n\n/**\n * Membership test against a prop def's enum values. Callers that already hold a\n * compiled prop def pass `propValueSet` for an O(1) lookup; the handful of call\n * sites that build options inline fall back to scanning the array.\n */\nfunction includesValue(propValues: string[] | readonly string[], propValueSet: ReadonlySet<string> | undefined, value: string): boolean {\n return propValueSet !== undefined ? propValueSet.has(value) : propValues.includes(value);\n}\n\ninterface GetResponsiveStylesOptions {\n className: string;\n customProperties: `--${string}`[];\n value: Responsive<Union> | Responsive<string> | undefined;\n propValues: string[] | readonly string[];\n propValueSet?: ReadonlySet<string>;\n parseValue?: (value: string) => string | undefined;\n}\n\nfunction getResponsiveStyles({ className, customProperties, ...args }: GetResponsiveStylesOptions) {\n const responsiveClassNames = getResponsiveClassNames({\n allowArbitraryValues: true,\n className,\n ...args,\n });\n\n const responsiveCustomProperties = getResponsiveCustomProperties({ customProperties, ...args });\n return [responsiveClassNames, responsiveCustomProperties] as const;\n}\n\ninterface GetResponsiveClassNamesOptions {\n allowArbitraryValues?: boolean;\n className: string;\n value: Responsive<Union> | Responsive<string> | undefined;\n propValues: string[] | readonly string[];\n propValueSet?: ReadonlySet<string>;\n parseValue?: (value: string) => string | undefined;\n}\n\nfunction getResponsiveClassNames({ allowArbitraryValues, value, className, propValues, propValueSet, parseValue = (value) => value }: GetResponsiveClassNamesOptions): string | undefined {\n if (!value) {\n return undefined;\n }\n\n if (typeof value === 'string') {\n if (includesValue(propValues, propValueSet, value)) {\n return getBaseClassName(className, value, parseValue);\n }\n return allowArbitraryValues ? className : undefined;\n }\n\n if (isResponsiveObject(value)) {\n const object = value;\n const classNames: string[] = [];\n\n for (const bp in object) {\n // Make sure we are not iterating over keys that aren't breakpoints\n if (!hasOwnProperty(object, bp) || !breakpointSet.has(bp)) {\n continue;\n }\n\n const value = object[bp];\n\n if (value !== undefined) {\n if (includesValue(propValues, propValueSet, value)) {\n const baseClassName = getBaseClassName(className, value, parseValue);\n const bpClassName = bp === 'initial' ? baseClassName : `${bp}:${baseClassName}`;\n classNames.push(bpClassName);\n } else if (allowArbitraryValues) {\n const bpClassName = bp === 'initial' ? className : `${bp}:${className}`;\n classNames.push(bpClassName);\n }\n }\n }\n\n return classNames.length > 0 ? classNames.join(' ') : '';\n }\n\n if (allowArbitraryValues) {\n return className;\n }\n}\n\nfunction getBaseClassName(className: string, value: string, parseValue: (value: string) => string | undefined): string {\n const delimiter = className ? '-' : '';\n const matchedValue = parseValue(value);\n const isNegative = matchedValue?.startsWith('-');\n const minus = isNegative ? '-' : '';\n const absoluteValue = isNegative ? matchedValue?.substring(1) : matchedValue;\n return `${minus}${className}${delimiter}${absoluteValue}`;\n}\n\ninterface GetResponsiveCustomPropertiesOptions {\n customProperties: `--${string}`[];\n value: Responsive<Union> | Responsive<string> | undefined;\n propValues: string[] | readonly string[];\n propValueSet?: ReadonlySet<string>;\n parseValue?: (value: string) => string | undefined;\n}\n\nfunction getResponsiveCustomProperties({ customProperties, value, propValues, propValueSet, parseValue = (value) => value }: GetResponsiveCustomPropertiesOptions) {\n // Don't generate custom properties if the value is not arbitrary\n if (!value || (typeof value === 'string' && includesValue(propValues, propValueSet, value))) {\n return undefined;\n }\n\n let styles: Record<string, string | undefined> | undefined;\n\n if (typeof value === 'string') {\n const parsed = parseValue(value);\n styles = {};\n for (const customProperty of customProperties) {\n styles[customProperty] = parsed;\n }\n return styles;\n }\n\n if (isResponsiveObject(value)) {\n const object = value;\n\n for (const bp in object) {\n // Make sure we are not iterating over keys that aren't breakpoints\n if (!hasOwnProperty(object, bp) || !breakpointSet.has(bp)) {\n continue;\n }\n\n const value = object[bp];\n\n // Don't generate a custom property if the value is not arbitrary\n if (value === undefined || includesValue(propValues, propValueSet, value)) {\n continue;\n }\n\n const parsed = parseValue(value);\n styles ??= {};\n for (const customProperty of customProperties) {\n const bpProperty = bp === 'initial' ? customProperty : `${customProperty}-${bp}`;\n styles[bpProperty] = parsed;\n }\n }\n }\n\n return styles ?? {};\n}\n\nexport { getResponsiveStyles, getResponsiveCustomProperties, getResponsiveClassNames };\n", "type InlineStyle =\n | React.CSSProperties\n | Record<string, string | number | null | undefined>\n | undefined;\n\n// Merges CSS styles like `classNames` merges CSS classes\n// Optimized to avoid object spread in loop - uses Object.assign for in-place mutation\nexport function mergeStyles(...styles: Array<InlineStyle>): InlineStyle {\n let result: Record<string, string | number | null | undefined> | undefined;\n\n for (const style of styles) {\n if (style) {\n if (result === undefined) {\n // First non-empty style - create result object\n result = {};\n }\n Object.assign(result, style);\n }\n }\n\n return result;\n}\n", "import type { PropDef, GetPropDefTypes } from './prop-def.js';\n\n// prettier-ignore\nconst marginValues = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '-1', '-2', '-3', '-4', '-5', '-6', '-7', '-8', '-9', '-10', '-11', '-12'] as const;\n\nconst marginPropDefs = {\n /**\n * Sets the CSS **margin** property.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * m=\"4\"\n * m=\"100px\"\n * m={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin\n */\n m: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-m',\n customProperties: ['--m'],\n },\n /**\n * Sets the CSS **margin-left** and **margin-right** properties.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * mx=\"4\"\n * mx=\"100px\"\n * mx={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-left\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-right\n */\n mx: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-mx',\n customProperties: ['--ml', '--mr'],\n },\n /**\n * Sets the CSS **margin-top** and **margin-bottom** properties.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * my=\"4\"\n * my=\"100px\"\n * my={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-top\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-bottom\n */\n my: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-my',\n customProperties: ['--mt', '--mb'],\n },\n /**\n * Sets the CSS **margin-top** property.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * mt=\"4\"\n * mt=\"100px\"\n * mt={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-top\n */\n mt: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-mt',\n customProperties: ['--mt'],\n },\n /**\n * Sets the CSS **margin-right** property.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * mr=\"4\"\n * mr=\"100px\"\n * mr={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-right\n */\n mr: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-mr',\n customProperties: ['--mr'],\n },\n /**\n * Sets the CSS **margin-bottom** property.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * mb=\"4\"\n * mb=\"100px\"\n * mb={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-bottom\n */\n mb: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-mb',\n customProperties: ['--mb'],\n },\n /**\n * Sets the CSS **margin-left** property.\n * Supports space scale values, CSS strings, and responsive objects.\n *\n * @example\n * ml=\"4\"\n * ml=\"100px\"\n * ml={{ sm: '6', lg: '9' }}\n *\n * @link\n * https://developer.mozilla.org/en-US/docs/Web/CSS/margin-left\n */\n ml: {\n type: 'enum | string',\n values: marginValues,\n responsive: true,\n className: 'rt-r-ml',\n customProperties: ['--ml'],\n },\n} satisfies {\n m: PropDef<(typeof marginValues)[number]>;\n mx: PropDef<(typeof marginValues)[number]>;\n my: PropDef<(typeof marginValues)[number]>;\n mt: PropDef<(typeof marginValues)[number]>;\n mr: PropDef<(typeof marginValues)[number]>;\n mb: PropDef<(typeof marginValues)[number]>;\n ml: PropDef<(typeof marginValues)[number]>;\n};\n\ntype MarginProps = GetPropDefTypes<typeof marginPropDefs>;\n\nexport { marginPropDefs };\nexport type { MarginProps };\n", "import * as React from 'react';\nimport { Slot } from 'radix-ui';\n\nimport { extractProps } from '../helpers/extract-props.js';\nimport { marginPropDefs } from '../props/margin.props.js';\nimport { textPropDefs } from './text.props.js';\n\nimport type { MarginProps } from '../props/margin.props.js';\nimport type { GetPropDefTypes } from '../props/prop-def.js';\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\n\ntype TextElement = React.ElementRef<'span'>;\ntype TextOwnProps = GetPropDefTypes<typeof textPropDefs>;\ninterface CommonTextProps extends MarginProps, TextOwnProps {}\ntype TextSpanProps = { as?: 'span' } & ComponentPropsWithout<'span', RemovedProps>;\ntype TextDivProps = { as: 'div' } & ComponentPropsWithout<'div', RemovedProps>;\ntype TextLabelProps = { as: 'label' } & ComponentPropsWithout<'label', RemovedProps>;\ntype TextPProps = { as: 'p' } & ComponentPropsWithout<'p', RemovedProps>;\ntype TextProps = CommonTextProps & (TextSpanProps | TextDivProps | TextLabelProps | TextPProps);\n\n// Pre-merge prop definitions at module level to avoid per-render allocation\nconst mergedPropDefs = { ...textPropDefs, ...marginPropDefs };\n\nconst Text = React.memo(\n React.forwardRef<TextElement, TextProps>((props, forwardedRef) => {\n const {\n children,\n className,\n asChild,\n as: Tag = 'span',\n color,\n ...textProps\n } = extractProps(props, mergedPropDefs);\n\n const combinedClassName = className ? `rt-Text ${className}` : 'rt-Text';\n\n if (asChild) {\n return (\n <Slot.Root\n data-accent-color={color}\n {...textProps}\n ref={forwardedRef}\n className={combinedClassName}\n >\n {children}\n </Slot.Root>\n );\n }\n\n return (\n <Tag\n data-accent-color={color}\n {...(textProps as React.HTMLAttributes<HTMLElement>)}\n ref={forwardedRef as any}\n className={combinedClassName}\n >\n {children}\n </Tag>\n );\n })\n);\nText.displayName = 'Text';\n\nexport { Text };\nexport type { TextProps };\n", "import { asChildPropDef } from '../props/as-child.prop.js';\nimport { colorPropDef } from '../props/color.prop.js';\nimport { highContrastPropDef } from '../props/high-contrast.prop.js';\nimport { leadingTrimPropDef } from '../props/leading-trim.prop.js';\nimport { textAlignPropDef } from '../props/text-align.prop.js';\nimport { textWrapPropDef } from '../props/text-wrap.prop.js';\nimport { truncatePropDef } from '../props/truncate.prop.js';\nimport { fontFamilyPropDef } from '../props/font-family.prop.js';\nimport { weightPropDef } from '../props/weight.prop.js';\n\nimport type { PropDef } from '../props/prop-def.js';\n\nconst as = ['span', 'div', 'label', 'p'] as const;\nconst sizes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'] as const;\n\nconst textPropDefs = {\n as: { type: 'enum', values: as, default: 'span' },\n ...asChildPropDef,\n size: {\n type: 'enum',\n className: 'rt-r-size',\n values: sizes,\n responsive: true,\n },\n ...fontFamilyPropDef,\n ...weightPropDef,\n ...textAlignPropDef,\n ...leadingTrimPropDef,\n ...truncatePropDef,\n ...textWrapPropDef,\n ...colorPropDef,\n ...highContrastPropDef,\n} satisfies {\n as: PropDef<(typeof as)[number]>;\n size: PropDef<(typeof sizes)[number]>;\n};\n\nexport { textPropDefs };\n", "import * as React from 'react';\n\n/** A function that throws an error when a value isn't a valid React Element, otherwise returns the value */\nexport const requireReactElement = <T extends React.ReactNode>(children: T): T => {\n const isReactElement = React.isValidElement(children);\n\n if (!isReactElement) {\n throw Error(\n `Expected a single React Element child, but got: ${React.Children.toArray(children)\n .map((child) =>\n typeof child === 'object' && 'type' in child && typeof child.type === 'string'\n ? child.type\n : typeof child\n )\n .join(', ')}`\n );\n }\n\n return children;\n};\n", "import * as React from 'react';\n\nlet cleanupInstalled = false;\n\n/**\n * Hook to cleanup stuck pointer-events: none on document.body\n *\n * This addresses an issue where react-remove-scroll (used by Radix UI Dialog)\n * sometimes fails to restore body pointer-events after dialog closes,\n * leaving the page unclickable.\n */\nexport function useBodyPointerEventsCleanup() {\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n if (cleanupInstalled) return;\n\n cleanupInstalled = true;\n\n // Deferred cleanups are tracked so unmount can cancel the ones still\n // queued. A timer that outlives the document reaches for `document.body`\n // after it is gone; under jsdom that surfaces as an unhandled\n // ReferenceError attributed to whichever test happened to be running.\n const pending = new Set<ReturnType<typeof setTimeout>>();\n\n const defer = (fn: () => void, delay: number) => {\n const id = setTimeout(() => {\n pending.delete(id);\n fn();\n }, delay);\n pending.add(id);\n };\n\n const hasOpenModal = (): boolean => {\n // Check for open dialogs/alertdialogs\n const hasDialogs = Boolean(\n document.querySelector(\n '[role=\"dialog\"][aria-modal=\"true\"], [role=\"alertdialog\"][aria-modal=\"true\"]',\n ),\n );\n\n // Also check for any Radix overlays that are still mounted\n const hasRadixOverlays = Boolean(\n document.querySelector('[data-radix-popper-content-wrapper], [data-state=\"open\"]'),\n );\n\n return hasDialogs || hasRadixOverlays;\n };\n\n const forceCleanup = () => {\n // Aggressive cleanup - remove pointer-events regardless\n if (document.body.style.pointerEvents === 'none') {\n console.log('[KookieUI] Force cleaning stuck pointer-events: none from body');\n document.body.style.pointerEvents = '';\n\n // Also remove any scroll-lock related attributes\n document.body.removeAttribute('data-scroll-locked');\n document.body.removeAttribute('data-remove-scroll');\n\n // Remove any classes that might be causing issues\n document.body.classList.remove('ReactModal__Body--open');\n }\n };\n\n const safeCleanup = () => {\n if (document.body.style.pointerEvents === 'none' && !hasOpenModal()) {\n console.log('[KookieUI] Safe cleaning stuck pointer-events: none from body');\n document.body.style.pointerEvents = '';\n }\n };\n\n // Force cleanup on any click outside modal content\n const onDocumentClick = (event: Event) => {\n const target = event.target as Element;\n if (\n target &&\n !target.closest(\n '[role=\"dialog\"], [role=\"alertdialog\"], [data-radix-popper-content-wrapper]',\n )\n ) {\n // Clicked outside any modal - force cleanup after a short delay\n defer(forceCleanup, 100);\n }\n };\n\n // Force cleanup on ESC key\n const onEscapeKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n defer(forceCleanup, 200);\n }\n };\n\n // Safe cleanup on other interactions\n const onInteraction = () => {\n defer(safeCleanup, 50);\n };\n\n // Install global listeners\n document.addEventListener('click', onDocumentClick, true);\n document.addEventListener('keydown', onEscapeKey, true);\n document.addEventListener('pointerup', onInteraction, true);\n document.addEventListener('transitionend', onInteraction, true);\n document.addEventListener('animationend', onInteraction, true);\n\n // Watch for DOM changes that might indicate overlay removal\n const observer = new MutationObserver(() => {\n defer(safeCleanup, 0);\n });\n observer.observe(document.body, { childList: true, subtree: true, attributes: true });\n\n // Fallback periodic cleanup\n const intervalId = setInterval(() => {\n if (document.body.style.pointerEvents === 'none' && !hasOpenModal()) {\n console.log('[KookieUI] Periodic cleanup of stuck pointer-events');\n document.body.style.pointerEvents = '';\n }\n }, 1000);\n\n // Initial cleanup\n defer(safeCleanup, 100);\n\n // Tear everything down together. The observer is the important one: it\n // fires while React unmounts the tree, so leaving it connected keeps\n // queueing work against a document that is about to go away. Releasing the\n // latch lets a later mount reinstall.\n return () => {\n clearInterval(intervalId);\n\n pending.forEach(clearTimeout);\n pending.clear();\n\n observer.disconnect();\n\n document.removeEventListener('click', onDocumentClick, true);\n document.removeEventListener('keydown', onEscapeKey, true);\n document.removeEventListener('pointerup', onInteraction, true);\n document.removeEventListener('transitionend', onInteraction, true);\n document.removeEventListener('animationend', onInteraction, true);\n\n cleanupInstalled = false;\n };\n }, []);\n}\n", "import { VisuallyHidden as VisuallyHiddenPrimitive } from 'radix-ui';\nexport const VisuallyHidden = VisuallyHiddenPrimitive.Root;\nexport const Root = VisuallyHiddenPrimitive.Root;\nexport type VisuallyHiddenProps = VisuallyHiddenPrimitive.VisuallyHiddenProps;\n", "import * as React from 'react';\nimport type { Breakpoint, PresentationValue, ResponsivePresentation } from './shell.types.js';\nimport { _BREAKPOINTS } from './shell.types.js';\nimport { useShell } from './shell.context.js';\n\nfunction useResponsivePresentation(presentation: ResponsivePresentation): PresentationValue {\n const { currentBreakpoint } = useShell();\n\n return React.useMemo(() => {\n if (typeof presentation === 'string') {\n return presentation;\n }\n\n if (presentation[currentBreakpoint]) {\n return presentation[currentBreakpoint]!;\n }\n\n const bpKeys = Object.keys(_BREAKPOINTS) as Array<keyof typeof _BREAKPOINTS>;\n const order: Breakpoint[] = ([...bpKeys].reverse() as Breakpoint[]).concat('initial' as Breakpoint);\n const startIdx = order.indexOf(currentBreakpoint as Breakpoint);\n\n for (let i = startIdx + 1; i < order.length; i++) {\n const bp = order[i];\n if (presentation[bp]) {\n return presentation[bp]!;\n }\n }\n\n return 'fixed';\n }, [presentation, currentBreakpoint]);\n}\n\n/**\n * Resolve a responsive value (T or responsive map keyed by breakpoints) against the current Shell breakpoint.\n * If no value is defined for the current breakpoint, search smaller breakpoints down to 'initial'.\n * Returns undefined when passed a responsive map with no matching key across the chain.\n */\nfunction useResponsiveValue<T>(value: T | Partial<Record<Breakpoint, T>> | undefined): T | undefined {\n const { currentBreakpoint } = useShell();\n\n return React.useMemo(() => {\n if (value == null) return undefined;\n // Primitive value\n if (typeof value !== 'object') {\n return value as T;\n }\n\n const map = value as Partial<Record<Breakpoint, T>>;\n if (map[currentBreakpoint as Breakpoint] !== undefined) {\n return map[currentBreakpoint as Breakpoint] as T;\n }\n\n const bpKeys = Object.keys(_BREAKPOINTS) as Array<keyof typeof _BREAKPOINTS>;\n const order: Breakpoint[] = ([...bpKeys].reverse() as Breakpoint[]).concat('initial' as Breakpoint);\n const startIdx = order.indexOf(currentBreakpoint as Breakpoint);\n\n for (let i = startIdx + 1; i < order.length; i++) {\n const bp = order[i];\n if (map[bp] !== undefined) {\n return map[bp] as T;\n }\n }\n\n return undefined;\n }, [value, currentBreakpoint]);\n}\n\ntype ResponsiveStateValue<T> = T | Partial<Record<Breakpoint, T>>;\n\ninterface UseResponsiveInitialStateOptions<T> {\n controlledValue?: ResponsiveStateValue<T>;\n defaultValue?: ResponsiveStateValue<T>;\n currentValue: T;\n setValue: (value: T) => void;\n breakpointReady: boolean;\n onInit?: (value: T) => void;\n onResponsiveChange?: (value: T) => void;\n controlledIsResponsive?: boolean;\n}\n\ninterface UseResponsiveInitialStateResult<T> {\n resolvedControlled?: T;\n resolvedDefault?: T;\n}\n\nfunction useResponsiveInitialState<T>({\n controlledValue,\n defaultValue,\n currentValue,\n setValue,\n breakpointReady,\n onInit,\n onResponsiveChange,\n controlledIsResponsive = false,\n}: UseResponsiveInitialStateOptions<T>): UseResponsiveInitialStateResult<T> {\n const resolvedControlled = useResponsiveValue(controlledValue);\n const resolvedDefault = useResponsiveValue(defaultValue);\n\n const lastControlledRef = React.useRef<T | undefined>(undefined);\n const pendingSyncRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestControlledRef = React.useRef<T | undefined>(resolvedControlled);\n const latestValueRef = React.useRef(currentValue);\n const setValueRef = React.useRef(setValue);\n\n React.useLayoutEffect(() => {\n latestControlledRef.current = resolvedControlled;\n latestValueRef.current = currentValue;\n setValueRef.current = setValue;\n });\n\n React.useEffect(() => {\n if (resolvedControlled === undefined) return;\n\n const prevControlled = lastControlledRef.current;\n const controlledChanged = prevControlled !== resolvedControlled;\n lastControlledRef.current = resolvedControlled;\n\n if (currentValue === resolvedControlled) {\n if (pendingSyncRef.current) {\n clearTimeout(pendingSyncRef.current);\n pendingSyncRef.current = null;\n }\n if (controlledIsResponsive) {\n onResponsiveChange?.(resolvedControlled);\n }\n return;\n }\n\n if (controlledChanged) {\n if (pendingSyncRef.current) {\n clearTimeout(pendingSyncRef.current);\n pendingSyncRef.current = null;\n }\n setValue(resolvedControlled);\n if (controlledIsResponsive) {\n onResponsiveChange?.(resolvedControlled);\n }\n return;\n }\n\n if (!pendingSyncRef.current) {\n pendingSyncRef.current = setTimeout(() => {\n pendingSyncRef.current = null;\n const latestControlled = latestControlledRef.current;\n const latestValue = latestValueRef.current;\n if (latestControlled === undefined) return;\n if (latestValue === latestControlled) return;\n setValueRef.current(latestControlled);\n }, 0);\n }\n }, [resolvedControlled, currentValue, setValue, onResponsiveChange, controlledIsResponsive]);\n\n React.useEffect(() => {\n return () => {\n if (pendingSyncRef.current) {\n clearTimeout(pendingSyncRef.current);\n pendingSyncRef.current = null;\n }\n };\n }, []);\n\n const didInitRef = React.useRef(false);\n React.useEffect(() => {\n if (didInitRef.current) return;\n if (!breakpointReady) return;\n if (typeof controlledValue !== 'undefined') return;\n if (resolvedDefault === undefined) return;\n didInitRef.current = true;\n if (currentValue !== resolvedDefault) {\n setValue(resolvedDefault);\n }\n onInit?.(resolvedDefault);\n }, [breakpointReady, controlledValue, resolvedDefault, currentValue, setValue, onInit]);\n\n return { resolvedControlled, resolvedDefault };\n}\n\nexport { useResponsivePresentation, useResponsiveValue, useResponsiveInitialState };\n", "import type * as React from 'react';\n\nexport type PresentationValue = 'fixed' | 'overlay' | 'stacked';\n\nexport type ResponsivePresentation = PresentationValue | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', PresentationValue>>;\n\nexport type PaneMode = 'expanded' | 'collapsed';\nexport type SidebarMode = 'collapsed' | 'thin' | 'expanded';\n\nexport type ResponsiveMode = PaneMode | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', PaneMode>>;\n\nexport type ResponsiveSidebarMode = SidebarMode | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', SidebarMode>>;\n\nexport type Responsive<T> = T | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', T>>;\n\nexport type PaneSizePersistence = {\n load?: () => number | Promise<number | undefined> | undefined;\n save?: (size: number) => void | Promise<void>;\n};\n\nexport interface PaneBaseProps extends React.ComponentPropsWithoutRef<'div'> {\n presentation?: ResponsivePresentation;\n expandedSize?: number;\n minSize?: number;\n maxSize?: number;\n height?: string | number;\n resizable?: boolean;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n onResize?: (size: number) => void;\n resizer?: React.ReactNode;\n onResizeStart?: (size: number) => void;\n onResizeEnd?: (size: number) => void;\n snapPoints?: number[];\n snapTolerance?: number;\n collapseThreshold?: number;\n paneId?: string;\n persistence?: PaneSizePersistence;\n}\n\nexport const _BREAKPOINTS = {\n xs: '(min-width: 520px)',\n sm: '(min-width: 768px)',\n md: '(min-width: 1024px)',\n lg: '(min-width: 1280px)',\n xl: '(min-width: 1640px)',\n} as const;\n\nexport type Breakpoint = 'initial' | keyof typeof _BREAKPOINTS;\n\nexport type PaneTarget = 'left' | 'rail' | 'panel' | 'sidebar' | 'inspector' | 'bottom';\n\n/**\n * CSS custom property key type for type-safe style objects.\n * Allows any string prefixed with '--'.\n */\nexport type CSSCustomProperty = `--${string}`;\n\n/**\n * Style object that supports CSS custom properties.\n */\nexport type CSSPropertiesWithVars = React.CSSProperties & {\n [key: CSSCustomProperty]: string | number | undefined;\n};\n", "import * as React from 'react';\nimport type { Breakpoint, PresentationValue, SidebarMode, PaneMode, PaneTarget } from './shell.types.js';\n\nexport interface ShellContextValue {\n // Pane states\n leftMode: PaneMode;\n setLeftMode: (mode: PaneMode) => void;\n /** When Rail is controlled, this reflects the resolved open state for the current breakpoint. */\n leftControlledOpen?: boolean;\n panelMode: PaneMode; // Panel state within left container\n setPanelMode: (mode: PaneMode) => void;\n sidebarMode: SidebarMode;\n setSidebarMode: (mode: SidebarMode) => void;\n inspectorMode: PaneMode;\n setInspectorMode: (mode: PaneMode) => void;\n bottomMode: PaneMode;\n setBottomMode: (mode: PaneMode) => void;\n\n // Peek state (layout-only, ephemeral)\n peekTarget: PaneTarget | null;\n setPeekTarget: (target: PaneTarget | null) => void;\n peekPane: (target: PaneTarget) => void;\n clearPeek: () => void;\n\n // Composition detection\n hasLeft: boolean;\n setHasLeft: (has: boolean) => void;\n hasSidebar: boolean;\n setHasSidebar: (has: boolean) => void;\n\n // Presentation resolution\n currentBreakpoint: Breakpoint;\n currentBreakpointReady: boolean;\n leftResolvedPresentation?: PresentationValue;\n\n // Actions\n togglePane: (target: PaneTarget) => void;\n expandPane: (target: PaneTarget) => void;\n collapsePane: (target: PaneTarget) => void;\n // Toggle customization\n setSidebarToggleComputer?: (fn: (current: SidebarMode) => SidebarMode) => void;\n // Dev-only hooks for presentation warnings\n onLeftPres?: (p: PresentationValue) => void;\n // Sizing info for overlay grouping\n onLeftDefaults?: (size: number) => void;\n onRailDefaults?: (size: number) => void;\n onPanelDefaults?: (size: number) => void;\n}\n\nconst ShellContext = React.createContext<ShellContextValue | null>(null);\n\n/** @internal Shell root context. Prefer slice hooks (useSidebarMode, useShellActions, etc.). */\nexport function useShell() {\n const ctx = React.useContext(ShellContext);\n if (!ctx) throw new Error('Shell components must be used within <Shell.Root>');\n return ctx;\n}\n\nexport function ShellProvider({ value, children }: { value: ShellContextValue; children: React.ReactNode }) {\n return <ShellContext.Provider value={value}>{children}</ShellContext.Provider>;\n}\n\n// Phase 7: Split contexts for render isolation\n\n// Pane mode slice contexts\ntype ModeSetter<T> = (mode: T) => void;\n\nexport const LeftModeContext = React.createContext<{ leftMode: PaneMode; setLeftMode: ModeSetter<PaneMode> } | null>(null);\nexport function useLeftMode() {\n const ctx = React.useContext(LeftModeContext);\n if (!ctx) throw new Error('useLeftMode must be used within Shell.Root');\n return ctx;\n}\n\nexport const PanelModeContext = React.createContext<{ panelMode: PaneMode; setPanelMode: ModeSetter<PaneMode> } | null>(null);\nexport function usePanelMode() {\n const ctx = React.useContext(PanelModeContext);\n if (!ctx) throw new Error('usePanelMode must be used within Shell.Root');\n return ctx;\n}\n\nexport const SidebarModeContext = React.createContext<{ sidebarMode: SidebarMode; setSidebarMode: ModeSetter<SidebarMode> } | null>(null);\nexport function useSidebarMode() {\n const ctx = React.useContext(SidebarModeContext);\n if (!ctx) throw new Error('useSidebarMode must be used within Shell.Root');\n return ctx;\n}\n\nexport const InspectorModeContext = React.createContext<{ inspectorMode: PaneMode; setInspectorMode: ModeSetter<PaneMode> } | null>(null);\nexport function useInspectorMode() {\n const ctx = React.useContext(InspectorModeContext);\n if (!ctx) throw new Error('useInspectorMode must be used within Shell.Root');\n return ctx;\n}\n\nexport const BottomModeContext = React.createContext<{ bottomMode: PaneMode; setBottomMode: ModeSetter<PaneMode> } | null>(null);\nexport function useBottomMode() {\n const ctx = React.useContext(BottomModeContext);\n if (!ctx) throw new Error('useBottomMode must be used within Shell.Root');\n return ctx;\n}\n\n// Presentation slice\nexport const PresentationContext = React.createContext<{ currentBreakpoint: Breakpoint; currentBreakpointReady: boolean; leftResolvedPresentation?: PresentationValue } | null>(null);\nexport function usePresentation() {\n const ctx = React.useContext(PresentationContext);\n if (!ctx) throw new Error('usePresentation must be used within Shell.Root');\n return ctx;\n}\n\n// Peek slice\nexport const PeekContext = React.createContext<{ peekTarget: PaneTarget | null; setPeekTarget: (t: PaneTarget | null) => void; peekPane: (t: PaneTarget) => void; clearPeek: () => void } | null>(\n null,\n);\nexport function usePeek() {\n const ctx = React.useContext(PeekContext);\n if (!ctx) throw new Error('usePeek must be used within Shell.Root');\n return ctx;\n}\n\n// Actions slice (stable callbacks)\nexport const ActionsContext = React.createContext<{\n togglePane: (t: PaneTarget) => void;\n expandPane: (t: PaneTarget) => void;\n collapsePane: (t: PaneTarget) => void;\n setSidebarToggleComputer?: (fn: (current: SidebarMode) => SidebarMode) => void;\n} | null>(null);\nexport function useShellActions() {\n const ctx = React.useContext(ActionsContext);\n if (!ctx) throw new Error('useShellActions must be used within Shell.Root');\n return ctx;\n}\n\n// Composition slice\nexport const CompositionContext = React.createContext<{ hasLeft: boolean; setHasLeft: (v: boolean) => void; hasSidebar: boolean; setHasSidebar: (v: boolean) => void } | null>(null);\nexport function useComposition() {\n const ctx = React.useContext(CompositionContext);\n if (!ctx) throw new Error('useComposition must be used within Shell.Root');\n return ctx;\n}\n\n// Inset slice - tracks which panes have inset for gray backdrop\nexport type InsetPaneId = 'left' | 'sidebar' | 'content' | 'inspector' | 'bottom';\nexport const InsetContext = React.createContext<{\n insetPanes: Set<InsetPaneId>;\n registerInset: (id: InsetPaneId) => void;\n unregisterInset: (id: InsetPaneId) => void;\n hasAnyInset: boolean;\n} | null>(null);\nexport function useInset() {\n const ctx = React.useContext(InsetContext);\n if (!ctx) throw new Error('useInset must be used within Shell.Root');\n return ctx;\n}\n", "import * as React from 'react';\n\nexport interface PaneResizeContextValue {\n containerRef: React.RefObject<HTMLDivElement | null>;\n cssVarName: string;\n minSize: number;\n maxSize: number;\n defaultSize: number;\n orientation: 'vertical' | 'horizontal';\n edge: 'start' | 'end';\n computeNext: (clientPos: number, startClientPos: number, startSize: number) => number;\n onResize?: (size: number) => void;\n onResizeStart?: (size: number) => void;\n onResizeEnd?: (size: number) => void;\n target: 'left' | 'rail' | 'panel' | 'sidebar' | 'inspector' | 'bottom';\n collapsible: boolean;\n snapPoints?: number[];\n snapTolerance: number;\n collapseThreshold?: number;\n requestCollapse?: () => void;\n requestToggle?: () => void;\n}\n\nexport const PaneResizeContext = React.createContext<PaneResizeContextValue | null>(null);\n\nexport function usePaneResize() {\n const ctx = React.useContext(PaneResizeContext);\n if (!ctx) throw new Error('Shell.Handle must be used within a resizable pane');\n return ctx;\n}\n", "import * as React from 'react';\nimport classNames from 'classnames';\nimport { usePaneResize } from './shell-resize.js';\n\nexport const PaneHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>(({ className, children, ...props }, ref) => {\n const {\n containerRef,\n cssVarName,\n minSize,\n maxSize,\n defaultSize,\n orientation,\n edge,\n computeNext,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n collapsible,\n target,\n requestCollapse,\n requestToggle,\n } = usePaneResize();\n\n const activeCleanupRef = React.useRef<(() => void) | null>(null);\n React.useEffect(\n () => () => {\n try {\n activeCleanupRef.current?.();\n } catch {}\n activeCleanupRef.current = null;\n },\n [],\n );\n\n const ariaOrientation = orientation;\n\n // Generate accessible label from target\n const targetLabel = target.charAt(0).toUpperCase() + target.slice(1);\n const ariaLabel = `Resize ${targetLabel} pane`;\n\n return (\n <div\n {...props}\n ref={ref}\n className={classNames('rt-ShellResizer', className)}\n data-orientation={orientation}\n data-edge={edge}\n role=\"slider\"\n aria-label={ariaLabel}\n aria-orientation={ariaOrientation}\n aria-valuemin={minSize}\n aria-valuemax={maxSize}\n aria-valuenow={defaultSize}\n tabIndex={0}\n onPointerDown={(e) => {\n if (!containerRef.current) return;\n e.preventDefault();\n const container = containerRef.current;\n const handleEl = e.currentTarget as HTMLElement;\n const pointerId = e.pointerId;\n try {\n activeCleanupRef.current?.();\n } catch {}\n container.setAttribute('data-resizing', '');\n try {\n handleEl.setPointerCapture(pointerId);\n } catch {}\n const startClient = orientation === 'vertical' ? e.clientX : e.clientY;\n const startSize = parseFloat(getComputedStyle(container).getPropertyValue(cssVarName) || `${defaultSize}`);\n const clamp = (v: number) => Math.min(Math.max(v, minSize), maxSize);\n const body = document.body;\n const prevCursor = body.style.cursor;\n const prevUserSelect = body.style.userSelect;\n body.style.cursor = orientation === 'vertical' ? 'col-resize' : 'row-resize';\n body.style.userSelect = 'none';\n onResizeStart?.(startSize);\n\n // The move handler is attached to the handle, the document and the\n // window so the drag survives environments where PointerEvent does not\n // reach all three. A real move therefore arrives here several times:\n // once per node it propagates through, plus again as the compatibility\n // mouse event. Doing the work more than once per movement is pure waste\n // on the most latency-sensitive interaction in the shell, so ignore the\n // repeats.\n let lastHandledMove: Event | null = null;\n let seenPointerEvent = false;\n\n const shouldHandle = (ev: Event, pointerType: string) => {\n if (ev.type === pointerType) seenPointerEvent = true;\n // Once pointer events are known to work, the mouse fallbacks are\n // duplicates of an event we have already handled.\n else if (seenPointerEvent) return false;\n return true;\n };\n\n const handleMove = (ev: PointerEvent) => {\n if (!shouldHandle(ev, 'pointermove')) return;\n if (ev === lastHandledMove) return;\n lastHandledMove = ev;\n\n const client = orientation === 'vertical' ? ev.clientX : ev.clientY;\n const next = clamp(computeNext(client, startClient, startSize));\n container.style.setProperty(cssVarName, `${next}px`);\n handleEl.setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n };\n const cleanup = () => {\n try {\n handleEl.releasePointerCapture(pointerId);\n } catch {}\n window.removeEventListener('pointermove', handleMove as EventListener);\n document.removeEventListener('pointermove', handleMove as EventListener);\n window.removeEventListener('mousemove', handleMove as EventListener);\n document.removeEventListener('mousemove', handleMove as EventListener);\n handleEl.removeEventListener('pointermove', handleMove as EventListener);\n window.removeEventListener('pointerup', handleUp as EventListener);\n document.removeEventListener('pointerup', handleUp as EventListener);\n window.removeEventListener('mouseup', handleUp as EventListener);\n document.removeEventListener('mouseup', handleUp as EventListener);\n window.removeEventListener('pointercancel', handleUp as EventListener);\n document.removeEventListener('pointercancel', handleUp as EventListener);\n window.removeEventListener('keydown', handleKey as EventListener);\n handleEl.removeEventListener('lostpointercapture', handleUp as EventListener);\n container.removeAttribute('data-resizing');\n body.style.cursor = prevCursor;\n body.style.userSelect = prevUserSelect;\n activeCleanupRef.current = null;\n };\n let finished = false;\n const handleUp = () => {\n if (finished) return;\n finished = true;\n\n const finalSize = parseFloat(getComputedStyle(container).getPropertyValue(cssVarName) || `${defaultSize}`);\n let snapped = finalSize;\n if (snapPoints && snapPoints.length) {\n const nearest = snapPoints.reduce((acc, p) => (Math.abs(p - finalSize) < Math.abs(acc - finalSize) ? p : acc), snapPoints[0]);\n if (Math.abs(nearest - finalSize) <= (snapTolerance ?? 8)) {\n snapped = nearest;\n container.style.setProperty(cssVarName, `${snapped}px`);\n handleEl.setAttribute('aria-valuenow', String(snapped));\n onResize?.(snapped);\n }\n }\n if (collapsible && typeof collapseThreshold === 'number' && finalSize <= collapseThreshold) {\n requestCollapse?.();\n }\n onResizeEnd?.(snapped);\n cleanup();\n };\n const handleKey = (kev: KeyboardEvent) => {\n if (kev.key === 'Escape') {\n container.style.setProperty(cssVarName, `${startSize}px`);\n handleEl.setAttribute('aria-valuenow', String(startSize));\n onResizeEnd?.(startSize);\n cleanup();\n }\n };\n window.addEventListener('pointermove', handleMove as EventListener);\n document.addEventListener('pointermove', handleMove as EventListener);\n // Fallbacks for environments that don't fully support PointerEvent on window\n window.addEventListener('mousemove', handleMove as EventListener);\n document.addEventListener('mousemove', handleMove as EventListener);\n handleEl.addEventListener('pointermove', handleMove as EventListener);\n window.addEventListener('pointerup', handleUp as EventListener);\n document.addEventListener('pointerup', handleUp as EventListener);\n window.addEventListener('mouseup', handleUp as EventListener);\n document.addEventListener('mouseup', handleUp as EventListener);\n window.addEventListener('pointercancel', handleUp as EventListener);\n document.addEventListener('pointercancel', handleUp as EventListener);\n window.addEventListener('keydown', handleKey as EventListener);\n handleEl.addEventListener('lostpointercapture', handleUp as EventListener);\n activeCleanupRef.current = cleanup;\n }}\n onDoubleClick={() => {\n if (collapsible) requestToggle?.();\n }}\n onKeyDown={(e) => {\n if (!containerRef.current) return;\n const container = containerRef.current;\n const rawCurrent = getComputedStyle(container).getPropertyValue(cssVarName);\n const parsedCurrent = Number.parseFloat(rawCurrent.trim());\n const current = Number.isFinite(parsedCurrent) ? parsedCurrent : defaultSize;\n const clamp = (v: number) => Math.min(Math.max(v, minSize), maxSize);\n const step = e.shiftKey ? 32 : 8;\n let delta = 0;\n if (orientation === 'vertical') {\n const docDir = typeof document !== 'undefined' ? document.dir : undefined;\n const cssDir = getComputedStyle(container).direction;\n const hasRtlAncestor = !!(container.closest && container.closest('[dir=\"rtl\"]'));\n const isRtl = docDir === 'rtl' || cssDir === 'rtl' || hasRtlAncestor;\n if (e.key === 'ArrowRight')\n delta = isRtl ? -step : step; // inline-end\n else if (e.key === 'ArrowLeft') delta = isRtl ? step : -step; // inline-start\n } else {\n if (e.key === 'ArrowDown') delta = step;\n else if (e.key === 'ArrowUp') delta = -step;\n }\n if (e.key === 'Home') {\n e.preventDefault();\n onResizeStart?.(current);\n const next = clamp(minSize);\n container.style.setProperty(cssVarName, `${next}px`);\n (e.currentTarget as HTMLElement).setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n onResizeEnd?.(next);\n return;\n }\n if (e.key === 'End') {\n e.preventDefault();\n onResizeStart?.(current);\n const next = clamp(maxSize);\n container.style.setProperty(cssVarName, `${next}px`);\n (e.currentTarget as HTMLElement).setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n onResizeEnd?.(next);\n return;\n }\n if (delta !== 0) {\n e.preventDefault();\n onResizeStart?.(current);\n const signedDelta = orientation === 'vertical' ? (edge === 'start' ? -delta : delta) : delta;\n const next = clamp(current + signedDelta);\n container.style.setProperty(cssVarName, `${next}px`);\n (e.currentTarget as HTMLElement).setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n onResizeEnd?.(next);\n }\n }}\n >\n {children}\n </div>\n );\n});\nPaneHandle.displayName = 'Shell.Handle';\n\nexport const PanelHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>((props, ref) => <PaneHandle {...props} ref={ref} />);\nPanelHandle.displayName = 'Shell.Panel.Handle';\n\nexport const SidebarHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>((props, ref) => <PaneHandle {...props} ref={ref} />);\nSidebarHandle.displayName = 'Shell.Sidebar.Handle';\n\nexport const InspectorHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>((props, ref) => <PaneHandle {...props} ref={ref} />);\nInspectorHandle.displayName = 'Shell.Inspector.Handle';\n\nexport const BottomHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>((props, ref) => <PaneHandle {...props} ref={ref} />);\nBottomHandle.displayName = 'Shell.Bottom.Handle';\n", "import type { Breakpoint, PaneMode } from '../shell.types.js';\n\ntype KeyList<T> = readonly (keyof T)[];\n\nexport function omitPaneProps<T extends object, K extends KeyList<T>>(source: T, keys: K) {\n const omitSet = new Set<keyof T>(keys as readonly (keyof T)[]);\n const result: Partial<T> = {};\n (Object.keys(source) as Array<keyof T>).forEach((key) => {\n if (!omitSet.has(key)) {\n result[key] = source[key];\n }\n });\n return result as Omit<T, K[number]>;\n}\n\nconst PANE_BASE_INTERNAL_PROPS = [\n 'presentation',\n 'expandedSize',\n 'minSize',\n 'maxSize',\n 'resizable',\n 'collapsible',\n 'onExpand',\n 'onCollapse',\n 'onResize',\n 'resizer',\n 'onResizeStart',\n 'onResizeEnd',\n 'snapPoints',\n 'snapTolerance',\n 'collapseThreshold',\n 'paneId',\n 'persistence',\n 'inset',\n] as const;\n\nexport function extractPaneDomProps<T extends object, Extra extends KeyList<T> | undefined = undefined>(source: T, extraKeys?: Extra) {\n const omitKeys = extraKeys ? [...PANE_BASE_INTERNAL_PROPS, ...extraKeys] : [...PANE_BASE_INTERNAL_PROPS];\n return omitPaneProps(source, omitKeys as ReadonlyArray<keyof T>);\n}\n\nexport function mapResponsiveBooleanToPaneMode(value?: boolean | Partial<Record<Breakpoint, boolean>>): PaneMode | Partial<Record<Breakpoint, PaneMode>> | undefined {\n if (value == null) return undefined;\n if (typeof value === 'object') {\n const mapped: Partial<Record<Breakpoint, PaneMode>> = {};\n (Object.entries(value) as Array<[string, boolean]>).forEach(([bp, val]) => {\n if (typeof val === 'boolean') {\n mapped[bp as Breakpoint] = val ? 'expanded' : 'collapsed';\n }\n });\n return mapped;\n }\n return value ? 'expanded' : 'collapsed';\n}\n", "import * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from '../sheet.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { useSidebarMode, usePresentation, usePeek, useShellActions, useComposition, useInset } from '../shell.context.js';\nimport { useResponsivePresentation, useResponsiveInitialState } from '../shell.hooks.js';\nimport { PaneResizeContext } from './shell-resize.js';\nimport { extractPaneDomProps } from './shell-prop-helpers.js';\nimport { SidebarHandle, PaneHandle } from './shell-handles.js';\nimport type { Breakpoint, PaneMode, PaneSizePersistence, SidebarMode, Responsive, PaneBaseProps, CSSPropertiesWithVars } from '../shell.types.js';\nimport { _BREAKPOINTS } from '../shell.types.js';\nimport { normalizeToPx } from '../../helpers/normalize-to-px.js';\n\ntype SidebarPaneProps = PaneBaseProps & {\n mode?: PaneMode;\n defaultMode?: any;\n onModeChange?: (mode: PaneMode | SidebarMode) => void;\n};\n\ntype SidebarStateChangeMeta = { reason: 'init' | 'toggle' | 'responsive' };\ntype SidebarControlledProps = { state: Responsive<SidebarMode>; onStateChange?: (state: SidebarMode, meta: SidebarStateChangeMeta) => void; defaultState?: never };\ntype SidebarUncontrolledProps = { defaultState?: SidebarMode | Partial<Record<Breakpoint, SidebarMode>>; onStateChange?: (state: SidebarMode, meta: SidebarStateChangeMeta) => void; state?: never };\ntype SidebarPublicProps = Omit<SidebarPaneProps, 'mode' | 'defaultMode' | 'onModeChange'> & {\n // removed legacy mode props\n thinSize?: number;\n toggleModes?: 'both' | 'single';\n // size API (width when expanded)\n size?: number | string;\n defaultSize?: number | string;\n onSizeChange?: (size: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n} & (SidebarControlledProps | SidebarUncontrolledProps);\n\ntype SidebarComponent = React.ForwardRefExoticComponent<SidebarPublicProps & React.RefAttributes<HTMLDivElement>> & { Handle: typeof SidebarHandle };\n\nconst SIDEBAR_DOM_PROP_KEYS = [\n 'className',\n 'children',\n 'state',\n 'defaultState',\n 'onStateChange',\n 'thinSize',\n 'toggleModes',\n 'size',\n 'defaultSize',\n 'onSizeChange',\n 'sizeUpdate',\n 'sizeUpdateMs',\n 'style',\n 'inset',\n] as const satisfies readonly (keyof SidebarPublicProps)[];\n\nexport const Sidebar = React.forwardRef<HTMLDivElement, SidebarPublicProps>((initialProps, ref) => {\n const {\n className,\n presentation = { initial: 'overlay', md: 'fixed' },\n expandedSize = 288,\n minSize = 200,\n maxSize = 400,\n resizable = false,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n thinSize = 64,\n toggleModes,\n state,\n defaultState,\n onStateChange,\n size,\n defaultSize,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n inset,\n } = initialProps;\n const sidebarDomProps = extractPaneDomProps(initialProps, SIDEBAR_DOM_PROP_KEYS);\n const { sidebarMode, setSidebarMode } = useSidebarMode();\n const { currentBreakpointReady } = usePresentation();\n const { peekTarget } = usePeek();\n const { togglePane, setSidebarToggleComputer } = useShellActions();\n const { setHasSidebar } = useComposition();\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useLayoutEffect(() => {\n if (inset) {\n registerInset('sidebar');\n return () => unregisterInset('sidebar');\n }\n }, [inset, registerInset, unregisterInset]);\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n // Phase sequencing is now CSS-driven; no JS-managed phase\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === SidebarHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === SidebarHandle));\n\n // Ref for debounce cleanup\n const debounceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // Cleanup debounce timeout on unmount or when dependencies change\n React.useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = null;\n }\n };\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n // Throttled/debounced emitter for onSizeChange\n const emitSizeChange = React.useMemo(() => {\n const cb = onSizeChange as undefined | ((s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => void);\n const strategy = sizeUpdate as undefined | 'throttle' | 'debounce';\n const ms = sizeUpdateMs ?? 50;\n if (!cb) return () => {};\n if (strategy === 'debounce') {\n return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => {\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = setTimeout(() => {\n cb(s, meta);\n debounceTimeoutRef.current = null;\n }, ms);\n };\n }\n if (strategy === 'throttle') {\n let last = 0;\n return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n cb(s, meta);\n }\n };\n }\n return (s: number, meta: { reason: 'init' | 'resize' | 'controlled' }) => cb(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n\n // Register with shell\n const sidebarId = React.useId();\n React.useEffect(() => {\n setHasSidebar(true);\n return () => {\n setHasSidebar(false);\n };\n }, [setHasSidebar, sidebarId]);\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof state !== 'undefined' && typeof defaultState !== 'undefined') {\n console.error('Shell.Sidebar: Do not pass both `state` and `defaultState`. Choose one.');\n }\n if (typeof size !== 'undefined' && typeof defaultSize !== 'undefined') {\n console.error('Shell.Sidebar: Do not pass both `size` and `defaultSize`. Choose one.');\n }\n }\n\n // Warn on mode switch between controlled/uncontrolled\n React.useEffect(() => {\n const isControlled = typeof state !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Sidebar: Switching between controlled and uncontrolled `state` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [state]);\n\n // Stable ref for onStateChange to avoid effect dep churn\n const onStateChangeRef = React.useRef(onStateChange);\n const stateRef = React.useRef(state);\n React.useLayoutEffect(() => {\n onStateChangeRef.current = onStateChange;\n stateRef.current = state;\n });\n\n // Resolve responsive controlled state at top level\n const stateIsResponsive = typeof state === 'object' && state !== null;\n const { resolvedControlled: resolvedSidebarControlled, resolvedDefault: resolvedSidebarDefault } = useResponsiveInitialState<SidebarMode>({\n controlledValue: state,\n defaultValue: defaultState,\n currentValue: sidebarMode as SidebarMode,\n setValue: setSidebarMode,\n breakpointReady: currentBreakpointReady,\n controlledIsResponsive: stateIsResponsive,\n onResponsiveChange: (next) => onStateChangeRef.current?.(next, { reason: 'responsive' }),\n onInit: (initial) => onStateChangeRef.current?.(initial, { reason: 'init' }),\n });\n\n // Emit mode changes. In controlled mode, skip when mode matches the controlled prop.\n const lastNotifyModeRef = React.useRef<SidebarMode | null>(null);\n const lastResolvedSidebarControlledRef = React.useRef<SidebarMode | undefined>(undefined);\n React.useEffect(() => {\n const current = sidebarMode as SidebarMode;\n const prevMode = lastNotifyModeRef.current;\n const prevResolvedControlled = lastResolvedSidebarControlledRef.current;\n const controlledChanged = prevResolvedControlled !== resolvedSidebarControlled;\n\n if (prevMode !== null && prevMode !== current) {\n const isControlled = typeof stateRef.current !== 'undefined';\n\n if (!isControlled || (!controlledChanged && current !== resolvedSidebarControlled)) {\n onStateChangeRef.current?.(current, { reason: 'toggle' });\n }\n }\n\n lastNotifyModeRef.current = current;\n lastResolvedSidebarControlledRef.current = resolvedSidebarControlled;\n }, [sidebarMode, resolvedSidebarControlled]);\n\n // Track previous mode to only fire callbacks on actual user-initiated state transitions.\n // We wait for breakpointReady to ensure the initial state sync from useResponsiveInitialState\n // is complete before enabling callbacks. This avoids spurious callbacks during initialization.\n // Use callback refs to avoid re-running effect when inline callbacks change.\n const onExpandRef = React.useRef(onExpand);\n const onCollapseRef = React.useRef(onCollapse);\n React.useLayoutEffect(() => {\n onExpandRef.current = onExpand;\n onCollapseRef.current = onCollapse;\n });\n\n const prevSidebarModeRef = React.useRef<SidebarMode | null>(null);\n const hasInitializedRef = React.useRef(false);\n React.useEffect(() => {\n const currentMode = sidebarMode as SidebarMode;\n\n // Wait for breakpoint to be ready before enabling callbacks\n if (!currentBreakpointReady) {\n prevSidebarModeRef.current = currentMode;\n return;\n }\n\n // Skip the first run after breakpoint is ready - this captures the post-sync state\n if (!hasInitializedRef.current) {\n hasInitializedRef.current = true;\n prevSidebarModeRef.current = currentMode;\n return;\n }\n\n const prevMode = prevSidebarModeRef.current;\n\n // Only fire on actual state transitions\n if (prevMode !== null && prevMode !== currentMode) {\n // onExpand: when becoming visible (collapsed \u2192 thin/expanded)\n if (prevMode === 'collapsed' && currentMode !== 'collapsed') {\n onExpandRef.current?.();\n }\n // onCollapse: when becoming hidden (any \u2192 collapsed)\n else if (currentMode === 'collapsed') {\n onCollapseRef.current?.();\n }\n prevSidebarModeRef.current = currentMode;\n }\n }, [sidebarMode, currentBreakpointReady]);\n\n // Option A: thin is width-only; content remains visible whenever not collapsed\n const isContentVisible = sidebarMode !== 'collapsed';\n\n // Default persistence if paneId provided and none supplied (fixed only)\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:sidebar:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n try {\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Sidebar: failed to load persisted size', err);\n }\n return undefined;\n }\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, String(size));\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Sidebar: failed to save persisted size', err);\n }\n }\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n React.useEffect(() => {\n let mounted = true;\n (async () => {\n if (!resizable || !persistenceAdapter?.load || isOverlay) return;\n const loaded = await persistenceAdapter.load();\n if (mounted && typeof loaded === 'number' && localRef.current) {\n localRef.current.style.setProperty('--sidebar-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n // Register custom toggle behavior based on toggleModes (both|single)\n const resolveDefaultSidebarMode = React.useCallback((): SidebarMode => {\n const resolved = resolvedSidebarDefault ?? (typeof defaultState === 'string' ? defaultState : undefined) ?? 'expanded';\n return resolved === 'thin' || resolved === 'expanded' ? resolved : 'expanded';\n }, [resolvedSidebarDefault, defaultState]);\n\n React.useEffect(() => {\n if (!setSidebarToggleComputer) return;\n const strategy: 'both' | 'single' = toggleModes ?? 'both';\n const compute = (current: SidebarMode): SidebarMode => {\n if (strategy === 'both') {\n if (current === 'collapsed') return 'thin';\n if (current === 'thin') return 'expanded';\n return 'collapsed';\n }\n const target = resolveDefaultSidebarMode();\n if (current === 'collapsed') return target;\n if (current === target) return 'collapsed';\n return target;\n };\n setSidebarToggleComputer(compute);\n return () => {\n setSidebarToggleComputer?.((cur) => (cur === 'collapsed' ? 'thin' : cur === 'thin' ? 'expanded' : 'collapsed'));\n };\n }, [setSidebarToggleComputer, toggleModes, resolveDefaultSidebarMode]);\n\n const lastOverlayWidthRef = React.useRef<number>(expandedSize);\n const lastOverlayModeRef = React.useRef<SidebarMode>('expanded');\n React.useEffect(() => {\n if (sidebarMode !== 'collapsed') {\n lastOverlayModeRef.current = sidebarMode as SidebarMode;\n lastOverlayWidthRef.current = sidebarMode === 'thin' ? thinSize : expandedSize;\n }\n }, [sidebarMode, thinSize, expandedSize]);\n\n // Remove responsive default mode behavior entirely\n\n const handleEl =\n resizable && !isOverlay && sidebarMode === 'expanded' ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--sidebar-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'end',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n return startSize + (isRtl ? -delta : delta);\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'sidebar',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => setSidebarMode('collapsed'),\n requestToggle: () => togglePane('sidebar'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n // Normalize CSS lengths to px helper\n const normalizeSizeToPx = React.useCallback((value: number | string | undefined) => normalizeToPx(value, 'horizontal'), []);\n\n // Apply defaultSize on mount when uncontrolled\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeSizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--sidebar-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync\n const controlledSize = size;\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof controlledSize === 'undefined') return;\n const px = normalizeSizeToPx(controlledSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--sidebar-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [controlledSize, minSize, maxSize, normalizeSizeToPx, emitSizeChange]);\n\n // Memoize peek styles to avoid IIFE recreation on every render\n const peekStyles = React.useMemo((): CSSPropertiesWithVars | undefined => {\n if (!(peekTarget === 'sidebar' && sidebarMode === 'collapsed' && !isOverlay)) {\n return undefined;\n }\n const strategy: 'both' | 'single' = toggleModes ?? 'both';\n const current = sidebarMode as SidebarMode;\n let next: SidebarMode;\n if (strategy === 'both') {\n next = current === 'collapsed' ? 'thin' : current === 'thin' ? 'expanded' : 'collapsed';\n } else {\n const target = resolveDefaultSidebarMode();\n next = current === 'collapsed' ? target : 'collapsed';\n }\n if (next === 'thin') {\n return { '--peek-sidebar-width': `${thinSize}px` } as CSSPropertiesWithVars;\n }\n return { '--peek-sidebar-width': `var(--sidebar-size, ${expandedSize}px)` } as CSSPropertiesWithVars;\n }, [peekTarget, sidebarMode, isOverlay, toggleModes, resolveDefaultSidebarMode, thinSize, expandedSize]);\n\n if (isOverlay) {\n const open = sidebarMode !== 'collapsed';\n return (\n <Sheet.Root open={open} onOpenChange={(o) => setSidebarMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content\n side=\"start\"\n style={{ padding: 0 }}\n aria-label=\"Navigation\"\n aria-describedby={undefined}\n width={{\n initial: `${open ? (sidebarMode === 'thin' ? thinSize : expandedSize) : lastOverlayWidthRef.current}px`,\n }}\n >\n <VisuallyHidden>\n <Sheet.Title>Navigation</Sheet.Title>\n </VisuallyHidden>\n {contentChildren}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n return (\n <div\n {...sidebarDomProps}\n ref={setRef}\n className={classNames('rt-ShellSidebar', className)}\n data-mode={sidebarMode}\n data-peek={peekTarget === 'sidebar' || undefined}\n data-presentation={currentBreakpointReady ? resolvedPresentation : undefined}\n data-open={(currentBreakpointReady && isStacked && isContentVisible) || undefined}\n data-inset={inset || undefined}\n style={{\n ...style,\n '--sidebar-size': `${expandedSize}px`,\n '--sidebar-thin-size': `${thinSize}px`,\n '--sidebar-min-size': `${minSize}px`,\n '--sidebar-max-size': `${maxSize}px`,\n ...peekStyles,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellSidebarContent\" data-visible={isContentVisible || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n}) as SidebarComponent;\n\nSidebar.displayName = 'Shell.Sidebar';\nSidebar.Handle = SidebarHandle;\n", "/**\n * Normalize CSS length values to pixels.\n * Supports: px, rem, %, and bare numbers.\n *\n * @param value - The value to normalize (number, string, or undefined)\n * @param orientation - 'horizontal' for width-based % or 'vertical' for height-based %\n * @returns The value in pixels, or undefined if invalid\n */\nexport function normalizeToPx(\n value: number | string | undefined,\n orientation: 'horizontal' | 'vertical' = 'horizontal',\n): number | undefined {\n if (value == null) return undefined;\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n\n const str = String(value).trim();\n if (!str) return undefined;\n\n // px: direct parse\n if (str.endsWith('px')) return Number.parseFloat(str);\n\n // rem: multiply by root font size\n if (str.endsWith('rem')) {\n const rem = Number.parseFloat(getComputedStyle(document.documentElement).fontSize || '16') || 16;\n return Number.parseFloat(str) * rem;\n }\n\n // %: calculate based on viewport dimension\n if (str.endsWith('%')) {\n const pct = Number.parseFloat(str);\n const base =\n orientation === 'horizontal'\n ? document.documentElement.clientWidth || window.innerWidth || 0\n : document.documentElement.clientHeight || window.innerHeight || 0;\n return (pct / 100) * base;\n }\n\n // Bare number-like string\n const n = Number.parseFloat(str);\n return Number.isFinite(n) ? n : undefined;\n}\n\n", "import * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from '../sheet.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { useBottomMode, usePresentation, usePeek, useShellActions, useInset } from '../shell.context.js';\nimport { useResponsivePresentation, useResponsiveInitialState } from '../shell.hooks.js';\nimport { PaneResizeContext } from './shell-resize.js';\nimport { BottomHandle, PaneHandle } from './shell-handles.js';\nimport { _BREAKPOINTS } from '../shell.types.js';\nimport type { Breakpoint, PaneMode, PaneSizePersistence, PaneBaseProps, CSSPropertiesWithVars } from '../shell.types.js';\nimport { extractPaneDomProps, mapResponsiveBooleanToPaneMode } from './shell-prop-helpers.js';\nimport { normalizeToPx } from '../../helpers/normalize-to-px.js';\n\ntype BottomOpenChangeMeta = { reason: 'init' | 'toggle' | 'responsive' };\ntype BottomControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: BottomOpenChangeMeta) => void; defaultOpen?: never };\ntype BottomUncontrolledProps = { defaultOpen?: boolean; onOpenChange?: (open: boolean, meta: BottomOpenChangeMeta) => void; open?: never };\ntype BottomSizeControlledProps = { size: number | string; defaultSize?: never };\ntype BottomSizeUncontrolledProps = { defaultSize?: number | string; size?: never };\ntype BottomSizeChangeMeta = { reason: 'init' | 'resize' | 'controlled' };\ntype BottomPublicProps = PaneBaseProps &\n (BottomControlledProps | BottomUncontrolledProps) &\n (BottomSizeControlledProps | BottomSizeUncontrolledProps) & {\n onSizeChange?: (size: number, meta: BottomSizeChangeMeta) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n };\n\ntype BottomComponent = React.ForwardRefExoticComponent<BottomPublicProps & React.RefAttributes<HTMLDivElement>> & { Handle: typeof BottomHandle };\n\nconst BOTTOM_DOM_PROP_KEYS = [\n 'className',\n 'children',\n 'defaultOpen',\n 'open',\n 'onOpenChange',\n 'size',\n 'defaultSize',\n 'onSizeChange',\n 'sizeUpdate',\n 'sizeUpdateMs',\n 'style',\n 'inset',\n] as const satisfies readonly (keyof BottomPublicProps)[];\n\nexport const Bottom = React.forwardRef<HTMLDivElement, BottomPublicProps>((initialProps, ref) => {\n const {\n className,\n presentation = 'fixed',\n defaultOpen,\n open,\n onOpenChange,\n expandedSize = 200,\n minSize = 100,\n maxSize = 400,\n resizable = false,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n size,\n defaultSize,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n inset,\n } = initialProps;\n const bottomDomProps = extractPaneDomProps(initialProps, BOTTOM_DOM_PROP_KEYS);\n const { bottomMode, setBottomMode } = useBottomMode();\n const { currentBreakpointReady } = usePresentation();\n const { peekTarget } = usePeek();\n const { togglePane } = useShellActions();\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useLayoutEffect(() => {\n if (inset) {\n registerInset('bottom');\n return () => unregisterInset('bottom');\n }\n }, [inset, registerInset, unregisterInset]);\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === BottomHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === BottomHandle));\n\n // Stable ref for onOpenChange to avoid effect dep churn\n const onOpenChangeRef = React.useRef(onOpenChange);\n const openRef = React.useRef(open);\n React.useLayoutEffect(() => {\n onOpenChangeRef.current = onOpenChange;\n openRef.current = open;\n });\n\n const normalizedControlledOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(open), [open]);\n const normalizedDefaultOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(defaultOpen), [defaultOpen]);\n const openIsResponsive = typeof open === 'object' && open !== null;\n const { resolvedControlled: resolvedBottomControlled } = useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedControlledOpen,\n defaultValue: normalizedDefaultOpen,\n currentValue: bottomMode,\n setValue: setBottomMode,\n breakpointReady: currentBreakpointReady,\n controlledIsResponsive: openIsResponsive,\n onResponsiveChange: (next) => onOpenChangeRef.current?.(next === 'expanded', { reason: 'responsive' }),\n onInit: (initial) => {\n if (typeof openRef.current === 'undefined') {\n onOpenChangeRef.current?.(initial === 'expanded', { reason: 'init' });\n }\n },\n });\n\n // Ref for debounce cleanup\n const debounceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // Cleanup debounce timeout on unmount or when dependencies change\n React.useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = null;\n }\n };\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n // Throttled/debounced emitter for onSizeChange\n const emitSizeChange = React.useMemo(() => {\n const cb = onSizeChange as undefined | ((s: number, meta: BottomSizeChangeMeta) => void);\n const strategy = sizeUpdate as undefined | 'throttle' | 'debounce';\n const ms = sizeUpdateMs ?? 50;\n if (!cb) return () => {};\n if (strategy === 'debounce') {\n return (s: number, meta: BottomSizeChangeMeta) => {\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = setTimeout(() => {\n cb(s, meta);\n debounceTimeoutRef.current = null;\n }, ms);\n };\n }\n if (strategy === 'throttle') {\n let last = 0;\n return (s: number, meta: BottomSizeChangeMeta) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n cb(s, meta);\n }\n };\n }\n return (s: number, meta: BottomSizeChangeMeta) => cb(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Bottom: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n if (typeof size !== 'undefined' && typeof defaultSize !== 'undefined') {\n console.error('Shell.Bottom: Do not pass both `size` and `defaultSize`. Choose one.');\n }\n }\n\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Bottom: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n // Emit mode changes. In controlled mode, skip when mode matches the controlled prop.\n const lastBottomModeRef = React.useRef<PaneMode | null>(null);\n const lastResolvedBottomControlledRef = React.useRef<PaneMode | undefined>(undefined);\n React.useEffect(() => {\n const prevMode = lastBottomModeRef.current;\n const prevResolvedControlled = lastResolvedBottomControlledRef.current;\n const controlledChanged = prevResolvedControlled !== resolvedBottomControlled;\n\n if (prevMode !== null && prevMode !== bottomMode) {\n const nextOpen = bottomMode === 'expanded';\n const isControlled = typeof openRef.current !== 'undefined';\n const controlledTarget = resolvedBottomControlled === undefined ? undefined : resolvedBottomControlled === 'expanded';\n\n if (!isControlled || (!controlledChanged && nextOpen !== controlledTarget)) {\n onOpenChangeRef.current?.(nextOpen, { reason: 'toggle' });\n }\n }\n\n lastBottomModeRef.current = bottomMode;\n lastResolvedBottomControlledRef.current = resolvedBottomControlled;\n }, [bottomMode, resolvedBottomControlled]);\n\n // Track previous mode to only fire callbacks on actual user-initiated state transitions.\n // We wait for breakpointReady to ensure the initial state sync from useResponsiveInitialState\n // is complete before enabling callbacks. This avoids spurious callbacks during initialization.\n // Use callback refs to avoid re-running effect when inline callbacks change.\n const onExpandRef = React.useRef(onExpand);\n const onCollapseRef = React.useRef(onCollapse);\n React.useLayoutEffect(() => {\n onExpandRef.current = onExpand;\n onCollapseRef.current = onCollapse;\n });\n\n const prevBottomModeRef = React.useRef<PaneMode | null>(null);\n const hasInitializedRef = React.useRef(false);\n React.useEffect(() => {\n const currentMode = bottomMode;\n\n // Wait for breakpoint to be ready before enabling callbacks\n if (!currentBreakpointReady) {\n prevBottomModeRef.current = currentMode;\n return;\n }\n\n // Skip the first run after breakpoint is ready - this captures the post-sync state\n if (!hasInitializedRef.current) {\n hasInitializedRef.current = true;\n prevBottomModeRef.current = currentMode;\n return;\n }\n\n const prevMode = prevBottomModeRef.current;\n\n // Only fire on actual state transitions\n if (prevMode !== null && prevMode !== currentMode) {\n if (currentMode === 'expanded') {\n onExpandRef.current?.();\n } else if (currentMode === 'collapsed') {\n onCollapseRef.current?.();\n }\n prevBottomModeRef.current = currentMode;\n }\n }, [bottomMode, currentBreakpointReady]);\n\n const isExpanded = bottomMode === 'expanded';\n\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:bottom:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n try {\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Bottom: failed to load persisted size', err);\n }\n return undefined;\n }\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, String(size));\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Bottom: failed to save persisted size', err);\n }\n }\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n React.useEffect(() => {\n let mounted = true;\n if (!resizable || !persistenceAdapter?.load || isOverlay) return undefined;\n const loaded = persistenceAdapter.load();\n const applyLoaded = (value?: number) => {\n if (!mounted || typeof value !== 'number' || !localRef.current) return;\n localRef.current.style.setProperty('--bottom-size', `${value}px`);\n onResize?.(value);\n };\n if (loaded instanceof Promise) {\n loaded.then(applyLoaded).catch((err) => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Bottom: failed to load persisted size', err);\n }\n });\n } else {\n applyLoaded(loaded);\n }\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n const handleEl =\n resizable && !isOverlay && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--bottom-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'horizontal',\n edge: 'start',\n computeNext: (client, startClient, startSize) => {\n const delta = client - startClient;\n return startSize - delta;\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'bottom',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => setBottomMode('collapsed'),\n requestToggle: () => togglePane('bottom'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n // Strip control/size props from DOM spread (moved above overlay return to keep hook order consistent)\n // Normalize CSS lengths to px helper\n const normalizeSizeToPx = React.useCallback((value: number | string | undefined) => normalizeToPx(value, 'vertical'), []);\n\n // Apply defaultSize on mount when uncontrolled (moved above overlay return)\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeSizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--bottom-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync (moved above overlay return)\n const controlledSize = size;\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof controlledSize === 'undefined') return;\n const px = normalizeSizeToPx(controlledSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--bottom-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [controlledSize, minSize, maxSize, normalizeSizeToPx, emitSizeChange]);\n\n if (isOverlay) {\n const open = bottomMode === 'expanded';\n return (\n <Sheet.Root open={open} onOpenChange={(o) => setBottomMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content side=\"bottom\" style={{ padding: 0 }} aria-label=\"Bottom panel\" aria-describedby={undefined} height={{ initial: `${expandedSize}px` }}>\n <VisuallyHidden>\n <Sheet.Title>Bottom panel</Sheet.Title>\n </VisuallyHidden>\n {contentChildren}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n return (\n <div\n {...bottomDomProps}\n ref={setRef}\n className={classNames('rt-ShellBottom', className)}\n data-mode={bottomMode}\n data-peek={peekTarget === 'bottom' || undefined}\n data-presentation={currentBreakpointReady ? resolvedPresentation : undefined}\n data-open={(currentBreakpointReady && isStacked && isExpanded) || undefined}\n data-inset={inset || undefined}\n style={{\n ...style,\n '--bottom-size': `${expandedSize}px`,\n '--bottom-min-size': `${minSize}px`,\n '--bottom-max-size': `${maxSize}px`,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellBottomContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n}) as BottomComponent;\nBottom.displayName = 'Shell.Bottom';\nBottom.Handle = BottomHandle;\n", "import * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from '../sheet.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { useInspectorMode, usePresentation, usePeek, useShellActions, useInset } from '../shell.context.js';\nimport { useResponsivePresentation, useResponsiveInitialState } from '../shell.hooks.js';\nimport { PaneResizeContext } from './shell-resize.js';\nimport { InspectorHandle, PaneHandle } from './shell-handles.js';\nimport { _BREAKPOINTS } from '../shell.types.js';\nimport type { Breakpoint, PaneMode, PaneSizePersistence, PaneBaseProps, CSSPropertiesWithVars } from '../shell.types.js';\nimport { extractPaneDomProps, mapResponsiveBooleanToPaneMode } from './shell-prop-helpers.js';\nimport { normalizeToPx } from '../../helpers/normalize-to-px.js';\n\ntype InspectorOpenChangeMeta = { reason: 'init' | 'toggle' | 'responsive' };\ntype InspectorControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: InspectorOpenChangeMeta) => void; defaultOpen?: never };\ntype InspectorUncontrolledProps = { defaultOpen?: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: InspectorOpenChangeMeta) => void; open?: never };\ntype InspectorSizeChangeMeta = { reason: 'init' | 'resize' | 'controlled' };\ntype InspectorSizeControlledProps = { size: number | string; defaultSize?: never };\ntype InspectorSizeUncontrolledProps = { defaultSize?: number | string; size?: never };\ntype InspectorPublicProps = PaneBaseProps &\n (InspectorControlledProps | InspectorUncontrolledProps) &\n (InspectorSizeControlledProps | InspectorSizeUncontrolledProps) & {\n onSizeChange?: (size: number, meta: InspectorSizeChangeMeta) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n };\n\ntype InspectorComponent = React.ForwardRefExoticComponent<InspectorPublicProps & React.RefAttributes<HTMLDivElement>> & { Handle: typeof InspectorHandle };\n\nconst INSPECTOR_DOM_PROP_KEYS = [\n 'className',\n 'children',\n 'defaultOpen',\n 'open',\n 'onOpenChange',\n 'size',\n 'defaultSize',\n 'onSizeChange',\n 'sizeUpdate',\n 'sizeUpdateMs',\n 'style',\n 'inset',\n] as const satisfies readonly (keyof InspectorPublicProps)[];\n\nexport const Inspector = React.forwardRef<HTMLDivElement, InspectorPublicProps>((initialProps, ref) => {\n const {\n className,\n presentation = { initial: 'overlay', lg: 'fixed' },\n defaultOpen,\n open,\n onOpenChange,\n expandedSize = 320,\n minSize = 200,\n maxSize = 500,\n resizable = false,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n size,\n defaultSize,\n inset,\n } = initialProps;\n const inspectorDomProps = extractPaneDomProps(initialProps, INSPECTOR_DOM_PROP_KEYS);\n const { inspectorMode, setInspectorMode } = useInspectorMode();\n const { currentBreakpointReady } = usePresentation();\n const { peekTarget } = usePeek();\n const { togglePane } = useShellActions();\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useLayoutEffect(() => {\n if (inset) {\n registerInset('inspector');\n return () => unregisterInset('inspector');\n }\n }, [inset, registerInset, unregisterInset]);\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === InspectorHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === InspectorHandle));\n\n // Stable ref for onOpenChange to avoid effect dep churn\n const onOpenChangeRef = React.useRef(onOpenChange);\n const openRef = React.useRef(open);\n React.useLayoutEffect(() => {\n onOpenChangeRef.current = onOpenChange;\n openRef.current = open;\n });\n\n const normalizedControlledOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(open), [open]);\n const normalizedDefaultOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(defaultOpen), [defaultOpen]);\n const openIsResponsive = typeof open === 'object' && open !== null;\n const { resolvedControlled: resolvedInspectorControlled } = useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedControlledOpen,\n defaultValue: normalizedDefaultOpen,\n currentValue: inspectorMode,\n setValue: setInspectorMode,\n breakpointReady: currentBreakpointReady,\n controlledIsResponsive: openIsResponsive,\n onResponsiveChange: (next) => onOpenChangeRef.current?.(next === 'expanded', { reason: 'responsive' }),\n onInit: (initial) => {\n if (typeof openRef.current === 'undefined') {\n onOpenChangeRef.current?.(initial === 'expanded', { reason: 'init' });\n }\n },\n });\n\n // Ref for debounce cleanup\n const debounceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // Cleanup debounce timeout on unmount or when dependencies change\n React.useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = null;\n }\n };\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n // Throttled/debounced emitter for onSizeChange\n const emitSizeChange = React.useMemo(() => {\n const cb = onSizeChange as undefined | ((s: number, meta: InspectorSizeChangeMeta) => void);\n const strategy = sizeUpdate as undefined | 'throttle' | 'debounce';\n const ms = sizeUpdateMs ?? 50;\n if (!cb) return () => {};\n if (strategy === 'debounce') {\n return (s: number, meta: InspectorSizeChangeMeta) => {\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = setTimeout(() => {\n cb(s, meta);\n debounceTimeoutRef.current = null;\n }, ms);\n };\n }\n if (strategy === 'throttle') {\n let last = 0;\n return (s: number, meta: InspectorSizeChangeMeta) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n cb(s, meta);\n }\n };\n }\n return (s: number, meta: InspectorSizeChangeMeta) => cb(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Inspector: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n }\n\n // Warn on controlled/uncontrolled mode switch\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Inspector: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n // Emit mode changes. In controlled mode, skip when mode matches the controlled prop.\n const lastInspectorModeRef = React.useRef<PaneMode | null>(null);\n const lastResolvedInspectorControlledRef = React.useRef<PaneMode | undefined>(undefined);\n React.useEffect(() => {\n const prevInspectorMode = lastInspectorModeRef.current;\n const prevResolvedControlled = lastResolvedInspectorControlledRef.current;\n const controlledChanged = prevResolvedControlled !== resolvedInspectorControlled;\n\n if (prevInspectorMode !== null && prevInspectorMode !== inspectorMode) {\n const nextOpen = inspectorMode === 'expanded';\n const isControlled = typeof openRef.current !== 'undefined';\n const controlledTarget = resolvedInspectorControlled === undefined ? undefined : resolvedInspectorControlled === 'expanded';\n\n if (!isControlled || (!controlledChanged && nextOpen !== controlledTarget)) {\n onOpenChangeRef.current?.(nextOpen, { reason: 'toggle' });\n }\n }\n\n lastInspectorModeRef.current = inspectorMode;\n lastResolvedInspectorControlledRef.current = resolvedInspectorControlled;\n }, [inspectorMode, resolvedInspectorControlled]);\n\n // Track previous mode to only fire callbacks on actual user-initiated state transitions.\n // We wait for breakpointReady to ensure the initial state sync from useResponsiveInitialState\n // is complete before enabling callbacks. This avoids spurious callbacks during initialization.\n // Use callback refs to avoid re-running effect when inline callbacks change.\n const onExpandRef = React.useRef(onExpand);\n const onCollapseRef = React.useRef(onCollapse);\n React.useLayoutEffect(() => {\n onExpandRef.current = onExpand;\n onCollapseRef.current = onCollapse;\n });\n\n const prevInspectorModeRef = React.useRef<PaneMode | null>(null);\n const hasInitializedRef = React.useRef(false);\n React.useEffect(() => {\n const currentMode = inspectorMode;\n\n // Wait for breakpoint to be ready before enabling callbacks\n if (!currentBreakpointReady) {\n prevInspectorModeRef.current = currentMode;\n return;\n }\n\n // Skip the first run after breakpoint is ready - this captures the post-sync state\n if (!hasInitializedRef.current) {\n hasInitializedRef.current = true;\n prevInspectorModeRef.current = currentMode;\n return;\n }\n\n const prevMode = prevInspectorModeRef.current;\n\n // Only fire on actual state transitions\n if (prevMode !== null && prevMode !== currentMode) {\n if (currentMode === 'expanded') {\n onExpandRef.current?.();\n } else if (currentMode === 'collapsed') {\n onCollapseRef.current?.();\n }\n prevInspectorModeRef.current = currentMode;\n }\n }, [inspectorMode, currentBreakpointReady]);\n\n const isExpanded = inspectorMode === 'expanded';\n\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:inspector:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n try {\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Inspector: failed to load persisted size', err);\n }\n return undefined;\n }\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, String(size));\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Inspector: failed to save persisted size', err);\n }\n }\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n React.useEffect(() => {\n let mounted = true;\n if (!resizable || !persistenceAdapter?.load || isOverlay) return undefined;\n const loaded = persistenceAdapter.load();\n const applyLoaded = (value?: number) => {\n if (!mounted || typeof value !== 'number' || !localRef.current) return;\n localRef.current.style.setProperty('--inspector-size', `${value}px`);\n onResize?.(value);\n };\n if (loaded instanceof Promise) {\n loaded.then(applyLoaded).catch((err) => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Inspector: failed to load persisted size', err);\n }\n });\n } else {\n applyLoaded(loaded);\n }\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n const handleEl =\n resizable && !isOverlay && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--inspector-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'start',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n return startSize + (isRtl ? delta : -delta);\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'inspector',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => setInspectorMode('collapsed'),\n requestToggle: () => togglePane('inspector'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n // Normalize CSS lengths to px helper\n const normalizeSizeToPx = React.useCallback((value: number | string | undefined) => normalizeToPx(value, 'horizontal'), []);\n\n // Apply defaultSize on mount when uncontrolled\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeSizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--inspector-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync\n const controlledSize = size;\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof controlledSize === 'undefined') return;\n const px = normalizeSizeToPx(controlledSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--inspector-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [controlledSize, minSize, maxSize, normalizeSizeToPx, emitSizeChange]);\n\n if (isOverlay) {\n const open = inspectorMode === 'expanded';\n return (\n <Sheet.Root open={open} onOpenChange={(o) => setInspectorMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content side=\"end\" style={{ padding: 0 }} aria-label=\"Inspector\" aria-describedby={undefined} width={{ initial: `${expandedSize}px` }}>\n <VisuallyHidden>\n <Sheet.Title>Inspector</Sheet.Title>\n </VisuallyHidden>\n {contentChildren}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n // Strip control/size props from DOM spread\n return (\n <div\n {...inspectorDomProps}\n ref={setRef}\n className={classNames('rt-ShellInspector', className)}\n data-mode={inspectorMode}\n data-peek={peekTarget === 'inspector' || undefined}\n data-presentation={currentBreakpointReady ? resolvedPresentation : undefined}\n data-open={(currentBreakpointReady && isStacked && isExpanded) || undefined}\n data-inset={inset || undefined}\n style={{\n ...style,\n '--inspector-size': `${expandedSize}px`,\n '--inspector-min-size': `${minSize}px`,\n '--inspector-max-size': `${maxSize}px`,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellInspectorContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n}) as InspectorComponent;\n\nInspector.displayName = 'Shell.Inspector';\nInspector.Handle = InspectorHandle;\n", "'use client';\n\nimport * as React from 'react';\nimport { _BREAKPOINTS, type Breakpoint } from '../components/shell.types.js';\n\nconst QUERIES = Object.entries(_BREAKPOINTS) as Array<[Breakpoint, string]>;\n\ntype Listener = () => void;\n\n/**\n * One set of `MediaQueryList`s and one set of listeners for the whole\n * application. Every component that asks for the breakpoint used to create and\n * subscribe to its own copy of all five queries.\n */\nlet mediaQueryLists: Array<[Breakpoint, MediaQueryList]> | null = null;\nconst listeners = new Set<Listener>();\nlet cachedBreakpoint: Breakpoint | null = null;\n\nfunction getMediaQueryLists() {\n mediaQueryLists ??= QUERIES.map(([name, query]) => [name, window.matchMedia(query)] as [Breakpoint, MediaQueryList]);\n return mediaQueryLists;\n}\n\nfunction computeBreakpoint(): Breakpoint {\n // The largest matching query wins; `_BREAKPOINTS` is ordered smallest first.\n let matched: Breakpoint = 'initial';\n for (const [name, mql] of getMediaQueryLists()) {\n if (mql.matches) matched = name;\n }\n return matched;\n}\n\nfunction handleChange() {\n const next = computeBreakpoint();\n if (next === cachedBreakpoint) return;\n cachedBreakpoint = next;\n listeners.forEach((listener) => listener());\n}\n\nfunction subscribe(listener: Listener) {\n if (typeof window === 'undefined') return () => {};\n\n if (listeners.size === 0) {\n cachedBreakpoint = computeBreakpoint();\n for (const [, mql] of getMediaQueryLists()) {\n // Safari below 14 only has the deprecated listener API.\n if (typeof mql.addEventListener === 'function') mql.addEventListener('change', handleChange);\n else mql.addListener?.(handleChange);\n }\n }\n\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n if (listeners.size > 0) return;\n\n for (const [, mql] of getMediaQueryLists()) {\n try {\n if (typeof mql.removeEventListener === 'function') mql.removeEventListener('change', handleChange);\n else mql.removeListener?.(handleChange);\n } catch (error) {\n // Removal can throw in edge cases, e.g. the list was already torn down.\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[useBreakpoint] MediaQueryList cleanup warning:', error);\n }\n }\n }\n cachedBreakpoint = null;\n };\n}\n\n/**\n * `getSnapshot` must return a referentially stable value between changes, so it\n * reads the cache that `handleChange` maintains rather than recomputing.\n */\nfunction getSnapshot(): Breakpoint {\n if (typeof window === 'undefined') return 'initial';\n cachedBreakpoint ??= computeBreakpoint();\n return cachedBreakpoint;\n}\n\nfunction getServerSnapshot(): Breakpoint {\n return 'initial';\n}\n\nconst getReadySnapshot = () => true;\nconst getReadyServerSnapshot = () => false;\n\n/**\n * The current breakpoint, and whether it has been resolved against a real\n * viewport yet (`false` on the server and during hydration).\n *\n * Reads through `useSyncExternalStore` rather than settling into state from an\n * effect. On a client render the very first pass already has the real\n * breakpoint, instead of rendering the whole shell at `initial` and correcting\n * it after the browser has painted.\n */\nexport function useBreakpoint(): { breakpoint: Breakpoint; ready: boolean } {\n const breakpoint = React.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n const ready = React.useSyncExternalStore(subscribe, getReadySnapshot, getReadyServerSnapshot);\n\n return React.useMemo(() => ({ breakpoint, ready }), [breakpoint, ready]);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["shell_exports", "__export", "Bottom", "Content", "Header", "Inspector", "Left", "Panel", "Rail", "Root", "Sidebar", "Trigger", "useResponsivePresentation", "useShell", "useSidebarMode", "__toCommonJS", "React", "import_classnames", "React", "import_classnames", "import_radix_ui", "asChildPropDef", "widthPropDefs", "heightPropDefs", "contentSizes", "panelBackgrounds", "materials", "dialogContentPropDefs", "asChildPropDef", "widthPropDefs", "heightPropDefs", "React", "import_classnames", "import_radix_ui", "import_internal", "getMatchingGrayColor", "accentColor", "React", "usePropSyncedState", "propValue", "value", "setValue", "previousPropValue", "setPreviousPropValue", "React", "PANEL_BACKGROUND_MESSAGE", "warned", "warnOnce", "message", "useDeprecatedPanelBackgroundWarning", "panelBackground", "accentColors", "grayColors", "colorPropDef", "radii", "appearances", "panelBackgrounds", "materials", "scalings", "fontFamilies", "themePropDefs", "asChildPropDef", "accentColors", "grayColors", "radii", "noop", "defaultThemeContext", "themePropDefs", "ThemeContext", "Theme", "props", "forwardedRef", "ThemeContext", "TooltipPrimitive", "ThemeRoot", "ThemeImpl", "appearanceProp", "themePropDefs", "accentColorProp", "grayColorProp", "materialProp", "panelBackgroundProp", "radiusProp", "scalingProp", "fontFamilyProp", "hasBackground", "rootProps", "useDeprecatedPanelBackgroundWarning", "appearance", "setAppearance", "usePropSyncedState", "accentColor", "setAccentColor", "grayColor", "setGrayColor", "effectiveMaterial", "material", "setMaterial", "panelBackground", "setPanelBackground", "radius", "setRadius", "scaling", "setScaling", "fontFamily", "setFontFamily", "getClientOS", "ua", "context", "asChild", "isRoot", "hasBackgroundProp", "onAppearanceChange", "noop", "onAccentColorChange", "onGrayColorChange", "onMaterialChange", "onPanelBackgroundChange", "onRadiusChange", "onScalingChange", "onFontFamilyChange", "themeProps", "Comp", "resolvedGrayColor", "getMatchingGrayColor", "isExplicitAppearance", "rootRef", "composedRef", "hasExplicitOS", "node", "os", "classNames", "React", "import_radix_ui", "highContrastPropDef", "leadingTrimValues", "leadingTrimPropDef", "textAlignValues", "textAlignPropDef", "textWrapValues", "textWrapPropDef", "truncatePropDef", "fontFamilies", "fontFamilyPropDef", "weights", "weightPropDef", "as", "sizes", "headingPropDefs", "asChildPropDef", "fontFamilyPropDef", "weightPropDef", "textAlignPropDef", "leadingTrimPropDef", "truncatePropDef", "textWrapPropDef", "colorPropDef", "highContrastPropDef", "import_classnames", "EMPTY_VALUES", "EMPTY_SET", "compile", "propDefs", "merged", "styling", "passthrough", "stylingKeys", "key", "def", "values", "compiled", "cacheRoot", "getCompiledPropDefs", "node", "i", "propDef", "child", "breakpoints", "breakpointSet", "hasOwnProperty", "obj", "key", "breakpointSet", "isResponsiveObject", "obj", "key", "includesValue", "propValues", "propValueSet", "value", "getResponsiveStyles", "className", "customProperties", "args", "responsiveClassNames", "getResponsiveClassNames", "responsiveCustomProperties", "getResponsiveCustomProperties", "allowArbitraryValues", "parseValue", "getBaseClassName", "isResponsiveObject", "object", "classNames", "bp", "hasOwnProperty", "breakpointSet", "baseClassName", "bpClassName", "delimiter", "matchedValue", "isNegative", "minus", "absoluteValue", "styles", "parsed", "customProperty", "bpProperty", "mergeStyles", "styles", "result", "style", "normalizeResponsiveValue", "value", "propDef", "initial", "changed", "extractProps", "props", "propDefs", "styling", "passthrough", "stylingKeys", "getCompiledPropDefs", "extractedProps", "key", "i", "isResponsiveObject", "style", "classes", "propClassName", "getResponsiveClassNames", "propClassNames", "propCustomProperties", "getResponsiveStyles", "mergeStyles", "classNames", "marginValues", "marginPropDefs", "mergedPropDefs", "headingPropDefs", "marginPropDefs", "Heading", "props", "forwardedRef", "children", "className", "asChild", "Tag", "color", "headingProps", "extractProps", "combinedClassName", "React", "import_radix_ui", "as", "sizes", "textPropDefs", "asChildPropDef", "fontFamilyPropDef", "weightPropDef", "textAlignPropDef", "leadingTrimPropDef", "truncatePropDef", "textWrapPropDef", "colorPropDef", "highContrastPropDef", "mergedPropDefs", "textPropDefs", "marginPropDefs", "Text", "props", "forwardedRef", "children", "className", "asChild", "Tag", "color", "textProps", "extractProps", "combinedClassName", "React", "requireReactElement", "children", "child", "React", "cleanupInstalled", "useBodyPointerEventsCleanup", "pending", "defer", "fn", "delay", "id", "hasOpenModal", "hasDialogs", "hasRadixOverlays", "forceCleanup", "safeCleanup", "onDocumentClick", "event", "target", "onEscapeKey", "onInteraction", "observer", "intervalId", "Root", "props", "DialogPrimitive", "Trigger", "children", "ref", "requireReactElement", "_alignPropDef", "panelBackgroundPropDef", "materialPropDef", "dialogPropDefsForSheet", "dialogContentPropDefs", "materialPropDefs", "_mwDefault", "maxWidthWithoutDefault", "sheetPropDefs", "Content", "allProps", "forwardedRef", "side", "forceMount", "container", "className", "panelBackgroundProp", "materialProp", "restProps", "normalizedSide", "resolvedPanelBackground", "resolvedMaterial", "extractProps", "useDeprecatedPanelBackgroundWarning", "materialValue", "extractedClassName", "contentProps", "contentRef", "combinedRef", "node", "useBodyPointerEventsCleanup", "content", "focusableElements", "firstElement", "lastElement", "handleKeyDown", "event", "Theme", "classNames", "Title", "size", "weight", "Heading", "Description", "color", "rest", "Text", "Close", "import_radix_ui", "VisuallyHidden", "VisuallyHiddenPrimitive", "Root", "React", "_BREAKPOINTS", "React", "ShellContext", "useShell", "ctx", "ShellProvider", "value", "children", "LeftModeContext", "useLeftMode", "PanelModeContext", "usePanelMode", "SidebarModeContext", "useSidebarMode", "InspectorModeContext", "useInspectorMode", "BottomModeContext", "useBottomMode", "PresentationContext", "usePresentation", "PeekContext", "usePeek", "ActionsContext", "useShellActions", "CompositionContext", "useComposition", "InsetContext", "useInset", "useResponsivePresentation", "presentation", "currentBreakpoint", "useShell", "order", "_BREAKPOINTS", "startIdx", "i", "bp", "useResponsiveValue", "value", "map", "useResponsiveInitialState", "controlledValue", "defaultValue", "currentValue", "setValue", "breakpointReady", "onInit", "onResponsiveChange", "controlledIsResponsive", "resolvedControlled", "resolvedDefault", "lastControlledRef", "pendingSyncRef", "latestControlledRef", "latestValueRef", "setValueRef", "controlledChanged", "latestControlled", "latestValue", "didInitRef", "React", "PaneResizeContext", "usePaneResize", "ctx", "React", "import_classnames", "PaneHandle", "className", "children", "props", "ref", "containerRef", "cssVarName", "minSize", "maxSize", "defaultSize", "orientation", "edge", "computeNext", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "collapsible", "target", "requestCollapse", "requestToggle", "usePaneResize", "activeCleanupRef", "ariaOrientation", "ariaLabel", "classNames", "e", "container", "handleEl", "pointerId", "startClient", "startSize", "clamp", "v", "body", "prevCursor", "prevUserSelect", "lastHandledMove", "seenPointerEvent", "shouldHandle", "ev", "pointerType", "handleMove", "client", "next", "cleanup", "handleUp", "handleKey", "finished", "finalSize", "snapped", "nearest", "acc", "p", "kev", "rawCurrent", "parsedCurrent", "current", "step", "delta", "docDir", "cssDir", "hasRtlAncestor", "isRtl", "signedDelta", "PanelHandle", "SidebarHandle", "InspectorHandle", "BottomHandle", "omitPaneProps", "source", "keys", "omitSet", "result", "key", "PANE_BASE_INTERNAL_PROPS", "extractPaneDomProps", "extraKeys", "omitKeys", "mapResponsiveBooleanToPaneMode", "value", "mapped", "bp", "val", "React", "import_classnames", "normalizeToPx", "value", "orientation", "str", "rem", "pct", "base", "n", "SIDEBAR_DOM_PROP_KEYS", "Sidebar", "initialProps", "ref", "className", "presentation", "expandedSize", "minSize", "maxSize", "resizable", "collapsible", "onExpand", "onCollapse", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "children", "style", "thinSize", "toggleModes", "state", "defaultState", "onStateChange", "size", "defaultSize", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "inset", "sidebarDomProps", "extractPaneDomProps", "sidebarMode", "setSidebarMode", "useSidebarMode", "currentBreakpointReady", "usePresentation", "peekTarget", "usePeek", "togglePane", "setSidebarToggleComputer", "useShellActions", "setHasSidebar", "useComposition", "registerInset", "unregisterInset", "useInset", "resolvedPresentation", "useResponsivePresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "childArray", "handleChildren", "el", "SidebarHandle", "contentChildren", "debounceTimeoutRef", "emitSizeChange", "cb", "strategy", "ms", "s", "meta", "last", "now", "sidebarId", "wasControlledRef", "isControlled", "onStateChangeRef", "stateRef", "stateIsResponsive", "resolvedSidebarControlled", "resolvedSidebarDefault", "useResponsiveInitialState", "next", "initial", "lastNotifyModeRef", "lastResolvedSidebarControlledRef", "current", "prevMode", "controlledChanged", "onExpandRef", "onCollapseRef", "prevSidebarModeRef", "hasInitializedRef", "currentMode", "isContentVisible", "persistenceAdapter", "key", "v", "mounted", "loaded", "resolveDefaultSidebarMode", "resolved", "target", "cur", "lastOverlayWidthRef", "lastOverlayModeRef", "handleEl", "PaneResizeContext", "client", "startClient", "startSize", "isRtl", "delta", "i", "PaneHandle", "normalizeSizeToPx", "value", "normalizeToPx", "px", "clamped", "controlledSize", "peekStyles", "open", "Root", "o", "Content", "VisuallyHidden", "Title", "classNames", "React", "import_classnames", "BOTTOM_DOM_PROP_KEYS", "Bottom", "initialProps", "ref", "className", "presentation", "defaultOpen", "open", "onOpenChange", "expandedSize", "minSize", "maxSize", "resizable", "collapsible", "onExpand", "onCollapse", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "children", "style", "size", "defaultSize", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "inset", "bottomDomProps", "extractPaneDomProps", "bottomMode", "setBottomMode", "useBottomMode", "currentBreakpointReady", "usePresentation", "peekTarget", "usePeek", "togglePane", "useShellActions", "registerInset", "unregisterInset", "useInset", "resolvedPresentation", "useResponsivePresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "childArray", "handleChildren", "el", "BottomHandle", "contentChildren", "onOpenChangeRef", "openRef", "normalizedControlledOpen", "mapResponsiveBooleanToPaneMode", "normalizedDefaultOpen", "openIsResponsive", "resolvedBottomControlled", "useResponsiveInitialState", "next", "initial", "debounceTimeoutRef", "emitSizeChange", "cb", "strategy", "ms", "s", "meta", "last", "now", "wasControlledRef", "isControlled", "lastBottomModeRef", "lastResolvedBottomControlledRef", "prevMode", "controlledChanged", "nextOpen", "onExpandRef", "onCollapseRef", "prevBottomModeRef", "hasInitializedRef", "currentMode", "isExpanded", "persistenceAdapter", "key", "v", "mounted", "loaded", "applyLoaded", "value", "err", "handleEl", "PaneResizeContext", "client", "startClient", "startSize", "delta", "i", "PaneHandle", "normalizeSizeToPx", "normalizeToPx", "px", "clamped", "controlledSize", "Root", "o", "Content", "VisuallyHidden", "Title", "classNames", "React", "import_classnames", "INSPECTOR_DOM_PROP_KEYS", "Inspector", "initialProps", "ref", "className", "presentation", "defaultOpen", "open", "onOpenChange", "expandedSize", "minSize", "maxSize", "resizable", "collapsible", "onExpand", "onCollapse", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "children", "style", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "size", "defaultSize", "inset", "inspectorDomProps", "extractPaneDomProps", "inspectorMode", "setInspectorMode", "useInspectorMode", "currentBreakpointReady", "usePresentation", "peekTarget", "usePeek", "togglePane", "useShellActions", "registerInset", "unregisterInset", "useInset", "resolvedPresentation", "useResponsivePresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "childArray", "handleChildren", "el", "InspectorHandle", "contentChildren", "onOpenChangeRef", "openRef", "normalizedControlledOpen", "mapResponsiveBooleanToPaneMode", "normalizedDefaultOpen", "openIsResponsive", "resolvedInspectorControlled", "useResponsiveInitialState", "next", "initial", "debounceTimeoutRef", "emitSizeChange", "cb", "strategy", "ms", "s", "meta", "last", "now", "wasControlledRef", "isControlled", "lastInspectorModeRef", "lastResolvedInspectorControlledRef", "prevInspectorMode", "controlledChanged", "nextOpen", "onExpandRef", "onCollapseRef", "prevInspectorModeRef", "hasInitializedRef", "currentMode", "prevMode", "isExpanded", "persistenceAdapter", "key", "v", "mounted", "loaded", "applyLoaded", "value", "err", "handleEl", "PaneResizeContext", "client", "startClient", "startSize", "isRtl", "delta", "i", "PaneHandle", "normalizeSizeToPx", "normalizeToPx", "px", "clamped", "controlledSize", "Root", "o", "Content", "VisuallyHidden", "Title", "classNames", "React", "QUERIES", "_BREAKPOINTS", "mediaQueryLists", "listeners", "cachedBreakpoint", "getMediaQueryLists", "name", "query", "computeBreakpoint", "matched", "mql", "handleChange", "next", "listener", "subscribe", "getSnapshot", "getServerSnapshot", "getReadySnapshot", "getReadyServerSnapshot", "useBreakpoint", "breakpoint", "ready", "SHELL_SLOT", "assignShellSlot", "component", "slot", "isShellComponentType", "el", "comp", "Sidebar", "Inspector", "Bottom", "paneReducer", "state", "action", "next", "pickResponsive", "map", "breakpoint", "order", "_BREAKPOINTS", "readPaneStateFromChildren", "initialChildren", "childArray", "hasPanelDefaultOpen", "railEl", "railDefaultOpen", "hasRailDefaultOpen", "hasInspectorDefaultOpen", "hasInspectorOpenControlled", "hasPanelOpenControlled", "openProp", "getSidebarInitialState", "sidebarEl", "sidebarProps", "getBottomInitialState", "bottomEl", "bottomProps", "Root", "className", "children", "height", "props", "ref", "currentBreakpoint", "currentBreakpointReady", "useBreakpoint", "hasPanelDefaultOpenRef", "paneState", "dispatchPane", "modes", "setLeftMode", "mode", "setPanelMode", "setSidebarMode", "setInspectorMode", "setBottomMode", "hasLeft", "setHasLeft", "hasSidebar", "setHasSidebar", "sidebarToggleComputerRef", "current", "setSidebarToggleComputer", "fn", "devLeftPres", "setDevLeftPres", "onLeftPres", "p", "railDefaultSizeRef", "panelDefaultSizeRef", "onRailDefaults", "size", "onPanelDefaults", "hasLeftChildren", "Rail", "Panel", "hasSidebarChildren", "enteredFamilyRef", "leftEntered", "sidebarEntered", "sidebarModeRef", "togglePane", "target", "expandPane", "collapsePane", "baseContextValue", "headerEls", "railEls", "panelEls", "sidebarEls", "contentEls", "inspectorEls", "bottomEls", "result", "Header", "Content", "firstRailOpen", "resolvedFirstRailOpen", "responsive", "fallbackOrder", "startIdx", "i", "bp", "firstPanelOpen", "resolvedFirstPanelOpen", "controlSeqRef", "lastRailChangeRef", "lastPanelChangeRef", "lastRailOpenRef", "lastPanelOpenRef", "railOnOpenChange", "panelOnOpenChange", "lastConflictRef", "panelWins", "lastConflict", "leftControlledOpen", "heightStyle", "peekTarget", "setPeekTarget", "peekPane", "clearPeek", "presentationCtxValue", "leftModeCtxValue", "panelModeCtxValue", "sidebarModeCtxValue", "inspectorModeCtxValue", "bottomModeCtxValue", "compositionCtxValue", "insetPanes", "setInsetPanes", "registerInset", "id", "prev", "unregisterInset", "hasAnyInset", "insetCtxValue", "peekCtxValue", "actionsCtxValue", "shellContextValue", "leftContent", "firstRail", "firstPanel", "leftInset", "passthroughProps", "Left", "classNames", "ShellProvider", "PresentationContext", "LeftModeContext", "PanelModeContext", "SidebarModeContext", "InspectorModeContext", "BottomModeContext", "CompositionContext", "PeekContext", "ActionsContext", "InsetContext", "style", "LEFT_DOM_OMIT_PROPS", "initialProps", "presentation", "_collapsible", "onExpand", "onCollapse", "inset", "restProps", "useInset", "propsOpen", "propsDefaultOpen", "propsOnOpenChange", "domProps", "omitPaneProps", "shell", "useShell", "resolvedPresentation", "useResponsivePresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "lastLeftModeRef", "lastResolvedLeftControlledRef", "normalizedLeftControlled", "normalizedLeftDefault", "mapResponsiveBooleanToPaneMode", "propsOnOpenChangeRef", "propsOpenRef", "resolvedLeftControlled", "useResponsiveInitialState", "initial", "prevPanelModeRef", "prevLeftMode", "prevPanelMode", "controlledChanged", "isControlled", "controlledTarget", "nextOpen", "reason", "onExpandRef", "onCollapseRef", "prevLeftModeForCallbackRef", "hasLeftInitializedRef", "currentMode", "prevMode", "_isExpanded", "open", "panelEl", "railSize", "panelSize", "hasRail", "hasPanel", "overlayPx", "o", "VisuallyHidden", "Title", "_railSize", "_panelSize", "_hasRail", "_includePanel", "expandedSize", "collapsible", "defaultOpen", "onOpenChange", "_inset", "wasControlledRef", "isExpanded", "PANEL_DOM_PROP_KEYS", "defaultSize", "minSize", "maxSize", "resizable", "_onExpand", "_onCollapse", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "panelDomProps", "extractPaneDomProps", "debounceTimeoutRef", "emitSizeChange", "s", "meta", "last", "now", "prevLeftModeRef", "lastResolvedPanelControlledRef", "normalizedControlledOpen", "normalizedDefaultOpen", "openIsResponsive", "onOpenChangeRef", "resolvedPanelControlled", "handleChildren", "PanelHandle", "contentChildren", "normalizeSizeToPx", "value", "normalizeToPx", "persistenceAdapter", "key", "v", "mounted", "loaded", "px", "clamped", "leftEl", "prevPanel", "prevLeft", "handleEl", "PaneResizeContext", "client", "startClient", "startSize", "isRtl", "delta", "PaneHandle", "Trigger", "peekOnHover", "onClick", "onMouseEnter", "onMouseLeave", "leftMode", "useLeftMode", "panelMode", "usePanelMode", "sidebarMode", "useSidebarMode", "inspectorMode", "useInspectorMode", "bottomMode", "useBottomMode", "usePeek", "useShellActions", "handleClick", "event", "isCollapsed", "handleMouseEnter", "handleMouseLeave"]
7
7
  }