@forgeax/view 0.2.1-beta-20260924075842

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 (585) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +742 -0
  3. package/dist/modules/backend.mjs +54 -0
  4. package/dist/modules/backend.mjs.map +7 -0
  5. package/dist/modules/browser.mjs +180 -0
  6. package/dist/modules/browser.mjs.map +7 -0
  7. package/dist/modules/carrier-contract.mjs +38 -0
  8. package/dist/modules/carrier-contract.mjs.map +7 -0
  9. package/dist/modules/carrier.mjs +13 -0
  10. package/dist/modules/carrier.mjs.map +7 -0
  11. package/dist/modules/chunks/chunk-2ASWB6IX.mjs +225 -0
  12. package/dist/modules/chunks/chunk-2ASWB6IX.mjs.map +7 -0
  13. package/dist/modules/chunks/chunk-2IJKOG2F.mjs +801 -0
  14. package/dist/modules/chunks/chunk-2IJKOG2F.mjs.map +7 -0
  15. package/dist/modules/chunks/chunk-2K3BBJ5S.mjs +9 -0
  16. package/dist/modules/chunks/chunk-2K3BBJ5S.mjs.map +7 -0
  17. package/dist/modules/chunks/chunk-32GD5LL6.mjs +482 -0
  18. package/dist/modules/chunks/chunk-32GD5LL6.mjs.map +7 -0
  19. package/dist/modules/chunks/chunk-3B4KFAEC.mjs +10 -0
  20. package/dist/modules/chunks/chunk-3B4KFAEC.mjs.map +7 -0
  21. package/dist/modules/chunks/chunk-46O5WX43.mjs +25 -0
  22. package/dist/modules/chunks/chunk-46O5WX43.mjs.map +7 -0
  23. package/dist/modules/chunks/chunk-47J5JXAB.mjs +237 -0
  24. package/dist/modules/chunks/chunk-47J5JXAB.mjs.map +7 -0
  25. package/dist/modules/chunks/chunk-4BXQOUDQ.mjs +17 -0
  26. package/dist/modules/chunks/chunk-4BXQOUDQ.mjs.map +7 -0
  27. package/dist/modules/chunks/chunk-4GQWYU2V.mjs +126 -0
  28. package/dist/modules/chunks/chunk-4GQWYU2V.mjs.map +7 -0
  29. package/dist/modules/chunks/chunk-4N5X2PRQ.mjs +48 -0
  30. package/dist/modules/chunks/chunk-4N5X2PRQ.mjs.map +7 -0
  31. package/dist/modules/chunks/chunk-4WXD2KYX.mjs +56 -0
  32. package/dist/modules/chunks/chunk-4WXD2KYX.mjs.map +7 -0
  33. package/dist/modules/chunks/chunk-6ZWWVAZK.mjs +468 -0
  34. package/dist/modules/chunks/chunk-6ZWWVAZK.mjs.map +7 -0
  35. package/dist/modules/chunks/chunk-73UZNRHN.mjs +296 -0
  36. package/dist/modules/chunks/chunk-73UZNRHN.mjs.map +7 -0
  37. package/dist/modules/chunks/chunk-7ITLCRND.mjs +10 -0
  38. package/dist/modules/chunks/chunk-7ITLCRND.mjs.map +7 -0
  39. package/dist/modules/chunks/chunk-7TGVWKH7.mjs +59 -0
  40. package/dist/modules/chunks/chunk-7TGVWKH7.mjs.map +7 -0
  41. package/dist/modules/chunks/chunk-7URFF53W.mjs +42 -0
  42. package/dist/modules/chunks/chunk-7URFF53W.mjs.map +7 -0
  43. package/dist/modules/chunks/chunk-7YSDRIFN.mjs +14 -0
  44. package/dist/modules/chunks/chunk-7YSDRIFN.mjs.map +7 -0
  45. package/dist/modules/chunks/chunk-AAFVCQPK.mjs +52 -0
  46. package/dist/modules/chunks/chunk-AAFVCQPK.mjs.map +7 -0
  47. package/dist/modules/chunks/chunk-AEK7ZESQ.mjs +18 -0
  48. package/dist/modules/chunks/chunk-AEK7ZESQ.mjs.map +7 -0
  49. package/dist/modules/chunks/chunk-AL6ZWIEU.mjs +42 -0
  50. package/dist/modules/chunks/chunk-AL6ZWIEU.mjs.map +7 -0
  51. package/dist/modules/chunks/chunk-ALT7XVMQ.mjs +73 -0
  52. package/dist/modules/chunks/chunk-ALT7XVMQ.mjs.map +7 -0
  53. package/dist/modules/chunks/chunk-ASI2HBE6.mjs +116 -0
  54. package/dist/modules/chunks/chunk-ASI2HBE6.mjs.map +7 -0
  55. package/dist/modules/chunks/chunk-ATWGCH7I.mjs +174 -0
  56. package/dist/modules/chunks/chunk-ATWGCH7I.mjs.map +7 -0
  57. package/dist/modules/chunks/chunk-C45U6IIY.mjs +692 -0
  58. package/dist/modules/chunks/chunk-C45U6IIY.mjs.map +7 -0
  59. package/dist/modules/chunks/chunk-C7R3YRA7.mjs +98 -0
  60. package/dist/modules/chunks/chunk-C7R3YRA7.mjs.map +7 -0
  61. package/dist/modules/chunks/chunk-CRMICXKN.mjs +87 -0
  62. package/dist/modules/chunks/chunk-CRMICXKN.mjs.map +7 -0
  63. package/dist/modules/chunks/chunk-CUH2G6UF.mjs +81 -0
  64. package/dist/modules/chunks/chunk-CUH2G6UF.mjs.map +7 -0
  65. package/dist/modules/chunks/chunk-D7GWRZLL.mjs +77 -0
  66. package/dist/modules/chunks/chunk-D7GWRZLL.mjs.map +7 -0
  67. package/dist/modules/chunks/chunk-DBWUIBE3.mjs +10 -0
  68. package/dist/modules/chunks/chunk-DBWUIBE3.mjs.map +7 -0
  69. package/dist/modules/chunks/chunk-DQWVWWUU.mjs +77 -0
  70. package/dist/modules/chunks/chunk-DQWVWWUU.mjs.map +7 -0
  71. package/dist/modules/chunks/chunk-DZZ2WFEU.mjs +122 -0
  72. package/dist/modules/chunks/chunk-DZZ2WFEU.mjs.map +7 -0
  73. package/dist/modules/chunks/chunk-E4UIAN26.mjs +58 -0
  74. package/dist/modules/chunks/chunk-E4UIAN26.mjs.map +7 -0
  75. package/dist/modules/chunks/chunk-EJGBVKFE.mjs +77 -0
  76. package/dist/modules/chunks/chunk-EJGBVKFE.mjs.map +7 -0
  77. package/dist/modules/chunks/chunk-EPSTTHWV.mjs +173 -0
  78. package/dist/modules/chunks/chunk-EPSTTHWV.mjs.map +7 -0
  79. package/dist/modules/chunks/chunk-ER7T6QJ3.mjs +64 -0
  80. package/dist/modules/chunks/chunk-ER7T6QJ3.mjs.map +7 -0
  81. package/dist/modules/chunks/chunk-FD4BAJ6K.mjs +389 -0
  82. package/dist/modules/chunks/chunk-FD4BAJ6K.mjs.map +7 -0
  83. package/dist/modules/chunks/chunk-FJM6WWIY.mjs +80 -0
  84. package/dist/modules/chunks/chunk-FJM6WWIY.mjs.map +7 -0
  85. package/dist/modules/chunks/chunk-FKCQYDLX.mjs +162 -0
  86. package/dist/modules/chunks/chunk-FKCQYDLX.mjs.map +7 -0
  87. package/dist/modules/chunks/chunk-FLGC65SR.mjs +10 -0
  88. package/dist/modules/chunks/chunk-FLGC65SR.mjs.map +7 -0
  89. package/dist/modules/chunks/chunk-FMCACPX5.mjs +289 -0
  90. package/dist/modules/chunks/chunk-FMCACPX5.mjs.map +7 -0
  91. package/dist/modules/chunks/chunk-FOBRLUQV.mjs +51 -0
  92. package/dist/modules/chunks/chunk-FOBRLUQV.mjs.map +7 -0
  93. package/dist/modules/chunks/chunk-FV3DSKZB.mjs +33 -0
  94. package/dist/modules/chunks/chunk-FV3DSKZB.mjs.map +7 -0
  95. package/dist/modules/chunks/chunk-G7BAFAGO.mjs +98 -0
  96. package/dist/modules/chunks/chunk-G7BAFAGO.mjs.map +7 -0
  97. package/dist/modules/chunks/chunk-GQBZMCTK.mjs +145 -0
  98. package/dist/modules/chunks/chunk-GQBZMCTK.mjs.map +7 -0
  99. package/dist/modules/chunks/chunk-GYWIY7AL.mjs +131 -0
  100. package/dist/modules/chunks/chunk-GYWIY7AL.mjs.map +7 -0
  101. package/dist/modules/chunks/chunk-H3KNBALD.mjs +256 -0
  102. package/dist/modules/chunks/chunk-H3KNBALD.mjs.map +7 -0
  103. package/dist/modules/chunks/chunk-H3M22JDL.mjs +144 -0
  104. package/dist/modules/chunks/chunk-H3M22JDL.mjs.map +7 -0
  105. package/dist/modules/chunks/chunk-HES3DNTM.mjs +40 -0
  106. package/dist/modules/chunks/chunk-HES3DNTM.mjs.map +7 -0
  107. package/dist/modules/chunks/chunk-I5BFP7SS.mjs +2392 -0
  108. package/dist/modules/chunks/chunk-I5BFP7SS.mjs.map +7 -0
  109. package/dist/modules/chunks/chunk-IGRMZYRD.mjs +15 -0
  110. package/dist/modules/chunks/chunk-IGRMZYRD.mjs.map +7 -0
  111. package/dist/modules/chunks/chunk-IKNGC766.mjs +321 -0
  112. package/dist/modules/chunks/chunk-IKNGC766.mjs.map +7 -0
  113. package/dist/modules/chunks/chunk-IVHNYKZB.mjs +35 -0
  114. package/dist/modules/chunks/chunk-IVHNYKZB.mjs.map +7 -0
  115. package/dist/modules/chunks/chunk-JHOURMYW.mjs +101 -0
  116. package/dist/modules/chunks/chunk-JHOURMYW.mjs.map +7 -0
  117. package/dist/modules/chunks/chunk-JURXMRFA.mjs +282 -0
  118. package/dist/modules/chunks/chunk-JURXMRFA.mjs.map +7 -0
  119. package/dist/modules/chunks/chunk-JWZIREC3.mjs +18 -0
  120. package/dist/modules/chunks/chunk-JWZIREC3.mjs.map +7 -0
  121. package/dist/modules/chunks/chunk-KHRTIZ56.mjs +1400 -0
  122. package/dist/modules/chunks/chunk-KHRTIZ56.mjs.map +7 -0
  123. package/dist/modules/chunks/chunk-KLJZZ23J.mjs +102 -0
  124. package/dist/modules/chunks/chunk-KLJZZ23J.mjs.map +7 -0
  125. package/dist/modules/chunks/chunk-KNBAYU5I.mjs +49 -0
  126. package/dist/modules/chunks/chunk-KNBAYU5I.mjs.map +7 -0
  127. package/dist/modules/chunks/chunk-KSZNCFU4.mjs +125 -0
  128. package/dist/modules/chunks/chunk-KSZNCFU4.mjs.map +7 -0
  129. package/dist/modules/chunks/chunk-L45W6KM6.mjs +158 -0
  130. package/dist/modules/chunks/chunk-L45W6KM6.mjs.map +7 -0
  131. package/dist/modules/chunks/chunk-LERMYZRC.mjs +239 -0
  132. package/dist/modules/chunks/chunk-LERMYZRC.mjs.map +7 -0
  133. package/dist/modules/chunks/chunk-LKJCXYSJ.mjs +91 -0
  134. package/dist/modules/chunks/chunk-LKJCXYSJ.mjs.map +7 -0
  135. package/dist/modules/chunks/chunk-MBS3EICT.mjs +25 -0
  136. package/dist/modules/chunks/chunk-MBS3EICT.mjs.map +7 -0
  137. package/dist/modules/chunks/chunk-MUOQZPVH.mjs +609 -0
  138. package/dist/modules/chunks/chunk-MUOQZPVH.mjs.map +7 -0
  139. package/dist/modules/chunks/chunk-MVEPGFSB.mjs +1 -0
  140. package/dist/modules/chunks/chunk-MVEPGFSB.mjs.map +7 -0
  141. package/dist/modules/chunks/chunk-NBJKLWJ5.mjs +42 -0
  142. package/dist/modules/chunks/chunk-NBJKLWJ5.mjs.map +7 -0
  143. package/dist/modules/chunks/chunk-NBLGKTEM.mjs +86 -0
  144. package/dist/modules/chunks/chunk-NBLGKTEM.mjs.map +7 -0
  145. package/dist/modules/chunks/chunk-NI7CS3I2.mjs +110 -0
  146. package/dist/modules/chunks/chunk-NI7CS3I2.mjs.map +7 -0
  147. package/dist/modules/chunks/chunk-NJH2OJFC.mjs +2113 -0
  148. package/dist/modules/chunks/chunk-NJH2OJFC.mjs.map +7 -0
  149. package/dist/modules/chunks/chunk-OBK4LIJB.mjs +20 -0
  150. package/dist/modules/chunks/chunk-OBK4LIJB.mjs.map +7 -0
  151. package/dist/modules/chunks/chunk-PEUT3FW7.mjs +1 -0
  152. package/dist/modules/chunks/chunk-PEUT3FW7.mjs.map +7 -0
  153. package/dist/modules/chunks/chunk-PRZOWPDN.mjs +66 -0
  154. package/dist/modules/chunks/chunk-PRZOWPDN.mjs.map +7 -0
  155. package/dist/modules/chunks/chunk-Q4RXBGQS.mjs +55 -0
  156. package/dist/modules/chunks/chunk-Q4RXBGQS.mjs.map +7 -0
  157. package/dist/modules/chunks/chunk-QBHBKOIL.mjs +55 -0
  158. package/dist/modules/chunks/chunk-QBHBKOIL.mjs.map +7 -0
  159. package/dist/modules/chunks/chunk-QD6CCRMG.mjs +20 -0
  160. package/dist/modules/chunks/chunk-QD6CCRMG.mjs.map +7 -0
  161. package/dist/modules/chunks/chunk-QF4V23GW.mjs +39 -0
  162. package/dist/modules/chunks/chunk-QF4V23GW.mjs.map +7 -0
  163. package/dist/modules/chunks/chunk-QK6W7MJO.mjs +42 -0
  164. package/dist/modules/chunks/chunk-QK6W7MJO.mjs.map +7 -0
  165. package/dist/modules/chunks/chunk-QL7V6DK7.mjs +34 -0
  166. package/dist/modules/chunks/chunk-QL7V6DK7.mjs.map +7 -0
  167. package/dist/modules/chunks/chunk-QLBQQKRI.mjs +25 -0
  168. package/dist/modules/chunks/chunk-QLBQQKRI.mjs.map +7 -0
  169. package/dist/modules/chunks/chunk-QLZQGZDC.mjs +418 -0
  170. package/dist/modules/chunks/chunk-QLZQGZDC.mjs.map +7 -0
  171. package/dist/modules/chunks/chunk-QSKQZGK7.mjs +1625 -0
  172. package/dist/modules/chunks/chunk-QSKQZGK7.mjs.map +7 -0
  173. package/dist/modules/chunks/chunk-QURKBAG4.mjs +25 -0
  174. package/dist/modules/chunks/chunk-QURKBAG4.mjs.map +7 -0
  175. package/dist/modules/chunks/chunk-R274XBEH.mjs +53 -0
  176. package/dist/modules/chunks/chunk-R274XBEH.mjs.map +7 -0
  177. package/dist/modules/chunks/chunk-R4I4JEY5.mjs +77 -0
  178. package/dist/modules/chunks/chunk-R4I4JEY5.mjs.map +7 -0
  179. package/dist/modules/chunks/chunk-RR6L6VVR.mjs +9 -0
  180. package/dist/modules/chunks/chunk-RR6L6VVR.mjs.map +7 -0
  181. package/dist/modules/chunks/chunk-RXF7SBBZ.mjs +125 -0
  182. package/dist/modules/chunks/chunk-RXF7SBBZ.mjs.map +7 -0
  183. package/dist/modules/chunks/chunk-SR66S6EJ.mjs +138 -0
  184. package/dist/modules/chunks/chunk-SR66S6EJ.mjs.map +7 -0
  185. package/dist/modules/chunks/chunk-SSQMQJ52.mjs +27 -0
  186. package/dist/modules/chunks/chunk-SSQMQJ52.mjs.map +7 -0
  187. package/dist/modules/chunks/chunk-TP26TASL.mjs +20 -0
  188. package/dist/modules/chunks/chunk-TP26TASL.mjs.map +7 -0
  189. package/dist/modules/chunks/chunk-TSAEK5P3.mjs +50 -0
  190. package/dist/modules/chunks/chunk-TSAEK5P3.mjs.map +7 -0
  191. package/dist/modules/chunks/chunk-UAY27HT3.mjs +68 -0
  192. package/dist/modules/chunks/chunk-UAY27HT3.mjs.map +7 -0
  193. package/dist/modules/chunks/chunk-UDLIWGWS.mjs +103 -0
  194. package/dist/modules/chunks/chunk-UDLIWGWS.mjs.map +7 -0
  195. package/dist/modules/chunks/chunk-UDVQHPWV.mjs +89 -0
  196. package/dist/modules/chunks/chunk-UDVQHPWV.mjs.map +7 -0
  197. package/dist/modules/chunks/chunk-UM23W3G7.mjs +237 -0
  198. package/dist/modules/chunks/chunk-UM23W3G7.mjs.map +7 -0
  199. package/dist/modules/chunks/chunk-VDZJWEAA.mjs +214 -0
  200. package/dist/modules/chunks/chunk-VDZJWEAA.mjs.map +7 -0
  201. package/dist/modules/chunks/chunk-VIGOJWSO.mjs +42 -0
  202. package/dist/modules/chunks/chunk-VIGOJWSO.mjs.map +7 -0
  203. package/dist/modules/chunks/chunk-VY3S5BWI.mjs +284 -0
  204. package/dist/modules/chunks/chunk-VY3S5BWI.mjs.map +7 -0
  205. package/dist/modules/chunks/chunk-VZXGRZYU.mjs +47 -0
  206. package/dist/modules/chunks/chunk-VZXGRZYU.mjs.map +7 -0
  207. package/dist/modules/chunks/chunk-W5DMQZB5.mjs +42 -0
  208. package/dist/modules/chunks/chunk-W5DMQZB5.mjs.map +7 -0
  209. package/dist/modules/chunks/chunk-WOMHSTVZ.mjs +918 -0
  210. package/dist/modules/chunks/chunk-WOMHSTVZ.mjs.map +7 -0
  211. package/dist/modules/chunks/chunk-XFQT7XCG.mjs +42 -0
  212. package/dist/modules/chunks/chunk-XFQT7XCG.mjs.map +7 -0
  213. package/dist/modules/chunks/chunk-XJZEVRYX.mjs +98 -0
  214. package/dist/modules/chunks/chunk-XJZEVRYX.mjs.map +7 -0
  215. package/dist/modules/chunks/chunk-XUYFV23R.mjs +317 -0
  216. package/dist/modules/chunks/chunk-XUYFV23R.mjs.map +7 -0
  217. package/dist/modules/chunks/chunk-Y5HXCPPQ.mjs +58 -0
  218. package/dist/modules/chunks/chunk-Y5HXCPPQ.mjs.map +7 -0
  219. package/dist/modules/chunks/chunk-YTHGRKGI.mjs +147 -0
  220. package/dist/modules/chunks/chunk-YTHGRKGI.mjs.map +7 -0
  221. package/dist/modules/chunks/chunk-YVQSDKAO.mjs +341 -0
  222. package/dist/modules/chunks/chunk-YVQSDKAO.mjs.map +7 -0
  223. package/dist/modules/chunks/chunk-YYXQDUVT.mjs +123 -0
  224. package/dist/modules/chunks/chunk-YYXQDUVT.mjs.map +7 -0
  225. package/dist/modules/chunks/chunk-ZFXZ2NUI.mjs +142 -0
  226. package/dist/modules/chunks/chunk-ZFXZ2NUI.mjs.map +7 -0
  227. package/dist/modules/chunks/chunk-ZLNWF4ET.mjs +9 -0
  228. package/dist/modules/chunks/chunk-ZLNWF4ET.mjs.map +7 -0
  229. package/dist/modules/chunks/chunk-ZLU5QW2O.mjs +9 -0
  230. package/dist/modules/chunks/chunk-ZLU5QW2O.mjs.map +7 -0
  231. package/dist/modules/chunks/chunk-ZNZPYE2V.mjs +28 -0
  232. package/dist/modules/chunks/chunk-ZNZPYE2V.mjs.map +7 -0
  233. package/dist/modules/chunks/core-564N45MO.mjs +7480 -0
  234. package/dist/modules/chunks/core-564N45MO.mjs.map +7 -0
  235. package/dist/modules/chunks/css-BKH4SVJG.mjs +8 -0
  236. package/dist/modules/chunks/css-BKH4SVJG.mjs.map +7 -0
  237. package/dist/modules/chunks/engine-javascript-PDVIGNGR.mjs +3241 -0
  238. package/dist/modules/chunks/engine-javascript-PDVIGNGR.mjs.map +7 -0
  239. package/dist/modules/chunks/github-dark-default-6HVTHEWF.mjs +8 -0
  240. package/dist/modules/chunks/github-dark-default-6HVTHEWF.mjs.map +7 -0
  241. package/dist/modules/chunks/github-light-default-LAXRA6XL.mjs +8 -0
  242. package/dist/modules/chunks/github-light-default-LAXRA6XL.mjs.map +7 -0
  243. package/dist/modules/chunks/glsl-UC3YWUD2.mjs +18 -0
  244. package/dist/modules/chunks/glsl-UC3YWUD2.mjs.map +7 -0
  245. package/dist/modules/chunks/html-FRVIUV63.mjs +19 -0
  246. package/dist/modules/chunks/html-FRVIUV63.mjs.map +7 -0
  247. package/dist/modules/chunks/javascript-LN3OC7S2.mjs +8 -0
  248. package/dist/modules/chunks/javascript-LN3OC7S2.mjs.map +7 -0
  249. package/dist/modules/chunks/json-5CUGWTOP.mjs +11 -0
  250. package/dist/modules/chunks/json-5CUGWTOP.mjs.map +7 -0
  251. package/dist/modules/chunks/json5-YZQI5VNO.mjs +11 -0
  252. package/dist/modules/chunks/json5-YZQI5VNO.mjs.map +7 -0
  253. package/dist/modules/chunks/jsonc-SWID6VOZ.mjs +11 -0
  254. package/dist/modules/chunks/jsonc-SWID6VOZ.mjs.map +7 -0
  255. package/dist/modules/chunks/jsx-A7RDCLJO.mjs +11 -0
  256. package/dist/modules/chunks/jsx-A7RDCLJO.mjs.map +7 -0
  257. package/dist/modules/chunks/markdown-QTCU5KP5.mjs +11 -0
  258. package/dist/modules/chunks/markdown-QTCU5KP5.mjs.map +7 -0
  259. package/dist/modules/chunks/python-LAZONBIB.mjs +11 -0
  260. package/dist/modules/chunks/python-LAZONBIB.mjs.map +7 -0
  261. package/dist/modules/chunks/rust-XWTPJFJO.mjs +11 -0
  262. package/dist/modules/chunks/rust-XWTPJFJO.mjs.map +7 -0
  263. package/dist/modules/chunks/scss-CFXRHUUW.mjs +15 -0
  264. package/dist/modules/chunks/scss-CFXRHUUW.mjs.map +7 -0
  265. package/dist/modules/chunks/shellscript-OHO3LCVU.mjs +11 -0
  266. package/dist/modules/chunks/shellscript-OHO3LCVU.mjs.map +7 -0
  267. package/dist/modules/chunks/toml-IOHFZJ5B.mjs +11 -0
  268. package/dist/modules/chunks/toml-IOHFZJ5B.mjs.map +7 -0
  269. package/dist/modules/chunks/tsx-2E6WNX2E.mjs +11 -0
  270. package/dist/modules/chunks/tsx-2E6WNX2E.mjs.map +7 -0
  271. package/dist/modules/chunks/typescript-PBKAS54P.mjs +11 -0
  272. package/dist/modules/chunks/typescript-PBKAS54P.mjs.map +7 -0
  273. package/dist/modules/chunks/wgsl-PS6QPRLZ.mjs +11 -0
  274. package/dist/modules/chunks/wgsl-PS6QPRLZ.mjs.map +7 -0
  275. package/dist/modules/chunks/xml-JECR2ACB.mjs +18 -0
  276. package/dist/modules/chunks/xml-JECR2ACB.mjs.map +7 -0
  277. package/dist/modules/chunks/yaml-P2SV4LOE.mjs +11 -0
  278. package/dist/modules/chunks/yaml-P2SV4LOE.mjs.map +7 -0
  279. package/dist/modules/cli-contributions.mjs +32 -0
  280. package/dist/modules/cli-contributions.mjs.map +7 -0
  281. package/dist/modules/cli.mjs +14 -0
  282. package/dist/modules/cli.mjs.map +7 -0
  283. package/dist/modules/command-executor.mjs +65 -0
  284. package/dist/modules/command-executor.mjs.map +7 -0
  285. package/dist/modules/commands.mjs +10 -0
  286. package/dist/modules/commands.mjs.map +7 -0
  287. package/dist/modules/embedded.mjs +18608 -0
  288. package/dist/modules/embedded.mjs.map +7 -0
  289. package/dist/modules/extension-bridge.mjs +18 -0
  290. package/dist/modules/extension-bridge.mjs.map +7 -0
  291. package/dist/modules/frontend-root.mjs +61 -0
  292. package/dist/modules/frontend-root.mjs.map +7 -0
  293. package/dist/modules/index.mjs +784 -0
  294. package/dist/modules/index.mjs.map +7 -0
  295. package/dist/modules/page.mjs +45 -0
  296. package/dist/modules/page.mjs.map +7 -0
  297. package/dist/modules/pages/scene.mjs +18 -0
  298. package/dist/modules/pages/scene.mjs.map +7 -0
  299. package/dist/modules/plugin.mjs +56 -0
  300. package/dist/modules/plugin.mjs.map +7 -0
  301. package/dist/modules/plugins/asset/frontend.mjs +23 -0
  302. package/dist/modules/plugins/asset/frontend.mjs.map +7 -0
  303. package/dist/modules/plugins/asset/i18n.mjs +15 -0
  304. package/dist/modules/plugins/asset/i18n.mjs.map +7 -0
  305. package/dist/modules/plugins/asset/identity.mjs +42 -0
  306. package/dist/modules/plugins/asset/identity.mjs.map +7 -0
  307. package/dist/modules/plugins/asset/schema.mjs +10 -0
  308. package/dist/modules/plugins/asset/schema.mjs.map +7 -0
  309. package/dist/modules/plugins/asset/ui.mjs +16 -0
  310. package/dist/modules/plugins/asset/ui.mjs.map +7 -0
  311. package/dist/modules/plugins/content-browser/frontend.mjs +17 -0
  312. package/dist/modules/plugins/content-browser/frontend.mjs.map +7 -0
  313. package/dist/modules/plugins/content-browser/i18n.mjs +15 -0
  314. package/dist/modules/plugins/content-browser/i18n.mjs.map +7 -0
  315. package/dist/modules/plugins/content-browser/identity.mjs +22 -0
  316. package/dist/modules/plugins/content-browser/identity.mjs.map +7 -0
  317. package/dist/modules/plugins/content-browser/schema.mjs +12 -0
  318. package/dist/modules/plugins/content-browser/schema.mjs.map +7 -0
  319. package/dist/modules/plugins/content-browser/ui.mjs +15 -0
  320. package/dist/modules/plugins/content-browser/ui.mjs.map +7 -0
  321. package/dist/modules/plugins/display/api.mjs +10 -0
  322. package/dist/modules/plugins/display/api.mjs.map +7 -0
  323. package/dist/modules/plugins/display/backend.mjs +16 -0
  324. package/dist/modules/plugins/display/backend.mjs.map +7 -0
  325. package/dist/modules/plugins/display/carrier-contract.mjs +38 -0
  326. package/dist/modules/plugins/display/carrier-contract.mjs.map +7 -0
  327. package/dist/modules/plugins/display/carrier.mjs +13 -0
  328. package/dist/modules/plugins/display/carrier.mjs.map +7 -0
  329. package/dist/modules/plugins/display/effects.mjs +8 -0
  330. package/dist/modules/plugins/display/effects.mjs.map +7 -0
  331. package/dist/modules/plugins/display/frontend.mjs +14 -0
  332. package/dist/modules/plugins/display/frontend.mjs.map +7 -0
  333. package/dist/modules/plugins/display/i18n.mjs +58 -0
  334. package/dist/modules/plugins/display/i18n.mjs.map +7 -0
  335. package/dist/modules/plugins/display/identity.mjs +30 -0
  336. package/dist/modules/plugins/display/identity.mjs.map +7 -0
  337. package/dist/modules/plugins/display/page-broker.mjs +12 -0
  338. package/dist/modules/plugins/display/page-broker.mjs.map +7 -0
  339. package/dist/modules/plugins/display/schema.mjs +40 -0
  340. package/dist/modules/plugins/display/schema.mjs.map +7 -0
  341. package/dist/modules/plugins/display/ui.mjs +9 -0
  342. package/dist/modules/plugins/display/ui.mjs.map +7 -0
  343. package/dist/modules/plugins/inspector/frontend.mjs +17 -0
  344. package/dist/modules/plugins/inspector/frontend.mjs.map +7 -0
  345. package/dist/modules/plugins/inspector/i18n.mjs +15 -0
  346. package/dist/modules/plugins/inspector/i18n.mjs.map +7 -0
  347. package/dist/modules/plugins/inspector/identity.mjs +22 -0
  348. package/dist/modules/plugins/inspector/identity.mjs.map +7 -0
  349. package/dist/modules/plugins/inspector/schema.mjs +12 -0
  350. package/dist/modules/plugins/inspector/schema.mjs.map +7 -0
  351. package/dist/modules/plugins/inspector/ui.mjs +16 -0
  352. package/dist/modules/plugins/inspector/ui.mjs.map +7 -0
  353. package/dist/modules/plugins/material/frontend.mjs +25 -0
  354. package/dist/modules/plugins/material/frontend.mjs.map +7 -0
  355. package/dist/modules/plugins/material/i18n.mjs +15 -0
  356. package/dist/modules/plugins/material/i18n.mjs.map +7 -0
  357. package/dist/modules/plugins/material/identity.mjs +60 -0
  358. package/dist/modules/plugins/material/identity.mjs.map +7 -0
  359. package/dist/modules/plugins/material/schema.mjs +47 -0
  360. package/dist/modules/plugins/material/schema.mjs.map +7 -0
  361. package/dist/modules/plugins/material/ui.mjs +28 -0
  362. package/dist/modules/plugins/material/ui.mjs.map +7 -0
  363. package/dist/modules/plugins/mesh/frontend.mjs +23 -0
  364. package/dist/modules/plugins/mesh/frontend.mjs.map +7 -0
  365. package/dist/modules/plugins/mesh/i18n.mjs +15 -0
  366. package/dist/modules/plugins/mesh/i18n.mjs.map +7 -0
  367. package/dist/modules/plugins/mesh/identity.mjs +54 -0
  368. package/dist/modules/plugins/mesh/identity.mjs.map +7 -0
  369. package/dist/modules/plugins/mesh/schema.mjs +10 -0
  370. package/dist/modules/plugins/mesh/schema.mjs.map +7 -0
  371. package/dist/modules/plugins/mesh/ui.mjs +26 -0
  372. package/dist/modules/plugins/mesh/ui.mjs.map +7 -0
  373. package/dist/modules/plugins/plugins/api.mjs +11 -0
  374. package/dist/modules/plugins/plugins/api.mjs.map +7 -0
  375. package/dist/modules/plugins/plugins/backend.mjs +21 -0
  376. package/dist/modules/plugins/plugins/backend.mjs.map +7 -0
  377. package/dist/modules/plugins/plugins/cli.mjs +12 -0
  378. package/dist/modules/plugins/plugins/cli.mjs.map +7 -0
  379. package/dist/modules/plugins/plugins/frontend.mjs +17 -0
  380. package/dist/modules/plugins/plugins/frontend.mjs.map +7 -0
  381. package/dist/modules/plugins/plugins/i18n.mjs +15 -0
  382. package/dist/modules/plugins/plugins/i18n.mjs.map +7 -0
  383. package/dist/modules/plugins/plugins/identity.mjs +26 -0
  384. package/dist/modules/plugins/plugins/identity.mjs.map +7 -0
  385. package/dist/modules/plugins/plugins/runtime.mjs +50 -0
  386. package/dist/modules/plugins/plugins/runtime.mjs.map +7 -0
  387. package/dist/modules/plugins/plugins/schema.mjs +12 -0
  388. package/dist/modules/plugins/plugins/schema.mjs.map +7 -0
  389. package/dist/modules/plugins/plugins/ui/panel.mjs +14 -0
  390. package/dist/modules/plugins/plugins/ui/panel.mjs.map +7 -0
  391. package/dist/modules/plugins/plugins/ui.mjs +15 -0
  392. package/dist/modules/plugins/plugins/ui.mjs.map +7 -0
  393. package/dist/modules/plugins/scene/frontend.mjs +18 -0
  394. package/dist/modules/plugins/scene/frontend.mjs.map +7 -0
  395. package/dist/modules/plugins/scene/identity.mjs +14 -0
  396. package/dist/modules/plugins/scene/identity.mjs.map +7 -0
  397. package/dist/modules/plugins/scene-tree/frontend.mjs +17 -0
  398. package/dist/modules/plugins/scene-tree/frontend.mjs.map +7 -0
  399. package/dist/modules/plugins/scene-tree/i18n.mjs +15 -0
  400. package/dist/modules/plugins/scene-tree/i18n.mjs.map +7 -0
  401. package/dist/modules/plugins/scene-tree/identity.mjs +22 -0
  402. package/dist/modules/plugins/scene-tree/identity.mjs.map +7 -0
  403. package/dist/modules/plugins/scene-tree/schema.mjs +12 -0
  404. package/dist/modules/plugins/scene-tree/schema.mjs.map +7 -0
  405. package/dist/modules/plugins/scene-tree/ui.mjs +16 -0
  406. package/dist/modules/plugins/scene-tree/ui.mjs.map +7 -0
  407. package/dist/modules/plugins/texture/frontend.mjs +23 -0
  408. package/dist/modules/plugins/texture/frontend.mjs.map +7 -0
  409. package/dist/modules/plugins/texture/i18n.mjs +15 -0
  410. package/dist/modules/plugins/texture/i18n.mjs.map +7 -0
  411. package/dist/modules/plugins/texture/identity.mjs +54 -0
  412. package/dist/modules/plugins/texture/identity.mjs.map +7 -0
  413. package/dist/modules/plugins/texture/schema.mjs +10 -0
  414. package/dist/modules/plugins/texture/schema.mjs.map +7 -0
  415. package/dist/modules/plugins/texture/ui.mjs +26 -0
  416. package/dist/modules/plugins/texture/ui.mjs.map +7 -0
  417. package/dist/modules/plugins/viewport/frontend.mjs +27 -0
  418. package/dist/modules/plugins/viewport/frontend.mjs.map +7 -0
  419. package/dist/modules/plugins/viewport/identity.mjs +28 -0
  420. package/dist/modules/plugins/viewport/identity.mjs.map +7 -0
  421. package/dist/modules/plugins/viewport/presentation-identity.mjs +10 -0
  422. package/dist/modules/plugins/viewport/presentation-identity.mjs.map +7 -0
  423. package/dist/modules/plugins/viewport/presentation.mjs +18 -0
  424. package/dist/modules/plugins/viewport/presentation.mjs.map +7 -0
  425. package/dist/modules/plugins/viewport/schema.mjs +18 -0
  426. package/dist/modules/plugins/viewport/schema.mjs.map +7 -0
  427. package/dist/modules/plugins/viewport/workspace-shell.mjs +29 -0
  428. package/dist/modules/plugins/viewport/workspace-shell.mjs.map +7 -0
  429. package/dist/modules/shell/contract.mjs +10 -0
  430. package/dist/modules/shell/contract.mjs.map +7 -0
  431. package/dist/modules/shell/frontend.mjs +14 -0
  432. package/dist/modules/shell/frontend.mjs.map +7 -0
  433. package/dist/modules/shell/layout-zones.mjs +20 -0
  434. package/dist/modules/shell/layout-zones.mjs.map +7 -0
  435. package/dist/modules/start-cli.mjs +57 -0
  436. package/dist/modules/start-cli.mjs.map +7 -0
  437. package/dist/modules/start.mjs +18 -0
  438. package/dist/modules/start.mjs.map +7 -0
  439. package/dist/modules/viewer/catalog/backend.mjs +47 -0
  440. package/dist/modules/viewer/catalog/backend.mjs.map +7 -0
  441. package/dist/modules/viewer/catalog/frontend.mjs +55 -0
  442. package/dist/modules/viewer/catalog/frontend.mjs.map +7 -0
  443. package/dist/modules/viewer/catalog/shared.mjs +43 -0
  444. package/dist/modules/viewer/catalog/shared.mjs.map +7 -0
  445. package/dist/modules/viewer/catalog.mjs +85 -0
  446. package/dist/modules/viewer/catalog.mjs.map +7 -0
  447. package/dist/modules/viewer/cli.mjs +23 -0
  448. package/dist/modules/viewer/cli.mjs.map +7 -0
  449. package/dist/modules/viewer-host/frontend.mjs +65 -0
  450. package/dist/modules/viewer-host/frontend.mjs.map +7 -0
  451. package/dist/modules/viewer-host/page-registry.mjs +27 -0
  452. package/dist/modules/viewer-host/page-registry.mjs.map +7 -0
  453. package/dist/modules/viewer-host/slot-registry.mjs +8 -0
  454. package/dist/modules/viewer-host/slot-registry.mjs.map +7 -0
  455. package/dist/modules/viewer-host.mjs +43 -0
  456. package/dist/modules/viewer-host.mjs.map +7 -0
  457. package/dist/modules/viewer.mjs +85 -0
  458. package/dist/modules/viewer.mjs.map +7 -0
  459. package/dist/modules/workspace/adopt-surface.mjs +16 -0
  460. package/dist/modules/workspace/adopt-surface.mjs.map +7 -0
  461. package/dist/modules/workspace/api.mjs +8 -0
  462. package/dist/modules/workspace/api.mjs.map +7 -0
  463. package/dist/modules/workspace/backend.mjs +23 -0
  464. package/dist/modules/workspace/backend.mjs.map +7 -0
  465. package/dist/modules/workspace/broker.mjs +16 -0
  466. package/dist/modules/workspace/broker.mjs.map +7 -0
  467. package/dist/modules/workspace/cli.mjs +9 -0
  468. package/dist/modules/workspace/cli.mjs.map +7 -0
  469. package/dist/modules/workspace/client.mjs +15 -0
  470. package/dist/modules/workspace/client.mjs.map +7 -0
  471. package/dist/modules/workspace/command-error.mjs +16 -0
  472. package/dist/modules/workspace/command-error.mjs.map +7 -0
  473. package/dist/modules/workspace/contract.mjs +71 -0
  474. package/dist/modules/workspace/contract.mjs.map +7 -0
  475. package/dist/modules/workspace/demo-client.mjs +127 -0
  476. package/dist/modules/workspace/demo-client.mjs.map +7 -0
  477. package/dist/modules/workspace/engine-adapter.mjs +16 -0
  478. package/dist/modules/workspace/engine-adapter.mjs.map +7 -0
  479. package/dist/modules/workspace/engine-presentation.mjs +10 -0
  480. package/dist/modules/workspace/engine-presentation.mjs.map +7 -0
  481. package/dist/modules/workspace/extension-bridge.mjs +18 -0
  482. package/dist/modules/workspace/extension-bridge.mjs.map +7 -0
  483. package/dist/modules/workspace/frontend-plugin.mjs +18 -0
  484. package/dist/modules/workspace/frontend-plugin.mjs.map +7 -0
  485. package/dist/modules/workspace/frontend.mjs +29 -0
  486. package/dist/modules/workspace/frontend.mjs.map +7 -0
  487. package/dist/modules/workspace/id.mjs +8 -0
  488. package/dist/modules/workspace/id.mjs.map +7 -0
  489. package/dist/modules/workspace/inspection-presentation.mjs +12 -0
  490. package/dist/modules/workspace/inspection-presentation.mjs.map +7 -0
  491. package/dist/modules/workspace/locale-bridge.mjs +14 -0
  492. package/dist/modules/workspace/locale-bridge.mjs.map +7 -0
  493. package/dist/modules/workspace/page-title.mjs +13 -0
  494. package/dist/modules/workspace/page-title.mjs.map +7 -0
  495. package/dist/modules/workspace/presentation.mjs +18 -0
  496. package/dist/modules/workspace/presentation.mjs.map +7 -0
  497. package/dist/modules/workspace/preview-surface.mjs +17 -0
  498. package/dist/modules/workspace/preview-surface.mjs.map +7 -0
  499. package/dist/modules/workspace/project-session.mjs +18 -0
  500. package/dist/modules/workspace/project-session.mjs.map +7 -0
  501. package/dist/modules/workspace/render-resize-sync.mjs +12 -0
  502. package/dist/modules/workspace/render-resize-sync.mjs.map +7 -0
  503. package/dist/modules/workspace/resident.mjs +16 -0
  504. package/dist/modules/workspace/resident.mjs.map +7 -0
  505. package/dist/modules/workspace/resource-open.mjs +34 -0
  506. package/dist/modules/workspace/resource-open.mjs.map +7 -0
  507. package/dist/modules/workspace/resource-page.mjs +27 -0
  508. package/dist/modules/workspace/resource-page.mjs.map +7 -0
  509. package/dist/modules/workspace/tool-runtime.mjs +14 -0
  510. package/dist/modules/workspace/tool-runtime.mjs.map +7 -0
  511. package/dist/modules/workspace/view-trace.mjs +60 -0
  512. package/dist/modules/workspace/view-trace.mjs.map +7 -0
  513. package/dist/modules/workspace/workspace-client-connection.mjs +22 -0
  514. package/dist/modules/workspace/workspace-client-connection.mjs.map +7 -0
  515. package/dist/modules/workspace/workspace-recovery.mjs +35 -0
  516. package/dist/modules/workspace/workspace-recovery.mjs.map +7 -0
  517. package/dist/modules/workspace/workspace-state.mjs +12 -0
  518. package/dist/modules/workspace/workspace-state.mjs.map +7 -0
  519. package/dist/modules/workspace-frontend.mjs +17 -0
  520. package/dist/modules/workspace-frontend.mjs.map +7 -0
  521. package/dist/viewer/assets/chunk-CilyBKbf.js +1 -0
  522. package/dist/viewer/assets/core-DSQma37-.js +13 -0
  523. package/dist/viewer/assets/core-DSQma37-.js.map +1 -0
  524. package/dist/viewer/assets/css-Bq1BXecw.js +2 -0
  525. package/dist/viewer/assets/css-Bq1BXecw.js.map +1 -0
  526. package/dist/viewer/assets/css-CWQWazmX.js +1 -0
  527. package/dist/viewer/assets/embedded-D4ZDx--W.js +2 -0
  528. package/dist/viewer/assets/embedded-D4ZDx--W.js.map +1 -0
  529. package/dist/viewer/assets/engine-javascript-BvokIV9O.js +142 -0
  530. package/dist/viewer/assets/engine-javascript-BvokIV9O.js.map +1 -0
  531. package/dist/viewer/assets/github-dark-default-DaDlj-WZ.js +2 -0
  532. package/dist/viewer/assets/github-dark-default-DaDlj-WZ.js.map +1 -0
  533. package/dist/viewer/assets/github-light-default-BqhWxAZd.js +2 -0
  534. package/dist/viewer/assets/github-light-default-BqhWxAZd.js.map +1 -0
  535. package/dist/viewer/assets/glsl-BJgVnv11.js +2 -0
  536. package/dist/viewer/assets/glsl-BJgVnv11.js.map +1 -0
  537. package/dist/viewer/assets/html-AaaHGGyt.js +2 -0
  538. package/dist/viewer/assets/html-AaaHGGyt.js.map +1 -0
  539. package/dist/viewer/assets/javascript-BX9W64FE.js +1 -0
  540. package/dist/viewer/assets/javascript-DQODvD07.js +2 -0
  541. package/dist/viewer/assets/javascript-DQODvD07.js.map +1 -0
  542. package/dist/viewer/assets/json-CpcIDpT7.js +2 -0
  543. package/dist/viewer/assets/json-CpcIDpT7.js.map +1 -0
  544. package/dist/viewer/assets/json5-Czq4A7dk.js +2 -0
  545. package/dist/viewer/assets/json5-Czq4A7dk.js.map +1 -0
  546. package/dist/viewer/assets/jsonc-BXDfCMmu.js +2 -0
  547. package/dist/viewer/assets/jsonc-BXDfCMmu.js.map +1 -0
  548. package/dist/viewer/assets/jsx-DAWscEnf.js +2 -0
  549. package/dist/viewer/assets/jsx-DAWscEnf.js.map +1 -0
  550. package/dist/viewer/assets/main-C-2CHTN_.js +15 -0
  551. package/dist/viewer/assets/main-C-2CHTN_.js.map +1 -0
  552. package/dist/viewer/assets/markdown-Cx1FMNw-.js +2 -0
  553. package/dist/viewer/assets/markdown-Cx1FMNw-.js.map +1 -0
  554. package/dist/viewer/assets/panels-entry-Ddhfjgf0.js +46 -0
  555. package/dist/viewer/assets/panels-entry-Ddhfjgf0.js.map +1 -0
  556. package/dist/viewer/assets/python-CYPKjWV9.js +2 -0
  557. package/dist/viewer/assets/python-CYPKjWV9.js.map +1 -0
  558. package/dist/viewer/assets/rust-0e5cNx_V.js +2 -0
  559. package/dist/viewer/assets/rust-0e5cNx_V.js.map +1 -0
  560. package/dist/viewer/assets/scss-B-aKzLbT.js +2 -0
  561. package/dist/viewer/assets/scss-B-aKzLbT.js.map +1 -0
  562. package/dist/viewer/assets/shellscript-CpXD-pSm.js +2 -0
  563. package/dist/viewer/assets/shellscript-CpXD-pSm.js.map +1 -0
  564. package/dist/viewer/assets/style-ClttNKZk.css +2 -0
  565. package/dist/viewer/assets/styles-BXozhwiU.js +11 -0
  566. package/dist/viewer/assets/styles-BXozhwiU.js.map +1 -0
  567. package/dist/viewer/assets/toml-GmchYTXa.js +2 -0
  568. package/dist/viewer/assets/toml-GmchYTXa.js.map +1 -0
  569. package/dist/viewer/assets/tsx-Crj1Bi53.js +2 -0
  570. package/dist/viewer/assets/tsx-Crj1Bi53.js.map +1 -0
  571. package/dist/viewer/assets/typescript-xi0cSHCO.js +2 -0
  572. package/dist/viewer/assets/typescript-xi0cSHCO.js.map +1 -0
  573. package/dist/viewer/assets/wgsl-BoEPRo9U.js +2 -0
  574. package/dist/viewer/assets/wgsl-BoEPRo9U.js.map +1 -0
  575. package/dist/viewer/assets/xml-B8JqQrMD.js +2 -0
  576. package/dist/viewer/assets/xml-B8JqQrMD.js.map +1 -0
  577. package/dist/viewer/assets/yaml-DsIB85X9.js +2 -0
  578. package/dist/viewer/assets/yaml-DsIB85X9.js.map +1 -0
  579. package/dist/viewer/index.html +15 -0
  580. package/dist/viewer/panels.js +1 -0
  581. package/host.pack.json +13 -0
  582. package/package.json +174 -0
  583. package/skills/forgeax-view-cli/SKILL.md +74 -0
  584. package/skills/forgeax-view-start/SKILL.md +202 -0
  585. package/skills/forgeax-view-start/scripts/start-view.mjs +202 -0
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":["HostAssemblyError","PLUGIN_ID","BACKEND_PLUGIN_ID","FRONTEND_PLUGIN_ID","BACKEND_MODULE","FRONTEND_MODULE","PAGE_TYPE","PAGE_TITLE_I18N_KEY","SLOT","PANEL_LAYOUT","TITLE_I18N_KEY","scene","display","viewport","contentBrowser","plugins","inspector","sceneTree","material","mesh","texture","asset","display.BACKEND_PLUGIN_ID","display.BACKEND_MODULE","plugins.BACKEND_PLUGIN_ID","plugins.BACKEND_MODULE","scene.PAGE_TYPE","scene.FRONTEND_PLUGIN_ID","scene.FRONTEND_MODULE","identity","button","workspaceCorePlugin","sceneIdentity.FRONTEND_MODULE","scenePagePlugin","displayIdentity.FRONTEND_MODULE","displayPlugin","viewportIdentity.FRONTEND_MODULE","viewportPlugin","contentBrowserIdentity.FRONTEND_MODULE","contentBrowserPlugin","pluginsIdentity.FRONTEND_MODULE","pluginsPlugin","inspectorIdentity.FRONTEND_MODULE","inspectorPlugin","sceneTreeIdentity.FRONTEND_MODULE","sceneTreePlugin","materialIdentity.FRONTEND_MODULE","materialPlugin","meshIdentity.FRONTEND_MODULE","meshPlugin","textureIdentity.FRONTEND_MODULE","texturePlugin","assetIdentity.FRONTEND_MODULE","assetPlugin","shellPlugin","presentationPlugin","slotElementId","clamp","DockviewDisposable","DockviewEmitter","DockviewMutableDisposable","DockviewCompositeDisposable"],"ignoreList":[2,3,4,5,6,7,8,14,15,16,17,18,19,20,65,66],"sources":["../../../packages/view-components/src/tokens.ts","../../../packages/view-components/src/theme.tsx","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/chevrons-right.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/file-down.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/minus.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/moon.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/pin.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/plus.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/sun.js","../../../packages/view-components/src/ErrorNotice.tsx","../../../packages/view-components/src/page-tab-icons.ts","../../../packages/view-components/src/PageTabStrip.tsx","../../../packages/viewer/src/host/panel-bridge.mjs","../../../packages/viewer/src/host/page-registry.mjs","../../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.3/node_modules/@deepseek-ai/cosmokit/lib/index.js","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/index.js","../../../node_modules/.pnpm/@forgeax+engine-types@0.2.0_ws@8.21.3/node_modules/@forgeax/engine-types/dist/index.mjs","../../../node_modules/.pnpm/@forgeax+engine-tool-runtime@0.2.0/node_modules/@forgeax/engine-tool-runtime/dist/index.mjs","../../../node_modules/.pnpm/@forgeax+engine-plugin@0.2.0_@deepseek-ai+cordis-plugin-loader@1.0.2_ws@8.21.3/node_modules/@forgeax/engine-plugin/dist/index.mjs","../../../node_modules/.pnpm/@forgeax+engine-host@0.2.0_@deepseek-ai+cordis-plugin-loader@1.0.2_ws@8.21.3/node_modules/@forgeax/engine-host/dist/frontend.mjs","../../../node_modules/.pnpm/@forgeax+engine-host@0.2.0_@deepseek-ai+cordis-plugin-loader@1.0.2_ws@8.21.3/node_modules/@forgeax/engine-host/dist/transport.mjs","../../../packages/view-workspace-core/src/command-error.mjs","../../../packages/view-workspace-core/src/client.mjs","../../../packages/view-plugin-display/src/identity.mjs","../../../packages/view-plugin-plugins/src/identity.mjs","../../../packages/view-plugin-inspector/src/identity.mjs","../../../packages/view-plugin-content-browser/src/identity.mjs","../../../packages/view-plugin-scene-tree/src/identity.mjs","../../../packages/view-plugin-asset/src/identity.mjs","../../../packages/view-plugin-viewport/src/identity.mjs","../../../packages/view-plugin-scene/src/identity.mjs","../../../packages/viewer/src/plugins/shell-identity.mjs","../../../packages/view-plugin-viewport/src/presentation-identity.mjs","../../../packages/viewer/src/catalog-shared.mjs","../../../packages/view-plugin-display/src/status.mjs","../../../packages/view-plugin-display/src/frontend.mjs","../../../packages/view-plugin-plugins/src/frontend.mjs","../../../packages/view-plugin-inspector/src/frontend.mjs","../../../packages/view-plugin-content-browser/src/frontend.mjs","../../../packages/view-plugin-scene-tree/src/frontend.mjs","../../../packages/view-plugin-material/src/frontend.mjs","../../../packages/view-plugin-mesh/src/frontend.mjs","../../../packages/view-plugin-texture/src/frontend.mjs","../../../packages/view-plugin-asset/src/frontend.mjs","../../../packages/view-workspace-core/src/project-session.mjs","../../../packages/view-workspace-core/src/workspace-recovery.mjs","../../../packages/view-plugin-viewport/src/borrowed-surface.mjs","../../../packages/view-plugin-viewport/src/workspace-shell.mjs","../../../packages/view-plugin-viewport/src/page-input-gate.mjs","../../../packages/view-plugin-viewport/src/play-toolbar.mjs","../../../packages/view-plugin-viewport/src/editor-surface.mjs","../../../packages/view-plugin-viewport/src/play-presentation.mjs","../../../packages/view-plugin-viewport/src/engine-fatal-banner.mjs","../../../packages/view-plugin-viewport/src/frontend.mjs","../../../packages/view-workspace-core/src/frontend-plugin.mjs","../../../packages/view-workspace-core/src/page-title.mjs","../../../packages/view-plugin-scene/src/frontend.mjs","../../../packages/viewer/src/plugins/shell.mjs","../../../packages/view-plugin-viewport/src/presentation.mjs","../../../packages/viewer/src/frontend-catalog.mjs","../../../packages/viewer/src/frontend-root.mjs","../../../packages/viewer/src/host/slot-registry.mjs","../../../packages/viewer/src/host/frontend.mjs","../../../packages/viewer/src/i18n/index.ts","../../../packages/viewer/src/plugins/browser-connection.mjs","../../../node_modules/.pnpm/dockview-core@6.6.1/node_modules/dockview-core/dist/package/main.esm.mjs","../../../node_modules/.pnpm/dockview@6.6.1_react@19.3.0/node_modules/dockview/dist/package/main.esm.mjs","../../../packages/viewer/src/shell/slots.ts","../../../packages/viewer/src/shell/dock-title.tsx","../../../packages/viewer/src/shell/panel-reconciler.mjs","../../../packages/viewer/src/shell/ue-drag/geometry.ts","../../../packages/viewer/src/shell/ue-drag/overlay.ts","../../../packages/viewer/src/shell/ue-drag/controller.ts","../../../packages/viewer/src/shell/ViewTraceExportButton.tsx","../../../packages/viewer/src/shell/header-persistent-status-tooltip.tsx","../../../packages/viewer/src/shell/host-connection-detail.ts","../../../packages/viewer/src/shell/HostConnectionIndicator.tsx","../../../packages/viewer/src/shell/WorkspaceProjectRecovery.tsx","../../../packages/viewer/src/shell/WorkspaceCommandErrorHost.tsx","../../../packages/viewer/src/shell/ViewerShell.tsx","../../../packages/viewer/src/main.tsx"],"sourcesContent":["export const themeNames = ['light', 'dark'] as const;\nexport type ThemeName = (typeof themeNames)[number];\n\nexport const typographyTokens = {\n title: '--fx-type-title',\n heading: '--fx-type-heading',\n body: '--fx-type-body',\n ui: '--fx-type-ui',\n label: '--fx-type-label',\n compact: '--fx-type-compact',\n caption: '--fx-type-caption',\n code: '--fx-type-code',\n} as const;\n\nexport const colorTokens = {\n surface: {\n canvas: '--fx-color-surface-canvas',\n sidebar: '--fx-color-surface-sidebar',\n raised: '--fx-color-surface-raised',\n inset: '--fx-color-surface-inset',\n hover: '--fx-color-surface-hover',\n selected: '--fx-color-surface-selected',\n },\n text: {\n primary: '--fx-color-text-primary',\n secondary: '--fx-color-text-secondary',\n muted: '--fx-color-text-muted',\n disabled: '--fx-color-text-disabled',\n inverse: '--fx-color-text-inverse',\n link: '--fx-color-text-link',\n },\n border: {\n subtle: '--fx-color-border-subtle',\n default: '--fx-color-border-default',\n control: '--fx-color-border-control',\n strong: '--fx-color-border-strong',\n focus: '--fx-color-border-focus',\n essential: '--fx-color-border-essential',\n },\n action: {\n primaryBackground: '--fx-color-action-primary-bg',\n primaryForeground: '--fx-color-action-primary-fg',\n primaryHover: '--fx-color-action-primary-hover',\n primaryPressed: '--fx-color-action-primary-pressed',\n secondaryBackground: '--fx-color-action-secondary-bg',\n secondaryForeground: '--fx-color-action-secondary-fg',\n secondaryHover: '--fx-color-action-secondary-hover',\n disabledBackground: '--fx-color-action-disabled-bg',\n disabledForeground: '--fx-color-action-disabled-fg',\n dangerBackground: '--fx-color-action-danger-bg',\n dangerForeground: '--fx-color-action-danger-fg',\n },\n selection: {\n background: '--fx-color-selection-bg',\n foreground: '--fx-color-selection-fg',\n indicator: '--fx-color-selection-indicator',\n },\n brand: {\n accent: '--fx-color-brand-accent',\n text: '--fx-color-brand-text',\n soft: '--fx-color-brand-soft',\n onAccent: '--fx-color-brand-on-accent',\n },\n status: {\n successForeground: '--fx-color-status-success-fg',\n successBackground: '--fx-color-status-success-bg',\n warningForeground: '--fx-color-status-warning-fg',\n warningBackground: '--fx-color-status-warning-bg',\n errorForeground: '--fx-color-status-error-fg',\n errorBackground: '--fx-color-status-error-bg',\n infoForeground: '--fx-color-status-info-fg',\n infoBackground: '--fx-color-status-info-bg',\n },\n scrim: '--fx-color-scrim',\n choiceIndicator: '--fx-color-choice-indicator',\n} as const;\n\nexport const surfaceTokens = colorTokens.surface;\n\nexport const statusTokens = {\n success: {\n foreground: '--fx-color-status-success-fg',\n background: '--fx-color-status-success-bg',\n },\n warning: {\n foreground: '--fx-color-status-warning-fg',\n background: '--fx-color-status-warning-bg',\n },\n error: {\n foreground: '--fx-color-status-error-fg',\n background: '--fx-color-status-error-bg',\n },\n info: {\n foreground: '--fx-color-status-info-fg',\n background: '--fx-color-status-info-bg',\n },\n} as const;\n\nexport const spaceTokens = {\n inline: '--fx-space-inline',\n control: '--fx-space-control',\n stack: '--fx-space-stack',\n section: '--fx-space-section',\n page: '--fx-space-page',\n} as const;\n\nexport const shapeTokens = {\n radius: {\n control: '--fx-radius-control',\n card: '--fx-radius-card',\n popover: '--fx-radius-popover',\n dialog: '--fx-radius-dialog',\n composer: '--fx-radius-composer',\n pill: '--fx-radius-pill',\n },\n border: {\n width: '--fx-border-width',\n focusWidth: '--fx-border-focus-width',\n focusOffset: '--fx-border-focus-offset',\n },\n shadow: {\n subtle: '--fx-shadow-subtle',\n floating: '--fx-shadow-floating',\n dialog: '--fx-shadow-dialog',\n },\n} as const;\n\nexport const motionTokens = {\n feedback: '--fx-motion-feedback',\n hover: '--fx-motion-hover',\n expand: '--fx-motion-expand',\n panel: '--fx-motion-panel',\n easing: '--fx-motion-ease',\n} as const;\n\nexport const layerTokens = {\n content: '--fx-layer-content',\n sticky: '--fx-layer-sticky',\n popover: '--fx-layer-popover',\n dialog: '--fx-layer-dialog',\n toast: '--fx-layer-toast',\n tooltip: '--fx-layer-tooltip',\n} as const;\n\nexport const componentTokens = {\n controlHeightCompact: '--fx-component-control-height-compact',\n controlHeightDefault: '--fx-component-control-height-default',\n controlHeightLarge: '--fx-component-control-height-large',\n controlIconSize: '--fx-component-control-icon-size',\n controlIconHitAreaMin: '--fx-component-control-icon-hit-area-min',\n fieldHeightDefault: '--fx-component-field-height-default',\n navigationRowHeight: '--fx-component-navigation-row-height',\n editorRowHeight: '--fx-component-editor-row-height',\n panelHeaderHeight: '--fx-component-panel-header-height',\n navigationRailWidth: '--fx-component-navigation-rail-width',\n panelConfigMinWidth: '--fx-component-panel-config-min-width',\n panelConfigMaxWidth: '--fx-component-panel-config-max-width',\n panelChatMinWidth: '--fx-component-panel-chat-min-width',\n panelChatDefaultWidth: '--fx-component-panel-chat-default-width',\n menuRowHeight: '--fx-component-menu-row-height',\n menuMinWidth: '--fx-component-menu-min-width',\n dialogMaxWidth: '--fx-component-dialog-max-width',\n dialogPadding: '--fx-component-dialog-padding',\n conversationMaxWidth: '--fx-component-conversation-max-width',\n conversationMessageGap: '--fx-component-conversation-message-gap',\n composerRadius: '--fx-component-composer-radius',\n composerMinHeight: '--fx-component-composer-min-height',\n composerTextMaxHeight: '--fx-component-composer-text-max-height',\n tooltipDelay: '--fx-component-tooltip-delay',\n spinnerDuration: '--fx-component-status-spinner-duration',\n buttonRadius: '--fx-component-button-radius',\n choiceSize: '--fx-component-choice-size',\n choiceDotSize: '--fx-component-choice-dot-size',\n} as const;\n\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\n\nimport { themeNames, type ThemeName } from './tokens';\n\nconst THEME_STORAGE_KEY = 'forgeax-view-theme';\n\ntype ThemeContextValue = {\n theme: ThemeName;\n setTheme: (theme: ThemeName) => void;\n toggleTheme: () => void;\n};\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport type ThemeProviderProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {\n children: ReactNode;\n defaultTheme?: ThemeName;\n theme?: ThemeName;\n onThemeChange?: (theme: ThemeName) => void;\n persist?: boolean;\n applyToDocument?: boolean;\n /** Skip the layout wrapper `div` when it would break viewport flex/height chains. */\n unstyled?: boolean;\n};\n\nexport function isThemeName(value: unknown): value is ThemeName {\n return typeof value === 'string' && themeNames.includes(value as ThemeName);\n}\n\nexport function getStoredTheme(fallback: ThemeName = 'light'): ThemeName {\n if (typeof window === 'undefined') return fallback;\n const stored = window.localStorage.getItem(THEME_STORAGE_KEY);\n return isThemeName(stored) ? stored : fallback;\n}\n\nexport function applyTheme(theme: ThemeName, target?: HTMLElement) {\n const element = target ?? (typeof document === 'undefined' ? undefined : document.documentElement);\n if (element) element.dataset.theme = theme;\n}\n\nexport function initializeTheme(fallback: ThemeName = 'light') {\n const theme = getStoredTheme(fallback);\n applyTheme(theme);\n return theme;\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = 'light',\n theme: controlledTheme,\n onThemeChange,\n persist = false,\n applyToDocument = true,\n unstyled = false,\n className,\n ...props\n}: ThemeProviderProps) {\n const [internalTheme, setInternalTheme] = useState<ThemeName>(() =>\n persist ? getStoredTheme(defaultTheme) : defaultTheme,\n );\n const theme = controlledTheme ?? internalTheme;\n\n const setTheme = useCallback(\n (nextTheme: ThemeName) => {\n if (!controlledTheme) setInternalTheme(nextTheme);\n if (persist && typeof window !== 'undefined') {\n window.localStorage.setItem(THEME_STORAGE_KEY, nextTheme);\n }\n onThemeChange?.(nextTheme);\n },\n [controlledTheme, onThemeChange, persist],\n );\n\n useEffect(() => {\n if (applyToDocument) applyTheme(theme);\n }, [applyToDocument, theme]);\n\n const value = useMemo(\n () => ({\n theme,\n setTheme,\n toggleTheme: () => setTheme(theme === 'light' ? 'dark' : 'light'),\n }),\n [setTheme, theme],\n );\n\n return (\n <ThemeContext.Provider value={value}>\n {unstyled ? (\n children\n ) : (\n <div\n {...props}\n className={['fx-ui', className].filter(Boolean).join(' ')}\n data-theme={applyToDocument ? undefined : theme}\n >\n {children}\n </div>\n )}\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme() {\n const context = useContext(ThemeContext);\n if (!context) throw new Error('useTheme must be used inside ThemeProvider');\n return context;\n}\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronsRight = createLucideIcon(\"ChevronsRight\", [\n [\"path\", { d: \"m6 17 5-5-5-5\", key: \"xnjwq\" }],\n [\"path\", { d: \"m13 17 5-5-5-5\", key: \"17xmmf\" }]\n]);\n\nexport { ChevronsRight as default };\n//# sourceMappingURL=chevrons-right.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FileDown = createLucideIcon(\"FileDown\", [\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M12 18v-6\", key: \"17g6i2\" }],\n [\"path\", { d: \"m9 15 3 3 3-3\", key: \"1npd3o\" }]\n]);\n\nexport { FileDown as default };\n//# sourceMappingURL=file-down.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Minus = createLucideIcon(\"Minus\", [[\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }]]);\n\nexport { Minus as default };\n//# sourceMappingURL=minus.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Moon = createLucideIcon(\"Moon\", [\n [\"path\", { d: \"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\", key: \"a7tn18\" }]\n]);\n\nexport { Moon as default };\n//# sourceMappingURL=moon.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Pin = createLucideIcon(\"Pin\", [\n [\"path\", { d: \"M12 17v5\", key: \"bb1du9\" }],\n [\n \"path\",\n {\n d: \"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\",\n key: \"1nkz8b\"\n }\n ]\n]);\n\nexport { Pin as default };\n//# sourceMappingURL=pin.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Plus = createLucideIcon(\"Plus\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n]);\n\nexport { Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Sun = createLucideIcon(\"Sun\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"4\", key: \"4exip2\" }],\n [\"path\", { d: \"M12 2v2\", key: \"tus03m\" }],\n [\"path\", { d: \"M12 20v2\", key: \"1lh1kg\" }],\n [\"path\", { d: \"m4.93 4.93 1.41 1.41\", key: \"149t6j\" }],\n [\"path\", { d: \"m17.66 17.66 1.41 1.41\", key: \"ptbguv\" }],\n [\"path\", { d: \"M2 12h2\", key: \"1t8f8n\" }],\n [\"path\", { d: \"M20 12h2\", key: \"1q8mjw\" }],\n [\"path\", { d: \"m6.34 17.66-1.41 1.41\", key: \"1m8zz5\" }],\n [\"path\", { d: \"m19.07 4.93-1.41 1.41\", key: \"1shlcs\" }]\n]);\n\nexport { Sun as default };\n//# sourceMappingURL=sun.js.map\n","import { AlertCircle, Check, Copy, X } from 'lucide-react';\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Button, IconButton, Text } from './components';\n\nexport type ErrorNoticeInput = {\n title: ReactNode;\n description?: ReactNode;\n hint?: ReactNode;\n code?: string;\n details?: ReactNode;\n detailsLabel?: string;\n /** Plain text written to the clipboard when the user copies details. */\n copyText?: string;\n copyLabel?: string;\n copiedLabel?: string;\n /** Default true: stays until the user clicks close. */\n persistent?: boolean;\n /** Used only when persistent is false. */\n duration?: number;\n closeLabel?: string;\n onDismiss?: () => void;\n};\n\nexport type ErrorNoticeItem = ErrorNoticeInput & {\n id: number;\n persistent: boolean;\n};\n\nexport type ErrorNoticeProps = ErrorNoticeInput & {\n id?: number;\n onClose: () => void;\n};\n\ntype Listener = () => void;\n\nlet nextId = 0;\nlet notices: ErrorNoticeItem[] = [];\nconst listeners = new Set<Listener>();\nconst timers = new Map<number, ReturnType<typeof setTimeout>>();\n\nfunction emit() {\n for (const listener of listeners) listener();\n}\n\nexport function subscribeErrorNotices(listener: Listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nexport function getErrorNotices() {\n return notices;\n}\n\nexport function showErrorNotice(input: ErrorNoticeInput): number {\n const id = ++nextId;\n const persistent = input.persistent !== false;\n notices = [...notices, { ...input, id, persistent }];\n emit();\n if (!persistent) {\n const duration = input.duration ?? 8000;\n if (duration > 0) {\n timers.set(\n id,\n setTimeout(() => {\n timers.delete(id);\n dismissErrorNotice(id);\n }, duration),\n );\n }\n }\n return id;\n}\n\nexport function dismissErrorNotice(id: number) {\n const timer = timers.get(id);\n if (timer !== undefined) {\n clearTimeout(timer);\n timers.delete(id);\n }\n const current = notices.find((notice) => notice.id === id);\n if (!current) return;\n notices = notices.filter((notice) => notice.id !== id);\n emit();\n current.onDismiss?.();\n}\n\nfunction resolveCopyText(copyText?: string, details?: ReactNode) {\n if (typeof copyText === 'string' && copyText.trim() !== '') return copyText;\n if (typeof details === 'string' && details.trim() !== '') return details;\n return undefined;\n}\n\nexport function ErrorNotice({\n title,\n description,\n hint,\n code,\n details,\n detailsLabel = '详细信息',\n copyText,\n copyLabel = '复制详细信息',\n copiedLabel = '已复制',\n closeLabel = '关闭错误提示',\n onClose,\n}: ErrorNoticeProps) {\n const [copied, setCopied] = useState(false);\n const clipboardText = resolveCopyText(copyText, details);\n\n useEffect(() => {\n if (!copied) return undefined;\n const timer = setTimeout(() => setCopied(false), 2000);\n return () => clearTimeout(timer);\n }, [copied]);\n\n async function handleCopyDetails() {\n if (!clipboardText) return;\n try {\n await navigator.clipboard.writeText(clipboardText);\n setCopied(true);\n } catch {\n // Clipboard may be unavailable; ignore rather than surfacing a second error.\n }\n }\n\n return (\n <div className=\"fx-error-notice fx-status--error\" role=\"alert\">\n <AlertCircle className=\"fx-icon fx-error-notice__icon\" aria-hidden />\n <div className=\"fx-error-notice__body\">\n <strong className=\"fx-error-notice__title\">{title}</strong>\n {code ? (\n <Text as=\"code\" variant=\"code\" className=\"fx-error-notice__code\">\n {code}\n </Text>\n ) : null}\n {description ? (\n <Text variant=\"body\" className=\"fx-error-notice__description\">\n {description}\n </Text>\n ) : null}\n {hint ? (\n <Text variant=\"caption\" className=\"fx-error-notice__hint\">\n {hint}\n </Text>\n ) : null}\n {details ? (\n <details className=\"fx-error-notice__details\" open>\n <summary className=\"fx-error-notice__details-summary\">\n <span>{detailsLabel}</span>\n {clipboardText ? (\n <Button\n type=\"button\"\n variant=\"quiet\"\n size=\"compact\"\n className=\"fx-error-notice__copy\"\n leadingIcon={\n copied ? (\n <Check className=\"fx-icon\" aria-hidden />\n ) : (\n <Copy className=\"fx-icon\" aria-hidden />\n )\n }\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void handleCopyDetails();\n }}\n >\n {copied ? copiedLabel : copyLabel}\n </Button>\n ) : null}\n </summary>\n <pre className=\"fx-error-notice__details-body\">{details}</pre>\n </details>\n ) : null}\n </div>\n <IconButton\n label={closeLabel}\n icon={<X className=\"fx-icon\" />}\n variant=\"quiet\"\n size=\"compact\"\n onClick={onClose}\n />\n </div>\n );\n}\n\nconst STACK_PEEK = 8;\nconst STACK_GAP = 8;\nconst STACK_MAX_BEHIND = 2;\n\nfunction stackMetrics(items: ErrorNoticeItem[], heights: Record<number, number>, expanded: boolean) {\n const heightOf = (id: number) => heights[id] ?? 0;\n const frontHeight = items[0] ? heightOf(items[0].id) : 0;\n let y = 0;\n const slots = items.map((item, index) => {\n const height = heightOf(item.id);\n const peekIndex = Math.min(index, STACK_MAX_BEHIND);\n const slotY = expanded ? y : Math.max(0, frontHeight - height + peekIndex * STACK_PEEK);\n if (expanded) y += height + STACK_GAP;\n return {\n id: item.id,\n y: slotY,\n z: items.length - index,\n interactive: expanded || index === 0,\n };\n });\n const stackHeight = expanded\n ? items.reduce((sum, item, index) => sum + heightOf(item.id) + (index > 0 ? STACK_GAP : 0), 0)\n : frontHeight + Math.min(Math.max(items.length - 1, 0), STACK_MAX_BEHIND) * STACK_PEEK;\n return { slots, stackHeight };\n}\n\nexport function ErrorNoticeStack({\n items,\n inline = false,\n onClose,\n}: {\n items: ErrorNoticeItem[];\n inline?: boolean;\n onClose: (id: number) => void;\n}) {\n const [expanded, setExpanded] = useState(false);\n const [heights, setHeights] = useState<Record<number, number>>({});\n const slotNodes = useRef(new Map<number, HTMLDivElement>());\n const stacked = items.length > 1;\n const open = stacked && expanded;\n\n const measure = useCallback(() => {\n setHeights((current) => {\n let changed = Object.keys(current).length !== items.length;\n const next: Record<number, number> = {};\n for (const item of items) {\n const height = slotNodes.current.get(item.id)?.offsetHeight ?? 0;\n next[item.id] = height;\n if (current[item.id] !== height) changed = true;\n }\n return changed ? next : current;\n });\n }, [items]);\n\n useLayoutEffect(() => {\n measure();\n const observer = new ResizeObserver(measure);\n for (const item of items) {\n const node = slotNodes.current.get(item.id);\n if (node) observer.observe(node);\n }\n return () => observer.disconnect();\n }, [items, measure]);\n\n const { slots, stackHeight } = useMemo(\n () => stackMetrics(items, heights, open),\n [items, heights, open],\n );\n\n if (items.length === 0) return null;\n\n return (\n <div\n className={['fx-error-notice-region', 'fx-ui', inline && 'fx-error-notice-region--inline']\n .filter(Boolean)\n .join(' ')}\n aria-live=\"assertive\"\n data-count={items.length}\n data-expanded={open ? '' : undefined}\n data-ready={items.every((item) => (heights[item.id] ?? 0) > 0) ? '' : undefined}\n onMouseEnter={stacked ? () => setExpanded(true) : undefined}\n onMouseLeave={stacked ? () => setExpanded(false) : undefined}\n onFocus={stacked ? () => setExpanded(true) : undefined}\n onBlur={\n stacked\n ? (event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n setExpanded(false);\n }\n }\n : undefined\n }\n style={\n {\n '--fx-error-notice-stack-height': `${stackHeight}px`,\n } as CSSProperties\n }\n >\n {items.map((notice) => {\n const slot = slots.find((entry) => entry.id === notice.id)!;\n return (\n <div\n className=\"fx-error-notice-slot\"\n key={notice.id}\n ref={(node) => {\n if (node) slotNodes.current.set(notice.id, node);\n else slotNodes.current.delete(notice.id);\n }}\n data-inert={slot.interactive ? undefined : ''}\n style={\n {\n '--fx-error-notice-y': `${slot.y}px`,\n '--fx-error-notice-z': slot.z,\n } as CSSProperties\n }\n >\n <ErrorNotice\n {...notice}\n closeLabel={notice.closeLabel}\n onClose={() => onClose(notice.id)}\n />\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function ErrorNoticeHost() {\n const items = useSyncExternalStore(subscribeErrorNotices, getErrorNotices, getErrorNotices);\n const ordered = useMemo(() => [...items].reverse(), [items]);\n if (typeof document === 'undefined' || ordered.length === 0) return null;\n return createPortal(\n <ErrorNoticeStack items={ordered} onClose={dismissErrorNotice} />,\n document.body,\n );\n}\n","import {\n Box,\n Clapperboard,\n File,\n FileCode2,\n FileText,\n Image,\n Music,\n Package,\n Puzzle,\n Settings2,\n Type,\n type LucideIcon,\n} from 'lucide-react';\n\nexport type PageKind =\n | 'scene'\n | 'model'\n | 'image'\n | 'audio'\n | 'font'\n | 'pack'\n | 'code'\n | 'doc'\n | 'config'\n | 'plugin';\n\nconst ICON_BY_KIND: Record<PageKind, LucideIcon> = {\n scene: Clapperboard,\n model: Box,\n image: Image,\n audio: Music,\n font: Type,\n pack: Package,\n code: FileCode2,\n doc: FileText,\n config: Settings2,\n plugin: Puzzle,\n};\n\nconst EXT_KIND: ReadonlyArray<readonly [readonly string[], PageKind]> = [\n [['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'py'], 'code'],\n [['md', 'markdown', 'txt'], 'doc'],\n [['png', 'jpg', 'jpeg', 'webp', 'gif', 'svg', 'ico', 'hdr'], 'image'],\n [['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a', 'opus'], 'audio'],\n [['glb', 'gltf', 'fbx'], 'model'],\n [['ttf', 'otf', 'woff2'], 'font'],\n];\n\nexport function pageKindOf(input: { typeId: string; resourcePath?: string }): PageKind {\n const path = (input.resourcePath ?? '').toLowerCase();\n if (path) {\n if (path.endsWith('.scene.json')) return 'scene';\n if (path.endsWith('.pack.json')) return path.includes('scene') ? 'scene' : 'pack';\n const ext = path.split(/[?#]/u, 1)[0]?.split('.').pop() ?? '';\n for (const [exts, kind] of EXT_KIND) if (exts.includes(ext)) return kind;\n if (path.endsWith('forge.json') || path.endsWith('package.json')) return 'config';\n }\n const id = input.typeId.toLowerCase();\n for (const kind of Object.keys(ICON_BY_KIND) as PageKind[]) {\n if (id.includes(kind)) return kind;\n }\n if (id.includes('scene') || id.includes('level')) return 'scene';\n if (id.includes('workbench') || id.includes('wb-') || id.includes('plugin')) return 'plugin';\n return 'config';\n}\n\nexport function iconForPage(input: { typeId: string; resourcePath?: string }): LucideIcon {\n const path = (input.resourcePath ?? '').toLowerCase();\n const kind = pageKindOf(input);\n if (!path && kind === 'config' && !input.typeId.toLowerCase().includes('config')) return File;\n return ICON_BY_KIND[kind];\n}\n","import {\n ChevronsRight,\n Minus,\n Pin,\n Plus,\n X,\n type LucideIcon,\n} from 'lucide-react';\nimport {\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport { ContextMenu, type MenuItem } from './components';\nimport { iconForPage } from './page-tab-icons';\n\nexport type PageTabItem = {\n id: string;\n title: string;\n typeId: string;\n icon?: LucideIcon;\n resourcePath?: string;\n closable?: boolean;\n dirty?: boolean;\n tooltip?: string;\n};\n\nexport type PageTabNewTypeOption = {\n typeId: string;\n title: string;\n};\n\nexport type PageTabStripLabels = {\n tabList: string;\n newPage: string;\n allPages: string;\n noOpenableTypes: string;\n closeTab: string;\n contextClose: string;\n contextCloseOthers: string;\n contextCloseToRight: string;\n};\n\nconst DEFAULT_LABELS: PageTabStripLabels = {\n tabList: '已打开的页面',\n newPage: '新建页面',\n allPages: '全部页面',\n noOpenableTypes: '没有可新建的类型',\n closeTab: '关闭标签页',\n contextClose: '关闭',\n contextCloseOthers: '关闭其他',\n contextCloseToRight: '关闭右侧',\n};\n\nfunction classes(...names: Array<string | false | null | undefined>) {\n return names.filter(Boolean).join(' ');\n}\n\nfunction useAnchoredMenu(anchorRef: RefObject<HTMLElement | null>) {\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n\n const openAtAnchor = useCallback(\n (align: 'start' | 'end' = 'start') => {\n const el = anchorRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n setPosition({\n x: align === 'end' ? rect.right : rect.left,\n y: rect.bottom + 4,\n });\n setOpen(true);\n },\n [anchorRef],\n );\n\n return { open, setOpen, position, openAtAnchor };\n}\n\nexport type PageTabStripProps = {\n pages: readonly PageTabItem[];\n activePageId: string | null;\n onSelect: (pageId: string) => void;\n onClose?: (pageId: string) => void;\n onCloseOthers?: (pageId: string) => void;\n onCloseToRight?: (pageId: string) => void;\n onReorder?: (pageId: string, toIndex: number) => void;\n newPageTypes?: readonly PageTabNewTypeOption[];\n onNewPage?: (typeId: string) => void;\n labels?: Partial<PageTabStripLabels>;\n className?: string;\n};\n\nexport function PageTabStrip({\n pages,\n activePageId,\n onSelect,\n onClose,\n onCloseOthers,\n onCloseToRight,\n onReorder,\n newPageTypes = [],\n onNewPage,\n labels: labelOverrides,\n className,\n}: PageTabStripProps): ReactElement | null {\n const labels = { ...DEFAULT_LABELS, ...labelOverrides };\n const listRef = useRef<HTMLDivElement>(null);\n const newButtonRef = useRef<HTMLButtonElement>(null);\n const overflowButtonRef = useRef<HTMLButtonElement>(null);\n const dragKeyRef = useRef<string | null>(null);\n const [draggingKey, setDraggingKey] = useState<string | null>(null);\n const [overflowing, setOverflowing] = useState(false);\n const [contextMenu, setContextMenu] = useState<{ x: number; y: number; pageId: string } | null>(\n null,\n );\n const newMenu = useAnchoredMenu(newButtonRef);\n const overflowMenu = useAnchoredMenu(overflowButtonRef);\n const menuId = useId();\n\n useEffect(() => {\n if (!activePageId) return;\n listRef.current\n ?.querySelector(`[data-page-id=\"${CSS.escape(activePageId)}\"]`)\n ?.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }, [activePageId]);\n\n useEffect(() => {\n const el = listRef.current;\n if (!el) return;\n const measure = () => setOverflowing(el.scrollWidth - el.clientWidth > 1);\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, [pages.length]);\n\n useEffect(() => {\n const end = () => {\n dragKeyRef.current = null;\n setDraggingKey(null);\n };\n window.addEventListener('pointerup', end);\n return () => window.removeEventListener('pointerup', end);\n }, []);\n\n const handleTabClick = useCallback(\n (pageId: string) => {\n if (pageId === activePageId) return;\n onSelect(pageId);\n },\n [activePageId, onSelect],\n );\n\n const handlePointerDown = useCallback((event: ReactPointerEvent, pageId: string) => {\n if (event.button !== 0) return;\n if ((event.target as HTMLElement).closest('[data-page-close]')) return;\n dragKeyRef.current = pageId;\n }, []);\n\n const handlePointerMove = useCallback(\n (event: ReactPointerEvent) => {\n const dragKey = dragKeyRef.current;\n if (!dragKey || event.buttons !== 1 || !onReorder) return;\n const overId = (event.target as HTMLElement)\n .closest('[data-page-id]')\n ?.getAttribute('data-page-id');\n if (!overId || overId === dragKey) return;\n const toIndex = pages.findIndex((page) => page.id === overId);\n if (toIndex < 0) return;\n setDraggingKey(dragKey);\n onReorder(dragKey, toIndex);\n },\n [onReorder, pages],\n );\n\n const closePage = useCallback(\n (pageId: string) => {\n onClose?.(pageId);\n },\n [onClose],\n );\n\n if (pages.length === 0) return null;\n\n const contextPage = contextMenu\n ? pages.find((page) => page.id === contextMenu.pageId)\n : undefined;\n const contextItems: MenuItem[] = contextMenu && contextPage\n ? [\n {\n id: 'close',\n label: labels.contextClose,\n icon: <X className=\"fx-icon\" aria-hidden />,\n disabled: !contextPage.closable,\n onSelect: () => closePage(contextMenu.pageId),\n },\n {\n id: 'close-others',\n label: labels.contextCloseOthers,\n icon: <Minus className=\"fx-icon\" aria-hidden />,\n onSelect: () => {\n onCloseOthers?.(contextMenu.pageId);\n onSelect(contextMenu.pageId);\n },\n },\n {\n id: 'close-right',\n label: labels.contextCloseToRight,\n icon: <ChevronsRight className=\"fx-icon\" aria-hidden />,\n onSelect: () => onCloseToRight?.(contextMenu.pageId),\n },\n ]\n : [];\n\n const newPageMenuItems: MenuItem[] =\n newPageTypes.length === 0\n ? [{ id: 'empty', label: labels.noOpenableTypes, disabled: true }]\n : newPageTypes.map((type) => {\n const Icon = iconForPage({ typeId: type.typeId });\n return {\n id: type.typeId,\n label: type.title,\n icon: <Icon className=\"fx-icon\" aria-hidden />,\n onSelect: () => onNewPage?.(type.typeId),\n };\n });\n\n const overflowMenuItems: MenuItem[] = pages.map((page) => {\n const Icon = page.icon ?? iconForPage({ typeId: page.typeId, resourcePath: page.resourcePath });\n const mark = activePageId === page.id ? '●' : '○';\n const label = page.dirty ? `${page.title} *` : page.title;\n return {\n id: page.id,\n label: (\n <>\n <span className=\"fx-page-tab-menu__mark\">{mark}</span>\n <span className=\"fx-page-tab-menu__label\">{label}</span>\n </>\n ),\n icon: <Icon className=\"fx-icon\" aria-hidden />,\n selected: activePageId === page.id,\n onSelect: () => onSelect(page.id),\n };\n });\n\n return (\n <div className={classes('fx-page-tab-strip', 'fx-ui', className)} data-fx-slot=\"PageTabs\">\n <div className=\"fx-page-tab-strip__scope\">\n <div\n ref={listRef}\n className=\"fx-page-tab-strip__list\"\n role=\"tablist\"\n aria-label={labels.tabList}\n onPointerMove={handlePointerMove}\n >\n {pages.map((page) => {\n const active = activePageId === page.id;\n const Icon =\n page.icon ?? iconForPage({ typeId: page.typeId, resourcePath: page.resourcePath });\n const closable = page.closable !== false;\n const tabClass = classes(\n 'fx-page-tab',\n active && 'is-active',\n !closable && 'is-pinned',\n page.dirty && 'is-dirty',\n draggingKey === page.id && 'is-drag',\n );\n return (\n <button\n key={page.id}\n type=\"button\"\n className={tabClass}\n role=\"tab\"\n aria-selected={active}\n data-page-id={page.id}\n data-dirty={page.dirty ? '1' : undefined}\n title={page.tooltip ?? page.resourcePath ?? page.title}\n onClick={() => handleTabClick(page.id)}\n onAuxClick={(event) => {\n if (event.button === 1 && closable) {\n event.preventDefault();\n closePage(page.id);\n }\n }}\n onContextMenu={(event) => {\n event.preventDefault();\n setContextMenu({ x: event.clientX, y: event.clientY, pageId: page.id });\n }}\n onPointerDown={(event) => handlePointerDown(event, page.id)}\n >\n <Icon className=\"fx-page-tab__icon\" aria-hidden />\n <span className=\"fx-page-tab__label\">{page.title}</span>\n {page.dirty ? <span className=\"fx-page-tab__dirty\" aria-hidden>*</span> : null}\n {closable ? (\n <span\n className=\"fx-page-tab__close\"\n role=\"button\"\n aria-label={labels.closeTab}\n data-page-close={page.id}\n onClick={(event) => {\n event.stopPropagation();\n closePage(page.id);\n }}\n >\n <X className=\"fx-page-tab__close-icon\" aria-hidden />\n </span>\n ) : (\n <Pin className=\"fx-page-tab__pin\" aria-hidden />\n )}\n </button>\n );\n })}\n </div>\n\n <button\n ref={newButtonRef}\n type=\"button\"\n className=\"fx-page-tab-btn fx-page-tab-btn--new\"\n title={labels.newPage}\n aria-label={labels.newPage}\n aria-haspopup=\"menu\"\n aria-expanded={newMenu.open}\n aria-controls={`${menuId}-new`}\n onClick={() => {\n if (newMenu.open) newMenu.setOpen(false);\n else newMenu.openAtAnchor('start');\n }}\n >\n <Plus className=\"fx-page-tab-btn__icon\" aria-hidden />\n </button>\n\n <div className=\"fx-page-tab-strip__actions\">\n {overflowing ? (\n <button\n ref={overflowButtonRef}\n type=\"button\"\n className=\"fx-page-tab-btn\"\n title={labels.allPages}\n aria-haspopup=\"menu\"\n aria-expanded={overflowMenu.open}\n aria-controls={`${menuId}-overflow`}\n onClick={() => {\n if (overflowMenu.open) overflowMenu.setOpen(false);\n else overflowMenu.openAtAnchor('end');\n }}\n >\n <ChevronsRight className=\"fx-page-tab-btn__icon\" aria-hidden />\n <span>{pages.length}</span>\n </button>\n ) : null}\n </div>\n </div>\n\n <ContextMenu\n open={contextMenu !== null}\n x={contextMenu?.x ?? 0}\n y={contextMenu?.y ?? 0}\n items={contextItems}\n onClose={() => setContextMenu(null)}\n label={contextPage?.title ?? labels.tabList}\n />\n\n <ContextMenu\n open={newMenu.open}\n x={newMenu.position.x}\n y={newMenu.position.y}\n items={newPageMenuItems}\n onClose={() => newMenu.setOpen(false)}\n label={labels.newPage}\n containerProps={{ id: `${menuId}-new` }}\n />\n\n <ContextMenu\n open={overflowMenu.open}\n x={overflowMenu.position.x}\n y={overflowMenu.position.y}\n items={overflowMenuItems}\n onClose={() => overflowMenu.setOpen(false)}\n label={labels.allPages}\n containerProps={{ id: `${menuId}-overflow` }}\n />\n </div>\n );\n}\n","export async function loadViewPanels() {\n const pending = globalThis.__forgeaxViewPanelsPromise;\n if (pending) {\n try {\n return await pending;\n } catch (error) {\n throw new Error('View panels development bundle failed to load', { cause: error });\n }\n }\n const href = globalThis.__forgeaxViewPanelsUrl ?? '/panels.js';\n try {\n return await import(/* @vite-ignore */ href);\n } catch (error) {\n throw new Error(`View panels bundle failed to load from ${href}`, { cause: error });\n }\n}\n\nexport async function waitForViewSlot(registry, slot) {\n if (typeof registry?.resolveWhenReady === 'function') {\n return registry.resolveWhenReady(slot);\n }\n await new Promise((resolve) => setTimeout(resolve, 0));\n return registry.resolve(slot);\n}\n\nexport async function mountViewReactPanel({\n registry,\n id,\n slot,\n pageType,\n titleKey,\n activity,\n layout,\n panel,\n props,\n}) {\n if (!registry) throw new TypeError('mountViewReactPanel requires viewSlotRegistry');\n id ??= slot;\n if (typeof pageType !== 'string' || pageType.trim() === '') {\n throw new TypeError('mountViewReactPanel requires pageType');\n }\n const unclaim = registry.claim({ id, pageType, titleKey, activity, layout });\n try {\n const mountElement = await waitForViewSlot(registry, id);\n const panels = await loadViewPanels();\n const mountName = `mount${panel}Panel`;\n if (typeof panels[mountName] !== 'function') {\n throw new Error(`View panels bundle is missing ${mountName}`);\n }\n const unmountPanel = await panels[mountName]({\n slot: id,\n ...props,\n mountElement,\n });\n return async () => {\n await unmountPanel?.();\n unclaim();\n };\n } catch (error) {\n unclaim();\n throw error;\n }\n}\n\nexport async function mountViewReactPanelInto({ element, panel, props }) {\n if (!element) throw new TypeError('mountViewReactPanelInto requires element');\n const panels = await loadViewPanels();\n const mountName = `mount${panel}Panel`;\n if (typeof panels[mountName] !== 'function') {\n throw new Error(`View panels bundle is missing ${mountName}`);\n }\n return panels[mountName]({ ...props, mountElement: element });\n}\n\nexport function createViewPanelHost({ registry, overlayRoot }) {\n if (!registry) throw new TypeError('createViewPanelHost requires viewSlotRegistry');\n return Object.freeze({\n registry,\n waitForSlot: (slot) => waitForViewSlot(registry, slot),\n mount(slot, node) {\n return registry.mount(slot, node);\n },\n claim(claim) {\n return registry.claim(claim);\n },\n mountPanel(options) {\n return mountViewReactPanel({ registry, ...options, props: { ...options.props, overlayRoot } });\n },\n mountPanelInto(options) {\n return mountViewReactPanelInto({ ...options, props: { ...options.props, overlayRoot } });\n },\n });\n}\n","import { logResourceOpen, summarizeResourceAsset } from '@forgeax/view-workspace-core/resource-open';\n\nconst PAGE_TYPE_FIELDS = new Set([\n 'typeId',\n 'titleKey',\n 'title',\n 'order',\n 'closable',\n 'singleton',\n 'initial',\n 'openable',\n 'layout',\n 'showPanelRail',\n 'hideWhenInactive',\n 'createController',\n 'resourceSelector',\n 'priority',\n]);\n\nfunction normalizePageController(createController) {\n if (createController === undefined) return undefined;\n if (typeof createController !== 'function') {\n throw new TypeError('page type createController must be a function');\n }\n const controller = createController();\n if (controller == null) return undefined;\n if (typeof controller !== 'object' || Array.isArray(controller)) {\n throw new TypeError('page type controller must be an object');\n }\n const { getTitle, subscribeTitle, dispose } = controller;\n if (getTitle !== undefined && typeof getTitle !== 'function') {\n throw new TypeError('page controller getTitle must be a function');\n }\n if (subscribeTitle !== undefined && typeof subscribeTitle !== 'function') {\n throw new TypeError('page controller subscribeTitle must be a function');\n }\n if (dispose !== undefined && typeof dispose !== 'function') {\n throw new TypeError('page controller dispose must be a function');\n }\n return Object.freeze({\n ...(getTitle === undefined ? {} : { getTitle }),\n ...(subscribeTitle === undefined ? {} : { subscribeTitle }),\n ...(dispose === undefined ? {} : { dispose }),\n });\n}\n\n/**\n * Resolve the visible page tab title. Live `getTitle()` wins; otherwise the\n * registered titleKey/title is the idle fallback. The shell never reads\n * workspace/scene fields here.\n */\nexport function resolvePageTypeTitle(pageType, translate) {\n const live = pageType?.controller?.getTitle?.();\n if (typeof live === 'string' && live.trim() !== '') return live.trim();\n if (typeof pageType?.titleKey === 'string' && pageType.titleKey !== '' && typeof translate === 'function') {\n return translate(pageType.titleKey);\n }\n return pageType?.title ?? pageType?.typeId ?? '';\n}\n\nexport function subscribePageTypeTitles(pageTypes, listener) {\n const types = Array.isArray(pageTypes) ? pageTypes : [];\n const unsubs = types\n .map((pageType) => pageType?.controller?.subscribeTitle?.(listener))\n .filter((unsub) => typeof unsub === 'function');\n return () => {\n for (const unsub of unsubs) unsub();\n };\n}\n\nexport function readPageTypeTitleRevision(pageTypes) {\n const types = Array.isArray(pageTypes) ? pageTypes : [];\n return types.map((pageType) => pageType?.controller?.getTitle?.() ?? '').join('\\0');\n}\n\nfunction normalizePageType(input) {\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n throw new TypeError('page type must be an object');\n }\n for (const field of Object.keys(input)) {\n if (!PAGE_TYPE_FIELDS.has(field)) throw new TypeError(`Unknown page type field: ${field}`);\n }\n if (typeof input.typeId !== 'string' || input.typeId.trim() === '') {\n throw new TypeError('page type requires typeId');\n }\n if (\n (typeof input.titleKey !== 'string' || input.titleKey.trim() === '') &&\n (typeof input.title !== 'string' || input.title.trim() === '')\n ) {\n throw new TypeError('page type requires titleKey or title');\n }\n if (!Number.isFinite(input.order)) throw new TypeError('page type requires numeric order');\n for (const field of [\n 'closable',\n 'singleton',\n 'initial',\n 'openable',\n 'showPanelRail',\n 'hideWhenInactive',\n ]) {\n if (typeof input[field] !== 'boolean') {\n throw new TypeError(`page type requires boolean ${field}`);\n }\n }\n if (input.layout !== 'dock' && input.layout !== 'surface') {\n throw new TypeError('page type requires layout dock or surface');\n }\n const controller = normalizePageController(input.createController);\n const resourceSelector = normalizeResourceSelector(input.resourceSelector);\n const priority = normalizePriority(input.priority);\n return Object.freeze({\n typeId: input.typeId,\n ...(input.titleKey === undefined ? {} : { titleKey: input.titleKey }),\n ...(input.title === undefined ? {} : { title: input.title }),\n order: input.order,\n closable: input.closable,\n singleton: input.singleton,\n initial: input.initial,\n openable: input.openable,\n layout: input.layout,\n showPanelRail: input.showPanelRail,\n hideWhenInactive: input.hideWhenInactive,\n ...(controller === undefined ? {} : { controller }),\n ...(resourceSelector === undefined ? {} : { resourceSelector }),\n ...(priority === undefined ? {} : { priority }),\n });\n}\n\nfunction normalizeResourceSelector(value) {\n if (value === undefined) return undefined;\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new TypeError('page type resourceSelector must be an object');\n }\n for (const field of Object.keys(value)) {\n if (field !== 'kinds' && field !== 'fallback') {\n throw new TypeError(`Unknown resourceSelector field: ${field}`);\n }\n }\n const hasKinds = Object.hasOwn(value, 'kinds');\n const hasFallback = Object.hasOwn(value, 'fallback');\n if (hasKinds === hasFallback) {\n throw new TypeError('page type resourceSelector requires kinds or fallback');\n }\n if (hasKinds) {\n if (!Array.isArray(value.kinds) || value.kinds.length === 0) {\n throw new TypeError('page type resourceSelector.kinds must be a non-empty array');\n }\n const kinds = value.kinds.map((kind) => {\n if (typeof kind !== 'string' || kind.trim() === '') {\n throw new TypeError('page type resourceSelector.kinds entries must be non-empty strings');\n }\n return kind.trim();\n });\n return Object.freeze({ kinds: Object.freeze(kinds) });\n }\n if (value.fallback !== true) {\n throw new TypeError('page type resourceSelector.fallback must be true');\n }\n return Object.freeze({ fallback: true });\n}\n\nfunction normalizePriority(value) {\n if (value === undefined) return undefined;\n if (!Number.isFinite(value)) throw new TypeError('page type priority must be a finite number');\n return value;\n}\n\nfunction compareResourcePageTypes(left, right) {\n return (right.priority ?? 0) - (left.priority ?? 0)\n || left.order - right.order\n || left.typeId.localeCompare(right.typeId);\n}\n\nexport function resolveResourcePageType(pageTypes, asset) {\n const types = Array.isArray(pageTypes) ? pageTypes : [];\n const kind = typeof asset?.kind === 'string' ? asset.kind.trim() : '';\n if (kind === '') {\n return Object.freeze({\n ok: false,\n error: Object.freeze({\n code: 'view-resource-page-unavailable',\n expected: 'an Engine asset kind',\n hint: 'Open an Engine asset whose snapshot includes kind.',\n detail: Object.freeze({ kind: asset?.kind ?? null }),\n }),\n });\n }\n const kindMatches = types\n .filter((pageType) => pageType?.resourceSelector?.kinds?.includes(kind))\n .sort(compareResourcePageTypes);\n if (kindMatches.length > 0) {\n return Object.freeze({ ok: true, pageType: kindMatches[0], match: 'kind' });\n }\n const fallbacks = types\n .filter((pageType) => pageType?.resourceSelector?.fallback === true)\n .sort(compareResourcePageTypes);\n if (fallbacks.length > 0) {\n return Object.freeze({ ok: true, pageType: fallbacks[0], match: 'fallback' });\n }\n return Object.freeze({\n ok: false,\n error: Object.freeze({\n code: 'view-resource-page-unavailable',\n expected: `a PageType plugin that accepts asset kind ${kind}`,\n hint: 'Install a matching asset editor plugin, or a fallback asset page plugin.',\n detail: Object.freeze({ kind }),\n }),\n });\n}\n\n/**\n * Decide whether a resolved PageType should focus an already-open singleton\n * or open a new page. Non-openable types (Editor) can still be focused.\n */\nexport function planResourcePageActivation(pages, pageType) {\n if (!pageType || typeof pageType !== 'object') {\n return Object.freeze({ action: 'none' });\n }\n const list = Array.isArray(pages) ? pages : [];\n if (pageType.singleton) {\n const existing = list.find((page) => page.typeId === pageType.typeId);\n if (existing) {\n return Object.freeze({ action: 'focus', pageId: existing.id, pageType });\n }\n }\n if (pageType.openable !== true) {\n return Object.freeze({ action: 'none', pageType });\n }\n return Object.freeze({\n action: 'open',\n pageId: pageType.singleton ? `page-${pageType.typeId}` : undefined,\n pageType,\n });\n}\n\nfunction normalizeOpenResource(input) {\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n throw new TypeError('openResource requires an object');\n }\n if (typeof input.requestId !== 'string' || input.requestId.trim() === '') {\n throw new TypeError('openResource requires requestId');\n }\n const asset = input.asset;\n if (!asset || typeof asset !== 'object' || Array.isArray(asset)) {\n throw new TypeError('openResource requires asset');\n }\n if (typeof asset.kind !== 'string' || asset.kind.trim() === '') {\n throw new TypeError('openResource requires asset.kind');\n }\n return Object.freeze({\n requestId: input.requestId,\n sequence: Number.isSafeInteger(input.sequence) ? input.sequence : 0,\n asset: Object.freeze({ ...asset }),\n ...(input.preview === undefined ? {} : { preview: input.preview }),\n ...(input.inspection === undefined ? {} : { inspection: input.inspection }),\n });\n}\n\nexport function createViewPageTypeRegistry({ onChange } = {}) {\n const types = new Map();\n const mounts = new Map();\n const anchors = new Map();\n const listeners = new Set();\n let snapshot = Object.freeze([]);\n const notify = () => {\n snapshot = Object.freeze(\n [...types.values()].sort((a, b) => a.order - b.order || a.typeId.localeCompare(b.typeId)),\n );\n for (const listener of listeners) listener(snapshot);\n onChange?.(snapshot);\n };\n return Object.freeze({\n registerType(input) {\n const pageType = normalizePageType(input);\n if (types.has(pageType.typeId)) {\n throw new Error(`View page type is already registered: ${pageType.typeId}`);\n }\n types.set(pageType.typeId, pageType);\n notify();\n return () => {\n if (types.get(pageType.typeId) !== pageType) return;\n types.delete(pageType.typeId);\n pageType.controller?.dispose?.();\n mounts.get(pageType.typeId)?.node.remove?.();\n mounts.delete(pageType.typeId);\n anchors.delete(pageType.typeId);\n notify();\n };\n },\n subscribe(listener) {\n listeners.add(listener);\n listener(snapshot);\n return () => listeners.delete(listener);\n },\n getTypes: () => snapshot,\n mount(typeId, node) {\n if (!types.has(typeId)) throw new Error(`View page type is not registered: ${typeId}`);\n if (!node || typeof node !== 'object') throw new TypeError('page mount requires a node');\n if (mounts.has(typeId)) throw new Error(`View page content is already mounted: ${typeId}`);\n const mount = { node, anchor: undefined };\n mounts.set(typeId, mount);\n const anchor = anchors.get(typeId);\n if (anchor && node.parentNode !== anchor) anchor.replaceChildren(node);\n return () => {\n if (mounts.get(typeId) !== mount) return;\n node.remove?.();\n mounts.delete(typeId);\n };\n },\n attach(typeId, anchor) {\n if (!types.has(typeId)) throw new Error(`View page type is not registered: ${typeId}`);\n if (!anchor?.replaceChildren) throw new TypeError('page attach requires an anchor element');\n anchors.set(typeId, anchor);\n const mount = mounts.get(typeId);\n if (!mount) return undefined;\n mount.anchor = anchor;\n if (mount.node.parentNode !== anchor) anchor.replaceChildren(mount.node);\n return mount.node;\n },\n });\n}\n\nexport function createViewPageHost({ registry } = {}) {\n if (!registry?.registerType) throw new TypeError('createViewPageHost requires pageRegistry');\n const listeners = new Set();\n let lastRequest;\n return Object.freeze({\n registry,\n registerType: (pageType) => registry.registerType(pageType),\n mount: (typeId, node) => registry.mount(typeId, node),\n openResource(input) {\n const request = normalizeOpenResource(input);\n lastRequest = request;\n logResourceOpen('page-host-open-resource', {\n requestId: request.requestId,\n sequence: request.sequence,\n asset: summarizeResourceAsset(request.asset),\n listenerCount: listeners.size,\n });\n for (const listener of listeners) listener(request);\n return request;\n },\n subscribeResourceOpen(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('subscribeResourceOpen requires a function');\n }\n listeners.add(listener);\n if (lastRequest) listener(lastRequest);\n return () => listeners.delete(listener);\n },\n });\n}\n\nexport function listOpenablePageTypes(pageTypes, pages) {\n const openTypes = new Set(pages.map((page) => page.typeId));\n return pageTypes.filter(\n (pageType) => pageType.openable && (!pageType.singleton || !openTypes.has(pageType.typeId)),\n );\n}\n","//#region lib/types/misc.js\n/** No-op callback returning `undefined` at runtime and `any` at type level. */\nfunction noop() {}\n/** Return true when a value is `null` or `undefined`. */\nfunction isNullable(value) {\n\treturn value === null || value === void 0;\n}\n/** Return true when a value is neither `null` nor `undefined`. */\nfunction isNonNullable(value) {\n\treturn !isNullable(value);\n}\n/** Return true for non-array object values. */\nfunction isPlainObject(data) {\n\treturn data && typeof data === \"object\" && !Array.isArray(data);\n}\n/** Filter object entries and return a new object. */\nfunction filterKeys(object, filter) {\n\treturn Object.fromEntries(Object.entries(object).filter(([key, value]) => filter(key, value)));\n}\n/** Map object values while preserving the original key set. */\nfunction mapValues(object, transform) {\n\treturn Object.fromEntries(Object.entries(object).map(([key, value]) => [key, transform(value, key)]));\n}\n/** Pick selected keys from an object, optionally including `undefined` values. */\nfunction pick(source, keys, forced) {\n\tif (!keys) return { ...source };\n\tconst result = {};\n\tfor (const key of keys) if (forced || source[key] !== void 0) result[key] = source[key];\n\treturn result;\n}\n/** Omit selected keys from a shallow object copy. */\nfunction omit(source, keys) {\n\tif (!keys) return { ...source };\n\tconst result = { ...source };\n\tfor (const key of keys) Reflect.deleteProperty(result, key);\n\treturn result;\n}\n/** Define a non-enumerable writable property and return the object. */\nfunction defineProperty(object, key, value) {\n\treturn Object.defineProperty(object, key, {\n\t\twritable: true,\n\t\tvalue,\n\t\tenumerable: false\n\t});\n}\n//#endregion\n//#region lib/types/array.js\n/** Return true when every item in `array2` is present in `array1`. */\nfunction contain(array1, array2) {\n\treturn array2.every((item) => array1.includes(item));\n}\n/** Return items that appear in both arrays. */\nfunction intersection(array1, array2) {\n\treturn array1.filter((item) => array2.includes(item));\n}\n/** Return items from `array1` that do not appear in `array2`. */\nfunction difference(array1, array2) {\n\treturn array1.filter((item) => !array2.includes(item));\n}\n/** Return the set-union of two arrays while preserving first occurrence order. */\nfunction union(array1, array2) {\n\treturn Array.from(new Set([...array1, ...array2]));\n}\n/** Remove duplicate values while preserving first occurrence order. */\nfunction deduplicate(array) {\n\treturn [...new Set(array)];\n}\n/** Remove one item from an array and report whether it was found. */\nfunction remove(list, item) {\n\tconst index = list?.indexOf(item);\n\tif (index >= 0) {\n\t\tlist.splice(index, 1);\n\t\treturn true;\n\t} else return false;\n}\n/** Normalize nullish, scalar, or array input to an array. */\nfunction makeArray(source) {\n\treturn Array.isArray(source) ? source : isNullable(source) ? [] : [source];\n}\n//#endregion\n//#region lib/types/types.js\n/** Test values using `instanceof` with a `toStringTag` fallback. */\nfunction is(type, value) {\n\tif (arguments.length === 1) return (value) => is(type, value);\n\treturn type in globalThis && value instanceof globalThis[type] || Object.prototype.toString.call(value).slice(8, -1) === type;\n}\nfunction isArrayBufferLike(value) {\n\treturn is(\"ArrayBuffer\", value) || is(\"SharedArrayBuffer\", value);\n}\nfunction isArrayBufferSource(value) {\n\treturn isArrayBufferLike(value) || ArrayBuffer.isView(value);\n}\n/** Binary source detection and base64/hex conversion helpers. */\nvar Binary;\n(function(Binary) {\n\tBinary.is = isArrayBufferLike;\n\tBinary.isSource = isArrayBufferSource;\n\tfunction fromSource(source) {\n\t\tif (ArrayBuffer.isView(source)) return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength);\n\t\telse return source;\n\t}\n\tBinary.fromSource = fromSource;\n\tfunction toBase64(source) {\n\t\tsource = fromSource(source);\n\t\tif (typeof Buffer !== \"undefined\") return Buffer.from(source).toString(\"base64\");\n\t\tlet binary = \"\";\n\t\tconst bytes = new Uint8Array(source);\n\t\tfor (let i = 0; i < bytes.byteLength; i++) binary += String.fromCharCode(bytes[i]);\n\t\treturn btoa(binary);\n\t}\n\tBinary.toBase64 = toBase64;\n\tfunction fromBase64(source) {\n\t\tif (typeof Buffer !== \"undefined\") return fromSource(Buffer.from(source, \"base64\"));\n\t\treturn Uint8Array.from(atob(source), (c) => c.charCodeAt(0));\n\t}\n\tBinary.fromBase64 = fromBase64;\n\tfunction toHex(source) {\n\t\tsource = fromSource(source);\n\t\tif (typeof Buffer !== \"undefined\") return Buffer.from(source).toString(\"hex\");\n\t\treturn Array.from(new Uint8Array(source), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\t}\n\tBinary.toHex = toHex;\n\tfunction fromHex(source) {\n\t\tif (typeof Buffer !== \"undefined\") return fromSource(Buffer.from(source, \"hex\"));\n\t\tconst hex = source.length % 2 === 0 ? source : source.slice(0, source.length - 1);\n\t\tconst buffer = [];\n\t\tfor (let i = 0; i < hex.length; i += 2) buffer.push(parseInt(`${hex[i]}${hex[i + 1]}`, 16));\n\t\treturn Uint8Array.from(buffer).buffer;\n\t}\n\tBinary.fromHex = fromHex;\n})(Binary || (Binary = {}));\n/** Decode a base64 string into binary data. */\nconst base64ToArrayBuffer = Binary.fromBase64;\n/** Encode binary data as base64. */\nconst arrayBufferToBase64 = Binary.toBase64;\n/** Decode a hex string into binary data. */\nconst hexToArrayBuffer = Binary.fromHex;\n/** Encode binary data as hex. */\nconst arrayBufferToHex = Binary.toHex;\n/** Deep-clone common JavaScript values while preserving prototypes and cycles. */\nfunction clone(source, refs = /* @__PURE__ */ new Map()) {\n\tif (!source || typeof source !== \"object\") return source;\n\tif (is(\"Date\", source)) return new Date(source.valueOf());\n\tif (is(\"RegExp\", source)) return new RegExp(source.source, source.flags);\n\tif (isArrayBufferLike(source)) return source.slice(0);\n\tif (ArrayBuffer.isView(source)) return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength);\n\tconst cached = refs.get(source);\n\tif (cached) return cached;\n\tif (Array.isArray(source)) {\n\t\tconst result = [];\n\t\trefs.set(source, result);\n\t\tsource.forEach((value, index) => {\n\t\t\tresult[index] = Reflect.apply(clone, null, [value, refs]);\n\t\t});\n\t\treturn result;\n\t}\n\tconst result = Object.create(Object.getPrototypeOf(source));\n\trefs.set(source, result);\n\tfor (const key of Reflect.ownKeys(source)) {\n\t\tconst descriptor = { ...Reflect.getOwnPropertyDescriptor(source, key) };\n\t\tif (\"value\" in descriptor) descriptor.value = Reflect.apply(clone, null, [descriptor.value, refs]);\n\t\tReflect.defineProperty(result, key, descriptor);\n\t}\n\treturn result;\n}\n/** Deeply compare arrays, dates, regexps, buffers, and plain object fields. */\nfunction deepEqual(a, b, strict) {\n\tif (a === b) return true;\n\tif (!strict && isNullable(a) && isNullable(b)) return true;\n\tif (typeof a !== typeof b) return false;\n\tif (typeof a !== \"object\") return false;\n\tif (!a || !b) return false;\n\tfunction check(test, then) {\n\t\treturn test(a) ? test(b) ? then(a, b) : false : test(b) ? false : void 0;\n\t}\n\treturn check(Array.isArray, (a, b) => a.length === b.length && a.every((item, index) => deepEqual(item, b[index]))) ?? check(is(\"Date\"), (a, b) => a.valueOf() === b.valueOf()) ?? check(is(\"RegExp\"), (a, b) => a.source === b.source && a.flags === b.flags) ?? check(isArrayBufferLike, (a, b) => {\n\t\tif (a.byteLength !== b.byteLength) return false;\n\t\tconst viewA = new Uint8Array(a);\n\t\tconst viewB = new Uint8Array(b);\n\t\tfor (let i = 0; i < viewA.length; i++) if (viewA[i] !== viewB[i]) return false;\n\t\treturn true;\n\t}) ?? Object.keys({\n\t\t...a,\n\t\t...b\n\t}).every((key) => deepEqual(a[key], b[key], strict));\n}\n//#endregion\n//#region lib/types/string.js\n/** Uppercase the first character of a string. */\nfunction capitalize(source) {\n\treturn source.charAt(0).toUpperCase() + source.slice(1);\n}\n/** Lowercase the first character of a string. */\nfunction uncapitalize(source) {\n\treturn source.charAt(0).toLowerCase() + source.slice(1);\n}\n/** Convert dash or underscore delimited text to camelCase. */\nfunction camelCase(source) {\n\treturn source.replace(/[_-][a-z]/g, (str) => str.slice(1).toUpperCase());\n}\nfunction tokenize(source, delimiters, delimiter) {\n\tconst output = [];\n\tlet state = 0;\n\tfor (let i = 0; i < source.length; i++) {\n\t\tconst code = source.charCodeAt(i);\n\t\tif (code >= 65 && code <= 90) {\n\t\t\tif (state === 1) {\n\t\t\t\tconst next = source.charCodeAt(i + 1);\n\t\t\t\tif (next >= 97 && next <= 122) output.push(delimiter);\n\t\t\t\toutput.push(code + 32);\n\t\t\t} else {\n\t\t\t\tif (state !== 0) output.push(delimiter);\n\t\t\t\toutput.push(code + 32);\n\t\t\t}\n\t\t\tstate = 1;\n\t\t} else if (code >= 97 && code <= 122) {\n\t\t\toutput.push(code);\n\t\t\tstate = 2;\n\t\t} else if (delimiters.includes(code)) {\n\t\t\tif (state !== 0) output.push(delimiter);\n\t\t\tstate = 0;\n\t\t} else output.push(code);\n\t}\n\treturn String.fromCharCode(...output);\n}\n/** Convert text to dash-delimited parameter case. */\nfunction paramCase(source) {\n\treturn tokenize(source, [45, 95], 45);\n}\n/** Convert text to underscore-delimited snake case. */\nfunction snakeCase(source) {\n\treturn tokenize(source, [45, 95], 95);\n}\n/** Runtime alias for `camelCase`. */\nconst camelize = camelCase;\n/** Runtime alias for `paramCase`. */\nconst hyphenate = paramCase;\n/** Format a property key as a JavaScript member access suffix. */\nfunction formatProperty(key) {\n\tif (typeof key !== \"string\") return `[${key.toString()}]`;\n\treturn /^[a-z_$][\\w$]*$/i.test(key) ? `.${key}` : `[${JSON.stringify(key)}]`;\n}\n/** Remove one trailing slash from a path string. */\nfunction trimSlash(source) {\n\treturn source.replace(/\\/$/, \"\");\n}\n/** Ensure a path starts with `/` and has no trailing slash. */\nfunction sanitize(source) {\n\tif (!source.startsWith(\"/\")) source = \"/\" + source;\n\treturn trimSlash(source);\n}\n//#endregion\n//#region lib/types/time.js\n/** Time constants plus parsing and formatting helpers. */\nvar Time;\n(function(Time) {\n\tTime.millisecond = 1;\n\tTime.second = 1e3;\n\tTime.minute = Time.second * 60;\n\tTime.hour = Time.minute * 60;\n\tTime.day = Time.hour * 24;\n\tTime.week = Time.day * 7;\n\tlet timezoneOffset = (/* @__PURE__ */ new Date()).getTimezoneOffset();\n\tfunction setTimezoneOffset(offset) {\n\t\ttimezoneOffset = offset;\n\t}\n\tTime.setTimezoneOffset = setTimezoneOffset;\n\tfunction getTimezoneOffset() {\n\t\treturn timezoneOffset;\n\t}\n\tTime.getTimezoneOffset = getTimezoneOffset;\n\tfunction getDateNumber(date = /* @__PURE__ */ new Date(), offset) {\n\t\tif (typeof date === \"number\") date = new Date(date);\n\t\tif (offset === void 0) offset = timezoneOffset;\n\t\treturn Math.floor((date.valueOf() / Time.minute - offset) / 1440);\n\t}\n\tTime.getDateNumber = getDateNumber;\n\tfunction fromDateNumber(value, offset) {\n\t\tconst date = new Date(value * Time.day);\n\t\tif (offset === void 0) offset = timezoneOffset;\n\t\treturn new Date(+date + offset * Time.minute);\n\t}\n\tTime.fromDateNumber = fromDateNumber;\n\tconst numeric = /\\d+(?:\\.\\d+)?/.source;\n\tconst timeRegExp = new RegExp(`^${[\n\t\t\"w(?:eek(?:s)?)?\",\n\t\t\"d(?:ay(?:s)?)?\",\n\t\t\"h(?:our(?:s)?)?\",\n\t\t\"m(?:in(?:ute)?(?:s)?)?\",\n\t\t\"s(?:ec(?:ond)?(?:s)?)?\"\n\t].map((unit) => `(${numeric}${unit})?`).join(\"\")}$`);\n\tfunction parseTime(source) {\n\t\tconst capture = timeRegExp.exec(source);\n\t\tif (!capture) return 0;\n\t\treturn (parseFloat(capture[1]) * Time.week || 0) + (parseFloat(capture[2]) * Time.day || 0) + (parseFloat(capture[3]) * Time.hour || 0) + (parseFloat(capture[4]) * Time.minute || 0) + (parseFloat(capture[5]) * Time.second || 0);\n\t}\n\tTime.parseTime = parseTime;\n\tfunction parseDate(date) {\n\t\tconst parsed = parseTime(date);\n\t\tif (parsed) date = Date.now() + parsed;\n\t\telse if (/^\\d{1,2}(:\\d{1,2}){1,2}$/.test(date)) date = `${(/* @__PURE__ */ new Date()).toLocaleDateString()}-${date}`;\n\t\telse if (/^\\d{1,2}-\\d{1,2}-\\d{1,2}(:\\d{1,2}){1,2}$/.test(date)) date = `${(/* @__PURE__ */ new Date()).getFullYear()}-${date}`;\n\t\treturn date ? new Date(date) : /* @__PURE__ */ new Date();\n\t}\n\tTime.parseDate = parseDate;\n\tfunction format(ms) {\n\t\tconst abs = Math.abs(ms);\n\t\tif (abs >= Time.day - Time.hour / 2) return Math.round(ms / Time.day) + \"d\";\n\t\telse if (abs >= Time.hour - Time.minute / 2) return Math.round(ms / Time.hour) + \"h\";\n\t\telse if (abs >= Time.minute - Time.second / 2) return Math.round(ms / Time.minute) + \"m\";\n\t\telse if (abs >= Time.second) return Math.round(ms / Time.second) + \"s\";\n\t\treturn ms + \"ms\";\n\t}\n\tTime.format = format;\n\tfunction toDigits(source, length = 2) {\n\t\treturn source.toString().padStart(length, \"0\");\n\t}\n\tTime.toDigits = toDigits;\n\tfunction template(template, time = /* @__PURE__ */ new Date()) {\n\t\treturn template.replace(\"yyyy\", time.getFullYear().toString()).replace(\"yy\", time.getFullYear().toString().slice(2)).replace(\"MM\", toDigits(time.getMonth() + 1)).replace(\"dd\", toDigits(time.getDate())).replace(\"hh\", toDigits(time.getHours())).replace(\"mm\", toDigits(time.getMinutes())).replace(\"ss\", toDigits(time.getSeconds())).replace(\"SSS\", toDigits(time.getMilliseconds(), 3));\n\t}\n\tTime.template = template;\n})(Time || (Time = {}));\n//#endregion\nexport { Binary, Time, arrayBufferToBase64, arrayBufferToHex, base64ToArrayBuffer, camelCase, camelize, capitalize, clone, contain, deduplicate, deepEqual, defineProperty, difference, filterKeys, formatProperty, hexToArrayBuffer, hyphenate, intersection, is, isNonNullable, isNullable, isPlainObject, makeArray, mapValues, mapValues as valueMap, noop, omit, paramCase, pick, remove, sanitize, snakeCase, trimSlash, uncapitalize, union };\n","import { defineProperty, hyphenate, isNullable } from \"@deepseek-ai/cosmokit\";\n//#region lib/types/utils.js\n/** Ordered collection of disposable values with O(1) deletion by value. */\nvar DisposableList = class {\n\tsn = 0;\n\tmap = /* @__PURE__ */ new Map();\n\tweak = /* @__PURE__ */ new WeakMap();\n\tget length() {\n\t\treturn this.map.size;\n\t}\n\tpush(value) {\n\t\tconst sn = ++this.sn;\n\t\tthis.map.set(sn, value);\n\t\tthis.weak.set(value, sn);\n\t\treturn () => this.map.delete(sn);\n\t}\n\tdelete(value) {\n\t\tconst sn = this.weak.get(value);\n\t\tif (!sn) return false;\n\t\treturn this.map.delete(sn);\n\t}\n\tclear() {\n\t\tconst values = [...this.map.values()];\n\t\tthis.map.clear();\n\t\treturn values.reverse();\n\t}\n\t[Symbol.iterator]() {\n\t\treturn this.map.values();\n\t}\n\t[Symbol.for(\"nodejs.util.inspect.custom\")]() {\n\t\treturn [...this];\n\t}\n};\n/** Shared symbols used to avoid public property-name collisions. */\nconst symbols = {\n\tshadow: Symbol.for(\"cordis.shadow\"),\n\treceiver: Symbol.for(\"cordis.receiver\"),\n\toriginal: Symbol.for(\"cordis.original\"),\n\tmetadata: Symbol.for(\"cordis.metadata\"),\n\tinitHooks: Symbol.for(\"cordis.initHooks\"),\n\tcheckProto: Symbol.for(\"cordis.checkProto\"),\n\teffect: Symbol.for(\"cordis.effect\"),\n\tfilter: Symbol.for(\"cordis.filter\"),\n\tisolate: Symbol.for(\"cordis.isolate\"),\n\tintercept: Symbol.for(\"cordis.intercept\"),\n\tinit: Symbol.for(\"cordis.init\"),\n\tcheck: Symbol.for(\"cordis.check\"),\n\tconfig: Symbol.for(\"cordis.config\"),\n\tinvoke: Symbol.for(\"cordis.invoke\"),\n\textend: Symbol.for(\"cordis.extend\"),\n\ttracker: Symbol.for(\"cordis.tracker\"),\n\tresolveConfig: Symbol.for(\"cordis.resolveConfig\")\n};\nconst GeneratorFunction = function* () {}.constructor;\nconst AsyncGeneratorFunction = async function* () {}.constructor;\n/** Return true when a plugin callback should be constructed with `new`. */\nfunction isConstructor(func) {\n\tif (!func.prototype) return false;\n\tif (func instanceof GeneratorFunction) return false;\n\tif (AsyncGeneratorFunction !== Function && func instanceof AsyncGeneratorFunction) return false;\n\treturn true;\n}\n/** Merge two prototype chains while preserving descriptors from `proto1`. */\nfunction joinPrototype(proto1, proto2) {\n\tif (proto1 === Object.prototype) return proto2;\n\tconst result = Object.create(joinPrototype(Object.getPrototypeOf(proto1), proto2));\n\tfor (const key of Reflect.ownKeys(proto1)) Object.defineProperty(result, key, Object.getOwnPropertyDescriptor(proto1, key));\n\treturn result;\n}\n/** Return true for non-null objects and functions. */\nfunction isObject(value) {\n\treturn value && (typeof value === \"object\" || typeof value === \"function\");\n}\n/** Find a property descriptor by walking an object's prototype chain. */\nfunction getPropertyDescriptor(target, prop) {\n\tlet proto = target;\n\twhile (proto) {\n\t\tconst desc = Reflect.getOwnPropertyDescriptor(proto, prop);\n\t\tif (desc) return desc;\n\t\tproto = Object.getPrototypeOf(proto);\n\t}\n}\n/** Wrap services/functions so method calls see the caller's active context. */\nfunction getTraceable(ctx, value) {\n\tif (!isObject(value)) return value;\n\tif (Object.hasOwn(value, symbols.shadow)) return Object.getPrototypeOf(value);\n\tconst tracker = value[symbols.tracker];\n\tif (!tracker) return value;\n\treturn createTraceable(ctx, value, tracker);\n}\n/** Return a proxy that overlays readonly or writable properties onto a target. */\nfunction withProps(target, props) {\n\tif (!props) return target;\n\treturn new Proxy(target, {\n\t\tget: (target, prop, receiver) => {\n\t\t\tif (prop in props && prop !== \"constructor\") return Reflect.get(props, prop, receiver);\n\t\t\treturn Reflect.get(target, prop, receiver);\n\t\t},\n\t\tset: (target, prop, value, receiver) => {\n\t\t\tif (prop in props && prop !== \"constructor\") return Reflect.set(props, prop, value, receiver);\n\t\t\treturn Reflect.set(target, prop, value, receiver);\n\t\t}\n\t});\n}\nfunction withProp(target, prop, value) {\n\treturn withProps(target, Object.defineProperty(Object.create(null), prop, {\n\t\tvalue,\n\t\twritable: false\n\t}));\n}\nfunction createShadow(ctx, target, property, receiver) {\n\tif (!property) return receiver;\n\tconst origin = Reflect.getOwnPropertyDescriptor(target, property)?.value;\n\tif (!origin) return receiver;\n\treturn withProp(receiver, property, ctx.extend({ [symbols.shadow]: origin }));\n}\nfunction createShadowMethod(ctx, value, outer, shadow) {\n\treturn new Proxy(value, { apply: (target, thisArg, args) => {\n\t\tif (thisArg === outer) thisArg = shadow;\n\t\treturn getTraceable(ctx, Reflect.apply(target, thisArg, args));\n\t} });\n}\nfunction createTraceable(ctx, value, tracker) {\n\tif (ctx[symbols.shadow] && !tracker.noShadow) ctx = Object.getPrototypeOf(ctx);\n\tconst proxy = new Proxy(value, {\n\t\tget: (target, prop, receiver) => {\n\t\t\tif (prop === symbols.original) return target;\n\t\t\tif (prop === tracker.property) return ctx;\n\t\t\tif (typeof prop === \"symbol\") return Reflect.get(target, prop, receiver);\n\t\t\tif (tracker.associate && ctx.reflect.props[`${tracker.associate}.${prop}`]) return Reflect.get(ctx, `${tracker.associate}.${prop}`, withProp(ctx, symbols.receiver, receiver));\n\t\t\tlet shadow, innerValue;\n\t\t\tconst desc = getPropertyDescriptor(target, prop);\n\t\t\tif (desc && \"value\" in desc) innerValue = desc.value;\n\t\t\telse {\n\t\t\t\tshadow = createShadow(ctx, target, tracker.property, receiver);\n\t\t\t\tinnerValue = Reflect.get(target, prop, shadow);\n\t\t\t}\n\t\t\tconst innerTracker = innerValue?.[symbols.tracker];\n\t\t\tif (innerTracker) return createTraceable(ctx, innerValue, innerTracker);\n\t\t\telse if (!tracker.noShadow && typeof innerValue === \"function\") {\n\t\t\t\tshadow ??= createShadow(ctx, target, tracker.property, receiver);\n\t\t\t\treturn createShadowMethod(ctx, innerValue, receiver, shadow);\n\t\t\t} else return innerValue;\n\t\t},\n\t\tset: (target, prop, value, receiver) => {\n\t\t\tif (prop === symbols.original) return false;\n\t\t\tif (prop === tracker.property) return false;\n\t\t\tif (typeof prop === \"symbol\") return Reflect.set(target, prop, value, receiver);\n\t\t\tif (tracker.associate && ctx.reflect.props[`${tracker.associate}.${prop}`]) return Reflect.set(ctx, `${tracker.associate}.${prop}`, value, withProp(ctx, symbols.receiver, receiver));\n\t\t\tconst shadow = createShadow(ctx, target, tracker.property, receiver);\n\t\t\treturn Reflect.set(target, prop, value, shadow);\n\t\t},\n\t\tapply: (target, thisArg, args) => {\n\t\t\treturn applyTraceable(proxy, target, thisArg, args);\n\t\t}\n\t});\n\treturn proxy;\n}\nfunction applyTraceable(proxy, value, thisArg, args) {\n\tif (!value[symbols.invoke]) return Reflect.apply(value, thisArg, args);\n\treturn value[symbols.invoke].apply(proxy, args);\n}\n/** Create a callable service object that dispatches through `symbols.invoke`. */\nfunction createCallable(name, proto, tracker) {\n\tconst self = function(...args) {\n\t\treturn applyTraceable(createTraceable(self[\"ctx\"], self, tracker), self, this, args);\n\t};\n\tdefineProperty(self, \"name\", name);\n\treturn Object.setPrototypeOf(self, proto);\n}\nfunction handleError(info, reason, getOuterStack) {\n\tconst innerLines = info.error.stack.split(\"\\n\");\n\tif (typeof reason?.stack !== \"string\") {\n\t\tconst outerError = new Error(reason);\n\t\tconst lines = outerError.stack.split(\"\\n\");\n\t\tlines.splice(1, Infinity, ...getOuterStack());\n\t\touterError.stack = lines.join(\"\\n\");\n\t\tthrow outerError;\n\t}\n\tconst lines = reason.stack.split(\"\\n\");\n\tlet index = lines.indexOf(innerLines[2]);\n\tif (index === -1) throw reason;\n\tindex -= info.offset;\n\twhile (index > 0) {\n\t\tif (!lines[index - 1].endsWith(\" (<anonymous>)\")) break;\n\t\tindex -= 1;\n\t}\n\tlines.splice(index, Infinity, ...getOuterStack());\n\treason.stack = lines.join(\"\\n\");\n\tthrow reason;\n}\n/** Run a callback and splice outer call-site frames into thrown async errors. */\nfunction composeError(callback, getOuterStack = buildOuterStack()) {\n\tconst info = {\n\t\toffset: 1,\n\t\terror: /* @__PURE__ */ new Error()\n\t};\n\ttry {\n\t\tconst result = callback(info);\n\t\tif (isObject(result) && \"then\" in result) return result.then(void 0, (reason) => handleError(info, reason, getOuterStack));\n\t\telse return result;\n\t} catch (reason) {\n\t\thandleError(info, reason, getOuterStack);\n\t}\n}\n/** Capture a lazy stack-frame supplier for later error composition. */\nfunction buildOuterStack(offset = 0) {\n\tconst outerError = /* @__PURE__ */ new Error();\n\treturn () => outerError.stack.split(\"\\n\").slice(3 + offset);\n}\n//#endregion\n//#region lib/types/events.js\n/**\n* Return whether an event result should stop a bail-style dispatch.\n*\n* @param value — a listener's return value.\n* @returns `true` unless `value` is `null`, `false`, or `undefined`.\n*/\nfunction isBailed(value) {\n\treturn value !== null && value !== false && value !== void 0;\n}\n/**\n* Event bus installed as `ctx.events` and mixed into every context.\n*\n* The service supports concurrent, synchronous, serial, bail, and waterfall\n* dispatch and automatically disposes listeners with their owning fiber.\n*/\nvar EventsService = class {\n\tctx;\n\t_hooks = {};\n\tconstructor(ctx) {\n\t\tthis.ctx = ctx;\n\t\tdefineProperty(this, symbols.tracker, {\n\t\t\tproperty: \"ctx\",\n\t\t\tnoShadow: true\n\t\t});\n\t\tthis.on(\"internal/listener\", function(name, listener, options) {\n\t\t\tif (name === \"internal/update\" && !options.global) return (this.fiber._hooks[\"internal/update\"] ??= new DisposableList())[options.prepend ? \"unshift\" : \"push\"](listener);\n\t\t});\n\t\tthis.on(\"internal/update\", function(config, noSave, next) {\n\t\t\tconst cbs = [...this._hooks[\"internal/update\"] || []];\n\t\t\tconst _next = () => {\n\t\t\t\treturn (cbs.shift() ?? next).call(this, config, noSave, _next);\n\t\t\t};\n\t\t\treturn _next();\n\t\t}, {\n\t\t\tglobal: true,\n\t\t\tprepend: true\n\t\t});\n\t}\n\t/**\n\t* Resolve listeners for one dispatch and apply context filtering.\n\t*\n\t* @param type — the dispatch mode, reported on `internal/dispatch`.\n\t* @param args — the raw dispatch arguments; consumed up to the event name.\n\t* @returns the matching listener callbacks, bound to the dispatch `this`.\n\t*/\n\tdispatch(type, args) {\n\t\tconst thisArg = typeof args[0] === \"object\" || typeof args[0] === \"function\" ? args.shift() : null;\n\t\tconst name = args.shift();\n\t\tif (!name.startsWith(\"internal/\")) this.emit(\"internal/dispatch\", type, name, args, thisArg);\n\t\tconst filter = thisArg?.[Context.filter];\n\t\treturn (this._hooks[name] || []).filter((hook) => hook.global || !filter || filter.call(thisArg, hook.ctx)).map((hook) => hook.callback.bind(thisArg));\n\t}\n\t/**\n\t* Run listeners concurrently and wait for all of them.\n\t*\n\t* @param args — optional `this`, the event name, then listener arguments.\n\t* @returns a promise resolving once every listener has settled.\n\t*/\n\tasync parallel(...args) {\n\t\tconst errors = (await Promise.allSettled(this.dispatch(\"emit\", args).map(async (cb) => cb(...args)))).filter((result) => result.status === \"rejected\");\n\t\tif (errors.length) throw new AggregateError(errors.map((error) => error.reason));\n\t}\n\t/**\n\t* Run listeners synchronously without waiting for returned promises.\n\t*\n\t* @param args — optional `this`, the event name, then listener arguments.\n\t*/\n\temit(...args) {\n\t\tthis.dispatch(\"emit\", args).map((cb) => cb(...args));\n\t}\n\t/**\n\t* Run listeners in order, awaiting each, until one returns a bail value.\n\t*\n\t* @param args — optional `this`, the event name, then listener arguments.\n\t* @returns the first bail value (see {@link isBailed}), if any.\n\t*/\n\tasync serial(...args) {\n\t\tfor (const cb of this.dispatch(\"serial\", args)) {\n\t\t\tconst result = await cb(...args);\n\t\t\tif (isBailed(result)) return result;\n\t\t}\n\t}\n\t/**\n\t* Run listeners synchronously until one returns a bail value.\n\t*\n\t* @param args — optional `this`, the event name, then listener arguments.\n\t* @returns the first bail value (see {@link isBailed}), if any.\n\t*/\n\tbail(...args) {\n\t\tfor (const cb of this.dispatch(\"bail\", args)) {\n\t\t\tconst result = cb(...args);\n\t\t\tif (isBailed(result)) return result;\n\t\t}\n\t}\n\t/**\n\t* Compose listeners around the final `next` callback.\n\t*\n\t* The last dispatch argument is treated as the innermost `next`. Listeners\n\t* run outermost-first; a listener that does not call `next()` vetoes the\n\t* rest of the chain, including the built-in behavior.\n\t*\n\t* @param args — optional `this`, the event name, listener arguments, then `next`.\n\t* @returns the outermost listener's return value.\n\t*/\n\twaterfall(...args) {\n\t\tconst cbs = this.dispatch(\"waterfall\", args);\n\t\tconst inner = args.pop();\n\t\tconst next = () => {\n\t\t\treturn (cbs.shift() ?? inner)(...args);\n\t\t};\n\t\targs.push(next);\n\t\treturn next();\n\t}\n\t/**\n\t* Store a listener record as an effect on the current fiber.\n\t*\n\t* @param label — effect label shown in fiber diagnostics.\n\t* @param hooks — the listener list for one event.\n\t* @param callback — the listener to store.\n\t* @param options — placement and filtering options.\n\t* @returns a disposer that unregisters the listener.\n\t*/\n\tregister(label, hooks, callback, options) {\n\t\tconst method = options.prepend ? \"unshift\" : \"push\";\n\t\treturn this.ctx.fiber.effect(() => {\n\t\t\thooks[method]({\n\t\t\t\tctx: this.ctx,\n\t\t\t\tcallback,\n\t\t\t\t...options\n\t\t\t});\n\t\t\treturn () => this.unregister(hooks, callback);\n\t\t}, label);\n\t}\n\t/**\n\t* Remove a stored listener record.\n\t*\n\t* @param hooks — the listener list for one event.\n\t* @param callback — the listener to remove.\n\t* @returns `true` if the listener was found and removed.\n\t*/\n\tunregister(hooks, callback) {\n\t\tconst index = hooks.findIndex((hook) => hook.callback === callback);\n\t\tif (index >= 0) {\n\t\t\thooks.splice(index, 1);\n\t\t\treturn true;\n\t\t}\n\t}\n\t/**\n\t* Register an event listener owned by the current fiber.\n\t*\n\t* The listener is removed automatically when the fiber unloads. Throws\n\t* `CordisError('INACTIVE_EFFECT')` if the fiber is already disposed.\n\t*\n\t* @param name — the event name to listen for.\n\t* @param listener — called with the dispatch arguments.\n\t* @param options — listener options; a boolean is shorthand for `prepend`.\n\t* @returns a disposer removing the listener; `true` if it was still registered.\n\t*/\n\ton(name, listener, options) {\n\t\tif (typeof options !== \"object\") options = { prepend: options };\n\t\tthis.ctx.fiber.assertActive();\n\t\tlistener = this.ctx.reflect.bind(listener);\n\t\tconst result = this.bail(this.ctx, \"internal/listener\", name, listener, options);\n\t\tif (result) return result;\n\t\tconst hooks = this._hooks[name] ||= [];\n\t\tconst label = `ctx.on(${typeof name === \"string\" ? JSON.stringify(name) : name.toString()})`;\n\t\treturn this.register(label, hooks, listener, options);\n\t}\n\t/**\n\t* Register an event listener that disposes itself after the first call.\n\t*\n\t* @param name — the event name to listen for.\n\t* @param listener — called at most once with the dispatch arguments.\n\t* @param options — listener options; a boolean is shorthand for `prepend`.\n\t* @returns a disposer removing the listener; `true` if it was still registered.\n\t*/\n\tonce(name, listener, options) {\n\t\tconst dispose = this.on(name, function(...args) {\n\t\t\tdispose();\n\t\t\treturn listener.apply(this, args);\n\t\t}, options);\n\t\treturn dispose;\n\t}\n};\n//#endregion\n//#region lib/types/logger.js\n/** Built-in placeholder formatters used by `Logger.format()`. */\nconst defaultFormatters = {\n\ts: (value) => String(value),\n\td: (value) => Math.trunc(Number(value)),\n\ti: (value) => Math.trunc(Number(value)),\n\tf: (value) => Number(value),\n\to: (value) => JSON.stringify(value),\n\tO: (value) => JSON.stringify(value),\n\tc: () => \"\",\n\tC: (value, exporter, message) => {\n\t\treturn Logger.color(exporter, Logger.code(message.name, exporter.colors), value);\n\t}\n};\nfunction isAggregateError(error) {\n\treturn error instanceof Error && Array.isArray(error[\"errors\"]);\n}\n/** Logger facade for one named subsystem. */\nvar Logger = class {\n\tservice;\n\tstatic color(exporter, code, value, decoration = \"\") {\n\t\tif (!exporter.colors) return \"\" + value;\n\t\treturn `\\u001b[3${code < 8 ? code : \"8;5;\" + code}${exporter.colors >= 2 ? decoration : \"\"}m${value}\\u001b[0m`;\n\t}\n\tstatic code(name, level) {\n\t\tlet hash = 0;\n\t\tfor (let i = 0; i < name.length; i++) {\n\t\t\thash = (hash << 3) - hash + name.charCodeAt(i) + 13;\n\t\t\thash |= 0;\n\t\t}\n\t\tconst colors = !level ? [] : level >= 2 ? c256 : c16;\n\t\treturn colors[Math.abs(hash) % colors.length];\n\t}\n\tstatic format(exporter, message) {\n\t\tconst args = message.args.slice();\n\t\tif (args[0] instanceof Error) {\n\t\t\targs[0] = args[0].stack || args[0].message;\n\t\t\targs.unshift(\"%s\");\n\t\t} else if (typeof args[0] !== \"string\") args.unshift(\"%o\");\n\t\tlet format = args.shift();\n\t\tformat = format.replace(/%([a-zA-Z%])/g, (match, char) => {\n\t\t\tif (match === \"%%\") return \"%\";\n\t\t\tconst formatter = exporter.formatters?.[char] ?? defaultFormatters[char];\n\t\t\tif (typeof formatter === \"function\") return formatter(args.shift(), exporter, message);\n\t\t\treturn match;\n\t\t});\n\t\tconst oFormatter = exporter.formatters?.o ?? defaultFormatters.o;\n\t\tfor (let arg of args) {\n\t\t\tif (typeof arg === \"object\" && arg) arg = oFormatter(arg, exporter, message);\n\t\t\tformat += \" \" + arg;\n\t\t}\n\t\tconst { maxLength = 10240 } = exporter;\n\t\treturn format.split(/\\r?\\n/g).map((line) => {\n\t\t\treturn line.slice(0, maxLength) + (line.length > maxLength ? \"...\" : \"\");\n\t\t}).join(\"\\n\");\n\t}\n\tconstructor(options, service) {\n\t\tthis.service = service;\n\t\tObject.assign(this, options);\n\t\tthis.error = this._method(\"error\", 0);\n\t\tthis.info = this._method(\"info\", 1);\n\t\tthis.warn = this._method(\"warn\", 2);\n\t\tthis.debug = this._method(\"debug\", 3);\n\t}\n\t_method(type, level) {\n\t\treturn (...args) => {\n\t\t\tif (args.length === 1 && args[0] instanceof Error) {\n\t\t\t\tif (args[0].cause) this[type](args[0].cause);\n\t\t\t\telse if (isAggregateError(args[0])) {\n\t\t\t\t\targs[0].errors.forEach((error) => this[type](error));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst sn = ++this.service._snMessage;\n\t\t\tconst ts = Date.now();\n\t\t\tfor (const exporter of this.service.exporters.values()) {\n\t\t\t\tif ((exporter.levels?.[this.name] ?? exporter.levels?.default ?? this.level ?? 1) < level) continue;\n\t\t\t\tconst message = {\n\t\t\t\t\tsn,\n\t\t\t\t\tts,\n\t\t\t\t\ttype,\n\t\t\t\t\tlevel,\n\t\t\t\t\tname: this.name,\n\t\t\t\t\t...this.meta,\n\t\t\t\t\targs\n\t\t\t\t};\n\t\t\t\texporter.export(message);\n\t\t\t}\n\t\t};\n\t}\n};\n/** ANSI 16-color palette indexes used for logger name coloring. */\nconst c16 = [\n\t6,\n\t2,\n\t3,\n\t4,\n\t5,\n\t1\n];\n/** ANSI 256-color palette indexes used for logger name coloring. */\nconst c256 = [\n\t20,\n\t21,\n\t26,\n\t27,\n\t32,\n\t33,\n\t38,\n\t39,\n\t40,\n\t41,\n\t42,\n\t43,\n\t44,\n\t45,\n\t56,\n\t57,\n\t62,\n\t63,\n\t68,\n\t69,\n\t74,\n\t75,\n\t76,\n\t77,\n\t78,\n\t79,\n\t80,\n\t81,\n\t92,\n\t93,\n\t98,\n\t99,\n\t112,\n\t113,\n\t129,\n\t134,\n\t135,\n\t148,\n\t149,\n\t160,\n\t161,\n\t162,\n\t163,\n\t164,\n\t165,\n\t166,\n\t167,\n\t168,\n\t169,\n\t170,\n\t171,\n\t172,\n\t173,\n\t178,\n\t179,\n\t184,\n\t185,\n\t196,\n\t197,\n\t198,\n\t199,\n\t200,\n\t201,\n\t202,\n\t203,\n\t204,\n\t205,\n\t206,\n\t207,\n\t208,\n\t209,\n\t214,\n\t215,\n\t220,\n\t221\n];\n/**\n* Built-in logging service.\n*\n* Call `ctx.logger()` to create a named logger, or call `ctx.logger.info()`\n* directly to log with the current fiber-derived name.\n*/\nvar LoggerService = class LoggerService {\n\tbufferSize = 1e3;\n\tbuffer = [];\n\tctx;\n\t_snMessage = 0;\n\t_snExporter = 0;\n\texporters = /* @__PURE__ */ new Map();\n\tconstructor(ctx) {\n\t\tconst tracker = {\n\t\t\tproperty: \"ctx\",\n\t\t\tnoShadow: true\n\t\t};\n\t\tconst self = createCallable(\"logger\", joinPrototype(Object.getPrototypeOf(this), Function.prototype), tracker);\n\t\tObject.assign(self, this);\n\t\tself.ctx = ctx;\n\t\tdefineProperty(self, symbols.tracker, tracker);\n\t\tself.exporter({\n\t\t\tcolors: 3,\n\t\t\texport: (message) => {\n\t\t\t\tself.buffer.push(message);\n\t\t\t\tif (self.buffer.length > self.bufferSize) self.buffer = self.buffer.slice(-self.bufferSize);\n\t\t\t}\n\t\t});\n\t\treturn self;\n\t}\n\t/**\n\t* Register an exporter and dispose it with the current fiber.\n\t*\n\t* @param exporter — the sink that receives structured log messages.\n\t* @returns a disposer that removes the exporter.\n\t*/\n\texporter(exporter) {\n\t\treturn this.ctx.effect(() => {\n\t\t\tthis.exporters.set(++this._snExporter, exporter);\n\t\t\treturn () => this.exporters.delete(this._snExporter);\n\t\t}, \"ctx.logger.exporter()\");\n\t}\n\t_resolveConfig() {\n\t\tlet intercept = this.ctx[symbols.intercept];\n\t\tconst configs = [];\n\t\twhile (\"logger\" in intercept) {\n\t\t\tif (Object.hasOwn(intercept, \"logger\")) configs.unshift(intercept[\"logger\"]);\n\t\t\tintercept = Object.getPrototypeOf(intercept);\n\t\t}\n\t\treturn Object.assign({}, ...configs);\n\t}\n\t[symbols.invoke](name) {\n\t\tconst config = this._resolveConfig();\n\t\tconst fiber = (this.ctx[symbols.shadow] ?? this.ctx).fiber;\n\t\tname ??= config.name;\n\t\tname ??= hyphenate(fiber.name);\n\t\treturn new Logger({\n\t\t\tname,\n\t\t\tlevel: config.level,\n\t\t\tmeta: { fiber: new WeakRef(fiber) }\n\t\t}, this);\n\t}\n\tstatic {\n\t\tfor (const type of [\n\t\t\t\"error\",\n\t\t\t\"info\",\n\t\t\t\"warn\",\n\t\t\t\"debug\"\n\t\t]) LoggerService.prototype[type] = function(...args) {\n\t\t\treturn this()[type](...args);\n\t\t};\n\t}\n};\n//#endregion\n//#region lib/types/reflect.js\nfunction enhanceError(error) {\n\tconst lines = error.stack.split(\"\\n\");\n\tlines.splice(0, 2, `Error: ${error.message}`);\n\terror.stack = lines.join(\"\\n\");\n\treturn error;\n}\nconst RESERVED_WORDS = [\"prototype\", \"then\"];\nfunction isSpecialProperty(prop) {\n\treturn typeof prop === \"symbol\" || RESERVED_WORDS.includes(prop) || parseInt(prop).toString() === prop || prop.startsWith(\"_\");\n}\n/**\n* Reflection and service-resolution layer installed as `ctx.reflect`.\n*\n* This service powers the context proxy, service registration, accessors, and\n* the mixins that expose core service methods directly on `ctx`.\n*/\nvar ReflectService = class {\n\tctx;\n\t/** Proxy traps implementing service resolution for every context object. */\n\tstatic handler = {\n\t\tget: (target, prop, ctx) => {\n\t\t\tif (isSpecialProperty(prop)) return Reflect.get(target, prop, ctx);\n\t\t\tif (Reflect.has(target, prop)) return getTraceable(ctx, Reflect.get(target, prop, ctx));\n\t\t\tconst error = /* @__PURE__ */ new Error(`cannot get property \"${prop}\" without inject`);\n\t\t\ttry {\n\t\t\t\tconst def = target.reflect.props[prop];\n\t\t\t\tif (def?.type === \"accessor\") return def.get.call(ctx, ctx[symbols.receiver], error);\n\t\t\t\tif (!ctx.fiber.runtime) return ctx.reflect.get(prop, false);\n\t\t\t\treturn ctx.events.waterfall(\"internal/get\", ctx, prop, error, () => {\n\t\t\t\t\tconst key = target[symbols.isolate][prop];\n\t\t\t\t\tlet fiber = (ctx[symbols.shadow] ?? ctx).fiber;\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tconst impl = fiber.store?.[prop];\n\t\t\t\t\t\tif (impl) return getTraceable(ctx, impl.value);\n\t\t\t\t\t\tif (prop in fiber.inject) {\n\t\t\t\t\t\t\terror.message = `cannot get required service \"${prop}\" in inactive context`;\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!fiber.runtime) throw error;\n\t\t\t\t\t\tif (fiber.parent[symbols.isolate][prop] !== key) throw error;\n\t\t\t\t\t\tfiber = fiber.parent.fiber;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tthrow e === error ? enhanceError(e) : e;\n\t\t\t}\n\t\t},\n\t\tset: (target, prop, value, ctx) => {\n\t\t\tif (isSpecialProperty(prop)) return Reflect.set(target, prop, value, ctx);\n\t\t\tconst error = /* @__PURE__ */ new Error(`cannot set property \"${prop}\" without provide`);\n\t\t\tconst def = target.reflect.props[prop];\n\t\t\tif (!def) {\n\t\t\t\tif (!ctx.fiber.runtime) return Reflect.set(target, prop, value, ctx);\n\t\t\t\tthrow enhanceError(error);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tif (def.type === \"accessor\") {\n\t\t\t\t\tif (!def.set) return false;\n\t\t\t\t\treturn def.set.call(ctx, value, ctx[symbols.receiver], error);\n\t\t\t\t}\n\t\t\t\treturn ctx.events.waterfall(\"internal/set\", ctx, prop, value, error, () => {\n\t\t\t\t\treturn ctx.reflect.set(prop, value, error);\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tthrow e === error ? enhanceError(e) : e;\n\t\t\t}\n\t\t},\n\t\thas: (target, prop) => {\n\t\t\tif (isSpecialProperty(prop)) return Reflect.has(target, prop);\n\t\t\tif (Reflect.has(target, prop)) return true;\n\t\t\treturn !!target.reflect.props[prop];\n\t\t}\n\t};\n\t/** Service implementations, keyed by isolation label. */\n\tstore = Object.create(null);\n\t/** Declared context properties (services and accessors), by name. */\n\tprops = Object.create(null);\n\tconstructor(ctx) {\n\t\tthis.ctx = ctx;\n\t\tdefineProperty(this, symbols.tracker, {\n\t\t\tproperty: \"ctx\",\n\t\t\tnoShadow: true\n\t\t});\n\t\tthis.mixin(\"reflect\", [\n\t\t\t\"get\",\n\t\t\t\"set\",\n\t\t\t\"provide\",\n\t\t\t\"accessor\",\n\t\t\t\"mixin\"\n\t\t]);\n\t\tthis.mixin(\"fiber\", [\"runtime\", \"effect\"]);\n\t\tthis.mixin(\"registry\", [\"inject\", \"plugin\"]);\n\t\tthis.mixin(\"events\", [\n\t\t\t\"on\",\n\t\t\t\"once\",\n\t\t\t\"parallel\",\n\t\t\t\"emit\",\n\t\t\t\"serial\",\n\t\t\t\"bail\",\n\t\t\t\"waterfall\"\n\t\t]);\n\t}\n\t/**\n\t* Read a service from the store without the inject requirement.\n\t*\n\t* @param name — the service name.\n\t* @param strict — when `true`, only return implementations whose providing\n\t* fiber is currently active.\n\t* @returns the service value, or `undefined` when not (yet) provided.\n\t*/\n\tget(name, strict = true) {\n\t\treturn getTraceable(this.ctx, this._getImpl(name, strict)?.value);\n\t}\n\t_getImpl(name, strict = true) {\n\t\tconst key = this.ctx[symbols.isolate][name];\n\t\tconst impl = key && this.store[key];\n\t\tif (!impl) return;\n\t\tif (strict && impl.fiber.state !== 2) return;\n\t\treturn impl;\n\t}\n\t/**\n\t* Overwrite a provided service's value.\n\t*\n\t* @param name — the service name.\n\t* @param value — the new service value.\n\t* @param error — carrier for the caller stack in diagnostics.\n\t* @returns `true` on success.\n\t* @throws when `name` was never provided, or was provided by another fiber.\n\t*/\n\tset(name, value, error) {\n\t\tconst key = this.ctx[symbols.isolate][name];\n\t\tconst impl = this.store[key];\n\t\tif (!impl) throw new Error(`cannot set property \"${name}\" without provide`);\n\t\tif (impl.fiber !== this.ctx.fiber) throw new Error(`cannot set property \"${name}\" in multiple fibers`);\n\t\timpl.value = value;\n\t\treturn true;\n\t}\n\t/**\n\t* Register a service implementation owned by the current fiber.\n\t*\n\t* See the `ctx.provide()` overload above for the full contract.\n\t*\n\t* @param name — the service name.\n\t* @param value — the service value.\n\t* @param check — optional availability predicate for dependents.\n\t* @returns a disposer that unregisters the service.\n\t*/\n\tprovide(name, value, check) {\n\t\treturn this.ctx.fiber.effect(() => {\n\t\t\tif (!this.props[name]) this.props[name] ??= { type: \"service\" };\n\t\t\telse if (this.props[name].type !== \"service\") throw new Error(`property \"${name}\" is already declared as ${this.props[name].type}`);\n\t\t\tthis.props[name] = { type: \"service\" };\n\t\t\tthis.ctx.root[symbols.isolate][name] ??= Symbol(name);\n\t\t\tconst key = this.ctx[symbols.isolate][name];\n\t\t\tconst impl = {\n\t\t\t\tname,\n\t\t\t\tvalue,\n\t\t\t\tfiber: this.ctx.fiber,\n\t\t\t\tcheck\n\t\t\t};\n\t\t\tif (this.store[key]) throw new Error(`service \"${name}\" has been registered at <${this.store[key].fiber.name}>`);\n\t\t\tthis.store[key] = impl;\n\t\t\tthis.ctx.fiber.store[name] = impl;\n\t\t\tif (this.ctx.fiber.state === 2) this.notify([name]);\n\t\t\treturn async () => {\n\t\t\t\tdelete this.store[key];\n\t\t\t\tconst fibers = this.notify([name]);\n\t\t\t\tawait Promise.allSettled(fibers.map((fiber) => fiber.await()));\n\t\t\t\tdelete this.ctx.fiber.store[name];\n\t\t\t};\n\t\t}, `ctx.provide(${JSON.stringify(name)})`);\n\t}\n\t/**\n\t* Re-evaluate every fiber that requires one of the given services.\n\t*\n\t* @param names — the service names that changed.\n\t* @param filter — restricts notification to matching isolation scopes.\n\t* @returns the fibers whose dependency state was refreshed.\n\t*/\n\tnotify(names, filter = (ctx, name) => ctx[symbols.isolate][name] === this.ctx[symbols.isolate][name]) {\n\t\tconst fibers = [];\n\t\tfor (const runtime of this.ctx.registry.values()) for (const fiber of runtime.fibers) {\n\t\t\tlet hasUpdate = false;\n\t\t\tfor (const name of names) {\n\t\t\t\tif (!(name in fiber.inject)) continue;\n\t\t\t\tif (!filter(fiber.ctx, name)) continue;\n\t\t\t\thasUpdate = true;\n\t\t\t\tfiber._checkImpl(name);\n\t\t\t}\n\t\t\tif (!hasUpdate) continue;\n\t\t\tfiber._refresh();\n\t\t\tfibers.push(fiber);\n\t\t}\n\t\tfor (const name of names) {\n\t\t\tconst self = Object.create(this.ctx);\n\t\t\tself[symbols.filter] = (target) => filter(target, name);\n\t\t\tthis.ctx.events.emit(self, \"internal/service\", name, this._getImpl(name, false)?.value);\n\t\t}\n\t\treturn fibers;\n\t}\n\t/**\n\t* Define a computed context property backed by get/set hooks.\n\t*\n\t* @param name — the context property name.\n\t* @param options — the `get` hook and optional `set` hook.\n\t* @returns a disposer that removes the accessor.\n\t*/\n\taccessor(name, options) {\n\t\treturn this.ctx.fiber.effect(() => {\n\t\t\tif (name in this.props) throw new Error(`property \"${name}\" is already declared as ${this.props[name].type}`);\n\t\t\tthis.props[name] = {\n\t\t\t\ttype: \"accessor\",\n\t\t\t\t...options\n\t\t\t};\n\t\t\treturn () => delete this.props[name];\n\t\t}, `ctx.accessor(${JSON.stringify(name)})`);\n\t}\n\t/**\n\t* Expose selected members of a service directly on `ctx`.\n\t*\n\t* See the `ctx.mixin()` overload above for the full contract.\n\t*\n\t* @param source — a context property name or a source object.\n\t* @param mixins — keys to forward, or a source-key → ctx-key map.\n\t* @returns a disposer that removes all created accessors.\n\t*/\n\tmixin(source, mixins) {\n\t\tconst self = this;\n\t\treturn this.ctx.fiber.effect(function* () {\n\t\t\tconst entries = Array.isArray(mixins) ? mixins.map((key) => [key, key]) : Object.entries(mixins);\n\t\t\tconst getTarget = (ctx, error) => {\n\t\t\t\treturn ctx[source];\n\t\t\t};\n\t\t\tfor (const [key, value] of entries) yield self.accessor(value, {\n\t\t\t\tget(receiver, error) {\n\t\t\t\t\tconst service = getTarget(this, error);\n\t\t\t\t\tif (isNullable(service)) return service;\n\t\t\t\t\tconst mixin = receiver ? withProps(receiver, service) : service;\n\t\t\t\t\tconst value = Reflect.get(service, key, mixin);\n\t\t\t\t\tif (typeof value !== \"function\") return value;\n\t\t\t\t\treturn value.bind(mixin ?? service);\n\t\t\t\t},\n\t\t\t\tset(value, receiver, error) {\n\t\t\t\t\tconst service = getTarget(this, error);\n\t\t\t\t\tconst mixin = receiver ? withProps(receiver, service) : service;\n\t\t\t\t\treturn Reflect.set(service, key, value, mixin);\n\t\t\t\t}\n\t\t\t});\n\t\t}, `ctx.mixin(${JSON.stringify(source)})`);\n\t}\n\t/**\n\t* Attach this context's tracing wrapper to a value.\n\t*\n\t* @param value — the value to wrap.\n\t* @returns the traceable wrapper (or the value itself when not applicable).\n\t*/\n\ttrace(value) {\n\t\treturn getTraceable(this.ctx, value);\n\t}\n\t/**\n\t* Wrap a callback so calls trace `this` and arguments to this context.\n\t*\n\t* @param callback — the function to wrap.\n\t* @returns a proxy delegating to `callback` with traced values.\n\t*/\n\tbind(callback) {\n\t\treturn new Proxy(callback, {\n\t\t\tapply: (target, thisArg, args) => {\n\t\t\t\treturn Reflect.apply(target, this.trace(thisArg), args.map((arg) => this.trace(arg)));\n\t\t\t},\n\t\t\tconstruct: (target, args, newTarget) => {\n\t\t\t\treturn Reflect.construct(target, args.map((arg) => this.trace(arg)), newTarget);\n\t\t\t}\n\t\t});\n\t}\n};\n//#endregion\n//#region lib/types/fiber.js\nconst kValidationError = Symbol.for(\"ValidationError\");\n/** Error raised when plugin configuration fails standard-schema validation. */\nvar ValidationError = class extends TypeError {\n\tname = \"ValidationError\";\n\t/**\n\t* Build the aggregated message from schema issues.\n\t*\n\t* @param issues — the standard-schema issues, one message line each.\n\t*/\n\tconstructor(issues) {\n\t\tsuper(`invalid config:\\n` + issues.map((issue) => {\n\t\t\tif (issue.path) return ` - ${issue.message} (at ${issue.path.join(\".\")})`;\n\t\t\telse return ` - ${issue.message}`;\n\t\t}).join(\"\\n\"));\n\t}\n};\nObject.defineProperty(ValidationError.prototype, kValidationError, { value: true });\n/**\n* Validate and normalize config for a plugin runtime before it starts.\n*\n* @param runtime — the plugin runtime whose `Config` schema to apply.\n* @param config — the raw user config.\n* @returns the validated config, or `config` unchanged if the runtime has no schema.\n* @throws {ValidationError} when validation reports issues.\n*/\nfunction resolveConfig(runtime, config) {\n\tif (!runtime.Config) return config;\n\tconst result = runtime.Config[\"~standard\"].validate(config);\n\tif (\"then\" in result) throw new TypeError(\"Async config validation is not supported\");\n\tif (result.issues) throw new ValidationError(result.issues);\n\telse return result.value;\n}\nconst effectInertia = /* @__PURE__ */ new WeakMap();\nfunction runDisposable(dispose) {\n\tconst result = dispose();\n\treturn effectInertia.get(dispose)?.() ?? result;\n}\n/** Notify plugin teardown without allowing one observer to break ownership cleanup. */\nfunction emitPluginDisposed(context, fiber) {\n\tconst args = [\"internal/plugin\", fiber];\n\tlet callbacks;\n\ttry {\n\t\tcallbacks = context.events.dispatch(\"emit\", args);\n\t} catch (error) {\n\t\tcontext.logger.error(error);\n\t\treturn;\n\t}\n\tfor (const callback of callbacks) try {\n\t\tconst returned = callback(...args);\n\t\tPromise.resolve(returned).catch((error) => context.logger.error(error));\n\t} catch (error) {\n\t\tcontext.logger.error(error);\n\t}\n}\n/** Framework error with a stable machine-readable code. */\nvar CordisError = class CordisError extends Error {\n\tcode;\n\t/**\n\t* @param code — the stable error code; also the default message.\n\t* @param message — optional human-readable override.\n\t*/\n\tconstructor(code, message) {\n\t\tsuper(message ?? CordisError.Code[code]);\n\t\tthis.code = code;\n\t}\n};\n/** Cordis error code definitions. */\n(function(CordisError) {\n\tCordisError.Code = { INACTIVE_EFFECT: \"cannot create effect on inactive context\" };\n})(CordisError || (CordisError = {}));\nconst INACTIVE = \"__INACTIVE__\";\n/**\n* Runtime instance of one plugin application.\n*\n* A fiber tracks dependency state, validated config, lifecycle effects, and\n* cleanup for the plugin context returned by `ctx.plugin()`.\n*/\nvar Fiber = class {\n\tparent;\n\tinject;\n\truntime;\n\t/** Unique id within the registry; 0 for the root fiber, `null` once disposed. */\n\tuid;\n\t/** The context this fiber's plugin runs in (extends the parent context). */\n\tctx;\n\t/** The validated plugin config (updated by `update()`). */\n\tconfig;\n\t/** The raw plugin config, re-resolved before each activation. */\n\t_config;\n\t/** Current lifecycle state; transitions emit `internal/status`. */\n\tstate = 0;\n\t/** Dispose this fiber: unload the plugin, then settle once cleanup finished. */\n\tdispose;\n\t/** Snapshot of required service implementations while loaded; `undefined` otherwise. */\n\tstore;\n\t/** The in-flight load/unload transition, if one is currently running. */\n\tinertia;\n\t_hooks = Object.create(null);\n\t_disposables = new DisposableList();\n\tcontext;\n\t_error;\n\t_runner;\n\t_store = Object.create(null);\n\t/**\n\t* Create a fiber. Plugin authors normally obtain fibers from `ctx.plugin()`\n\t* rather than constructing them directly.\n\t*\n\t* @param parent — the context the plugin was loaded from.\n\t* @param config — raw config, validated against the runtime's schema.\n\t* @param inject — resolved dependency map (service name → intercept config).\n\t* @param runtime — the shared plugin runtime, or `null` for the root fiber.\n\t* @param getOuterStack — captures the caller stack for effect diagnostics.\n\t*/\n\tconstructor(parent, config, inject, runtime, getOuterStack) {\n\t\tthis.parent = parent;\n\t\tthis.inject = inject;\n\t\tthis.runtime = runtime;\n\t\tthis._config = config;\n\t\tconst collect = (dispose) => {\n\t\t\tthis._disposables.push(dispose);\n\t\t};\n\t\tif (runtime) {\n\t\t\tthis.uid = parent.registry.counter;\n\t\t\tthis.ctx = this.context = parent.extend({ fiber: this });\n\t\t\tconst injectEntries = Object.entries(this.inject);\n\t\t\tif (injectEntries.length) {\n\t\t\t\tthis.ctx[Context.intercept] = Object.create(parent[Context.intercept]);\n\t\t\t\tfor (const [name, config] of injectEntries) {\n\t\t\t\t\tif (isNullable(config)) continue;\n\t\t\t\t\tthis.ctx[Context.intercept][name] = config;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._runner = {\n\t\t\t\tepoch: INACTIVE,\n\t\t\t\tgetOuterStack,\n\t\t\t\texecute: function() {\n\t\t\t\t\tif (isConstructor(runtime.callback)) {\n\t\t\t\t\t\tconst instance = new runtime.callback(this.ctx, this.config);\n\t\t\t\t\t\tfor (const hook of instance?.[symbols.initHooks] ?? []) hook();\n\t\t\t\t\t\treturn instance?.[symbols.init]?.();\n\t\t\t\t\t} else return runtime.callback(this.ctx, this.config);\n\t\t\t\t},\n\t\t\t\tcollect\n\t\t\t};\n\t\t\tthis.dispose = parent.fiber.effect(() => {\n\t\t\t\tconst remove = runtime.fibers.push(this);\n\t\t\t\treturn async () => {\n\t\t\t\t\tthis.uid = null;\n\t\t\t\t\temitPluginDisposed(this.context, this);\n\t\t\t\t\tif (this.ctx.registry.has(runtime.callback)) {\n\t\t\t\t\t\tremove();\n\t\t\t\t\t\tif (!runtime.fibers.length) this.ctx.registry.delete(runtime.callback);\n\t\t\t\t\t}\n\t\t\t\t\tthis._setEpoch(INACTIVE);\n\t\t\t\t\tif (!this.inertia) this._updateState(() => {\n\t\t\t\t\t\tthis.inertia = this._unload();\n\t\t\t\t\t\treturn 5;\n\t\t\t\t\t});\n\t\t\t\t\twhile (this.inertia) await this.inertia;\n\t\t\t\t};\n\t\t\t}, \"ctx.plugin()\");\n\t\t\ttry {\n\t\t\t\tthis.context.emit(\"internal/plugin\", this);\n\t\t\t} catch (error) {\n\t\t\t\tPromise.resolve(this.dispose()).catch((reason) => this.ctx.logger.error(reason));\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (this.uid !== null && parent.fiber.state !== 5) {\n\t\t\t\tfor (const name of Object.keys(this.inject)) this._checkImpl(name);\n\t\t\t\tthis._refresh();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.uid = 0;\n\t\t\tthis.ctx = this.context = parent;\n\t\t\tthis.state = 2;\n\t\t\tthis.store = Object.create(null);\n\t\t\tthis._runner = {\n\t\t\t\tepoch: \"\",\n\t\t\t\tgetOuterStack,\n\t\t\t\texecute: () => {},\n\t\t\t\tcollect\n\t\t\t};\n\t\t\tthis.dispose = () => this.restart();\n\t\t}\n\t}\n\t/** The plugin's display name, inherited from the nearest named ancestor, else `'root'`. */\n\tget name() {\n\t\tlet fiber = this;\n\t\tdo {\n\t\t\tif (fiber.runtime?.name) return fiber.runtime.name;\n\t\t\tfiber = fiber.parent.fiber;\n\t\t} while (fiber !== fiber.parent.fiber);\n\t\treturn \"root\";\n\t}\n\t/**\n\t* Throw if the fiber has already been disposed.\n\t*\n\t* @returns nothing when the fiber is still active.\n\t* @throws {CordisError} `INACTIVE_EFFECT` when the fiber's uid has been cleared.\n\t*/\n\tassertActive() {\n\t\tif (this.uid !== null) return;\n\t\tthrow new CordisError(\"INACTIVE_EFFECT\");\n\t}\n\t_execute(runner) {\n\t\tconst oldEpoch = runner.epoch;\n\t\treturn composeError((info) => {\n\t\t\tconst safeCollect = (dispose) => {\n\t\t\t\tif (typeof dispose === \"function\") runner.collect(dispose);\n\t\t\t\telse if (!isNullable(dispose)) throw new TypeError(\"Invalid effect\");\n\t\t\t};\n\t\t\tconst effect = runner.execute.call(this);\n\t\t\tif (typeof effect === \"function\") return runner.collect(effect);\n\t\t\telse if (isNullable(effect)) {} else if (!isObject(effect)) throw new TypeError(\"Invalid effect\");\n\t\t\telse if (\"then\" in effect) return effect.then(safeCollect);\n\t\t\telse if (Symbol.iterator in effect) {\n\t\t\t\tinfo.error = /* @__PURE__ */ new Error();\n\t\t\t\tconst iter = effect[Symbol.iterator]();\n\t\t\t\twhile (true) {\n\t\t\t\t\tconst result = iter.next();\n\t\t\t\t\tsafeCollect(result.value);\n\t\t\t\t\tif (result.done) return;\n\t\t\t\t}\n\t\t\t} else if (Symbol.asyncIterator in effect) {\n\t\t\t\tconst iter = effect[Symbol.asyncIterator]();\n\t\t\t\treturn (async () => {\n\t\t\t\t\tawait Promise.resolve();\n\t\t\t\t\tinfo.error = /* @__PURE__ */ new Error();\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tif (runner.epoch !== oldEpoch) return;\n\t\t\t\t\t\tconst result = await iter.next();\n\t\t\t\t\t\tsafeCollect(result.value);\n\t\t\t\t\t\tif (result.done) return;\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t} else throw new TypeError(\"Invalid effect\");\n\t\t}, runner.getOuterStack);\n\t}\n\teffect(execute, label = \"anonymous\") {\n\t\tthis.assertActive();\n\t\tif (this.state === 5) throw new CordisError(\"INACTIVE_EFFECT\");\n\t\tconst disposables = [];\n\t\tlet disposing = false;\n\t\tlet disposalTask;\n\t\tconst dispose = () => {\n\t\t\tif (disposing) return disposalTask;\n\t\t\tdisposing = true;\n\t\t\tlet task;\n\t\t\tfor (const disposable of disposables.splice(0).reverse()) if (task) task = task.then(() => runDisposable(disposable));\n\t\t\telse {\n\t\t\t\tconst result = runDisposable(disposable);\n\t\t\t\tif (isObject(result) && \"then\" in result) task = result;\n\t\t\t}\n\t\t\treturn disposalTask = task;\n\t\t};\n\t\tconst meta = {\n\t\t\tlabel,\n\t\t\tchildren: []\n\t\t};\n\t\tconst runner = {\n\t\t\texecute,\n\t\t\tepoch: true,\n\t\t\tcollect: (dispose) => {\n\t\t\t\tdisposables.push(dispose);\n\t\t\t\tthis._disposables.delete(dispose);\n\t\t\t\tif (dispose[symbols.effect]) meta.children.push(dispose[symbols.effect]);\n\t\t\t},\n\t\t\tgetOuterStack: buildOuterStack()\n\t\t};\n\t\tlet task;\n\t\tlet executing = true;\n\t\tlet resolveSetup;\n\t\tlet rejectSetup;\n\t\tlet setupBarrier;\n\t\tlet setupFailed = false;\n\t\tlet inFlight;\n\t\tlet removeWrapper = () => false;\n\t\tconst waitForSetup = () => {\n\t\t\tsetupBarrier ??= new Promise((resolve, reject) => {\n\t\t\t\tresolveSetup = resolve;\n\t\t\t\trejectSetup = reject;\n\t\t\t});\n\t\t\treturn setupBarrier;\n\t\t};\n\t\tconst disposeAfter = (setup) => {\n\t\t\treturn Promise.resolve(setup).then(() => dispose(), async (reason) => {\n\t\t\t\tawait dispose();\n\t\t\t\tthrow reason;\n\t\t\t});\n\t\t};\n\t\tconst finalizeDisposal = (callback) => {\n\t\t\tlet result;\n\t\t\ttry {\n\t\t\t\tresult = callback();\n\t\t\t} catch (error) {\n\t\t\t\tremoveWrapper();\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (isObject(result) && \"then\" in result) {\n\t\t\t\tconst pending = Promise.resolve(result).finally(() => {\n\t\t\t\t\tremoveWrapper();\n\t\t\t\t\tif (inFlight === pending) inFlight = void 0;\n\t\t\t\t});\n\t\t\t\treturn inFlight = pending;\n\t\t\t}\n\t\t\tremoveWrapper();\n\t\t\treturn result;\n\t\t};\n\t\tconst wrapper = defineProperty(() => {\n\t\t\tif (!runner.epoch) return setupFailed ? inFlight : void 0;\n\t\t\trunner.epoch = false;\n\t\t\treturn finalizeDisposal(() => {\n\t\t\t\tif (executing) return disposeAfter(waitForSetup());\n\t\t\t\treturn task ? disposeAfter(task) : dispose();\n\t\t\t});\n\t\t}, symbols.effect, meta);\n\t\teffectInertia.set(wrapper, () => inFlight);\n\t\tremoveWrapper = this._disposables.push(wrapper);\n\t\ttry {\n\t\t\ttask = this._execute(runner);\n\t\t} catch (reason) {\n\t\t\texecuting = false;\n\t\t\tsetupFailed = true;\n\t\t\trunner.epoch = false;\n\t\t\tlet cleanup;\n\t\t\ttry {\n\t\t\t\tcleanup = finalizeDisposal(dispose);\n\t\t\t} finally {\n\t\t\t\trejectSetup?.(reason);\n\t\t\t}\n\t\t\tif (isObject(cleanup) && \"then\" in cleanup) cleanup.catch((error) => this.ctx.logger.error(error));\n\t\t\tthrow reason;\n\t\t}\n\t\texecuting = false;\n\t\tif (setupBarrier) Promise.resolve(task).then(resolveSetup, rejectSetup);\n\t\ttask?.catch(() => {\n\t\t\tif (!runner.epoch) return dispose();\n\t\t\treturn finalizeDisposal(dispose);\n\t\t}).catch((error) => this.ctx.logger.error(error));\n\t\tconst disposeAsync = () => {\n\t\t\tif (!runner.epoch) return;\n\t\t\trunner.epoch = false;\n\t\t\treturn finalizeDisposal(dispose);\n\t\t};\n\t\twrapper.then = async (onFulfilled, onRejected) => {\n\t\t\treturn Promise.resolve(task).then(() => disposeAsync).then(onFulfilled, onRejected);\n\t\t};\n\t\treturn wrapper;\n\t}\n\t/**\n\t* Return metadata for currently registered effects.\n\t*\n\t* @returns one {@link EffectMeta} tree per labeled live effect.\n\t*/\n\tgetEffects() {\n\t\treturn [...this._disposables].map((dispose) => dispose[symbols.effect]).filter(Boolean);\n\t}\n\t_getState() {\n\t\tif (this.uid === null) return 4;\n\t\tif (this._error) return 3;\n\t\tif (this._runner.epoch !== INACTIVE) return 2;\n\t\treturn 0;\n\t}\n\t_updateState(callback) {\n\t\tconst oldState = this.state;\n\t\tthis.state = callback() ?? this._getState();\n\t\tif (oldState === this.state) return;\n\t\tthis.context.emit(\"internal/status\", this, oldState);\n\t\tif (oldState !== 2 && this.state !== 2) return;\n\t\tfor (const key of Reflect.ownKeys(this.ctx.reflect.store)) {\n\t\t\tconst impl = this.ctx.reflect.store[key];\n\t\t\tif (impl.fiber !== this) continue;\n\t\t\tthis.ctx.reflect.notify([impl.name]);\n\t\t}\n\t}\n\t_checkImpl(name) {\n\t\tconst impl = this.ctx.reflect._getImpl(name, true);\n\t\tif (!impl) return delete this._store[name];\n\t\ttry {\n\t\t\tif (impl.check && !impl.check.call(getTraceable(this.ctx, impl.value))) return delete this._store[name];\n\t\t} catch (error) {\n\t\t\timpl.fiber.ctx.logger.error(error);\n\t\t\treturn delete this._store[name];\n\t\t}\n\t\tthis._store[name] = impl;\n\t}\n\t_refresh() {\n\t\tlet epoch = false;\n\t\tepoch = \"\";\n\t\tfor (const name of Object.keys(this.inject)) {\n\t\t\tconst impl = this._store[name];\n\t\t\tif (!impl) {\n\t\t\t\tepoch = INACTIVE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tepoch += \":\" + impl.fiber.uid;\n\t\t}\n\t\tthis._setEpoch(epoch);\n\t}\n\t_setEpoch(epoch) {\n\t\tconst oldEpoch = this._runner.epoch;\n\t\tif (epoch === oldEpoch) return;\n\t\tthis._runner.epoch = epoch;\n\t\tif (this.inertia) return;\n\t\tthis._updateState(() => {\n\t\t\tif (epoch !== INACTIVE && oldEpoch === INACTIVE) {\n\t\t\t\tthis.inertia = this._reload();\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tthis.inertia = this._unload();\n\t\t\t\treturn 5;\n\t\t\t}\n\t\t});\n\t}\n\t_resolveConfig(config) {\n\t\tconfig = this.context.waterfall(this, \"internal/config\", config, () => config);\n\t\treturn this.runtime ? resolveConfig(this.runtime, config) : config;\n\t}\n\tasync _reload() {\n\t\tthis.store = { ...this._store };\n\t\tconst oldEpoch = this._runner.epoch;\n\t\ttry {\n\t\t\tawait Promise.resolve();\n\t\t\tif (this._runner.epoch === oldEpoch) {\n\t\t\t\tthis.config = this._resolveConfig(this._config);\n\t\t\t\tawait this._execute(this._runner);\n\t\t\t\tthis._error = void 0;\n\t\t\t}\n\t\t} catch (reason) {\n\t\t\tthis.ctx.logger.error(reason);\n\t\t\tthis._error = reason;\n\t\t\tthis._runner.epoch = INACTIVE;\n\t\t}\n\t\tthis._updateState(() => {\n\t\t\tif (this._runner.epoch === oldEpoch) this.inertia = void 0;\n\t\t\telse {\n\t\t\t\tthis.inertia = this._unload();\n\t\t\t\treturn 5;\n\t\t\t}\n\t\t});\n\t}\n\tasync _unload() {\n\t\tawait Promise.all(this._disposables.clear().map(async (dispose) => {\n\t\t\ttry {\n\t\t\t\tawait composeError(async (info) => {\n\t\t\t\t\tawait Promise.resolve();\n\t\t\t\t\tinfo.error = /* @__PURE__ */ new Error();\n\t\t\t\t\tawait runDisposable(dispose);\n\t\t\t\t}, this._runner.getOuterStack);\n\t\t\t} catch (reason) {\n\t\t\t\tthis.ctx.logger.error(reason);\n\t\t\t}\n\t\t}));\n\t\tthis.store = void 0;\n\t\tthis._updateState(() => {\n\t\t\tif (this._runner.epoch === INACTIVE) this.inertia = void 0;\n\t\t\telse {\n\t\t\t\tthis.inertia = this._reload();\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t});\n\t}\n\t/**\n\t* Wait for current lifecycle work and rethrow startup errors.\n\t*\n\t* @returns this fiber, once it has settled into a stable state.\n\t* @throws the config-validation or plugin-startup error, if any.\n\t*/\n\tasync await() {\n\t\twhile (this.inertia) await this.inertia;\n\t\tif (this._error) throw this._error;\n\t\treturn this;\n\t}\n\t/**\n\t* Dispose and immediately reload this plugin with its current config.\n\t*\n\t* @returns a promise resolving once the reload settled.\n\t* @throws {CordisError} `INACTIVE_EFFECT` when the fiber is already disposed.\n\t*/\n\tasync restart() {\n\t\tthis.assertActive();\n\t\tthis._setEpoch(INACTIVE);\n\t\tthis._refresh();\n\t\tawait this.await();\n\t}\n\t/**\n\t* Validate and apply new config, then restart the plugin.\n\t*\n\t* Runs the `internal/update` waterfall first, so update hooks (and HMR)\n\t* can veto or replace the restart.\n\t*\n\t* @param config — the new raw config; validated before anything restarts.\n\t* @param noSave — hint for persistence hooks not to write the change back.\n\t* @returns the update waterfall result; the default restart returns a promise.\n\t* @throws when validation, an update listener, or the restarted plugin fails.\n\t*/\n\tupdate(config, noSave = false) {\n\t\tthis.assertActive();\n\t\tthis._config = config;\n\t\tif (this.state !== 2) {\n\t\t\tthis._error = void 0;\n\t\t\tthis._setEpoch(INACTIVE);\n\t\t\tthis._refresh();\n\t\t\treturn;\n\t\t}\n\t\tconfig = this._resolveConfig(config);\n\t\treturn this.context.waterfall(this, \"internal/update\", config, noSave, () => {\n\t\t\tthis.config = config;\n\t\t\tthis._error = void 0;\n\t\t\treturn this.restart();\n\t\t});\n\t}\n};\n//#endregion\n//#region lib/types/registry.js\nfunction isApplicable(object) {\n\treturn object && typeof object === \"object\" && typeof object.apply === \"function\";\n}\n/**\n* Decorator for declaring service dependencies on classes or class methods.\n*\n* On classes it contributes to the plugin's static `inject` map. On methods it\n* delays the method call until the declared services are available.\n*/\n/**\n* @param name — the required service name.\n* @param config — optional intercept config applied for that service.\n* @returns the class or method decorator.\n*/\nfunction Inject(name, config) {\n\treturn function(value, decorator) {\n\t\tif (decorator.kind === \"class\") {\n\t\t\tif (!Object.hasOwn(value, \"inject\")) {\n\t\t\t\tdefineProperty(value, \"inject\", Object.create(Object.getPrototypeOf(value).inject ?? null));\n\t\t\t\tdefineProperty(value.inject, symbols.checkProto, true);\n\t\t\t}\n\t\t\tvalue.inject[name] = config;\n\t\t} else if (decorator.kind === \"method\") {\n\t\t\tconst inject = (value[symbols.metadata] ??= {}).inject ??= Object.create(null);\n\t\t\tinject[name] = config;\n\t\t\tdecorator.addInitializer(function() {\n\t\t\t\tconst property = this[symbols.tracker]?.property;\n\t\t\t\t(this[symbols.initHooks] ??= []).push(() => {\n\t\t\t\t\tthis.ctx.inject(inject, (ctx) => {\n\t\t\t\t\t\treturn value.call(property ? withProps(this, { [property]: ctx }) : this);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t} else throw new Error(\"@Inject() can only be used on class or class methods\");\n\t};\n}\n/** Utilities for normalizing plugin dependency declarations. */\n(function(Inject) {\n\t/**\n\t* Convert array/object/class-inherited inject metadata into a plain map.\n\t*\n\t* @param inject — the declaration to normalize; `null`/`undefined` add nothing.\n\t* @param result — the map to fill (service name → intercept config or `null`).\n\t* @returns `result`.\n\t*/\n\tfunction resolve(inject, result = Object.create(null)) {\n\t\tif (!inject) return result;\n\t\tif (Array.isArray(inject)) for (const name of inject) result[name] = null;\n\t\telse if (Reflect.has(inject, symbols.checkProto)) {\n\t\t\tObject.assign(result, resolve(Object.getPrototypeOf(inject)));\n\t\t\tfor (const name of Object.keys(inject)) result[name] = inject[name] ?? null;\n\t\t} else for (const name of Object.keys(inject)) result[name] = inject[name] ?? null;\n\t\treturn result;\n\t}\n\tInject.resolve = resolve;\n})(Inject || (Inject = {}));\n/**\n* Plugin registry installed as `ctx.registry` and mixed into every context.\n*\n* It normalizes plugin shapes, tracks plugin runtimes, starts fibers, and\n* exposes map-like inspection over active plugin callbacks.\n*/\nvar RegistryService = class {\n\tctx;\n\t_counter = 0;\n\t_internal = /* @__PURE__ */ new Map();\n\tconstructor(ctx) {\n\t\tthis.ctx = ctx;\n\t\tdefineProperty(this, symbols.tracker, {\n\t\t\tproperty: \"ctx\",\n\t\t\tnoShadow: true\n\t\t});\n\t}\n\t/** Allocate the next fiber uid (increments on every read). */\n\tget counter() {\n\t\treturn ++this._counter;\n\t}\n\t/** Number of registered plugin runtimes. */\n\tget size() {\n\t\treturn this._internal.size;\n\t}\n\t/**\n\t* Resolve a supported plugin shape to its executable callback.\n\t*\n\t* @param plugin — a function, class, or `{ apply }` object plugin.\n\t* @returns the callback identifying the plugin, or `undefined` if invalid.\n\t*/\n\tresolve(plugin) {\n\t\ttry {\n\t\t\tif (typeof plugin === \"function\") return plugin;\n\t\t\tif (isApplicable(plugin)) return plugin.apply;\n\t\t} catch {}\n\t}\n\t/**\n\t* Look up the runtime record for a plugin.\n\t*\n\t* @param plugin — any supported plugin shape.\n\t* @returns the runtime, or `undefined` when the plugin is not registered.\n\t*/\n\tget(plugin) {\n\t\tconst key = this.resolve(plugin);\n\t\treturn key && this._internal.get(key);\n\t}\n\t/**\n\t* Check whether a plugin has a registered runtime.\n\t*\n\t* @param plugin — any supported plugin shape.\n\t* @returns `true` when at least one fiber of the plugin exists.\n\t*/\n\thas(plugin) {\n\t\tconst key = this.resolve(plugin);\n\t\treturn !!key && this._internal.has(key);\n\t}\n\t/**\n\t* Dispose every running fiber for a plugin and remove its runtime record.\n\t*\n\t* @param plugin — any supported plugin shape.\n\t* @returns the removed runtime, or `undefined` when none was registered.\n\t*/\n\tdelete(plugin) {\n\t\tconst key = this.resolve(plugin);\n\t\tconst runtime = key && this._internal.get(key);\n\t\tif (!runtime) return;\n\t\tthis._internal.delete(key);\n\t\tfor (const fiber of runtime.fibers) fiber.dispose();\n\t\treturn runtime;\n\t}\n\t/** Iterate the registered plugin callbacks. */\n\tkeys() {\n\t\treturn this._internal.keys();\n\t}\n\t/** Iterate the registered plugin runtimes. */\n\tvalues() {\n\t\treturn this._internal.values();\n\t}\n\t/** Iterate `[callback, runtime]` pairs. */\n\tentries() {\n\t\treturn this._internal.entries();\n\t}\n\t/**\n\t* Visit every registered runtime.\n\t*\n\t* @param callback — receives each runtime and its identifying callback.\n\t*/\n\tforEach(callback) {\n\t\treturn this._internal.forEach(callback);\n\t}\n\t/**\n\t* Start a callback once the requested dependencies are available.\n\t*\n\t* @param inject — required services, as an array or a name → config map.\n\t* @param callback — plugin body called with `(ctx, config)`.\n\t* @returns the fiber; awaiting it settles once loading finished.\n\t*/\n\tinject(inject, callback) {\n\t\treturn this.plugin({\n\t\t\tinject,\n\t\t\tapply: callback,\n\t\t\tname: callback.name\n\t\t});\n\t}\n\t/**\n\t* Start a plugin in the current context and return its fiber.\n\t*\n\t* Creates (or reuses) the plugin's runtime record, then starts a new fiber\n\t* under the current context. Throws if `plugin` is not a supported shape or\n\t* if the current fiber is already disposed.\n\t*\n\t* @param plugin — a function, class, or `{ apply }` object plugin.\n\t* @param config — the plugin config, validated against its `Config` schema.\n\t* @param getOuterStack — captures the caller stack for effect diagnostics.\n\t* @returns the fiber; awaiting it settles once loading finished.\n\t*/\n\tplugin(plugin, config, getOuterStack = buildOuterStack()) {\n\t\tconst callback = this.resolve(plugin);\n\t\tif (!callback) throw new Error(\"invalid plugin, expect function or object with an \\\"apply\\\" method, received \" + typeof plugin);\n\t\tthis.ctx.fiber.assertActive();\n\t\tlet runtime = this._internal.get(callback);\n\t\tif (!runtime) {\n\t\t\tlet name = plugin.name;\n\t\t\tif (name === \"apply\") name = void 0;\n\t\t\truntime = {\n\t\t\t\tname,\n\t\t\t\tcallback,\n\t\t\t\tfibers: new DisposableList(),\n\t\t\t\tConfig: plugin.Config\n\t\t\t};\n\t\t\tthis._internal.set(callback, runtime);\n\t\t}\n\t\tconst fiber = new Fiber(this.ctx, config, Inject.resolve(plugin.inject), runtime, getOuterStack);\n\t\tconst wrapped = Object.create(fiber);\n\t\twrapped.then = (onFulfilled, onRejected) => {\n\t\t\treturn fiber.await().then(onFulfilled, onRejected);\n\t\t};\n\t\treturn wrapped;\n\t}\n};\n//#endregion\n//#region lib/types/context.js\n/**\n* Root and child dependency containers for Cordis plugins.\n*\n* A context is a proxy: normal property reads go through the service resolver,\n* while `extend()`, `isolate()`, and `intercept()` create scoped child\n* contexts without mutating their parent.\n*/\nvar Context = class Context {\n\t/** Symbol key under which a disposer exposes its {@link EffectMeta} diagnostics tree. */\n\tstatic effect = symbols.effect;\n\t/** Symbol key for a context's listener filter, consulted on every event dispatch. */\n\tstatic filter = symbols.filter;\n\t/** Symbol key of the isolation map (see the `Context[symbols.isolate]` property). */\n\tstatic isolate = symbols.isolate;\n\t/** Symbol key of the intercept map (see the `Context[symbols.intercept]` property). */\n\tstatic intercept = symbols.intercept;\n\t/**\n\t* Returns true for Cordis context proxies and context prototypes.\n\t*\n\t* Works across realms and across multiple copies of cordis, because the\n\t* brand is keyed by a global symbol rather than by `instanceof`.\n\t*\n\t* @param value — the value to test.\n\t* @returns `true` if `value` is a Cordis context, narrowing its type.\n\t*/\n\tstatic is(value) {\n\t\treturn !!value?.[Context.is];\n\t}\n\tstatic {\n\t\tContext.is[Symbol.toPrimitive] = () => Symbol.for(\"cordis.is\");\n\t\tContext.prototype[Context.is] = true;\n\t}\n\t/** Create the root context and install the built-in services. */\n\tconstructor() {\n\t\tthis[symbols.isolate] = Object.create(null);\n\t\tthis[symbols.intercept] = Object.create(null);\n\t\tconst self = new Proxy(this, ReflectService.handler);\n\t\tthis.root = self;\n\t\tthis.baseUrl = void 0;\n\t\tthis.fiber = new Fiber(self, {}, Object.create(null), null, () => []);\n\t\tthis.reflect = new ReflectService(self);\n\t\tthis.registry = new RegistryService(self);\n\t\tthis.events = new EventsService(self);\n\t\tthis.logger = new LoggerService(self);\n\t\tthis.fiber._disposables.clear();\n\t\treturn self;\n\t}\n\t[Symbol.for(\"nodejs.util.inspect.custom\")]() {\n\t\treturn `Context <${this.fiber.name}>`;\n\t}\n\t/**\n\t* Create a child context with extra metadata on top of the current scope.\n\t*\n\t* The child prototypally inherits every property of this context; own\n\t* properties of `meta` shadow the inherited ones. The parent is not mutated.\n\t*\n\t* @param meta — own properties (including symbol keys) to define on the child.\n\t* @returns a child context inheriting from this one.\n\t*/\n\textend(meta = {}) {\n\t\tconst shadow = Reflect.getOwnPropertyDescriptor(this, symbols.shadow)?.value;\n\t\tconst self = Object.create(getTraceable(this, this));\n\t\tfor (const prop of Reflect.ownKeys(meta)) Object.defineProperty(self, prop, Reflect.getOwnPropertyDescriptor(meta, prop));\n\t\tif (!shadow) return self;\n\t\treturn Object.assign(Object.create(self), { [symbols.shadow]: shadow });\n\t}\n\t/**\n\t* Create a child context with an independent service scope for `name`.\n\t*\n\t* Below the returned context, reads and writes of the service `name`\n\t* resolve against the new label instead of the parent's, so a different\n\t* implementation can be provided without affecting the parent scope.\n\t* Passing the same `label` to two `isolate()` calls joins their scopes.\n\t*\n\t* @param name — the service name to isolate.\n\t* @param label — scope label to join; defaults to a fresh unique symbol.\n\t* @returns a child context whose `name` service resolves in the new scope.\n\t*/\n\tisolate(name, label) {\n\t\tconst shadow = Object.create(this[symbols.isolate]);\n\t\tshadow[name] = label ?? Symbol(name);\n\t\treturn this.extend({ [symbols.isolate]: shadow });\n\t}\n\tintercept(name, config) {\n\t\tconst intercept = Object.create(this[symbols.intercept]);\n\t\tintercept[name] = config;\n\t\treturn this.extend({ [symbols.intercept]: intercept });\n\t}\n};\n//#endregion\n//#region lib/types/service.js\n/**\n* Base class for services that expose a named API on `ctx`.\n*\n* Subclasses call `super(ctx, name)` from their constructor. The service is\n* registered immediately and is automatically removed with the owning fiber.\n*/\nvar Service = class Service {\n\tctx;\n\t/** Symbol key of an instance method run after construction (class plugins). */\n\tstatic init = symbols.init;\n\t/** Symbol key of the availability predicate passed to `ctx.provide()`. */\n\tstatic check = symbols.check;\n\t/** Symbol key of the phantom intercept-config type parameter. */\n\tstatic config = symbols.config;\n\t/** Symbol key of the call body making a service callable (e.g. `ctx.logger()`). */\n\tstatic invoke = symbols.invoke;\n\t/** Symbol key of the helper deriving an extended service instance. */\n\tstatic extend = symbols.extend;\n\t/** Symbol key of the tracker metadata used for context tracing. */\n\tstatic tracker = symbols.tracker;\n\t/** Symbol key of the intercept-config resolution helper below. */\n\tstatic resolveConfig = symbols.resolveConfig;\n\t/** The service name this instance is registered under. */\n\tname;\n\t/**\n\t* Register this instance as `name` in the current context.\n\t*\n\t* Calls `ctx.reflect.provide(name, this, this[Service.check])`, so the\n\t* service is unregistered automatically when the owning fiber unloads.\n\t* Services with a `[Service.invoke]` body return a callable instance.\n\t*\n\t* @param ctx — the context to register in (stored as `this.ctx`).\n\t* @param name — the service name; defaults to the static `provide` field.\n\t*/\n\tconstructor(ctx, name) {\n\t\tthis.ctx = ctx;\n\t\tname ??= this.constructor[\"provide\"];\n\t\tlet self = this;\n\t\tconst tracker = {\n\t\t\tassociate: name,\n\t\t\tproperty: \"ctx\"\n\t\t};\n\t\tif (self[symbols.invoke]) self = createCallable(name, joinPrototype(Object.getPrototypeOf(this), Function.prototype), tracker);\n\t\tself.ctx = ctx;\n\t\tself.name = name;\n\t\tdefineProperty(self, symbols.tracker, tracker);\n\t\tself.ctx.reflect.provide(name, self, this[symbols.check]);\n\t\treturn self;\n\t}\n\t[symbols.filter](ctx) {\n\t\treturn ctx[symbols.isolate][this.name] === this.ctx[symbols.isolate][this.name];\n\t}\n\t[symbols.extend](props) {\n\t\tlet self;\n\t\tif (this[Service.invoke]) self = createCallable(this.name, this, this[symbols.tracker]);\n\t\telse self = Object.create(this);\n\t\treturn Object.assign(self, props);\n\t}\n\t/**\n\t* Merge intercept config from ancestors with optional base and head values.\n\t*\n\t* Entries added closer to the root apply first; `base` is prepended and\n\t* `head` appended. Uses `Config.merge` when the service declares one,\n\t* otherwise a shallow `Object.assign`.\n\t*\n\t* @param base — lowest-precedence config merged before all intercepts.\n\t* @param head — highest-precedence config merged after all intercepts.\n\t* @returns the merged config.\n\t*/\n\t[symbols.resolveConfig](base, head) {\n\t\tlet intercept = this.ctx[Context.intercept];\n\t\tconst configs = [];\n\t\twhile (this.name in intercept) {\n\t\t\tif (Object.hasOwn(intercept, this.name)) configs.unshift(intercept[this.name]);\n\t\t\tintercept = Object.getPrototypeOf(intercept);\n\t\t}\n\t\tif (base) configs.unshift(base);\n\t\tif (head) configs.push(head);\n\t\tif (this[\"Config\"]?.merge) return this[\"Config\"].merge(...configs);\n\t\telse return Object.assign({}, ...configs);\n\t}\n\tstatic [Symbol.hasInstance](instance) {\n\t\tif (!instance) return false;\n\t\tlet constructor = instance.constructor;\n\t\twhile (constructor) {\n\t\t\tconstructor = constructor.prototype?.constructor;\n\t\t\tif (constructor === this) return true;\n\t\t\tconstructor &&= Object.getPrototypeOf(constructor);\n\t\t}\n\t\treturn false;\n\t}\n};\n//#endregion\nexport { Context, CordisError, DisposableList, EventsService, Fiber, Inject, Logger, LoggerService, RegistryService, Service, ValidationError, buildOuterStack, c16, c256, composeError, createCallable, defaultFormatters, getPropertyDescriptor, getTraceable, isBailed, isConstructor, isObject, joinPrototype, resolveConfig, symbols, withProps };\n","// src/asset-errors.ts\nvar ASSET_LOAD_ERROR_HINTS = {\n \"asset-guid-invalid\": \"provide a valid asset GUID and retry the current publication\",\n \"asset-kind-mismatch\": \"pass the Catalog kind or the matching custom AssetKind token\",\n \"asset-not-found\": \"inspect the producer Catalog and rebuild the missing publication\",\n \"asset-not-ready\": \"wait for the current publication or inspect its producer lifecycle\",\n \"catalog-unavailable\": \"inspect the scope and create a fresh Registry for a new scope\",\n \"catalog-discontinuous\": \"reconcile the Catalog baseline before loading the current row\",\n \"asset-fetch-failed\": \"verify the package locator and republish the Pack\",\n \"asset-integrity-failed\": \"verify the artifact digest and recook the Pack\",\n \"asset-package-invalid\": \"validate the Pack v2 envelope and recook invalid output\",\n \"asset-decoder-missing\": \"install the owner decoder lease for this kind\",\n \"asset-decode-failed\": \"inspect the structured decoder detail and repair the owner output\",\n \"asset-dependency-failed\": \"repair the dependency publication named in detail and retry\",\n \"asset-superseded\": \"load the current publication instead of the superseded ticket\",\n \"asset-load-cancelled\": \"retry with a live AbortSignal when the request is still needed\",\n \"asset-runtime-disposed\": \"obtain a new Registry from the current realm\"\n};\nvar ASSET_EVIDENCE_ERROR_HINTS = {\n \"asset-evidence-capability-missing\": \"provide the missing evidence capability, then rerun asset lookup or verify\",\n \"asset-evidence-source-conflict\": \"keep one source declaration per GUID and rerun the offline evidence projection\",\n \"asset-evidence-locator-conflict\": \"keep one packageUrl per GUID and rebuild the catalog before verifying the asset\",\n \"asset-evidence-receipt-conflict\": \"keep one producer-owned receipt per GUID and rerun cook before verifying the asset\",\n \"asset-evidence-digest-mismatch\": \"recook the source or restore the package bytes, then rerun artifact verification\"\n};\nvar ASSET_STAGE_ERROR_HINTS = {\n \"author-validation-failed\": \"read the authoring rule and apply the suggested recovery\",\n \"external-declaration-invalid\": \"repair the sourceKey declaration and retry recovery\",\n \"import-failed\": \"fix the importer input or registration, then retry recovery\",\n \"native-cook-failed\": \"fix the native producer and rerun recovery\",\n \"ddc-validation-failed\": \"repair the cooked artifact and rerun recovery\",\n \"runtime-parse-failed\": \"repair the package payload and rerun recovery\",\n \"editor-capability-unavailable\": \"register the capability and retry recovery\"\n};\n\n// src/result.ts\nvar OK_PROTO = {\n unwrap() {\n return this.value;\n },\n unwrapOr(_defaultValue) {\n return this.value;\n }\n};\nvar ERR_PROTO = {\n unwrap() {\n throw this.error;\n },\n unwrapOr(defaultValue) {\n return defaultValue;\n }\n};\nfunction ok(value) {\n const r = Object.create(OK_PROTO);\n r.ok = true;\n r.value = value;\n return r;\n}\nfunction err(error) {\n const r = Object.create(ERR_PROTO);\n r.ok = false;\n r.error = error;\n return r;\n}\n\n// src/asset-evidence.ts\nfunction projectCookProductEvidence(product, locator) {\n if (product.receipt.guid !== product.guid) {\n return conflict(\n \"asset-evidence-receipt-conflict\",\n product.guid,\n product.receipt.guid,\n product.guid\n );\n }\n if (product.receipt.outputDigest !== product.digest) {\n return conflict(\n \"asset-evidence-digest-mismatch\",\n product.guid,\n product.digest,\n product.receipt.outputDigest ?? \"missing receipt digest\"\n );\n }\n return projectAssetEvidence({\n guid: product.guid,\n source: {\n origin: product.receipt.origin,\n inputFingerprint: product.receipt.inputFingerprint\n },\n ...locator === void 0 ? {} : { locator },\n receipt: product.receipt,\n package: {\n guid: product.guid,\n digest: product.digest,\n artifacts: Object.fromEntries(\n Object.entries(product.artifacts).map(([key, descriptor]) => [\n key,\n { descriptor, verification: \"passed\" }\n ])\n )\n }\n });\n}\nfunction conflict(code, guid, observed, expected) {\n return err({\n code,\n expected,\n hint: ASSET_EVIDENCE_ERROR_HINTS[code],\n detail: { guid, observed, expected }\n });\n}\nfunction distinct(values, key) {\n const result = [];\n const seen = /* @__PURE__ */ new Set();\n for (const value of values) {\n const identity = key(value);\n if (!seen.has(identity)) {\n seen.add(identity);\n result.push(value);\n }\n }\n return result;\n}\nfunction chooseSource(inputs) {\n const values = distinct(\n [inputs.source, ...inputs.sources ?? []].filter(\n (value) => value !== void 0\n ),\n (value) => JSON.stringify(value)\n );\n if (values.length > 1) {\n return conflict(\n \"asset-evidence-source-conflict\",\n inputs.guid,\n JSON.stringify(values),\n \"one source declaration per GUID\"\n );\n }\n return ok(values[0]);\n}\nfunction chooseLocator(inputs) {\n const values = distinct(\n [inputs.locator, ...inputs.locators ?? []].filter(\n (value) => value !== void 0\n ),\n (value) => JSON.stringify(value)\n );\n if (values.length > 1) {\n return conflict(\n \"asset-evidence-locator-conflict\",\n inputs.guid,\n JSON.stringify(values),\n \"one package locator per GUID\"\n );\n }\n return ok(values[0]);\n}\nfunction chooseReceipt(inputs) {\n const values = distinct(\n [inputs.receipt, ...inputs.receipts ?? []].filter(\n (value) => value !== void 0\n ),\n (value) => JSON.stringify(value)\n );\n if (values.length > 1) {\n return conflict(\n \"asset-evidence-receipt-conflict\",\n inputs.guid,\n JSON.stringify(values),\n \"one cook receipt per GUID\"\n );\n }\n const receipt = values[0];\n if (receipt !== void 0 && receipt.guid.toLowerCase() !== inputs.guid.toLowerCase()) {\n return conflict(\n \"asset-evidence-receipt-conflict\",\n inputs.guid,\n receipt.guid,\n `receipt GUID ${inputs.guid}`\n );\n }\n return ok(receipt);\n}\nfunction packageEvidence(inputs) {\n if (inputs.packageVerification !== void 0) return inputs.packageVerification;\n if (inputs.package === void 0) return void 0;\n const statuses = Object.values(inputs.package.artifacts).map(\n (artifact) => artifact.verification ?? \"notChecked\"\n );\n const status = statuses.some((value) => value === \"failed\") ? \"failed\" : statuses.length > 0 && statuses.every((value) => value === \"passed\") ? \"passed\" : \"notChecked\";\n return {\n status,\n ...inputs.package.digest !== void 0 ? { digest: inputs.package.digest } : {}\n };\n}\nfunction artifactsEvidence(inputs) {\n const descriptors = inputs.artifacts ?? Object.fromEntries(\n Object.entries(inputs.package?.artifacts ?? {}).map(([key, value]) => [\n key,\n value.descriptor\n ])\n );\n return Object.fromEntries(\n Object.entries(descriptors).map(([key, descriptor]) => [\n key,\n {\n descriptor,\n verification: inputs.artifactVerification?.[key] ?? inputs.package?.artifacts[key]?.verification ?? \"notChecked\"\n }\n ])\n );\n}\nfunction freshness(source, receipt) {\n if (source?.origin === \"authoredPack\") return \"notApplicable\";\n if (receipt === void 0) return \"unknown\";\n if (source?.inputFingerprint === void 0) return \"unknown\";\n return source.inputFingerprint === receipt.inputFingerprint ? \"current\" : \"stale\";\n}\nfunction cookStatus(source, receipt) {\n if (source?.origin === \"authoredPack\") return \"notRequired\";\n if (receipt?.status === \"failed\") return \"failed\";\n if (receipt?.status === \"succeeded\") return \"ready\";\n if (source?.origin === \"sourceMeta\") return \"notCooked\";\n return \"unknown\";\n}\nfunction projectAssetEvidence(inputs) {\n const sourceResult = chooseSource(inputs);\n if (!sourceResult.ok) return sourceResult;\n const locatorResult = chooseLocator(inputs);\n if (!locatorResult.ok) return locatorResult;\n const receiptResult = chooseReceipt(inputs);\n if (!receiptResult.ok) return receiptResult;\n const source = sourceResult.value;\n const locator = locatorResult.value;\n const receipt = receiptResult.value;\n const packageVerification = packageEvidence(inputs);\n if (receipt?.outputDigest !== void 0 && packageVerification?.digest !== void 0 && receipt.outputDigest !== packageVerification.digest) {\n return conflict(\n \"asset-evidence-digest-mismatch\",\n inputs.guid,\n packageVerification.digest,\n receipt.outputDigest\n );\n }\n return ok({\n guid: inputs.guid,\n ...locator?.packageUrl !== void 0 ? { packageUrl: locator.packageUrl } : {},\n ...locator?.cookReceiptUrl !== void 0 ? { cookReceiptUrl: locator.cookReceiptUrl } : {},\n ...source !== void 0 ? { source } : {},\n cook: {\n status: cookStatus(source, receipt),\n freshness: freshness(source, receipt),\n ...receipt !== void 0 ? { receipt } : {}\n },\n ...packageVerification !== void 0 ? { package: packageVerification } : {},\n artifacts: artifactsEvidence(inputs),\n runtime: { status: inputs.runtime?.status ?? \"unknown\" }\n });\n}\n\n// src/asset-error-contracts.ts\nvar AssetError = class extends Error {\n code;\n expected;\n hint;\n detail;\n constructor(args) {\n super(`[AssetError ${args.code}] expected: ${args.expected}; hint: ${args.hint}`);\n this.name = \"AssetError\";\n this.code = args.code;\n this.expected = args.expected;\n this.hint = args.hint;\n if (args.detail !== void 0) {\n this.detail = args.detail;\n }\n }\n};\nvar ASSET_ERROR_HINTS = {\n \"asset-fetch-failed\": \"check url path; verify dev server is running; in tests use data: URL fixture (data:image/png;base64,...)\",\n \"catalog-source-unconfigured\": \"call AssetRegistry.setCatalogSource(source) before enumerateCatalog(), then retry the operation\",\n \"asset-parse-failed\": \"check file bytes are not corrupted; for procedural geometry: verify all dimensions > 0 and segments >= 1\",\n \"asset-format-unsupported\": \"v1 supports png/jpg only; convert .bmp/.webp etc. via image tooling; gltf/glb supported via @forgeax/engine-gltf importer (forgeax asset import <gltf-or-glb> --root <project>)\",\n \"asset-not-found\": \"handle id not in registry; verify register() was called before get(); inspect() returns all live handles\",\n \"asset-invalid-value\": \"a register-time value failed validation; read err.hint for the case-specific fix (e.g. clamp a MaterialAsset param to [0,1], or give a strip-topology MeshAsset an index buffer) and err.detail for the offending field/value\",\n \"cubemap-handle-missing\": \"the equirect-to-cubemap projection (internal to the render-system record arm) has no live cubemap for this Skylight; ensure Skylight.equirect references a loaded EquirectAsset handle and caps.rgba16floatRenderable is true\",\n \"invalid-source-format\": \"decode .hdr via @forgeax/engine-image first; supported formats are rgba16float and rgba32float\",\n \"load-failed\": \"source asset could not be loaded; check GUID validity and file accessibility in the pack-index catalog\",\n \"device-unsupported\": \"GPU device lacks required capability; check device.caps for rgba16float renderable feature\",\n \"ibl-precompute-not-dispatched\": \"check IblPipelineCache.runIblPrecompute is called inside the internal GpuResourceStore equirect-to-cubemap projection; counters must not increment before queue.submit (plan D-7 / N-3 AC-20 invariant)\",\n \"mesh-vertex-stride-mismatch\": \"use meshFromInterleaved (packages/runtime/src/geometry/box.ts) or expand vertices buffer to canonical 12F layout (position vec3 + normal vec3 + uv vec2 + tangent vec4)\",\n // === 1 new hint (feat-20260523-shader-template-instance-split M1-T02) ===\n \"material-shader-ref-broken\": \"the materialShader identifier (path or GUID) resolves to no registered shader; check ShaderRegistry for path identifiers or AssetRegistry for GUID sub-assets\",\n // === 1 new hint (feat-20260526-material-asset-multipass-renderstate M1 / w6) ===\n \"material-circular-inheritance\": 'circular parent chain detected; inspect parent handles \\u2014 use err.detail.cycle to see the full path (e.g. \"A -> B -> A\")',\n // === 2 new hints (feat-20260603-asset-import-loader-injection M1 / w1) ===\n \"loader-not-registered\": \"no loader registered for this asset kind; register it via engine.assets.loaders.register(loader) (the loader carries its own kind); err.detail.registeredKinds lists the kinds currently wired\",\n \"asset-not-imported\": \"GUID is in the catalog but its DDC artefact is missing and no ImportTransport is wired (shipped form never falls back to a runtime import); add the asset to the build-time pre-import step instead of importing at runtime\",\n // === 1 new hint (feat-20260604-hdr-equirect-cube-importer-loader M2 / w4) ===\n \"texture-source-not-imported\": \"texture source not imported yet; wire createDevImportTransport() in the studio form for dev lazy-import, or pre-import via the build-time pipeline\",\n // === 1 new hint (perf-20260706-raw-container-failfast) ===\n \"source-not-imported\": \"this mesh/material/scene sub-asset row still points at the raw source container (.glb/.gltf/.fbx); wire createDevImportTransport() for dev lazy-import (POST /__import), or pre-import via the build-time pipeline. The runtime does not parse raw containers at load time.\",\n // === 3 new hints (feat-20260608-mesh-multi-section-primitive-multi-material-slot M1 / w2) ===\n \"mesh-renderer-material-override-invalid\": \"a MeshRenderer.materials slot is stale or does not resolve to a MaterialAsset; the renderer inherited the MeshAsset default for that slot\",\n \"mesh-renderer-material-override-overflow\": \"MeshRenderer.materials contains entries beyond MeshAsset.materialSlots; extra overrides are ignored\",\n \"mesh-asset-submeshes-empty\": \"MeshAsset.submeshes must have at least one entry; every mesh must declare at least one submesh; check MeshAsset registration payload for empty submeshes array\",\n \"mesh-asset-material-slot-index-out-of-range\": \"MeshAsset submesh materialSlot must index MeshAsset.materialSlots; re-cook the mesh and inspect the offending submesh/slot topology\",\n \"mesh-submesh-index-range-out-of-bounds\": \"submesh indexOffset + indexCount exceeds the parent mesh index buffer length; check submesh index range bounds against MeshAsset.indices and MeshAsset.vertices; err.detail carries submeshIndex, indexOffset, indexCount, indexBufferLength, and meshAssetGuid\",\n // === 1 new hint (feat-20260608-tilemap-object-layer-rendering M0 baseline rebuild) ===\n \"tileset-region-index-out-of-range\": \"a TilesetAsset.regions[] rectangle escapes the atlas extent OR a TilesetAsset.tiles[].regionIndex points past TilesetAsset.regions.length; check regions[i] (x + width <= atlasWidth, y + height <= atlasHeight) and tiles[i].regionIndex in [0, regions.length); err.detail carries tilesetGuid, tileId, regionIndex, regionCount\",\n // === 1 new hint (feat-20260608-tilemap-object-layer-rendering M1 schema extension) ===\n \"tileset-tile-entry-malformed\": \"a TilesetTileEntry optional field is out of range (widthCells / heightCells in (0, 64], pivotX / pivotY in [0, 1], collider rect/polygon in normalized [0,1]^2 with rect.length === 4 and polygon.points.length >= 3) OR a top-level field is out of range (atlases.length >= 1, region.atlasIndex in [0, atlases.length)); engine fail-fast at register-time. read err.detail.field (closed enum) + err.detail.scope (tile-entry | tileset-asset) + err.detail.tileEntryIndex to locate the offending entry; switch (err.detail.field) covers the 7 variants exhaustively without default\",\n // === 1 new hint (feat-20260621-asset-registry-robustness-invalidate-inflight-cach M2 / w4) ===\n \"asset-invalidated\": \"The asset was invalidated during load; call loadByGuid(guid) again to retry with a fresh fetch\",\n // === 1 new hint (feat-20260629-multi-uv-set-support M2 / m2-w5) ===\n \"mesh-bin-contract-violation\": \"re-cook the asset via importer; the .bin sidecar v4 contract is violated \\u2014 inspect err.detail.reason and its expected/actual projection, stride, cardinality, and byte-length facts\",\n // === 1 new hint (feat-20260707-texture-block-compression M5 / w35, D-9) ===\n \"mipgen-unsupported-compressed-format\": 'compressed-texture mips must be baked offline (the GPU cannot generate mips for a non-render-target block format); re-cook with an offline mip chain, or set the sidecar .meta.json compressionMode:\"none\" (or mipmap:false) to keep runtime mip generation on an uncompressed texture'\n};\nvar FontError = class extends Error {\n code;\n expected;\n hint;\n detail;\n constructor(args) {\n super(`[FontError ${args.code}] expected: ${args.expected}; hint: ${args.hint}`);\n this.name = \"FontError\";\n this.code = args.code;\n this.expected = args.expected;\n this.hint = args.hint;\n if (args.detail !== void 0) {\n this.detail = args.detail;\n }\n }\n};\nvar TextError = class extends Error {\n code;\n expected;\n hint;\n detail;\n constructor(args) {\n super(`[TextError ${args.code}] expected: ${args.expected}; hint: ${args.hint}`);\n this.name = \"TextError\";\n this.code = args.code;\n this.expected = args.expected;\n this.hint = args.hint;\n if (args.detail !== void 0) {\n this.detail = args.detail;\n }\n }\n};\n\n// src/asset-pods.ts\nvar MATERIAL_TEXTURE_SLOTS = [\n \"baseColorTexture\",\n \"normalTexture\",\n \"specularTintTexture\",\n \"metallicRoughnessTexture\",\n \"emissiveTexture\",\n \"occlusionTexture\"\n];\n\n// src/audio-contracts.ts\nvar AudioError = class extends Error {\n code;\n expected;\n hint;\n detail;\n constructor(args) {\n super(`[AudioError ${args.code}] expected: ${args.expected}; hint: ${args.hint}`);\n this.name = \"AudioError\";\n this.code = args.code;\n this.expected = args.expected;\n this.hint = args.hint;\n if (args.detail !== void 0) {\n this.detail = args.detail;\n }\n }\n};\nvar AUDIO_ERROR_HINTS = {\n \"context-creation-failed\": \"check browser supports AudioContext; verify no privacy extension blocks audio; try reloading the page after user gesture\",\n \"decode-failed\": \"ensure audio file is a valid wav/mp3/ogg/flac at the GUID path; check file integrity (truncated or empty bytes)\",\n \"context-suspended\": \"call play after a user gesture (click/tap/keydown) to trigger AudioContext.resume(); if in iframe check sandbox attribute\",\n \"invalid-clip-handle\": \"verify clip was registered via AssetRegistry.register() before spawning AudioSource; inspect active handles via assetRegistry.inspect()\",\n \"bus-not-found\": \"use 'sfx' or 'music' bus literal; custom bus names are not supported in v1 (OOS-2)\"\n};\n\n// src/handle.ts\nfunction toUnique(raw) {\n return raw;\n}\nfunction toShared(raw) {\n return raw;\n}\nfunction unwrapHandle(h) {\n return h;\n}\nvar BUILTIN_BASE = 1024;\nvar MAX_SLOT = (1 << 24) - 1;\nvar MAX_GEN = 255;\nfunction pack(slot, gen) {\n return ((gen & 255) << 24 | slot & 16777215) >>> 0;\n}\nfunction unpackSlot(v) {\n return v & 16777215;\n}\nfunction unpackGen(v) {\n return v >>> 24 & 255;\n}\nfunction isRetiredSlot(gen) {\n return gen > MAX_GEN;\n}\nfunction handleSlot(h) {\n return unpackSlot(h);\n}\nfunction handleGeneration(h) {\n return unpackGen(h);\n}\n\n// src/image-pack-contracts.ts\nvar IMAGE_ERROR_HINTS = {\n \"image-decode-failed\": \"check file integrity; re-export from DCC tool (Photoshop / GIMP / Aseprite); dimensions > 0 + valid PNG / JPG header bytes\",\n \"image-format-unsupported\": \"supports PNG / JPG / TGA true-color sources; convert unsupported formats with: magick convert <input> <output>.png; check importSettings.colorSpace consistency with format family if formatColorSpaceConflict present\",\n \"image-dimension-out-of-bounds\": \"downscale source under device caps (typical maxTextureDimension2D = 8192 / 16384); use mipmap chain instead of larger source if lod is the goal\",\n \"image-meta-missing\": \"run: forgeax asset import <path> --root <project> --json\",\n \"image-hdr-decode-failed\": \"check .hdr file integrity; verify Radiance RGBE header magic (#?RADIANCE) and FORMAT=32-bit_rle_rgbe header field; ensure file was not truncated\",\n // feat-20260521-sprite-atlas-animation M1 T-02 — atlas hook hint strings\n // (plan-strategy section 2 D-2). Each hint embeds an executable recovery\n // path so AI users self-repair by copy-pasting the hint into the shell\n // or into the build config (charter P3 explicit failure + AGENTS.md\n // Error model \"hint must carry executable recovery\").\n \"atlas-empty-input\": \"verify forgeax asset atlas --input <glob> --name <prefix> --output <dir> --root <project> matches at least 1 PNG on disk; run `ls <glob>` to inspect the resolved file set; add the missing sprite source or fix the glob pattern\",\n \"atlas-size-exceeded\": \"downscale the source PNG so width * height <= maxAtlasSize^2 (default 4096); or split sprites across multiple atlas runs (forgeax asset atlas --input <subset-glob> --name <other-prefix> --output <dir> --root <project>); or raise the cap via --max-atlas-size 8192 if device caps allow it\",\n \"atlas-region-mismatch\": \"shelfPack returned regions exceeding atlas footprint \\u2014 packer safety net; file a forgeax-engine bug; rerun forgeax asset atlas with a smaller input set or lower --max-atlas-size as temporary recovery\",\n \"image-surface-invalid\": \"repair the PixelSurface authoring input named in err.detail; use positive integer dimensions, finite RGBA8 values, and a finite noise seed, then rerun the image producer\"\n};\nvar PACK_ERROR_HINTS = {\n \"pack-malformed-meta\": \"check guid is a valid RFC 4122 UUID; validate with: ajv validate -s schema/meta.schema.json -d <file>\",\n \"pack-malformed-pack\": \"check all asset guid and refs[] fields are 36-char dash-form UUIDs; validate with pack.schema.json\",\n \"pack-guid-malformed\": \"use AssetGuid.random() or a UUIDv7 generator; all GUID fields must be 36-char RFC 4122 dash-form\",\n \"pack-orphan-meta\": \"remove the orphan .meta.json or add the missing source file next to it\",\n \"pack-meta-missing\": \"run forgeax asset list --root <project> --json to list source files without .meta.json\",\n \"pack-guid-collision\": \"run forgeax asset verify --root <project> --json to list all GUID collisions; each GUID must be globally unique\",\n \"pack-cyclic-reference\": \"run forgeax asset verify --root <project> --json to print the cycle path; break the cycle by removing a refs[] entry\",\n \"pack-subasset-index-out-of-range\": \"check subAssets[].sourceIndex does not exceed the actual sub-image count in the source file\",\n // === 1 new hint (feat-20260523-shader-template-instance-split M1-T02) ===\n \"payload-schema-mismatch\": \"material asset payload failed schema validation; check paramSchema entries all use valid types from MATERIAL_PARAM_TYPES and materialShader is a non-empty string\",\n // === 4 new hints (feat-20260608-scene-nesting-ecs-fication M1 / w8;\n // plan-strategy D-8) ===\n \"pack-mount-localid-overlap\": \"check parent SceneAsset.mounts[].memberFirst windows do not overlap with each other or with entities[].localId; rebuild mount sidecar after the child SceneAsset reimport\",\n \"pack-mount-count-mismatch\": \"mount.memberCount must equal the referenced child SceneAsset totalSlots (entities.length + sum(mounts[].memberCount) + mounts.length); rebuild mount sidecar via forgeax asset verify --root <project> --json after the child SceneAsset reimport\",\n \"pack-mount-override-localid-out-of-range\": \"override.localId must be in [0, mount.memberCount); shrink the override or extend memberCount to match the child SceneAsset\",\n \"pack-mount-override-unknown-field\": \"override.comp / override.field must match a defined component schema; check defineComponent registry or rebuild mount sidecar after the child SceneAsset reimport\"\n};\n\n// src/lighting.ts\nvar IES_PROFILE_WIDTH = 256;\nvar IES_PROFILE_HEIGHT = 128;\nvar IES_PROFILE_BYTES_PER_SAMPLE = 2;\nvar R_MIN = 1e-4;\nvar IES_PROFILE_BYTE_LENGTH = IES_PROFILE_WIDTH * IES_PROFILE_HEIGHT * IES_PROFILE_BYTES_PER_SAMPLE;\n\n// src/material/errors.ts\nvar MATERIAL_ERROR_CODES = [\n \"material-parent-not-found\",\n \"material-circular-inheritance\",\n \"material-child-contract-invalid\",\n \"material-no-effective-pass\",\n \"material-value-unknown\",\n \"material-value-type-mismatch\",\n \"material-parameter-type-unsupported\",\n \"material-contract-program-mismatch\",\n \"shader-module-id-missing\",\n \"shader-module-id-duplicate\",\n \"shader-module-not-found\",\n \"shader-module-namespace-reserved\",\n \"material-reflection-binding-mismatch\",\n \"material-specialization-not-cooked\",\n \"material-specialization-stale-generation\",\n \"gltf-material-uv-set-missing\",\n \"material-derived-interface-mismatch\",\n \"material-texture-coordinate-invalid\",\n \"material-payload-bounds\",\n \"material-transmission-contract-invalid\",\n \"material-physical-contract-invalid\",\n \"material-tangent-required\",\n \"material-surface-slot-missing\",\n \"material-surface-abi-mismatch\",\n \"material-surface-forbidden-interface\"\n];\nvar MATERIAL_ERROR_POLICY = {\n \"material-parent-not-found\": {\n expected: \"every parent GUID resolves to a MaterialAsset\",\n hint: \"fix the parent GUID and resolve the material again\"\n },\n \"material-circular-inheritance\": {\n expected: \"the parent chain is acyclic\",\n hint: \"remove the repeated GUID from the parent chain\"\n },\n \"material-child-contract-invalid\": {\n expected: \"a parent-bearing material child contains only parent and authored values\",\n hint: \"remove colorSpace, passes, parameters, and surface from the child; let the MaterialTable root provide the effective contract\"\n },\n \"material-no-effective-pass\": {\n expected: \"the resolved material has at least one pass\",\n hint: \"add a pass to the root material or an inherited parent\"\n },\n \"material-value-unknown\": {\n expected: \"every value name is declared by the effective contract\",\n hint: \"remove the value or declare the parameter in the root contract\"\n },\n \"material-value-type-mismatch\": {\n expected: \"each value matches its declared parameter type\",\n hint: \"change the value to the declared parameter type\"\n },\n \"material-parameter-type-unsupported\": {\n expected: \"each material parameter uses a producer-supported ABI type\",\n hint: \"replace the boolean parameter with a supported numeric, vector, color, or texture type and recook the material\"\n },\n \"material-contract-program-mismatch\": {\n expected: \"the program satisfies the material contract\",\n hint: \"align the program entries with the root contract\"\n },\n \"shader-module-id-missing\": {\n expected: \"each WGSL source declares a module ID\",\n hint: \"add a compiler-native module ID declaration to the WGSL source\"\n },\n \"shader-module-id-duplicate\": {\n expected: \"each module ID has one source provenance\",\n hint: \"rename one module or remove the duplicate source\"\n },\n \"shader-module-not-found\": {\n expected: \"every referenced module exists in the source catalog\",\n hint: \"add the module to the source catalog or fix the reference\"\n },\n \"shader-module-namespace-reserved\": {\n expected: \"user modules use a non-reserved namespace\",\n hint: \"choose a module ID outside the reserved namespace\"\n },\n \"material-reflection-binding-mismatch\": {\n expected: \"reflection matches the material contract bindings\",\n hint: \"update the contract or WGSL binding and cook again\"\n },\n \"material-specialization-not-cooked\": {\n expected: \"the requested specialization has a cooked artifact\",\n hint: \"run the build or development cook path for this selection\"\n },\n \"material-specialization-stale-generation\": {\n expected: \"all specialization dependencies share one generation\",\n hint: \"retry after dependent assets and sources settle\"\n },\n \"gltf-material-uv-set-missing\": {\n expected: \"each texture slot references an available primitive UV set\",\n hint: \"add the requested UV set to the primitive and re-import it\"\n },\n \"material-derived-interface-mismatch\": {\n expected: \"the generated material interface matches the derived schema interface\",\n hint: \"repair the schema or WGSL producer and recook the material\"\n },\n \"material-texture-coordinate-invalid\": {\n expected: \"every texture coordinate record is finite and complete\",\n hint: \"repair the texture metadata or coordinates and recook the material\"\n },\n \"material-payload-bounds\": {\n expected: \"every material payload write stays within the derived payload\",\n hint: \"repair the derived payload owner before submitting the draw\"\n },\n \"material-transmission-contract-invalid\": {\n expected: \"transmission material values satisfy finite ranges and Forward depth rules\",\n hint: \"repair the named transmission value or pass state before publishing the material\"\n },\n \"material-physical-contract-invalid\": {\n expected: \"the Standard physical contract contains complete declared layers and valid passes\",\n hint: \"repair the root parameters or pass policy and derive the material again\"\n },\n \"material-tangent-required\": {\n expected: \"the physical material tangent input is complete and valid before draw admission\",\n hint: \"provide a finite tangent: vec4 or repair the named normal, UV, and triangle topology inputs\"\n },\n \"material-surface-slot-missing\": {\n expected: \"the Standard material pass has one surface module slot\",\n hint: \"add moduleSlots.surface to the Standard pass and recook the material\"\n },\n \"material-surface-abi-mismatch\": {\n expected: \"the Surface module exports evaluate_surface with the input and output types required by its selected material model\",\n hint: \"repair the authored Surface export to the producer-reported ABI and recook the material\"\n },\n \"material-surface-forbidden-interface\": {\n expected: \"the Surface module declares no stage entry, resource binding, or vertex mutation\",\n hint: \"remove the forbidden interface from the Surface source and recook the material\"\n }\n};\nvar MATERIAL_ERROR_EXPECTED = Object.fromEntries(\n MATERIAL_ERROR_CODES.map((code) => [code, MATERIAL_ERROR_POLICY[code].expected])\n);\nvar MATERIAL_ERROR_HINTS = Object.fromEntries(\n MATERIAL_ERROR_CODES.map((code) => [code, MATERIAL_ERROR_POLICY[code].hint])\n);\nfunction createMaterialError(code, detail, message = `${code}: ${MATERIAL_ERROR_EXPECTED[code]}`) {\n return {\n code,\n expected: MATERIAL_ERROR_EXPECTED[code],\n hint: MATERIAL_ERROR_HINTS[code],\n detail,\n message\n };\n}\n\n// src/material/surface-model.ts\nvar MATERIAL_SURFACE_MODELS = [\"standard\", \"single-layer-medium\"];\nvar SINGLE_LAYER_MEDIUM_SURFACE_MODEL = \"single-layer-medium\";\nfunction isMaterialDynamicFieldType(value) {\n return value === \"f32\" || value === \"u32\" || value === \"vec2<f32>\" || value === \"vec3<f32>\" || value === \"vec4<f32>\";\n}\nvar IDENTIFIER_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\nvar FIELD_FACTS = {\n f32: { size: 4, alignment: 4 },\n u32: { size: 4, alignment: 4 },\n \"vec2<f32>\": { size: 8, alignment: 8 },\n // WGSL vec3 values occupy a 16-byte aligned slot in a storage struct.\n \"vec3<f32>\": { size: 12, alignment: 16 },\n \"vec4<f32>\": { size: 16, alignment: 16 }\n};\nfunction materialDynamicFieldFacts(type) {\n switch (type) {\n case \"f32\":\n return FIELD_FACTS.f32;\n case \"u32\":\n return FIELD_FACTS.u32;\n case \"vec2<f32>\":\n return FIELD_FACTS[\"vec2<f32>\"];\n case \"vec3<f32>\":\n return FIELD_FACTS[\"vec3<f32>\"];\n case \"vec4<f32>\":\n return FIELD_FACTS[\"vec4<f32>\"];\n default:\n return void 0;\n }\n}\nfunction alignTo(value, alignment) {\n return Math.ceil(value / alignment) * alignment;\n}\nfunction layoutError(code, expected, hint, field, actual) {\n return {\n code,\n expected,\n hint,\n ...field === void 0 ? {} : { field },\n ...actual === void 0 ? {} : { actual }\n };\n}\nfunction validPositiveInteger(value) {\n return Number.isSafeInteger(value) && value > 0;\n}\nfunction deriveMaterialDynamicInputLayout(schema) {\n if (schema === null || typeof schema !== \"object\" || Array.isArray(schema)) {\n return err(\n layoutError(\n \"invalid-name\",\n \"the dynamic input schema is an object with a WGSL identifier name\",\n \"provide a plain dynamic input declaration before publishing the material\",\n \"schema\",\n schema\n )\n );\n }\n if (typeof schema.name !== \"string\" || !IDENTIFIER_RE.test(schema.name)) {\n return err(\n layoutError(\n \"invalid-name\",\n \"the dynamic input name is a WGSL identifier\",\n \"rename the dynamic input using ASCII letters, digits, and underscores\",\n \"name\",\n schema.name\n )\n );\n }\n if (!Array.isArray(schema.fields) || schema.fields.length === 0) {\n return err(\n layoutError(\n \"invalid-field\",\n \"a dynamic input declares at least one field\",\n \"add a scalar or vector field to the dynamic input schema\",\n \"fields\",\n schema.fields\n )\n );\n }\n const limits = [\n [\"maxRecords\", schema.maxRecords],\n [\"maxDomains\", schema.maxDomains],\n [\"maxPageBytes\", schema.maxPageBytes],\n [\"maxBindings\", schema.maxBindings],\n [\"maxEventsPerSample\", schema.maxEventsPerSample]\n ];\n for (const [field, value] of limits) {\n if (!validPositiveInteger(value)) {\n return err(\n layoutError(\n \"invalid-limit\",\n `${field} is a positive safe integer`,\n \"choose an explicit finite producer budget and retry publication\",\n field,\n value\n )\n );\n }\n }\n const names = /* @__PURE__ */ new Set();\n let cursor = 0;\n let maxAlignment = 16;\n const fields = [];\n for (const [index, field] of schema.fields.entries()) {\n if (field === null || typeof field !== \"object\" || Array.isArray(field)) {\n return err(\n layoutError(\n \"invalid-field\",\n \"every dynamic field is an object with a name and supported type\",\n \"repair the malformed dynamic input field before publishing the material\",\n `fields[${index}]`,\n field\n )\n );\n }\n if (typeof field.name !== \"string\" || !IDENTIFIER_RE.test(field.name)) {\n return err(\n layoutError(\n \"invalid-field\",\n \"every dynamic field name is a WGSL identifier\",\n \"rename the field using ASCII letters, digits, and underscores\",\n `fields[${index}].name`,\n field.name\n )\n );\n }\n if (names.has(field.name)) {\n return err(\n layoutError(\n \"duplicate-field\",\n \"dynamic field names are unique\",\n \"remove the duplicate field before cooking the material\",\n field.name,\n field.name\n )\n );\n }\n if (!isMaterialDynamicFieldType(field.type)) {\n return err(\n layoutError(\n \"invalid-field\",\n \"each dynamic field uses a supported scalar or vector type\",\n \"use f32, u32, vec2<f32>, vec3<f32>, or vec4<f32>\",\n `fields[${index}].type`,\n field.type\n )\n );\n }\n const facts = materialDynamicFieldFacts(field.type);\n if (facts === void 0) {\n return err(\n layoutError(\n \"invalid-field\",\n \"each dynamic field uses a supported scalar or vector type\",\n \"use f32, u32, vec2<f32>, vec3<f32>, or vec4<f32>\",\n `fields[${index}].type`,\n field.type\n )\n );\n }\n names.add(field.name);\n maxAlignment = Math.max(maxAlignment, facts.alignment);\n const offset = alignTo(cursor, facts.alignment);\n fields.push({ ...field, offset, size: facts.size, alignment: facts.alignment });\n cursor = offset + facts.size;\n }\n const stride = alignTo(cursor, maxAlignment);\n const requiredBytes = stride * schema.maxRecords;\n if (!Number.isSafeInteger(requiredBytes) || stride > schema.maxPageBytes || requiredBytes > schema.maxPageBytes) {\n return err(\n layoutError(\n \"page-too-small\",\n \"the declared page can hold maxRecords at the derived stride\",\n \"increase maxPageBytes or reduce maxRecords before publishing the material\",\n \"maxPageBytes\",\n schema.maxPageBytes\n )\n );\n }\n const identity = [\n \"surface-dynamic-v1\",\n schema.name,\n `stride-${stride}`,\n ...fields.map((field) => `${field.name}:${field.type}@${field.offset}`),\n `records-${schema.maxRecords}`,\n `domains-${schema.maxDomains}`,\n `bytes-${schema.maxPageBytes}`,\n `bindings-${schema.maxBindings}`,\n `sample-${schema.maxEventsPerSample}`\n ].join(\"/\");\n return ok({\n name: schema.name,\n stride,\n fields,\n maxRecords: schema.maxRecords,\n maxDomains: schema.maxDomains,\n maxPageBytes: schema.maxPageBytes,\n maxBindings: schema.maxBindings,\n maxEventsPerSample: schema.maxEventsPerSample,\n identity\n });\n}\nfunction isMaterialSurfaceDeclaration(value) {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const declaration = value;\n if (declaration.model !== \"standard\" && declaration.model !== \"single-layer-medium\" || typeof declaration.module !== \"string\" || declaration.module.length === 0) {\n return false;\n }\n if (declaration.dynamicInput === void 0) return true;\n if (declaration.dynamicInput === null || typeof declaration.dynamicInput !== \"object\") {\n return false;\n }\n return deriveMaterialDynamicInputLayout(declaration.dynamicInput).ok;\n}\n\n// src/material/asset.ts\nfunction resolveMaterialTextureCoordinates(coordinates) {\n return {\n set: coordinates?.set ?? 0,\n transform: {\n offset: coordinates?.transform?.offset ?? [0, 0],\n scale: coordinates?.transform?.scale ?? [1, 1],\n rotation: coordinates?.transform?.rotation ?? 0\n }\n };\n}\nvar MATERIAL_CHILD_FORBIDDEN_FIELDS = [\n \"colorSpace\",\n \"passes\",\n \"parameters\",\n \"surface\"\n];\nfunction hasOwn(value, field) {\n return Object.hasOwn(value, field);\n}\nfunction materialChildForbiddenFields(asset) {\n if (asset.parent === void 0) return [];\n return MATERIAL_CHILD_FORBIDDEN_FIELDS.filter((field) => hasOwn(asset, field));\n}\nfunction materialParentText(value) {\n if (typeof value === \"string\") return value;\n if (value instanceof Uint8Array) {\n return Array.from(value, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n }\n return String(value);\n}\nvar MaterialAssetContractError = class extends Error {\n code = \"material-authoring-field-forbidden\";\n expected = \"material authoring contains only runtime values and source-owned module selection\";\n hint = \"remove the compiler macro field and use a runtime value, module slot, or compiler context\";\n detail;\n constructor(detail) {\n super(`${detail.field}: material compiler macro fields are not supported`);\n this.name = \"MaterialAssetContractError\";\n this.detail = { code: \"material-authoring-field-forbidden\", ...detail };\n }\n};\nvar MaterialChildContractError = class extends Error {\n code = \"material-child-contract-invalid\";\n expected = MATERIAL_ERROR_EXPECTED[\"material-child-contract-invalid\"];\n hint = MATERIAL_ERROR_HINTS[\"material-child-contract-invalid\"];\n detail;\n constructor(detail) {\n super(`${detail.material}: parent-bearing material contains forbidden fields`);\n this.name = \"MaterialChildContractError\";\n this.detail = { code: \"material-child-contract-invalid\", ...detail };\n }\n};\nfunction isRecord(value) {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction assertMaterialAsset(value, context = \"material\") {\n if (!isRecord(value) || value.kind !== \"material\") {\n throw new Error(`${context}: expected a material asset`);\n }\n for (const field of Object.keys(value)) {\n if (![\n \"kind\",\n \"colorSpace\",\n \"parent\",\n \"passes\",\n \"parameters\",\n \"values\",\n \"particleInputs\",\n \"surface\"\n ].includes(field)) {\n throw new MaterialAssetContractError({\n owner: field === \"features\" || field === \"defines\" ? \"material-authoring\" : \"material-runtime\",\n field,\n actual: value[field],\n action: \"remove-field\"\n });\n }\n }\n const forbidden = materialChildForbiddenFields(value);\n if (forbidden.length > 0) {\n throw new MaterialChildContractError({\n material: context,\n parent: materialParentText(value.parent),\n forbidden,\n action: \"remove-forbidden-fields\"\n });\n }\n if (value.colorSpace !== void 0 && value.colorSpace !== \"srgb\" && value.colorSpace !== \"linear\") {\n throw new Error(`${context}: invalid colorSpace`);\n }\n if (value.passes !== void 0) {\n if (!Array.isArray(value.passes) || value.passes.length === 0) {\n throw new Error(`${context}: passes must be a non-empty array`);\n }\n for (const [index, pass] of value.passes.entries()) {\n if (!isRecord(pass) || typeof pass.name !== \"string\" || !isRecord(pass.program)) {\n throw new Error(`${context}: pass ${index} is malformed`);\n }\n if (typeof pass.program.module !== \"string\" || pass.program.module.length === 0) {\n throw new Error(`${context}: pass ${index} has no module identity`);\n }\n if (pass.program.vertexEntry !== void 0 && typeof pass.program.vertexEntry !== \"string\" || pass.program.fragmentEntry !== void 0 && typeof pass.program.fragmentEntry !== \"string\") {\n throw new Error(`${context}: pass ${index} has malformed entry points`);\n }\n if (pass.program.moduleSlots !== void 0) {\n if (!isRecord(pass.program.moduleSlots)) {\n throw new Error(`${context}: pass ${index} has malformed module slots`);\n }\n for (const [name, slot] of Object.entries(pass.program.moduleSlots)) {\n if (typeof slot !== \"string\")\n throw new Error(`${context}: module slot ${name} is not a string`);\n }\n }\n }\n }\n if (value.parameters !== void 0) {\n if (!Array.isArray(value.parameters))\n throw new Error(`${context}: parameters must be an array`);\n for (const [index, parameter] of value.parameters.entries()) {\n if (!isRecord(parameter) || typeof parameter.name !== \"string\" || typeof parameter.type !== \"string\") {\n throw new Error(`${context}: parameter ${index} is malformed`);\n }\n if (parameter.colorSpace !== void 0 && parameter.colorSpace !== \"srgb\" && parameter.colorSpace !== \"linear\") {\n throw new Error(`${context}: parameter ${index} has invalid colorSpace`);\n }\n if (\"static\" in parameter) {\n throw new MaterialAssetContractError({\n owner: \"material-authoring\",\n field: \"parameters.static\",\n actual: parameter.static,\n action: \"remove-field\"\n });\n }\n }\n }\n if (value.particleInputs !== void 0) {\n if (!Array.isArray(value.particleInputs) || value.particleInputs.length > 4) {\n throw new Error(`${context}: particleInputs must contain at most four entries`);\n }\n const names = /* @__PURE__ */ new Set();\n const lanes = /* @__PURE__ */ new Set();\n for (const [index, input] of value.particleInputs.entries()) {\n if (!isRecord(input) || typeof input.name !== \"string\" || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(input.name) || ![\"f32\", \"vec2<f32>\", \"vec3<f32>\", \"vec4<f32>\"].includes(String(input.type)) || ![\"vertex\", \"fragment\", \"vertex-fragment\"].includes(String(input.visibility)) || !Number.isInteger(input.lane) || input.lane < 0 || input.lane >= 4) {\n throw new Error(`${context}: particle input ${index} is malformed`);\n }\n if (names.has(input.name) || lanes.has(input.lane)) {\n throw new Error(`${context}: duplicate particle input ${input.name}`);\n }\n names.add(input.name);\n lanes.add(input.lane);\n }\n }\n if (value.surface !== void 0) {\n if (!isRecord(value.surface)) throw new Error(`${context}: surface must be an object`);\n if (value.surface.model !== \"standard\" && value.surface.model !== \"single-layer-medium\") {\n throw new Error(`${context}: invalid Surface model`);\n }\n if (typeof value.surface.module !== \"string\" || value.surface.module.length === 0) {\n throw new Error(`${context}: Surface module must be a non-empty string`);\n }\n if (value.surface.dynamicInput !== void 0) {\n const dynamic = value.surface.dynamicInput;\n if (!isRecord(dynamic)) {\n throw new Error(`${context}: dynamicInput must be an object`);\n }\n const layout = deriveMaterialDynamicInputLayout(\n dynamic\n );\n if (!layout.ok) {\n throw new Error(`${context}: dynamicInput ${layout.error.code}: ${layout.error.expected}`);\n }\n }\n }\n}\n\n// src/material/color-space.ts\nfunction srgbChannelToLinear(value) {\n return value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n}\nfunction linearChannelToSrgb(value) {\n return value <= 31308e-7 ? value * 12.92 : 1.055 * value ** (1 / 2.4) - 0.055;\n}\nfunction authoredColorToLinear(value, colorSpace = \"srgb\") {\n if (colorSpace === \"linear\") return [...value];\n return value.map((channel, index) => index < 3 ? srgbChannelToLinear(channel) : channel);\n}\nfunction materialParameterColorSpace(parameter, assetColorSpace) {\n const isColor = parameter.type === \"color\" || parameter.colorSpace !== void 0;\n if (!isColor) return void 0;\n return assetColorSpace ?? parameter.colorSpace ?? \"srgb\";\n}\nfunction materialValuesToLinearRuntime(values, parameters, assetColorSpace) {\n if (values === void 0) return {};\n const colorSpaces = /* @__PURE__ */ new Map();\n for (const parameter of parameters) {\n const colorSpace = materialParameterColorSpace(parameter, assetColorSpace);\n if (colorSpace !== void 0) colorSpaces.set(parameter.name, colorSpace);\n }\n const runtimeValues = {};\n for (const [name, value] of Object.entries(values)) {\n const colorSpace = colorSpaces.get(name);\n runtimeValues[name] = colorSpace !== void 0 && Array.isArray(value) ? authoredColorToLinear(value, colorSpace) : value;\n }\n return runtimeValues;\n}\n\n// src/material/standard-layer-plan.ts\nvar STANDARD_LAYER_PARAMETER_GROUPS = Object.freeze({\n anisotropy: [\"anisotropyStrength\", \"anisotropyRotation\"],\n iridescence: [\n \"iridescence\",\n \"iridescenceIor\",\n \"iridescenceThicknessMinimum\",\n \"iridescenceThicknessMaximum\"\n ],\n sheen: [\"sheenColor\", \"sheenRoughness\"],\n clearcoat: [\"clearcoat\", \"clearcoatRoughness\"]\n});\nvar STANDARD_PHYSICAL_TEXTURE_FIELDS = [\n \"clearcoatTexture\",\n \"clearcoatRoughnessTexture\",\n \"clearcoatNormalTexture\",\n \"anisotropyTexture\",\n \"sheenColorTexture\",\n \"sheenRoughnessTexture\",\n \"iridescenceTexture\",\n \"iridescenceThicknessTexture\",\n \"specularTexture\",\n \"specularColorTexture\"\n];\nfunction standardPhysicalTextureFields(schema) {\n const names = new Set(schema.map((entry) => entry.name));\n return STANDARD_PHYSICAL_TEXTURE_FIELDS.filter((field) => names.has(field));\n}\nvar STANDARD_PHYSICAL_PARAMETER_NAMES = /* @__PURE__ */ new Set([\n ...STANDARD_LAYER_PARAMETER_GROUPS.anisotropy,\n ...STANDARD_LAYER_PARAMETER_GROUPS.iridescence,\n ...STANDARD_LAYER_PARAMETER_GROUPS.sheen,\n ...STANDARD_LAYER_PARAMETER_GROUPS.clearcoat,\n \"clearcoatNormalScale\",\n ...STANDARD_PHYSICAL_TEXTURE_FIELDS\n]);\nvar STANDARD_TRANSMISSION_PARAMETER_NAMES = /* @__PURE__ */ new Set([\n \"transmission\",\n \"ior\",\n \"thickness\",\n \"attenuationColor\",\n \"attenuationDistance\",\n \"transmissionTexture\",\n \"thicknessTexture\"\n]);\nvar MaterialPhysicalContractError = class extends Error {\n code = \"material-physical-contract-invalid\";\n expected = \"the Standard physical contract contains complete declared layers and valid passes\";\n hint = \"repair the root parameters or pass policy and derive the material again\";\n detail;\n constructor(detail) {\n super(`${detail.layer}: Standard physical contract is invalid (${detail.reason})`);\n this.name = \"MaterialPhysicalContractError\";\n this.detail = { code: \"material-physical-contract-invalid\", ...detail };\n }\n};\nvar LAYER_PARAMETERS = [\n { name: \"anisotropy\", parameters: STANDARD_LAYER_PARAMETER_GROUPS.anisotropy },\n { name: \"iridescence\", parameters: STANDARD_LAYER_PARAMETER_GROUPS.iridescence },\n { name: \"sheen\", parameters: STANDARD_LAYER_PARAMETER_GROUPS.sheen },\n { name: \"clearcoat\", parameters: STANDARD_LAYER_PARAMETER_GROUPS.clearcoat }\n];\nfunction planIdentity(mode, layers, passFamily) {\n return `standard-layer-plan-v1:${mode}:${layers.map((layer) => `${layer.name}(${layer.parameters.join(\",\")})`).join(\"|\")}:${passFamily.join(\",\")}`;\n}\nfunction invalid(detail) {\n return new MaterialPhysicalContractError(detail);\n}\nfunction deriveStandardLayerPlan(parameters, passes) {\n const names = new Set(parameters.map((parameter) => parameter.name));\n const layers = [];\n for (const layer of LAYER_PARAMETERS) {\n const present = layer.parameters.filter((name) => names.has(name));\n if (present.length === 0) continue;\n if (present.length !== layer.parameters.length) {\n throw invalid({\n material: \"Standard\",\n layer: layer.name,\n missing: layer.parameters.filter((name) => !names.has(name)),\n reason: \"incomplete-layer\"\n });\n }\n layers.push(layer);\n }\n const hasPhysicalTexture = STANDARD_PHYSICAL_TEXTURE_FIELDS.some((field) => names.has(field));\n const mode = layers.length === 0 && !hasPhysicalTexture ? \"base-only\" : \"physical\";\n const passFamily = mode === \"base-only\" ? [\"forward\", \"deferred\", \"shadow\"] : [\"forward\", \"shadow\"];\n if (mode === \"physical\") {\n const deferredPass = passes?.find((pass) => {\n const tags = pass.renderState?.tags;\n return pass.name === \"deferred\" || typeof tags === \"object\" && tags !== null && \"LightMode\" in tags && tags.LightMode === \"Deferred\";\n });\n if (deferredPass !== void 0) {\n throw invalid({\n material: \"Standard\",\n layer: layers[0]?.name ?? \"root\",\n pass: deferredPass.name,\n reason: \"deferred-pass\"\n });\n }\n }\n return Object.freeze({\n mode,\n layers,\n passFamily,\n identity: planIdentity(mode, layers, passFamily)\n });\n}\nfunction isMaterialPhysicalContractError(value) {\n return value instanceof MaterialPhysicalContractError || typeof value === \"object\" && value !== null && \"code\" in value && value.code === \"material-physical-contract-invalid\";\n}\nfunction materialPhysicalContractResult(detail) {\n return createMaterialError(\"material-physical-contract-invalid\", {\n code: \"material-physical-contract-invalid\",\n ...detail\n });\n}\n\n// src/material/resolve.ts\nfunction assetGuidBytesToDashForm(value) {\n const hex = Array.from(value, (byte) => byte.toString(16).padStart(2, \"0\"));\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n}\nfunction materialGuidText(value) {\n return typeof value === \"string\" ? value : assetGuidBytesToDashForm(value);\n}\nfunction valueType(value) {\n if (typeof value === \"boolean\") return \"bool\";\n if (typeof value === \"number\") return \"number\";\n if (typeof value === \"string\") return \"string\";\n if (Array.isArray(value)) return `vec${value.length}`;\n return \"texture\";\n}\nfunction parameterTypeMatches(parameter, value) {\n switch (parameter.type) {\n case \"bool\":\n return typeof value === \"boolean\";\n case \"f32\":\n case \"i32\":\n case \"u32\":\n return typeof value === \"number\";\n case \"vec2\":\n return Array.isArray(value) && value.length === 2;\n case \"vec3\":\n return Array.isArray(value) && value.length === 3;\n case \"vec4\":\n case \"color\":\n return Array.isArray(value) && value.length === 4;\n case \"texture\":\n case \"texture_cube\":\n return typeof value === \"string\" || typeof value === \"number\" && Number.isInteger(value) && value >= 0 || typeof value === \"object\" && !Array.isArray(value);\n }\n}\nfunction validateValues(material, values, parameters) {\n if (parameters === void 0) return ok(true);\n const declarations = new Map(parameters.map((parameter) => [parameter.name, parameter]));\n for (const [name, value] of Object.entries(values)) {\n const parameter = declarations.get(name);\n if (parameter === void 0) {\n return err(\n createMaterialError(\"material-value-unknown\", {\n code: \"material-value-unknown\",\n material,\n parameter: name\n })\n );\n }\n if (value === null) {\n if (!parameter.optional) {\n return err(\n createMaterialError(\"material-value-type-mismatch\", {\n code: \"material-value-type-mismatch\",\n material,\n parameter: name,\n expectedType: parameter.type,\n actualType: \"null\"\n })\n );\n }\n continue;\n }\n if (!parameterTypeMatches(parameter, value)) {\n return err(\n createMaterialError(\"material-value-type-mismatch\", {\n code: \"material-value-type-mismatch\",\n material,\n parameter: name,\n expectedType: parameter.type,\n actualType: valueType(value)\n })\n );\n }\n }\n return ok(true);\n}\nfunction mergeMaterial(parent, child) {\n const values = {};\n for (const [name, value] of Object.entries(parent.values ?? {})) {\n if (value !== null) values[name] = value;\n }\n for (const [name, value] of Object.entries(child.values ?? {})) {\n if (value === null) delete values[name];\n else values[name] = value;\n }\n const particleInputs = parent.particleInputs ?? child.particleInputs;\n return {\n kind: \"material\",\n ...parent.colorSpace !== void 0 ? { colorSpace: parent.colorSpace } : {},\n ...parent.passes !== void 0 && parent.passes.length > 0 ? { passes: parent.passes } : {},\n ...parent.parameters !== void 0 ? { parameters: parent.parameters } : {},\n ...particleInputs === void 0 ? {} : { particleInputs },\n ...parent.surface === void 0 ? {} : { surface: parent.surface },\n ...Object.keys(values).length > 0 ? { values } : {}\n };\n}\nfunction validateChildParameters(material, parent, child) {\n if (child === void 0) return ok(true);\n const parentByName = new Map((parent ?? []).map((parameter) => [parameter.name, parameter]));\n const extras = child.filter((parameter) => !parentByName.has(parameter.name)).map((p) => p.name);\n const conflicts = child.filter((parameter) => parentByName.get(parameter.name)?.type !== parameter.type).map((parameter) => parameter.name);\n if (extras.length === 0 && conflicts.length === 0) return ok(true);\n return err(\n materialPhysicalContractResult({\n material,\n layer: \"root\",\n ...extras.length === 0 ? {} : { missing: extras },\n ...conflicts.length === 0 ? {} : { conflicting: conflicts },\n reason: \"child-parameter\"\n })\n );\n}\nfunction resolveChain(id, leaf, table, stack) {\n if (stack.includes(id)) {\n return err(\n createMaterialError(\"material-circular-inheritance\", {\n code: \"material-circular-inheritance\",\n leaf,\n chain: [...stack, id]\n })\n );\n }\n const current = table[id];\n if (current === void 0) {\n return err(\n createMaterialError(\"material-parent-not-found\", {\n code: \"material-parent-not-found\",\n leaf,\n missingParent: id,\n chain: [...stack, id]\n })\n );\n }\n const parent = current.parent === void 0 ? void 0 : materialGuidText(current.parent);\n if (parent === void 0) {\n if (current.passes === void 0 || current.passes.length === 0) {\n return err(\n createMaterialError(\"material-no-effective-pass\", {\n code: \"material-no-effective-pass\",\n material: leaf\n })\n );\n }\n const values = {};\n for (const [name, value] of Object.entries(current.values ?? {})) {\n if (value !== null) values[name] = value;\n }\n const valid2 = validateValues(id, values, current.parameters);\n if (!valid2.ok) return valid2;\n return ok({ leaf, chain: [id], asset: { ...current, values } });\n }\n const forbidden = materialChildForbiddenFields(current);\n if (forbidden.length > 0) {\n return err(\n createMaterialError(\"material-child-contract-invalid\", {\n code: \"material-child-contract-invalid\",\n material: id,\n parent,\n forbidden,\n action: \"remove-forbidden-fields\"\n })\n );\n }\n const parentResult = resolveChain(parent, leaf, table, [...stack, id]);\n if (!parentResult.ok) return parentResult;\n const parameterContract = validateChildParameters(\n id,\n parentResult.value.asset.parameters,\n current.parameters\n );\n if (!parameterContract.ok) return parameterContract;\n const valid = validateValues(id, current.values ?? {}, parentResult.value.asset.parameters);\n if (!valid.ok) return valid;\n const merged = mergeMaterial(parentResult.value.asset, current);\n if (merged.passes === void 0 || merged.passes.length === 0) {\n return err(\n createMaterialError(\"material-no-effective-pass\", {\n code: \"material-no-effective-pass\",\n material: leaf\n })\n );\n }\n return ok({ leaf, chain: [...parentResult.value.chain, id], asset: merged });\n}\nfunction resolveMaterialAsset(leaf, table) {\n return resolveChain(leaf, leaf, table, []);\n}\n\n// src/material/standard-schema.ts\nvar STANDARD_MATERIAL_PARAM_SCHEMA = [\n { name: \"baseColor\", type: \"color\", default: [1, 1, 1, 1] },\n { name: \"metallic\", type: \"f32\", default: 0 },\n { name: \"roughness\", type: \"f32\", default: 0.5 },\n { name: \"metallicChannel\", type: \"f32\", default: 2 },\n { name: \"roughnessChannel\", type: \"f32\", default: 1 },\n { name: \"aoChannel\", type: \"f32\", default: 0 },\n { name: \"extraChannel\", type: \"f32\", default: 0 },\n { name: \"emissive\", type: \"vec3\", colorSpace: \"srgb\", default: [0, 0, 0] },\n { name: \"emissiveIntensity\", type: \"f32\", default: 0 },\n { name: \"occlusionStrength\", type: \"f32\", default: 1 },\n { name: \"alphaCutoff\", type: \"f32\", default: 0 },\n { name: \"specular\", type: \"f32\", default: 1 },\n { name: \"specularColor\", type: \"vec3\", colorSpace: \"srgb\", default: [1, 1, 1] },\n { name: \"normalScale\", type: \"f32\", default: 1 },\n { name: \"transmission\", type: \"f32\", default: 0 },\n { name: \"ior\", type: \"f32\", default: 1.5 },\n { name: \"thickness\", type: \"f32\", default: 0 },\n { name: \"attenuationColor\", type: \"vec3\", colorSpace: \"linear\", default: [1, 1, 1] },\n { name: \"attenuationDistance\", type: \"f32\" },\n { name: \"baseColorTexture\", type: \"texture2d\" },\n { name: \"metallicRoughnessTexture\", type: \"texture2d\" },\n { name: \"normalTexture\", type: \"texture2d\" },\n { name: \"specularColorTexture\", type: \"texture2d\" },\n { name: \"emissiveTexture\", type: \"texture2d\" },\n { name: \"occlusionTexture\", type: \"texture2d\" },\n { name: \"transmissionTexture\", type: \"texture2d\" },\n { name: \"thicknessTexture\", type: \"texture2d\" },\n { name: \"anisotropyStrength\", type: \"f32\", default: 0 },\n { name: \"anisotropyRotation\", type: \"f32\", default: 0 },\n { name: \"iridescence\", type: \"f32\", default: 0 },\n { name: \"iridescenceIor\", type: \"f32\", default: 1.3 },\n { name: \"iridescenceThicknessMinimum\", type: \"f32\", default: 100 },\n { name: \"iridescenceThicknessMaximum\", type: \"f32\", default: 400 },\n { name: \"sheenColor\", type: \"vec3\", colorSpace: \"linear\", default: [0, 0, 0] },\n { name: \"sheenRoughness\", type: \"f32\", default: 0 },\n { name: \"clearcoat\", type: \"f32\", default: 0 },\n { name: \"clearcoatRoughness\", type: \"f32\", default: 0 },\n { name: \"clearcoatNormalScale\", type: \"f32\", default: 1 },\n { name: \"clearcoatTexture\", type: \"texture2d\" },\n { name: \"clearcoatRoughnessTexture\", type: \"texture2d\" },\n { name: \"clearcoatNormalTexture\", type: \"texture2d\" },\n { name: \"anisotropyTexture\", type: \"texture2d\" },\n { name: \"sheenColorTexture\", type: \"texture2d\" },\n { name: \"sheenRoughnessTexture\", type: \"texture2d\" },\n { name: \"iridescenceTexture\", type: \"texture2d\" },\n { name: \"iridescenceThicknessTexture\", type: \"texture2d\" },\n { name: \"specularTexture\", type: \"texture2d\" }\n];\nvar STANDARD_SURFACE_PARAM_SCHEMA = STANDARD_MATERIAL_PARAM_SCHEMA.filter(\n (entry) => !STANDARD_PHYSICAL_PARAMETER_NAMES.has(entry.name) && (!STANDARD_TRANSMISSION_PARAMETER_NAMES.has(entry.name) || entry.name === \"ior\")\n);\nfunction standardMaterialParameters(names) {\n return STANDARD_MATERIAL_PARAM_SCHEMA.filter((entry) => names.has(entry.name)).map((entry) => {\n const type = entry.type === \"texture2d\" ? \"texture\" : entry.type;\n const isRequired = entry.name === \"baseColor\" || entry.name === \"metallic\" || entry.name === \"roughness\";\n const defaultValue = entry.type === \"texture2d\" || entry.default === void 0 ? {} : { default: entry.default };\n return {\n name: entry.name,\n type,\n ...!(\"colorSpace\" in entry) || entry.colorSpace === void 0 ? {} : { colorSpace: entry.colorSpace },\n ...defaultValue,\n ...isRequired ? {} : { optional: true }\n };\n });\n}\nfunction standardSurfaceParameters(parameters) {\n const authoredNames = new Set(parameters.map((parameter) => parameter.name));\n const implicitNames = new Set(STANDARD_SURFACE_PARAM_SCHEMA.map((entry) => entry.name));\n const implicit = standardMaterialParameters(implicitNames).map((parameter) => ({\n ...parameter,\n optional: true\n }));\n return [...implicit.filter((parameter) => !authoredNames.has(parameter.name)), ...parameters];\n}\n\n// src/derive-paramschema.ts\nvar FRAGMENT = 2;\nvar NUMERIC_TYPES = /* @__PURE__ */ new Set([\n \"f32\",\n \"i32\",\n \"u32\",\n \"vec2\",\n \"vec3\",\n \"vec4\",\n \"color\"\n]);\nvar TEXTURE_VIEW_TYPES = /* @__PURE__ */ new Set([\n \"texture2d\",\n \"texture2d_array\",\n \"texture3d\",\n \"texture_cube\",\n \"texture_depth_2d\",\n \"texture_cube_array\"\n]);\nvar SAMPLER_TYPES = /* @__PURE__ */ new Set([\n \"sampler\",\n \"sampler_comparison\"\n]);\nvar ALL_TYPES = /* @__PURE__ */ new Set([\n ...NUMERIC_TYPES,\n ...TEXTURE_VIEW_TYPES,\n ...SAMPLER_TYPES,\n \"storage_buffer\"\n]);\nfunction numericFootprint(t) {\n switch (t) {\n case \"f32\":\n case \"i32\":\n case \"u32\":\n return { size: 4, align: 4 };\n case \"vec2\":\n return { size: 8, align: 8 };\n case \"vec3\":\n return { size: 12, align: 16 };\n case \"vec4\":\n case \"color\":\n return { size: 16, align: 16 };\n }\n}\nfunction alignUp(value, alignment) {\n return value + alignment - 1 & ~(alignment - 1);\n}\nfunction textureBglDescriptor(t) {\n switch (t) {\n case \"texture2d\":\n return { sampleType: \"float\", viewDimension: \"2d\" };\n case \"texture2d_array\":\n return { sampleType: \"float\", viewDimension: \"2d-array\" };\n case \"texture3d\":\n return { sampleType: \"float\", viewDimension: \"3d\" };\n case \"texture_cube\":\n return { sampleType: \"float\", viewDimension: \"cube\" };\n case \"texture_depth_2d\":\n return { sampleType: \"depth\", viewDimension: \"2d\" };\n case \"texture_cube_array\":\n return { sampleType: \"float\", viewDimension: \"cube-array\" };\n case \"sampler\":\n case \"sampler_comparison\":\n throw new Error(`derive: textureBglDescriptor called on sampler-family type '${t}'`);\n }\n}\nfunction samplerBindingType(t) {\n return t === \"sampler\" ? \"filtering\" : \"comparison\";\n}\nvar ADMITTED_PARAM_SCHEMA_PROJECTIONS = /* @__PURE__ */ new WeakMap();\nvar UNADMITTED_PARAM_SCHEMA_PROJECTIONS = /* @__PURE__ */ new WeakMap();\nvar ParamSchemaProjectionOwner = class {\n #projections = /* @__PURE__ */ new Map();\n #admissions = 0;\n #derivations = 0;\n admit(args) {\n if (args.ownerId.length === 0) {\n throw new Error(\"ParamSchemaProjectionOwner: ownerId must be non-empty\");\n }\n if (!Number.isSafeInteger(args.revision) || args.revision < 1) {\n throw new Error(\"ParamSchemaProjectionOwner: revision must be a positive safe integer\");\n }\n this.#admissions += 1;\n const key = `${args.ownerId}\\0${args.revision}`;\n const canonicalSchema = JSON.stringify(args.schema);\n const existing = this.#projections.get(key);\n if (existing !== void 0) {\n if (existing.canonicalSchema !== canonicalSchema) {\n throw new Error(\n `ParamSchemaProjectionOwner: ${args.ownerId}@${args.revision} reused with different schema content`\n );\n }\n return existing;\n }\n const schema = freezeParamSchema(args.schema);\n const derivedInterface = freezeDerivedMaterialInterface(derivePure(schema));\n this.#derivations += 1;\n ADMITTED_PARAM_SCHEMA_PROJECTIONS.set(schema, derivedInterface);\n const projection = Object.freeze({\n ownerId: args.ownerId,\n revision: args.revision,\n schema,\n derivedInterface,\n canonicalSchema\n });\n this.#projections.set(key, projection);\n return projection;\n }\n get(ownerId, revision) {\n return this.#projections.get(`${ownerId}\\0${revision}`);\n }\n stats() {\n return Object.freeze({\n admissions: this.#admissions,\n derivations: this.#derivations,\n projections: this.#projections.size\n });\n }\n};\nfunction derive(schema) {\n const admitted = ADMITTED_PARAM_SCHEMA_PROJECTIONS.get(schema);\n if (admitted !== void 0) return admitted;\n return deriveUnadmitted(schema).derivedInterface;\n}\nfunction deriveObserved(schema, observer, site) {\n const admitted = ADMITTED_PARAM_SCHEMA_PROJECTIONS.get(schema);\n if (admitted !== void 0) {\n if (observer.enabled) observer.observe({ kind: \"admitted-identity-hit\", site });\n return admitted;\n }\n const result = deriveUnadmitted(schema);\n if (observer.enabled) {\n observer.observe({\n kind: result.cacheHit ? \"fallback-cache-hit\" : \"unregistered-fallback-derive\",\n site\n });\n if (!result.cacheHit) observer.observe({ kind: \"fallback-layout-sha\", site });\n }\n return result.derivedInterface;\n}\nfunction deriveUnadmitted(schema) {\n const shape = captureParamSchemaShape(schema);\n const cached = UNADMITTED_PARAM_SCHEMA_PROJECTIONS.get(schema);\n if (cached !== void 0 && matchesParamSchemaShape(shape, cached.shape)) {\n return { cacheHit: true, derivedInterface: cached.derivedInterface };\n }\n const derivedInterface = freezeDerivedMaterialInterface(derivePure(schema, shape));\n UNADMITTED_PARAM_SCHEMA_PROJECTIONS.set(schema, { shape, derivedInterface });\n return { cacheHit: false, derivedInterface };\n}\nfunction captureParamSchemaShape(schema) {\n const names = new Array(schema.length);\n const types = new Array(schema.length);\n for (let index = 0; index < schema.length; index += 1) {\n const entry = schema[index];\n names[index] = entry.name;\n types[index] = entry.type;\n }\n return Object.freeze({ names: Object.freeze(names), types: Object.freeze(types) });\n}\nfunction matchesParamSchemaShape(current, cached) {\n if (current.names.length !== cached.names.length) return false;\n for (let index = 0; index < current.names.length; index += 1) {\n if (current.names[index] !== cached.names[index] || current.types[index] !== cached.types[index]) {\n return false;\n }\n }\n return true;\n}\nfunction derivePure(schema, shape = captureParamSchemaShape(schema)) {\n const bglEntries = [];\n const uboFields = [];\n const numericMembers = [];\n const coordinateRecords = [];\n const resourceBindings = [];\n const bindingSpans = [];\n const textureFieldNames = /* @__PURE__ */ new Set();\n const samplerForTexture = /* @__PURE__ */ new Map();\n const seenNames = /* @__PURE__ */ new Set();\n const reservedSamplerNames = /* @__PURE__ */ new Set();\n let nextBinding = 0;\n let uboCursor = 0;\n let uboBinding = null;\n const ensureUboBinding = () => {\n if (uboBinding !== null) return uboBinding;\n uboBinding = nextBinding;\n nextBinding += 1;\n bglEntries.push({\n binding: uboBinding,\n visibility: FRAGMENT,\n buffer: { type: \"uniform\" }\n });\n bindingSpans.push({ group: 1, binding: uboBinding, start: 0, end: 0 });\n return uboBinding;\n };\n for (let index = 0; index < shape.names.length; index += 1) {\n const name = shape.names[index];\n const type = shape.types[index];\n if (name.length === 0) {\n throw new Error(\"derive: schema entry name must be non-empty\");\n }\n if (!ALL_TYPES.has(type)) {\n throw new Error(`derive: unrecognised paramSchema type literal '${type}'`);\n }\n if (seenNames.has(name)) {\n throw new Error(`derive: duplicate paramSchema entry name '${name}'`);\n }\n if (reservedSamplerNames.has(name)) {\n throw new Error(`derive: paramSchema entry '${name}' collides with auto-paired sampler name`);\n }\n seenNames.add(name);\n if (NUMERIC_TYPES.has(type)) {\n const numericType = type;\n const { size, align } = numericFootprint(numericType);\n ensureUboBinding();\n const offset = alignUp(uboCursor, align);\n uboFields.push({ name, offset, size, type: numericType });\n numericMembers.push({ name, offset, size, alignment: align, type: numericType });\n uboCursor = offset + size;\n continue;\n }\n if (TEXTURE_VIEW_TYPES.has(type)) {\n const texType = type;\n ensureUboBinding();\n const coordinateOffset = alignUp(uboCursor, 16);\n const coordinates = {\n parameter: name,\n offset: coordinateOffset,\n size: 32,\n alignment: 16,\n transformMember: `${name}CoordinatesTransform`,\n metadataMember: `${name}CoordinatesMetadata`\n };\n coordinateRecords.push(coordinates);\n uboCursor = coordinateOffset + coordinates.size;\n const { sampleType, viewDimension } = textureBglDescriptor(texType);\n const samplerName = `${name}_sampler`;\n if (seenNames.has(samplerName)) {\n throw new Error(\n `derive: auto-paired sampler name '${samplerName}' collides with existing entry`\n );\n }\n reservedSamplerNames.add(samplerName);\n samplerForTexture.set(name, samplerName);\n const samplerBinding = nextBinding;\n nextBinding += 1;\n bglEntries.push({\n binding: samplerBinding,\n visibility: FRAGMENT,\n sampler: { type: \"filtering\" }\n });\n bindingSpans.push({ group: 1, binding: samplerBinding, start: 0, end: 0 });\n resourceBindings.push({\n name: samplerName,\n parameter: name,\n kind: \"sampler\",\n binding: samplerBinding\n });\n const texBinding = nextBinding;\n nextBinding += 1;\n bglEntries.push({\n binding: texBinding,\n visibility: FRAGMENT,\n texture: { sampleType, viewDimension, multisampled: false }\n });\n bindingSpans.push({ group: 1, binding: texBinding, start: 0, end: 0 });\n resourceBindings.push({\n name,\n parameter: name,\n kind: \"texture\",\n binding: texBinding\n });\n textureFieldNames.add(name);\n continue;\n }\n if (SAMPLER_TYPES.has(type)) {\n const samplerType = type;\n const samplerBinding = nextBinding;\n nextBinding += 1;\n bglEntries.push({\n binding: samplerBinding,\n visibility: FRAGMENT,\n sampler: { type: samplerBindingType(samplerType) }\n });\n bindingSpans.push({ group: 1, binding: samplerBinding, start: 0, end: 0 });\n resourceBindings.push({\n name,\n parameter: name,\n kind: \"sampler\",\n binding: samplerBinding\n });\n continue;\n }\n const storageBinding = nextBinding;\n nextBinding += 1;\n bglEntries.push({\n binding: storageBinding,\n visibility: FRAGMENT,\n buffer: { type: \"read-only-storage\" }\n });\n bindingSpans.push({ group: 1, binding: storageBinding, start: 0, end: 0 });\n resourceBindings.push({\n name,\n parameter: name,\n kind: \"storage-buffer\",\n binding: storageBinding\n });\n }\n const totalBytes = uboCursor === 0 ? 0 : alignUp(uboCursor, 16);\n const uniformSpan = bindingSpans.find((span) => span.binding === uboBinding);\n if (uniformSpan !== void 0) {\n const index = bindingSpans.indexOf(uniformSpan);\n bindingSpans[index] = { ...uniformSpan, end: totalBytes };\n }\n const userRegion = { group: 1, bindingStart: 0, bindingEnd: nextBinding };\n const layoutIdentity = sha256LayoutIdentity({\n numericMembers,\n coordinateRecords,\n resourceBindings,\n totalBytes,\n bindingSpans,\n userRegion\n });\n return {\n schemaVersion: \"material-abi/1\",\n group: 1,\n visibility: FRAGMENT,\n bglEntries,\n uboLayout: { entries: uboFields, totalBytes },\n numericMembers,\n coordinateRecords,\n resourceBindings,\n totalBytes,\n layoutIdentity,\n textureFieldNames,\n samplerForTexture,\n userRegionBindingEnd: nextBinding,\n bindingSpans,\n userRegion\n };\n}\nfunction freezeParamSchema(schema) {\n return Object.freeze(\n schema.map((entry) => {\n const defaultValue = cloneAndFreezeSchemaValue(entry.default);\n return Object.freeze({\n ...entry,\n ...entry.default === void 0 ? {} : { default: defaultValue }\n });\n })\n );\n}\nfunction cloneAndFreezeSchemaValue(value) {\n if (Array.isArray(value)) {\n return Object.freeze(value.map((item) => cloneAndFreezeSchemaValue(item)));\n }\n if (typeof value === \"object\" && value !== null) {\n return Object.freeze(\n Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, cloneAndFreezeSchemaValue(item)])\n )\n );\n }\n return value;\n}\nfunction freezeDerivedMaterialInterface(derived) {\n deepFreeze(derived.bglEntries);\n deepFreeze(derived.uboLayout);\n deepFreeze(derived.numericMembers);\n deepFreeze(derived.coordinateRecords);\n deepFreeze(derived.resourceBindings);\n deepFreeze(derived.bindingSpans);\n deepFreeze(derived.userRegion);\n return Object.freeze({\n ...derived,\n textureFieldNames: new ImmutableSetView(derived.textureFieldNames),\n samplerForTexture: new ImmutableMapView(derived.samplerForTexture)\n });\n}\nfunction deepFreeze(value) {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const child of Object.values(value)) deepFreeze(child);\n return Object.freeze(value);\n}\nvar ImmutableSetView = class {\n #values;\n constructor(values) {\n this.#values = new Set(values);\n Object.freeze(this);\n }\n get size() {\n return this.#values.size;\n }\n has(value) {\n return this.#values.has(value);\n }\n entries() {\n return this.#values.entries();\n }\n keys() {\n return this.#values.keys();\n }\n values() {\n return this.#values.values();\n }\n forEach(callbackfn, thisArg) {\n for (const value of this.#values) callbackfn.call(thisArg, value, value, this);\n }\n [Symbol.iterator]() {\n return this.#values[Symbol.iterator]();\n }\n};\nvar ImmutableMapView = class {\n #values;\n constructor(values) {\n this.#values = new Map(values);\n Object.freeze(this);\n }\n get size() {\n return this.#values.size;\n }\n get(key) {\n return this.#values.get(key);\n }\n has(key) {\n return this.#values.has(key);\n }\n entries() {\n return this.#values.entries();\n }\n keys() {\n return this.#values.keys();\n }\n values() {\n return this.#values.values();\n }\n forEach(callbackfn, thisArg) {\n for (const [key, value] of this.#values) callbackfn.call(thisArg, value, key, this);\n }\n [Symbol.iterator]() {\n return this.#values[Symbol.iterator]();\n }\n};\nfunction inferMaterialParameterKind(entry) {\n if (NUMERIC_TYPES.has(entry.type)) return \"numeric\";\n if (TEXTURE_VIEW_TYPES.has(entry.type)) return \"texture\";\n if (entry.type === \"storage_buffer\") return \"storage-buffer\";\n return \"sampler\";\n}\nfunction sha256LayoutIdentity(value) {\n const canonical = JSON.stringify({\n version: 1,\n numericMembers: value.numericMembers,\n coordinateRecords: value.coordinateRecords,\n resourceBindings: value.resourceBindings,\n totalBytes: value.totalBytes,\n bindingSpans: value.bindingSpans,\n userRegion: value.userRegion\n });\n return `sha256-${sha256(canonical)}`;\n}\nvar SHA256_K = [\n 1116352408,\n 1899447441,\n 3049323471,\n 3921009573,\n 961987163,\n 1508970993,\n 2453635748,\n 2870763221,\n 3624381080,\n 310598401,\n 607225278,\n 1426881987,\n 1925078388,\n 2162078206,\n 2614888103,\n 3248222580,\n 3835390401,\n 4022224774,\n 264347078,\n 604807628,\n 770255983,\n 1249150122,\n 1555081692,\n 1996064986,\n 2554220882,\n 2821834349,\n 2952996808,\n 3210313671,\n 3336571891,\n 3584528711,\n 113926993,\n 338241895,\n 666307205,\n 773529912,\n 1294757372,\n 1396182291,\n 1695183700,\n 1986661051,\n 2177026350,\n 2456956037,\n 2730485921,\n 2820302411,\n 3259730800,\n 3345764771,\n 3516065817,\n 3600352804,\n 4094571909,\n 275423344,\n 430227734,\n 506948616,\n 659060556,\n 883997877,\n 958139571,\n 1322822218,\n 1537002063,\n 1747873779,\n 1955562222,\n 2024104815,\n 2227730452,\n 2361852424,\n 2428436474,\n 2756734187,\n 3204031479,\n 3329325298\n];\nfunction sha256(input) {\n const bytes = new TextEncoder().encode(input);\n const paddedLength = Math.ceil((bytes.length + 9) / 64) * 64;\n const padded = new Uint8Array(paddedLength);\n padded.set(bytes);\n padded[bytes.length] = 128;\n const view = new DataView(padded.buffer);\n view.setUint32(paddedLength - 4, bytes.length * 8, false);\n let hash = new Uint32Array([\n 1779033703,\n 3144134277,\n 1013904242,\n 2773480762,\n 1359893119,\n 2600822924,\n 528734635,\n 1541459225\n ]);\n for (let block = 0; block < padded.length; block += 64) {\n const words = new Uint32Array(64);\n for (let index = 0; index < 16; index += 1)\n words[index] = view.getUint32(block + index * 4, false);\n for (let index = 16; index < 64; index += 1) {\n const a2 = words[index - 15] ?? 0;\n const b2 = words[index - 2] ?? 0;\n words[index] = smallSigma1(b2) + (words[index - 7] ?? 0) + smallSigma0(a2) + (words[index - 16] ?? 0) >>> 0;\n }\n let a = hash[0] ?? 0;\n let b = hash[1] ?? 0;\n let c = hash[2] ?? 0;\n let d = hash[3] ?? 0;\n let e = hash[4] ?? 0;\n let f = hash[5] ?? 0;\n let g = hash[6] ?? 0;\n let h = hash[7] ?? 0;\n for (let index = 0; index < 64; index += 1) {\n const choose = e & f ^ ~e & g;\n const majority = a & b ^ a & c ^ b & c;\n const t1 = h + bigSigma1(e) + choose + (SHA256_K[index] ?? 0) + (words[index] ?? 0) >>> 0;\n const t2 = bigSigma0(a) + majority >>> 0;\n [h, g, f, e, d, c, b, a] = [g, f, e, d + t1 >>> 0, c, b, a, t1 + t2 >>> 0];\n }\n const state = [a, b, c, d, e, f, g, h];\n hash = new Uint32Array(hash.map((value, index) => value + (state[index] ?? 0) >>> 0 >>> 0));\n }\n return Array.from(hash, (word) => word.toString(16).padStart(8, \"0\")).join(\"\");\n}\nfunction rotateRight(value, shift) {\n return value >>> shift | value << 32 - shift;\n}\nfunction bigSigma0(value) {\n return rotateRight(value, 2) ^ rotateRight(value, 13) ^ rotateRight(value, 22);\n}\nfunction bigSigma1(value) {\n return rotateRight(value, 6) ^ rotateRight(value, 11) ^ rotateRight(value, 25);\n}\nfunction smallSigma0(value) {\n return rotateRight(value, 7) ^ rotateRight(value, 18) ^ value >>> 3;\n}\nfunction smallSigma1(value) {\n return rotateRight(value, 17) ^ rotateRight(value, 19) ^ value >>> 10;\n}\nvar USER_REGION_TEXTURE_FIELDS = [\n \"baseColorTexture\",\n \"metallicRoughnessTexture\",\n \"normalTexture\"\n];\nfunction stripWgslComments(source) {\n return source.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\").replace(/\\/\\/[^\\n]*/g, \"\");\n}\nfunction findUndeclaredSampledTextures(wgslSource, schema) {\n const declared = derive(schema).textureFieldNames;\n const clean = stripWgslComments(wgslSource);\n const sampleRe = /textureSample[A-Za-z]*\\(\\s*([A-Za-z_][A-Za-z0-9_]*)/g;\n const sampled = /* @__PURE__ */ new Set();\n for (let m = sampleRe.exec(clean); m !== null; m = sampleRe.exec(clean)) {\n const name = m[1];\n if (name !== void 0) sampled.add(name);\n }\n return USER_REGION_TEXTURE_FIELDS.filter((f) => sampled.has(f) && !declared.has(f));\n}\n\n// src/material-contracts.ts\nvar MATERIAL_PARAM_TYPES = [\n \"f32\",\n \"i32\",\n \"u32\",\n \"vec2\",\n \"vec3\",\n \"vec4\",\n \"color\",\n \"texture2d\",\n \"texture2d_array\",\n \"texture3d\",\n \"texture_cube\",\n \"texture_depth_2d\",\n \"texture_cube_array\",\n \"sampler\",\n \"sampler_comparison\",\n \"storage_buffer\"\n];\nvar RenderQueue = {\n /** Skybox / backdrop draw, processed first. */\n Background: 1e3,\n /** Opaque geometry draw — default queue for solid surfaces. */\n Geometry: 2e3,\n /** Alpha-tested geometry (clip/discard in fragment shader) — drawn after opaque,\n * before transparent to avoid overdraw. */\n AlphaTest: 2450,\n /** Transparent / alpha-blended geometry — drawn back-to-front after opaque pass. */\n Transparent: 3e3,\n /** Overlay / UI / debug lines — drawn last. */\n Overlay: 4e3\n};\nvar KNOWN_PASS_KINDS = [\n \"forward\",\n \"deferred\",\n \"temporal\",\n \"lighting\",\n \"shadow-caster\",\n \"point-shadow-caster\",\n \"post-process\",\n \"skybox\"\n];\n\n// src/media-contracts.ts\nvar UV_ATTRIBUTE_KEYS = [\"uv\", \"uv1\", \"uv2\", \"uv3\", \"uv4\", \"uv5\", \"uv6\", \"uv7\"];\nfunction countUvSets(attrs) {\n if (attrs === void 0) return 0;\n for (let i = UV_ATTRIBUTE_KEYS.length - 1; i >= 0; i--) {\n const v = attrs[UV_ATTRIBUTE_KEYS[i]];\n if (v instanceof Float32Array || v instanceof Uint16Array || v instanceof ArrayBuffer || Array.isArray(v)) {\n return i + 1;\n }\n }\n return 0;\n}\nfunction countExtraUvSets(attrs) {\n const total = countUvSets(attrs);\n return total > 0 ? total - 1 : 0;\n}\n\n// src/mesh-contracts.ts\nfunction resolveMeshMaterialSlotDefaultGuid(slot, authoredDefaultMaterialGuid) {\n if (authoredDefaultMaterialGuid !== void 0) {\n return authoredDefaultMaterialGuid === null ? void 0 : authoredDefaultMaterialGuid;\n }\n return slot.defaultMaterialGuid;\n}\nfunction reconcileMeshMaterialSlotTopology(current, previous = []) {\n if (previous.length === 0) {\n return { ok: true, slots: [...current], currentToStableSlot: current.map((_, index) => index) };\n }\n const stable = previous.map((slot) => ({\n slotName: slot.slotName,\n ...slot.sourceKey === void 0 ? {} : { sourceKey: slot.sourceKey },\n tombstone: true\n }));\n const mapping = new Array(current.length).fill(-1);\n const usedPrevious = /* @__PURE__ */ new Set();\n const uniqueIndex = (slots, read) => {\n const first = /* @__PURE__ */ new Map();\n const duplicates = /* @__PURE__ */ new Set();\n slots.forEach((slot, index) => {\n const key = read(slot)?.trim();\n if (!key) return;\n if (first.has(key)) duplicates.add(key);\n else first.set(key, index);\n });\n for (const duplicate of duplicates) first.delete(duplicate);\n return first;\n };\n const match = (read) => {\n const oldByKey = uniqueIndex(previous, read);\n const nextByKey = uniqueIndex(current, read);\n for (const [key, nextIndex] of nextByKey) {\n if (mapping[nextIndex] !== -1) continue;\n const oldIndex = oldByKey.get(key);\n if (oldIndex === void 0 || usedPrevious.has(oldIndex)) continue;\n mapping[nextIndex] = oldIndex;\n usedPrevious.add(oldIndex);\n }\n };\n match((slot) => slot.sourceKey);\n match((slot) => slot.slotName);\n const unmatchedCurrent = mapping.map((oldIndex, index) => oldIndex === -1 ? index : -1).filter((index) => index !== -1);\n const unmatchedPrevious = previous.map((_, index) => usedPrevious.has(index) ? -1 : index).filter((index) => index !== -1);\n if (unmatchedCurrent.length === 1 && unmatchedPrevious.length === 1 && current[unmatchedCurrent[0]]?.sourceKey === void 0 && previous[unmatchedPrevious[0]]?.sourceKey === void 0) {\n mapping[unmatchedCurrent[0]] = unmatchedPrevious[0];\n usedPrevious.add(unmatchedPrevious[0]);\n unmatchedCurrent.length = 0;\n unmatchedPrevious.length = 0;\n }\n const identityInsufficient = unmatchedCurrent.some((index) => current[index]?.sourceKey === void 0) && unmatchedPrevious.some((index) => previous[index]?.sourceKey === void 0);\n if (unmatchedCurrent.length > 0 && unmatchedPrevious.length > 0 && identityInsufficient) {\n return {\n ok: false,\n error: {\n code: \"mesh-material-slot-topology-change\",\n previousIndices: unmatchedPrevious,\n nextIndices: unmatchedCurrent,\n hint: \"name source materials uniquely or provide stable sourceKey values before reimport\"\n }\n };\n }\n for (let currentIndex = 0; currentIndex < current.length; currentIndex++) {\n let stableIndex = mapping[currentIndex];\n if (stableIndex === -1) {\n stableIndex = stable.length;\n mapping[currentIndex] = stableIndex;\n }\n stable[stableIndex] = current[currentIndex];\n }\n return { ok: true, slots: stable, currentToStableSlot: mapping };\n}\nfunction migrateLegacyMeshMaterialOverrides(legacyOverrides, submeshes, materialSlotCount, context) {\n const inherited = typeof legacyOverrides[0] === \"string\" ? \"\" : 0;\n const overrides = new Array(materialSlotCount).fill(inherited);\n const sectionsBySlot = /* @__PURE__ */ new Map();\n for (let submeshIndex = 0; submeshIndex < submeshes.length; submeshIndex++) {\n const materialSlot = submeshes[submeshIndex]?.materialSlot;\n if (materialSlot === void 0 || materialSlot < 0 || materialSlot >= materialSlotCount)\n continue;\n const sections = sectionsBySlot.get(materialSlot) ?? [];\n sections.push(submeshIndex);\n sectionsBySlot.set(materialSlot, sections);\n }\n for (const [materialSlot, submeshIndices] of sectionsBySlot) {\n const handles = submeshIndices.map((index) => legacyOverrides[index] ?? inherited);\n const distinct2 = [...new Set(handles)];\n if (distinct2.length > 1) {\n return {\n ok: false,\n error: {\n code: \"mesh-material-slot-override-conflict\",\n ...context,\n materialSlot,\n submeshIndices,\n ...typeof handles[0] === \"string\" ? { overrideGuids: handles } : { overrideHandles: handles },\n hint: \"split the source slot or choose one override explicitly before v2 to v3 recook\"\n }\n };\n }\n overrides[materialSlot] = distinct2[0] ?? inherited;\n }\n return { ok: true, overrides };\n}\n\n// src/physics-contracts.ts\nvar PhysicsError = class extends Error {\n code;\n expected;\n hint;\n detail;\n constructor(args) {\n super(`[PhysicsError ${args.code}] expected: ${args.expected}; hint: ${args.hint}`);\n this.name = \"PhysicsError\";\n this.code = args.code;\n this.expected = args.expected;\n this.hint = args.hint;\n if (args.detail !== void 0) {\n this.detail = args.detail;\n }\n }\n};\nvar PHYSICS_ERROR_HINTS = {\n \"wasm-load-failed\": \"dynamic import() of Rapier WASM rejected; check network, file path, and that @dimforge/rapier3d-compat is installed\",\n \"wasm-simd-unsupported\": \"WebAssembly.validate returned false for the SIMD test module; ensure browser supports WASM SIMD (Chrome 91+, Firefox 89+, Safari 16.4+)\",\n \"step-failed\": \"Rapier World.step threw a WASM trap; check for invalid body parameters or NaN values in transforms\",\n \"invalid-body-config\": \"check mass > 0 for dynamic bodies and valid shape parameters; see PhysicsError.detail.field\",\n \"body-not-found\": \"the entity handle did not resolve to a Rapier rigid body; ensure RigidBody was spawned before calling physics APIs\",\n \"collider-not-found\": \"the entity handle did not resolve to a Rapier collider; ensure Collider was spawned before calling physics APIs\",\n \"backend-not-registered\": \"PhysicsWorld resource not found; use createApp(canvas, { plugins: [physicsPlugin('rapier-3d')] }) or manually register a backend\",\n \"teleport-invalid-body-type\": \"teleport is only valid for dynamic bodies; static and kinematic bodies have their position managed differently\",\n \"controller-requires-kinematic\": \"moveAndSlide requires a kinematic RigidBody; set the entity's RigidBody.type to 'kinematic'\"\n};\n\n// src/runtime-scope.ts\nvar RUNTIME_ASSET_BINDING_SCHEMA = \"runtime-asset-binding-v1\";\nvar RUNTIME_CATALOG_SNAPSHOT_SCHEMA = \"runtime-catalog-snapshot-v1\";\nfunction isRuntimeCatalogRoots(value) {\n return Array.isArray(value) && value.every(\n (root) => root !== null && typeof root === \"object\" && typeof root.root === \"string\" && typeof root.catalogPrefix === \"string\"\n );\n}\nfunction runtimeScopePath(binding, suffix = \"\") {\n const normalized = suffix.length === 0 ? \"\" : `/${suffix.replace(/^\\/+/, \"\")}`;\n return `/__pack/scopes/${encodeURIComponent(binding.scopeId)}/${binding.generation}${normalized}`;\n}\nfunction createStandaloneRuntimeAssetBinding(gameId, scopeId = gameId, basePath = \"\") {\n const normalizedBase = basePath === \"/\" ? \"\" : basePath.replace(/\\/+$/, \"\");\n const identity = { scopeId, generation: 1 };\n const scopedPath = runtimeScopePath(identity);\n const hostPrefix = normalizedBase.startsWith(\"/\") ? normalizedBase : `/${normalizedBase}`;\n const prefix = normalizedBase.length === 0 ? \"\" : hostPrefix;\n return {\n schemaVersion: RUNTIME_ASSET_BINDING_SCHEMA,\n gameId,\n scopeId,\n generation: identity.generation,\n status: \"ready\",\n catalogUrl: `${prefix}${scopedPath}/catalog.json`,\n importUrlBase: `${prefix}${scopedPath}/import`,\n packageUrlBase: prefix\n };\n}\nfunction runtimeScopeMatches(binding, scopeId, generation) {\n return binding?.scopeId === scopeId && binding.generation === generation;\n}\n\n// src/texture/errors.ts\nvar TEXTURE_ERROR_HINTS = {\n \"texture-shape-invalid\": \"repair the source extent and re-import the same texture GUID\",\n \"texture-packing-invalid\": \"rebuild the producer output with canonical mip-major packing\",\n \"texture-mip-policy-invalid\": \"use none or packed for this texture shape\",\n \"texture-format-dimension-unsupported\": \"choose a format supported by the requested texture dimension\"\n};\nfunction textureError(code, detail, expected) {\n return {\n code,\n expected,\n hint: TEXTURE_ERROR_HINTS[code],\n detail\n };\n}\nfunction validateTextureShape(shape, mips, format) {\n const extent = shape.extent;\n for (const [field, value] of Object.entries(extent)) {\n if (!Number.isInteger(value) || value <= 0) {\n return err(\n textureError(\n \"texture-shape-invalid\",\n { code: \"texture-shape-invalid\", viewDimension: shape.viewDimension, extent, field },\n `${shape.viewDimension} ${field} must be a positive integer`\n )\n );\n }\n }\n if (mips?.kind === \"packed\" && (!Number.isInteger(mips.levelCount) || mips.levelCount <= 0)) {\n return err(\n textureError(\n \"texture-mip-policy-invalid\",\n {\n code: \"texture-mip-policy-invalid\",\n viewDimension: shape.viewDimension,\n policy: mips.kind\n },\n \"packed mip policy requires a positive integer levelCount\"\n )\n );\n }\n if (shape.viewDimension === \"3d\" && mips?.kind === \"generate\") {\n return err(\n textureError(\n \"texture-mip-policy-invalid\",\n {\n code: \"texture-mip-policy-invalid\",\n viewDimension: shape.viewDimension,\n policy: mips.kind\n },\n \"3d textures require none or packed mip policy\"\n )\n );\n }\n if (format !== void 0 && (format.startsWith(\"depth\") || format.startsWith(\"stencil\"))) {\n return err(\n textureError(\n \"texture-format-dimension-unsupported\",\n {\n code: \"texture-format-dimension-unsupported\",\n format,\n viewDimension: shape.viewDimension\n },\n \"authored sampled textures cannot use depth or stencil formats\"\n )\n );\n }\n if (format !== void 0 && shape.viewDimension === \"3d\" && isCompressedFormat(format)) {\n return err(\n textureError(\n \"texture-format-dimension-unsupported\",\n {\n code: \"texture-format-dimension-unsupported\",\n format,\n viewDimension: shape.viewDimension\n },\n \"compressed 3d textures are not supported by this contract\"\n )\n );\n }\n return ok(void 0);\n}\nfunction isCompressedFormat(format) {\n return format.startsWith(\"bc\") || format.startsWith(\"etc2\") || format.startsWith(\"eac\") || format.startsWith(\"astc\");\n}\n\n// src/texture/layout.ts\nfunction formatLayout(format) {\n if (isCompressedFormat(format)) {\n if (format.startsWith(\"bc1\") || format.startsWith(\"etc2-rgb8\")) {\n return { bytesPerBlock: 8, blockWidth: 4, blockHeight: 4 };\n }\n return { bytesPerBlock: 16, blockWidth: 4, blockHeight: 4 };\n }\n switch (format) {\n case \"r8unorm\":\n case \"r8snorm\":\n case \"r8uint\":\n case \"r8sint\":\n return { bytesPerBlock: 1, blockWidth: 1, blockHeight: 1 };\n case \"rg8unorm\":\n case \"rg8snorm\":\n case \"rg8uint\":\n case \"rg8sint\":\n case \"r16uint\":\n case \"r16sint\":\n case \"r16float\":\n return { bytesPerBlock: 2, blockWidth: 1, blockHeight: 1 };\n case \"rgba16uint\":\n case \"rgba16sint\":\n case \"rgba16float\":\n case \"rg32uint\":\n case \"rg32sint\":\n case \"rg32float\":\n return { bytesPerBlock: 8, blockWidth: 1, blockHeight: 1 };\n case \"rgba32uint\":\n case \"rgba32sint\":\n case \"rgba32float\":\n return { bytesPerBlock: 16, blockWidth: 1, blockHeight: 1 };\n default:\n return { bytesPerBlock: 4, blockWidth: 1, blockHeight: 1 };\n }\n}\nfunction mipLevelCount(shape, mips) {\n if (mips.kind === \"none\") return 1;\n if (mips.kind === \"packed\") return mips.levelCount;\n const { width, height } = shape.extent;\n let levels = 1;\n let largest = Math.max(width, height);\n if (shape.viewDimension === \"3d\") largest = Math.max(largest, shape.extent.depth);\n while (largest > 1) {\n largest = Math.max(1, largest >> 1);\n levels += 1;\n }\n return levels;\n}\nfunction imagesPerMip(shape, level) {\n if (shape.viewDimension === \"2d\") return 1;\n if (shape.viewDimension === \"2d-array\") return shape.extent.layers;\n return Math.max(1, shape.extent.depth >> level);\n}\nfunction deriveTextureLayout(input) {\n const shapeResult = validateTextureShape(input.shape, input.mips, input.format);\n if (!shapeResult.ok) return shapeResult;\n if (input.order !== void 0 && input.order !== \"mip-major,image-major,row-major\") {\n return err(\n textureError(\n \"texture-packing-invalid\",\n {\n code: \"texture-packing-invalid\",\n expectedBytes: 0,\n actualBytes: input.actualByteLength ?? 0,\n order: input.order\n },\n \"texture bytes must use mip-major, image-major, row-major order\"\n )\n );\n }\n const params = formatLayout(input.format);\n const levels = [];\n let byteOffset = 0;\n const count = mipLevelCount(input.shape, input.mips);\n for (let level = 0; level < count; level++) {\n const width = Math.max(1, input.shape.extent.width >> level);\n const height = Math.max(1, input.shape.extent.height >> level);\n const blockColumns = Math.ceil(width / params.blockWidth);\n const rowsPerImage = Math.ceil(height / params.blockHeight);\n const bytesPerRow = blockColumns * params.bytesPerBlock;\n const byteLength = bytesPerRow * rowsPerImage * imagesPerMip(input.shape, level);\n levels.push({\n level,\n width,\n height,\n physicalWidth: blockColumns * params.blockWidth,\n physicalHeight: rowsPerImage * params.blockHeight,\n imagesPerMip: imagesPerMip(input.shape, level),\n bytesPerRow,\n rowsPerImage,\n byteOffset,\n byteLength\n });\n byteOffset += byteLength;\n }\n const authoredBytes = input.mips.kind === \"generate\" ? levels[0]?.byteLength ?? 0 : byteOffset;\n if (input.actualByteLength !== void 0 && input.actualByteLength !== authoredBytes) {\n return err(\n textureError(\n \"texture-packing-invalid\",\n {\n code: \"texture-packing-invalid\",\n expectedBytes: authoredBytes,\n actualBytes: input.actualByteLength\n },\n \"texture data length must equal the derived canonical byte length\"\n )\n );\n }\n return ok({\n shape: input.shape,\n format: input.format,\n levels,\n byteLength: byteOffset\n });\n}\n\n// src/material-program-abi.ts\nfunction isDynamicInputLayout(value) {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const layout = value;\n if (typeof layout.name !== \"string\" || typeof layout.stride !== \"number\" || !Number.isSafeInteger(layout.stride) || layout.stride <= 0 || layout.stride % 16 !== 0 || !Array.isArray(layout.fields) || typeof layout.identity !== \"string\" || layout.identity.length === 0)\n return false;\n const limits = [\n \"maxRecords\",\n \"maxDomains\",\n \"maxPageBytes\",\n \"maxBindings\",\n \"maxEventsPerSample\"\n ];\n if (limits.some((field) => !Number.isSafeInteger(layout[field]))) return false;\n const fields = layout.fields.map((field) => {\n if (field === null || typeof field !== \"object\" || Array.isArray(field)) return void 0;\n const candidate = field;\n if (typeof candidate.name === \"string\" && typeof candidate.type === \"string\" && Number.isSafeInteger(candidate.offset) && candidate.offset >= 0 && Number.isSafeInteger(candidate.size) && candidate.size > 0 && Number.isSafeInteger(candidate.alignment) && candidate.alignment > 0) {\n return {\n name: candidate.name,\n type: candidate.type,\n offset: candidate.offset,\n size: candidate.size,\n alignment: candidate.alignment\n };\n }\n return void 0;\n });\n if (fields.some((field) => field === void 0)) return false;\n const fieldTypes = /* @__PURE__ */ new Set([\n \"f32\",\n \"u32\",\n \"vec2<f32>\",\n \"vec3<f32>\",\n \"vec4<f32>\"\n ]);\n if (fields.some(\n (field) => field !== void 0 && !fieldTypes.has(field.type)\n )) {\n return false;\n }\n const schema = {\n name: layout.name,\n fields: fields.map((field) => ({\n name: field?.name ?? \"\",\n type: field?.type\n })),\n maxRecords: layout.maxRecords,\n maxDomains: layout.maxDomains,\n maxPageBytes: layout.maxPageBytes,\n maxBindings: layout.maxBindings,\n maxEventsPerSample: layout.maxEventsPerSample\n };\n const derived = deriveMaterialDynamicInputLayout(schema);\n if (!derived.ok || derived.value.stride !== layout.stride) return false;\n if (derived.value.maxRecords !== schema.maxRecords || derived.value.maxDomains !== schema.maxDomains || derived.value.maxPageBytes !== schema.maxPageBytes || derived.value.maxBindings !== schema.maxBindings || derived.value.maxEventsPerSample !== schema.maxEventsPerSample || derived.value.identity !== layout.identity || derived.value.fields.length !== fields.length) {\n return false;\n }\n return derived.value.fields.every((field, index) => {\n const candidate = fields[index];\n return candidate !== void 0 && field.name === candidate.name && field.type === candidate.type && field.offset === candidate.offset && field.size === candidate.size && field.alignment === candidate.alignment;\n });\n}\nvar SURFACE_MODULE_RE = /^[A-Za-z_][A-Za-z0-9_.-]*(?:::[A-Za-z_][A-Za-z0-9_.-]*)*$/;\nfunction isMaterialSurfaceProgramAbi(value) {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const surface = value;\n if (surface.model !== \"standard\" && surface.model !== \"single-layer-medium\" || typeof surface.module !== \"string\" || !SURFACE_MODULE_RE.test(surface.module) || typeof surface.inputAbi !== \"string\" || typeof surface.outputAbi !== \"string\" || !Array.isArray(surface.passes) || surface.passes.some((pass) => pass !== \"nearest-layer\" && pass !== \"color\"))\n return false;\n const passes = surface.passes;\n const expectedPasses = surface.model === \"single-layer-medium\" ? [\"nearest-layer\", \"color\"] : [\"color\"];\n if (passes.length !== expectedPasses.length || passes.some((pass, index) => pass !== expectedPasses[index]))\n return false;\n if (surface.dynamicInput === void 0) return true;\n if (surface.dynamicInput === null || typeof surface.dynamicInput !== \"object\") return false;\n const dynamic = surface.dynamicInput;\n if (isDynamicInputLayout(dynamic.layout) && dynamic.group === 3 && dynamic.binding === 3 && dynamic.readOnly === true && typeof dynamic.accessor === \"string\" && dynamic.accessor === `read_${dynamic.layout.name}`) {\n return true;\n }\n return false;\n}\nfunction isMaterialProgramAbi(value) {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const abi = value;\n const row = abi.materialRow;\n const reflection = abi.reflection;\n const generation = abi.generation;\n const validIndex = (candidate) => typeof candidate === \"number\" && Number.isSafeInteger(candidate) && candidate >= 0;\n const validInputs = (inputs) => Array.isArray(inputs) && inputs.every(\n (input) => input !== null && typeof input === \"object\" && typeof input.semantic === \"string\" && validIndex(input.location) && typeof input.format === \"string\"\n ) && new Set(inputs.map((input) => input.location)).size === inputs.length;\n const validRow = (candidate) => {\n if (candidate === null || typeof candidate !== \"object\" || Array.isArray(candidate))\n return false;\n const materialRow = candidate;\n const byteLength = materialRow.byteLength;\n if (typeof byteLength !== \"number\" || !Number.isSafeInteger(byteLength) || byteLength <= 0 || byteLength % 16 !== 0 || !Array.isArray(materialRow.fields) || !materialRow.fields.every((field) => typeof field === \"string\")) {\n return false;\n }\n return new Set(materialRow.fields).size === materialRow.fields.length;\n };\n const validResources = (resources) => Array.isArray(resources) && resources.every(\n (resource) => resource !== null && typeof resource === \"object\" && typeof resource.name === \"string\" && resource.name.length > 0 && typeof resource.parameter === \"string\" && resource.parameter.length > 0 && [\"sampler\", \"texture\", \"storage-buffer\"].includes(\n resource.kind\n ) && validIndex(resource.group) && validIndex(resource.binding)\n ) && new Set(\n resources.map((resource) => {\n const candidate = resource;\n return `${candidate.group}:${candidate.binding}`;\n })\n ).size === resources.length;\n const validSkin = abi.skinPaletteAddress === void 0 || abi.skinPaletteAddress !== null && typeof abi.skinPaletteAddress === \"object\" && validIndex(abi.skinPaletteAddress.group) && validIndex(abi.skinPaletteAddress.binding) && Number.isSafeInteger(abi.skinPaletteAddress.stride) && (abi.skinPaletteAddress.stride ?? 0) > 0;\n const validSurface = abi.surface === void 0 || isMaterialSurfaceProgramAbi(abi.surface);\n const validShape = typeof abi.directEntry === \"string\" && abi.directEntry.length > 0 && typeof abi.sceneIndexEntry === \"string\" && abi.sceneIndexEntry.length > 0 && validRow(row) && validResources(abi.resourceSlots) && Array.isArray(abi.uvSets) && abi.uvSets.every(\n (uv) => uv !== null && typeof uv === \"object\" && typeof uv.parameter === \"string\" && Number.isSafeInteger(uv.set) && (uv.set ?? -1) >= 0\n ) && validInputs(abi.vertexInputs) && abi.alphaMask !== null && typeof abi.alphaMask === \"object\" && typeof abi.alphaMask.cutoff === \"string\" && typeof abi.alphaMask.source === \"string\" && reflection !== null && typeof reflection === \"object\" && typeof reflection.layoutIdentity === \"string\" && reflection.layoutIdentity.length > 0 && validResources(reflection.resourceSlots) && validInputs(reflection.vertexInputs) && typeof abi.receiptIdentity === \"string\" && abi.receiptIdentity.length > 0 && Number.isSafeInteger(generation) && typeof generation === \"number\" && generation >= 1 && validSkin && validSurface;\n if (!validShape) return false;\n const topResources = JSON.stringify(abi.resourceSlots);\n const reflectionResources = JSON.stringify(\n reflection.resourceSlots\n );\n const topInputs = JSON.stringify(abi.vertexInputs);\n const reflectionInputs = JSON.stringify(reflection.vertexInputs);\n return topResources === reflectionResources && topInputs === reflectionInputs;\n}\n\n// src/asset-producer.ts\nfunction catalogOperationsFor(input) {\n const imported = input.subject === \"imported-output\";\n const current = input.lifecycle === \"current\";\n const ready = current && (input.execution === \"direct\" || input.execution === \"cooked\");\n const canRebuild = input.execution === \"cooked\";\n const canPreview = input.execution === \"cooked\" && input.lifecycle !== \"missing\";\n const operation = (name, enabled, reason) => ({\n operation: name,\n enabled,\n ...reason === void 0 ? {} : { reason }\n });\n return {\n preview: operation(\"preview\", canPreview, canPreview ? void 0 : \"no projection to preview\"),\n save: operation(\n \"save\",\n !imported && input.execution === \"direct\" && ready,\n imported ? \"imported output is read-only\" : \"direct projection is not current\"\n ),\n rebuild: operation(\n \"rebuild\",\n canRebuild,\n canRebuild ? void 0 : \"direct assets do not require a cook\"\n ),\n sourceOverride: operation(\n \"sourceOverride\",\n imported && canRebuild,\n imported ? canRebuild ? void 0 : \"cooked projection is not available\" : \"only imported output has a source override\"\n ),\n instanceOverride: operation(\n \"instanceOverride\",\n imported && current,\n imported ? current ? void 0 : \"projection is not current\" : \"only imported output has an instance override\"\n ),\n promote: operation(\n \"promote\",\n imported && current,\n imported ? current ? void 0 : \"projection is not current\" : \"internal assets are already authored\"\n )\n };\n}\nfunction isCatalogProjectionValid(input) {\n if (input.execution === \"direct\" && input.lifecycle !== \"current\") return false;\n if (input.subject === \"imported-output\" && input.execution !== \"cooked\") return false;\n return Object.entries(input.operations).every(\n ([name, descriptor]) => name === descriptor.operation\n );\n}\nvar UI_AUTHORING_CAPABILITY = {\n contractVersion: \"1\",\n profileVersion: \"1\",\n preview: {\n operation: \"createUiPreviewSession\",\n lifecycle: \"open-rebuild-retry-dispose\"\n },\n mount: {\n operation: \"mountUi\",\n lifecycle: \"mount-dispose\",\n actionPort: \"onAction\"\n },\n state: { status: \"supported\", operation: \"gameProjection\", contractVersion: \"1\" },\n actions: { status: \"supported\", operation: \"gameProjection\", contractVersion: \"1\" },\n reads: { status: \"supported\", operation: \"gameProjection\", contractVersion: \"1\" },\n input: { status: \"supported\", operation: \"dom-native\", contractVersion: \"1\" },\n navigation: { status: \"supported\", operation: \"dom-native\", contractVersion: \"1\" },\n font: { status: \"supported\", operation: \"ui-artifact-companion\", contractVersion: \"1\" },\n localization: {\n status: \"unavailable\",\n reason: {\n code: \"missing-producer-capability\",\n hint: \"UI localization resources are not yet published through the UI authoring contract.\"\n }\n }\n};\nfunction authoringCapabilityForAssetKind(kind) {\n switch (kind) {\n case \"ui\":\n return {\n placement: {\n operation: \"unavailable\",\n reason: {\n code: \"unsupported-asset-kind\",\n hint: \"UI assets mount through the UI runtime and are not ECS scene placements.\"\n }\n },\n binding: {\n operation: \"unavailable\",\n reason: {\n code: \"unsupported-asset-kind\",\n hint: \"UI assets bind through their producer-owned UI runtime contract.\"\n }\n },\n ui: UI_AUTHORING_CAPABILITY\n };\n case \"scene\":\n return {\n placement: { operation: \"addSceneAssetToScene\" },\n binding: {\n operation: \"unavailable\",\n reason: {\n code: \"unsupported-asset-kind\",\n hint: \"Scene assets are placed as a scene mount.\"\n }\n }\n };\n case \"mesh\":\n return {\n placement: { operation: \"spawnEntity\" },\n binding: {\n operation: \"bindAssetRef\",\n target: {\n component: \"MeshFilter\",\n field: \"assetHandle\",\n assetType: \"MeshAsset\",\n cardinality: \"single\"\n },\n requiredSlots: 1\n }\n };\n case \"material\":\n return {\n placement: { operation: \"spawnEntity\" },\n binding: {\n operation: \"bindAssetRef\",\n target: {\n component: \"MeshRenderer\",\n field: \"materials\",\n assetType: \"MaterialAsset\",\n cardinality: \"array\"\n },\n requiredSlots: 1\n }\n };\n case \"texture\":\n return {\n placement: { operation: \"spawnEntity\" },\n binding: {\n operation: \"createMaterialThenBindAssetRef\",\n target: {\n component: \"MeshRenderer\",\n field: \"materials\",\n assetType: \"MaterialAsset\",\n cardinality: \"array\"\n },\n requiredSlots: 1\n }\n };\n case \"particle-effect\":\n return {\n placement: { operation: \"spawnEntity\" },\n binding: {\n operation: \"bindAssetRef\",\n target: {\n component: \"ParticleEffectPlayer\",\n field: \"effect\",\n assetType: \"ParticleEffectAsset\",\n cardinality: \"single\"\n },\n requiredSlots: 1\n }\n };\n default:\n return {\n placement: {\n operation: \"unavailable\",\n reason: {\n code: \"unsupported-asset-kind\",\n hint: `No placement capability is published for asset kind '${kind}'.`\n }\n },\n binding: {\n operation: \"unavailable\",\n reason: {\n code: \"unsupported-asset-kind\",\n hint: `No binding capability is published for asset kind '${kind}'.`\n }\n }\n };\n }\n}\nvar MESH_MATERIAL_SLOT_SOURCE_OVERRIDE_PAYLOAD_SCHEMA = {\n type: \"object\",\n properties: {\n materialSlots: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n slotName: { type: \"string\", minLength: 1 },\n sourceKey: { type: \"string\", minLength: 1 },\n defaultMaterialGuid: { type: \"string\" }\n },\n required: [\"slotName\"],\n additionalProperties: true\n }\n },\n materialSlotDefaultOverrides: {\n type: \"object\",\n additionalProperties: { type: \"string\", nullable: true }\n }\n },\n additionalProperties: true\n};\nfunction sourceOverrideError(code, expected, hint, actual) {\n return {\n ok: false,\n error: { code, expected, hint, ...actual === void 0 ? {} : { actual } }\n };\n}\nfunction isSourceOverridePayload(value) {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction canonicalizeSourceOverrides(value) {\n if (value === void 0) return void 0;\n if (!isSourceOverridePayload(value)) return void 0;\n const keys = Object.keys(value);\n if (keys.length === 0) return void 0;\n return Object.fromEntries(keys.sort().map((key) => [key, value[key]]));\n}\nfunction validateSourceOverrideEntry(sourceKey, payload, declared, seen) {\n if (seen.has(sourceKey)) {\n return {\n code: \"duplicate-source-key\",\n expected: \"sourceKey values to be unique within sourceOverrides\",\n hint: \"remove the duplicate source override\",\n actual: sourceKey\n };\n }\n seen.add(sourceKey);\n if (!declared.has(sourceKey)) {\n return {\n code: \"unknown-source-key\",\n expected: \"sourceKey to be declared by the producer topology\",\n hint: \"request a fresh Catalog topology before writing Meta\",\n actual: sourceKey\n };\n }\n if (!isSourceOverridePayload(payload)) {\n return {\n code: \"invalid-source-override-payload\",\n expected: \"each source override payload to be a producer-owned object\",\n hint: \"validate the payload with the producer schema\",\n actual: sourceKey\n };\n }\n return void 0;\n}\nfunction validateSourceOverrideEntries(entries, declared) {\n const seen = /* @__PURE__ */ new Set();\n for (const [sourceKey, payload] of entries) {\n const error = validateSourceOverrideEntry(sourceKey, payload, declared, seen);\n if (error !== void 0) return { ok: false, error };\n }\n return { ok: true, value: canonicalizeSourceOverrides(Object.fromEntries(entries)) };\n}\nfunction validateSourceOverrideMap(value, declaredSourceKeys) {\n const declared = /* @__PURE__ */ new Set();\n for (const sourceKey of declaredSourceKeys) {\n if (declared.has(sourceKey)) {\n return sourceOverrideError(\n \"duplicate-source-key\",\n \"sourceKey values declared by a producer to be unique\",\n \"repair the producer topology before publishing Meta\",\n sourceKey\n );\n }\n declared.add(sourceKey);\n }\n if (value === void 0) return { ok: true, value: void 0 };\n if (Array.isArray(value)) {\n const entries = [];\n for (const item of value) {\n if (!Array.isArray(item) || item.length !== 2 || typeof item[0] !== \"string\") {\n return sourceOverrideError(\n \"invalid-source-overrides\",\n \"sourceOverrides to be an object keyed by sourceKey\",\n \"pass a producer-owned source override map\"\n );\n }\n entries.push([item[0], item[1]]);\n }\n return validateSourceOverrideEntries(entries, declared);\n }\n if (!isSourceOverridePayload(value)) {\n return sourceOverrideError(\n \"invalid-source-overrides\",\n \"sourceOverrides to be an object keyed by sourceKey\",\n \"pass a producer-owned source override map\"\n );\n }\n return validateSourceOverrideEntries(Object.entries(value), declared);\n}\n\n// src/catalog.ts\nfunction catalogInvalid(field) {\n return err({\n code: \"catalog-delta-invalid\",\n expected: \"a CatalogDelta with complete row identity and string removals\",\n hint: \"discard the delta and enumerate a verified catalog snapshot\",\n detail: { field }\n });\n}\nfunction isRecord2(value) {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\nfunction isNonEmptyString(value) {\n return typeof value === \"string\" && value.length > 0;\n}\nfunction isStringArray(value) {\n return Array.isArray(value) && value.every(isNonEmptyString);\n}\nfunction isSubjectRef(value) {\n return isRecord2(value) && (value.type === \"asset\" || value.type === \"package\" || value.type === \"resource\") && isNonEmptyString(value.id);\n}\nfunction isRevision(value) {\n if (!isRecord2(value)) return false;\n const observedAt = value.observedAt;\n return isNonEmptyString(value.digest) && typeof observedAt === \"number\" && Number.isSafeInteger(observedAt) && observedAt >= 0 && isNonEmptyString(value.rootId);\n}\nfunction isDiagnostic(value) {\n return isRecord2(value) && isNonEmptyString(value.code) && (value.severity === \"info\" || value.severity === \"warning\" || value.severity === \"blocking\") && (value.message === void 0 || typeof value.message === \"string\") && (value.subject === void 0 || isSubjectRef(value.subject)) && (value.expected === void 0 || typeof value.expected === \"string\") && (value.actual === void 0 || typeof value.actual === \"string\") && (value.hint === void 0 || typeof value.hint === \"string\") && (value.authority === void 0 || value.authority === \"producer\" || value.authority === \"pack\" || value.authority === \"catalog\") && (value.evidence === void 0 || Array.isArray(value.evidence) && value.evidence.every(isSubjectRef)) && (value.recoveryIntents === void 0 || isStringArray(value.recoveryIntents));\n}\nfunction isRevisionWindow(value) {\n if (!isRecord2(value) || !Array.isArray(value.baseline) || !Array.isArray(value.current)) {\n return false;\n }\n const isPoint = (point) => isRecord2(point) && isNonEmptyString(point.rootId) && typeof point.revision === \"number\" && Number.isSafeInteger(point.revision) && point.revision >= 0;\n return value.baseline.every(isPoint) && value.current.every(isPoint);\n}\nfunction isTopologyDiff(value) {\n if (!isRecord2(value)) return false;\n return [\"preserved\", \"added\", \"removed\", \"changedKind\", \"ambiguous\"].every(\n (field) => Array.isArray(value[field])\n );\n}\nfunction isCatalogEntry(value) {\n if (!isRecord2(value)) return false;\n if (!isNonEmptyString(value.guid) || !isNonEmptyString(value.packageUrl) || !isNonEmptyString(value.kind) || !isNonEmptyString(value.sourcePath)) {\n return false;\n }\n if (value.authoring !== void 0 && !isRecord2(value.authoring)) return false;\n if (value.packageId !== void 0 && !isNonEmptyString(value.packageId)) return false;\n if (value.provenance !== void 0) {\n if (!isRecord2(value.provenance)) return false;\n if (!isNonEmptyString(value.provenance.provider) || !isNonEmptyString(value.provenance.version)) {\n return false;\n }\n if (value.provenance.source !== void 0 && !isNonEmptyString(value.provenance.source)) {\n return false;\n }\n }\n if (value.revision !== void 0 && !isRevision(value.revision)) return false;\n if (value.sourceKey !== void 0 && !isNonEmptyString(value.sourceKey)) return false;\n const sourceIndex = value.sourceIndex;\n if (sourceIndex !== void 0 && (typeof sourceIndex !== \"number\" || !Number.isSafeInteger(sourceIndex) || sourceIndex < 0))\n return false;\n if (value.sourceOverrides !== void 0 && !isRecord2(value.sourceOverrides)) return false;\n if (value.sourceOverrideDescriptors !== void 0 && !Array.isArray(value.sourceOverrideDescriptors)) {\n return false;\n }\n if (value.relations !== void 0 && !Array.isArray(value.relations)) return false;\n if (value.diagnostics !== void 0 && (!Array.isArray(value.diagnostics) || !value.diagnostics.every(isDiagnostic)))\n return false;\n if (value.name !== void 0 && !isNonEmptyString(value.name)) return false;\n if (value.cookReceiptUrl !== void 0 && !isNonEmptyString(value.cookReceiptUrl)) return false;\n if (value.refs !== void 0 && !isStringArray(value.refs)) return false;\n if (value.subject !== void 0 && value.subject !== \"internal-asset\" && value.subject !== \"imported-output\") {\n return false;\n }\n if (value.execution !== void 0 && value.execution !== \"direct\" && value.execution !== \"cooked\") {\n return false;\n }\n if (value.lifecycle !== void 0 && ![\"missing\", \"cooking\", \"current\", \"stale\", \"failed\"].includes(value.lifecycle)) {\n return false;\n }\n if (value.projection !== void 0 && !isRecord2(value.projection)) return false;\n return value.publication === void 0 || isRecord2(value.publication);\n}\nfunction validateCatalogDelta(value) {\n if (!isRecord2(value)) return catalogInvalid(\"delta\");\n if (!Array.isArray(value.added)) return catalogInvalid(\"added\");\n if (!Array.isArray(value.changed)) return catalogInvalid(\"changed\");\n if (!Array.isArray(value.removed)) return catalogInvalid(\"removed\");\n if (!value.added.every(isCatalogEntry)) return catalogInvalid(\"added.entry\");\n if (!value.changed.every(isCatalogEntry)) return catalogInvalid(\"changed.entry\");\n if (!value.removed.every((guid) => typeof guid === \"string\" && guid.length > 0)) {\n return catalogInvalid(\"removed.guid\");\n }\n const generation = value.generation;\n if (value.scopeId !== void 0 && !isNonEmptyString(value.scopeId) || generation !== void 0 && (typeof generation !== \"number\" || !Number.isSafeInteger(generation) || generation < 1)) {\n return catalogInvalid(\"scope\");\n }\n if (value.scopeId === void 0 !== (value.generation === void 0)) {\n return catalogInvalid(\"scope.generation\");\n }\n if (value.authority !== void 0 && value.authority !== \"authoritative\" && value.authority !== \"degraded\") {\n return catalogInvalid(\"authority\");\n }\n if (value.diagnostics !== void 0 && (!Array.isArray(value.diagnostics) || !value.diagnostics.every(isDiagnostic))) {\n return catalogInvalid(\"diagnostics\");\n }\n if (value.revisions !== void 0 && !isRevisionWindow(value.revisions)) {\n return catalogInvalid(\"revisions\");\n }\n if (value.topology !== void 0 && (!Array.isArray(value.topology) || !value.topology.every(isTopologyDiff))) {\n return catalogInvalid(\"topology\");\n }\n const identityKeys = [...value.added, ...value.changed].map((entry) => entry.guid.toLowerCase());\n if (new Set(identityKeys).size !== identityKeys.length) return catalogInvalid(\"duplicate.guid\");\n const removedKeys = value.removed.map((guid) => guid.toLowerCase());\n if (new Set(removedKeys).size !== removedKeys.length) return catalogInvalid(\"duplicate.removed\");\n if (value.authority === \"degraded\" && identityKeys.length > 0) {\n return catalogInvalid(\"degraded.identity\");\n }\n return ok(value);\n}\nfunction canonicalCatalogValue(value) {\n if (Array.isArray(value)) return `[${value.map(canonicalCatalogValue).join(\",\")}]`;\n if (isRecord2(value)) {\n return `{${Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, child]) => `${JSON.stringify(key)}:${canonicalCatalogValue(child)}`).join(\",\")}}`;\n }\n return JSON.stringify(value) ?? \"null\";\n}\nfunction digestPart(value, seed) {\n let hash = seed;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= BigInt(value.charCodeAt(index));\n hash = BigInt.asUintN(64, hash * 0x100000001b3n);\n }\n return hash.toString(16).padStart(16, \"0\");\n}\nvar CATALOG_DIGEST_SEEDS = [\n 0xcbf29ce484222325n,\n 0x84222325cbf29ce4n,\n 0x9e3779b185ebca87n,\n 0x517cc1b727220a95n\n];\nfunction catalogDigest(value) {\n const canonical = canonicalCatalogValue(value);\n return `sha256:${CATALOG_DIGEST_SEEDS.map((seed) => digestPart(canonical, seed)).join(\"\")}`;\n}\nfunction catalogEntryDigest(entry) {\n return catalogDigest({ ...entry, guid: entry.guid.toLowerCase() });\n}\nfunction catalogDeltaDigest(delta) {\n return catalogDigest({\n ...delta,\n added: [...delta.added].sort((left, right) => left.guid.localeCompare(right.guid)),\n changed: [...delta.changed].sort((left, right) => left.guid.localeCompare(right.guid)),\n removed: [...delta.removed].sort()\n });\n}\n\n// src/import.ts\nvar ImportError = class extends Error {\n code;\n expected;\n actual;\n hint;\n detail;\n constructor(args) {\n super(`[ImportError ${args.code}] expected: ${args.expected}; hint: ${args.hint}`);\n this.name = \"ImportError\";\n this.code = args.code;\n this.expected = args.expected;\n if (args.actual !== void 0) this.actual = args.actual;\n this.hint = args.hint;\n this.detail = args.detail;\n }\n};\nvar IMPORT_ERROR_HINTS = {\n \"importer-not-registered\": \"no importer registered for this meta.importer key; register one via importers.register(importer) (the importer carries its own key, e.g. gltfImporter / imageImporter); err.detail.registeredImporters lists the keys currently wired\",\n \"source-read-failed\": \"the file at meta.source could not be read; check the path is correct relative to the sidecar and the process has read access\",\n \"import-produced-no-assets\": \"the importer produced no assets, or omitted a GUID that meta.subAssets[] declared; the produced GUID set must be a superset of the declared set (GUID import-stable iron law); err.detail.missingGuids lists the declared GUIDs not produced\",\n \"guid-mismatch\": \"the importer produced a GUID that meta.subAssets[] never declared (violates the GUID import-stable iron law: GUIDs come from the external meta, never minted by the importer); err.detail.unexpectedGuids lists the offending GUIDs\",\n \"mesh-material-slot-topology-change\": \"the importer could not match previous and current Mesh material slots without ambiguity; name source materials uniquely or repair their stable sourceKey values before reimport\",\n \"mesh-lod-contract-invalid\": \"the normalized MeshAsset LOD contract is invalid; inspect err.detail.reason and repair coverage, hysteresis, references, bounds, or material slots\",\n \"mesh-lod-topology-change\": \"the source LOD topology changed in the middle of an ordered chain; preserve sourceKey identity and append or remove only at the end before reimporting\",\n \"mesh-lod-authority-conflict\": \"the format-owned LOD relation disagrees with the authored sidecar; repair the source or sidecar explicitly before publishing\",\n \"import-internal-error\": \"the importer failed at runtime; branch on err.detail: a conversion THROW carries err.detail.reason (the loaded importer threw while converting the source \\u2014 an importer bug, not a meta / source problem), while a build-time module-LOAD failure carries err.detail.loadError (the host importer module / native addon could not be imported)\",\n \"source-validation-failed\": \"the source violates an import authoring rule; inspect err.detail.diagnostics fields (code, sourcePath, sourceRange, rule, expected, actual, hint, and relatedLocations) and fix the referenced source\",\n \"unknown-source-key\": \"sourceOverrides contains a key absent from meta.subAssets[]; refresh the producer topology and use one of err.detail.declaredSourceKeys\",\n \"duplicate-source-key\": \"the producer declared the same sourceKey more than once; repair the Meta topology before importing\",\n \"invalid-source-overrides\": \"sourceOverrides must be an object keyed by producer-owned sourceKey values\",\n \"invalid-source-override-payload\": \"each sourceOverrides value must be a producer-owned object validated by the importer\"\n};\nfunction parseConservativeAnimatedBounds(value) {\n if (!Array.isArray(value) || value.length !== 6) return void 0;\n const bounds = value.map((entry) => typeof entry === \"number\" ? entry : Number.NaN);\n const [minX, minY, minZ, maxX, maxY, maxZ] = bounds;\n if (minX === void 0 || minY === void 0 || minZ === void 0 || maxX === void 0 || maxY === void 0 || maxZ === void 0 || ![minX, minY, minZ, maxX, maxY, maxZ].every(Number.isFinite) || minX > maxX || minY > maxY || minZ > maxZ) {\n return void 0;\n }\n return new Float32Array(bounds);\n}\nfunction readConservativeAnimatedBounds(importSettings, sourceIndex) {\n if (!Number.isInteger(sourceIndex) || sourceIndex < 0) return void 0;\n const rows = importSettings.conservativeAnimatedBounds;\n if (!Array.isArray(rows)) return void 0;\n return parseConservativeAnimatedBounds(rows[sourceIndex]);\n}\n\n// src/runtime-contracts.ts\nfunction legacyInspectHint(legacyInspectTarget) {\n return `use 'forgeax dev eval --root <project> --code \"return ${legacyInspectTarget}\"' to inspect the live realm`;\n}\n\nexport { ASSET_ERROR_HINTS, ASSET_EVIDENCE_ERROR_HINTS, ASSET_LOAD_ERROR_HINTS, ASSET_STAGE_ERROR_HINTS, AUDIO_ERROR_HINTS, AssetError, AudioError, BUILTIN_BASE, FontError, IES_PROFILE_BYTES_PER_SAMPLE, IES_PROFILE_BYTE_LENGTH, IES_PROFILE_HEIGHT, IES_PROFILE_WIDTH, IMAGE_ERROR_HINTS, IMPORT_ERROR_HINTS, ImportError, KNOWN_PASS_KINDS, MATERIAL_CHILD_FORBIDDEN_FIELDS, MATERIAL_PARAM_TYPES, MATERIAL_SURFACE_MODELS, MATERIAL_TEXTURE_SLOTS, MAX_GEN, MAX_SLOT, MESH_MATERIAL_SLOT_SOURCE_OVERRIDE_PAYLOAD_SCHEMA, MaterialAssetContractError, MaterialChildContractError, MaterialPhysicalContractError, PACK_ERROR_HINTS, PHYSICS_ERROR_HINTS, ParamSchemaProjectionOwner, PhysicsError, RUNTIME_ASSET_BINDING_SCHEMA, RUNTIME_CATALOG_SNAPSHOT_SCHEMA, R_MIN, RenderQueue, SINGLE_LAYER_MEDIUM_SURFACE_MODEL, STANDARD_LAYER_PARAMETER_GROUPS, STANDARD_MATERIAL_PARAM_SCHEMA, STANDARD_PHYSICAL_PARAMETER_NAMES, STANDARD_PHYSICAL_TEXTURE_FIELDS, STANDARD_SURFACE_PARAM_SCHEMA, STANDARD_TRANSMISSION_PARAMETER_NAMES, TEXTURE_ERROR_HINTS, TextError, UV_ATTRIBUTE_KEYS, assertMaterialAsset, authoringCapabilityForAssetKind, canonicalizeSourceOverrides, catalogDeltaDigest, catalogEntryDigest, catalogOperationsFor, countExtraUvSets, countUvSets, createMaterialError, createStandaloneRuntimeAssetBinding, derive, deriveMaterialDynamicInputLayout, deriveObserved, deriveStandardLayerPlan, deriveTextureLayout, err, findUndeclaredSampledTextures, handleGeneration, handleSlot, inferMaterialParameterKind, isCatalogProjectionValid, isCompressedFormat, isMaterialPhysicalContractError, isMaterialProgramAbi, isMaterialSurfaceDeclaration, isMaterialSurfaceProgramAbi, isRetiredSlot, isRuntimeCatalogRoots, legacyInspectHint, linearChannelToSrgb, materialChildForbiddenFields, materialGuidText, materialPhysicalContractResult, materialValuesToLinearRuntime, migrateLegacyMeshMaterialOverrides, ok, pack, parseConservativeAnimatedBounds, projectAssetEvidence, projectCookProductEvidence, readConservativeAnimatedBounds, reconcileMeshMaterialSlotTopology, resolveMaterialAsset, resolveMaterialTextureCoordinates, resolveMeshMaterialSlotDefaultGuid, runtimeScopeMatches, runtimeScopePath, srgbChannelToLinear, standardMaterialParameters, standardPhysicalTextureFields, standardSurfaceParameters, textureError, toShared, toUnique, unpackGen, unpackSlot, unwrapHandle, validateCatalogDelta, validateSourceOverrideMap, validateTextureShape };\n//# sourceMappingURL=index.mjs.map\n//# sourceMappingURL=index.mjs.map","// src/errors.ts\nfunction invalidArgsError(message, value) {\n return {\n code: \"tool-invalid-args\",\n expected: \"arguments accepted by the contribution argsSchema\",\n hint: \"Read the descriptor schema and retry with typed arguments.\",\n detail: { message, value }\n };\n}\nfunction capabilityUnavailableError(capability, realm) {\n return {\n code: \"tool-capability-unavailable\",\n expected: `capability ${capability} in realm ${realm}`,\n hint: \"Inspect the capability matrix and select an available realm or path.\",\n detail: { capability, realm }\n };\n}\nfunction snapshotStaleError(expectedDigest, actualDigest) {\n return {\n code: \"tool-snapshot-stale\",\n expected: \"the supplied snapshot to match the current authority\",\n hint: \"Refresh the authority snapshot and retry the write.\",\n detail: { expectedDigest, actualDigest }\n };\n}\nfunction domainFailureError(code, expected = \"the producer operation to succeed\", hint = \"Inspect detail and repair the owning producer before retrying.\", payload) {\n return {\n code: \"tool-domain-failed\",\n expected,\n hint,\n detail: { code, ...payload === void 0 ? {} : { payload } }\n };\n}\nfunction artifactIncompleteError(missing, runId) {\n return {\n code: \"tool-artifact-incomplete\",\n expected: \"the requested evidence artifacts to be produced by their owners\",\n hint: \"Request only supported evidence and inspect the artifact manifest before retrying.\",\n detail: { missing: [...missing], runId }\n };\n}\nfunction cancellationError(reason) {\n return {\n code: \"tool-run-cancelled\",\n expected: \"the tool run not to be cancelled\",\n hint: \"Retry the command after resolving the cancellation source.\",\n detail: { reason }\n };\n}\nfunction timeoutError(deadlineMs) {\n return {\n code: \"tool-run-timeout\",\n expected: `the tool run to complete within ${deadlineMs}ms`,\n hint: \"Increase the deadline only when the operation is expected to be bounded.\",\n detail: { deadlineMs }\n };\n}\nfunction disconnectedError(transport) {\n return {\n code: \"tool-run-disconnected\",\n expected: \"the tool transport to remain connected\",\n hint: \"Reconnect the transport and retry from the last serialized snapshot.\",\n detail: { transport }\n };\n}\nfunction terminalError(runId, outcome) {\n return {\n code: \"tool-run-terminal\",\n expected: \"a non-terminal ToolRun\",\n hint: \"Use the existing terminal and do not attach another executor.\",\n detail: { runId, outcome }\n };\n}\nfunction cleanupError(runId, message) {\n return {\n code: \"tool-cleanup-failed\",\n expected: \"all ToolRun cleanup callbacks to complete\",\n hint: \"Inspect the cleanup detail and release the owning resource.\",\n detail: { runId, message }\n };\n}\nfunction artifactManifestError(expected, hint, detail) {\n return { code: \"tool-artifact-manifest-invalid\", expected, hint, detail };\n}\n\n// src/artifacts.ts\nfunction createArtifactManifest(manifest) {\n const result = validateArtifactManifest(manifest, []);\n if (!result.ok) throw new TypeError(\"artifact manifest is invalid\");\n return {\n schemaVersion: \"1.0.0\",\n identity: { ...manifest.identity },\n artifacts: manifest.artifacts.map((artifact) => ({ ...artifact }))\n };\n}\nfunction validateArtifactManifest(manifest, required) {\n const fail = (reason, expected) => ({\n ok: false,\n error: artifactManifestError(\n expected,\n \"regenerate the complete manifest from the owning producers\",\n {\n reason,\n ...typeof manifest?.identity?.runId === \"string\" ? { runId: manifest.identity.runId } : {}\n }\n )\n });\n if (manifest?.schemaVersion !== \"1.0.0\")\n return fail(\"unsupported schemaVersion\", 'schemaVersion === \"1.0.0\"');\n const identity = manifest.identity;\n if (identity === void 0 || identity.runId.length === 0 || identity.snapshotDigest.length === 0 || identity.stepId.length === 0 || identity.captureId.length === 0 || !Number.isSafeInteger(identity.frameId) || identity.frameId < 0)\n return fail(\n \"identity is incomplete\",\n \"runId/snapshotDigest/stepId/captureId and non-negative frameId\"\n );\n const seen = /* @__PURE__ */ new Set();\n for (const artifact of manifest.artifacts) {\n if (artifact.owner.length === 0 || artifact.uri.length === 0 || artifact.digest.length === 0 || !Number.isSafeInteger(artifact.byteLength) || artifact.byteLength < 0)\n return fail(\n `invalid ${artifact.kind} artifact entry`,\n \"owner/uri/digest and byteLength are complete\"\n );\n if (seen.has(artifact.kind))\n return fail(\n `duplicate artifact kind '${artifact.kind}'`,\n \"one owner entry per evidence kind\"\n );\n seen.add(artifact.kind);\n }\n for (const kind of required)\n if (!seen.has(kind))\n return fail(\n `missing artifact kind '${kind}'`,\n `manifest includes requested '${kind}' evidence`\n );\n return { ok: true, value: manifest };\n}\nvar PREVIEW_ROLE_KINDS = {\n report: \"report\",\n \"rhi-tape\": \"rhi-tape\",\n capture: \"png\",\n \"fresh-replay\": \"png\",\n \"profile-capture\": \"profile-capture\",\n \"contact-sheet\": \"contact-sheet\"\n};\nfunction createPreviewArtifactManifest(manifest) {\n const result = validatePreviewArtifactManifest(manifest, []);\n if (!result.ok) throw new TypeError(\"preview artifact manifest is invalid\");\n return {\n schemaVersion: \"2.0.0\",\n identity: { ...manifest.identity },\n artifacts: manifest.artifacts.map((artifact) => ({\n ...artifact,\n derivedFrom: [...artifact.derivedFrom]\n }))\n };\n}\nfunction validatePreviewArtifactManifest(manifest, requiredRoles) {\n const fail = (reason) => ({\n ok: false,\n error: artifactManifestError(\n \"schemaVersion 2.0.0 with one complete identity and role per artifact\",\n \"regenerate the staged report and evidence from one lexical ToolRun\",\n {\n reason,\n ...typeof manifest?.identity?.runId === \"string\" ? { runId: manifest.identity.runId } : {}\n }\n )\n });\n if (manifest?.schemaVersion !== \"2.0.0\") return fail(\"v1 manifest or unsupported schemaVersion\");\n const identity = manifest.identity;\n if (identity === void 0 || [\n identity.runId,\n identity.snapshotDigest,\n identity.subjectDigest,\n identity.presentationDigest,\n identity.captureId\n ].some((value) => typeof value !== \"string\" || value.length === 0) || !Number.isSafeInteger(identity.frameId) || identity.frameId < 0) {\n return fail(\"identity is incomplete or stale\");\n }\n const seenRoles = /* @__PURE__ */ new Set();\n const digests = /* @__PURE__ */ new Set();\n for (const artifact of manifest.artifacts) {\n if (seenRoles.has(artifact.role)) return fail(`duplicate role '${artifact.role}'`);\n if (PREVIEW_ROLE_KINDS[artifact.role] !== artifact.kind) {\n return fail(`role '${artifact.role}' does not match kind '${artifact.kind}'`);\n }\n if (artifact.owner.length === 0 || artifact.uri.length === 0 || artifact.digest.length === 0 || artifact.mediaType.length === 0 || !Number.isSafeInteger(artifact.byteLength) || artifact.byteLength < 0 || artifact.derivedFrom.some((digest) => digest.length === 0)) {\n return fail(`incomplete '${artifact.role}' artifact`);\n }\n seenRoles.add(artifact.role);\n digests.add(artifact.digest);\n }\n for (const artifact of manifest.artifacts) {\n if (artifact.derivedFrom.some((digest) => !digests.has(digest))) {\n return fail(`'${artifact.role}' derivedFrom references an unpublished artifact`);\n }\n }\n for (const role of requiredRoles) {\n if (!seenRoles.has(role)) return fail(`missing required role '${role}'`);\n }\n return { ok: true, value: manifest };\n}\nfunction isSerializableValue(value, seen = /* @__PURE__ */ new Set()) {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\") return false;\n if (seen.has(value)) return false;\n seen.add(value);\n if (Array.isArray(value)) return value.every((entry) => isSerializableValue(entry, seen));\n if (Object.getPrototypeOf(value) !== Object.prototype) return false;\n return Object.entries(value).every(\n ([key, entry]) => typeof key === \"string\" && isSerializableValue(entry, seen)\n );\n}\nfunction createArtifactRef(input) {\n if (input.digest.length === 0) throw new TypeError(\"ArtifactRef digest must not be empty\");\n if (input.sizeBytes !== void 0 && (!Number.isSafeInteger(input.sizeBytes) || input.sizeBytes < 0)) {\n throw new TypeError(\"ArtifactRef sizeBytes must be a non-negative safe integer\");\n }\n return { ...input };\n}\nfunction createSnapshotRef(input) {\n if (!Number.isSafeInteger(input.revision) || input.revision < 0) {\n throw new TypeError(\"SnapshotRef revision must be a non-negative safe integer\");\n }\n if (input.digest.length === 0) throw new TypeError(\"SnapshotRef digest must not be empty\");\n return { revision: input.revision, digest: input.digest };\n}\nfunction validateArtifactRefs(value) {\n return Array.isArray(value) && value.every(\n (entry) => typeof entry === \"object\" && entry !== null && typeof Reflect.get(entry, \"kind\") === \"string\" && typeof Reflect.get(entry, \"digest\") === \"string\" && (Reflect.get(entry, \"uri\") === void 0 || typeof Reflect.get(entry, \"uri\") === \"string\")\n );\n}\n\n// src/lease.ts\nfunction createLexicalLease(runId) {\n const cleanups = [];\n let state = \"active\";\n let terminalId;\n let termination;\n const terminate = (reason) => {\n if (termination !== void 0) return termination;\n terminalId = `${runId}:terminal:${crypto.randomUUID()}`;\n state = \"terminating\";\n termination = (async () => {\n const failures = [];\n for (let index = cleanups.length - 1; index >= 0; index -= 1) {\n const entry = cleanups[index];\n if (entry === void 0) continue;\n try {\n await entry.cleanup();\n } catch (cause) {\n failures.push({\n owner: entry.owner,\n message: cause instanceof Error ? cause.message : String(cause)\n });\n }\n }\n state = \"terminated\";\n return { terminalId, reason, failures };\n })();\n return termination;\n };\n return {\n get state() {\n return state;\n },\n register(owner, cleanup) {\n if (state !== \"active\") return false;\n cleanups.push({ owner, cleanup });\n return true;\n },\n terminate\n };\n}\n\n// src/timing.ts\nvar PHASES = [\n \"lookup\",\n \"lease\",\n \"transport\",\n \"execute\",\n \"capture\",\n \"finalize\",\n \"analyze\"\n];\nfunction createExclusiveTiming(now = () => performance.now()) {\n const phases = Object.fromEntries(\n PHASES.map((phase) => [phase, { status: \"not-applicable\" }])\n );\n const closed = /* @__PURE__ */ new Set();\n let active;\n let startedAtMs;\n let endedAtMs;\n return {\n begin(phase) {\n if (active !== void 0) throw new TypeError(`phase '${active.phase}' is still open`);\n if (closed.has(phase)) throw new TypeError(`phase '${phase}' was already closed`);\n const at = now();\n startedAtMs ??= at;\n active = { phase, startedAtMs: at };\n },\n end(phase) {\n if (active?.phase !== phase) throw new TypeError(`phase '${phase}' is not the active phase`);\n const at = now();\n phases[phase] = { status: \"observed\", durationMs: Math.max(0, at - active.startedAtMs) };\n closed.add(phase);\n active = void 0;\n endedAtMs = at;\n },\n record(phase, durationMs) {\n if (!Number.isFinite(durationMs) || durationMs < 0)\n throw new TypeError(\"phase duration must be finite and non-negative\");\n if (closed.has(phase)) throw new TypeError(`phase '${phase}' was already closed`);\n const at = now();\n startedAtMs ??= at - durationMs;\n phases[phase] = { status: \"observed\", durationMs };\n closed.add(phase);\n endedAtMs = at;\n },\n finish() {\n if (active !== void 0) throw new TypeError(`phase '${active.phase}' is still open`);\n const start = startedAtMs ?? now();\n const end = endedAtMs ?? start;\n return {\n startedAtMs: start,\n endedAtMs: end,\n totalMs: Math.max(0, end - start),\n phases: { ...phases }\n };\n }\n };\n}\nfunction startToolTiming() {\n return performance.now();\n}\nfunction finishToolTiming(startedAtMs, operationTiming) {\n const endedAtMs = performance.now();\n const result = operationTiming?.finish();\n const durationMs = Math.max(0, endedAtMs - startedAtMs);\n const attributedMs = result === void 0 ? 0 : Object.values(result.phases).reduce(\n (sum, observation) => observation.status === \"observed\" ? sum + observation.durationMs : sum,\n 0\n );\n return {\n startedAtMs,\n endedAtMs,\n durationMs,\n ...result === void 0 ? {} : { phases: result.phases, unattributedMs: Math.max(0, durationMs - attributedMs) }\n };\n}\n\n// src/runtime.ts\nfunction defineTool(descriptor, execute) {\n if (!/^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/.test(descriptor.id)) {\n throw new TypeError(`Tool id must use a stable lower-case path: ${descriptor.id}`);\n }\n if (descriptor.title.trim().length === 0 || descriptor.summary.trim().length === 0) {\n throw new TypeError(\"Tool title and summary must not be empty\");\n }\n if (!Array.isArray(descriptor.evidence)) throw new TypeError(\"Tool evidence must be an array\");\n if (descriptor.preview !== void 0 && descriptor.preview.realm !== descriptor.realm) {\n throw new TypeError(\n `Tool ${descriptor.id} preview contract declares ${descriptor.preview.realm} but descriptor declares ${descriptor.realm}`\n );\n }\n const argsSchema = descriptor.argsSchema;\n const resultSchema = descriptor.resultSchema;\n return {\n descriptor: { ...descriptor, argsSchema, resultSchema, evidence: [...descriptor.evidence] },\n execute\n };\n}\nfunction eventChannel() {\n const queue = [];\n const waiters = [];\n let closed = false;\n const emit = (event) => {\n const waiter = waiters.shift();\n if (waiter !== void 0) waiter({ done: false, value: event });\n else queue.push(event);\n };\n const close = () => {\n closed = true;\n while (waiters.length > 0) waiters.shift()?.({ done: true, value: void 0 });\n };\n const events = {\n [Symbol.asyncIterator]() {\n return {\n next: async () => {\n const event = queue.shift();\n if (event !== void 0) return { done: false, value: event };\n if (closed) return { done: true, value: void 0 };\n return new Promise((resolve) => waiters.push(resolve));\n }\n };\n }\n };\n return { emit, close, events };\n}\nfunction isTerminal(value) {\n if (typeof value !== \"object\" || value === null) return false;\n const outcome = Reflect.get(value, \"outcome\");\n return outcome === \"succeeded\" || outcome === \"failed\";\n}\nfunction serializablePreview(value) {\n return isSerializableValue(value) ? value : null;\n}\nfunction domainError(error) {\n return domainFailureError(\n error.code,\n error.expected ?? \"the producer operation to succeed\",\n error.hint ?? \"Inspect detail and repair the owning producer before retrying.\",\n error.detail\n );\n}\nfunction hasOkField(value) {\n return typeof value === \"object\" && value !== null && typeof Reflect.get(value, \"ok\") === \"boolean\";\n}\nfunction isToolRuntimeError(value) {\n return typeof value === \"object\" && value !== null && typeof Reflect.get(value, \"code\") === \"string\" && Reflect.get(value, \"code\").startsWith(\"tool-\");\n}\nfunction createToolRuntime(contributions) {\n const byId = /* @__PURE__ */ new Map();\n for (const candidate of contributions) {\n if (typeof candidate !== \"object\" || candidate === null) {\n throw new TypeError(\"Tool contributions must be objects\");\n }\n const contribution = candidate;\n if (typeof contribution.execute !== \"function\") {\n throw new TypeError(\"Tool contributions must provide an executor\");\n }\n const id = contribution.descriptor.id;\n if (byId.has(id)) throw new TypeError(`Duplicate tool contribution id: ${id}`);\n byId.set(id, contribution);\n }\n const list = () => [...byId.values()].map((contribution) => contribution.descriptor);\n const run = (contribution, args, options = {}) => {\n const runId = `${contribution.descriptor.id}:${crypto.randomUUID()}`;\n const channel = eventChannel();\n const controller = new AbortController();\n const startedAtMs = startToolTiming();\n const operationTiming = createExclusiveTiming();\n const lookupStartedAtMs = startToolTiming();\n operationTiming.record(\"lookup\", Math.max(0, startToolTiming() - lookupStartedAtMs));\n const lease = createLexicalLease(runId);\n const leaseStartedAtMs = startToolTiming();\n operationTiming.record(\"lease\", Math.max(0, startToolTiming() - leaseStartedAtMs));\n let terminalStarted = false;\n let cleanupReport = {\n census: { worlds: 0, renderers: 0, canvases: 0, leases: 0 },\n failures: []\n };\n let cancelReason = \"cancelled by caller\";\n let resolveTerminal;\n const terminal = new Promise((resolve) => {\n resolveTerminal = resolve;\n });\n let resolveExecutorExited;\n const executorExited = new Promise((resolve) => {\n resolveExecutorExited = resolve;\n });\n const settle = async (candidate, reason = \"terminal\") => {\n if (terminalStarted) return;\n terminalStarted = true;\n controller.abort();\n const finalizeStartedAtMs = startToolTiming();\n const cleanupResult = await lease.terminate(reason);\n const cleanupFailure = cleanupResult.failures[0];\n const liveResources = Object.entries(cleanupReport.census).filter(([, count]) => count !== 0);\n const reportFailure = cleanupReport.failures[0] ?? (liveResources.length === 0 ? void 0 : `live resources remain: ${liveResources.map(([kind, count]) => `${kind}=${count}`).join(\", \")}`);\n operationTiming.record(\"finalize\", Math.max(0, startToolTiming() - finalizeStartedAtMs));\n const finalTerminal = cleanupFailure || candidate.outcome === \"succeeded\" && reportFailure !== void 0 ? {\n outcome: \"failed\",\n failure: cleanupError(\n runId,\n cleanupFailure === void 0 ? reportFailure : `${cleanupFailure.owner}: ${cleanupFailure.message}`\n ),\n artifacts: candidate.artifacts,\n cleanup: cleanupReport,\n ...candidate.snapshotAfter === void 0 ? {} : { snapshotAfter: candidate.snapshotAfter },\n timing: finishToolTiming(startedAtMs, operationTiming)\n } : {\n ...candidate,\n cleanup: cleanupReport,\n timing: finishToolTiming(startedAtMs, operationTiming)\n };\n resolveTerminal(finalTerminal);\n channel.emit({\n kind: \"terminal\",\n runId,\n outcome: finalTerminal.outcome,\n atMs: performance.now()\n });\n channel.close();\n };\n const context = {\n runId,\n signal: controller.signal,\n ...options.owner === void 0 ? {} : { owner: options.owner },\n ...options.caller === void 0 ? {} : { caller: options.caller },\n ...options.snapshot === void 0 ? {} : { snapshot: options.snapshot },\n emit: (event) => {\n if (!terminalStarted) channel.emit({ ...event, runId });\n },\n addCleanup: (cleanup) => {\n if (!lease.register(`cleanup:${lease.state}`, cleanup)) void cleanup();\n },\n setCleanupReport: (report) => {\n cleanupReport = {\n census: { ...report.census },\n failures: [...report.failures]\n };\n },\n require: (capability) => {\n if (terminalStarted) {\n return { ok: false, error: terminalError(runId, \"succeeded\") };\n }\n const resolved = options.capabilityResolver?.(capability);\n if (resolved !== void 0) return resolved;\n return {\n ok: false,\n error: capabilityUnavailableError(capability.id, contribution.descriptor.realm)\n };\n },\n runChild: async (childContribution, childArgs, childOptions = {}) => {\n if (terminalStarted) {\n return {\n outcome: \"failed\",\n failure: terminalError(runId, \"failed\"),\n artifacts: []\n };\n }\n const childRun = runtime.run(childContribution, childArgs, {\n ...childOptions,\n signal: controller.signal,\n ...childOptions.capabilityResolver === void 0 && options.capabilityResolver !== void 0 ? { capabilityResolver: options.capabilityResolver } : {},\n ...options.snapshot === void 0 ? {} : { snapshot: options.snapshot }\n });\n channel.emit({\n kind: \"child-started\",\n runId,\n childRunId: childRun.id,\n atMs: performance.now()\n });\n lease.register(`child:${childRun.id}`, () => {\n childRun.cancel(\"parent terminal\");\n });\n return childRun.terminal;\n }\n };\n const fail = (failure) => {\n void settle({ outcome: \"failed\", failure, artifacts: [] });\n };\n const cancel = (reason = \"cancelled by caller\") => {\n cancelReason = reason;\n void settle(\n { outcome: \"failed\", failure: cancellationError(reason), artifacts: [] },\n \"cancel\"\n );\n };\n const disconnect = (transport = \"tool transport\") => {\n void settle(\n { outcome: \"failed\", failure: disconnectedError(transport), artifacts: [] },\n \"disconnect\"\n );\n };\n const providerExit = (provider = \"provider\") => {\n void settle(\n {\n outcome: \"failed\",\n failure: domainFailureError(\n \"provider-exit\",\n \"the provider to remain alive until terminal\",\n \"Restart the provider and retry from the serialized snapshot.\",\n provider\n ),\n artifacts: []\n },\n \"provider-exit\"\n );\n };\n const timeout = options.deadlineMs === void 0 ? void 0 : setTimeout(\n () => void settle(\n {\n outcome: \"failed\",\n failure: timeoutError(options.deadlineMs),\n artifacts: []\n },\n \"timeout\"\n ),\n options.deadlineMs\n );\n channel.emit({ kind: \"started\", runId, atMs: performance.now() });\n void (async () => {\n try {\n let parsedArgs;\n try {\n parsedArgs = contribution.descriptor.argsSchema.parse(args);\n } catch (cause) {\n await settle({\n outcome: \"failed\",\n failure: invalidArgsError(\n cause instanceof Error ? cause.message : String(cause),\n serializablePreview(args)\n ),\n artifacts: []\n });\n return;\n }\n if (!parsedArgs.ok) {\n fail(invalidArgsError(parsedArgs.error, serializablePreview(args)));\n return;\n }\n if (options.signal?.aborted) {\n cancelReason = \"aborted by caller\";\n fail(cancellationError(cancelReason));\n return;\n }\n const onAbort = () => cancel(\"aborted by caller\");\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n let produced;\n const executeStartedAtMs = startToolTiming();\n try {\n produced = await contribution.execute(parsedArgs.value, context);\n } finally {\n operationTiming.record(\"execute\", Math.max(0, startToolTiming() - executeStartedAtMs));\n options.signal?.removeEventListener(\"abort\", onAbort);\n }\n if (terminalStarted) return;\n if (controller.signal.aborted) {\n fail(cancellationError(cancelReason));\n return;\n }\n let result = produced;\n let snapshotAfter = options.snapshot;\n let artifacts = [];\n if (isTerminal(produced)) {\n if (produced.outcome === \"failed\") {\n await settle(produced);\n return;\n }\n result = produced.result;\n snapshotAfter = produced.snapshotAfter;\n artifacts = produced.artifacts;\n cleanupReport = produced.cleanup ?? cleanupReport;\n } else if (hasOkField(produced)) {\n if (produced.ok === false) {\n const error = Reflect.get(produced, \"error\");\n const failureArtifacts = Reflect.get(produced, \"artifacts\") ?? [];\n if (!validateArtifactRefs(failureArtifacts)) {\n await settle({\n outcome: \"failed\",\n failure: domainFailureError(\n \"artifact-ref-invalid\",\n \"failure artifact refs to be serializable ArtifactRef values\",\n \"Return refs created by createArtifactRef.\"\n ),\n artifacts: []\n });\n return;\n }\n if (isToolRuntimeError(error)) {\n await settle({ outcome: \"failed\", failure: error, artifacts: failureArtifacts });\n return;\n }\n await settle({\n outcome: \"failed\",\n failure: domainError(error),\n artifacts: failureArtifacts\n });\n return;\n }\n result = Reflect.get(produced, \"value\");\n snapshotAfter = Reflect.get(produced, \"snapshotAfter\");\n artifacts = Reflect.get(produced, \"artifacts\") ?? [];\n }\n if (!isSerializableValue(result)) {\n await settle({\n outcome: \"failed\",\n failure: domainFailureError(\n \"terminal-not-serializable\",\n \"the result to be JSON serializable\",\n \"Return plain JSON data and ArtifactRef values instead of live handles.\"\n ),\n artifacts: []\n });\n return;\n }\n const parsedResult = contribution.descriptor.resultSchema.parse(result);\n if (!parsedResult.ok) {\n await settle({\n outcome: \"failed\",\n failure: domainFailureError(\n \"result-schema-invalid\",\n \"the result to satisfy resultSchema\",\n parsedResult.error\n ),\n artifacts: []\n });\n return;\n }\n if (!validateArtifactRefs(artifacts)) {\n await settle({\n outcome: \"failed\",\n failure: domainFailureError(\n \"artifact-ref-invalid\",\n \"artifact refs to be serializable ArtifactRef values\",\n \"Return refs created by createArtifactRef.\"\n ),\n artifacts: []\n });\n return;\n }\n const requiredEvidence = [\n .../* @__PURE__ */ new Set([...contribution.descriptor.evidence ?? [], ...options.evidence ?? []])\n ];\n const missingEvidence = requiredEvidence.filter(\n (kind) => !artifacts.some((artifact) => artifact.kind === kind)\n );\n if (missingEvidence.length > 0) {\n await settle({\n outcome: \"failed\",\n failure: artifactIncompleteError(missingEvidence, runId),\n artifacts\n });\n return;\n }\n await settle({\n outcome: \"succeeded\",\n result: parsedResult.value,\n artifacts,\n ...snapshotAfter === void 0 ? {} : { snapshotAfter }\n });\n } catch (cause) {\n await settle({\n outcome: \"failed\",\n failure: domainFailureError(\n \"executor-threw\",\n \"the contribution executor to return a result\",\n cause instanceof Error ? cause.message : String(cause)\n ),\n artifacts: []\n });\n } finally {\n if (timeout !== void 0) clearTimeout(timeout);\n resolveExecutorExited();\n }\n })();\n const runtimeRun = {\n id: runId,\n events: channel.events,\n terminal,\n executorExited,\n cancel,\n disconnect,\n providerExit\n };\n return runtimeRun;\n };\n const runtime = {\n list,\n describe: (id) => byId.get(id)?.descriptor,\n get: (id) => byId.get(id),\n run\n };\n return runtime;\n}\n\n// src/api.ts\nfunction assertName(value, label) {\n if (typeof value !== \"string\" || !/^[a-zA-Z0-9][a-zA-Z0-9._:/-]*$/.test(value)) {\n throw new TypeError(`${label} must be a stable non-empty identity`);\n }\n}\nfunction operationPath(descriptor) {\n return (descriptor.path ?? descriptor.id.split(\".\")).join(\" \");\n}\nfunction providerKey(sourceId, providerId) {\n return `${sourceId}\\0${providerId}`;\n}\nfunction apiFailure(code, expected, hint, detail) {\n return domainFailureError(code, expected, hint, detail);\n}\nfunction failedRun(failure) {\n const id = `api:${crypto.randomUUID()}`;\n const terminal = Promise.resolve({\n outcome: \"failed\",\n failure,\n artifacts: []\n });\n const events = {\n async *[Symbol.asyncIterator]() {\n yield { kind: \"started\", runId: id, atMs: performance.now() };\n yield { kind: \"terminal\", runId: id, outcome: \"failed\", atMs: performance.now() };\n }\n };\n return {\n id,\n events,\n terminal,\n executorExited: Promise.resolve(),\n cancel() {\n },\n disconnect() {\n },\n providerExit() {\n }\n };\n}\nfunction validateProvider(input) {\n assertName(input.providerId, \"providerId\");\n assertName(input.sourceId, \"sourceId\");\n if (![\"build\", \"host\", \"engine\", \"frontend\"].includes(input.realm))\n throw new TypeError(`unsupported Tool API realm ${String(input.realm)}`);\n if (!Array.isArray(input.tools) || input.tools.length === 0)\n throw new TypeError(\"Tool API providers must publish at least one contribution\");\n const ids = /* @__PURE__ */ new Set();\n const paths = /* @__PURE__ */ new Set();\n if (input.initialState !== void 0 && input.initialState !== \"pending\" && input.initialState !== \"active\")\n throw new TypeError(\"Tool API provider initialState must be pending or active\");\n for (const contribution of input.tools) {\n if (contribution === null || typeof contribution !== \"object\")\n throw new TypeError(\"Tool API contributions must be objects\");\n if (typeof contribution.execute !== \"function\")\n throw new TypeError(\n `Tool API contribution ${String(contribution.descriptor?.id)} needs an executor`\n );\n const descriptor = contribution.descriptor;\n if (descriptor.realm !== input.realm)\n throw new TypeError(\n `Tool API ${descriptor.id} declares ${descriptor.realm} but provider is ${input.realm}`\n );\n if (ids.has(descriptor.id))\n throw new TypeError(`duplicate Tool API operation id ${descriptor.id}`);\n ids.add(descriptor.id);\n const path = operationPath(descriptor);\n if (paths.has(path)) throw new TypeError(`duplicate Tool API command path ${path}`);\n paths.add(path);\n }\n}\nfunction createToolApi() {\n const providers = /* @__PURE__ */ new Map();\n const listeners = /* @__PURE__ */ new Set();\n let providerGeneration = 0;\n let disposed = false;\n const notify = () => {\n const value = api.snapshot();\n for (const listener of listeners) {\n try {\n listener(value);\n } catch {\n }\n }\n };\n const snapshot = () => {\n const providerSnapshots = [];\n const operations = [];\n for (const record of providers.values()) {\n providerSnapshots.push({\n owner: record.owner,\n state: record.state,\n ...record.fiberState === void 0 ? {} : { fiberState: record.fiberState },\n callable: record.state === \"active\",\n operationIds: record.input.tools.map(({ descriptor }) => descriptor.id)\n });\n for (const contribution of record.input.tools) {\n operations.push({\n descriptor: contribution.descriptor,\n owner: record.owner,\n providerState: record.state,\n declared: true,\n callable: record.state === \"active\",\n ...record.fiberState === void 0 ? {} : { fiberState: record.fiberState }\n });\n }\n }\n providerSnapshots.sort(\n (left, right) => providerKey(left.owner.sourceId, left.owner.providerId).localeCompare(\n providerKey(right.owner.sourceId, right.owner.providerId)\n )\n );\n operations.sort((left, right) => {\n const source = left.owner.sourceId.localeCompare(right.owner.sourceId);\n return source !== 0 ? source : left.descriptor.id.localeCompare(right.descriptor.id);\n });\n return { providers: providerSnapshots, operations };\n };\n const registerProvider = (input) => {\n if (disposed) throw new Error(\"Tool API is disposed\");\n validateProvider(input);\n const key = providerKey(input.sourceId, input.providerId);\n if ([\"pending\", \"active\", \"revoking\"].includes(providers.get(key)?.state ?? \"\")) {\n throw new TypeError(\n `Tool API provider ${input.sourceId}/${input.providerId} is already registered`\n );\n }\n const generation = input.generation ?? ++providerGeneration;\n if (!Number.isSafeInteger(generation) || generation <= 0)\n throw new TypeError(\"Tool API provider generation must be a positive integer\");\n providerGeneration = Math.max(providerGeneration, generation);\n const owner = {\n providerId: input.providerId,\n sourceId: input.sourceId,\n generation,\n realm: input.realm,\n ...input.fiberId === void 0 ? {} : { fiberId: input.fiberId },\n ...input.module === void 0 ? {} : { module: input.module }\n };\n const runtime = createToolRuntime(input.tools);\n const record = {\n input: { ...input, tools: [...input.tools] },\n owner,\n runtime,\n runs: /* @__PURE__ */ new Set(),\n state: input.initialState ?? \"active\",\n ...input.fiberState === void 0 ? {} : { fiberState: input.fiberState }\n };\n providers.set(key, record);\n notify();\n const activate = (fiberState = \"active\") => {\n if (record.state !== \"pending\") return;\n record.state = \"active\";\n record.fiberState = fiberState;\n notify();\n };\n const fail = (reason = \"provider failed\", fiberState = \"failed\") => {\n if (record.state !== \"pending\" && record.state !== \"active\") return;\n record.state = \"failed\";\n record.reason = reason;\n record.fiberState = fiberState;\n for (const run2 of record.runs) run2.cancel(reason);\n notify();\n };\n const revoke = async (reason = \"provider revoked\") => {\n if (record.state === \"revoked\") return;\n if (record.state === \"active\" || record.state === \"pending\") {\n record.state = \"revoking\";\n record.reason = reason;\n record.fiberState = \"unloading\";\n notify();\n for (const run2 of record.runs) run2.cancel(reason);\n }\n await Promise.all([...record.runs].map((run2) => run2.executorExited));\n if (record.state !== \"failed\") {\n record.state = \"revoked\";\n record.fiberState = \"disposed\";\n }\n notify();\n };\n return Object.freeze({\n owner,\n activate,\n fail,\n snapshot: () => ({\n owner,\n state: record.state,\n ...record.fiberState === void 0 ? {} : { fiberState: record.fiberState },\n callable: record.state === \"active\",\n operationIds: record.input.tools.map(({ descriptor }) => descriptor.id)\n }),\n revoke\n });\n };\n const findRecords = (id, sourceId) => [...providers.values()].filter(\n (record) => (sourceId === void 0 || record.owner.sourceId === sourceId) && record.input.tools.some(({ descriptor }) => descriptor.id === id)\n );\n const run = (id, args, options = {}) => {\n if (disposed) {\n return failedRun(\n apiFailure(\n \"api-disposed\",\n \"the Tool API owner to remain available\",\n \"Create a fresh owner and retry the operation.\",\n { operation: id }\n )\n );\n }\n if (options.providerId !== void 0 && options.sourceId === void 0) {\n return failedRun(\n apiFailure(\n \"api-source-required\",\n `operation ${id} to include its explicit sourceId with providerId`,\n \"Refresh Tool API sources and pass both sourceId and providerId from one snapshot.\",\n { operation: id, providerId: options.providerId }\n )\n );\n }\n const matches = findRecords(id, options.sourceId);\n const active = matches.filter((record) => record.state === \"active\");\n const selected = options.providerId === void 0 ? active.length === 1 ? active[0] : void 0 : active.find((record) => record.owner.providerId === options.providerId);\n if (selected === void 0) {\n const code = matches.length === 0 || active.length === 0 ? \"api-operation-unavailable\" : \"api-provider-route-required\";\n return failedRun(\n apiFailure(\n code,\n `operation ${id} to have one active, explicitly routable provider`,\n \"Refresh Tool API sources and select the providerId/sourceId returned by discovery.\",\n {\n operation: id,\n ...options.providerId === void 0 ? {} : { providerId: options.providerId },\n providers: matches.map((record) => record.owner.providerId)\n }\n )\n );\n }\n if (options.generation !== void 0 && options.generation !== selected.owner.generation) {\n return failedRun(\n apiFailure(\n \"api-stale-generation\",\n `provider ${selected.owner.providerId} generation ${options.generation} to match ${selected.owner.generation}`,\n \"Refresh the source snapshot before retrying the operation.\",\n {\n operation: id,\n providerId: selected.owner.providerId,\n expectedGeneration: selected.owner.generation,\n actualGeneration: options.generation\n }\n )\n );\n }\n const contribution = selected.input.tools.find(({ descriptor }) => descriptor.id === id);\n if (contribution === void 0) {\n return failedRun(\n apiFailure(\n \"api-operation-unavailable\",\n `operation ${id} to remain published by its provider`,\n \"Refresh Tool API sources before retrying.\",\n { operation: id }\n )\n );\n }\n if (selected.input.authorize?.(options.caller, contribution.descriptor) === false) {\n return failedRun(\n apiFailure(\n \"api-unauthorized\",\n `caller to be authorized for operation ${id}`,\n \"Use the authenticated Host connection and the capability it was granted.\",\n { operation: id, providerId: selected.owner.providerId }\n )\n );\n }\n const runOptions = {\n ...options,\n owner: selected.owner,\n ...options.caller === void 0 ? {} : { caller: options.caller }\n };\n const activeRun = selected.runtime.run(contribution, args, runOptions);\n selected.runs.add(activeRun);\n void activeRun.executorExited.finally(\n () => selected.runs.delete(activeRun)\n );\n return activeRun;\n };\n const api = {\n snapshot,\n list: () => snapshot().operations,\n describe: (id, sourceId) => findRecords(id, sourceId).flatMap((record) => {\n const contribution = record.input.tools.find(({ descriptor }) => descriptor.id === id);\n return contribution === void 0 ? [] : [\n {\n descriptor: contribution.descriptor,\n owner: record.owner,\n providerState: record.state,\n declared: true,\n callable: record.state === \"active\",\n ...record.fiberState === void 0 ? {} : { fiberState: record.fiberState }\n }\n ];\n }),\n registerProvider,\n run,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n async dispose() {\n if (disposed) return;\n disposed = true;\n const pending = [...providers.values()].map((record) => {\n if (record.state === \"active\" || record.state === \"pending\") {\n record.state = \"revoking\";\n record.fiberState = \"unloading\";\n for (const run2 of record.runs) run2.cancel(\"Tool API owner disposed\");\n }\n return Promise.all([...record.runs].map((run2) => run2.executorExited)).then(() => {\n if (record.state !== \"failed\") {\n record.state = \"revoked\";\n record.fiberState = \"disposed\";\n }\n });\n });\n await Promise.all(pending);\n notify();\n listeners.clear();\n }\n };\n return api;\n}\n\n// src/capability.ts\nvar capabilityIdPattern = /^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/;\nfunction defineToolCapability(id) {\n if (!capabilityIdPattern.test(id)) {\n throw new TypeError(`Tool capability id must use a stable lower-case path: ${id}`);\n }\n return Object.freeze({ id });\n}\nfunction createCapabilityResolver(resolve) {\n return (capability) => {\n const value = resolve(capability);\n return value === void 0 ? void 0 : { ok: true, value };\n };\n}\nfunction admissionFailure(admission, expected) {\n if (admission === void 0) return \"no workload-scoped admission report was supplied\";\n if (admission.schema !== \"forgeax.tool-service-admission-ref.v1\" || !/^sha256:[0-9a-f]{64}$/.test(admission.reportDigest)) {\n return \"admission report identity is invalid\";\n }\n for (const key of [\n \"toolId\",\n \"descriptorDigest\",\n \"recipeDigest\",\n \"workloadClass\",\n \"codeDigest\",\n \"browserVersion\",\n \"backend\"\n ]) {\n if (admission[key] !== expected[key]) return `admission ${key} does not match this run`;\n }\n if (admission.frameCount < 300) return \"admission workload ran fewer than 300 frames\";\n if (Object.values(admission.samples).some((count) => count < 30)) {\n return \"admission sample set is incomplete\";\n }\n if (!admission.correctness.terminalEquivalent || !admission.correctness.artifactIntegrity || !admission.correctness.freshReplay || !admission.correctness.hiddenParity || admission.correctness.drawCalls <= 0 || admission.correctness.nonBlackPixels <= 0) {\n return \"admission correctness gate failed\";\n }\n const performance2 = admission.performance;\n if (Object.values(performance2).some((value) => !Number.isFinite(value) || value <= 0) || performance2.serviceMedianMs > performance2.privateMedianMs * 0.8 || performance2.serviceP95Ms > performance2.privateP95Ms * 0.9 || performance2.serviceMaxMs > performance2.privateMaxMs * 1.1 || performance2.serviceRssBytes > performance2.privateRssBytes * 1.25) {\n return \"admission performance threshold failed\";\n }\n if (!admission.cleanupPassed) return \"admission cleanup gate failed\";\n if (!admission.evictionPassed) return \"admission eviction gate failed\";\n return void 0;\n}\nfunction createServiceCapability(admission, expected) {\n const reason = admissionFailure(admission, expected);\n if (reason === void 0 && admission !== void 0) {\n return { available: true, reportDigest: admission.reportDigest };\n }\n return {\n available: false,\n code: \"tool-service-capability-absent\",\n expected: \"an admitted acceleration service\",\n hint: \"Use the private executor and rerun benchmark admission before enabling service.\",\n detail: { reason: reason ?? \"benchmark admission did not pass\" }\n };\n}\nfunction createRealmCapabilityMatrix(input) {\n const realms = [\"build\", \"host\", \"engine\", \"frontend\"].reduce(\n (result, realm) => {\n const supported = input.supported[realm];\n result[realm] = supported ? { realm, supported: true } : { realm, supported: false, reason: \"realm-capability-unavailable\" };\n return result;\n },\n {}\n );\n return { catalogDigest: input.catalogDigest, realms };\n}\nfunction bootstrapNotCloneSafeError(detail) {\n return {\n code: \"tool-bootstrap-not-clone-safe\",\n expected: \"bootstrap input to contain structured-clone-safe data\",\n hint: \"Remove live handles, functions, ports, and realm-owned objects from bootstrap input.\",\n detail\n };\n}\nfunction validateRealmBootstrapPayload(value) {\n try {\n structuredClone(value);\n return { ok: true };\n } catch (cause) {\n return {\n ok: false,\n error: bootstrapNotCloneSafeError({\n message: cause instanceof Error ? cause.message : String(cause)\n })\n };\n }\n}\n\n// src/carrier.ts\nfunction token() {\n return crypto.randomUUID().replaceAll(\"-\", \"\");\n}\nfunction carrierError(code, expected, hint, detail) {\n return { code, expected, hint, detail };\n}\nfunction containsLiveKey(value, seen = /* @__PURE__ */ new Set()) {\n if (typeof value !== \"object\" || value === null) return false;\n if (seen.has(value)) return false;\n seen.add(value);\n if (Array.isArray(value)) return value.some((entry) => containsLiveKey(entry, seen));\n return Object.entries(value).some(([key, nested]) => {\n if ([\"world\", \"renderer\", \"canvas\", \"ui\", \"profile\", \"liveHandle\", \"context\", \"fiber\"].includes(\n key\n ))\n return true;\n return containsLiveKey(nested, seen);\n });\n}\nfunction validateOptions(options) {\n if (options.projectId.length === 0 || options.consumerId.length === 0) {\n throw new TypeError(\"carrier projectId and consumerId must not be empty\");\n }\n const endpoint = new URL(options.endpoint);\n if (endpoint.protocol !== \"http:\" || ![\"127.0.0.1\", \"localhost\"].includes(endpoint.hostname)) {\n throw new TypeError(\"carrier endpoint must be loopback HTTP\");\n }\n if (!Number.isFinite(options.now) || !Number.isFinite(options.ttlMs) || options.ttlMs <= 0) {\n throw new TypeError(\"carrier clock and ttl must be finite and positive\");\n }\n if (containsLiveKey(options.payload)) throw new TypeError(\"carrier-payload-live-state\");\n}\nfunction createCarrierStateMachine(options) {\n validateOptions(options);\n const offer = {\n schemaVersion: \"1.0.0\",\n projectId: options.projectId,\n consumerId: options.consumerId,\n offerId: `offer:${token()}`,\n endpoint: options.endpoint,\n bearerToken: token(),\n livenessToken: token(),\n expiresAt: options.now + options.ttlMs,\n ...options.descriptorDigest === void 0 ? {} : { descriptorDigest: options.descriptorDigest },\n ...options.recipeDigest === void 0 ? {} : { recipeDigest: options.recipeDigest },\n state: \"offered\"\n };\n let state = { state: \"offered\" };\n let lease;\n const leaseOffer = (requestOrId, maybeRequest) => {\n const request = typeof requestOrId === \"string\" ? maybeRequest : requestOrId;\n const requestedLeaseId = typeof requestOrId === \"string\" ? requestOrId : void 0;\n if (request === void 0) {\n return {\n ok: false,\n error: carrierError(\n \"carrier-token-invalid\",\n \"a complete lease request\",\n \"Provide consumer identity, bearer token, and current time.\",\n {}\n )\n };\n }\n if (state.state === \"started\") {\n return {\n ok: false,\n error: carrierError(\n \"carrier-started\",\n \"a started carrier not to be retried\",\n \"Report one terminal failure and clean up the existing started lease.\",\n {}\n )\n };\n }\n if (state.state === \"exited\") {\n return {\n ok: false,\n error: carrierError(\n \"carrier-exited\",\n \"an exited carrier not to be retried\",\n \"Re-run the operation from a serialized snapshot instead of migrating live state.\",\n {}\n )\n };\n }\n if (request.consumerId !== offer.consumerId) {\n return {\n ok: false,\n error: carrierError(\n \"carrier-consumer-mismatch\",\n \"the offer consumer identity to match\",\n \"Use the consumer identity that was authenticated for this project offer.\",\n { expected: offer.consumerId, actual: request.consumerId }\n )\n };\n }\n if (request.bearerToken !== offer.bearerToken) {\n return {\n ok: false,\n error: carrierError(\n \"carrier-token-invalid\",\n \"the bearer token to match the ephemeral offer\",\n \"Request a fresh visible offer; never persist or guess bearer tokens.\",\n {}\n )\n };\n }\n if (offer.descriptorDigest !== void 0 && request.descriptorDigest !== offer.descriptorDigest) {\n return {\n ok: false,\n error: carrierError(\n \"carrier-descriptor-mismatch\",\n \"the descriptor digest to match the authenticated offer\",\n \"Refresh the descriptor and request a new visible offer before retrying.\",\n { expected: offer.descriptorDigest, actual: request.descriptorDigest }\n )\n };\n }\n if (offer.recipeDigest !== void 0 && request.recipeDigest !== offer.recipeDigest) {\n return {\n ok: false,\n error: carrierError(\n \"carrier-recipe-mismatch\",\n \"the recipe digest to match the authenticated offer\",\n \"Serialize the current snapshot and request a fresh visible offer before retrying.\",\n { expected: offer.recipeDigest, actual: request.recipeDigest }\n )\n };\n }\n if (request.now >= offer.expiresAt) {\n state = { state: \"expired\" };\n return {\n ok: false,\n error: carrierError(\n \"carrier-offer-expired\",\n \"the offer to be within its expiry window\",\n \"Fall back to the ordinary visible carrier before retrying.\",\n { expiresAt: offer.expiresAt, now: request.now }\n )\n };\n }\n if (requestedLeaseId !== void 0 && requestedLeaseId !== lease?.leaseId) {\n return {\n ok: false,\n error: carrierError(\n \"carrier-token-invalid\",\n \"the lease id to match the authenticated offer\",\n \"Use the lease id returned by the first successful lease.\",\n {}\n )\n };\n }\n lease = {\n leaseId: `lease:${token()}`,\n offerId: offer.offerId,\n consumerId: request.consumerId,\n state: \"leased\"\n };\n state = { state: \"leased\", leaseId: lease.leaseId };\n return { ok: true, value: lease, state: \"leased\" };\n };\n const started = (leaseId) => {\n if (lease?.leaseId !== leaseId) {\n return {\n ok: false,\n error: carrierError(\n \"carrier-lease-required\",\n \"a valid lease before started\",\n \"Lease the authenticated offer before reporting provider started.\",\n {}\n )\n };\n }\n state = { state: \"started\", leaseId };\n return { ok: true, value: state, state: \"started\" };\n };\n const exit = (leaseId) => {\n if (lease?.leaseId !== leaseId || state.state !== \"started\") {\n return {\n ok: false,\n error: carrierError(\n \"carrier-lease-required\",\n \"a started lease before provider exit\",\n \"Provider exit is terminal only after started has been acknowledged.\",\n {}\n )\n };\n }\n state = { state: \"exited\", leaseId };\n return { ok: true, value: state, state: \"exited\" };\n };\n const fallback = () => {\n if (state.state === \"started\" || state.state === \"exited\") {\n return {\n ok: false,\n error: carrierError(\n \"carrier-started\",\n \"fallback to happen before provider started\",\n \"Do not retry or migrate a carrier after started; return its terminal failure.\",\n { state: state.state }\n )\n };\n }\n state = { state: \"fallback\" };\n return { ok: true, value: state, state: \"fallback\" };\n };\n return {\n offer,\n lease: leaseOffer,\n started,\n exit,\n fallback,\n snapshot: () => state\n };\n}\n\n// src/json-schema.ts\nfunction isRecord(value) {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\nfunction sameJson(left, right) {\n return JSON.stringify(left) === JSON.stringify(right);\n}\nfunction typeMatches(type, value) {\n if (typeof type === \"object\") return type.some((candidate) => typeMatches(candidate, value));\n switch (type) {\n case void 0:\n return true;\n case \"null\":\n return value === null;\n case \"array\":\n return Array.isArray(value);\n case \"object\":\n return isRecord(value);\n case \"string\":\n return typeof value === \"string\";\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value);\n case \"integer\":\n return typeof value === \"number\" && Number.isSafeInteger(value);\n case \"boolean\":\n return typeof value === \"boolean\";\n }\n}\nfunction validate(value, schema2, path) {\n if (!typeMatches(schema2.type, value))\n return { path, message: `expected ${schema2.type ?? \"a value\"}` };\n if (schema2.enum !== void 0 && !schema2.enum.some((candidate) => sameJson(candidate, value))) {\n return { path, message: \"expected one of the declared enum values\" };\n }\n if (schema2.const !== void 0 && !sameJson(schema2.const, value)) {\n return { path, message: \"expected the declared constant value\" };\n }\n if (typeof value === \"string\" && schema2.minLength !== void 0 && value.length < schema2.minLength) {\n return { path, message: `must contain at least ${schema2.minLength} characters` };\n }\n if (typeof value === \"number\") {\n if (schema2.minimum !== void 0 && value < schema2.minimum)\n return { path, message: `must be at least ${schema2.minimum}` };\n if (schema2.maximum !== void 0 && value > schema2.maximum)\n return { path, message: `must be at most ${schema2.maximum}` };\n }\n if (Array.isArray(value)) {\n if (schema2.minItems !== void 0 && value.length < schema2.minItems)\n return { path, message: `must contain at least ${schema2.minItems} items` };\n if (schema2.items !== void 0) {\n for (let index = 0; index < value.length; index += 1) {\n const failure = validate(value[index], schema2.items, `${path}[${index}]`);\n if (failure !== void 0) return failure;\n }\n }\n }\n if (isRecord(value)) {\n const properties = schema2.properties ?? {};\n for (const key of schema2.required ?? []) {\n if (!(key in value)) return { path: `${path}.${key}`, message: \"is required\" };\n }\n if (schema2.additionalProperties === false) {\n for (const key of Object.keys(value)) {\n if (!(key in properties)) return { path: `${path}.${key}`, message: \"is not declared\" };\n }\n }\n for (const [key, child] of Object.entries(properties)) {\n if (!(key in value)) continue;\n const failure = validate(value[key], child, `${path}.${key}`);\n if (failure !== void 0) return failure;\n }\n }\n return void 0;\n}\nfunction parseToolJsonSchema(value, schema2) {\n const failure = validate(value, schema2, \"$\");\n return failure === void 0 ? { ok: true, value } : { ok: false, error: `${failure.path}: ${failure.message}` };\n}\nfunction toolJsonSchema(schema2) {\n return {\n parse: (value) => parseToolJsonSchema(value, schema2),\n describe: JSON.stringify(schema2)\n };\n}\n\n// src/command-contract.ts\nfunction defineToolCommandContract(commands) {\n const value = { schemaVersion: \"1.0.0\", commands: [...commands] };\n if (!isToolCommandContract(value))\n throw new TypeError(\"invalid or duplicate tool command declaration\");\n return value;\n}\nfunction jsonTree(value, ancestors = /* @__PURE__ */ new Set()) {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\" || ancestors.has(value) || Object.getOwnPropertySymbols(value).length)\n return false;\n if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)\n return false;\n const descriptors = Object.getOwnPropertyDescriptors(value);\n if (Array.isArray(value) && (Object.keys(value).length !== value.length || Object.keys(value).some((key, index) => key !== String(index))))\n return false;\n ancestors.add(value);\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (Array.isArray(value) && key === \"length\") continue;\n if (!descriptor.enumerable || !(\"value\" in descriptor) || !jsonTree(descriptor.value, ancestors))\n return false;\n }\n ancestors.delete(value);\n return true;\n}\nfunction isToolCommandContract(value) {\n if (!jsonTree(value) || value === null || typeof value !== \"object\" || Array.isArray(value))\n return false;\n const contract = value;\n if (Object.keys(contract).some((key) => ![\"schemaVersion\", \"commands\"].includes(key)) || contract.schemaVersion !== \"1.0.0\" || !Array.isArray(contract.commands))\n return false;\n const ids = /* @__PURE__ */ new Set(), paths = /* @__PURE__ */ new Set();\n return contract.commands.every((command) => {\n if (command === null || typeof command !== \"object\" || Array.isArray(command) || Object.keys(command).some(\n (key) => ![\n \"id\",\n \"path\",\n \"title\",\n \"summary\",\n \"realm\",\n \"argsSchema\",\n \"resultSchema\",\n \"evidence\",\n \"executor\",\n \"exportName\"\n ].includes(key)\n ) || typeof command.id !== \"string\" || !command.id.trim() || ids.has(command.id) || typeof command.title !== \"string\" || !command.title.trim() || typeof command.summary !== \"string\" || ![\"build\", \"host\", \"engine\", \"frontend\"].includes(command.realm))\n return false;\n const path = command.path ?? command.id.split(\".\");\n if (!Array.isArray(path) || !path.length || path.some((part) => typeof part !== \"string\" || !part.trim()) || paths.has(path.join(\" \")))\n return false;\n ids.add(command.id);\n paths.add(path.join(\" \"));\n if (command.evidence !== void 0 && (!Array.isArray(command.evidence) || command.evidence.some((kind) => ![\"rhi-tape\", \"profile-capture\", \"png\"].includes(kind))))\n return false;\n if (command.executor !== void 0 && (typeof command.executor !== \"string\" || !command.executor.trim()) || command.exportName !== void 0 && (typeof command.exportName !== \"string\" || !command.exportName.trim() || !command.executor))\n return false;\n try {\n for (const value2 of [command.argsSchema, command.resultSchema]) {\n if (value2 !== void 0 && (typeof value2 !== \"string\" || !jsonTree(schema(value2))))\n return false;\n }\n } catch {\n return false;\n }\n return true;\n });\n}\nfunction schema(value) {\n if (value === void 0) return void 0;\n const parsed = JSON.parse(value);\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed))\n throw new TypeError(\"tool schema must be a JSON object\");\n return parsed;\n}\nfunction commandContribution(declaration, load) {\n const input = schema(declaration.argsSchema);\n const output = schema(declaration.resultSchema);\n return {\n descriptor: {\n id: declaration.id,\n title: declaration.title,\n summary: declaration.summary,\n realm: declaration.realm,\n ...declaration.path ? { path: declaration.path } : {},\n argsSchema: toolJsonSchema(input ?? {}),\n resultSchema: toolJsonSchema(output ?? {}),\n evidence: declaration.evidence ?? [],\n capabilities: [],\n errors: [\"tool-capability-unavailable\"]\n },\n execute: async (args, context) => {\n if (!load)\n return {\n ok: false,\n error: {\n code: \"tool-capability-unavailable\",\n expected: \"a delivered executor registered by an active native provider\",\n hint: \"build and activate the owning plugin asset\",\n detail: { capability: declaration.id, realm: declaration.realm }\n }\n };\n return (await load())(args, context);\n }\n };\n}\n\n// src/command-tree.ts\nvar ToolCommandError = class extends Error {\n code;\n path;\n detail;\n constructor(code, path, message, detail = {}) {\n super(`${code}: ${message}`);\n this.name = \"ToolCommandError\";\n this.code = code;\n this.path = path;\n this.detail = detail;\n }\n};\nfunction normalizePath(path) {\n const segments = typeof path === \"string\" ? path.split(/\\s+/).filter(Boolean) : [...path];\n if (segments.length === 0 && typeof path === \"string\" || segments.some((segment) => !/^[a-z][a-z0-9-]*$/.test(segment))) {\n throw new ToolCommandError(\n \"tool-command-invalid-path\",\n typeof path === \"string\" ? path : segments.join(\" \"),\n \"command paths must contain lower-case name segments\"\n );\n }\n return segments;\n}\nfunction descriptorPath(descriptor) {\n const path = normalizePath(descriptor.path ?? descriptor.id.split(\".\"));\n if (path.length === 0) {\n throw new ToolCommandError(\n \"tool-command-invalid-path\",\n \"\",\n \"command declarations must contain at least one name segment\"\n );\n }\n return path;\n}\nfunction pathKey(path) {\n return path.join(\" \");\n}\nfunction schemaValue(describe) {\n if (describe === void 0) return void 0;\n try {\n const value = JSON.parse(describe);\n return value !== null && typeof value === \"object\" ? value : void 0;\n } catch {\n return void 0;\n }\n}\nfunction nodeForDescriptor(descriptor, path, includeLeaf = true) {\n const inputSchema = descriptor.inputSchema ?? schemaValue(descriptor.argsSchema.describe);\n const outputSchema = descriptor.outputSchema ?? schemaValue(descriptor.resultSchema.describe);\n const node = {\n name: path[path.length - 1],\n path: pathKey(path),\n summary: descriptor.summary\n };\n if (includeLeaf) {\n return {\n ...node,\n leaf: {\n title: descriptor.title,\n realm: descriptor.realm,\n ...inputSchema === void 0 ? descriptor.argsSchema.describe === void 0 ? {} : { inputDescription: descriptor.argsSchema.describe } : { inputSchema },\n ...outputSchema === void 0 ? descriptor.resultSchema.describe === void 0 ? {} : { outputDescription: descriptor.resultSchema.describe } : { outputSchema },\n capabilities: [...descriptor.capabilities ?? []],\n errors: [...descriptor.errors ?? []],\n ...descriptor.example === void 0 ? {} : { example: descriptor.example }\n }\n };\n }\n return node;\n}\nfunction compareRegistered(left, right) {\n return pathKey(left.path).localeCompare(pathKey(right.path));\n}\nfunction hasPrefix(left, right) {\n return left.length < right.length && left.every((segment, index) => segment === right[index]);\n}\nfunction findNode(registered, path) {\n return registered.find(\n (candidate) => candidate.path.length === path.length && candidate.path.every((segment, index) => segment === path[index])\n );\n}\nfunction descendants(registered, path) {\n return registered.filter((candidate) => hasPrefix(path, candidate.path));\n}\nfunction projectNodes(registered, path, recursive) {\n const children = /* @__PURE__ */ new Map();\n for (const candidate of registered) {\n if (candidate.path.length <= path.length || !path.every((segment, index) => candidate.path[index] === segment))\n continue;\n const next = candidate.path[path.length];\n const existing = children.get(next);\n if (existing === void 0 || candidate.path.length < (existing?.path.length ?? Number.MAX_SAFE_INTEGER))\n children.set(next, candidate.path.length === path.length + 1 ? candidate : void 0);\n }\n return [...children.entries()].sort(([left], [right]) => left.localeCompare(right)).map(([name, exact]) => {\n const childPath = [...path, name];\n if (exact !== void 0)\n return nodeForDescriptor(exact.contribution.descriptor, childPath, false);\n const node = {\n name,\n path: pathKey(childPath),\n summary: descendants(registered, childPath)[0]?.contribution.descriptor.summary ?? \"\"\n };\n if (recursive) return { ...node, children: projectNodes(registered, childPath, true) };\n return node;\n });\n}\nfunction commandPath(descriptor) {\n return descriptorPath(descriptor);\n}\nfunction defineCommand(descriptor, execute) {\n const path = descriptorPath(descriptor);\n return {\n descriptor: {\n ...descriptor,\n id: descriptor.id ?? path.join(\".\"),\n path\n },\n execute\n };\n}\nfunction createToolCommandRegistry(contributions) {\n const registered = [];\n const byPath = /* @__PURE__ */ new Map();\n for (const contribution of contributions) {\n const path = descriptorPath(contribution.descriptor);\n const key = pathKey(path);\n if (byPath.has(key) || registered.some(\n (candidate) => hasPrefix(candidate.path, path) || hasPrefix(path, candidate.path)\n )) {\n throw new ToolCommandError(\n \"tool-command-conflict\",\n key,\n \"command paths cannot collide with a leaf or its descendants\",\n { path: key }\n );\n }\n byPath.set(key, contribution);\n registered.push({ path, contribution });\n }\n registered.sort(compareRegistered);\n const runtime = createToolRuntime(registered.map((entry) => entry.contribution));\n const find = (pathInput) => {\n const path = normalizePath(pathInput);\n return findNode(registered, path);\n };\n const help = (pathInput, recursive = false) => {\n const path = pathInput === void 0 ? [] : normalizePath(pathInput);\n const exact = path.length === 0 ? void 0 : findNode(registered, path);\n const descendant = path.length === 0 ? registered : descendants(registered, path);\n if (path.length > 0 && exact === void 0 && descendant.length === 0) {\n let parent = path.slice(0, -1);\n while (parent.length > 0 && descendants(registered, parent).length === 0)\n parent = parent.slice(0, -1);\n throw new ToolCommandError(\n \"tool-command-not-found\",\n pathKey(path),\n \"command path was not found\",\n {\n parent: pathKey(parent),\n candidates: projectNodes(registered, parent, false).map((node) => node.name)\n }\n );\n }\n const leaf = exact === void 0 ? void 0 : nodeForDescriptor(exact.contribution.descriptor, path).leaf;\n const summary = exact?.contribution.descriptor.summary;\n return {\n path: pathKey(path),\n ...summary === void 0 ? {} : { summary },\n nodes: projectNodes(registered, path, recursive || exact !== void 0),\n ...leaf === void 0 ? {} : { leaf }\n };\n };\n return {\n contributions: registered.map((entry) => entry.contribution),\n list: (path = []) => projectNodes(registered, path, false),\n tree: (path = []) => projectNodes(registered, normalizePath(path), true),\n describe: (pathInput) => find(pathInput)?.contribution.descriptor,\n help,\n get: (pathInput) => find(pathInput)?.contribution,\n run: (pathInput, args, options) => {\n const contribution = find(pathInput)?.contribution;\n if (contribution === void 0) return void 0;\n return runtime.run(contribution, args, options);\n }\n };\n}\n\n// src/migration.ts\nvar liveStateKeys = /* @__PURE__ */ new Set([\n \"world\",\n \"renderer\",\n \"canvas\",\n \"context\",\n \"fiber\",\n \"page\",\n \"carrier\",\n \"ui\",\n \"selection\",\n \"draft\",\n \"undo\",\n \"session\"\n]);\nfunction liveStateError(path, key) {\n return {\n code: \"tool-migration-live-state\",\n expected: \"migration payload to contain only recipe, snapshot, and artifact references\",\n hint: \"Recreate the operation from serializable authority facts; do not migrate live state.\",\n detail: { path, key }\n };\n}\nfunction createCapabilityToken(operation, source, version, target) {\n if (source.catalogDigest.length === 0 || target.catalogDigest.length === 0)\n throw new TypeError(\"capability probe catalogDigest must not be empty\");\n return {\n kind: \"forgeax-tool-capability\",\n version,\n operation,\n source: { ...source, evidence: [...source.evidence] },\n target: { ...target, evidence: [...target.evidence] }\n };\n}\nfunction probeMigrationTarget(token2, target) {\n const sameEvidence = token2.target.evidence.every((kind) => target.evidence.includes(kind));\n const matches = token2.target.realm === target.realm && token2.target.catalogDigest === target.catalogDigest && token2.target.rhiBackend === target.rhiBackend && sameEvidence;\n if (!matches) {\n return {\n ok: false,\n error: capabilityUnavailableError(`migration:${token2.operation}`, target.realm)\n };\n }\n return { ok: true, value: { ...target, evidence: [...target.evidence] } };\n}\nfunction createMigrationRecipe(input) {\n const recipe = {\n operation: input.operation,\n args: input.args,\n ...input.snapshot === void 0 ? {} : { snapshot: { ...input.snapshot } },\n artifacts: (input.artifacts ?? []).map((artifact) => ({ ...artifact }))\n };\n const validation = validateMigrationPayload(recipe);\n if (!validation.ok) {\n const path = validation.error.code === \"tool-migration-live-state\" ? validation.error.detail.path : \"$\";\n throw new TypeError(path);\n }\n return recipe;\n}\nfunction validateMigrationPayload(value) {\n const visit = (candidate, path) => {\n if (!isSerializableValue(candidate)) {\n return { ok: false, error: liveStateError(path, path.split(\".\").at(-1) ?? \"<root>\") };\n }\n if (candidate === null || typeof candidate !== \"object\") return { ok: true };\n if (Array.isArray(candidate)) {\n for (const [index, child] of candidate.entries()) {\n const result = visit(child, `${path}[${index}]`);\n if (!result.ok) return result;\n }\n return { ok: true };\n }\n for (const [key, child] of Object.entries(candidate)) {\n const normalized = key.replaceAll(\"_\", \"\").replaceAll(\"-\", \"\").toLowerCase();\n if (liveStateKeys.has(normalized)) return { ok: false, error: liveStateError(path, key) };\n const result = visit(child, `${path}.${key}`);\n if (!result.ok) return result;\n }\n return { ok: true };\n };\n return visit(value, \"$\");\n}\n\n// src/snapshot.ts\nfunction terminalSnapshot(terminal) {\n return terminal.snapshotAfter;\n}\nfunction isSnapshotRef(value) {\n return typeof value === \"object\" && value !== null && Number.isSafeInteger(Reflect.get(value, \"revision\")) && Reflect.get(value, \"revision\") >= 0 && typeof Reflect.get(value, \"digest\") === \"string\" && Reflect.get(value, \"digest\").length > 0;\n}\n\n// src/transport.ts\nvar CarrierTransportError = class extends Error {\n code;\n expected;\n hint;\n detail;\n constructor(error) {\n super(error.code);\n this.name = \"CarrierTransportError\";\n this.code = error.code;\n if (error.expected !== void 0) this.expected = error.expected;\n if (error.hint !== void 0) this.hint = error.hint;\n if (error.detail !== void 0) this.detail = error.detail;\n }\n};\nfunction createAuthenticatedCarrierTransport(options) {\n const url = new URL(options.endpoint);\n if (url.protocol !== \"http:\" || ![\"127.0.0.1\", \"localhost\"].includes(url.hostname))\n throw new TypeError(\"carrier transport endpoint must be loopback HTTP\");\n if (options.bearerToken.length < 8) throw new TypeError(\"carrier bearer token is too short\");\n let connected = true;\n async function request(path, payload) {\n if (!connected)\n throw new CarrierTransportError({\n code: \"carrier-exited\",\n expected: \"a connected carrier transport\",\n hint: \"Request a fresh visible offer after provider exit.\"\n });\n let response;\n try {\n response = await fetch(`${options.endpoint}${path}`, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${options.bearerToken}`,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify(payload)\n });\n } catch (cause) {\n throw new CarrierTransportError({\n code: \"carrier-provider-exit\",\n expected: \"the carrier provider to remain reachable\",\n hint: \"Offer a fresh carrier; do not fallback after started.\",\n detail: { cause: cause instanceof Error ? cause.message : String(cause) }\n });\n }\n const value = await response.json().catch(() => ({}));\n if (!response.ok || typeof value !== \"object\" || value === null || !(\"ok\" in value) || value.ok !== true) {\n const error = typeof value === \"object\" && value !== null && \"error\" in value && typeof value.error === \"object\" && value.error !== null ? value.error : {\n code: \"carrier-provider-exit\",\n expected: \"a successful carrier response\",\n hint: \"Offer a fresh carrier and retry from a serialized snapshot.\"\n };\n const normalized = {\n code: typeof error.code === \"string\" ? error.code : \"carrier-provider-exit\",\n ...typeof error.expected === \"string\" ? { expected: error.expected } : {},\n ...typeof error.hint === \"string\" ? { hint: error.hint } : {},\n ...typeof error.detail === \"object\" && error.detail !== null ? { detail: error.detail } : {}\n };\n throw new CarrierTransportError(normalized);\n }\n return value;\n }\n return {\n endpoint: options.endpoint,\n get connected() {\n return connected;\n },\n lease: (payload) => request(\"/lease\", payload),\n started: (payload) => request(\"/start\", payload),\n execute: (payload) => request(\"/execute\", payload),\n exit: (payload) => request(\"/exit\", payload),\n close() {\n connected = false;\n }\n };\n}\nfunction createLoopbackTransport(endpoint) {\n const url = new URL(endpoint);\n if (url.protocol !== \"http:\" || ![\"127.0.0.1\", \"localhost\"].includes(url.hostname)) {\n throw new TypeError(\"carrier transport endpoint must be loopback HTTP\");\n }\n let connected = true;\n return {\n endpoint,\n get connected() {\n return connected;\n },\n send(payload) {\n if (!connected || !validateRealmBootstrapPayload(payload).ok) return false;\n return true;\n },\n close() {\n connected = false;\n }\n };\n}\nfunction createAuthenticatedLoopbackTransport(options) {\n const url = new URL(options.endpoint);\n if (url.protocol !== \"http:\" || ![\"127.0.0.1\", \"localhost\"].includes(url.hostname)) {\n throw new TypeError(\"service transport endpoint must be loopback HTTP\");\n }\n if (options.bearerToken.length < 8) throw new TypeError(\"service bearer token is too short\");\n let connected = true;\n return {\n endpoint: options.endpoint,\n get connected() {\n return connected;\n },\n async request(request, bearerToken, requestOptions = {}) {\n if (!connected) throw new Error(\"service transport is disconnected\");\n if (bearerToken !== options.bearerToken) throw new Error(\"service bearer token rejected\");\n if (!validateRealmBootstrapPayload(request).ok) {\n throw new Error(\"service request is not structured-clone safe\");\n }\n const response = await fetch(options.endpoint, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${bearerToken}`,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify(request),\n ...requestOptions.signal === void 0 ? {} : { signal: requestOptions.signal }\n });\n const payload = await response.json();\n if (!response.ok) {\n const detail = typeof payload === \"object\" && payload !== null && \"error\" in payload ? String(payload.error) : `HTTP ${response.status}`;\n throw new Error(`service request failed: ${detail}`);\n }\n return payload;\n },\n close() {\n connected = false;\n }\n };\n}\n\nexport { CarrierTransportError, ToolCommandError, artifactIncompleteError, cancellationError, capabilityUnavailableError, cleanupError, commandContribution, commandPath, createArtifactManifest, createArtifactRef, createAuthenticatedCarrierTransport, createAuthenticatedLoopbackTransport, createCapabilityResolver, createCapabilityToken, createCarrierStateMachine, createExclusiveTiming, createLexicalLease, createLoopbackTransport, createMigrationRecipe, createPreviewArtifactManifest, createRealmCapabilityMatrix, createServiceCapability, createSnapshotRef, createToolApi, createToolCommandRegistry, createToolRuntime, defineCommand, defineTool, defineToolCapability, defineToolCommandContract, disconnectedError, domainFailureError, finishToolTiming, invalidArgsError, isSerializableValue, isSnapshotRef, isToolCommandContract, parseToolJsonSchema, probeMigrationTarget, snapshotStaleError, startToolTiming, terminalError, terminalSnapshot, timeoutError, toolJsonSchema, validateArtifactManifest, validateArtifactRefs, validateMigrationPayload, validatePreviewArtifactManifest, validateRealmBootstrapPayload };\n//# sourceMappingURL=index.mjs.map\n//# sourceMappingURL=index.mjs.map","export * from '@deepseek-ai/cordis';\nimport { err, ok } from '@forgeax/engine-types';\nimport { createCapabilityResolver, createToolApi } from '@forgeax/engine-tool-runtime';\n\n// src/index.ts\nvar pluginAssetOrigin = /* @__PURE__ */ Symbol(\"forgeax.pluginAssetOrigin\");\nfunction samePluginEvidence(left, right) {\n if (left?.kind === \"source\" && right.kind === \"source\") {\n return left.revision === right.revision && left.digest === right.digest;\n }\n if (left?.kind !== \"publication\" || right.kind !== \"publication\") return false;\n const a = left.publication, b = right.publication;\n return a.scopeId === b.scopeId && a.generation === b.generation && a.digest === b.digest && a.outputSetDigest === b.outputSetDigest;\n}\nasync function mountPluginAsset(ctx, guid, signal) {\n const programs = ctx.pluginPrograms;\n const assets = ctx.get(\"assets\");\n if (!programs || !assets?.readPluginDefinition) {\n return err({\n code: \"plugin-asset-read-failed\",\n expected: \"assets and pluginPrograms services in the installing Context\",\n hint: \"declare both services in inject and configure the host asset reader\",\n detail: { guid, cause: \"missing plugin asset services\" }\n });\n }\n let cancelled = false;\n const isCancelled = () => cancelled || signal?.aborted === true || ctx.fiber.uid === null || ctx.fiber.state === 5 || ctx.pluginPrograms !== programs;\n const cancelledResult = () => err({\n code: \"plugin-mount-cancelled\",\n expected: \"the installing Fiber and program session to remain current\",\n hint: \"discard this result and install from the current session\",\n detail: { guid, sessionGeneration: programs.sessionGeneration }\n });\n let release;\n try {\n release = ctx.effect(\n () => () => {\n cancelled = true;\n },\n \"plugin-asset/pending-mount\"\n );\n const definition = await assets.readPluginDefinition(guid);\n if (isCancelled()) return cancelledResult();\n if (!definition.ok)\n return err({\n code: \"plugin-asset-read-failed\",\n expected: \"a validated plugin definition and its atomic publication evidence\",\n hint: \"inspect and rebuild the owning Pack\",\n detail: { guid, cause: definition.error }\n });\n const { asset, evidence } = definition.value;\n const expected = programs.definitions.get(guid);\n if (definition.value.guid !== guid || !samePluginEvidence(expected, evidence))\n return err({\n code: \"plugin-publication-mismatch\",\n expected: \"the definition tuple locked by this program inventory\",\n hint: \"rebuild and start a new session with one consistent inventory\",\n detail: { guid, expected, actual: evidence }\n });\n const entry = programs.programs.get(asset.program);\n if (!entry)\n return err({\n code: \"plugin-program-unavailable\",\n expected: \"a delivered static program for this build target\",\n hint: \"include the plugin in the target closure and rebuild\",\n detail: { guid, program: asset.program, target: programs.target }\n });\n let plugin;\n try {\n plugin = await entry.load();\n } catch (cause) {\n if (isCancelled()) return cancelledResult();\n return err({\n code: \"plugin-module-invalid\",\n expected: \"a loadable native Cordis export\",\n hint: \"repair the referenced module and rebuild\",\n detail: { guid, program: asset.program, cause }\n });\n }\n if (isCancelled()) return cancelledResult();\n if (!ctx.registry.resolve(plugin))\n return err({\n code: \"plugin-module-invalid\",\n expected: \"a native function, constructor or apply object\",\n hint: \"export the native plugin selected by module.export\",\n detail: { guid, program: asset.program, cause: \"unsupported plugin export\" }\n });\n const origin = Object.freeze({\n guid,\n program: asset.program,\n evidence: structuredClone(evidence),\n sessionId: programs.sessionId,\n contextId: programs.contextId,\n sessionGeneration: programs.sessionGeneration,\n target: programs.target\n });\n const scope = ctx.extend({ [pluginAssetOrigin]: origin });\n const installed = scope.plugin(plugin, structuredClone(asset.config));\n return ok(installed.ctx.fiber);\n } catch (cause) {\n if (isCancelled()) return cancelledResult();\n return err({\n code: \"plugin-activation-failed\",\n expected: \"native plugin creation to succeed\",\n hint: \"repair the plugin configuration or native creation failure\",\n detail: { guid, cause }\n });\n } finally {\n await release?.();\n }\n}\nfunction createContextCapabilityResolver(ctx) {\n return createCapabilityResolver((capability) => Reflect.get(ctx, capability.id));\n}\n\n// src/register-tools.ts\nfunction registerTools(ctx, tools, options = {}) {\n const api = ctx.get(\"toolApi\", false);\n if (!api) throw new TypeError(\"registerTools requires the toolApi service; declare it in inject\");\n const origin = ctx[pluginAssetOrigin];\n const providerId = options.providerId ?? (origin ? `${origin.contextId}:${origin.target}:${origin.guid}:${ctx.fiber.uid}` : `${crypto.randomUUID()}:${ctx.fiber.uid}`);\n const module = options.module ?? origin?.program;\n const handle = api.registerProvider({\n providerId,\n sourceId: options.sourceId ?? origin?.sessionId ?? \"native\",\n realm: options.realm ?? origin?.target ?? \"engine\",\n ...ctx.fiber.uid === null ? {} : { fiberId: ctx.fiber.uid },\n ...origin ? { generation: origin.sessionGeneration } : {},\n ...module === void 0 ? {} : { module },\n initialState: ctx.fiber.state === 2 ? \"active\" : \"pending\",\n fiberState: ctx.fiber.state === 2 ? \"active\" : \"loading\",\n tools\n });\n const stop = ctx.on(\"internal/status\", (fiber) => {\n if (fiber !== ctx.fiber) return;\n if (fiber.state === 2) handle.activate(\"active\");\n else if (fiber.state === 3) handle.fail(\"native plugin failed\", \"failed\");\n else if (fiber.state === 4 || fiber.state === 5 || fiber.state === 0) {\n void handle.revoke(\"native plugin no longer active\");\n }\n });\n return async () => {\n try {\n await handle.revoke(\"native plugin disposed\");\n } finally {\n stop();\n }\n };\n}\nfunction registerAssetTools(ctx) {\n const origin = ctx[pluginAssetOrigin];\n const tools = origin && ctx.pluginPrograms?.tools?.get(origin.guid);\n if (!tools) throw new TypeError(\"asset tools are not delivered for this plugin and target\");\n return registerTools(ctx, tools);\n}\nvar states = [\"pending\", \"loading\", \"active\", \"failed\", \"disposed\", \"unloading\"];\nfunction inspectPluginFiber(fiber) {\n const origin = fiber.ctx[pluginAssetOrigin];\n return {\n uid: fiber.uid,\n name: fiber.runtime?.name ?? \"<root>\",\n state: states[fiber.state] ?? \"failed\",\n ...origin ? { origin } : {},\n missingServices: Object.keys(fiber.inject).filter((name) => fiber.ctx.get(name) === void 0)\n };\n}\nfunction descendant(fiber, root) {\n for (let current = fiber; ; current = current.parent.fiber) {\n if (current === root) return true;\n if (current === current.parent.fiber) return false;\n }\n}\nasync function startPluginAsset(ctx, guid, options = {}) {\n return startPluginTree(ctx, guid, (signal) => mountPluginAsset(ctx, guid, signal), options);\n}\nfunction startNativePlugin(ctx, plugin, config, options = {}) {\n const name = plugin.name ?? \"<native>\";\n return startPluginTree(\n ctx,\n name,\n async (signal) => {\n if (signal.aborted)\n return err({\n code: \"plugin-activation-failed\",\n expected: \"a live startup request\",\n hint: \"start a new uncancelled session\",\n detail: { guid: name, cause: signal.reason }\n });\n try {\n return ok(ctx.plugin(plugin, config).ctx.fiber);\n } catch (cause) {\n return err({\n code: \"plugin-activation-failed\",\n expected: \"native plugin creation to succeed\",\n hint: \"repair native plugin configuration\",\n detail: { guid: name, cause }\n });\n }\n },\n options\n );\n}\nasync function startPluginTree(ctx, guid, mount, options) {\n const timeoutMs = options.timeoutMs ?? 3e4;\n const cleanupTimeoutMs = options.cleanupTimeoutMs ?? 5e3;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0 || !Number.isFinite(cleanupTimeoutMs) || cleanupTimeoutMs <= 0) {\n throw new RangeError(\n \"plugin startup and cleanup deadlines must be positive finite milliseconds\"\n );\n }\n const observed = /* @__PURE__ */ new Set();\n let revision = 0;\n let wake;\n let expired = false;\n const controller = new AbortController();\n const changed = (fiber) => {\n observed.add(fiber);\n revision++;\n wake?.();\n };\n const stopCreation = ctx.on(\"internal/plugin\", changed);\n const stopStatus = ctx.on(\"internal/status\", changed);\n const abort = () => {\n controller.abort();\n wake?.();\n };\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n const timer = setTimeout(() => {\n expired = true;\n abort();\n }, timeoutMs);\n let root;\n try {\n const mounting = mount(controller.signal);\n const mounted = await Promise.race([\n mounting,\n new Promise((resolve) => {\n controller.signal.addEventListener(\"abort\", () => resolve(void 0), { once: true });\n if (controller.signal.aborted) resolve(void 0);\n })\n ]);\n if (mounted && !mounted.ok) return mounted;\n root = mounted?.value;\n const mountedRoot = root;\n while (root && !controller.signal.aborted) {\n const tree2 = [...observed].filter((fiber) => descendant(fiber, mountedRoot ?? fiber));\n if (!tree2.includes(root)) tree2.push(root);\n const live = tree2.filter((fiber) => fiber.uid !== null);\n if (root.uid === null || live.some((fiber) => fiber.state === 3)) break;\n if (live.every((fiber) => fiber.state === 2 && !fiber.inertia)) {\n const before = revision;\n await new Promise((resolve) => setTimeout(resolve, 0));\n if (!controller.signal.aborted && before === revision) return ok(root);\n continue;\n }\n await new Promise((resolve) => {\n wake = resolve;\n for (const fiber of live) void fiber.inertia?.then(resolve, resolve);\n });\n wake = void 0;\n }\n const tree = root ? [...observed].filter((fiber) => descendant(fiber, mountedRoot ?? fiber)) : [];\n const snapshots = tree.map(inspectPluginFiber);\n const reason = expired ? \"timeout\" : controller.signal.aborted ? \"cancelled\" : root?.uid === null ? \"disposed\" : \"failed\";\n controller.abort();\n let cleanup = \"completed\";\n let cause;\n for (const fiber of tree) {\n if (fiber.state === 3) {\n try {\n await fiber.await();\n } catch (error) {\n cause = error;\n break;\n }\n }\n }\n if (root) {\n let cleanupTimer;\n try {\n cleanup = await Promise.race([\n root.dispose().then(() => \"completed\"),\n new Promise((resolve) => {\n cleanupTimer = setTimeout(() => resolve(\"timeout\"), cleanupTimeoutMs);\n })\n ]);\n } catch (error) {\n cleanup = \"failed\";\n cause = error;\n } finally {\n clearTimeout(cleanupTimer);\n }\n }\n return err({\n code: \"plugin-startup-failed\",\n expected: \"the root and all required startup descendants to become ACTIVE before the deadline\",\n hint: cleanup === \"completed\" ? \"inspect native dependencies and domain residuals, repair the owner, then start a new session\" : \"terminate this execution environment and inspect the owning cleanup before retrying\",\n detail: {\n guid,\n reason,\n fibers: snapshots,\n cleanup,\n ...cause === void 0 ? {} : { cause }\n }\n });\n } finally {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", abort);\n stopCreation();\n stopStatus();\n }\n}\nvar TOOL_API_SERVICE = \"toolApi\";\nfunction createToolApiPlugin() {\n return {\n name: \"forgeax:tool-api\",\n provide: TOOL_API_SERVICE,\n apply(ctx) {\n const api = createToolApi();\n ctx.provide(TOOL_API_SERVICE, api);\n ctx.effect(() => async () => {\n await api.dispose();\n });\n }\n };\n}\n\nexport { TOOL_API_SERVICE, createContextCapabilityResolver, createToolApiPlugin, inspectPluginFiber, mountPluginAsset, pluginAssetOrigin, registerAssetTools, registerTools, samePluginEvidence, startNativePlugin, startPluginAsset };\n//# sourceMappingURL=index.mjs.map\n//# sourceMappingURL=index.mjs.map","import { Context, createToolApiPlugin, startNativePlugin, inspectPluginFiber } from '@forgeax/engine-plugin';\n\n// src/frontend.ts\n\n// src/deadline.ts\nasync function beforeDeadline(work, milliseconds, timeout) {\n if (!Number.isFinite(milliseconds) || milliseconds <= 0)\n throw new RangeError(\"Host deadline must be positive finite milliseconds\");\n let timer;\n try {\n return await Promise.race([\n work,\n new Promise((_resolve, reject) => {\n timer = setTimeout(() => reject(timeout()), milliseconds);\n })\n ]);\n } finally {\n clearTimeout(timer);\n }\n}\n\n// src/protocol.ts\nvar HOST_ASSEMBLY_SCHEMA_VERSION = 2;\nvar HostAssemblyError = class extends Error {\n code;\n expected;\n hint;\n detail;\n constructor(code, expected, hint, detail) {\n super(`${code}: ${expected}`);\n this.name = \"HostAssemblyError\";\n this.code = code;\n this.expected = expected;\n this.hint = hint;\n this.detail = detail;\n }\n};\nfunction canonicalHostJson(value) {\n if (value === void 0) return \"undefined\";\n if (value === null || typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonicalHostJson).join(\",\")}]`;\n return `{${Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, item]) => `${JSON.stringify(key)}:${canonicalHostJson(item)}`).join(\",\")}}`;\n}\nfunction hostRevision(value) {\n let hash = 2166136261;\n for (const char of canonicalHostJson(value)) {\n hash ^= char.codePointAt(0) ?? 0;\n hash = Math.imul(hash, 16777619);\n }\n return `fnv1a:${(hash >>> 0).toString(16).padStart(8, \"0\")}`;\n}\nfunction invalid(reason) {\n return new HostAssemblyError(\n \"host-assembly-invalid\",\n \"a version 2 root program/config projection\",\n \"rebuild both hosts with the same assembly schema\",\n { reason }\n );\n}\nfunction json(value, seen = /* @__PURE__ */ new Set()) {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\" || typeof value === \"number\" && Number.isFinite(value))\n return;\n if (typeof value !== \"object\" || seen.has(value))\n throw invalid(\"configuration must be a finite JSON tree\");\n if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) {\n throw invalid(\"configuration must contain plain objects\");\n }\n if (Array.isArray(value) && (Object.keys(value).length !== value.length || Object.keys(value).some((key, index) => key !== String(index)))) {\n throw invalid(\"configuration arrays must be dense and have no extra properties\");\n }\n seen.add(value);\n for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(value))) {\n if (Array.isArray(value) && key === \"length\") continue;\n if (!descriptor.enumerable || !(\"value\" in descriptor))\n throw invalid(\"configuration contains hidden fields or accessors\");\n json(descriptor.value, seen);\n }\n if (Object.getOwnPropertySymbols(value).length) throw invalid(\"configuration contains symbols\");\n seen.delete(value);\n}\nfunction createHostAssembly(input = {}) {\n const payload = {\n schemaVersion: HOST_ASSEMBLY_SCHEMA_VERSION,\n sessionGeneration: input.sessionGeneration ?? 1,\n ...input.root === void 0 ? {} : { root: input.root },\n ...input.config === void 0 ? {} : { config: input.config }\n };\n json(payload);\n const assembly = { ...structuredClone(payload), revision: hostRevision(payload) };\n const checked = validateHostAssembly(assembly);\n if (!checked.ok) throw checked.error;\n return checked.value;\n}\nfunction validateHostAssembly(value) {\n try {\n let freeze2 = function(value2) {\n if (value2 === null || typeof value2 !== \"object\") return;\n for (const child of Object.values(value2)) freeze2(child);\n Object.freeze(value2);\n };\n var freeze = freeze2;\n json(value);\n if (typeof value !== \"object\" || value === null) throw invalid(\"assembly must be an object\");\n const assembly = value;\n if (Object.keys(assembly).some(\n (key) => ![\"schemaVersion\", \"revision\", \"sessionGeneration\", \"root\", \"config\"].includes(key)\n )) {\n throw invalid(\"unknown assembly fields\");\n }\n if (assembly.schemaVersion !== 2 || !Number.isSafeInteger(assembly.sessionGeneration) || assembly.sessionGeneration < 1) {\n throw invalid(\"invalid schema or session generation\");\n }\n const root = assembly.root;\n if (root !== void 0 && (root === null || typeof root !== \"object\" || typeof root.program !== \"string\" || !root.program || typeof root.codeRevision !== \"string\" || !root.codeRevision || root.source !== void 0 && typeof root.source !== \"string\" || Object.keys(root).some(\n (key) => ![\"program\", \"codeRevision\", \"config\", \"source\"].includes(key)\n ))) {\n throw invalid(\"invalid root descriptor\");\n }\n const { revision, ...payload } = assembly;\n const expected = hostRevision(payload);\n if (revision !== expected)\n throw new HostAssemblyError(\n \"host-assembly-revision-mismatch\",\n \"assembly revision to match its root projection\",\n \"discard the stale assembly\",\n { actual: revision, expected }\n );\n const snapshot = structuredClone(assembly);\n freeze2(snapshot);\n return { ok: true, value: snapshot };\n } catch (cause) {\n return {\n ok: false,\n error: cause instanceof HostAssemblyError ? cause : invalid(String(cause))\n };\n }\n}\nasync function createHostStartup(options = {}) {\n const context = options.context ?? new Context();\n const ownedContext = options.context === void 0;\n const fibers = [];\n let disposal;\n try {\n const startupRoot = {\n name: \"forgeax:host-startup\",\n apply(ctx) {\n for (const plugin of options.startupPlugins ?? []) ctx.plugin(plugin);\n }\n };\n const result = await startNativePlugin(\n context,\n startupRoot,\n void 0,\n options.startupTimeoutMs === void 0 ? {} : { timeoutMs: options.startupTimeoutMs }\n );\n if (!result.ok) throw result.error;\n fibers.push(result.value);\n } catch (error) {\n const failures = [error];\n if (ownedContext) {\n try {\n await beforeDeadline(\n context.fiber.dispose(),\n 5e3,\n () => new HostAssemblyError(\n \"host-assembly-cleanup-timeout\",\n \"Host cleanup to settle\",\n \"terminate the owning environment\",\n { milliseconds: 5e3 }\n )\n );\n } catch (cause) {\n failures.push(cause);\n }\n }\n throw failures.length === 1 ? error : new AggregateError(failures, \"Host startup and cleanup failed\");\n }\n return {\n context,\n ownedContext,\n fibers,\n dispose() {\n if (disposal) return disposal;\n disposal = (async () => {\n const failures = [];\n for (const fiber of [...fibers].reverse()) {\n try {\n await fiber.dispose();\n } catch (cause) {\n failures.push(cause);\n }\n }\n if (ownedContext) {\n try {\n await context.fiber.dispose();\n } catch (cause) {\n failures.push(cause);\n }\n }\n if (failures.length) throw new AggregateError(failures, \"Host startup cleanup failed\");\n })();\n return disposal;\n }\n };\n}\n\n// src/transport.ts\nvar HOST_ASSEMBLY_SERVICE = \"host/assembly.get\";\nvar HOST_ACTIVATION_REPORT_SERVICE = \"host/assembly.report\";\n\n// src/frontend.ts\nfunction summary(cause) {\n const value = cause;\n return {\n code: value?.code ?? \"host-root-failed\",\n expected: value?.expected ?? \"a native root to become active\",\n hint: value?.hint ?? String(cause),\n detail: value?.detail ?? {}\n };\n}\nasync function createFrontendHost(options = {}) {\n const received = options.assembly ?? (options.transport ? await options.transport.request(HOST_ASSEMBLY_SERVICE, void 0) : createHostAssembly());\n const checked = validateHostAssembly(received);\n if (!checked.ok) throw checked.error;\n const initial = checked.value;\n const context = options.context ?? new Context();\n const controller = new AbortController();\n let fiber;\n let activationOwner;\n let current = checked.value;\n let status = { state: \"created\", revision: current.revision };\n let activated = false;\n let disposed = false;\n let disposal;\n let activating;\n const listeners = /* @__PURE__ */ new Set();\n const inspection = () => {\n if (!fiber) return [];\n const result = [];\n for (const runtime of context.registry.values())\n for (const child of runtime.fibers) {\n for (let cursor = child; ; cursor = cursor.parent.fiber) {\n if (cursor === fiber) {\n result.push(inspectPluginFiber(child));\n break;\n }\n if (cursor === cursor.parent.fiber) break;\n }\n }\n return result;\n };\n const state = {\n get current() {\n return current;\n },\n get status() {\n return status;\n },\n get inspection() {\n return inspection();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n }\n };\n const notify = () => {\n for (const listener of listeners) {\n try {\n listener(state);\n } catch {\n }\n }\n };\n const cleanup = (work) => beforeDeadline(\n work,\n options.cleanupTimeoutMs ?? 5e3,\n () => new HostAssemblyError(\n \"host-assembly-cleanup-timeout\",\n \"native Host contributions to drain\",\n \"terminate the page or Worker before retrying\",\n { milliseconds: options.cleanupTimeoutMs ?? 5e3 }\n )\n );\n const report = async (next) => {\n status = next;\n notify();\n await options.reportStatus?.(next);\n if ((disposed || controller.signal.aborted) && (next.state === \"loading\" || next.state === \"active\"))\n throw controller.signal.reason ?? new Error(\"frontend report cancelled\");\n if (options.transport)\n await options.transport.request(HOST_ACTIVATION_REPORT_SERVICE, {\n state: next.state,\n revision: next.revision,\n sessionGeneration: current.sessionGeneration,\n ...next.entries ? { entries: next.entries } : {},\n ...next.error ? { error: summary(next.error) } : {}\n });\n if ((disposed || controller.signal.aborted) && (next.state === \"loading\" || next.state === \"active\"))\n throw controller.signal.reason ?? new Error(\"frontend report cancelled\");\n };\n const startup = await createHostStartup({\n context,\n ...options.startupTimeoutMs === void 0 ? {} : { startupTimeoutMs: options.startupTimeoutMs },\n startupPlugins: [\n {\n name: \"forgeax:frontend-foundation\",\n apply(ctx) {\n ctx.provide(\"hostAssembly\", state);\n if (options.transport) ctx.provide(\"hostTransport\", options.transport);\n }\n },\n ...context.get(\"toolApi\", false) === void 0 ? [createToolApiPlugin()] : [],\n ...options.startupPlugins ?? []\n ]\n });\n const disconnect = options.transport?.onDisconnect((cause) => {\n controller.abort(cause);\n if (!disposed) {\n status = { state: \"failed\", revision: current.revision, error: cause };\n notify();\n void host.dispose().catch((error) => {\n status = { state: \"failed\", revision: current.revision, error };\n notify();\n });\n }\n });\n const host = {\n context,\n assembly: state,\n ownedContext: options.context === void 0,\n ...options.transport ? { transport: options.transport } : {},\n get status() {\n return status;\n },\n get fiber() {\n return fiber;\n },\n activate(next = current) {\n if (disposed) return Promise.reject(new Error(\"frontend host disposed\"));\n const valid = validateHostAssembly(next);\n if (!valid.ok) return Promise.reject(valid.error);\n if (next.revision !== initial.revision)\n return Promise.reject(\n new HostAssemblyError(\n \"host-assembly-reload-required\",\n \"a fresh JavaScript environment for a new root session\",\n \"reload the page or replace the Worker\",\n {\n module: next.root?.program ?? \"<empty>\",\n actual: initial.revision,\n expected: next.revision\n }\n )\n );\n if (activating) return activating;\n if (activated) return Promise.resolve();\n next = valid.value;\n current = next;\n activating = beforeDeadline(\n (async () => {\n await report({ state: \"loading\", revision: next.revision });\n if (controller.signal.aborted || disposed)\n throw controller.signal.reason ?? new Error(\"frontend activation cancelled\");\n if (next.root) {\n activationOwner = context.plugin({ name: \"forgeax:frontend-root\", apply() {\n } }).ctx.fiber;\n const scope = activationOwner.ctx;\n if (options.activateRoot) {\n const mounted = await options.activateRoot(scope, next.root, controller.signal);\n fiber = mounted.fiber;\n } else {\n if (!options.resolveRoot)\n throw new Error(`no compiled resolver for ${next.root.program}`);\n const plugin = await options.resolveRoot(next.root);\n if (controller.signal.aborted) throw controller.signal.reason;\n const result = await startNativePlugin(\n scope,\n plugin,\n structuredClone(next.root.config),\n { signal: controller.signal }\n );\n if (!result.ok) throw result.error;\n fiber = result.value;\n }\n }\n if (controller.signal.aborted || disposed) {\n await cleanup(Promise.resolve(activationOwner?.dispose()));\n throw new Error(\"frontend activation cancelled\");\n }\n activated = true;\n await report({\n state: \"active\",\n revision: next.revision,\n entries: inspection().map((item) => ({\n entryId: `${current.sessionGeneration}:${item.uid}`,\n fiberState: item.state\n }))\n });\n })(),\n options.startupTimeoutMs ?? 3e4,\n () => {\n const error = new HostAssemblyError(\n \"host-assembly-activation-timeout\",\n \"root resolution and startup before the deadline\",\n \"repair the plugin or resolver, then start a fresh environment\",\n { milliseconds: options.startupTimeoutMs ?? 3e4 }\n );\n controller.abort(error);\n return error;\n }\n ).catch(async (cause) => {\n const failures = [cause];\n try {\n await cleanup(Promise.resolve(activationOwner?.dispose()));\n } catch (error) {\n failures.push(error);\n }\n if (!disposed) {\n status = { state: \"failed\", revision: next.revision, error: cause };\n notify();\n void report(status).catch(() => {\n });\n }\n throw failures.length === 1 ? cause : new AggregateError(failures, \"Host activation and cleanup failed\");\n });\n return activating;\n },\n update(next) {\n return host.activate(next);\n },\n dispose() {\n if (disposal) return disposal;\n disposed = true;\n controller.abort();\n disconnect?.();\n disposal = (async () => {\n const failures = [];\n for (const dispose of [\n () => activationOwner?.dispose(),\n () => startup.dispose(),\n () => options.context === void 0 ? context.fiber.dispose() : void 0\n ]) {\n try {\n await cleanup(Promise.resolve(dispose()));\n } catch (cause) {\n failures.push(cause);\n }\n }\n status = failures.length ? {\n state: \"failed\",\n revision: current.revision,\n error: new AggregateError(failures, \"Host cleanup failed\")\n } : { state: \"disposed\", revision: current.revision };\n notify();\n listeners.clear();\n if (failures.length) throw status.error;\n })();\n return disposal;\n }\n };\n if (options.autoActivate !== false) {\n try {\n await host.activate();\n } catch (cause) {\n try {\n await host.dispose();\n } catch (cleanup2) {\n throw new AggregateError([cause, cleanup2], \"Host activation and cleanup failed\");\n }\n throw cause;\n }\n }\n return host;\n}\n\nexport { HostAssemblyError, createFrontendHost };\n//# sourceMappingURL=frontend.mjs.map\n//# sourceMappingURL=frontend.mjs.map","// src/protocol.ts\nvar HostAssemblyError = class extends Error {\n code;\n expected;\n hint;\n detail;\n constructor(code, expected, hint, detail) {\n super(`${code}: ${expected}`);\n this.name = \"HostAssemblyError\";\n this.code = code;\n this.expected = expected;\n this.hint = hint;\n this.detail = detail;\n }\n};\n\n// src/transport.ts\nvar HOST_ASSEMBLY_SERVICE = \"host/assembly.get\";\nvar HOST_ACTIVATION_REPORT_SERVICE = \"host/assembly.report\";\nvar HOST_ASSEMBLY_CHANGED_TOPIC = \"host/assembly.changed\";\nfunction createHostTransport() {\n const services = /* @__PURE__ */ new Map();\n const generations = /* @__PURE__ */ new Map();\n const clients = /* @__PURE__ */ new Set();\n const connectListeners = /* @__PURE__ */ new Set();\n const disconnectListeners = /* @__PURE__ */ new Set();\n let closed = false;\n const newCaller = (options = {}) => Object.freeze({\n connectionId: `host-connection-${crypto.randomUUID()}`,\n capability: `host-capability-${crypto.randomUUID()}`,\n kind: options.kind ?? \"in-process\",\n ...options.sourceId === void 0 ? {} : { sourceId: options.sourceId },\n ...options.sourceGeneration === void 0 ? {} : { sourceGeneration: options.sourceGeneration }\n });\n const closeClient = (state, reason) => {\n if (!state.connected) return;\n state.connected = false;\n for (const controller of state.pending) controller.abort();\n state.pending.clear();\n for (const callbacks of state.subscriptions.values()) callbacks.clear();\n state.subscriptions.clear();\n clients.delete(state);\n const authoritativeCaller = Object.freeze({ ...state.caller });\n for (const listener of disconnectListeners) listener(authoritativeCaller);\n const error = new HostAssemblyError(\n \"host-transport-failure\",\n \"the host connection to remain available\",\n \"Reconnect the frontend host before issuing another request.\",\n { service: \"host/socket\", reason: String(reason ?? \"host connection closed\") }\n );\n for (const listener of state.disconnectListeners) listener(error);\n state.disconnectListeners.clear();\n };\n const server = {\n isConnected(caller) {\n return [...clients].some(\n (client) => client.connected && client.caller.connectionId === caller.connectionId && client.caller.capability === caller.capability\n );\n },\n get connectedClients() {\n return clients.size;\n },\n register(service, handler) {\n if (closed) throw new Error(\"host transport is closed\");\n const previous = services.get(service);\n const generation = (generations.get(service) ?? 0) + 1;\n generations.set(service, generation);\n for (const controller of previous?.pending ?? []) controller.abort();\n const identity = Symbol(service);\n services.set(service, {\n identity,\n generation,\n handler,\n pending: /* @__PURE__ */ new Set()\n });\n return () => {\n const current = services.get(service);\n if (current?.identity !== identity) return;\n for (const controller of current.pending) controller.abort();\n generations.set(service, current.generation + 1);\n services.delete(service);\n };\n },\n invalidate(service) {\n const current = services.get(service);\n if (current === void 0) return;\n for (const controller of current.pending) controller.abort();\n generations.set(service, current.generation + 1);\n services.delete(service);\n },\n snapshot(service) {\n const current = services.get(service);\n return current === void 0 ? void 0 : { service, generation: current.generation };\n },\n publish(topic, payload, options = {}) {\n for (const state of clients) {\n if (options.excludeConnectionIds?.includes(state.caller.connectionId)) continue;\n if (options.connectionId !== void 0 && state.caller.connectionId !== options.connectionId)\n continue;\n for (const listener of state.subscriptions.get(topic) ?? []) listener(payload);\n }\n },\n connect(options = {}) {\n if (closed) throw new Error(\"host transport is closed\");\n const state = {\n connected: true,\n caller: newCaller(options),\n subscriptions: /* @__PURE__ */ new Map(),\n pending: /* @__PURE__ */ new Set(),\n disconnectListeners: /* @__PURE__ */ new Set()\n };\n clients.add(state);\n for (const listener of connectListeners) listener(state.caller);\n const client = {\n get connected() {\n return state.connected;\n },\n get generation() {\n let current = 0;\n for (const service of services.values()) current = Math.max(current, service.generation);\n return current;\n },\n get caller() {\n return state.caller;\n },\n async request(service, payload, options2 = {}) {\n if (!state.connected) {\n throw new HostAssemblyError(\n \"host-assembly-service-unavailable\",\n `service ${service} to be available on the current connection`,\n \"Reconnect the frontend host before issuing another request.\",\n { service }\n );\n }\n if (options2.signal?.aborted) {\n throw new HostAssemblyError(\n \"host-assembly-request-aborted\",\n `request ${service} to start with a live AbortSignal`,\n \"Start a fresh request with a live AbortSignal.\",\n { service }\n );\n }\n const record = services.get(service);\n if (record === void 0) {\n const invalidatedGeneration = generations.get(service);\n if (options2.generation !== void 0 && invalidatedGeneration !== void 0 && options2.generation < invalidatedGeneration) {\n throw new HostAssemblyError(\n \"host-assembly-stale-request\",\n `request generation ${options2.generation} to match the invalidated service ${service}`,\n \"Refresh the client capability after the backend service is enabled again.\",\n { service, generation: options2.generation }\n );\n }\n throw new HostAssemblyError(\n \"host-assembly-service-unavailable\",\n `service ${service} to be registered`,\n \"Wait for the backend plugin to activate before using this capability.\",\n { service }\n );\n }\n const generation = options2.generation ?? record.generation;\n if (generation !== record.generation) {\n throw new HostAssemblyError(\n \"host-assembly-stale-request\",\n `request generation ${generation} to match service ${service}`,\n \"Refresh the client capability and retry only when the owning business contract permits it.\",\n { service, generation }\n );\n }\n const controller = new AbortController();\n const abortFromCaller = () => controller.abort();\n options2.signal?.addEventListener(\"abort\", abortFromCaller, { once: true });\n record.pending.add(controller);\n state.pending.add(controller);\n let removeAbortRequest;\n try {\n if (controller.signal.aborted) {\n throw new HostAssemblyError(\n \"host-assembly-request-aborted\",\n `request ${service} not to be aborted before execution`,\n \"Start a fresh request with a live AbortSignal.\",\n { service }\n );\n }\n let abortReject;\n const aborted = new Promise((_, reject) => {\n abortReject = reject;\n });\n const abortRequest = () => {\n abortReject?.(\n new HostAssemblyError(\n \"host-assembly-request-aborted\",\n `request ${service} to finish before its service is closed or invalidated`,\n \"Treat the capability as withdrawn and refresh the service before retrying.\",\n { service }\n )\n );\n };\n controller.signal.addEventListener(\"abort\", abortRequest, { once: true });\n removeAbortRequest = () => controller.signal.removeEventListener(\"abort\", abortRequest);\n const result = await Promise.race([\n Promise.resolve(\n record.handler({\n service,\n payload,\n generation,\n signal: controller.signal,\n caller: Object.freeze({ ...state.caller })\n })\n ),\n aborted\n ]);\n if (controller.signal.aborted) {\n throw new HostAssemblyError(\n \"host-assembly-request-aborted\",\n `request ${service} to finish before its service is invalidated`,\n \"Treat the capability as withdrawn and refresh the service before retrying.\",\n { service }\n );\n }\n return result;\n } finally {\n removeAbortRequest?.();\n record.pending.delete(controller);\n state.pending.delete(controller);\n options2.signal?.removeEventListener(\"abort\", abortFromCaller);\n }\n },\n subscribe(topic, listener) {\n if (!state.connected) return () => {\n };\n const callbacks = state.subscriptions.get(topic) ?? /* @__PURE__ */ new Set();\n callbacks.add(listener);\n state.subscriptions.set(topic, callbacks);\n return () => {\n callbacks.delete(listener);\n if (callbacks.size === 0) state.subscriptions.delete(topic);\n };\n },\n onDisconnect(listener) {\n if (!state.connected) {\n listener(\n new HostAssemblyError(\n \"host-transport-failure\",\n \"the host connection to remain available\",\n \"Reconnect the frontend host before issuing another request.\",\n { service: \"host/socket\", reason: \"host connection is already closed\" }\n )\n );\n return () => {\n };\n }\n state.disconnectListeners.add(listener);\n return () => state.disconnectListeners.delete(listener);\n },\n close(reason) {\n closeClient(state, reason);\n }\n };\n return client;\n },\n onClientDisconnect(listener) {\n disconnectListeners.add(listener);\n return () => disconnectListeners.delete(listener);\n },\n onClientConnect(listener) {\n connectListeners.add(listener);\n return () => connectListeners.delete(listener);\n },\n close(reason) {\n if (closed) return;\n closed = true;\n for (const service of services.values())\n for (const controller of service.pending) controller.abort();\n services.clear();\n for (const client of [...clients]) closeClient(client, reason);\n generations.clear();\n connectListeners.clear();\n disconnectListeners.clear();\n }\n };\n return server;\n}\nfunction addSocketListener(socket, type, listener) {\n if (socket.addEventListener !== void 0) {\n socket.addEventListener(type, listener);\n return () => socket.removeEventListener?.(type, listener);\n }\n socket.on?.(type, listener);\n return () => socket.off?.(type, listener);\n}\nfunction socketPayload(value) {\n const data = Array.isArray(value) ? value[0] : value;\n if (typeof data === \"string\") return data;\n if (data instanceof ArrayBuffer) return new TextDecoder().decode(data);\n if (data instanceof Uint8Array) return new TextDecoder().decode(data);\n if (data !== null && typeof data === \"object\" && \"data\" in data)\n return socketPayload(data.data);\n return void 0;\n}\nfunction parseWire(value) {\n const source = socketPayload(value);\n if (source === void 0) return void 0;\n try {\n const parsed = JSON.parse(source);\n return parsed !== null && typeof parsed === \"object\" && typeof parsed.kind === \"string\" ? parsed : void 0;\n } catch {\n return void 0;\n }\n}\nfunction serializeError(service, error) {\n if (error !== null && typeof error === \"object\" && typeof error.code === \"string\" && typeof error.expected === \"string\" && typeof error.hint === \"string\") {\n const detail = error.detail;\n return {\n code: error.code,\n expected: error.expected,\n hint: error.hint,\n detail: detail !== null && typeof detail === \"object\" ? detail : { reason: String(detail ?? \"unknown failure\") }\n };\n }\n return {\n code: \"host-transport-failure\",\n expected: `service ${service} to complete without an exception`,\n hint: \"Inspect the backend host process and reconnect before retrying.\",\n detail: { service, reason: error instanceof Error ? error.message : String(error) }\n };\n}\nfunction errorFromSummary(service, summary) {\n const detail = summary.detail;\n const supported = /* @__PURE__ */ new Set([\n \"host-assembly-invalid\",\n \"host-assembly-revision-mismatch\",\n \"host-assembly-module-missing\",\n \"host-assembly-module-version-mismatch\",\n \"host-assembly-reload-required\",\n \"host-assembly-service-unavailable\",\n \"host-assembly-stale-request\",\n \"host-assembly-request-aborted\",\n \"host-assembly-not-ready\",\n \"host-transport-failure\"\n ]);\n if (supported.has(summary.code)) {\n return new HostAssemblyError(\n summary.code,\n summary.expected,\n summary.hint,\n detail\n );\n }\n return new HostAssemblyError(\"host-transport-failure\", summary.expected, summary.hint, {\n ...detail,\n service,\n reason: summary.detail.reason ? String(summary.detail.reason) : summary.code,\n remoteCode: summary.code\n });\n}\nfunction transportFailure(service, reason) {\n return new HostAssemblyError(\n \"host-transport-failure\",\n `service ${service} to remain connected`,\n \"Reconnect the frontend host and inspect the backend transport diagnostics.\",\n { service, reason }\n );\n}\nfunction sendWire(socket, message) {\n socket.send(JSON.stringify(message));\n}\nasync function createHostWebSocketClient(socket) {\n if (socket.readyState !== void 0 && socket.readyState !== 1) {\n await new Promise((resolve, reject) => {\n const removeOpen = addSocketListener(socket, \"open\", () => {\n removeOpen();\n removeError2();\n resolve();\n });\n const removeError2 = addSocketListener(socket, \"error\", (cause) => {\n removeOpen();\n removeError2();\n reject(transportFailure(\"host/connect\", String(cause ?? \"socket error\")));\n });\n });\n }\n const pending = /* @__PURE__ */ new Map();\n const subscriptions = /* @__PURE__ */ new Map();\n const disconnectListeners = /* @__PURE__ */ new Set();\n let connected = true;\n let generation = 0;\n let sequence = 0;\n const caller = Object.freeze({\n connectionId: `host-client-${crypto.randomUUID()}`,\n capability: `host-client-capability-${crypto.randomUUID()}`,\n kind: \"websocket\"\n });\n const disconnectError = (reason) => transportFailure(\"host/socket\", reason instanceof Error ? reason.message : String(reason));\n const failPending = (reason) => {\n if (!connected) return;\n connected = false;\n for (const request of pending.values()) {\n request.cleanup();\n request.reject(reason);\n }\n pending.clear();\n subscriptions.clear();\n const error = disconnectError(reason);\n for (const listener of disconnectListeners) listener(error);\n disconnectListeners.clear();\n };\n const removeMessage = addSocketListener(socket, \"message\", (event) => {\n const message = parseWire(event);\n if (message === void 0) return;\n if (message.kind === \"event\") {\n for (const listener of subscriptions.get(message.topic) ?? []) listener(message.payload);\n return;\n }\n if (message.kind !== \"response\") return;\n if (message.generation !== void 0) generation = Math.max(generation, message.generation);\n const request = pending.get(message.id);\n if (request === void 0) return;\n pending.delete(message.id);\n request.cleanup();\n if (message.ok) request.resolve(message.value);\n else\n request.reject(\n errorFromSummary(\n \"host/socket\",\n message.error ?? serializeError(\"host/socket\", \"unknown response failure\")\n )\n );\n });\n const removeClose = addSocketListener(socket, \"close\", (reason) => {\n removeMessage();\n removeClose();\n removeError();\n failPending(disconnectError(reason));\n });\n const removeError = addSocketListener(socket, \"error\", (reason) => {\n failPending(disconnectError(reason));\n });\n const client = {\n get connected() {\n return connected;\n },\n get generation() {\n return generation;\n },\n caller,\n request(service, payload, options = {}) {\n if (!connected) return Promise.reject(disconnectError(\"socket is closed\"));\n if (options.signal?.aborted)\n return Promise.reject(\n new HostAssemblyError(\n \"host-assembly-request-aborted\",\n `request ${service} to start with a live AbortSignal`,\n \"Start a fresh request with a live AbortSignal.\",\n { service }\n )\n );\n sequence += 1;\n const id = `${Date.now().toString(36)}-${sequence.toString(36)}`;\n return new Promise((resolve, reject) => {\n const abort = () => {\n const request = pending.get(id);\n if (request === void 0) return;\n pending.delete(id);\n request.cleanup();\n try {\n sendWire(socket, { kind: \"cancel\", id });\n } catch {\n }\n reject(\n new HostAssemblyError(\n \"host-assembly-request-aborted\",\n `request ${service} to finish before cancellation`,\n \"Start a fresh request with a live AbortSignal.\",\n { service }\n )\n );\n };\n const cleanup = () => options.signal?.removeEventListener(\"abort\", abort);\n pending.set(id, {\n resolve,\n reject,\n cleanup\n });\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) {\n abort();\n return;\n }\n try {\n sendWire(socket, {\n kind: \"request\",\n id,\n service,\n payload,\n ...options.generation === void 0 ? {} : { generation: options.generation }\n });\n } catch (cause) {\n const request = pending.get(id);\n request?.cleanup();\n pending.delete(id);\n reject(disconnectError(cause));\n }\n });\n },\n subscribe(topic, listener) {\n if (!connected) return () => {\n };\n const listeners = subscriptions.get(topic) ?? /* @__PURE__ */ new Set();\n listeners.add(listener);\n subscriptions.set(topic, listeners);\n sendWire(socket, { kind: \"subscribe\", topic });\n return () => {\n if (!listeners.delete(listener)) return;\n if (listeners.size !== 0) return;\n subscriptions.delete(topic);\n if (connected && (socket.readyState === void 0 || socket.readyState === 1))\n sendWire(socket, { kind: \"unsubscribe\", topic });\n };\n },\n onDisconnect(listener) {\n if (!connected) {\n listener(disconnectError(\"socket is already closed\"));\n return () => {\n };\n }\n disconnectListeners.add(listener);\n return () => disconnectListeners.delete(listener);\n },\n close(reason) {\n if (!connected) return;\n failPending(disconnectError(reason ?? \"client closed the host connection\"));\n removeMessage();\n removeClose();\n removeError();\n socket.close();\n }\n };\n return client;\n}\nasync function connectHostWebSocket(url) {\n const Constructor = globalThis.WebSocket;\n if (typeof Constructor !== \"function\")\n throw transportFailure(\"host/connect\", \"the current runtime does not provide WebSocket\");\n return createHostWebSocketClient(new Constructor(url));\n}\nfunction attachHostWebSocketServer(socket, server, options = {}) {\n const client = server.connect({ kind: \"websocket\", ...options });\n const pending = /* @__PURE__ */ new Map();\n const subscriptions = /* @__PURE__ */ new Map();\n let disposed = false;\n const removeMessage = addSocketListener(socket, \"message\", (event) => {\n const message = parseWire(event);\n if (message === void 0 || disposed) return;\n if (message.kind === \"cancel\") {\n pending.get(message.id)?.abort();\n return;\n }\n if (message.kind === \"subscribe\") {\n subscriptions.get(message.topic)?.();\n subscriptions.set(\n message.topic,\n client.subscribe(message.topic, (payload) => {\n if (!disposed) sendWire(socket, { kind: \"event\", topic: message.topic, payload });\n })\n );\n return;\n }\n if (message.kind === \"unsubscribe\") {\n subscriptions.get(message.topic)?.();\n subscriptions.delete(message.topic);\n return;\n }\n if (message.kind !== \"request\") return;\n const controller = new AbortController();\n pending.set(message.id, controller);\n void client.request(message.service, message.payload, {\n signal: controller.signal,\n ...message.generation === void 0 ? {} : { generation: message.generation }\n }).then((value) => {\n if (!disposed)\n sendWire(socket, {\n kind: \"response\",\n id: message.id,\n ok: true,\n value,\n generation: client.generation\n });\n }).catch((error) => {\n if (!disposed)\n sendWire(socket, {\n kind: \"response\",\n id: message.id,\n ok: false,\n error: serializeError(message.service, error),\n generation: client.generation\n });\n }).finally(() => pending.delete(message.id));\n });\n const removeClose = addSocketListener(socket, \"close\", () => dispose());\n const removeError = addSocketListener(socket, \"error\", () => dispose());\n function dispose() {\n if (disposed) return;\n disposed = true;\n removeMessage();\n removeClose();\n removeError();\n for (const controller of pending.values()) controller.abort();\n pending.clear();\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n client.close(\"host socket disconnected\");\n }\n return dispose;\n}\n\nexport { HOST_ACTIVATION_REPORT_SERVICE, HOST_ASSEMBLY_CHANGED_TOPIC, HOST_ASSEMBLY_SERVICE, attachHostWebSocketServer, connectHostWebSocket, createHostTransport, createHostWebSocketClient };\n//# sourceMappingURL=transport.mjs.map\n//# sourceMappingURL=transport.mjs.map","import { isOpaqueWorkspaceDiagnostic } from './contract.mjs';\n\nfunction errorText(value) {\n return typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;\n}\n\nfunction pickDiagnostic(candidates) {\n const texts = candidates.map(errorText).filter((value) => value !== undefined);\n const real = texts.filter((value) => !isOpaqueWorkspaceDiagnostic(value));\n return real[0] ?? texts[0];\n}\n\nfunction collectDiagnosticSources(value, sources = [], depth = 0) {\n if (depth > 6 || value === undefined || value === null) return sources;\n if (typeof value !== 'object') return sources;\n sources.push(value);\n if (Array.isArray(value)) {\n for (const entry of value) collectDiagnosticSources(entry, sources, depth + 1);\n return sources;\n }\n collectDiagnosticSources(value.detail, sources, depth + 1);\n collectDiagnosticSources(value.payload, sources, depth + 1);\n collectDiagnosticSources(value.failure, sources, depth + 1);\n collectDiagnosticSources(value.cause, sources, depth + 1);\n collectDiagnosticSources(value.error, sources, depth + 1);\n return sources;\n}\n\nfunction serializeErrorValue(value, seen = new Set(), depth = 0) {\n if (value === undefined) return undefined;\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return value;\n if (typeof value === 'number') return Number.isFinite(value) ? value : String(value);\n if (typeof value !== 'object') return String(value);\n if (seen.has(value) || depth > 8) return '[Circular]';\n seen.add(value);\n if (typeof value.message === 'string' && (value instanceof Error || typeof value.name === 'string')) {\n const serialized = {\n ...(typeof value.name === 'string' ? { name: value.name } : {}),\n message: value.message,\n ...(typeof value.code === 'string' ? { code: value.code } : {}),\n ...(typeof value.expected === 'string' ? { expected: value.expected } : {}),\n ...(typeof value.hint === 'string' ? { hint: value.hint } : {}),\n ...(value.detail === undefined\n ? {}\n : { detail: serializeErrorValue(value.detail, seen, depth + 1) }),\n ...(typeof value.stack === 'string' ? { stack: value.stack } : {}),\n };\n return serialized;\n }\n if (Array.isArray(value)) {\n return value.map((entry) => serializeErrorValue(entry, seen, depth + 1));\n }\n const result = {};\n for (const [key, entry] of Object.entries(value)) {\n result[key] = serializeErrorValue(entry, seen, depth + 1);\n }\n return result;\n}\n\nexport function isIgnorableWorkspaceCommandError(error, { signal } = {}) {\n if (signal?.aborted) return true;\n if (!error || typeof error !== 'object') return false;\n if (error.name === 'AbortError') return true;\n const code = error.code;\n return code === 'ABORT_ERR' || code === 'ERR_CANCELED';\n}\n\nexport function formatWorkspaceCommandError(error) {\n const sources = collectDiagnosticSources(error);\n const code = pickDiagnostic(sources.map((source) => source?.code));\n const expected = pickDiagnostic(sources.map((source) => source?.expected));\n const hint = pickDiagnostic([\n ...sources.map((source) => source?.hint),\n ...sources.map((source) => source?.message),\n expected,\n ]);\n const rawMessage = error instanceof Error\n ? error.message\n : error === undefined || error === null\n ? undefined\n : String(error);\n const description = pickDiagnostic([expected, hint, rawMessage, code]);\n const visibleHint = hint && hint !== description ? hint : undefined;\n let detailsText;\n try {\n const json = JSON.stringify(serializeErrorValue(error), null, 2);\n if (json && json !== '{}' && json !== '[]' && json !== 'null') detailsText = json;\n } catch {\n detailsText = rawMessage;\n }\n return {\n code,\n description,\n hint: visibleHint,\n detailsText,\n };\n}\n\nconst listeners = new Set();\n\nexport function subscribeWorkspaceCommandErrors(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('subscribeWorkspaceCommandErrors requires a function');\n }\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nexport function reportWorkspaceCommandError(error, context = {}) {\n if (isIgnorableWorkspaceCommandError(error, context)) return;\n for (const listener of listeners) {\n try {\n listener(error, context);\n } catch {\n // Presenter failures must not replace the original command error.\n }\n }\n}\n","import {\n VIEW_WORKSPACE_SERVICES,\n VIEW_WORKSPACE_STATE_TOPIC,\n ViewWorkspaceError,\n createWorkspaceRequest,\n requireWorkspaceString,\n} from './contract.mjs';\nimport { reportWorkspaceCommandError } from './command-error.mjs';\nconst VIEW_INSPECTOR_TOPIC = 'forgeax.view.inspector.changed';\n\nexport function workspaceBrowserEndpoint(endpoint, token, baseHref, role, frontendTicket) {\n requireWorkspaceString(endpoint, 'endpoint');\n requireWorkspaceString(token, 'token');\n const url = new URL(endpoint, baseHref);\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') throw new TypeError('View frontend endpoint must use ws: or wss:');\n url.searchParams.set('token', token);\n if (role !== undefined) url.searchParams.set('role', role);\n if (role === 'frontend' && frontendTicket !== undefined) url.searchParams.set('frontendTicket', frontendTicket);\n return url.toString();\n}\n\nfunction decodeWorkspaceTransportError(error) {\n if (error instanceof ViewWorkspaceError) return error;\n const transportCode = error?.code;\n const remoteCode =\n typeof error?.detail?.remoteCode === 'string'\n ? error.detail.remoteCode\n : undefined;\n const code = [transportCode, remoteCode].find(\n (candidate) => typeof candidate === 'string' && candidate.startsWith('view-'),\n );\n if (code === undefined) return error;\n const message = typeof error?.message === 'string' && error.message.trim() !== ''\n ? error.message\n : String(error);\n return new ViewWorkspaceError(\n code,\n typeof error?.expected === 'string' ? error.expected : message,\n typeof error?.hint === 'string' ? error.hint : message,\n {\n ...(error?.detail && typeof error.detail === 'object' ? error.detail : {}),\n transportCode,\n ...(remoteCode === undefined ? {} : { remoteCode }),\n ...(typeof error?.name === 'string' ? { name: error.name } : {}),\n },\n );\n}\n\n/**\n * Typed client used by both the View frontend and an independent CLI process.\n * It has no local domain state: every operation goes through the Engine Host\n * workspace service and every returned value is the backend authority's value.\n */\nexport class ViewWorkspaceClient {\n constructor({ transport, clientId, token } = {}) {\n if (!transport || typeof transport.request !== 'function') {\n throw new TypeError('View workspace client requires an Engine Host transport');\n }\n this.transport = transport;\n this.clientId = requireWorkspaceString(clientId, 'clientId');\n this.token = token === undefined ? undefined : requireWorkspaceString(token, 'token');\n }\n\n call(operation, args = {}, { signal, generation, requestId } = {}) {\n const request = createWorkspaceRequest(operation, args, {\n clientId: this.clientId,\n token: this.token,\n requestId,\n });\n return Promise.resolve()\n .then(() => this.transport.request(VIEW_WORKSPACE_SERVICES.call, request, { signal, generation }))\n .catch((error) => {\n const decoded = decodeWorkspaceTransportError(error);\n reportWorkspaceCommandError(decoded, { operation, signal });\n throw decoded;\n });\n }\n\n sources(options = {}) {\n return this.call('plugins.sources', {}, options);\n }\n\n inspectPlugins(options = {}) {\n // generation identifies the inspected source, not the workspace transport service.\n const { signal, requestId, ...args } = options;\n return this.call('plugins.inspect', args, { signal, requestId });\n }\n\n watchPlugins(options = {}) {\n const { signal, requestId, ...args } = options;\n return this.call('plugins.watch', args, { signal, requestId });\n }\n\n capabilities(options = {}) {\n return this.transport.request(VIEW_WORKSPACE_SERVICES.capabilities, undefined, options);\n }\n\n getState(options = {}) {\n return this.call('tabs.get', {}, options);\n }\n\n selectTab(tabId, options = {}) {\n return this.call('tabs.select', { tabId }, options);\n }\n\n selectSceneEntity(entityId, { label, tabId, targetId, targetGeneration, ...options } = {}) {\n return this.call(\n 'scene.select',\n {\n entityId, targetId, targetGeneration,\n ...(tabId === undefined ? {} : { tabId }),\n ...(label === undefined ? {} : { label }),\n },\n options,\n );\n }\n\n clearSceneSelection({ tabId, targetId, targetGeneration, ...options } = {}) {\n return this.call('scene.clear', { targetId, targetGeneration, ...(tabId === undefined ? {} : { tabId }) }, options);\n }\n\n openProject(root, { tabId, expectedTargetId, ...options } = {}) {\n return this.call('project.open', { root, tabId, ...(expectedTargetId === undefined ? {} : { expectedTargetId }) }, options);\n }\n\n reopenProject({ root, tabId, expectedTargetId, expectedTargetState, ...options } = {}) {\n return this.call(\n 'project.reopen',\n {\n ...(root === undefined ? {} : { root }),\n ...(tabId === undefined ? {} : { tabId }),\n ...(expectedTargetId === undefined ? {} : { expectedTargetId }),\n ...(expectedTargetState === undefined ? {} : { expectedTargetState }),\n },\n options,\n );\n }\n\n closeProject(projectId, { tabId, ...options } = {}) {\n return this.call('project.close', { projectId, tabId }, options);\n }\n\n listAssets(projectId, { tabId, ...options } = {}) {\n return this.call('assets.list', { projectId, tabId }, options);\n }\n\n inspectAsset(guid, { projectId, tabId, ...options } = {}) {\n return this.call('asset.inspect', { guid, tabId, ...(projectId === undefined ? {} : { projectId }) }, options);\n }\n\n rebuildAssetSource(guid, { projectId, tabId, expectedRevision, requestId, ...options } = {}) {\n return this.call(\n 'asset-source.rebuild',\n {\n guid,\n tabId,\n ...(projectId === undefined ? {} : { projectId }),\n ...(expectedRevision === undefined ? {} : { expectedRevision }),\n ...(requestId === undefined ? {} : { requestId }),\n },\n options,\n );\n }\n\n coldCookAssetSource(guid, { projectId, tabId, expectedRevision, requestId, ...options } = {}) {\n return this.call(\n 'asset-source.cold-cook',\n {\n guid,\n tabId,\n ...(projectId === undefined ? {} : { projectId }),\n ...(expectedRevision === undefined ? {} : { expectedRevision }),\n ...(requestId === undefined ? {} : { requestId }),\n },\n options,\n );\n }\n\n openAsset(guid, { projectId, width, height, tabId, ...options } = {}) {\n return this.call(\n 'asset.open',\n {\n guid,\n tabId,\n ...(projectId === undefined ? {} : { projectId }),\n ...(width === undefined ? {} : { width }),\n ...(height === undefined ? {} : { height }),\n },\n options,\n );\n }\n\n closePreview({ targetId, targetGeneration, tabId, ...options } = {}) {\n return this.call(\n 'preview.close',\n { tabId, targetGeneration, ...(targetId === undefined ? {} : { targetId }) },\n options,\n );\n }\n\n capture(options = {}) {\n const { signal, generation, requestId, targetId, targetGeneration, tabId, ...args } = options;\n return this.call(\n 'preview.capture',\n { tabId, targetGeneration, ...(targetId === undefined ? {} : { targetId }), ...args },\n { signal, generation, requestId },\n );\n }\n\n resizePreview({ targetId, targetGeneration, width, height, tabId, ...options } = {}) {\n return this.call(\n 'preview.resize',\n {\n tabId,\n targetGeneration,\n ...(targetId === undefined ? {} : { targetId }),\n width,\n height,\n },\n options,\n );\n }\n\n getCamera({ targetId, targetGeneration, tabId, ...options } = {}) {\n return this.call('camera.get', { tabId, targetGeneration, ...(targetId === undefined ? {} : { targetId }) }, options);\n }\n\n beginCamera({ targetId, targetGeneration, baseVersion, interactionId, tabId, ...options } = {}) {\n return this.call(\n 'camera.begin',\n {\n tabId,\n targetGeneration,\n ...(targetId === undefined ? {} : { targetId }),\n baseVersion,\n ...(interactionId === undefined ? {} : { interactionId }),\n },\n options,\n );\n }\n\n updateCamera({ targetId, targetGeneration, interactionId, camera, input, tabId, ...options } = {}) {\n return this.call(\n 'camera.update',\n {\n tabId,\n targetGeneration,\n targetId,\n interactionId,\n ...(camera === undefined ? {} : { camera }),\n ...(input === undefined ? {} : { input }),\n },\n options,\n );\n }\n\n commitCamera({ targetId, targetGeneration, interactionId, operationId, expectedVersion, camera, tabId, ...options } = {}) {\n return this.call(\n 'camera.commit',\n { tabId, targetId, targetGeneration, interactionId, operationId, expectedVersion, camera },\n options,\n );\n }\n\n abortCamera({ targetId, targetGeneration, interactionId, reason, tabId, ...options } = {}) {\n return this.call(\n 'camera.abort',\n {\n tabId,\n targetGeneration,\n targetId,\n interactionId,\n ...(reason === undefined ? {} : { reason }),\n },\n options,\n );\n }\n\n getSceneTree({ projectId, targetId, targetGeneration, tabId, offset, limit, revision, ...options } = {}) {\n return this.call(\n 'scene-tree.get',\n {\n tabId,\n ...(projectId === undefined ? {} : { projectId }),\n ...(targetId === undefined ? {} : { targetId }),\n ...(targetGeneration === undefined ? {} : { targetGeneration }),\n ...(offset === undefined ? {} : { offset }),\n ...(limit === undefined ? {} : { limit }),\n ...(revision === undefined ? {} : { revision }),\n },\n options,\n );\n }\n\n subscribe(listener) {\n if (typeof this.transport.subscribe !== 'function') return () => {};\n return this.transport.subscribe(VIEW_WORKSPACE_STATE_TOPIC, listener);\n }\n\n subscribeInspector(listener) {\n return this.transport.subscribe?.(VIEW_INSPECTOR_TOPIC, listener) ?? (() => {});\n }\n\n onDisconnect(listener) {\n return this.transport.onDisconnect?.(listener) ?? (() => {});\n }\n\n close(reason) {\n this.transport.close?.(reason);\n }\n}\n\nexport function createViewWorkspaceClient(options) {\n return new ViewWorkspaceClient(options);\n}\n","import { VIEW_PAGE_TYPES } from '@forgeax/view-workspace-core/contract';\n\nexport const PLUGIN_ID = 'forgeax.view.display';\nexport const BACKEND_PLUGIN_ID = 'forgeax.view.service.display-carrier.backend';\nexport const FRONTEND_PLUGIN_ID = 'forgeax.view.page.ai-display.frontend';\nexport const BACKEND_MODULE = '@forgeax/view/plugins/display/backend';\nexport const FRONTEND_MODULE = '@forgeax/view/plugins/display/frontend';\nexport const PAGE_TYPE = VIEW_PAGE_TYPES.display;\nexport const PAGE_TITLE_I18N_KEY = 'view.pages.display';\nexport const DISPLAY_SURFACE_ID = 'forgeax-view-display-surface';\nexport const DISPLAY_TARGET_ROLE = 'ai-control';\nexport const VIEW_STATUS_TOPIC = 'forgeax.view.status';\nexport const VIEW_STATUS_SERVICE = 'forgeax.view.status.get';\n","import { VIEW_PAGE_TYPES } from '@forgeax/view-workspace-core/contract';\n\nexport const PLUGIN_ID = 'forgeax.view.plugins';\nexport const BACKEND_PLUGIN_ID = 'forgeax.view.service.plugin-inspection.backend';\nexport const FRONTEND_PLUGIN_ID = 'forgeax.view.page.plugin-browser.frontend';\nexport const BACKEND_MODULE = '@forgeax/view/plugins/plugins/backend';\nexport const FRONTEND_MODULE = '@forgeax/view/plugins/plugins/frontend';\nexport const SLOT = 'plugins';\nexport const PAGE_TYPE = VIEW_PAGE_TYPES.plugins;\nexport const PANEL_LAYOUT = Object.freeze({\n dock: 'fill',\n stack: 'tabs',\n order: 0,\n});\nexport const TITLE_I18N_KEY = 'view.slots.plugins';\n","import { VIEW_PAGE_TYPES } from '@forgeax/view-workspace-core/contract';\n\nexport const PLUGIN_ID = 'forgeax.view.inspector';\nexport const FRONTEND_PLUGIN_ID = 'forgeax.view.panel.object-inspector.frontend';\nexport const FRONTEND_MODULE = '@forgeax/view/plugins/inspector/frontend';\nexport const SLOT = 'inspector';\nexport const PAGE_TYPE = VIEW_PAGE_TYPES.editor;\nexport const PANEL_LAYOUT = Object.freeze({\n dock: 'right',\n size: Object.freeze({ value: 0.25, unit: 'fraction' }),\n stack: 'tabs',\n order: 0,\n});\nexport const TITLE_I18N_KEY = 'view.slots.inspector';\n","import { VIEW_PAGE_TYPES } from '@forgeax/view-workspace-core/contract';\n\nexport const PLUGIN_ID = 'forgeax.view.content-browser';\nexport const FRONTEND_PLUGIN_ID = 'forgeax.view.panel.asset-browser.frontend';\nexport const FRONTEND_MODULE = '@forgeax/view/plugins/content-browser/frontend';\nexport const SLOT = 'content-browser';\nexport const PAGE_TYPE = VIEW_PAGE_TYPES.editor;\nexport const PANEL_LAYOUT = Object.freeze({\n dock: 'bottom',\n size: Object.freeze({ value: 0.34, unit: 'fraction' }),\n stack: 'tabs',\n order: 0,\n});\nexport const TITLE_I18N_KEY = 'view.slots.contentBrowser';\n","import { VIEW_PAGE_TYPES } from '@forgeax/view-workspace-core/contract';\n\nexport const PLUGIN_ID = 'forgeax.view.scene-tree';\nexport const FRONTEND_PLUGIN_ID = 'forgeax.view.panel.scene-hierarchy.frontend';\nexport const FRONTEND_MODULE = '@forgeax/view/plugins/scene-tree/frontend';\nexport const SLOT = 'scene-tree';\nexport const PAGE_TYPE = VIEW_PAGE_TYPES.editor;\nexport const PANEL_LAYOUT = Object.freeze({\n dock: 'left',\n size: Object.freeze({ value: 0.17, unit: 'fraction' }),\n stack: 'tabs',\n order: 0,\n});\nexport const TITLE_I18N_KEY = 'view.slots.sceneTree';\n","import { VIEW_PAGE_TYPES } from '@forgeax/view-workspace-core/contract';\nimport { RESOURCE_FALLBACK_LAYOUT } from '@forgeax/view-workspace-core/resource-page';\n\nexport const PLUGIN_ID = 'forgeax.view.asset';\nexport const FRONTEND_PLUGIN_ID = 'forgeax.view.page.asset.frontend';\nexport const FRONTEND_MODULE = '@forgeax/view/plugins/asset/frontend';\nexport const PAGE_TYPE = VIEW_PAGE_TYPES.asset;\nexport const PAGE_TITLE_I18N_KEY = 'view.pages.asset';\nexport const PAGE_ORDER = 80;\nexport const PROPERTIES_SLOT = 'asset-properties';\nexport const RESOURCE_SELECTOR = Object.freeze({ fallback: true });\nexport const PAGE_PRIORITY = 0;\nexport const PROPERTIES_LAYOUT = RESOURCE_FALLBACK_LAYOUT;\nexport const PROPERTIES_PANEL = 'AssetProperties';\nexport const PROPERTIES_ICON = 'detail';\nexport const PROPERTIES_TITLE_I18N_KEY = 'view.slots.assetProperties';\n","import { VIEW_PAGE_TYPES } from '@forgeax/view-workspace-core/contract';\n\nexport const PLUGIN_ID = 'forgeax.view.viewport';\nexport const FRONTEND_PLUGIN_ID = 'forgeax.view.panel.scene-viewport.frontend';\nexport const FRONTEND_MODULE = '@forgeax/view/plugins/viewport/frontend';\nexport const SLOT = 'viewport';\nexport const PAGE_TYPE = VIEW_PAGE_TYPES.editor;\nexport const PANEL_LAYOUT = Object.freeze({\n dock: 'fill',\n stack: 'tabs',\n order: 0,\n});\n/** Editor page center viewport is pinned; the shell must not offer a close affordance. */\nexport const PANEL_CLOSABLE = false;\nexport const TITLE_I18N_KEY = 'view.slots.viewport';\nexport const VIEWPORT_SURFACE_ID = 'forgeax-view-viewport-surface';\nexport const VIEWPORT_TARGET_ROLE = 'human-readonly';\n","import { VIEW_PAGE_TYPES } from '@forgeax/view-workspace-core/contract';\n\nexport const FRONTEND_PLUGIN_ID = 'forgeax.view.page.scene.frontend';\nexport const FRONTEND_MODULE = '@forgeax/view/pages/scene';\nexport const PAGE_TYPE = VIEW_PAGE_TYPES.editor;\n","export const SHELL_PLUGIN_ID = 'forgeax.view.shell.workspace.frontend';\nexport const SHELL_MODULE = '@forgeax/view/shell/frontend';\n","export const PRESENTATION_PLUGIN_ID = 'forgeax.view.service.play-presentation.frontend';\nexport const PRESENTATION_MODULE = '@forgeax/view/workspace/presentation';\n","import * as display from '@forgeax/view-plugin-display/identity';\nimport * as plugins from '@forgeax/view-plugin-plugins/identity';\nimport * as inspector from '@forgeax/view-plugin-inspector/identity';\nimport * as contentBrowser from '@forgeax/view-plugin-content-browser/identity';\nimport * as sceneTree from '@forgeax/view-plugin-scene-tree/identity';\nimport * as material from '@forgeax/view-plugin-material/identity';\nimport * as mesh from '@forgeax/view-plugin-mesh/identity';\nimport * as texture from '@forgeax/view-plugin-texture/identity';\nimport * as asset from '@forgeax/view-plugin-asset/identity';\nimport * as viewport from '@forgeax/view-plugin-viewport/identity';\nimport * as scene from '@forgeax/view-plugin-scene/identity';\n\nimport { SHELL_MODULE, SHELL_PLUGIN_ID } from './plugins/shell-identity.mjs';\nimport { PRESENTATION_MODULE, PRESENTATION_PLUGIN_ID } from '@forgeax/view-plugin-viewport/presentation-identity';\n\nexport const VIEW_PLUGIN_VERSION = '0.2.1-beta-20260924075842';\nexport const VIEW_FRONTEND_ROOT_PROGRAM = '@forgeax/view/frontend-root';\nexport const VIEW_FRONTEND_MODULE = Object.freeze({ specifier: VIEW_FRONTEND_ROOT_PROGRAM });\n\nexport function viewFrontendRoot(frontendConfig, disabledPages = []) {\n return Object.freeze({\n program: VIEW_FRONTEND_ROOT_PROGRAM,\n codeRevision: VIEW_PLUGIN_VERSION,\n config: { frontendConfig, disabledPages },\n });\n}\n\nexport const VIEW_WORKSPACE_CORE = Object.freeze({\n BACKEND_PLUGIN_ID: 'forgeax.view.service.workspace.backend',\n FRONTEND_PLUGIN_ID: 'forgeax.view.service.workspace-client.frontend',\n BACKEND_MODULE: '@forgeax/view-workspace-core/backend',\n FRONTEND_MODULE: '@forgeax/view/workspace-frontend',\n});\n\nexport const VIEW_PRODUCT_PLUGINS = Object.freeze([\n scene,\n display,\n viewport,\n contentBrowser,\n plugins,\n inspector,\n sceneTree,\n material,\n mesh,\n texture,\n asset,\n]);\n\n/** Static native composition. Pack assets own game plugin identity; View owns only its UI policy. */\nexport function createViewProductPlan({ backendConfig, frontendConfig, disabledPages = [] } = {}) {\n const pages = new Set(VIEW_PRODUCT_PLUGINS.map(plugin => plugin.PAGE_TYPE));\n for (const page of disabledPages) {\n if (!pages.has(page)) throw new TypeError(`Unknown View page: ${page}`);\n }\n const disabled = new Set(disabledPages);\n const displayBackendConfig = {\n platform: backendConfig?.platform,\n capabilities: backendConfig?.capabilities,\n };\n const workspaceBackendConfig = {\n workspaceEngine: backendConfig?.workspaceEngine,\n workspaceAccessToken: backendConfig?.workspaceAccessToken,\n workspaceAuthorize: backendConfig?.workspaceAuthorize,\n capabilities: backendConfig?.capabilities,\n };\n const backend = [\n { id: VIEW_WORKSPACE_CORE.BACKEND_PLUGIN_ID, module: VIEW_WORKSPACE_CORE.BACKEND_MODULE, config: workspaceBackendConfig },\n { id: display.BACKEND_PLUGIN_ID, module: display.BACKEND_MODULE, config: displayBackendConfig },\n { id: plugins.BACKEND_PLUGIN_ID, module: plugins.BACKEND_MODULE, config: {} },\n ];\n const frontend = [\n { id: SHELL_PLUGIN_ID, module: SHELL_MODULE },\n { id: VIEW_WORKSPACE_CORE.FRONTEND_PLUGIN_ID, module: VIEW_WORKSPACE_CORE.FRONTEND_MODULE },\n ...(!disabled.has(scene.PAGE_TYPE) ? [{ id: scene.FRONTEND_PLUGIN_ID, module: scene.FRONTEND_MODULE }] : []),\n { id: PRESENTATION_PLUGIN_ID, module: PRESENTATION_MODULE },\n ...VIEW_PRODUCT_PLUGINS.filter(plugin => plugin !== scene && !disabled.has(plugin.PAGE_TYPE))\n .map(plugin => ({ id: plugin.FRONTEND_PLUGIN_ID, module: plugin.FRONTEND_MODULE })),\n ];\n return Object.freeze({\n backend: Object.freeze(backend),\n frontend: Object.freeze(frontend),\n frontendConfig,\n disabledPages: Object.freeze([...disabled]),\n });\n}\n","export class ViewDisplayStatus {\n constructor() {\n this.state = { status: 'idle', run: null, target: null, error: null };\n this.listeners = new Set();\n }\n\n update(snapshot = {}) {\n const state = snapshot.status ?? snapshot.state;\n const status =\n state === 'occupied'\n ? 'running'\n : state === 'ready'\n ? 'idle'\n : state ?? (snapshot.occupancy ? 'running' : 'idle');\n this.state = {\n status,\n run: snapshot.run ?? snapshot.occupancy?.run ?? null,\n target: snapshot.target ?? null,\n error: snapshot.error ? String(snapshot.error) : null,\n observation: snapshot.observation ?? null,\n binding: snapshot.binding ?? null,\n };\n for (const listener of this.listeners) listener();\n }\n\n getSnapshot = () => this.state;\n\n snapshot() {\n return this.state;\n }\n\n renderStatus() {\n if (this.state.error) return `View connection error: ${this.state.error}`;\n if (this.state.status === 'unavailable') return 'View unavailable';\n if (this.state.status === 'stopping') return 'View stopping';\n return this.state.status === 'running' ? 'View ready (running)' : 'View ready (idle)';\n }\n\n subscribe = (listener) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n dispose() {\n this.listeners.clear();\n }\n}\n","import {\n PAGE_TYPE,\n PAGE_TITLE_I18N_KEY,\n DISPLAY_SURFACE_ID,\n DISPLAY_TARGET_ROLE,\n FRONTEND_PLUGIN_ID,\n VIEW_STATUS_SERVICE,\n VIEW_STATUS_TOPIC,\n} from './identity.mjs';\n\nimport { ViewDisplayStatus } from './status.mjs';\nimport { mountRunObserver } from './ui/run-observer.mjs';\nexport { ViewDisplayStatus } from './status.mjs';\n\nconst viewDisplayFrontendPlugin = {\n name: FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient'],\n provide: ['viewDisplayStatus'],\n async apply(ctx, config = {}) {\n const pageHost = config.pageHost ?? ctx.get?.('pageHost', false);\n const document = config.document ?? globalThis.document;\n const status = new ViewDisplayStatus();\n let unregisterPageType;\n let unmountPage;\n let disposeObservation;\n let live = true;\n if (document?.createElement) {\n if (!pageHost) throw new TypeError('View display Frontend Plugin requires pageHost');\n if (document.getElementById?.(DISPLAY_SURFACE_ID)) {\n throw new Error(`Display Fiber requires one unique surface: ${DISPLAY_SURFACE_ID}`);\n }\n unregisterPageType = pageHost.registerType({\n typeId: PAGE_TYPE,\n titleKey: PAGE_TITLE_I18N_KEY,\n order: 10,\n closable: false,\n singleton: true,\n initial: true,\n openable: false,\n layout: 'surface',\n showPanelRail: false,\n hideWhenInactive: config.displayCarrier !== true,\n });\n const surface = document.createElement(config.displayCarrier === true ? 'iframe' : 'section');\n surface.id = DISPLAY_SURFACE_ID;\n surface.name = DISPLAY_SURFACE_ID;\n surface.title = 'ForgeaX runtime capture';\n surface.className = 'fx-view-display-surface';\n surface.dataset.forgeaxViewSurface = 'engine-target';\n surface.dataset.forgeaxViewDisplayOwner = 'frontend-fiber';\n surface.dataset.forgeaxViewTargetRole = DISPLAY_TARGET_ROLE;\n if (config.displayCarrier === true) surface.setAttribute('aria-hidden', 'true');\n surface.style.border = '0';\n surface.style.display = 'block';\n surface.style.pointerEvents = config.displayCarrier === true ? 'none' : 'auto';\n if (config.displayCarrier !== true) {\n surface.dataset.forgeaxViewSurface = 'run-observer';\n surface.className = 'fx-view-run-observer';\n disposeObservation = mountRunObserver({\n document, surface, status, client: ctx.get('viewOperationClient'),\n });\n }\n try {\n unmountPage = pageHost.mount(PAGE_TYPE, surface);\n } catch (error) {\n unregisterPageType();\n throw error;\n }\n }\n ctx.provide('viewDisplayStatus', status);\n const transport = ctx.get?.('hostTransport', false);\n let observedEvent = false;\n const unsubscribe = transport?.subscribe?.(VIEW_STATUS_TOPIC, (payload) => {\n observedEvent = true;\n status.update(payload ?? {});\n });\n const initialController = new AbortController();\n if (typeof transport?.request === 'function') {\n void transport\n .request(VIEW_STATUS_SERVICE, undefined, { signal: initialController.signal })\n .then((snapshot) => {\n if (live && !observedEvent) status.update(snapshot ?? {});\n })\n .catch(() => {});\n }\n const removeDisconnect = transport?.onDisconnect?.((error) => {\n if (!live) return;\n status.update({ status: 'error', error: error?.message ?? String(error) });\n });\n ctx.effect(() => async () => {\n live = false;\n initialController.abort();\n unsubscribe?.();\n removeDisconnect?.();\n unmountPage?.();\n unregisterPageType?.();\n disposeObservation?.();\n status.dispose();\n });\n },\n};\n\nexport default viewDisplayFrontendPlugin;\n","import { FRONTEND_PLUGIN_ID, FRONTEND_MODULE } from './identity.mjs';\nimport { PAGE_TYPE, PANEL_LAYOUT, SLOT, TITLE_I18N_KEY } from './identity.mjs';\n\nexport const VIEW_PLUGINS_FRONTEND_PLUGIN_ID = FRONTEND_PLUGIN_ID;\nexport const VIEW_PLUGINS_FRONTEND_MODULE = FRONTEND_MODULE;\n\nconst viewPluginsListFrontendPlugin = {\n name: VIEW_PLUGINS_FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient'],\n async apply(ctx, config = {}) {\n const panelHost = config.panelHost ?? ctx.get?.('panelHost', false);\n if (!panelHost) return;\n const pageHost = config.pageHost ?? ctx.get?.('pageHost', false);\n if (!pageHost) throw new TypeError('View plugins Frontend Plugin requires pageHost');\n const unregisterPageType = pageHost.registerType({\n typeId: PAGE_TYPE,\n titleKey: 'view.pages.plugins',\n order: 20,\n closable: true,\n singleton: true,\n initial: false,\n openable: true,\n layout: 'dock',\n showPanelRail: true,\n hideWhenInactive: true,\n });\n const workspaceClient = ctx.get('viewOperationClient');\n const transport = ctx.get?.('hostTransport', false);\n let disposePanel;\n ctx.effect(() => async () => {\n await disposePanel?.();\n unregisterPageType();\n });\n disposePanel = await panelHost.mountPanel({\n id: SLOT,\n pageType: PAGE_TYPE,\n titleKey: TITLE_I18N_KEY,\n activity: { labelKey: TITLE_I18N_KEY, icon: 'package' },\n layout: PANEL_LAYOUT,\n panel: 'Plugins',\n props: { workspaceClient, hostAssembly: ctx.get?.('hostAssembly', false), connectionId: transport?.caller?.connectionId },\n });\n },\n};\n\nexport { viewPluginsListFrontendPlugin };\nexport default viewPluginsListFrontendPlugin;\n","import { FRONTEND_PLUGIN_ID, FRONTEND_MODULE } from './identity.mjs';\nimport { PAGE_TYPE, PANEL_LAYOUT, SLOT, TITLE_I18N_KEY } from './identity.mjs';\n\nexport const VIEW_OBJECT_INSPECTOR_FRONTEND_PLUGIN_ID = FRONTEND_PLUGIN_ID;\nexport const VIEW_OBJECT_INSPECTOR_FRONTEND_MODULE = FRONTEND_MODULE;\n\nconst viewObjectInspectorFrontendPlugin = {\n name: VIEW_OBJECT_INSPECTOR_FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient', 'viewScenePage'],\n async apply(ctx, config = {}) {\n const panelHost = config.panelHost ?? ctx.get?.('panelHost', false);\n if (!panelHost) return;\n const workspaceClient = ctx.get('viewOperationClient');\n const disposePanel = await panelHost.mountPanel({\n id: SLOT,\n pageType: PAGE_TYPE,\n titleKey: TITLE_I18N_KEY,\n activity: { labelKey: TITLE_I18N_KEY, icon: 'detail' },\n layout: PANEL_LAYOUT,\n panel: 'Inspector',\n props: { client: workspaceClient },\n });\n ctx.effect(() => async () => {\n await disposePanel?.();\n });\n },\n};\n\nexport { viewObjectInspectorFrontendPlugin };\nexport default viewObjectInspectorFrontendPlugin;\n","import { FRONTEND_PLUGIN_ID, FRONTEND_MODULE, PAGE_TYPE, PANEL_LAYOUT, SLOT, TITLE_I18N_KEY } from './identity.mjs';\n\nexport const VIEW_CONTENT_BROWSER_FRONTEND_PLUGIN_ID = FRONTEND_PLUGIN_ID;\nexport const VIEW_CONTENT_BROWSER_FRONTEND_MODULE = FRONTEND_MODULE;\n\nconst viewContentBrowserFrontendPlugin = {\n name: VIEW_CONTENT_BROWSER_FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient', 'viewScenePage'],\n async apply(ctx, config = {}) {\n const document = config.document ?? globalThis.document;\n const workspaceClient = ctx.get('viewOperationClient');\n const panelHost = config.panelHost ?? ctx.get('panelHost');\n if (!document?.createElement) return;\n if (!panelHost || typeof panelHost.claim !== 'function') {\n throw new TypeError('View content-browser Frontend Plugin requires panelHost');\n }\n const wrapper = document.createElement('div');\n wrapper.className = 'fx-view-content-browser-host';\n wrapper.dataset.forgeaxView = 'content-browser-root';\n const reactMount = document.createElement('div');\n reactMount.className = 'fx-view-content-browser-ui';\n wrapper.append(reactMount);\n const unclaim = panelHost.claim({\n id: SLOT,\n pageType: PAGE_TYPE,\n titleKey: TITLE_I18N_KEY,\n activity: { labelKey: TITLE_I18N_KEY, icon: 'boxes' },\n layout: PANEL_LAYOUT,\n });\n let unmountSlot;\n let disposePanel;\n try {\n await panelHost.waitForSlot(SLOT);\n unmountSlot = panelHost.mount(SLOT, wrapper);\n disposePanel = await panelHost.mountPanelInto({\n element: reactMount,\n panel: 'ContentBrowser',\n props: { client: workspaceClient },\n });\n } catch (error) {\n await disposePanel?.();\n unmountSlot?.();\n unclaim();\n throw error;\n }\n ctx.effect(() => async () => {\n await disposePanel?.();\n unmountSlot?.();\n unclaim();\n });\n },\n};\n\nexport { viewContentBrowserFrontendPlugin };\nexport default viewContentBrowserFrontendPlugin;\n","import { FRONTEND_PLUGIN_ID, FRONTEND_MODULE } from './identity.mjs';\nimport { PAGE_TYPE, PANEL_LAYOUT, SLOT, TITLE_I18N_KEY } from './identity.mjs';\n\nexport const VIEW_SCENE_TREE_FRONTEND_PLUGIN_ID = FRONTEND_PLUGIN_ID;\nexport const VIEW_SCENE_TREE_FRONTEND_MODULE = FRONTEND_MODULE;\n\nconst viewSceneTreeFrontendPlugin = {\n name: VIEW_SCENE_TREE_FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient', 'viewScenePage'],\n async apply(ctx, config = {}) {\n const panelHost = config.panelHost ?? ctx.get?.('panelHost', false);\n if (!panelHost) return;\n const workspaceClient = ctx.get('viewOperationClient');\n const disposePanel = await panelHost.mountPanel({\n id: SLOT,\n pageType: PAGE_TYPE,\n titleKey: TITLE_I18N_KEY,\n activity: { labelKey: TITLE_I18N_KEY, icon: 'tree' },\n layout: PANEL_LAYOUT,\n panel: 'SceneTree',\n props: { client: workspaceClient },\n });\n ctx.effect(() => async () => {\n await disposePanel?.();\n });\n },\n};\n\nexport { viewSceneTreeFrontendPlugin };\nexport default viewSceneTreeFrontendPlugin;\n","import * as identity from './identity.mjs';\nimport { applyResourcePagePlugin } from '@forgeax/view-workspace-core/resource-page';\n\nexport const VIEW_MATERIAL_FRONTEND_PLUGIN_ID = identity.FRONTEND_PLUGIN_ID;\nexport const VIEW_MATERIAL_FRONTEND_MODULE = identity.FRONTEND_MODULE;\n\nconst viewMaterialFrontendPlugin = {\n name: VIEW_MATERIAL_FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient'],\n async apply(ctx, config = {}) {\n await applyResourcePagePlugin(ctx, config, identity);\n },\n};\n\nexport { viewMaterialFrontendPlugin };\nexport default viewMaterialFrontendPlugin;\n","import * as identity from './identity.mjs';\nimport { applyResourcePagePlugin } from '@forgeax/view-workspace-core/resource-page';\n\nexport const VIEW_MESH_FRONTEND_PLUGIN_ID = identity.FRONTEND_PLUGIN_ID;\n\nconst viewMeshFrontendPlugin = {\n name: VIEW_MESH_FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient'],\n async apply(ctx, config = {}) {\n await applyResourcePagePlugin(ctx, config, identity);\n },\n};\n\nexport { viewMeshFrontendPlugin };\nexport default viewMeshFrontendPlugin;\n","import * as identity from './identity.mjs';\nimport { applyResourcePagePlugin } from '@forgeax/view-workspace-core/resource-page';\n\nexport const VIEW_TEXTURE_FRONTEND_PLUGIN_ID = identity.FRONTEND_PLUGIN_ID;\n\nconst viewTextureFrontendPlugin = {\n name: VIEW_TEXTURE_FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient'],\n async apply(ctx, config = {}) {\n await applyResourcePagePlugin(ctx, config, identity);\n },\n};\n\nexport { viewTextureFrontendPlugin };\nexport default viewTextureFrontendPlugin;\n","import * as identity from './identity.mjs';\nimport { applyResourcePagePlugin } from '@forgeax/view-workspace-core/resource-page';\n\nexport const VIEW_ASSET_FRONTEND_PLUGIN_ID = identity.FRONTEND_PLUGIN_ID;\n\nconst viewAssetFrontendPlugin = {\n name: VIEW_ASSET_FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient'],\n async apply(ctx, config = {}) {\n await applyResourcePagePlugin(ctx, config, identity);\n },\n};\n\nexport { viewAssetFrontendPlugin };\nexport default viewAssetFrontendPlugin;\n","import { VIEW_WORKSPACE_TAB_ID } from './contract.mjs';\n\nconst KEY = 'forgeax.view.project-session/1';\nconst HASH = 'forgeaxViewRestore';\nconst PREFERENCES = ['forgeax-view-theme', 'forgeax.view.locale'];\nconst isLoopback = hostname => ['localhost', '127.0.0.1', '[::1]'].includes(hostname);\n\nexport function restoreProjectPreferences(window = globalThis) {\n const record = readProjectSession(window);\n for (const key of PREFERENCES) {\n const value = record?.preferences?.[key];\n if (typeof value === 'string') {\n try { window.localStorage?.setItem(key, value); } catch { /* Optional preference. */ }\n }\n }\n}\n\nexport function readProjectSession(window = globalThis) {\n try {\n const hash = new URLSearchParams(new URL(window.location.href).hash.slice(1));\n const raw = hash.get(HASH) ?? window.sessionStorage?.getItem(KEY) ?? 'null';\n if (raw.length > 64000) return null;\n const value = JSON.parse(raw);\n if (value?.version !== 1 || typeof value.root !== 'string' || !value.root.trim()) return null;\n if (value.targetId !== undefined && typeof value.targetId !== 'string') return null;\n if (value.resources !== undefined && (!Array.isArray(value.resources) ||\n value.resources.length > 32 || !value.resources.every(guid => typeof guid === 'string'))) return null;\n const presentation = value.presentation;\n if (presentation !== undefined && (!presentation || typeof presentation !== 'object' || Array.isArray(presentation) ||\n (presentation.pageOrder !== undefined && (!Array.isArray(presentation.pageOrder) ||\n !presentation.pageOrder.every(type => typeof type === 'string'))) ||\n (presentation.activeType !== undefined && typeof presentation.activeType !== 'string') ||\n (presentation.layouts !== undefined && (!presentation.layouts || typeof presentation.layouts !== 'object' ||\n Array.isArray(presentation.layouts))))) return null;\n if (value.entry) {\n const entry = new URL(value.entry);\n const current = new URL(window.location.href);\n const sameHost = entry.hostname === current.hostname || (isLoopback(entry.hostname) && isLoopback(current.hostname));\n if (!sameHost || entry.protocol !== current.protocol ||\n !['http:', 'https:'].includes(entry.protocol) || entry.username || entry.password) return null;\n }\n // Read old records without reviving their resource, camera or layout history.\n return { version: 1, root: value.root, entry: value.entry, targetId: value.targetId, preferences: value.preferences };\n } catch { return null; }\n}\n\nfunction save(window, value) {\n if (!value) return;\n value.preferences = {};\n for (const key of PREFERENCES) {\n try {\n const preference = window.localStorage?.getItem(key);\n if (preference) value.preferences[key] = preference;\n } catch { /* Storage is optional. */ }\n }\n try { window.sessionStorage?.setItem(KEY, JSON.stringify(value)); } catch { /* Storage is optional. */ }\n}\n\nexport function projectSessionUrl(url, record) {\n const next = new URL(url);\n next.hash = new URLSearchParams({ [HASH]: JSON.stringify(record) }).toString();\n return next.href;\n}\n\n/** Transfer the confirmed project identity across origins, never runtime history. */\nexport function navigateProjectSession(snapshot, window = globalThis, record = readProjectSession(window)) {\n const url = snapshot?.projectTarget?.url;\n if (!url || !window.location?.assign) return;\n if (!snapshot.project?.root) { window.location.assign(url); return; }\n const current = new URL(window.location.href);\n const next = {\n ...record, version: 1, root: snapshot.project.root,\n targetId: snapshot.projectTarget.targetId,\n entry: record?.entry ?? current.origin + current.pathname,\n };\n save(window, next);\n window.location.assign(projectSessionUrl(url, next));\n}\n\n/** One Cordis-owned project intent/recovery projection shared by all React consumers. */\nexport function createProjectSession(client, { window = globalThis } = {}) {\n let disposed = false;\n let record = readProjectSession(window);\n const location = window.location;\n const url = location?.href ? new URL(location.href) : null;\n const explicitRoot = url?.searchParams.get('project')?.trim();\n const pageTarget = url?.searchParams.get('forgeaxWorkspaceTarget');\n const navigation = window.performance?.getEntriesByType?.('navigation')?.[0];\n let state = {\n snapshot: {}, busy: false, error: null,\n restoring: Boolean(pageTarget ? navigation?.type === 'reload' : explicitRoot || (record?.root && record?.targetId)),\n };\n let initializing = true;\n let retryTimer;\n let cancelDelay;\n let reconnecting;\n let cancelNavigation;\n const listeners = new Set();\n const controller = new AbortController();\n const options = { tabId: VIEW_WORKSPACE_TAB_ID, signal: controller.signal };\n const changed = patch => {\n if (disposed) return;\n state = { ...state, ...patch };\n for (const listener of listeners) listener(state);\n };\n const accept = snapshot => {\n if (disposed || (snapshot.revision ?? 0) < (state.snapshot.revision ?? -1)) return;\n changed({ snapshot });\n // A project opened outside this page (for example `view project open`)\n // is adopted by an empty shell that holds no earlier target identity.\n // Headed documents carry pageTarget and never adopt; a page remembering\n // another target keeps its explicit conflict instead of chasing someone\n // else's session.\n const remoteTargetUrl = snapshot?.projectTarget?.url;\n if (!pageTarget && !explicitRoot && !record?.targetId && !initializing\n && snapshot?.workspaceTargetLost !== true\n && typeof snapshot?.project?.root === 'string' && snapshot.project.root.trim() !== ''\n && typeof remoteTargetUrl === 'string' && remoteTargetUrl.trim() !== '') {\n void Promise.resolve(navigate(snapshot)).catch(fail);\n return;\n }\n if (initializing || !pageTarget || snapshot.projectTarget?.targetId !== pageTarget || !snapshot.project?.root) return;\n record = {\n ...record, version: 1, root: snapshot.project.root, targetId: pageTarget,\n };\n save(window, record);\n };\n const fail = error => changed({ busy: false, error: error instanceof Error ? error.message : String(error) });\n const run = async action => {\n if (disposed || state.busy) return;\n changed({ busy: true, error: null, restoring: true });\n try { await action(); }\n catch (error) { if (!controller.signal.aborted) fail(error); }\n finally { changed({ busy: false }); }\n };\n const navigate = snapshot => {\n if (disposed) return;\n record = { ...record, version: 1, root: snapshot?.project?.root,\n targetId: snapshot?.projectTarget?.targetId };\n if (!snapshot?.projectTarget?.url || !window.addEventListener) return navigateProjectSession(snapshot, window, record);\n // Keep this document's activation pending until the browser leaves. Starting\n // another App here races the old project server's guarded replacement.\n return new Promise(resolve => {\n const leave = () => {\n window.removeEventListener('pagehide', leave);\n cancelNavigation = undefined;\n resolve();\n };\n cancelNavigation = leave;\n window.addEventListener('pagehide', leave, { once: true });\n try { navigateProjectSession(snapshot, window, record); }\n catch (error) { leave(); throw error; }\n });\n };\n const recover = async () => {\n const snapshot = await client.getState({ signal: controller.signal });\n accept(snapshot);\n const expectedTargetId = pageTarget ?? record?.targetId;\n if (!expectedTargetId || snapshot.projectTarget?.targetId !== expectedTargetId)\n throw new Error('The project changed in another page. Open the current View entry and choose a project explicitly.');\n return navigate(await client.reopenProject({ ...options, expectedTargetId, expectedTargetState: 'lost' }));\n };\n const open = root => run(async () => {\n const snapshot = await client.getState({ signal: controller.signal });\n accept(snapshot);\n if (snapshot.project) {\n if (snapshot.project.root !== root) throw new Error('Another project is already open. Close it explicitly before opening a different project.');\n record = { ...record, version: 1, root, targetId: snapshot.projectTarget?.targetId };\n await recover();\n return;\n }\n record = { version: 1, root, entry: url ? url.origin + url.pathname : undefined };\n return navigate(await client.openProject(root, { ...options, expectedTargetId: null }));\n });\n const reconnect = () => run(recover);\n const stop = client.subscribe(accept);\n const probeEntry = async () => {\n if (!record?.entry || disposed) return;\n changed({ busy: true, error: null, restoring: true });\n for (const delay of [0, 250, 500, 1000, 2000, 4000]) {\n await new Promise(resolve => {\n cancelDelay = resolve;\n retryTimer = setTimeout(resolve, delay);\n });\n cancelDelay = undefined;\n if (disposed) return;\n try {\n const response = await window.fetch(new URL('/__forgeax/view/health', record.entry), {\n cache: 'no-store', signal: AbortSignal.any([controller.signal, AbortSignal.timeout(2000)]),\n });\n if (!response.ok) throw new Error('View entry is unavailable');\n if (!disposed) {\n const destination = projectSessionUrl(record.entry, record);\n if (!window.addEventListener) location.replace(destination);\n else await new Promise(resolve => {\n const leave = () => {\n window.removeEventListener('pagehide', leave);\n cancelNavigation = undefined;\n resolve();\n };\n cancelNavigation = leave;\n window.addEventListener('pagehide', leave, { once: true });\n try { location.replace(destination); }\n catch (error) { leave(); throw error; }\n });\n }\n return;\n } catch (error) { if (disposed) return; }\n }\n fail(new Error('View is unavailable. Start or reconnect the backend and View, then retry.'));\n };\n const returnToEntry = () => reconnecting ??= probeEntry().finally(() => { reconnecting = undefined; });\n const disconnect = pageTarget ? client.onDisconnect?.(error => {\n if (/stopped|stopping|unauthorized|forbidden|incompatible/i.test(error?.message ?? '')) {\n fail(error);\n } else void returnToEntry();\n }) : undefined;\n const ready = (async () => {\n if (!url) return;\n if (url.hash.includes(HASH)) {\n save(window, record);\n url.hash = '';\n window.history?.replaceState(null, '', url.href);\n }\n // The client uses the resident View endpoint, so closing the old project\n // server cannot interrupt this guarded replacement. Never revive its World.\n if (pageTarget && navigation?.type === 'reload') {\n if (!record?.entry) throw new Error('The View entry for this project session is unavailable. Open View and choose the project again.');\n await returnToEntry();\n return;\n }\n const snapshot = await client.getState({ signal: controller.signal });\n accept(snapshot);\n if (!pageTarget) {\n if (explicitRoot) await open(explicitRoot);\n else if (record?.root && record?.targetId) await reconnect();\n // A project remote-opened before this page loaded leaves no explicit\n // intent and no remembered target here; the post-initialization accept\n // below adopts its headed document.\n return;\n }\n })().catch(fail).finally(() => { initializing = false; accept(state.snapshot); });\n return {\n ready, open, reconnect,\n reconnectHost: returnToEntry,\n getSnapshot: () => state,\n subscribe(listener) { listeners.add(listener); listener(state); return () => listeners.delete(listener); },\n dispose() {\n disposed = true;\n controller.abort();\n clearTimeout(retryTimer);\n cancelDelay?.();\n cancelNavigation?.();\n disconnect?.();\n stop();\n listeners.clear();\n },\n };\n}\n","import { VIEW_WORKSPACE_TAB_ID, isOpaqueWorkspaceDiagnostic, workspaceError } from './contract.mjs';\nimport { navigateProjectSession } from './project-session.mjs';\n\nexport const VIEW_WORKSPACE_PAGE_LOST_CODE = 'view-workspace-page-lost';\n\nexport const VIEW_WORKSPACE_TARGET_RECOVERY_CODES = Object.freeze([\n VIEW_WORKSPACE_PAGE_LOST_CODE,\n 'view-workspace-session-closed',\n 'view-workspace-target-mismatch',\n 'view-workspace-bootstrap-failed',\n]);\n\nconst WORKSPACE_FAILURE_CODE_PATTERN =\n /(?:view|engine)-workspace-(?:page-lost|session-closed|target-mismatch|bootstrap-failed)/;\n\nfunction normalizeWorkspaceFailureCode(candidate) {\n if (typeof candidate !== 'string' || candidate.length === 0) return undefined;\n const match = candidate.match(/(?:view|engine)-workspace-[a-z0-9-]+/);\n if (!match) return undefined;\n return match[0].replace('engine-workspace-', 'view-workspace-');\n}\n\nfunction collectFailureStrings(value, strings = [], depth = 0) {\n if (depth > 4 || value === undefined || value === null) return strings;\n if (typeof value === 'string') {\n strings.push(value);\n return strings;\n }\n if (typeof value !== 'object') return strings;\n if (Array.isArray(value)) {\n for (const entry of value) collectFailureStrings(entry, strings, depth + 1);\n return strings;\n }\n for (const key of ['code', 'expected', 'hint', 'message', 'remoteCode']) {\n collectFailureStrings(value[key], strings, depth + 1);\n }\n collectFailureStrings(value.detail, strings, depth + 1);\n collectFailureStrings(value.payload, strings, depth + 1);\n collectFailureStrings(value.failure, strings, depth + 1);\n return strings;\n}\n\n/**\n * Map a Tool terminal failure to a View workspace code. Engine workspace errors\n * thrown inside executors are often wrapped as tool-domain-failed /\n * executor-threw, so we scan nested detail and message text for the real code.\n */\nexport function resolveWorkspaceFailureCode(failure) {\n if (!failure || typeof failure !== 'object') return 'view-workspace-provider-failed';\n if (failure.code === 'tool-invalid-args') return 'view-workspace-invalid-args';\n\n const candidates = collectFailureStrings(failure);\n for (const candidate of candidates) {\n const normalized = normalizeWorkspaceFailureCode(candidate);\n if (normalized !== undefined) return normalized;\n }\n for (const candidate of candidates) {\n if (WORKSPACE_FAILURE_CODE_PATTERN.test(candidate)) {\n const match = candidate.match(WORKSPACE_FAILURE_CODE_PATTERN);\n if (match) return match[0].replace('engine-workspace-', 'view-workspace-');\n }\n }\n if (typeof failure.detail?.code === 'string' && failure.detail.code.startsWith('pack-')) {\n return failure.detail.code;\n }\n return 'view-workspace-provider-failed';\n}\n\nfunction diagnosticCandidate(value) {\n return typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;\n}\n\nfunction pickWorkspaceDiagnostic(candidates, { allowOpaque = true } = {}) {\n const texts = candidates.map(diagnosticCandidate).filter((value) => value !== undefined);\n const real = texts.filter((value) => !isOpaqueWorkspaceDiagnostic(value));\n if (real.length > 0) return real[0];\n return allowOpaque ? texts[0] : undefined;\n}\n\n/**\n * Unwrap a Tool terminal failure into the View workspace error fields. Nested\n * executor-threw / browser-failure envelopes keep the original diagnostic in\n * hint, message, or payload; wrapper expected strings are not used when a real\n * diagnostic is present. The original failure is always kept on detail.\n */\nexport function resolveWorkspaceFailure(failure) {\n const code = resolveWorkspaceFailureCode(failure);\n if (!failure || typeof failure !== 'object') {\n return {\n code,\n expected: undefined,\n hint: failure === undefined || failure === null ? undefined : String(failure),\n detail: { failure },\n };\n }\n const payload = failure.detail?.payload;\n const nested = payload !== null && typeof payload === 'object' ? payload : undefined;\n const nestedDetail =\n nested?.detail !== null && typeof nested?.detail === 'object' ? nested.detail : undefined;\n const expected = pickWorkspaceDiagnostic([\n nested?.expected,\n nestedDetail?.expected,\n failure.detail?.expected,\n failure.expected,\n ], { allowOpaque: false });\n const hint = pickWorkspaceDiagnostic([\n nested?.hint,\n nested?.message,\n nestedDetail?.hint,\n nestedDetail?.message,\n failure.hint,\n failure.detail?.hint,\n failure.message,\n expected,\n ]);\n return {\n code,\n expected,\n hint,\n detail: {\n failure,\n ...(nested === undefined ? {} : { cause: nested }),\n },\n };\n}\n\nexport function isWorkspaceTargetRecoveryCode(code) {\n return typeof code === 'string' && VIEW_WORKSPACE_TARGET_RECOVERY_CODES.includes(code);\n}\n\nexport function isWorkspacePageLostError(error) {\n if (!error || typeof error !== 'object') return false;\n if (isWorkspaceTargetRecoveryCode(error.code)) return true;\n if (isWorkspaceTargetRecoveryCode(error.detail?.remoteCode)) return true;\n return false;\n}\n\nexport function shouldOfferWorkspaceRecovery(error) {\n if (!error || typeof error !== 'object') return false;\n if (isWorkspaceTargetRecoveryCode(error.code)) return true;\n if (error.detail?.remoteCode && isWorkspaceTargetRecoveryCode(error.detail.remoteCode)) return true;\n if (error.code === 'view-workspace-provider-failed') {\n const text = collectFailureStrings(error).join(' ');\n return WORKSPACE_FAILURE_CODE_PATTERN.test(text)\n || /browser page to remain connected/i.test(text);\n }\n return false;\n}\n\nexport function resolveWorkspaceReopenRoot(snapshot, explicitRoot) {\n const candidate =\n typeof explicitRoot === 'string' && explicitRoot.trim() !== ''\n ? explicitRoot.trim()\n : typeof snapshot?.project?.root === 'string'\n ? snapshot.project.root.trim()\n : '';\n if (!candidate) {\n throw workspaceError(\n 'view-workspace-reopen-unavailable',\n 'a known project root to reopen',\n 'Open the project from the View owner process before reconnecting.',\n {},\n );\n }\n return candidate;\n}\n\nexport function workspaceProjectTargetUrl(snapshot) {\n const url = snapshot?.projectTarget?.url;\n return typeof url === 'string' && url.trim() !== '' ? url : undefined;\n}\n\nconst WORKSPACE_SESSION_PARAM = 'forgeaxWorkspaceSession';\n\nfunction workspaceSessionFromHref(href) {\n if (typeof href !== 'string' || href.trim() === '') return undefined;\n try {\n const session = new URL(href).searchParams.get(WORKSPACE_SESSION_PARAM);\n return session && session.trim() !== '' ? session : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * The empty shell has no headed session. A document that already carries the\n * target's forgeaxWorkspaceSession is the project page; assigning again\n * reloads it and Engine treats that navigation as a lost workspace. Compare\n * the session parameter, not the full href: encoding or parameter order may\n * differ from the snapshot URL for the same document.\n */\nexport function shouldAdoptRemoteWorkspaceProject(snapshot, locationLike) {\n if (!snapshot || snapshot.workspaceTargetLost === true) return false;\n if (typeof snapshot.project?.root !== 'string' || snapshot.project.root.trim() === '') return false;\n const url = workspaceProjectTargetUrl(snapshot);\n if (!url) return false;\n const href = typeof locationLike === 'string' ? locationLike : locationLike?.href;\n const currentSession = workspaceSessionFromHref(href);\n if (currentSession !== undefined && currentSession === workspaceSessionFromHref(url)) return false;\n return true;\n}\n\n/** Navigate only into the target's headed document. That document itself and lost targets stay put. */\nexport function adoptRemoteWorkspaceProject(snapshot, windowLike = globalThis) {\n if (!shouldAdoptRemoteWorkspaceProject(snapshot, windowLike?.location)) return snapshot;\n return navigateToWorkspaceProjectTarget(snapshot, windowLike);\n}\n\n/**\n * After project.reopen, adopt the new headed target URL when it differs from the\n * current document. No-op when navigation is unavailable (Node callers).\n */\nexport function navigateToWorkspaceProjectTarget(snapshot, windowLike = globalThis) {\n const url = workspaceProjectTargetUrl(snapshot);\n if (!url) {\n throw workspaceError(\n 'view-workspace-reopen-incomplete',\n 'the reopened project to publish a headed target URL',\n 'Retry reconnecting or restart the View owner process.',\n {},\n );\n }\n const location = windowLike?.location;\n if (!location || typeof location.assign !== 'function') return snapshot;\n const nextHref = new URL(url, location.href).href;\n if (nextHref !== location.href) navigateProjectSession(snapshot, windowLike);\n return snapshot;\n}\n\n/** @param {unknown} client\n * @param {{ root?: string, tabId?: string, window?: unknown }} options\n */\nexport async function reopenWorkspaceProject(client, {\n root,\n tabId = VIEW_WORKSPACE_TAB_ID,\n window: windowLike,\n ...options\n} = {}) {\n if (!client || typeof client.reopenProject !== 'function') {\n throw new TypeError('Workspace recovery requires a View workspace client');\n }\n const snapshot = await client.reopenProject({ root, tabId }, options);\n return navigateToWorkspaceProjectTarget(snapshot, windowLike ?? globalThis);\n}\n","/** One attachment owns placement, never the borrowed Engine node or runtime. */\nexport function borrowSurface(surface, container) {\n const parent = surface.parentNode;\n const next = surface.nextSibling;\n const attributes = ['style', 'hidden', 'aria-label', 'data-forgeax-view-target-id',\n 'data-forgeax-view-tab-id', 'data-forgeax-view-surface', 'data-forgeax-view-selected']\n .map(name => [name, surface.getAttribute?.(name)]);\n let restored = false;\n return () => {\n if (restored) return;\n restored = true;\n // An external owner may already have reclaimed the node and its styles.\n if (surface.parentNode !== container) return;\n for (const [name, value] of attributes) {\n if (value == null) surface.removeAttribute?.(name);\n else surface.setAttribute?.(name, value);\n }\n if (parent) {\n if (parent.insertBefore) parent.insertBefore(surface, next?.parentNode === parent ? next : null);\n else parent.append?.(surface);\n } else surface.remove?.();\n };\n}\n","import { reportWorkspaceCommandError } from '@forgeax/view-workspace-core/command-error';\nimport {\n VIEW_DISPLAY_TAB_ID,\n VIEW_WORKSPACE_TAB_ID,\n cloneWorkspaceValue,\n requireWorkspaceString,\n workspaceUiFingerprint,\n} from '@forgeax/view-workspace-core/contract';\nimport { createWorkspaceId } from '@forgeax/view-workspace-core/id';\nimport { reopenWorkspaceProject } from '@forgeax/view-workspace-core/workspace-recovery';\nimport { PAGE_TYPE } from './identity.mjs';\nimport { borrowSurface } from './borrowed-surface.mjs';\nimport { selectWorkspaceEditorSurfaceTarget } from '@forgeax/view-workspace-core/resource-open';\nimport { keepSurfaceInContainer, readSceneShell } from '@forgeax/view-workspace-core/adopt-surface';\nimport {\n isViewTraceEnabled,\n traceInputAttach,\n traceInputCaptureAbort,\n traceInputPointerDown,\n traceInputPointerLockExit,\n traceInputPointerMove,\n traceInputPointerUp,\n tracePresentationAttach,\n traceShellRegisterDomRoot,\n traceShellRender,\n traceShellUpdate,\n traceSyncTargetSurfaces,\n traceView,\n} from '@forgeax/view-workspace-core/view-trace';\n\nfunction sameTargetIdentity(left, right) {\n return left?.targetId === right?.targetId && left?.generation === right?.generation &&\n left?.surfaceId === right?.surfaceId && left?.leaseId === right?.leaseId;\n}\n\nfunction text(document, value) {\n const node = document.createElement('span');\n node.textContent = String(value);\n return node;\n}\n\nfunction button(document, label, onClick, { disabled = false } = {}) {\n const node = document.createElement('button');\n node.type = 'button';\n node.textContent = label;\n node.disabled = disabled;\n node.addEventListener?.('click', () => void Promise.resolve(onClick()).catch(() => {}));\n return node;\n}\n\nfunction safeError(error) {\n const message = error?.message ?? String(error);\n const hint = typeof error?.hint === 'string' ? error.hint.trim() : '';\n return hint && !message.includes(hint) ? `${message} (${hint})` : message;\n}\n\nfunction groupAssetsBySource(assets) {\n const groups = [];\n const index = new Map();\n for (const asset of assets ?? []) {\n const key = asset.sourcePath || asset.path || asset.kind || 'assets';\n let group = index.get(key);\n if (!group) {\n group = { key, assets: [] };\n index.set(key, group);\n groups.push(group);\n }\n group.assets.push(asset);\n }\n return groups;\n}\n\nfunction catalogDdcState(asset, inspection) {\n if (inspection?.guid === asset?.guid && inspection.ddc?.state) return inspection.ddc.state;\n return asset?.ddc?.state;\n}\n\nfunction catalogReceipt(asset, inspection) {\n if (inspection?.guid === asset?.guid && inspection.ddc?.receiptUrl) return inspection.ddc.receiptUrl;\n return asset?.cookReceiptUrl ?? asset?.ddc?.receiptUrl;\n}\n\n/** Viewport camera capture stays on the Editor page canvas, never a sibling tab preview. */\nexport function isViewportWorkspaceInputEvent(event, { surface, host } = {}) {\n const eventTarget = event?.target;\n if (event?.defaultPrevented || !eventTarget || typeof eventTarget.closest !== 'function') return false;\n if (eventTarget.closest('button,input,a,select,textarea,[contenteditable=\"true\"],.fx-engine-fatal-banner')) return false;\n const page = (host ?? eventTarget).closest?.('[data-forgeax-view-dock-page]');\n if (page?.getAttribute?.('aria-hidden') === 'true') return false;\n if (surface) {\n const activePage = host?.ownerDocument?.documentElement?.dataset?.forgeaxViewActivePage;\n if (activePage !== undefined && activePage !== PAGE_TYPE) return false;\n if (surface.style?.visibility === 'hidden' || surface.style?.pointerEvents === 'none') return false;\n return eventTarget === surface || surface.contains?.(eventTarget) === true;\n }\n if (!eventTarget.closest('[data-forgeax-view-mount-host=\"viewport\"]')) return false;\n return Boolean(eventTarget.closest('[data-forgeax-view-workspace=\"preview\"]'));\n}\n\n/**\n * Bind the CLI display tab to the iframe allocated by BrowserPagePlatform.\n * The platform owns that node and its browsing context; the workspace only\n * changes visibility and input affordances. In particular, this adapter never\n * appends, reorders, or removes the iframe because moving a live iframe can\n * detach the exact Engine Frame held by the carrier.\n */\nexport function createBrowserPagePresentation({ document = globalThis.document } = {}) {\n return Object.freeze({\n surfacePlacement: 'owner',\n createSurface({ target, document: suppliedDocument = document } = {}) {\n const surfaceId = target?.surfaceId;\n if (typeof surfaceId !== 'string' || surfaceId.length === 0) {\n throw new TypeError('Engine display target must expose its exact surfaceId');\n }\n const ownerDocument = suppliedDocument;\n if (ownerDocument?.querySelectorAll === undefined) return null;\n const matches = [...ownerDocument.querySelectorAll('iframe[data-forgeax-view-surface=\"engine-target\"]')].filter(\n (element) =>\n element.dataset?.forgeaxViewSurface === 'engine-target' &&\n element.dataset?.forgeaxViewTargetId === String(target.targetId) &&\n element.dataset?.forgeaxViewLeaseId === String(target.leaseId) &&\n element.dataset?.forgeaxViewGeneration === String(target.generation) &&\n element.id === surfaceId,\n );\n if (matches.length > 1) {\n throw new Error(`multiple Engine display surfaces match ${surfaceId}`);\n }\n return matches[0] ?? null;\n },\n attach({ target, element } = {}) {\n if (\n !element ||\n element.tagName?.toLowerCase?.() !== 'iframe' ||\n element.id !== target?.surfaceId ||\n element.dataset?.forgeaxViewLeaseId !== String(target?.leaseId) ||\n element.dataset?.forgeaxViewGeneration !== String(target?.generation)\n ) {\n throw new Error('Engine display surface identity does not match its target');\n }\n // Placement and lease cleanup stay with BrowserPagePlatform.\n return undefined;\n },\n });\n}\n\n/**\n * Browser-side continuous input boundary. Engine owns camera math and the\n * draft transaction; this object only samples DOM input and commits/aborts\n * through the workspace API. All event handlers consume rejected promises so\n * a blur, disconnect, or begin/finish race cannot become an unhandled error.\n */\nexport class ViewWorkspaceInputController {\n constructor({\n api,\n targetId,\n targetGeneration,\n tabId = VIEW_WORKSPACE_TAB_ID,\n interactionIdFactory = () => createWorkspaceId('interaction'),\n shouldCapture = () => true,\n onError = () => {},\n onFocusSelection = () => {},\n onSpeedChange = () => {},\n window = globalThis,\n document = globalThis.document,\n } = {}) {\n if (!api) throw new TypeError('workspace input controller requires an API client');\n this.api = api;\n this.targetId = requireWorkspaceString(targetId, 'targetId');\n this.targetGeneration = targetGeneration;\n this.tabId = tabId;\n this.interactionIdFactory = interactionIdFactory;\n if (typeof this.interactionIdFactory !== 'function') {\n throw new TypeError('workspace input controller requires an interactionIdFactory');\n }\n this.shouldCapture = shouldCapture;\n this.onError = onError;\n this.onFocusSelection = onFocusSelection;\n this.onSpeedChange = onSpeedChange;\n this.speed = 4;\n this.held = new Set();\n this.shiftHeld = false;\n this.window = window;\n this.document = document;\n this.interaction = null;\n this.pending = Promise.resolve();\n this.inputError = null;\n this.inputQueue = [];\n this.beginPromise = null;\n this.finishPromise = null;\n this.generation = 0;\n this.cancelRequested = false;\n this.disposed = false;\n this.element = null;\n this.bound = false;\n // Pointer lock is an optional browser affordance. Keep a local bit so a\n // rejected request (or a browser that never grants lock to an overlay)\n // cannot be mistaken for a lock-loss transition and abort a valid\n // pointer transaction.\n this.pointerLockEngaged = false;\n }\n\n report(error) {\n if (error === undefined || error === null) return;\n this.inputError ??= error;\n try {\n this.onError(error);\n } catch {\n // Error presentation cannot change the Engine transaction.\n }\n }\n\n async begin() {\n if (this.abortPromise) await this.abortPromise;\n if (this.finishPromise) await this.finishPromise;\n if (this.disposed) throw new Error('workspace input controller is disposed');\n if (this.interaction) return this.interaction;\n if (this.beginPromise) return this.beginPromise;\n const generation = this.generation;\n this.cancelRequested = false;\n this.beginPromise = (async () => {\n const current = await this.api.getCamera({ targetId: this.targetId, targetGeneration: this.targetGeneration, tabId: this.tabId });\n if (this.disposed || generation !== this.generation || this.cancelRequested) {\n throw new Error('workspace input begin was cancelled');\n }\n const expectedVersion = current.version;\n if (typeof expectedVersion !== 'number' || !Number.isSafeInteger(expectedVersion) || expectedVersion < 0) {\n throw new TypeError('workspace camera begin requires getCamera().version');\n }\n const interactionId = this.interactionIdFactory();\n const begun = await this.api.beginCamera({\n targetId: this.targetId, targetGeneration: this.targetGeneration,\n tabId: this.tabId,\n baseVersion: expectedVersion,\n interactionId,\n });\n // 0.1.33 begin returns { camera, version } only. Commit must use the\n // interactionId we sent and the version observed at begin.\n this.interaction = { ...begun, interactionId, baseVersion: expectedVersion };\n await this.flushInputQueue();\n if (this.cancelRequested || this.disposed || generation !== this.generation) {\n await this.api\n .abortCamera({\n targetId: this.targetId, targetGeneration: this.targetGeneration,\n tabId: this.tabId,\n interactionId,\n reason: 'input-begin-cancelled',\n })\n .catch((error) => this.report(error));\n this.clearTransaction();\n throw new Error('workspace input begin was cancelled');\n }\n return this.interaction;\n })();\n try {\n return await this.beginPromise;\n } finally {\n this.beginPromise = null;\n }\n }\n\n async flushInputQueue() {\n this.drainInputQueue();\n await this.pending;\n }\n\n enqueueUpdate(input) {\n const previous = this.inputQueue.at(-1);\n if (previous?.type === input.type && previous.mode === input.mode &&\n ['look', 'orbit', 'pan', 'dolly'].includes(input.type)) {\n for (const key of ['yaw', 'pitch', 'x', 'y', 'amount']) {\n if (input[key] !== undefined) previous[key] = (previous[key] ?? 0) + input[key];\n }\n } else if (this.inputQueue.length < 64) {\n this.inputQueue.push({ ...input });\n } else {\n this.report(new Error('Viewport input exceeded its bounded queue; gesture cancelled.'));\n void this.abort('input-overflow');\n return;\n }\n this.drainInputQueue();\n }\n\n drainInputQueue() {\n const interaction = this.interaction;\n if (!interaction || this.draining) return;\n const generation = this.generation;\n this.draining = true;\n this.pending = Promise.resolve().then(async () => {\n while (this.inputQueue.length) {\n if (\n generation !== this.generation ||\n this.cancelRequested ||\n this.disposed ||\n this.interaction !== interaction\n )\n return;\n const input = this.inputQueue.shift();\n await this.api.updateCamera({\n targetId: this.targetId, targetGeneration: this.targetGeneration,\n tabId: this.tabId,\n interactionId: interaction.interactionId,\n input,\n });\n if (generation !== this.generation || this.interaction !== interaction) return;\n }\n })\n .catch((error) => {\n if (generation !== this.generation || this.interaction !== interaction) return;\n this.inputError ??= error;\n this.report(error);\n })\n .finally(() => {\n this.draining = false;\n if (generation === this.generation && this.inputQueue.length) this.drainInputQueue();\n });\n }\n\n /** Current WASD/QE move sample; Shift multiplies speed like Unreal's fast-fly. */\n currentMoveInput() {\n const axes = [Number(this.held.has('KeyD')) - Number(this.held.has('KeyA')),\n Number(this.held.has('KeyE')) - Number(this.held.has('KeyQ')),\n Number(this.held.has('KeyS')) - Number(this.held.has('KeyW'))];\n const length = Math.hypot(...axes) || 1;\n const boost = this.shiftHeld ? 3 : 1;\n return { type: 'move', velocity: axes.map(value => (value * this.speed * boost) / length) };\n }\n\n queueInput(input) {\n if (this.disposed || this.cancelRequested) return;\n const movement = () => this.currentMoveInput();\n let motion;\n if (input.type === 'key-down' || input.type === 'key-up') {\n const code = input.code || 'Key' + String(input.key).toUpperCase();\n if (input.type === 'key-down') this.held.add(code);\n else this.held.delete(code);\n motion = movement();\n } else if (input.type === 'wheel' && input.mode === 'speed') {\n this.speed = Math.max(0.05, Math.min(1024, this.speed * Math.exp(-input.deltaY * 0.002)));\n this.onSpeedChange(this.speed);\n motion = movement();\n } else if (input.type === 'wheel' || input.mode === 'dolly') {\n motion = { type: 'dolly', amount: Math.max(-4, Math.min(4,\n (input.type === 'wheel' ? input.deltaY : input.movementY * 4) * 0.001)), distance: 5 };\n } else if (input.mode === 'pan') {\n motion = { type: 'pan', x: -(input.movementX ?? 0) * 0.002,\n y: (input.movementY ?? 0) * 0.002, distance: 5 };\n } else {\n motion = { type: input.mode === 'orbit' ? 'orbit' : 'look',\n yaw: -(input.movementX ?? 0) * 0.003, pitch: -(input.movementY ?? 0) * 0.003,\n pitchLimit: Math.PI / 2 - 0.01, distance: 5 };\n }\n this.enqueueUpdate(motion);\n }\n\n clearTransaction() {\n this.held.clear();\n this.interaction = null;\n this.pending = Promise.resolve();\n this.inputQueue = [];\n this.inputError = null;\n }\n\n async finish() {\n if (this.finishPromise) return this.finishPromise;\n const generation = this.generation;\n this.finishPromise = (async () => {\n try {\n if (this.beginPromise) await this.beginPromise;\n if (!this.interaction) return;\n await this.flushInputQueue();\n await this.pending;\n if (this.cancelRequested || this.disposed || generation !== this.generation) {\n await this.abort('input-finish-cancelled');\n return;\n }\n if (this.inputError) {\n const error = this.inputError;\n await this.abort('input-update-failed');\n throw error;\n }\n const interaction = this.interaction;\n if (this.cancelRequested || this.disposed || generation !== this.generation) {\n await this.abort('input-finish-cancelled');\n return;\n }\n try {\n await this.api.commitCamera({\n targetId: this.targetId, targetGeneration: this.targetGeneration,\n tabId: this.tabId,\n interactionId: interaction.interactionId,\n operationId: this.interactionIdFactory(),\n expectedVersion: interaction.baseVersion,\n });\n } catch (error) {\n await this.api\n .abortCamera({\n targetId: this.targetId, targetGeneration: this.targetGeneration,\n tabId: this.tabId,\n interactionId: interaction.interactionId,\n reason: 'commit-failed',\n })\n .catch(() => {});\n throw error;\n }\n } finally {\n this.clearTransaction();\n }\n })();\n try {\n return await this.finishPromise;\n } finally {\n this.finishPromise = null;\n }\n }\n\n async abort(reason = 'input-abort') {\n if (this.abortPromise) return this.abortPromise;\n ++this.generation;\n this.cancelRequested = true;\n const begin = this.beginPromise;\n this.abortPromise = (async () => {\n if (begin) await begin.catch(() => {});\n await this.pending;\n const interaction = this.interaction;\n try {\n if (interaction) {\n await this.api.abortCamera({\n targetId: this.targetId, targetGeneration: this.targetGeneration,\n tabId: this.tabId,\n interactionId: interaction.interactionId,\n reason,\n });\n }\n } catch (error) {\n this.report(error);\n } finally {\n this.clearTransaction();\n }\n })();\n try { await this.abortPromise; }\n finally { this.abortPromise = null; }\n }\n\n async requestPointerLock() {\n if (typeof this.element?.requestPointerLock !== 'function') return;\n try {\n await Promise.resolve(this.element.requestPointerLock());\n } catch {\n // Pointer lock is an optional browser affordance. A browser can reject\n // it for an iframe, automation event, or missing user activation while\n // ordinary pointer/keyboard samples remain valid. Do not turn that\n // presentation limitation into an Engine transaction failure.\n }\n }\n\n trySetPointerCapture(element, pointerId) {\n if (pointerId === undefined || typeof element?.setPointerCapture !== 'function') return;\n try {\n element.setPointerCapture(pointerId);\n } catch {\n // Pointer capture is best-effort. The API interaction remains the\n // authority and can continue without this browser-local optimization.\n }\n }\n\n tryReleasePointerCapture(element, pointerId) {\n if (pointerId === undefined || typeof element?.releasePointerCapture !== 'function') return;\n try {\n element.releasePointerCapture(pointerId);\n } catch {\n // The pointer may already have been cancelled or released by the\n // browser; there is no Engine state to repair here.\n }\n }\n\n attach(element) {\n if (!element || this.bound) return () => {};\n this.element = element;\n this.bound = true;\n this.onSpeedChange(this.speed);\n const previousTabIndex = element.getAttribute?.('tabindex');\n if (previousTabIndex == null) element.setAttribute?.('tabindex', '0');\n traceInputAttach(element, { targetId: this.targetId, tabId: this.tabId });\n let gesture = null;\n let selectionRequest;\n let clickStart;\n let consumedClick = false;\n const held = this.held;\n const stop = () => {\n selectionRequest?.abort();\n gesture = null;\n held.clear();\n this.shiftHeld = false;\n if (this.document?.pointerLockElement === element) this.document.exitPointerLock?.();\n void this.finish().catch((error) => this.report(error));\n };\n const down = (event) => {\n if (this.shouldCapture(event)) element.focus?.();\n const accepted = !this.finishPromise && !gesture &&\n (event.button === 2 || event.button === 1 || (event.button === 0 && event.altKey)) &&\n this.shouldCapture(event);\n consumedClick = event.defaultPrevented === true || accepted;\n clickStart = { x: event.clientX, y: event.clientY };\n traceInputPointerDown(event, { accepted, element });\n if (accepted) {\n selectionRequest?.abort();\n event.preventDefault?.();\n gesture = {\n button: event.button,\n mode: event.button === 1 ? 'pan' : event.altKey ? (event.button === 0 ? 'orbit' : 'dolly') : 'look',\n };\n element.focus?.();\n void this.begin().catch((error) => this.report(error));\n this.trySetPointerCapture(element, event?.pointerId);\n void this.requestPointerLock();\n traceView('input', 'capture-engaged', {\n pointerId: event?.pointerId,\n pointerLockElement: globalThis.document?.pointerLockElement?.tagName,\n });\n }\n };\n const menu = (event) => {\n if (!this.shouldCapture(event)) return;\n event.preventDefault?.();\n };\n const move = (event) => {\n if (clickStart && Math.hypot(event.clientX - clickStart.x, event.clientY - clickStart.y) > 4) consumedClick = true;\n if (!gesture || (!this.interaction && !this.beginPromise)) return;\n traceInputPointerMove(event, {\n queued: true,\n queueDepth: this.inputQueue.length,\n inFlight: this.draining ? 1 : 0,\n });\n this.queueInput({\n type: 'pointer-move',\n mode: gesture.mode,\n movementX: Number(event.movementX ?? 0),\n movementY: Number(event.movementY ?? 0),\n });\n };\n const up = (event) => {\n if (!gesture || event.button !== gesture.button) return;\n this.tryReleasePointerCapture(element, event?.pointerId);\n traceInputPointerUp(event, { element });\n stop();\n };\n const keydown = (event) => {\n if (event.key === 'Escape' && gesture) { stop(); return; }\n if (!this.shouldCapture(event) || event.repeat) return;\n if (!gesture && String(event.key).toLowerCase() === 'f') {\n event.preventDefault?.();\n void Promise.resolve().then(this.onFocusSelection).catch(error => this.report(error));\n return;\n }\n // Unreal-style: Shift only boosts speed while navigation keys are held.\n if (event.key === 'Shift') {\n this.shiftHeld = true;\n if (held.size) this.enqueueUpdate(this.currentMoveInput());\n return;\n }\n // WASD/QE move with or without the RMB look gesture.\n if (!['w', 'a', 's', 'd', 'q', 'e'].includes(String(event.key ?? '').toLowerCase())) return;\n event.preventDefault?.();\n held.add(event.code || event.key);\n if (!gesture) void this.begin().catch((error) => this.report(error));\n this.queueInput({ type: 'key-down', key: String(event.key ?? ''), code: String(event.code ?? '') });\n };\n const keyup = (event) => {\n if (event.key === 'Shift') {\n this.shiftHeld = false;\n if (held.size) this.enqueueUpdate(this.currentMoveInput());\n return;\n }\n if (!held.delete(event.code || event.key)) return;\n if (!this.interaction && !this.beginPromise) return;\n event.preventDefault?.();\n this.queueInput({ type: 'key-up', key: String(event.key ?? ''), code: String(event.code ?? '') });\n // Bare keys own no pointer gesture: commit the camera transaction once\n // every navigation key is released instead of leaking an open draft.\n if (!gesture && held.size === 0) void this.finish().catch((error) => this.report(error));\n };\n const wheel = (event) => {\n if (!this.shouldCapture(event) || this.finishPromise) return;\n selectionRequest?.abort();\n event.preventDefault?.();\n void this.begin().catch((error) => this.report(error));\n this.queueInput({ type: 'wheel', mode: gesture?.mode === 'look' ? 'speed' : 'dolly',\n deltaY: Number(event.deltaY ?? 0) * (event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? 800 : 1) });\n if (!gesture) void this.finish().catch((error) => this.report(error));\n };\n const abort = (reason = 'input-focus-lost') => {\n if (reason !== 'pointerlock-exit') traceInputCaptureAbort(reason);\n else traceView('input', 'abort', { reason });\n stop();\n };\n const pointerLockChange = () => {\n const locked = this.document?.pointerLockElement === element;\n traceView('input', 'pointerlockchange', {\n locked,\n pointerLockElement: this.document?.pointerLockElement?.tagName,\n engaged: this.pointerLockEngaged,\n });\n if (locked) this.pointerLockEngaged = true;\n if (this.pointerLockEngaged && !locked) {\n this.pointerLockEngaged = false;\n traceInputPointerLockExit({ locked, element });\n abort('pointerlock-exit');\n }\n };\n const click = event => {\n const consumed = consumedClick;\n consumedClick = false;\n const dragged = clickStart && Math.hypot(event.clientX - clickStart.x, event.clientY - clickStart.y) > 4;\n clickStart = undefined;\n if (consumed || dragged) return;\n if (gesture || event.button !== 0 || event.altKey || !this.shouldCapture(event)) return;\n const canvas = element.tagName === 'CANVAS' ? element : element.querySelector?.('canvas');\n if (!canvas || event.target !== canvas) return;\n const rect = canvas.getBoundingClientRect();\n if (!(rect.width > 0 && rect.height > 0 && canvas.width > 0 && canvas.height > 0)) return;\n selectionRequest?.abort();\n selectionRequest = new AbortController();\n // The shared client reports failures; a failed query never enters the camera transaction.\n void this.api.call('scene.pick', {\n targetId: this.targetId, targetGeneration: this.targetGeneration, tabId: this.tabId,\n x: (event.clientX - rect.left) * canvas.width / rect.width,\n y: (event.clientY - rect.top) * canvas.height / rect.height,\n }, { signal: selectionRequest.signal }).catch(() => {});\n };\n element.addEventListener?.('click', click);\n element.addEventListener?.('pointerdown', down);\n element.addEventListener?.('pointermove', move);\n element.addEventListener?.('pointerup', up);\n element.addEventListener?.('wheel', wheel, { passive: false });\n element.addEventListener?.('contextmenu', menu);\n const onPointerCancel = () => abort('pointercancel');\n const onWindowBlur = () => abort('window-blur');\n const onFocusOut = (event) => { if (!element.contains?.(event.relatedTarget)) abort('focusout'); };\n const onVisibilityChange = () => { if (this.document?.hidden) abort('visibilitychange'); };\n element.addEventListener?.('pointercancel', onPointerCancel);\n element.addEventListener?.('keydown', keydown);\n this.window?.addEventListener?.('keyup', keyup);\n this.window?.addEventListener?.('pointerup', up);\n this.window?.addEventListener?.('blur', onWindowBlur);\n this.window?.addEventListener?.('focusout', onFocusOut);\n this.document?.addEventListener?.('visibilitychange', onVisibilityChange);\n this.document?.addEventListener?.('pointerlockchange', pointerLockChange);\n const remove = (reason = 'input-detached') => {\n if (previousTabIndex == null) element.removeAttribute?.('tabindex');\n selectionRequest?.abort();\n element.removeEventListener?.('click', click);\n element.removeEventListener?.('pointerdown', down);\n element.removeEventListener?.('pointermove', move);\n element.removeEventListener?.('pointerup', up);\n element.removeEventListener?.('wheel', wheel);\n element.removeEventListener?.('contextmenu', menu);\n element.removeEventListener?.('pointercancel', onPointerCancel);\n element.removeEventListener?.('keydown', keydown);\n this.window?.removeEventListener?.('keyup', keyup);\n this.window?.removeEventListener?.('pointerup', up);\n this.window?.removeEventListener?.('blur', onWindowBlur);\n this.window?.removeEventListener?.('focusout', onFocusOut);\n this.document?.removeEventListener?.('visibilitychange', onVisibilityChange);\n this.document?.removeEventListener?.('pointerlockchange', pointerLockChange);\n this.pointerLockEngaged = false;\n if (reason !== 'input-disposed') {\n traceInputCaptureAbort(reason);\n void this.abort(reason).catch((error) => this.report(error));\n }\n this.element = null;\n this.bound = false;\n };\n remove.handlesAbort = true;\n return remove;\n }\n\n dispose() {\n this.disposed = true;\n return this.abort('input-disposed');\n }\n}\n\n/** Stable exact Engine surfaces; all state and controls use the workspace API.\n * Without a presentation adapter, retain an inert surface. Editor Play owns its\n * one iframe in a separate plugin; an arbitrary target URL never creates one.\n */\nexport class ViewWorkspaceShell {\n constructor({\n document = globalThis.document,\n window = globalThis,\n mountId = 'forgeax-view-workspace',\n element,\n api,\n presentation,\n resourceBrowser = false,\n presentationOnly = false,\n inspectorPanel = true,\n onNavigationSpeed = () => {},\n inputControllerFactory = (options) => new ViewWorkspaceInputController(options),\n } = {}) {\n this.document = document;\n this.window = window;\n this.mountId = mountId;\n this.api = api;\n this.presentation = presentation;\n this.resourceBrowser = resourceBrowser === true;\n this.presentationOnly = presentationOnly;\n this.inspectorPanel = inspectorPanel !== false;\n this.inputControllerFactory = inputControllerFactory;\n this.onNavigationSpeed = onNavigationSpeed;\n this.state = {\n selectedTabId: VIEW_WORKSPACE_TAB_ID,\n tabs: [],\n project: null,\n projectTarget: null,\n preview: null,\n assets: [],\n inspection: null,\n inspectorError: null,\n error: null,\n projectOpening: false,\n projectReconnecting: false,\n workspaceTargetLost: false,\n };\n this.element = null;\n this.rootElement = null;\n this.tabsElement = null;\n this.projectElement = null;\n this.assetsElement = null;\n this.workbenchElement = null;\n this.inspectorElement = null;\n this.inspectorInfoElement = null;\n this.inspectorFieldsElement = null;\n this.inspectorActionsElement = null;\n this.previewElement = null;\n this.previewInfoElement = null;\n this.errorElement = null;\n this.targetContainer = null;\n this.removeSubscription = undefined;\n this.removeDisconnect = undefined;\n this.removeInput = undefined;\n this.inputController = undefined;\n this.inputTargetId = null;\n this.surfaceByTab = new Map();\n this.presentationByTab = new Map();\n this.presentationPending = new Map();\n this.presentationQueueByTab = new Map();\n this.presentationGenerationByTab = new Map();\n this.surface = null;\n this.surfaceTargetId = null;\n this.presentedTargetId = null;\n this.removeSurfacePresentation = undefined;\n this.renderFingerprint = '';\n this.disposed = false;\n this.stopSceneAdopt = undefined;\n if (document?.createElement) {\n // Prefer the caller-supplied node. Dockview/ShadowRoot mounts are not\n // visible to document.getElementById, and falling back to a new body\n // section would orphan the exact Engine surface outside the View shell.\n this.element = element\n ?? document.getElementById?.(mountId)\n ?? document.createElement('section');\n this.element.id ||= mountId;\n this.element.dataset.forgeaxView = 'workspace';\n if (!this.element.parentNode) document.body?.append?.(this.element);\n this.render();\n }\n if (api) this.connect(api);\n }\n\n connect(api) {\n this.removeSubscription?.();\n this.removeDisconnect?.();\n this.api = api;\n this.disposed = false;\n this.removeSubscription = api.subscribe?.((state) => this.update(state));\n this.removeDisconnect = api.onDisconnect?.((error) => {\n this.detachInput('resident-disconnect');\n this.fail(error);\n });\n void Promise.resolve()\n .then(() => api.getState?.())\n .then((state) => this.update(state))\n .then(() => (this.state.project ? this.refreshAssets() : undefined))\n .catch((error) => this.fail(error));\n return this;\n }\n\n update(snapshot = {}) {\n if (this.disposed) return this.snapshot();\n const next = cloneWorkspaceValue(snapshot);\n if (\n next.selectedTabId !== undefined &&\n next.selectedTabId !== this.state.selectedTabId\n ) {\n this.detachInput('tab-selection');\n }\n this.state = {\n ...this.state,\n ...next,\n assets: Array.isArray(next.assets) ? next.assets : next.assets === null ? [] : this.state.assets,\n inspectorError: next.inspection ? null : this.state.inspectorError,\n projectOpening: next.project ? false : this.state.projectOpening,\n projectReconnecting: next.workspaceTargetLost === false ? false : this.state.projectReconnecting,\n workspaceTargetLost: next.workspaceTargetLost === true,\n error: next.project && !next.workspaceTargetLost ? null : this.state.error,\n };\n traceShellUpdate({\n selectedTabId: this.state.selectedTabId,\n cameraVersion: this.state.preview?.cameraVersion,\n previewTargetId: this.state.preview?.target?.targetId,\n });\n const fingerprint = workspaceUiFingerprint(this.state);\n this.render({ chromeChanged: fingerprint !== this.renderFingerprint });\n this.renderFingerprint = fingerprint;\n return this.snapshot();\n }\n\n snapshot() {\n return cloneWorkspaceValue(this.state);\n }\n\n fail(error) {\n this.state = {\n ...this.state,\n error: safeError(error),\n projectOpening: false,\n projectReconnecting: false,\n };\n if (this.presentationOnly) {\n reportWorkspaceCommandError(error, { operation: 'workspace' });\n }\n this.render();\n this.renderFingerprint = workspaceUiFingerprint(this.state);\n return this.snapshot();\n }\n\n async refreshAssets() {\n if (!this.api || !this.state.project) return;\n try {\n const result = await this.api.listAssets(this.state.project.id, { tabId: VIEW_WORKSPACE_TAB_ID });\n this.state.assets = result.assets ?? [];\n this.state.error = null;\n const fingerprint = workspaceUiFingerprint(this.state);\n this.render({ chromeChanged: fingerprint !== this.renderFingerprint });\n this.renderFingerprint = fingerprint;\n } catch (error) {\n this.fail(error);\n }\n }\n\n async openProject(root) {\n if (this.disposed) return this.snapshot();\n if (!this.api) {\n return this.fail(new Error('View workspace API is not connected'));\n }\n if (this.state.projectOpening) return this.snapshot();\n const path = typeof root === 'string' ? root.trim() : '';\n if (!path) {\n return this.fail(new Error('Project root is required'));\n }\n this.state = { ...this.state, error: null, projectOpening: true };\n this.render();\n try {\n const opened = await this.api.openProject(path, { tabId: VIEW_WORKSPACE_TAB_ID });\n if (opened?.project) this.update(opened);\n await this.refreshAssets();\n return this.snapshot();\n } catch (error) {\n return this.fail(error);\n } finally {\n this.state = { ...this.state, projectOpening: false };\n this.render();\n }\n }\n\n async reconnectProject() {\n if (this.disposed) return this.snapshot();\n if (!this.api) {\n return this.fail(new Error('View workspace API is not connected'));\n }\n if (this.state.projectReconnecting) return this.snapshot();\n this.state = { ...this.state, error: null, projectReconnecting: true };\n this.render();\n try {\n const opened = await reopenWorkspaceProject(this.api, { window: this.window });\n if (opened?.project) this.update(opened);\n await this.refreshAssets();\n return this.snapshot();\n } catch (error) {\n return this.fail(error);\n } finally {\n this.state = { ...this.state, projectReconnecting: false };\n this.render();\n }\n }\n\n async openAsset(guid) {\n try {\n await this.api.openAsset(guid, { projectId: this.state.project?.id, tabId: VIEW_WORKSPACE_TAB_ID });\n } catch (error) {\n this.fail(error);\n }\n }\n\n async selectAsset(guid) {\n if (!this.api || !this.state.project) return;\n try {\n const inspected = await this.api.inspectAsset(guid, {\n projectId: this.state.project.id,\n tabId: VIEW_WORKSPACE_TAB_ID,\n });\n this.state.inspection = inspected.inspection ?? this.state.inspection;\n this.state.inspectorError = null;\n } catch (error) {\n this.state.inspectorError = safeError(error);\n this.render();\n }\n const asset =\n this.state.assets.find((candidate) => candidate.guid === guid) ?? this.state.inspection?.asset;\n if (this.resourceBrowser) {\n this.render();\n return;\n }\n if (asset?.previewable === false || this.state.preview?.asset?.guid === guid) {\n this.render();\n return;\n }\n await this.openAsset(guid);\n }\n\n async cookSelected(mode = 'rebuild') {\n const guid = this.state.inspection?.guid ?? this.state.preview?.asset?.guid;\n if (!this.api || !this.state.project || !guid) return;\n try {\n const call =\n mode === 'cold-cook' ? this.api.coldCookAssetSource : this.api.rebuildAssetSource;\n if (typeof call !== 'function') {\n throw new Error(`Engine ${mode === 'cold-cook' ? 'asset-source.cold-cook' : 'asset-source.rebuild'} is unavailable`);\n }\n await call.call(this.api, guid, {\n projectId: this.state.project.id,\n tabId: VIEW_WORKSPACE_TAB_ID,\n expectedRevision: this.state.inspection?.revision,\n });\n this.state.inspectorError = null;\n } catch (error) {\n this.state.inspectorError = safeError(error);\n this.render();\n throw error;\n }\n }\n\n async closeProject() {\n try {\n await this.api.closeProject(this.state.project?.id, { tabId: VIEW_WORKSPACE_TAB_ID });\n } catch (error) {\n this.fail(error);\n }\n }\n\n async selectTab(tabId) {\n this.detachInput('tab-selection');\n try {\n await this.api.selectTab(tabId);\n } catch (error) {\n this.fail(error);\n }\n }\n\n async closePreview() {\n await this.inputController?.abort('preview-close');\n try {\n await this.api.closePreview({ targetId: this.state.preview?.target?.targetId, targetGeneration: this.state.preview?.target?.generation, tabId: VIEW_WORKSPACE_TAB_ID });\n } catch (error) {\n this.fail(error);\n }\n }\n\n replaceSurface(target) {\n this.ensureSurface(VIEW_WORKSPACE_TAB_ID, target);\n this.setActiveSurface();\n }\n\n attachSurfacePresentation(target) {\n const entry = this.surfaceByTab.get(VIEW_WORKSPACE_TAB_ID);\n this.attachTargetPresentation(VIEW_WORKSPACE_TAB_ID, target, entry?.surface);\n }\n\n targetForTab(tabId) {\n if (tabId === VIEW_WORKSPACE_TAB_ID) return selectWorkspaceEditorSurfaceTarget(this.state);\n const tab = (this.state.tabs ?? []).find((candidate) => candidate.tabId === tabId);\n if (!tab) return null;\n if (tab.target) {\n return {\n ...tab.target,\n targetId: String(tab.target.targetId ?? tab.targetId ?? ''),\n headed: tab.target.headed !== false,\n width: tab.target.width ?? tab.width ?? 1280,\n height: tab.target.height ?? tab.height ?? 720,\n };\n }\n if (tab.targetId === undefined || tab.targetId === null) return null;\n return {\n targetId: String(tab.targetId),\n headed: true,\n width: tab.width ?? 1280,\n height: tab.height ?? 720,\n };\n }\n\n presentationForTab(tabId) {\n const candidate = tabId === VIEW_DISPLAY_TAB_ID ? this.presentation?.display : this.presentation?.workspace;\n if (\n candidate &&\n (typeof candidate.attach === 'function' || typeof candidate.createSurface === 'function')\n )\n return candidate;\n return this.presentation;\n }\n\n presentationOwnsPlacement(presentation) {\n return presentation?.surfacePlacement === 'owner';\n }\n\n createPresentedSurface(tabId, target, presentationOverride) {\n const presentation = presentationOverride ?? this.presentationForTab(tabId);\n if (typeof presentation?.createSurface !== 'function') return null;\n const surface = presentation.createSurface({\n tabId,\n target,\n document: this.document,\n });\n if (surface === null || surface === undefined) return null;\n if (typeof surface !== 'object') {\n throw new TypeError('View target presentation createSurface must return a DOM element');\n }\n return surface;\n }\n\n ensureSurface(tabId, target) {\n const targetId = target?.targetId === undefined ? null : String(target.targetId);\n const current = this.surfaceByTab.get(tabId);\n const presentation = this.presentationForTab(tabId);\n const surfacePlacement = this.presentationOwnsPlacement(presentation) ? 'owner' : 'shell';\n const exactIdentityMatches = sameTargetIdentity(current?.target, target);\n if (!targetId) {\n if (current) {\n // Keep an exact Engine surface as a short-lived tombstone while its\n // serialized detach is draining. A fast stop -> start can otherwise\n // acquire the same host surface before the old cleanup has restored\n // its origin, causing the old cleanup to delete the new origin map.\n // The next exact target reuses this entry and marks it for a queued\n // reacquisition after the old cleanup; inert surfaces can\n // still be discarded immediately.\n if (current.exactSurface) {\n if (current.targetId !== null) {\n current.targetId = null;\n current.target = null;\n current.reacquire = true;\n void this.detachTargetPresentation(tabId).catch((error) => this.fail(error));\n }\n } else {\n void this.detachTargetPresentation(tabId).catch((error) => this.fail(error));\n this.surfaceByTab.delete(tabId);\n }\n }\n return null;\n }\n if (\n current &&\n current.targetId === targetId &&\n (!current.exactSurface || exactIdentityMatches)\n ) {\n current.target = target;\n if (!current.exactSurface) {\n const width = target?.width ?? current.surface.width ?? 1280;\n const height = target?.height ?? current.surface.height ?? 720;\n if (current.surface.width !== width) current.surface.width = width;\n if (current.surface.height !== height) current.surface.height = height;\n }\n return current.surface;\n }\n // A host-provided exact surface is the Engine-owned presentation for this\n // tab, not a per-target canvas allocation. Keep its DOM identity stable\n // when the target identity is refreshed; the serialized presentation\n // lifecycle below still releases the old target before attaching the new\n // one. This also avoids calling createSurface while an earlier attachment\n // may still own the host surface.\n if (\n current &&\n current.exactSurface\n ) {\n current.targetId = targetId;\n current.target = target;\n current.reacquire = true;\n current.surfacePlacement = surfacePlacement;\n return current.surface;\n }\n if (current) {\n void this.detachTargetPresentation(tabId).catch((error) => this.fail(error));\n }\n if (!this.document?.createElement) return null;\n const presentedSurface = this.createPresentedSurface(tabId, target, presentation);\n if ((surfacePlacement === 'owner' || typeof presentation?.createSurface === 'function') && presentedSurface === null) {\n // The display Fiber owns the only valid surface. During bootstrap it\n // may not exist yet; keep this tab surface-less and retry on a later\n // state/render transition instead of fabricating a second runtime node.\n this.surfaceByTab.delete(tabId);\n return null;\n }\n const surface = presentedSurface ?? this.document.createElement('canvas');\n const exactSurface = presentedSurface !== null;\n const resolvedSurfacePlacement = exactSurface && surfacePlacement === 'owner' ? 'owner' : 'shell';\n if (!exactSurface) {\n this.markSurface(surface, tabId, targetId);\n surface.width = target?.width ?? 1280;\n surface.height = target?.height ?? 720;\n }\n this.surfaceByTab.set(tabId, {\n targetId,\n target,\n exactSurface,\n surfacePlacement: resolvedSurfacePlacement,\n reacquire: false,\n surface,\n });\n return surface;\n }\n\n setActiveSurface() {\n const selected = this.surfaceByTab.get(this.state.selectedTabId);\n const active = selected?.targetId ? selected : null;\n this.surface = active?.surface ?? null;\n this.surfaceTargetId = active?.targetId ?? null;\n this.presentedTargetId = active?.targetId ?? null;\n }\n\n attachTargetPresentation(tabId, target, surface) {\n const presentation = this.presentationForTab(tabId);\n if (!target || !surface || (!presentation?.attach && !presentation?.createSurface)) return;\n const current = this.presentationByTab.get(tabId);\n if (current && sameTargetIdentity(current.target, target) && current.surface === surface &&\n current.generation === this.presentationGenerationByTab.get(tabId)) return;\n tracePresentationAttach(tabId, String(target.targetId), surface);\n const pending = this.presentationPending.get(tabId);\n if (pending && sameTargetIdentity(pending.target, target) && pending.surface === surface &&\n pending.generation === this.presentationGenerationByTab.get(tabId)) return;\n const generation = (this.presentationGenerationByTab.get(tabId) ?? 0) + 1;\n this.presentationGenerationByTab.set(tabId, generation);\n const task = this.enqueuePresentation(tabId, async () => {\n if (this.disposed || generation !== this.presentationGenerationByTab.get(tabId)) {\n await this.releaseUnattachedPresentation({ presentation, target, surface, tabId });\n return;\n }\n\n const previous = this.presentationByTab.get(tabId);\n if (previous) await this.releasePresentationEntry(tabId, previous);\n if (this.disposed || generation !== this.presentationGenerationByTab.get(tabId)) {\n await this.releaseUnattachedPresentation({ presentation, target, surface, tabId });\n return;\n }\n\n let attachSurface = surface;\n const surfaceEntry = this.surfaceByTab.get(tabId);\n if (surfaceEntry?.surface === surface && surfaceEntry.exactSurface && surfaceEntry.reacquire) {\n const refreshed = this.createPresentedSurface(tabId, target, presentation);\n if (refreshed !== null) {\n attachSurface = refreshed;\n surfaceEntry.surface = refreshed;\n surfaceEntry.reacquire = false;\n } else {\n // Do not reuse a released node when Engine cannot resolve the new identity.\n this.surfaceByTab.delete(tabId);\n this.setActiveSurface();\n return;\n }\n }\n // A previous Engine cleanup may have restored an exact surface to its\n // original parent. Adopt it only after that cleanup has completed, so a\n // stale cleanup can never move the new attachment out from underneath\n // the current tab.\n const restore = surfaceEntry?.exactSurface && surfaceEntry.surfacePlacement !== 'owner'\n ? borrowSurface(attachSurface, this.targetContainer) : undefined;\n this.markSurface(attachSurface, tabId, target.targetId);\n this.adoptPresentationSurface(attachSurface, {\n external: surfaceEntry?.surfacePlacement === 'owner',\n });\n\n const entry = {\n target,\n targetId: String(target.targetId),\n surface: attachSurface,\n presentation,\n surfacePlacement: surfaceEntry?.surfacePlacement ?? 'shell',\n generation,\n remove: undefined,\n restore,\n };\n this.presentationByTab.set(tabId, entry);\n try {\n const remove = await presentation.attach?.({ target, element: attachSurface, tabId });\n if (typeof remove === 'function') entry.remove = remove;\n if (\n this.presentationByTab.get(tabId) !== entry ||\n entry.generation !== this.presentationGenerationByTab.get(tabId) ||\n this.disposed\n ) {\n await this.releasePresentationEntry(tabId, entry);\n return;\n }\n entry.ready = true;\n this.setActiveSurface();\n this.render({ chromeChanged: false });\n } catch (error) {\n await this.releasePresentationEntry(tabId, entry).catch(() => {});\n // Keep this identity failed until an explicit target transition. Error\n // rendering must not recursively retry and re-adopt the returned node.\n entry.remove = () => {};\n entry.ready = false;\n this.presentationByTab.set(tabId, entry);\n throw error;\n }\n });\n const pendingEntry = { target, generation, surface, task };\n this.presentationPending.set(tabId, pendingEntry);\n void task.then(\n () => {\n if (this.presentationPending.get(tabId) === pendingEntry) this.presentationPending.delete(tabId);\n },\n (error) => {\n if (this.presentationPending.get(tabId) === pendingEntry) this.presentationPending.delete(tabId);\n this.fail(error);\n },\n );\n }\n\n markSurface(surface, tabId, targetId) {\n surface.dataset.forgeaxViewTargetId = String(targetId);\n surface.dataset.forgeaxViewTabId = tabId;\n surface.dataset.forgeaxViewSurface = tabId === VIEW_DISPLAY_TAB_ID ? 'engine-target' : 'engine-canvas';\n surface.setAttribute?.('aria-label', `Engine target ${targetId}`);\n }\n\n enqueuePresentation(tabId, operation) {\n const previous = this.presentationQueueByTab.get(tabId) ?? Promise.resolve();\n const task = previous.catch(() => {}).then(operation);\n this.presentationQueueByTab.set(tabId, task);\n void task.then(\n () => {\n if (this.presentationQueueByTab.get(tabId) === task) this.presentationQueueByTab.delete(tabId);\n },\n () => {\n if (this.presentationQueueByTab.get(tabId) === task) this.presentationQueueByTab.delete(tabId);\n },\n );\n return task;\n }\n\n async runPresentationCleanup(remove) {\n if (typeof remove === 'function') await Promise.resolve(remove());\n }\n\n async releaseUnattachedPresentation({ presentation, target, surface, tabId }) {\n if (this.presentationByTab.get(tabId)?.surface === surface) return;\n if (typeof presentation?.detach === 'function') {\n await Promise.resolve(presentation.detach({ target, element: surface, tabId })).catch(() => {});\n return;\n }\n if (typeof presentation?.attach === 'function') {\n const remove = await presentation.attach({ target, element: surface, tabId });\n await this.runPresentationCleanup(remove);\n }\n }\n\n adoptPresentationSurface(surface, { external = false } = {}) {\n if (external || !surface || !this.targetContainer) return;\n if (surface.parentNode !== this.targetContainer) this.targetContainer.append?.(surface);\n }\n\n async releasePresentationEntry(tabId, entry) {\n if (this.presentationByTab.get(tabId) === entry) this.presentationByTab.delete(tabId);\n entry.restore?.();\n let failure;\n if (entry.remove) {\n try {\n await this.runPresentationCleanup(entry.remove);\n } catch (error) {\n failure = error;\n }\n }\n if (!entry.remove || failure !== undefined) {\n try {\n await Promise.resolve(\n entry.presentation?.detach?.({ target: entry.target, element: entry.surface, tabId }),\n );\n } catch (error) {\n failure ??= error;\n }\n }\n if (failure !== undefined) throw failure;\n }\n\n async detachTargetPresentation(tabId, { invalidate = true } = {}) {\n if (invalidate) {\n this.presentationGenerationByTab.set(\n tabId,\n (this.presentationGenerationByTab.get(tabId) ?? 0) + 1,\n );\n }\n return this.enqueuePresentation(tabId, async () => {\n const entry = this.presentationByTab.get(tabId);\n if (entry) await this.releasePresentationEntry(tabId, entry);\n });\n }\n\n ensureDom() {\n if (!this.element || !this.document) return false;\n if (this.rootElement) return true;\n\n const root = this.document.createElement('div');\n root.dataset.forgeaxViewWorkspace = 'root';\n this.rootElement = root;\n\n this.tabsElement = this.document.createElement('nav');\n this.tabsElement.dataset.forgeaxViewWorkspace = 'tabs';\n this.projectElement = this.document.createElement('div');\n this.projectElement.dataset.forgeaxViewWorkspace = 'project';\n this.workbenchElement = this.document.createElement('div');\n this.workbenchElement.dataset.forgeaxViewWorkspace = 'workbench';\n const rail = this.document.createElement('div');\n rail.dataset.forgeaxViewWorkspace = 'rail';\n this.assetsElement = this.document.createElement('ul');\n this.assetsElement.dataset.forgeaxViewWorkspace = 'assets';\n rail.append?.(this.assetsElement);\n this.previewElement = this.document.createElement('div');\n this.previewElement.dataset.forgeaxViewWorkspace = 'preview';\n this.previewInfoElement = this.document.createElement('div');\n this.previewInfoElement.dataset.forgeaxViewWorkspace = 'preview-info';\n this.targetContainer = this.document.createElement('div');\n this.targetContainer.dataset.forgeaxViewWorkspace = 'targets';\n if (this.targetContainer.style) this.targetContainer.style.position = 'relative';\n this.previewElement.append?.(...(this.presentationOnly ? [] : [this.previewInfoElement]), this.targetContainer);\n this.inspectorElement = this.document.createElement('aside');\n this.inspectorElement.dataset.forgeaxViewWorkspace = 'inspector';\n this.inspectorInfoElement = this.document.createElement('div');\n this.inspectorInfoElement.dataset.forgeaxViewWorkspace = 'inspector-info';\n this.inspectorFieldsElement = this.document.createElement('div');\n this.inspectorFieldsElement.dataset.forgeaxViewWorkspace = 'inspector-fields';\n this.inspectorActionsElement = this.document.createElement('div');\n this.inspectorActionsElement.dataset.forgeaxViewWorkspace = 'inspector-actions';\n this.inspectorElement.append?.(\n this.inspectorInfoElement,\n this.inspectorFieldsElement,\n this.inspectorActionsElement,\n );\n this.workbenchElement.append?.(\n ...(this.presentationOnly ? [] : [rail]),\n this.previewElement,\n ...(this.inspectorPanel ? [this.inspectorElement] : []),\n );\n if (!this.presentationOnly) {\n this.errorElement = this.document.createElement('div');\n this.errorElement.dataset.forgeaxViewWorkspace = 'error';\n this.errorElement.setAttribute?.('role', 'alert');\n }\n root.append?.(\n ...(this.presentationOnly ? [] : [this.tabsElement, this.projectElement]),\n this.workbenchElement,\n ...(this.errorElement ? [this.errorElement] : []),\n );\n if (root.parentNode !== this.element) this.element.append?.(root);\n this.stopSceneAdopt = keepSurfaceInContainer({\n document: this.document,\n getContainer: () => (this.disposed ? null : this.targetContainer),\n getSurface: () => readSceneShell(this.document),\n onPlace: (surface) => {\n if (!surface?.style) return;\n Object.assign(surface.style, {\n width: '100%',\n height: '100%',\n maxWidth: '100%',\n maxHeight: '100%',\n position: 'relative',\n transform: 'none',\n overflow: 'hidden',\n });\n },\n });\n traceShellRegisterDomRoot(root);\n return true;\n }\n\n syncTargetSurfaces() {\n const surfaces = this.targetContainer;\n if (!surfaces) return;\n let removed = 0;\n let reordered = 0;\n const desired = [];\n for (const tabId of [VIEW_DISPLAY_TAB_ID, VIEW_WORKSPACE_TAB_ID]) {\n const entry = this.surfaceByTab.get(tabId);\n // An exact surface with no target is a detach-draining tombstone. It\n // must not be presented or reattached until the next target adopts it.\n if (!entry || !entry.targetId || !entry.target) continue;\n this.attachTargetPresentation(tabId, entry.target, entry.surface);\n const attached = this.presentationByTab.get(tabId);\n // Render cannot move an exact node ahead of the serialized cleanup.\n if (entry.exactSurface && (!attached?.ready || !sameTargetIdentity(attached.target, entry.target))) continue;\n const selected = this.state.selectedTabId === tabId &&\n !(tabId === VIEW_WORKSPACE_TAB_ID && this.state.targetBinding === 'play');\n // The borrowed CLI carrier stays active across tab changes. Workspace\n // previews can stop background rendering when their presentation is hidden.\n if (entry.exactSurface && tabId === VIEW_DISPLAY_TAB_ID) {\n if (entry.surface.hidden !== false) entry.surface.hidden = false;\n if (entry.surface.style) {\n const visibility = selected ? 'visible' : 'hidden';\n const pointerEvents = selected ? 'auto' : 'none';\n if (entry.surface.style.visibility !== visibility) entry.surface.style.visibility = visibility;\n if (entry.surface.style.pointerEvents !== pointerEvents) entry.surface.style.pointerEvents = pointerEvents;\n }\n } else {\n const hidden = !selected;\n if (entry.surface.hidden !== hidden) entry.surface.hidden = hidden;\n if (entry.surface.style) {\n const display = selected ? '' : 'none';\n if (entry.surface.style.display !== display) entry.surface.style.display = display;\n }\n }\n const selectedMark = selected ? 'true' : 'false';\n if (entry.surface.dataset.forgeaxViewSelected !== selectedMark) {\n entry.surface.dataset.forgeaxViewSelected = selectedMark;\n }\n if (entry.surfacePlacement !== 'owner') desired.push(entry.surface);\n }\n\n for (const child of [...(surfaces.children ?? [])]) {\n if (!desired.includes(child)) {\n if (child?.id === 'app-shell') continue;\n if ([...this.presentationByTab.values()].some(entry => entry.surface === child)) continue;\n child.remove?.();\n removed += 1;\n }\n }\n for (let index = 0; index < desired.length; index += 1) {\n const surface = desired[index];\n if (surfaces.children?.[index] === surface) continue;\n reordered += 1;\n const before = surfaces.children?.[index] ?? null;\n if (surfaces.insertBefore) surfaces.insertBefore(surface, before);\n else surfaces.append?.(surface);\n }\n traceSyncTargetSurfaces({ removed, reordered, desired: desired.length });\n }\n\n render({ chromeChanged = true } = {}) {\n if (this.disposed || !this.element || !this.document) return;\n const renderStarted = isViewTraceEnabled() ? performance.now() : 0;\n const workspaceTarget = this.targetForTab(VIEW_WORKSPACE_TAB_ID);\n const displayTarget = this.targetForTab(VIEW_DISPLAY_TAB_ID);\n this.ensureSurface(VIEW_WORKSPACE_TAB_ID, workspaceTarget);\n this.ensureSurface(VIEW_DISPLAY_TAB_ID, displayTarget);\n this.setActiveSurface();\n const nextTargetId = workspaceTarget?.targetId ?? null;\n const workspaceSurfaceEntry = this.surfaceByTab.get(VIEW_WORKSPACE_TAB_ID);\n if (nextTargetId !== this.inputTargetId || workspaceTarget?.generation !== this.inputTargetGeneration ||\n workspaceSurfaceEntry?.surface !== this.inputSurface) {\n this.detachInput('target-replaced');\n this.removeInput?.();\n this.removeInput = undefined;\n this.inputController = undefined;\n this.inputTargetId = nextTargetId;\n this.inputTargetGeneration = workspaceTarget?.generation;\n this.inputSurface = workspaceSurfaceEntry?.surface;\n }\n if (!this.ensureDom()) return;\n let domReplaceChildren = 0;\n const tabs = this.tabsElement;\n const project = this.projectElement;\n const assets = this.assetsElement;\n const previewInfo = this.previewInfoElement;\n const inspectorInfo = this.inspectorInfoElement;\n const inspectorFields = this.inspectorFieldsElement;\n const inspectorActions = this.inspectorActionsElement;\n const error = this.errorElement;\n if (chromeChanged) {\n if (tabs?.replaceChildren) {\n tabs.replaceChildren();\n domReplaceChildren += 1;\n }\n for (const tab of this.state.tabs ?? []) {\n tabs.append?.(\n button(this.document, `${tab.kind}: ${tab.tabId}`, () => this.selectTab(tab.tabId), {\n disabled: tab.selected === true,\n }),\n );\n }\n if (project?.replaceChildren) {\n project.replaceChildren();\n domReplaceChildren += 1;\n }\n if (this.state.project) {\n project.append?.(text(this.document, `Project: ${this.state.project.name ?? this.state.project.id}`));\n project.append?.(button(this.document, 'Refresh assets', () => this.refreshAssets()));\n project.append?.(button(this.document, 'Close project', () => this.closeProject()));\n } else {\n project.append?.(\n text(this.document, 'Project opens from the View owner process.'),\n );\n }\n if (this.state.workspaceTargetLost && this.state.project?.root) {\n const reconnectLabel = this.state.projectReconnecting ? 'Reconnecting project…' : 'Reconnect project';\n project.append?.(\n button(this.document, reconnectLabel, () => this.reconnectProject(), {\n disabled: this.state.projectReconnecting === true,\n }),\n );\n }\n if (assets?.replaceChildren) {\n assets.replaceChildren();\n domReplaceChildren += 1;\n }\n for (const group of groupAssetsBySource(this.state.assets)) {\n const item = this.document.createElement('li');\n item.dataset.forgeaxViewWorkspace = 'asset-group';\n item.dataset.sourcePath = group.key;\n item.append?.(text(this.document, group.key));\n const members = this.document.createElement('ul');\n for (const asset of group.assets) {\n const member = this.document.createElement('li');\n member.dataset.forgeaxViewWorkspace = 'asset';\n member.dataset.guid = asset.guid;\n member.dataset.kind = asset.kind;\n if (asset.sourceKind) member.dataset.sourceKind = asset.sourceKind;\n const ddcState = catalogDdcState(asset, this.state.inspection);\n const receipt = catalogReceipt(asset, this.state.inspection);\n if (ddcState) member.dataset.ddcState = ddcState;\n if (receipt) member.dataset.cookReceiptUrl = receipt;\n const selected = this.state.inspection?.guid === asset.guid;\n const label = `${asset.name ?? asset.guid} (${asset.kind}${ddcState ? ` · ${ddcState}` : ''})`;\n member.append?.(\n button(this.document, label, () => this.selectAsset(asset.guid), {\n disabled: selected,\n }),\n );\n members.append?.(member);\n }\n item.append?.(members);\n assets.append?.(item);\n }\n if (previewInfo?.replaceChildren) {\n previewInfo.replaceChildren();\n domReplaceChildren += 1;\n }\n if (this.state.preview) {\n previewInfo.append?.(\n text(this.document, `Target: ${this.state.preview.asset?.name ?? this.state.preview.asset?.guid ?? 'Game'}`),\n ...(this.state.preview.asset ? [button(this.document, 'Close preview', () => this.closePreview())] : []),\n );\n } else {\n previewInfo.append?.(text(this.document, 'No asset preview open'));\n }\n if (inspectorInfo?.replaceChildren) {\n inspectorInfo.replaceChildren();\n domReplaceChildren += 1;\n }\n if (inspectorFields?.replaceChildren) {\n inspectorFields.replaceChildren();\n domReplaceChildren += 1;\n }\n if (inspectorActions?.replaceChildren) {\n inspectorActions.replaceChildren();\n domReplaceChildren += 1;\n }\n const inspection = this.state.inspection;\n if (this.state.inspectorError) {\n inspectorInfo?.append?.(text(this.document, `Inspector: ${this.state.inspectorError}`));\n } else if (inspection) {\n inspectorInfo?.append?.(\n text(\n this.document,\n `${inspection.asset?.name ?? inspection.guid} · ${inspection.source?.kind ?? inspection.asset?.sourceKind ?? inspection.asset?.kind} · ${inspection.source?.path ?? inspection.asset?.sourcePath ?? ''}${inspection.revision ? ` · rev ${inspection.revision.slice(0, 12)}` : ''}${inspection.ddc?.receiptUrl ? ` · ${inspection.ddc.receiptUrl}` : ''}`,\n ),\n );\n const meta = inspection.meta;\n if (meta) {\n const identity = this.document.createElement('div');\n identity.dataset.forgeaxViewWorkspace = 'pack-meta';\n identity.append?.(\n text(\n this.document,\n `${meta.packageId ?? ''} · ${meta.importer ?? ''} · ${meta.source ?? ''}`,\n ),\n );\n inspectorFields?.append?.(identity);\n for (const sub of meta.subAssets ?? []) {\n const row = this.document.createElement('div');\n row.dataset.forgeaxViewWorkspace = 'sub-asset';\n row.dataset.guid = sub.guid;\n row.dataset.kind = sub.kind;\n row.append?.(text(this.document, `${sub.name ?? sub.sourceKey} (${sub.kind})`));\n inspectorFields?.append?.(row);\n }\n }\n inspectorActions?.append?.(\n button(this.document, 'Rebuild', () => this.cookSelected('rebuild')),\n button(this.document, 'Cold-cook', () => this.cookSelected('cold-cook')),\n );\n } else {\n inspectorInfo?.append?.(text(this.document, 'Select an asset to inspect Engine catalog and pack meta'));\n }\n }\n this.syncTargetSurfaces();\n const nextError = this.state.error ? `Error: ${this.state.error}` : '';\n const nextHidden = !this.state.error;\n if (error) {\n if (error.hidden !== nextHidden) error.hidden = nextHidden;\n if (error.textContent !== nextError) error.textContent = nextError;\n }\n const workspaceSurface = this.surfaceByTab.get(VIEW_WORKSPACE_TAB_ID)?.surface;\n if (\n nextTargetId &&\n workspaceSurface &&\n this.api &&\n this.removeInput === undefined &&\n (!workspaceSurfaceEntry?.exactSurface ||\n (this.presentationByTab.get(VIEW_WORKSPACE_TAB_ID)?.ready &&\n sameTargetIdentity(this.presentationByTab.get(VIEW_WORKSPACE_TAB_ID).target, workspaceTarget))) &&\n this.state.selectedTabId === VIEW_WORKSPACE_TAB_ID\n ) {\n this.inputController = this.inputControllerFactory({\n api: this.api,\n targetId: nextTargetId,\n targetGeneration: workspaceTarget?.generation,\n tabId: VIEW_WORKSPACE_TAB_ID,\n window: this.window,\n document: this.document,\n onError: (error) => this.fail(error),\n onSpeedChange: this.onNavigationSpeed,\n onFocusSelection: () => {\n const selected = this.state.sceneSelection;\n if (selected?.primary?.entityId) return this.api.call('entity.focus', {\n entityId: selected.primary.entityId, targetId: nextTargetId, targetGeneration: workspaceTarget?.generation,\n });\n },\n shouldCapture: (event) => isViewportWorkspaceInputEvent(event, { surface: workspaceSurface, host: this.element }),\n });\n this.removeInput = this.inputController.attach(workspaceSurface);\n }\n traceShellRender({\n durationMs: renderStarted ? Math.round((performance.now() - renderStarted) * 100) / 100 : undefined,\n workspaceSurface: workspaceSurface?.dataset?.forgeaxViewSurface,\n exactSurface: this.surfaceByTab.get(VIEW_WORKSPACE_TAB_ID)?.exactSurface,\n inputBound: this.removeInput !== undefined,\n presentationOnly: this.presentationOnly,\n domReplaceChildren,\n tabCount: (this.state.tabs ?? []).length,\n assetCount: (this.state.assets ?? []).length,\n });\n }\n\n /** Detach local DOM listeners before a tab/target/disconnect transition. */\n detachInput(reason = 'input-detached') {\n const controller = this.inputController;\n const remove = this.removeInput;\n this.removeInput = undefined;\n this.inputController = undefined;\n if (remove) {\n remove(reason);\n }\n if (!remove?.handlesAbort) {\n void Promise.resolve(controller?.abort?.(reason)).catch((error) => this.fail(error));\n }\n }\n\n dispose() {\n if (this.disposal) return this.disposal;\n this.disposed = true;\n this.stopSceneAdopt?.();\n this.stopSceneAdopt = undefined;\n // Parent panels may disappear before asynchronous input/adapter cleanup.\n // Pending tasks see disposed and cannot adopt another borrowed node.\n for (const entry of this.presentationByTab.values()) entry.restore?.();\n this.disposal = this.finishDisposal();\n return this.disposal;\n }\n\n async finishDisposal() {\n const removeInput = this.removeInput;\n const inputController = this.inputController;\n this.removeInput = undefined;\n removeInput?.('input-disposed');\n const inputDisposal = inputController?.dispose?.().catch(() => {});\n this.inputController = undefined;\n this.removeSubscription?.();\n this.removeSubscription = undefined;\n this.removeDisconnect?.();\n this.removeDisconnect = undefined;\n const presentationTabs = new Set([\n ...this.surfaceByTab.keys(),\n ...this.presentationByTab.keys(),\n ...this.presentationPending.keys(),\n ...this.presentationQueueByTab.keys(),\n ]);\n for (const tabId of presentationTabs) {\n this.presentationGenerationByTab.set(\n tabId,\n (this.presentationGenerationByTab.get(tabId) ?? 0) + 1,\n );\n }\n await Promise.all([\n inputDisposal,\n ...[...presentationTabs].map((tabId) => this.detachTargetPresentation(tabId, { invalidate: false }).catch(() => {})),\n ]);\n this.presentationPending.clear();\n this.presentationQueueByTab.clear();\n this.presentationGenerationByTab.clear();\n this.surfaceByTab.clear();\n this.rootElement = null;\n this.targetContainer = null;\n this.removeSurfacePresentation = undefined;\n this.inputTargetId = null;\n this.surfaceTargetId = null;\n this.presentedTargetId = null;\n this.surface = null;\n this.element?.remove?.();\n this.element = null;\n }\n}\n\nexport { VIEW_DISPLAY_TAB_ID, VIEW_WORKSPACE_TAB_ID };\n","import { PAGE_TYPE } from './identity.mjs';\n\n/**\n * Engine's browser input backend listens on window. When the Editor page is\n * not the active page tab, drop those samples so a sibling preview cannot\n * drive the viewport camera or game.\n */\nexport function attachViewportPageInputGate({ element, input, pageType = PAGE_TYPE, document } = {}) {\n const editor = input?.editor;\n if (!element || typeof editor?.setInputAllowed !== 'function') return () => {};\n const ownerDocument = document ?? element.ownerDocument ?? globalThis.document;\n const sync = () => {\n const page = typeof element.closest === 'function'\n ? element.closest('[data-forgeax-view-dock-page]')\n : null;\n const pageHidden = page?.getAttribute?.('aria-hidden') === 'true';\n const activePage = ownerDocument?.documentElement?.dataset?.forgeaxViewActivePage;\n const active = !pageHidden && (activePage === undefined || activePage === pageType);\n editor.setInputAllowed(active);\n };\n const observer = typeof MutationObserver === 'function'\n ? new MutationObserver(sync)\n : undefined;\n const root = ownerDocument?.documentElement;\n try {\n observer?.observe(root, {\n attributes: true,\n attributeFilter: ['data-forgeax-view-active-page', 'aria-hidden'],\n subtree: true,\n });\n } catch {\n observer?.disconnect();\n }\n sync();\n return () => {\n observer?.disconnect();\n editor.setInputAllowed(true);\n };\n}\n","import { createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\n\n/** Presentation commands use the same target API as the CLI and object panels. */\nexport function mountPlayToolbar({ document, element, client }) {\n const toolbar = document.createElement('div');\n toolbar.setAttribute('role', 'toolbar');\n toolbar.setAttribute('aria-label', 'Editor execution');\n Object.assign(toolbar.style, { display: 'flex', gap: '6px', padding: '6px', alignItems: 'center', flexShrink: '0' });\n const surface = document.createElement('div');\n Object.assign(surface.style, { position: 'relative', flex: '1', minHeight: '0' });\n Object.assign(element.style, { display: 'flex', flexDirection: 'column', height: '100%' });\n element.append(toolbar, surface);\n let state;\n let navigationSpeed = 4;\n let errorText = '';\n let disposed = false;\n let playRequest;\n const pending = new Set();\n const buttons = [];\n const status = document.createElement('span');\n status.title = 'WASD/QE: move · Shift: boost · RMB drag: look / fly · RMB + wheel: speed · MMB: pan · Alt + drag: orbit/pan/dolly · F: focus · Esc: release';\n status.setAttribute('role', 'status');\n status.style.color = 'var(--fx-color-text-secondary)';\n // Always-visible navigation hint in the viewport corner; pointer-events stay\n // off so it never intercepts camera input.\n const navHint = document.createElement('div');\n navHint.textContent = 'WASD/QE move · Shift boost · RMB look/fly · wheel speed · F focus';\n Object.assign(navHint.style, {\n position: 'absolute', right: '8px', bottom: '6px', zIndex: '1',\n fontSize: '11px', lineHeight: '1.4', pointerEvents: 'none', userSelect: 'none',\n color: 'var(--fx-color-text-secondary)', opacity: '0.75',\n textShadow: '0 1px 2px var(--fx-color-background, rgba(0,0,0,0.5))',\n });\n surface.append(navHint);\n const args = () => ({ targetId: state.play.target.targetId, targetGeneration: state.play.target.generation });\n const control = () => state?.targetBinding === 'play' ? state?.preview?.camera?.control : undefined;\n const running = () => state?.play?.phase === 'running' && state?.targetBinding === 'play';\n const add = (label, run, available) => {\n const button = document.createElement('button');\n button.textContent = label;\n button.type = 'button';\n button.className = 'fx-button fx-button--compact';\n button.setAttribute('data-action', `editor.${label.toLowerCase()}`);\n button.addEventListener('click', async () => {\n pending.add(label); errorText = ''; render();\n try { await run(); if (!disposed) state = await client.getState(); }\n catch (error) { if (!disposed) errorText = error.hint ?? error.message; }\n finally { pending.delete(label); if (!disposed) render(); }\n });\n buttons.push({ button, label, available }); toolbar.append(button);\n };\n add('Play', async () => {\n const controller = new AbortController();\n playRequest = controller;\n try {\n const options = { signal: controller.signal };\n const opened = await client.call('play.start', { projectId: state.project.id }, options);\n controller.signal.throwIfAborted();\n state = opened;\n render();\n const target = { targetId: opened.play.target.targetId, targetGeneration: opened.play.target.generation };\n await client.call('play.ready', target, options);\n await client.call('camera.get', target, options);\n } catch (error) {\n if (!controller.signal.aborted) throw error;\n } finally {\n if (playRequest === controller) playRequest = undefined;\n }\n }, () => !!state?.project && !state?.play);\n add('Stop', async () => {\n playRequest?.abort();\n if (state?.play) await client.call('play.stop', args());\n }, () => !!state?.play || pending.has('Play'));\n add('Eject', () => client.call('target.control', { ...args(), mode: 'observer' }), () => running() && control() !== 'observer');\n add('Possess', () => client.call('target.control', { ...args(), mode: 'player' }), () => running() && control() === 'observer');\n add('Editor', () => client.call('target.select', { targetId: state.editorPreview.target.targetId }), () => !!state?.editorPreview && state?.targetBinding === 'play');\n add('Game', async () => {\n await client.call('target.select', { targetId: state.play.target.targetId });\n await client.call('camera.get', args());\n }, () => !!state?.play && state?.targetBinding !== 'play');\n toolbar.append(status);\n const render = () => {\n for (const { button, label, available } of buttons) {\n const disabled = pending.has(label) || (pending.size > 0 && label !== 'Stop') || !available();\n if (button.disabled !== disabled) button.disabled = disabled;\n }\n const target = state?.targetBinding ?? 'editor';\n if (surface.dataset.forgeaxToolTarget !== target) surface.dataset.forgeaxToolTarget = target;\n let nextStatus = errorText || (state?.play\n ? `${state.targetBinding === 'play' ? 'Game' : 'Editor'} tools · ${state.play.phase}${control() === 'observer' ? ' · Free camera' : ''}`\n : pending.has('Play') ? 'Preparing Play…' : 'Editor tools');\n if (!errorText && state?.targetBinding !== 'play')\n nextStatus += ' · Speed ' + navigationSpeed.toFixed(2);\n if (status.textContent !== nextStatus) status.textContent = nextStatus;\n };\n const reader = createWorkspaceStateReader(client);\n const unsubscribe = reader.subscribe(() => { if (!disposed) { state = reader.getSnapshot(); render(); } });\n render();\n return { surface,\n setNavigationSpeed(speed) { navigationSpeed = speed; if (!disposed) render(); },\n dispose() { disposed = true; playRequest?.abort(); unsubscribe(); toolbar.remove(); surface.remove(); } };\n}\n","/** Fit the borrowed Editor container without a transformed or cross-tree overlay. */\nexport function fitEditorSurface(surface) {\n const previous = surface.getAttribute?.('style');\n Object.assign(surface.style, {\n width: '100%', height: '100%', maxWidth: '100%', maxHeight: '100%',\n position: 'relative', transform: 'none', overflow: 'hidden',\n });\n return () => {\n if (previous == null) surface.removeAttribute?.('style');\n else surface.setAttribute?.('style', previous);\n };\n}\n","import { createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\n\n/** Browser resources live with the workspace connection, independently of viewport panels. */\nexport const viewPlayPresentationPlugin = {\n name: 'forgeax.view.service.play-presentation.frontend',\n inject: ['viewOperationClient'],\n provide: ['viewPlayPresentation'],\n apply(ctx, { document = globalThis.document } = {}) {\n const client = ctx.get('viewOperationClient');\n if (!document?.body) {\n ctx.provide('viewPlayPresentation', { attach: () => () => {} });\n return;\n }\n let frame;\n let targetId;\n let anchor;\n let state;\n let disposed = false;\n const place = () => {\n if (!frame) return;\n const rect = anchor?.getBoundingClientRect();\n const visible = state?.targetBinding === 'play' && rect?.width > 0 && rect?.height > 0;\n const dpr = Math.max(1, document.defaultView?.devicePixelRatio ?? 1);\n const width = state.play.target.width / dpr;\n const height = state.play.target.height / dpr;\n const scale = visible ? Math.min(rect.width / width, rect.height / height) : 1;\n const next = {\n visibility: visible ? 'visible' : 'hidden',\n pointerEvents: visible ? 'auto' : 'none',\n left: `${(rect?.left ?? 0) + (visible ? (rect.width - width * scale) / 2 : 0)}px`,\n top: `${(rect?.top ?? 0) + (visible ? (rect.height - height * scale) / 2 : 0)}px`,\n width: `${width}px`,\n height: `${height}px`,\n transformOrigin: 'top left',\n transform: `scale(${scale})`,\n };\n const style = frame.style;\n if (\n style.visibility === next.visibility &&\n style.pointerEvents === next.pointerEvents &&\n style.left === next.left &&\n style.top === next.top &&\n style.width === next.width &&\n style.height === next.height &&\n style.transform === next.transform\n ) return;\n Object.assign(style, next);\n };\n const refresh = next => {\n if (disposed) return;\n state = next;\n const target = state?.play?.target;\n if (target?.targetId !== targetId) {\n frame?.remove();\n frame = undefined;\n targetId = target?.targetId;\n if (target?.url) {\n frame = document.createElement('iframe');\n frame.title = 'Editor Play';\n frame.dataset.forgeaxEditorPlay = targetId;\n frame.allow = 'autoplay; fullscreen';\n Object.assign(frame.style, { position: 'fixed', border: '0', zIndex: '2' });\n frame.src = target.url;\n document.body.append(frame);\n }\n }\n place();\n };\n const observer = typeof ResizeObserver === 'function' ? new ResizeObserver(place) : undefined;\n const win = document.defaultView;\n win?.addEventListener('resize', place);\n win?.addEventListener('scroll', place, true);\n const reader = createWorkspaceStateReader(client);\n const unsubscribe = reader.subscribe(() => refresh(reader.getSnapshot()));\n ctx.provide('viewPlayPresentation', {\n attach(element) {\n if (anchor) observer?.unobserve(anchor);\n anchor = element;\n observer?.observe(element);\n place();\n return () => {\n if (anchor !== element) return;\n observer?.unobserve(element);\n anchor = undefined;\n place();\n };\n },\n });\n ctx.effect(() => () => {\n disposed = true;\n unsubscribe();\n observer?.disconnect();\n win?.removeEventListener('resize', place);\n win?.removeEventListener('scroll', place, true);\n frame?.remove();\n });\n },\n};\n","const ENGINE_FATAL_ID = 'forgeax-fatal';\nconst BANNER_CLASS = 'fx-engine-fatal-banner';\nconst MESSAGE_CLASS = 'fx-engine-fatal-banner__message';\nconst ACTIONS_CLASS = 'fx-engine-fatal-banner__actions';\n\nfunction fatalElement(document) {\n if (!document) return null;\n return document.getElementById?.(ENGINE_FATAL_ID)\n ?? document.querySelector?.(`#${ENGINE_FATAL_ID}`)\n ?? null;\n}\n\nfunction resolveHost(host) {\n return typeof host === 'function' ? host() : host;\n}\n\n/** Canvas box: #app-shell wraps #app. Fall back to the View targets cell. */\nfunction canvasHost(document, fallback) {\n const canvas = document.querySelector?.('.fx-view-viewport-surface #app')\n ?? document.querySelector?.('#app');\n if (canvas?.parentElement) return canvas.parentElement;\n return document.querySelector?.('.fx-view-viewport-surface [data-forgeax-view-workspace=\"targets\"]')\n ?? resolveHost(fallback);\n}\n\nfunction readFatalText(notice) {\n return typeof notice?.textContent === 'string' ? notice.textContent.trim() : '';\n}\n\n/** Engine's generated overlay has no event. show() sets #forgeax-fatal text and inline display:grid. */\nfunction isEngineFatalShown(notice) {\n return notice?.style?.display === 'grid' && readFatalText(notice) !== '';\n}\n\nfunction button(document, label, ariaLabel) {\n const node = document.createElement('button');\n node.type = 'button';\n node.className = 'fx-button fx-button--compact fx-button--quiet';\n node.textContent = label;\n node.setAttribute('aria-label', ariaLabel);\n return node;\n}\n\nfunction createBanner(document, { onCopy, onClose }) {\n const banner = document.createElement('div');\n banner.className = `${BANNER_CLASS} fx-ui`;\n banner.setAttribute('role', 'alert');\n banner.hidden = true;\n const message = document.createElement('pre');\n message.className = MESSAGE_CLASS;\n const actions = document.createElement('div');\n actions.className = ACTIONS_CLASS;\n const copy = button(document, 'Copy error', 'Copy the error reason');\n const close = button(document, 'Close', 'Dismiss the error banner');\n copy.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n onCopy(message.textContent?.trim() ?? '', copy);\n });\n close.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n });\n actions.append(copy, close);\n banner.append(message, actions);\n return { banner, message, copy };\n}\n\nfunction placeBanner(banner, host) {\n if (!host || banner.parentNode === host) return;\n host.append?.(banner);\n}\n\n/**\n * Engine does not publish a fatal event. This watches the generated overlay\n * node: id=forgeax-fatal, inline style.display=grid, non-empty textContent.\n * The banner is View DOM, absolutely positioned on the canvas box.\n */\nexport function attachEngineFatalBanner({\n document = globalThis.document,\n host,\n} = {}) {\n if (!document?.createElement) return () => {};\n const { banner, message, copy } = createBanner(document, {\n onCopy(text, button) {\n if (!text || typeof navigator?.clipboard?.writeText !== 'function') return;\n void navigator.clipboard.writeText(text).then(() => {\n button.textContent = 'Copied';\n setTimeout(() => {\n if (button.isConnected) button.textContent = 'Copy error';\n }, 2000);\n }).catch(() => {});\n },\n onClose() {\n // Restore Engine's initial hidden overlay. Keep the node and its text;\n // show() looks it up by id and writes display:grid again.\n fatalElement(document)?.style?.removeProperty?.('display');\n banner.hidden = true;\n },\n });\n\n const sync = () => {\n placeBanner(banner, canvasHost(document, host));\n const notice = fatalElement(document);\n const text = readFatalText(notice);\n if (!isEngineFatalShown(notice)) {\n banner.hidden = true;\n return;\n }\n if (message.textContent !== text) message.textContent = text;\n if (copy.textContent !== 'Copy error') copy.textContent = 'Copy error';\n banner.hidden = false;\n };\n\n if (typeof MutationObserver !== 'function') {\n sync();\n return () => banner.remove?.();\n }\n\n const noticeObserver = new MutationObserver(sync);\n let observed;\n const watchNotice = () => {\n const notice = fatalElement(document);\n if (!notice || notice === observed) {\n sync();\n return;\n }\n observed = notice;\n noticeObserver.observe(notice, {\n attributes: true,\n attributeFilter: ['style'],\n childList: true,\n subtree: true,\n characterData: true,\n });\n sync();\n };\n\n watchNotice();\n const root = document.documentElement ?? document.body;\n const rootObserver = root ? new MutationObserver(watchNotice) : undefined;\n rootObserver?.observe(root, { childList: true, subtree: true });\n return () => {\n noticeObserver.disconnect();\n rootObserver?.disconnect();\n banner.remove?.();\n };\n}\n","import { readEnginePresentation } from '@forgeax/view-workspace-core/engine-presentation';\nimport { createBrowserPagePresentation, ViewWorkspaceShell } from './workspace-shell.mjs';\nimport { PAGE_TYPE, PANEL_CLOSABLE, PANEL_LAYOUT, FRONTEND_PLUGIN_ID, SLOT, TITLE_I18N_KEY } from './identity.mjs';\nimport { attachViewportRenderResizeSync } from './render-resize-sync.mjs';\nimport { attachViewportPageInputGate } from './page-input-gate.mjs';\nimport { mountPlayToolbar } from './play-toolbar.mjs';\nimport { fitEditorSurface } from './editor-surface.mjs';\nimport { viewPlayPresentationPlugin } from './play-presentation.mjs';\nimport { attachEngineFatalBanner } from './engine-fatal-banner.mjs';\n\nfunction claimViewportPanel(panelHost) {\n return panelHost.claim({\n id: SLOT, pageType: PAGE_TYPE, titleKey: TITLE_I18N_KEY,\n activity: { labelKey: TITLE_I18N_KEY, icon: 'box' }, layout: PANEL_LAYOUT,\n closable: PANEL_CLOSABLE,\n dockTitleHidden: true,\n });\n}\n\nfunction liveWorkspacePresentation(ctx, config, { api, document }) {\n const read = () => readEnginePresentation(config, ctx);\n return new Proxy({}, {\n get(_, prop) {\n if (prop === 'surfacePlacement') return 'shell';\n const workspace = read();\n if (prop === 'attach') {\n return async (input) => {\n const remove = await workspace?.attach?.(input);\n const surface = input.element;\n if (!surface?.style || !surface.parentElement) return remove;\n const onContextMenu = (event) => {\n event.preventDefault();\n };\n surface.addEventListener?.('contextmenu', onContextMenu);\n const restoreFit = fitEditorSurface(surface);\n const detachResize = attachViewportRenderResizeSync({\n api,\n surface,\n target: input.target,\n });\n return async () => {\n detachResize();\n surface.removeEventListener?.('contextmenu', onContextMenu);\n restoreFit();\n await remove?.();\n };\n };\n }\n if (prop === 'createSurface') {\n if (typeof workspace?.createSurface === 'function') return workspace.createSurface;\n return (input) => (input?.document ?? document)?.getElementById?.('app-shell') ?? null;\n }\n return workspace?.[prop];\n },\n });\n}\n\nconst viewportSurfacePlugin = {\n name: FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient', 'viewPlayPresentation'],\n provide: ['viewWorkspaceShell'],\n async apply(ctx, config = {}) {\n const document = config.document ?? globalThis.document;\n const api = ctx.get('viewOperationClient');\n const element = config.viewportSurface;\n if (!element || !document?.createElement) return;\n const workspace = readEnginePresentation(config, ctx);\n if (workspace && !ctx.get('engineWorkspacePresentation', false)) {\n ctx.provide('engineWorkspacePresentation', workspace);\n }\n const presentation = {\n workspace: liveWorkspacePresentation(ctx, config, { api, document }),\n display: createBrowserPagePresentation({ document }),\n };\n let shell;\n let play;\n try {\n play = mountPlayToolbar({ document, element, client: api });\n const mainSurface = document.createElement('div');\n Object.assign(mainSurface.style, {\n flex: '1',\n minWidth: '0',\n minHeight: '0',\n width: '100%',\n height: '100%',\n position: 'relative',\n });\n Object.assign(play.surface.style, { display: 'flex' });\n play.surface.append(mainSurface);\n ctx.effect(() => ctx.get('viewPlayPresentation').attach(mainSurface));\n shell = new ViewWorkspaceShell({ document, element: mainSurface, mountId: element.id,\n api, presentation,\n resourceBrowser: false, inspectorPanel: false, presentationOnly: true,\n onNavigationSpeed: speed => play.setNavigationSpeed(speed),\n });\n ctx.provide('viewWorkspaceShell', shell);\n ctx.effect(() => attachEngineFatalBanner({ document, host: mainSurface }));\n ctx.effect(() => attachViewportPageInputGate({\n element,\n input: ctx.get('engineWorkspaceInput', false),\n pageType: PAGE_TYPE,\n document,\n }));\n } catch (error) {\n await shell?.dispose(); play?.dispose(); throw error;\n }\n ctx.effect(() => async () => { await shell?.dispose(); play?.dispose(); });\n },\n};\n\nconst viewViewportFrontendPlugin = {\n name: FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient', 'viewScenePage'],\n async apply(ctx, config = {}) {\n const panelHost = config.panelHost ?? ctx.get?.('panelHost', false);\n if (!panelHost) return;\n const unclaim = claimViewportPanel(panelHost);\n ctx.effect(() => unclaim);\n // Play/Engine providers suspend only the canvas inside this fill slot.\n // The dock is claimed with the other editor panels as soon as the page exists.\n const document = config.document ?? globalThis.document;\n if (!document?.createElement) return;\n const element = document.createElement('div');\n element.id = config.workspace?.mountId ?? 'forgeax-view-workspace';\n element.className = 'fx-view-viewport-surface';\n await panelHost.waitForSlot(SLOT);\n const unmount = panelHost.mount(SLOT, element);\n ctx.effect(() => () => unmount?.());\n await ctx.plugin({\n ...viewportSurfacePlugin,\n name: `${FRONTEND_PLUGIN_ID}.surface`,\n }, { ...config, viewportSurface: element });\n },\n};\n\nexport { viewViewportFrontendPlugin, viewPlayPresentationPlugin };\nexport default viewViewportFrontendPlugin;\n","import { createHostWebSocketClient } from '@forgeax/engine-host/transport';\nimport { createViewWorkspaceClient, workspaceBrowserEndpoint } from './client.mjs';\nimport { createProjectSession } from './project-session.mjs';\nimport { logResourceOpen, observeWorkspaceOpenRequests } from './resource-open.mjs';\nimport { initViewTraceFromEnvironment, wrapViewWorkspaceClient } from './view-trace.mjs';\n\nexport const viewWorkspaceCoreFrontendPlugin = {\n name: 'forgeax.view.service.workspace-client.frontend',\n provide: ['viewOperationClient'],\n async apply(ctx, config = {}) {\n ctx.effect(initViewTraceFromEnvironment);\n const lifetime = new AbortController();\n // Cordis emits removal before waiting for an asynchronous apply to settle.\n // Cancel pending I/O then, so ordinary effect cleanup can finish.\n ctx.on('internal/plugin', fiber => {\n if (fiber === ctx.fiber && fiber.uid === null) lifetime.abort();\n });\n ctx.effect(() => () => lifetime.abort());\n const pageHost = config.pageHost ?? ctx.get?.('pageHost', false);\n const workspace = config.workspace;\n const window = config.window ?? globalThis;\n let transport = ctx.get?.('hostTransport', false);\n if (workspace?.endpoint) {\n const url = workspaceBrowserEndpoint(workspace.endpoint, workspace.token, window.location?.href, 'frontend', workspace.frontendTicket);\n let socket;\n let ownedTransport;\n let disposed = false;\n ctx.effect(() => {\n socket = new window.WebSocket(url);\n const close = () => {\n disposed = true;\n if (ownedTransport) ownedTransport.close('View workspace client disposed');\n else socket.close(1000, 'View workspace client disposed');\n };\n lifetime.signal.addEventListener('abort', close, { once: true });\n return () => { lifetime.signal.removeEventListener('abort', close); close(); };\n });\n try { ownedTransport = await createHostWebSocketClient(socket); }\n catch (error) { if (lifetime.signal.aborted) return; throw error; }\n if (disposed) { ownedTransport.close('View workspace client disposed'); return; }\n transport = ownedTransport;\n }\n const rawClient =\n transport && workspace?.clientId && workspace?.token\n ? createViewWorkspaceClient({\n transport,\n clientId: workspace.clientId,\n token: workspace.token,\n })\n : undefined;\n const client = wrapViewWorkspaceClient(rawClient);\n if (lifetime.signal.aborted) return;\n if (rawClient && (config.window ?? globalThis).location) {\n const session = createProjectSession(rawClient, { window: config.window ?? globalThis });\n rawClient.projectSession = session;\n const dispose = () => session.dispose();\n lifetime.signal.addEventListener('abort', dispose, { once: true });\n ctx.effect(() => () => { lifetime.signal.removeEventListener('abort', dispose); dispose(); });\n // A headed document must finish exact-target recovery before its\n // plugins can construct an App. The View entry has no Engine workspace\n // surface, so let its Shell activate while a cold project opens.\n if (new URL(window.location.href).searchParams.has('forgeaxWorkspaceTarget'))\n await session.ready;\n }\n if (lifetime.signal.aborted) return;\n ctx.provide('viewOperationClient', client);\n if (pageHost?.openResource && client) {\n logResourceOpen('open-request-observer-wired', {});\n const stop = observeWorkspaceOpenRequests(client, (request) => pageHost.openResource(request));\n ctx.effect(() => stop);\n } else {\n logResourceOpen('open-request-observer-skipped', {\n hasPageHost: Boolean(pageHost),\n hasOpenResource: Boolean(pageHost?.openResource),\n hasClient: Boolean(client),\n }, { level: 'warn' });\n }\n },\n};\n\nexport default viewWorkspaceCoreFrontendPlugin;\n","import { createWorkspaceStateReader } from './workspace-state.mjs';\n\n/**\n * Live title for the editor page. The Host workspace snapshot is the SSOT:\n * when a preview/scene is bound, the tab shows that asset's name. The page\n * type's titleKey remains the idle fallback — this helper never invents a\n * static label, so the shell stays decoupled from scene vocabulary.\n *\n * @param {unknown} state\n * @returns {string | undefined}\n */\nexport function editorPageTitleFromWorkspace(state) {\n const asset = state && typeof state === 'object' ? state.preview?.asset : undefined;\n if (!asset || typeof asset !== 'object') return undefined;\n for (const candidate of [asset.name, asset.label]) {\n if (typeof candidate === 'string' && candidate.trim() !== '') return candidate.trim();\n }\n return undefined;\n}\n\n/**\n * Page controller matching forgeax-interface: `getTitle()` reads now,\n * `subscribeTitle()` fires when the workspace snapshot changes. No polling,\n * and ViewerShell does not read preview.asset itself.\n *\n * @param {unknown} client\n */\nexport function createEditorPageTitleController(client) {\n const reader = createWorkspaceStateReader(client);\n return Object.freeze({\n getTitle() {\n return editorPageTitleFromWorkspace(reader.getSnapshot());\n },\n subscribeTitle(listener) {\n return reader.subscribe(listener);\n },\n dispose() {\n reader.dispose();\n },\n });\n}\n","import { createEditorPageTitleController } from '@forgeax/view-workspace-core/page-title';\nimport { FRONTEND_PLUGIN_ID, PAGE_TYPE } from './identity.mjs';\n\nexport {\n FRONTEND_PLUGIN_ID as SCENE_PAGE_PLUGIN_ID,\n FRONTEND_MODULE as SCENE_PAGE_MODULE,\n} from './identity.mjs';\n\n/** The page owns its tab; scene panels depend on its reversible capability. */\nexport default {\n name: FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient'],\n provide: ['viewScenePage'],\n apply(ctx, config = {}) {\n const pageHost = config.pageHost ?? ctx.get?.('pageHost', false);\n const unregister = pageHost?.registerType({\n typeId: PAGE_TYPE,\n titleKey: 'view.pages.editor',\n order: 0,\n closable: false,\n singleton: true,\n initial: true,\n openable: false,\n layout: 'dock',\n showPanelRail: false,\n hideWhenInactive: true,\n resourceSelector: { kinds: ['scene'] },\n priority: 10,\n createController: () => createEditorPageTitleController(ctx.get('viewOperationClient')),\n });\n if (unregister) ctx.effect(() => unregister);\n ctx.provide('viewScenePage', { typeId: PAGE_TYPE });\n },\n};\n","import { SHELL_PLUGIN_ID } from './shell-identity.mjs';\nexport { SHELL_PLUGIN_ID, SHELL_MODULE } from './shell-identity.mjs';\n\n/** The library borrows UI hosts; only the explicit embedded owner mounts React. */\nexport default {\n name: SHELL_PLUGIN_ID,\n async apply(ctx, config = {}) {\n const shell = config.embeddedShell ??\n (config.embedded === true ? (await import('../shell/embedded.tsx')).default : undefined);\n if (shell) {\n const fiber = await ctx.plugin(shell);\n await fiber?.await?.();\n }\n },\n};\n","import { viewPlayPresentationPlugin } from './play-presentation.mjs';\nimport { PRESENTATION_PLUGIN_ID } from './presentation-identity.mjs';\nexport { PRESENTATION_PLUGIN_ID, PRESENTATION_MODULE } from './presentation-identity.mjs';\n\n/** The connection owns Play resources; page panels only borrow their placement. */\nexport default {\n ...viewPlayPresentationPlugin,\n name: PRESENTATION_PLUGIN_ID,\n};\n","import displayPlugin from '@forgeax/view-plugin-display/frontend';\nimport pluginsPlugin from '@forgeax/view-plugin-plugins/frontend';\nimport inspectorPlugin from '@forgeax/view-plugin-inspector/frontend';\nimport contentBrowserPlugin from '@forgeax/view-plugin-content-browser/frontend';\nimport sceneTreePlugin from '@forgeax/view-plugin-scene-tree/frontend';\nimport materialPlugin from '@forgeax/view-plugin-material/frontend';\nimport meshPlugin from '@forgeax/view-plugin-mesh/frontend';\nimport texturePlugin from '@forgeax/view-plugin-texture/frontend';\nimport assetPlugin from '@forgeax/view-plugin-asset/frontend';\nimport viewportPlugin from '@forgeax/view-plugin-viewport/frontend';\nimport workspaceCorePlugin from './host/workspace-frontend.mjs';\nimport scenePagePlugin from '@forgeax/view-plugin-scene/frontend';\nimport shellPlugin, { SHELL_MODULE } from './plugins/shell.mjs';\nimport presentationPlugin, { PRESENTATION_MODULE } from '@forgeax/view-plugin-viewport/presentation';\nimport * as displayIdentity from '@forgeax/view-plugin-display/identity';\nimport * as pluginsIdentity from '@forgeax/view-plugin-plugins/identity';\nimport * as inspectorIdentity from '@forgeax/view-plugin-inspector/identity';\nimport * as contentBrowserIdentity from '@forgeax/view-plugin-content-browser/identity';\nimport * as sceneTreeIdentity from '@forgeax/view-plugin-scene-tree/identity';\nimport * as materialIdentity from '@forgeax/view-plugin-material/identity';\nimport * as meshIdentity from '@forgeax/view-plugin-mesh/identity';\nimport * as textureIdentity from '@forgeax/view-plugin-texture/identity';\nimport * as assetIdentity from '@forgeax/view-plugin-asset/identity';\nimport * as viewportIdentity from '@forgeax/view-plugin-viewport/identity';\nimport * as sceneIdentity from '@forgeax/view-plugin-scene/identity';\n\nimport {\n VIEW_PLUGIN_VERSION,\n VIEW_PRODUCT_PLUGINS,\n VIEW_WORKSPACE_CORE,\n} from './catalog-shared.mjs';\n\nconst implementations = new Map([\n [VIEW_WORKSPACE_CORE.FRONTEND_MODULE, workspaceCorePlugin],\n [sceneIdentity.FRONTEND_MODULE, scenePagePlugin],\n [displayIdentity.FRONTEND_MODULE, displayPlugin],\n [viewportIdentity.FRONTEND_MODULE, viewportPlugin],\n [contentBrowserIdentity.FRONTEND_MODULE, contentBrowserPlugin],\n [pluginsIdentity.FRONTEND_MODULE, pluginsPlugin],\n [inspectorIdentity.FRONTEND_MODULE, inspectorPlugin],\n [sceneTreeIdentity.FRONTEND_MODULE, sceneTreePlugin],\n [materialIdentity.FRONTEND_MODULE, materialPlugin],\n [meshIdentity.FRONTEND_MODULE, meshPlugin],\n [textureIdentity.FRONTEND_MODULE, texturePlugin],\n [assetIdentity.FRONTEND_MODULE, assetPlugin],\n]);\n\n// Asset type-preview pages borrow the App-owned surface. Starting them before\n// the App publishes its presentation would leave required descendants pending\n// and prevent Engine's native frontend root from activating.\n// Viewport is not in this set: its fill dock is claimed with the other editor\n// panels as soon as the scene page exists. Play/Engine only delay DOM inside\n// that already-claimed slot, and must not inject engineWorkspacePresentation\n// on the viewport plugin itself.\nconst presentationPages = new Set([\n materialIdentity.FRONTEND_MODULE,\n meshIdentity.FRONTEND_MODULE,\n textureIdentity.FRONTEND_MODULE,\n assetIdentity.FRONTEND_MODULE,\n]);\n\nexport const VIEW_PRODUCT_FRONTEND_CATALOG = new Map(\n [VIEW_WORKSPACE_CORE, ...VIEW_PRODUCT_PLUGINS].map((plugin) => [\n plugin.FRONTEND_MODULE,\n {\n realm: 'engine',\n version: VIEW_PLUGIN_VERSION,\n requiresWorkspacePresentation: presentationPages.has(plugin.FRONTEND_MODULE),\n load: async () => ({ default: implementations.get(plugin.FRONTEND_MODULE) }),\n },\n ]),\n);\n\nfor (const [name, plugin] of [[SHELL_MODULE, shellPlugin], [PRESENTATION_MODULE, presentationPlugin]]) {\n VIEW_PRODUCT_FRONTEND_CATALOG.set(name, {\n realm: 'engine',\n version: VIEW_PLUGIN_VERSION,\n load: async () => ({ default: plugin }),\n });\n}\n","import { createViewProductPlan, VIEW_FRONTEND_ROOT_PROGRAM } from './catalog-shared.mjs';\nimport { VIEW_PRODUCT_FRONTEND_CATALOG } from './frontend-catalog.mjs';\nexport { VIEW_FRONTEND_ROOT_PROGRAM } from './catalog-shared.mjs';\n\n/** One native root for the optional View surface. The Host resolves only this program. */\nexport function createViewFrontendRoot(browserConfig = {}) {\n return {\n name: VIEW_FRONTEND_ROOT_PROGRAM,\n async apply(ctx, config = {}) {\n const plan = createViewProductPlan({ disabledPages: config.disabledPages });\n const shared = {\n ...(config.frontendConfig ?? {}),\n ...browserConfig,\n workspace: {\n ...(config.frontendConfig?.workspace ?? {}),\n ...(browserConfig.workspace ?? {}),\n },\n };\n const deferred = [];\n for (const component of plan.frontend) {\n const record = VIEW_PRODUCT_FRONTEND_CATALOG.get(component.module);\n if (!record) throw new Error(`View frontend program is missing: ${component.module}`);\n const { default: plugin } = await record.load();\n if (shared.embedded && record.requiresWorkspacePresentation) {\n deferred.push(plugin);\n continue;\n }\n // Cordis fibers are thenable. Starting the page plugins must not await\n // their injection of Engine's presentation, which is supplied only\n // after the frontend root activates and the App bootstrap begins.\n const fiber = ctx.plugin(plugin, shared);\n if (component === plan.frontend[0]) await fiber.await();\n }\n if (deferred.length) {\n let started = false;\n const startPresentationPages = () => {\n if (started || !ctx.get('engineWorkspacePresentation', false)) return;\n started = true;\n for (const plugin of deferred) ctx.plugin(plugin, shared);\n };\n ctx.on('internal/service', (name) => {\n if (name === 'engineWorkspacePresentation') startPresentationPages();\n });\n startPresentationPages();\n }\n },\n };\n}\n\nexport default createViewFrontendRoot();\n","const PANEL_DOCKS = new Set(['fill', 'top', 'bottom', 'left', 'right']);\nconst PANEL_STACKS = new Set(['tabs', 'split']);\n\nfunction normalizeLayout(layout) {\n if (!layout || typeof layout !== 'object' || Array.isArray(layout)) {\n throw new TypeError('panel claim requires layout');\n }\n for (const field of Object.keys(layout)) {\n if (!['dock', 'size', 'stack', 'order'].includes(field)) {\n throw new TypeError(`Unknown panel layout field: ${field}`);\n }\n }\n if (!PANEL_DOCKS.has(layout.dock)) {\n throw new TypeError('panel layout dock must be fill, top, bottom, left, or right');\n }\n if (!PANEL_STACKS.has(layout.stack)) {\n throw new TypeError('panel layout stack must be tabs or split');\n }\n if (!Number.isFinite(layout.order)) throw new TypeError('panel layout requires numeric order');\n let size;\n if (layout.size !== undefined) {\n if (!layout.size || typeof layout.size !== 'object' || Array.isArray(layout.size)) {\n throw new TypeError('panel layout size must be an object');\n }\n for (const field of Object.keys(layout.size)) {\n if (!['value', 'unit'].includes(field)) {\n throw new TypeError(`Unknown panel layout size field: ${field}`);\n }\n }\n if (!Number.isFinite(layout.size.value) || layout.size.value <= 0) {\n throw new TypeError('panel layout size value must be positive');\n }\n if (layout.size.unit !== 'px' && layout.size.unit !== 'fraction') {\n throw new TypeError('panel layout size unit must be px or fraction');\n }\n if (layout.size.unit === 'fraction' && layout.size.value > 1) {\n throw new TypeError('panel layout fraction must not exceed 1');\n }\n size = Object.freeze({ value: layout.size.value, unit: layout.size.unit });\n }\n return Object.freeze({\n dock: layout.dock,\n ...(size === undefined ? {} : { size }),\n stack: layout.stack,\n order: layout.order,\n });\n}\n\nfunction slotElementId(slot) {\n return `forgeax-view-slot-${slot}`;\n}\n\nexport function createViewSlotRegistry(document = globalThis.document, { onChange } = {}) {\n if (!document?.createElement) throw new TypeError('View slot registry requires a document');\n const claims = new Map();\n const mountHosts = new Map();\n const listeners = new Set();\n let snapshot = Object.freeze([]);\n const notify = () => {\n snapshot = Object.freeze(\n [...claims.values()].sort((a, b) => {\n const pageDelta = a.pageType.localeCompare(b.pageType);\n return pageDelta || a.layout.order - b.layout.order || a.id.localeCompare(b.id);\n }),\n );\n for (const listener of listeners) listener(snapshot);\n onChange?.(snapshot);\n document.defaultView?.dispatchEvent?.(\n new CustomEvent('forgeax-view-slot-layout', { detail: { claims: snapshot } }),\n );\n };\n const ensureMountHost = (id) => {\n const claim = claims.get(id);\n if (!claim) throw new Error(`View panel is not claimed: ${id}`);\n let host = mountHosts.get(id);\n if (!host) {\n host = document.createElement('div');\n host.className = 'fx-view-slot-mount-host';\n host.dataset.forgeaxViewMountHost = id;\n mountHosts.set(id, host);\n }\n const anchor = document.getElementById(slotElementId(id));\n if (anchor && host.parentNode !== anchor) anchor.replaceChildren(host);\n return host;\n };\n const resolveWhenReady = (id) => Promise.resolve(ensureMountHost(id));\n return Object.freeze({\n subscribe(listener) {\n listeners.add(listener);\n listener(snapshot);\n return () => listeners.delete(listener);\n },\n claim({ id, slot, pageType, titleKey, activity, layout, closable, dockTitleHidden } = {}) {\n id ??= slot;\n if (!id) throw new TypeError('panel claim requires id');\n if (typeof pageType !== 'string' || pageType.trim() === '') {\n throw new TypeError('panel claim requires pageType');\n }\n if (closable !== undefined && typeof closable !== 'boolean') {\n throw new TypeError('panel claim closable must be a boolean');\n }\n if (dockTitleHidden !== undefined && typeof dockTitleHidden !== 'boolean') {\n throw new TypeError('panel claim dockTitleHidden must be a boolean');\n }\n const claim = Object.freeze({\n id,\n pageType,\n titleKey,\n ...(activity === undefined ? {} : { activity: Object.freeze({ ...activity }) }),\n layout: normalizeLayout(layout),\n ...(closable === undefined ? {} : { closable }),\n ...(dockTitleHidden === undefined ? {} : { dockTitleHidden }),\n });\n claims.set(id, claim);\n notify();\n return () => {\n if (claims.get(id) !== claim) return;\n claims.delete(id);\n mountHosts.get(id)?.replaceChildren?.();\n mountHosts.delete(id);\n notify();\n };\n },\n getClaims: () => snapshot,\n resolve: ensureMountHost,\n resolveWhenReady,\n mount(id, child) {\n const parent = ensureMountHost(id);\n parent.replaceChildren(child);\n return () => {\n if (parent.contains(child)) parent.replaceChildren();\n };\n },\n });\n}\n","import { createFrontendHost } from '@forgeax/engine-host/frontend';\nimport { createHostWebSocketClient } from '@forgeax/engine-host/transport';\nimport { HOST_ASSEMBLY_CHANGED_TOPIC } from '@forgeax/engine-host/transport';\nimport { workspaceBrowserEndpoint } from '@forgeax/view-workspace-core/client';\n\nimport { VIEW_FRONTEND_ROOT_PROGRAM } from '../frontend-root.mjs';\nimport { createViewFrontendRoot } from '../frontend-root.mjs';\n\nexport async function resolveViewFrontendRoot(root, localConfig) {\n if (root.program !== VIEW_FRONTEND_ROOT_PROGRAM) {\n throw new Error(`Unexpected View frontend root: ${root.program}`);\n }\n return createViewFrontendRoot(localConfig);\n}\nimport { createViewSlotRegistry } from './slot-registry.mjs';\nimport { createViewPageHost, createViewPageTypeRegistry } from './page-registry.mjs';\n\nfunction browserConfig(options, token) {\n const browserConfig = {\n ...options,\n workspace: {\n ...(options.workspaceMountId === undefined ? {} : { mountId: options.workspaceMountId }),\n clientId: options.clientId ?? 'view-browser',\n ...(token === undefined ? {} : { token }),\n ...(options.resourceBrowser === undefined\n ? {}\n : { resourceBrowser: options.resourceBrowser }),\n },\n };\n delete browserConfig.workspaceMountId;\n delete browserConfig.clientId;\n delete browserConfig.resourceBrowser;\n return browserConfig;\n}\n\nexport async function connectViewFrontend({\n endpoint,\n token,\n WebSocket: SocketConstructor = globalThis.WebSocket,\n frontendTicket,\n reload,\n ...browserOptions\n} = {}) {\n const url = workspaceBrowserEndpoint(\n endpoint,\n token,\n browserOptions.window?.location?.href ?? globalThis.location?.href,\n 'frontend',\n frontendTicket,\n );\n if (typeof SocketConstructor !== 'function') {\n throw new TypeError('View frontend requires a browser WebSocket constructor');\n }\n const transport = await createHostWebSocketClient(new SocketConstructor(url));\n let frontendHost;\n let pendingAssembly;\n let closed = false;\n const location = browserOptions.window?.location ?? globalThis.location;\n const reloadFrontend =\n reload ??\n (typeof location?.reload === 'function' ? () => location.reload() : undefined);\n const changed = (assembly) => {\n if (closed) return;\n if (!frontendHost) { pendingAssembly = assembly; return; }\n if (frontendHost.assembly.current.revision === assembly.revision) return;\n if (reloadFrontend) void Promise.resolve(reloadFrontend()).catch((error) => transport.close(error));\n else transport.close(new Error('View frontend root changed; reload the page'));\n };\n const removeChanged = transport.subscribe(HOST_ASSEMBLY_CHANGED_TOPIC, changed);\n try {\n frontendHost = await createFrontendHost({\n resolveRoot: (root) => resolveViewFrontendRoot(root, browserConfig(browserOptions, token)),\n ...(browserOptions.embedded === false ? { startupPlugins: [{\n name: 'forgeax.view.browser-shell',\n provide: ['panelHost', 'pageHost', 'viewSlotRegistry'],\n apply(ctx) {\n ctx.provide('panelHost', browserOptions.panelHost);\n ctx.provide('pageHost', browserOptions.pageHost);\n ctx.provide('viewSlotRegistry', browserOptions.viewSlotRegistry);\n },\n }] } : {}),\n transport,\n autoActivate: true,\n });\n if (pendingAssembly) changed(pendingAssembly);\n } catch (error) {\n removeChanged();\n transport.close('View frontend activation failed');\n throw error;\n }\n return Object.freeze({\n frontendHost,\n transport,\n endpoint: url,\n async dispose(reason = 'View frontend disposed') {\n closed = true;\n removeChanged();\n await frontendHost.dispose();\n transport.close(reason);\n },\n });\n}\n\nexport async function mountViewWorkspace(options = {}) {\n const connection = await connectViewFrontend(options);\n const shell = connection.frontendHost.context.get('viewWorkspaceShell', false);\n const api = connection.frontendHost.context.get('viewOperationClient', false);\n if (!shell || !api) {\n await connection.dispose('View workspace plugin did not mount');\n throw new Error('View frontend Host did not mount the workspace plugin');\n }\n return Object.freeze({ ...connection, api, shell });\n}\n\nexport async function mountViewViewer(options = {}) {\n const document = options.document ?? globalThis.document;\n const viewSlotRegistry =\n options.viewSlotRegistry ??\n globalThis.__forgeaxViewSlotRegistry ??\n createViewSlotRegistry(document);\n globalThis.__forgeaxViewSlotRegistry = viewSlotRegistry;\n const pageRegistry = options.pageRegistry ?? createViewPageTypeRegistry();\n const pageHost = options.pageHost ?? createViewPageHost({ registry: pageRegistry });\n return connectViewFrontend({\n ...options,\n resourceBrowser: options.resourceBrowser ?? true,\n viewSlotRegistry,\n pageRegistry,\n pageHost,\n });\n}\n","/**\n * Viewer shell i18n — catalogs live here; locale state lives in view-workspace-core/locale-bridge.\n */\nimport {\n getViewLocale,\n setViewLocale,\n subscribeViewLocale,\n} from '@forgeax/view-workspace-core/locale-bridge';\nimport { useCallback, useSyncExternalStore } from 'react';\nimport en from './locales/en.json';\nimport zh from './locales/zh.json';\n\nexport type Locale = 'en' | 'zh';\n\nexport const SUPPORTED_LOCALES = [\n { code: 'en' as Locale, label: 'English', nativeLabel: 'English' },\n { code: 'zh' as Locale, label: 'Chinese', nativeLabel: '简体中文' },\n];\n\nexport const DEFAULT_LOCALE: Locale = 'zh';\n\nconst STORAGE_KEY = 'forgeax.view.locale';\nconst CATALOGS: Record<Locale, Record<string, unknown>> = { en, zh };\n\nfunction isLocale(value: unknown): value is Locale {\n return value === 'en' || value === 'zh';\n}\n\nfunction readPersisted(): Locale {\n if (typeof localStorage === 'undefined') return DEFAULT_LOCALE;\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (isLocale(raw)) return raw;\n } catch {\n /* private mode */\n }\n return DEFAULT_LOCALE;\n}\n\n/** Hydrate locale once at app boot (do not call during React render). */\nexport function initI18n(): void {\n setViewLocale(readPersisted());\n}\n\nexport function getLocale(): Locale {\n return getViewLocale();\n}\n\nexport function setLocale(next: Locale): void {\n if (!isLocale(next)) return;\n try {\n localStorage.setItem(STORAGE_KEY, next);\n } catch {\n /* ignore */\n }\n setViewLocale(next);\n}\n\nexport function subscribe(listener: () => void): () => void {\n return subscribeViewLocale(listener);\n}\n\nfunction lookup(catalog: Record<string, unknown>, key: string): string | undefined {\n const parts = key.split('.');\n let node: unknown = catalog;\n for (const part of parts) {\n if (node === null || typeof node !== 'object') return undefined;\n node = (node as Record<string, unknown>)[part];\n }\n return typeof node === 'string' ? node : undefined;\n}\n\nexport function t(key: string, vars?: Record<string, string | number>): string {\n const locale = getViewLocale();\n const primary = lookup(CATALOGS[locale], key) ?? lookup(CATALOGS.en, key) ?? key;\n if (!vars) return primary;\n return primary.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name: string) => String(vars[name] ?? ''));\n}\n\nexport function useTranslation() {\n const language = useSyncExternalStore(subscribe, getLocale, getLocale);\n const translate = useCallback(\n (key: string, vars?: Record<string, string | number>) => t(key, vars),\n [language],\n );\n return {\n t: translate,\n i18n: { language, changeLanguage: setLocale },\n };\n}\n","import { Context } from '@forgeax/engine-plugin';\n\nconst terminal = error => /stopped|stopping|unauthorized|forbidden|incompatible|invalid.*assembly|401|403/i.test(\n [error?.code, error?.message, error?.hint].filter(Boolean).join(' '),\n);\n\n/** Native connection plugin, outside the domain-neutral Host infrastructure. */\nexport function createBrowserConnection({ connect, onChange, delays = [250, 500, 1000, 2000, 4000] }) {\n const context = new Context();\n let reconnect;\n const fiber = context.plugin({\n name: 'forgeax.view.browser-connection',\n apply(ctx) {\n let generation = 0;\n let disposed = false;\n let session;\n let removeDisconnect;\n let timer;\n let abort;\n let retries = 0;\n const publish = value => { if (!disposed) onChange({ ...value, onReconnect: reconnect }); };\n const retry = error => {\n const retrying = !terminal(error) && retries < delays.length;\n publish({ phase: 'disconnected', detail: error?.message ?? String(error), reconnectBusy: retrying });\n if (retrying) timer = setTimeout(() => void attempt(), delays[retries++]);\n };\n const attempt = async () => {\n clearTimeout(timer);\n const current = ++generation;\n abort?.abort();\n abort = new AbortController();\n removeDisconnect?.();\n removeDisconnect = undefined;\n const previous = session;\n session = undefined;\n publish({ phase: 'connecting', reconnectBusy: true, session: undefined });\n try {\n await previous?.dispose('View reconnecting');\n if (disposed || current !== generation) return;\n const next = await connect(abort.signal);\n if (disposed || current !== generation) { await next?.dispose('Superseded connection'); return; }\n session = next;\n if (!next) {\n publish({ phase: 'unconfigured', reconnectBusy: false });\n return;\n }\n publish({ phase: 'connected', reconnectBusy: false, session: next });\n const connectedAt = Date.now();\n let disconnected = false;\n removeDisconnect = next.transport.onDisconnect(error => {\n if (disposed || current !== generation || disconnected) return;\n disconnected = true;\n // An immediately accepted then closed socket is still the same outage.\n if (Date.now() - connectedAt >= 30_000) retries = 0;\n retry(error);\n });\n if (next.transport.connected === false && !disconnected) {\n disconnected = true;\n retry(new Error('Host connection closed during activation'));\n }\n } catch (error) {\n if (!disposed && current === generation) retry(error);\n }\n };\n reconnect = () => { retries = 0; void attempt(); };\n ctx.effect(() => () => {\n disposed = true;\n generation++;\n clearTimeout(timer);\n abort?.abort();\n removeDisconnect?.();\n return session?.dispose('View browser owner disposed');\n });\n reconnect();\n },\n });\n return {\n ready: fiber.await(),\n reconnect: () => reconnect?.(),\n dispose: () => context.fiber.dispose(),\n };\n}\n","/**\n * dockview-core\n * @version 6.6.1\n * @link https://github.com/mathuo/dockview\n * @license MIT\n */\nclass TransferObject {\n}\nclass PanelTransfer extends TransferObject {\n constructor(viewId, groupId, panelId, tabGroupId) {\n super();\n this.viewId = viewId;\n this.groupId = groupId;\n this.panelId = panelId;\n this.tabGroupId = tabGroupId;\n }\n}\nclass PaneTransfer extends TransferObject {\n constructor(viewId, paneId) {\n super();\n this.viewId = viewId;\n this.paneId = paneId;\n }\n}\n/**\n * A singleton to store transfer data during drag & drop operations that are only valid within the application.\n */\nclass LocalSelectionTransfer {\n constructor() {\n // protect against external instantiation\n }\n static getInstance() {\n return LocalSelectionTransfer.INSTANCE;\n }\n hasData(proto) {\n return proto && proto === this.proto;\n }\n clearData(proto) {\n if (this.hasData(proto)) {\n this.proto = undefined;\n this.data = undefined;\n }\n }\n getData(proto) {\n if (this.hasData(proto)) {\n return this.data;\n }\n return undefined;\n }\n setData(data, proto) {\n if (proto) {\n this.data = data;\n this.proto = proto;\n }\n }\n}\nLocalSelectionTransfer.INSTANCE = new LocalSelectionTransfer();\nfunction getPanelData() {\n const panelTransfer = LocalSelectionTransfer.getInstance();\n const isPanelEvent = panelTransfer.hasData(PanelTransfer.prototype);\n if (!isPanelEvent) {\n return undefined;\n }\n return panelTransfer.getData(PanelTransfer.prototype)[0];\n}\nfunction getPaneData() {\n const paneTransfer = LocalSelectionTransfer.getInstance();\n const isPanelEvent = paneTransfer.hasData(PaneTransfer.prototype);\n if (!isPanelEvent) {\n return undefined;\n }\n return paneTransfer.getData(PaneTransfer.prototype)[0];\n}\n\nvar Disposable;\n(function (Disposable) {\n Disposable.NONE = {\n dispose: () => {\n // noop\n },\n };\n function from(func) {\n return {\n dispose: () => {\n func();\n },\n };\n }\n Disposable.from = from;\n})(Disposable || (Disposable = {}));\nclass CompositeDisposable {\n get isDisposed() {\n return this._isDisposed;\n }\n constructor(...args) {\n this._isDisposed = false;\n this._disposables = new Set(args);\n }\n addDisposables(...args) {\n args.forEach((arg) => this._disposables.add(arg));\n }\n removeDisposable(disposable) {\n this._disposables.delete(disposable);\n }\n dispose() {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n this._disposables.forEach((arg) => arg.dispose());\n this._disposables.clear();\n }\n}\nclass MutableDisposable {\n constructor() {\n this._disposable = Disposable.NONE;\n }\n set value(disposable) {\n if (this._disposable) {\n this._disposable.dispose();\n }\n this._disposable = disposable;\n }\n dispose() {\n if (this._disposable) {\n this._disposable.dispose();\n this._disposable = Disposable.NONE;\n }\n }\n}\n\nvar Event;\n(function (Event) {\n Event.any = (...children) => {\n return (listener) => {\n const disposables = children.map((child) => child(listener));\n return {\n dispose: () => {\n disposables.forEach((d) => {\n d.dispose();\n });\n },\n };\n };\n };\n})(Event || (Event = {}));\nclass DockviewEvent {\n constructor() {\n this._defaultPrevented = false;\n }\n get defaultPrevented() {\n return this._defaultPrevented;\n }\n preventDefault() {\n this._defaultPrevented = true;\n }\n}\nclass AcceptableEvent {\n constructor() {\n this._isAccepted = false;\n }\n get isAccepted() {\n return this._isAccepted;\n }\n accept() {\n this._isAccepted = true;\n }\n}\nclass LeakageMonitor {\n constructor() {\n this.events = new Map();\n }\n get size() {\n return this.events.size;\n }\n add(event, stacktrace) {\n this.events.set(event, stacktrace);\n }\n delete(event) {\n this.events.delete(event);\n }\n clear() {\n this.events.clear();\n }\n}\nclass Stacktrace {\n static create() {\n var _a;\n return new Stacktrace((_a = new Error().stack) !== null && _a !== void 0 ? _a : '');\n }\n constructor(value) {\n this.value = value;\n }\n print() {\n console.warn('dockview: stacktrace', this.value);\n }\n}\nclass Listener {\n constructor(callback, stacktrace) {\n this.callback = callback;\n this.stacktrace = stacktrace;\n }\n}\n// relatively simple event emitter taken from https://github.com/microsoft/vscode/blob/master/src/vs/base/common/event.ts\nclass Emitter {\n static setLeakageMonitorEnabled(isEnabled) {\n if (isEnabled !== Emitter.ENABLE_TRACKING) {\n Emitter.MEMORY_LEAK_WATCHER.clear();\n }\n Emitter.ENABLE_TRACKING = isEnabled;\n }\n get value() {\n return this._last;\n }\n constructor(options) {\n this.options = options;\n this._listeners = [];\n this._disposed = false;\n this._pauseTokens = new Set();\n }\n get event() {\n if (!this._event) {\n this._event = (callback) => {\n var _a;\n if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.replay) && this._last !== undefined) {\n callback(this._last);\n }\n const listener = new Listener(callback, Emitter.ENABLE_TRACKING ? Stacktrace.create() : undefined);\n this._listeners.push(listener);\n return {\n dispose: () => {\n const index = this._listeners.indexOf(listener);\n if (index > -1) {\n this._listeners.splice(index, 1);\n }\n else if (Emitter.ENABLE_TRACKING) ;\n },\n };\n };\n if (Emitter.ENABLE_TRACKING) {\n Emitter.MEMORY_LEAK_WATCHER.add(this._event, Stacktrace.create());\n }\n }\n return this._event;\n }\n fire(e) {\n var _a;\n if (this._pauseTokens.size > 0) {\n // while paused, the event is dropped entirely — `_last` is not\n // updated, so replay subscribers won't see values fired during a pause\n return;\n }\n if ((_a = this.options) === null || _a === void 0 ? void 0 : _a.replay) {\n this._last = e;\n }\n for (const listener of this._listeners) {\n listener.callback(e);\n }\n }\n pause() {\n const token = {};\n this._pauseTokens.add(token);\n return Disposable.from(() => this._pauseTokens.delete(token));\n }\n dispose() {\n if (!this._disposed) {\n this._disposed = true;\n if (this._listeners.length > 0) {\n if (Emitter.ENABLE_TRACKING) {\n queueMicrotask(() => {\n var _a;\n // don't check until stack of execution is completed to allow for out-of-order disposals within the same execution block\n for (const listener of this._listeners) {\n console.warn('dockview: stacktrace', (_a = listener.stacktrace) === null || _a === void 0 ? void 0 : _a.print());\n }\n });\n }\n this._listeners = [];\n }\n if (Emitter.ENABLE_TRACKING && this._event) {\n Emitter.MEMORY_LEAK_WATCHER.delete(this._event);\n }\n }\n }\n}\nEmitter.ENABLE_TRACKING = false;\nEmitter.MEMORY_LEAK_WATCHER = new LeakageMonitor();\nfunction addDisposableListener(element, type, listener, options) {\n element.addEventListener(type, listener, options);\n return {\n dispose: () => {\n element.removeEventListener(type, listener, options);\n },\n };\n}\n/**\n *\n * Event Emitter that fires events from a Microtask callback, only one event will fire per event-loop cycle.\n *\n * It's kind of like using an `asapScheduler` in RxJs with additional logic to only fire once per event-loop cycle.\n * This implementation exists to avoid external dependencies.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/queueMicrotask\n * @see https://rxjs.dev/api/index/const/asapScheduler\n */\nclass AsapEvent {\n constructor() {\n this._onFired = new Emitter();\n this._currentFireCount = 0;\n this._queued = false;\n this.onEvent = (e) => {\n /**\n * when the event is first subscribed to take note of the current fire count\n */\n const fireCountAtTimeOfEventSubscription = this._currentFireCount;\n return this._onFired.event(() => {\n /**\n * if the current fire count is greater than the fire count at event subscription\n * then the event has been fired since we subscribed and it's ok to \"on_next\" the event.\n *\n * if the count is not greater then what we are recieving is an event from the microtask\n * queue that was triggered before we actually subscribed and therfore we should ignore it.\n */\n if (this._currentFireCount > fireCountAtTimeOfEventSubscription) {\n e();\n }\n });\n };\n }\n fire() {\n this._currentFireCount++;\n if (this._queued) {\n return;\n }\n this._queued = true;\n queueMicrotask(() => {\n this._queued = false;\n this._onFired.fire();\n });\n }\n dispose() {\n this._onFired.dispose();\n }\n}\n\nclass OverflowObserver extends CompositeDisposable {\n constructor(el) {\n super();\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this._value = null;\n this.addDisposables(this._onDidChange, watchElementResize(el, (entry) => {\n const hasScrollX = entry.target.scrollWidth > entry.target.clientWidth;\n const hasScrollY = entry.target.scrollHeight > entry.target.clientHeight;\n this._value = { hasScrollX, hasScrollY };\n this._onDidChange.fire(this._value);\n }));\n }\n}\nfunction watchElementResize(element, cb) {\n const observer = new ResizeObserver((entires) => {\n /**\n * Fast browser window resize produces Error: ResizeObserver loop limit exceeded.\n * The error isn't visible in browser console, doesn't affect functionality, but degrades performance.\n * See https://stackoverflow.com/questions/49384120/resizeobserver-loop-limit-exceeded/58701523#58701523\n */\n requestAnimationFrame(() => {\n const firstEntry = entires[0];\n cb(firstEntry);\n });\n });\n observer.observe(element);\n return {\n dispose: () => {\n observer.unobserve(element);\n observer.disconnect();\n },\n };\n}\nconst removeClasses = (element, ...classes) => {\n for (const classname of classes) {\n if (element.classList.contains(classname)) {\n element.classList.remove(classname);\n }\n }\n};\nconst addClasses = (element, ...classes) => {\n for (const classname of classes) {\n if (!element.classList.contains(classname)) {\n element.classList.add(classname);\n }\n }\n};\nconst toggleClass = (element, className, isToggled) => {\n const hasClass = element.classList.contains(className);\n if (isToggled && !hasClass) {\n element.classList.add(className);\n }\n if (!isToggled && hasClass) {\n element.classList.remove(className);\n }\n};\nfunction isAncestor(testChild, testAncestor) {\n while (testChild) {\n if (testChild === testAncestor) {\n return true;\n }\n testChild = testChild.parentNode;\n }\n return false;\n}\nfunction trackFocus(element) {\n return new FocusTracker(element);\n}\n/**\n * Track focus on an element. Ensure tabIndex is set when an HTMLElement is not focusable by default\n */\nclass FocusTracker extends CompositeDisposable {\n constructor(element) {\n super();\n this._onDidFocus = new Emitter();\n this.onDidFocus = this._onDidFocus.event;\n this._onDidBlur = new Emitter();\n this.onDidBlur = this._onDidBlur.event;\n this.addDisposables(this._onDidFocus, this._onDidBlur);\n let hasFocus = isAncestor(document.activeElement, element);\n let loosingFocus = false;\n const onFocus = () => {\n loosingFocus = false;\n if (!hasFocus) {\n hasFocus = true;\n this._onDidFocus.fire();\n }\n };\n const onBlur = () => {\n if (hasFocus) {\n loosingFocus = true;\n window.setTimeout(() => {\n if (loosingFocus) {\n loosingFocus = false;\n hasFocus = false;\n this._onDidBlur.fire();\n }\n }, 0);\n }\n };\n this._refreshStateHandler = () => {\n const currentNodeHasFocus = isAncestor(document.activeElement, element);\n if (currentNodeHasFocus !== hasFocus) {\n if (hasFocus) {\n onBlur();\n }\n else {\n onFocus();\n }\n }\n };\n this.addDisposables(addDisposableListener(element, 'focus', onFocus, true));\n this.addDisposables(addDisposableListener(element, 'blur', onBlur, true));\n }\n refreshState() {\n this._refreshStateHandler();\n }\n}\n// quasi: apparently, but not really; seemingly\nconst QUASI_PREVENT_DEFAULT_KEY = 'dv-quasiPreventDefault';\n// mark an event directly for other listeners to check\nfunction quasiPreventDefault(event) {\n event[QUASI_PREVENT_DEFAULT_KEY] = true;\n}\n// check if this event has been marked\nfunction quasiDefaultPrevented(event) {\n return event[QUASI_PREVENT_DEFAULT_KEY];\n}\nfunction addStyles(document, styleSheetList, options = {}) {\n const styleSheets = Array.from(styleSheetList);\n const { nonce } = options;\n const resolvedNonce = typeof nonce === 'function' ? nonce(document) : nonce;\n for (const styleSheet of styleSheets) {\n if (styleSheet.href) {\n const link = document.createElement('link');\n link.href = styleSheet.href;\n link.type = styleSheet.type;\n link.rel = 'stylesheet';\n document.head.appendChild(link);\n // The <link> will load and apply its rules in the target\n // document. Reading cssRules here would duplicate them\n // (and throws for cross-origin sheets).\n continue;\n }\n let cssTexts = [];\n try {\n if (styleSheet.cssRules) {\n cssTexts = Array.from(styleSheet.cssRules).map((rule) => rule.cssText);\n }\n }\n catch (err) {\n console.warn('dockview: failed to access stylesheet rules due to security restrictions', err);\n }\n const fragment = document.createDocumentFragment();\n for (const rule of cssTexts) {\n const style = document.createElement('style');\n if (resolvedNonce) {\n style.setAttribute('nonce', resolvedNonce);\n }\n style.appendChild(document.createTextNode(rule));\n fragment.appendChild(style);\n }\n document.head.appendChild(fragment);\n }\n}\nfunction getDomNodePagePosition(domNode) {\n const { left, top, width, height } = domNode.getBoundingClientRect();\n return {\n left: left + window.scrollX,\n top: top + window.scrollY,\n width: width,\n height: height,\n };\n}\n/**\n * Check whether an element is in the DOM (including the Shadow DOM)\n * @see https://terodox.tech/how-to-tell-if-an-element-is-in-the-dom-including-the-shadow-dom/\n */\nfunction isInDocument(element) {\n let currentElement = element;\n while (currentElement === null || currentElement === void 0 ? void 0 : currentElement.parentNode) {\n if (currentElement.parentNode === document) {\n return true;\n }\n else if (currentElement.parentNode instanceof DocumentFragment) {\n // handle shadow DOMs\n currentElement = currentElement.parentNode.host;\n }\n else {\n currentElement = currentElement.parentNode;\n }\n }\n return false;\n}\nfunction addTestId(element, id) {\n element.setAttribute('data-testid', id);\n}\n/**\n * Should be more efficient than element.querySelectorAll(\"*\") since there\n * is no need to store every element in-memory using this approach\n */\nfunction allTagsNamesInclusiveOfShadowDoms(tagNames, rootNode) {\n const iframes = [];\n function findIframesInNode(node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n if (tagNames.includes(node.tagName)) {\n iframes.push(node);\n }\n if (node.shadowRoot) {\n findIframesInNode(node.shadowRoot);\n }\n for (const child of node.children) {\n findIframesInNode(child);\n }\n }\n }\n // Document → walk from its root element. Element → walk from itself.\n const startEl = rootNode instanceof Document\n ? rootNode.documentElement\n : rootNode;\n findIframesInNode(startEl);\n return iframes;\n}\nfunction disableIframePointEvents(rootNode = document) {\n const iframes = allTagsNamesInclusiveOfShadowDoms(['IFRAME', 'WEBVIEW'], rootNode);\n const original = new WeakMap(); // don't hold onto HTMLElement references longer than required\n for (const iframe of iframes) {\n original.set(iframe, iframe.style.pointerEvents);\n iframe.style.pointerEvents = 'none';\n }\n return {\n release: () => {\n var _a;\n for (const iframe of iframes) {\n iframe.style.pointerEvents = (_a = original.get(iframe)) !== null && _a !== void 0 ? _a : 'auto';\n }\n iframes.splice(0, iframes.length); // don't hold onto HTMLElement references longer than required\n },\n };\n}\nfunction getDockviewTheme(element) {\n function toClassList(element) {\n const list = [];\n for (let i = 0; i < element.classList.length; i++) {\n list.push(element.classList.item(i));\n }\n return list;\n }\n let theme = undefined;\n let parent = element;\n while (parent !== null) {\n theme = toClassList(parent).find((cls) => cls.startsWith('dockview-theme-'));\n if (typeof theme === 'string') {\n break;\n }\n parent = parent.parentElement;\n }\n return theme;\n}\nclass Classnames {\n constructor(element) {\n this.element = element;\n this._classNames = [];\n }\n setClassNames(classNames) {\n for (const className of this._classNames) {\n toggleClass(this.element, className, false);\n }\n this._classNames = classNames\n .split(' ')\n .filter((v) => v.trim().length > 0);\n for (const className of this._classNames) {\n toggleClass(this.element, className, true);\n }\n }\n}\nconst DEBOUCE_DELAY = 100;\nfunction isChildEntirelyVisibleWithinParent(child, parent) {\n const childPosition = getDomNodePagePosition(child);\n const parentPosition = getDomNodePagePosition(parent);\n // Check horizontal visibility\n if (childPosition.left < parentPosition.left) {\n return false;\n }\n if (childPosition.left + childPosition.width >\n parentPosition.left + parentPosition.width) {\n return false;\n }\n // Check vertical visibility\n if (childPosition.top < parentPosition.top) {\n return false;\n }\n if (childPosition.top + childPosition.height >\n parentPosition.top + parentPosition.height) {\n return false;\n }\n return true;\n}\nfunction onDidWindowMoveEnd(window) {\n const emitter = new Emitter();\n let previousScreenX = window.screenX;\n let previousScreenY = window.screenY;\n let timeout;\n const checkMovement = () => {\n if (window.closed) {\n return;\n }\n const currentScreenX = window.screenX;\n const currentScreenY = window.screenY;\n if (currentScreenX !== previousScreenX ||\n currentScreenY !== previousScreenY) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n emitter.fire();\n }, DEBOUCE_DELAY);\n previousScreenX = currentScreenX;\n previousScreenY = currentScreenY;\n }\n requestAnimationFrame(checkMovement);\n };\n checkMovement();\n return emitter;\n}\nfunction onDidWindowResizeEnd(element, cb) {\n let resizeTimeout;\n const disposable = new CompositeDisposable(addDisposableListener(element, 'resize', () => {\n clearTimeout(resizeTimeout);\n resizeTimeout = setTimeout(() => {\n cb();\n }, DEBOUCE_DELAY);\n }));\n return disposable;\n}\nfunction shiftAbsoluteElementIntoView(element, root, options = { buffer: 10 }) {\n const buffer = options.buffer;\n const rect = element.getBoundingClientRect();\n const rootRect = root.getBoundingClientRect();\n let translateX = 0;\n let translateY = 0;\n const left = rect.left - rootRect.left;\n const top = rect.top - rootRect.top;\n const bottom = rect.bottom - rootRect.bottom;\n const right = rect.right - rootRect.right;\n // Check horizontal overflow\n if (left < buffer) {\n translateX = buffer - left;\n }\n else if (right > buffer) {\n translateX = -buffer - right;\n }\n // Check vertical overflow\n if (top < buffer) {\n translateY = buffer - top;\n }\n else if (bottom > buffer) {\n translateY = -bottom - buffer;\n }\n // Apply the translation if needed\n if (translateX !== 0 || translateY !== 0) {\n element.style.transform = `translate(${translateX}px, ${translateY}px)`;\n }\n}\nfunction findRelativeZIndexParent(el) {\n let tmp = el;\n while (tmp && (tmp.style.zIndex === 'auto' || tmp.style.zIndex === '')) {\n tmp = tmp.parentElement;\n }\n return tmp;\n}\n\nfunction tail(arr) {\n if (arr.length === 0) {\n throw new Error('Invalid tail call');\n }\n return [arr.slice(0, arr.length - 1), arr[arr.length - 1]];\n}\nfunction sequenceEquals(arr1, arr2) {\n if (arr1.length !== arr2.length) {\n return false;\n }\n for (let i = 0; i < arr1.length; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n return true;\n}\n/**\n * Pushes an element to the start of the array, if found.\n */\nfunction pushToStart(arr, value) {\n const index = arr.indexOf(value);\n if (index > -1) {\n arr.splice(index, 1);\n arr.unshift(value);\n }\n}\n/**\n * Pushes an element to the end of the array, if found.\n */\nfunction pushToEnd(arr, value) {\n const index = arr.indexOf(value);\n if (index > -1) {\n arr.splice(index, 1);\n arr.push(value);\n }\n}\nfunction firstIndex(array, fn) {\n for (let i = 0; i < array.length; i++) {\n const element = array[i];\n if (fn(element)) {\n return i;\n }\n }\n return -1;\n}\nfunction remove(array, value) {\n const index = array.findIndex((t) => t === value);\n if (index > -1) {\n array.splice(index, 1);\n return true;\n }\n return false;\n}\n\nconst clamp = (value, min, max) => {\n if (min > max) {\n /**\n * caveat: an error should be thrown here if this was a proper `clamp` function but we need to handle\n * cases where `min` > `max` and in those cases return `min`.\n */\n return min;\n }\n return Math.min(max, Math.max(value, min));\n};\nconst sequentialNumberGenerator = () => {\n let value = 1;\n return { next: () => (value++).toString() };\n};\nconst range = (from, to) => {\n const result = [];\n if (typeof to !== 'number') {\n to = from;\n from = 0;\n }\n if (from <= to) {\n for (let i = from; i < to; i++) {\n result.push(i);\n }\n }\n else {\n for (let i = from; i > to; i--) {\n result.push(i);\n }\n }\n return result;\n};\n\nclass ViewItem {\n set size(size) {\n this._size = size;\n }\n get size() {\n return this._size;\n }\n get cachedVisibleSize() {\n return this._cachedVisibleSize;\n }\n get visible() {\n return typeof this._cachedVisibleSize === 'undefined';\n }\n get minimumSize() {\n return this.visible ? this.view.minimumSize : 0;\n }\n get viewMinimumSize() {\n return this.view.minimumSize;\n }\n get maximumSize() {\n return this.visible ? this.view.maximumSize : 0;\n }\n get viewMaximumSize() {\n return this.view.maximumSize;\n }\n get priority() {\n return this.view.priority;\n }\n get snap() {\n return !!this.view.snap;\n }\n set enabled(enabled) {\n this.container.style.pointerEvents = enabled ? '' : 'none';\n }\n constructor(container, view, size, disposable) {\n this.container = container;\n this.view = view;\n this.disposable = disposable;\n this._cachedVisibleSize = undefined;\n if (typeof size === 'number') {\n this._size = size;\n this._cachedVisibleSize = undefined;\n container.classList.add('visible');\n }\n else {\n this._size = 0;\n this._cachedVisibleSize = size.cachedVisibleSize;\n }\n }\n setVisible(visible, size) {\n var _a;\n if (visible === this.visible) {\n return;\n }\n if (visible) {\n this.size = clamp((_a = this._cachedVisibleSize) !== null && _a !== void 0 ? _a : 0, this.viewMinimumSize, this.viewMaximumSize);\n this._cachedVisibleSize = undefined;\n }\n else {\n this._cachedVisibleSize =\n typeof size === 'number' ? size : this.size;\n this.size = 0;\n }\n this.container.classList.toggle('visible', visible);\n if (this.view.setVisible) {\n this.view.setVisible(visible);\n }\n }\n dispose() {\n this.disposable.dispose();\n return this.view;\n }\n}\n\n/*---------------------------------------------------------------------------------------------\n * Accreditation: This file is largly based upon the MIT licenced VSCode sourcecode found at:\n * https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/splitview\n *--------------------------------------------------------------------------------------------*/\nvar Orientation;\n(function (Orientation) {\n Orientation[\"HORIZONTAL\"] = \"HORIZONTAL\";\n Orientation[\"VERTICAL\"] = \"VERTICAL\";\n})(Orientation || (Orientation = {}));\nvar SashState;\n(function (SashState) {\n SashState[SashState[\"MAXIMUM\"] = 0] = \"MAXIMUM\";\n SashState[SashState[\"MINIMUM\"] = 1] = \"MINIMUM\";\n SashState[SashState[\"DISABLED\"] = 2] = \"DISABLED\";\n SashState[SashState[\"ENABLED\"] = 3] = \"ENABLED\";\n})(SashState || (SashState = {}));\nvar LayoutPriority;\n(function (LayoutPriority) {\n LayoutPriority[\"Low\"] = \"low\";\n LayoutPriority[\"High\"] = \"high\";\n LayoutPriority[\"Normal\"] = \"normal\";\n})(LayoutPriority || (LayoutPriority = {}));\nvar Sizing;\n(function (Sizing) {\n Sizing.Distribute = { type: 'distribute' };\n function Split(index) {\n return { type: 'split', index };\n }\n Sizing.Split = Split;\n function Invisible(cachedVisibleSize) {\n return { type: 'invisible', cachedVisibleSize };\n }\n Sizing.Invisible = Invisible;\n})(Sizing || (Sizing = {}));\nclass Splitview {\n get contentSize() {\n return this._contentSize;\n }\n get size() {\n return this._size;\n }\n set size(value) {\n this._size = value;\n }\n get orthogonalSize() {\n return this._orthogonalSize;\n }\n set orthogonalSize(value) {\n this._orthogonalSize = value;\n }\n get length() {\n return this.viewItems.length;\n }\n get proportions() {\n return this._proportions ? [...this._proportions] : undefined;\n }\n get orientation() {\n return this._orientation;\n }\n set orientation(value) {\n this._orientation = value;\n const tmp = this.size;\n this.size = this.orthogonalSize;\n this.orthogonalSize = tmp;\n removeClasses(this.element, 'dv-horizontal', 'dv-vertical');\n this.element.classList.add(this.orientation == Orientation.HORIZONTAL\n ? 'dv-horizontal'\n : 'dv-vertical');\n }\n get minimumSize() {\n return this.viewItems.reduce((r, item) => r + item.minimumSize, 0);\n }\n get maximumSize() {\n return this.length === 0\n ? Number.POSITIVE_INFINITY\n : this.viewItems.reduce((r, item) => r + item.maximumSize, 0);\n }\n get startSnappingEnabled() {\n return this._startSnappingEnabled;\n }\n set startSnappingEnabled(startSnappingEnabled) {\n if (this._startSnappingEnabled === startSnappingEnabled) {\n return;\n }\n this._startSnappingEnabled = startSnappingEnabled;\n this.updateSashEnablement();\n }\n get endSnappingEnabled() {\n return this._endSnappingEnabled;\n }\n set endSnappingEnabled(endSnappingEnabled) {\n if (this._endSnappingEnabled === endSnappingEnabled) {\n return;\n }\n this._endSnappingEnabled = endSnappingEnabled;\n this.updateSashEnablement();\n }\n get disabled() {\n return this._disabled;\n }\n set disabled(value) {\n this._disabled = value;\n toggleClass(this.element, 'dv-splitview-disabled', value);\n }\n get margin() {\n return this._margin;\n }\n set margin(value) {\n this._margin = value;\n toggleClass(this.element, 'dv-splitview-has-margin', value !== 0);\n }\n constructor(container, options) {\n var _a, _b;\n this.container = container;\n this.viewItems = [];\n this.sashes = [];\n this._size = 0;\n this._orthogonalSize = 0;\n this._contentSize = 0;\n this._proportions = undefined;\n this._startSnappingEnabled = true;\n this._endSnappingEnabled = true;\n this._disabled = false;\n this._margin = 0;\n this._onDidSashEnd = new Emitter();\n this.onDidSashEnd = this._onDidSashEnd.event;\n this._onDidAddView = new Emitter();\n this.onDidAddView = this._onDidAddView.event;\n this._onDidRemoveView = new Emitter();\n this.onDidRemoveView = this._onDidRemoveView.event;\n this.resize = (index, delta, sizes = this.viewItems.map((x) => x.size), lowPriorityIndexes, highPriorityIndexes, overloadMinDelta = Number.NEGATIVE_INFINITY, overloadMaxDelta = Number.POSITIVE_INFINITY, snapBefore, snapAfter) => {\n if (index < 0 || index > this.viewItems.length) {\n return 0;\n }\n const upIndexes = range(index, -1);\n const downIndexes = range(index + 1, this.viewItems.length);\n //\n if (highPriorityIndexes) {\n for (const i of highPriorityIndexes) {\n pushToStart(upIndexes, i);\n pushToStart(downIndexes, i);\n }\n }\n if (lowPriorityIndexes) {\n for (const i of lowPriorityIndexes) {\n pushToEnd(upIndexes, i);\n pushToEnd(downIndexes, i);\n }\n }\n //\n const upItems = upIndexes.map((i) => this.viewItems[i]);\n const upSizes = upIndexes.map((i) => sizes[i]);\n //\n const downItems = downIndexes.map((i) => this.viewItems[i]);\n const downSizes = downIndexes.map((i) => sizes[i]);\n //\n const minDeltaUp = upIndexes.reduce((_, i) => _ + this.viewItems[i].minimumSize - sizes[i], 0);\n const maxDeltaUp = upIndexes.reduce((_, i) => _ + this.viewItems[i].maximumSize - sizes[i], 0);\n //\n const maxDeltaDown = downIndexes.length === 0\n ? Number.POSITIVE_INFINITY\n : downIndexes.reduce((_, i) => _ + sizes[i] - this.viewItems[i].minimumSize, 0);\n const minDeltaDown = downIndexes.length === 0\n ? Number.NEGATIVE_INFINITY\n : downIndexes.reduce((_, i) => _ + sizes[i] - this.viewItems[i].maximumSize, 0);\n //\n const minDelta = Math.max(minDeltaUp, minDeltaDown);\n const maxDelta = Math.min(maxDeltaDown, maxDeltaUp);\n //\n let snapped = false;\n if (snapBefore) {\n const snapView = this.viewItems[snapBefore.index];\n const visible = delta >= snapBefore.limitDelta;\n snapped = visible !== snapView.visible;\n snapView.setVisible(visible, snapBefore.size);\n }\n if (!snapped && snapAfter) {\n const snapView = this.viewItems[snapAfter.index];\n const visible = delta < snapAfter.limitDelta;\n snapped = visible !== snapView.visible;\n snapView.setVisible(visible, snapAfter.size);\n }\n if (snapped) {\n return this.resize(index, delta, sizes, lowPriorityIndexes, highPriorityIndexes, overloadMinDelta, overloadMaxDelta);\n }\n //\n const tentativeDelta = clamp(delta, minDelta, maxDelta);\n let actualDelta = 0;\n //\n let deltaUp = tentativeDelta;\n for (let i = 0; i < upItems.length; i++) {\n const item = upItems[i];\n const size = clamp(upSizes[i] + deltaUp, item.minimumSize, item.maximumSize);\n const viewDelta = size - upSizes[i];\n actualDelta += viewDelta;\n deltaUp -= viewDelta;\n item.size = size;\n }\n //\n let deltaDown = actualDelta;\n for (let i = 0; i < downItems.length; i++) {\n const item = downItems[i];\n const size = clamp(downSizes[i] - deltaDown, item.minimumSize, item.maximumSize);\n const viewDelta = size - downSizes[i];\n deltaDown += viewDelta;\n item.size = size;\n }\n //\n return delta;\n };\n this._orientation = (_a = options.orientation) !== null && _a !== void 0 ? _a : Orientation.VERTICAL;\n this.element = this.createContainer();\n this.margin = (_b = options.margin) !== null && _b !== void 0 ? _b : 0;\n this.proportionalLayout =\n options.proportionalLayout === undefined\n ? true\n : !!options.proportionalLayout;\n this.viewContainer = this.createViewContainer();\n this.sashContainer = this.createSashContainer();\n this.element.appendChild(this.sashContainer);\n this.element.appendChild(this.viewContainer);\n this.container.appendChild(this.element);\n this.style(options.styles);\n // We have an existing set of view, add them now\n if (options.descriptor) {\n this._size = options.descriptor.size;\n options.descriptor.views.forEach((viewDescriptor, index) => {\n const sizing = viewDescriptor.visible === undefined ||\n viewDescriptor.visible\n ? viewDescriptor.size\n : {\n type: 'invisible',\n cachedVisibleSize: viewDescriptor.size,\n };\n const view = viewDescriptor.view;\n this.addView(view, sizing, index, true\n // true skip layout\n );\n });\n // Initialize content size and proportions for first layout\n this._contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);\n this.saveProportions();\n }\n }\n style(styles) {\n if ((styles === null || styles === void 0 ? void 0 : styles.separatorBorder) === 'transparent') {\n removeClasses(this.element, 'dv-separator-border');\n this.element.style.removeProperty('--dv-separator-border');\n }\n else {\n addClasses(this.element, 'dv-separator-border');\n if (styles === null || styles === void 0 ? void 0 : styles.separatorBorder) {\n this.element.style.setProperty('--dv-separator-border', styles.separatorBorder);\n }\n }\n }\n isViewVisible(index) {\n if (index < 0 || index >= this.viewItems.length) {\n throw new Error('Index out of bounds');\n }\n const viewItem = this.viewItems[index];\n return viewItem.visible;\n }\n setViewVisible(index, visible) {\n if (index < 0 || index >= this.viewItems.length) {\n throw new Error('Index out of bounds');\n }\n const viewItem = this.viewItems[index];\n viewItem.setVisible(visible, viewItem.size);\n this.distributeEmptySpace(index);\n this.layoutViews();\n this.saveProportions();\n }\n getViewSize(index) {\n if (index < 0 || index >= this.viewItems.length) {\n return -1;\n }\n return this.viewItems[index].size;\n }\n resizeView(index, size) {\n if (index < 0 || index >= this.viewItems.length) {\n return;\n }\n const indexes = range(this.viewItems.length).filter((i) => i !== index);\n const lowPriorityIndexes = [\n ...indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.Low),\n index,\n ];\n const highPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.High);\n const item = this.viewItems[index];\n size = Math.round(size);\n size = clamp(size, item.minimumSize, Math.min(item.maximumSize, this._size));\n item.size = size;\n this.relayout(lowPriorityIndexes, highPriorityIndexes);\n }\n getViews() {\n return this.viewItems.map((x) => x.view);\n }\n onDidChange(item, size) {\n const index = this.viewItems.indexOf(item);\n if (index < 0 || index >= this.viewItems.length) {\n return;\n }\n size = typeof size === 'number' ? size : item.size;\n size = clamp(size, item.minimumSize, item.maximumSize);\n item.size = size;\n const indexes = range(this.viewItems.length).filter((i) => i !== index);\n const lowPriorityIndexes = [\n ...indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.Low),\n index,\n ];\n const highPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.High);\n /**\n * add this view we are changing to the low-index list since we have determined the size\n * here and don't want it changed\n */\n this.relayout([...lowPriorityIndexes, index], highPriorityIndexes);\n }\n addView(view, size = { type: 'distribute' }, index = this.viewItems.length, skipLayout) {\n const container = document.createElement('div');\n container.className = 'dv-view';\n container.appendChild(view.element);\n let viewSize;\n if (typeof size === 'number') {\n viewSize = size;\n }\n else if (size.type === 'split') {\n viewSize = this.getViewSize(size.index) / 2;\n }\n else if (size.type === 'invisible') {\n viewSize = { cachedVisibleSize: size.cachedVisibleSize };\n }\n else {\n viewSize = view.minimumSize;\n }\n const disposable = view.onDidChange((newSize) => this.onDidChange(viewItem, newSize.size));\n const viewItem = new ViewItem(container, view, viewSize, {\n dispose: () => {\n disposable.dispose();\n this.viewContainer.removeChild(container);\n },\n });\n if (index === this.viewItems.length) {\n this.viewContainer.appendChild(container);\n }\n else {\n this.viewContainer.insertBefore(container, this.viewContainer.children.item(index));\n }\n this.viewItems.splice(index, 0, viewItem);\n if (this.viewItems.length > 1) {\n //add sash\n const sash = document.createElement('div');\n sash.className = 'dv-sash';\n const onPointerStart = (event) => {\n for (const item of this.viewItems) {\n item.enabled = false;\n }\n const iframes = disableIframePointEvents();\n const start = this._orientation === Orientation.HORIZONTAL\n ? event.clientX\n : event.clientY;\n const sashIndex = firstIndex(this.sashes, (s) => s.container === sash);\n //\n const sizes = this.viewItems.map((x) => x.size);\n //\n let snapBefore;\n let snapAfter;\n const upIndexes = range(sashIndex, -1);\n const downIndexes = range(sashIndex + 1, this.viewItems.length);\n const minDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].minimumSize - sizes[i]), 0);\n const maxDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].viewMaximumSize - sizes[i]), 0);\n const maxDeltaDown = downIndexes.length === 0\n ? Number.POSITIVE_INFINITY\n : downIndexes.reduce((r, i) => r +\n (sizes[i] - this.viewItems[i].minimumSize), 0);\n const minDeltaDown = downIndexes.length === 0\n ? Number.NEGATIVE_INFINITY\n : downIndexes.reduce((r, i) => r +\n (sizes[i] -\n this.viewItems[i].viewMaximumSize), 0);\n const minDelta = Math.max(minDeltaUp, minDeltaDown);\n const maxDelta = Math.min(maxDeltaDown, maxDeltaUp);\n const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);\n const snapAfterIndex = this.findFirstSnapIndex(downIndexes);\n if (typeof snapBeforeIndex === 'number') {\n const snappedViewItem = this.viewItems[snapBeforeIndex];\n const halfSize = Math.floor(snappedViewItem.viewMinimumSize / 2);\n snapBefore = {\n index: snapBeforeIndex,\n limitDelta: snappedViewItem.visible\n ? minDelta - halfSize\n : minDelta + halfSize,\n size: snappedViewItem.size,\n };\n }\n if (typeof snapAfterIndex === 'number') {\n const snappedViewItem = this.viewItems[snapAfterIndex];\n const halfSize = Math.floor(snappedViewItem.viewMinimumSize / 2);\n snapAfter = {\n index: snapAfterIndex,\n limitDelta: snappedViewItem.visible\n ? maxDelta + halfSize\n : maxDelta - halfSize,\n size: snappedViewItem.size,\n };\n }\n const onPointerMove = (event) => {\n const current = this._orientation === Orientation.HORIZONTAL\n ? event.clientX\n : event.clientY;\n const delta = current - start;\n this.resize(sashIndex, delta, sizes, undefined, undefined, minDelta, maxDelta, snapBefore, snapAfter);\n this.distributeEmptySpace();\n this.layoutViews();\n };\n const end = () => {\n for (const item of this.viewItems) {\n item.enabled = true;\n }\n iframes.release();\n this.saveProportions();\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', end);\n document.removeEventListener('pointercancel', end);\n document.removeEventListener('contextmenu', end);\n this._onDidSashEnd.fire(undefined);\n };\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', end);\n document.addEventListener('pointercancel', end);\n document.addEventListener('contextmenu', end);\n };\n sash.addEventListener('pointerdown', onPointerStart);\n const sashItem = {\n container: sash,\n disposable: () => {\n sash.removeEventListener('pointerdown', onPointerStart);\n this.sashContainer.removeChild(sash);\n },\n };\n this.sashContainer.appendChild(sash);\n this.sashes.push(sashItem);\n }\n if (!skipLayout) {\n this.relayout([index]);\n }\n if (!skipLayout &&\n typeof size !== 'number' &&\n size.type === 'distribute') {\n this.distributeViewSizes();\n }\n this._onDidAddView.fire(view);\n }\n distributeViewSizes() {\n const flexibleViewItems = [];\n let flexibleSize = 0;\n for (const item of this.viewItems) {\n if (item.maximumSize - item.minimumSize > 0) {\n flexibleViewItems.push(item);\n flexibleSize += item.size;\n }\n }\n const size = Math.floor(flexibleSize / flexibleViewItems.length);\n for (const item of flexibleViewItems) {\n item.size = clamp(size, item.minimumSize, item.maximumSize);\n }\n const indexes = range(this.viewItems.length);\n const lowPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.Low);\n const highPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.High);\n this.relayout(lowPriorityIndexes, highPriorityIndexes);\n }\n removeView(index, sizing, skipLayout = false) {\n // Remove view\n const viewItem = this.viewItems.splice(index, 1)[0];\n viewItem.dispose();\n // Remove sash\n if (this.viewItems.length >= 1) {\n const sashIndex = Math.max(index - 1, 0);\n const sashItem = this.sashes.splice(sashIndex, 1)[0];\n sashItem.disposable();\n }\n if (!skipLayout) {\n this.relayout();\n }\n if (sizing && sizing.type === 'distribute') {\n this.distributeViewSizes();\n }\n this._onDidRemoveView.fire(viewItem.view);\n return viewItem.view;\n }\n getViewCachedVisibleSize(index) {\n if (index < 0 || index >= this.viewItems.length) {\n throw new Error('Index out of bounds');\n }\n const viewItem = this.viewItems[index];\n return viewItem.cachedVisibleSize;\n }\n moveView(from, to) {\n const cachedVisibleSize = this.getViewCachedVisibleSize(from);\n const sizing = typeof cachedVisibleSize === 'undefined'\n ? this.getViewSize(from)\n : Sizing.Invisible(cachedVisibleSize);\n const view = this.removeView(from, undefined, true);\n this.addView(view, sizing, to);\n }\n layout(size, orthogonalSize) {\n const previousSize = Math.max(this.size, this._contentSize);\n this.size = size;\n this.orthogonalSize = orthogonalSize;\n if (!this.proportions) {\n const indexes = range(this.viewItems.length);\n const lowPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.Low);\n const highPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.High);\n this.resize(this.viewItems.length - 1, size - previousSize, undefined, lowPriorityIndexes, highPriorityIndexes);\n }\n else {\n let total = 0;\n for (let i = 0; i < this.viewItems.length; i++) {\n const item = this.viewItems[i];\n const proportion = this.proportions[i];\n if (typeof proportion === 'number') {\n total += proportion;\n }\n else {\n size -= item.size;\n }\n }\n for (let i = 0; i < this.viewItems.length; i++) {\n const item = this.viewItems[i];\n const proportion = this.proportions[i];\n if (typeof proportion === 'number' && total > 0) {\n item.size = clamp(Math.round((proportion * size) / total), item.minimumSize, item.maximumSize);\n }\n }\n }\n this.distributeEmptySpace();\n this.layoutViews();\n }\n relayout(lowPriorityIndexes, highPriorityIndexes) {\n const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);\n this.resize(this.viewItems.length - 1, this._size - contentSize, undefined, lowPriorityIndexes, highPriorityIndexes);\n this.distributeEmptySpace();\n this.layoutViews();\n this.saveProportions();\n }\n distributeEmptySpace(lowPriorityIndex) {\n const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);\n let emptyDelta = this.size - contentSize;\n const indexes = range(this.viewItems.length - 1, -1);\n const lowPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.Low);\n const highPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.High);\n for (const index of highPriorityIndexes) {\n pushToStart(indexes, index);\n }\n for (const index of lowPriorityIndexes) {\n pushToEnd(indexes, index);\n }\n if (typeof lowPriorityIndex === 'number') {\n pushToEnd(indexes, lowPriorityIndex);\n }\n for (let i = 0; emptyDelta !== 0 && i < indexes.length; i++) {\n const item = this.viewItems[indexes[i]];\n const size = clamp(item.size + emptyDelta, item.minimumSize, item.maximumSize);\n const viewDelta = size - item.size;\n emptyDelta -= viewDelta;\n item.size = size;\n }\n }\n saveProportions() {\n if (this.proportionalLayout && this._contentSize > 0) {\n this._proportions = this.viewItems.map((i) => i.visible ? i.size / this._contentSize : undefined);\n }\n }\n /**\n * Margin explain:\n *\n * For `n` views in a splitview there will be `n-1` margins `m`.\n *\n * To fit the margins each view must reduce in size by `(m * (n - 1)) / n`.\n *\n * For each view `i` the offet must be adjusted by `m * i/(n - 1)`.\n */\n layoutViews() {\n this._contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);\n this.updateSashEnablement();\n if (this.viewItems.length === 0) {\n return;\n }\n const visibleViewItems = this.viewItems.filter((i) => i.visible);\n const sashCount = Math.max(0, visibleViewItems.length - 1);\n const marginReducedSize = (this.margin * sashCount) / Math.max(1, visibleViewItems.length);\n let totalLeftOffset = 0;\n const viewLeftOffsets = [];\n const sashWidth = 4; // hardcoded in css\n const runningVisiblePanelCount = this.viewItems.reduce((arr, viewItem, i) => {\n const flag = viewItem.visible ? 1 : 0;\n if (i === 0) {\n arr.push(flag);\n }\n else {\n arr.push(arr[i - 1] + flag);\n }\n return arr;\n }, []);\n // calculate both view and cash positions\n this.viewItems.forEach((view, i) => {\n totalLeftOffset += this.viewItems[i].size;\n viewLeftOffsets.push(totalLeftOffset);\n const size = view.visible ? view.size - marginReducedSize : 0;\n const visiblePanelsBeforeThisView = Math.max(0, runningVisiblePanelCount[i] - 1);\n const offset = i === 0 || visiblePanelsBeforeThisView === 0\n ? 0\n : viewLeftOffsets[i - 1] +\n (visiblePanelsBeforeThisView / sashCount) *\n marginReducedSize;\n if (i < this.viewItems.length - 1) {\n // calculate sash position\n const newSize = view.visible\n ? offset + size - sashWidth / 2 + this.margin / 2\n : offset;\n if (this._orientation === Orientation.HORIZONTAL) {\n this.sashes[i].container.style.left = `${newSize}px`;\n this.sashes[i].container.style.top = `0px`;\n }\n if (this._orientation === Orientation.VERTICAL) {\n this.sashes[i].container.style.left = `0px`;\n this.sashes[i].container.style.top = `${newSize}px`;\n }\n }\n // calculate view position\n if (this._orientation === Orientation.HORIZONTAL) {\n view.container.style.width = `${size}px`;\n view.container.style.left = `${offset}px`;\n view.container.style.top = '';\n view.container.style.height = '';\n }\n if (this._orientation === Orientation.VERTICAL) {\n view.container.style.height = `${size}px`;\n view.container.style.top = `${offset}px`;\n view.container.style.width = '';\n view.container.style.left = '';\n }\n view.view.layout(view.size - marginReducedSize, this._orthogonalSize);\n });\n }\n findFirstSnapIndex(indexes) {\n // visible views first\n for (const index of indexes) {\n const viewItem = this.viewItems[index];\n if (!viewItem.visible) {\n continue;\n }\n if (viewItem.snap) {\n return index;\n }\n }\n // then, hidden views\n for (const index of indexes) {\n const viewItem = this.viewItems[index];\n if (viewItem.visible &&\n viewItem.maximumSize - viewItem.minimumSize > 0) {\n return undefined;\n }\n if (!viewItem.visible && viewItem.snap) {\n return index;\n }\n }\n return undefined;\n }\n updateSashEnablement() {\n let previous = false;\n const collapsesDown = this.viewItems.map((i) => (previous = i.size - i.minimumSize > 0 || previous));\n previous = false;\n const expandsDown = this.viewItems.map((i) => (previous = i.maximumSize - i.size > 0 || previous));\n const reverseViews = [...this.viewItems].reverse();\n previous = false;\n const collapsesUp = reverseViews\n .map((i) => (previous = i.size - i.minimumSize > 0 || previous))\n .reverse();\n previous = false;\n const expandsUp = reverseViews\n .map((i) => (previous = i.maximumSize - i.size > 0 || previous))\n .reverse();\n let position = 0;\n for (let index = 0; index < this.sashes.length; index++) {\n const sash = this.sashes[index];\n const viewItem = this.viewItems[index];\n position += viewItem.size;\n const min = !(collapsesDown[index] && expandsUp[index + 1]);\n const max = !(expandsDown[index] && collapsesUp[index + 1]);\n if (min && max) {\n const upIndexes = range(index, -1);\n const downIndexes = range(index + 1, this.viewItems.length);\n const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);\n const snapAfterIndex = this.findFirstSnapIndex(downIndexes);\n const snappedBefore = typeof snapBeforeIndex === 'number' &&\n !this.viewItems[snapBeforeIndex].visible;\n const snappedAfter = typeof snapAfterIndex === 'number' &&\n !this.viewItems[snapAfterIndex].visible;\n if (snappedBefore &&\n collapsesUp[index] &&\n (position > 0 || this.startSnappingEnabled)) {\n this.updateSash(sash, SashState.MINIMUM);\n }\n else if (snappedAfter &&\n collapsesDown[index] &&\n (position < this._contentSize || this.endSnappingEnabled)) {\n this.updateSash(sash, SashState.MAXIMUM);\n }\n else {\n this.updateSash(sash, SashState.DISABLED);\n }\n }\n else if (min && !max) {\n this.updateSash(sash, SashState.MINIMUM);\n }\n else if (!min && max) {\n this.updateSash(sash, SashState.MAXIMUM);\n }\n else {\n this.updateSash(sash, SashState.ENABLED);\n }\n }\n }\n updateSash(sash, state) {\n toggleClass(sash.container, 'dv-disabled', state === SashState.DISABLED);\n toggleClass(sash.container, 'dv-enabled', state === SashState.ENABLED);\n toggleClass(sash.container, 'dv-maximum', state === SashState.MAXIMUM);\n toggleClass(sash.container, 'dv-minimum', state === SashState.MINIMUM);\n }\n createViewContainer() {\n const element = document.createElement('div');\n element.className = 'dv-view-container';\n return element;\n }\n createSashContainer() {\n const element = document.createElement('div');\n element.className = 'dv-sash-container';\n return element;\n }\n createContainer() {\n const element = document.createElement('div');\n const orientationClassname = this._orientation === Orientation.HORIZONTAL\n ? 'dv-horizontal'\n : 'dv-vertical';\n element.className = `dv-split-view-container ${orientationClassname}`;\n return element;\n }\n dispose() {\n this._onDidSashEnd.dispose();\n this._onDidAddView.dispose();\n this._onDidRemoveView.dispose();\n for (let i = 0; i < this.element.children.length; i++) {\n if (this.element.children.item(i) === this.element) {\n this.element.removeChild(this.element);\n break;\n }\n }\n for (const viewItem of this.viewItems) {\n viewItem.dispose();\n }\n this.element.remove();\n }\n}\n\nconst PROPERTY_KEYS_SPLITVIEW = (() => {\n /**\n * by readong the keys from an empty value object TypeScript will error\n * when we add or remove new properties to `DockviewOptions`\n */\n const properties = {\n orientation: undefined,\n descriptor: undefined,\n proportionalLayout: undefined,\n styles: undefined,\n margin: undefined,\n disableAutoResizing: undefined,\n className: undefined,\n };\n return Object.keys(properties);\n})();\n\nclass Paneview extends CompositeDisposable {\n get onDidAddView() {\n return this.splitview.onDidAddView;\n }\n get onDidRemoveView() {\n return this.splitview.onDidRemoveView;\n }\n get minimumSize() {\n return this.splitview.minimumSize;\n }\n get maximumSize() {\n return this.splitview.maximumSize;\n }\n get orientation() {\n return this.splitview.orientation;\n }\n get size() {\n return this.splitview.size;\n }\n get orthogonalSize() {\n return this.splitview.orthogonalSize;\n }\n constructor(container, options) {\n var _a;\n super();\n this.paneItems = [];\n this.skipAnimation = false;\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this._orientation = (_a = options.orientation) !== null && _a !== void 0 ? _a : Orientation.VERTICAL;\n this.element = document.createElement('div');\n this.element.className = 'dv-pane-container';\n container.appendChild(this.element);\n this.splitview = new Splitview(this.element, {\n orientation: this._orientation,\n proportionalLayout: false,\n descriptor: options.descriptor,\n });\n // if we've added views from the descriptor we need to\n // add the panes to our Pane array and setup animation\n this.getPanes().forEach((pane) => {\n const disposable = new CompositeDisposable(pane.onDidChangeExpansionState(() => {\n this.setupAnimation();\n this._onDidChange.fire(undefined);\n }));\n const paneItem = {\n pane,\n disposable: {\n dispose: () => {\n disposable.dispose();\n },\n },\n };\n this.paneItems.push(paneItem);\n pane.orthogonalSize = this.splitview.orthogonalSize;\n });\n this.addDisposables(this._onDidChange, this.splitview.onDidSashEnd(() => {\n this._onDidChange.fire(undefined);\n }), this.splitview.onDidAddView(() => {\n this._onDidChange.fire();\n }), this.splitview.onDidRemoveView(() => {\n this._onDidChange.fire();\n }));\n }\n setViewVisible(index, visible) {\n this.splitview.setViewVisible(index, visible);\n }\n addPane(pane, size, index = this.splitview.length, skipLayout = false) {\n const disposable = pane.onDidChangeExpansionState(() => {\n this.setupAnimation();\n this._onDidChange.fire(undefined);\n });\n const paneItem = {\n pane,\n disposable: {\n dispose: () => {\n disposable.dispose();\n },\n },\n };\n this.paneItems.splice(index, 0, paneItem);\n pane.orthogonalSize = this.splitview.orthogonalSize;\n this.splitview.addView(pane, size, index, skipLayout);\n }\n getViewSize(index) {\n return this.splitview.getViewSize(index);\n }\n getPanes() {\n return this.splitview.getViews();\n }\n removePane(index, options = { skipDispose: false }) {\n const paneItem = this.paneItems.splice(index, 1)[0];\n this.splitview.removeView(index);\n if (!options.skipDispose) {\n paneItem.disposable.dispose();\n paneItem.pane.dispose();\n }\n return paneItem;\n }\n moveView(from, to) {\n if (from === to) {\n return;\n }\n const view = this.removePane(from, { skipDispose: true });\n this.skipAnimation = true;\n try {\n this.addPane(view.pane, view.pane.size, to, false);\n }\n finally {\n this.skipAnimation = false;\n }\n }\n layout(size, orthogonalSize) {\n this.splitview.layout(size, orthogonalSize);\n }\n setupAnimation() {\n if (this.skipAnimation) {\n return;\n }\n if (this.animationTimer) {\n clearTimeout(this.animationTimer);\n this.animationTimer = undefined;\n }\n addClasses(this.element, 'dv-animated');\n this.animationTimer = setTimeout(() => {\n this.animationTimer = undefined;\n removeClasses(this.element, 'dv-animated');\n }, 200);\n }\n dispose() {\n super.dispose();\n if (this.animationTimer) {\n clearTimeout(this.animationTimer);\n this.animationTimer = undefined;\n }\n this.paneItems.forEach((paneItem) => {\n paneItem.disposable.dispose();\n paneItem.pane.dispose();\n });\n this.paneItems = [];\n this.splitview.dispose();\n this.element.remove();\n }\n}\n\n/*---------------------------------------------------------------------------------------------\n * Accreditation: This file is largly based upon the MIT licenced VSCode sourcecode found at:\n * https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/grid\n *--------------------------------------------------------------------------------------------*/\nclass LeafNode {\n get minimumWidth() {\n return this.view.minimumWidth;\n }\n get maximumWidth() {\n return this.view.maximumWidth;\n }\n get minimumHeight() {\n return this.view.minimumHeight;\n }\n get maximumHeight() {\n return this.view.maximumHeight;\n }\n get priority() {\n return this.view.priority;\n }\n get snap() {\n return this.view.snap;\n }\n get minimumSize() {\n return this.orientation === Orientation.HORIZONTAL\n ? this.minimumHeight\n : this.minimumWidth;\n }\n get maximumSize() {\n return this.orientation === Orientation.HORIZONTAL\n ? this.maximumHeight\n : this.maximumWidth;\n }\n get minimumOrthogonalSize() {\n return this.orientation === Orientation.HORIZONTAL\n ? this.minimumWidth\n : this.minimumHeight;\n }\n get maximumOrthogonalSize() {\n return this.orientation === Orientation.HORIZONTAL\n ? this.maximumWidth\n : this.maximumHeight;\n }\n get orthogonalSize() {\n return this._orthogonalSize;\n }\n get size() {\n return this._size;\n }\n get element() {\n return this.view.element;\n }\n get width() {\n return this.orientation === Orientation.HORIZONTAL\n ? this.orthogonalSize\n : this.size;\n }\n get height() {\n return this.orientation === Orientation.HORIZONTAL\n ? this.size\n : this.orthogonalSize;\n }\n constructor(view, orientation, orthogonalSize, size = 0) {\n this.view = view;\n this.orientation = orientation;\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this._orthogonalSize = orthogonalSize;\n this._size = size;\n this._disposable = this.view.onDidChange((event) => {\n if (event) {\n this._onDidChange.fire({\n size: this.orientation === Orientation.VERTICAL\n ? event.width\n : event.height,\n orthogonalSize: this.orientation === Orientation.VERTICAL\n ? event.height\n : event.width,\n });\n }\n else {\n this._onDidChange.fire({});\n }\n });\n }\n setVisible(visible) {\n if (this.view.setVisible) {\n this.view.setVisible(visible);\n }\n }\n layout(size, orthogonalSize) {\n this._size = size;\n this._orthogonalSize = orthogonalSize;\n this.view.layout(this.width, this.height);\n }\n dispose() {\n this._onDidChange.dispose();\n this._disposable.dispose();\n }\n}\n\n/*---------------------------------------------------------------------------------------------\n * Accreditation: This file is largly based upon the MIT licenced VSCode sourcecode found at:\n * https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/grid\n *--------------------------------------------------------------------------------------------*/\nclass BranchNode extends CompositeDisposable {\n get width() {\n return this.orientation === Orientation.HORIZONTAL\n ? this.size\n : this.orthogonalSize;\n }\n get height() {\n return this.orientation === Orientation.HORIZONTAL\n ? this.orthogonalSize\n : this.size;\n }\n get minimumSize() {\n return this.children.length === 0\n ? 0\n : Math.max(...this.children.map((c, index) => this.splitview.isViewVisible(index)\n ? c.minimumOrthogonalSize\n : 0));\n }\n get maximumSize() {\n return Math.min(...this.children.map((c, index) => this.splitview.isViewVisible(index)\n ? c.maximumOrthogonalSize\n : Number.POSITIVE_INFINITY));\n }\n get minimumOrthogonalSize() {\n return this.splitview.minimumSize;\n }\n get maximumOrthogonalSize() {\n return this.splitview.maximumSize;\n }\n get orthogonalSize() {\n return this._orthogonalSize;\n }\n get size() {\n return this._size;\n }\n get minimumWidth() {\n return this.orientation === Orientation.HORIZONTAL\n ? this.minimumOrthogonalSize\n : this.minimumSize;\n }\n get minimumHeight() {\n return this.orientation === Orientation.HORIZONTAL\n ? this.minimumSize\n : this.minimumOrthogonalSize;\n }\n get maximumWidth() {\n return this.orientation === Orientation.HORIZONTAL\n ? this.maximumOrthogonalSize\n : this.maximumSize;\n }\n get maximumHeight() {\n return this.orientation === Orientation.HORIZONTAL\n ? this.maximumSize\n : this.maximumOrthogonalSize;\n }\n get priority() {\n if (this.children.length === 0) {\n return LayoutPriority.Normal;\n }\n const priorities = this.children.map((c) => typeof c.priority === 'undefined'\n ? LayoutPriority.Normal\n : c.priority);\n if (priorities.some((p) => p === LayoutPriority.High)) {\n return LayoutPriority.High;\n }\n else if (priorities.some((p) => p === LayoutPriority.Low)) {\n return LayoutPriority.Low;\n }\n return LayoutPriority.Normal;\n }\n get disabled() {\n return this.splitview.disabled;\n }\n set disabled(value) {\n this.splitview.disabled = value;\n }\n get margin() {\n return this.splitview.margin;\n }\n set margin(value) {\n this.splitview.margin = value;\n this.children.forEach((child) => {\n if (child instanceof BranchNode) {\n child.margin = value;\n }\n });\n }\n constructor(orientation, proportionalLayout, styles, size, orthogonalSize, disabled, margin, childDescriptors) {\n super();\n this.orientation = orientation;\n this.proportionalLayout = proportionalLayout;\n this.styles = styles;\n this._childrenDisposable = Disposable.NONE;\n this.children = [];\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this._onDidVisibilityChange = new Emitter();\n this.onDidVisibilityChange = this._onDidVisibilityChange.event;\n this._orthogonalSize = orthogonalSize;\n this._size = size;\n this.element = document.createElement('div');\n this.element.className = 'dv-branch-node';\n if (!childDescriptors) {\n this.splitview = new Splitview(this.element, {\n orientation: this.orientation,\n proportionalLayout,\n styles,\n margin,\n });\n this.splitview.layout(this.size, this.orthogonalSize);\n }\n else {\n const descriptor = {\n views: childDescriptors.map((childDescriptor) => {\n return {\n view: childDescriptor.node,\n size: childDescriptor.node.size,\n visible: childDescriptor.node instanceof LeafNode &&\n childDescriptor.visible !== undefined\n ? childDescriptor.visible\n : true,\n };\n }),\n size: this.orthogonalSize,\n };\n this.children = childDescriptors.map((c) => c.node);\n this.splitview = new Splitview(this.element, {\n orientation: this.orientation,\n descriptor,\n proportionalLayout,\n styles,\n margin,\n });\n }\n this.disabled = disabled;\n this.addDisposables(this._onDidChange, this._onDidVisibilityChange, this.splitview.onDidSashEnd(() => {\n this._onDidChange.fire({});\n }));\n this.setupChildrenEvents();\n }\n setVisible(_visible) {\n // noop\n }\n isChildVisible(index) {\n if (index < 0 || index >= this.children.length) {\n throw new Error('Invalid index');\n }\n return this.splitview.isViewVisible(index);\n }\n setChildVisible(index, visible) {\n if (index < 0 || index >= this.children.length) {\n throw new Error('Invalid index');\n }\n if (this.splitview.isViewVisible(index) === visible) {\n return;\n }\n const wereAllChildrenHidden = this.splitview.contentSize === 0;\n this.splitview.setViewVisible(index, visible);\n // }\n const areAllChildrenHidden = this.splitview.contentSize === 0;\n // If all children are hidden then the parent should hide the entire splitview\n // If the entire splitview is hidden then the parent should show the splitview when a child is shown\n if ((visible && wereAllChildrenHidden) ||\n (!visible && areAllChildrenHidden)) {\n this._onDidVisibilityChange.fire({ visible });\n }\n }\n moveChild(from, to) {\n if (from === to) {\n return;\n }\n if (from < 0 || from >= this.children.length) {\n throw new Error('Invalid from index');\n }\n if (from < to) {\n to--;\n }\n this.splitview.moveView(from, to);\n const child = this._removeChild(from);\n this._addChild(child, to);\n }\n getChildSize(index) {\n if (index < 0 || index >= this.children.length) {\n throw new Error('Invalid index');\n }\n return this.splitview.getViewSize(index);\n }\n resizeChild(index, size) {\n if (index < 0 || index >= this.children.length) {\n throw new Error('Invalid index');\n }\n this.splitview.resizeView(index, size);\n }\n layout(size, orthogonalSize) {\n this._size = orthogonalSize;\n this._orthogonalSize = size;\n this.splitview.layout(orthogonalSize, size);\n }\n addChild(node, size, index, skipLayout) {\n if (index < 0 || index > this.children.length) {\n throw new Error('Invalid index');\n }\n this.splitview.addView(node, size, index, skipLayout);\n this._addChild(node, index);\n }\n getChildCachedVisibleSize(index) {\n if (index < 0 || index >= this.children.length) {\n throw new Error('Invalid index');\n }\n return this.splitview.getViewCachedVisibleSize(index);\n }\n removeChild(index, sizing) {\n if (index < 0 || index >= this.children.length) {\n throw new Error('Invalid index');\n }\n this.splitview.removeView(index, sizing);\n return this._removeChild(index);\n }\n _addChild(node, index) {\n this.children.splice(index, 0, node);\n this.setupChildrenEvents();\n }\n _removeChild(index) {\n const [child] = this.children.splice(index, 1);\n this.setupChildrenEvents();\n return child;\n }\n setupChildrenEvents() {\n this._childrenDisposable.dispose();\n this._childrenDisposable = new CompositeDisposable(Event.any(...this.children.map((c) => c.onDidChange))((e) => {\n /**\n * indicate a change has occured to allows any re-rendering but don't bubble\n * event because that was specific to this branch\n */\n this._onDidChange.fire({ size: e.orthogonalSize });\n }), ...this.children.map((c, i) => {\n if (c instanceof BranchNode) {\n return c.onDidVisibilityChange(({ visible }) => {\n this.setChildVisible(i, visible);\n });\n }\n return Disposable.NONE;\n }));\n }\n dispose() {\n this._childrenDisposable.dispose();\n this.splitview.dispose();\n this.children.forEach((child) => child.dispose());\n super.dispose();\n }\n}\n\n/*---------------------------------------------------------------------------------------------\n * Accreditation: This file is largly based upon the MIT licenced VSCode sourcecode found at:\n * https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/grid\n *--------------------------------------------------------------------------------------------*/\nfunction findLeaf(candiateNode, last) {\n if (candiateNode instanceof LeafNode) {\n return candiateNode;\n }\n if (candiateNode instanceof BranchNode) {\n return findLeaf(candiateNode.children[last ? candiateNode.children.length - 1 : 0], last);\n }\n throw new Error('invalid node');\n}\nfunction cloneNode(node, size, orthogonalSize) {\n if (node instanceof BranchNode) {\n const result = new BranchNode(node.orientation, node.proportionalLayout, node.styles, size, orthogonalSize, node.disabled, node.margin);\n for (let i = node.children.length - 1; i >= 0; i--) {\n const child = node.children[i];\n result.addChild(cloneNode(child, child.size, child.orthogonalSize), child.size, 0, true);\n }\n return result;\n }\n else {\n return new LeafNode(node.view, node.orientation, orthogonalSize);\n }\n}\nfunction flipNode(node, size, orthogonalSize) {\n if (node instanceof BranchNode) {\n const result = new BranchNode(orthogonal(node.orientation), node.proportionalLayout, node.styles, size, orthogonalSize, node.disabled, node.margin);\n let totalSize = 0;\n for (let i = node.children.length - 1; i >= 0; i--) {\n const child = node.children[i];\n const childSize = child instanceof BranchNode ? child.orthogonalSize : child.size;\n let newSize = node.size === 0\n ? 0\n : Math.round((size * childSize) / node.size);\n totalSize += newSize;\n // The last view to add should adjust to rounding errors\n if (i === 0) {\n newSize += size - totalSize;\n }\n result.addChild(flipNode(child, orthogonalSize, newSize), newSize, 0, true);\n }\n return result;\n }\n else {\n return new LeafNode(node.view, orthogonal(node.orientation), orthogonalSize);\n }\n}\nfunction indexInParent(element) {\n const parentElement = element.parentElement;\n if (!parentElement) {\n throw new Error('Invalid grid element');\n }\n let el = parentElement.firstElementChild;\n let index = 0;\n while (el !== element && el !== parentElement.lastElementChild && el) {\n el = el.nextElementSibling;\n index++;\n }\n return index;\n}\n/**\n * Find the grid location of a specific DOM element by traversing the parent\n * chain and finding each child index on the way.\n *\n * This will break as soon as DOM structures of the Splitview or Gridview change.\n */\nfunction getGridLocation(element) {\n const parentElement = element.parentElement;\n if (!parentElement) {\n throw new Error('Invalid grid element');\n }\n if (/\\bdv-grid-view\\b/.test(parentElement.className)) {\n return [];\n }\n const index = indexInParent(parentElement);\n const ancestor = parentElement.parentElement.parentElement.parentElement;\n return [...getGridLocation(ancestor), index];\n}\nfunction getRelativeLocation(rootOrientation, location, direction) {\n const orientation = getLocationOrientation(rootOrientation, location);\n const directionOrientation = getDirectionOrientation(direction);\n if (orientation === directionOrientation) {\n const [rest, _index] = tail(location);\n let index = _index;\n if (direction === 'right' || direction === 'bottom') {\n index += 1;\n }\n return [...rest, index];\n }\n else {\n const index = direction === 'right' || direction === 'bottom' ? 1 : 0;\n return [...location, index];\n }\n}\nfunction getDirectionOrientation(direction) {\n return direction === 'top' || direction === 'bottom'\n ? Orientation.VERTICAL\n : Orientation.HORIZONTAL;\n}\nfunction getLocationOrientation(rootOrientation, location) {\n return location.length % 2 === 0\n ? orthogonal(rootOrientation)\n : rootOrientation;\n}\nconst orthogonal = (orientation) => orientation === Orientation.HORIZONTAL\n ? Orientation.VERTICAL\n : Orientation.HORIZONTAL;\nfunction isGridBranchNode(node) {\n return !!node.children;\n}\nconst serializeBranchNode = (node, orientation) => {\n const size = orientation === Orientation.VERTICAL ? node.box.width : node.box.height;\n if (!isGridBranchNode(node)) {\n if (typeof node.cachedVisibleSize === 'number') {\n return {\n type: 'leaf',\n data: node.view.toJSON(),\n size: node.cachedVisibleSize,\n visible: false,\n };\n }\n return { type: 'leaf', data: node.view.toJSON(), size };\n }\n return {\n type: 'branch',\n data: node.children.map((c) => serializeBranchNode(c, orthogonal(orientation))),\n size,\n };\n};\nclass Gridview {\n get length() {\n return this._root ? this._root.children.length : 0;\n }\n get orientation() {\n return this.root.orientation;\n }\n set orientation(orientation) {\n if (this.root.orientation === orientation) {\n return;\n }\n const { size, orthogonalSize } = this.root;\n this.root = flipNode(this.root, orthogonalSize, size);\n this.root.layout(size, orthogonalSize);\n }\n get width() {\n return this.root.width;\n }\n get height() {\n return this.root.height;\n }\n get minimumWidth() {\n return this.root.minimumWidth;\n }\n get minimumHeight() {\n return this.root.minimumHeight;\n }\n get maximumWidth() {\n return this.root.maximumHeight;\n }\n get maximumHeight() {\n return this.root.maximumHeight;\n }\n get locked() {\n return this._locked;\n }\n set locked(value) {\n this._locked = value;\n const branch = [this.root];\n /**\n * simple depth-first-search to cover all nodes\n *\n * @see https://en.wikipedia.org/wiki/Depth-first_search\n */\n while (branch.length > 0) {\n const node = branch.pop();\n if (node instanceof BranchNode) {\n node.disabled = value;\n branch.push(...node.children);\n }\n }\n }\n get margin() {\n return this._margin;\n }\n set margin(value) {\n this._margin = value;\n this.root.margin = value;\n }\n maximizedView() {\n var _a;\n return (_a = this._maximizedNode) === null || _a === void 0 ? void 0 : _a.leaf.view;\n }\n hasMaximizedView() {\n return this._maximizedNode !== undefined;\n }\n maximizeView(view) {\n var _a;\n const location = getGridLocation(view.element);\n const [_, node] = this.getNode(location);\n if (!(node instanceof LeafNode)) {\n return;\n }\n if (((_a = this._maximizedNode) === null || _a === void 0 ? void 0 : _a.leaf) === node) {\n return;\n }\n if (this.hasMaximizedView()) {\n this.exitMaximizedView();\n }\n serializeBranchNode(this.getView(), this.orientation);\n const hiddenOnMaximize = [];\n function hideAllViewsBut(parent, exclude) {\n for (let i = 0; i < parent.children.length; i++) {\n const child = parent.children[i];\n if (child instanceof LeafNode) {\n if (child !== exclude) {\n if (parent.isChildVisible(i)) {\n parent.setChildVisible(i, false);\n }\n else {\n hiddenOnMaximize.push(child);\n }\n }\n }\n else {\n hideAllViewsBut(child, exclude);\n }\n }\n }\n hideAllViewsBut(this.root, node);\n this._maximizedNode = { leaf: node, hiddenOnMaximize };\n this._onDidMaximizedNodeChange.fire({\n view: node.view,\n isMaximized: true,\n });\n }\n exitMaximizedView() {\n if (!this._maximizedNode) {\n return;\n }\n const hiddenOnMaximize = this._maximizedNode.hiddenOnMaximize;\n function showViewsInReverseOrder(parent) {\n for (let index = parent.children.length - 1; index >= 0; index--) {\n const child = parent.children[index];\n if (child instanceof LeafNode) {\n if (!hiddenOnMaximize.includes(child)) {\n parent.setChildVisible(index, true);\n }\n }\n else {\n showViewsInReverseOrder(child);\n }\n }\n }\n showViewsInReverseOrder(this.root);\n const tmp = this._maximizedNode.leaf;\n this._maximizedNode = undefined;\n this._onDidMaximizedNodeChange.fire({\n view: tmp.view,\n isMaximized: false,\n });\n }\n serialize() {\n const maximizedView = this.maximizedView();\n let maxmizedViewLocation;\n if (maximizedView) {\n /**\n * The minimum information we can get away with in order to serialize a maxmized view is it's location within the grid\n * which is represented as a branch of indices\n */\n maxmizedViewLocation = getGridLocation(maximizedView.element);\n }\n /**\n * We pause the onDidMaximizedNodeChange events because this method needs to\n * call `this.exitMaximizedView()`. We don't want this to invoke any listeners\n * since we undo it before leaving this method\n */\n const pauseToken = this._onDidMaximizedNodeChange.pause();\n try {\n if (this.hasMaximizedView()) {\n /**\n * the saved layout cannot be in its maxmized state otherwise all of the underlying\n * view dimensions will be wrong\n *\n * To counteract this we temporaily remove the maximized view to compute the serialized output\n * of the grid before adding back the maxmized view as to not alter the layout from the users\n * perspective when `.toJSON()` is called\n */\n this.exitMaximizedView();\n }\n const root = serializeBranchNode(this.getView(), this.orientation);\n const result = {\n root,\n width: this.width,\n height: this.height,\n orientation: this.orientation,\n };\n if (maxmizedViewLocation) {\n result.maximizedNode = {\n location: maxmizedViewLocation,\n };\n }\n if (maximizedView) {\n // replace any maximzied view that was removed for serialization purposes\n this.maximizeView(maximizedView);\n }\n return result;\n }\n finally {\n pauseToken.dispose();\n }\n }\n dispose() {\n this.disposable.dispose();\n this._onDidChange.dispose();\n this._onDidMaximizedNodeChange.dispose();\n this._onDidViewVisibilityChange.dispose();\n this.root.dispose();\n this._maximizedNode = undefined;\n this.element.remove();\n }\n clear() {\n const orientation = this.root.orientation;\n this.root = new BranchNode(orientation, this.proportionalLayout, this.styles, this.root.size, this.root.orthogonalSize, this.locked, this.margin);\n }\n deserialize(json, deserializer) {\n const orientation = json.orientation;\n const height = orientation === Orientation.VERTICAL ? json.height : json.width;\n this._deserialize(json.root, orientation, deserializer, height);\n /**\n * The deserialied layout must be positioned through this.layout(...)\n * before any maximizedNode can be positioned\n */\n this.layout(json.width, json.height);\n if (json.maximizedNode) {\n const location = json.maximizedNode.location;\n const [_, node] = this.getNode(location);\n if (!(node instanceof LeafNode)) {\n return;\n }\n this.maximizeView(node.view);\n }\n }\n _deserialize(root, orientation, deserializer, orthogonalSize) {\n this.root = this._deserializeNode(root, orientation, deserializer, orthogonalSize);\n }\n _deserializeNode(node, orientation, deserializer, orthogonalSize) {\n var _a;\n let result;\n if (node.type === 'branch') {\n const serializedChildren = node.data;\n const children = serializedChildren.map((serializedChild) => {\n return {\n node: this._deserializeNode(serializedChild, orthogonal(orientation), deserializer, node.size),\n visible: serializedChild.visible,\n };\n });\n result = new BranchNode(orientation, this.proportionalLayout, this.styles, node.size, // <- orthogonal size - flips at each depth\n orthogonalSize, // <- size - flips at each depth,\n this.locked, this.margin, children);\n }\n else {\n const view = deserializer.fromJSON(node);\n if (typeof node.visible === 'boolean') {\n (_a = view.setVisible) === null || _a === void 0 ? void 0 : _a.call(view, node.visible);\n }\n result = new LeafNode(view, orientation, orthogonalSize, node.size);\n }\n return result;\n }\n get root() {\n return this._root;\n }\n set root(root) {\n const oldRoot = this._root;\n if (oldRoot) {\n oldRoot.dispose();\n this._maximizedNode = undefined;\n this.element.removeChild(oldRoot.element);\n }\n this._root = root;\n this.element.appendChild(this._root.element);\n this.disposable.value = this._root.onDidChange((e) => {\n this._onDidChange.fire(e);\n });\n }\n normalize() {\n if (!this._root) {\n return;\n }\n if (this._root.children.length !== 1) {\n return;\n }\n const oldRoot = this.root;\n // can remove one level of redundant branching if there is only a single child\n const childReference = oldRoot.children[0];\n if (childReference instanceof LeafNode) {\n return;\n }\n oldRoot.element.remove();\n const child = oldRoot.removeChild(0); // Remove child to prevent double disposal\n oldRoot.dispose(); // Dispose old root (won't dispose removed child)\n child.dispose(); // Dispose the removed child\n this._root = cloneNode(childReference, childReference.size, childReference.orthogonalSize);\n this.element.appendChild(this._root.element);\n this.disposable.value = this._root.onDidChange((e) => {\n this._onDidChange.fire(e);\n });\n }\n /**\n * If the root is orientated as a VERTICAL node then nest the existing root within a new HORIZIONTAL root node\n * If the root is orientated as a HORIZONTAL node then nest the existing root within a new VERITCAL root node\n */\n insertOrthogonalSplitviewAtRoot() {\n if (!this._root) {\n return;\n }\n const oldRoot = this.root;\n oldRoot.element.remove();\n this._root = new BranchNode(orthogonal(oldRoot.orientation), this.proportionalLayout, this.styles, this.root.orthogonalSize, this.root.size, this.locked, this.margin);\n if (oldRoot.children.length === 0) ;\n else if (oldRoot.children.length === 1) {\n // can remove one level of redundant branching if there is only a single child\n const childReference = oldRoot.children[0];\n const child = oldRoot.removeChild(0); // remove to prevent disposal when disposing of unwanted root\n child.dispose();\n oldRoot.dispose();\n this._root.addChild(\n /**\n * the child node will have the same orientation as the new root since\n * we are removing the inbetween node.\n * the entire 'tree' must be flipped recursively to ensure that the orientation\n * flips at each level\n */\n flipNode(childReference, childReference.orthogonalSize, childReference.size), Sizing.Distribute, 0);\n }\n else {\n this._root.addChild(oldRoot, Sizing.Distribute, 0);\n }\n this.element.appendChild(this._root.element);\n this.disposable.value = this._root.onDidChange((e) => {\n this._onDidChange.fire(e);\n });\n }\n next(location) {\n return this.progmaticSelect(location);\n }\n previous(location) {\n return this.progmaticSelect(location, true);\n }\n getView(location) {\n const node = location ? this.getNode(location)[1] : this.root;\n return this._getViews(node, this.orientation);\n }\n _getViews(node, orientation, cachedVisibleSize) {\n const box = { height: node.height, width: node.width };\n if (node instanceof LeafNode) {\n return { box, view: node.view, cachedVisibleSize };\n }\n const children = [];\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const nodeCachedVisibleSize = node.getChildCachedVisibleSize(i);\n children.push(this._getViews(child, orthogonal(orientation), nodeCachedVisibleSize));\n }\n return { box, children };\n }\n progmaticSelect(location, reverse = false) {\n const [path, node] = this.getNode(location);\n if (!(node instanceof LeafNode)) {\n throw new Error('invalid location');\n }\n for (let i = path.length - 1; i > -1; i--) {\n const n = path[i];\n const l = location[i] || 0;\n const canProgressInCurrentLevel = reverse\n ? l - 1 > -1\n : l + 1 < n.children.length;\n if (canProgressInCurrentLevel) {\n return findLeaf(n.children[reverse ? l - 1 : l + 1], reverse);\n }\n }\n return findLeaf(this.root, reverse);\n }\n constructor(proportionalLayout, styles, orientation, locked, margin) {\n this.proportionalLayout = proportionalLayout;\n this.styles = styles;\n this._locked = false;\n this._margin = 0;\n this._maximizedNode = undefined;\n this.disposable = new MutableDisposable();\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this._onDidViewVisibilityChange = new Emitter();\n this.onDidViewVisibilityChange = this._onDidViewVisibilityChange.event;\n this._onDidMaximizedNodeChange = new Emitter();\n this.onDidMaximizedNodeChange = this._onDidMaximizedNodeChange.event;\n this.element = document.createElement('div');\n this.element.className = 'dv-grid-view';\n this._locked = locked !== null && locked !== void 0 ? locked : false;\n this._margin = margin !== null && margin !== void 0 ? margin : 0;\n this.root = new BranchNode(orientation, proportionalLayout, styles, 0, 0, this.locked, this.margin);\n }\n isViewVisible(location) {\n const [rest, index] = tail(location);\n const [, parent] = this.getNode(rest);\n if (!(parent instanceof BranchNode)) {\n throw new Error('Invalid from location');\n }\n return parent.isChildVisible(index);\n }\n setViewVisible(location, visible) {\n if (this.hasMaximizedView()) {\n this.exitMaximizedView();\n }\n const [rest, index] = tail(location);\n const [, parent] = this.getNode(rest);\n if (!(parent instanceof BranchNode)) {\n throw new Error('Invalid from location');\n }\n this._onDidViewVisibilityChange.fire();\n parent.setChildVisible(index, visible);\n }\n moveView(parentLocation, from, to) {\n if (this.hasMaximizedView()) {\n this.exitMaximizedView();\n }\n const [, parent] = this.getNode(parentLocation);\n if (!(parent instanceof BranchNode)) {\n throw new Error('Invalid location');\n }\n parent.moveChild(from, to);\n }\n addView(view, size, location) {\n if (this.hasMaximizedView()) {\n this.exitMaximizedView();\n }\n const [rest, index] = tail(location);\n const [pathToParent, parent] = this.getNode(rest);\n if (parent instanceof BranchNode) {\n const node = new LeafNode(view, orthogonal(parent.orientation), parent.orthogonalSize);\n parent.addChild(node, size, index);\n }\n else {\n const [grandParent, ..._] = [...pathToParent].reverse();\n const [parentIndex, ...__] = [...rest].reverse();\n let newSiblingSize = 0;\n const newSiblingCachedVisibleSize = grandParent.getChildCachedVisibleSize(parentIndex);\n if (typeof newSiblingCachedVisibleSize === 'number') {\n newSiblingSize = Sizing.Invisible(newSiblingCachedVisibleSize);\n }\n const child = grandParent.removeChild(parentIndex);\n child.dispose();\n const newParent = new BranchNode(parent.orientation, this.proportionalLayout, this.styles, parent.size, parent.orthogonalSize, this.locked, this.margin);\n grandParent.addChild(newParent, parent.size, parentIndex);\n const newSibling = new LeafNode(parent.view, grandParent.orientation, parent.size);\n newParent.addChild(newSibling, newSiblingSize, 0);\n if (typeof size !== 'number' && size.type === 'split') {\n size = { type: 'split', index: 0 };\n }\n const node = new LeafNode(view, grandParent.orientation, parent.size);\n newParent.addChild(node, size, index);\n }\n }\n remove(view, sizing) {\n const location = getGridLocation(view.element);\n return this.removeView(location, sizing);\n }\n removeView(location, sizing) {\n if (this.hasMaximizedView()) {\n this.exitMaximizedView();\n }\n const [rest, index] = tail(location);\n const [pathToParent, parent] = this.getNode(rest);\n if (!(parent instanceof BranchNode)) {\n throw new Error('Invalid location');\n }\n const nodeToRemove = parent.children[index];\n if (!(nodeToRemove instanceof LeafNode)) {\n throw new Error('Invalid location');\n }\n parent.removeChild(index, sizing);\n nodeToRemove.dispose();\n if (parent.children.length !== 1) {\n return nodeToRemove.view;\n }\n // if the parent has only one child and we know the parent is a BranchNode we can make the tree\n // more efficiently spaced by replacing the parent BranchNode with the child.\n // if that child is a LeafNode then we simply replace the BranchNode with the child otherwise if the child\n // is a BranchNode too we should spread it's children into the grandparent.\n // refer to the remaining child as the sibling\n const sibling = parent.children[0];\n if (pathToParent.length === 0) {\n // if the parent is root\n if (sibling instanceof LeafNode) {\n // if the sibling is a leaf node no action is required\n return nodeToRemove.view;\n }\n // otherwise the sibling is a branch node. since the parent is the root and the root has only one child\n // which is a branch node we can just set this branch node to be the new root node\n // for good housekeeping we'll removing the sibling from it's existing tree\n parent.removeChild(0, sizing);\n // and set that sibling node to be root\n this.root = sibling;\n return nodeToRemove.view;\n }\n // otherwise the parent is apart of a large sub-tree\n const [grandParent, ..._] = [...pathToParent].reverse();\n const [parentIndex, ...__] = [...rest].reverse();\n const isSiblingVisible = parent.isChildVisible(0);\n // either way we need to remove the sibling from it's existing tree\n parent.removeChild(0, sizing);\n // note the sizes of all of the grandparents children\n const sizes = grandParent.children.map((_size, i) => grandParent.getChildSize(i));\n // remove the parent from the grandparent since we are moving the sibling to take the parents place\n // this parent is no longer used and can be disposed of\n grandParent.removeChild(parentIndex, sizing).dispose();\n if (sibling instanceof BranchNode) {\n // replace the parent with the siblings children\n sizes.splice(parentIndex, 1, ...sibling.children.map((c) => c.size));\n // and add those siblings to the grandparent\n for (let i = 0; i < sibling.children.length; i++) {\n const child = sibling.children[i];\n grandParent.addChild(child, child.size, parentIndex + i);\n }\n /**\n * clean down the branch node since we need to dipose of it and\n * when .dispose() it called on a branch it will dispose of any\n * views it is holding onto.\n */\n while (sibling.children.length > 0) {\n sibling.removeChild(0);\n }\n }\n else {\n // otherwise create a new leaf node and add that to the grandparent\n const newSibling = new LeafNode(sibling.view, orthogonal(sibling.orientation), sibling.size);\n const siblingSizing = isSiblingVisible\n ? sibling.orthogonalSize\n : Sizing.Invisible(sibling.orthogonalSize);\n grandParent.addChild(newSibling, siblingSizing, parentIndex);\n }\n // the containing node of the sibling is no longer required and can be disposed of\n sibling.dispose();\n // resize everything\n for (let i = 0; i < sizes.length; i++) {\n grandParent.resizeChild(i, sizes[i]);\n }\n return nodeToRemove.view;\n }\n layout(width, height) {\n const [size, orthogonalSize] = this.root.orientation === Orientation.HORIZONTAL\n ? [height, width]\n : [width, height];\n this.root.layout(size, orthogonalSize);\n }\n getNode(location, node = this.root, path = []) {\n if (location.length === 0) {\n return [path, node];\n }\n if (!(node instanceof BranchNode)) {\n throw new Error('Invalid location');\n }\n const [index, ...rest] = location;\n if (index < 0 || index >= node.children.length) {\n throw new Error('Invalid location');\n }\n const child = node.children[index];\n path.push(node);\n return this.getNode(rest, child, path);\n }\n}\n\nconst PROPERTY_KEYS_GRIDVIEW = (() => {\n /**\n * by readong the keys from an empty value object TypeScript will error\n * when we add or remove new properties to `DockviewOptions`\n */\n const properties = {\n disableAutoResizing: undefined,\n proportionalLayout: undefined,\n orientation: undefined,\n hideBorders: undefined,\n className: undefined,\n };\n return Object.keys(properties);\n})();\n\nclass Resizable extends CompositeDisposable {\n get element() {\n return this._element;\n }\n get disableResizing() {\n return this._disableResizing;\n }\n set disableResizing(value) {\n this._disableResizing = value;\n }\n constructor(parentElement, disableResizing = false) {\n super();\n this._lastWidth = -1;\n this._lastHeight = -1;\n this._disableResizing = disableResizing;\n this._element = parentElement;\n this.addDisposables(watchElementResize(this._element, (entry) => {\n if (this.isDisposed) {\n /**\n * resize is delayed through requestAnimationFrame so there is a small chance\n * the component has already been disposed of\n */\n return;\n }\n if (this.disableResizing) {\n return;\n }\n if (!this._element.offsetParent) {\n /**\n * offsetParent === null is equivalent to display: none being set on the element or one\n * of it's parents. In the display: none case the size will become (0, 0) which we do\n * not want to propagate.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n *\n * You could use checkVisibility() but at the time of writing it's not supported across\n * all Browsers\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/checkVisibility\n */\n return;\n }\n if (!isInDocument(this._element)) {\n /**\n * since the event is dispatched through requestAnimationFrame there is a small chance\n * the component is no longer attached to the DOM, if that is the case the dimensions\n * are mostly likely all zero and meaningless. we should skip this case.\n */\n return;\n }\n // Round to integers to absorb sub-pixel jitter from\n // fractional devicePixelRatio (e.g. multi-monitor setups),\n // which would otherwise re-fire layout in a feedback loop.\n const width = Math.round(entry.contentRect.width);\n const height = Math.round(entry.contentRect.height);\n if (width === this._lastWidth && height === this._lastHeight) {\n return;\n }\n this._lastWidth = width;\n this._lastHeight = height;\n this.layout(width, height);\n }));\n }\n}\n\nconst nextLayoutId$1 = sequentialNumberGenerator();\nfunction toTarget(direction) {\n switch (direction) {\n case 'left':\n return 'left';\n case 'right':\n return 'right';\n case 'above':\n return 'top';\n case 'below':\n return 'bottom';\n case 'within':\n default:\n return 'center';\n }\n}\nclass BaseGrid extends Resizable {\n get id() {\n return this._id;\n }\n get size() {\n return this._groups.size;\n }\n get groups() {\n return Array.from(this._groups.values()).map((_) => _.value);\n }\n get width() {\n return this.gridview.width;\n }\n get height() {\n return this.gridview.height;\n }\n get minimumHeight() {\n return this.gridview.minimumHeight;\n }\n get maximumHeight() {\n return this.gridview.maximumHeight;\n }\n get minimumWidth() {\n return this.gridview.minimumWidth;\n }\n get maximumWidth() {\n return this.gridview.maximumWidth;\n }\n get activeGroup() {\n return this._activeGroup;\n }\n get locked() {\n return this.gridview.locked;\n }\n set locked(value) {\n this.gridview.locked = value;\n }\n constructor(container, options) {\n var _a;\n super(document.createElement('div'), options.disableAutoResizing);\n this._id = nextLayoutId$1.next();\n this._groups = new Map();\n this._onDidRemove = new Emitter();\n this.onDidRemove = this._onDidRemove.event;\n this._onDidAdd = new Emitter();\n this.onDidAdd = this._onDidAdd.event;\n this._onDidMaximizedChange = new Emitter();\n this.onDidMaximizedChange = this._onDidMaximizedChange.event;\n this._onDidActiveChange = new Emitter();\n this.onDidActiveChange = this._onDidActiveChange.event;\n this._bufferOnDidLayoutChange = new AsapEvent();\n this.onDidLayoutChange = this._bufferOnDidLayoutChange.onEvent;\n this._onDidViewVisibilityChangeMicroTaskQueue = new AsapEvent();\n this.onDidViewVisibilityChangeMicroTaskQueue = this._onDidViewVisibilityChangeMicroTaskQueue.onEvent;\n this.element.style.height = '100%';\n this.element.style.width = '100%';\n this._classNames = new Classnames(this.element);\n this._classNames.setClassNames((_a = options.className) !== null && _a !== void 0 ? _a : '');\n // the container is owned by the third-party, do not modify/delete it\n container.appendChild(this.element);\n this.gridview = new Gridview(!!options.proportionalLayout, options.styles, options.orientation, options.locked, options.margin);\n this.gridview.locked = !!options.locked;\n this.element.appendChild(this.gridview.element);\n this.layout(0, 0, true); // set some elements height/widths\n this.addDisposables(this.gridview.onDidMaximizedNodeChange((event) => {\n this._onDidMaximizedChange.fire({\n panel: event.view,\n isMaximized: event.isMaximized,\n });\n }), this.gridview.onDidViewVisibilityChange(() => this._onDidViewVisibilityChangeMicroTaskQueue.fire()), this.onDidViewVisibilityChangeMicroTaskQueue(() => {\n this.forceRelayout();\n }), Disposable.from(() => {\n var _a;\n (_a = this.element.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(this.element);\n }), this.gridview.onDidChange(() => {\n this._bufferOnDidLayoutChange.fire();\n }), Event.any(this.onDidAdd, this.onDidRemove, this.onDidActiveChange)(() => {\n this._bufferOnDidLayoutChange.fire();\n }), this._onDidMaximizedChange, this._onDidViewVisibilityChangeMicroTaskQueue, this._bufferOnDidLayoutChange);\n }\n setVisible(panel, visible) {\n this.gridview.setViewVisible(getGridLocation(panel.element), visible);\n this._bufferOnDidLayoutChange.fire();\n }\n isVisible(panel) {\n return this.gridview.isViewVisible(getGridLocation(panel.element));\n }\n updateOptions(options) {\n var _a, _b, _c, _d;\n if (typeof options.proportionalLayout === 'boolean') ;\n if (options.orientation) {\n this.gridview.orientation = options.orientation;\n }\n if ('disableResizing' in options) {\n this.disableResizing = (_a = options.disableAutoResizing) !== null && _a !== void 0 ? _a : false;\n }\n if ('locked' in options) {\n this.locked = (_b = options.locked) !== null && _b !== void 0 ? _b : false;\n }\n if ('margin' in options) {\n this.gridview.margin = (_c = options.margin) !== null && _c !== void 0 ? _c : 0;\n }\n if ('className' in options) {\n this._classNames.setClassNames((_d = options.className) !== null && _d !== void 0 ? _d : '');\n }\n }\n maximizeGroup(panel) {\n this.gridview.maximizeView(panel);\n this.doSetGroupActive(panel);\n }\n isMaximizedGroup(panel) {\n return this.gridview.maximizedView() === panel;\n }\n exitMaximizedGroup() {\n this.gridview.exitMaximizedView();\n }\n hasMaximizedGroup() {\n return this.gridview.hasMaximizedView();\n }\n doAddGroup(group, location = [0], size) {\n this.gridview.addView(group, size !== null && size !== void 0 ? size : Sizing.Distribute, location);\n this._onDidAdd.fire(group);\n }\n doRemoveGroup(group, options) {\n if (!this._groups.has(group.id)) {\n throw new Error('invalid operation');\n }\n const item = this._groups.get(group.id);\n const view = this.gridview.remove(group, Sizing.Distribute);\n if (item && !(options === null || options === void 0 ? void 0 : options.skipDispose)) {\n item.disposable.dispose();\n item.value.dispose();\n this._groups.delete(group.id);\n this._onDidRemove.fire(group);\n }\n if (!(options === null || options === void 0 ? void 0 : options.skipActive) && this._activeGroup === group) {\n const groups = Array.from(this._groups.values());\n this.doSetGroupActive(groups.length > 0 ? groups[0].value : undefined);\n }\n return view;\n }\n getPanel(id) {\n var _a;\n return (_a = this._groups.get(id)) === null || _a === void 0 ? void 0 : _a.value;\n }\n doSetGroupActive(group) {\n if (this._activeGroup === group) {\n return;\n }\n if (this._activeGroup) {\n this._activeGroup.setActive(false);\n }\n if (group) {\n group.setActive(true);\n }\n this._activeGroup = group;\n this._onDidActiveChange.fire(group);\n }\n removeGroup(group) {\n this.doRemoveGroup(group);\n }\n moveToNext(options) {\n var _a;\n if (!options) {\n options = {};\n }\n if (!options.group) {\n if (!this.activeGroup) {\n return;\n }\n options.group = this.activeGroup;\n }\n const location = getGridLocation(options.group.element);\n const next = (_a = this.gridview.next(location)) === null || _a === void 0 ? void 0 : _a.view;\n this.doSetGroupActive(next);\n }\n moveToPrevious(options) {\n var _a;\n if (!options) {\n options = {};\n }\n if (!options.group) {\n if (!this.activeGroup) {\n return;\n }\n options.group = this.activeGroup;\n }\n const location = getGridLocation(options.group.element);\n const next = (_a = this.gridview.previous(location)) === null || _a === void 0 ? void 0 : _a.view;\n this.doSetGroupActive(next);\n }\n forceRelayout() {\n this.layout(this.width, this.height, true);\n }\n layout(width, height, forceResize) {\n const different = forceResize || width !== this.width || height !== this.height;\n if (!different) {\n return;\n }\n this.gridview.element.style.height = `${height}px`;\n this.gridview.element.style.width = `${width}px`;\n this.gridview.layout(width, height);\n }\n dispose() {\n this._onDidActiveChange.dispose();\n this._onDidAdd.dispose();\n this._onDidRemove.dispose();\n for (const group of this.groups) {\n group.dispose();\n }\n this.gridview.dispose();\n super.dispose();\n }\n}\n\nclass SplitviewApi {\n /**\n * The minimum size the component can reach where size is measured in the direction of orientation provided.\n */\n get minimumSize() {\n return this.component.minimumSize;\n }\n /**\n * The maximum size the component can reach where size is measured in the direction of orientation provided.\n */\n get maximumSize() {\n return this.component.maximumSize;\n }\n /**\n * Width of the component.\n */\n get width() {\n return this.component.width;\n }\n /**\n * Height of the component.\n */\n get height() {\n return this.component.height;\n }\n /**\n * The current number of panels.\n */\n get length() {\n return this.component.length;\n }\n /**\n * The current orientation of the component.\n */\n get orientation() {\n return this.component.orientation;\n }\n /**\n * The list of current panels.\n */\n get panels() {\n return this.component.panels;\n }\n /**\n * Invoked after a layout is loaded through the `fromJSON` method.\n */\n get onDidLayoutFromJSON() {\n return this.component.onDidLayoutFromJSON;\n }\n /**\n * Invoked whenever any aspect of the layout changes.\n * If listening to this event it may be worth debouncing ouputs.\n */\n get onDidLayoutChange() {\n return this.component.onDidLayoutChange;\n }\n /**\n * Invoked when a view is added.\n */\n get onDidAddView() {\n return this.component.onDidAddView;\n }\n /**\n * Invoked when a view is removed.\n */\n get onDidRemoveView() {\n return this.component.onDidRemoveView;\n }\n constructor(component) {\n this.component = component;\n }\n /**\n * Removes an existing panel and optionally provide a `Sizing` method\n * for the subsequent resize.\n */\n removePanel(panel, sizing) {\n this.component.removePanel(panel, sizing);\n }\n /**\n * Focus the component.\n */\n focus() {\n this.component.focus();\n }\n /**\n * Get the reference to a panel given it's `string` id.\n */\n getPanel(id) {\n return this.component.getPanel(id);\n }\n /**\n * Layout the panel with a width and height.\n */\n layout(width, height) {\n return this.component.layout(width, height);\n }\n /**\n * Add a new panel and return the created instance.\n */\n addPanel(options) {\n return this.component.addPanel(options);\n }\n /**\n * Move a panel given it's current and desired index.\n */\n movePanel(from, to) {\n this.component.movePanel(from, to);\n }\n /**\n * Deserialize a layout to built a splitivew.\n */\n fromJSON(data) {\n this.component.fromJSON(data);\n }\n /** Serialize a layout */\n toJSON() {\n return this.component.toJSON();\n }\n /**\n * Remove all panels and clear the component.\n */\n clear() {\n this.component.clear();\n }\n /**\n * Update configuratable options.\n */\n updateOptions(options) {\n this.component.updateOptions(options);\n }\n /**\n * Release resources and teardown component. Do not call when using framework versions of dockview.\n */\n dispose() {\n this.component.dispose();\n }\n}\nclass PaneviewApi {\n /**\n * The minimum size the component can reach where size is measured in the direction of orientation provided.\n */\n get minimumSize() {\n return this.component.minimumSize;\n }\n /**\n * The maximum size the component can reach where size is measured in the direction of orientation provided.\n */\n get maximumSize() {\n return this.component.maximumSize;\n }\n /**\n * Width of the component.\n */\n get width() {\n return this.component.width;\n }\n /**\n * Height of the component.\n */\n get height() {\n return this.component.height;\n }\n /**\n * All panel objects.\n */\n get panels() {\n return this.component.panels;\n }\n /**\n * Invoked when any layout change occures, an aggregation of many events.\n */\n get onDidLayoutChange() {\n return this.component.onDidLayoutChange;\n }\n /**\n * Invoked after a layout is deserialzied using the `fromJSON` method.\n */\n get onDidLayoutFromJSON() {\n return this.component.onDidLayoutFromJSON;\n }\n /**\n * Invoked when a panel is added. May be called multiple times when moving panels.\n */\n get onDidAddView() {\n return this.component.onDidAddView;\n }\n /**\n * Invoked when a panel is removed. May be called multiple times when moving panels.\n */\n get onDidRemoveView() {\n return this.component.onDidRemoveView;\n }\n /**\n * Invoked when a Drag'n'Drop event occurs that the component was unable to handle. Exposed for custom Drag'n'Drop functionality.\n */\n get onDidDrop() {\n return this.component.onDidDrop;\n }\n get onUnhandledDragOverEvent() {\n return this.component.onUnhandledDragOverEvent;\n }\n constructor(component) {\n this.component = component;\n }\n /**\n * Remove a panel given the panel object.\n */\n removePanel(panel) {\n this.component.removePanel(panel);\n }\n /**\n * Get a panel object given a `string` id. May return `undefined`.\n */\n getPanel(id) {\n return this.component.getPanel(id);\n }\n /**\n * Move a panel given it's current and desired index.\n */\n movePanel(from, to) {\n this.component.movePanel(from, to);\n }\n /**\n * Focus the component. Will try to focus an active panel if one exists.\n */\n focus() {\n this.component.focus();\n }\n /**\n * Force resize the component to an exact width and height. Read about auto-resizing before using.\n */\n layout(width, height) {\n this.component.layout(width, height);\n }\n /**\n * Add a panel and return the created object.\n */\n addPanel(options) {\n return this.component.addPanel(options);\n }\n /**\n * Create a component from a serialized object.\n */\n fromJSON(data) {\n this.component.fromJSON(data);\n }\n /**\n * Create a serialized object of the current component.\n */\n toJSON() {\n return this.component.toJSON();\n }\n /**\n * Reset the component back to an empty and default state.\n */\n clear() {\n this.component.clear();\n }\n /**\n * Update configuratable options.\n */\n updateOptions(options) {\n this.component.updateOptions(options);\n }\n /**\n * Release resources and teardown component. Do not call when using framework versions of dockview.\n */\n dispose() {\n this.component.dispose();\n }\n}\nclass GridviewApi {\n /**\n * Width of the component.\n */\n get width() {\n return this.component.width;\n }\n /**\n * Height of the component.\n */\n get height() {\n return this.component.height;\n }\n /**\n * Minimum height of the component.\n */\n get minimumHeight() {\n return this.component.minimumHeight;\n }\n /**\n * Maximum height of the component.\n */\n get maximumHeight() {\n return this.component.maximumHeight;\n }\n /**\n * Minimum width of the component.\n */\n get minimumWidth() {\n return this.component.minimumWidth;\n }\n /**\n * Maximum width of the component.\n */\n get maximumWidth() {\n return this.component.maximumWidth;\n }\n /**\n * Invoked when any layout change occures, an aggregation of many events.\n */\n get onDidLayoutChange() {\n return this.component.onDidLayoutChange;\n }\n /**\n * Invoked when a panel is added. May be called multiple times when moving panels.\n */\n get onDidAddPanel() {\n return this.component.onDidAddGroup;\n }\n /**\n * Invoked when a panel is removed. May be called multiple times when moving panels.\n */\n get onDidRemovePanel() {\n return this.component.onDidRemoveGroup;\n }\n /**\n * Invoked when the active panel changes. May be undefined if no panel is active.\n */\n get onDidActivePanelChange() {\n return this.component.onDidActiveGroupChange;\n }\n /**\n * Invoked after a layout is deserialzied using the `fromJSON` method.\n */\n get onDidLayoutFromJSON() {\n return this.component.onDidLayoutFromJSON;\n }\n /**\n * All panel objects.\n */\n get panels() {\n return this.component.groups;\n }\n /**\n * Current orientation. Can be changed after initialization.\n */\n get orientation() {\n return this.component.orientation;\n }\n set orientation(value) {\n this.component.updateOptions({ orientation: value });\n }\n constructor(component) {\n this.component = component;\n }\n /**\n * Focus the component. Will try to focus an active panel if one exists.\n */\n focus() {\n this.component.focus();\n }\n /**\n * Force resize the component to an exact width and height. Read about auto-resizing before using.\n */\n layout(width, height, force = false) {\n this.component.layout(width, height, force);\n }\n /**\n * Add a panel and return the created object.\n */\n addPanel(options) {\n return this.component.addPanel(options);\n }\n /**\n * Remove a panel given the panel object.\n */\n removePanel(panel, sizing) {\n this.component.removePanel(panel, sizing);\n }\n /**\n * Move a panel in a particular direction relative to another panel.\n */\n movePanel(panel, options) {\n this.component.movePanel(panel, options);\n }\n /**\n * Get a panel object given a `string` id. May return `undefined`.\n */\n getPanel(id) {\n return this.component.getPanel(id);\n }\n /**\n * Create a component from a serialized object.\n */\n fromJSON(data) {\n return this.component.fromJSON(data);\n }\n /**\n * Create a serialized object of the current component.\n */\n toJSON() {\n return this.component.toJSON();\n }\n /**\n * Reset the component back to an empty and default state.\n */\n clear() {\n this.component.clear();\n }\n updateOptions(options) {\n this.component.updateOptions(options);\n }\n /**\n * Release resources and teardown component. Do not call when using framework versions of dockview.\n */\n dispose() {\n this.component.dispose();\n }\n}\nclass DockviewApi {\n /**\n * The unique identifier for this instance. Used to manage scope of Drag'n'Drop events.\n */\n get id() {\n return this.component.id;\n }\n /**\n * Width of the component.\n */\n get width() {\n return this.component.width;\n }\n /**\n * Height of the component.\n */\n get height() {\n return this.component.height;\n }\n /**\n * Minimum height of the component.\n */\n get minimumHeight() {\n return this.component.minimumHeight;\n }\n /**\n * Maximum height of the component.\n */\n get maximumHeight() {\n return this.component.maximumHeight;\n }\n /**\n * Minimum width of the component.\n */\n get minimumWidth() {\n return this.component.minimumWidth;\n }\n /**\n * Maximum width of the component.\n */\n get maximumWidth() {\n return this.component.maximumWidth;\n }\n /**\n * Total number of groups.\n */\n get size() {\n return this.component.size;\n }\n /**\n * The active tab-group color palette. Reflects the configured\n * `tabGroupColors` option, or the built-in defaults when unset.\n * Useful for custom chip renderers that want to roll their own\n * picker UI.\n */\n get tabGroupColors() {\n return this.component.tabGroupColorPalette.entries();\n }\n /**\n * Total number of panels.\n */\n get totalPanels() {\n return this.component.totalPanels;\n }\n /**\n * Invoked when the active group changes. May be undefined if no group is active.\n */\n get onDidActiveGroupChange() {\n return this.component.onDidActiveGroupChange;\n }\n /**\n * Invoked when a group is added. May be called multiple times when moving groups.\n */\n get onDidAddGroup() {\n return this.component.onDidAddGroup;\n }\n /**\n * Invoked when a group is removed. May be called multiple times when moving groups.\n */\n get onDidRemoveGroup() {\n return this.component.onDidRemoveGroup;\n }\n /**\n * Invoked when the active panel changes. May be undefined if no panel is active.\n */\n get onDidActivePanelChange() {\n return this.component.onDidActivePanelChange;\n }\n /**\n * Invoked when a panel is added. May be called multiple times when moving panels.\n */\n get onDidAddPanel() {\n return this.component.onDidAddPanel;\n }\n /**\n * Invoked when a panel is removed. May be called multiple times when moving panels.\n */\n get onDidRemovePanel() {\n return this.component.onDidRemovePanel;\n }\n get onDidMovePanel() {\n return this.component.onDidMovePanel;\n }\n /**\n * Invoked after a layout is deserialzied using the `fromJSON` method.\n */\n get onDidLayoutFromJSON() {\n return this.component.onDidLayoutFromJSON;\n }\n /**\n * Invoked when any layout change occures, an aggregation of many events.\n */\n get onDidLayoutChange() {\n return this.component.onDidLayoutChange;\n }\n /**\n * Invoked when a Drag'n'Drop event occurs that the component was unable to handle. Exposed for custom Drag'n'Drop functionality.\n */\n get onDidDrop() {\n return this.component.onDidDrop;\n }\n /**\n * Invoked when a Drag'n'Drop event occurs but before dockview handles it giving the user an opportunity to intecept and\n * prevent the event from occuring using the standard `preventDefault()` syntax.\n *\n * Preventing certain events may causes unexpected behaviours, use carefully.\n */\n get onWillDrop() {\n return this.component.onWillDrop;\n }\n /**\n * Invoked before an overlay is shown indicating a drop target.\n *\n * Calling `event.preventDefault()` will prevent the overlay being shown and prevent\n * the any subsequent drop event.\n */\n get onWillShowOverlay() {\n return this.component.onWillShowOverlay;\n }\n /**\n * Invoked before a group is dragged.\n *\n * Calling `event.nativeEvent.preventDefault()` will prevent the group drag starting.\n *\n */\n get onWillDragGroup() {\n return this.component.onWillDragGroup;\n }\n /**\n * Invoked before a panel is dragged.\n *\n * Calling `event.nativeEvent.preventDefault()` will prevent the panel drag starting.\n */\n get onWillDragPanel() {\n return this.component.onWillDragPanel;\n }\n get onUnhandledDragOverEvent() {\n return this.component.onUnhandledDragOverEvent;\n }\n get onDidPopoutGroupSizeChange() {\n return this.component.onDidPopoutGroupSizeChange;\n }\n get onDidPopoutGroupPositionChange() {\n return this.component.onDidPopoutGroupPositionChange;\n }\n get onDidOpenPopoutWindowFail() {\n return this.component.onDidOpenPopoutWindowFail;\n }\n /**\n * Invoked when a tab group is created in any group.\n */\n get onDidCreateTabGroup() {\n return this.component.onDidCreateTabGroup;\n }\n /**\n * Invoked when a tab group is destroyed in any group.\n */\n get onDidDestroyTabGroup() {\n return this.component.onDidDestroyTabGroup;\n }\n /**\n * Invoked when a panel is added to a tab group.\n */\n get onDidAddPanelToTabGroup() {\n return this.component.onDidAddPanelToTabGroup;\n }\n /**\n * Invoked when a panel is removed from a tab group.\n */\n get onDidRemovePanelFromTabGroup() {\n return this.component.onDidRemovePanelFromTabGroup;\n }\n /**\n * Invoked when a tab group's properties (label, color) change.\n */\n get onDidTabGroupChange() {\n return this.component.onDidTabGroupChange;\n }\n /**\n * Invoked when a tab group is collapsed or expanded.\n */\n get onDidTabGroupCollapsedChange() {\n return this.component.onDidTabGroupCollapsedChange;\n }\n /**\n * All panel objects.\n */\n get panels() {\n return this.component.panels;\n }\n /**\n * All group objects.\n */\n get groups() {\n return this.component.groups;\n }\n /**\n * Active panel object.\n */\n get activePanel() {\n return this.component.activePanel;\n }\n /**\n * Active group object.\n */\n get activeGroup() {\n return this.component.activeGroup;\n }\n constructor(component) {\n this.component = component;\n }\n /**\n * Focus the component. Will try to focus an active panel if one exists.\n */\n focus() {\n this.component.focus();\n }\n /**\n * Get a panel object given a `string` id. May return `undefined`.\n */\n getPanel(id) {\n return this.component.getGroupPanel(id);\n }\n /**\n * Force resize the component to an exact width and height. Read about auto-resizing before using.\n */\n layout(width, height, force = false) {\n this.component.layout(width, height, force);\n }\n /**\n * Add a panel and return the created object.\n */\n addPanel(options) {\n return this.component.addPanel(options);\n }\n /**\n * Remove a panel given the panel object.\n */\n removePanel(panel) {\n this.component.removePanel(panel);\n }\n /**\n * Add a group and return the created object.\n */\n addGroup(options) {\n return this.component.addGroup(options);\n }\n /**\n * Close all groups and panels.\n */\n closeAllGroups() {\n return this.component.closeAllGroups();\n }\n /**\n * Remove a group and any panels within the group.\n */\n removeGroup(group) {\n this.component.removeGroup(group);\n }\n /**\n * Get a group object given a `string` id. May return undefined.\n */\n getGroup(id) {\n return this.component.getPanel(id);\n }\n /**\n * Add a floating group\n */\n addFloatingGroup(item, options) {\n return this.component.addFloatingGroup(item, options);\n }\n /**\n * Create a component from a serialized object.\n */\n fromJSON(data, options) {\n this.component.fromJSON(data, options);\n }\n /**\n * Create a serialized object of the current component.\n */\n toJSON() {\n return this.component.toJSON();\n }\n /**\n * Reset the component back to an empty and default state.\n */\n clear() {\n this.component.clear();\n }\n /**\n * Move the focus progmatically to the next panel or group.\n */\n moveToNext(options) {\n this.component.moveToNext(options);\n }\n /**\n * Move the focus progmatically to the previous panel or group.\n */\n moveToPrevious(options) {\n this.component.moveToPrevious(options);\n }\n maximizeGroup(panel) {\n this.component.maximizeGroup(panel.group);\n }\n hasMaximizedGroup() {\n return this.component.hasMaximizedGroup();\n }\n exitMaximizedGroup() {\n this.component.exitMaximizedGroup();\n }\n get onDidMaximizedGroupChange() {\n return this.component.onDidMaximizedGroupChange;\n }\n /**\n * Add a popout group in a new Window\n */\n addPopoutGroup(item, options) {\n return this.component.addPopoutGroup(item, options);\n }\n /**\n * Add an edge group at the given position. Returns the group panel API\n * for the newly created group. Throws if a group already exists there.\n */\n addEdgeGroup(position, options) {\n return this.component.addEdgeGroup(position, options);\n }\n /**\n * Get the group panel API for an edge group at the given position.\n * Returns `undefined` if no edge group is configured at that position.\n */\n getEdgeGroup(position) {\n return this.component.getEdgeGroup(position);\n }\n /**\n * Set the visibility of an edge group.\n */\n setEdgeGroupVisible(position, visible) {\n this.component.setEdgeGroupVisible(position, visible);\n }\n /**\n * Check whether an edge group is currently visible.\n */\n isEdgeGroupVisible(position) {\n return this.component.isEdgeGroupVisible(position);\n }\n /**\n * Remove an edge group and reclaim its slot in the layout.\n * All panels inside the group are disposed. Throws if no group exists at position.\n */\n removeEdgeGroup(position) {\n this.component.removeEdgeGroup(position);\n }\n updateOptions(options) {\n this.component.updateOptions(options);\n }\n // === Tab Group API ===\n _getGroupModel(groupId) {\n const group = this.component.getPanel(groupId);\n if (!group) {\n throw new Error(`dockview: group '${groupId}' not found`);\n }\n return group.model;\n }\n createTabGroup(options) {\n const model = this._getGroupModel(options.groupId);\n return model.createTabGroup({\n label: options.label,\n color: options.color,\n componentParams: options.componentParams,\n });\n }\n dissolveTabGroup(options) {\n const model = this._getGroupModel(options.groupId);\n model.dissolveTabGroup(options.tabGroupId);\n }\n addPanelToTabGroup(options) {\n const model = this._getGroupModel(options.groupId);\n model.addPanelToTabGroup(options.tabGroupId, options.panelId, options.index);\n }\n removePanelFromTabGroup(options) {\n const model = this._getGroupModel(options.groupId);\n model.removePanelFromTabGroup(options.panelId);\n }\n getTabGroups(options) {\n const model = this._getGroupModel(options.groupId);\n return model.getTabGroups();\n }\n getTabGroupForPanel(options) {\n const model = this._getGroupModel(options.groupId);\n return model.getTabGroupForPanel(options.panelId);\n }\n moveTabGroup(options) {\n const model = this._getGroupModel(options.groupId);\n model.moveTabGroup(options.tabGroupId, options.index);\n }\n /**\n * Release resources and teardown component. Do not call when using framework versions of dockview.\n */\n dispose() {\n this.component.dispose();\n }\n}\n\nclass DragAndDropObserver extends CompositeDisposable {\n constructor(element, callbacks) {\n super();\n this.element = element;\n this.callbacks = callbacks;\n this.target = null;\n this.registerListeners();\n }\n onDragEnter(e) {\n this.target = e.target;\n this.callbacks.onDragEnter(e);\n }\n onDragOver(e) {\n e.preventDefault(); // needed so that the drop event fires (https://stackoverflow.com/questions/21339924/drop-event-not-firing-in-chrome)\n if (this.callbacks.onDragOver) {\n this.callbacks.onDragOver(e);\n }\n }\n onDragLeave(e) {\n if (this.target === e.target) {\n this.target = null;\n this.callbacks.onDragLeave(e);\n }\n }\n onDragEnd(e) {\n this.target = null;\n this.callbacks.onDragEnd(e);\n }\n onDrop(e) {\n this.callbacks.onDrop(e);\n }\n registerListeners() {\n this.addDisposables(addDisposableListener(this.element, 'dragenter', (e) => {\n this.onDragEnter(e);\n }, true));\n this.addDisposables(addDisposableListener(this.element, 'dragover', (e) => {\n this.onDragOver(e);\n }, true));\n this.addDisposables(addDisposableListener(this.element, 'dragleave', (e) => {\n this.onDragLeave(e);\n }));\n this.addDisposables(addDisposableListener(this.element, 'dragend', (e) => {\n this.onDragEnd(e);\n }));\n this.addDisposables(addDisposableListener(this.element, 'drop', (e) => {\n this.onDrop(e);\n }));\n }\n}\n\n// Two render paths: in-place (dropzone appended to drop element) and\n// anchored (overlay rendered into an external anchor container).\nconst DEFAULT_SIZE = { value: 50, type: 'percentage' };\nconst SMALL_WIDTH_BOUNDARY = 100;\nconst SMALL_HEIGHT_BOUNDARY = 100;\nfunction createOverlayElements() {\n const dropzone = document.createElement('div');\n dropzone.className = 'dv-drop-target-dropzone';\n const selection = document.createElement('div');\n selection.className = 'dv-drop-target-selection';\n dropzone.appendChild(selection);\n return { dropzone, selection };\n}\nfunction computeOverlayShape(quadrant, width, height, overlayModel) {\n var _a, _b, _c;\n const smallWidthBoundary = (_a = overlayModel === null || overlayModel === void 0 ? void 0 : overlayModel.smallWidthBoundary) !== null && _a !== void 0 ? _a : SMALL_WIDTH_BOUNDARY;\n const smallHeightBoundary = (_b = overlayModel === null || overlayModel === void 0 ? void 0 : overlayModel.smallHeightBoundary) !== null && _b !== void 0 ? _b : SMALL_HEIGHT_BOUNDARY;\n const isSmallX = width < smallWidthBoundary;\n const isSmallY = height < smallHeightBoundary;\n const isLeft = quadrant === 'left';\n const isRight = quadrant === 'right';\n const isTop = quadrant === 'top';\n const isBottom = quadrant === 'bottom';\n const rightClass = !isSmallX && isRight;\n const leftClass = !isSmallX && isLeft;\n const topClass = !isSmallY && isTop;\n const bottomClass = !isSmallY && isBottom;\n let size = 1;\n const sizeOptions = (_c = overlayModel === null || overlayModel === void 0 ? void 0 : overlayModel.size) !== null && _c !== void 0 ? _c : DEFAULT_SIZE;\n if (sizeOptions.type === 'percentage') {\n size = clamp(sizeOptions.value, 0, 100) / 100;\n }\n else {\n if (rightClass || leftClass) {\n size = clamp(0, sizeOptions.value, width) / width;\n }\n if (topClass || bottomClass) {\n size = clamp(0, sizeOptions.value, height) / height;\n }\n }\n return {\n isSmallX,\n isSmallY,\n isLeft,\n isRight,\n isTop,\n isBottom,\n rightClass,\n leftClass,\n topClass,\n bottomClass,\n size,\n };\n}\nfunction renderInPlaceOverlay(overlay, quadrant, width, height, overlayModel) {\n const shape = computeOverlayShape(quadrant, width, height, overlayModel);\n const { rightClass, leftClass, topClass, bottomClass, size } = shape;\n const box = { top: '0px', left: '0px', width: '100%', height: '100%' };\n if (rightClass) {\n box.left = `${100 * (1 - size)}%`;\n box.width = `${100 * size}%`;\n }\n else if (leftClass) {\n box.width = `${100 * size}%`;\n }\n else if (topClass) {\n box.height = `${100 * size}%`;\n }\n else if (bottomClass) {\n box.top = `${100 * (1 - size)}%`;\n box.height = `${100 * size}%`;\n }\n if (shape.isSmallX && shape.isLeft) {\n box.width = '4px';\n }\n if (shape.isSmallX && shape.isRight) {\n box.left = `${width - 4}px`;\n box.width = '4px';\n }\n if (shape.isSmallY && shape.isTop) {\n box.height = '4px';\n }\n if (shape.isSmallY && shape.isBottom) {\n box.top = `${height - 4}px`;\n box.height = '4px';\n }\n overlay.style.top = box.top;\n overlay.style.left = box.left;\n overlay.style.width = box.width;\n overlay.style.height = box.height;\n overlay.style.visibility = 'visible';\n if (!overlay.style.transform || overlay.style.transform === '') {\n overlay.style.transform = 'translate3d(0, 0, 0)';\n }\n const isLine = (shape.isSmallX && (shape.isLeft || shape.isRight)) ||\n (shape.isSmallY && (shape.isTop || shape.isBottom));\n toggleClass(overlay, 'dv-drop-target-small-vertical', shape.isSmallY);\n toggleClass(overlay, 'dv-drop-target-small-horizontal', shape.isSmallX);\n toggleClass(overlay, 'dv-drop-target-selection-line', isLine);\n toggleClass(overlay, 'dv-drop-target-left', shape.isLeft);\n toggleClass(overlay, 'dv-drop-target-right', shape.isRight);\n toggleClass(overlay, 'dv-drop-target-top', shape.isTop);\n toggleClass(overlay, 'dv-drop-target-bottom', shape.isBottom);\n toggleClass(overlay, 'dv-drop-target-center', quadrant === 'center');\n}\nfunction checkAnchoredBoundsChanged(overlay, bounds) {\n const topPx = `${Math.round(bounds.top)}px`;\n const leftPx = `${Math.round(bounds.left)}px`;\n const widthPx = `${Math.round(bounds.width)}px`;\n const heightPx = `${Math.round(bounds.height)}px`;\n return (overlay.style.top !== topPx ||\n overlay.style.left !== leftPx ||\n overlay.style.width !== widthPx ||\n overlay.style.height !== heightPx);\n}\nfunction applyAnchoredBounds(overlay, bounds) {\n overlay.style.top = `${Math.round(bounds.top)}px`;\n overlay.style.left = `${Math.round(bounds.left)}px`;\n overlay.style.width = `${Math.round(bounds.width)}px`;\n overlay.style.height = `${Math.round(bounds.height)}px`;\n overlay.style.visibility = 'visible';\n if (!overlay.style.transform || overlay.style.transform === '') {\n overlay.style.transform = 'translate3d(0, 0, 0)';\n }\n}\n/** `boundsChanged: false` lets callers skip redundant work on tight drag loops. */\nfunction renderAnchoredOverlay(args) {\n const shape = computeOverlayShape(args.quadrant, args.width, args.height, args.overlayModel);\n const { rightClass, leftClass, topClass, bottomClass, size } = shape;\n const elBox = args.outlineElement.getBoundingClientRect();\n const ta = args.targetModel.getElements(undefined, args.outlineElement);\n const el = ta.root;\n const overlay = ta.overlay;\n const bigbox = el.getBoundingClientRect();\n const rootTop = elBox.top - bigbox.top;\n const rootLeft = elBox.left - bigbox.left;\n const box = {\n top: rootTop,\n left: rootLeft,\n width: args.width,\n height: args.height,\n };\n if (rightClass) {\n box.left = rootLeft + args.width * (1 - size);\n box.width = args.width * size;\n }\n else if (leftClass) {\n box.width = args.width * size;\n }\n else if (topClass) {\n box.height = args.height * size;\n }\n else if (bottomClass) {\n box.top = rootTop + args.height * (1 - size);\n box.height = args.height * size;\n }\n if (shape.isSmallX && shape.isLeft) {\n box.width = 4;\n }\n if (shape.isSmallX && shape.isRight) {\n box.left = rootLeft + args.width - 4;\n box.width = 4;\n }\n if (shape.isSmallY && shape.isTop) {\n box.height = 4;\n }\n if (shape.isSmallY && shape.isBottom) {\n box.top = rootTop + args.height - 4;\n box.height = 4;\n }\n if (!checkAnchoredBoundsChanged(overlay, box)) {\n return { boundsChanged: false, targetChanged: ta.changed };\n }\n applyAnchoredBounds(overlay, box);\n overlay.className = `dv-drop-target-anchor${args.className ? ` ${args.className}` : ''}`;\n toggleClass(overlay, 'dv-drop-target-left', shape.isLeft);\n toggleClass(overlay, 'dv-drop-target-right', shape.isRight);\n toggleClass(overlay, 'dv-drop-target-top', shape.isTop);\n toggleClass(overlay, 'dv-drop-target-bottom', shape.isBottom);\n toggleClass(overlay, 'dv-drop-target-anchor-line', (shape.isSmallX && (shape.isLeft || shape.isRight)) ||\n (shape.isSmallY && (shape.isTop || shape.isBottom)));\n toggleClass(overlay, 'dv-drop-target-center', args.quadrant === 'center');\n if (ta.changed) {\n toggleClass(overlay, 'dv-drop-target-anchor-container-changed', true);\n setTimeout(() => {\n toggleClass(overlay, 'dv-drop-target-anchor-container-changed', false);\n }, 10);\n }\n return { boundsChanged: true, targetChanged: ta.changed };\n}\n\nclass WillShowOverlayEvent extends DockviewEvent {\n get nativeEvent() {\n return this.options.nativeEvent;\n }\n get position() {\n return this.options.position;\n }\n constructor(options) {\n super();\n this.options = options;\n }\n}\nfunction directionToPosition(direction) {\n switch (direction) {\n case 'above':\n return 'top';\n case 'below':\n return 'bottom';\n case 'left':\n return 'left';\n case 'right':\n return 'right';\n case 'within':\n return 'center';\n default:\n throw new Error(`invalid direction '${direction}'`);\n }\n}\nfunction positionToDirection(position) {\n switch (position) {\n case 'top':\n return 'above';\n case 'bottom':\n return 'below';\n case 'left':\n return 'left';\n case 'right':\n return 'right';\n case 'center':\n return 'within';\n default:\n throw new Error(`invalid position '${position}'`);\n }\n}\nconst DEFAULT_ACTIVATION_SIZE$1 = {\n value: 20,\n type: 'percentage',\n};\nclass Droptarget extends CompositeDisposable {\n get disabled() {\n return this._disabled;\n }\n set disabled(value) {\n this._disabled = value;\n }\n get state() {\n return this._state;\n }\n constructor(element, options) {\n super();\n this.element = element;\n this.options = options;\n this._onDrop = new Emitter();\n this.onDrop = this._onDrop.event;\n this._onWillShowOverlay = new Emitter();\n this.onWillShowOverlay = this._onWillShowOverlay.event;\n this._disabled = false;\n // use a set to take advantage of #<set>.has\n this._acceptedTargetZonesSet = new Set(this.options.acceptedTargetZones);\n this.dnd = new DragAndDropObserver(this.element, {\n onDragEnter: () => {\n var _a, _b, _c;\n (_c = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a)) === null || _c === void 0 ? void 0 : _c.getElements();\n },\n onDragOver: (e) => {\n var _a, _b, _c, _d, _e, _f, _g;\n Droptarget.ACTUAL_TARGET = this;\n const overrideTarget = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);\n if (this._acceptedTargetZonesSet.size === 0) {\n if (overrideTarget) {\n return;\n }\n this.removeDropTarget();\n return;\n }\n const target = (_e = (_d = (_c = this.options).getOverlayOutline) === null || _d === void 0 ? void 0 : _d.call(_c)) !== null && _e !== void 0 ? _e : this.element;\n const width = target.offsetWidth;\n const height = target.offsetHeight;\n if (width === 0 || height === 0) {\n return; // avoid div!0\n }\n const rect = e.currentTarget.getBoundingClientRect();\n const x = ((_f = e.clientX) !== null && _f !== void 0 ? _f : 0) - rect.left;\n const y = ((_g = e.clientY) !== null && _g !== void 0 ? _g : 0) - rect.top;\n const quadrant = this.calculateQuadrant(this._acceptedTargetZonesSet, x, y, width, height);\n /**\n * If the event has already been used by another DropTarget instance\n * then don't show a second drop target, only one target should be\n * active at any one time\n */\n if (this.isAlreadyUsed(e) || quadrant === null) {\n // no drop target should be displayed\n this.removeDropTarget();\n return;\n }\n if (!this.options.canDisplayOverlay(e, quadrant)) {\n if (overrideTarget) {\n return;\n }\n this.removeDropTarget();\n return;\n }\n const willShowOverlayEvent = new WillShowOverlayEvent({\n nativeEvent: e,\n position: quadrant,\n });\n /**\n * Provide an opportunity to prevent the overlay appearing and in turn\n * any dnd behaviours\n */\n this._onWillShowOverlay.fire(willShowOverlayEvent);\n if (willShowOverlayEvent.defaultPrevented) {\n this.removeDropTarget();\n return;\n }\n this.markAsUsed(e);\n if (overrideTarget) ;\n else if (!this.targetElement) {\n const els = createOverlayElements();\n this.targetElement = els.dropzone;\n this.overlayElement = els.selection;\n this._state = 'center';\n target.classList.add('dv-drop-target');\n target.append(this.targetElement);\n }\n this.toggleClasses(quadrant, width, height);\n this._state = quadrant;\n },\n onDragLeave: () => {\n var _a, _b;\n const target = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);\n if (target) {\n return;\n }\n this.removeDropTarget();\n },\n onDragEnd: (e) => {\n var _a, _b;\n const target = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);\n if (target && Droptarget.ACTUAL_TARGET === this) {\n if (this._state) {\n // only stop the propagation of the event if we are dealing with it\n // which is only when the target has state\n e.stopPropagation();\n this._onDrop.fire({\n position: this._state,\n nativeEvent: e,\n });\n }\n }\n this.removeDropTarget();\n target === null || target === void 0 ? void 0 : target.clear();\n },\n onDrop: (e) => {\n var _a, _b, _c;\n e.preventDefault();\n const state = this._state;\n this.removeDropTarget();\n (_c = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a)) === null || _c === void 0 ? void 0 : _c.clear();\n if (state) {\n // only stop the propagation of the event if we are dealing with it\n // which is only when the target has state\n e.stopPropagation();\n this._onDrop.fire({ position: state, nativeEvent: e });\n }\n },\n });\n this.addDisposables(this._onDrop, this._onWillShowOverlay, this.dnd);\n }\n setTargetZones(acceptedTargetZones) {\n this._acceptedTargetZonesSet = new Set(acceptedTargetZones);\n }\n setOverlayModel(model) {\n this.options.overlayModel = model;\n }\n dispose() {\n this.removeDropTarget();\n super.dispose();\n }\n /**\n * Add a property to the event object for other potential listeners to check\n */\n markAsUsed(event) {\n event[Droptarget.USED_EVENT_ID] = true;\n }\n /**\n * Check is the event has already been used by another instance of DropTarget\n */\n isAlreadyUsed(event) {\n const value = event[Droptarget.USED_EVENT_ID];\n return typeof value === 'boolean' && value;\n }\n toggleClasses(quadrant, width, height) {\n var _a, _b, _c, _d, _e;\n const target = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);\n if (target) {\n const outlineEl = (_e = (_d = (_c = this.options).getOverlayOutline) === null || _d === void 0 ? void 0 : _d.call(_c)) !== null && _e !== void 0 ? _e : this.element;\n renderAnchoredOverlay({\n outlineElement: outlineEl,\n targetModel: target,\n quadrant,\n width,\n height,\n overlayModel: this.options.overlayModel,\n className: this.options.className,\n });\n return;\n }\n if (!this.overlayElement) {\n return;\n }\n renderInPlaceOverlay(this.overlayElement, quadrant, width, height, this.options.overlayModel);\n }\n calculateQuadrant(overlayType, x, y, width, height) {\n var _a, _b;\n const activationSizeOptions = (_b = (_a = this.options.overlayModel) === null || _a === void 0 ? void 0 : _a.activationSize) !== null && _b !== void 0 ? _b : DEFAULT_ACTIVATION_SIZE$1;\n const isPercentage = activationSizeOptions.type === 'percentage';\n if (isPercentage) {\n return calculateQuadrantAsPercentage(overlayType, x, y, width, height, activationSizeOptions.value);\n }\n return calculateQuadrantAsPixels(overlayType, x, y, width, height, activationSizeOptions.value);\n }\n removeDropTarget() {\n var _a;\n if (this.targetElement) {\n this._state = undefined;\n (_a = this.targetElement.parentElement) === null || _a === void 0 ? void 0 : _a.classList.remove('dv-drop-target');\n this.targetElement.remove();\n this.targetElement = undefined;\n this.overlayElement = undefined;\n }\n }\n}\nDroptarget.USED_EVENT_ID = '__dockview_droptarget_event_is_used__';\nfunction calculateQuadrantAsPercentage(overlayType, x, y, width, height, threshold) {\n const xp = (100 * x) / width;\n const yp = (100 * y) / height;\n if (overlayType.has('left') && xp < threshold) {\n return 'left';\n }\n if (overlayType.has('right') && xp > 100 - threshold) {\n return 'right';\n }\n if (overlayType.has('top') && yp < threshold) {\n return 'top';\n }\n if (overlayType.has('bottom') && yp > 100 - threshold) {\n return 'bottom';\n }\n if (!overlayType.has('center')) {\n return null;\n }\n return 'center';\n}\nfunction calculateQuadrantAsPixels(overlayType, x, y, width, height, threshold) {\n if (overlayType.has('left') && x < threshold) {\n return 'left';\n }\n if (overlayType.has('right') && x > width - threshold) {\n return 'right';\n }\n if (overlayType.has('top') && y < threshold) {\n return 'top';\n }\n if (overlayType.has('bottom') && y > height - threshold) {\n return 'bottom';\n }\n if (!overlayType.has('center')) {\n return null;\n }\n return 'center';\n}\n\nfunction addGhostImage(dataTransfer, ghostElement, options) {\n var _a, _b;\n // class dockview provides to force ghost image to be drawn on a different layer and prevent weird rendering issues\n addClasses(ghostElement, 'dv-dragged');\n // move the element off-screen initially otherwise it may in some cases be rendered at (0,0) momentarily\n ghostElement.style.top = '-9999px';\n document.body.appendChild(ghostElement);\n dataTransfer.setDragImage(ghostElement, (_a = options === null || options === void 0 ? void 0 : options.x) !== null && _a !== void 0 ? _a : 0, (_b = options === null || options === void 0 ? void 0 : options.y) !== null && _b !== void 0 ? _b : 0);\n setTimeout(() => {\n removeClasses(ghostElement, 'dv-dragged');\n ghostElement.remove();\n }, 0);\n}\n\n/**\n * Singleton — only one pointer-driven drag active at a time.\n *\n * State is shared across every Dockview instance on the page. Targets\n * from instance B receive hit-tests from drags originating in instance A;\n * that's intentional for cross-instance drops since `LocalSelectionTransfer`\n * is also process-wide. The corollary is that every Tabs subscriber to\n * `onDragMove` fires for every pointer drag globally — each subscriber\n * hit-tests against its own DOM, so this is O(N) per pointermove where N\n * is the number of registered listeners across all instances.\n */\nclass PointerDragController extends CompositeDisposable {\n static getInstance() {\n if (!PointerDragController._instance) {\n PointerDragController._instance = new PointerDragController();\n }\n return PointerDragController._instance;\n }\n constructor() {\n super();\n this._targets = new Set();\n /** Kept in sync with `_targets` so hit-testing is allocation-free. */\n this._targetByElement = new Map();\n this._onDragStart = new Emitter();\n this.onDragStart = this._onDragStart.event;\n this._onDragMove = new Emitter();\n this.onDragMove = this._onDragMove.event;\n this._onDragEnd = new Emitter();\n this.onDragEnd = this._onDragEnd.event;\n this.addDisposables(this._onDragStart, this._onDragMove, this._onDragEnd);\n }\n get active() {\n return this._active;\n }\n registerTarget(target) {\n this._targets.add(target);\n this._targetByElement.set(target.element, target);\n return {\n dispose: () => {\n this._targets.delete(target);\n if (this._targetByElement.get(target.element) === target) {\n this._targetByElement.delete(target.element);\n }\n if (this._currentTarget === target) {\n this._currentTarget = undefined;\n }\n },\n };\n }\n beginDrag(args) {\n var _a, _b, _c;\n if (this._active) {\n this.cancel();\n }\n const { pointerEvent, source } = args;\n // Call `getData()` before mutating controller state — a throw\n // here would otherwise leave `_active` populated with no window\n // listeners installed, blocking every subsequent drag.\n const dataDisposable = args.getData();\n this._active = {\n pointerId: pointerEvent.pointerId,\n startX: pointerEvent.clientX,\n startY: pointerEvent.clientY,\n source,\n };\n this._onDragMoveCallback = args.onDragMove;\n this._onDragEndCallback = args.onDragEnd;\n this._dataDisposable = dataDisposable;\n this._ghost = args.ghost;\n // Iframes capture pointermove once the cursor crosses into them,\n // which would freeze the drag from the parent window's POV.\n this._iframeShield = disableIframePointEvents((_a = source.ownerDocument) !== null && _a !== void 0 ? _a : document);\n const startEvent = {\n clientX: pointerEvent.clientX,\n clientY: pointerEvent.clientY,\n pointerEvent,\n };\n this._onDragStart.fire(startEvent);\n // Source's owning window — popout drags fire on their own window,\n // not the main one.\n const targetWindow = (_c = (_b = source.ownerDocument) === null || _b === void 0 ? void 0 : _b.defaultView) !== null && _c !== void 0 ? _c : window;\n this._moveListener = addDisposableListener(targetWindow, 'pointermove', (e) => {\n if (!this._active || e.pointerId !== this._active.pointerId) {\n return;\n }\n this._handleMove(e);\n });\n this._upListener = addDisposableListener(targetWindow, 'pointerup', (e) => {\n if (!this._active || e.pointerId !== this._active.pointerId) {\n return;\n }\n this._handleEnd(e, true);\n });\n this._cancelListener = addDisposableListener(targetWindow, 'pointercancel', (e) => {\n if (!this._active || e.pointerId !== this._active.pointerId) {\n return;\n }\n this._handleEnd(e, false);\n });\n }\n cancel() {\n var _a, _b;\n if (!this._active) {\n return;\n }\n (_a = this._currentTarget) === null || _a === void 0 ? void 0 : _a.handleDragLeave();\n this._teardown();\n (_b = this._dataDisposable) === null || _b === void 0 ? void 0 : _b.dispose();\n this._dataDisposable = undefined;\n }\n _findTargetUnder(x, y) {\n var _a, _b;\n // `elementsFromPoint` is topmost-first; walk up to find the closest\n // registered ancestor (so a tab beats the layout-root that contains it).\n // Use the source's owning document so popout drags hit their own targets.\n const sourceDoc = (_b = (_a = this._active) === null || _a === void 0 ? void 0 : _a.source.ownerDocument) !== null && _b !== void 0 ? _b : document;\n const elements = sourceDoc.elementsFromPoint(x, y);\n for (const el of elements) {\n let current = el;\n while (current) {\n const target = this._targetByElement.get(current);\n if (target) {\n return target;\n }\n current = current.parentElement;\n }\n }\n return undefined;\n }\n _handleMove(e) {\n var _a, _b, _c;\n (_a = this._ghost) === null || _a === void 0 ? void 0 : _a.update(e.clientX, e.clientY);\n const dragEvent = {\n clientX: e.clientX,\n clientY: e.clientY,\n pointerEvent: e,\n };\n const newTarget = this._findTargetUnder(e.clientX, e.clientY);\n if (newTarget !== this._currentTarget) {\n (_b = this._currentTarget) === null || _b === void 0 ? void 0 : _b.handleDragLeave();\n this._currentTarget = newTarget;\n }\n if (newTarget) {\n newTarget.handleDragOver(dragEvent);\n }\n (_c = this._onDragMoveCallback) === null || _c === void 0 ? void 0 : _c.call(this, dragEvent);\n this._onDragMove.fire(dragEvent);\n }\n _handleEnd(e, dropped) {\n var _a;\n const dragEvent = {\n clientX: e.clientX,\n clientY: e.clientY,\n pointerEvent: e,\n };\n if (dropped && this._currentTarget) {\n this._currentTarget.handleDrop(dragEvent);\n }\n else {\n (_a = this._currentTarget) === null || _a === void 0 ? void 0 : _a.handleDragLeave();\n }\n const onEnd = this._onDragEndCallback;\n const dataDisposable = this._dataDisposable;\n this._teardown();\n this._dataDisposable = undefined;\n // Defer disposal so drop handlers can still read the transfer data.\n setTimeout(() => dataDisposable === null || dataDisposable === void 0 ? void 0 : dataDisposable.dispose(), 0);\n onEnd === null || onEnd === void 0 ? void 0 : onEnd(dragEvent, dropped);\n this._onDragEnd.fire(dragEvent);\n }\n _teardown() {\n var _a, _b, _c, _d, _e;\n this._currentTarget = undefined;\n this._active = undefined;\n this._onDragMoveCallback = undefined;\n this._onDragEndCallback = undefined;\n (_a = this._ghost) === null || _a === void 0 ? void 0 : _a.dispose();\n this._ghost = undefined;\n (_b = this._iframeShield) === null || _b === void 0 ? void 0 : _b.release();\n this._iframeShield = undefined;\n (_c = this._moveListener) === null || _c === void 0 ? void 0 : _c.dispose();\n (_d = this._upListener) === null || _d === void 0 ? void 0 : _d.dispose();\n (_e = this._cancelListener) === null || _e === void 0 ? void 0 : _e.dispose();\n this._moveListener = undefined;\n this._upListener = undefined;\n this._cancelListener = undefined;\n }\n}\n\nconst DEFAULT_ACTIVATION_SIZE = {\n value: 20,\n type: 'percentage',\n};\n/** Pointer-driven counterpart to `Droptarget` with identical visual output. */\nclass PointerDropTarget extends CompositeDisposable {\n get disabled() {\n return this._disabled;\n }\n set disabled(value) {\n this._disabled = value;\n if (value) {\n this._removeOverlay();\n }\n }\n get state() {\n return this._state;\n }\n constructor(element, options) {\n super();\n this.element = element;\n this.options = options;\n this._onDrop = new Emitter();\n this.onDrop = this._onDrop.event;\n this._onWillShowOverlay = new Emitter();\n this.onWillShowOverlay = this._onWillShowOverlay.event;\n this._disabled = false;\n this._acceptedTargetZonesSet = new Set(options.acceptedTargetZones);\n const handle = {\n element: this.element,\n handleDragOver: (e) => this._onDragOver(e),\n handleDragLeave: () => this._onDragLeave(),\n handleDrop: (e) => this._onDropEvent(e),\n };\n this.addDisposables(this._onDrop, this._onWillShowOverlay, PointerDragController.getInstance().registerTarget(handle));\n }\n setTargetZones(zones) {\n this._acceptedTargetZonesSet = new Set(zones);\n }\n setOverlayModel(model) {\n this.options.overlayModel = model;\n }\n dispose() {\n this._removeOverlay();\n super.dispose();\n }\n _onDragOver(event) {\n var _a, _b, _c, _d, _e;\n if (this._disabled) {\n this._removeOverlay();\n return;\n }\n const overrideTarget = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);\n if (this._acceptedTargetZonesSet.size === 0) {\n if (overrideTarget) {\n return;\n }\n this._removeOverlay();\n return;\n }\n const outlineEl = (_e = (_d = (_c = this.options).getOverlayOutline) === null || _d === void 0 ? void 0 : _d.call(_c)) !== null && _e !== void 0 ? _e : this.element;\n const width = outlineEl.offsetWidth;\n const height = outlineEl.offsetHeight;\n if (width === 0 || height === 0) {\n return;\n }\n const rect = outlineEl.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const quadrant = this._calculateQuadrant(x, y, width, height);\n if (quadrant === null) {\n this._removeOverlay();\n return;\n }\n if (!this.options.canDisplayOverlay(event.pointerEvent, quadrant)) {\n if (overrideTarget) {\n return;\n }\n this._removeOverlay();\n return;\n }\n const willShow = new WillShowOverlayEvent({\n nativeEvent: event.pointerEvent,\n position: quadrant,\n });\n this._onWillShowOverlay.fire(willShow);\n if (willShow.defaultPrevented) {\n this._removeOverlay();\n return;\n }\n if (overrideTarget) {\n renderAnchoredOverlay({\n outlineElement: outlineEl,\n targetModel: overrideTarget,\n quadrant,\n width,\n height,\n overlayModel: this.options.overlayModel,\n className: this.options.className,\n });\n this._state = quadrant;\n return;\n }\n if (!this._targetElement) {\n const els = createOverlayElements();\n this._targetElement = els.dropzone;\n this._overlayElement = els.selection;\n this._state = 'center';\n this.element.classList.add('dv-drop-target');\n this.element.append(this._targetElement);\n }\n if (this._overlayElement) {\n renderInPlaceOverlay(this._overlayElement, quadrant, width, height, this.options.overlayModel);\n }\n this._state = quadrant;\n }\n _onDragLeave() {\n var _a, _b;\n const overrideTarget = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);\n // Anchor target owns its own lifecycle; just clear our latched\n // state so a subsequent pointerup doesn't fire a stale drop.\n if (overrideTarget) {\n this._state = undefined;\n overrideTarget.clear();\n return;\n }\n this._removeOverlay();\n }\n _onDropEvent(event) {\n var _a, _b;\n const state = this._state;\n const overrideTarget = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);\n this._removeOverlay();\n overrideTarget === null || overrideTarget === void 0 ? void 0 : overrideTarget.clear();\n if (state) {\n this._onDrop.fire({\n position: state,\n nativeEvent: event.pointerEvent,\n });\n }\n }\n _calculateQuadrant(x, y, width, height) {\n var _a, _b;\n const activation = (_b = (_a = this.options.overlayModel) === null || _a === void 0 ? void 0 : _a.activationSize) !== null && _b !== void 0 ? _b : DEFAULT_ACTIVATION_SIZE;\n if (activation.type === 'percentage') {\n return calculateQuadrantAsPercentage(this._acceptedTargetZonesSet, x, y, width, height, activation.value);\n }\n return calculateQuadrantAsPixels(this._acceptedTargetZonesSet, x, y, width, height, activation.value);\n }\n _removeOverlay() {\n var _a;\n if (this._targetElement) {\n this._state = undefined;\n (_a = this._targetElement.parentElement) === null || _a === void 0 ? void 0 : _a.classList.remove('dv-drop-target');\n this._targetElement.remove();\n this._targetElement = undefined;\n this._overlayElement = undefined;\n }\n else {\n this._state = undefined;\n }\n }\n}\n\nconst DEFAULT_THRESHOLD = 5;\nconst DEFAULT_TOUCH_INITIATION_DELAY = 250;\nconst DEFAULT_PRESS_TOLERANCE = 8;\n/**\n * Pointer-event drag source. Waits for movement past `threshold` (and\n * touch-only `touchInitiationDelay`) before promoting to a drag so taps\n * pass through unaffected.\n */\nclass PointerDragSource extends CompositeDisposable {\n constructor(element, options) {\n var _a;\n super();\n this.element = element;\n this.options = options;\n this._disabled = false;\n this._armed = false;\n this._startX = 0;\n this._startY = 0;\n this._touchOnly = (_a = options.touchOnly) !== null && _a !== void 0 ? _a : true;\n this.addDisposables(addDisposableListener(this.element, 'pointerdown', (e) => {\n this._onPointerDown(e);\n }));\n }\n setDisabled(value) {\n this._disabled = value;\n if (value) {\n this._cancelPending();\n }\n }\n /**\n * `false` lets the pointer source also handle mouse pointers; used when\n * `dndStrategy: 'pointer'` to drive every input type through this path.\n */\n setTouchOnly(value) {\n if (this._touchOnly === value) {\n return;\n }\n this._touchOnly = value;\n // A pending mouse-tracked drag should be abandoned if we re-enable\n // the touch-only filter mid-flight.\n if (value) {\n this._cancelPending();\n }\n }\n _shouldHandle(event) {\n var _a, _b;\n if (this._disabled) {\n return false;\n }\n // Pointer-type filter runs before isCancelled — consumer state read\n // by isCancelled may not be populated for events we'll never handle.\n if (this._touchOnly &&\n event.pointerType !== 'touch' &&\n event.pointerType !== 'pen') {\n return false;\n }\n if ((_b = (_a = this.options).isCancelled) === null || _b === void 0 ? void 0 : _b.call(_a, event)) {\n return false;\n }\n return true;\n }\n _onPointerDown(event) {\n var _a, _b, _c, _d, _e;\n if (!this._shouldHandle(event)) {\n return;\n }\n // Defensive: a fresh pointerdown supersedes any in-flight tracking.\n this._cancelPending();\n this._pendingPointerId = event.pointerId;\n this._startX = event.clientX;\n this._startY = event.clientY;\n this._startEvent = event;\n const isTouch = event.pointerType === 'touch' || event.pointerType === 'pen';\n // Touch waits a short window so a still finger can press-and-hold\n // before drifting; once the timer fires, any motion past `threshold`\n // begins the drag.\n const initiationDelayOpt = this.options.touchInitiationDelay;\n const initiationDelay = (_a = (typeof initiationDelayOpt === 'function'\n ? initiationDelayOpt()\n : initiationDelayOpt)) !== null && _a !== void 0 ? _a : DEFAULT_TOUCH_INITIATION_DELAY;\n this._armed = !isTouch || initiationDelay <= 0;\n if (isTouch && initiationDelay > 0 && isFinite(initiationDelay)) {\n this._armTimer = setTimeout(() => {\n this._armTimer = undefined;\n this._armed = true;\n }, initiationDelay);\n }\n const threshold = (_b = this.options.threshold) !== null && _b !== void 0 ? _b : DEFAULT_THRESHOLD;\n const pressToleranceOpt = this.options.pressTolerance;\n const pressTolerance = (_c = (typeof pressToleranceOpt === 'function'\n ? pressToleranceOpt()\n : pressToleranceOpt)) !== null && _c !== void 0 ? _c : DEFAULT_PRESS_TOLERANCE;\n // Source's owning window — popout drags fire on their own window.\n const targetWindow = (_e = (_d = this.element.ownerDocument) === null || _d === void 0 ? void 0 : _d.defaultView) !== null && _e !== void 0 ? _e : window;\n this._pendingMoveListener = addDisposableListener(targetWindow, 'pointermove', (moveEvent) => {\n if (moveEvent.pointerId !== this._pendingPointerId) {\n return;\n }\n const dx = moveEvent.clientX - this._startX;\n const dy = moveEvent.clientY - this._startY;\n const distance = Math.hypot(dx, dy);\n if (this._armed) {\n if (distance >= threshold) {\n this._beginDrag(moveEvent);\n }\n return;\n }\n // Pre-arm phase: a flick past `pressTolerance` in any\n // direction is treated as drag intent. The element opts out\n // of native scroll via `touch-action: none`; container-level\n // scrolling lives on the surrounding strip's empty space.\n if (distance > pressTolerance) {\n this._beginDrag(moveEvent);\n }\n });\n this._pendingUpListener = addDisposableListener(targetWindow, 'pointerup', (upEvent) => {\n if (upEvent.pointerId !== this._pendingPointerId) {\n return;\n }\n this._cancelPending();\n });\n this._pendingCancelListener = addDisposableListener(targetWindow, 'pointercancel', (cancelEvent) => {\n if (cancelEvent.pointerId !== this._pendingPointerId) {\n return;\n }\n this._cancelPending();\n });\n }\n /** For sibling gesture detectors (e.g. LongPressDetector) to dismiss a pending drag. */\n cancelPending() {\n this._cancelPending();\n }\n _cancelPending() {\n var _a, _b, _c;\n this._pendingPointerId = undefined;\n if (this._armTimer !== undefined) {\n clearTimeout(this._armTimer);\n this._armTimer = undefined;\n }\n this._armed = false;\n (_a = this._pendingMoveListener) === null || _a === void 0 ? void 0 : _a.dispose();\n (_b = this._pendingUpListener) === null || _b === void 0 ? void 0 : _b.dispose();\n (_c = this._pendingCancelListener) === null || _c === void 0 ? void 0 : _c.dispose();\n this._pendingMoveListener = undefined;\n this._pendingUpListener = undefined;\n this._pendingCancelListener = undefined;\n this._startEvent = undefined;\n }\n _beginDrag(triggerEvent) {\n var _a, _b, _c, _d, _e;\n const startEvent = (_a = this._startEvent) !== null && _a !== void 0 ? _a : triggerEvent;\n this._cancelPending();\n (_c = (_b = this.options).onDragStart) === null || _c === void 0 ? void 0 : _c.call(_b, startEvent);\n const ghost = (_e = (_d = this.options).createGhost) === null || _e === void 0 ? void 0 : _e.call(_d, startEvent);\n PointerDragController.getInstance().beginDrag({\n pointerEvent: triggerEvent,\n source: this.element,\n getData: () => this.options.getData(startEvent),\n ghost,\n onDragMove: this.options.onDragMove,\n onDragEnd: this.options.onDragEnd,\n });\n }\n dispose() {\n this._cancelPending();\n super.dispose();\n }\n}\n\n/**\n * Floating clone that follows the pointer; appended to the owning\n * document's body with `pointer-events: none` so it doesn't intercept\n * hit-testing.\n */\nclass PointerGhost {\n constructor(opts) {\n var _a, _b, _c, _d, _e;\n this._disposed = false;\n this.element = opts.element;\n this.offsetX = (_a = opts.offsetX) !== null && _a !== void 0 ? _a : 0;\n this.offsetY = (_b = opts.offsetY) !== null && _b !== void 0 ? _b : 0;\n // Animate via transform (see update); position:fixed for scroll-independence.\n this.element.style.position = 'fixed';\n this.element.style.left = '0px';\n this.element.style.top = '0px';\n this.element.style.pointerEvents = 'none';\n this.element.style.zIndex = '99999';\n this.element.style.opacity = String((_c = opts.opacity) !== null && _c !== void 0 ? _c : 0.8);\n this.element.style.willChange = 'transform';\n this.element.style.transform = `translate3d(${opts.initialX - this.offsetX}px, ${opts.initialY - this.offsetY}px, 0)`;\n const ownerDocument = (_e = (_d = opts.owner) === null || _d === void 0 ? void 0 : _d.ownerDocument) !== null && _e !== void 0 ? _e : document;\n ownerDocument.body.appendChild(this.element);\n }\n update(clientX, clientY) {\n if (this._disposed) {\n return;\n }\n // translate3d composites on the GPU — no layout per pointermove.\n this.element.style.transform = `translate3d(${clientX - this.offsetX}px, ${clientY - this.offsetY}px, 0)`;\n }\n dispose() {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this.element.remove();\n }\n}\n\n/**\n * HTML5 drag source. Listens for the native `dragstart` event, calls\n * `getData` to populate transfer, optionally renders the ghost via\n * `setDragImage`, fires `onDragStart` / `onDragEnd`, and tears down the\n * transfer disposer after `dragend`.\n */\nclass Html5DragSource extends CompositeDisposable {\n constructor(el, opts) {\n super();\n this.el = el;\n this.opts = opts;\n this._dataDisposable = new MutableDisposable();\n this._pointerEventsDisposable = new MutableDisposable();\n this._disabled = !!opts.disabled;\n this.addDisposables(this._dataDisposable, this._pointerEventsDisposable, addDisposableListener(this.el, 'dragstart', (event) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n if (event.defaultPrevented ||\n this._disabled ||\n ((_b = (_a = this.opts).isCancelled) === null || _b === void 0 ? void 0 : _b.call(_a, event))) {\n event.preventDefault();\n return;\n }\n // Iframes capture pointermove once the cursor enters them,\n // which freezes drag tracking from the parent window's\n // POV. Shield the source's owning document so popout-window\n // drags shield the popout, not the main window.\n const iframes = disableIframePointEvents((_c = this.el.ownerDocument) !== null && _c !== void 0 ? _c : document);\n this._pointerEventsDisposable.value = {\n dispose: () => iframes.release(),\n };\n this.el.classList.add('dv-dragged');\n setTimeout(() => this.el.classList.remove('dv-dragged'), 0);\n this._dataDisposable.value = this.opts.getData(event);\n const ghost = (_e = (_d = this.opts).createGhost) === null || _e === void 0 ? void 0 : _e.call(_d, event);\n if (ghost && event.dataTransfer) {\n addGhostImage(event.dataTransfer, ghost.element, {\n x: (_f = ghost.offsetX) !== null && _f !== void 0 ? _f : 0,\n y: (_g = ghost.offsetY) !== null && _g !== void 0 ? _g : 0,\n });\n if (ghost.dispose) {\n // addGhostImage removes the element from the DOM on\n // the next tick; dispose the framework renderer on\n // the same schedule.\n const disposeGhost = ghost.dispose;\n setTimeout(() => disposeGhost(), 0);\n }\n }\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n // Some third-party DnD libs (e.g. react-dnd) cancel the\n // dragstart when `dataTransfer.types` is empty.\n if (event.dataTransfer.items.length === 0) {\n event.dataTransfer.setData('text/plain', '');\n }\n }\n (_j = (_h = this.opts).onDragStart) === null || _j === void 0 ? void 0 : _j.call(_h, event);\n }), addDisposableListener(this.el, 'dragend', (event) => {\n var _a, _b;\n this._pointerEventsDisposable.dispose();\n // Defer disposal so drop handlers can still read the\n // transfer payload before it clears.\n setTimeout(() => this._dataDisposable.dispose(), 0);\n (_b = (_a = this.opts).onDragEnd) === null || _b === void 0 ? void 0 : _b.call(_a, event);\n }));\n }\n setDisabled(value) {\n this._disabled = value;\n }\n setTouchOnly(_) {\n // No-op — HTML5 path can't filter by pointer type.\n }\n cancelPending() {\n // No-op — HTML5 has no pre-arm phase to cancel.\n }\n}\nclass Html5DragBackend {\n constructor() {\n this.kind = 'html5';\n }\n createDropTarget(element, options) {\n return new Droptarget(element, options);\n }\n createDragSource(element, options) {\n return new Html5DragSource(element, options);\n }\n}\nclass PointerDragBackend {\n constructor() {\n this.kind = 'pointer';\n }\n createDropTarget(element, options) {\n return new PointerDropTarget(element, options);\n }\n createDragSource(element, options) {\n const pointerCreateGhost = options.createGhost\n ? (event) => {\n const spec = options.createGhost(event);\n if (!spec) {\n return undefined;\n }\n const ghost = new PointerGhost({\n element: spec.element,\n initialX: event.clientX,\n initialY: event.clientY,\n offsetX: spec.offsetX,\n offsetY: spec.offsetY,\n owner: element,\n });\n if (spec.dispose) {\n const baseDispose = ghost.dispose.bind(ghost);\n const disposeSpec = spec.dispose;\n ghost.dispose = () => {\n baseDispose();\n disposeSpec();\n };\n }\n return ghost;\n }\n : undefined;\n const source = new PointerDragSource(element, {\n getData: options.getData,\n isCancelled: options.isCancelled,\n onDragStart: options.onDragStart,\n onDragEnd: options.onDragEnd\n ? (event) => options.onDragEnd(event.pointerEvent)\n : undefined,\n createGhost: pointerCreateGhost,\n touchOnly: options.touchOnly,\n touchInitiationDelay: options.touchInitiationDelay,\n pressTolerance: options.pressTolerance,\n threshold: options.threshold,\n });\n if (options.disabled) {\n source.setDisabled(true);\n }\n return source;\n }\n}\nconst html5Backend = new Html5DragBackend();\nconst pointerBackend = new PointerDragBackend();\n\nconst PROPERTY_KEYS_PANEVIEW = (() => {\n /**\n * by readong the keys from an empty value object TypeScript will error\n * when we add or remove new properties to `DockviewOptions`\n */\n const properties = {\n disableAutoResizing: undefined,\n disableDnd: undefined,\n className: undefined,\n };\n return Object.keys(properties);\n})();\nclass PaneviewUnhandledDragOverEvent extends AcceptableEvent {\n constructor(nativeEvent, position, getData, panel) {\n super();\n this.nativeEvent = nativeEvent;\n this.position = position;\n this.getData = getData;\n this.panel = panel;\n }\n}\n\nclass WillFocusEvent extends DockviewEvent {\n constructor() {\n super();\n }\n}\n/**\n * A core api implementation that should be used across all panel-like objects\n */\nclass PanelApiImpl extends CompositeDisposable {\n get isFocused() {\n return this._isFocused;\n }\n get isActive() {\n return this._isActive;\n }\n get isVisible() {\n return this._isVisible;\n }\n get width() {\n return this._width;\n }\n get height() {\n return this._height;\n }\n constructor(id, component) {\n super();\n this.id = id;\n this.component = component;\n this._isFocused = false;\n this._isActive = false;\n this._isVisible = true;\n this._width = 0;\n this._height = 0;\n this._parameters = {};\n this.panelUpdatesDisposable = new MutableDisposable();\n this._onDidDimensionChange = new Emitter();\n this.onDidDimensionsChange = this._onDidDimensionChange.event;\n this._onDidChangeFocus = new Emitter();\n this.onDidFocusChange = this._onDidChangeFocus.event;\n //\n this._onWillFocus = new Emitter();\n this.onWillFocus = this._onWillFocus.event;\n //\n this._onDidVisibilityChange = new Emitter();\n this.onDidVisibilityChange = this._onDidVisibilityChange.event;\n this._onWillVisibilityChange = new Emitter();\n this.onWillVisibilityChange = this._onWillVisibilityChange.event;\n this._onDidActiveChange = new Emitter();\n this.onDidActiveChange = this._onDidActiveChange.event;\n this._onActiveChange = new Emitter();\n this.onActiveChange = this._onActiveChange.event;\n this._onDidParametersChange = new Emitter();\n this.onDidParametersChange = this._onDidParametersChange.event;\n this.addDisposables(this.onDidFocusChange((event) => {\n this._isFocused = event.isFocused;\n }), this.onDidActiveChange((event) => {\n this._isActive = event.isActive;\n }), this.onDidVisibilityChange((event) => {\n this._isVisible = event.isVisible;\n }), this.onDidDimensionsChange((event) => {\n this._width = event.width;\n this._height = event.height;\n }), this.panelUpdatesDisposable, this._onDidDimensionChange, this._onDidChangeFocus, this._onDidVisibilityChange, this._onDidActiveChange, this._onWillFocus, this._onActiveChange, this._onWillFocus, this._onWillVisibilityChange, this._onDidParametersChange);\n }\n getParameters() {\n return this._parameters;\n }\n initialize(panel) {\n this.panelUpdatesDisposable.value = this._onDidParametersChange.event((parameters) => {\n this._parameters = parameters;\n panel.update({\n params: parameters,\n });\n });\n }\n setVisible(isVisible) {\n this._onWillVisibilityChange.fire({ isVisible });\n }\n setActive() {\n this._onActiveChange.fire();\n }\n updateParameters(parameters) {\n this._onDidParametersChange.fire(parameters);\n }\n}\n\nclass SplitviewPanelApiImpl extends PanelApiImpl {\n //\n constructor(id, component) {\n super(id, component);\n this._onDidConstraintsChangeInternal = new Emitter();\n this.onDidConstraintsChangeInternal = this._onDidConstraintsChangeInternal.event;\n //\n this._onDidConstraintsChange = new Emitter({\n replay: true,\n });\n this.onDidConstraintsChange = this._onDidConstraintsChange.event;\n //\n this._onDidSizeChange = new Emitter();\n this.onDidSizeChange = this._onDidSizeChange.event;\n this.addDisposables(this._onDidConstraintsChangeInternal, this._onDidConstraintsChange, this._onDidSizeChange);\n }\n setConstraints(value) {\n this._onDidConstraintsChangeInternal.fire(value);\n }\n setSize(event) {\n this._onDidSizeChange.fire(event);\n }\n}\n\nclass PaneviewPanelApiImpl extends SplitviewPanelApiImpl {\n set pane(pane) {\n this._pane = pane;\n }\n constructor(id, component) {\n super(id, component);\n this._onDidExpansionChange = new Emitter({\n replay: true,\n });\n this.onDidExpansionChange = this._onDidExpansionChange.event;\n this._onMouseEnter = new Emitter({});\n this.onMouseEnter = this._onMouseEnter.event;\n this._onMouseLeave = new Emitter({});\n this.onMouseLeave = this._onMouseLeave.event;\n this.addDisposables(this._onDidExpansionChange, this._onMouseEnter, this._onMouseLeave);\n }\n setExpanded(isExpanded) {\n var _a;\n (_a = this._pane) === null || _a === void 0 ? void 0 : _a.setExpanded(isExpanded);\n }\n get isExpanded() {\n var _a;\n return !!((_a = this._pane) === null || _a === void 0 ? void 0 : _a.isExpanded());\n }\n}\n\nclass BasePanelView extends CompositeDisposable {\n get element() {\n return this._element;\n }\n get width() {\n return this._width;\n }\n get height() {\n return this._height;\n }\n get params() {\n var _a;\n return (_a = this._params) === null || _a === void 0 ? void 0 : _a.params;\n }\n constructor(id, component, api) {\n super();\n this.id = id;\n this.component = component;\n this.api = api;\n this._height = 0;\n this._width = 0;\n this._element = document.createElement('div');\n this._element.tabIndex = -1;\n this._element.style.outline = 'none';\n this._element.style.height = '100%';\n this._element.style.width = '100%';\n this._element.style.overflow = 'hidden';\n const focusTracker = trackFocus(this._element);\n this.addDisposables(this.api, focusTracker.onDidFocus(() => {\n this.api._onDidChangeFocus.fire({ isFocused: true });\n }), focusTracker.onDidBlur(() => {\n this.api._onDidChangeFocus.fire({ isFocused: false });\n }), focusTracker);\n }\n focus() {\n const event = new WillFocusEvent();\n this.api._onWillFocus.fire(event);\n if (event.defaultPrevented) {\n return;\n }\n this._element.focus();\n }\n layout(width, height) {\n this._width = width;\n this._height = height;\n this.api._onDidDimensionChange.fire({ width, height });\n if (this.part) {\n if (this._params) {\n this.part.update(this._params.params);\n }\n }\n }\n init(parameters) {\n this._params = parameters;\n this.part = this.getComponent();\n }\n update(event) {\n var _a, _b;\n // merge the new parameters with the existing parameters\n this._params = Object.assign(Object.assign({}, this._params), { params: Object.assign(Object.assign({}, (_a = this._params) === null || _a === void 0 ? void 0 : _a.params), event.params) });\n /**\n * delete new keys that have a value of undefined,\n * allow values of null\n */\n for (const key of Object.keys(event.params)) {\n if (event.params[key] === undefined) {\n delete this._params.params[key];\n }\n }\n // update the view with the updated props\n (_b = this.part) === null || _b === void 0 ? void 0 : _b.update({ params: this._params.params });\n }\n toJSON() {\n var _a, _b;\n const params = (_b = (_a = this._params) === null || _a === void 0 ? void 0 : _a.params) !== null && _b !== void 0 ? _b : {};\n return {\n id: this.id,\n component: this.component,\n params: Object.keys(params).length > 0 ? params : undefined,\n };\n }\n dispose() {\n var _a;\n this.api.dispose();\n (_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();\n super.dispose();\n }\n}\n\nclass PaneviewPanel extends BasePanelView {\n set orientation(value) {\n this._orientation = value;\n }\n get orientation() {\n return this._orientation;\n }\n get minimumSize() {\n const headerSize = this.headerSize;\n const expanded = this.isExpanded();\n const minimumBodySize = expanded ? this._minimumBodySize : 0;\n return headerSize + minimumBodySize;\n }\n get maximumSize() {\n const headerSize = this.headerSize;\n const expanded = this.isExpanded();\n const maximumBodySize = expanded ? this._maximumBodySize : 0;\n return headerSize + maximumBodySize;\n }\n get size() {\n return this._size;\n }\n get orthogonalSize() {\n return this._orthogonalSize;\n }\n set orthogonalSize(size) {\n this._orthogonalSize = size;\n }\n get minimumBodySize() {\n return this._minimumBodySize;\n }\n set minimumBodySize(value) {\n this._minimumBodySize = typeof value === 'number' ? value : 0;\n }\n get maximumBodySize() {\n return this._maximumBodySize;\n }\n set maximumBodySize(value) {\n this._maximumBodySize =\n typeof value === 'number' ? value : Number.POSITIVE_INFINITY;\n }\n get headerVisible() {\n return this._headerVisible;\n }\n set headerVisible(value) {\n this._headerVisible = value;\n this.header.style.display = value ? '' : 'none';\n }\n constructor(options) {\n super(options.id, options.component, new PaneviewPanelApiImpl(options.id, options.component));\n this._onDidChangeExpansionState = new Emitter({ replay: true });\n this.onDidChangeExpansionState = this._onDidChangeExpansionState.event;\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this._orthogonalSize = 0;\n this._size = 0;\n this._isExpanded = false;\n this.api.pane = this; // TODO cannot use 'this' before 'super'\n this.api.initialize(this);\n this.headerSize = options.headerSize;\n this.headerComponent = options.headerComponent;\n this._minimumBodySize = options.minimumBodySize;\n this._maximumBodySize = options.maximumBodySize;\n this._isExpanded = options.isExpanded;\n this._headerVisible = options.isHeaderVisible;\n this._onDidChangeExpansionState.fire(this.isExpanded()); // initialize value\n this._orientation = options.orientation;\n this.element.classList.add('dv-pane');\n this.addDisposables(this.api.onWillVisibilityChange((event) => {\n const { isVisible } = event;\n const { accessor } = this._params;\n accessor.setVisible(this, isVisible);\n }), this.api.onDidSizeChange((event) => {\n this._onDidChange.fire({ size: event.size });\n }), addDisposableListener(this.element, 'mouseenter', (ev) => {\n this.api._onMouseEnter.fire(ev);\n }), addDisposableListener(this.element, 'mouseleave', (ev) => {\n this.api._onMouseLeave.fire(ev);\n }));\n this.addDisposables(this._onDidChangeExpansionState, this.onDidChangeExpansionState((isPanelExpanded) => {\n this.api._onDidExpansionChange.fire({\n isExpanded: isPanelExpanded,\n });\n }), this.api.onDidFocusChange((e) => {\n if (!this.header) {\n return;\n }\n if (e.isFocused) {\n addClasses(this.header, 'focused');\n }\n else {\n removeClasses(this.header, 'focused');\n }\n }));\n this.renderOnce();\n }\n setVisible(isVisible) {\n this.api._onDidVisibilityChange.fire({ isVisible });\n }\n setActive(isActive) {\n this.api._onDidActiveChange.fire({ isActive });\n }\n isExpanded() {\n return this._isExpanded;\n }\n setExpanded(expanded) {\n if (this._isExpanded === expanded) {\n return;\n }\n this._isExpanded = expanded;\n if (expanded) {\n if (this.animationTimer) {\n clearTimeout(this.animationTimer);\n }\n if (this.body) {\n this.element.appendChild(this.body);\n }\n }\n else {\n this.animationTimer = setTimeout(() => {\n var _a;\n (_a = this.body) === null || _a === void 0 ? void 0 : _a.remove();\n }, 200);\n }\n this._onDidChange.fire(expanded ? { size: this.width } : {});\n this._onDidChangeExpansionState.fire(expanded);\n }\n layout(size, orthogonalSize) {\n this._size = size;\n this._orthogonalSize = orthogonalSize;\n const [width, height] = this.orientation === Orientation.HORIZONTAL\n ? [size, orthogonalSize]\n : [orthogonalSize, size];\n super.layout(width, height);\n }\n init(parameters) {\n var _a, _b;\n super.init(parameters);\n if (typeof parameters.minimumBodySize === 'number') {\n this.minimumBodySize = parameters.minimumBodySize;\n }\n if (typeof parameters.maximumBodySize === 'number') {\n this.maximumBodySize = parameters.maximumBodySize;\n }\n this.bodyPart = this.getBodyComponent();\n this.headerPart = this.getHeaderComponent();\n this.bodyPart.init(Object.assign(Object.assign({}, parameters), { api: this.api }));\n this.headerPart.init(Object.assign(Object.assign({}, parameters), { api: this.api }));\n (_a = this.body) === null || _a === void 0 ? void 0 : _a.append(this.bodyPart.element);\n (_b = this.header) === null || _b === void 0 ? void 0 : _b.append(this.headerPart.element);\n if (typeof parameters.isExpanded === 'boolean') {\n this.setExpanded(parameters.isExpanded);\n }\n }\n toJSON() {\n const params = this._params;\n return Object.assign(Object.assign({}, super.toJSON()), { headerComponent: this.headerComponent, title: params.title });\n }\n renderOnce() {\n this.header = document.createElement('div');\n this.header.tabIndex = 0;\n this.header.className = 'dv-pane-header';\n this.header.style.height = `${this.headerSize}px`;\n this.header.style.lineHeight = `${this.headerSize}px`;\n this.header.style.minHeight = `${this.headerSize}px`;\n this.header.style.maxHeight = `${this.headerSize}px`;\n this.element.appendChild(this.header);\n this.body = document.createElement('div');\n this.body.className = 'dv-pane-body';\n this.element.appendChild(this.body);\n }\n // TODO slightly hacky by-pass of the component to create a body and header component\n getComponent() {\n return {\n update: (params) => {\n var _a, _b;\n (_a = this.bodyPart) === null || _a === void 0 ? void 0 : _a.update({ params });\n (_b = this.headerPart) === null || _b === void 0 ? void 0 : _b.update({ params });\n },\n dispose: () => {\n var _a, _b;\n (_a = this.bodyPart) === null || _a === void 0 ? void 0 : _a.dispose();\n (_b = this.headerPart) === null || _b === void 0 ? void 0 : _b.dispose();\n },\n };\n }\n}\n\nclass DraggablePaneviewPanel extends PaneviewPanel {\n constructor(options) {\n super({\n id: options.id,\n component: options.component,\n headerComponent: options.headerComponent,\n orientation: options.orientation,\n isExpanded: options.isExpanded,\n isHeaderVisible: true,\n headerSize: options.headerSize,\n minimumBodySize: options.minimumBodySize,\n maximumBodySize: options.maximumBodySize,\n });\n this._onDidDrop = new Emitter();\n this.onDidDrop = this._onDidDrop.event;\n this._onUnhandledDragOverEvent = new Emitter();\n this.onUnhandledDragOverEvent = this._onUnhandledDragOverEvent.event;\n this.accessor = options.accessor;\n this.addDisposables(this._onDidDrop, this._onUnhandledDragOverEvent);\n if (!options.disableDnd) {\n this.initDragFeatures();\n }\n }\n initDragFeatures() {\n if (!this.header) {\n return;\n }\n const id = this.id;\n const accessorId = this.accessor.id;\n this.header.draggable = true;\n const sharedDragOptions = {\n getData: () => {\n LocalSelectionTransfer.getInstance().setData([new PaneTransfer(accessorId, id)], PaneTransfer.prototype);\n return {\n dispose: () => {\n LocalSelectionTransfer.getInstance().clearData(PaneTransfer.prototype);\n },\n };\n },\n };\n this.html5DragSource = html5Backend.createDragSource(this.header, sharedDragOptions);\n this.pointerDragSource = pointerBackend.createDragSource(this.header, sharedDragOptions);\n const canDisplayOverlay = (event, position) => {\n const data = getPaneData();\n if (data) {\n if (data.paneId !== this.id &&\n data.viewId === this.accessor.id) {\n return true;\n }\n }\n const firedEvent = new PaneviewUnhandledDragOverEvent(event, position, getPaneData, this);\n this._onUnhandledDragOverEvent.fire(firedEvent);\n return firedEvent.isAccepted;\n };\n const dropTargetOptions = {\n acceptedTargetZones: ['top', 'bottom'],\n overlayModel: {\n activationSize: { type: 'percentage', value: 50 },\n },\n canDisplayOverlay,\n };\n this.target = html5Backend.createDropTarget(this.element, dropTargetOptions);\n this.pointerTarget = pointerBackend.createDropTarget(this.element, dropTargetOptions);\n this.addDisposables(this._onDidDrop, this.html5DragSource, this.pointerDragSource, this.target, this.pointerTarget, this.target.onDrop((event) => {\n this.onDrop(event);\n }), this.pointerTarget.onDrop((event) => {\n this.onDrop(event);\n }));\n }\n onDrop(event) {\n const data = getPaneData();\n if (!data || data.viewId !== this.accessor.id) {\n // if there is no local drag event for this panel\n // or if the drag event was creating by another Paneview instance\n this._onDidDrop.fire(Object.assign(Object.assign({}, event), { panel: this, api: new PaneviewApi(this.accessor), getData: getPaneData }));\n return;\n }\n const containerApi = this._params\n .containerApi;\n const panelId = data.paneId;\n const existingPanel = containerApi.getPanel(panelId);\n if (!existingPanel) {\n // if the panel doesn't exist\n this._onDidDrop.fire(Object.assign(Object.assign({}, event), { panel: this, getData: getPaneData, api: new PaneviewApi(this.accessor) }));\n return;\n }\n const allPanels = containerApi.panels;\n const fromIndex = allPanels.indexOf(existingPanel);\n let toIndex = containerApi.panels.indexOf(this);\n if (event.position === 'left' || event.position === 'top') {\n toIndex = Math.max(0, toIndex - 1);\n }\n if (event.position === 'right' || event.position === 'bottom') {\n if (fromIndex > toIndex) {\n toIndex++;\n }\n toIndex = Math.min(allPanels.length - 1, toIndex);\n }\n containerApi.movePanel(fromIndex, toIndex);\n }\n}\n\nclass ContentContainer extends CompositeDisposable {\n get element() {\n return this._element;\n }\n constructor(accessor, group) {\n super();\n this.accessor = accessor;\n this.group = group;\n this.disposable = new MutableDisposable();\n this._onDidFocus = new Emitter();\n this.onDidFocus = this._onDidFocus.event;\n this._onDidBlur = new Emitter();\n this.onDidBlur = this._onDidBlur.event;\n this._element = document.createElement('div');\n this._element.className = 'dv-content-container';\n this._element.tabIndex = -1;\n this.addDisposables(this._onDidFocus, this._onDidBlur);\n const target = group.dropTargetContainer;\n const canDisplayOverlay = (event, position) => {\n if (this.group.locked === 'no-drop-target' ||\n (this.group.locked && position === 'center')) {\n return false;\n }\n const data = getPanelData();\n if (!data &&\n event.shiftKey &&\n this.group.location.type !== 'floating') {\n return false;\n }\n if (data && data.viewId === this.accessor.id) {\n return true;\n }\n return this.group.canDisplayOverlay(event, position, 'content');\n };\n // `dropTarget` stays the concrete `Droptarget` (not via the backend\n // factory) because overlayRenderContainer forwards HTML5 drag events\n // through `dropTarget.dnd` — that field is not part of `IDropTarget`.\n this.dropTarget = new Droptarget(this.element, {\n getOverlayOutline: () => {\n var _a;\n return ((_a = accessor.options.theme) === null || _a === void 0 ? void 0 : _a.dndPanelOverlay) === 'group'\n ? this.element.parentElement\n : null;\n },\n className: 'dv-drop-target-content',\n acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],\n canDisplayOverlay,\n getOverrideTarget: target ? () => target.model : undefined,\n });\n this.pointerDropTarget = pointerBackend.createDropTarget(this.element, {\n acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],\n canDisplayOverlay,\n getOverlayOutline: () => {\n var _a;\n return ((_a = accessor.options.theme) === null || _a === void 0 ? void 0 : _a.dndPanelOverlay) === 'group'\n ? this.element.parentElement\n : null;\n },\n className: 'dv-drop-target-content',\n getOverrideTarget: target ? () => target.model : undefined,\n });\n this.addDisposables(this.dropTarget, this.pointerDropTarget);\n }\n show() {\n this.element.style.display = '';\n }\n hide() {\n this.element.style.display = 'none';\n }\n renderPanel(panel, options = { asActive: true }) {\n var _a, _b, _c, _d;\n const doRender = options.asActive ||\n (this.panel && this.group.isPanelActive(this.panel));\n if (this.panel &&\n this.panel.view.content.element.parentElement === this._element) {\n /**\n * If the currently attached panel is mounted directly to the content then remove it\n */\n this._element.removeChild(this.panel.view.content.element);\n (_b = (_a = this.panel.view.content).onHide) === null || _b === void 0 ? void 0 : _b.call(_a);\n }\n this.panel = panel;\n let container;\n switch (panel.api.renderer) {\n case 'onlyWhenVisible':\n this.group.renderContainer.detatch(panel);\n if (this.panel) {\n if (doRender) {\n this._element.appendChild(this.panel.view.content.element);\n (_d = (_c = this.panel.view.content).onShow) === null || _d === void 0 ? void 0 : _d.call(_c);\n }\n }\n container = this._element;\n break;\n case 'always':\n if (panel.view.content.element.parentElement === this._element) {\n this._element.removeChild(panel.view.content.element);\n }\n container = this.group.renderContainer.attach({\n panel,\n referenceContainer: this,\n });\n break;\n default:\n throw new Error(`dockview: invalid renderer type '${panel.api.renderer}'`);\n }\n if (doRender) {\n const focusTracker = trackFocus(container);\n this.focusTracker = focusTracker;\n const disposable = new CompositeDisposable();\n disposable.addDisposables(focusTracker, focusTracker.onDidFocus(() => this._onDidFocus.fire()), focusTracker.onDidBlur(() => this._onDidBlur.fire()));\n this.disposable.value = disposable;\n }\n }\n openPanel(panel) {\n if (this.panel === panel) {\n return;\n }\n this.renderPanel(panel);\n }\n layout(_width, _height) {\n // noop\n }\n closePanel() {\n var _a, _b, _c;\n if (this.panel) {\n if (this.panel.api.renderer === 'onlyWhenVisible') {\n (_a = this.panel.view.content.element.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(this.panel.view.content.element);\n (_c = (_b = this.panel.view.content).onHide) === null || _c === void 0 ? void 0 : _c.call(_b);\n }\n }\n this.panel = undefined;\n }\n dispose() {\n this.disposable.dispose();\n super.dispose();\n }\n /**\n * Refresh the focus tracker state to handle cases where focus state\n * gets out of sync due to programmatic panel activation\n */\n refreshFocusState() {\n var _a;\n if ((_a = this.focusTracker) === null || _a === void 0 ? void 0 : _a.refreshState) {\n this.focusTracker.refreshState();\n }\n }\n}\n\nconst DEFAULT_DELAY = 500;\nconst DEFAULT_TOLERANCE = 8;\n/**\n * Passive — does not consume the pointer; movement past `tolerance`\n * cancels silently so a sibling `PointerDragSource` can take over.\n */\nclass LongPressDetector extends CompositeDisposable {\n constructor(element, options) {\n super();\n this.element = element;\n this.options = options;\n this._startX = 0;\n this._startY = 0;\n this.addDisposables(addDisposableListener(this.element, 'pointerdown', (e) => {\n this._onPointerDown(e);\n }));\n }\n _onPointerDown(event) {\n var _a, _b, _c, _d, _e;\n const touchOnly = (_a = this.options.touchOnly) !== null && _a !== void 0 ? _a : true;\n if (touchOnly &&\n event.pointerType !== 'touch' &&\n event.pointerType !== 'pen') {\n return;\n }\n // Defensive — supersede any in-flight press.\n this._cancelPending();\n this._pointerId = event.pointerId;\n this._startX = event.clientX;\n this._startY = event.clientY;\n const delay = (_b = this.options.delay) !== null && _b !== void 0 ? _b : DEFAULT_DELAY;\n const tolerance = (_c = this.options.tolerance) !== null && _c !== void 0 ? _c : DEFAULT_TOLERANCE;\n // Source's owning window — popout drags fire on their own window.\n const targetWindow = (_e = (_d = this.element.ownerDocument) === null || _d === void 0 ? void 0 : _d.defaultView) !== null && _e !== void 0 ? _e : window;\n this._timer = setTimeout(() => {\n this._timer = undefined;\n this._cancelPending();\n // Touch browsers synthesize a compatibility `contextmenu` event\n // for long-press. preventDefault on the original pointerdown is\n // too late (already dispatched), so install a one-shot\n // capture-phase guard for the next contextmenu. Without this,\n // consumers that don't preventDefault inside their onLongPress\n // (or that early-return before doing so) leak the browser's\n // native menu on top of theirs.\n this._installContextMenuGuard(targetWindow);\n // Same idea for `click`: when the user releases their finger\n // after the long-press, touch browsers dispatch a `click` to\n // the element the touch ended on (the source). Consumers\n // typically wire click to a primary action (e.g. tab activate,\n // tab-group chip collapse-toggle). Without this guard, the\n // long-press immediately fires both the context menu AND the\n // primary action — and the action's side effects (e.g. a chip\n // collapse animation) read as a screen wobble while the menu\n // is supposed to be open. Scoped to the source element so\n // clicks on menu items elsewhere remain effective.\n this._installClickGuard(targetWindow);\n this.options.onLongPress(event);\n }, delay);\n this._moveListener = addDisposableListener(targetWindow, 'pointermove', (moveEvent) => {\n if (moveEvent.pointerId !== this._pointerId) {\n return;\n }\n const dx = moveEvent.clientX - this._startX;\n const dy = moveEvent.clientY - this._startY;\n if (Math.hypot(dx, dy) > tolerance) {\n this._cancelPending();\n }\n });\n this._upListener = addDisposableListener(targetWindow, 'pointerup', (upEvent) => {\n if (upEvent.pointerId !== this._pointerId) {\n return;\n }\n this._cancelPending();\n });\n this._cancelListener = addDisposableListener(targetWindow, 'pointercancel', (cancelEvent) => {\n if (cancelEvent.pointerId !== this._pointerId) {\n return;\n }\n this._cancelPending();\n });\n }\n _installContextMenuGuard(targetWindow) {\n let guard;\n const timeout = setTimeout(() => guard === null || guard === void 0 ? void 0 : guard.dispose(), 500);\n guard = addDisposableListener(targetWindow, 'contextmenu', (event) => {\n event.preventDefault();\n clearTimeout(timeout);\n guard === null || guard === void 0 ? void 0 : guard.dispose();\n }, { capture: true });\n }\n _installClickGuard(targetWindow) {\n let guard;\n const timeout = setTimeout(() => guard === null || guard === void 0 ? void 0 : guard.dispose(), 500);\n guard = addDisposableListener(targetWindow, 'click', (event) => {\n // Only suppress clicks targeted at the long-pressed element\n // or its descendants. A user tap on a context menu item (or\n // anywhere else) still gets through unchanged.\n const target = event.target;\n if (target && this.element.contains(target)) {\n event.preventDefault();\n event.stopPropagation();\n }\n clearTimeout(timeout);\n guard === null || guard === void 0 ? void 0 : guard.dispose();\n }, { capture: true });\n }\n _cancelPending() {\n var _a, _b, _c;\n if (this._timer !== undefined) {\n clearTimeout(this._timer);\n this._timer = undefined;\n }\n this._pointerId = undefined;\n (_a = this._moveListener) === null || _a === void 0 ? void 0 : _a.dispose();\n (_b = this._upListener) === null || _b === void 0 ? void 0 : _b.dispose();\n (_c = this._cancelListener) === null || _c === void 0 ? void 0 : _c.dispose();\n this._moveListener = undefined;\n this._upListener = undefined;\n this._cancelListener = undefined;\n }\n dispose() {\n this._cancelPending();\n super.dispose();\n }\n}\n\nfunction resolveDndCapabilities(options) {\n if (options.disableDnd) {\n return { html5: false, pointer: false, pointerHandlesMouse: false };\n }\n switch (options.dndStrategy) {\n case 'pointer':\n return { html5: false, pointer: true, pointerHandlesMouse: true };\n case 'html5':\n return { html5: true, pointer: false, pointerHandlesMouse: false };\n case 'auto':\n case undefined:\n default:\n // On touch-primary devices (phones / basic tablets) HTML5 DnD's\n // native long-press intercepts the gesture before our pointer\n // backend can react — Android Chrome launches a system drag with\n // its half-transparent thumbnail, and the long-press context menu\n // never opens. Disable HTML5 there so the pointer backend owns\n // every gesture. Hybrid devices (touchscreen laptops, Surface,\n // iPad with mouse) keep both backends — mouse uses HTML5, touch\n // falls back to whichever backend the underlying element wired.\n return isCoarsePrimaryInput$2()\n ? { html5: false, pointer: true, pointerHandlesMouse: true }\n : { html5: true, pointer: true, pointerHandlesMouse: false };\n }\n}\nfunction isCoarsePrimaryInput$2() {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return false;\n }\n // Coarse pointer without any fine pointer = phone-class device. A laptop\n // touchscreen reports both, and we want HTML5 to remain available there\n // because a real mouse is also plugged in.\n const coarse = window.matchMedia('(pointer: coarse)').matches;\n const fine = window.matchMedia('(pointer: fine)').matches;\n return coarse && !fine;\n}\n\nclass Tab extends CompositeDisposable {\n get element() {\n return this._element;\n }\n constructor(panel, accessor, group) {\n super();\n this.panel = panel;\n this.accessor = accessor;\n this.group = group;\n this.content = undefined;\n this.panelTransfer = LocalSelectionTransfer.getInstance();\n this._direction = 'horizontal';\n this._onPointDown = new Emitter();\n this.onPointerDown = this._onPointDown.event;\n this._onTabClick = new Emitter();\n this.onTabClick = this._onTabClick.event;\n this._onDropped = new Emitter();\n this.onDrop = this._onDropped.event;\n this._onDragStart = new Emitter();\n this.onDragStart = this._onDragStart.event;\n this._onDragEnd = new Emitter();\n this.onDragEnd = this._onDragEnd.event;\n const caps = resolveDndCapabilities(this.accessor.options);\n this._element = document.createElement('div');\n this._element.className = 'dv-tab';\n this._element.tabIndex = 0;\n this._element.draggable = caps.html5;\n toggleClass(this.element, 'dv-inactive-tab', true);\n const canDisplayOverlay = (event, position) => {\n var _a;\n if (this.group.locked) {\n return false;\n }\n const data = getPanelData();\n if (data && this.accessor.id === data.viewId) {\n // Smooth-reorder takes over the in-flight visual when active,\n // so individual tab overlays are suppressed for internal drags.\n if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {\n return false;\n }\n return true;\n }\n return this.group.model.canDisplayOverlay(event, position, 'tab');\n };\n this.dropTarget = html5Backend.createDropTarget(this._element, {\n acceptedTargetZones: ['left', 'right'],\n overlayModel: this._buildOverlayModel(),\n canDisplayOverlay,\n getOverrideTarget: () => { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },\n });\n this.pointerDropTarget = pointerBackend.createDropTarget(this._element, {\n acceptedTargetZones: ['left', 'right'],\n overlayModel: this._buildOverlayModel(),\n canDisplayOverlay,\n getOverrideTarget: () => { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },\n });\n const sharedDragOptions = {\n getData: () => {\n this.panelTransfer.setData([\n new PanelTransfer(this.accessor.id, this.group.id, this.panel.id),\n ], PanelTransfer.prototype);\n return {\n dispose: () => {\n this.panelTransfer.clearData(PanelTransfer.prototype);\n },\n };\n },\n // 30/-10 matches the HTML5 setDragImage offset that has been\n // shipped for years; pointer backend wraps in PointerGhost,\n // HTML5 backend feeds into setDragImage.\n createGhost: () => ({\n element: this._buildGhostElement(),\n offsetX: 30,\n offsetY: -10,\n }),\n onDragStart: (event) => {\n var _a;\n this._onDragStart.fire(event);\n if (!(event instanceof PointerEvent) &&\n ((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {\n // Delay collapse to next frame so the browser\n // captures the full drag image first.\n requestAnimationFrame(() => {\n toggleClass(this.element, 'dv-tab--dragging', true);\n });\n }\n },\n onDragEnd: (event) => {\n this._onDragEnd.fire(event);\n },\n };\n this.html5DragSource = html5Backend.createDragSource(this._element, Object.assign(Object.assign({}, sharedDragOptions), { disabled: !caps.html5 }));\n this.pointerDragSource = pointerBackend.createDragSource(this._element, Object.assign(Object.assign({}, sharedDragOptions), { disabled: !caps.pointer, touchOnly: !caps.pointerHandlesMouse, isCancelled: () => !resolveDndCapabilities(this.accessor.options).pointer }));\n // Both droptargets feed the same downstream stream; consumers don't\n // need to know which path produced the overlay.\n this.onWillShowOverlay = Event.any(this.dropTarget.onWillShowOverlay, this.pointerDropTarget.onWillShowOverlay);\n this.addDisposables(this._onPointDown, this._onTabClick, this._onDropped, this._onDragStart, this._onDragEnd, this.accessor.onDidOptionsChange(() => {\n const model = this._buildOverlayModel();\n this.dropTarget.setOverlayModel(model);\n this.pointerDropTarget.setOverlayModel(model);\n }), addDisposableListener(this._element, 'dragend', () => {\n // The shared onDragEnd handler already fires _onDragEnd via\n // the HTML5 backend; just strip the dragging class here.\n toggleClass(this.element, 'dv-tab--dragging', false);\n }), this.html5DragSource, addDisposableListener(this._element, 'pointerdown', (event) => {\n this._onPointDown.fire(event);\n }), addDisposableListener(this._element, 'click', (event) => {\n this._onTabClick.fire(event);\n }), addDisposableListener(this._element, 'contextmenu', (event) => {\n this.accessor.contextMenuController.show(this.panel, this.group, event);\n }), new LongPressDetector(this._element, {\n onLongPress: (event) => {\n // Don't let a subsequent finger move arm a drag on top\n // of the just-opened menu.\n this.pointerDragSource.cancelPending();\n this.accessor.contextMenuController.show(this.panel, this.group, event);\n },\n }), this.dropTarget.onDrop((event) => {\n this._onDropped.fire(event);\n }), this.pointerDropTarget.onDrop((event) => {\n this._onDropped.fire(event);\n }), this.dropTarget, this.pointerDropTarget, this.pointerDragSource);\n }\n setActive(isActive) {\n toggleClass(this.element, 'dv-active-tab', isActive);\n toggleClass(this.element, 'dv-inactive-tab', !isActive);\n }\n setContent(part) {\n if (this.content) {\n this._element.removeChild(this.content.element);\n }\n this.content = part;\n this._element.appendChild(this.content.element);\n }\n _buildOverlayModel() {\n var _a;\n // 'line' themes render a 4px insertion strip at the tab edge via the\n // anchor container's small-boundary path. 'fill' themes render a\n // half-width highlighted area, so we disable the small-boundary path\n // entirely (boundary = 0 ⟹ isSmall always false).\n const smallBoundary = ((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.dndTabIndicator) === 'line'\n ? Number.POSITIVE_INFINITY\n : 0;\n return {\n activationSize: { value: 50, type: 'percentage' },\n smallWidthBoundary: smallBoundary,\n smallHeightBoundary: smallBoundary,\n };\n }\n setDirection(direction) {\n this._direction = direction;\n const zones = direction === 'vertical' ? ['top', 'bottom'] : ['left', 'right'];\n this.dropTarget.setTargetZones(zones);\n this.pointerDropTarget.setTargetZones(zones);\n }\n updateDragAndDropState() {\n const caps = resolveDndCapabilities(this.accessor.options);\n this._element.draggable = caps.html5;\n this.html5DragSource.setDisabled(!caps.html5);\n this.pointerDragSource.setDisabled(!caps.pointer);\n this.pointerDragSource.setTouchOnly(!caps.pointerHandlesMouse);\n }\n /**\n * Vertical tabs are flipped to horizontal so the ghost stays readable\n * during the drag rather than appearing sideways-rotated.\n */\n _buildGhostElement() {\n const style = getComputedStyle(this.element);\n const newNode = this.element.cloneNode(true);\n const isVertical = this._direction === 'vertical';\n const verticalSkip = new Set([\n 'writing-mode',\n 'inline-size',\n 'block-size',\n 'min-inline-size',\n 'min-block-size',\n 'max-inline-size',\n 'max-block-size',\n 'margin-inline',\n 'margin-inline-start',\n 'margin-inline-end',\n 'margin-block',\n 'margin-block-start',\n 'margin-block-end',\n 'padding-inline',\n 'padding-inline-start',\n 'padding-inline-end',\n 'padding-block',\n 'padding-block-start',\n 'padding-block-end',\n ]);\n Array.from(style).forEach((key) => {\n if (isVertical && verticalSkip.has(key)) {\n return;\n }\n newNode.style.setProperty(key, style.getPropertyValue(key), style.getPropertyPriority(key));\n });\n if (isVertical) {\n newNode.style.setProperty('writing-mode', 'horizontal-tb');\n newNode.style.setProperty('width', style.height);\n newNode.style.setProperty('height', style.width);\n }\n newNode.style.position = 'absolute';\n newNode.classList.add('dv-tab-ghost-drag');\n return newNode;\n }\n}\n\nclass DockviewWillShowOverlayLocationEvent {\n get kind() {\n return this.options.kind;\n }\n /** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */\n get nativeEvent() {\n return this.event.nativeEvent;\n }\n get position() {\n return this.event.position;\n }\n get defaultPrevented() {\n return this.event.defaultPrevented;\n }\n get panel() {\n return this.options.panel;\n }\n get api() {\n return this.options.api;\n }\n get group() {\n return this.options.group;\n }\n preventDefault() {\n this.event.preventDefault();\n }\n getData() {\n return this.options.getData();\n }\n constructor(event, options) {\n this.event = event;\n this.options = options;\n }\n}\n\n// Floating-group redock via touch: require a deliberate long press so the\n// \"move the float around\" gesture doesn't double-trigger the redock ghost.\n// Infinity pressTolerance disables the pre-arm flick override; any motion\n// during the wait is treated as drag-the-float, not redock intent.\nconst FLOATING_REDOCK_INITIATION_DELAY_MS = 500;\nclass VoidContainer extends CompositeDisposable {\n get element() {\n return this._element;\n }\n constructor(accessor, group) {\n var _a, _b;\n super();\n this.accessor = accessor;\n this.group = group;\n this.panelTransfer = LocalSelectionTransfer.getInstance();\n this._onDrop = new Emitter();\n this.onDrop = this._onDrop.event;\n this._onDragStart = new Emitter();\n this.onDragStart = this._onDragStart.event;\n const caps = resolveDndCapabilities(this.accessor.options);\n this._element = document.createElement('div');\n this._element.className = 'dv-void-container';\n this._element.draggable = caps.html5;\n toggleClass(this._element, 'dv-draggable', caps.html5 || caps.pointer);\n this.addDisposables(this._onDrop, this._onDragStart, addDisposableListener(this._element, 'pointerdown', () => {\n this.accessor.doSetGroupActive(this.group);\n }), \n // Shift+pointerdown marks the event so the group's overlay\n // drag (move-by-floating) sees it was consumed and doesn't\n // fire alongside the HTML5 drag. quasiPreventDefault sets the\n // marker without calling preventDefault — that would also\n // block dragstart, which we need to fire.\n addDisposableListener(this._element, 'pointerdown', (e) => {\n if (e.shiftKey) {\n quasiPreventDefault(e);\n }\n }, true));\n const canDisplayOverlay = (event, position) => {\n if (this.group.api.locked) {\n // Dropping on the void/header space adds the panel\n // to this group, which `locked` is meant to prevent\n // (both `true` and `'no-drop-target'`).\n return false;\n }\n const data = getPanelData();\n if (data && this.accessor.id === data.viewId) {\n return true;\n }\n return group.model.canDisplayOverlay(event, position, 'header_space');\n };\n this.dropTarget = html5Backend.createDropTarget(this._element, {\n acceptedTargetZones: ['center'],\n canDisplayOverlay,\n getOverrideTarget: () => { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },\n });\n this.pointerDropTarget = pointerBackend.createDropTarget(this._element, {\n acceptedTargetZones: ['center'],\n canDisplayOverlay,\n getOverrideTarget: () => { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },\n });\n const buildMultiPanelsGhost = () => {\n const ghostEl = document.createElement('div');\n const style = window.getComputedStyle(this._element);\n const bgColor = style.getPropertyValue('--dv-activegroup-visiblepanel-tab-background-color');\n const color = style.getPropertyValue('--dv-activegroup-visiblepanel-tab-color');\n ghostEl.style.backgroundColor = bgColor;\n ghostEl.style.color = color;\n ghostEl.style.padding = '2px 8px';\n ghostEl.style.height = '24px';\n ghostEl.style.fontSize = '11px';\n ghostEl.style.lineHeight = '20px';\n ghostEl.style.borderRadius = '12px';\n ghostEl.style.whiteSpace = 'nowrap';\n ghostEl.style.boxSizing = 'border-box';\n // HTML5 setDragImage snapshots the element as appended to the\n // document; a default block-level div would stretch to the\n // body's width and render as a viewport-wide bar.\n ghostEl.style.display = 'inline-block';\n ghostEl.textContent = `Multiple Panels (${this.group.size})`;\n return ghostEl;\n };\n const buildGhostSpec = () => {\n const createGhost = this.accessor.options.createGroupDragGhostComponent;\n if (createGhost) {\n const renderer = createGhost(this.group);\n renderer.init({\n group: this.group,\n api: this.accessor.api,\n });\n return {\n element: renderer.element,\n offsetX: 30,\n offsetY: -10,\n dispose: renderer.dispose\n ? () => { var _a; return (_a = renderer.dispose) === null || _a === void 0 ? void 0 : _a.call(renderer); }\n : undefined,\n };\n }\n return {\n element: buildMultiPanelsGhost(),\n offsetX: 30,\n offsetY: -10,\n };\n };\n const sharedDragOptions = {\n getData: () => {\n this.panelTransfer.setData([new PanelTransfer(this.accessor.id, this.group.id, null)], PanelTransfer.prototype);\n return {\n dispose: () => {\n this.panelTransfer.clearData(PanelTransfer.prototype);\n },\n };\n },\n createGhost: buildGhostSpec,\n onDragStart: (event) => {\n this._onDragStart.fire(event);\n },\n };\n this.html5DragSource = html5Backend.createDragSource(this._element, Object.assign(Object.assign({}, sharedDragOptions), { disabled: !caps.html5, isCancelled: (event) => {\n // HTML5: floating groups need shift+drag as the explicit\n // detach gesture (otherwise click-and-drag conflicts with\n // moving the floating group itself).\n if (this.group.api.location.type === 'floating' &&\n !event.shiftKey) {\n return true;\n }\n if (this.group.api.location.type === 'edge' &&\n this.group.size === 0) {\n return true;\n }\n return false;\n } }));\n const isFloating = () => { var _a, _b, _c; return ((_c = (_b = (_a = this.group) === null || _a === void 0 ? void 0 : _a.api) === null || _b === void 0 ? void 0 : _b.location) === null || _c === void 0 ? void 0 : _c.type) === 'floating'; };\n this.pointerDragSource = pointerBackend.createDragSource(this._element, Object.assign(Object.assign({}, sharedDragOptions), { disabled: !caps.pointer, touchOnly: !caps.pointerHandlesMouse, \n // Floating groups share this element with the overlay's\n // move-the-float drag. Without a longer hold + tolerance\n // override, both gestures commit simultaneously and the\n // user sees the float follow their finger *and* a ghost.\n touchInitiationDelay: () => isFloating() ? FLOATING_REDOCK_INITIATION_DELAY_MS : 250, pressTolerance: () => (isFloating() ? Infinity : 8), isCancelled: () => {\n if (!resolveDndCapabilities(this.accessor.options).pointer) {\n return true;\n }\n // Pointer: long-press IS the deliberate gesture, so\n // floating groups don't need the shift gate.\n if (this.group.api.location.type === 'edge' &&\n this.group.size === 0) {\n return true;\n }\n return false;\n }, onDragStart: (event) => {\n var _a;\n // Redock just committed — abort any in-flight overlay\n // move so the float stops following the finger while\n // the ghost takes over.\n (_a = this.getFloatingOverlay()) === null || _a === void 0 ? void 0 : _a.cancelPendingDrag();\n this._onDragStart.fire(event);\n } }));\n // Mirror direction: once the overlay's move-the-float gesture has\n // actually moved something, cancel the pending redock arm so the\n // ghost doesn't appear mid-drag if the user holds past 500ms.\n const overlayMoveSub = new MutableDisposable();\n const refreshOverlayMoveSub = () => {\n const overlay = this.getFloatingOverlay();\n overlayMoveSub.value = overlay\n ? overlay.onDidStartMoving(() => {\n this.pointerDragSource.cancelPending();\n })\n : Disposable.NONE;\n };\n refreshOverlayMoveSub();\n this.addDisposables(overlayMoveSub);\n const locationChange = (_b = (_a = this.group) === null || _a === void 0 ? void 0 : _a.api) === null || _b === void 0 ? void 0 : _b.onDidLocationChange;\n if (locationChange) {\n this.addDisposables(locationChange(refreshOverlayMoveSub));\n }\n this.onWillShowOverlay = Event.any(this.dropTarget.onWillShowOverlay, this.pointerDropTarget.onWillShowOverlay);\n this.addDisposables(this.html5DragSource, this.dropTarget.onDrop((event) => {\n this._onDrop.fire(event);\n }), this.pointerDropTarget.onDrop((event) => {\n this._onDrop.fire(event);\n }), this.dropTarget, this.pointerDropTarget, this.pointerDragSource);\n }\n updateDragAndDropState() {\n const caps = resolveDndCapabilities(this.accessor.options);\n this._element.draggable = caps.html5;\n toggleClass(this._element, 'dv-draggable', caps.html5 || caps.pointer);\n this.html5DragSource.setDisabled(!caps.html5);\n this.pointerDragSource.setDisabled(!caps.pointer);\n this.pointerDragSource.setTouchOnly(!caps.pointerHandlesMouse);\n }\n getFloatingOverlay() {\n var _a, _b;\n if (!this.group) {\n return undefined;\n }\n return (_b = (_a = this.accessor.floatingGroups) === null || _a === void 0 ? void 0 : _a.find((fg) => fg.group === this.group)) === null || _b === void 0 ? void 0 : _b.overlay;\n }\n}\n\nclass Scrollbar extends CompositeDisposable {\n get element() {\n return this._element;\n }\n get orientation() {\n return this._orientation;\n }\n set orientation(value) {\n if (this._orientation === value) {\n return;\n }\n this._scrollOffset = 0;\n this._orientation = value;\n removeClasses(this._scrollbar, 'dv-scrollbar-vertical', 'dv-scrollbar-horizontal');\n if (value === 'vertical') {\n addClasses(this._scrollbar, 'dv-scrollbar-vertical');\n }\n else {\n addClasses(this._scrollbar, 'dv-scrollbar-horizontal');\n }\n }\n constructor(scrollableElement) {\n super();\n this.scrollableElement = scrollableElement;\n this._scrollOffset = 0;\n this._orientation = 'horizontal';\n this._element = document.createElement('div');\n this._element.className = 'dv-scrollable';\n this._scrollbar = document.createElement('div');\n this._scrollbar.className = 'dv-scrollbar dv-scrollbar-horizontal';\n this.element.appendChild(scrollableElement);\n this.element.appendChild(this._scrollbar);\n this.addDisposables(addDisposableListener(this.element, 'wheel', (event) => {\n this._scrollOffset += event.deltaY * Scrollbar.MouseWheelSpeed;\n this.calculateScrollbarStyles();\n }), addDisposableListener(this._scrollbar, 'pointerdown', (event) => {\n event.preventDefault();\n toggleClass(this.element, 'dv-scrollable-scrolling', true);\n const originalClient = this._orientation === 'horizontal'\n ? event.clientX\n : event.clientY;\n const originalScrollOffset = this._scrollOffset;\n const onPointerMove = (event) => {\n const delta = this._orientation === 'horizontal'\n ? event.clientX - originalClient\n : event.clientY - originalClient;\n const clientSize = this._orientation === 'horizontal'\n ? this.element.clientWidth\n : this.element.clientHeight;\n const scrollSize = this._orientation === 'horizontal'\n ? this.scrollableElement.scrollWidth\n : this.scrollableElement.scrollHeight;\n const p = clientSize / scrollSize;\n this._scrollOffset = originalScrollOffset + delta / p;\n this.calculateScrollbarStyles();\n };\n const onEnd = () => {\n toggleClass(this.element, 'dv-scrollable-scrolling', false);\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', onEnd);\n document.removeEventListener('pointercancel', onEnd);\n };\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', onEnd);\n document.addEventListener('pointercancel', onEnd);\n }), addDisposableListener(this.element, 'scroll', () => {\n this.calculateScrollbarStyles();\n }), addDisposableListener(this.scrollableElement, 'scroll', () => {\n this._scrollOffset =\n this._orientation === 'horizontal'\n ? this.scrollableElement.scrollLeft\n : this.scrollableElement.scrollTop;\n this.calculateScrollbarStyles();\n }), watchElementResize(this.element, () => {\n toggleClass(this.element, 'dv-scrollable-resizing', true);\n if (this._animationTimer) {\n clearTimeout(this._animationTimer);\n }\n this._animationTimer = setTimeout(() => {\n clearTimeout(this._animationTimer);\n toggleClass(this.element, 'dv-scrollable-resizing', false);\n }, 500);\n this.calculateScrollbarStyles();\n }));\n }\n calculateScrollbarStyles() {\n const clientSize = this._orientation === 'horizontal'\n ? this.element.clientWidth\n : this.element.clientHeight;\n const scrollSize = this._orientation === 'horizontal'\n ? this.scrollableElement.scrollWidth\n : this.scrollableElement.scrollHeight;\n const hasScrollbar = scrollSize > clientSize;\n if (hasScrollbar) {\n const px = clientSize * (clientSize / scrollSize);\n if (this._orientation === 'horizontal') {\n this._scrollbar.style.width = `${px}px`;\n this._scrollbar.style.height = '';\n }\n else {\n this._scrollbar.style.height = `${px}px`;\n this._scrollbar.style.width = '';\n }\n this._scrollOffset = clamp(this._scrollOffset, 0, scrollSize - clientSize);\n if (this._orientation === 'horizontal') {\n this.scrollableElement.scrollLeft = this._scrollOffset;\n }\n else {\n this.scrollableElement.scrollTop = this._scrollOffset;\n }\n const percentageComplete = this._scrollOffset / (scrollSize - clientSize);\n if (this._orientation === 'horizontal') {\n this._scrollbar.style.left = `${(clientSize - px) * percentageComplete}px`;\n this._scrollbar.style.top = '';\n }\n else {\n this._scrollbar.style.top = `${(clientSize - px) * percentageComplete}px`;\n this._scrollbar.style.left = '';\n }\n }\n else {\n if (this._orientation === 'horizontal') {\n this._scrollbar.style.width = '0px';\n this._scrollbar.style.left = '0px';\n }\n else {\n this._scrollbar.style.height = '0px';\n this._scrollbar.style.top = '0px';\n }\n this._scrollOffset = 0;\n }\n }\n}\nScrollbar.MouseWheelSpeed = 1;\n\nconst DEFAULT_TAB_GROUP_COLORS = [\n { id: 'grey', value: 'var(--dv-tab-group-color-grey)', label: 'Grey' },\n { id: 'blue', value: 'var(--dv-tab-group-color-blue)', label: 'Blue' },\n { id: 'red', value: 'var(--dv-tab-group-color-red)', label: 'Red' },\n {\n id: 'yellow',\n value: 'var(--dv-tab-group-color-yellow)',\n label: 'Yellow',\n },\n { id: 'green', value: 'var(--dv-tab-group-color-green)', label: 'Green' },\n { id: 'pink', value: 'var(--dv-tab-group-color-pink)', label: 'Pink' },\n {\n id: 'purple',\n value: 'var(--dv-tab-group-color-purple)',\n label: 'Purple',\n },\n { id: 'cyan', value: 'var(--dv-tab-group-color-cyan)', label: 'Cyan' },\n {\n id: 'orange',\n value: 'var(--dv-tab-group-color-orange)',\n label: 'Orange',\n },\n];\n/**\n * Runtime palette for tab-group color accents.\n *\n * Resolves a stored `color` string to a CSS color expression, with three\n * fall-through modes:\n * 1. `id` matches an entry → entry's `value`\n * 2. `id` doesn't match → `id` itself (raw CSS literal pass-through)\n * 3. `id` is empty or undefined → undefined (caller skips assignment)\n *\n * When `enabled` is false the palette returns undefined for everything; this\n * is the `tabGroupAccent: 'off'` opt-out path.\n */\nclass TabGroupColorPalette {\n constructor(entries, enabled = true) {\n this._entries = entries.slice();\n this._byId = new Map(entries.map((e) => [e.id, e]));\n this._enabled = enabled;\n }\n get enabled() {\n return this._enabled;\n }\n set enabled(value) {\n this._enabled = value;\n }\n /**\n * Replace the entry list in place. Used by `updateOptions` so that\n * existing palette references (held by chips, indicators, etc.) see\n * the new palette without needing to be re-wired.\n */\n setEntries(entries) {\n this._entries = entries.slice();\n this._byId = new Map(entries.map((e) => [e.id, e]));\n }\n entries() {\n return this._entries;\n }\n has(id) {\n return this._byId.has(id);\n }\n get(id) {\n return this._byId.get(id);\n }\n /** First entry's id; used as the default when a color is unset. */\n defaultId() {\n var _a;\n return (_a = this._entries[0]) === null || _a === void 0 ? void 0 : _a.id;\n }\n /**\n * Resolve a stored color to its CSS value, or undefined if no value\n * should be written (palette disabled, or color empty/undefined).\n */\n resolveValue(color) {\n if (!this._enabled || !color) {\n return undefined;\n }\n const entry = this._byId.get(color);\n return entry ? entry.value : color;\n }\n}\nlet _fallbackPalette;\n/**\n * Lazy-built palette used when the accessor isn't available (test mocks,\n * isolated chip construction). Production code paths always pass a real\n * palette through.\n */\nfunction getFallbackPalette() {\n if (!_fallbackPalette) {\n _fallbackPalette = new TabGroupColorPalette(DEFAULT_TAB_GROUP_COLORS, true);\n }\n return _fallbackPalette;\n}\n/**\n * Set the `--dv-tab-group-color` custom property on `el` to the resolved\n * accent value, or remove it when the palette is disabled / color is unset.\n */\nfunction applyTabGroupAccent(el, color, palette) {\n const value = (palette !== null && palette !== void 0 ? palette : getFallbackPalette()).resolveValue(color);\n if (value === undefined) {\n el.style.removeProperty('--dv-tab-group-color');\n }\n else {\n el.style.setProperty('--dv-tab-group-color', value);\n }\n}\n/**\n * Return the resolved CSS color for a tab group, or undefined when the\n * palette is disabled or no color is set. Use this when you need the raw\n * value to assign to a non-custom-property style (e.g. SVG stroke,\n * backgroundColor on the indicator underline).\n */\nfunction resolveTabGroupAccent(color, palette) {\n return (palette !== null && palette !== void 0 ? palette : getFallbackPalette()).resolveValue(color);\n}\n\n/**\n * Visual chip for a tab group. Owns the DOM element, label, click /\n * context-menu interactions, and exposes a long-press gesture as a\n * second `onContextMenu` source. Drag-and-drop wiring lives in\n * `TabGroupManager` — the manager constructs the drag sources on this\n * chip's element so it can include tabs-list context (custom group\n * drag image, tab-group transfer payload).\n */\nclass TabGroupChip extends CompositeDisposable {\n get element() {\n return this._element;\n }\n constructor(_palette) {\n super();\n this._palette = _palette;\n this._onClick = new Emitter();\n this.onClick = this._onClick.event;\n this._onContextMenu = new Emitter();\n /** Fires on right-click and on touch long-press. */\n this.onContextMenu = this._onContextMenu.event;\n this._element = document.createElement('div');\n this._element.className = 'dv-tab-group-chip';\n this._element.tabIndex = 0;\n this._label = document.createElement('span');\n this._label.className = 'dv-tab-group-chip-label';\n this._element.appendChild(this._label);\n this.addDisposables(this._onClick, this._onContextMenu, new LongPressDetector(this._element, {\n onLongPress: (event) => {\n this._onContextMenu.fire(event);\n },\n }), addDisposableListener(this._element, 'click', (event) => {\n this._onClick.fire(event);\n }), addDisposableListener(this._element, 'contextmenu', (event) => {\n this._onContextMenu.fire(event);\n }));\n }\n init(params) {\n this._tabGroup = params.tabGroup;\n this.updateColor(params.tabGroup.color);\n this.updateLabel(params.tabGroup.label);\n this.updateCollapsed(params.tabGroup.collapsed);\n this.addDisposables(params.tabGroup.onDidChange(() => {\n if (this._tabGroup) {\n this.updateColor(this._tabGroup.color);\n this.updateLabel(this._tabGroup.label);\n }\n }), params.tabGroup.onDidCollapseChange((collapsed) => {\n this.updateCollapsed(collapsed);\n }), this._onClick.event(() => {\n var _a;\n (_a = this._tabGroup) === null || _a === void 0 ? void 0 : _a.toggle();\n }));\n }\n update(params) {\n this._tabGroup = params.tabGroup;\n this.updateColor(params.tabGroup.color);\n this.updateLabel(params.tabGroup.label);\n this.updateCollapsed(params.tabGroup.collapsed);\n }\n updateColor(color) {\n var _a;\n applyTabGroupAccent(this._element, color, this._palette);\n toggleClass(this._element, 'dv-tab-group-chip--accent-off', ((_a = this._palette) === null || _a === void 0 ? void 0 : _a.enabled) === false);\n }\n updateLabel(label) {\n this._label.textContent = label;\n toggleClass(this._label, 'dv-tab-group-chip-label--empty', !label);\n }\n updateCollapsed(collapsed) {\n toggleClass(this._element, 'dv-tab-group-chip--collapsed', collapsed);\n }\n}\n\n/**\n * Shared positioning logic for tab group indicators.\n * Subclasses implement `applyShape` to control the visual output.\n */\nclass BaseTabGroupIndicator {\n get underlines() {\n return this._underlines;\n }\n constructor(_ctx) {\n this._ctx = _ctx;\n this._underlines = new Map();\n this._rafId = null;\n }\n positionUnderlines() {\n requestAnimationFrame(() => {\n this._positionUnderlinesSync();\n });\n }\n /**\n * Continuously reposition underlines every frame for the duration\n * of a tab transition (~200ms), so the underline tracks tab sizes.\n */\n trackUnderlines() {\n if (this._rafId !== null) {\n cancelAnimationFrame(this._rafId);\n }\n const start = performance.now();\n const duration = 250; // slightly longer than transition to ensure we catch the end\n const tick = () => {\n this._positionUnderlinesSync();\n if (performance.now() - start < duration) {\n this._rafId = requestAnimationFrame(tick);\n }\n else {\n this._rafId = null;\n }\n };\n this._rafId = requestAnimationFrame(tick);\n }\n syncUnderlineElements(activeGroupIds) {\n // Ensure underline elements exist for active groups\n for (const groupId of activeGroupIds) {\n if (!this._underlines.has(groupId)) {\n const underline = document.createElement('div');\n underline.className = 'dv-tab-group-underline';\n this._ctx.tabsList.appendChild(underline);\n this._underlines.set(groupId, underline);\n }\n }\n // Remove underlines for dissolved groups\n for (const [groupId, el] of this._underlines) {\n if (!activeGroupIds.has(groupId)) {\n el.remove();\n this._underlines.delete(groupId);\n }\n }\n }\n getUnderline(groupId) {\n return this._underlines.get(groupId);\n }\n dispose() {\n if (this._rafId !== null) {\n cancelAnimationFrame(this._rafId);\n this._rafId = null;\n }\n for (const [, el] of this._underlines) {\n el.remove();\n }\n this._underlines.clear();\n }\n _positionUnderlinesSync() {\n const containerRect = this._ctx.tabsList.getBoundingClientRect();\n const tabGroups = this._ctx.getTabGroups();\n const isVertical = this._ctx.getDirection() === 'vertical';\n const containerCrossSize = isVertical\n ? containerRect.width\n : containerRect.height;\n const activePanelId = this._ctx.getActivePanelId();\n const tabMap = this._ctx.getTabMap();\n for (const tg of tabGroups) {\n const underline = this._underlines.get(tg.id);\n if (!underline) {\n continue;\n }\n const panelIds = tg.panelIds;\n if (panelIds.length === 0) {\n underline.style.display = 'none';\n continue;\n }\n underline.style.display = '';\n const chipEl = this._ctx.getChipElement(tg.id);\n // In vertical mode, compute top/bottom edges; in horizontal, left/right.\n let startEdge;\n if (chipEl) {\n const chipRect = chipEl.getBoundingClientRect();\n const chipStyle = getComputedStyle(chipEl);\n const leadingMargin = isVertical\n ? Number.parseFloat(chipStyle.marginTop) || 0\n : Number.parseFloat(chipStyle.marginLeft) || 0;\n startEdge = isVertical\n ? chipRect.top - containerRect.top - leadingMargin\n : chipRect.left - containerRect.left - leadingMargin;\n }\n else {\n const firstPanelId = panelIds[0];\n const firstTabEntry = tabMap.get(firstPanelId);\n if (firstTabEntry) {\n const firstRect = firstTabEntry.value.element.getBoundingClientRect();\n startEdge = isVertical\n ? firstRect.top - containerRect.top\n : firstRect.left - containerRect.left;\n }\n else {\n startEdge = 0;\n }\n }\n // Measure the actual last tab position (follows CSS transitions in real-time)\n const lastPanelId = panelIds[panelIds.length - 1];\n const lastTabEntry = tabMap.get(lastPanelId);\n if (!lastTabEntry) {\n if (isVertical) {\n underline.style.top = `${startEdge}px`;\n underline.style.height = '0px';\n underline.style.left = '';\n underline.style.width = '';\n }\n else {\n underline.style.left = `${startEdge}px`;\n underline.style.width = '0px';\n underline.style.top = '';\n underline.style.height = '';\n }\n continue;\n }\n const lastTabRect = lastTabEntry.value.element.getBoundingClientRect();\n let endEdge = isVertical\n ? lastTabRect.bottom - containerRect.top\n : lastTabRect.right - containerRect.left;\n let span = endEdge - startEdge;\n // During collapse or expand: converge both edges toward chip center\n const isAnimating = tg.collapsed ||\n tg.panelIds.some((pid) => {\n const te = tabMap.get(pid);\n return (te &&\n te.value.element.classList.contains('dv-tab--group-expanding'));\n });\n if (isAnimating && chipEl) {\n const chipRect = chipEl.getBoundingClientRect();\n const chipCenter = isVertical\n ? chipRect.top + chipRect.height / 2 - containerRect.top\n : chipRect.left + chipRect.width / 2 - containerRect.left;\n // Sum of current visible tab sizes (shrinking or growing)\n let currentTabSize = 0;\n let fullTabSize = 0;\n for (const pid of tg.panelIds) {\n const te = tabMap.get(pid);\n if (!te)\n continue;\n const el = te.value.element;\n if (isVertical) {\n currentTabSize += el.getBoundingClientRect().height;\n fullTabSize += el.scrollHeight;\n }\n else {\n currentTabSize += el.getBoundingClientRect().width;\n fullTabSize += el.scrollWidth;\n }\n }\n // progress: 0 when tabs at 0 size, 1 when fully open\n const progress = fullTabSize > 0\n ? Math.min(1, currentTabSize / fullTabSize)\n : 0;\n // Interpolate start and end edges toward chip center\n startEdge = chipCenter + (startEdge - chipCenter) * progress;\n endEdge = chipCenter + (endEdge - chipCenter) * progress;\n span = Math.max(0, endEdge - startEdge);\n }\n if (isVertical) {\n underline.style.top = `${startEdge}px`;\n underline.style.height = `${Math.max(0, span)}px`;\n // Clear horizontal properties\n underline.style.left = '';\n underline.style.width = '';\n }\n else {\n underline.style.left = `${startEdge}px`;\n underline.style.width = `${Math.max(0, span)}px`;\n // Clear vertical properties\n underline.style.top = '';\n underline.style.height = '';\n }\n this.applyShape(underline, tg, startEdge, span, containerCrossSize, activePanelId, containerRect, isVertical);\n }\n }\n}\n/**\n * Chrome-style wrap-around indicator using SVG paths.\n */\nclass WrapTabGroupIndicator extends BaseTabGroupIndicator {\n _applyStraightLine(svg, path, underline, t, mainSize, isVertical) {\n if (isVertical) {\n svg.setAttribute('width', String(t));\n svg.setAttribute('height', String(mainSize));\n underline.style.width = `${t}px`;\n underline.style.height = `${mainSize}px`;\n path.setAttribute('d', `M ${t / 2},0 L ${t / 2},${mainSize}`);\n }\n else {\n svg.setAttribute('width', String(mainSize));\n svg.setAttribute('height', String(t));\n underline.style.width = `${mainSize}px`;\n underline.style.height = `${t}px`;\n path.setAttribute('d', `M 0,${t / 2} L ${mainSize},${t / 2}`);\n }\n }\n /**\n * Chrome-style wrap-around underline: a stroked SVG path that runs\n * along the bottom (or left edge in vertical mode), curving up and\n * over the active tab with rounded corners.\n *\n * The SVG and path elements are created once per underline and reused;\n * only the `d`, `stroke`, and viewport attributes are updated each frame.\n */\n applyShape(underline, tg, groupStart, groupSpan, containerCrossSize, activePanelId, containerRect, isVertical) {\n const t = 2; // line thickness in px\n const crossSize = containerCrossSize;\n const mainSize = groupSpan;\n const color = resolveTabGroupAccent(tg.color, this._ctx.getColorPalette());\n if (mainSize <= 0 || crossSize <= 0 || color === undefined) {\n underline.style.display = 'none';\n return;\n }\n underline.style.display = '';\n // Find the active tab within this group\n let activeTabEntry;\n if (activePanelId && tg.panelIds.includes(activePanelId)) {\n activeTabEntry = this._ctx.getTabMap().get(activePanelId);\n }\n // Ensure SVG + path child exists (created once, reused)\n let svg = underline.firstElementChild;\n let path;\n if (!svg || svg.tagName !== 'svg') {\n underline.replaceChildren();\n svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.style.display = 'block';\n path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path.setAttribute('fill', 'none');\n svg.appendChild(path);\n underline.appendChild(svg);\n }\n else {\n path = svg.firstElementChild;\n }\n path.setAttribute('stroke', color);\n path.setAttribute('stroke-width', String(t));\n if (!activeTabEntry) {\n this._applyStraightLine(svg, path, underline, t, mainSize, isVertical);\n return;\n }\n const activeRect = activeTabEntry.value.element.getBoundingClientRect();\n // Compute active tab start/end relative to the group start\n let aStart;\n let aEnd;\n if (isVertical) {\n aStart = Math.max(0, activeRect.top - containerRect.top - groupStart);\n aEnd = Math.min(mainSize, activeRect.bottom - containerRect.top - groupStart);\n }\n else {\n aStart = Math.max(0, activeRect.left - containerRect.left - groupStart);\n aEnd = Math.min(mainSize, activeRect.right - containerRect.left - groupStart);\n }\n if (aEnd <= aStart) {\n this._applyStraightLine(svg, path, underline, t, mainSize, isVertical);\n return;\n }\n const r = 6; // corner radius\n const half = t / 2;\n if (isVertical) {\n const svgW = crossSize;\n const svgH = mainSize;\n svg.setAttribute('width', String(svgW));\n svg.setAttribute('height', String(svgH));\n underline.style.width = `${svgW}px`;\n underline.style.height = `${svgH}px`;\n const xLeft = half;\n const xRight = svgW - half;\n const d = [\n `M ${xLeft},0`,\n `L ${xLeft},${aStart - r}`,\n `Q ${xLeft},${aStart} ${xLeft + r},${aStart}`,\n `L ${xRight - r},${aStart}`,\n `Q ${xRight},${aStart} ${xRight},${aStart + r}`,\n `L ${xRight},${aEnd - r}`,\n `Q ${xRight},${aEnd} ${xRight - r},${aEnd}`,\n `L ${xLeft + r},${aEnd}`,\n `Q ${xLeft},${aEnd} ${xLeft},${aEnd + r}`,\n `L ${xLeft},${svgH}`,\n ].join(' ');\n path.setAttribute('d', d);\n }\n else {\n const svgW = mainSize;\n const svgH = crossSize;\n svg.setAttribute('width', String(svgW));\n svg.setAttribute('height', String(svgH));\n underline.style.width = `${svgW}px`;\n underline.style.height = `${svgH}px`;\n const yBot = svgH - half;\n const yTop = half;\n const d = [\n `M 0,${yBot}`,\n `L ${aStart - r},${yBot}`,\n `Q ${aStart},${yBot} ${aStart},${yBot - r}`,\n `L ${aStart},${yTop + r}`,\n `Q ${aStart},${yTop} ${aStart + r},${yTop}`,\n `L ${aEnd - r},${yTop}`,\n `Q ${aEnd},${yTop} ${aEnd},${yTop + r}`,\n `L ${aEnd},${yBot - r}`,\n `Q ${aEnd},${yBot} ${aEnd + r},${yBot}`,\n `L ${svgW},${yBot}`,\n ].join(' ');\n path.setAttribute('d', d);\n }\n }\n}\n/**\n * Flat continuous bar indicator — no wrap-around, just a colored line\n * spanning the full tab group width.\n */\nclass NoneTabGroupIndicator extends BaseTabGroupIndicator {\n applyShape(underline, tg, _startEdge, span, _containerCrossSize, _activePanelId, _containerRect, isVertical) {\n const t = 2; // line thickness in px\n const color = resolveTabGroupAccent(tg.color, this._ctx.getColorPalette());\n if (span <= 0 || color === undefined) {\n underline.style.display = 'none';\n return;\n }\n underline.style.display = '';\n // Clear any SVG content left over from a mode switch\n if (underline.firstElementChild) {\n underline.replaceChildren();\n }\n underline.style.backgroundColor = color;\n if (isVertical) {\n underline.style.width = `${t}px`;\n underline.style.height = `${span}px`;\n }\n else {\n underline.style.width = `${span}px`;\n underline.style.height = `${t}px`;\n }\n }\n}\n\nconst EMPTY_MAP = new Map();\nclass TabGroupManager {\n get chipRenderers() {\n return this._chipRenderers;\n }\n get groupUnderlines() {\n var _a, _b;\n return (_b = (_a = this._indicator) === null || _a === void 0 ? void 0 : _a.underlines) !== null && _b !== void 0 ? _b : EMPTY_MAP;\n }\n get skipNextCollapseAnimation() {\n return this._skipNextCollapseAnimation;\n }\n set skipNextCollapseAnimation(value) {\n this._skipNextCollapseAnimation = value;\n }\n constructor(_ctx, _callbacks) {\n this._ctx = _ctx;\n this._callbacks = _callbacks;\n this._chipRenderers = new Map();\n this._indicator = null;\n this._skipNextCollapseAnimation = false;\n this._pendingTransitionCleanups = new Map();\n }\n /**\n * Synchronize chip elements and CSS classes for all tab groups\n * in the parent group model. Call after any tab group mutation.\n */\n update() {\n const model = this._ctx.group.model;\n const tabGroups = model.getTabGroups();\n // Track which group IDs are still active\n const activeGroupIds = new Set();\n for (const tabGroup of tabGroups) {\n activeGroupIds.add(tabGroup.id);\n this._ensureChipForGroup(tabGroup);\n this._positionChipForGroup(tabGroup);\n }\n // Remove chips for dissolved/destroyed groups\n for (const [groupId, entry] of this._chipRenderers) {\n if (!activeGroupIds.has(groupId)) {\n entry.chip.element.remove();\n entry.chip.dispose();\n entry.disposable.dispose();\n this._chipRenderers.delete(groupId);\n }\n }\n // Update CSS classes on all tabs\n this._updateTabGroupClasses();\n }\n /**\n * Re-read the active palette and re-apply colors to chips, tabs and\n * the indicator. Called when `tabGroupColors` / `tabGroupAccent`\n * options change at runtime.\n */\n refreshAccents() {\n var _a, _b;\n for (const tabGroup of this._ctx.group.model.getTabGroups()) {\n const entry = this._chipRenderers.get(tabGroup.id);\n (_b = entry === null || entry === void 0 ? void 0 : (_a = entry.chip).update) === null || _b === void 0 ? void 0 : _b.call(_a, { tabGroup });\n }\n this._updateTabGroupClasses();\n }\n positionAllChips() {\n if (this._chipRenderers.size === 0) {\n return;\n }\n for (const tabGroup of this._ctx.group.model.getTabGroups()) {\n this._positionChipForGroup(tabGroup);\n }\n }\n updateDirection() {\n const isVertical = this._ctx.getDirection() === 'vertical';\n for (const [, entry] of this._chipRenderers) {\n entry.dropTarget.setTargetZones(isVertical ? ['top'] : ['left']);\n }\n }\n snapshotChipWidths() {\n const widths = new Map();\n for (const [groupId, entry] of this._chipRenderers) {\n widths.set(groupId, entry.chip.element.getBoundingClientRect().width);\n }\n return widths;\n }\n positionUnderlines() {\n var _a;\n (_a = this._indicator) === null || _a === void 0 ? void 0 : _a.positionUnderlines();\n }\n trackUnderlines() {\n var _a;\n (_a = this._indicator) === null || _a === void 0 ? void 0 : _a.trackUnderlines();\n }\n setGroupDragImage(event, tabGroup, chipEl) {\n if (!event.dataTransfer) {\n return;\n }\n const isVertical = this._ctx.getDirection() === 'vertical';\n // Clone the entire tabs list so cloned nodes inherit all\n // theme styles, CSS variables and class-based rules.\n const clone = this._ctx.tabsList.cloneNode(true);\n if (isVertical) {\n // Force horizontal orientation for the drag ghost by\n // removing vertical CSS classes and overriding writing-mode.\n clone.classList.remove('dv-tabs-container-vertical', 'dv-vertical');\n clone.classList.add('dv-horizontal');\n clone.style.writingMode = 'horizontal-tb';\n clone.style.height = `${this._ctx.tabsList.offsetWidth}px`;\n }\n else {\n clone.style.height = `${this._ctx.tabsList.offsetHeight}px`;\n }\n clone.style.width = 'auto';\n clone.style.overflow = 'visible';\n clone.style.pointerEvents = 'none';\n // Remove all elements except the chip so the drag ghost\n // shows only the chip regardless of the group's expanded state.\n const children = Array.from(clone.children);\n const realChildren = Array.from(this._ctx.tabsList.children);\n for (let i = children.length - 1; i >= 0; i--) {\n const real = realChildren[i];\n if (real === chipEl) {\n continue; // keep the chip only\n }\n children[i].remove();\n }\n // Wrap the clone in a minimal ancestor chain so that CSS\n // selectors like `.dv-groupview.dv-active-group > .dv-tabs-and-actions-container .dv-tabs-container > .dv-tab`\n // match the cloned tabs and apply correct color/background.\n const wrapper = document.createElement('div');\n wrapper.className = 'dv-groupview dv-active-group';\n wrapper.style.position = 'fixed';\n wrapper.style.top = '-10000px';\n wrapper.style.left = '0px';\n wrapper.style.height = 'auto';\n wrapper.style.width = 'auto';\n wrapper.style.pointerEvents = 'none';\n const actionsWrapper = document.createElement('div');\n actionsWrapper.className = 'dv-tabs-and-actions-container';\n actionsWrapper.style.height = 'auto';\n actionsWrapper.style.width = 'auto';\n wrapper.appendChild(actionsWrapper);\n actionsWrapper.appendChild(clone);\n // Append inside the dockview root so CSS variables are inherited\n this._ctx.accessor.element.appendChild(wrapper);\n // Compute cursor offset relative to the wrapper element.\n // The cloned chip is the first .dv-tab-group-chip in the clone.\n const clonedChip = clone.querySelector('.dv-tab-group-chip');\n const chipRect = chipEl.getBoundingClientRect();\n const cursorInChipX = event.clientX - chipRect.left;\n const cursorInChipY = event.clientY - chipRect.top;\n if (clonedChip) {\n const clonedChipRect = clonedChip.getBoundingClientRect();\n const wrapperRect = wrapper.getBoundingClientRect();\n const offsetX = clonedChipRect.left - wrapperRect.left + cursorInChipX;\n const offsetY = clonedChipRect.top - wrapperRect.top + cursorInChipY;\n event.dataTransfer.setDragImage(wrapper, offsetX, offsetY);\n }\n else {\n event.dataTransfer.setDragImage(wrapper, cursorInChipX, cursorInChipY);\n }\n // Clean up after the browser captures the image\n requestAnimationFrame(() => {\n wrapper.remove();\n });\n }\n cleanupTransition(panelId) {\n var _a;\n (_a = this._pendingTransitionCleanups.get(panelId)) === null || _a === void 0 ? void 0 : _a();\n this._pendingTransitionCleanups.delete(panelId);\n }\n updateDragAndDropState() {\n const caps = resolveDndCapabilities(this._ctx.accessor.options);\n for (const entry of this._chipRenderers.values()) {\n entry.chip.element.draggable = caps.html5;\n entry.html5DragSource.setDisabled(!caps.html5);\n entry.pointerDragSource.setDisabled(!caps.pointer);\n entry.pointerDragSource.setTouchOnly(!caps.pointerHandlesMouse);\n }\n }\n /**\n * Synchronously dispose the chip drag sources for an in-flight chip\n * drag. Called from `_commitGroupMove` so the transfer payload +\n * iframe shield are released BEFORE the cross-group move detaches\n * the chip (chip dispose is scheduled on a microtask via\n * `_scheduleTabGroupUpdate`, which is too late for callers that read\n * `getPanelData()` synchronously after the move). Idempotent — the\n * subsequent `update()` will also dispose the sources.\n */\n disposeChipDrag(tabGroupId) {\n var _a, _b;\n const entry = this._chipRenderers.get(tabGroupId);\n if (!entry) {\n return;\n }\n // Optional-chained because tests may inject minimal entries\n // that skip the manager's normal `_ensureChipForGroup` flow.\n (_a = entry.html5DragSource) === null || _a === void 0 ? void 0 : _a.dispose();\n (_b = entry.pointerDragSource) === null || _b === void 0 ? void 0 : _b.dispose();\n }\n /** Cloned chip rect used as the pointer follow-finger ghost. */\n _buildChipGhostElement(chipEl) {\n const style = getComputedStyle(chipEl);\n const clone = chipEl.cloneNode(true);\n Array.from(style).forEach((key) => {\n clone.style.setProperty(key, style.getPropertyValue(key), style.getPropertyPriority(key));\n });\n clone.style.position = 'absolute';\n return clone;\n }\n disposeAll() {\n var _a;\n (_a = this._indicator) === null || _a === void 0 ? void 0 : _a.dispose();\n this._indicator = null;\n for (const [, cleanup] of this._pendingTransitionCleanups) {\n cleanup();\n }\n this._pendingTransitionCleanups.clear();\n for (const [, entry] of this._chipRenderers) {\n entry.chip.element.remove();\n entry.chip.dispose();\n entry.disposable.dispose();\n }\n this._chipRenderers.clear();\n }\n _ensureIndicator() {\n var _a, _b;\n const mode = (_b = (_a = this._ctx.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabGroupIndicator) !== null && _b !== void 0 ? _b : 'wrap';\n const Ctor = mode === 'none' ? NoneTabGroupIndicator : WrapTabGroupIndicator;\n // Re-create if the indicator type changed (e.g. theme switch)\n if (this._indicator && !(this._indicator instanceof Ctor)) {\n this._indicator.dispose();\n this._indicator = null;\n }\n if (!this._indicator) {\n this._indicator = new Ctor({\n tabsList: this._ctx.tabsList,\n getTabGroups: () => this._ctx.group.model.getTabGroups(),\n getActivePanelId: () => { var _a; return (_a = this._ctx.group.activePanel) === null || _a === void 0 ? void 0 : _a.id; },\n getTabMap: () => this._ctx.getTabMap(),\n getChipElement: (id) => { var _a; return (_a = this._chipRenderers.get(id)) === null || _a === void 0 ? void 0 : _a.chip.element; },\n getDirection: () => this._ctx.getDirection(),\n getColorPalette: () => this._ctx.accessor.tabGroupColorPalette,\n });\n }\n }\n _ensureChipForGroup(tabGroup) {\n if (this._chipRenderers.has(tabGroup.id)) {\n return;\n }\n const createChip = this._ctx.accessor.options.createTabGroupChipComponent;\n const chip = createChip\n ? createChip(tabGroup)\n : new TabGroupChip(this._ctx.accessor.tabGroupColorPalette);\n chip.init({ tabGroup, api: this._ctx.accessor.api });\n const caps = resolveDndCapabilities(this._ctx.accessor.options);\n chip.element.draggable = caps.html5;\n const panelTransfer = LocalSelectionTransfer.getInstance();\n // Shared `getData` for both backends. Sets a group-level\n // PanelTransfer (panelId=null, tabGroupId identifies the group).\n // The returned disposer clears it on drag end.\n const getData = () => {\n panelTransfer.setData([\n new PanelTransfer(this._ctx.accessor.id, this._ctx.group.id, null, tabGroup.id),\n ], PanelTransfer.prototype);\n return {\n dispose: () => {\n panelTransfer.clearData(PanelTransfer.prototype);\n },\n };\n };\n // The chip's HTML5 drag image is the cloned tabs list (chip only),\n // mounted inside the dockview root for CSS-variable inheritance and\n // positioned against the chip's in-place rect. Layout-dependent\n // offset means we set the drag image directly in `onDragStart`\n // (inside the dragstart handler) rather than via the generic\n // `createGhost` factory, which only knows about ghost specs that\n // can be appended to `document.body`.\n const html5DragSource = html5Backend.createDragSource(chip.element, {\n getData,\n disabled: !caps.html5,\n isCancelled: () => !resolveDndCapabilities(this._ctx.accessor.options).html5,\n onDragStart: (event) => {\n // Type guard via `dataTransfer` — `instanceof DragEvent`\n // would throw in jsdom which doesn't ship a DragEvent\n // constructor.\n if ('dataTransfer' in event && event.dataTransfer) {\n this.setGroupDragImage(event, tabGroup, chip.element);\n }\n this._callbacks.onChipDragStart(tabGroup, chip, event);\n },\n onDragEnd: (event) => {\n var _a, _b;\n (_b = (_a = this._callbacks).onChipDragEnd) === null || _b === void 0 ? void 0 : _b.call(_a, tabGroup, chip, event);\n },\n });\n // Synchronous panelTransfer cleanup directly on the chip element.\n // `Html5DragSource`'s dragend defers data disposal via `setTimeout(0)`\n // so drop handlers can read the payload — but a chip drag that\n // ends via `moveGroupOrPanel` (no actual drop event) needs the\n // singleton cleared immediately, otherwise a synchronous\n // `getPanelData()` after the move still sees the stale chip\n // payload. Attached directly (not via `addDisposableListener`) so\n // the listener survives chip disposal in the detach-then-dragend\n // cross-group path; `once: true` auto-removes after the single\n // dragend that we care about. (#1254)\n chip.element.addEventListener('dragend', () => {\n panelTransfer.clearData(PanelTransfer.prototype);\n }, { once: true });\n const pointerDragSource = pointerBackend.createDragSource(chip.element, {\n getData,\n disabled: !caps.pointer,\n touchOnly: !caps.pointerHandlesMouse,\n isCancelled: () => !resolveDndCapabilities(this._ctx.accessor.options).pointer,\n createGhost: () => ({\n element: this._buildChipGhostElement(chip.element),\n offsetX: 8,\n offsetY: 8,\n }),\n onDragStart: (event) => {\n this._callbacks.onChipDragStart(tabGroup, chip, event);\n },\n });\n const disposables = [\n tabGroup.onDidChange(() => {\n var _a;\n (_a = chip.update) === null || _a === void 0 ? void 0 : _a.call(chip, { tabGroup });\n this._updateTabGroupClasses();\n }),\n tabGroup.onDidPanelChange(() => {\n this._positionChipForGroup(tabGroup);\n this._updateTabGroupClasses();\n }),\n tabGroup.onDidCollapseChange(() => {\n this._updateTabGroupClasses();\n }),\n html5DragSource,\n pointerDragSource,\n ];\n // Context menu: built-in TabGroupChip already aggregates right-click\n // + touch long-press into `onContextMenu`. Custom chip renderers\n // don't, so attach a long-press detector and contextmenu listener\n // directly on their element.\n const onContextMenu = (event) => {\n // A long-press on a chip should preempt the in-flight pointer\n // drag and open the menu instead.\n pointerDragSource.cancelPending();\n this._callbacks.onChipContextMenu(tabGroup, event);\n };\n if (chip instanceof TabGroupChip) {\n disposables.push(chip.onContextMenu(onContextMenu));\n }\n else {\n disposables.push(new LongPressDetector(chip.element, {\n onLongPress: onContextMenu,\n }), addDisposableListener(chip.element, 'contextmenu', onContextMenu));\n }\n // The chip sits before its group's first tab in the DOM, so it\n // covers the \"drop before the group\" position. Without a drop\n // target here, dropping a tab over the chip is a dead zone —\n // particularly visible when the group is first in the tabs list\n // and there's no preceding tab whose right zone covers position 0.\n // The smooth animation path already shifts the chip's margin to\n // open a gap, so suppress the overlay in that mode.\n const isVertical = this._ctx.getDirection() === 'vertical';\n const dropTarget = new Droptarget(chip.element, {\n acceptedTargetZones: isVertical ? ['top'] : ['left'],\n overlayModel: {\n activationSize: { value: 100, type: 'percentage' },\n },\n canDisplayOverlay: (event, position) => {\n var _a;\n if (this._ctx.group.locked) {\n return false;\n }\n if (this._ctx.accessor.options.disableDnd) {\n return false;\n }\n const data = getPanelData();\n if (data && this._ctx.accessor.id === data.viewId) {\n if (((_a = this._ctx.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) ===\n 'smooth') {\n return false;\n }\n return true;\n }\n return this._ctx.group.model.canDisplayOverlay(event, position, 'tab');\n },\n });\n disposables.push(dropTarget, dropTarget.onDrop((event) => {\n this._callbacks.onChipDrop(tabGroup, event);\n }));\n const disposable = new CompositeDisposable(...disposables);\n this._chipRenderers.set(tabGroup.id, {\n chip,\n html5DragSource,\n pointerDragSource,\n disposable,\n dropTarget,\n });\n // Group is born collapsed (cross-group drop, layout restore, etc.):\n // its tabs are about to be added without the collapsed class. Skip\n // the animation in the upcoming _updateTabGroupClasses call so they\n // apply the class instantly instead of transitioning from expanded.\n if (tabGroup.collapsed) {\n this._skipNextCollapseAnimation = true;\n }\n }\n _positionChipForGroup(tabGroup) {\n const entry = this._chipRenderers.get(tabGroup.id);\n if (!entry) {\n return;\n }\n const chipEl = entry.chip.element;\n const panelIds = tabGroup.panelIds;\n if (panelIds.length === 0) {\n chipEl.remove();\n return;\n }\n // Find the first tab element of this group\n const firstPanelId = panelIds[0];\n const firstTabEntry = this._ctx.getTabMap().get(firstPanelId);\n if (!firstTabEntry) {\n chipEl.remove();\n return;\n }\n // Insert chip before the first tab of the group\n const firstTabEl = firstTabEntry.value.element;\n if (chipEl.nextSibling !== firstTabEl) {\n this._ctx.tabsList.insertBefore(chipEl, firstTabEl);\n }\n }\n _updateTabGroupClasses() {\n var _a;\n const model = this._ctx.group.model;\n const tabGroups = model.getTabGroups();\n const tabs = this._ctx.getTabs();\n const tabMap = this._ctx.getTabMap();\n let hasAnimation = false;\n // Build a lookup: panelId → tabGroup\n const panelGroupMap = new Map();\n for (const tg of tabGroups) {\n for (const pid of tg.panelIds) {\n panelGroupMap.set(pid, tg);\n }\n }\n for (const tabEntry of tabs) {\n const tab = tabEntry.value;\n const panelId = tab.panel.id;\n const tg = panelGroupMap.get(panelId);\n const isGrouped = !!tg;\n toggleClass(tab.element, 'dv-tab--grouped', isGrouped);\n if (tg) {\n const ids = tg.panelIds;\n const isFirst = ids[0] === panelId;\n const isLast = ids[ids.length - 1] === panelId;\n toggleClass(tab.element, 'dv-tab--group-first', isFirst);\n toggleClass(tab.element, 'dv-tab--group-last', isLast);\n // Expose the resolved group color as a CSS custom property\n // so pure-CSS themes can use it for borders, backgrounds, etc.\n applyTabGroupAccent(tab.element, tg.color, this._ctx.accessor.tabGroupColorPalette);\n // Collapse / expand with animation\n const isCollapsed = tab.element.classList.contains('dv-tab--group-collapsed');\n if (!tg.collapsed && isCollapsed) {\n // Collapsed → expanding: animate back\n hasAnimation = true;\n tab.element.classList.remove('dv-tab--group-collapsed');\n tab.element.classList.add('dv-tab--group-expanding');\n // Clean up any previous transitionend listener\n // from a rapid collapse/expand cycle\n (_a = this._pendingTransitionCleanups.get(panelId)) === null || _a === void 0 ? void 0 : _a();\n const onEnd = () => {\n tab.element.classList.remove('dv-tab--group-expanding');\n tab.element.style.removeProperty('width');\n tab.element.removeEventListener('transitionend', onEnd);\n clearTimeout(fallbackTimer);\n this._pendingTransitionCleanups.delete(panelId);\n };\n // Fallback in case transitionend never fires\n // (e.g. element removed from DOM mid-transition)\n const fallbackTimer = setTimeout(onEnd, 300);\n this._pendingTransitionCleanups.set(panelId, onEnd);\n tab.element.addEventListener('transitionend', onEnd);\n }\n }\n else {\n toggleClass(tab.element, 'dv-tab--group-first', false);\n toggleClass(tab.element, 'dv-tab--group-last', false);\n tab.element.classList.remove('dv-tab--group-collapsed', 'dv-tab--group-expanding');\n tab.element.style.removeProperty('width');\n tab.element.style.removeProperty('--dv-tab-group-color');\n }\n }\n // Track active group IDs for underline/collapse handling\n const activeGroupIds = new Set();\n // Handle collapse animation per group\n for (const tg of tabGroups) {\n activeGroupIds.add(tg.id);\n // Collapse animation\n const hasNewCollapse = tg.collapsed &&\n tg.panelIds.some((pid) => {\n const te = tabMap.get(pid);\n return (te &&\n !te.value.element.classList.contains('dv-tab--group-collapsed'));\n });\n if (hasNewCollapse) {\n if (this._skipNextCollapseAnimation) {\n // Apply collapsed state instantly (no animation).\n // Disable transitions so the CSS transition on\n // dv-tab--group-collapsed doesn't fire.\n const affected = [];\n for (const pid of tg.panelIds) {\n const te = tabMap.get(pid);\n if (te) {\n te.value.element.style.transition = 'none';\n te.value.element.classList.add('dv-tab--group-collapsed');\n affected.push(te.value.element);\n }\n }\n if (affected.length > 0) {\n void affected[0].offsetHeight; // single reflow\n for (const el of affected) {\n el.style.removeProperty('transition');\n }\n }\n }\n else {\n hasAnimation = true;\n const isVert = this._ctx.getDirection() === 'vertical';\n for (const pid of tg.panelIds) {\n const te = tabMap.get(pid);\n if (te &&\n !te.value.element.classList.contains('dv-tab--group-collapsed')) {\n const rect = te.value.element.getBoundingClientRect();\n if (isVert) {\n te.value.element.style.height = `${rect.height}px`;\n }\n else {\n te.value.element.style.width = `${rect.width}px`;\n }\n void te.value.element.offsetHeight; // force reflow\n te.value.element.classList.add('dv-tab--group-collapsed');\n }\n }\n }\n }\n }\n this._skipNextCollapseAnimation = false;\n // Sync indicator underlines and position them\n this._ensureIndicator();\n if (this._indicator) {\n this._indicator.syncUnderlineElements(activeGroupIds);\n if (hasAnimation) {\n this._indicator.trackUnderlines();\n }\n else {\n this._indicator.positionUnderlines();\n }\n }\n }\n}\n\nclass Tabs extends CompositeDisposable {\n get showTabsOverflowControl() {\n return this._showTabsOverflowControl;\n }\n set showTabsOverflowControl(value) {\n if (this._showTabsOverflowControl == value) {\n return;\n }\n this._showTabsOverflowControl = value;\n if (value) {\n const observer = new OverflowObserver(this._tabsList);\n this._observerDisposable.value = new CompositeDisposable(observer, observer.onDidChange((event) => {\n const hasOverflow = event.hasScrollX || event.hasScrollY;\n this.toggleDropdown({ reset: !hasOverflow });\n if (this._tabGroupManager.groupUnderlines.size > 0) {\n this._tabGroupManager.positionUnderlines();\n }\n }), addDisposableListener(this._tabsList, 'scroll', () => {\n this.toggleDropdown({ reset: false });\n if (this._tabGroupManager.groupUnderlines.size > 0) {\n this._tabGroupManager.positionUnderlines();\n }\n }));\n }\n }\n get element() {\n return this._element;\n }\n set voidContainer(el) {\n var _a;\n (_a = this._voidContainerListeners) === null || _a === void 0 ? void 0 : _a.dispose();\n this._voidContainerListeners = null;\n this._voidContainer = el;\n if (el) {\n this._voidContainerListeners = new CompositeDisposable(addDisposableListener(el, 'dragover', (event) => {\n if (this._animState) {\n event.preventDefault();\n }\n }), addDisposableListener(el, 'drop', (event) => {\n var _a;\n if (((_a = this._animState) === null || _a === void 0 ? void 0 : _a.sourceTabGroupId) &&\n this._animState.currentInsertionIndex !== null) {\n event.preventDefault();\n event.stopPropagation();\n this.handleVoidDrop();\n }\n }));\n }\n }\n /**\n * Handle a drop that occurred on the void container (empty header\n * space to the right of the tabs). Returns `true` if the drop was\n * consumed by an active group drag, `false` otherwise.\n */\n handleVoidDrop() {\n var _a, _b;\n if (!((_a = this._animState) === null || _a === void 0 ? void 0 : _a.sourceTabGroupId)) {\n return false;\n }\n const sourceTabGroupId = this._animState.sourceTabGroupId;\n const insertionIndex = (_b = this._animState.currentInsertionIndex) !== null && _b !== void 0 ? _b : this._tabs.length;\n this._animState = null;\n this._commitGroupMove(sourceTabGroupId, insertionIndex);\n return true;\n }\n get panels() {\n return this._tabs.map((_) => _.value.panel.id);\n }\n get size() {\n return this._tabs.length;\n }\n get tabs() {\n return this._tabs.map((_) => _.value);\n }\n get direction() {\n return this._direction;\n }\n set direction(value) {\n if (this._direction === value) {\n return;\n }\n this._direction = value;\n if (this._scrollbar) {\n this._scrollbar.orientation = value;\n }\n removeClasses(this._tabsList, 'dv-horizontal', 'dv-vertical');\n if (value === 'vertical') {\n addClasses(this._tabsList, 'dv-tabs-container-vertical', 'dv-vertical');\n }\n else {\n removeClasses(this._tabsList, 'dv-tabs-container-vertical');\n addClasses(this._tabsList, 'dv-horizontal');\n }\n for (const tab of this._tabs) {\n tab.value.setDirection(value);\n }\n this._tabGroupManager.updateDirection();\n }\n constructor(group, accessor, options) {\n super();\n this.group = group;\n this.accessor = accessor;\n this._observerDisposable = new MutableDisposable();\n this._scrollbar = null;\n this._tabs = [];\n this._tabMap = new Map();\n this.selectedIndex = -1;\n this._showTabsOverflowControl = false;\n this._direction = 'horizontal';\n this._animState = null;\n this._pendingMarginCleanups = new Map();\n this._pendingCollapse = false;\n this._flipTransitionCleanup = null;\n this._voidContainer = null;\n this._voidContainerListeners = null;\n this._extendedDropZone = null;\n this._pointerInsideTabsList = false;\n this._onTabDragStart = new Emitter();\n this.onTabDragStart = this._onTabDragStart.event;\n this._onDrop = new Emitter();\n this.onDrop = this._onDrop.event;\n this._onWillShowOverlay = new Emitter();\n this.onWillShowOverlay = this._onWillShowOverlay.event;\n this._onOverflowTabsChange = new Emitter();\n this.onOverflowTabsChange = this._onOverflowTabsChange.event;\n this._tabsList = document.createElement('div');\n this._tabsList.className = 'dv-tabs-container';\n this.showTabsOverflowControl = options.showTabsOverflowControl;\n if (accessor.options.scrollbars === 'native') {\n this._element = this._tabsList;\n }\n else {\n this._scrollbar = new Scrollbar(this._tabsList);\n this._scrollbar.orientation = this.direction;\n this._element = this._scrollbar.element;\n this.addDisposables(this._scrollbar);\n }\n this._tabGroupManager = new TabGroupManager({\n group: this.group,\n accessor: this.accessor,\n tabsList: this._tabsList,\n getTabs: () => this._tabs,\n getTabMap: () => this._tabMap,\n getDirection: () => this._direction,\n }, {\n onChipContextMenu: (tabGroup, event) => {\n this.accessor.contextMenuController.showForChip(tabGroup, this.group, event);\n },\n onChipDragStart: (tabGroup, chip, event) => {\n this._handleChipDragStart(tabGroup, chip, event);\n },\n onChipDragEnd: () => {\n // HTML5 chip dragend (incl. cancels). The Html5DragSource\n // owns the listener on the chip element, so this fires\n // even if the chip was detached cross-group — the\n // element keeps its listeners until the source is\n // disposed. resetDragAnimation is a no-op after a\n // successful drop (anim state already null) thanks to\n // the gating inside it.\n this.resetDragAnimation();\n },\n onChipDrop: (tabGroup, event) => {\n this._handleChipDrop(tabGroup, event);\n },\n });\n this.addDisposables(this._onOverflowTabsChange, this._observerDisposable, this._onWillShowOverlay, this._onDrop, this._onTabDragStart, {\n dispose: () => {\n var _a;\n (_a = this._flipTransitionCleanup) === null || _a === void 0 ? void 0 : _a.call(this);\n },\n }, \n // Pointer-side cleanup: when any pointer drag ends, tear\n // down smooth-reorder anim state the dragover bridge may\n // have installed. The chip's pointer drag source handles\n // its own transfer payload + iframe-shield cleanup.\n PointerDragController.getInstance().onDragEnd(() => {\n this._pointerInsideTabsList = false;\n this.resetDragAnimation();\n }), \n // Pointer-event mirror of the HTML5 dragover / dragleave handlers\n // below. Drives smooth-reorder for `dndStrategy: 'pointer'` and\n // for touch drags in `'auto'`.\n PointerDragController.getInstance().onDragMove((e) => {\n this._handlePointerDragMove(e.clientX, e.clientY);\n }), addDisposableListener(this.element, 'pointerdown', (event) => {\n if (event.defaultPrevented) {\n return;\n }\n const isLeftClick = event.button === 0;\n if (isLeftClick) {\n this.accessor.doSetGroupActive(this.group);\n }\n }), \n // Trackpad / wheel forwarding. The strip scrolls along its own\n // axis (x for horizontal headers, y for vertical), so deltaY\n // from a plain mouse wheel maps onto the strip's axis too —\n // this gives the VS Code-style \"scroll over tab bar to page\n // through tabs\" feel. We only consume the event when the strip\n // is actually overflowing in the direction the user wheeled in,\n // so a wheel at the edge of a non-overflowing strip still\n // bubbles up and scrolls the page. `{ passive: false }` is\n // required because we call preventDefault().\n addDisposableListener(this._tabsList, 'wheel', (event) => {\n const isVertical = this._direction === 'vertical';\n const primary = isVertical\n ? event.deltaY || event.deltaX\n : event.deltaX || event.deltaY;\n if (primary === 0) {\n return;\n }\n const max = isVertical\n ? this._tabsList.scrollHeight -\n this._tabsList.clientHeight\n : this._tabsList.scrollWidth -\n this._tabsList.clientWidth;\n if (max <= 0) {\n return;\n }\n const current = isVertical\n ? this._tabsList.scrollTop\n : this._tabsList.scrollLeft;\n // At the edge in the wheel direction: let the page\n // scroll instead of trapping the gesture.\n if ((primary < 0 && current <= 0) ||\n (primary > 0 && current >= max)) {\n return;\n }\n event.preventDefault();\n // Custom-scrollbar mode wraps the tabs list and installs\n // its own wheel listener that rewrites scrollLeft from a\n // deltaY-only tracker. Without stopPropagation that\n // handler would clobber our deltaX-aware update.\n event.stopPropagation();\n if (isVertical) {\n this._tabsList.scrollTop = current + primary;\n }\n else {\n this._tabsList.scrollLeft = current + primary;\n }\n }, { passive: false }), addDisposableListener(this._tabsList, 'dragover', (event) => {\n if (this._processDragOver(event.clientX)) {\n // Allow `drop` to fire on the tabs list container.\n event.preventDefault();\n }\n }, true), addDisposableListener(this._tabsList, 'dragleave', (event) => {\n this._processDragLeave(event.relatedTarget);\n }, true), addDisposableListener(this._tabsList, 'dragend', () => {\n this.resetDragAnimation();\n }), addDisposableListener(this._tabsList, 'drop', (event) => {\n var _a, _b, _c;\n if (!this._animState ||\n this._animState.currentInsertionIndex === null) {\n return;\n }\n // In non-smooth mode only handle group drags here;\n // individual tab drops are handled by tab Droptargets.\n if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) !==\n 'smooth' &&\n !this._animState.sourceTabGroupId) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n // The capturing stopPropagation above prevents the\n // individual tab's Droptarget.onDrop from firing, so\n // the anchor overlay won't be cleared by that path.\n // Clear it explicitly here before processing the drop.\n (_c = (_b = this.group.model.dropTargetContainer) === null || _b === void 0 ? void 0 : _b.model) === null || _c === void 0 ? void 0 : _c.clear();\n const animState = this._animState;\n this._animState = null;\n this._pendingCollapse = false;\n // Handle group drag (entire group repositioned)\n if (animState.sourceTabGroupId) {\n this._commitGroupMove(animState.sourceTabGroupId, animState.currentInsertionIndex);\n return;\n }\n const insertionIndex = animState.currentInsertionIndex;\n const sourceIndex = animState.sourceIndex;\n const adjustedIndex = insertionIndex -\n (sourceIndex !== -1 && sourceIndex < insertionIndex\n ? 1\n : 0);\n const sourceCurrentGroup = this.group.model.getTabGroupForPanel(animState.sourceTabId);\n if (adjustedIndex === sourceIndex &&\n !animState.targetTabGroupId &&\n !sourceCurrentGroup) {\n this._uncollapsSourceTab(animState.sourceTabId);\n this.resetTabTransforms();\n return;\n }\n this._uncollapsSourceTab(animState.sourceTabId);\n const firstPositions = this.snapshotTabPositions();\n this.resetTabTransforms();\n this._onDrop.fire({\n event,\n index: adjustedIndex,\n targetTabGroupId: animState.targetTabGroupId,\n });\n this.runFlipAnimation(firstPositions, animState.sourceTabId, animState.sourceIndex === -1, {\n from: Math.min(sourceIndex, adjustedIndex),\n to: Math.max(sourceIndex, adjustedIndex),\n });\n }, true), Disposable.from(() => {\n var _a;\n (_a = this._voidContainerListeners) === null || _a === void 0 ? void 0 : _a.dispose();\n this.resetDragAnimation();\n this._tabGroupManager.disposeAll();\n for (const { value, disposable } of this._tabs) {\n disposable.dispose();\n value.dispose();\n }\n this._tabs = [];\n this._tabMap.clear();\n }));\n }\n indexOf(id) {\n return this._tabs.findIndex((tab) => tab.value.panel.id === id);\n }\n isActive(tab) {\n return (this.selectedIndex > -1 &&\n this._tabs[this.selectedIndex].value === tab);\n }\n setActivePanel(panel) {\n const isVertical = this._direction === 'vertical';\n let running = 0;\n for (const tab of this._tabs) {\n const isActivePanel = panel.id === tab.value.panel.id;\n tab.value.setActive(isActivePanel);\n if (isActivePanel) {\n const element = tab.value.element;\n const parentElement = element.parentElement;\n if (isVertical) {\n if (running < parentElement.scrollTop ||\n running + element.clientHeight >\n parentElement.scrollTop + parentElement.clientHeight) {\n parentElement.scrollTop = running;\n }\n }\n else {\n if (running < parentElement.scrollLeft ||\n running + element.clientWidth >\n parentElement.scrollLeft + parentElement.clientWidth) {\n parentElement.scrollLeft = running;\n }\n }\n }\n running += isVertical\n ? tab.value.element.clientHeight\n : tab.value.element.clientWidth;\n }\n // Reposition underlines so the wrap-around follows the new active tab\n if (this._tabGroupManager.groupUnderlines.size > 0) {\n this._tabGroupManager.positionUnderlines();\n }\n }\n openPanel(panel, index = this._tabs.length) {\n if (this._tabMap.has(panel.id)) {\n return;\n }\n const tab = new Tab(panel, this.accessor, this.group);\n tab.setContent(panel.view.tab);\n if (this._direction !== 'horizontal') {\n tab.setDirection(this._direction);\n }\n const disposable = new CompositeDisposable(tab.onDragStart((event) => {\n var _a;\n this._onTabDragStart.fire({ nativeEvent: event, panel });\n // Both HTML5 and pointer drags initialize _animState. Cleanup\n // is wired in both paths: HTML5 via dragend/drop on _tabsList,\n // pointer via PointerDragController.onDragEnd subscriptions.\n if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {\n const tabWidth = tab.element.getBoundingClientRect().width;\n const sourceIndex = this._tabs.findIndex((x) => x.value === tab);\n this._animState = {\n sourceTabId: panel.id,\n sourceIndex,\n tabPositions: this.snapshotTabPositions(),\n chipPositions: this._tabGroupManager.snapshotChipWidths(),\n currentInsertionIndex: null,\n targetTabGroupId: null,\n sourceTabGroupId: null,\n sourceGroupPanelIds: null,\n sourceChipWidth: 0,\n cursorOffsetFromDragLeft: tabWidth / 2,\n sourceGapWidth: tabWidth,\n containerLeft: this._tabsList.getBoundingClientRect().left,\n };\n // Collapse the source tab after the browser captures the\n // drag image, then open the gap at the source position in\n // the same paint frame — no visual jump.\n // Both collapse and gap must be instant (no transition).\n this._pendingCollapse = true;\n requestAnimationFrame(() => {\n var _a;\n var _b;\n this._pendingCollapse = false;\n if (!this._animState) {\n return;\n }\n // Collapse source tab instantly (no transition)\n tab.element.style.transition = 'none';\n toggleClass(tab.element, 'dv-tab--dragging', true);\n void tab.element.offsetHeight; // force reflow\n (_a = (_b = this._animState).currentInsertionIndex) !== null && _a !== void 0 ? _a : (_b.currentInsertionIndex = sourceIndex);\n // Apply gap with transitions disabled on the target\n this.applyDragOverTransforms(true);\n // Re-enable transitions for subsequent moves\n tab.element.style.removeProperty('transition');\n });\n }\n }), tab.onTabClick((event) => {\n if (event.defaultPrevented) {\n return;\n }\n if (this.group.api.location.type !== 'edge') {\n return;\n }\n if (this.group.activePanel === panel) {\n // Clicking the active tab toggles expansion\n if (this.group.api.isCollapsed()) {\n this.group.api.expand();\n }\n else {\n this.group.api.collapse();\n }\n }\n else {\n // Clicking a non-active tab switches the active tab.\n // If the group is collapsed, also expand it.\n this.group.model.openPanel(panel);\n if (this.group.api.isCollapsed()) {\n this.group.api.expand();\n }\n }\n }), tab.onPointerDown((event) => {\n if (event.defaultPrevented) {\n return;\n }\n const isFloatingGroupsEnabled = !this.accessor.options.disableFloatingGroups;\n const isFloatingWithOnePanel = this.group.api.location.type === 'floating' &&\n this.size === 1;\n if (isFloatingGroupsEnabled &&\n !isFloatingWithOnePanel &&\n event.shiftKey) {\n event.preventDefault();\n const panel = this.accessor.getGroupPanel(tab.panel.id);\n const { top, left } = tab.element.getBoundingClientRect();\n const { top: rootTop, left: rootLeft } = this.accessor.element.getBoundingClientRect();\n this.accessor.addFloatingGroup(panel, {\n x: left - rootLeft,\n y: top - rootTop,\n inDragMode: true,\n });\n return;\n }\n switch (event.button) {\n case 0:\n if (this.group.api.location.type === 'edge') ;\n else {\n if (this.group.activePanel !== panel) {\n this.group.model.openPanel(panel);\n }\n }\n break;\n }\n }), tab.onDrop((event) => {\n var _a, _b, _c, _d;\n const animState = this._animState;\n this._animState = null;\n this._pendingCollapse = false;\n const tabIndex = this._tabs.findIndex((x) => x.value === tab);\n if (animState) {\n const dropIndex = event.position === 'right' ? tabIndex + 1 : tabIndex;\n if (animState.sourceTabGroupId) {\n this._commitGroupMove(animState.sourceTabGroupId, (_a = animState.currentInsertionIndex) !== null && _a !== void 0 ? _a : dropIndex);\n return;\n }\n this._uncollapsSourceTab(animState.sourceTabId);\n const firstPositions = this.snapshotTabPositions();\n this.resetTabTransforms();\n this._onDrop.fire({\n event: event.nativeEvent,\n index: dropIndex,\n targetTabGroupId: animState.targetTabGroupId,\n });\n if (((_b = this.accessor.options.theme) === null || _b === void 0 ? void 0 : _b.tabAnimation) === 'smooth') {\n this.runFlipAnimation(firstPositions, animState.sourceTabId, animState.sourceIndex === -1, animState.sourceIndex !== -1\n ? {\n from: Math.min(animState.sourceIndex, dropIndex),\n to: Math.max(animState.sourceIndex, dropIndex),\n }\n : undefined);\n }\n }\n else {\n // Compute insertion index based on which half of the tab\n // the pointer is over, then adjust for same-group removal:\n // when the source tab sits before the insertion point,\n // removing it shifts all subsequent indices down by one.\n const afterPosition = this._direction === 'vertical' ? 'bottom' : 'right';\n const insertionIndex = event.position === afterPosition\n ? tabIndex + 1\n : tabIndex;\n const data = getPanelData();\n const sourceIndex = data\n ? this._tabs.findIndex((x) => x.value.panel.id === data.panelId)\n : -1;\n const adjustedIndex = insertionIndex -\n (sourceIndex !== -1 && sourceIndex < insertionIndex\n ? 1\n : 0);\n const targetTabGroupId = (_d = (_c = this.group.model.getTabGroupForPanel(tab.panel.id)) === null || _c === void 0 ? void 0 : _c.id) !== null && _d !== void 0 ? _d : null;\n this._onDrop.fire({\n event: event.nativeEvent,\n index: adjustedIndex,\n targetTabGroupId,\n });\n }\n }), tab.onWillShowOverlay((event) => {\n this._onWillShowOverlay.fire(new DockviewWillShowOverlayLocationEvent(event, {\n kind: 'tab',\n panel: this.group.activePanel,\n api: this.accessor.api,\n group: this.group,\n getData: getPanelData,\n }));\n }));\n const value = { value: tab, disposable };\n this.addTab(value, index);\n // A new tab may have been inserted between a chip and its\n // group's first tab — reposition all chips to stay correct.\n this._tabGroupManager.positionAllChips();\n // If a tab was added during active drag, refresh positions\n if (this._animState) {\n this._animState.tabPositions = this.snapshotTabPositions();\n this._animState.chipPositions =\n this._tabGroupManager.snapshotChipWidths();\n this.applyDragOverTransforms();\n }\n }\n delete(id) {\n var _a;\n if (((_a = this._animState) === null || _a === void 0 ? void 0 : _a.sourceTabId) === id) {\n this.resetTabTransforms();\n this._animState = null;\n }\n // Force-clean any pending transitionend listener\n this._tabGroupManager.cleanupTransition(id);\n const index = this.indexOf(id);\n const tabToRemove = this._tabs.splice(index, 1)[0];\n this._tabMap.delete(id);\n if (tabToRemove) {\n const { value, disposable } = tabToRemove;\n disposable.dispose();\n value.dispose();\n value.element.remove();\n }\n // If a non-source tab was removed during active drag, refresh positions\n if (this._animState) {\n this._animState.tabPositions = this.snapshotTabPositions();\n this._animState.chipPositions =\n this._tabGroupManager.snapshotChipWidths();\n this.applyDragOverTransforms();\n }\n }\n addTab(tab, index = this._tabs.length) {\n if (index < 0 || index > this._tabs.length) {\n throw new Error('invalid location');\n }\n // Use the tab element at `index` as the reference node rather than\n // `children[index]`, because `_tabsList` may contain non-tab children\n // (e.g. group chips, underlines) that shift the DOM indices.\n const refNode = index < this._tabs.length ? this._tabs[index].value.element : null;\n this._tabsList.insertBefore(tab.value.element, refNode);\n this._tabs = [\n ...this._tabs.slice(0, index),\n tab,\n ...this._tabs.slice(index),\n ];\n this._tabMap.set(tab.value.panel.id, tab);\n if (this.selectedIndex < 0) {\n this.selectedIndex = index;\n }\n }\n toggleDropdown(options) {\n if (options.reset) {\n this._onOverflowTabsChange.fire({\n tabs: [],\n tabGroups: [],\n reset: true,\n });\n return;\n }\n const tabs = this._tabs\n .filter((tab) => !isChildEntirelyVisibleWithinParent(tab.value.element, this._tabsList))\n .map((x) => x.value.panel.id);\n // Detect tab groups whose chip is clipped or whose tabs are all\n // in the overflow set (e.g. collapsed groups scrolled out of view).\n const overflowTabSet = new Set(tabs);\n const tabGroups = [];\n for (const tg of this.group.model.getTabGroups()) {\n const chipEntry = this._tabGroupManager.chipRenderers.get(tg.id);\n const chipClipped = chipEntry &&\n !isChildEntirelyVisibleWithinParent(chipEntry.chip.element, this._tabsList);\n // A group is in overflow if its chip is clipped OR all its\n // visible tabs are in the overflow set.\n const allTabsOverflow = tg.panelIds.length > 0 &&\n tg.panelIds.every((pid) => overflowTabSet.has(pid));\n if (chipClipped || allTabsOverflow) {\n tabGroups.push(tg.id);\n // For collapsed groups whose chip is clipped, ensure all\n // member tabs are included in the overflow list so they\n // appear in the dropdown.\n if (tg.collapsed) {\n for (const pid of tg.panelIds) {\n if (!overflowTabSet.has(pid)) {\n overflowTabSet.add(pid);\n tabs.push(pid);\n }\n }\n }\n }\n }\n this._onOverflowTabsChange.fire({ tabs, tabGroups, reset: false });\n }\n updateDragAndDropState() {\n for (const tab of this._tabs) {\n tab.value.updateDragAndDropState();\n }\n this._tabGroupManager.updateDragAndDropState();\n }\n /**\n * Synchronize chip elements and CSS classes for all tab groups\n * in the parent group model. Call after any tab group mutation.\n */\n updateTabGroups() {\n this._tabGroupManager.update();\n }\n refreshTabGroupAccent() {\n this._tabGroupManager.refreshAccents();\n }\n /**\n * Tabs-list-specific side effects of a chip drag start. The chip's\n * drag sources (constructed by `TabGroupManager`) own the transfer\n * payload, iframe shielding, dataTransfer setup, and the HTML5 drag\n * image. This method just sets up the smooth-reorder anim state and\n * collapses the source-group tabs in the tabs list.\n */\n _handleChipDragStart(tabGroup, chip, event) {\n var _a;\n const firstPanelId = tabGroup.panelIds[0];\n const firstIdx = firstPanelId\n ? this._tabs.findIndex((t) => t.value.panel.id === firstPanelId)\n : -1;\n const chipRect = chip.element.getBoundingClientRect();\n // Compute total group width (chip + all tabs)\n let groupGapWidth = chipRect.width;\n for (const pid of tabGroup.panelIds) {\n const tabEntry = this._tabMap.get(pid);\n if (tabEntry) {\n groupGapWidth +=\n tabEntry.value.element.getBoundingClientRect().width;\n }\n }\n this._animState = {\n sourceTabId: '',\n sourceIndex: firstIdx,\n tabPositions: this.snapshotTabPositions(),\n chipPositions: this._tabGroupManager.snapshotChipWidths(),\n currentInsertionIndex: null,\n targetTabGroupId: null,\n sourceTabGroupId: tabGroup.id,\n sourceGroupPanelIds: new Set(tabGroup.panelIds),\n sourceChipWidth: chipRect.width,\n cursorOffsetFromDragLeft: event.clientX - chipRect.left,\n sourceGapWidth: groupGapWidth,\n containerLeft: this._tabsList.getBoundingClientRect().left,\n };\n if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) !== 'smooth') {\n return;\n }\n // Collapse group tabs + chip after the browser captures the drag\n // image, then open the gap at the source position — all instant\n // (no transitions).\n const groupPanelIds = new Set(tabGroup.panelIds);\n this._pendingCollapse = true;\n requestAnimationFrame(() => {\n var _a;\n var _b;\n this._pendingCollapse = false;\n if (!this._animState) {\n return;\n }\n // Collapse all group tabs instantly\n for (const t of this._tabs) {\n if (groupPanelIds.has(t.value.panel.id)) {\n t.value.element.style.transition = 'none';\n toggleClass(t.value.element, 'dv-tab--dragging', true);\n }\n }\n // Collapse the group chip instantly\n const chipEntry = this._tabGroupManager.chipRenderers.get(tabGroup.id);\n if (chipEntry) {\n chipEntry.chip.element.style.transition = 'none';\n toggleClass(chipEntry.chip.element, 'dv-tab-group-chip--dragging', true);\n }\n // Single reflow for the entire batch\n void this._tabsList.offsetHeight;\n const underline = this._tabGroupManager.groupUnderlines.get(tabGroup.id);\n if (underline) {\n underline.style.display = 'none';\n }\n (_a = (_b = this._animState).currentInsertionIndex) !== null && _a !== void 0 ? _a : (_b.currentInsertionIndex = firstIdx);\n this.applyDragOverTransforms(true);\n for (const t of this._tabs) {\n if (groupPanelIds.has(t.value.panel.id)) {\n t.value.element.style.removeProperty('transition');\n }\n }\n if (chipEntry) {\n chipEntry.chip.element.style.removeProperty('transition');\n }\n });\n }\n /**\n * A drop on a tab group chip means \"insert before this group\". Resolve to\n * the index of the group's first tab, adjusting for same-group removal\n * (when the source tab is currently to the left of the target slot, its\n * removal shifts the insertion index down by one). Always clears\n * `targetTabGroupId` so the dropped tab lands outside the group.\n */\n _handleChipDrop(tabGroup, event) {\n const firstPanelId = tabGroup.panelIds[0];\n if (!firstPanelId) {\n return;\n }\n const insertionIndex = this._tabs.findIndex((x) => x.value.panel.id === firstPanelId);\n if (insertionIndex === -1) {\n return;\n }\n const data = getPanelData();\n const sourceIndex = data && data.groupId === this.group.id && data.panelId\n ? this._tabs.findIndex((x) => x.value.panel.id === data.panelId)\n : -1;\n const adjustedIndex = insertionIndex -\n (sourceIndex !== -1 && sourceIndex < insertionIndex ? 1 : 0);\n this._onDrop.fire({\n event: event.nativeEvent,\n index: adjustedIndex,\n targetTabGroupId: null,\n });\n }\n /**\n * Sets the broader container that is part of the same logical drop surface\n * as this tab list (e.g. the full header element). When a dragleave from\n * the tabs list lands inside this container, `_animState` is preserved so\n * that external dragover listeners can continue the animation.\n */\n setExtendedDropZone(el) {\n this._extendedDropZone = el;\n }\n /**\n * Allows external elements (e.g. void container, left actions) to push an\n * insertion index into the animation while the cursor is outside the tabs\n * list itself. Pass `null` to clear the indicator.\n */\n setExternalInsertionIndex(index) {\n if (!this._animState) {\n return;\n }\n if (index === this._animState.currentInsertionIndex) {\n return;\n }\n this._animState.currentInsertionIndex = index;\n this.applyDragOverTransforms();\n }\n /**\n * Called when the drag cursor leaves the entire header area (not just the\n * tabs list). Clears animation state for cross-group drags, which never\n * receive a `dragend` event on this tab list.\n */\n clearExternalAnimState() {\n if (!this._animState) {\n return;\n }\n this.resetTabTransforms();\n if (this._animState.sourceIndex === -1) {\n this._animState = null;\n }\n else {\n this._animState.currentInsertionIndex = null;\n }\n }\n snapshotTabPositions() {\n const positions = new Map();\n for (const tab of this._tabs) {\n positions.set(tab.value.panel.id, tab.value.element.getBoundingClientRect());\n }\n return positions;\n }\n getAverageTabWidth() {\n if (this._tabs.length === 0) {\n return 0;\n }\n const isVertical = this._direction === 'vertical';\n let total = 0;\n for (const tab of this._tabs) {\n const rect = tab.value.element.getBoundingClientRect();\n total += isVertical ? rect.height : rect.width;\n }\n return total / this._tabs.length;\n }\n /**\n * Pointer-event entry point. The HTML5 path enters via the per-element\n * `dragover` listener; this one hit-tests the global pointer-drag\n * position against the tabs list and routes through the same shared\n * `_processDragOver` / `_processDragLeave` helpers.\n */\n _handlePointerDragMove(clientX, clientY) {\n var _a;\n const sourceDoc = (_a = this._tabsList.ownerDocument) !== null && _a !== void 0 ? _a : document;\n const elAtPoint = sourceDoc.elementFromPoint(clientX, clientY);\n const inside = !!elAtPoint &&\n (this._tabsList.contains(elAtPoint) ||\n (!!this._extendedDropZone &&\n this._extendedDropZone.contains(elAtPoint)));\n if (!inside) {\n if (this._pointerInsideTabsList) {\n this._pointerInsideTabsList = false;\n this._processDragLeave(elAtPoint);\n }\n return;\n }\n this._pointerInsideTabsList = true;\n this._processDragOver(clientX);\n }\n /**\n * Shared body of the dragover entry point. Refreshes stale anim state\n * for a changed drag identity, initializes anim state for incoming\n * cross-group drags, and dispatches to the gap-following math in\n * `handleDragOver`. Returns true when this tabs list has taken\n * ownership of the drag — HTML5 callers use this to gate\n * `event.preventDefault()`.\n */\n _processDragOver(clientX) {\n var _a, _b, _c, _d;\n if (this.accessor.options.disableDnd) {\n return false;\n }\n // Stale-state guard: if a previous drag's anim state is still here\n // but the current drag is a different identity, drop the stale one\n // so the new drag starts from a clean slate.\n if (this._animState) {\n const data = getPanelData();\n if ((data === null || data === void 0 ? void 0 : data.tabGroupId) &&\n data.groupId !== this.group.id &&\n this._animState.sourceTabGroupId !== data.tabGroupId) {\n this._animState = null;\n }\n }\n if (!this._animState) {\n const data = getPanelData();\n // In default animation mode, individual tab drops are handled\n // by per-tab Droptargets; only chip drags need tabs-list-level\n // handling so drops on void space still work.\n if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'default' &&\n !(data === null || data === void 0 ? void 0 : data.tabGroupId)) {\n return false;\n }\n if (data &&\n (data.panelId || data.tabGroupId) &&\n data.groupId !== this.group.id) {\n const avgWidth = this.getAverageTabWidth();\n if (data.tabGroupId) {\n // External group drag — look up the source group to\n // size the gap.\n const sourceGroup = this.accessor.getPanel(data.groupId);\n const sourceTg = sourceGroup === null || sourceGroup === void 0 ? void 0 : sourceGroup.model.getTabGroups().find((tg) => tg.id === data.tabGroupId);\n const panelCount = (_b = sourceTg === null || sourceTg === void 0 ? void 0 : sourceTg.panelIds.length) !== null && _b !== void 0 ? _b : 1;\n const groupGapWidth = avgWidth * panelCount + avgWidth;\n this._animState = {\n sourceTabId: '',\n sourceIndex: -1,\n tabPositions: this.snapshotTabPositions(),\n chipPositions: this._tabGroupManager.snapshotChipWidths(),\n currentInsertionIndex: null,\n targetTabGroupId: null,\n sourceTabGroupId: data.tabGroupId,\n sourceGroupPanelIds: sourceTg\n ? new Set(sourceTg.panelIds)\n : new Set(),\n sourceChipWidth: avgWidth,\n cursorOffsetFromDragLeft: groupGapWidth / 2,\n sourceGapWidth: groupGapWidth,\n containerLeft: this._tabsList.getBoundingClientRect().left,\n };\n }\n else {\n this._animState = {\n sourceTabId: data.panelId,\n sourceIndex: -1,\n tabPositions: this.snapshotTabPositions(),\n chipPositions: this._tabGroupManager.snapshotChipWidths(),\n currentInsertionIndex: null,\n targetTabGroupId: null,\n sourceTabGroupId: null,\n sourceGroupPanelIds: null,\n sourceChipWidth: 0,\n cursorOffsetFromDragLeft: avgWidth / 2,\n sourceGapWidth: avgWidth,\n containerLeft: this._tabsList.getBoundingClientRect().left,\n };\n }\n }\n else {\n return false;\n }\n }\n // For intra-group drag (sourceIndex >= 0) the gap animation is the\n // sole visual indicator — clear any stale anchor overlay that may\n // have been set while the cursor was over the panel content area or\n // another zone. External drags (sourceIndex === -1) leave the\n // overlay to the individual tab Droptargets so cross-group\n // animation is not disrupted.\n if (this._animState.sourceIndex !== -1) {\n (_d = (_c = this.group.model.dropTargetContainer) === null || _c === void 0 ? void 0 : _c.model) === null || _d === void 0 ? void 0 : _d.clear();\n }\n this.handleDragOver({ clientX });\n return true;\n }\n /**\n * Shared body of the dragleave entry point. Preserves anim state when\n * the drag moves between tabs-list children, into the extended drop\n * zone, or into the void container; tears it down otherwise.\n */\n _processDragLeave(related) {\n var _a, _b, _c;\n if (!this._animState) {\n return;\n }\n // Moves between children of the tabs list aren't real leaves.\n if (related && this._tabsList.contains(related)) {\n return;\n }\n // Moving into the broader drop zone (e.g. void container, left\n // actions) — keep anim state alive so external listeners can\n // continue the gap animation.\n if (related && ((_a = this._extendedDropZone) === null || _a === void 0 ? void 0 : _a.contains(related))) {\n this.resetTabTransforms();\n this._animState.currentInsertionIndex = null;\n return;\n }\n // Leaving toward the void container (empty header space to the\n // right): keep anim state so a drop can still land at the end.\n const isVoid = this._voidContainer &&\n related &&\n (related === this._voidContainer ||\n this._voidContainer.contains(related));\n if (isVoid) {\n return;\n }\n this.resetTabTransforms();\n if (this._animState.sourceIndex === -1) {\n (_c = (_b = this.group.model.dropTargetContainer) === null || _b === void 0 ? void 0 : _b.model) === null || _c === void 0 ? void 0 : _c.clear();\n this._animState = null;\n }\n else {\n this._animState.currentInsertionIndex = null;\n }\n }\n handleDragOver(event) {\n var _a, _b, _c, _d, _e;\n if (!this._animState) {\n return;\n }\n const mouseX = event.clientX;\n let insertionIndex = null;\n let targetTabGroupId = null;\n const sourceGroupPanelIds = this._animState.sourceGroupPanelIds;\n // Accumulation approach: compute where the drag image's left edge\n // would be, then walk tabs left-to-right using their original widths.\n // A tab fits to the left of the gap if the cumulative width of all\n // preceding non-source tabs <= available space.\n const dragLeftEdge = mouseX - this._animState.cursorOffsetFromDragLeft;\n const availableSpace = dragLeftEdge - this._animState.containerLeft;\n let accWidth = 0;\n // Build lookup: first panel ID of each non-source group → group ID\n // so we can add chip widths when we encounter a group's first tab.\n const firstPanelToGroup = new Map();\n if (this._tabGroupManager.chipRenderers.size > 0) {\n const tabGroups = this.group.model.getTabGroups();\n for (const tg of tabGroups) {\n if (tg.id === this._animState.sourceTabGroupId) {\n continue;\n }\n if (tg.panelIds.length > 0) {\n firstPanelToGroup.set(tg.panelIds[0], tg.id);\n }\n }\n }\n for (let i = 0; i < this._tabs.length; i++) {\n const tab = this._tabs[i].value;\n if (tab.panel.id === this._animState.sourceTabId) {\n continue;\n }\n if (sourceGroupPanelIds === null || sourceGroupPanelIds === void 0 ? void 0 : sourceGroupPanelIds.has(tab.panel.id)) {\n continue;\n }\n // If this tab is the first of a non-source group, include\n // the chip width (which sits before it in the DOM).\n const groupId = firstPanelToGroup.get(tab.panel.id);\n if (groupId) {\n const chipWidth = (_a = this._animState.chipPositions.get(groupId)) !== null && _a !== void 0 ? _a : 0;\n if (accWidth + chipWidth > availableSpace) {\n // Chip alone overflows — gap goes before this group\n insertionIndex !== null && insertionIndex !== void 0 ? insertionIndex : (insertionIndex = i);\n break;\n }\n accWidth += chipWidth;\n }\n // Use original width (before collapse/transforms)\n const origRect = this._animState.tabPositions.get(tab.panel.id);\n const tabWidth = origRect\n ? origRect.width\n : tab.element.getBoundingClientRect().width;\n // Shift at the midpoint: a tab moves left once the drag image\n // covers half of it (like Chrome's tab drag behavior).\n if (accWidth + tabWidth / 2 <= availableSpace) {\n accWidth += tabWidth;\n insertionIndex = i + 1;\n }\n else {\n insertionIndex !== null && insertionIndex !== void 0 ? insertionIndex : (insertionIndex = i);\n break;\n }\n }\n // Determine which tab group (if any) the insertion index falls within.\n //\n // We use snapshot-based positions (accWidth from the accumulation loop\n // above) to compute original chip boundaries. This avoids reading\n // getBoundingClientRect() on chips whose live position is shifted by\n // the drag gap margin, which caused oscillation / visual jumps.\n if (insertionIndex !== null &&\n this._tabGroupManager.chipRenderers.size > 0) {\n const isGroupDrag = !!this._animState.sourceTabGroupId;\n const tabGroups = this.group.model.getTabGroups();\n // Rebuild the accumulated width up to insertionIndex so we know\n // the original right edge of the chip (if any) that precedes it.\n // We walk exactly the same way as the accumulation loop above.\n let accUpTo = 0;\n for (let i = 0; i < this._tabs.length; i++) {\n const tab = this._tabs[i].value;\n if (tab.panel.id === this._animState.sourceTabId) {\n continue;\n }\n if (sourceGroupPanelIds === null || sourceGroupPanelIds === void 0 ? void 0 : sourceGroupPanelIds.has(tab.panel.id)) {\n continue;\n }\n if (i >= insertionIndex) {\n break;\n }\n const gid = firstPanelToGroup.get(tab.panel.id);\n if (gid) {\n accUpTo += (_b = this._animState.chipPositions.get(gid)) !== null && _b !== void 0 ? _b : 0;\n }\n const origRect = this._animState.tabPositions.get(tab.panel.id);\n accUpTo += origRect\n ? origRect.width\n : tab.element.getBoundingClientRect().width;\n }\n for (const tg of tabGroups) {\n // Build effective panel list: exclude the source tab\n // so that dragging a tab out of its own group doesn't\n // inflate the group's index range.\n const effectivePanelIds = tg.panelIds.filter((pid) => pid !== this._animState.sourceTabId &&\n !(sourceGroupPanelIds === null || sourceGroupPanelIds === void 0 ? void 0 : sourceGroupPanelIds.has(pid)));\n if (effectivePanelIds.length === 0) {\n continue;\n }\n const firstIdx = this._tabs.findIndex((t) => t.value.panel.id === effectivePanelIds[0]);\n const lastIdx = this._tabs.findIndex((t) => t.value.panel.id ===\n effectivePanelIds[effectivePanelIds.length - 1]);\n if (firstIdx === -1 || lastIdx === -1) {\n continue;\n }\n const isInsideRange = insertionIndex >= firstIdx && insertionIndex <= lastIdx;\n const isJustBeforeGroup = !isInsideRange && insertionIndex === firstIdx - 1;\n if (!isInsideRange && !isJustBeforeGroup) {\n continue;\n }\n if (isGroupDrag && isInsideRange) {\n // A group cannot be dropped inside another group.\n // Snap the insertion index to just before or just\n // after this group based on cursor position relative\n // to the group's midpoint. Only applies when the\n // insertion would land *inside* the group — for\n // `isJustBeforeGroup`, the index is already outside\n // (immediately left of the group) and is a valid\n // drop position, so leave it untouched (issue #1264).\n const groupMid = (firstIdx + lastIdx + 1) / 2;\n if (insertionIndex < groupMid) {\n insertionIndex = firstIdx;\n }\n else {\n insertionIndex = lastIdx + 1;\n }\n // targetTabGroupId stays null\n break;\n }\n if (isGroupDrag && isJustBeforeGroup) {\n // Cursor is just before the group — accept this\n // index as-is. Groups can be dropped at the slot\n // immediately left of another group's first tab.\n break;\n }\n if (isJustBeforeGroup) {\n // Check whether only the source tab (or source group\n // tabs) sits between insertionIndex and firstIdx.\n // If so, the source is being dragged away from that\n // slot, so we ARE effectively \"just before\" the group\n // and should still allow dropping into position 0.\n let allInBetweenAreSource = true;\n for (let j = insertionIndex; j < firstIdx; j++) {\n const pid = this._tabs[j].value.panel.id;\n if (pid !== this._animState.sourceTabId &&\n !(sourceGroupPanelIds === null || sourceGroupPanelIds === void 0 ? void 0 : sourceGroupPanelIds.has(pid))) {\n allInBetweenAreSource = false;\n break;\n }\n }\n if (!allInBetweenAreSource) {\n continue;\n }\n const chipWidth = (_c = this._animState.chipPositions.get(tg.id)) !== null && _c !== void 0 ? _c : 0;\n const threshold = tg.collapsed\n ? this._animState.containerLeft +\n accUpTo +\n chipWidth / 2\n : this._animState.containerLeft + accUpTo + chipWidth;\n if (mouseX >= threshold) {\n insertionIndex = firstIdx;\n targetTabGroupId = tg.id;\n }\n break;\n }\n if (isInsideRange) {\n const chipWidth = (_d = this._animState.chipPositions.get(tg.id)) !== null && _d !== void 0 ? _d : 0;\n const chipOriginalRight = this._animState.containerLeft + accUpTo + chipWidth;\n if (insertionIndex === firstIdx) {\n if (mouseX >= chipOriginalRight) {\n targetTabGroupId = tg.id;\n }\n }\n else {\n targetTabGroupId = tg.id;\n }\n break;\n }\n }\n }\n if (insertionIndex === this._animState.currentInsertionIndex &&\n targetTabGroupId === this._animState.targetTabGroupId) {\n return;\n }\n this._animState.currentInsertionIndex = insertionIndex;\n this._animState.targetTabGroupId = targetTabGroupId;\n if (((_e = this.accessor.options.theme) === null || _e === void 0 ? void 0 : _e.tabAnimation) === 'smooth') {\n this.applyDragOverTransforms();\n }\n }\n /**\n * Batch-remove a CSS class from multiple elements instantly,\n * forcing only a single reflow for the entire batch.\n */\n _removeClassInstantlyBatch(elements, cls) {\n const affected = [];\n for (const el of elements) {\n if (el.classList.contains(cls)) {\n el.style.transition = 'none';\n toggleClass(el, cls, false);\n affected.push(el);\n }\n }\n if (affected.length > 0) {\n void affected[0].offsetHeight; // single reflow for entire batch\n for (const el of affected) {\n el.style.removeProperty('transition');\n }\n }\n }\n /**\n * Remove `dv-tab--dragging` from the source tab instantly so it\n * regains its real width before FLIP snapshots.\n */\n _uncollapsSourceTab(sourceTabId) {\n const entry = this._tabMap.get(sourceTabId);\n if (entry) {\n this._removeClassInstantlyBatch([entry.value.element], 'dv-tab--dragging');\n }\n }\n applyDragOverTransforms(skipTransition = false) {\n if (!this._animState ||\n this._animState.currentInsertionIndex === null) {\n this.resetTabTransforms();\n return;\n }\n // Don't apply transforms until the source tab has been collapsed\n // in the rAF callback — otherwise the gap + visible source = jump.\n if (this._pendingCollapse) {\n return;\n }\n const insertionIndex = this._animState.currentInsertionIndex;\n // For group drags, gap = sum of all group member widths\n let gapWidth;\n const sourceGroupPanelIds = this._animState.sourceGroupPanelIds;\n if (this._animState.sourceTabGroupId && sourceGroupPanelIds) {\n gapWidth = this._animState.sourceGapWidth;\n }\n else {\n const sourceRect = this._animState.tabPositions.get(this._animState.sourceTabId);\n gapWidth = sourceRect\n ? sourceRect.width\n : this.getAverageTabWidth();\n }\n // When the insertion lands at or before a group's first tab, shift\n // the chip so the gap appears before the entire group.\n //\n // Two cases:\n // 1. targetTabGroupId is null (standalone drop) — always shift chip.\n // 2. targetTabGroupId is set AND the group is collapsed — shift chip\n // because the collapsed tabs are invisible, so putting the gap on\n // them has no visual effect.\n let chipToShift = null;\n if (this._tabGroupManager.chipRenderers.size > 0) {\n const tabGroups = this.group.model.getTabGroups();\n for (const tg of tabGroups) {\n if (tg.id === this._animState.sourceTabGroupId)\n continue;\n // Skip the group that the dragged tab belongs to — the\n // gap should appear after the chip (where the tab was),\n // not before it.\n if (tg.panelIds.includes(this._animState.sourceTabId))\n continue;\n const effectivePids = tg.panelIds.filter((pid) => pid !== this._animState.sourceTabId &&\n !(sourceGroupPanelIds === null || sourceGroupPanelIds === void 0 ? void 0 : sourceGroupPanelIds.has(pid)));\n if (effectivePids.length === 0)\n continue;\n const firstIdx = this._tabs.findIndex((t) => t.value.panel.id === effectivePids[0]);\n // Only consider chip-shifting when dropping outside the\n // group, or when dropping inside a collapsed group (whose\n // tabs are invisible).\n const shouldShiftChip = !this._animState.targetTabGroupId ||\n (this._animState.targetTabGroupId === tg.id &&\n tg.collapsed);\n if (!shouldShiftChip)\n continue;\n if (firstIdx >= insertionIndex) {\n let hasTabs = false;\n for (let j = insertionIndex; j < firstIdx; j++) {\n const pid = this._tabs[j].value.panel.id;\n if (pid === this._animState.sourceTabId)\n continue;\n if (sourceGroupPanelIds === null || sourceGroupPanelIds === void 0 ? void 0 : sourceGroupPanelIds.has(pid))\n continue;\n hasTabs = true;\n break;\n }\n if (!hasTabs) {\n const chipEntry = this._tabGroupManager.chipRenderers.get(tg.id);\n if (chipEntry) {\n chipToShift = chipEntry.chip.element;\n }\n }\n break;\n }\n }\n }\n // Helper: pick the correct shifting class for tabs vs chips.\n const shiftingClass = (el) => el.classList.contains('dv-tab-group-chip')\n ? 'dv-tab-group-chip--shifting'\n : 'dv-tab--shifting';\n // Helper: apply a margin-left value to an element, optionally\n // bypassing CSS transitions for instant positioning.\n const setMargin = (el, value) => {\n if (skipTransition) {\n el.style.transition = 'none';\n el.style.marginLeft = value;\n void el.offsetHeight;\n el.style.removeProperty('transition');\n }\n else {\n el.style.marginLeft = value;\n }\n toggleClass(el, shiftingClass(el), true);\n };\n const clearMargin = (el) => {\n const cls = shiftingClass(el);\n // Remove any previous pending listener for this element\n const prev = this._pendingMarginCleanups.get(el);\n if (prev) {\n prev();\n }\n if (skipTransition || !el.style.marginLeft) {\n el.style.removeProperty('margin-left');\n toggleClass(el, cls, false);\n }\n else {\n el.style.marginLeft = '0px';\n toggleClass(el, cls, true);\n const onEnd = () => {\n el.style.removeProperty('margin-left');\n toggleClass(el, cls, false);\n el.removeEventListener('transitionend', onEnd);\n clearTimeout(fallbackTimer);\n this._pendingMarginCleanups.delete(el);\n };\n // Fallback in case transitionend never fires\n // (e.g. element removed from DOM mid-transition)\n const fallbackTimer = setTimeout(onEnd, 300);\n this._pendingMarginCleanups.set(el, onEnd);\n el.addEventListener('transitionend', onEnd);\n }\n };\n let gapApplied = false;\n // Reset all non-source chip margins first\n for (const [groupId, entry] of this._tabGroupManager.chipRenderers) {\n if (groupId === this._animState.sourceTabGroupId)\n continue;\n clearMargin(entry.chip.element);\n }\n // Apply gap to chip if insertion is before a group\n if (chipToShift) {\n setMargin(chipToShift, `${gapWidth}px`);\n gapApplied = true;\n }\n for (let i = 0; i < this._tabs.length; i++) {\n const tab = this._tabs[i].value;\n if (tab.panel.id === this._animState.sourceTabId) {\n continue;\n }\n if (sourceGroupPanelIds === null || sourceGroupPanelIds === void 0 ? void 0 : sourceGroupPanelIds.has(tab.panel.id)) {\n continue;\n }\n if (!gapApplied && i >= insertionIndex) {\n setMargin(tab.element, `${gapWidth}px`);\n gapApplied = true;\n }\n else {\n clearMargin(tab.element);\n }\n }\n // Reposition underlines to follow shifted chips/tabs\n this._tabGroupManager.trackUnderlines();\n }\n resetTabTransforms() {\n // Cancel any pending margin transitionend listeners\n for (const [, cleanup] of this._pendingMarginCleanups) {\n cleanup();\n }\n this._pendingMarginCleanups.clear();\n for (const tab of this._tabs) {\n tab.value.element.style.removeProperty('margin-left');\n tab.value.element.style.removeProperty('margin-right');\n tab.value.element.style.removeProperty('margin-top');\n tab.value.element.style.removeProperty('margin-bottom');\n tab.value.element.style.removeProperty('transform');\n toggleClass(tab.value.element, 'dv-tab--shifting', false);\n }\n for (const [, entry] of this._tabGroupManager.chipRenderers) {\n entry.chip.element.style.removeProperty('margin-left');\n toggleClass(entry.chip.element, 'dv-tab-group-chip--shifting', false);\n }\n this._tabGroupManager.positionUnderlines();\n }\n /**\n * Commit a group-drag drop: clear drag classes, move the group\n * in the model, and run a FLIP animation.\n */\n _commitGroupMove(sourceTabGroupId, insertionIndex) {\n var _a, _b;\n // Read transfer data first.\n const data = getPanelData();\n // Synchronously dispose the source chip's drag sources, which\n // clears the panelTransfer payload + iframe shield. Cross-group\n // moves dissolve the source chip on a microtask, which is too\n // late: a synchronous `getPanelData()` after this method (or any\n // sibling dragover handler firing in the same tick) would\n // otherwise see stale data still referencing the old tabGroupId.\n this._tabGroupManager.disposeChipDrag(sourceTabGroupId);\n // Check if the tab group exists in this group (within-group reorder)\n // or in another group (cross-group move).\n const isLocal = this.group.model\n .getTabGroups()\n .some((tg) => tg.id === sourceTabGroupId);\n if (isLocal) {\n if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {\n this._clearGroupDragClasses(sourceTabGroupId);\n const firstPositions = this.snapshotTabPositions();\n this.resetTabTransforms();\n this.group.model.moveTabGroup(sourceTabGroupId, insertionIndex);\n this.runFlipAnimation(firstPositions, '', false);\n }\n else {\n this._tabGroupManager.skipNextCollapseAnimation = true;\n this.group.model.moveTabGroup(sourceTabGroupId, insertionIndex);\n }\n }\n else if (data) {\n // Cross-group: delegate to the component-level move which\n // handles panel transfer and tab group recreation.\n // Use the REAL tab group ID from transfer data, not the\n // potentially stale one from _animState.\n //\n // Clear any inline gap margin / shifting class applied to\n // destination tabs during dragover. Cross-group moves don't\n // run the FLIP path, and `moveGroupOrPanel` only inserts new\n // panels — it doesn't recreate existing destination tabs, so\n // their inline `margin-left` would otherwise persist as a\n // visible gap (issue #1243).\n this.resetTabTransforms();\n this.accessor.moveGroupOrPanel({\n from: {\n groupId: data.groupId,\n tabGroupId: (_b = data.tabGroupId) !== null && _b !== void 0 ? _b : sourceTabGroupId,\n },\n to: {\n group: this.group,\n position: 'center',\n index: insertionIndex,\n },\n });\n }\n }\n _clearGroupDragClasses(sourceTabGroupId) {\n const chipEntry = this._tabGroupManager.chipRenderers.get(sourceTabGroupId);\n if (chipEntry) {\n this._removeClassInstantlyBatch([chipEntry.chip.element], 'dv-tab-group-chip--dragging');\n }\n this._removeClassInstantlyBatch(this._tabs.map((t) => t.value.element), 'dv-tab--dragging');\n // Restore underline\n const underline = this._tabGroupManager.groupUnderlines.get(sourceTabGroupId);\n if (underline) {\n underline.style.removeProperty('display');\n }\n // The subsequent moveTabGroup will re-create tabs and call\n // updateTabGroups → _updateTabGroupClasses. For collapsed groups\n // the new tabs don't have dv-tab--group-collapsed yet, which\n // would trigger the collapse animation. Skip it.\n this._tabGroupManager.skipNextCollapseAnimation = true;\n }\n resetDragAnimation() {\n this._pendingCollapse = false;\n // After a drop, `tab.onDrop` consumes _animState (sets it to null)\n // and immediately calls `runFlipAnimation`, which sets transforms\n // and queues an rAF to trigger the CSS transition. dragend fires\n // synchronously on the source element BEFORE that rAF runs — if\n // we cleared transforms here we'd clobber the in-flight FLIP, so\n // gate the cleanup on _animState still being set (i.e. drag was\n // cancelled rather than dropped).\n if (this._animState) {\n this.resetTabTransforms();\n if (this._animState.sourceTabGroupId) {\n this._clearGroupDragClasses(this._animState.sourceTabGroupId);\n }\n else {\n this._removeClassInstantlyBatch(this._tabs.map((t) => t.value.element), 'dv-tab--dragging');\n }\n this._animState = null;\n // Restore any hidden underlines from group drags.\n for (const [, el] of this._tabGroupManager.groupUnderlines) {\n el.style.removeProperty('display');\n }\n }\n }\n runFlipAnimation(firstPositions, sourceTabId, isCrossGroup = false, animRange) {\n const isVertical = this._direction === 'vertical';\n let hasAnimation = false;\n for (let i = 0; i < this._tabs.length; i++) {\n const tab = this._tabs[i];\n const panelId = tab.value.panel.id;\n if (panelId === sourceTabId) {\n if (isCrossGroup) {\n // Newly inserted tab: slide in from the end\n const rect = tab.value.element.getBoundingClientRect();\n tab.value.element.style.transform = isVertical\n ? `translateY(${rect.height}px)`\n : `translateX(${rect.width}px)`;\n toggleClass(tab.value.element, 'dv-tab--shifting', true);\n hasAnimation = true;\n }\n continue;\n }\n // Skip tabs outside the affected range (they don't logically move)\n if (animRange !== undefined &&\n (i < animRange.from || i > animRange.to)) {\n continue;\n }\n const firstRect = firstPositions.get(panelId);\n if (!firstRect) {\n continue;\n }\n const lastRect = tab.value.element.getBoundingClientRect();\n const delta = isVertical\n ? firstRect.top - lastRect.top\n : firstRect.left - lastRect.left;\n if (Math.abs(delta) < 1) {\n continue;\n }\n tab.value.element.style.transform = isVertical\n ? `translateY(${delta}px)`\n : `translateX(${delta}px)`;\n toggleClass(tab.value.element, 'dv-tab--shifting', true);\n hasAnimation = true;\n }\n if (!hasAnimation) {\n return;\n }\n requestAnimationFrame(() => {\n var _a;\n for (const tab of this._tabs) {\n if (tab.value.element.style.transform) {\n tab.value.element.style.transform = '';\n }\n }\n // Track underlines during the FLIP transition so they\n // follow tabs as they slide to their final positions.\n this._tabGroupManager.trackUnderlines();\n // Clean up any previous flip transition listener\n (_a = this._flipTransitionCleanup) === null || _a === void 0 ? void 0 : _a.call(this);\n const onTransitionEnd = (event) => {\n if (event.propertyName === 'transform') {\n cleanup();\n for (const tab of this._tabs) {\n toggleClass(tab.value.element, 'dv-tab--shifting', false);\n }\n // Final reposition after animation settles\n this._tabGroupManager.positionUnderlines();\n }\n };\n const cleanup = () => {\n this._tabsList.removeEventListener('transitionend', onTransitionEnd);\n this._flipTransitionCleanup = null;\n };\n this._flipTransitionCleanup = cleanup;\n this._tabsList.addEventListener('transitionend', onTransitionEnd);\n });\n }\n}\n\nconst createSvgElementFromPath = (params) => {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'height', params.height);\n svg.setAttributeNS(null, 'width', params.width);\n svg.setAttributeNS(null, 'viewBox', params.viewbox);\n svg.setAttributeNS(null, 'aria-hidden', 'false');\n svg.setAttributeNS(null, 'focusable', 'false');\n svg.classList.add('dv-svg');\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path.setAttributeNS(null, 'd', params.path);\n svg.appendChild(path);\n return svg;\n};\nconst createCloseButton = () => createSvgElementFromPath({\n width: '11',\n height: '11',\n viewbox: '0 0 28 28',\n path: 'M2.1 27.3L0 25.2L11.55 13.65L0 2.1L2.1 0L13.65 11.55L25.2 0L27.3 2.1L15.75 13.65L27.3 25.2L25.2 27.3L13.65 15.75L2.1 27.3Z',\n});\nconst createExpandMoreButton = () => createSvgElementFromPath({\n width: '11',\n height: '11',\n viewbox: '0 0 24 15',\n path: 'M12 14.15L0 2.15L2.15 0L12 9.9L21.85 0.0499992L24 2.2L12 14.15Z',\n});\nconst createChevronRightButton = () => createSvgElementFromPath({\n width: '11',\n height: '11',\n viewbox: '0 0 15 25',\n path: 'M2.15 24.1L0 21.95L9.9 12.05L0 2.15L2.15 0L14.2 12.05L2.15 24.1Z',\n});\n\nfunction createDropdownElementHandle() {\n const el = document.createElement('div');\n el.className = 'dv-tabs-overflow-dropdown-default';\n const text = document.createElement('span');\n text.textContent = ``;\n const icon = createChevronRightButton();\n el.appendChild(icon);\n el.appendChild(text);\n return {\n element: el,\n update: (params) => {\n text.textContent = `${params.tabs}`;\n },\n };\n}\n\nclass TabsContainer extends CompositeDisposable {\n get onTabDragStart() {\n return this.tabs.onTabDragStart;\n }\n get panels() {\n return this.tabs.panels;\n }\n get size() {\n return this.tabs.size;\n }\n get hidden() {\n return this._hidden;\n }\n set hidden(value) {\n this._hidden = value;\n this.element.style.display = value ? 'none' : '';\n }\n get direction() {\n return this._direction;\n }\n set direction(value) {\n this._direction = value;\n if (value === 'vertical') {\n addClasses(this._element, 'dv-groupview-header-vertical');\n addClasses(this.rightActionsContainer, 'dv-right-actions-container-vertical');\n this.tabs.direction = value;\n }\n else {\n removeClasses(this._element, 'dv-groupview-header-vertical');\n removeClasses(this.rightActionsContainer, 'dv-right-actions-container-vertical');\n this.tabs.direction = value;\n }\n }\n get element() {\n return this._element;\n }\n constructor(accessor, group) {\n super();\n this.accessor = accessor;\n this.group = group;\n this._hidden = false;\n this._direction = 'horizontal';\n this.dropdownPart = null;\n this._overflowTabs = [];\n this._overflowTabGroups = [];\n this._dropdownDisposable = new MutableDisposable();\n this._onDrop = new Emitter();\n this.onDrop = this._onDrop.event;\n this._onGroupDragStart = new Emitter();\n this.onGroupDragStart = this._onGroupDragStart.event;\n this._onWillShowOverlay = new Emitter();\n this.onWillShowOverlay = this._onWillShowOverlay.event;\n this._element = document.createElement('div');\n this._element.className = 'dv-tabs-and-actions-container';\n toggleClass(this._element, 'dv-full-width-single-tab', this.accessor.options.singleTabMode === 'fullwidth');\n this.rightActionsContainer = document.createElement('div');\n this.rightActionsContainer.className = 'dv-right-actions-container';\n this.leftActionsContainer = document.createElement('div');\n this.leftActionsContainer.className = 'dv-left-actions-container';\n this.preActionsContainer = document.createElement('div');\n this.preActionsContainer.className = 'dv-pre-actions-container';\n this.tabs = new Tabs(group, accessor, {\n showTabsOverflowControl: !accessor.options.disableTabsOverflowList,\n });\n this.voidContainer = new VoidContainer(this.accessor, this.group);\n this.tabs.voidContainer = this.voidContainer.element;\n this._element.appendChild(this.preActionsContainer);\n this._element.appendChild(this.tabs.element);\n this._element.appendChild(this.leftActionsContainer);\n this._element.appendChild(this.voidContainer.element);\n this._element.appendChild(this.rightActionsContainer);\n this.tabs.setExtendedDropZone(this._element);\n this.addDisposables(this.tabs.onDrop((e) => this._onDrop.fire(e)), this.tabs.onWillShowOverlay((e) => this._onWillShowOverlay.fire(e)), accessor.onDidOptionsChange(() => {\n this.tabs.showTabsOverflowControl =\n !accessor.options.disableTabsOverflowList;\n }), this.tabs.onOverflowTabsChange((event) => {\n this.toggleDropdown(event);\n }), this.tabs, this._onWillShowOverlay, this._onDrop, this._onGroupDragStart, this.voidContainer, this.voidContainer.onDragStart((event) => {\n this._onGroupDragStart.fire({\n nativeEvent: event,\n group: this.group,\n });\n }), this.voidContainer.onDrop((event) => {\n // If an active group drag is in progress, let Tabs handle it\n if (this.tabs.handleVoidDrop()) {\n return;\n }\n this._onDrop.fire({\n event: event.nativeEvent,\n index: this.tabs.size,\n });\n }), this.voidContainer.onWillShowOverlay((event) => {\n this._onWillShowOverlay.fire(new DockviewWillShowOverlayLocationEvent(event, {\n kind: 'header_space',\n panel: this.group.activePanel,\n api: this.accessor.api,\n group: this.group,\n getData: getPanelData,\n }));\n }), addDisposableListener(this.leftActionsContainer, 'dragleave', (event) => {\n const related = event.relatedTarget;\n if (!this.leftActionsContainer.contains(related) &&\n !this._element.contains(related)) {\n // Left the header entirely\n this.tabs.clearExternalAnimState();\n }\n }), addDisposableListener(this.voidContainer.element, 'dragleave', (event) => {\n const related = event.relatedTarget;\n if (!this.voidContainer.element.contains(related)) {\n if (this._element.contains(related)) {\n // Moved to another part of the header — keep state\n this.tabs.setExternalInsertionIndex(null);\n }\n else {\n // Left the header entirely\n this.tabs.clearExternalAnimState();\n }\n }\n }), addDisposableListener(this.voidContainer.element, 'pointerdown', (event) => {\n if (event.defaultPrevented) {\n return;\n }\n const isFloatingGroupsEnabled = !this.accessor.options.disableFloatingGroups;\n if (isFloatingGroupsEnabled &&\n event.shiftKey &&\n this.group.api.location.type !== 'floating' &&\n this.group.api.location.type !== 'edge') {\n event.preventDefault();\n const { top, left } = this.element.getBoundingClientRect();\n const { top: rootTop, left: rootLeft } = this.accessor.element.getBoundingClientRect();\n this.accessor.addFloatingGroup(this.group, {\n x: left - rootLeft + 20,\n y: top - rootTop + 20,\n inDragMode: true,\n });\n }\n }));\n }\n show() {\n if (!this.hidden) {\n this.element.style.display = '';\n }\n }\n hide() {\n this._element.style.display = 'none';\n }\n setRightActionsElement(element) {\n if (this.rightActions === element) {\n return;\n }\n if (this.rightActions) {\n this.rightActions.remove();\n this.rightActions = undefined;\n }\n if (element) {\n this.rightActionsContainer.appendChild(element);\n this.rightActions = element;\n }\n }\n setLeftActionsElement(element) {\n if (this.leftActions === element) {\n return;\n }\n if (this.leftActions) {\n this.leftActions.remove();\n this.leftActions = undefined;\n }\n if (element) {\n this.leftActionsContainer.appendChild(element);\n this.leftActions = element;\n }\n }\n setPrefixActionsElement(element) {\n if (this.preActions === element) {\n return;\n }\n if (this.preActions) {\n this.preActions.remove();\n this.preActions = undefined;\n }\n if (element) {\n this.preActionsContainer.appendChild(element);\n this.preActions = element;\n }\n }\n isActive(tab) {\n return this.tabs.isActive(tab);\n }\n indexOf(id) {\n return this.tabs.indexOf(id);\n }\n setActive(_isGroupActive) {\n // noop\n }\n delete(id) {\n this.tabs.delete(id);\n this.updateClassnames();\n }\n setActivePanel(panel) {\n this.tabs.setActivePanel(panel);\n }\n openPanel(panel, index = this.tabs.size) {\n this.tabs.openPanel(panel, index);\n this.updateClassnames();\n }\n closePanel(panel) {\n this.delete(panel.id);\n }\n updateClassnames() {\n toggleClass(this._element, 'dv-single-tab', this.size === 1);\n }\n toggleDropdown(options) {\n const tabs = options.reset ? [] : options.tabs;\n const tabGroups = options.reset ? [] : options.tabGroups;\n this._overflowTabs = tabs;\n this._overflowTabGroups = tabGroups;\n const totalCount = this._overflowTabs.length;\n if (totalCount > 0 && this.dropdownPart) {\n this.dropdownPart.update({ tabs: totalCount });\n return;\n }\n if (totalCount === 0) {\n this._dropdownDisposable.dispose();\n return;\n }\n const root = document.createElement('div');\n root.className = 'dv-tabs-overflow-dropdown-root';\n const part = createDropdownElementHandle();\n part.update({ tabs: totalCount });\n this.dropdownPart = part;\n root.appendChild(part.element);\n this.rightActionsContainer.prepend(root);\n this._dropdownDisposable.value = new CompositeDisposable(Disposable.from(() => {\n var _a, _b;\n root.remove();\n (_b = (_a = this.dropdownPart) === null || _a === void 0 ? void 0 : _a.dispose) === null || _b === void 0 ? void 0 : _b.call(_a);\n this.dropdownPart = null;\n }), addDisposableListener(root, 'pointerdown', (event) => {\n event.preventDefault();\n }, { capture: true }), addDisposableListener(root, 'click', (event) => {\n const el = document.createElement('div');\n el.style.overflow = 'auto';\n el.className = 'dv-tabs-overflow-container';\n // Build lookup: panelId → tabGroup for overflow groups\n const overflowGroupSet = new Set(this._overflowTabGroups);\n const allTabGroups = this.group.model.getTabGroups();\n const panelToGroup = new Map();\n for (const tg of allTabGroups) {\n if (overflowGroupSet.has(tg.id)) {\n for (const pid of tg.panelIds) {\n panelToGroup.set(pid, tg);\n }\n }\n }\n // Track which groups have already been rendered\n const renderedGroups = new Set();\n for (const tab of this.tabs.tabs.filter((tab) => this._overflowTabs.includes(tab.panel.id))) {\n const tg = panelToGroup.get(tab.panel.id);\n // If this tab belongs to an overflow group, render the\n // group header before its first member tab.\n if (tg && !renderedGroups.has(tg.id)) {\n renderedGroups.add(tg.id);\n const groupHeader = document.createElement('div');\n groupHeader.className = 'dv-tabs-overflow-group-header';\n const colorDot = document.createElement('span');\n colorDot.className = 'dv-tabs-overflow-group-color';\n applyTabGroupAccent(colorDot, tg.color, this.accessor.tabGroupColorPalette);\n groupHeader.appendChild(colorDot);\n const labelSpan = document.createElement('span');\n labelSpan.className = 'dv-tabs-overflow-group-label';\n labelSpan.textContent = tg.label || tg.id;\n groupHeader.appendChild(labelSpan);\n if (tg.collapsed) {\n const badge = document.createElement('span');\n badge.className =\n 'dv-tabs-overflow-group-collapsed-badge';\n badge.textContent = `${tg.panelIds.length}`;\n groupHeader.appendChild(badge);\n }\n groupHeader.addEventListener('click', () => {\n this.accessor\n .getPopupServiceForGroup(this.group)\n .close();\n if (tg.collapsed) {\n tg.expand();\n }\n // Activate the first panel in the group\n const firstPanelId = tg.panelIds[0];\n if (firstPanelId) {\n const panel = this.group.panels.find((p) => p.id === firstPanelId);\n panel === null || panel === void 0 ? void 0 : panel.api.setActive();\n }\n });\n el.appendChild(groupHeader);\n }\n const panelObject = this.group.panels.find((panel) => panel === tab.panel);\n const tabComponent = panelObject.view.createTabRenderer('headerOverflow');\n const child = tabComponent.element;\n const wrapper = document.createElement('div');\n toggleClass(wrapper, 'dv-tab', true);\n toggleClass(wrapper, 'dv-active-tab', panelObject.api.isActive);\n toggleClass(wrapper, 'dv-inactive-tab', !panelObject.api.isActive);\n if (tg) {\n toggleClass(wrapper, 'dv-tab--grouped', true);\n }\n wrapper.addEventListener('click', (event) => {\n this.accessor\n .getPopupServiceForGroup(this.group)\n .close();\n if (event.defaultPrevented) {\n return;\n }\n if (tg === null || tg === void 0 ? void 0 : tg.collapsed) {\n tg.expand();\n }\n tab.element.scrollIntoView();\n tab.panel.api.setActive();\n });\n wrapper.appendChild(child);\n el.appendChild(wrapper);\n }\n const relativeParent = findRelativeZIndexParent(root);\n this.accessor\n .getPopupServiceForGroup(this.group)\n .openPopover(el, {\n x: event.clientX,\n y: event.clientY,\n zIndex: (relativeParent === null || relativeParent === void 0 ? void 0 : relativeParent.style.zIndex)\n ? `calc(${relativeParent.style.zIndex} * 2)`\n : undefined,\n });\n }));\n }\n updateDragAndDropState() {\n this.tabs.updateDragAndDropState();\n this.voidContainer.updateDragAndDropState();\n }\n updateTabGroups() {\n this.tabs.updateTabGroups();\n }\n refreshTabGroupAccent() {\n this.tabs.refreshTabGroupAccent();\n }\n}\n\nclass DockviewUnhandledDragOverEvent extends AcceptableEvent {\n constructor(nativeEvent, target, position, getData, group) {\n super();\n this.nativeEvent = nativeEvent;\n this.target = target;\n this.position = position;\n this.getData = getData;\n this.group = group;\n }\n}\nconst PROPERTY_KEYS_DOCKVIEW = (() => {\n /**\n * by readong the keys from an empty value object TypeScript will error\n * when we add or remove new properties to `DockviewOptions`\n */\n const properties = {\n disableAutoResizing: undefined,\n hideBorders: undefined,\n singleTabMode: undefined,\n disableFloatingGroups: undefined,\n floatingGroupBounds: undefined,\n popoutUrl: undefined,\n nonce: undefined,\n defaultRenderer: undefined,\n defaultHeaderPosition: undefined,\n debug: undefined,\n rootOverlayModel: undefined,\n locked: undefined,\n disableDnd: undefined,\n dndStrategy: undefined,\n className: undefined,\n noPanelsOverlay: undefined,\n dndEdges: undefined,\n theme: undefined,\n disableTabsOverflowList: undefined,\n scrollbars: undefined,\n getTabContextMenuItems: undefined,\n getTabGroupChipContextMenuItems: undefined,\n createTabGroupChipComponent: undefined,\n createGroupDragGhostComponent: undefined,\n tabGroupColors: undefined,\n tabGroupAccent: undefined,\n };\n return Object.keys(properties);\n})();\nfunction isPanelOptionsWithPanel(data) {\n if (data.referencePanel) {\n return true;\n }\n return false;\n}\nfunction isPanelOptionsWithGroup(data) {\n if (data.referenceGroup) {\n return true;\n }\n return false;\n}\nfunction isGroupOptionsWithPanel(data) {\n if (data.referencePanel) {\n return true;\n }\n return false;\n}\nfunction isGroupOptionsWithGroup(data) {\n if (data.referenceGroup) {\n return true;\n }\n return false;\n}\n\nclass TabGroup extends CompositeDisposable {\n get label() {\n return this._label;\n }\n get color() {\n return this._color;\n }\n get componentParams() {\n return this._componentParams;\n }\n setLabel(value) {\n if (this.isDisposed || this._label === value) {\n return;\n }\n this._label = value;\n this._onDidChange.fire();\n }\n setColor(value) {\n if (this.isDisposed) {\n return;\n }\n const next = value === '' ? undefined : value;\n if (this._color === next) {\n return;\n }\n this._color = next;\n this._onDidChange.fire();\n }\n setComponentParams(value) {\n if (this.isDisposed) {\n return;\n }\n this._componentParams = value;\n this._onDidChange.fire();\n }\n get collapsed() {\n return this._collapsed;\n }\n get panelIds() {\n return this._panelIds;\n }\n get size() {\n return this._panelIds.length;\n }\n get isEmpty() {\n return this._panelIds.length === 0;\n }\n constructor(id, options) {\n var _a, _b;\n super();\n this.id = id;\n this._collapsed = false;\n this._panelIds = [];\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this._onDidPanelChange = new Emitter();\n this.onDidPanelChange = this._onDidPanelChange.event;\n this._onDidCollapseChange = new Emitter();\n this.onDidCollapseChange = this._onDidCollapseChange.event;\n this._onDidDestroy = new Emitter();\n this.onDidDestroy = this._onDidDestroy.event;\n this._label = (_a = options === null || options === void 0 ? void 0 : options.label) !== null && _a !== void 0 ? _a : '';\n this._color = (options === null || options === void 0 ? void 0 : options.color) === '' ? undefined : options === null || options === void 0 ? void 0 : options.color;\n this._collapsed = (_b = options === null || options === void 0 ? void 0 : options.collapsed) !== null && _b !== void 0 ? _b : false;\n this._componentParams = options === null || options === void 0 ? void 0 : options.componentParams;\n this.addDisposables(this._onDidChange, this._onDidPanelChange, this._onDidCollapseChange, this._onDidDestroy);\n }\n addPanel(panelId, index) {\n if (this.isDisposed) {\n return;\n }\n if (this._panelIds.includes(panelId)) {\n return;\n }\n const insertIndex = index !== undefined\n ? Math.max(0, Math.min(index, this._panelIds.length))\n : this._panelIds.length;\n this._panelIds.splice(insertIndex, 0, panelId);\n this._onDidPanelChange.fire({ panelId, type: 'add' });\n }\n removePanel(panelId) {\n if (this.isDisposed) {\n return false;\n }\n const index = this._panelIds.indexOf(panelId);\n if (index === -1) {\n return false;\n }\n this._panelIds.splice(index, 1);\n this._onDidPanelChange.fire({ panelId, type: 'remove' });\n return true;\n }\n indexOfPanel(panelId) {\n return this._panelIds.indexOf(panelId);\n }\n containsPanel(panelId) {\n return this._panelIds.includes(panelId);\n }\n collapse() {\n if (this.isDisposed || this._collapsed) {\n return;\n }\n this._collapsed = true;\n this._onDidCollapseChange.fire(true);\n }\n expand() {\n if (this.isDisposed || !this._collapsed) {\n return;\n }\n this._collapsed = false;\n this._onDidCollapseChange.fire(false);\n }\n toggle() {\n if (this._collapsed) {\n this.expand();\n }\n else {\n this.collapse();\n }\n }\n toJSON() {\n const result = {\n id: this.id,\n collapsed: this._collapsed,\n panelIds: [...this._panelIds],\n };\n if (this._label) {\n result.label = this._label;\n }\n if (this._color !== undefined) {\n result.color = this._color;\n }\n if (this._componentParams !== undefined) {\n result.componentParams = this._componentParams;\n }\n return result;\n }\n dispose() {\n this._onDidDestroy.fire();\n super.dispose();\n }\n}\n\nclass DockviewDidDropEvent extends DockviewEvent {\n /**\n * `PointerEvent` for touch drags has no `dataTransfer`; use\n * `getData()` for the dockview payload regardless of input method.\n */\n get nativeEvent() {\n return this.options.nativeEvent;\n }\n get position() {\n return this.options.position;\n }\n get panel() {\n return this.options.panel;\n }\n get group() {\n return this.options.group;\n }\n get api() {\n return this.options.api;\n }\n constructor(options) {\n super();\n this.options = options;\n }\n getData() {\n return this.options.getData();\n }\n}\nclass DockviewWillDropEvent extends DockviewDidDropEvent {\n get kind() {\n return this._kind;\n }\n constructor(options) {\n super(options);\n this._kind = options.kind;\n }\n}\nclass DockviewGroupPanelModel extends CompositeDisposable {\n get tabGroups() {\n return this._tabGroups;\n }\n get element() {\n throw new Error('dockview: not supported');\n }\n get activePanel() {\n return this._activePanel;\n }\n get locked() {\n return this._locked;\n }\n set locked(value) {\n this._locked = value;\n toggleClass(this.container, 'dv-locked-groupview', value === 'no-drop-target' || value);\n }\n get isActive() {\n return this._isGroupActive;\n }\n get panels() {\n return this._panels;\n }\n get size() {\n return this._panels.length;\n }\n get isEmpty() {\n return this._panels.length === 0;\n }\n get hasWatermark() {\n return !!(this.watermark && this.container.contains(this.watermark.element));\n }\n get header() {\n return this.tabsContainer;\n }\n get isContentFocused() {\n if (!document.activeElement) {\n return false;\n }\n return isAncestor(document.activeElement, this.contentContainer.element);\n }\n get headerPosition() {\n var _a;\n return (_a = this._headerPosition) !== null && _a !== void 0 ? _a : 'top';\n }\n set headerPosition(value) {\n var _a;\n this._headerPosition = value;\n removeClasses(this.container, 'dv-groupview-header-top', 'dv-groupview-header-bottom', 'dv-groupview-header-left', 'dv-groupview-header-right');\n addClasses(this.container, `dv-groupview-header-${value}`);\n const direction = value === 'top' || value === 'bottom' ? 'horizontal' : 'vertical';\n this.tabsContainer.direction = direction;\n this.header.direction = direction;\n // resize the active panel to fit the new header direction\n // if not, the panel will overflow the tabs container\n if ((_a = this._activePanel) === null || _a === void 0 ? void 0 : _a.layout) {\n this._activePanel.layout(this._width, this._height);\n }\n if (this._leftHeaderActions ||\n this._rightHeaderActions ||\n this._prefixHeaderActions) {\n this.updateHeaderActions();\n }\n }\n get location() {\n return this._location;\n }\n set location(value) {\n this._location = value;\n toggleClass(this.container, 'dv-groupview-floating', false);\n toggleClass(this.container, 'dv-groupview-popout', false);\n toggleClass(this.container, 'dv-groupview-edge', false);\n // Mouse and touch drop targets must agree on accepted zones.\n const applyZones = (zones) => {\n this.contentContainer.dropTarget.setTargetZones(zones);\n this.contentContainer.pointerDropTarget.setTargetZones(zones);\n };\n switch (value.type) {\n case 'grid':\n applyZones(['top', 'bottom', 'left', 'right', 'center']);\n break;\n case 'floating':\n applyZones(['center']);\n applyZones(value\n ? ['center']\n : ['top', 'bottom', 'left', 'right', 'center']);\n toggleClass(this.container, 'dv-groupview-floating', true);\n break;\n case 'popout':\n applyZones(['center']);\n toggleClass(this.container, 'dv-groupview-popout', true);\n break;\n case 'edge':\n applyZones(['center']);\n toggleClass(this.container, 'dv-groupview-edge', true);\n break;\n }\n this.groupPanel.api._onDidLocationChange.fire({\n location: this.location,\n });\n }\n constructor(container, accessor, id, options, groupPanel) {\n var _a, _b;\n super();\n this.container = container;\n this.accessor = accessor;\n this.id = id;\n this.options = options;\n this.groupPanel = groupPanel;\n this._isGroupActive = false;\n this._locked = false;\n this._rightHeaderActionsDisposable = new MutableDisposable();\n this._leftHeaderActionsDisposable = new MutableDisposable();\n this._prefixHeaderActionsDisposable = new MutableDisposable();\n this._location = { type: 'grid' };\n this.mostRecentlyUsed = [];\n this._overwriteRenderContainer = null;\n this._overwriteDropTargetContainer = null;\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this._width = 0;\n this._height = 0;\n this._panels = [];\n this._panelDisposables = new Map();\n this._tabGroupDisposables = new Map();\n this._pendingMicrotaskDisposables = new Set();\n this._onMove = new Emitter();\n this.onMove = this._onMove.event;\n this._onDidDrop = new Emitter();\n this.onDidDrop = this._onDidDrop.event;\n this._onWillDrop = new Emitter();\n this.onWillDrop = this._onWillDrop.event;\n this._onWillShowOverlay = new Emitter();\n this.onWillShowOverlay = this._onWillShowOverlay.event;\n this._onTabDragStart = new Emitter();\n this.onTabDragStart = this._onTabDragStart.event;\n this._onGroupDragStart = new Emitter();\n this.onGroupDragStart = this._onGroupDragStart.event;\n this._onDidAddPanel = new Emitter();\n this.onDidAddPanel = this._onDidAddPanel.event;\n this._onDidPanelTitleChange = new Emitter();\n this.onDidPanelTitleChange = this._onDidPanelTitleChange.event;\n this._onDidPanelParametersChange = new Emitter();\n this.onDidPanelParametersChange = this._onDidPanelParametersChange.event;\n this._onDidRemovePanel = new Emitter();\n this.onDidRemovePanel = this._onDidRemovePanel.event;\n this._onDidActivePanelChange = new Emitter();\n this.onDidActivePanelChange = this._onDidActivePanelChange.event;\n this._onUnhandledDragOverEvent = new Emitter();\n this.onUnhandledDragOverEvent = this._onUnhandledDragOverEvent.event;\n this._tabGroups = [];\n this._tabGroupMap = new Map();\n this._panelToTabGroup = new Map();\n this._tabGroupIdCounter = 0;\n this._pendingTabGroupUpdate = false;\n this._onDidCreateTabGroup = new Emitter();\n this.onDidCreateTabGroup = this._onDidCreateTabGroup.event;\n this._onDidDestroyTabGroup = new Emitter();\n this.onDidDestroyTabGroup = this._onDidDestroyTabGroup.event;\n this._onDidAddPanelToTabGroup = new Emitter();\n this.onDidAddPanelToTabGroup = this._onDidAddPanelToTabGroup.event;\n this._onDidRemovePanelFromTabGroup = new Emitter();\n this.onDidRemovePanelFromTabGroup = this._onDidRemovePanelFromTabGroup.event;\n this._onDidTabGroupChange = new Emitter();\n this.onDidTabGroupChange = this._onDidTabGroupChange.event;\n this._onDidTabGroupCollapsedChange = new Emitter();\n this.onDidTabGroupCollapsedChange = this._onDidTabGroupCollapsedChange.event;\n toggleClass(this.container, 'dv-groupview', true);\n this._api = new DockviewApi(this.accessor);\n this.tabsContainer = new TabsContainer(this.accessor, this.groupPanel);\n this.contentContainer = new ContentContainer(this.accessor, this);\n container.append(this.tabsContainer.element, this.contentContainer.element);\n this.header.hidden = !!options.hideHeader;\n this.locked = (_a = options.locked) !== null && _a !== void 0 ? _a : false;\n this.headerPosition =\n (_b = options.headerPosition) !== null && _b !== void 0 ? _b : accessor.defaultHeaderPosition;\n this.addDisposables(this._onTabDragStart, this._onGroupDragStart, this._onWillShowOverlay, this._rightHeaderActionsDisposable, this._leftHeaderActionsDisposable, this._prefixHeaderActionsDisposable, this.tabsContainer.onTabDragStart((event) => {\n this._onTabDragStart.fire(event);\n }), this.tabsContainer.onGroupDragStart((event) => {\n this._onGroupDragStart.fire(event);\n }), this.tabsContainer.onDrop((event) => {\n var _a;\n // Capture panel data before handleDropEvent (which may trigger moves)\n const dragData = getPanelData();\n const draggedPanelId = (_a = dragData === null || dragData === void 0 ? void 0 : dragData.panelId) !== null && _a !== void 0 ? _a : null;\n this.handleDropEvent('header', event.event, 'center', event.index);\n // Update tab group membership after the move completes\n if (draggedPanelId && event.targetTabGroupId) {\n // Compute the local index within the target tab group\n // from the global panel index so the panel is inserted\n // at the correct position, not just appended.\n const tabGroup = this._tabGroupMap.get(event.targetTabGroupId);\n let localIndex;\n if (tabGroup) {\n const globalIdx = this._panels.findIndex((p) => p.id === draggedPanelId);\n if (globalIdx !== -1) {\n // Count how many of this group's panels\n // appear before the dragged panel\n localIndex = 0;\n for (const pid of tabGroup.panelIds) {\n const pidIdx = this._panels.findIndex((p) => p.id === pid);\n if (pidIdx < globalIdx) {\n localIndex++;\n }\n }\n }\n }\n this.addPanelToTabGroup(event.targetTabGroupId, draggedPanelId, localIndex);\n }\n else if (draggedPanelId && event.targetTabGroupId === null) {\n // Dropped outside any group — remove from current group\n this.removePanelFromTabGroup(draggedPanelId);\n }\n }), this.contentContainer.onDidFocus(() => {\n this.accessor.doSetGroupActive(this.groupPanel);\n }), this.contentContainer.onDidBlur(() => {\n // noop\n }), this.contentContainer.dropTarget.onDrop((event) => {\n this.handleDropEvent('content', event.nativeEvent, event.position);\n }), this.contentContainer.pointerDropTarget.onDrop((event) => {\n this.handleDropEvent('content', event.nativeEvent, event.position);\n }), this.tabsContainer.onWillShowOverlay((event) => {\n this._onWillShowOverlay.fire(event);\n }), this.contentContainer.dropTarget.onWillShowOverlay((event) => {\n this._onWillShowOverlay.fire(new DockviewWillShowOverlayLocationEvent(event, {\n kind: 'content',\n panel: this.activePanel,\n api: this._api,\n group: this.groupPanel,\n getData: getPanelData,\n }));\n }), this.contentContainer.pointerDropTarget.onWillShowOverlay((event) => {\n this._onWillShowOverlay.fire(new DockviewWillShowOverlayLocationEvent(event, {\n kind: 'content',\n panel: this.activePanel,\n api: this._api,\n group: this.groupPanel,\n getData: getPanelData,\n }));\n }), this._onMove, this._onDidChange, this._onDidDrop, this._onWillDrop, this._onDidAddPanel, this._onDidRemovePanel, this._onDidActivePanelChange, this._onUnhandledDragOverEvent, this._onDidPanelTitleChange, this._onDidPanelParametersChange, this._onDidCreateTabGroup, this._onDidDestroyTabGroup, this._onDidAddPanelToTabGroup, this._onDidRemovePanelFromTabGroup, this._onDidTabGroupChange, this._onDidTabGroupCollapsedChange, this._onDidCreateTabGroup.event(() => {\n this._scheduleTabGroupUpdate();\n }), this._onDidDestroyTabGroup.event(() => {\n this._scheduleTabGroupUpdate();\n }), this._onDidAddPanelToTabGroup.event(() => {\n this._scheduleTabGroupUpdate();\n }), this._onDidRemovePanelFromTabGroup.event(() => {\n this._scheduleTabGroupUpdate();\n }), this._onDidTabGroupChange.event(() => {\n this._scheduleTabGroupUpdate();\n }), this._onDidTabGroupCollapsedChange.event(() => {\n this._scheduleTabGroupUpdate();\n }));\n }\n _scheduleTabGroupUpdate() {\n if (this._pendingTabGroupUpdate) {\n return;\n }\n this._pendingTabGroupUpdate = true;\n queueMicrotask(() => {\n this._pendingTabGroupUpdate = false;\n if (!this.isDisposed) {\n this.tabsContainer.updateTabGroups();\n }\n });\n }\n createTabGroup(options) {\n var _a;\n const id = (_a = options === null || options === void 0 ? void 0 : options.id) !== null && _a !== void 0 ? _a : `tg-${this.id}-${this._tabGroupIdCounter++}`;\n const tabGroup = new TabGroup(id, {\n label: options === null || options === void 0 ? void 0 : options.label,\n color: options === null || options === void 0 ? void 0 : options.color,\n collapsed: options === null || options === void 0 ? void 0 : options.collapsed,\n componentParams: options === null || options === void 0 ? void 0 : options.componentParams,\n });\n this._tabGroups.push(tabGroup);\n this._tabGroupMap.set(id, tabGroup);\n this._tabGroupDisposables.set(id, new CompositeDisposable(tabGroup.onDidChange(() => {\n this._onDidTabGroupChange.fire({ tabGroup });\n }), tabGroup.onDidCollapseChange((isCollapsed) => {\n if (isCollapsed) {\n this._handleGroupCollapse(tabGroup);\n }\n else {\n this._handleGroupExpand(tabGroup);\n }\n this._onDidTabGroupCollapsedChange.fire({\n tabGroup,\n });\n }), tabGroup.onDidDestroy(() => {\n this._removeTabGroupInternal(tabGroup);\n })));\n this._onDidCreateTabGroup.fire({ tabGroup });\n return tabGroup;\n }\n dissolveTabGroup(tabGroupId) {\n const tabGroup = this._tabGroupMap.get(tabGroupId);\n if (!tabGroup) {\n return;\n }\n // Remove all panels from the group (they stay in the flat panel list)\n const panelIds = [...tabGroup.panelIds];\n for (const panelId of panelIds) {\n tabGroup.removePanel(panelId);\n this._panelToTabGroup.delete(panelId);\n this._onDidRemovePanelFromTabGroup.fire({ tabGroup, panelId });\n }\n tabGroup.dispose();\n }\n addPanelToTabGroup(tabGroupId, panelId, index) {\n const tabGroup = this._tabGroupMap.get(tabGroupId);\n if (!tabGroup) {\n return;\n }\n // Ensure the panel actually exists in this group model\n if (!this._panels.some((p) => p.id === panelId)) {\n return;\n }\n // Remove from any existing group first\n const existingGroup = this.getTabGroupForPanel(panelId);\n if (existingGroup) {\n if (existingGroup.id === tabGroupId) {\n return; // already in this group\n }\n this.removePanelFromTabGroup(panelId);\n }\n tabGroup.addPanel(panelId, index);\n this._panelToTabGroup.set(panelId, tabGroup);\n // Enforce contiguity: move the panel in the flat _panels array\n // to the correct global position matching its group-local index\n this._enforceContiguity(tabGroup, panelId);\n this._onDidAddPanelToTabGroup.fire({ tabGroup, panelId });\n }\n /**\n * Move a panel to a new index within its tab group.\n * Updates both the group's panelIds order and the flat _panels array.\n */\n movePanelWithinGroup(tabGroupId, panelId, newIndex) {\n const tabGroup = this._tabGroupMap.get(tabGroupId);\n if (!tabGroup || !tabGroup.containsPanel(panelId)) {\n return;\n }\n // Remove and re-add at new index within the group\n tabGroup.removePanel(panelId);\n tabGroup.addPanel(panelId, newIndex);\n // Re-enforce contiguity in the flat array\n this._enforceContiguity(tabGroup, panelId);\n this.tabsContainer.updateTabGroups();\n }\n /**\n * Move a panel from one tab group to another.\n */\n movePanelBetweenGroups(sourcePanelId, targetTabGroupId, targetIndex) {\n const sourceGroup = this._findTabGroupForPanel(sourcePanelId);\n const targetGroup = this._tabGroupMap.get(targetTabGroupId);\n if (!targetGroup) {\n return;\n }\n if (sourceGroup) {\n sourceGroup.removePanel(sourcePanelId);\n this._panelToTabGroup.delete(sourcePanelId);\n this._onDidRemovePanelFromTabGroup.fire({\n tabGroup: sourceGroup,\n panelId: sourcePanelId,\n });\n // Auto-destroy empty source group\n if (sourceGroup.isEmpty) {\n sourceGroup.dispose();\n }\n }\n targetGroup.addPanel(sourcePanelId, targetIndex);\n this._panelToTabGroup.set(sourcePanelId, targetGroup);\n this._enforceContiguity(targetGroup, sourcePanelId);\n this._onDidAddPanelToTabGroup.fire({\n tabGroup: targetGroup,\n panelId: sourcePanelId,\n });\n }\n /**\n * Move an entire tab group to a new position in the tab bar.\n * The group's internal panel order is preserved.\n */\n moveTabGroup(tabGroupId, targetIndex) {\n const tabGroup = this._tabGroupMap.get(tabGroupId);\n if (!tabGroup || tabGroup.panelIds.length === 0) {\n return;\n }\n // Collect group panels in their current order\n const groupPanelIds = new Set(tabGroup.panelIds);\n const groupPanels = tabGroup.panelIds\n .map((pid) => this._panels.find((p) => p.id === pid))\n .filter((p) => p !== undefined);\n if (groupPanels.length === 0) {\n return;\n }\n // Count how many group panels sit before the target index so\n // we can compensate after removing them from the array.\n let groupPanelsBefore = 0;\n for (let i = 0; i < Math.min(targetIndex, this._panels.length); i++) {\n if (groupPanelIds.has(this._panels[i].id)) {\n groupPanelsBefore++;\n }\n }\n // Remove group panels from the flat array\n for (const panel of groupPanels) {\n const idx = this._panels.indexOf(panel);\n if (idx !== -1) {\n this._panels.splice(idx, 1);\n }\n }\n // Adjust target index to account for removed panels\n const adjustedIndex = targetIndex - groupPanelsBefore;\n // Clamp target index to valid range after removal\n const insertAt = Math.max(0, Math.min(adjustedIndex, this._panels.length));\n // Insert group panels at the target position\n this._panels.splice(insertAt, 0, ...groupPanels);\n // Rebuild the tabs container to match new order\n for (const panel of this._panels) {\n this.tabsContainer.delete(panel.id);\n }\n for (let i = 0; i < this._panels.length; i++) {\n this.tabsContainer.openPanel(this._panels[i], i);\n }\n this.tabsContainer.updateTabGroups();\n }\n /**\n * Ensure a panel is at the correct global index in _panels\n * to maintain contiguity of its tab group members.\n */\n _enforceContiguity(tabGroup, panelId) {\n const panel = this._panels.find((p) => p.id === panelId);\n if (!panel) {\n return;\n }\n const localIndex = tabGroup.indexOfPanel(panelId);\n const globalIndex = this._computeGlobalIndex(tabGroup, localIndex);\n const currentIndex = this._panels.indexOf(panel);\n if (currentIndex === globalIndex) {\n return;\n }\n // Move panel in the flat array\n this._panels.splice(currentIndex, 1);\n const adjustedIndex = globalIndex > currentIndex ? globalIndex - 1 : globalIndex;\n this._panels.splice(adjustedIndex, 0, panel);\n // Reorder in the tabs container to match\n this.tabsContainer.delete(panelId);\n this.tabsContainer.openPanel(panel, adjustedIndex);\n }\n /**\n * Compute the global index in _panels for a group-local index.\n * Finds where the group's panels start in the flat array and offsets.\n */\n _computeGlobalIndex(tabGroup, localIndex) {\n const groupPanelIds = tabGroup.panelIds;\n if (groupPanelIds.length <= 1) {\n // Only one panel (the one being added), keep current position\n const panel = this._panels.find((p) => p.id === groupPanelIds[0]);\n return panel ? this._panels.indexOf(panel) : this._panels.length;\n }\n // Find the first existing group member (other than the one at localIndex)\n // to anchor the group position\n for (let i = 0; i < groupPanelIds.length; i++) {\n if (i === localIndex) {\n continue;\n }\n const existingPanel = this._panels.find((p) => p.id === groupPanelIds[i]);\n if (existingPanel) {\n const existingGlobalIndex = this._panels.indexOf(existingPanel);\n // Offset based on relative position within group\n return Math.max(0, existingGlobalIndex + (localIndex - i));\n }\n }\n return this._panels.length;\n }\n removePanelFromTabGroup(panelId) {\n const tabGroup = this._findTabGroupForPanel(panelId);\n if (!tabGroup) {\n return;\n }\n tabGroup.removePanel(panelId);\n this._panelToTabGroup.delete(panelId);\n this._onDidRemovePanelFromTabGroup.fire({ tabGroup, panelId });\n // Auto-destroy empty groups\n if (tabGroup.isEmpty) {\n tabGroup.dispose();\n }\n }\n getTabGroups() {\n return this._tabGroups;\n }\n updateTabGroups() {\n this.tabsContainer.updateTabGroups();\n }\n refreshTabGroupAccent() {\n this.tabsContainer.refreshTabGroupAccent();\n }\n refreshWatermark() {\n var _a, _b;\n if (this.watermark) {\n this.watermark.element.remove();\n (_b = (_a = this.watermark).dispose) === null || _b === void 0 ? void 0 : _b.call(_a);\n this.watermark = undefined;\n }\n this.updateContainer();\n }\n getTabGroupForPanel(panelId) {\n return this._findTabGroupForPanel(panelId);\n }\n _findTabGroupForPanel(panelId) {\n return this._panelToTabGroup.get(panelId);\n }\n _removeTabGroupInternal(tabGroup) {\n const index = this._tabGroups.indexOf(tabGroup);\n if (index !== -1) {\n this._tabGroups.splice(index, 1);\n this._tabGroupMap.delete(tabGroup.id);\n for (const panelId of tabGroup.panelIds) {\n this._panelToTabGroup.delete(panelId);\n }\n this._onDidDestroyTabGroup.fire({ tabGroup });\n // Dispose the external listeners (onDidChange, onDidCollapseChange)\n // we registered on this group. We cannot dispose synchronously\n // here because this method runs inside the onDidDestroy fire\n // loop — disposing the CompositeDisposable that holds the\n // onDidDestroy subscription would splice listeners mid-iteration.\n // Schedule cleanup on the next microtask instead.\n const tabGroupDisposable = this._tabGroupDisposables.get(tabGroup.id);\n this._tabGroupDisposables.delete(tabGroup.id);\n if (tabGroupDisposable) {\n this._pendingMicrotaskDisposables.add(tabGroupDisposable);\n queueMicrotask(() => {\n this._pendingMicrotaskDisposables.delete(tabGroupDisposable);\n tabGroupDisposable.dispose();\n });\n }\n }\n }\n _handleGroupCollapse(tabGroup) {\n if (!this._activePanel) {\n return;\n }\n // Only act if the active panel belongs to the collapsed group\n if (!tabGroup.containsPanel(this._activePanel.id)) {\n return;\n }\n const activePanelIndex = this._panels.indexOf(this._activePanel);\n // Search right first, then left, for a visible (non-collapsed-group) panel\n for (let i = activePanelIndex + 1; i < this._panels.length; i++) {\n const candidate = this._panels[i];\n const candidateGroup = this._findTabGroupForPanel(candidate.id);\n if (!candidateGroup || !candidateGroup.collapsed) {\n this.doSetActivePanel(candidate);\n this.updateContainer();\n return;\n }\n }\n for (let i = activePanelIndex - 1; i >= 0; i--) {\n const candidate = this._panels[i];\n const candidateGroup = this._findTabGroupForPanel(candidate.id);\n if (!candidateGroup || !candidateGroup.collapsed) {\n this.doSetActivePanel(candidate);\n this.updateContainer();\n return;\n }\n }\n // All tabs are in collapsed groups — show watermark\n this.contentContainer.closePanel();\n this.doSetActivePanel(undefined);\n this.updateContainer();\n }\n _handleGroupExpand(tabGroup) {\n if (this._activePanel) {\n return;\n }\n // Watermark is showing because all groups were collapsed.\n // Activate the first panel in the newly expanded group.\n const firstPanelId = tabGroup.panelIds[0];\n if (firstPanelId) {\n const panel = this._panels.find((p) => p.id === firstPanelId);\n if (panel) {\n this.doSetActivePanel(panel);\n this.updateContainer();\n }\n }\n }\n /** Restore tab groups from serialized data (used by fromJSON) */\n restoreTabGroups(serializedGroups) {\n // Bump counter past any restored numeric suffixes to avoid ID collisions\n for (const data of serializedGroups) {\n const match = data.id.match(/-(\\d+)$/);\n if (match) {\n const num = parseInt(match[1], 10) + 1;\n if (num > this._tabGroupIdCounter) {\n this._tabGroupIdCounter = num;\n }\n }\n }\n for (const data of serializedGroups) {\n const tabGroup = this.createTabGroup({\n id: data.id,\n label: data.label,\n color: data.color,\n componentParams: data.componentParams,\n });\n const concreteGroup = this._tabGroupMap.get(tabGroup.id);\n for (const panelId of data.panelIds) {\n // Only add panels that actually exist in this group model\n if (this._panels.some((p) => p.id === panelId)) {\n tabGroup.addPanel(panelId);\n this._panelToTabGroup.set(panelId, concreteGroup);\n this._enforceContiguity(concreteGroup, panelId);\n }\n }\n if (data.collapsed) {\n tabGroup.collapse();\n }\n // Auto-destroy if no valid panels were added\n if (tabGroup.isEmpty) {\n tabGroup.dispose();\n }\n }\n }\n focusContent() {\n this.contentContainer.element.focus();\n }\n set renderContainer(value) {\n this.panels.forEach((panel) => {\n this.renderContainer.detatch(panel);\n });\n this._overwriteRenderContainer = value;\n this.panels.forEach((panel) => {\n this.rerender(panel);\n });\n }\n get renderContainer() {\n var _a;\n return ((_a = this._overwriteRenderContainer) !== null && _a !== void 0 ? _a : this.accessor.overlayRenderContainer);\n }\n set dropTargetContainer(value) {\n this._overwriteDropTargetContainer = value;\n }\n get dropTargetContainer() {\n var _a;\n return ((_a = this._overwriteDropTargetContainer) !== null && _a !== void 0 ? _a : this.accessor.rootDropTargetContainer);\n }\n initialize() {\n if (this.options.panels) {\n this.options.panels.forEach((panel) => {\n this.doAddPanel(panel);\n });\n }\n if (this.options.activePanel) {\n this.openPanel(this.options.activePanel);\n }\n // must be run after the constructor otherwise this.parent may not be\n // correctly initialized\n this.setActive(this.isActive, true);\n this.updateContainer();\n this.updateHeaderActions();\n }\n updateHeaderActions() {\n if (this.accessor.options.createRightHeaderActionComponent) {\n this._rightHeaderActions =\n this.accessor.options.createRightHeaderActionComponent(this.groupPanel);\n this._rightHeaderActionsDisposable.value = this._rightHeaderActions;\n this._rightHeaderActions.init({\n containerApi: this._api,\n api: this.groupPanel.api,\n group: this.groupPanel,\n });\n this.tabsContainer.setRightActionsElement(this._rightHeaderActions.element);\n }\n else {\n this._rightHeaderActions = undefined;\n this._rightHeaderActionsDisposable.dispose();\n this.tabsContainer.setRightActionsElement(undefined);\n }\n if (this.accessor.options.createLeftHeaderActionComponent) {\n this._leftHeaderActions =\n this.accessor.options.createLeftHeaderActionComponent(this.groupPanel);\n this._leftHeaderActionsDisposable.value = this._leftHeaderActions;\n this._leftHeaderActions.init({\n containerApi: this._api,\n api: this.groupPanel.api,\n group: this.groupPanel,\n });\n this.tabsContainer.setLeftActionsElement(this._leftHeaderActions.element);\n }\n else {\n this._leftHeaderActions = undefined;\n this._leftHeaderActionsDisposable.dispose();\n this.tabsContainer.setLeftActionsElement(undefined);\n }\n if (this.accessor.options.createPrefixHeaderActionComponent) {\n this._prefixHeaderActions =\n this.accessor.options.createPrefixHeaderActionComponent(this.groupPanel);\n this._prefixHeaderActionsDisposable.value =\n this._prefixHeaderActions;\n this._prefixHeaderActions.init({\n containerApi: this._api,\n api: this.groupPanel.api,\n group: this.groupPanel,\n });\n this.tabsContainer.setPrefixActionsElement(this._prefixHeaderActions.element);\n }\n else {\n this._prefixHeaderActions = undefined;\n this._prefixHeaderActionsDisposable.dispose();\n this.tabsContainer.setPrefixActionsElement(undefined);\n }\n }\n rerender(panel) {\n this.contentContainer.renderPanel(panel, { asActive: false });\n }\n indexOf(panel) {\n return this.tabsContainer.indexOf(panel.id);\n }\n toJSON() {\n var _a;\n const result = {\n views: this.tabsContainer.panels,\n activeView: (_a = this._activePanel) === null || _a === void 0 ? void 0 : _a.id,\n id: this.id,\n };\n if (this.locked !== false) {\n result.locked = this.locked;\n }\n if (this.header.hidden) {\n result.hideHeader = true;\n }\n if (this.headerPosition !== 'top') {\n result.headerPosition = this.headerPosition;\n }\n if (this._tabGroups.length > 0) {\n result.tabGroups = this._tabGroups.map((tg) => tg.toJSON());\n }\n return result;\n }\n moveToNext(options) {\n if (!options) {\n options = {};\n }\n if (!options.panel) {\n options.panel = this.activePanel;\n }\n const index = options.panel ? this.panels.indexOf(options.panel) : -1;\n let normalizedIndex;\n if (index < this.panels.length - 1) {\n normalizedIndex = index + 1;\n }\n else if (!options.suppressRoll) {\n normalizedIndex = 0;\n }\n else {\n return;\n }\n this.openPanel(this.panels[normalizedIndex]);\n }\n moveToPrevious(options) {\n if (!options) {\n options = {};\n }\n if (!options.panel) {\n options.panel = this.activePanel;\n }\n if (!options.panel) {\n return;\n }\n const index = this.panels.indexOf(options.panel);\n let normalizedIndex;\n if (index > 0) {\n normalizedIndex = index - 1;\n }\n else if (!options.suppressRoll) {\n normalizedIndex = this.panels.length - 1;\n }\n else {\n return;\n }\n this.openPanel(this.panels[normalizedIndex]);\n }\n containsPanel(panel) {\n return this.panels.includes(panel);\n }\n init(_params) {\n //noop\n }\n update(_params) {\n //noop\n }\n focus() {\n var _a;\n (_a = this._activePanel) === null || _a === void 0 ? void 0 : _a.focus();\n }\n openPanel(panel, options = {}) {\n /**\n * set the panel group\n * add the panel\n * check if group active\n * check if panel active\n */\n if (typeof options.index !== 'number' ||\n options.index > this.panels.length) {\n options.index = this.panels.length;\n }\n const skipSetActive = !!options.skipSetActive;\n // ensure the group is updated before we fire any events\n panel.updateParentGroup(this.groupPanel, {\n skipSetActive: options.skipSetActive,\n });\n this.doAddPanel(panel, options.index, {\n skipSetActive: skipSetActive,\n });\n if (this._activePanel === panel) {\n this.contentContainer.renderPanel(panel, { asActive: true });\n return;\n }\n if (!skipSetActive) {\n this.doSetActivePanel(panel);\n }\n if (!options.skipSetGroupActive) {\n this.accessor.doSetGroupActive(this.groupPanel);\n }\n if (!options.skipSetActive) {\n this.updateContainer();\n }\n }\n removePanel(groupItemOrId, options = {\n skipSetActive: false,\n }) {\n const id = typeof groupItemOrId === 'string'\n ? groupItemOrId\n : groupItemOrId.id;\n const panelToRemove = this._panels.find((panel) => panel.id === id);\n if (!panelToRemove) {\n throw new Error('invalid operation');\n }\n return this._removePanel(panelToRemove, options);\n }\n closeAllPanels() {\n if (this.panels.length > 0) {\n // take a copy since we will be edting the array as we iterate through\n const arrPanelCpy = [...this.panels];\n for (const panel of arrPanelCpy) {\n this.doClose(panel);\n }\n }\n else {\n this.accessor.removeGroup(this.groupPanel);\n }\n }\n closePanel(panel) {\n this.doClose(panel);\n }\n doClose(panel) {\n const isLast = this.panels.length === 1 && this.accessor.groups.length === 1;\n this.accessor.removePanel(panel, isLast && this.accessor.options.noPanelsOverlay === 'emptyGroup'\n ? { removeEmptyGroup: false }\n : undefined);\n }\n isPanelActive(panel) {\n return this._activePanel === panel;\n }\n updateActions(element) {\n this.tabsContainer.setRightActionsElement(element);\n }\n setActive(isGroupActive, force = false) {\n if (!force && this.isActive === isGroupActive) {\n return;\n }\n this._isGroupActive = isGroupActive;\n toggleClass(this.container, 'dv-active-group', isGroupActive);\n toggleClass(this.container, 'dv-inactive-group', !isGroupActive);\n this.tabsContainer.setActive(this.isActive);\n if (!this._activePanel && this.panels.length > 0) {\n const candidate = this._panels.find((p) => {\n const tg = this._findTabGroupForPanel(p.id);\n return !tg || !tg.collapsed;\n });\n if (candidate) {\n this.doSetActivePanel(candidate);\n }\n }\n this.updateContainer();\n }\n layout(width, height) {\n var _a;\n this._width = width;\n this._height = height;\n this.contentContainer.layout(this._width, this._height);\n if ((_a = this._activePanel) === null || _a === void 0 ? void 0 : _a.layout) {\n this._activePanel.layout(this._width, this._height);\n }\n }\n _removePanel(panel, options) {\n const isActivePanel = this._activePanel === panel;\n this.doRemovePanel(panel);\n if (isActivePanel && this.panels.length > 0) {\n const nextPanel = this.mostRecentlyUsed[0];\n this.openPanel(nextPanel, {\n skipSetActive: options.skipSetActive,\n skipSetGroupActive: options.skipSetActiveGroup,\n });\n }\n if (this._activePanel && this.panels.length === 0) {\n this.doSetActivePanel(undefined);\n }\n if (!options.skipSetActive) {\n this.updateContainer();\n }\n return panel;\n }\n doRemovePanel(panel) {\n const index = this.panels.indexOf(panel);\n if (this._activePanel === panel) {\n this.contentContainer.closePanel();\n }\n this.tabsContainer.delete(panel.id);\n this._panels.splice(index, 1);\n if (this.mostRecentlyUsed.includes(panel)) {\n const index = this.mostRecentlyUsed.indexOf(panel);\n this.mostRecentlyUsed.splice(index, 1);\n }\n const disposable = this._panelDisposables.get(panel.id);\n if (disposable) {\n disposable.dispose();\n this._panelDisposables.delete(panel.id);\n }\n // Remove panel from its tab group (auto-destroys empty groups)\n this.removePanelFromTabGroup(panel.id);\n this._onDidRemovePanel.fire({ panel });\n }\n doAddPanel(panel, index = this.panels.length, options = { skipSetActive: false }) {\n const existingPanel = this._panels.indexOf(panel);\n const hasExistingPanel = existingPanel > -1;\n this.tabsContainer.show();\n this.contentContainer.show();\n this.tabsContainer.openPanel(panel, index);\n if (!options.skipSetActive) {\n this.contentContainer.openPanel(panel);\n }\n else if (panel.api.renderer === 'always') {\n this.contentContainer.renderPanel(panel, { asActive: false });\n }\n if (hasExistingPanel) {\n // TODO - need to ensure ordering hasn't changed and if it has need to re-order this.panels\n return;\n }\n this.updateMru(panel);\n this.panels.splice(index, 0, panel);\n this._panelDisposables.set(panel.id, new CompositeDisposable(panel.api.onDidTitleChange((event) => this._onDidPanelTitleChange.fire(event)), panel.api.onDidParametersChange((event) => this._onDidPanelParametersChange.fire(event))));\n this._onDidAddPanel.fire({ panel });\n }\n doSetActivePanel(panel) {\n if (this._activePanel === panel) {\n return;\n }\n this._activePanel = panel;\n if (panel) {\n this.tabsContainer.setActivePanel(panel);\n this.contentContainer.openPanel(panel);\n panel.layout(this._width, this._height);\n this.updateMru(panel);\n // Refresh focus state to handle programmatic activation without DOM focus change\n this.contentContainer.refreshFocusState();\n this._onDidActivePanelChange.fire({\n panel,\n });\n }\n }\n updateMru(panel) {\n if (this.mostRecentlyUsed.includes(panel)) {\n this.mostRecentlyUsed.splice(this.mostRecentlyUsed.indexOf(panel), 1);\n }\n this.mostRecentlyUsed = [panel, ...this.mostRecentlyUsed];\n }\n updateContainer() {\n var _a, _b;\n this.panels.forEach((panel) => panel.runEvents());\n const shouldShowWatermark = this.isEmpty || !this._activePanel;\n if (shouldShowWatermark && !this.watermark) {\n const watermark = this.accessor.createWatermarkComponent();\n watermark.init({\n containerApi: this._api,\n group: this.groupPanel,\n });\n this.watermark = watermark;\n addDisposableListener(this.watermark.element, 'pointerdown', () => {\n if (!this.isActive) {\n this.accessor.doSetGroupActive(this.groupPanel);\n }\n });\n this.contentContainer.element.appendChild(this.watermark.element);\n }\n if (!shouldShowWatermark && this.watermark) {\n this.watermark.element.remove();\n (_b = (_a = this.watermark).dispose) === null || _b === void 0 ? void 0 : _b.call(_a);\n this.watermark = undefined;\n }\n }\n canDisplayOverlay(event, position, target) {\n const firedEvent = new DockviewUnhandledDragOverEvent(event, target, position, getPanelData, this.accessor.getPanel(this.id));\n this._onUnhandledDragOverEvent.fire(firedEvent);\n return firedEvent.isAccepted;\n }\n handleDropEvent(type, event, position, index) {\n if (this.locked === 'no-drop-target') {\n return;\n }\n function getKind() {\n switch (type) {\n case 'header':\n return typeof index === 'number' ? 'tab' : 'header_space';\n case 'content':\n return 'content';\n }\n }\n const panel = typeof index === 'number' ? this.panels[index] : undefined;\n const willDropEvent = new DockviewWillDropEvent({\n nativeEvent: event,\n position,\n panel,\n getData: () => getPanelData(),\n kind: getKind(),\n group: this.groupPanel,\n api: this._api,\n });\n this._onWillDrop.fire(willDropEvent);\n if (willDropEvent.defaultPrevented) {\n return;\n }\n const data = getPanelData();\n if (data && data.viewId === this.accessor.id) {\n if (type === 'content') {\n if (data.groupId === this.id) {\n // don't allow to drop on self for center position\n if (position === 'center') {\n return;\n }\n if (data.panelId === null && !data.tabGroupId) {\n // Full-group drops on self are a no-op.\n // Tab-group drags are partial moves: an edge drop\n // splits the layout and creates a new group.\n return;\n }\n }\n }\n if (type === 'header') {\n if (data.groupId === this.id) {\n if (data.panelId === null && !data.tabGroupId) {\n return;\n }\n }\n }\n if (data.panelId === null) {\n // this is a group move dnd event\n const { groupId } = data;\n this._onMove.fire({\n target: position,\n groupId: groupId,\n index,\n tabGroupId: data.tabGroupId,\n });\n return;\n }\n const fromSameGroup = this.tabsContainer.indexOf(data.panelId) !== -1;\n if (fromSameGroup && this.tabsContainer.size === 1) {\n return;\n }\n const { groupId, panelId } = data;\n const isSameGroup = this.id === groupId;\n if (isSameGroup && !position) {\n const oldIndex = this.tabsContainer.indexOf(panelId);\n if (oldIndex === index) {\n return;\n }\n }\n this._onMove.fire({\n target: position,\n groupId: data.groupId,\n itemId: data.panelId,\n index,\n });\n }\n else {\n this._onDidDrop.fire(new DockviewDidDropEvent({\n nativeEvent: event,\n position,\n panel,\n getData: () => getPanelData(),\n group: this.groupPanel,\n api: this._api,\n }));\n }\n }\n updateDragAndDropState() {\n this.tabsContainer.updateDragAndDropState();\n }\n dispose() {\n var _a, _b, _c;\n super.dispose();\n (_a = this.watermark) === null || _a === void 0 ? void 0 : _a.element.remove();\n (_c = (_b = this.watermark) === null || _b === void 0 ? void 0 : _b.dispose) === null || _c === void 0 ? void 0 : _c.call(_b);\n this.watermark = undefined;\n // Dispose all tab groups\n for (const tabGroup of [...this._tabGroups]) {\n tabGroup.dispose();\n }\n for (const disposable of this._tabGroupDisposables.values()) {\n disposable.dispose();\n }\n this._tabGroupDisposables.clear();\n // Dispose any microtask-deferred disposables that haven't run yet\n for (const disposable of this._pendingMicrotaskDisposables) {\n disposable.dispose();\n }\n this._pendingMicrotaskDisposables.clear();\n for (const panel of this.panels) {\n panel.dispose();\n }\n this.tabsContainer.dispose();\n this.contentContainer.dispose();\n }\n}\n\nclass GridviewPanelApiImpl extends PanelApiImpl {\n constructor(id, component, panel) {\n super(id, component);\n this._onDidConstraintsChangeInternal = new Emitter();\n this.onDidConstraintsChangeInternal = this._onDidConstraintsChangeInternal.event;\n this._onDidConstraintsChange = new Emitter();\n this.onDidConstraintsChange = this._onDidConstraintsChange.event;\n this._onDidSizeChange = new Emitter();\n this.onDidSizeChange = this._onDidSizeChange.event;\n this.addDisposables(this._onDidConstraintsChangeInternal, this._onDidConstraintsChange, this._onDidSizeChange);\n if (panel) {\n this.initialize(panel);\n }\n }\n setConstraints(value) {\n this._onDidConstraintsChangeInternal.fire(value);\n }\n setSize(event) {\n this._onDidSizeChange.fire(event);\n }\n}\n\nclass GridviewPanel extends BasePanelView {\n get priority() {\n return this._priority;\n }\n get snap() {\n return this._snap;\n }\n get minimumWidth() {\n /**\n * defer to protected function to allow subclasses to override easily.\n * see https://github.com/microsoft/TypeScript/issues/338\n */\n return this.__minimumWidth();\n }\n get minimumHeight() {\n /**\n * defer to protected function to allow subclasses to override easily.\n * see https://github.com/microsoft/TypeScript/issues/338\n */\n return this.__minimumHeight();\n }\n get maximumHeight() {\n /**\n * defer to protected function to allow subclasses to override easily.\n * see https://github.com/microsoft/TypeScript/issues/338\n */\n return this.__maximumHeight();\n }\n get maximumWidth() {\n /**\n * defer to protected function to allow subclasses to override easily.\n * see https://github.com/microsoft/TypeScript/issues/338\n */\n return this.__maximumWidth();\n }\n __minimumWidth() {\n const width = typeof this._minimumWidth === 'function'\n ? this._minimumWidth()\n : this._minimumWidth;\n if (width !== this._evaluatedMinimumWidth) {\n this._evaluatedMinimumWidth = width;\n this.updateConstraints();\n }\n return width;\n }\n __maximumWidth() {\n const width = typeof this._maximumWidth === 'function'\n ? this._maximumWidth()\n : this._maximumWidth;\n if (width !== this._evaluatedMaximumWidth) {\n this._evaluatedMaximumWidth = width;\n this.updateConstraints();\n }\n return width;\n }\n __minimumHeight() {\n const height = typeof this._minimumHeight === 'function'\n ? this._minimumHeight()\n : this._minimumHeight;\n if (height !== this._evaluatedMinimumHeight) {\n this._evaluatedMinimumHeight = height;\n this.updateConstraints();\n }\n return height;\n }\n __maximumHeight() {\n const height = typeof this._maximumHeight === 'function'\n ? this._maximumHeight()\n : this._maximumHeight;\n if (height !== this._evaluatedMaximumHeight) {\n this._evaluatedMaximumHeight = height;\n this.updateConstraints();\n }\n return height;\n }\n get isActive() {\n return this.api.isActive;\n }\n get isVisible() {\n return this.api.isVisible;\n }\n constructor(id, component, options, api) {\n super(id, component, api !== null && api !== void 0 ? api : new GridviewPanelApiImpl(id, component));\n this._evaluatedMinimumWidth = 0;\n this._evaluatedMaximumWidth = Number.MAX_SAFE_INTEGER;\n this._evaluatedMinimumHeight = 0;\n this._evaluatedMaximumHeight = Number.MAX_SAFE_INTEGER;\n this._minimumWidth = 0;\n this._minimumHeight = 0;\n this._maximumWidth = Number.MAX_SAFE_INTEGER;\n this._maximumHeight = Number.MAX_SAFE_INTEGER;\n this._snap = false;\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n if (typeof (options === null || options === void 0 ? void 0 : options.minimumWidth) === 'number') {\n this._minimumWidth = options.minimumWidth;\n }\n if (typeof (options === null || options === void 0 ? void 0 : options.maximumWidth) === 'number') {\n this._maximumWidth = options.maximumWidth;\n }\n if (typeof (options === null || options === void 0 ? void 0 : options.minimumHeight) === 'number') {\n this._minimumHeight = options.minimumHeight;\n }\n if (typeof (options === null || options === void 0 ? void 0 : options.maximumHeight) === 'number') {\n this._maximumHeight = options.maximumHeight;\n }\n this.api.initialize(this); // TODO: required to by-pass 'super before this' requirement\n this.addDisposables(this.api.onWillVisibilityChange((event) => {\n const { isVisible } = event;\n const { accessor } = this._params;\n accessor.setVisible(this, isVisible);\n }), this.api.onActiveChange(() => {\n const { accessor } = this._params;\n accessor.doSetGroupActive(this);\n }), this.api.onDidConstraintsChangeInternal((event) => {\n if (typeof event.minimumWidth === 'number' ||\n typeof event.minimumWidth === 'function') {\n this._minimumWidth = event.minimumWidth;\n }\n if (typeof event.minimumHeight === 'number' ||\n typeof event.minimumHeight === 'function') {\n this._minimumHeight = event.minimumHeight;\n }\n if (typeof event.maximumWidth === 'number' ||\n typeof event.maximumWidth === 'function') {\n this._maximumWidth = event.maximumWidth;\n }\n if (typeof event.maximumHeight === 'number' ||\n typeof event.maximumHeight === 'function') {\n this._maximumHeight = event.maximumHeight;\n }\n }), this.api.onDidSizeChange((event) => {\n this._onDidChange.fire({\n height: event.height,\n width: event.width,\n });\n }), this._onDidChange);\n }\n setVisible(isVisible) {\n this.api._onDidVisibilityChange.fire({ isVisible });\n }\n setActive(isActive) {\n this.api._onDidActiveChange.fire({ isActive });\n }\n init(parameters) {\n if (parameters.maximumHeight) {\n this._maximumHeight = parameters.maximumHeight;\n }\n if (parameters.minimumHeight) {\n this._minimumHeight = parameters.minimumHeight;\n }\n if (parameters.maximumWidth) {\n this._maximumWidth = parameters.maximumWidth;\n }\n if (parameters.minimumWidth) {\n this._minimumWidth = parameters.minimumWidth;\n }\n this._priority = parameters.priority;\n this._snap = !!parameters.snap;\n super.init(parameters);\n if (typeof parameters.isVisible === 'boolean') {\n this.setVisible(parameters.isVisible);\n }\n }\n updateConstraints() {\n this.api._onDidConstraintsChange.fire({\n minimumWidth: this._evaluatedMinimumWidth,\n maximumWidth: this._evaluatedMaximumWidth,\n minimumHeight: this._evaluatedMinimumHeight,\n maximumHeight: this._evaluatedMaximumHeight,\n });\n }\n toJSON() {\n const state = super.toJSON();\n const maximum = (value) => value === Number.MAX_SAFE_INTEGER ? undefined : value;\n const minimum = (value) => (value <= 0 ? undefined : value);\n return Object.assign(Object.assign({}, state), { minimumHeight: minimum(this.minimumHeight), maximumHeight: maximum(this.maximumHeight), minimumWidth: minimum(this.minimumWidth), maximumWidth: maximum(this.maximumWidth), snap: this.snap, priority: this.priority });\n }\n}\n\nconst NOT_INITIALIZED_MESSAGE = 'dockview: DockviewGroupPanelApiImpl not initialized';\nclass DockviewGroupPanelApiImpl extends GridviewPanelApiImpl {\n get location() {\n if (!this._group) {\n throw new Error(NOT_INITIALIZED_MESSAGE);\n }\n return this._group.model.location;\n }\n get locked() {\n if (!this._group) {\n throw new Error(NOT_INITIALIZED_MESSAGE);\n }\n return this._group.locked;\n }\n set locked(value) {\n if (!this._group) {\n throw new Error(NOT_INITIALIZED_MESSAGE);\n }\n this._group.locked = value;\n }\n constructor(id, accessor) {\n super(id, '__dockviewgroup__');\n this.accessor = accessor;\n this._onDidLocationChange = new Emitter();\n this.onDidLocationChange = this._onDidLocationChange.event;\n this._onDidActivePanelChange = new Emitter();\n this.onDidActivePanelChange = this._onDidActivePanelChange.event;\n this._onDidCollapsedChange = new Emitter();\n this.onDidCollapsedChange = this._onDidCollapsedChange.event;\n this.addDisposables(this._onDidLocationChange, this._onDidActivePanelChange, this._onDidCollapsedChange, this._onDidVisibilityChange.event((event) => {\n // When becoming visible, apply any pending size change\n if (event.isVisible && this._pendingSize) {\n super.setSize(this._pendingSize);\n this._pendingSize = undefined;\n }\n }));\n }\n setSize(event) {\n // Always store the requested size\n this._pendingSize = Object.assign({}, event);\n // Apply the size change immediately\n super.setSize(event);\n }\n close() {\n if (!this._group) {\n return;\n }\n return this.accessor.removeGroup(this._group);\n }\n getWindow() {\n return this.location.type === 'popout'\n ? this.location.getWindow()\n : window;\n }\n setHeaderPosition(position) {\n if (!this._group) {\n throw new Error(NOT_INITIALIZED_MESSAGE);\n }\n this._group.model.headerPosition = position;\n }\n getHeaderPosition() {\n if (!this._group) {\n throw new Error(NOT_INITIALIZED_MESSAGE);\n }\n return this._group.model.headerPosition;\n }\n moveTo(options) {\n var _a, _b, _c, _d;\n if (!this._group) {\n throw new Error(NOT_INITIALIZED_MESSAGE);\n }\n const group = (_a = options.group) !== null && _a !== void 0 ? _a : this.accessor.addGroup({\n direction: positionToDirection((_b = options.position) !== null && _b !== void 0 ? _b : 'right'),\n skipSetActive: (_c = options.skipSetActive) !== null && _c !== void 0 ? _c : false,\n });\n this.accessor.moveGroupOrPanel({\n from: { groupId: this._group.id },\n to: {\n group,\n position: options.group\n ? ((_d = options.position) !== null && _d !== void 0 ? _d : 'center')\n : 'center',\n index: options.index,\n },\n skipSetActive: options.skipSetActive,\n });\n }\n maximize() {\n if (!this._group) {\n throw new Error(NOT_INITIALIZED_MESSAGE);\n }\n if (this.location.type !== 'grid') {\n // only grid groups can be maximized\n return;\n }\n this.accessor.maximizeGroup(this._group);\n }\n isMaximized() {\n if (!this._group) {\n throw new Error(NOT_INITIALIZED_MESSAGE);\n }\n return this.accessor.isMaximizedGroup(this._group);\n }\n exitMaximized() {\n if (!this._group) {\n throw new Error(NOT_INITIALIZED_MESSAGE);\n }\n if (this.isMaximized()) {\n this.accessor.exitMaximizedGroup();\n }\n }\n collapse() {\n if (!this._group) {\n return;\n }\n this.accessor.setEdgeGroupCollapsed(this._group, true);\n }\n expand() {\n if (!this._group) {\n return;\n }\n this.accessor.setEdgeGroupCollapsed(this._group, false);\n }\n isCollapsed() {\n if (!this._group) {\n return false;\n }\n return this.accessor.isEdgeGroupCollapsed(this._group);\n }\n initialize(group) {\n this._group = group;\n }\n}\n\nconst MINIMUM_DOCKVIEW_GROUP_PANEL_WIDTH = 100;\nconst MINIMUM_DOCKVIEW_GROUP_PANEL_HEIGHT = 100;\nclass DockviewGroupPanel extends GridviewPanel {\n get minimumWidth() {\n var _a;\n // Check for explicitly set group constraint first\n if (typeof this._explicitConstraints.minimumWidth === 'number') {\n return this._explicitConstraints.minimumWidth;\n }\n const activePanelMinimumWidth = (_a = this.activePanel) === null || _a === void 0 ? void 0 : _a.minimumWidth;\n if (typeof activePanelMinimumWidth === 'number') {\n return activePanelMinimumWidth;\n }\n return super.__minimumWidth();\n }\n get minimumHeight() {\n var _a;\n // Check for explicitly set group constraint first\n if (typeof this._explicitConstraints.minimumHeight === 'number') {\n return this._explicitConstraints.minimumHeight;\n }\n const activePanelMinimumHeight = (_a = this.activePanel) === null || _a === void 0 ? void 0 : _a.minimumHeight;\n if (typeof activePanelMinimumHeight === 'number') {\n return activePanelMinimumHeight;\n }\n return super.__minimumHeight();\n }\n get maximumWidth() {\n var _a;\n // Check for explicitly set group constraint first\n if (typeof this._explicitConstraints.maximumWidth === 'number') {\n return this._explicitConstraints.maximumWidth;\n }\n const activePanelMaximumWidth = (_a = this.activePanel) === null || _a === void 0 ? void 0 : _a.maximumWidth;\n if (typeof activePanelMaximumWidth === 'number') {\n return activePanelMaximumWidth;\n }\n return super.__maximumWidth();\n }\n get maximumHeight() {\n var _a;\n // Check for explicitly set group constraint first\n if (typeof this._explicitConstraints.maximumHeight === 'number') {\n return this._explicitConstraints.maximumHeight;\n }\n const activePanelMaximumHeight = (_a = this.activePanel) === null || _a === void 0 ? void 0 : _a.maximumHeight;\n if (typeof activePanelMaximumHeight === 'number') {\n return activePanelMaximumHeight;\n }\n return super.__maximumHeight();\n }\n get panels() {\n return this._model.panels;\n }\n get activePanel() {\n return this._model.activePanel;\n }\n get size() {\n return this._model.size;\n }\n get model() {\n return this._model;\n }\n get locked() {\n return this._model.locked;\n }\n set locked(value) {\n this._model.locked = value;\n }\n get header() {\n return this._model.header;\n }\n constructor(accessor, id, options) {\n var _a, _b, _c, _d, _e, _f;\n super(id, 'groupview_default', {\n minimumHeight: (_b = (_a = options.constraints) === null || _a === void 0 ? void 0 : _a.minimumHeight) !== null && _b !== void 0 ? _b : MINIMUM_DOCKVIEW_GROUP_PANEL_HEIGHT,\n minimumWidth: (_d = (_c = options.constraints) === null || _c === void 0 ? void 0 : _c.minimumWidth) !== null && _d !== void 0 ? _d : MINIMUM_DOCKVIEW_GROUP_PANEL_WIDTH,\n maximumHeight: (_e = options.constraints) === null || _e === void 0 ? void 0 : _e.maximumHeight,\n maximumWidth: (_f = options.constraints) === null || _f === void 0 ? void 0 : _f.maximumWidth,\n }, new DockviewGroupPanelApiImpl(id, accessor));\n // Track explicitly set constraints to override panel constraints\n this._explicitConstraints = {};\n this.api.initialize(this); // cannot use 'this' after after 'super' call\n this._model = new DockviewGroupPanelModel(this.element, accessor, id, options, this);\n this.addDisposables(this.model.onDidActivePanelChange((event) => {\n this.api._onDidActivePanelChange.fire(event);\n }), this.api.onDidConstraintsChangeInternal((event) => {\n // Track explicitly set constraints to override panel constraints\n // Extract numeric values from functions or values\n if (event.minimumWidth !== undefined) {\n this._explicitConstraints.minimumWidth =\n typeof event.minimumWidth === 'function'\n ? event.minimumWidth()\n : event.minimumWidth;\n }\n if (event.minimumHeight !== undefined) {\n this._explicitConstraints.minimumHeight =\n typeof event.minimumHeight === 'function'\n ? event.minimumHeight()\n : event.minimumHeight;\n }\n if (event.maximumWidth !== undefined) {\n this._explicitConstraints.maximumWidth =\n typeof event.maximumWidth === 'function'\n ? event.maximumWidth()\n : event.maximumWidth;\n }\n if (event.maximumHeight !== undefined) {\n this._explicitConstraints.maximumHeight =\n typeof event.maximumHeight === 'function'\n ? event.maximumHeight()\n : event.maximumHeight;\n }\n }));\n }\n focus() {\n if (!this.api.isActive) {\n this.api.setActive();\n }\n super.focus();\n }\n initialize() {\n this._model.initialize();\n }\n setActive(isActive) {\n super.setActive(isActive);\n this.model.setActive(isActive);\n }\n layout(width, height) {\n super.layout(width, height);\n this.model.layout(width, height);\n }\n getComponent() {\n return this._model;\n }\n toJSON() {\n return this.model.toJSON();\n }\n}\n\nconst themeDark = {\n name: 'dark',\n className: 'dockview-theme-dark',\n colorScheme: 'dark',\n};\nconst themeLight = {\n name: 'light',\n className: 'dockview-theme-light',\n colorScheme: 'light',\n};\nconst themeVisualStudio = {\n name: 'visualStudio',\n className: 'dockview-theme-vs',\n colorScheme: 'dark',\n // --dv-tabs-and-actions-container-height is 20px, but the VS theme applies\n // box-sizing: content-box + border-bottom: 2px, so the rendered strip is 22px.\n edgeGroupCollapsedSize: 22,\n};\nconst themeAbyss = {\n name: 'abyss',\n className: 'dockview-theme-abyss',\n colorScheme: 'dark',\n tabGroupIndicator: 'none',\n};\nconst themeDracula = {\n name: 'dracula',\n className: 'dockview-theme-dracula',\n colorScheme: 'dark',\n};\nconst themeAbyssSpaced = {\n name: 'abyssSpaced',\n className: 'dockview-theme-abyss-spaced',\n colorScheme: 'dark',\n gap: 10,\n edgeGroupCollapsedSize: 44,\n dndOverlayMounting: 'absolute',\n dndPanelOverlay: 'group',\n dndTabIndicator: 'line',\n dndOverlayBorder: '2px solid var(--dv-active-sash-color)',\n};\nconst themeLightSpaced = {\n name: 'lightSpaced',\n className: 'dockview-theme-light-spaced',\n colorScheme: 'light',\n gap: 10,\n edgeGroupCollapsedSize: 44,\n dndOverlayMounting: 'absolute',\n dndPanelOverlay: 'group',\n dndTabIndicator: 'line',\n dndOverlayBorder: '2px solid var(--dv-active-sash-color)',\n};\nconst themeNord = {\n name: 'nord',\n className: 'dockview-theme-nord',\n colorScheme: 'dark',\n};\nconst themeNordSpaced = {\n name: 'nordSpaced',\n className: 'dockview-theme-nord-spaced',\n colorScheme: 'dark',\n gap: 10,\n edgeGroupCollapsedSize: 44,\n dndOverlayMounting: 'absolute',\n dndPanelOverlay: 'group',\n dndTabIndicator: 'line',\n dndOverlayBorder: '2px solid var(--dv-active-sash-color)',\n};\nconst themeCatppuccinMocha = {\n name: 'catppuccinMocha',\n className: 'dockview-theme-catppuccin-mocha',\n colorScheme: 'dark',\n};\nconst themeCatppuccinMochaSpaced = {\n name: 'catppuccinMochaSpaced',\n className: 'dockview-theme-catppuccin-mocha-spaced',\n colorScheme: 'dark',\n gap: 10,\n edgeGroupCollapsedSize: 44,\n dndOverlayMounting: 'absolute',\n dndPanelOverlay: 'group',\n dndTabIndicator: 'line',\n dndOverlayBorder: '2px solid var(--dv-active-sash-color)',\n};\nconst themeMonokai = {\n name: 'monokai',\n className: 'dockview-theme-monokai',\n colorScheme: 'dark',\n};\nconst themeSolarizedLight = {\n name: 'solarizedLight',\n className: 'dockview-theme-solarized-light',\n colorScheme: 'light',\n};\nconst themeSolarizedLightSpaced = {\n name: 'solarizedLightSpaced',\n className: 'dockview-theme-solarized-light-spaced',\n colorScheme: 'light',\n gap: 10,\n edgeGroupCollapsedSize: 44,\n dndOverlayMounting: 'absolute',\n dndPanelOverlay: 'group',\n dndTabIndicator: 'line',\n dndOverlayBorder: '2px solid var(--dv-active-sash-color)',\n};\nconst themeGithubDark = {\n name: 'githubDark',\n className: 'dockview-theme-github-dark',\n colorScheme: 'dark',\n};\nconst themeGithubDarkSpaced = {\n name: 'githubDarkSpaced',\n className: 'dockview-theme-github-dark-spaced',\n colorScheme: 'dark',\n gap: 10,\n edgeGroupCollapsedSize: 44,\n dndOverlayMounting: 'absolute',\n dndPanelOverlay: 'group',\n dndTabIndicator: 'line',\n dndOverlayBorder: '2px solid var(--dv-active-sash-color)',\n};\nconst themeGithubLight = {\n name: 'githubLight',\n className: 'dockview-theme-github-light',\n colorScheme: 'light',\n};\nconst themeGithubLightSpaced = {\n name: 'githubLightSpaced',\n className: 'dockview-theme-github-light-spaced',\n colorScheme: 'light',\n gap: 10,\n edgeGroupCollapsedSize: 44,\n dndOverlayMounting: 'absolute',\n dndPanelOverlay: 'group',\n dndTabIndicator: 'line',\n dndOverlayBorder: '2px solid var(--dv-active-sash-color)',\n};\n\nclass DockviewPanelApiImpl extends GridviewPanelApiImpl {\n get location() {\n return this.group.api.location;\n }\n get title() {\n return this.panel.title;\n }\n get isGroupActive() {\n return this.group.isActive;\n }\n get renderer() {\n return this.panel.renderer;\n }\n set group(value) {\n const oldGroup = this._group;\n if (this._group !== value) {\n this._group = value;\n this._onDidGroupChange.fire({});\n this.setupGroupEventListeners(oldGroup);\n this._onDidLocationChange.fire({\n location: this.group.api.location,\n });\n }\n }\n get group() {\n return this._group;\n }\n get tabComponent() {\n return this._tabComponent;\n }\n constructor(panel, group, accessor, component, tabComponent) {\n super(panel.id, component);\n this.panel = panel;\n this.accessor = accessor;\n this._onDidTitleChange = new Emitter();\n this.onDidTitleChange = this._onDidTitleChange.event;\n this._onDidActiveGroupChange = new Emitter();\n this.onDidActiveGroupChange = this._onDidActiveGroupChange.event;\n this._onDidGroupChange = new Emitter();\n this.onDidGroupChange = this._onDidGroupChange.event;\n this._onDidRendererChange = new Emitter();\n this.onDidRendererChange = this._onDidRendererChange.event;\n this._onDidLocationChange = new Emitter();\n this.onDidLocationChange = this._onDidLocationChange.event;\n this.groupEventsDisposable = new MutableDisposable();\n this._tabComponent = tabComponent;\n this.initialize(panel);\n this._group = group;\n this.setupGroupEventListeners();\n this.addDisposables(this.groupEventsDisposable, this._onDidRendererChange, this._onDidTitleChange, this._onDidGroupChange, this._onDidActiveGroupChange, this._onDidLocationChange);\n }\n getWindow() {\n return this.group.api.getWindow();\n }\n moveTo(options) {\n var _a, _b;\n this.accessor.moveGroupOrPanel({\n from: { groupId: this._group.id, panelId: this.panel.id },\n to: {\n group: (_a = options.group) !== null && _a !== void 0 ? _a : this._group,\n position: options.group\n ? ((_b = options.position) !== null && _b !== void 0 ? _b : 'center')\n : 'center',\n index: options.index,\n },\n skipSetActive: options.skipSetActive,\n });\n }\n setTitle(title) {\n this.panel.setTitle(title);\n }\n setRenderer(renderer) {\n this.panel.setRenderer(renderer);\n }\n close() {\n this.group.model.closePanel(this.panel);\n }\n maximize() {\n this.group.api.maximize();\n }\n isMaximized() {\n return this.group.api.isMaximized();\n }\n exitMaximized() {\n this.group.api.exitMaximized();\n }\n setupGroupEventListeners(previousGroup) {\n var _a;\n let _trackGroupActive = (_a = previousGroup === null || previousGroup === void 0 ? void 0 : previousGroup.isActive) !== null && _a !== void 0 ? _a : false; // prevent duplicate events with same state\n this.groupEventsDisposable.value = new CompositeDisposable(this.group.api.onDidVisibilityChange((event) => {\n const hasBecomeHidden = !event.isVisible && this.isVisible;\n const hasBecomeVisible = event.isVisible && !this.isVisible;\n const isActivePanel = this.group.model.isPanelActive(this.panel);\n if (hasBecomeHidden || (hasBecomeVisible && isActivePanel)) {\n this._onDidVisibilityChange.fire(event);\n }\n }), this.group.api.onDidLocationChange((event) => {\n if (this.group !== this.panel.group) {\n return;\n }\n this._onDidLocationChange.fire(event);\n }), this.group.api.onDidActiveChange(() => {\n if (this.group !== this.panel.group) {\n return;\n }\n if (_trackGroupActive !== this.isGroupActive) {\n _trackGroupActive = this.isGroupActive;\n this._onDidActiveGroupChange.fire({\n isActive: this.isGroupActive,\n });\n }\n }));\n }\n}\n\nclass DockviewPanel extends CompositeDisposable {\n get params() {\n return this._params;\n }\n get title() {\n return this._title;\n }\n get group() {\n return this._group;\n }\n get renderer() {\n var _a;\n return (_a = this._renderer) !== null && _a !== void 0 ? _a : this.accessor.renderer;\n }\n get minimumWidth() {\n return this._minimumWidth;\n }\n get minimumHeight() {\n return this._minimumHeight;\n }\n get maximumWidth() {\n return this._maximumWidth;\n }\n get maximumHeight() {\n return this._maximumHeight;\n }\n constructor(id, component, tabComponent, accessor, containerApi, group, view, options) {\n super();\n this.id = id;\n this.accessor = accessor;\n this.containerApi = containerApi;\n this.view = view;\n this._renderer = options.renderer;\n this._group = group;\n this._minimumWidth = options.minimumWidth;\n this._minimumHeight = options.minimumHeight;\n this._maximumWidth = options.maximumWidth;\n this._maximumHeight = options.maximumHeight;\n this.api = new DockviewPanelApiImpl(this, this._group, accessor, component, tabComponent);\n this.addDisposables(this.api.onActiveChange(() => {\n accessor.setActivePanel(this);\n }), this.api.onDidSizeChange((event) => {\n // forward the resize event to the group since if you want to resize a panel\n // you are actually just resizing the panels parent which is the group\n this.group.api.setSize(event);\n }), this.api.onDidRendererChange(() => {\n this.group.model.rerender(this);\n }));\n }\n init(params) {\n this._params = params.params;\n this.view.init(Object.assign(Object.assign({}, params), { api: this.api, containerApi: this.containerApi }));\n this.setTitle(params.title);\n }\n focus() {\n const event = new WillFocusEvent();\n this.api._onWillFocus.fire(event);\n if (event.defaultPrevented) {\n return;\n }\n if (!this.api.isActive) {\n this.api.setActive();\n }\n }\n toJSON() {\n return {\n id: this.id,\n contentComponent: this.view.contentComponent,\n tabComponent: this.view.tabComponent,\n params: Object.keys(this._params || {}).length > 0\n ? this._params\n : undefined,\n title: this.title,\n renderer: this._renderer,\n minimumHeight: this._minimumHeight,\n maximumHeight: this._maximumHeight,\n minimumWidth: this._minimumWidth,\n maximumWidth: this._maximumWidth,\n };\n }\n setTitle(title) {\n const didTitleChange = title !== this.title;\n if (didTitleChange) {\n this._title = title;\n // keep the view-model's cached init params in sync so that tab\n // renderers constructed lazily (e.g. the header overflow\n // dropdown via createTabRenderer) see the updated title\n // (#914).\n this.view.setTitle(title);\n this.api._onDidTitleChange.fire({ title });\n }\n }\n setRenderer(renderer) {\n const didChange = renderer !== this.renderer;\n if (didChange) {\n this._renderer = renderer;\n this.api._onDidRendererChange.fire({\n renderer: renderer,\n });\n }\n }\n update(event) {\n var _a;\n // merge the new parameters with the existing parameters\n this._params = Object.assign(Object.assign({}, ((_a = this._params) !== null && _a !== void 0 ? _a : {})), event.params);\n /**\n * delete new keys that have a value of undefined,\n * allow values of null\n */\n for (const key of Object.keys(event.params)) {\n if (event.params[key] === undefined) {\n delete this._params[key];\n }\n }\n // update the view with the updated props\n this.view.update({\n params: this._params,\n });\n }\n updateFromStateModel(state) {\n var _a, _b, _c;\n this._maximumHeight = state.maximumHeight;\n this._minimumHeight = state.minimumHeight;\n this._maximumWidth = state.maximumWidth;\n this._minimumWidth = state.minimumWidth;\n this.update({ params: (_a = state.params) !== null && _a !== void 0 ? _a : {} });\n this.setTitle((_b = state.title) !== null && _b !== void 0 ? _b : this.id);\n this.setRenderer((_c = state.renderer) !== null && _c !== void 0 ? _c : this.accessor.renderer);\n // state.contentComponent;\n // state.tabComponent;\n }\n updateParentGroup(group, options) {\n this._group = group;\n this.api.group = this._group;\n const isPanelVisible = this._group.model.isPanelActive(this);\n const isActive = this.group.api.isActive && isPanelVisible;\n if (!(options === null || options === void 0 ? void 0 : options.skipSetActive)) {\n if (this.api.isActive !== isActive) {\n this.api._onDidActiveChange.fire({\n isActive: this.group.api.isActive && isPanelVisible,\n });\n }\n }\n if (this.api.isVisible !== isPanelVisible) {\n this.api._onDidVisibilityChange.fire({\n isVisible: isPanelVisible,\n });\n }\n }\n runEvents() {\n const isPanelVisible = this._group.model.isPanelActive(this);\n const isActive = this.group.api.isActive && isPanelVisible;\n if (this.api.isActive !== isActive) {\n this.api._onDidActiveChange.fire({\n isActive: this.group.api.isActive && isPanelVisible,\n });\n }\n if (this.api.isVisible !== isPanelVisible) {\n this.api._onDidVisibilityChange.fire({\n isVisible: isPanelVisible,\n });\n }\n }\n layout(width, height) {\n // TODO: Can we somehow do height without header height or indicate what the header height is?\n this.api._onDidDimensionChange.fire({\n width,\n height: height,\n });\n this.view.layout(width, height);\n }\n dispose() {\n this.api.dispose();\n this.view.dispose();\n }\n}\n\nclass DefaultTab extends CompositeDisposable {\n get element() {\n return this._element;\n }\n constructor() {\n super();\n this._element = document.createElement('div');\n this._element.className = 'dv-default-tab';\n this._content = document.createElement('div');\n this._content.className = 'dv-default-tab-content';\n this.action = document.createElement('div');\n this.action.className = 'dv-default-tab-action';\n this.action.appendChild(createCloseButton());\n this._element.appendChild(this._content);\n this._element.appendChild(this.action);\n this.render();\n }\n init(params) {\n this._title = params.title;\n this.addDisposables(params.api.onDidTitleChange((event) => {\n this._title = event.title;\n this.render();\n }), addDisposableListener(this.action, 'pointerdown', (ev) => {\n ev.preventDefault();\n }), addDisposableListener(this.action, 'click', (ev) => {\n if (ev.defaultPrevented) {\n return;\n }\n ev.preventDefault();\n params.api.close();\n }));\n this.render();\n }\n render() {\n var _a;\n if (this._content.textContent !== this._title) {\n this._content.textContent = (_a = this._title) !== null && _a !== void 0 ? _a : '';\n }\n }\n}\n\nclass DockviewPanelModel {\n get content() {\n return this._content;\n }\n get tab() {\n return this._tab;\n }\n constructor(accessor, id, contentComponent, tabComponent) {\n this.accessor = accessor;\n this.id = id;\n this.contentComponent = contentComponent;\n this.tabComponent = tabComponent;\n this._content = this.createContentComponent(this.id, contentComponent);\n this._tab = this.createTabComponent(this.id, tabComponent);\n }\n createTabRenderer(tabLocation) {\n var _a;\n const cmp = this.createTabComponent(this.id, this.tabComponent);\n if (this._params) {\n cmp.init(Object.assign(Object.assign({}, this._params), { tabLocation }));\n }\n if (this._updateEvent) {\n (_a = cmp.update) === null || _a === void 0 ? void 0 : _a.call(cmp, this._updateEvent);\n }\n return cmp;\n }\n init(params) {\n this._params = params;\n this.content.init(params);\n this.tab.init(Object.assign(Object.assign({}, params), { tabLocation: 'header' }));\n }\n setTitle(title) {\n // keep the cached init params in sync so that tab renderers created\n // lazily after the title changes (e.g. for the header overflow\n // dropdown) see the current title rather than the stale original.\n if (this._params) {\n this._params.title = title;\n }\n }\n layout(width, height) {\n var _a, _b;\n (_b = (_a = this.content).layout) === null || _b === void 0 ? void 0 : _b.call(_a, width, height);\n }\n update(event) {\n var _a, _b, _c, _d;\n this._updateEvent = event;\n (_b = (_a = this.content).update) === null || _b === void 0 ? void 0 : _b.call(_a, event);\n (_d = (_c = this.tab).update) === null || _d === void 0 ? void 0 : _d.call(_c, event);\n }\n dispose() {\n var _a, _b, _c, _d;\n (_b = (_a = this.content).dispose) === null || _b === void 0 ? void 0 : _b.call(_a);\n (_d = (_c = this.tab).dispose) === null || _d === void 0 ? void 0 : _d.call(_c);\n }\n createContentComponent(id, componentName) {\n return this.accessor.options.createComponent({\n id,\n name: componentName,\n });\n }\n createTabComponent(id, componentName) {\n const name = componentName !== null && componentName !== void 0 ? componentName : this.accessor.options.defaultTabComponent;\n if (name) {\n if (this.accessor.options.createTabComponent) {\n const component = this.accessor.options.createTabComponent({\n id,\n name,\n });\n if (component) {\n return component;\n }\n else {\n return new DefaultTab();\n }\n }\n console.warn(`dockview: tabComponent '${componentName}' was not found. falling back to the default tab.`);\n }\n return new DefaultTab();\n }\n}\n\nclass DefaultDockviewDeserialzier {\n constructor(accessor) {\n this.accessor = accessor;\n }\n fromJSON(panelData, group) {\n var _a, _b;\n const panelId = panelData.id;\n const params = panelData.params;\n const title = panelData.title;\n const viewData = panelData.view;\n const contentComponent = viewData\n ? viewData.content.id\n : ((_a = panelData.contentComponent) !== null && _a !== void 0 ? _a : 'unknown');\n const tabComponent = viewData\n ? (_b = viewData.tab) === null || _b === void 0 ? void 0 : _b.id\n : panelData.tabComponent;\n const view = new DockviewPanelModel(this.accessor, panelId, contentComponent, tabComponent);\n const panel = new DockviewPanel(panelId, contentComponent, tabComponent, this.accessor, new DockviewApi(this.accessor), group, view, {\n renderer: panelData.renderer,\n minimumWidth: panelData.minimumWidth,\n minimumHeight: panelData.minimumHeight,\n maximumWidth: panelData.maximumWidth,\n maximumHeight: panelData.maximumHeight,\n });\n panel.init({\n title: title !== null && title !== void 0 ? title : panelId,\n params: params !== null && params !== void 0 ? params : {},\n });\n return panel;\n }\n}\n\nclass Watermark extends CompositeDisposable {\n get element() {\n return this._element;\n }\n constructor() {\n super();\n this._element = document.createElement('div');\n this._element.className = 'dv-watermark';\n }\n init(_params) {\n // noop\n }\n}\n\nclass AriaLevelTracker {\n constructor() {\n this._orderedList = [];\n }\n push(element) {\n this._orderedList = [\n ...this._orderedList.filter((item) => item !== element),\n element,\n ];\n this.update();\n }\n destroy(element) {\n this._orderedList = this._orderedList.filter((item) => item !== element);\n this.update();\n }\n update() {\n for (let i = 0; i < this._orderedList.length; i++) {\n this._orderedList[i].setAttribute('aria-level', `${i}`);\n this._orderedList[i].style.zIndex =\n `calc(var(--dv-overlay-z-index, 999) + ${i * 2})`;\n }\n }\n}\nconst arialLevelTracker = new AriaLevelTracker();\nclass Overlay extends CompositeDisposable {\n set minimumInViewportWidth(value) {\n this.options.minimumInViewportWidth = value;\n }\n set minimumInViewportHeight(value) {\n this.options.minimumInViewportHeight = value;\n }\n get element() {\n return this._element;\n }\n get isVisible() {\n return this._isVisible;\n }\n constructor(options) {\n super();\n this.options = options;\n this._element = document.createElement('div');\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this._onDidChangeEnd = new Emitter();\n this.onDidChangeEnd = this._onDidChangeEnd.event;\n this._onDidStartMoving = new Emitter();\n /** Fires once per drag, the first time the float actually moves. */\n this.onDidStartMoving = this._onDidStartMoving.event;\n this._dragMove = new MutableDisposable();\n this._dragCancelled = false;\n this.addDisposables(this._onDidChange, this._onDidChangeEnd, this._onDidStartMoving, this._dragMove);\n this._element.className = 'dv-resize-container';\n this._isVisible = true;\n this.setupResize('top');\n this.setupResize('bottom');\n this.setupResize('left');\n this.setupResize('right');\n this.setupResize('topleft');\n this.setupResize('topright');\n this.setupResize('bottomleft');\n this.setupResize('bottomright');\n this._element.appendChild(this.options.content);\n this.options.container.appendChild(this._element);\n // if input bad resize within acceptable boundaries\n this.setBounds(Object.assign(Object.assign(Object.assign(Object.assign({ height: this.options.height, width: this.options.width }, ('top' in this.options && { top: this.options.top })), ('bottom' in this.options && { bottom: this.options.bottom })), ('left' in this.options && { left: this.options.left })), ('right' in this.options && { right: this.options.right })));\n arialLevelTracker.push(this._element);\n }\n setVisible(isVisible) {\n if (isVisible === this.isVisible) {\n return;\n }\n this._isVisible = isVisible;\n toggleClass(this.element, 'dv-hidden', !this.isVisible);\n }\n bringToFront() {\n arialLevelTracker.push(this._element);\n }\n setBounds(bounds = {}) {\n if (typeof bounds.height === 'number') {\n this._element.style.height = `${bounds.height}px`;\n }\n if (typeof bounds.width === 'number') {\n this._element.style.width = `${bounds.width}px`;\n }\n if ('top' in bounds && typeof bounds.top === 'number') {\n this._element.style.top = `${bounds.top}px`;\n this._element.style.bottom = 'auto';\n this.verticalAlignment = 'top';\n }\n if ('bottom' in bounds && typeof bounds.bottom === 'number') {\n this._element.style.bottom = `${bounds.bottom}px`;\n this._element.style.top = 'auto';\n this.verticalAlignment = 'bottom';\n }\n if ('left' in bounds && typeof bounds.left === 'number') {\n this._element.style.left = `${bounds.left}px`;\n this._element.style.right = 'auto';\n this.horiziontalAlignment = 'left';\n }\n if ('right' in bounds && typeof bounds.right === 'number') {\n this._element.style.right = `${bounds.right}px`;\n this._element.style.left = 'auto';\n this.horiziontalAlignment = 'right';\n }\n const containerRect = this.options.container.getBoundingClientRect();\n const overlayRect = this._element.getBoundingClientRect();\n // region: ensure bounds within allowable limits\n // a minimum width of minimumViewportWidth must be inside the viewport\n const xOffset = Math.max(0, this.getMinimumWidth(overlayRect.width));\n // a minimum height of minimumViewportHeight must be inside the viewport\n const yOffset = Math.max(0, this.getMinimumHeight(overlayRect.height));\n if (this.verticalAlignment === 'top') {\n const top = clamp(overlayRect.top - containerRect.top, -yOffset, Math.max(0, containerRect.height - overlayRect.height + yOffset));\n this._element.style.top = `${top}px`;\n this._element.style.bottom = 'auto';\n }\n if (this.verticalAlignment === 'bottom') {\n const bottom = clamp(containerRect.bottom - overlayRect.bottom, -yOffset, Math.max(0, containerRect.height - overlayRect.height + yOffset));\n this._element.style.bottom = `${bottom}px`;\n this._element.style.top = 'auto';\n }\n if (this.horiziontalAlignment === 'left') {\n const left = clamp(overlayRect.left - containerRect.left, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));\n this._element.style.left = `${left}px`;\n this._element.style.right = 'auto';\n }\n if (this.horiziontalAlignment === 'right') {\n const right = clamp(containerRect.right - overlayRect.right, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));\n this._element.style.right = `${right}px`;\n this._element.style.left = 'auto';\n }\n this._onDidChange.fire();\n }\n toJSON() {\n const container = this.options.container.getBoundingClientRect();\n const element = this._element.getBoundingClientRect();\n const result = {};\n if (this.verticalAlignment === 'top') {\n result.top = parseFloat(this._element.style.top);\n }\n else if (this.verticalAlignment === 'bottom') {\n result.bottom = parseFloat(this._element.style.bottom);\n }\n else {\n result.top = element.top - container.top;\n }\n if (this.horiziontalAlignment === 'left') {\n result.left = parseFloat(this._element.style.left);\n }\n else if (this.horiziontalAlignment === 'right') {\n result.right = parseFloat(this._element.style.right);\n }\n else {\n result.left = element.left - container.left;\n }\n result.width = element.width;\n result.height = element.height;\n return result;\n }\n /**\n * Abort an in-flight move-the-float drag. Used by the void container\n * when a redock long-press fires after the move started, so the ghost\n * gesture wins without the float continuing to follow the finger.\n * Does not emit `onDidChangeEnd` because no change is being committed.\n */\n cancelPendingDrag() {\n if (!this._dragMove.value) {\n return;\n }\n this._dragCancelled = true;\n toggleClass(this._element, 'dv-resize-container-dragging', false);\n this._dragMove.value = Disposable.NONE;\n }\n setupDrag(dragTarget, options = { inDragMode: false }) {\n const track = (captureTarget, pointerId) => {\n let offset = null;\n let hasMoved = false;\n this._dragCancelled = false;\n const iframes = disableIframePointEvents();\n if (captureTarget &&\n typeof pointerId === 'number' &&\n typeof captureTarget.setPointerCapture === 'function') {\n try {\n captureTarget.setPointerCapture(pointerId);\n }\n catch (_a) {\n // ignore – non-fatal if the browser refuses capture\n }\n }\n const end = () => {\n toggleClass(this._element, 'dv-resize-container-dragging', false);\n this._dragMove.value = Disposable.NONE;\n this._onDidChangeEnd.fire();\n };\n this._dragMove.value = new CompositeDisposable({\n dispose: () => {\n iframes.release();\n if (captureTarget &&\n typeof pointerId === 'number' &&\n typeof captureTarget.releasePointerCapture ===\n 'function') {\n try {\n captureTarget.releasePointerCapture(pointerId);\n }\n catch (_a) {\n // ignore – pointer may already be released\n }\n }\n },\n }, addDisposableListener(window, 'pointermove', (e) => {\n if (this._dragCancelled) {\n return;\n }\n const containerRect = this.options.container.getBoundingClientRect();\n const x = e.clientX - containerRect.left;\n const y = e.clientY - containerRect.top;\n toggleClass(this._element, 'dv-resize-container-dragging', true);\n const overlayRect = this._element.getBoundingClientRect();\n if (offset === null) {\n offset = {\n x: e.clientX - overlayRect.left,\n y: e.clientY - overlayRect.top,\n };\n }\n const xOffset = Math.max(0, this.getMinimumWidth(overlayRect.width));\n const yOffset = Math.max(0, this.getMinimumHeight(overlayRect.height));\n const top = clamp(y - offset.y, -yOffset, Math.max(0, containerRect.height - overlayRect.height + yOffset));\n const bottom = clamp(offset.y -\n y +\n containerRect.height -\n overlayRect.height, -yOffset, Math.max(0, containerRect.height - overlayRect.height + yOffset));\n const left = clamp(x - offset.x, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));\n const right = clamp(offset.x - x + containerRect.width - overlayRect.width, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));\n const bounds = {};\n // Anchor to top or to bottom depending on which one is closer\n if (top <= bottom) {\n bounds.top = top;\n }\n else {\n bounds.bottom = bottom;\n }\n // Anchor to left or to right depending on which one is closer\n if (left <= right) {\n bounds.left = left;\n }\n else {\n bounds.right = right;\n }\n this.setBounds(bounds);\n if (!hasMoved) {\n hasMoved = true;\n this._onDidStartMoving.fire();\n }\n }), addDisposableListener(window, 'pointerup', end), addDisposableListener(window, 'pointercancel', end));\n };\n this.addDisposables(addDisposableListener(dragTarget, 'pointerdown', (event) => {\n if (event.defaultPrevented) {\n event.preventDefault();\n return;\n }\n // if somebody has marked this event then treat as a defaultPrevented\n // without actually calling event.preventDefault()\n if (quasiDefaultPrevented(event)) {\n return;\n }\n track(dragTarget, event.pointerId);\n }), addDisposableListener(this.options.content, 'pointerdown', (event) => {\n if (event.defaultPrevented) {\n return;\n }\n // if somebody has marked this event then treat as a defaultPrevented\n // without actually calling event.preventDefault()\n if (quasiDefaultPrevented(event)) {\n return;\n }\n if (event.shiftKey) {\n track(this.options.content, event.pointerId);\n }\n }), addDisposableListener(this.options.content, 'pointerdown', () => {\n arialLevelTracker.push(this._element);\n }, true));\n if (options.inDragMode) {\n track();\n }\n }\n setupResize(direction) {\n const resizeHandleElement = document.createElement('div');\n resizeHandleElement.className = `dv-resize-handle-${direction}`;\n this._element.appendChild(resizeHandleElement);\n const move = new MutableDisposable();\n this.addDisposables(move, addDisposableListener(resizeHandleElement, 'pointerdown', (e) => {\n e.preventDefault();\n let startPosition = null;\n const iframes = disableIframePointEvents();\n const pointerId = e.pointerId;\n if (typeof resizeHandleElement.setPointerCapture === 'function') {\n try {\n resizeHandleElement.setPointerCapture(pointerId);\n }\n catch (_a) {\n // ignore – non-fatal if the browser refuses capture\n }\n }\n const end = () => {\n move.dispose();\n this._onDidChangeEnd.fire();\n };\n move.value = new CompositeDisposable(addDisposableListener(window, 'pointermove', (e) => {\n const containerRect = this.options.container.getBoundingClientRect();\n const overlayRect = this._element.getBoundingClientRect();\n const y = e.clientY - containerRect.top;\n const x = e.clientX - containerRect.left;\n if (startPosition === null) {\n // record the initial dimensions since as all subsequence moves are relative to this\n startPosition = {\n originalY: y,\n originalHeight: overlayRect.height,\n originalX: x,\n originalWidth: overlayRect.width,\n };\n }\n let top = undefined;\n let bottom = undefined;\n let height = undefined;\n let left = undefined;\n let right = undefined;\n let width = undefined;\n const moveTop = () => {\n // When dragging top handle, constrain top position to prevent oversizing\n const maxTop = startPosition.originalY +\n startPosition.originalHeight >\n containerRect.height\n ? Math.max(0, containerRect.height -\n Overlay.MINIMUM_HEIGHT)\n : Math.max(0, startPosition.originalY +\n startPosition.originalHeight -\n Overlay.MINIMUM_HEIGHT);\n top = clamp(y, 0, maxTop);\n height =\n startPosition.originalY +\n startPosition.originalHeight -\n top;\n bottom = containerRect.height - top - height;\n };\n const moveBottom = () => {\n top =\n startPosition.originalY -\n startPosition.originalHeight;\n // When dragging bottom handle, constrain height to container height\n const minHeight = top < 0 &&\n typeof this.options.minimumInViewportHeight ===\n 'number'\n ? -top +\n this.options.minimumInViewportHeight\n : Overlay.MINIMUM_HEIGHT;\n const maxHeight = containerRect.height - Math.max(0, top);\n height = clamp(y - top, minHeight, maxHeight);\n bottom = containerRect.height - top - height;\n };\n const moveLeft = () => {\n const maxLeft = startPosition.originalX +\n startPosition.originalWidth >\n containerRect.width\n ? Math.max(0, containerRect.width -\n Overlay.MINIMUM_WIDTH) // Prevent extending beyong right edge\n : Math.max(0, startPosition.originalX +\n startPosition.originalWidth -\n Overlay.MINIMUM_WIDTH);\n left = clamp(x, 0, maxLeft); // min is 0 (Not -Infinity) to prevent dragging beyond left edge\n width =\n startPosition.originalX +\n startPosition.originalWidth -\n left;\n right = containerRect.width - left - width;\n };\n const moveRight = () => {\n left =\n startPosition.originalX -\n startPosition.originalWidth;\n // When dragging right handle, constrain width to container width\n const minWidth = left < 0 &&\n typeof this.options.minimumInViewportWidth ===\n 'number'\n ? -left +\n this.options.minimumInViewportWidth\n : Overlay.MINIMUM_WIDTH;\n const maxWidth = containerRect.width - Math.max(0, left);\n width = clamp(x - left, minWidth, maxWidth);\n right = containerRect.width - left - width;\n };\n switch (direction) {\n case 'top':\n moveTop();\n break;\n case 'bottom':\n moveBottom();\n break;\n case 'left':\n moveLeft();\n break;\n case 'right':\n moveRight();\n break;\n case 'topleft':\n moveTop();\n moveLeft();\n break;\n case 'topright':\n moveTop();\n moveRight();\n break;\n case 'bottomleft':\n moveBottom();\n moveLeft();\n break;\n case 'bottomright':\n moveBottom();\n moveRight();\n break;\n }\n const bounds = {};\n // Anchor to top or to bottom depending on which one is closer\n if (top <= bottom) {\n bounds.top = top;\n }\n else {\n bounds.bottom = bottom;\n }\n // Anchor to left or to right depending on which one is closer\n if (left <= right) {\n bounds.left = left;\n }\n else {\n bounds.right = right;\n }\n bounds.height = height;\n bounds.width = width;\n this.setBounds(bounds);\n }), {\n dispose: () => {\n iframes.release();\n if (typeof resizeHandleElement.releasePointerCapture ===\n 'function') {\n try {\n resizeHandleElement.releasePointerCapture(pointerId);\n }\n catch (_a) {\n // ignore – pointer may already be released\n }\n }\n },\n }, addDisposableListener(window, 'pointerup', end), addDisposableListener(window, 'pointercancel', end));\n }));\n }\n getMinimumWidth(width) {\n if (typeof this.options.minimumInViewportWidth === 'number') {\n return width - this.options.minimumInViewportWidth;\n }\n return 0;\n }\n getMinimumHeight(height) {\n if (typeof this.options.minimumInViewportHeight === 'number') {\n return height - this.options.minimumInViewportHeight;\n }\n return 0;\n }\n dispose() {\n arialLevelTracker.destroy(this._element);\n this._element.remove();\n super.dispose();\n }\n}\nOverlay.MINIMUM_HEIGHT = 20;\nOverlay.MINIMUM_WIDTH = 20;\n\nclass DockviewFloatingGroupPanel extends CompositeDisposable {\n constructor(group, overlay) {\n super();\n this.group = group;\n this.overlay = overlay;\n this.addDisposables(overlay);\n }\n position(bounds) {\n this.overlay.setBounds(bounds);\n }\n}\n\nconst DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE = 100;\nconst DEFAULT_FLOATING_GROUP_POSITION = {\n left: 100,\n top: 100,\n width: 300,\n height: 300,\n};\nconst DESERIALIZATION_POPOUT_DELAY_MS = 100;\n\nclass PositionCache {\n constructor() {\n this.cache = new Map();\n this.currentFrameId = 0;\n this.rafId = null;\n }\n getPosition(element) {\n const cached = this.cache.get(element);\n if (cached && cached.frameId === this.currentFrameId) {\n return cached.rect;\n }\n this.scheduleFrameUpdate();\n const rect = getDomNodePagePosition(element);\n this.cache.set(element, { rect, frameId: this.currentFrameId });\n return rect;\n }\n invalidate() {\n this.currentFrameId++;\n }\n scheduleFrameUpdate() {\n if (this.rafId)\n return;\n this.rafId = requestAnimationFrame(() => {\n this.currentFrameId++;\n this.rafId = null;\n });\n }\n}\nfunction createFocusableElement() {\n const element = document.createElement('div');\n element.tabIndex = -1;\n return element;\n}\nclass OverlayRenderContainer extends CompositeDisposable {\n constructor(element, accessor) {\n super();\n this.element = element;\n this.accessor = accessor;\n this.map = {};\n this._disposed = false;\n this.positionCache = new PositionCache();\n this.pendingUpdates = new Set();\n this.addDisposables(Disposable.from(() => {\n for (const value of Object.values(this.map)) {\n value.disposable.dispose();\n value.destroy.dispose();\n }\n this._disposed = true;\n }));\n }\n updateAllPositions() {\n if (this._disposed) {\n return;\n }\n // Invalidate position cache to force recalculation\n this.positionCache.invalidate();\n // Call resize function directly for all visible panels\n for (const entry of Object.values(this.map)) {\n if (entry.panel.api.isVisible && entry.resize) {\n entry.resize();\n }\n }\n }\n detatch(panel) {\n if (this.map[panel.api.id]) {\n const { disposable, destroy } = this.map[panel.api.id];\n disposable.dispose();\n destroy.dispose();\n delete this.map[panel.api.id];\n return true;\n }\n return false;\n }\n attach(options) {\n const { panel, referenceContainer } = options;\n if (!this.map[panel.api.id]) {\n const element = createFocusableElement();\n element.className = 'dv-render-overlay';\n // Hide until the first RAF-based position is applied to prevent a\n // one-frame flash at position 0,0 when the element is first attached.\n element.style.visibility = 'hidden';\n this.map[panel.api.id] = {\n panel,\n disposable: Disposable.NONE,\n destroy: Disposable.NONE,\n element,\n };\n }\n const focusContainer = this.map[panel.api.id].element;\n // Capture the content element now so the destroy disposable below\n // does not re-query the renderer's `element` getter during teardown.\n // Some framework adapters (e.g. dockview-angular) tear down their\n // backing renderer before this disposable fires; reading through the\n // getter at that point can throw.\n const contentElement = panel.view.content.element;\n if (contentElement.parentElement !== focusContainer) {\n focusContainer.appendChild(contentElement);\n }\n if (focusContainer.parentElement !== this.element) {\n this.element.appendChild(focusContainer);\n }\n const resize = () => {\n const panelId = panel.api.id;\n if (this.pendingUpdates.has(panelId)) {\n return; // Update already scheduled\n }\n this.pendingUpdates.add(panelId);\n requestAnimationFrame(() => {\n this.pendingUpdates.delete(panelId);\n if (this.isDisposed || !this.map[panelId]) {\n return;\n }\n const box = this.positionCache.getPosition(referenceContainer.element);\n const box2 = this.positionCache.getPosition(this.element);\n // Use traditional positioning for overlay containers\n const left = box.left - box2.left;\n const top = box.top - box2.top;\n const width = box.width;\n const height = box.height;\n focusContainer.style.left = `${left}px`;\n focusContainer.style.top = `${top}px`;\n focusContainer.style.width = `${width}px`;\n focusContainer.style.height = `${height}px`;\n // Sync visibility/pointer-events with the panel's current\n // visibility at paint time. visibilityChanged() may have\n // flipped to hidden between scheduling this rAF and now;\n // unconditionally clearing `visibility:hidden` here would\n // leave a hidden panel visually visible at a stale position,\n // because onDidDimensionsChange skips non-visible panels and\n // never recomputes their box on subsequent resizes.\n if (panel.api.isVisible) {\n focusContainer.style.visibility = '';\n focusContainer.style.pointerEvents = '';\n }\n else {\n focusContainer.style.visibility = 'hidden';\n focusContainer.style.pointerEvents = 'none';\n }\n toggleClass(focusContainer, 'dv-render-overlay-float', panel.group.api.location.type === 'floating');\n });\n };\n const visibilityChanged = () => {\n if (panel.api.isVisible) {\n this.positionCache.invalidate();\n resize();\n focusContainer.style.pointerEvents = '';\n }\n else {\n focusContainer.style.visibility = 'hidden';\n focusContainer.style.pointerEvents = 'none';\n }\n };\n const observerDisposable = new MutableDisposable();\n const correctLayerPosition = () => {\n if (panel.api.location.type === 'floating') {\n queueMicrotask(() => {\n const floatingGroup = this.accessor.floatingGroups.find((group) => group.group === panel.api.group);\n if (!floatingGroup) {\n return;\n }\n const element = floatingGroup.overlay.element;\n const update = () => {\n const level = Number(element.getAttribute('aria-level'));\n focusContainer.style.zIndex = `calc(var(--dv-overlay-z-index, 999) + ${level * 2 + 1})`;\n };\n const observer = new MutationObserver(() => {\n update();\n });\n observerDisposable.value = Disposable.from(() => observer.disconnect());\n observer.observe(element, {\n attributeFilter: ['aria-level'],\n attributes: true,\n });\n update();\n });\n }\n else {\n focusContainer.style.zIndex = ''; // reset the z-index, perhaps CSS will take over here\n }\n };\n const disposable = new CompositeDisposable(observerDisposable, \n /**\n * since container is positioned absoutely we must explicitly forward\n * the dnd events for the expect behaviours to continue to occur in terms of dnd\n *\n * the dnd observer does not need to be conditional on whether the panel is visible since\n * non-visible panels have 'pointer-events: none' and in such case the dnd observer will not fire.\n */\n new DragAndDropObserver(focusContainer, {\n onDragEnd: (e) => {\n referenceContainer.dropTarget.dnd.onDragEnd(e);\n },\n onDragEnter: (e) => {\n referenceContainer.dropTarget.dnd.onDragEnter(e);\n },\n onDragLeave: (e) => {\n referenceContainer.dropTarget.dnd.onDragLeave(e);\n },\n onDrop: (e) => {\n referenceContainer.dropTarget.dnd.onDrop(e);\n },\n onDragOver: (e) => {\n referenceContainer.dropTarget.dnd.onDragOver(e);\n },\n }), panel.api.onDidVisibilityChange(() => {\n /**\n * Control the visibility of the content, however even when not visible (display: none)\n * the content is still maintained within the DOM hence DOM specific attributes\n * such as scroll position are maintained when next made visible.\n */\n visibilityChanged();\n }), panel.api.onDidDimensionsChange(() => {\n if (!panel.api.isVisible) {\n return;\n }\n resize();\n }), panel.api.onDidLocationChange(() => {\n correctLayerPosition();\n }));\n this.map[panel.api.id].destroy = Disposable.from(() => {\n var _a;\n if (contentElement.parentElement === focusContainer) {\n focusContainer.removeChild(contentElement);\n }\n (_a = focusContainer.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(focusContainer);\n });\n correctLayerPosition();\n queueMicrotask(() => {\n if (this.isDisposed) {\n return;\n }\n /**\n * wait until everything has finished in the current stack-frame call before\n * calling the first resize as other size-altering events may still occur before\n * the end of the stack-frame.\n */\n visibilityChanged();\n });\n // dispose of logic asoccciated with previous reference-container\n this.map[panel.api.id].disposable.dispose();\n // and reset the disposable to the active reference-container\n this.map[panel.api.id].disposable = disposable;\n // store the resize function for direct access\n this.map[panel.api.id].resize = resize;\n return focusContainer;\n }\n}\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\n/**\n * Reject popout URLs that aren't same-origin http(s). Blocks `javascript:`,\n * `data:`, `blob:`, `vbscript:`, and cross-origin URLs that would otherwise\n * execute in a context the browser still associates with the opener via\n * `window.opener`.\n */\nfunction assertSameOriginPopoutUrl(url) {\n let resolved;\n try {\n resolved = new URL(url, window.location.href);\n }\n catch (_a) {\n throw new Error(`dockview: invalid popout URL: ${url}`);\n }\n const protocolOk = resolved.protocol === 'http:' || resolved.protocol === 'https:';\n if (!protocolOk || resolved.origin !== window.location.origin) {\n throw new Error(`dockview: popout URL must be same-origin http(s); got: ${url}`);\n }\n}\nclass PopoutWindow extends CompositeDisposable {\n get window() {\n var _a, _b;\n return (_b = (_a = this._window) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : null;\n }\n constructor(target, className, options) {\n super();\n this.target = target;\n this.className = className;\n this.options = options;\n this._onWillClose = new Emitter();\n this.onWillClose = this._onWillClose.event;\n this._onDidClose = new Emitter();\n this.onDidClose = this._onDidClose.event;\n this._window = null;\n this.addDisposables(this._onWillClose, this._onDidClose, {\n dispose: () => {\n this.close();\n },\n });\n }\n dimensions() {\n if (!this._window) {\n return null;\n }\n const left = this._window.value.screenX;\n const top = this._window.value.screenY;\n const width = this._window.value.innerWidth;\n const height = this._window.value.innerHeight;\n return { top, left, width, height };\n }\n close() {\n var _a, _b;\n if (this._window) {\n this._onWillClose.fire();\n (_b = (_a = this.options).onWillClose) === null || _b === void 0 ? void 0 : _b.call(_a, {\n id: this.target,\n window: this._window.value,\n });\n this._window.disposable.dispose();\n this._window = null;\n this._onDidClose.fire();\n }\n }\n open() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n if (this._window) {\n throw new Error('instance of popout window is already open');\n }\n const url = `${this.options.url}`;\n assertSameOriginPopoutUrl(url);\n const features = Object.entries({\n top: this.options.top,\n left: this.options.left,\n width: this.options.width,\n height: this.options.height,\n })\n .map(([key, value]) => `${key}=${value}`)\n .join(',');\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/open\n */\n const externalWindow = window.open(url, this.target, features);\n if (!externalWindow) {\n /**\n * Popup blocked\n */\n return null;\n }\n const disposable = new CompositeDisposable();\n this._window = { value: externalWindow, disposable };\n disposable.addDisposables(Disposable.from(() => {\n externalWindow.close();\n }), addDisposableListener(window, 'beforeunload', () => {\n /**\n * before the main window closes we should close this popup too\n * to be good citizens\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event\n */\n this.close();\n }));\n const container = this.createPopoutWindowContainer();\n if (this.className) {\n container.classList.add(this.className);\n }\n (_b = (_a = this.options).onDidOpen) === null || _b === void 0 ? void 0 : _b.call(_a, {\n id: this.target,\n window: externalWindow,\n });\n return new Promise((resolve, reject) => {\n externalWindow.addEventListener('unload', (e) => {\n // if page fails to load before unloading\n // this.close();\n });\n externalWindow.addEventListener('load', () => {\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event\n */\n try {\n const externalDocument = externalWindow.document;\n externalDocument.title = document.title;\n externalDocument.body.appendChild(container);\n addStyles(externalDocument, window.document.styleSheets, {\n nonce: this.options.nonce,\n });\n /**\n * beforeunload must be registered after load for reasons I could not determine\n * otherwise the beforeunload event will not fire when the window is closed\n */\n addDisposableListener(externalWindow, 'beforeunload', () => {\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event\n */\n this.close();\n });\n resolve(container);\n }\n catch (err) {\n // only except this is the DOM isn't setup. e.g. in a in correctly configured test\n reject(err);\n }\n });\n });\n });\n }\n createPopoutWindowContainer() {\n const el = document.createElement('div');\n el.classList.add('dv-popout-window');\n el.id = 'dv-popout-window';\n el.style.position = 'absolute';\n el.style.width = '100%';\n el.style.height = '100%';\n el.style.top = '0px';\n el.style.left = '0px';\n return el;\n }\n}\n\nclass StrictEventsSequencing extends CompositeDisposable {\n constructor(accessor) {\n super();\n this.accessor = accessor;\n this.init();\n }\n init() {\n const panels = new Set();\n const groups = new Set();\n this.addDisposables(this.accessor.onDidAddPanel((panel) => {\n if (panels.has(panel.api.id)) {\n throw new Error(`dockview: Invalid event sequence. [onDidAddPanel] called for panel ${panel.api.id} but panel already exists`);\n }\n else {\n panels.add(panel.api.id);\n }\n }), this.accessor.onDidRemovePanel((panel) => {\n if (!panels.has(panel.api.id)) {\n throw new Error(`dockview: Invalid event sequence. [onDidRemovePanel] called for panel ${panel.api.id} but panel does not exists`);\n }\n else {\n panels.delete(panel.api.id);\n }\n }), this.accessor.onDidAddGroup((group) => {\n if (groups.has(group.api.id)) {\n throw new Error(`dockview: Invalid event sequence. [onDidAddGroup] called for group ${group.api.id} but group already exists`);\n }\n else {\n groups.add(group.api.id);\n }\n }), this.accessor.onDidRemoveGroup((group) => {\n if (!groups.has(group.api.id)) {\n throw new Error(`dockview: Invalid event sequence. [onDidRemoveGroup] called for group ${group.api.id} but group does not exists`);\n }\n else {\n groups.delete(group.api.id);\n }\n }));\n }\n}\n\nfunction isCoarsePrimaryInput$1(win) {\n if (!win.matchMedia) {\n return false;\n }\n const coarse = win.matchMedia('(pointer: coarse)').matches;\n const fine = win.matchMedia('(pointer: fine)').matches;\n return coarse && !fine;\n}\nclass PopupService extends CompositeDisposable {\n constructor(root, win = window) {\n super();\n this._active = null;\n this._activeDisposable = new MutableDisposable();\n this._root = root;\n this._window = win;\n this._element = win.document.createElement('div');\n this._element.className = 'dv-popover-anchor';\n this._element.style.position = 'relative';\n this._root.prepend(this._element);\n this.addDisposables(Disposable.from(() => {\n this.close();\n }), this._activeDisposable);\n }\n /**\n * Move the popup anchor into a new root element. Call this when a shell\n * wraps the dockview component so that edge-group overflow dropdowns\n * position correctly relative to the full layout area.\n */\n updateRoot(newRoot) {\n newRoot.prepend(this._element);\n this._root = newRoot;\n }\n openPopover(element, position) {\n var _a;\n this.close();\n const wrapper = this._window.document.createElement('div');\n wrapper.style.position = 'absolute';\n wrapper.style.zIndex = (_a = position.zIndex) !== null && _a !== void 0 ? _a : 'var(--dv-overlay-z-index)';\n wrapper.appendChild(element);\n const anchorBox = this._element.getBoundingClientRect();\n const offsetX = anchorBox.left;\n const offsetY = anchorBox.top;\n wrapper.style.top = `${position.y - offsetY}px`;\n wrapper.style.left = `${position.x - offsetX}px`;\n this._element.appendChild(wrapper);\n this._active = wrapper;\n // Outside-pointerdown dismissal is suppressed for a short grace\n // window after opening. Touch long-press callers (chip / tab context\n // menus) open the popover while the user's finger is still pressing\n // the source element — Android Chrome can dispatch a follow-up\n // synthetic pointerdown tied to the gesture, and the release-then-\n // retap motion can land just outside the wrapper. Either would\n // dismiss the popover before the user can see or interact with it.\n // The grace window is short enough that intentional outside taps\n // still feel responsive.\n const openedAt = Date.now();\n const POINTERDOWN_GRACE_MS = 200;\n this._activeDisposable.value = new CompositeDisposable(addDisposableListener(this._window, 'pointerdown', (event) => {\n var _a;\n if (Date.now() - openedAt < POINTERDOWN_GRACE_MS) {\n return;\n }\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n let el = target;\n while (el && el !== wrapper) {\n el = (_a = el === null || el === void 0 ? void 0 : el.parentElement) !== null && _a !== void 0 ? _a : null;\n }\n if (el) {\n return; // clicked within popover\n }\n this.close();\n }), addDisposableListener(this._window, 'keydown', (event) => {\n if (event.key === 'Escape' || event.key === 'Enter') {\n this.close();\n }\n }), addDisposableListener(this._window, 'resize', () => {\n // On touch-primary devices, common interactions resize the\n // window: on-screen keyboard pop, orientation change, browser\n // address-bar collapse. None of these mean \"the user wants\n // the popover dismissed\". Specifically, focusing the chip\n // context menu's rename input pops the keyboard, which would\n // otherwise close the menu the moment the user goes to edit\n // it. Desktop / hybrid input keeps the existing behaviour —\n // there a resize genuinely means the user has resized the\n // window and the popover position is now stale.\n if (isCoarsePrimaryInput$1(this._window)) {\n return;\n }\n this.close();\n }));\n this._window.requestAnimationFrame(() => {\n shiftAbsoluteElementIntoView(wrapper, this._root);\n });\n }\n close() {\n if (this._active) {\n this._active.remove();\n this._activeDisposable.dispose();\n this._active = null;\n }\n }\n}\n\nfunction popoverZIndexFor(target) {\n if (!(target instanceof HTMLElement)) {\n return undefined;\n }\n // Floating overlays live in the shell as siblings of the popover anchor\n // and the AriaLevelTracker sets their inline z-index. Without this, a\n // popover opened from inside a floating group would render behind it\n // because they share the shell stacking context.\n const relativeParent = findRelativeZIndexParent(target);\n return (relativeParent === null || relativeParent === void 0 ? void 0 : relativeParent.style.zIndex)\n ? `calc(${relativeParent.style.zIndex} * 2)`\n : undefined;\n}\nlet _nextId = 0;\nconst nextContextMenuItemId = () => `dv-ctx-menu-item-${_nextId++}`;\nfunction isItemConfig(item) {\n return typeof item === 'object';\n}\nfunction buildItem(label, close, action, disabled) {\n const el = document.createElement('div');\n el.className = 'dv-context-menu-item';\n el.setAttribute('role', 'menuitem');\n if (disabled) {\n el.classList.add('dv-context-menu-item--disabled');\n el.setAttribute('aria-disabled', 'true');\n }\n el.textContent = label;\n if (!disabled) {\n el.addEventListener('click', () => {\n action();\n close();\n });\n }\n return el;\n}\nfunction buildSeparator() {\n const el = document.createElement('div');\n el.className = 'dv-context-menu-separator';\n el.setAttribute('role', 'separator');\n return el;\n}\nfunction isCoarsePrimaryInput() {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return false;\n }\n const coarse = window.matchMedia('(pointer: coarse)').matches;\n const fine = window.matchMedia('(pointer: fine)').matches;\n return coarse && !fine;\n}\nfunction buildRenameInput(tabGroup) {\n const wrapper = document.createElement('div');\n wrapper.className = 'dv-context-menu-rename';\n const input = document.createElement('input');\n input.className = 'dv-context-menu-rename-input';\n input.type = 'text';\n input.placeholder = 'Name This Group';\n input.value = tabGroup.label;\n input.addEventListener('input', () => {\n tabGroup.setLabel(input.value);\n });\n input.addEventListener('keydown', (e) => {\n if (e.key !== 'Escape' && e.key !== 'Enter') {\n e.stopPropagation();\n }\n });\n input.addEventListener('click', (e) => {\n e.stopPropagation();\n });\n wrapper.appendChild(input);\n // Skip auto-focus on touch-primary devices: focusing the input pops the\n // on-screen keyboard, which fires `window resize`, which `PopupService`\n // listens to and uses to dismiss the popover — so the menu opens, the\n // keyboard appears, and the menu immediately closes before the user can\n // type. The user can still tap the input to focus it intentionally.\n if (!isCoarsePrimaryInput()) {\n requestAnimationFrame(() => {\n input.focus();\n input.select();\n });\n }\n return wrapper;\n}\nfunction buildColorPicker(tabGroup, palette) {\n const wrapper = document.createElement('div');\n wrapper.className = 'dv-context-menu-color-picker';\n if (!palette.enabled) {\n // Opt-out: render no swatches. Returning a wrapper rather than null\n // keeps the call site simple; the wrapper is empty and visually inert.\n return wrapper;\n }\n for (const entry of palette.entries()) {\n const swatch = document.createElement('div');\n swatch.className = 'dv-context-menu-color-swatch';\n // Use a CSS custom property rather than setting `backgroundColor`\n // directly: the IDL setter validates the value against a color\n // grammar and rejects `var(...)` references in some environments\n // (notably jsdom; some browsers have historically had similar\n // quirks). The matching SCSS rule reads the var at use time.\n swatch.style.setProperty('--dv-tab-group-color', entry.value);\n if (entry.label) {\n swatch.title = entry.label;\n }\n if (tabGroup.color === entry.id) {\n swatch.classList.add('dv-context-menu-color-swatch--selected');\n }\n swatch.addEventListener('click', () => {\n tabGroup.setColor(entry.id);\n });\n wrapper.appendChild(swatch);\n }\n return wrapper;\n}\nclass ContextMenuController {\n constructor(accessor) {\n this.accessor = accessor;\n }\n show(panel, group, event) {\n var _a, _b;\n if (!this.accessor.options.getTabContextMenuItems) {\n return;\n }\n const items = this.accessor.options.getTabContextMenuItems({\n panel,\n group,\n api: this.accessor.api,\n event,\n });\n if (items.length === 0) {\n return;\n }\n event.preventDefault();\n const popupService = this.accessor.getPopupServiceForGroup(group);\n const close = () => popupService.close();\n const menuEl = document.createElement('div');\n menuEl.className = 'dv-context-menu';\n menuEl.setAttribute('role', 'menu');\n for (const item of items) {\n if (item === 'separator') {\n menuEl.appendChild(buildSeparator());\n }\n else if (item === 'close') {\n menuEl.appendChild(buildItem('Close', close, () => panel.api.close()));\n }\n else if (item === 'closeOthers') {\n menuEl.appendChild(buildItem('Close Others', close, () => {\n group.panels\n .filter((p) => p !== panel)\n .forEach((p) => p.api.close());\n }));\n }\n else if (item === 'closeAll') {\n menuEl.appendChild(buildItem('Close All', close, () => {\n [...group.panels].forEach((p) => p.api.close());\n }));\n }\n else if (isItemConfig(item) && item.element) {\n menuEl.appendChild(item.element);\n }\n else if (isItemConfig(item) && item.component) {\n const renderer = (_b = (_a = this.accessor.options).createContextMenuItemComponent) === null || _b === void 0 ? void 0 : _b.call(_a, {\n id: nextContextMenuItemId(),\n component: item.component,\n });\n if (renderer) {\n renderer.init({\n panel,\n group,\n api: this.accessor.api,\n close,\n componentProps: item.componentProps,\n });\n menuEl.appendChild(renderer.element);\n }\n }\n else if (isItemConfig(item) && item.label) {\n menuEl.appendChild(buildItem(item.label, close, () => { var _a; return (_a = item.action) === null || _a === void 0 ? void 0 : _a.call(item); }, item.disabled));\n }\n }\n popupService.openPopover(menuEl, {\n x: event.clientX,\n y: event.clientY,\n zIndex: popoverZIndexFor(event.target),\n });\n }\n showForChip(tabGroup, group, event) {\n if (!this.accessor.options.getTabGroupChipContextMenuItems) {\n return;\n }\n const items = this.accessor.options.getTabGroupChipContextMenuItems({\n tabGroup,\n group,\n api: this.accessor.api,\n event,\n });\n if (items.length === 0) {\n return;\n }\n event.preventDefault();\n const popupService = this.accessor.getPopupServiceForGroup(group);\n const close = () => popupService.close();\n const menuEl = document.createElement('div');\n menuEl.className = 'dv-context-menu';\n menuEl.setAttribute('role', 'menu');\n for (const item of items) {\n if (item === 'separator') {\n menuEl.appendChild(buildSeparator());\n }\n else if (item === 'rename') {\n menuEl.appendChild(buildRenameInput(tabGroup));\n }\n else if (item === 'colorPicker') {\n menuEl.appendChild(buildColorPicker(tabGroup, this.accessor.tabGroupColorPalette));\n }\n else if (isItemConfig(item) && item.element) {\n menuEl.appendChild(item.element);\n }\n else if (isItemConfig(item) && item.label) {\n menuEl.appendChild(buildItem(item.label, close, () => { var _a; return (_a = item.action) === null || _a === void 0 ? void 0 : _a.call(item); }, item.disabled));\n }\n }\n popupService.openPopover(menuEl, {\n x: event.clientX,\n y: event.clientY,\n zIndex: popoverZIndexFor(event.target),\n });\n }\n}\n\nclass DropTargetAnchorContainer extends CompositeDisposable {\n get disabled() {\n return this._disabled;\n }\n set disabled(value) {\n var _a;\n if (this.disabled === value) {\n return;\n }\n this._disabled = value;\n if (value) {\n (_a = this.model) === null || _a === void 0 ? void 0 : _a.clear();\n }\n }\n get model() {\n if (this.disabled) {\n return undefined;\n }\n return {\n clear: () => {\n var _a;\n if (this._model) {\n (_a = this._model.root.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(this._model.root);\n }\n this._model = undefined;\n },\n exists: () => {\n return !!this._model;\n },\n getElements: (event, outline) => {\n const changed = this._outline !== outline;\n this._outline = outline;\n if (this._model) {\n this._model.changed = changed;\n return this._model;\n }\n const container = this.createContainer();\n const anchor = this.createAnchor();\n this._model = { root: container, overlay: anchor, changed };\n container.appendChild(anchor);\n this.element.appendChild(container);\n if ((event === null || event === void 0 ? void 0 : event.target) instanceof HTMLElement) {\n const targetBox = event.target.getBoundingClientRect();\n const box = this.element.getBoundingClientRect();\n anchor.style.left = `${targetBox.left - box.left}px`;\n anchor.style.top = `${targetBox.top - box.top}px`;\n }\n return this._model;\n },\n };\n }\n constructor(element, options) {\n super();\n this.element = element;\n this._disabled = false;\n this._disabled = options.disabled;\n this.addDisposables(Disposable.from(() => {\n var _a;\n (_a = this.model) === null || _a === void 0 ? void 0 : _a.clear();\n }));\n }\n createContainer() {\n const el = document.createElement('div');\n el.className = 'dv-drop-target-container';\n return el;\n }\n createAnchor() {\n const el = document.createElement('div');\n el.className = 'dv-drop-target-anchor';\n el.style.visibility = 'hidden';\n return el;\n }\n}\n\nclass EdgeGroupView {\n get minimumSize() {\n // When collapsed, lock size to collapsedSize so sash can't drag it open\n return this._isCollapsed\n ? this._collapsedSize\n : this._expandedMinimumSize;\n }\n get maximumSize() {\n // When collapsed, lock size to collapsedSize so sash can't drag it open\n return this._isCollapsed\n ? this._collapsedSize\n : this._expandedMaximumSize;\n }\n get element() {\n return this._group.element;\n }\n get isCollapsed() {\n return this._isCollapsed;\n }\n get lastExpandedSize() {\n return this._lastExpandedSize;\n }\n get collapsedSize() {\n return this._collapsedSize;\n }\n constructor(options, group, orientation) {\n var _a, _b, _c;\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this.snap = false;\n this.priority = LayoutPriority.Low;\n this._isCollapsed = false;\n this._group = group;\n this._orientation = orientation;\n group.element.classList.add('dv-edge-group');\n group.element.dataset.testid = `dv-edge-group-${options.id}`;\n this._collapsedSize = (_a = options.collapsedSize) !== null && _a !== void 0 ? _a : 35;\n this._expandedMaximumSize =\n (_b = options.maximumSize) !== null && _b !== void 0 ? _b : Number.POSITIVE_INFINITY;\n // If the caller explicitly provides a minimumSize, respect it.\n // Otherwise fall back to collapsedSize + 50 so the expanded state is\n // visually distinguishable from the collapsed state.\n this._expandedMinimumSize =\n options.minimumSize !== undefined\n ? options.minimumSize\n : this._collapsedSize + 50;\n this._lastExpandedSize = (_c = options.initialSize) !== null && _c !== void 0 ? _c : 200;\n if (options.collapsed) {\n this._isCollapsed = true;\n group.element.classList.add('dv-edge-collapsed');\n }\n }\n layout(size, orthogonalSize) {\n // Track the last expanded size so we can restore it after collapsing\n if (!this._isCollapsed) {\n this._lastExpandedSize = size;\n }\n // horizontal (left/right): size=width, orthogonalSize=height → layout(width, height)\n // vertical (top/bottom): size=height, orthogonalSize=width → layout(width, height)\n if (this._orientation === 'horizontal') {\n this._group.layout(size, orthogonalSize);\n }\n else {\n this._group.layout(orthogonalSize, size);\n }\n }\n setCollapsed(collapsed) {\n if (this._isCollapsed === collapsed) {\n return;\n }\n this._isCollapsed = collapsed;\n this._group.element.classList.toggle('dv-edge-collapsed', collapsed);\n // ShellManager calls resizeView directly after this; no _onDidChange needed\n }\n setVisible(_visible) {\n // visibility is managed by the parent splitview\n }\n /**\n * Restore the last-expanded size from serialized state without triggering\n * a layout. Must be called before setCollapsed(true) during fromJSON so\n * that expanding after deserialization restores the correct size.\n */\n restoreExpandedSize(size) {\n this._lastExpandedSize = size;\n }\n /**\n * Apply new effective collapsed and expanded-minimum sizes after a theme\n * or gap change. The caller (ShellManager) is responsible for computing\n * the correct values from the original config and the new gap.\n */\n updateCollapsedSize(newCollapsedSize, newExpandedMinimumSize) {\n this._collapsedSize = newCollapsedSize;\n this._expandedMinimumSize = newExpandedMinimumSize;\n }\n dispose() {\n this._onDidChange.dispose();\n }\n}\nclass CenterView {\n get element() {\n return this._dockviewElement;\n }\n constructor(_dockviewElement, _layoutDockview) {\n this._dockviewElement = _dockviewElement;\n this._layoutDockview = _layoutDockview;\n this.priority = LayoutPriority.High;\n this.minimumSize = 100;\n this.maximumSize = Number.POSITIVE_INFINITY;\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n }\n layout(size, orthogonalSize) {\n // Lives in a VERTICAL middle-column splitview:\n // size = height alloc, orthogonalSize = width\n this._layoutDockview(orthogonalSize, size);\n }\n setVisible(_visible) {\n // center is always visible\n }\n dispose() {\n this._onDidChange.dispose();\n }\n}\n/**\n * The vertical centre column: top (optional) | center | bottom (optional).\n * This view sits between the left and right edge panels in the outer\n * horizontal splitview, so its primary axis is width (horizontal).\n */\nclass MiddleColumnView {\n get element() {\n return this._element;\n }\n constructor(centerView, gap = 0) {\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this.minimumSize = 100;\n this.maximumSize = Number.POSITIVE_INFINITY;\n this.priority = LayoutPriority.High;\n this._element = document.createElement('div');\n this._element.className = 'dv-shell-middle-column';\n this._element.style.height = '100%';\n this._element.style.width = '100%';\n this._splitview = new Splitview(this._element, {\n orientation: Orientation.VERTICAL,\n proportionalLayout: false,\n margin: gap,\n });\n this._centerIndex = 0;\n this._splitview.addView(centerView, { type: 'distribute' }, 0);\n }\n addTopView(view, initialSize) {\n // Insert before center\n this._splitview.addView(view, initialSize, 0);\n this._topIndex = 0;\n this._centerIndex += 1;\n if (this._bottomIndex !== undefined) {\n this._bottomIndex += 1;\n }\n }\n addBottomView(view, initialSize) {\n // Append after center (and any existing bottom — shouldn't happen but safe)\n const newIndex = this._splitview.length;\n this._splitview.addView(view, initialSize, newIndex);\n this._bottomIndex = newIndex;\n }\n removeView(position) {\n const index = position === 'top' ? this._topIndex : this._bottomIndex;\n if (index === undefined) {\n return;\n }\n this._splitview.removeView(index);\n if (position === 'top') {\n this._topIndex = undefined;\n // center (and bottom if present) shift down by one\n this._centerIndex -= 1;\n if (this._bottomIndex !== undefined) {\n this._bottomIndex -= 1;\n }\n }\n else {\n this._bottomIndex = undefined;\n // center and top are unaffected\n }\n }\n layout(size, orthogonalSize) {\n // Outer horizontal splitview: size = width, orthogonalSize = height\n // Inner vertical splitview: layout(height, width)\n this._splitview.layout(orthogonalSize, size);\n }\n setVisible(_visible) {\n // middle column is always visible\n }\n setViewVisible(position, visible) {\n const index = position === 'top' ? this._topIndex : this._bottomIndex;\n if (index !== undefined) {\n this._splitview.setViewVisible(index, visible);\n }\n }\n isViewVisible(position) {\n const index = position === 'top' ? this._topIndex : this._bottomIndex;\n if (index !== undefined) {\n return this._splitview.isViewVisible(index);\n }\n return false;\n }\n getViewSize(position) {\n const index = position === 'top' ? this._topIndex : this._bottomIndex;\n if (index !== undefined) {\n return this._splitview.getViewSize(index);\n }\n return 0;\n }\n resizeView(position, size) {\n const index = position === 'top' ? this._topIndex : this._bottomIndex;\n if (index !== undefined) {\n this._splitview.resizeView(index, size);\n }\n }\n updateMargin(gap) {\n this._splitview.margin = gap;\n }\n dispose() {\n this._onDidChange.dispose();\n this._splitview.dispose();\n }\n}\nfunction adjustedOpts(base, defaultCollapsed, gapAdd) {\n var _a;\n const effectiveCollapsed = ((_a = base.collapsedSize) !== null && _a !== void 0 ? _a : defaultCollapsed) + gapAdd;\n const result = Object.assign(Object.assign({}, base), { collapsedSize: effectiveCollapsed });\n if (base.minimumSize !== undefined) {\n result.minimumSize = base.minimumSize + gapAdd;\n }\n return result;\n}\nclass ShellManager {\n constructor(container, dockviewElement, layoutGrid, gap = 0, defaultCollapsedSize = 35) {\n this._disposables = new CompositeDisposable();\n // Retained for updateTheme() recalculations.\n this._viewConfigs = new Map();\n this._currentWidth = 0;\n this._currentHeight = 0;\n this._gap = gap;\n this._defaultCollapsedSize = defaultCollapsedSize;\n this._shellElement = document.createElement('div');\n this._shellElement.className = 'dv-shell';\n this._shellElement.style.height = '100%';\n this._shellElement.style.width = '100%';\n this._shellElement.style.position = 'relative';\n container.appendChild(this._shellElement);\n const centerView = new CenterView(dockviewElement, layoutGrid);\n this._middleColumn = new MiddleColumnView(centerView, gap);\n this._outerSplitview = new Splitview(this._shellElement, {\n orientation: Orientation.HORIZONTAL,\n proportionalLayout: false,\n margin: gap,\n });\n this._middleIndex = 0;\n this._outerSplitview.addView(this._middleColumn, { type: 'distribute' }, 0);\n this._disposables.addDisposables(watchElementResize(this._shellElement, (entry) => {\n const width = Math.round(entry.contentRect.width);\n const height = Math.round(entry.contentRect.height);\n if (width === this._currentWidth &&\n height === this._currentHeight) {\n return;\n }\n this._currentWidth = width;\n this._currentHeight = height;\n this.layout(width, height);\n }), this._outerSplitview, this._middleColumn, centerView);\n }\n get element() {\n return this._shellElement;\n }\n /**\n * Add an edge group view at the given position. The view wraps the\n * provided group element inside the shell's splitview layout.\n * Throws if a group at this position is already registered.\n */\n addEdgeView(position, options, group) {\n if (this.hasEdgeGroup(position)) {\n throw new Error(`dockview: edge group already registered at position '${position}'`);\n }\n this._viewConfigs.set(position, options);\n // Recompute gap adjustments now that _viewConfigs has grown.\n const outerN = 1 +\n (this._viewConfigs.has('left') ? 1 : 0) +\n (this._viewConfigs.has('right') ? 1 : 0);\n const innerN = 1 +\n (this._viewConfigs.has('top') ? 1 : 0) +\n (this._viewConfigs.has('bottom') ? 1 : 0);\n const outerGapAdd = outerN > 1 ? (this._gap * (outerN - 1)) / outerN : 0;\n const innerGapAdd = innerN > 1 ? (this._gap * (innerN - 1)) / innerN : 0;\n const isHorizontal = position === 'left' || position === 'right';\n const gapAdd = isHorizontal ? outerGapAdd : innerGapAdd;\n const orientation = isHorizontal ? 'horizontal' : 'vertical';\n const view = new EdgeGroupView(adjustedOpts(Object.assign({ collapsedSize: this._defaultCollapsedSize }, options), this._defaultCollapsedSize, gapAdd), group, orientation);\n const initialSize = view.isCollapsed\n ? view.collapsedSize\n : view.lastExpandedSize;\n switch (position) {\n case 'left':\n // Insert before the middle column\n this._outerSplitview.addView(view, initialSize, 0);\n this._leftIndex = 0;\n this._middleIndex += 1;\n if (this._rightIndex !== undefined) {\n this._rightIndex += 1;\n }\n this._leftView = view;\n break;\n case 'right':\n // Append after the middle column\n {\n const idx = this._outerSplitview.length;\n this._outerSplitview.addView(view, initialSize, idx);\n this._rightIndex = idx;\n this._rightView = view;\n }\n break;\n case 'top':\n this._middleColumn.addTopView(view, initialSize);\n this._topView = view;\n break;\n case 'bottom':\n this._middleColumn.addBottomView(view, initialSize);\n this._bottomView = view;\n break;\n }\n this._disposables.addDisposables(view);\n // Recalculate gap adjustments for all views now that n has changed.\n // updateTheme already guards the layout() call by _currentWidth/_currentHeight.\n this.updateTheme(this._gap, this._defaultCollapsedSize);\n return view;\n }\n layout(width, height) {\n // Outer splitview is HORIZONTAL: layout(size=width, orthogonalSize=height)\n this._outerSplitview.layout(width, height);\n }\n /**\n * Called when the active theme changes. Updates splitview margins and\n * edge-group collapsed sizes so the layout matches the new theme's gap\n * and tab-strip dimensions.\n */\n updateTheme(gap, defaultCollapsedSize) {\n var _a, _b, _c, _d;\n this._gap = gap;\n this._defaultCollapsedSize = defaultCollapsedSize;\n const outerN = 1 +\n (this._viewConfigs.has('left') ? 1 : 0) +\n (this._viewConfigs.has('right') ? 1 : 0);\n const innerN = 1 +\n (this._viewConfigs.has('top') ? 1 : 0) +\n (this._viewConfigs.has('bottom') ? 1 : 0);\n const outerGapAdd = outerN > 1 ? (gap * (outerN - 1)) / outerN : 0;\n const innerGapAdd = innerN > 1 ? (gap * (innerN - 1)) / innerN : 0;\n // Update splitview margins.\n this._outerSplitview.margin = gap;\n this._middleColumn.updateMargin(gap);\n // Recompute effective collapsed sizes from the original config values.\n const updateView = (view, baseCfg, gapAdd) => {\n var _a;\n const baseCS = (_a = baseCfg.collapsedSize) !== null && _a !== void 0 ? _a : defaultCollapsedSize;\n const newCS = baseCS + gapAdd;\n const baseMS = baseCfg.minimumSize;\n const newMS = baseMS !== undefined ? baseMS + gapAdd : newCS + 50;\n view.updateCollapsedSize(newCS, newMS);\n };\n const topCfg = this._viewConfigs.get('top');\n if (this._topView && topCfg) {\n updateView(this._topView, topCfg, innerGapAdd);\n }\n const bottomCfg = this._viewConfigs.get('bottom');\n if (this._bottomView && bottomCfg) {\n updateView(this._bottomView, bottomCfg, innerGapAdd);\n }\n const leftCfg = this._viewConfigs.get('left');\n if (this._leftView && leftCfg) {\n updateView(this._leftView, leftCfg, outerGapAdd);\n }\n const rightCfg = this._viewConfigs.get('right');\n if (this._rightView && rightCfg) {\n updateView(this._rightView, rightCfg, outerGapAdd);\n }\n // Resize currently-collapsed groups to their new collapsed size so\n // they immediately match the new theme's tab-strip dimensions.\n if (((_a = this._leftView) === null || _a === void 0 ? void 0 : _a.isCollapsed) && this._leftIndex !== undefined) {\n this._outerSplitview.resizeView(this._leftIndex, this._leftView.collapsedSize);\n }\n if (((_b = this._rightView) === null || _b === void 0 ? void 0 : _b.isCollapsed) && this._rightIndex !== undefined) {\n this._outerSplitview.resizeView(this._rightIndex, this._rightView.collapsedSize);\n }\n if ((_c = this._topView) === null || _c === void 0 ? void 0 : _c.isCollapsed) {\n this._middleColumn.resizeView('top', this._topView.collapsedSize);\n }\n if ((_d = this._bottomView) === null || _d === void 0 ? void 0 : _d.isCollapsed) {\n this._middleColumn.resizeView('bottom', this._bottomView.collapsedSize);\n }\n // Re-run layout with the current shell dimensions.\n if (this._currentWidth > 0 && this._currentHeight > 0) {\n this.layout(this._currentWidth, this._currentHeight);\n }\n }\n removeEdgeView(position) {\n const view = this._getView(position);\n if (!view) {\n return;\n }\n switch (position) {\n case 'left':\n this._outerSplitview.removeView(this._leftIndex);\n this._leftIndex = undefined;\n this._leftView = undefined;\n // middle and right shift left by one\n this._middleIndex -= 1;\n if (this._rightIndex !== undefined) {\n this._rightIndex -= 1;\n }\n break;\n case 'right':\n this._outerSplitview.removeView(this._rightIndex);\n this._rightIndex = undefined;\n this._rightView = undefined;\n break;\n case 'top':\n this._middleColumn.removeView('top');\n this._topView = undefined;\n break;\n case 'bottom':\n this._middleColumn.removeView('bottom');\n this._bottomView = undefined;\n break;\n }\n // Deregister before disposing to avoid double-dispose when ShellManager\n // itself is eventually disposed.\n this._disposables.removeDisposable(view);\n view.dispose();\n this._viewConfigs.delete(position);\n // Recalculate gap adjustments for remaining views.\n this.updateTheme(this._gap, this._defaultCollapsedSize);\n }\n hasEdgeGroup(position) {\n switch (position) {\n case 'top':\n return this._topView !== undefined;\n case 'bottom':\n return this._bottomView !== undefined;\n case 'left':\n return this._leftView !== undefined;\n case 'right':\n return this._rightView !== undefined;\n }\n }\n setEdgeGroupVisible(position, visible) {\n switch (position) {\n case 'left':\n if (this._leftIndex !== undefined) {\n this._outerSplitview.setViewVisible(this._leftIndex, visible);\n }\n break;\n case 'right':\n if (this._rightIndex !== undefined) {\n this._outerSplitview.setViewVisible(this._rightIndex, visible);\n }\n break;\n case 'top':\n case 'bottom':\n this._middleColumn.setViewVisible(position, visible);\n break;\n }\n }\n isEdgeGroupVisible(position) {\n switch (position) {\n case 'left':\n if (this._leftIndex !== undefined) {\n return this._outerSplitview.isViewVisible(this._leftIndex);\n }\n return false;\n case 'right':\n if (this._rightIndex !== undefined) {\n return this._outerSplitview.isViewVisible(this._rightIndex);\n }\n return false;\n case 'top':\n case 'bottom':\n return this._middleColumn.isViewVisible(position);\n }\n }\n setEdgeGroupCollapsed(position, collapsed) {\n const view = this._getView(position);\n if (!view) {\n return;\n }\n view.setCollapsed(collapsed);\n const targetSize = collapsed\n ? view.collapsedSize\n : view.lastExpandedSize;\n switch (position) {\n case 'left':\n if (this._leftIndex !== undefined) {\n this._outerSplitview.resizeView(this._leftIndex, targetSize);\n }\n break;\n case 'right':\n if (this._rightIndex !== undefined) {\n this._outerSplitview.resizeView(this._rightIndex, targetSize);\n }\n break;\n case 'top':\n case 'bottom':\n this._middleColumn.resizeView(position, targetSize);\n break;\n }\n }\n isEdgeGroupCollapsed(position) {\n var _a, _b;\n return (_b = (_a = this._getView(position)) === null || _a === void 0 ? void 0 : _a.isCollapsed) !== null && _b !== void 0 ? _b : false;\n }\n _getView(position) {\n switch (position) {\n case 'top':\n return this._topView;\n case 'bottom':\n return this._bottomView;\n case 'left':\n return this._leftView;\n case 'right':\n return this._rightView;\n }\n }\n toJSON() {\n const edgeGroups = {};\n if (this._leftView && this._leftIndex !== undefined) {\n edgeGroups.left = {\n size: this._leftView.isCollapsed\n ? this._leftView.lastExpandedSize\n : this._outerSplitview.getViewSize(this._leftIndex),\n visible: this._outerSplitview.isViewVisible(this._leftIndex),\n collapsed: this._leftView.isCollapsed || undefined,\n };\n }\n if (this._rightView && this._rightIndex !== undefined) {\n edgeGroups.right = {\n size: this._rightView.isCollapsed\n ? this._rightView.lastExpandedSize\n : this._outerSplitview.getViewSize(this._rightIndex),\n visible: this._outerSplitview.isViewVisible(this._rightIndex),\n collapsed: this._rightView.isCollapsed || undefined,\n };\n }\n if (this._topView) {\n edgeGroups.top = {\n size: this._topView.isCollapsed\n ? this._topView.lastExpandedSize\n : this._middleColumn.getViewSize('top'),\n visible: this._middleColumn.isViewVisible('top'),\n collapsed: this._topView.isCollapsed || undefined,\n };\n }\n if (this._bottomView) {\n edgeGroups.bottom = {\n size: this._bottomView.isCollapsed\n ? this._bottomView.lastExpandedSize\n : this._middleColumn.getViewSize('bottom'),\n visible: this._middleColumn.isViewVisible('bottom'),\n collapsed: this._bottomView.isCollapsed || undefined,\n };\n }\n return edgeGroups;\n }\n fromJSON(data) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;\n if (data.left && this._leftIndex !== undefined) {\n // Always restore the expanded size first. toJSON always records the\n // expanded size (even when collapsed), so restoredExpandedSize must\n // be applied before setCollapsed locks min/max to collapsedSize.\n (_a = this._leftView) === null || _a === void 0 ? void 0 : _a.restoreExpandedSize(data.left.size);\n (_b = this._leftView) === null || _b === void 0 ? void 0 : _b.setCollapsed((_c = data.left.collapsed) !== null && _c !== void 0 ? _c : false);\n this._outerSplitview.resizeView(this._leftIndex, data.left.collapsed\n ? ((_e = (_d = this._leftView) === null || _d === void 0 ? void 0 : _d.collapsedSize) !== null && _e !== void 0 ? _e : data.left.size)\n : data.left.size);\n if (!data.left.visible) {\n this._outerSplitview.setViewVisible(this._leftIndex, false);\n }\n }\n if (data.right && this._rightIndex !== undefined) {\n (_f = this._rightView) === null || _f === void 0 ? void 0 : _f.restoreExpandedSize(data.right.size);\n (_g = this._rightView) === null || _g === void 0 ? void 0 : _g.setCollapsed((_h = data.right.collapsed) !== null && _h !== void 0 ? _h : false);\n this._outerSplitview.resizeView(this._rightIndex, data.right.collapsed\n ? ((_k = (_j = this._rightView) === null || _j === void 0 ? void 0 : _j.collapsedSize) !== null && _k !== void 0 ? _k : data.right.size)\n : data.right.size);\n if (!data.right.visible) {\n this._outerSplitview.setViewVisible(this._rightIndex, false);\n }\n }\n if (data.top) {\n (_l = this._topView) === null || _l === void 0 ? void 0 : _l.restoreExpandedSize(data.top.size);\n (_m = this._topView) === null || _m === void 0 ? void 0 : _m.setCollapsed((_o = data.top.collapsed) !== null && _o !== void 0 ? _o : false);\n this._middleColumn.resizeView('top', data.top.collapsed\n ? ((_q = (_p = this._topView) === null || _p === void 0 ? void 0 : _p.collapsedSize) !== null && _q !== void 0 ? _q : data.top.size)\n : data.top.size);\n if (!data.top.visible) {\n this._middleColumn.setViewVisible('top', false);\n }\n }\n if (data.bottom) {\n (_r = this._bottomView) === null || _r === void 0 ? void 0 : _r.restoreExpandedSize(data.bottom.size);\n (_s = this._bottomView) === null || _s === void 0 ? void 0 : _s.setCollapsed((_t = data.bottom.collapsed) !== null && _t !== void 0 ? _t : false);\n this._middleColumn.resizeView('bottom', data.bottom.collapsed\n ? ((_v = (_u = this._bottomView) === null || _u === void 0 ? void 0 : _u.collapsedSize) !== null && _v !== void 0 ? _v : data.bottom.size)\n : data.bottom.size);\n if (!data.bottom.visible) {\n this._middleColumn.setViewVisible('bottom', false);\n }\n }\n }\n dispose() {\n var _a;\n this._disposables.dispose();\n (_a = this._shellElement.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(this._shellElement);\n }\n}\n\nconst DEFAULT_ROOT_OVERLAY_MODEL = {\n activationSize: { type: 'pixels', value: 10 },\n size: { type: 'pixels', value: 20 },\n};\nfunction buildTabGroupColorPalette(options) {\n var _a;\n const entries = (_a = options.tabGroupColors) !== null && _a !== void 0 ? _a : DEFAULT_TAB_GROUP_COLORS;\n const enabled = options.tabGroupAccent !== 'off';\n return new TabGroupColorPalette(entries, enabled);\n}\nfunction moveGroupWithoutDestroying(options) {\n const activePanel = options.from.activePanel;\n const panels = [...options.from.panels].map((panel) => {\n const removedPanel = options.from.model.removePanel(panel);\n options.from.model.renderContainer.detatch(panel);\n return removedPanel;\n });\n panels.forEach((panel) => {\n options.to.model.openPanel(panel, {\n skipSetActive: activePanel !== panel,\n skipSetGroupActive: true,\n });\n });\n}\nclass DockviewComponent extends BaseGrid {\n get orientation() {\n return this.gridview.orientation;\n }\n get totalPanels() {\n return this.panels.length;\n }\n get panels() {\n return this.groups.flatMap((group) => group.panels);\n }\n get options() {\n return this._options;\n }\n get tabGroupColorPalette() {\n return this._tabGroupColorPalette;\n }\n get activePanel() {\n const activeGroup = this.activeGroup;\n if (!activeGroup) {\n return undefined;\n }\n return activeGroup.activePanel;\n }\n get renderer() {\n var _a;\n return (_a = this.options.defaultRenderer) !== null && _a !== void 0 ? _a : 'onlyWhenVisible';\n }\n get defaultHeaderPosition() {\n var _a;\n return (_a = this.options.defaultHeaderPosition) !== null && _a !== void 0 ? _a : 'top';\n }\n get api() {\n return this._api;\n }\n get floatingGroups() {\n return this._floatingGroups;\n }\n /**\n * Promise that resolves when all popout groups from the last fromJSON call are restored.\n * Useful for tests that need to wait for delayed popout creation.\n */\n get popoutRestorationPromise() {\n return this._popoutRestorationPromise;\n }\n constructor(container, options) {\n var _a, _b, _c, _d, _e, _f, _g;\n super(container, {\n proportionalLayout: true,\n orientation: Orientation.HORIZONTAL,\n styles: options.hideBorders\n ? { separatorBorder: 'transparent' }\n : undefined,\n disableAutoResizing: options.disableAutoResizing,\n locked: options.locked,\n margin: (_b = (_a = options.theme) === null || _a === void 0 ? void 0 : _a.gap) !== null && _b !== void 0 ? _b : 0,\n className: options.className,\n });\n this.nextGroupId = sequentialNumberGenerator();\n this._deserializer = new DefaultDockviewDeserialzier(this);\n this._watermark = null;\n this._popoutPopupServices = new Map();\n this._onWillDragPanel = new Emitter();\n this.onWillDragPanel = this._onWillDragPanel.event;\n this._onWillDragGroup = new Emitter();\n this.onWillDragGroup = this._onWillDragGroup.event;\n this._onDidDrop = new Emitter();\n this.onDidDrop = this._onDidDrop.event;\n this._onWillDrop = new Emitter();\n this.onWillDrop = this._onWillDrop.event;\n this._onWillShowOverlay = new Emitter();\n this.onWillShowOverlay = this._onWillShowOverlay.event;\n this._onUnhandledDragOverEvent = new Emitter();\n this.onUnhandledDragOverEvent = this._onUnhandledDragOverEvent.event;\n this._onDidRemovePanel = new Emitter();\n this.onDidRemovePanel = this._onDidRemovePanel.event;\n this._onDidAddPanel = new Emitter();\n this.onDidAddPanel = this._onDidAddPanel.event;\n this._onDidPopoutGroupSizeChange = new Emitter();\n this.onDidPopoutGroupSizeChange = this._onDidPopoutGroupSizeChange.event;\n this._onDidPopoutGroupPositionChange = new Emitter();\n this.onDidPopoutGroupPositionChange = this._onDidPopoutGroupPositionChange.event;\n this._onDidOpenPopoutWindowFail = new Emitter();\n this.onDidOpenPopoutWindowFail = this._onDidOpenPopoutWindowFail.event;\n this._onDidLayoutFromJSON = new Emitter();\n this.onDidLayoutFromJSON = this._onDidLayoutFromJSON.event;\n this._onDidActivePanelChange = new Emitter({ replay: true });\n this.onDidActivePanelChange = this._onDidActivePanelChange.event;\n this._onDidMovePanel = new Emitter();\n this.onDidMovePanel = this._onDidMovePanel.event;\n this._onDidCreateTabGroup = new Emitter();\n this.onDidCreateTabGroup = this._onDidCreateTabGroup.event;\n this._onDidDestroyTabGroup = new Emitter();\n this.onDidDestroyTabGroup = this._onDidDestroyTabGroup.event;\n this._onDidAddPanelToTabGroup = new Emitter();\n this.onDidAddPanelToTabGroup = this._onDidAddPanelToTabGroup.event;\n this._onDidRemovePanelFromTabGroup = new Emitter();\n this.onDidRemovePanelFromTabGroup = this._onDidRemovePanelFromTabGroup.event;\n this._onDidTabGroupChange = new Emitter();\n this.onDidTabGroupChange = this._onDidTabGroupChange.event;\n this._onDidTabGroupCollapsedChange = new Emitter();\n this.onDidTabGroupCollapsedChange = this._onDidTabGroupCollapsedChange.event;\n this._onDidMaximizedGroupChange = new Emitter();\n this.onDidMaximizedGroupChange = this._onDidMaximizedGroupChange.event;\n this._inShellLayout = false;\n this._edgeGroups = new Map();\n this._edgeGroupDisposables = new Map();\n this._floatingGroups = [];\n this._popoutGroups = [];\n this._popoutRestorationPromise = Promise.resolve();\n this._popoutRestorationCleanups = new Set();\n this._onDidRemoveGroup = new Emitter();\n this.onDidRemoveGroup = this._onDidRemoveGroup.event;\n this._onDidAddGroup = new Emitter();\n this.onDidAddGroup = this._onDidAddGroup.event;\n this._onDidOptionsChange = new Emitter();\n this.onDidOptionsChange = this._onDidOptionsChange.event;\n this._onDidActiveGroupChange = new Emitter();\n this.onDidActiveGroupChange = this._onDidActiveGroupChange.event;\n this._moving = false;\n this._options = options;\n this._tabGroupColorPalette = buildTabGroupColorPalette(options);\n this.popupService = new PopupService(this.element);\n this.contextMenuController = new ContextMenuController(this);\n this._api = new DockviewApi(this);\n // The shell always wraps the dockview element so edge groups can be\n // added at any time via addEdgeGroup() without re-parenting the DOM.\n this.disableResizing = true;\n container.removeChild(this.element);\n this._shellManager = new ShellManager(container, this.element, (w, h) => this._layoutFromShell(w, h), (_d = (_c = options.theme) === null || _c === void 0 ? void 0 : _c.gap) !== null && _d !== void 0 ? _d : 0, (_e = options.theme) === null || _e === void 0 ? void 0 : _e.edgeGroupCollapsedSize);\n // The shell wraps the dockview element, so move the popup anchor\n // into the shell so overflow dropdowns in edge groups position correctly\n this.popupService.updateRoot(this._shellManager.element);\n this._shellThemeClassnames = new Classnames(this._shellManager.element);\n // Anchor the overlay container to the shell element so that edge groups\n // (which live outside this.element in the shell layout) are covered when\n // dndOverlayMounting is 'absolute'.\n this.rootDropTargetContainer = new DropTargetAnchorContainer(this._shellManager.element, { disabled: true });\n this.overlayRenderContainer = new OverlayRenderContainer(this._shellManager.element, this);\n // Hosted in the shell (not inside `.dv-dockview`) so floating overlays\n // share a stacking context with `dv-render-overlay` panels; sized to\n // mirror the gridview rect so saved positions remain valid.\n this._floatingOverlayHost = document.createElement('div');\n this._floatingOverlayHost.className = 'dv-floating-overlay-host';\n this._shellManager.element.appendChild(this._floatingOverlayHost);\n const rootCanDisplayOverlay = (event, position) => {\n const data = getPanelData();\n if (data) {\n if (data.viewId !== this.id) {\n return false;\n }\n if (position === 'center') {\n // center drop target is only allowed if there are no panels in the grid\n // floating panels are allowed\n return this.gridview.length === 0;\n }\n return true;\n }\n if (position === 'center' && this.gridview.length !== 0) {\n /**\n * for external events only show the four-corner drag overlays, disable\n * the center position so that external drag events can fall through to the group\n * and panel drop target handlers\n */\n return false;\n }\n const firedEvent = new DockviewUnhandledDragOverEvent(event, 'edge', position, getPanelData);\n this._onUnhandledDragOverEvent.fire(firedEvent);\n return firedEvent.isAccepted;\n };\n this._rootDropTarget = html5Backend.createDropTarget(this.element, {\n className: 'dv-drop-target-edge',\n canDisplayOverlay: rootCanDisplayOverlay,\n acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],\n overlayModel: (_f = options.rootOverlayModel) !== null && _f !== void 0 ? _f : DEFAULT_ROOT_OVERLAY_MODEL,\n getOverrideTarget: () => { var _a; return (_a = this.rootDropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },\n });\n this._rootPointerDropTarget = pointerBackend.createDropTarget(this.element, {\n className: 'dv-drop-target-edge',\n canDisplayOverlay: rootCanDisplayOverlay,\n acceptedTargetZones: [\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'center',\n ],\n overlayModel: (_g = options.rootOverlayModel) !== null && _g !== void 0 ? _g : DEFAULT_ROOT_OVERLAY_MODEL,\n getOverrideTarget: () => { var _a; return (_a = this.rootDropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },\n });\n this.updateDropTargetModel(options);\n toggleClass(this.gridview.element, 'dv-dockview', true);\n toggleClass(this.element, 'dv-debug', !!options.debug);\n this.updateTheme();\n this.updateWatermark();\n if (options.debug) {\n this.addDisposables(new StrictEventsSequencing(this));\n }\n this.addDisposables(this.rootDropTargetContainer, this.overlayRenderContainer, this._onWillDragPanel, this._onWillDragGroup, this._onWillShowOverlay, this._onDidActivePanelChange, this._onDidAddPanel, this._onDidRemovePanel, this._onDidLayoutFromJSON, this._onDidDrop, this._onWillDrop, this._onDidMovePanel, this._onDidMovePanel.event(() => {\n /**\n * Update overlay positions after DOM layout completes to prevent 0×0 dimensions.\n * With defaultRenderer=\"always\" this results in panel content not showing after move operations.\n * Debounced to avoid multiple calls when moving groups with multiple panels.\n */\n this.debouncedUpdateAllPositions();\n }), this._onDidAddGroup, this._onDidRemoveGroup, this._onDidActiveGroupChange, this._onUnhandledDragOverEvent, this._onDidMaximizedGroupChange, this._onDidOptionsChange, this._onDidPopoutGroupSizeChange, this._onDidPopoutGroupPositionChange, this._onDidOpenPopoutWindowFail, this._onDidCreateTabGroup, this._onDidDestroyTabGroup, this._onDidAddPanelToTabGroup, this._onDidRemovePanelFromTabGroup, this._onDidTabGroupChange, this._onDidTabGroupCollapsedChange, this.onDidViewVisibilityChangeMicroTaskQueue(() => {\n this.updateWatermark();\n }), this.onDidAdd((event) => {\n if (!this._moving) {\n this._onDidAddGroup.fire(event);\n }\n }), this.onDidRemove((event) => {\n if (!this._moving) {\n this._onDidRemoveGroup.fire(event);\n }\n }), this.onDidActiveChange((event) => {\n if (!this._moving) {\n this._onDidActiveGroupChange.fire(event);\n }\n }), this.onDidMaximizedChange((event) => {\n this._onDidMaximizedGroupChange.fire({\n group: event.panel,\n isMaximized: event.isMaximized,\n });\n }), Event.any(this.onDidAdd, this.onDidRemove)(() => {\n this.updateWatermark();\n }), Event.any(this.onDidAddPanel, this.onDidRemovePanel, this.onDidAddGroup, this.onDidRemove, this.onDidRemoveGroup, this.onDidMovePanel, this.onDidActivePanelChange, this.onDidPopoutGroupPositionChange, this.onDidPopoutGroupSizeChange, this.onDidCreateTabGroup, this.onDidDestroyTabGroup, this.onDidAddPanelToTabGroup, this.onDidRemovePanelFromTabGroup, this.onDidTabGroupChange, this.onDidTabGroupCollapsedChange)(() => {\n this._bufferOnDidLayoutChange.fire();\n }), Disposable.from(() => {\n var _a;\n // Cancel any pending popout-restoration timers scheduled by\n // fromJSON so they don't open new browser windows after\n // dispose, and resolve their promises so callers awaiting\n // popoutRestorationPromise don't hang. See issue #851.\n for (const cleanup of [...this._popoutRestorationCleanups]) {\n cleanup();\n }\n this._popoutRestorationCleanups.clear();\n // iterate over a copy of the array since .dispose() mutates the original array\n for (const group of [...this._floatingGroups]) {\n group.dispose();\n }\n // iterate over a copy of the array since .dispose() mutates the original array\n for (const group of [...this._popoutGroups]) {\n group.disposable.dispose();\n }\n (_a = this._shellManager) === null || _a === void 0 ? void 0 : _a.dispose();\n for (const d of this._edgeGroupDisposables.values()) {\n d.dispose();\n }\n this._edgeGroupDisposables.clear();\n }), this._rootDropTarget, this._rootPointerDropTarget, Event.any(this._rootDropTarget.onWillShowOverlay, this._rootPointerDropTarget.onWillShowOverlay)((event) => {\n if (this.gridview.length > 0 && event.position === 'center') {\n // option only available when no panels in primary grid\n return;\n }\n this._onWillShowOverlay.fire(new DockviewWillShowOverlayLocationEvent(event, {\n kind: 'edge',\n panel: undefined,\n api: this._api,\n group: undefined,\n getData: getPanelData,\n }));\n }), Event.any(this._rootDropTarget.onDrop, this._rootPointerDropTarget.onDrop)((event) => {\n var _a;\n const willDropEvent = new DockviewWillDropEvent({\n nativeEvent: event.nativeEvent,\n position: event.position,\n panel: undefined,\n api: this._api,\n group: undefined,\n getData: getPanelData,\n kind: 'edge',\n });\n this._onWillDrop.fire(willDropEvent);\n if (willDropEvent.defaultPrevented) {\n return;\n }\n const data = getPanelData();\n if (data) {\n this.moveGroupOrPanel({\n from: {\n groupId: data.groupId,\n panelId: (_a = data.panelId) !== null && _a !== void 0 ? _a : undefined,\n },\n to: {\n group: this.orthogonalize(event.position),\n position: 'center',\n },\n });\n }\n else {\n this._onDidDrop.fire(new DockviewDidDropEvent({\n nativeEvent: event.nativeEvent,\n position: event.position,\n panel: undefined,\n api: this._api,\n group: undefined,\n getData: getPanelData,\n }));\n }\n }));\n }\n setVisible(panel, visible) {\n switch (panel.api.location.type) {\n case 'grid':\n super.setVisible(panel, visible);\n break;\n case 'floating': {\n const item = this.floatingGroups.find((floatingGroup) => floatingGroup.group === panel);\n if (item) {\n item.overlay.setVisible(visible);\n panel.api._onDidVisibilityChange.fire({\n isVisible: visible,\n });\n }\n break;\n }\n case 'popout':\n console.warn('dockview: You cannot hide a group that is in a popout window');\n break;\n }\n }\n /**\n * Returns the {@link PopupService} that should host popovers (context\n * menus, tab overflow menus) for the given group. Popout groups have their\n * own service rooted in their popout window so the popover renders there\n * and dismisses on events from that window.\n */\n getPopupServiceForGroup(group) {\n var _a;\n return (_a = this._popoutPopupServices.get(group.id)) !== null && _a !== void 0 ? _a : this.popupService;\n }\n addPopoutGroup(itemToPopout, options) {\n var _a, _b, _c, _d, _e, _f;\n if (itemToPopout instanceof DockviewGroupPanel &&\n itemToPopout.model.location.type === 'edge') {\n // edge groups are permanent structural elements and cannot be popped out\n return Promise.resolve(false);\n }\n if (itemToPopout instanceof DockviewPanel &&\n itemToPopout.group.size === 1) {\n return this.addPopoutGroup(itemToPopout.group, options);\n }\n const theme = getDockviewTheme(this.gridview.element);\n const element = this.element;\n function getBox() {\n if (options === null || options === void 0 ? void 0 : options.position) {\n return options.position;\n }\n if (itemToPopout instanceof DockviewGroupPanel) {\n return itemToPopout.element.getBoundingClientRect();\n }\n if (itemToPopout.group) {\n return itemToPopout.group.element.getBoundingClientRect();\n }\n return element.getBoundingClientRect();\n }\n const box = getBox();\n const groupId = (_b = (_a = options === null || options === void 0 ? void 0 : options.overridePopoutGroup) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : this.getNextGroupId();\n const _window = new PopoutWindow(`${this.id}-${groupId}`, // unique id\n theme !== null && theme !== void 0 ? theme : '', {\n url: (_e = (_c = options === null || options === void 0 ? void 0 : options.popoutUrl) !== null && _c !== void 0 ? _c : (_d = this.options) === null || _d === void 0 ? void 0 : _d.popoutUrl) !== null && _e !== void 0 ? _e : '/popout.html',\n left: window.screenX + box.left,\n top: window.screenY + box.top,\n width: box.width,\n height: box.height,\n onDidOpen: options === null || options === void 0 ? void 0 : options.onDidOpen,\n onWillClose: options === null || options === void 0 ? void 0 : options.onWillClose,\n nonce: (_f = this.options) === null || _f === void 0 ? void 0 : _f.nonce,\n });\n const popoutWindowDisposable = new CompositeDisposable(_window, _window.onDidClose(() => {\n popoutWindowDisposable.dispose();\n }));\n return _window\n .open()\n .then((popoutContainer) => {\n var _a;\n if (_window.isDisposed) {\n return false;\n }\n const referenceGroup = (options === null || options === void 0 ? void 0 : options.referenceGroup)\n ? options.referenceGroup\n : itemToPopout instanceof DockviewPanel\n ? itemToPopout.group\n : itemToPopout;\n const referenceLocation = itemToPopout.api.location.type;\n /**\n * The group that is being added doesn't already exist within the DOM, the most likely occurrence\n * of this case is when being called from the `fromJSON(...)` method\n */\n const isGroupAddedToDom = referenceGroup.element.parentElement !== null;\n let group;\n if (!isGroupAddedToDom) {\n group = referenceGroup;\n }\n else if (options === null || options === void 0 ? void 0 : options.overridePopoutGroup) {\n group = options.overridePopoutGroup;\n }\n else {\n group = this.createGroup({ id: groupId });\n if (popoutContainer) {\n this._onDidAddGroup.fire(group);\n }\n }\n if (popoutContainer === null) {\n console.error('dockview: failed to create popout. perhaps you need to allow pop-ups for this website');\n popoutWindowDisposable.dispose();\n this._onDidOpenPopoutWindowFail.fire();\n // if the popout window was blocked, we need to move the group back to the reference group\n // and set it to visible\n this.movingLock(() => moveGroupWithoutDestroying({\n from: group,\n to: referenceGroup,\n }));\n if (!referenceGroup.api.isVisible) {\n referenceGroup.api.setVisible(true);\n }\n return false;\n }\n const gready = document.createElement('div');\n gready.className = 'dv-overlay-render-container';\n const overlayRenderContainer = new OverlayRenderContainer(gready, this);\n group.model.renderContainer = overlayRenderContainer;\n group.layout(_window.window.innerWidth, _window.window.innerHeight);\n let floatingBox;\n if (!(options === null || options === void 0 ? void 0 : options.overridePopoutGroup) && isGroupAddedToDom) {\n if (itemToPopout instanceof DockviewPanel) {\n this.movingLock(() => {\n const panel = referenceGroup.model.removePanel(itemToPopout);\n group.model.openPanel(panel);\n });\n }\n else {\n this.movingLock(() => moveGroupWithoutDestroying({\n from: referenceGroup,\n to: group,\n }));\n switch (referenceLocation) {\n case 'grid':\n referenceGroup.api.setVisible(false);\n break;\n case 'floating':\n case 'popout':\n floatingBox = (_a = this._floatingGroups\n .find((value) => value.group.api.id ===\n itemToPopout.api.id)) === null || _a === void 0 ? void 0 : _a.overlay.toJSON();\n this.removeGroup(referenceGroup);\n break;\n }\n }\n }\n popoutContainer.classList.add('dv-dockview');\n popoutContainer.style.overflow = 'hidden';\n popoutContainer.appendChild(gready);\n popoutContainer.appendChild(group.element);\n const anchor = document.createElement('div');\n const dropTargetContainer = new DropTargetAnchorContainer(anchor, { disabled: this.rootDropTargetContainer.disabled });\n popoutContainer.appendChild(anchor);\n group.model.dropTargetContainer = dropTargetContainer;\n // Each popout group needs its own popover service so that\n // tab context menus, chip menus, and tab overflow menus\n // render in the popout window (not the main window) and\n // their pointerdown/keydown listeners fire on the right\n // window for outside-click and Escape dismissal.\n const popoutPopupService = new PopupService(popoutContainer, _window.window);\n this._popoutPopupServices.set(group.id, popoutPopupService);\n popoutWindowDisposable.addDisposables(popoutPopupService, Disposable.from(() => {\n this._popoutPopupServices.delete(group.id);\n }));\n group.model.location = {\n type: 'popout',\n getWindow: () => _window.window,\n popoutUrl: options === null || options === void 0 ? void 0 : options.popoutUrl,\n };\n if (isGroupAddedToDom &&\n itemToPopout.api.location.type === 'grid') {\n itemToPopout.api.setVisible(false);\n }\n this.doSetGroupAndPanelActive(group);\n popoutWindowDisposable.addDisposables(group.api.onDidActiveChange((event) => {\n var _a;\n if (event.isActive) {\n (_a = _window.window) === null || _a === void 0 ? void 0 : _a.focus();\n }\n }), group.api.onWillFocus(() => {\n var _a;\n (_a = _window.window) === null || _a === void 0 ? void 0 : _a.focus();\n }));\n let returnedGroup;\n const isValidReferenceGroup = isGroupAddedToDom &&\n referenceGroup &&\n this.getPanel(referenceGroup.id);\n const value = {\n window: _window,\n popoutGroup: group,\n referenceGroup: isValidReferenceGroup\n ? referenceGroup.id\n : undefined,\n disposable: {\n dispose: () => {\n popoutWindowDisposable.dispose();\n return returnedGroup;\n },\n },\n };\n const _onDidWindowPositionChange = onDidWindowMoveEnd(_window.window);\n popoutWindowDisposable.addDisposables(_onDidWindowPositionChange, onDidWindowResizeEnd(_window.window, () => {\n this._onDidPopoutGroupSizeChange.fire({\n width: _window.window.innerWidth,\n height: _window.window.innerHeight,\n group,\n });\n }), _onDidWindowPositionChange.event(() => {\n this._onDidPopoutGroupPositionChange.fire({\n screenX: _window.window.screenX,\n screenY: _window.window.screenX,\n group,\n });\n }), \n /**\n * ResizeObserver seems slow here, I do not know why but we don't need it\n * since we can reply on the window resize event as we will occupy the full\n * window dimensions\n */\n addDisposableListener(_window.window, 'resize', () => {\n group.layout(_window.window.innerWidth, _window.window.innerHeight);\n }), overlayRenderContainer, Disposable.from(() => {\n if (this.isDisposed) {\n return; // cleanup may run after instance is disposed\n }\n if (isGroupAddedToDom &&\n this.getPanel(referenceGroup.id)) {\n this.movingLock(() => moveGroupWithoutDestroying({\n from: group,\n to: referenceGroup,\n }));\n if (!referenceGroup.api.isVisible) {\n referenceGroup.api.setVisible(true);\n }\n if (this.getPanel(group.id)) {\n this.doRemoveGroup(group, {\n skipPopoutAssociated: true,\n });\n }\n }\n else if (this.getPanel(group.id)) {\n group.model.renderContainer =\n this.overlayRenderContainer;\n group.model.dropTargetContainer =\n this.rootDropTargetContainer;\n returnedGroup = group;\n const alreadyRemoved = !this._popoutGroups.find((p) => p.popoutGroup === group);\n if (alreadyRemoved) {\n /**\n * If this popout group was explicitly removed then we shouldn't run the additional\n * steps. To tell if the running of this disposable is the result of this popout group\n * being explicitly removed we can check if this popout group is still referenced in\n * the `this._popoutGroups` list.\n */\n return;\n }\n if (floatingBox) {\n this.addFloatingGroup(group, {\n height: floatingBox.height,\n width: floatingBox.width,\n position: floatingBox,\n });\n }\n else {\n this.doRemoveGroup(group, {\n skipDispose: true,\n skipActive: true,\n skipPopoutReturn: true,\n });\n group.model.location = { type: 'grid' };\n this.movingLock(() => {\n // suppress group add events since the group already exists\n this.doAddGroup(group, [0]);\n });\n }\n this.doSetGroupAndPanelActive(group);\n }\n }));\n this._popoutGroups.push(value);\n this.updateWatermark();\n return true;\n })\n .catch((err) => {\n console.error('dockview: failed to create popout.', err);\n return false;\n });\n }\n addFloatingGroup(item, options) {\n var _a, _b, _c, _d, _e, _f;\n if (item instanceof DockviewGroupPanel &&\n item.model.location.type === 'edge') {\n // edge groups are permanent structural elements and cannot be floated\n return;\n }\n let group;\n if (item instanceof DockviewPanel) {\n group = this.createGroup();\n this._onDidAddGroup.fire(group);\n this.movingLock(() => this.removePanel(item, {\n removeEmptyGroup: true,\n skipDispose: true,\n skipSetActiveGroup: true,\n }));\n this.movingLock(() => group.model.openPanel(item, { skipSetGroupActive: true }));\n }\n else {\n group = item;\n const popoutReferenceGroupId = (_a = this._popoutGroups.find((_) => _.popoutGroup === group)) === null || _a === void 0 ? void 0 : _a.referenceGroup;\n const popoutReferenceGroup = popoutReferenceGroupId\n ? this.getPanel(popoutReferenceGroupId)\n : undefined;\n const skip = typeof (options === null || options === void 0 ? void 0 : options.skipRemoveGroup) === 'boolean' &&\n options.skipRemoveGroup;\n if (!skip) {\n if (popoutReferenceGroup) {\n this.movingLock(() => moveGroupWithoutDestroying({\n from: item,\n to: popoutReferenceGroup,\n }));\n this.doRemoveGroup(item, {\n skipPopoutReturn: true,\n skipPopoutAssociated: true,\n });\n this.doRemoveGroup(popoutReferenceGroup, {\n skipDispose: true,\n });\n group = popoutReferenceGroup;\n }\n else {\n this.doRemoveGroup(item, {\n skipDispose: true,\n skipPopoutReturn: true,\n skipPopoutAssociated: false,\n });\n }\n }\n }\n function getAnchoredBox() {\n if (options === null || options === void 0 ? void 0 : options.position) {\n const result = {};\n if ('left' in options.position) {\n result.left = Math.max(options.position.left, 0);\n }\n else if ('right' in options.position) {\n result.right = Math.max(options.position.right, 0);\n }\n else {\n result.left = DEFAULT_FLOATING_GROUP_POSITION.left;\n }\n if ('top' in options.position) {\n result.top = Math.max(options.position.top, 0);\n }\n else if ('bottom' in options.position) {\n result.bottom = Math.max(options.position.bottom, 0);\n }\n else {\n result.top = DEFAULT_FLOATING_GROUP_POSITION.top;\n }\n if (typeof options.width === 'number') {\n result.width = Math.max(options.width, 0);\n }\n else {\n result.width = DEFAULT_FLOATING_GROUP_POSITION.width;\n }\n if (typeof options.height === 'number') {\n result.height = Math.max(options.height, 0);\n }\n else {\n result.height = DEFAULT_FLOATING_GROUP_POSITION.height;\n }\n return result;\n }\n return {\n left: typeof (options === null || options === void 0 ? void 0 : options.x) === 'number'\n ? Math.max(options.x, 0)\n : DEFAULT_FLOATING_GROUP_POSITION.left,\n top: typeof (options === null || options === void 0 ? void 0 : options.y) === 'number'\n ? Math.max(options.y, 0)\n : DEFAULT_FLOATING_GROUP_POSITION.top,\n width: typeof (options === null || options === void 0 ? void 0 : options.width) === 'number'\n ? Math.max(options.width, 0)\n : DEFAULT_FLOATING_GROUP_POSITION.width,\n height: typeof (options === null || options === void 0 ? void 0 : options.height) === 'number'\n ? Math.max(options.height, 0)\n : DEFAULT_FLOATING_GROUP_POSITION.height,\n };\n }\n const anchoredBox = getAnchoredBox();\n const overlay = new Overlay(Object.assign(Object.assign({ container: (_b = this._floatingOverlayHost) !== null && _b !== void 0 ? _b : this.gridview.element, content: group.element }, anchoredBox), { minimumInViewportWidth: this.options.floatingGroupBounds === 'boundedWithinViewport'\n ? undefined\n : ((_d = (_c = this.options.floatingGroupBounds) === null || _c === void 0 ? void 0 : _c.minimumWidthWithinViewport) !== null && _d !== void 0 ? _d : DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE), minimumInViewportHeight: this.options.floatingGroupBounds === 'boundedWithinViewport'\n ? undefined\n : ((_f = (_e = this.options.floatingGroupBounds) === null || _e === void 0 ? void 0 : _e.minimumHeightWithinViewport) !== null && _f !== void 0 ? _f : DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE) }));\n const el = group.element.querySelector('.dv-void-container');\n if (!el) {\n throw new Error('dockview: failed to find drag handle');\n }\n overlay.setupDrag(el, {\n inDragMode: typeof (options === null || options === void 0 ? void 0 : options.inDragMode) === 'boolean'\n ? options.inDragMode\n : false,\n });\n const floatingGroupPanel = new DockviewFloatingGroupPanel(group, overlay);\n const disposable = new CompositeDisposable(group.api.onDidActiveChange((event) => {\n if (event.isActive) {\n overlay.bringToFront();\n }\n }), (() => {\n let lastWidth = -1;\n let lastHeight = -1;\n return watchElementResize(group.element, (entry) => {\n const width = Math.round(entry.contentRect.width);\n const height = Math.round(entry.contentRect.height);\n if (width === lastWidth && height === lastHeight) {\n return;\n }\n lastWidth = width;\n lastHeight = height;\n group.layout(width, height); // let the group know it's size is changing so it can fire events to the panel\n });\n })());\n floatingGroupPanel.addDisposables(overlay.onDidChange(() => {\n // this is either a resize or a move\n // to inform the panels .layout(...) the group with it's current size\n // don't care about resize since the above watcher handles that\n group.layout(group.width, group.height);\n }), overlay.onDidChangeEnd(() => {\n this._bufferOnDidLayoutChange.fire();\n }), group.onDidChange((event) => {\n overlay.setBounds({\n height: event === null || event === void 0 ? void 0 : event.height,\n width: event === null || event === void 0 ? void 0 : event.width,\n });\n }), {\n dispose: () => {\n disposable.dispose();\n remove(this._floatingGroups, floatingGroupPanel);\n group.model.location = { type: 'grid' };\n this.updateWatermark();\n },\n });\n this._floatingGroups.push(floatingGroupPanel);\n group.model.location = { type: 'floating' };\n if (!(options === null || options === void 0 ? void 0 : options.skipActiveGroup)) {\n this.doSetGroupAndPanelActive(group);\n }\n this.updateWatermark();\n }\n orthogonalize(position, options) {\n this.gridview.normalize();\n switch (position) {\n case 'top':\n case 'bottom':\n if (this.gridview.orientation === Orientation.HORIZONTAL) {\n // we need to add to a vertical splitview but the current root is a horizontal splitview.\n // insert a vertical splitview at the root level and add the existing view as a child\n this.gridview.insertOrthogonalSplitviewAtRoot();\n }\n break;\n case 'left':\n case 'right':\n if (this.gridview.orientation === Orientation.VERTICAL) {\n // we need to add to a horizontal splitview but the current root is a vertical splitview.\n // insert a horiziontal splitview at the root level and add the existing view as a child\n this.gridview.insertOrthogonalSplitviewAtRoot();\n }\n break;\n }\n switch (position) {\n case 'top':\n case 'left':\n case 'center':\n return this.createGroupAtLocation([0], undefined, options); // insert into first position\n case 'bottom':\n case 'right':\n return this.createGroupAtLocation([this.gridview.length], undefined, options); // insert into last position\n default:\n throw new Error(`dockview: unsupported position ${position}`);\n }\n }\n updateOptions(options) {\n var _a, _b, _c, _d, _e;\n super.updateOptions(options);\n if ('floatingGroupBounds' in options) {\n for (const group of this._floatingGroups) {\n switch (options.floatingGroupBounds) {\n case 'boundedWithinViewport':\n group.overlay.minimumInViewportHeight = undefined;\n group.overlay.minimumInViewportWidth = undefined;\n break;\n case undefined:\n group.overlay.minimumInViewportHeight =\n DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE;\n group.overlay.minimumInViewportWidth =\n DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE;\n break;\n default:\n group.overlay.minimumInViewportHeight =\n (_a = options.floatingGroupBounds) === null || _a === void 0 ? void 0 : _a.minimumHeightWithinViewport;\n group.overlay.minimumInViewportWidth =\n (_b = options.floatingGroupBounds) === null || _b === void 0 ? void 0 : _b.minimumWidthWithinViewport;\n }\n group.overlay.setBounds();\n }\n }\n this.updateDropTargetModel(options);\n const oldDisableDnd = this.options.disableDnd;\n const oldDndStrategy = this.options.dndStrategy;\n this._options = Object.assign(Object.assign({}, this.options), options);\n const newDisableDnd = this.options.disableDnd;\n const newDndStrategy = this.options.dndStrategy;\n if (oldDisableDnd !== newDisableDnd ||\n oldDndStrategy !== newDndStrategy) {\n this.updateDragAndDropState();\n }\n if ('theme' in options) {\n this.updateTheme();\n }\n if ('createRightHeaderActionComponent' in options ||\n 'createLeftHeaderActionComponent' in options ||\n 'createPrefixHeaderActionComponent' in options) {\n for (const group of this.groups) {\n group.model.updateHeaderActions();\n }\n }\n if ('createWatermarkComponent' in options) {\n if (this._watermark) {\n this._watermark.element.parentElement.remove();\n (_d = (_c = this._watermark).dispose) === null || _d === void 0 ? void 0 : _d.call(_c);\n this._watermark = null;\n }\n this.updateWatermark();\n for (const group of this.groups) {\n group.model.refreshWatermark();\n }\n }\n if ('tabGroupColors' in options || 'tabGroupAccent' in options) {\n this._tabGroupColorPalette.setEntries((_e = this._options.tabGroupColors) !== null && _e !== void 0 ? _e : DEFAULT_TAB_GROUP_COLORS);\n this._tabGroupColorPalette.enabled =\n this._options.tabGroupAccent !== 'off';\n for (const group of this.groups) {\n group.model.refreshTabGroupAccent();\n }\n }\n this._onDidOptionsChange.fire();\n this._layoutFromShell(this.gridview.width, this.gridview.height);\n }\n layout(width, height, forceResize) {\n if (this._shellManager && !this._inShellLayout) {\n this._shellManager.layout(width, height);\n }\n else {\n super.layout(width, height, forceResize);\n }\n this._syncFloatingOverlayHost();\n if (this._floatingGroups) {\n for (const floating of this._floatingGroups) {\n // ensure floting groups stay within visible boundaries\n floating.overlay.setBounds();\n }\n }\n }\n _syncFloatingOverlayHost() {\n if (!this._floatingOverlayHost || !this._shellManager) {\n return;\n }\n const shellRect = this._shellManager.element.getBoundingClientRect();\n const gridRect = this.element.getBoundingClientRect();\n const host = this._floatingOverlayHost;\n host.style.left = `${gridRect.left - shellRect.left}px`;\n host.style.top = `${gridRect.top - shellRect.top}px`;\n host.style.width = `${gridRect.width}px`;\n host.style.height = `${gridRect.height}px`;\n }\n _layoutFromShell(width, height) {\n this._inShellLayout = true;\n this.layout(width, height, true);\n this._inShellLayout = false;\n }\n forceRelayout() {\n if (this._shellManager) {\n this._layoutFromShell(this.width, this.height);\n }\n else {\n super.forceRelayout();\n }\n }\n addEdgeGroup(position, options) {\n if (this._edgeGroups.has(position)) {\n throw new Error(`dockview: edge group already exists at position '${position}'`);\n }\n const group = this.createGroup({ id: options.id });\n group.model.location = { type: 'edge', position };\n group.model.headerPosition = position;\n this._edgeGroups.set(position, group);\n this._onDidAddGroup.fire(group);\n // Collapse when the group becomes empty\n const autoCollapseDisposable = group.model.onDidRemovePanel(() => {\n if (group.model.isEmpty) {\n this.setEdgeGroupCollapsed(group, true);\n }\n });\n this._edgeGroupDisposables.set(position, autoCollapseDisposable);\n this._shellManager.addEdgeView(position, options, group);\n return group.api;\n }\n getEdgeGroup(position) {\n var _a;\n return (_a = this._edgeGroups.get(position)) === null || _a === void 0 ? void 0 : _a.api;\n }\n setEdgeGroupVisible(position, visible) {\n this._shellManager.setEdgeGroupVisible(position, visible);\n }\n isEdgeGroupVisible(position) {\n return this._shellManager.isEdgeGroupVisible(position);\n }\n removeEdgeGroup(position) {\n var _a;\n const group = this._edgeGroups.get(position);\n if (!group) {\n throw new Error(`dockview: no edge group exists at position '${position}'`);\n }\n // Remove panels inside the group first\n for (const panel of [...group.panels]) {\n this.removePanel(panel, {\n removeEmptyGroup: false,\n skipDispose: false,\n });\n }\n // Dispose the auto-collapse listener\n (_a = this._edgeGroupDisposables.get(position)) === null || _a === void 0 ? void 0 : _a.dispose();\n this._edgeGroupDisposables.delete(position);\n // Remove from the shell splitview\n this._shellManager.removeEdgeView(position);\n // Clean up group state\n this._edgeGroups.delete(position);\n group.dispose();\n this._groups.delete(group.id);\n this._onDidRemoveGroup.fire(group);\n }\n setEdgeGroupCollapsed(group, collapsed) {\n for (const [position, edgeGroup] of this._edgeGroups) {\n if (edgeGroup === group) {\n if (this._shellManager.isEdgeGroupCollapsed(position) ===\n collapsed) {\n // Skip the splitview resize on a no-op: with non-zero\n // theme gap, redundant resizeView calls accumulate\n // rounding drift that gradually shrinks the group.\n return;\n }\n this._shellManager.setEdgeGroupCollapsed(position, collapsed);\n edgeGroup.api._onDidCollapsedChange.fire({\n isCollapsed: collapsed,\n });\n return;\n }\n }\n }\n isEdgeGroupCollapsed(group) {\n for (const [position, edgeGroup] of this._edgeGroups) {\n if (edgeGroup === group) {\n return this._shellManager.isEdgeGroupCollapsed(position);\n }\n }\n return false;\n }\n updateDragAndDropState() {\n // Update draggable state for all tabs and void containers\n for (const group of this.groups) {\n group.model.updateDragAndDropState();\n }\n }\n focus() {\n var _a;\n (_a = this.activeGroup) === null || _a === void 0 ? void 0 : _a.focus();\n }\n getGroupPanel(id) {\n return this.panels.find((panel) => panel.id === id);\n }\n setActivePanel(panel) {\n panel.group.model.openPanel(panel);\n this.doSetGroupAndPanelActive(panel.group);\n }\n moveToNext(options = {}) {\n var _a;\n if (!options.group) {\n if (!this.activeGroup) {\n return;\n }\n options.group = this.activeGroup;\n }\n if (options.includePanel && options.group) {\n if (options.group.activePanel !==\n options.group.panels[options.group.panels.length - 1]) {\n options.group.model.moveToNext({ suppressRoll: true });\n return;\n }\n }\n const location = getGridLocation(options.group.element);\n const next = (_a = this.gridview.next(location)) === null || _a === void 0 ? void 0 : _a.view;\n this.doSetGroupAndPanelActive(next);\n }\n moveToPrevious(options = {}) {\n var _a;\n if (!options.group) {\n if (!this.activeGroup) {\n return;\n }\n options.group = this.activeGroup;\n }\n if (options.includePanel && options.group) {\n if (options.group.activePanel !== options.group.panels[0]) {\n options.group.model.moveToPrevious({ suppressRoll: true });\n return;\n }\n }\n const location = getGridLocation(options.group.element);\n const next = (_a = this.gridview.previous(location)) === null || _a === void 0 ? void 0 : _a.view;\n if (next) {\n this.doSetGroupAndPanelActive(next);\n }\n }\n /**\n * Serialize the current state of the layout\n *\n * @returns A JSON respresentation of the layout\n */\n toJSON() {\n var _a;\n const data = this.gridview.serialize();\n const panels = this.panels.reduce((collection, panel) => {\n collection[panel.id] = panel.toJSON();\n return collection;\n }, {});\n const floats = this._floatingGroups.map((group) => {\n return {\n data: group.group.toJSON(),\n position: group.overlay.toJSON(),\n };\n });\n const popoutGroups = this._popoutGroups.map((group) => {\n return {\n data: group.popoutGroup.toJSON(),\n gridReferenceGroup: group.referenceGroup,\n position: group.window.dimensions(),\n url: group.popoutGroup.api.location.type === 'popout'\n ? group.popoutGroup.api.location.popoutUrl\n : undefined,\n };\n });\n const result = {\n grid: data,\n panels,\n activeGroup: (_a = this.activeGroup) === null || _a === void 0 ? void 0 : _a.id,\n };\n if (floats.length > 0) {\n result.floatingGroups = floats;\n }\n if (popoutGroups.length > 0) {\n result.popoutGroups = popoutGroups;\n }\n if (this._edgeGroups.size > 0) {\n const shellSerialized = this._shellManager.toJSON();\n // Augment each entry with the serialized group state\n for (const [position, group] of this._edgeGroups) {\n const entry = shellSerialized[position];\n if (entry) {\n entry.group = group.toJSON();\n }\n }\n result.edgeGroups = shellSerialized;\n }\n return result;\n }\n fromJSON(data, options) {\n var _a, _b, _c;\n // Cancel any popout-restoration timers queued by a previous fromJSON\n // that haven't fired yet. Each cleanup also disposes the orphan group\n // that was registered in _groups synchronously but never parented\n // into a popout window — otherwise the upcoming clear() would call\n // gridview.remove() on an unparented element and throw\n // \"Invalid grid element\". See issue #1304.\n for (const cleanup of [...this._popoutRestorationCleanups]) {\n cleanup();\n }\n this._popoutRestorationCleanups.clear();\n const existingPanels = new Map();\n let tempGroup;\n if (options === null || options === void 0 ? void 0 : options.reuseExistingPanels) {\n /**\n * What are we doing here?\n *\n * 1. Create a temporary group to hold any panels that currently exist and that also exist in the new layout\n * 2. Remove that temporary group from the group mapping so that it doesn't get cleared when we clear the layout\n */\n tempGroup = this.createGroup();\n this._groups.delete(tempGroup.api.id);\n const newPanels = Object.keys(data.panels);\n for (const panel of this.panels) {\n if (newPanels.includes(panel.api.id)) {\n existingPanels.set(panel.api.id, panel);\n }\n }\n this.movingLock(() => {\n Array.from(existingPanels.values()).forEach((panel) => {\n this.moveGroupOrPanel({\n from: {\n groupId: panel.api.group.api.id,\n panelId: panel.api.id,\n },\n to: {\n group: tempGroup,\n position: 'center',\n },\n keepEmptyGroups: true,\n });\n });\n });\n }\n this.clear();\n if (typeof data !== 'object' || data === null) {\n throw new Error('dockview: serialized layout must be a non-null object');\n }\n const { grid, panels, activeGroup } = data;\n if (grid.root.type !== 'branch' || !Array.isArray(grid.root.data)) {\n throw new Error('dockview: root must be of type branch');\n }\n try {\n // take note of the existing dimensions\n const width = this.width;\n const height = this.height;\n const createGroupFromSerializedState = (data) => {\n const { id, locked, hideHeader, headerPosition, views, activeView, } = data;\n if (typeof id !== 'string') {\n throw new Error('dockview: group id must be of type string');\n }\n const group = this.createGroup({\n id,\n locked: !!locked,\n hideHeader: !!hideHeader,\n headerPosition,\n });\n this._onDidAddGroup.fire(group);\n const createdPanels = [];\n for (const child of views) {\n /**\n * Run the deserializer step seperately since this may fail to due corrupted external state.\n * In running this section first we avoid firing lots of 'add' events in the event of a failure\n * due to a corruption of input data.\n */\n const existingPanel = existingPanels.get(child);\n if (tempGroup && existingPanel) {\n this.movingLock(() => {\n tempGroup.model.removePanel(existingPanel);\n });\n createdPanels.push(existingPanel);\n existingPanel.updateFromStateModel(panels[child]);\n }\n else {\n const panel = this._deserializer.fromJSON(panels[child], group);\n createdPanels.push(panel);\n }\n }\n for (let i = 0; i < views.length; i++) {\n const panel = createdPanels[i];\n const isActive = typeof activeView === 'string' &&\n activeView === panel.id;\n const hasExisting = existingPanels.has(panel.api.id);\n if (hasExisting) {\n this.movingLock(() => {\n group.model.openPanel(panel, {\n skipSetActive: !isActive,\n skipSetGroupActive: true,\n });\n });\n }\n else {\n group.model.openPanel(panel, {\n skipSetActive: !isActive,\n skipSetGroupActive: true,\n });\n }\n }\n // Restore tab groups before activating a fallback panel so\n // that collapsed groups can clear the active panel correctly.\n if (data.tabGroups && data.tabGroups.length > 0) {\n group.model.restoreTabGroups(data.tabGroups);\n }\n if (!group.activePanel && group.panels.length > 0) {\n group.model.openPanel(group.panels[group.panels.length - 1], {\n skipSetGroupActive: true,\n });\n }\n return group;\n };\n this.gridview.deserialize(grid, {\n fromJSON: (node) => {\n return createGroupFromSerializedState(node.data);\n },\n });\n this._layoutFromShell(width, height);\n if (data.edgeGroups) {\n // Auto-create edge groups for positions in the serialized state\n // that don't already have a group registered (e.g. when fromJSON\n // is called before the user has called addEdgeGroup).\n for (const _position of [\n 'top',\n 'bottom',\n 'left',\n 'right',\n ]) {\n const fixedData = data.edgeGroups[_position];\n if (fixedData && !this._edgeGroups.has(_position)) {\n const groupState = fixedData.group;\n const id = (_a = groupState === null || groupState === void 0 ? void 0 : groupState.id) !== null && _a !== void 0 ? _a : `${_position}-group`;\n this.addEdgeGroup(_position, { id });\n }\n }\n // Restore panel contents of edge groups\n for (const [position, edgeGroup] of this._edgeGroups) {\n const edgeData = data.edgeGroups[position];\n const groupState = edgeData === null || edgeData === void 0 ? void 0 : edgeData.group;\n if (groupState) {\n const { views, activeView } = groupState;\n const createdPanels = [];\n for (const panelId of views) {\n if (panels[panelId]) {\n const panel = this._deserializer.fromJSON(panels[panelId], edgeGroup);\n createdPanels.push(panel);\n }\n }\n for (let i = 0; i < createdPanels.length; i++) {\n const panel = createdPanels[i];\n const isActive = activeView === panel.id;\n edgeGroup.model.openPanel(panel, {\n skipSetActive: !isActive,\n skipSetGroupActive: true,\n });\n }\n // Restore tab groups before activating a fallback panel\n if (groupState.tabGroups &&\n groupState.tabGroups.length > 0) {\n edgeGroup.model.restoreTabGroups(groupState.tabGroups);\n }\n if (!edgeGroup.activePanel &&\n edgeGroup.panels.length > 0) {\n edgeGroup.model.openPanel(edgeGroup.panels[edgeGroup.panels.length - 1], { skipSetGroupActive: true });\n }\n }\n }\n this._shellManager.fromJSON(data.edgeGroups);\n }\n const serializedFloatingGroups = (_b = data.floatingGroups) !== null && _b !== void 0 ? _b : [];\n for (const serializedFloatingGroup of serializedFloatingGroups) {\n const { data, position } = serializedFloatingGroup;\n const group = createGroupFromSerializedState(data);\n this.addFloatingGroup(group, {\n position: position,\n width: position.width,\n height: position.height,\n skipRemoveGroup: true,\n inDragMode: false,\n });\n }\n const serializedPopoutGroups = (_c = data.popoutGroups) !== null && _c !== void 0 ? _c : [];\n // Create a promise that resolves when all popout groups are created\n const popoutPromises = [];\n // Queue popup group creation with delays to avoid browser blocking\n serializedPopoutGroups.forEach((serializedPopoutGroup, index) => {\n const { data, position, gridReferenceGroup, url } = serializedPopoutGroup;\n const group = createGroupFromSerializedState(data);\n // Add a small delay for each popup after the first to avoid browser popup blocking\n const popoutPromise = new Promise((resolve) => {\n const cleanup = () => {\n this._popoutRestorationCleanups.delete(cleanup);\n clearTimeout(handle);\n // The group was registered in _groups synchronously\n // but the timer that would parent it into the popout\n // window never ran. Dispose the orphan here so the\n // next clear() doesn't trip over an unparented\n // element. See issue #1304.\n if (!this.isDisposed &&\n this._groups.has(group.id) &&\n group.element.parentElement === null) {\n for (const panel of [...group.panels]) {\n this.removePanel(panel, {\n removeEmptyGroup: false,\n });\n }\n group.dispose();\n this._groups.delete(group.id);\n this._onDidRemoveGroup.fire(group);\n }\n resolve();\n };\n const handle = setTimeout(() => {\n this._popoutRestorationCleanups.delete(cleanup);\n // Guard against the component being disposed before\n // this timer fires. Under React StrictMode the\n // component is mounted -> disposed -> remounted, and\n // without this guard the first instance's queued\n // restoration would open a second popout window.\n // See issue #851.\n if (this.isDisposed) {\n resolve();\n return;\n }\n this.addPopoutGroup(group, {\n position: position !== null && position !== void 0 ? position : undefined,\n overridePopoutGroup: gridReferenceGroup\n ? group\n : undefined,\n referenceGroup: gridReferenceGroup\n ? this.getPanel(gridReferenceGroup)\n : undefined,\n popoutUrl: url,\n });\n resolve();\n }, index * DESERIALIZATION_POPOUT_DELAY_MS); // 100ms delay between each popup\n this._popoutRestorationCleanups.add(cleanup);\n });\n popoutPromises.push(popoutPromise);\n });\n // Store the promise for tests to wait on\n this._popoutRestorationPromise = Promise.all(popoutPromises).then(() => void 0);\n for (const floatingGroup of this._floatingGroups) {\n floatingGroup.overlay.setBounds();\n }\n if (typeof activeGroup === 'string') {\n const panel = this.getPanel(activeGroup);\n if (panel) {\n this.doSetGroupAndPanelActive(panel);\n }\n }\n }\n catch (err) {\n console.error('dockview: failed to deserialize layout. Reverting changes', err);\n /**\n * Takes all the successfully created groups and remove all of their panels.\n */\n for (const group of this.groups) {\n for (const panel of group.panels) {\n this.removePanel(panel, {\n removeEmptyGroup: false,\n skipDispose: false,\n });\n }\n }\n /**\n * To remove a group we cannot call this.removeGroup(...) since this makes assumptions about\n * the underlying HTMLElement existing in the Gridview.\n */\n for (const group of this.groups) {\n group.dispose();\n this._groups.delete(group.id);\n this._onDidRemoveGroup.fire(group);\n }\n // iterate over a reassigned array since original array will be modified\n for (const floatingGroup of [...this._floatingGroups]) {\n floatingGroup.dispose();\n }\n // fires clean-up events and clears the underlying HTML gridview.\n this.clear();\n /**\n * even though we have cleaned-up we still want to inform the caller of their error\n * and we'll do this through re-throwing the original error since afterall you would\n * expect trying to load a corrupted layout to result in an error and not silently fail...\n */\n throw err;\n }\n this.updateWatermark();\n // Force position updates for always visible panels after DOM layout is complete\n this.debouncedUpdateAllPositions();\n this._onDidLayoutFromJSON.fire();\n }\n clear() {\n const groups = Array.from(this._groups.values()).map((_) => _.value);\n const hasActiveGroup = !!this.activeGroup;\n for (const group of groups) {\n if ([...this._edgeGroups.values()].includes(group)) {\n // Edge groups are structural - only clear their panels, not the group itself\n const panels = [...group.panels];\n for (const panel of panels) {\n this.removePanel(panel, { removeEmptyGroup: false });\n }\n continue;\n }\n // remove the group will automatically remove the panels\n this.removeGroup(group, { skipActive: true });\n }\n if (hasActiveGroup) {\n this.doSetGroupAndPanelActive(undefined);\n }\n this.gridview.clear();\n }\n closeAllGroups() {\n for (const entry of this._groups.entries()) {\n const [_, group] = entry;\n group.value.model.closeAllPanels();\n }\n }\n addPanel(options) {\n var _a, _b;\n if (this.panels.find((_) => _.id === options.id)) {\n throw new Error(`dockview: panel with id ${options.id} already exists`);\n }\n let referenceGroup;\n if (options.position && options.floating) {\n throw new Error('dockview: you can only provide one of: position, floating as arguments to .addPanel(...)');\n }\n const initial = {\n width: options.initialWidth,\n height: options.initialHeight,\n };\n let index;\n if (options.position) {\n if (isPanelOptionsWithPanel(options.position)) {\n const referencePanel = typeof options.position.referencePanel === 'string'\n ? this.getGroupPanel(options.position.referencePanel)\n : options.position.referencePanel;\n index = options.position.index;\n if (!referencePanel) {\n throw new Error(`dockview: referencePanel '${options.position.referencePanel}' does not exist`);\n }\n referenceGroup = this.findGroup(referencePanel);\n }\n else if (isPanelOptionsWithGroup(options.position)) {\n referenceGroup =\n typeof options.position.referenceGroup === 'string'\n ? (_a = this._groups.get(options.position.referenceGroup)) === null || _a === void 0 ? void 0 : _a.value\n : options.position.referenceGroup;\n index = options.position.index;\n if (!referenceGroup) {\n throw new Error(`dockview: referenceGroup '${options.position.referenceGroup}' does not exist`);\n }\n }\n else {\n const group = this.orthogonalize(directionToPosition(options.position.direction));\n const panel = this.createPanel(options, group);\n group.model.openPanel(panel, {\n skipSetActive: options.inactive,\n skipSetGroupActive: options.inactive,\n index,\n });\n if (!options.inactive) {\n this.doSetGroupAndPanelActive(group);\n }\n group.api.setSize({\n height: initial === null || initial === void 0 ? void 0 : initial.height,\n width: initial === null || initial === void 0 ? void 0 : initial.width,\n });\n return panel;\n }\n }\n else {\n referenceGroup = this.activeGroup;\n }\n let panel;\n if (referenceGroup) {\n const target = toTarget(((_b = options.position) === null || _b === void 0 ? void 0 : _b.direction) || 'within');\n if (options.floating) {\n const group = this.createGroup();\n this._onDidAddGroup.fire(group);\n const floatingGroupOptions = typeof options.floating === 'object' &&\n options.floating !== null\n ? options.floating\n : {};\n this.addFloatingGroup(group, Object.assign(Object.assign({}, floatingGroupOptions), { inDragMode: false, skipRemoveGroup: true, skipActiveGroup: true }));\n panel = this.createPanel(options, group);\n group.model.openPanel(panel, {\n skipSetActive: options.inactive,\n skipSetGroupActive: options.inactive,\n index,\n });\n }\n else if (referenceGroup.api.location.type === 'floating' ||\n referenceGroup.api.location.type === 'edge' ||\n target === 'center') {\n panel = this.createPanel(options, referenceGroup);\n referenceGroup.model.openPanel(panel, {\n skipSetActive: options.inactive,\n skipSetGroupActive: options.inactive,\n index,\n });\n referenceGroup.api.setSize({\n width: initial === null || initial === void 0 ? void 0 : initial.width,\n height: initial === null || initial === void 0 ? void 0 : initial.height,\n });\n if (!options.inactive) {\n this.doSetGroupAndPanelActive(referenceGroup);\n }\n }\n else {\n const location = getGridLocation(referenceGroup.element);\n const relativeLocation = getRelativeLocation(this.gridview.orientation, location, target);\n const group = this.createGroupAtLocation(relativeLocation, this.orientationAtLocation(relativeLocation) ===\n Orientation.VERTICAL\n ? initial === null || initial === void 0 ? void 0 : initial.height\n : initial === null || initial === void 0 ? void 0 : initial.width);\n panel = this.createPanel(options, group);\n group.model.openPanel(panel, {\n skipSetActive: options.inactive,\n skipSetGroupActive: options.inactive,\n index,\n });\n if (!options.inactive) {\n this.doSetGroupAndPanelActive(group);\n }\n }\n }\n else if (options.floating) {\n const group = this.createGroup();\n this._onDidAddGroup.fire(group);\n const coordinates = typeof options.floating === 'object' &&\n options.floating !== null\n ? options.floating\n : {};\n this.addFloatingGroup(group, Object.assign(Object.assign({}, coordinates), { inDragMode: false, skipRemoveGroup: true, skipActiveGroup: true }));\n panel = this.createPanel(options, group);\n group.model.openPanel(panel, {\n skipSetActive: options.inactive,\n skipSetGroupActive: options.inactive,\n index,\n });\n }\n else {\n const group = this.createGroupAtLocation([0], this.gridview.orientation === Orientation.VERTICAL\n ? initial === null || initial === void 0 ? void 0 : initial.height\n : initial === null || initial === void 0 ? void 0 : initial.width);\n panel = this.createPanel(options, group);\n group.model.openPanel(panel, {\n skipSetActive: options.inactive,\n skipSetGroupActive: options.inactive,\n index,\n });\n if (!options.inactive) {\n this.doSetGroupAndPanelActive(group);\n }\n }\n return panel;\n }\n removePanel(panel, options = {\n removeEmptyGroup: true,\n }) {\n const group = panel.group;\n if (!group) {\n throw new Error(`dockview: cannot remove panel ${panel.id}. it's missing a group.`);\n }\n group.model.removePanel(panel, {\n skipSetActiveGroup: options.skipSetActiveGroup,\n });\n if (!options.skipDispose) {\n panel.group.model.renderContainer.detatch(panel);\n panel.dispose();\n }\n if (group.size === 0 && options.removeEmptyGroup) {\n this.removeGroup(group, { skipActive: options.skipSetActiveGroup });\n }\n }\n createWatermarkComponent() {\n if (this.options.createWatermarkComponent) {\n return this.options.createWatermarkComponent();\n }\n return new Watermark();\n }\n updateWatermark() {\n var _a, _b;\n if (this.groups.filter((x) => x.api.location.type === 'grid' && x.api.isVisible).length === 0) {\n if (!this._watermark) {\n this._watermark = this.createWatermarkComponent();\n this._watermark.init({\n containerApi: new DockviewApi(this),\n });\n const watermarkContainer = document.createElement('div');\n watermarkContainer.className = 'dv-watermark-container';\n addTestId(watermarkContainer, 'watermark-component');\n watermarkContainer.appendChild(this._watermark.element);\n this.gridview.element.appendChild(watermarkContainer);\n }\n }\n else if (this._watermark) {\n this._watermark.element.parentElement.remove();\n (_b = (_a = this._watermark).dispose) === null || _b === void 0 ? void 0 : _b.call(_a);\n this._watermark = null;\n }\n }\n addGroup(options) {\n var _a;\n if (options) {\n let referenceGroup;\n if (isGroupOptionsWithPanel(options)) {\n const referencePanel = typeof options.referencePanel === 'string'\n ? this.panels.find((panel) => panel.id === options.referencePanel)\n : options.referencePanel;\n if (!referencePanel) {\n throw new Error(`dockview: reference panel ${options.referencePanel} does not exist`);\n }\n referenceGroup = this.findGroup(referencePanel);\n if (!referenceGroup) {\n throw new Error(`dockview: reference group for reference panel ${options.referencePanel} does not exist`);\n }\n }\n else if (isGroupOptionsWithGroup(options)) {\n referenceGroup =\n typeof options.referenceGroup === 'string'\n ? (_a = this._groups.get(options.referenceGroup)) === null || _a === void 0 ? void 0 : _a.value\n : options.referenceGroup;\n if (!referenceGroup) {\n throw new Error(`dockview: reference group ${options.referenceGroup} does not exist`);\n }\n }\n else {\n const group = this.orthogonalize(directionToPosition(options.direction), options);\n if (!options.skipSetActive) {\n this.doSetGroupAndPanelActive(group);\n }\n return group;\n }\n const target = toTarget(options.direction || 'within');\n const location = getGridLocation(referenceGroup.element);\n const relativeLocation = getRelativeLocation(this.gridview.orientation, location, target);\n const group = this.createGroup(options);\n const size = this.getLocationOrientation(relativeLocation) ===\n Orientation.VERTICAL\n ? options.initialHeight\n : options.initialWidth;\n this.doAddGroup(group, relativeLocation, size);\n if (!options.skipSetActive) {\n this.doSetGroupAndPanelActive(group);\n }\n return group;\n }\n else {\n const group = this.createGroup(options);\n this.doAddGroup(group);\n this.doSetGroupAndPanelActive(group);\n return group;\n }\n }\n getLocationOrientation(location) {\n return location.length % 2 == 0 &&\n this.gridview.orientation === Orientation.HORIZONTAL\n ? Orientation.HORIZONTAL\n : Orientation.VERTICAL;\n }\n removeGroup(group, options) {\n this.doRemoveGroup(group, options);\n }\n doRemoveGroup(group, options) {\n var _a;\n // Edge groups are permanent structural elements - never remove them from the layout\n if ([...this._edgeGroups.values()].includes(group)) {\n return group;\n }\n const panels = [...group.panels]; // reassign since group panels will mutate\n if (!(options === null || options === void 0 ? void 0 : options.skipDispose)) {\n for (const panel of panels) {\n this.removePanel(panel, {\n removeEmptyGroup: false,\n skipDispose: (_a = options === null || options === void 0 ? void 0 : options.skipDispose) !== null && _a !== void 0 ? _a : false,\n });\n }\n }\n const activePanel = this.activePanel;\n if (group.api.location.type === 'floating') {\n const floatingGroup = this._floatingGroups.find((_) => _.group === group);\n if (floatingGroup) {\n if (!(options === null || options === void 0 ? void 0 : options.skipDispose)) {\n floatingGroup.group.dispose();\n this._groups.delete(group.id);\n this._onDidRemoveGroup.fire(group);\n }\n remove(this._floatingGroups, floatingGroup);\n floatingGroup.dispose();\n if (!(options === null || options === void 0 ? void 0 : options.skipActive) && this._activeGroup === group) {\n const groups = Array.from(this._groups.values());\n this.doSetGroupAndPanelActive(groups.length > 0 ? groups[0].value : undefined);\n }\n return floatingGroup.group;\n }\n throw new Error('dockview: failed to find floating group');\n }\n if (group.api.location.type === 'popout') {\n const selectedGroup = this._popoutGroups.find((_) => _.popoutGroup === group);\n if (selectedGroup) {\n if (!(options === null || options === void 0 ? void 0 : options.skipDispose)) {\n if (!(options === null || options === void 0 ? void 0 : options.skipPopoutAssociated)) {\n const refGroup = selectedGroup.referenceGroup\n ? this.getPanel(selectedGroup.referenceGroup)\n : undefined;\n if (refGroup && refGroup.panels.length === 0) {\n this.removeGroup(refGroup);\n }\n }\n selectedGroup.popoutGroup.dispose();\n this._groups.delete(group.id);\n this._onDidRemoveGroup.fire(group);\n }\n remove(this._popoutGroups, selectedGroup);\n const removedGroup = selectedGroup.disposable.dispose();\n if (!(options === null || options === void 0 ? void 0 : options.skipPopoutReturn) && removedGroup) {\n this.doAddGroup(removedGroup, [0]);\n this.doSetGroupAndPanelActive(removedGroup);\n }\n if (!(options === null || options === void 0 ? void 0 : options.skipActive) && this._activeGroup === group) {\n const groups = Array.from(this._groups.values());\n this.doSetGroupAndPanelActive(groups.length > 0 ? groups[0].value : undefined);\n }\n this.updateWatermark();\n return selectedGroup.popoutGroup;\n }\n throw new Error('dockview: failed to find popout group');\n }\n const re = super.doRemoveGroup(group, options);\n if (!(options === null || options === void 0 ? void 0 : options.skipActive)) {\n if (this.activePanel !== activePanel) {\n this._onDidActivePanelChange.fire(this.activePanel);\n }\n }\n return re;\n }\n debouncedUpdateAllPositions() {\n if (this._updatePositionsFrameId !== undefined) {\n cancelAnimationFrame(this._updatePositionsFrameId);\n }\n this._updatePositionsFrameId = requestAnimationFrame(() => {\n this._updatePositionsFrameId = undefined;\n this.overlayRenderContainer.updateAllPositions();\n });\n }\n movingLock(func) {\n const isMoving = this._moving;\n try {\n this._moving = true;\n return func();\n }\n finally {\n this._moving = isMoving;\n }\n }\n moveGroupOrPanel(options) {\n var _a;\n const destinationGroup = options.to.group;\n const sourceGroupId = options.from.groupId;\n const sourceItemId = options.from.panelId;\n const destinationTarget = options.to.position;\n const destinationIndex = options.to.index;\n const sourceGroup = sourceGroupId\n ? (_a = this._groups.get(sourceGroupId)) === null || _a === void 0 ? void 0 : _a.value\n : undefined;\n if (!sourceGroup) {\n throw new Error(`dockview: Failed to find group id ${sourceGroupId}`);\n }\n if (sourceItemId === undefined) {\n if (options.from.tabGroupId) {\n /**\n * Moving a tab group (subset of panels) into another group\n */\n this.moveTabGroupToGroup({\n sourceGroup,\n tabGroupId: options.from.tabGroupId,\n destinationGroup,\n destinationTarget,\n destinationIndex,\n skipSetActive: options.skipSetActive,\n keepEmptyGroups: options.keepEmptyGroups,\n });\n }\n else {\n /**\n * Moving an entire group into another group\n */\n this.moveGroup({\n from: { group: sourceGroup },\n to: {\n group: destinationGroup,\n position: destinationTarget,\n },\n skipSetActive: options.skipSetActive,\n });\n }\n return;\n }\n if (!destinationTarget || destinationTarget === 'center') {\n /**\n * Dropping a panel within another group\n */\n const removedPanel = this.movingLock(() => sourceGroup.model.removePanel(sourceItemId, {\n skipSetActive: false,\n skipSetActiveGroup: true,\n }));\n if (!removedPanel) {\n throw new Error(`dockview: No panel with id ${sourceItemId}`);\n }\n if (!options.keepEmptyGroups && sourceGroup.model.size === 0) {\n // remove the group and do not set a new group as active\n this.doRemoveGroup(sourceGroup, { skipActive: true });\n }\n // Check if destination group is empty - if so, force render the component\n const isDestinationGroupEmpty = destinationGroup.model.size === 0;\n this.movingLock(() => {\n var _a;\n return destinationGroup.model.openPanel(removedPanel, {\n index: destinationIndex,\n skipSetActive: ((_a = options.skipSetActive) !== null && _a !== void 0 ? _a : false) &&\n !isDestinationGroupEmpty,\n skipSetGroupActive: true,\n });\n });\n if (!options.skipSetActive) {\n this.doSetGroupAndPanelActive(destinationGroup);\n }\n this._onDidMovePanel.fire({\n panel: removedPanel,\n from: sourceGroup,\n });\n }\n else {\n /**\n * Dropping a panel to the extremities of a group which will place that panel\n * into an adjacent group\n */\n const referenceLocation = getGridLocation(destinationGroup.element);\n const targetLocation = getRelativeLocation(this.gridview.orientation, referenceLocation, destinationTarget);\n if (sourceGroup.size < 2) {\n /**\n * If we are moving from a group which only has one panel left we will consider\n * moving the group itself rather than moving the panel into a newly created group\n */\n const [targetParentLocation, to] = tail(targetLocation);\n if (sourceGroup.api.location.type === 'grid') {\n const sourceLocation = getGridLocation(sourceGroup.element);\n const [sourceParentLocation, from] = tail(sourceLocation);\n if (sequenceEquals(sourceParentLocation, targetParentLocation)) {\n // special case when 'swapping' two views within same grid location\n // if a group has one tab - we are essentially moving the 'group'\n // which is equivalent to swapping two views in this case\n this.gridview.moveView(sourceParentLocation, from, to);\n this._onDidMovePanel.fire({\n panel: this.getGroupPanel(sourceItemId),\n from: sourceGroup,\n });\n return;\n }\n }\n if (sourceGroup.api.location.type === 'popout') {\n /**\n * the source group is a popout group with a single panel\n *\n * 1. remove the panel from the group without triggering any events\n * 2. remove the popout group — this may cascade-remove the empty\n * reference group it left behind in the main grid (see\n * doRemoveGroup for popout groups), which can shift grid indices\n * 3. recompute the target location now that the grid is stable\n * 4. create a new group at the recomputed location and add that panel\n */\n const popoutGroup = this._popoutGroups.find((group) => group.popoutGroup === sourceGroup);\n const removedPanel = this.movingLock(() => popoutGroup.popoutGroup.model.removePanel(popoutGroup.popoutGroup.panels[0], {\n skipSetActive: true,\n skipSetActiveGroup: true,\n }));\n this.doRemoveGroup(sourceGroup, { skipActive: true });\n const updatedTargetLocation = getRelativeLocation(this.gridview.orientation, getGridLocation(destinationGroup.element), destinationTarget);\n const newGroup = this.createGroupAtLocation(updatedTargetLocation);\n this.movingLock(() => newGroup.model.openPanel(removedPanel, {\n skipSetActive: true,\n }));\n this.doSetGroupAndPanelActive(newGroup);\n this._onDidMovePanel.fire({\n panel: this.getGroupPanel(sourceItemId),\n from: sourceGroup,\n });\n return;\n }\n if (sourceGroup.api.location.type === 'edge') {\n /**\n * Edge groups are permanent structural elements — never move the\n * group itself. Instead extract the panel and create a new grid group,\n * leaving the edge slot intact (same behaviour as the size >= 2 path).\n */\n const removedPanel = this.movingLock(() => sourceGroup.model.removePanel(sourceItemId, {\n skipSetActive: false,\n skipSetActiveGroup: true,\n }));\n if (!removedPanel) {\n throw new Error(`dockview: No panel with id ${sourceItemId}`);\n }\n const newGroup = this.createGroupAtLocation(targetLocation);\n this.movingLock(() => newGroup.model.openPanel(removedPanel, {\n skipSetGroupActive: true,\n }));\n this.doSetGroupAndPanelActive(newGroup);\n this._onDidMovePanel.fire({\n panel: removedPanel,\n from: sourceGroup,\n });\n return;\n }\n // source group will become empty so delete the group\n const targetGroup = this.movingLock(() => this.doRemoveGroup(sourceGroup, {\n skipActive: true,\n skipDispose: true,\n }));\n // after deleting the group we need to re-evaulate the ref location\n const updatedReferenceLocation = getGridLocation(destinationGroup.element);\n const location = getRelativeLocation(this.gridview.orientation, updatedReferenceLocation, destinationTarget);\n this.movingLock(() => this.doAddGroup(targetGroup, location));\n this.doSetGroupAndPanelActive(targetGroup);\n this._onDidMovePanel.fire({\n panel: this.getGroupPanel(sourceItemId),\n from: sourceGroup,\n });\n }\n else {\n /**\n * The group we are removing from has many panels, we need to remove the panels we are moving,\n * create a new group, add the panels to that new group and add the new group in an appropiate position\n */\n const removedPanel = this.movingLock(() => sourceGroup.model.removePanel(sourceItemId, {\n skipSetActive: false,\n skipSetActiveGroup: true,\n }));\n if (!removedPanel) {\n throw new Error(`dockview: No panel with id ${sourceItemId}`);\n }\n const dropLocation = getRelativeLocation(this.gridview.orientation, referenceLocation, destinationTarget);\n const group = this.createGroupAtLocation(dropLocation);\n this.movingLock(() => group.model.openPanel(removedPanel, {\n skipSetGroupActive: true,\n }));\n this.doSetGroupAndPanelActive(group);\n this._onDidMovePanel.fire({\n panel: removedPanel,\n from: sourceGroup,\n });\n }\n }\n }\n moveTabGroupToGroup(options) {\n const { sourceGroup, tabGroupId, destinationGroup, destinationTarget, destinationIndex, } = options;\n const tabGroup = sourceGroup.model\n .getTabGroups()\n .find((tg) => tg.id === tabGroupId);\n if (!tabGroup || tabGroup.panelIds.length === 0) {\n return;\n }\n // Snapshot tab group metadata before removing panels\n const label = tabGroup.label;\n const color = tabGroup.color;\n const collapsed = tabGroup.collapsed;\n const componentParams = tabGroup.componentParams;\n const panelIds = [...tabGroup.panelIds];\n // Capture the destination's grid location BEFORE potentially\n // removing the source group, in case source === destination and\n // the source becomes empty after panel removal.\n const referenceLocation = destinationTarget && destinationTarget !== 'center'\n ? getGridLocation(destinationGroup.element)\n : undefined;\n // Remove panels from the source group\n const removedPanels = this.movingLock(() => panelIds\n .map((pid) => sourceGroup.model.removePanel(pid, {\n skipSetActive: false,\n skipSetActiveGroup: true,\n }))\n .filter((p) => p !== undefined));\n if (removedPanels.length === 0) {\n return;\n }\n const addPanelsToGroup = (targetGroup) => {\n this.movingLock(() => {\n for (const panel of removedPanels) {\n targetGroup.model.openPanel(panel, {\n index: destinationIndex,\n skipSetActive: true,\n skipSetGroupActive: true,\n });\n }\n });\n // Recreate the tab group in the destination\n const newTabGroup = targetGroup.model.createTabGroup({\n label,\n color,\n collapsed,\n componentParams,\n });\n for (const panel of removedPanels) {\n targetGroup.model.addPanelToTabGroup(newTabGroup.id, panel.id);\n }\n if (!options.skipSetActive) {\n this.doSetGroupAndPanelActive(targetGroup);\n }\n for (const panel of removedPanels) {\n this._onDidMovePanel.fire({\n panel,\n from: sourceGroup,\n });\n }\n };\n let targetGroup;\n if (!destinationTarget ||\n destinationTarget === 'center' ||\n !referenceLocation) {\n targetGroup = destinationGroup;\n }\n else {\n const dropLocation = getRelativeLocation(this.gridview.orientation, referenceLocation, destinationTarget);\n targetGroup = this.createGroupAtLocation(dropLocation);\n }\n // Remove the source group if it became empty. We compare against\n // the actual targetGroup (which is a freshly-created group for\n // edge drops) rather than the originally-passed destinationGroup,\n // so a tab-group drag onto its own group's edge still cleans up\n // the now-empty source.\n if (!options.keepEmptyGroups &&\n sourceGroup.model.size === 0 &&\n sourceGroup !== targetGroup) {\n this.doRemoveGroup(sourceGroup, { skipActive: true });\n }\n addPanelsToGroup(targetGroup);\n }\n moveGroup(options) {\n const from = options.from.group;\n const to = options.to.group;\n const target = options.to.position;\n // The group whose panels end up at the target. For non-edge moves\n // we relocate `from` itself; for edge moves we move panels into a\n // freshly created group so the edge slot stays anchored.\n let source = from;\n if (target === 'center') {\n const activePanel = from.activePanel;\n // Snapshot tab group metadata before removing panels so we\n // can recreate the tab groups in the destination after the\n // panels are merged in.\n const tabGroupSnapshots = from.model.getTabGroups().map((tg) => ({\n label: tg.label,\n color: tg.color,\n collapsed: tg.collapsed,\n componentParams: tg.componentParams,\n panelIds: [...tg.panelIds],\n }));\n const panels = this.movingLock(() => [...from.panels].map((p) => from.model.removePanel(p.id, {\n skipSetActive: true,\n })));\n if ((from === null || from === void 0 ? void 0 : from.model.size) === 0) {\n this.doRemoveGroup(from, { skipActive: true });\n }\n this.movingLock(() => {\n for (const panel of panels) {\n to.model.openPanel(panel, {\n skipSetActive: panel !== activePanel,\n skipSetGroupActive: true,\n });\n }\n });\n for (const snapshot of tabGroupSnapshots) {\n const newTabGroup = to.model.createTabGroup({\n label: snapshot.label,\n color: snapshot.color,\n collapsed: snapshot.collapsed,\n componentParams: snapshot.componentParams,\n });\n for (const panelId of snapshot.panelIds) {\n to.model.addPanelToTabGroup(newTabGroup.id, panelId);\n }\n }\n // Ensure group becomes active after move\n if (options.skipSetActive !== true) {\n // For center moves (merges), we need to ensure the target group is active\n // unless explicitly told not to (skipSetActive: true)\n this.doSetGroupAndPanelActive(to);\n }\n else if (!this.activePanel) {\n // Even with skipSetActive: true, ensure there's an active panel if none exists\n // This maintains basic functionality while respecting skipSetActive\n this.doSetGroupAndPanelActive(to);\n }\n }\n else {\n if (from.api.location.type === 'edge') {\n /**\n * Edge groups are permanent structural elements and must\n * stay anchored in their edge slot. Move the panels into a\n * new group; the auto-collapse listener registered in\n * addEdgeGroup will collapse the now-empty edge slot once\n * the last panel leaves. The placement code below then\n * positions `source` like any other moved group.\n */\n const activePanel = from.activePanel;\n // Snapshot tab group metadata so the new group inherits\n // the tab grouping from the edge slot.\n const tabGroupSnapshots = from.model\n .getTabGroups()\n .map((tg) => ({\n label: tg.label,\n color: tg.color,\n collapsed: tg.collapsed,\n componentParams: tg.componentParams,\n panelIds: [...tg.panelIds],\n }));\n const movedPanels = this.movingLock(() => [...from.panels].map((p) => from.model.removePanel(p.id, { skipSetActive: true })));\n source = this.createGroup();\n this.movingLock(() => {\n for (const panel of movedPanels) {\n source.model.openPanel(panel, {\n skipSetActive: panel !== activePanel,\n skipSetGroupActive: true,\n });\n }\n });\n for (const snapshot of tabGroupSnapshots) {\n const newTabGroup = source.model.createTabGroup({\n label: snapshot.label,\n color: snapshot.color,\n collapsed: snapshot.collapsed,\n componentParams: snapshot.componentParams,\n });\n for (const panelId of snapshot.panelIds) {\n source.model.addPanelToTabGroup(newTabGroup.id, panelId);\n }\n }\n }\n else {\n switch (from.api.location.type) {\n case 'grid':\n this.gridview.removeView(getGridLocation(from.element));\n break;\n case 'floating': {\n const selectedFloatingGroup = this._floatingGroups.find((x) => x.group === from);\n if (!selectedFloatingGroup) {\n throw new Error('dockview: failed to find floating group');\n }\n selectedFloatingGroup.dispose();\n break;\n }\n case 'popout': {\n const selectedPopoutGroup = this._popoutGroups.find((x) => x.popoutGroup === from);\n if (!selectedPopoutGroup) {\n throw new Error('dockview: failed to find popout group');\n }\n // Remove from popout groups list to prevent automatic restoration\n const index = this._popoutGroups.indexOf(selectedPopoutGroup);\n if (index >= 0) {\n this._popoutGroups.splice(index, 1);\n }\n // Clean up the reference group (ghost) if it exists and is hidden\n if (selectedPopoutGroup.referenceGroup) {\n const referenceGroup = this.getPanel(selectedPopoutGroup.referenceGroup);\n if (referenceGroup &&\n !referenceGroup.api.isVisible) {\n this.doRemoveGroup(referenceGroup, {\n skipActive: true,\n });\n }\n }\n // Manually dispose the window without triggering restoration\n selectedPopoutGroup.window.dispose();\n // Update group's location and containers for target\n if (to.api.location.type === 'grid') {\n from.model.renderContainer =\n this.overlayRenderContainer;\n from.model.dropTargetContainer =\n this.rootDropTargetContainer;\n from.model.location = { type: 'grid' };\n }\n else if (to.api.location.type === 'floating') {\n from.model.renderContainer =\n this.overlayRenderContainer;\n from.model.dropTargetContainer =\n this.rootDropTargetContainer;\n from.model.location = { type: 'floating' };\n }\n break;\n }\n }\n }\n // For moves to grid locations\n if (to.api.location.type === 'grid') {\n const referenceLocation = getGridLocation(to.element);\n const dropLocation = getRelativeLocation(this.gridview.orientation, referenceLocation, target);\n // Add to grid for all moves targeting grid location\n let size;\n switch (this.gridview.orientation) {\n case Orientation.VERTICAL:\n size =\n referenceLocation.length % 2 == 0\n ? from.api.width\n : from.api.height;\n break;\n case Orientation.HORIZONTAL:\n size =\n referenceLocation.length % 2 == 0\n ? from.api.height\n : from.api.width;\n break;\n }\n this.gridview.addView(source, size, dropLocation);\n }\n else if (to.api.location.type === 'floating') {\n // For moves to floating locations, add as floating group\n // Get the position/size from the target floating group\n const targetFloatingGroup = this._floatingGroups.find((x) => x.group === to);\n if (targetFloatingGroup) {\n const box = targetFloatingGroup.overlay.toJSON();\n // Calculate position based on available properties\n let left, top;\n if ('left' in box) {\n left = box.left + 50;\n }\n else if ('right' in box) {\n left = Math.max(0, box.right - box.width - 50);\n }\n else {\n left = 50; // Default fallback\n }\n if ('top' in box) {\n top = box.top + 50;\n }\n else if ('bottom' in box) {\n top = Math.max(0, box.bottom - box.height - 50);\n }\n else {\n top = 50; // Default fallback\n }\n this.addFloatingGroup(source, {\n height: box.height,\n width: box.width,\n position: {\n left,\n top,\n },\n });\n }\n }\n }\n source.panels.forEach((panel) => {\n this._onDidMovePanel.fire({ panel, from });\n });\n this.debouncedUpdateAllPositions();\n // Ensure group becomes active after move\n if (options.skipSetActive === false) {\n // Only activate when explicitly requested (skipSetActive: false)\n // Use 'to' group for non-center moves since 'from' may have been destroyed\n const targetGroup = to !== null && to !== void 0 ? to : from;\n this.doSetGroupAndPanelActive(targetGroup);\n }\n else if (source !== from && options.skipSetActive !== true) {\n // Edge group moves create a fresh `source` group; activate it\n // by default so the moved panels receive focus.\n this.doSetGroupAndPanelActive(source);\n }\n }\n doSetGroupActive(group) {\n super.doSetGroupActive(group);\n const activePanel = this.activePanel;\n if (!this._moving &&\n activePanel !== this._onDidActivePanelChange.value) {\n this._onDidActivePanelChange.fire(activePanel);\n }\n }\n doSetGroupAndPanelActive(group) {\n super.doSetGroupActive(group);\n const activePanel = this.activePanel;\n if (group &&\n this.hasMaximizedGroup() &&\n !this.isMaximizedGroup(group)) {\n this.exitMaximizedGroup();\n }\n if (!this._moving &&\n activePanel !== this._onDidActivePanelChange.value) {\n this._onDidActivePanelChange.fire(activePanel);\n }\n }\n getNextGroupId() {\n let id = this.nextGroupId.next();\n while (this._groups.has(id)) {\n id = this.nextGroupId.next();\n }\n return id;\n }\n createGroup(options) {\n if (!options) {\n options = {};\n }\n let id = options === null || options === void 0 ? void 0 : options.id;\n if (id && this._groups.has(options.id)) {\n console.warn(`dockview: Duplicate group id ${options === null || options === void 0 ? void 0 : options.id}. reassigning group id to avoid errors`);\n id = undefined;\n }\n if (!id) {\n id = this.nextGroupId.next();\n while (this._groups.has(id)) {\n id = this.nextGroupId.next();\n }\n }\n const view = new DockviewGroupPanel(this, id, options);\n view.init({ params: {}, accessor: this });\n if (!this._groups.has(view.id)) {\n const disposable = new CompositeDisposable(view.model.onTabDragStart((event) => {\n this._onWillDragPanel.fire(event);\n }), view.model.onGroupDragStart((event) => {\n this._onWillDragGroup.fire(event);\n }), view.model.onMove((event) => {\n const { groupId, itemId, target, index, tabGroupId } = event;\n this.moveGroupOrPanel({\n from: {\n groupId: groupId,\n panelId: itemId,\n tabGroupId,\n },\n to: {\n group: view,\n position: target,\n index,\n },\n });\n }), view.model.onDidDrop((event) => {\n this._onDidDrop.fire(event);\n }), view.model.onWillDrop((event) => {\n this._onWillDrop.fire(event);\n }), view.model.onWillShowOverlay((event) => {\n if (this.options.disableDnd) {\n event.preventDefault();\n return;\n }\n this._onWillShowOverlay.fire(event);\n }), view.model.onUnhandledDragOverEvent((event) => {\n this._onUnhandledDragOverEvent.fire(event);\n }), view.model.onDidAddPanel((event) => {\n if (this._moving) {\n return;\n }\n this._onDidAddPanel.fire(event.panel);\n }), view.model.onDidRemovePanel((event) => {\n if (this._moving) {\n return;\n }\n this._onDidRemovePanel.fire(event.panel);\n }), view.model.onDidActivePanelChange((event) => {\n if (this._moving) {\n return;\n }\n if (event.panel !== this.activePanel) {\n return;\n }\n if (this._onDidActivePanelChange.value !== event.panel) {\n this._onDidActivePanelChange.fire(event.panel);\n }\n }), view.model.onDidCreateTabGroup((e) => {\n this._onDidCreateTabGroup.fire(e);\n }), view.model.onDidDestroyTabGroup((e) => {\n this._onDidDestroyTabGroup.fire(e);\n }), view.model.onDidAddPanelToTabGroup((e) => {\n this._onDidAddPanelToTabGroup.fire(e);\n }), view.model.onDidRemovePanelFromTabGroup((e) => {\n this._onDidRemovePanelFromTabGroup.fire(e);\n }), view.model.onDidTabGroupChange((e) => {\n this._onDidTabGroupChange.fire(e);\n }), view.model.onDidTabGroupCollapsedChange((e) => {\n this._onDidTabGroupCollapsedChange.fire(e);\n }), Event.any(view.model.onDidPanelTitleChange, view.model.onDidPanelParametersChange)(() => {\n this._bufferOnDidLayoutChange.fire();\n }));\n this._groups.set(view.id, { value: view, disposable });\n }\n // TODO: must be called after the above listeners have been setup, not an ideal pattern\n view.initialize();\n return view;\n }\n createPanel(options, group) {\n var _a, _b, _c;\n const contentComponent = options.component;\n const tabComponent = (_a = options.tabComponent) !== null && _a !== void 0 ? _a : this.options.defaultTabComponent;\n const view = new DockviewPanelModel(this, options.id, contentComponent, tabComponent);\n const panel = new DockviewPanel(options.id, contentComponent, tabComponent, this, this._api, group, view, {\n renderer: options.renderer,\n minimumWidth: options.minimumWidth,\n minimumHeight: options.minimumHeight,\n maximumWidth: options.maximumWidth,\n maximumHeight: options.maximumHeight,\n });\n panel.init({\n title: (_b = options.title) !== null && _b !== void 0 ? _b : options.id,\n params: (_c = options === null || options === void 0 ? void 0 : options.params) !== null && _c !== void 0 ? _c : {},\n });\n return panel;\n }\n createGroupAtLocation(location, size, options) {\n const group = this.createGroup(options);\n this.doAddGroup(group, location, size);\n return group;\n }\n findGroup(panel) {\n var _a;\n return (_a = Array.from(this._groups.values()).find((group) => group.value.model.containsPanel(panel))) === null || _a === void 0 ? void 0 : _a.value;\n }\n orientationAtLocation(location) {\n const rootOrientation = this.gridview.orientation;\n return location.length % 2 == 1\n ? rootOrientation\n : orthogonal(rootOrientation);\n }\n updateDropTargetModel(options) {\n if ('dndEdges' in options) {\n const disabled = typeof options.dndEdges === 'boolean' &&\n options.dndEdges === false;\n this._rootDropTarget.disabled = disabled;\n this._rootPointerDropTarget.disabled = disabled;\n if (typeof options.dndEdges === 'object' &&\n options.dndEdges !== null) {\n this._rootDropTarget.setOverlayModel(options.dndEdges);\n this._rootPointerDropTarget.setOverlayModel(options.dndEdges);\n }\n else {\n this._rootDropTarget.setOverlayModel(DEFAULT_ROOT_OVERLAY_MODEL);\n this._rootPointerDropTarget.setOverlayModel(DEFAULT_ROOT_OVERLAY_MODEL);\n }\n }\n if ('rootOverlayModel' in options) {\n this.updateDropTargetModel({ dndEdges: options.dndEdges });\n }\n }\n updateTheme() {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n const theme = (_a = this._options.theme) !== null && _a !== void 0 ? _a : themeAbyss;\n // Apply the theme class only to the shell so edge groups and the\n // main grid both inherit its CSS custom properties via the cascade.\n // Re-declaring it on `.dv-dockview` would block consumer overrides\n // set on the shell from reaching the dockview subtree.\n (_b = this._shellThemeClassnames) === null || _b === void 0 ? void 0 : _b.setClassNames(theme.className);\n this.gridview.margin = (_c = theme.gap) !== null && _c !== void 0 ? _c : 0;\n (_d = this._shellManager) === null || _d === void 0 ? void 0 : _d.updateTheme((_e = theme.gap) !== null && _e !== void 0 ? _e : 0, (_f = theme.edgeGroupCollapsedSize) !== null && _f !== void 0 ? _f : 35);\n if (theme.dndOverlayBorder !== undefined) {\n this.element.style.setProperty('--dv-drag-over-border', theme.dndOverlayBorder);\n (_g = this._shellManager) === null || _g === void 0 ? void 0 : _g.element.style.setProperty('--dv-drag-over-border', theme.dndOverlayBorder);\n }\n else {\n this.element.style.removeProperty('--dv-drag-over-border');\n (_h = this._shellManager) === null || _h === void 0 ? void 0 : _h.element.style.removeProperty('--dv-drag-over-border');\n }\n switch (theme.dndOverlayMounting) {\n case 'absolute':\n this.rootDropTargetContainer.disabled = false;\n break;\n case 'relative':\n default:\n this.rootDropTargetContainer.disabled = true;\n break;\n }\n // Toggle a CSS class so theme stylesheets can scope pure-CSS\n // tab group indicator rules to the 'none' mode only.\n const indicatorNone = ((_j = theme.tabGroupIndicator) !== null && _j !== void 0 ? _j : 'wrap') === 'none';\n toggleClass(this.element, 'dv-tab-group-indicator-none', indicatorNone);\n if (this._shellManager) {\n toggleClass(this._shellManager.element, 'dv-tab-group-indicator-none', indicatorNone);\n }\n // Re-render tab group indicators so the new tabGroupIndicator mode takes effect\n for (const group of this.groups) {\n group.model.updateTabGroups();\n }\n }\n}\n\nclass GridviewComponent extends BaseGrid {\n get orientation() {\n return this.gridview.orientation;\n }\n set orientation(value) {\n this.gridview.orientation = value;\n }\n get options() {\n return this._options;\n }\n get deserializer() {\n return this._deserializer;\n }\n set deserializer(value) {\n this._deserializer = value;\n }\n constructor(container, options) {\n var _a;\n super(container, {\n proportionalLayout: (_a = options.proportionalLayout) !== null && _a !== void 0 ? _a : true,\n orientation: options.orientation,\n styles: options.hideBorders\n ? { separatorBorder: 'transparent' }\n : undefined,\n disableAutoResizing: options.disableAutoResizing,\n className: options.className,\n });\n this._onDidLayoutfromJSON = new Emitter();\n this.onDidLayoutFromJSON = this._onDidLayoutfromJSON.event;\n this._onDidRemoveGroup = new Emitter();\n this.onDidRemoveGroup = this._onDidRemoveGroup.event;\n this._onDidAddGroup = new Emitter();\n this.onDidAddGroup = this._onDidAddGroup.event;\n this._onDidActiveGroupChange = new Emitter();\n this.onDidActiveGroupChange = this._onDidActiveGroupChange.event;\n this._options = options;\n this.addDisposables(this._onDidAddGroup, this._onDidRemoveGroup, this._onDidActiveGroupChange, this.onDidAdd((event) => {\n this._onDidAddGroup.fire(event);\n }), this.onDidRemove((event) => {\n this._onDidRemoveGroup.fire(event);\n }), this.onDidActiveChange((event) => {\n this._onDidActiveGroupChange.fire(event);\n }));\n }\n updateOptions(options) {\n super.updateOptions(options);\n const hasOrientationChanged = typeof options.orientation === 'string' &&\n this.gridview.orientation !== options.orientation;\n this._options = Object.assign(Object.assign({}, this.options), options);\n if (hasOrientationChanged) {\n this.gridview.orientation = options.orientation;\n }\n this.layout(this.gridview.width, this.gridview.height, true);\n }\n removePanel(panel) {\n this.removeGroup(panel);\n }\n /**\n * Serialize the current state of the layout\n *\n * @returns A JSON respresentation of the layout\n */\n toJSON() {\n var _a;\n const data = this.gridview.serialize();\n return {\n grid: data,\n activePanel: (_a = this.activeGroup) === null || _a === void 0 ? void 0 : _a.id,\n };\n }\n setVisible(panel, visible) {\n this.gridview.setViewVisible(getGridLocation(panel.element), visible);\n }\n setActive(panel) {\n this._groups.forEach((value, _key) => {\n value.value.setActive(panel === value.value);\n });\n }\n focus() {\n var _a;\n (_a = this.activeGroup) === null || _a === void 0 ? void 0 : _a.focus();\n }\n fromJSON(serializedGridview) {\n this.clear();\n const { grid, activePanel } = serializedGridview;\n try {\n const queue = [];\n // take note of the existing dimensions\n const width = this.width;\n const height = this.height;\n this.gridview.deserialize(grid, {\n fromJSON: (node) => {\n const { data } = node;\n const view = this.options.createComponent({\n id: data.id,\n name: data.component,\n });\n queue.push(() => view.init({\n params: data.params,\n minimumWidth: data.minimumWidth,\n maximumWidth: data.maximumWidth,\n minimumHeight: data.minimumHeight,\n maximumHeight: data.maximumHeight,\n priority: data.priority,\n snap: !!data.snap,\n accessor: this,\n isVisible: node.visible,\n }));\n this._onDidAddGroup.fire(view);\n this.registerPanel(view);\n return view;\n },\n });\n this.layout(width, height, true);\n queue.forEach((f) => f());\n if (typeof activePanel === 'string') {\n const panel = this.getPanel(activePanel);\n if (panel) {\n this.doSetGroupActive(panel);\n }\n }\n }\n catch (err) {\n /**\n * To remove a group we cannot call this.removeGroup(...) since this makes assumptions about\n * the underlying HTMLElement existing in the Gridview.\n */\n for (const group of this.groups) {\n group.dispose();\n this._groups.delete(group.id);\n this._onDidRemoveGroup.fire(group);\n }\n // fires clean-up events and clears the underlying HTML gridview.\n this.clear();\n /**\n * even though we have cleaned-up we still want to inform the caller of their error\n * and we'll do this through re-throwing the original error since afterall you would\n * expect trying to load a corrupted layout to result in an error and not silently fail...\n */\n throw err;\n }\n this._onDidLayoutfromJSON.fire();\n }\n clear() {\n const hasActiveGroup = this.activeGroup;\n const groups = Array.from(this._groups.values()); // reassign since group panels will mutate\n for (const group of groups) {\n group.disposable.dispose();\n this.doRemoveGroup(group.value, { skipActive: true });\n }\n if (hasActiveGroup) {\n this.doSetGroupActive(undefined);\n }\n this.gridview.clear();\n }\n movePanel(panel, options) {\n var _a;\n let relativeLocation;\n const removedPanel = this.gridview.remove(panel);\n const referenceGroup = (_a = this._groups.get(options.reference)) === null || _a === void 0 ? void 0 : _a.value;\n if (!referenceGroup) {\n throw new Error(`reference group ${options.reference} does not exist`);\n }\n const target = toTarget(options.direction);\n if (target === 'center') {\n throw new Error(`${target} not supported as an option`);\n }\n else {\n const location = getGridLocation(referenceGroup.element);\n relativeLocation = getRelativeLocation(this.gridview.orientation, location, target);\n }\n this.doAddGroup(removedPanel, relativeLocation, options.size);\n }\n addPanel(options) {\n var _a, _b, _c, _d;\n let relativeLocation = (_a = options.location) !== null && _a !== void 0 ? _a : [0];\n if ((_b = options.position) === null || _b === void 0 ? void 0 : _b.referencePanel) {\n const referenceGroup = (_c = this._groups.get(options.position.referencePanel)) === null || _c === void 0 ? void 0 : _c.value;\n if (!referenceGroup) {\n throw new Error(`reference group ${options.position.referencePanel} does not exist`);\n }\n const target = toTarget(options.position.direction);\n if (target === 'center') {\n throw new Error(`${target} not supported as an option`);\n }\n else {\n const location = getGridLocation(referenceGroup.element);\n relativeLocation = getRelativeLocation(this.gridview.orientation, location, target);\n }\n }\n const view = this.options.createComponent({\n id: options.id,\n name: options.component,\n });\n view.init({\n params: (_d = options.params) !== null && _d !== void 0 ? _d : {},\n minimumWidth: options.minimumWidth,\n maximumWidth: options.maximumWidth,\n minimumHeight: options.minimumHeight,\n maximumHeight: options.maximumHeight,\n priority: options.priority,\n snap: !!options.snap,\n accessor: this,\n isVisible: true,\n });\n this.doAddGroup(view, relativeLocation, options.size);\n this.registerPanel(view);\n this.doSetGroupActive(view);\n return view;\n }\n registerPanel(panel) {\n const disposable = new CompositeDisposable(panel.api.onDidFocusChange((event) => {\n if (!event.isFocused) {\n return;\n }\n this._groups.forEach((groupItem) => {\n const group = groupItem.value;\n if (group !== panel) {\n group.setActive(false);\n }\n else {\n group.setActive(true);\n }\n });\n }));\n this._groups.set(panel.id, {\n value: panel,\n disposable,\n });\n }\n moveGroup(referenceGroup, groupId, target) {\n const sourceGroup = this.getPanel(groupId);\n if (!sourceGroup) {\n throw new Error('invalid operation');\n }\n const referenceLocation = getGridLocation(referenceGroup.element);\n const targetLocation = getRelativeLocation(this.gridview.orientation, referenceLocation, target);\n const [targetParentLocation, to] = tail(targetLocation);\n const sourceLocation = getGridLocation(sourceGroup.element);\n const [sourceParentLocation, from] = tail(sourceLocation);\n if (sequenceEquals(sourceParentLocation, targetParentLocation)) {\n // special case when 'swapping' two views within same grid location\n // if a group has one tab - we are essentially moving the 'group'\n // which is equivalent to swapping two views in this case\n this.gridview.moveView(sourceParentLocation, from, to);\n return;\n }\n // source group will become empty so delete the group\n const targetGroup = this.doRemoveGroup(sourceGroup, {\n skipActive: true,\n skipDispose: true,\n });\n // after deleting the group we need to re-evaulate the ref location\n const updatedReferenceLocation = getGridLocation(referenceGroup.element);\n const location = getRelativeLocation(this.gridview.orientation, updatedReferenceLocation, target);\n this.doAddGroup(targetGroup, location);\n }\n removeGroup(group) {\n super.removeGroup(group);\n }\n dispose() {\n super.dispose();\n this._onDidLayoutfromJSON.dispose();\n }\n}\n\n/**\n * A high-level implementation of splitview that works using 'panels'\n */\nclass SplitviewComponent extends Resizable {\n get panels() {\n return this.splitview.getViews();\n }\n get options() {\n return this._options;\n }\n get length() {\n return this._panels.size;\n }\n get orientation() {\n return this.splitview.orientation;\n }\n get splitview() {\n return this._splitview;\n }\n set splitview(value) {\n if (this._splitview) {\n this._splitview.dispose();\n }\n this._splitview = value;\n this._splitviewChangeDisposable.value = new CompositeDisposable(this._splitview.onDidSashEnd(() => {\n this._onDidLayoutChange.fire(undefined);\n }), this._splitview.onDidAddView((e) => this._onDidAddView.fire(e)), this._splitview.onDidRemoveView((e) => this._onDidRemoveView.fire(e)));\n }\n get minimumSize() {\n return this.splitview.minimumSize;\n }\n get maximumSize() {\n return this.splitview.maximumSize;\n }\n get height() {\n return this.splitview.orientation === Orientation.HORIZONTAL\n ? this.splitview.orthogonalSize\n : this.splitview.size;\n }\n get width() {\n return this.splitview.orientation === Orientation.HORIZONTAL\n ? this.splitview.size\n : this.splitview.orthogonalSize;\n }\n constructor(container, options) {\n var _a;\n super(document.createElement('div'), options.disableAutoResizing);\n this._splitviewChangeDisposable = new MutableDisposable();\n this._panels = new Map();\n this._onDidLayoutfromJSON = new Emitter();\n this.onDidLayoutFromJSON = this._onDidLayoutfromJSON.event;\n this._onDidAddView = new Emitter();\n this.onDidAddView = this._onDidAddView.event;\n this._onDidRemoveView = new Emitter();\n this.onDidRemoveView = this._onDidRemoveView.event;\n this._onDidLayoutChange = new Emitter();\n this.onDidLayoutChange = this._onDidLayoutChange.event;\n this.element.style.height = '100%';\n this.element.style.width = '100%';\n this._classNames = new Classnames(this.element);\n this._classNames.setClassNames((_a = options.className) !== null && _a !== void 0 ? _a : '');\n // the container is owned by the third-party, do not modify/delete it\n container.appendChild(this.element);\n this._options = options;\n this.splitview = new Splitview(this.element, options);\n this.addDisposables(this._onDidAddView, this._onDidLayoutfromJSON, this._onDidRemoveView, this._onDidLayoutChange);\n }\n updateOptions(options) {\n var _a, _b;\n if ('className' in options) {\n this._classNames.setClassNames((_a = options.className) !== null && _a !== void 0 ? _a : '');\n }\n if ('disableResizing' in options) {\n this.disableResizing = (_b = options.disableAutoResizing) !== null && _b !== void 0 ? _b : false;\n }\n if (typeof options.orientation === 'string') {\n this.splitview.orientation = options.orientation;\n }\n this._options = Object.assign(Object.assign({}, this.options), options);\n this.splitview.layout(this.splitview.size, this.splitview.orthogonalSize);\n }\n focus() {\n var _a;\n (_a = this._activePanel) === null || _a === void 0 ? void 0 : _a.focus();\n }\n movePanel(from, to) {\n this.splitview.moveView(from, to);\n }\n setVisible(panel, visible) {\n const index = this.panels.indexOf(panel);\n this.splitview.setViewVisible(index, visible);\n }\n setActive(panel, skipFocus) {\n this._activePanel = panel;\n this.panels\n .filter((v) => v !== panel)\n .forEach((v) => {\n v.api._onDidActiveChange.fire({ isActive: false });\n if (!skipFocus) {\n v.focus();\n }\n });\n panel.api._onDidActiveChange.fire({ isActive: true });\n if (!skipFocus) {\n panel.focus();\n }\n }\n removePanel(panel, sizing) {\n const item = this._panels.get(panel.id);\n if (!item) {\n throw new Error(`unknown splitview panel ${panel.id}`);\n }\n item.dispose();\n this._panels.delete(panel.id);\n const index = this.panels.findIndex((_) => _ === panel);\n const removedView = this.splitview.removeView(index, sizing);\n removedView.dispose();\n const panels = this.panels;\n if (panels.length > 0) {\n this.setActive(panels[panels.length - 1]);\n }\n }\n getPanel(id) {\n return this.panels.find((view) => view.id === id);\n }\n addPanel(options) {\n var _a;\n if (this._panels.has(options.id)) {\n throw new Error(`panel ${options.id} already exists`);\n }\n const view = this.options.createComponent({\n id: options.id,\n name: options.component,\n });\n view.orientation = this.splitview.orientation;\n view.init({\n params: (_a = options.params) !== null && _a !== void 0 ? _a : {},\n minimumSize: options.minimumSize,\n maximumSize: options.maximumSize,\n snap: options.snap,\n priority: options.priority,\n accessor: this,\n });\n const size = typeof options.size === 'number' ? options.size : Sizing.Distribute;\n const index = typeof options.index === 'number' ? options.index : undefined;\n this.splitview.addView(view, size, index);\n this.doAddView(view);\n this.setActive(view);\n return view;\n }\n layout(width, height) {\n const [size, orthogonalSize] = this.splitview.orientation === Orientation.HORIZONTAL\n ? [width, height]\n : [height, width];\n this.splitview.layout(size, orthogonalSize);\n }\n doAddView(view) {\n const disposable = view.api.onDidFocusChange((event) => {\n if (!event.isFocused) {\n return;\n }\n this.setActive(view, true);\n });\n this._panels.set(view.id, disposable);\n }\n toJSON() {\n var _a;\n const views = this.splitview\n .getViews()\n .map((view, i) => {\n const size = this.splitview.getViewSize(i);\n return {\n size,\n data: view.toJSON(),\n snap: !!view.snap,\n priority: view.priority,\n };\n });\n return {\n views,\n activeView: (_a = this._activePanel) === null || _a === void 0 ? void 0 : _a.id,\n size: this.splitview.size,\n orientation: this.splitview.orientation,\n };\n }\n fromJSON(serializedSplitview) {\n this.clear();\n const { views, orientation, size, activeView } = serializedSplitview;\n const queue = [];\n // take note of the existing dimensions\n const width = this.width;\n const height = this.height;\n this.splitview = new Splitview(this.element, {\n orientation,\n proportionalLayout: this.options.proportionalLayout,\n descriptor: {\n size,\n views: views.map((view) => {\n const data = view.data;\n if (this._panels.has(data.id)) {\n throw new Error(`panel ${data.id} already exists`);\n }\n const panel = this.options.createComponent({\n id: data.id,\n name: data.component,\n });\n queue.push(() => {\n var _a;\n panel.init({\n params: (_a = data.params) !== null && _a !== void 0 ? _a : {},\n minimumSize: data.minimumSize,\n maximumSize: data.maximumSize,\n snap: view.snap,\n priority: view.priority,\n accessor: this,\n });\n });\n panel.orientation = orientation;\n this.doAddView(panel);\n setTimeout(() => {\n // the original onDidAddView events are missed since they are fired before we can subcribe to them\n this._onDidAddView.fire(panel);\n }, 0);\n return { size: view.size, view: panel };\n }),\n },\n });\n this.layout(width, height);\n queue.forEach((f) => f());\n if (typeof activeView === 'string') {\n const panel = this.getPanel(activeView);\n if (panel) {\n this.setActive(panel);\n }\n }\n this._onDidLayoutfromJSON.fire();\n }\n clear() {\n for (const disposable of this._panels.values()) {\n disposable.dispose();\n }\n this._panels.clear();\n while (this.splitview.length > 0) {\n const view = this.splitview.removeView(0, Sizing.Distribute, true);\n view.dispose();\n }\n }\n dispose() {\n for (const disposable of this._panels.values()) {\n disposable.dispose();\n }\n this._panels.clear();\n const views = this.splitview.getViews();\n this._splitviewChangeDisposable.dispose();\n this.splitview.dispose();\n for (const view of views) {\n view.dispose();\n }\n this.element.remove();\n super.dispose();\n }\n}\n\nclass DefaultHeader extends CompositeDisposable {\n get element() {\n return this._element;\n }\n constructor() {\n super();\n this._expandedIcon = createExpandMoreButton();\n this._collapsedIcon = createChevronRightButton();\n this.disposable = new MutableDisposable();\n this.apiRef = {\n api: null,\n };\n this._element = document.createElement('div');\n this.element.className = 'dv-default-header';\n this._content = document.createElement('span');\n this._expander = document.createElement('div');\n this._expander.className = 'dv-pane-header-icon';\n this.element.appendChild(this._expander);\n this.element.appendChild(this._content);\n this.addDisposables(addDisposableListener(this._element, 'click', () => {\n var _a;\n (_a = this.apiRef.api) === null || _a === void 0 ? void 0 : _a.setExpanded(!this.apiRef.api.isExpanded);\n }));\n }\n init(params) {\n this.apiRef.api = params.api;\n this._content.textContent = params.title;\n this.updateIcon();\n this.disposable.value = params.api.onDidExpansionChange(() => {\n this.updateIcon();\n });\n }\n updateIcon() {\n var _a;\n const isExpanded = !!((_a = this.apiRef.api) === null || _a === void 0 ? void 0 : _a.isExpanded);\n toggleClass(this._expander, 'collapsed', !isExpanded);\n if (isExpanded) {\n if (this._expander.contains(this._collapsedIcon)) {\n this._collapsedIcon.remove();\n }\n if (!this._expander.contains(this._expandedIcon)) {\n this._expander.appendChild(this._expandedIcon);\n }\n }\n else {\n if (this._expander.contains(this._expandedIcon)) {\n this._expandedIcon.remove();\n }\n if (!this._expander.contains(this._collapsedIcon)) {\n this._expander.appendChild(this._collapsedIcon);\n }\n }\n }\n update(_params) {\n //\n }\n dispose() {\n this.disposable.dispose();\n super.dispose();\n }\n}\n\nconst nextLayoutId = sequentialNumberGenerator();\nconst HEADER_SIZE = 22;\nconst MINIMUM_BODY_SIZE = 0;\nconst MAXIMUM_BODY_SIZE = Number.MAX_SAFE_INTEGER;\nclass PaneFramework extends DraggablePaneviewPanel {\n constructor(options) {\n super({\n accessor: options.accessor,\n id: options.id,\n component: options.component,\n headerComponent: options.headerComponent,\n orientation: options.orientation,\n isExpanded: options.isExpanded,\n disableDnd: options.disableDnd,\n headerSize: options.headerSize,\n minimumBodySize: options.minimumBodySize,\n maximumBodySize: options.maximumBodySize,\n });\n this.options = options;\n }\n getBodyComponent() {\n return this.options.body;\n }\n getHeaderComponent() {\n return this.options.header;\n }\n}\nclass PaneviewComponent extends Resizable {\n get id() {\n return this._id;\n }\n get panels() {\n return this.paneview.getPanes();\n }\n set paneview(value) {\n this._paneview = value;\n this._disposable.value = new CompositeDisposable(this._paneview.onDidChange(() => {\n this._onDidLayoutChange.fire(undefined);\n }), this._paneview.onDidAddView((e) => this._onDidAddView.fire(e)), this._paneview.onDidRemoveView((e) => this._onDidRemoveView.fire(e)));\n }\n get paneview() {\n return this._paneview;\n }\n get minimumSize() {\n return this.paneview.minimumSize;\n }\n get maximumSize() {\n return this.paneview.maximumSize;\n }\n get height() {\n return this.paneview.orientation === Orientation.HORIZONTAL\n ? this.paneview.orthogonalSize\n : this.paneview.size;\n }\n get width() {\n return this.paneview.orientation === Orientation.HORIZONTAL\n ? this.paneview.size\n : this.paneview.orthogonalSize;\n }\n get options() {\n return this._options;\n }\n constructor(container, options) {\n var _a;\n super(document.createElement('div'), options.disableAutoResizing);\n this._id = nextLayoutId.next();\n this._disposable = new MutableDisposable();\n this._viewDisposables = new Map();\n this._onDidLayoutfromJSON = new Emitter();\n this.onDidLayoutFromJSON = this._onDidLayoutfromJSON.event;\n this._onDidLayoutChange = new Emitter();\n this.onDidLayoutChange = this._onDidLayoutChange.event;\n this._onDidDrop = new Emitter();\n this.onDidDrop = this._onDidDrop.event;\n this._onDidAddView = new Emitter();\n this.onDidAddView = this._onDidAddView.event;\n this._onDidRemoveView = new Emitter();\n this.onDidRemoveView = this._onDidRemoveView.event;\n this._onUnhandledDragOverEvent = new Emitter();\n this.onUnhandledDragOverEvent = this._onUnhandledDragOverEvent.event;\n this.element.style.height = '100%';\n this.element.style.width = '100%';\n this.addDisposables(this._onDidLayoutChange, this._onDidLayoutfromJSON, this._onDidDrop, this._onDidAddView, this._onDidRemoveView, this._onUnhandledDragOverEvent);\n this._classNames = new Classnames(this.element);\n this._classNames.setClassNames((_a = options.className) !== null && _a !== void 0 ? _a : '');\n // the container is owned by the third-party, do not modify/delete it\n container.appendChild(this.element);\n this._options = options;\n this.paneview = new Paneview(this.element, {\n // only allow paneview in the vertical orientation for now\n orientation: Orientation.VERTICAL,\n });\n this.addDisposables(this._disposable);\n }\n setVisible(panel, visible) {\n const index = this.panels.indexOf(panel);\n this.paneview.setViewVisible(index, visible);\n }\n focus() {\n //noop\n }\n updateOptions(options) {\n var _a, _b;\n if ('className' in options) {\n this._classNames.setClassNames((_a = options.className) !== null && _a !== void 0 ? _a : '');\n }\n if ('disableResizing' in options) {\n this.disableResizing = (_b = options.disableAutoResizing) !== null && _b !== void 0 ? _b : false;\n }\n this._options = Object.assign(Object.assign({}, this.options), options);\n }\n addPanel(options) {\n var _a, _b;\n const body = this.options.createComponent({\n id: options.id,\n name: options.component,\n });\n let header;\n if (options.headerComponent && this.options.createHeaderComponent) {\n header = this.options.createHeaderComponent({\n id: options.id,\n name: options.headerComponent,\n });\n }\n if (!header) {\n header = new DefaultHeader();\n }\n const view = new PaneFramework({\n id: options.id,\n component: options.component,\n headerComponent: options.headerComponent,\n header,\n body,\n orientation: Orientation.VERTICAL,\n isExpanded: !!options.isExpanded,\n disableDnd: !!this.options.disableDnd,\n accessor: this,\n headerSize: (_a = options.headerSize) !== null && _a !== void 0 ? _a : HEADER_SIZE,\n minimumBodySize: MINIMUM_BODY_SIZE,\n maximumBodySize: MAXIMUM_BODY_SIZE,\n });\n this.doAddPanel(view);\n const size = typeof options.size === 'number' ? options.size : Sizing.Distribute;\n const index = typeof options.index === 'number' ? options.index : undefined;\n view.init({\n params: (_b = options.params) !== null && _b !== void 0 ? _b : {},\n minimumBodySize: options.minimumBodySize,\n maximumBodySize: options.maximumBodySize,\n isExpanded: options.isExpanded,\n title: options.title,\n containerApi: new PaneviewApi(this),\n accessor: this,\n });\n this.paneview.addPane(view, size, index);\n view.orientation = this.paneview.orientation;\n return view;\n }\n removePanel(panel) {\n const views = this.panels;\n const index = views.findIndex((_) => _ === panel);\n this.paneview.removePane(index);\n this.doRemovePanel(panel);\n }\n movePanel(from, to) {\n this.paneview.moveView(from, to);\n }\n getPanel(id) {\n return this.panels.find((view) => view.id === id);\n }\n layout(width, height) {\n const [size, orthogonalSize] = this.paneview.orientation === Orientation.HORIZONTAL\n ? [width, height]\n : [height, width];\n this.paneview.layout(size, orthogonalSize);\n }\n toJSON() {\n const maximum = (value) => value === Number.MAX_SAFE_INTEGER ||\n value === Number.POSITIVE_INFINITY\n ? undefined\n : value;\n const minimum = (value) => (value <= 0 ? undefined : value);\n const views = this.paneview\n .getPanes()\n .map((view, i) => {\n const size = this.paneview.getViewSize(i);\n return {\n size,\n data: view.toJSON(),\n minimumSize: minimum(view.minimumBodySize),\n maximumSize: maximum(view.maximumBodySize),\n headerSize: view.headerSize,\n expanded: view.isExpanded(),\n };\n });\n return {\n views,\n size: this.paneview.size,\n };\n }\n fromJSON(serializedPaneview) {\n this.clear();\n const { views, size } = serializedPaneview;\n const queue = [];\n // take note of the existing dimensions\n const width = this.width;\n const height = this.height;\n this.paneview = new Paneview(this.element, {\n orientation: Orientation.VERTICAL,\n descriptor: {\n size,\n views: views.map((view) => {\n var _a, _b, _c;\n const data = view.data;\n const body = this.options.createComponent({\n id: data.id,\n name: data.component,\n });\n let header;\n if (data.headerComponent &&\n this.options.createHeaderComponent) {\n header = this.options.createHeaderComponent({\n id: data.id,\n name: data.headerComponent,\n });\n }\n if (!header) {\n header = new DefaultHeader();\n }\n const panel = new PaneFramework({\n id: data.id,\n component: data.component,\n headerComponent: data.headerComponent,\n header,\n body,\n orientation: Orientation.VERTICAL,\n isExpanded: !!view.expanded,\n disableDnd: !!this.options.disableDnd,\n accessor: this,\n headerSize: (_a = view.headerSize) !== null && _a !== void 0 ? _a : HEADER_SIZE,\n minimumBodySize: (_b = view.minimumSize) !== null && _b !== void 0 ? _b : MINIMUM_BODY_SIZE,\n maximumBodySize: (_c = view.maximumSize) !== null && _c !== void 0 ? _c : MAXIMUM_BODY_SIZE,\n });\n this.doAddPanel(panel);\n queue.push(() => {\n var _a;\n panel.init({\n params: (_a = data.params) !== null && _a !== void 0 ? _a : {},\n minimumBodySize: view.minimumSize,\n maximumBodySize: view.maximumSize,\n title: data.title,\n isExpanded: !!view.expanded,\n containerApi: new PaneviewApi(this),\n accessor: this,\n });\n panel.orientation = this.paneview.orientation;\n });\n setTimeout(() => {\n // the original onDidAddView events are missed since they are fired before we can subcribe to them\n this._onDidAddView.fire(panel);\n }, 0);\n return { size: view.size, view: panel };\n }),\n },\n });\n this.layout(width, height);\n queue.forEach((f) => f());\n this._onDidLayoutfromJSON.fire();\n }\n clear() {\n for (const [_, value] of this._viewDisposables.entries()) {\n value.dispose();\n }\n this._viewDisposables.clear();\n this.paneview.dispose();\n }\n doAddPanel(panel) {\n const disposable = new CompositeDisposable(panel.onDidDrop((event) => {\n this._onDidDrop.fire(event);\n }), panel.onUnhandledDragOverEvent((event) => {\n this._onUnhandledDragOverEvent.fire(event);\n }));\n this._viewDisposables.set(panel.id, disposable);\n }\n doRemovePanel(panel) {\n const disposable = this._viewDisposables.get(panel.id);\n if (disposable) {\n disposable.dispose();\n this._viewDisposables.delete(panel.id);\n }\n }\n dispose() {\n super.dispose();\n for (const [_, value] of this._viewDisposables.entries()) {\n value.dispose();\n }\n this._viewDisposables.clear();\n this.element.remove();\n this.paneview.dispose();\n }\n}\n\nclass SplitviewPanel extends BasePanelView {\n get priority() {\n return this._priority;\n }\n set orientation(value) {\n this._orientation = value;\n }\n get orientation() {\n return this._orientation;\n }\n get minimumSize() {\n const size = typeof this._minimumSize === 'function'\n ? this._minimumSize()\n : this._minimumSize;\n if (size !== this._evaluatedMinimumSize) {\n this._evaluatedMinimumSize = size;\n this.updateConstraints();\n }\n return size;\n }\n get maximumSize() {\n const size = typeof this._maximumSize === 'function'\n ? this._maximumSize()\n : this._maximumSize;\n if (size !== this._evaluatedMaximumSize) {\n this._evaluatedMaximumSize = size;\n this.updateConstraints();\n }\n return size;\n }\n get snap() {\n return this._snap;\n }\n constructor(id, componentName) {\n super(id, componentName, new SplitviewPanelApiImpl(id, componentName));\n this._evaluatedMinimumSize = 0;\n this._evaluatedMaximumSize = Number.POSITIVE_INFINITY;\n this._minimumSize = 0;\n this._maximumSize = Number.POSITIVE_INFINITY;\n this._snap = false;\n this._onDidChange = new Emitter();\n this.onDidChange = this._onDidChange.event;\n this.api.initialize(this);\n this.addDisposables(this._onDidChange, this.api.onWillVisibilityChange((event) => {\n const { isVisible } = event;\n const { accessor } = this._params;\n accessor.setVisible(this, isVisible);\n }), this.api.onActiveChange(() => {\n const { accessor } = this._params;\n accessor.setActive(this);\n }), this.api.onDidConstraintsChangeInternal((event) => {\n if (typeof event.minimumSize === 'number' ||\n typeof event.minimumSize === 'function') {\n this._minimumSize = event.minimumSize;\n }\n if (typeof event.maximumSize === 'number' ||\n typeof event.maximumSize === 'function') {\n this._maximumSize = event.maximumSize;\n }\n this.updateConstraints();\n }), this.api.onDidSizeChange((event) => {\n this._onDidChange.fire({ size: event.size });\n }));\n }\n setVisible(isVisible) {\n this.api._onDidVisibilityChange.fire({ isVisible });\n }\n setActive(isActive) {\n this.api._onDidActiveChange.fire({ isActive });\n }\n layout(size, orthogonalSize) {\n const [width, height] = this.orientation === Orientation.HORIZONTAL\n ? [size, orthogonalSize]\n : [orthogonalSize, size];\n super.layout(width, height);\n }\n init(parameters) {\n super.init(parameters);\n this._priority = parameters.priority;\n if (parameters.minimumSize) {\n this._minimumSize = parameters.minimumSize;\n }\n if (parameters.maximumSize) {\n this._maximumSize = parameters.maximumSize;\n }\n if (parameters.snap) {\n this._snap = parameters.snap;\n }\n }\n toJSON() {\n const maximum = (value) => value === Number.MAX_SAFE_INTEGER ||\n value === Number.POSITIVE_INFINITY\n ? undefined\n : value;\n const minimum = (value) => (value <= 0 ? undefined : value);\n return Object.assign(Object.assign({}, super.toJSON()), { minimumSize: minimum(this.minimumSize), maximumSize: maximum(this.maximumSize) });\n }\n updateConstraints() {\n this.api._onDidConstraintsChange.fire({\n maximumSize: this._evaluatedMaximumSize,\n minimumSize: this._evaluatedMinimumSize,\n });\n }\n}\n\nfunction createDockview(element, options) {\n const component = new DockviewComponent(element, options);\n return component.api;\n}\nfunction createSplitview(element, options) {\n const component = new SplitviewComponent(element, options);\n return new SplitviewApi(component);\n}\nfunction createGridview(element, options) {\n const component = new GridviewComponent(element, options);\n return new GridviewApi(component);\n}\nfunction createPaneview(element, options) {\n const component = new PaneviewComponent(element, options);\n return new PaneviewApi(component);\n}\n\nexport { BaseGrid, ContentContainer, DEFAULT_TAB_GROUP_COLORS, DefaultDockviewDeserialzier, DefaultTab, DockviewApi, DockviewComponent, CompositeDisposable as DockviewCompositeDisposable, DockviewDidDropEvent, Disposable as DockviewDisposable, Emitter as DockviewEmitter, Event as DockviewEvent, DockviewGroupPanel, DockviewGroupPanelModel, MutableDisposable as DockviewMutableDisposable, DockviewPanel, DockviewUnhandledDragOverEvent, DockviewWillDropEvent, DockviewWillShowOverlayLocationEvent, DraggablePaneviewPanel, Gridview, GridviewApi, GridviewComponent, GridviewPanel, LayoutPriority, Orientation, PROPERTY_KEYS_DOCKVIEW, PROPERTY_KEYS_GRIDVIEW, PROPERTY_KEYS_PANEVIEW, PROPERTY_KEYS_SPLITVIEW, PaneFramework, PaneTransfer, PanelTransfer, Paneview, PaneviewApi, PaneviewComponent, PaneviewPanel, PaneviewUnhandledDragOverEvent, SashState, Sizing, Splitview, SplitviewApi, SplitviewComponent, SplitviewPanel, Tab, TabGroupColorPalette, applyTabGroupAccent, createDockview, createGridview, createPaneview, createSplitview, directionToPosition, getDirectionOrientation, getGridLocation, getLocationOrientation, getPaneData, getPanelData, getRelativeLocation, indexInParent, isGridBranchNode, isGroupOptionsWithGroup, isGroupOptionsWithPanel, isPanelOptionsWithGroup, isPanelOptionsWithPanel, orthogonal, positionToDirection, resolveTabGroupAccent, themeAbyss, themeAbyssSpaced, themeCatppuccinMocha, themeCatppuccinMochaSpaced, themeDark, themeDracula, themeGithubDark, themeGithubDarkSpaced, themeGithubLight, themeGithubLightSpaced, themeLight, themeLightSpaced, themeMonokai, themeNord, themeNordSpaced, themeSolarizedLight, themeSolarizedLightSpaced, themeVisualStudio, toTarget };\n","/**\n * dockview\n * @version 6.6.1\n * @link https://github.com/mathuo/dockview\n * @license MIT\n */\nimport { DockviewDisposable, DockviewEmitter, DockviewMutableDisposable, DockviewCompositeDisposable, PROPERTY_KEYS_DOCKVIEW, createDockview, SplitviewPanel, SplitviewApi, PROPERTY_KEYS_SPLITVIEW, createSplitview, GridviewPanel, GridviewApi, PROPERTY_KEYS_GRIDVIEW, createGridview, PROPERTY_KEYS_PANEVIEW, createPaneview } from 'dockview-core';\nexport * from 'dockview-core';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\n/**\n * This component is intended to interface between vanilla-js and React hence we need to be\n * creative in how we update props.\n * A ref of the component is exposed with an update method; which when called stores the props\n * as a ref within this component and forcefully triggers a re-render of the component using\n * the ref of props we just set on the renderered component as the props passed to the inner\n * component\n */\nconst ReactComponentBridge = (props, ref) => {\n const [, triggerRender] = React.useState(0);\n const _props = React.useRef(props.componentProps);\n React.useImperativeHandle(ref, () => ({\n update: (componentProps) => {\n _props.current = Object.assign(Object.assign({}, _props.current), componentProps);\n /**\n * setting a arbitrary piece of state within this component will\n * trigger a re-render.\n * we use this rather than updating through a prop since we can\n * pass a ref into the vanilla-js world.\n *\n * Use a monotonic counter rather than `Date.now()` so two\n * updates within the same millisecond still produce distinct\n * state values and avoid React's bailout.\n */\n triggerRender((n) => n + 1);\n },\n }), []);\n return React.createElement(props.component, _props.current);\n};\nReactComponentBridge.displayName = 'DockviewReactJsBridge';\n/**\n * Since we are storing the React.Portal references in a rendered array they\n * require a key property like any other React element rendered in an array\n * to prevent excessive re-rendering\n */\nconst uniquePortalKeyGenerator = (() => {\n let value = 1;\n return { next: () => `dockview_react_portal_key_${(value++).toString()}` };\n})();\nconst ReactPartContext = React.createContext({});\nclass ReactPart {\n constructor(parent, portalStore, component, parameters, context) {\n this.parent = parent;\n this.portalStore = portalStore;\n this.component = component;\n this.parameters = parameters;\n this.context = context;\n this._initialProps = {};\n this.disposed = false;\n this.createPortal();\n }\n update(props) {\n if (this.disposed) {\n throw new Error('invalid operation: resource is already disposed');\n }\n if (!this.componentInstance) {\n // if the component is yet to be mounted store the props\n this._initialProps = Object.assign(Object.assign({}, this._initialProps), props);\n }\n else {\n this.componentInstance.update(props);\n }\n }\n createPortal() {\n if (this.disposed) {\n throw new Error('invalid operation: resource is already disposed');\n }\n if (!isReactComponent(this.component)) {\n /**\n * we know this isn't a React.FunctionComponent so throw an error here.\n * if we do not intercept then React library will throw a very obsure error\n * for the same reason... at least at this point we will emit a sensible stacktrace.\n */\n throw new Error('Dockview: Only React.memo(...), React.ForwardRef(...) and functional components are accepted as components');\n }\n const bridgeComponent = React.createElement(React.forwardRef(ReactComponentBridge), {\n component: this\n .component,\n componentProps: this.parameters,\n ref: (element) => {\n this.componentInstance = element;\n if (Object.keys(this._initialProps).length > 0) {\n this.componentInstance.update(this._initialProps);\n this._initialProps = {}; // don't keep a reference to the users object once no longer required\n }\n },\n });\n const node = this.context\n ? React.createElement(ReactPartContext.Provider, { value: this.context }, bridgeComponent)\n : bridgeComponent;\n const portal = ReactDOM.createPortal(node, this.parent, uniquePortalKeyGenerator.next());\n this.ref = {\n portal,\n disposable: this.portalStore.addPortal(portal),\n };\n }\n dispose() {\n var _a;\n (_a = this.ref) === null || _a === void 0 ? void 0 : _a.disposable.dispose();\n this.disposed = true;\n }\n}\n/**\n * A React Hook that returns an array of portals to be rendered by the user of this hook\n * and a disposable function to add a portal. Calling dispose removes this portal from the\n * portal array\n */\nconst usePortalsLifecycle = () => {\n const [portals, setPortals] = React.useState([]);\n React.useDebugValue(`Portal count: ${portals.length}`);\n const addPortal = React.useCallback((portal) => {\n setPortals((existingPortals) => [...existingPortals, portal]);\n let disposed = false;\n return DockviewDisposable.from(() => {\n if (disposed) {\n throw new Error('invalid operation: resource already disposed');\n }\n disposed = true;\n setPortals((existingPortals) => existingPortals.filter((p) => p !== portal));\n });\n }, []);\n return [portals, addPortal];\n};\nfunction isReactComponent(component) {\n /**\n * Yes, we could use \"react-is\" but that would introduce an unwanted peer dependency\n * so for now we will check in a rather crude fashion...\n */\n return (typeof component === 'function' /** Functional Componnts */ ||\n !!(component === null || component === void 0 ? void 0 : component.$$typeof) /** React.memo(...) Components */);\n}\n\nclass ReactPanelContentPart {\n get element() {\n return this._element;\n }\n constructor(id, component, reactPortalStore) {\n this.id = id;\n this.component = component;\n this.reactPortalStore = reactPortalStore;\n this._onDidFocus = new DockviewEmitter();\n this.onDidFocus = this._onDidFocus.event;\n this._onDidBlur = new DockviewEmitter();\n this.onDidBlur = this._onDidBlur.event;\n this._element = document.createElement('div');\n this._element.className = 'dv-react-part';\n this._element.style.height = '100%';\n this._element.style.width = '100%';\n }\n focus() {\n // TODO\n }\n init(parameters) {\n this.part = new ReactPart(this.element, this.reactPortalStore, this.component, {\n params: parameters.params,\n api: parameters.api,\n containerApi: parameters.containerApi,\n });\n }\n update(event) {\n var _a;\n (_a = this.part) === null || _a === void 0 ? void 0 : _a.update({ params: event.params });\n }\n layout(_width, _height) {\n // noop\n }\n dispose() {\n var _a;\n this._onDidFocus.dispose();\n this._onDidBlur.dispose();\n (_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();\n }\n}\n\nclass ReactPanelHeaderPart {\n get element() {\n return this._element;\n }\n constructor(id, component, reactPortalStore) {\n this.id = id;\n this.component = component;\n this.reactPortalStore = reactPortalStore;\n this._element = document.createElement('div');\n this._element.className = 'dv-react-part';\n this._element.style.height = '100%';\n this._element.style.width = '100%';\n }\n focus() {\n //noop\n }\n init(parameters) {\n this.part = new ReactPart(this.element, this.reactPortalStore, this.component, {\n params: parameters.params,\n api: parameters.api,\n containerApi: parameters.containerApi,\n tabLocation: parameters.tabLocation,\n });\n }\n update(event) {\n var _a;\n (_a = this.part) === null || _a === void 0 ? void 0 : _a.update({ params: event.params });\n }\n layout(_width, _height) {\n // noop - retrieval from api\n }\n dispose() {\n var _a;\n (_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();\n }\n}\n\nclass ReactWatermarkPart {\n get element() {\n return this._element;\n }\n constructor(id, component, reactPortalStore) {\n this.id = id;\n this.component = component;\n this.reactPortalStore = reactPortalStore;\n this._element = document.createElement('div');\n this._element.className = 'dv-react-part';\n this._element.style.height = '100%';\n this._element.style.width = '100%';\n }\n init(parameters) {\n this.part = new ReactPart(this.element, this.reactPortalStore, this.component, {\n group: parameters.group,\n containerApi: parameters.containerApi,\n });\n }\n focus() {\n // noop\n }\n update(params) {\n var _a, _b, _c;\n if (this.parameters) {\n this.parameters.params = params.params;\n }\n (_a = this.part) === null || _a === void 0 ? void 0 : _a.update({ params: (_c = (_b = this.parameters) === null || _b === void 0 ? void 0 : _b.params) !== null && _c !== void 0 ? _c : {} });\n }\n layout(_width, _height) {\n // noop - retrieval from api\n }\n dispose() {\n var _a;\n (_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();\n }\n}\n\nclass ReactHeaderActionsRendererPart {\n get element() {\n return this._element;\n }\n get part() {\n return this._part;\n }\n constructor(component, reactPortalStore, _group) {\n this.component = component;\n this.reactPortalStore = reactPortalStore;\n this._group = _group;\n this.mutableDisposable = new DockviewMutableDisposable();\n this._element = document.createElement('div');\n this._element.className = 'dv-react-part';\n this._element.style.height = '100%';\n this._element.style.width = '100%';\n }\n init(parameters) {\n this.mutableDisposable.value = new DockviewCompositeDisposable(this._group.model.onDidAddPanel(() => {\n this.updatePanels();\n }), this._group.model.onDidRemovePanel(() => {\n this.updatePanels();\n }), this._group.model.onDidActivePanelChange(() => {\n this.updateActivePanel();\n }), parameters.api.onDidActiveChange(() => {\n this.updateGroupActive();\n }), parameters.api.onDidLocationChange((event) => {\n this.updateLocation(event.location);\n }));\n this._part = new ReactPart(this.element, this.reactPortalStore, this.component, {\n api: parameters.api,\n containerApi: parameters.containerApi,\n panels: this._group.model.panels,\n activePanel: this._group.model.activePanel,\n isGroupActive: this._group.api.isActive,\n group: this._group,\n headerPosition: this._group.model.headerPosition,\n location: parameters.api.location,\n });\n }\n dispose() {\n var _a;\n this.mutableDisposable.dispose();\n (_a = this._part) === null || _a === void 0 ? void 0 : _a.dispose();\n }\n update(event) {\n var _a;\n (_a = this._part) === null || _a === void 0 ? void 0 : _a.update(event.params);\n }\n updatePanels() {\n this.update({ params: { panels: this._group.model.panels } });\n }\n updateActivePanel() {\n this.update({\n params: {\n activePanel: this._group.model.activePanel,\n },\n });\n }\n updateGroupActive() {\n this.update({\n params: {\n isGroupActive: this._group.api.isActive,\n },\n });\n }\n updateLocation(location) {\n this.update({ params: { location } });\n }\n}\n\nclass ReactContextMenuItemPart {\n get element() {\n return this._element;\n }\n constructor(id, component, reactPortalStore) {\n this.id = id;\n this.component = component;\n this.reactPortalStore = reactPortalStore;\n this._element = document.createElement('div');\n this._element.className = 'dv-react-part';\n this._element.style.height = '100%';\n this._element.style.width = '100%';\n }\n init(props) {\n this.part = new ReactPart(this._element, this.reactPortalStore, this.component, props);\n }\n dispose() {\n var _a;\n (_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();\n }\n}\n\nclass ReactTabGroupChipPart {\n get element() {\n return this._element;\n }\n constructor(component, reactPortalStore) {\n this.component = component;\n this.reactPortalStore = reactPortalStore;\n this._element = document.createElement('div');\n this._element.className = 'dv-react-part';\n this._element.style.display = 'inline-flex';\n }\n init(params) {\n this.part = new ReactPart(this._element, this.reactPortalStore, this.component, {\n tabGroup: params.tabGroup,\n api: params.api,\n });\n }\n update(params) {\n var _a;\n (_a = this.part) === null || _a === void 0 ? void 0 : _a.update({ tabGroup: params.tabGroup });\n }\n dispose() {\n var _a;\n (_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();\n }\n}\n\nclass ReactGroupDragGhostPart {\n get element() {\n return this._element;\n }\n constructor(component, reactPortalStore) {\n this.component = component;\n this.reactPortalStore = reactPortalStore;\n this._element = document.createElement('div');\n this._element.className = 'dv-react-part';\n this._element.style.display = 'inline-flex';\n }\n init(params) {\n this.part = new ReactPart(this._element, this.reactPortalStore, this.component, {\n group: params.group,\n api: params.api,\n });\n }\n dispose() {\n var _a;\n (_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();\n }\n}\n\nfunction createGroupControlElement(component, store) {\n return component\n ? (groupPanel) => {\n return new ReactHeaderActionsRendererPart(component, store, groupPanel);\n }\n : undefined;\n}\nconst DEFAULT_REACT_TAB = 'props.defaultTabComponent';\nfunction extractCoreOptions$3(props) {\n const coreOptions = PROPERTY_KEYS_DOCKVIEW.reduce((obj, key) => {\n if (key in props) {\n obj[key] = props[key];\n }\n return obj;\n }, {});\n return coreOptions;\n}\nconst DockviewReact = React.forwardRef((props, ref) => {\n const domRef = React.useRef(null);\n const dockviewRef = React.useRef(undefined);\n const [portals, addPortal] = usePortalsLifecycle();\n React.useImperativeHandle(ref, () => domRef.current, []);\n const prevProps = React.useRef({});\n React.useEffect(() => {\n const changes = {};\n PROPERTY_KEYS_DOCKVIEW.forEach((propKey) => {\n const key = propKey;\n const propValue = props[key];\n if (key in props && propValue !== prevProps.current[key]) {\n changes[key] = propValue;\n }\n });\n if (dockviewRef.current) {\n dockviewRef.current.updateOptions(changes);\n }\n prevProps.current = props;\n }, PROPERTY_KEYS_DOCKVIEW.map((key) => props[key]));\n React.useEffect(() => {\n var _a;\n if (!domRef.current) {\n return;\n }\n const frameworkTabComponents = (_a = props.tabComponents) !== null && _a !== void 0 ? _a : {};\n if (props.defaultTabComponent) {\n frameworkTabComponents[DEFAULT_REACT_TAB] =\n props.defaultTabComponent;\n }\n const frameworkOptions = {\n createLeftHeaderActionComponent: createGroupControlElement(props.leftHeaderActionsComponent, { addPortal }),\n createRightHeaderActionComponent: createGroupControlElement(props.rightHeaderActionsComponent, { addPortal }),\n createPrefixHeaderActionComponent: createGroupControlElement(props.prefixHeaderActionsComponent, { addPortal }),\n createComponent: (options) => {\n return new ReactPanelContentPart(options.id, props.components[options.name], {\n addPortal,\n });\n },\n createTabComponent(options) {\n return new ReactPanelHeaderPart(options.id, frameworkTabComponents[options.name], {\n addPortal,\n });\n },\n createWatermarkComponent: props.watermarkComponent\n ? () => {\n return new ReactWatermarkPart('watermark', props.watermarkComponent, {\n addPortal,\n });\n }\n : undefined,\n defaultTabComponent: props.defaultTabComponent\n ? DEFAULT_REACT_TAB\n : undefined,\n createContextMenuItemComponent: (options) => {\n if (!options.component) {\n return undefined;\n }\n return new ReactContextMenuItemPart(options.id, options.component, { addPortal });\n },\n };\n const coreOptions = extractCoreOptions$3(props);\n if (props.tabGroupChipComponent) {\n const chipComponent = props.tabGroupChipComponent;\n coreOptions.createTabGroupChipComponent = () => {\n return new ReactTabGroupChipPart(chipComponent, {\n addPortal,\n });\n };\n }\n if (props.groupDragGhostComponent) {\n const ghostComponent = props.groupDragGhostComponent;\n coreOptions.createGroupDragGhostComponent = () => {\n return new ReactGroupDragGhostPart(ghostComponent, {\n addPortal,\n });\n };\n }\n const api = createDockview(domRef.current, Object.assign(Object.assign({}, coreOptions), frameworkOptions));\n const { clientWidth, clientHeight } = domRef.current;\n api.layout(clientWidth, clientHeight);\n if (props.onReady) {\n props.onReady({ api });\n }\n dockviewRef.current = api;\n return () => {\n dockviewRef.current = undefined;\n api.dispose();\n };\n }, []);\n React.useEffect(() => {\n if (!dockviewRef.current) {\n return () => {\n // noop\n };\n }\n const disposable = dockviewRef.current.onDidDrop((event) => {\n if (props.onDidDrop) {\n props.onDidDrop(event);\n }\n });\n return () => {\n disposable.dispose();\n };\n }, [props.onDidDrop]);\n React.useEffect(() => {\n if (!dockviewRef.current) {\n return () => {\n // noop\n };\n }\n const disposable = dockviewRef.current.onWillDrop((event) => {\n if (props.onWillDrop) {\n props.onWillDrop(event);\n }\n });\n return () => {\n disposable.dispose();\n };\n }, [props.onWillDrop]);\n React.useEffect(() => {\n if (!dockviewRef.current) {\n return;\n }\n dockviewRef.current.updateOptions({\n createTabGroupChipComponent: props.tabGroupChipComponent\n ? () => {\n return new ReactTabGroupChipPart(props.tabGroupChipComponent, {\n addPortal,\n });\n }\n : undefined,\n });\n }, [props.tabGroupChipComponent]);\n React.useEffect(() => {\n if (!dockviewRef.current) {\n return;\n }\n dockviewRef.current.updateOptions({\n createGroupDragGhostComponent: props.groupDragGhostComponent\n ? () => {\n return new ReactGroupDragGhostPart(props.groupDragGhostComponent, {\n addPortal,\n });\n }\n : undefined,\n });\n }, [props.groupDragGhostComponent]);\n React.useEffect(() => {\n if (!dockviewRef.current) {\n return;\n }\n dockviewRef.current.updateOptions({\n createComponent: (options) => {\n return new ReactPanelContentPart(options.id, props.components[options.name], {\n addPortal,\n });\n },\n });\n }, [props.components]);\n React.useEffect(() => {\n var _a;\n if (!dockviewRef.current) {\n return;\n }\n const frameworkTabComponents = (_a = props.tabComponents) !== null && _a !== void 0 ? _a : {};\n if (props.defaultTabComponent) {\n frameworkTabComponents[DEFAULT_REACT_TAB] =\n props.defaultTabComponent;\n }\n dockviewRef.current.updateOptions({\n defaultTabComponent: props.defaultTabComponent\n ? DEFAULT_REACT_TAB\n : undefined,\n createTabComponent(options) {\n return new ReactPanelHeaderPart(options.id, frameworkTabComponents[options.name], {\n addPortal,\n });\n },\n });\n }, [props.tabComponents, props.defaultTabComponent]);\n React.useEffect(() => {\n if (!dockviewRef.current) {\n return;\n }\n dockviewRef.current.updateOptions({\n createWatermarkComponent: props.watermarkComponent\n ? () => {\n return new ReactWatermarkPart('watermark', props.watermarkComponent, {\n addPortal,\n });\n }\n : undefined,\n });\n }, [props.watermarkComponent]);\n React.useEffect(() => {\n if (!dockviewRef.current) {\n return;\n }\n dockviewRef.current.updateOptions({\n createRightHeaderActionComponent: createGroupControlElement(props.rightHeaderActionsComponent, { addPortal }),\n });\n }, [props.rightHeaderActionsComponent]);\n React.useEffect(() => {\n if (!dockviewRef.current) {\n return;\n }\n dockviewRef.current.updateOptions({\n createLeftHeaderActionComponent: createGroupControlElement(props.leftHeaderActionsComponent, { addPortal }),\n });\n }, [props.leftHeaderActionsComponent]);\n React.useEffect(() => {\n if (!dockviewRef.current) {\n return;\n }\n dockviewRef.current.updateOptions({\n createPrefixHeaderActionComponent: createGroupControlElement(props.prefixHeaderActionsComponent, { addPortal }),\n });\n }, [props.prefixHeaderActionsComponent]);\n return (React.createElement(\"div\", { style: { height: '100%', width: '100%' }, ref: domRef }, portals));\n});\nDockviewReact.displayName = 'DockviewComponent';\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nconst CloseButton = () => (React.createElement(\"svg\", { height: \"11\", width: \"11\", viewBox: \"0 0 28 28\", \"aria-hidden\": 'false', focusable: false, className: \"dv-svg\" },\n React.createElement(\"path\", { d: \"M2.1 27.3L0 25.2L11.55 13.65L0 2.1L2.1 0L13.65 11.55L25.2 0L27.3 2.1L15.75 13.65L27.3 25.2L25.2 27.3L13.65 15.75L2.1 27.3Z\" })));\n\nfunction useTitle(api) {\n const [title, setTitle] = React.useState(api.title);\n React.useEffect(() => {\n const disposable = api.onDidTitleChange((event) => {\n setTitle(event.title);\n });\n // Depending on the order in which React effects are run, the title may already be out of sync (cf. issue #1003).\n if (title !== api.title) {\n setTitle(api.title);\n }\n return () => {\n disposable.dispose();\n };\n }, [api]);\n return title;\n}\nconst DockviewDefaultTab = (_a) => {\n var { api, containerApi: _containerApi, params: _params, hideClose, closeActionOverride, onPointerDown, onPointerUp, onPointerLeave, tabLocation } = _a, rest = __rest(_a, [\"api\", \"containerApi\", \"params\", \"hideClose\", \"closeActionOverride\", \"onPointerDown\", \"onPointerUp\", \"onPointerLeave\", \"tabLocation\"]);\n const title = useTitle(api);\n const isMiddleMouseButton = React.useRef(false);\n const onClose = React.useCallback((event) => {\n event.preventDefault();\n if (closeActionOverride) {\n closeActionOverride();\n }\n else {\n api.close();\n }\n }, [api, closeActionOverride]);\n const onBtnPointerDown = React.useCallback((event) => {\n event.preventDefault();\n }, []);\n const _onPointerDown = React.useCallback((event) => {\n isMiddleMouseButton.current = event.button === 1;\n onPointerDown === null || onPointerDown === void 0 ? void 0 : onPointerDown(event);\n }, [onPointerDown]);\n const _onPointerUp = React.useCallback((event) => {\n if (isMiddleMouseButton && event.button === 1 && !hideClose) {\n isMiddleMouseButton.current = false;\n onClose(event);\n }\n onPointerUp === null || onPointerUp === void 0 ? void 0 : onPointerUp(event);\n }, [onPointerUp, onClose, hideClose]);\n const _onPointerLeave = React.useCallback((event) => {\n isMiddleMouseButton.current = false;\n onPointerLeave === null || onPointerLeave === void 0 ? void 0 : onPointerLeave(event);\n }, [onPointerLeave]);\n return (React.createElement(\"div\", Object.assign({ \"data-testid\": \"dockview-dv-default-tab\" }, rest, { onPointerDown: _onPointerDown, onPointerUp: _onPointerUp, onPointerLeave: _onPointerLeave, className: \"dv-default-tab\" }),\n React.createElement(\"span\", { className: \"dv-default-tab-content\" }, title),\n !hideClose && (React.createElement(\"div\", { className: \"dv-default-tab-action\", onPointerDown: onBtnPointerDown, onClick: onClose },\n React.createElement(CloseButton, null)))));\n};\n\nclass ReactPanelView extends SplitviewPanel {\n constructor(id, component, reactComponent, reactPortalStore) {\n super(id, component);\n this.reactComponent = reactComponent;\n this.reactPortalStore = reactPortalStore;\n }\n getComponent() {\n var _a, _b;\n return new ReactPart(this.element, this.reactPortalStore, this.reactComponent, {\n params: (_b = (_a = this._params) === null || _a === void 0 ? void 0 : _a.params) !== null && _b !== void 0 ? _b : {},\n api: this.api,\n containerApi: new SplitviewApi(this._params.accessor),\n });\n }\n}\n\nfunction extractCoreOptions$2(props) {\n const coreOptions = PROPERTY_KEYS_SPLITVIEW.reduce((obj, key) => {\n if (key in props) {\n obj[key] = props[key];\n }\n return obj;\n }, {});\n return coreOptions;\n}\nconst SplitviewReact = React.forwardRef((props, ref) => {\n const domRef = React.useRef(null);\n const splitviewRef = React.useRef(undefined);\n const [portals, addPortal] = usePortalsLifecycle();\n React.useImperativeHandle(ref, () => domRef.current, []);\n const prevProps = React.useRef({});\n React.useEffect(() => {\n const changes = {};\n PROPERTY_KEYS_SPLITVIEW.forEach((propKey) => {\n const key = propKey;\n const propValue = props[key];\n if (key in props && propValue !== prevProps.current[key]) {\n changes[key] = propValue;\n }\n });\n if (splitviewRef.current) {\n splitviewRef.current.updateOptions(changes);\n }\n prevProps.current = props;\n }, PROPERTY_KEYS_SPLITVIEW.map((key) => props[key]));\n React.useEffect(() => {\n if (!domRef.current) {\n return () => {\n // noop\n };\n }\n const frameworkOptions = {\n createComponent: (options) => {\n return new ReactPanelView(options.id, options.name, props.components[options.name], { addPortal });\n },\n };\n const api = createSplitview(domRef.current, Object.assign(Object.assign({}, extractCoreOptions$2(props)), frameworkOptions));\n const { clientWidth, clientHeight } = domRef.current;\n api.layout(clientWidth, clientHeight);\n if (props.onReady) {\n props.onReady({ api });\n }\n splitviewRef.current = api;\n return () => {\n splitviewRef.current = undefined;\n api.dispose();\n };\n }, []);\n React.useEffect(() => {\n if (!splitviewRef.current) {\n return;\n }\n splitviewRef.current.updateOptions({\n createComponent: (options) => {\n return new ReactPanelView(options.id, options.name, props.components[options.name], { addPortal });\n },\n });\n }, [props.components]);\n return (React.createElement(\"div\", { style: { height: '100%', width: '100%' }, ref: domRef }, portals));\n});\nSplitviewReact.displayName = 'SplitviewComponent';\n\nclass ReactGridPanelView extends GridviewPanel {\n constructor(id, component, reactComponent, reactPortalStore) {\n super(id, component);\n this.reactComponent = reactComponent;\n this.reactPortalStore = reactPortalStore;\n }\n getComponent() {\n var _a, _b;\n return new ReactPart(this.element, this.reactPortalStore, this.reactComponent, {\n params: (_b = (_a = this._params) === null || _a === void 0 ? void 0 : _a.params) !== null && _b !== void 0 ? _b : {},\n api: this.api,\n // TODO: fix casting hack\n containerApi: new GridviewApi(this._params\n .accessor),\n });\n }\n}\n\nfunction extractCoreOptions$1(props) {\n const coreOptions = PROPERTY_KEYS_GRIDVIEW.reduce((obj, key) => {\n if (key in props) {\n obj[key] = props[key];\n }\n return obj;\n }, {});\n return coreOptions;\n}\nconst GridviewReact = React.forwardRef((props, ref) => {\n const domRef = React.useRef(null);\n const gridviewRef = React.useRef(undefined);\n const [portals, addPortal] = usePortalsLifecycle();\n React.useImperativeHandle(ref, () => domRef.current, []);\n const prevProps = React.useRef({});\n React.useEffect(() => {\n const changes = {};\n PROPERTY_KEYS_GRIDVIEW.forEach((propKey) => {\n const key = propKey;\n const propValue = props[key];\n if (key in props && propValue !== prevProps.current[key]) {\n changes[key] = propValue;\n }\n });\n if (gridviewRef.current) {\n gridviewRef.current.updateOptions(changes);\n }\n prevProps.current = props;\n }, PROPERTY_KEYS_GRIDVIEW.map((key) => props[key]));\n React.useEffect(() => {\n if (!domRef.current) {\n return () => {\n // noop\n };\n }\n const frameworkOptions = {\n createComponent: (options) => {\n return new ReactGridPanelView(options.id, options.name, props.components[options.name], { addPortal });\n },\n };\n const api = createGridview(domRef.current, Object.assign(Object.assign({}, extractCoreOptions$1(props)), frameworkOptions));\n const { clientWidth, clientHeight } = domRef.current;\n api.layout(clientWidth, clientHeight);\n if (props.onReady) {\n props.onReady({ api });\n }\n gridviewRef.current = api;\n return () => {\n gridviewRef.current = undefined;\n api.dispose();\n };\n }, []);\n React.useEffect(() => {\n if (!gridviewRef.current) {\n return;\n }\n gridviewRef.current.updateOptions({\n createComponent: (options) => {\n return new ReactGridPanelView(options.id, options.name, props.components[options.name], { addPortal });\n },\n });\n }, [props.components]);\n return (React.createElement(\"div\", { style: { height: '100%', width: '100%' }, ref: domRef }, portals));\n});\nGridviewReact.displayName = 'GridviewComponent';\n\nclass PanePanelSection {\n get element() {\n return this._element;\n }\n constructor(id, component, reactPortalStore) {\n this.id = id;\n this.component = component;\n this.reactPortalStore = reactPortalStore;\n this._element = document.createElement('div');\n this._element.style.height = '100%';\n this._element.style.width = '100%';\n }\n init(parameters) {\n this.part = new ReactPart(this.element, this.reactPortalStore, this.component, {\n params: parameters.params,\n api: parameters.api,\n title: parameters.title,\n containerApi: parameters.containerApi,\n });\n }\n toJSON() {\n return {\n id: this.id,\n };\n }\n update(params) {\n var _a;\n (_a = this.part) === null || _a === void 0 ? void 0 : _a.update(params.params);\n }\n dispose() {\n var _a;\n (_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();\n }\n}\n\nfunction extractCoreOptions(props) {\n const coreOptions = PROPERTY_KEYS_PANEVIEW.reduce((obj, key) => {\n if (key in props) {\n obj[key] = props[key];\n }\n return obj;\n }, {});\n return coreOptions;\n}\nconst PaneviewReact = React.forwardRef((props, ref) => {\n const domRef = React.useRef(null);\n const paneviewRef = React.useRef(undefined);\n const [portals, addPortal] = usePortalsLifecycle();\n React.useImperativeHandle(ref, () => domRef.current, []);\n const prevProps = React.useRef({});\n React.useEffect(() => {\n const changes = {};\n PROPERTY_KEYS_PANEVIEW.forEach((propKey) => {\n const key = propKey;\n const propValue = props[key];\n if (key in props && propValue !== prevProps.current[key]) {\n changes[key] = propValue;\n }\n });\n if (paneviewRef.current) {\n paneviewRef.current.updateOptions(changes);\n }\n prevProps.current = props;\n }, PROPERTY_KEYS_PANEVIEW.map((key) => props[key]));\n React.useEffect(() => {\n var _a;\n if (!domRef.current) {\n return () => {\n // noop\n };\n }\n const headerComponents = (_a = props.headerComponents) !== null && _a !== void 0 ? _a : {};\n const frameworkOptions = {\n createComponent: (options) => {\n return new PanePanelSection(options.id, props.components[options.name], { addPortal });\n },\n createHeaderComponent: (options) => {\n return new PanePanelSection(options.id, headerComponents[options.name], { addPortal });\n },\n };\n const api = createPaneview(domRef.current, Object.assign(Object.assign({}, extractCoreOptions(props)), frameworkOptions));\n const { clientWidth, clientHeight } = domRef.current;\n api.layout(clientWidth, clientHeight);\n if (props.onReady) {\n props.onReady({ api });\n }\n paneviewRef.current = api;\n return () => {\n paneviewRef.current = undefined;\n api.dispose();\n };\n }, []);\n React.useEffect(() => {\n if (!paneviewRef.current) {\n return;\n }\n paneviewRef.current.updateOptions({\n createComponent: (options) => {\n return new PanePanelSection(options.id, props.components[options.name], { addPortal });\n },\n });\n }, [props.components]);\n React.useEffect(() => {\n var _a;\n if (!paneviewRef.current) {\n return;\n }\n const headerComponents = (_a = props.headerComponents) !== null && _a !== void 0 ? _a : {};\n paneviewRef.current.updateOptions({\n createHeaderComponent: (options) => {\n return new PanePanelSection(options.id, headerComponents[options.name], { addPortal });\n },\n });\n }, [props.headerComponents]);\n React.useEffect(() => {\n if (!paneviewRef.current) {\n return () => {\n // noop\n };\n }\n const disposable = paneviewRef.current.onDidDrop((event) => {\n if (props.onDidDrop) {\n props.onDidDrop(event);\n }\n });\n return () => {\n disposable.dispose();\n };\n }, [props.onDidDrop]);\n return (React.createElement(\"div\", { style: { height: '100%', width: '100%' }, ref: domRef }, portals));\n});\nPaneviewReact.displayName = 'PaneviewComponent';\n\nexport { DockviewDefaultTab, DockviewReact, GridviewReact, PaneviewReact, ReactPart, ReactPartContext, SplitviewReact, isReactComponent, usePortalsLifecycle };\n","export const VIEW_LAYOUT_HOST_ID = 'forgeax-view-layout-host';\n\nexport function slotElementId(slot: string) {\n return `forgeax-view-slot-${slot}`;\n}\n","import { useTranslation } from '../i18n';\n\nexport function setDockTitleHidden(\n group: HTMLElement,\n hidden: boolean,\n): void {\n group.dataset.fxDockTitleState = hidden ? 'hidden' : 'visible';\n}\n\nexport function isDockTitleHidden(group: HTMLElement): boolean {\n return group.dataset.fxDockTitleState === 'hidden';\n}\n\n/** Apply claim default once; user toggles persist via `data-fx-dock-title-state`. */\nexport function applyDefaultDockTitleHidden(\n group: HTMLElement | null | undefined,\n hiddenByDefault: boolean,\n): void {\n if (!group || !hiddenByDefault) return;\n if (group.dataset.fxDockTitleState !== undefined) return;\n setDockTitleHidden(group, true);\n}\n\nexport function DockTitleRestoreButton() {\n const { t } = useTranslation();\n const label = t('view.dock.restoreTitleBar');\n return (\n <button\n type=\"button\"\n className=\"fx-dock-title-restore\"\n aria-label={label}\n title={label}\n onClick={(event) => {\n const group = event.currentTarget.closest<HTMLElement>('.dv-groupview, .groupview');\n if (group) setDockTitleHidden(group, false);\n }}\n />\n );\n}\n","const DOCK_DIRECTION = Object.freeze({\n fill: 'right',\n top: 'above',\n bottom: 'below',\n left: 'left',\n right: 'right',\n});\nconst DOCK_ORDER = Object.freeze({\n fill: 0,\n top: 1,\n bottom: 2,\n left: 3,\n right: 4,\n});\nconst layoutSignatures = new WeakMap();\n\nfunction panelId(claim) {\n return claim.id ?? claim.slot;\n}\n\nexport function isPanelClosable(claim) {\n return claim?.closable !== false;\n}\n\nfunction dockPanelParams(claim, attach) {\n const id = panelId(claim);\n return {\n id,\n attach,\n ...(claim.titleKey === undefined ? {} : { titleKey: claim.titleKey }),\n ...(isPanelClosable(claim) ? {} : { closable: false }),\n };\n}\n\nexport function claimsForPage(claims, pageType) {\n if (!pageType) return [];\n return claims.filter((claim) => claim.pageType === pageType);\n}\n\nfunction orderedClaims(claims) {\n return [...claims].sort(\n (left, right) =>\n (DOCK_ORDER[left.layout.dock] ?? 99) - (DOCK_ORDER[right.layout.dock] ?? 99) ||\n left.layout.order - right.layout.order ||\n panelId(left).localeCompare(panelId(right)),\n );\n}\n\nfunction layoutSignature(claims) {\n return JSON.stringify(\n orderedClaims(claims).map((claim) => [\n panelId(claim),\n claim.layout.dock,\n claim.layout.size ?? null,\n claim.layout.stack,\n claim.layout.order,\n ]),\n );\n}\n\nfunction placementFor(api, claim, anchors, centerAnchor) {\n const dock = claim.layout.dock;\n const sameDock = anchors.get(dock);\n if (sameDock && api.getPanel(sameDock)) {\n return {\n direction: claim.layout.stack === 'tabs' ? 'within' : DOCK_DIRECTION[dock],\n referencePanel: sameDock,\n };\n }\n if (!centerAnchor || !api.getPanel(centerAnchor)) return undefined;\n return {\n direction: dock === 'fill' ? 'within' : DOCK_DIRECTION[dock],\n referencePanel: centerAnchor,\n };\n}\n\nfunction initialSize(size, available) {\n if (!size) return undefined;\n if (size.unit === 'px') return size.value;\n if (!Number.isFinite(available) || available <= 0) return undefined;\n return Math.round(available * size.value);\n}\n\n/**\n * Reconcile Dockview with the currently active, product-owned panel claims.\n * The shell only interprets generic zones and sizing hints.\n */\nexport function refreshDockPanelTitles(api, claims, titleFor = (claim) => claim.titleKey ?? panelId(claim)) {\n for (const claim of claims) {\n const id = panelId(claim);\n const panel = api.getPanel(id);\n if (panel) panel.api.setTitle(titleFor(claim));\n }\n}\n\n/**\n * @param {object} api Dockview api.\n * @param {Array<object>} claims Slot claims for the active page.\n * @param {object} [options]\n * @param {(claim: any) => string} [options.titleFor]\n * @param {(id: string) => unknown} [options.attach]\n * @param {number} [options.availableWidth]\n * @param {number} [options.availableHeight]\n */\nexport function reconcileDockPanels(\n api,\n claims,\n {\n titleFor = (claim) => claim.titleKey ?? panelId(claim),\n attach = () => {},\n availableWidth,\n availableHeight,\n } = {},\n) {\n const signature = layoutSignature(claims);\n if (layoutSignatures.get(api) !== signature && api.panels.length > 0) {\n for (const panel of [...api.panels]) panel.api.close();\n }\n layoutSignatures.set(api, signature);\n const activeIds = new Set(claims.map(panelId));\n for (const panel of [...api.panels]) {\n if (!activeIds.has(panel.id)) panel.api.close();\n }\n\n const anchors = new Map();\n let centerAnchor = claims\n .filter((claim) => claim.layout.dock === 'fill')\n .map(panelId)\n .find((id) => api.getPanel(id));\n for (const claim of orderedClaims(claims)) {\n const id = panelId(claim);\n const existing = api.getPanel(id);\n if (existing) {\n if (!centerAnchor && claim.layout.dock === 'fill') centerAnchor = id;\n if (!anchors.has(claim.layout.dock)) anchors.set(claim.layout.dock, id);\n existing.api.setTitle(titleFor(claim));\n if (typeof existing.api.getParameters === 'function' && typeof existing.api.updateParameters === 'function') {\n const current = existing.api.getParameters();\n const nextClosable = isPanelClosable(claim) ? undefined : false;\n const closableChanged = (current.closable === false) !== (nextClosable === false);\n const titleKeyChanged = claim.titleKey !== current.titleKey;\n if (closableChanged || titleKeyChanged) {\n existing.api.updateParameters({\n ...current,\n ...(claim.titleKey === undefined ? {} : { titleKey: claim.titleKey }),\n closable: nextClosable,\n });\n }\n }\n continue;\n }\n const position = placementFor(api, claim, anchors, centerAnchor);\n const horizontalSize = initialSize(claim.layout.size, availableWidth);\n const verticalSize = initialSize(claim.layout.size, availableHeight);\n api.addPanel({\n id,\n component: 'slot',\n title: titleFor(claim),\n params: dockPanelParams(claim, attach),\n position,\n ...(horizontalSize === undefined || !['left', 'right'].includes(claim.layout.dock)\n ? {}\n : { initialWidth: horizontalSize }),\n ...(verticalSize === undefined || !['top', 'bottom'].includes(claim.layout.dock)\n ? {}\n : { initialHeight: verticalSize }),\n });\n if (!centerAnchor) centerAnchor = id;\n if (!anchors.has(claim.layout.dock)) anchors.set(claim.layout.dock, id);\n }\n}\n","export type UePosition = 'top' | 'bottom' | 'left' | 'right' | 'center';\nexport type Point = { x: number; y: number };\nexport type Rect = { x: number; y: number; width: number; height: number };\nexport type Polygon = readonly Point[];\n\nexport type DirectorLayout = {\n bounds: Rect;\n center: Rect;\n top: Polygon;\n right: Polygon;\n bottom: Polygon;\n left: Polygon;\n};\n\nconst clamp = (value: number, minimum: number, maximum: number) =>\n Math.max(minimum, Math.min(maximum, value));\n\nexport function directorLayout(content: Rect): DirectorLayout {\n const margin = Math.min(6, content.width / 6, content.height / 6);\n const bounds = {\n x: content.x + margin,\n y: content.y + margin,\n width: content.width - margin * 2,\n height: content.height - margin * 2,\n };\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n const width = clamp(bounds.width * 0.46, Math.min(64, bounds.width), bounds.width);\n const height = clamp(bounds.height * 0.46, Math.min(52, bounds.height), bounds.height);\n const center = { x: cx - width / 2, y: cy - height / 2, width, height };\n const outer = {\n tl: { x: bounds.x, y: bounds.y },\n tr: { x: bounds.x + bounds.width, y: bounds.y },\n br: { x: bounds.x + bounds.width, y: bounds.y + bounds.height },\n bl: { x: bounds.x, y: bounds.y + bounds.height },\n };\n const inner = {\n tl: { x: center.x, y: center.y },\n tr: { x: center.x + center.width, y: center.y },\n br: { x: center.x + center.width, y: center.y + center.height },\n bl: { x: center.x, y: center.y + center.height },\n };\n return {\n bounds,\n center,\n top: [outer.tl, outer.tr, inner.tr, inner.tl],\n right: [outer.tr, outer.br, inner.br, inner.tr],\n bottom: [outer.br, outer.bl, inner.bl, inner.br],\n left: [outer.bl, outer.tl, inner.tl, inner.bl],\n };\n}\n\nfunction inRect(point: Point, rect: Rect) {\n return point.x >= rect.x && point.x <= rect.x + rect.width\n && point.y >= rect.y && point.y <= rect.y + rect.height;\n}\n\nexport function hitDirector(layout: DirectorLayout, point: Point): UePosition | null {\n if (inRect(point, layout.center)) return 'center';\n if (!inRect(point, layout.bounds)) return null;\n const cx = layout.bounds.x + layout.bounds.width / 2;\n const cy = layout.bounds.y + layout.bounds.height / 2;\n const dx = (point.x - cx) / (layout.bounds.width / 2);\n const dy = (point.y - cy) / (layout.bounds.height / 2);\n if (Math.abs(dx) >= Math.abs(dy)) return dx < 0 ? 'left' : 'right';\n return dy < 0 ? 'top' : 'bottom';\n}\n\nexport function previewRect(rect: Rect, position: UePosition): Rect {\n if (position === 'center') return rect;\n if (position === 'left') return { ...rect, width: rect.width / 2 };\n if (position === 'right') {\n return { ...rect, x: rect.x + rect.width / 2, width: rect.width / 2 };\n }\n if (position === 'top') return { ...rect, height: rect.height / 2 };\n return { ...rect, y: rect.y + rect.height / 2, height: rect.height / 2 };\n}\n","import type { DirectorLayout, Point, Rect, UePosition } from './geometry';\nimport './ue-drag.css';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\ntype Direction = Exclude<UePosition, 'center'>;\n\ntype OverlayDom = {\n root: HTMLDivElement;\n liveHost: HTMLDivElement;\n preview: HTMLDivElement;\n svg: SVGSVGElement;\n group: SVGGElement;\n zones: Record<Direction, SVGPolygonElement>;\n center: SVGRectElement;\n ghost: HTMLDivElement;\n};\n\nlet dom: OverlayDom | null = null;\n\nfunction polygon(points: readonly Point[]) {\n return points.map((point) => `${point.x},${point.y}`).join(' ');\n}\n\nfunction createOverlay(): OverlayDom {\n const root = document.createElement('div');\n root.className = 'fx-ue-overlay';\n root.hidden = true;\n const liveHost = document.createElement('div');\n liveHost.className = 'fx-ue-live-host';\n const preview = document.createElement('div');\n preview.className = 'fx-ue-preview';\n const svg = document.createElementNS(SVG_NS, 'svg');\n svg.classList.add('fx-ue-svg');\n const group = document.createElementNS(SVG_NS, 'g');\n const makeZone = (direction: Direction) => {\n const element = document.createElementNS(SVG_NS, 'polygon');\n element.classList.add('fx-ue-zone', `fx-ue-zone--${direction}`);\n group.append(element);\n return element;\n };\n const zones = {\n top: makeZone('top'),\n right: makeZone('right'),\n bottom: makeZone('bottom'),\n left: makeZone('left'),\n };\n const center = document.createElementNS(SVG_NS, 'rect');\n center.classList.add('fx-ue-zone', 'fx-ue-zone--center');\n center.setAttribute('rx', '4');\n group.append(center);\n svg.append(group);\n const ghost = document.createElement('div');\n ghost.className = 'fx-ue-ghost';\n root.append(liveHost, preview, svg, ghost);\n document.body.append(root);\n return { root, liveHost, preview, svg, group, zones, center, ghost };\n}\n\nfunction getDom() {\n if (!dom || !document.body.contains(dom.root)) dom = createOverlay();\n return dom;\n}\n\nfunction place(element: HTMLElement, rect: Rect) {\n element.style.transform = `translate(${rect.x}px, ${rect.y}px)`;\n element.style.width = `${rect.width}px`;\n element.style.height = `${rect.height}px`;\n}\n\nexport function updateUeOverlay({\n pointer,\n director,\n active,\n preview,\n title,\n}: {\n pointer: Point;\n director: DirectorLayout;\n active: UePosition | null;\n preview: Rect | null;\n title: string;\n}) {\n const current = getDom();\n current.root.hidden = false;\n if (preview) {\n current.preview.hidden = false;\n place(current.preview, preview);\n } else {\n current.preview.hidden = true;\n }\n for (const direction of ['top', 'right', 'bottom', 'left'] as const) {\n current.zones[direction].setAttribute('points', polygon(director[direction]));\n current.zones[direction].classList.toggle('is-active', active === direction);\n }\n current.center.setAttribute('x', String(director.center.x));\n current.center.setAttribute('y', String(director.center.y));\n current.center.setAttribute('width', String(director.center.width));\n current.center.setAttribute('height', String(director.center.height));\n current.center.classList.toggle('is-active', active === 'center');\n current.ghost.textContent = title;\n current.ghost.style.transform = `translate(${pointer.x + 14}px, ${pointer.y + 14}px)`;\n}\n\nexport function hideUeOverlay() {\n if (dom) dom.root.hidden = true;\n}\n\nexport function getUeLivePreviewHost() {\n return getDom().liveHost;\n}\n","import type { DockviewApi } from 'dockview';\n\nimport {\n directorLayout,\n hitDirector,\n previewRect,\n type Point,\n type Rect,\n type UePosition,\n} from './geometry';\nimport { getUeLivePreviewHost, hideUeOverlay, updateUeOverlay } from './overlay';\n\ntype DockGroup = DockviewApi['groups'][number];\ntype DockPanel = DockviewApi['panels'][number];\ntype GroupHit = {\n group: DockGroup;\n groupRect: Rect;\n contentRect: Rect;\n onTabs: boolean;\n};\n\ntype DragSession = {\n panel: DockPanel;\n originGroup: DockGroup;\n originIndex: number;\n start: Point;\n dragging: boolean;\n target: { group: DockGroup; position: UePosition } | null;\n carrier: HTMLElement | null;\n parkedParent: Node | null;\n parkedNext: Node | null;\n};\n\nfunction rectOf(element: Element | null): Rect | null {\n if (!element) return null;\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return null;\n return { x: rect.left, y: rect.top, width: rect.width, height: rect.height };\n}\n\nfunction contains(rect: Rect, point: Point) {\n return point.x >= rect.x && point.x <= rect.x + rect.width\n && point.y >= rect.y && point.y <= rect.y + rect.height;\n}\n\nfunction groupAt(api: DockviewApi, point: Point): GroupHit | null {\n let match: GroupHit | null = null;\n let area = Number.POSITIVE_INFINITY;\n for (const group of api.groups) {\n if (group.api.location.type !== 'grid') continue;\n const groupRect = rectOf(group.element);\n if (!groupRect || !contains(groupRect, point)) continue;\n const nextArea = groupRect.width * groupRect.height;\n if (nextArea >= area) continue;\n const tabs = rectOf(group.element.querySelector('.dv-tabs-and-actions-container'));\n const contentRect = rectOf(group.element.querySelector('.dv-content-container')) ?? groupRect;\n match = {\n group,\n groupRect,\n contentRect,\n onTabs: Boolean(tabs && contains(tabs, point)),\n };\n area = nextArea;\n }\n return match;\n}\n\nfunction panelForTab(group: DockGroup, tab: Element): DockPanel | undefined {\n const tabs = Array.from(tab.parentElement?.querySelectorAll(':scope > .dv-tab') ?? []);\n const index = tabs.indexOf(tab);\n return group.panels[index] ?? group.panels[0];\n}\n\nexport function installUeDockDrag(api: DockviewApi, host: HTMLElement): () => void {\n let session: DragSession | null = null;\n\n const restoreCarrierDom = (current: DragSession) => {\n if (!current.carrier || !current.parkedParent) return;\n try {\n current.parkedParent.insertBefore(current.carrier, current.parkedNext);\n } catch {\n // Dockview may already have moved or disposed the floating carrier.\n }\n current.parkedParent = null;\n current.parkedNext = null;\n };\n\n const clearCarrierPreview = (current: DragSession) => {\n const carrier = current.carrier;\n if (!carrier) return;\n carrier.classList.remove('fx-ue-live-preview', 'fx-ue-live-preview--hidden');\n carrier.style.position = '';\n carrier.style.left = '';\n carrier.style.top = '';\n carrier.style.right = '';\n carrier.style.bottom = '';\n carrier.style.width = '';\n carrier.style.height = '';\n };\n\n const placeCarrierPreview = (current: DragSession, rect: Rect | null) => {\n const carrier = current.carrier;\n if (!carrier) return;\n if (!current.parkedParent) {\n current.parkedParent = carrier.parentNode;\n current.parkedNext = carrier.nextSibling;\n getUeLivePreviewHost().append(carrier);\n }\n carrier.classList.add('fx-ue-live-preview');\n carrier.classList.toggle('fx-ue-live-preview--hidden', rect === null);\n if (!rect) return;\n Object.assign(carrier.style, {\n position: 'fixed',\n left: `${rect.x}px`,\n top: `${rect.y}px`,\n right: 'auto',\n bottom: 'auto',\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n });\n };\n\n const lift = (current: DragSession) => {\n try {\n api.addFloatingGroup(current.panel);\n const floating = api.groups.find(\n (group) =>\n group.api.location.type === 'floating'\n && group.panels.some((panel) => panel.id === current.panel.id),\n );\n const element = floating?.element ?? current.panel.group.element;\n current.carrier =\n element.closest<HTMLElement>('.dv-resize-container')\n ?? element;\n current.carrier.classList.add('fx-ue-live-preview', 'fx-ue-live-preview--hidden');\n } catch {\n current.carrier = null;\n }\n };\n\n const finish = (commit: boolean) => {\n const current = session;\n session = null;\n document.documentElement.classList.remove('fx-ue-dragging');\n hideUeOverlay();\n if (!current?.dragging) return;\n restoreCarrierDom(current);\n const origin =\n api.groups.find((group) => group.id === current.originGroup.id)\n ?? api.groups.find((group) => group.api.location.type === 'grid');\n try {\n if (commit && current.target) {\n current.panel.api.moveTo({\n group: current.target.group,\n position: current.target.position,\n });\n current.panel.api.setActive();\n } else if (origin) {\n current.panel.api.moveTo({\n group: origin,\n position: 'center',\n index: current.originIndex,\n });\n current.panel.api.setActive();\n }\n } catch {\n try {\n if (origin) {\n current.panel.api.moveTo({\n group: origin,\n position: 'center',\n index: current.originIndex,\n });\n }\n } catch {\n // Dockview retains the source panel when a move cannot be completed.\n }\n }\n clearCarrierPreview(current);\n };\n\n const pointerMove = (event: PointerEvent) => {\n if (!session) return;\n const point = { x: event.clientX, y: event.clientY };\n if (!session.dragging) {\n if (Math.hypot(point.x - session.start.x, point.y - session.start.y) < 5) return;\n session.dragging = true;\n document.documentElement.classList.add('fx-ue-dragging');\n lift(session);\n }\n event.preventDefault();\n const hit = groupAt(api, point);\n if (!hit) {\n session.target = null;\n placeCarrierPreview(session, null);\n hideUeOverlay();\n return;\n }\n const director = directorLayout(hit.contentRect);\n const position = hit.onTabs ? 'center' : hitDirector(director, point);\n session.target = position ? { group: hit.group, position } : null;\n const preview = position ? previewRect(hit.contentRect, position) : null;\n placeCarrierPreview(session, preview);\n updateUeOverlay({\n pointer: point,\n director,\n active: position,\n preview,\n title: session.panel.title ?? session.panel.id,\n });\n };\n\n const pointerUp = () => finish(true);\n const keyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || !session) return;\n event.preventDefault();\n finish(false);\n };\n const pointerDown = (event: PointerEvent) => {\n if (event.button !== 0 || session) return;\n const target = event.target as Element | null;\n const tab = target?.closest('.dv-tab');\n if (!tab || !host.contains(tab)) return;\n if (target?.closest('.dv-default-tab-action, button, [role=\"button\"]')) return;\n const group = api.groups.find((candidate) => candidate.element.contains(tab));\n if (!group || group.api.location.type !== 'grid') return;\n const panel = panelForTab(group, tab);\n if (!panel) return;\n session = {\n panel,\n originGroup: group,\n originIndex: Math.max(0, group.panels.indexOf(panel)),\n start: { x: event.clientX, y: event.clientY },\n dragging: false,\n target: null,\n carrier: null,\n parkedParent: null,\n parkedNext: null,\n };\n };\n const preventNativeDrag = (event: DragEvent) => {\n if ((event.target as Element | null)?.closest('.dv-tab')) event.preventDefault();\n };\n\n host.addEventListener('pointerdown', pointerDown, true);\n document.addEventListener('pointermove', pointerMove, { capture: true, passive: false });\n document.addEventListener('pointerup', pointerUp, true);\n document.addEventListener('keydown', keyDown, true);\n document.addEventListener('dragstart', preventNativeDrag, true);\n return () => {\n finish(false);\n host.removeEventListener('pointerdown', pointerDown, true);\n document.removeEventListener('pointermove', pointerMove, true);\n document.removeEventListener('pointerup', pointerUp, true);\n document.removeEventListener('keydown', keyDown, true);\n document.removeEventListener('dragstart', preventNativeDrag, true);\n };\n}\n","import { IconButton } from '@forgeax/view-components';\nimport { enableViewTrace, downloadViewTraceTxtFile } from '@forgeax/view-workspace-core/view-trace';\nimport { FileDown } from 'lucide-react';\nimport { useEffect } from 'react';\nimport { useTranslation } from '../i18n';\n\nexport function ViewTraceExportButton() {\n const { t } = useTranslation();\n\n useEffect(() => {\n enableViewTrace();\n }, []);\n\n return (\n <IconButton\n variant=\"quiet\"\n size=\"compact\"\n label={t('view.traceExport')}\n title={t('view.traceExportHint')}\n icon={<FileDown className=\"fx-icon\" aria-hidden />}\n onClick={() => {\n downloadViewTraceTxtFile();\n }}\n />\n );\n}\n","import { IconButton, Tooltip } from '@forgeax/view-components';\nimport { X } from 'lucide-react';\nimport { useEffect, useState, type ReactNode } from 'react';\n\nimport { useTranslation } from '../i18n';\n\nexport function HeaderPersistentStatusTooltip({\n title,\n description,\n action,\n statusAriaLabel,\n resetKey,\n children,\n}: {\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n statusAriaLabel: string;\n /** When this value changes, the banner opens again. */\n resetKey?: string;\n children: ReactNode;\n}) {\n const { t } = useTranslation();\n const [open, setOpen] = useState(true);\n\n useEffect(() => {\n setOpen(true);\n }, [resetKey]);\n\n if (!open) {\n return (\n <div className=\"fx-view-header__connection-status\">\n <Tooltip\n placement=\"bottom\"\n portaled\n title={title}\n description={description}\n >\n <span\n className=\"fx-view-header__status-slot\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={statusAriaLabel}\n tabIndex={0}\n >\n {children}\n </span>\n </Tooltip>\n </div>\n );\n }\n\n return (\n <div className=\"fx-view-header__connection-status\">\n <Tooltip\n open\n placement=\"bottom\"\n portaled\n content={(\n <div className=\"fx-tooltip__content\">\n <div className=\"fx-tooltip__header\">\n <div className=\"fx-tooltip__title\">{title}</div>\n <IconButton\n className=\"fx-tooltip__close\"\n variant=\"quiet\"\n size=\"compact\"\n label={t('view.close')}\n icon={<X className=\"fx-icon\" aria-hidden />}\n onClick={() => setOpen(false)}\n />\n </div>\n {description != null && description !== '' ? (\n <div className=\"fx-tooltip__description\">{description}</div>\n ) : null}\n {action ? <div className=\"fx-tooltip__actions\">{action}</div> : null}\n </div>\n )}\n >\n <span\n className=\"fx-view-header__status-slot\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={statusAriaLabel}\n tabIndex={0}\n >\n {children}\n </span>\n </Tooltip>\n </div>\n );\n}\n","/** Keep tooltip copy friendly; raw bootstrap/network errors belong in the console, not the header. */\nexport function sanitizeHostConnectionDetail(detail?: string): string | undefined {\n const trimmed = detail?.trim();\n if (!trimmed) return undefined;\n if (/unexpected token|<!doctype|not valid json|failed to fetch|networkerror|load failed/i.test(trimmed)) {\n return undefined;\n }\n if (trimmed.length > 120) return `${trimmed.slice(0, 117)}…`;\n return trimmed;\n}\n","import { Button, Tooltip } from '@forgeax/view-components';\nimport { RefreshCw } from 'lucide-react';\nimport { useMemo } from 'react';\n\nimport { useTranslation } from '../i18n';\nimport { sanitizeHostConnectionDetail } from './host-connection-detail';\nimport { HeaderPersistentStatusTooltip } from './header-persistent-status-tooltip';\n\nexport type HostConnectionPhase = 'connecting' | 'connected' | 'unconfigured' | 'disconnected';\n\nexport type HostConnection = {\n phase: HostConnectionPhase;\n detail?: string;\n onReconnect?: () => void;\n reconnectBusy?: boolean;\n};\n\nfunction connectionClasses(phase: HostConnectionPhase) {\n const variant =\n phase === 'disconnected' || phase === 'unconfigured' ? 'failed' : phase;\n return `fx-view-header__status-dot fx-view-header__status-dot--${variant}`;\n}\n\nfunction HostReconnectButton({ connection }: { connection: HostConnection }) {\n const { t } = useTranslation();\n return (\n <Button\n variant=\"secondary\"\n size=\"compact\"\n disabled={connection.reconnectBusy}\n leadingIcon={<RefreshCw className=\"fx-icon\" aria-hidden />}\n onClick={() => connection.onReconnect?.()}\n >\n {connection.reconnectBusy ? t('view.connection.retryBusy') : t('view.connection.retry')}\n </Button>\n );\n}\n\nexport function HostConnectionAnchoredStatus({ connection }: { connection: HostConnection }) {\n const { t } = useTranslation();\n const detail = sanitizeHostConnectionDetail(connection.detail);\n const unconfigured = connection.phase === 'unconfigured';\n const tooltipBody = detail ?? (unconfigured\n ? t('view.connection.unconfigured')\n : t('view.hostConnection.failedHint'));\n const title = unconfigured\n ? t('view.hostConnection.unconfiguredTitle')\n : t('view.hostConnection.notConnected');\n\n return (\n <HeaderPersistentStatusTooltip\n resetKey={`${connection.phase}:${connection.detail ?? ''}`}\n statusAriaLabel={unconfigured ? t('view.hostConnection.unconfiguredTitle') : t('view.hostConnection.failed')}\n title={title}\n description={tooltipBody}\n action={unconfigured ? undefined : <HostReconnectButton connection={connection} />}\n >\n <span className={connectionClasses(connection.phase)} aria-hidden />\n </HeaderPersistentStatusTooltip>\n );\n}\n\nexport function HostConnectionIndicator({ connection }: { connection: HostConnection }) {\n const { t } = useTranslation();\n const { ariaLabel, tooltip } = useMemo(() => {\n const detail = sanitizeHostConnectionDetail(connection.detail);\n switch (connection.phase) {\n case 'connecting':\n return {\n ariaLabel: t('view.hostConnection.connecting'),\n tooltip: {\n title: t('view.hostConnection.connecting'),\n body: t('view.hostConnection.connectingHint'),\n },\n };\n case 'connected':\n return {\n ariaLabel: t('view.hostConnection.connected'),\n tooltip: {\n title: t('view.hostConnection.connected'),\n body: t('view.hostConnection.connectedHint'),\n },\n };\n case 'disconnected':\n return {\n ariaLabel: t('view.hostConnection.failed'),\n tooltip: {\n title: t('view.hostConnection.notConnected'),\n body: detail ?? t('view.hostConnection.failedHint'),\n },\n };\n case 'unconfigured':\n return {\n ariaLabel: t('view.hostConnection.unconfiguredTitle'),\n tooltip: {\n title: t('view.hostConnection.unconfiguredTitle'),\n body: detail ?? t('view.connection.unconfigured'),\n },\n };\n }\n }, [connection.detail, connection.phase, t]);\n\n return (\n <Tooltip\n placement=\"bottom\"\n portaled\n title={tooltip.title}\n description={tooltip.body}\n >\n <span\n className=\"fx-view-header__status-slot\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={ariaLabel}\n tabIndex={0}\n >\n <span className={connectionClasses(connection.phase)} aria-hidden />\n </span>\n </Tooltip>\n );\n}\n","import { Button, Dialog, Field, Text, TextInput } from '@forgeax/view-components';\nimport { RefreshCw } from 'lucide-react';\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, useSyncExternalStore, type FormEvent } from 'react';\n\nimport { VIEW_WORKSPACE_TAB_ID } from '@forgeax/view-workspace-core/contract';\nimport {\n adoptRemoteWorkspaceProject,\n reopenWorkspaceProject,\n navigateToWorkspaceProjectTarget,\n shouldOfferWorkspaceRecovery,\n} from '@forgeax/view-workspace-core/workspace-recovery';\nimport { createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\n\nimport { useTranslation } from '../i18n';\nimport { HeaderPersistentStatusTooltip } from './header-persistent-status-tooltip';\nimport {\n HostConnectionAnchoredStatus,\n HostConnectionIndicator,\n type HostConnection,\n} from './HostConnectionIndicator';\n\nexport type WorkspaceSnapshot = {\n project?: { id?: string; root?: string } | null;\n projectTarget?: { url?: string } | null;\n workspaceTargetLost?: boolean;\n};\n\nexport type WorkspaceRecoveryClient = {\n projectSession?: {\n getSnapshot(): { snapshot: WorkspaceSnapshot; busy: boolean; error: string | null; restoring: boolean };\n subscribe(listener: (value: { snapshot: WorkspaceSnapshot; busy: boolean; error: string | null; restoring: boolean }) => void): () => void;\n open(root: string): Promise<void>;\n reconnect(): Promise<void>;\n reconnectHost?(): Promise<void>;\n };\n subscribe(listener: (state: WorkspaceSnapshot) => void): () => void;\n getState(): Promise<WorkspaceSnapshot>;\n reopenProject(options?: { tabId?: string }): Promise<WorkspaceSnapshot>;\n openProject?(root: string, options?: { tabId?: string }): Promise<WorkspaceSnapshot>;\n listAssets?(projectId: string, options?: { tabId?: string }): Promise<unknown>;\n};\n\nconst EMPTY_PROJECT_SESSION = { snapshot: {}, busy: false, error: null, restoring: false } as const;\n\nexport function useProjectSessionState(client?: WorkspaceRecoveryClient) {\n const session = client?.projectSession;\n const subscribe = useCallback((listener: () => void) => session?.subscribe(listener) ?? (() => {}), [session]);\n const getSnapshot = useCallback(() => session?.getSnapshot() ?? EMPTY_PROJECT_SESSION, [session]);\n return useSyncExternalStore(subscribe, getSnapshot, () => EMPTY_PROJECT_SESSION);\n}\n\nfunction useWorkspaceRecovery(client?: WorkspaceRecoveryClient, { adoptRemote = false } = {}) {\n const reader = useMemo(() => createWorkspaceStateReader(client), [client]);\n const snapshot = (useSyncExternalStore(\n reader.subscribe,\n reader.getSnapshot,\n reader.getSnapshot,\n ) ?? {}) as WorkspaceSnapshot;\n const sessionState = useProjectSessionState(client);\n const [localBusy, setBusy] = useState(false);\n const [localError, setError] = useState<string | null>(null);\n const busy = client?.projectSession ? sessionState.busy : localBusy;\n const error = client?.projectSession ? sessionState.error : localError;\n const [staleTarget, setStaleTarget] = useState(false);\n const [projectRoot, setProjectRoot] = useState('');\n\n useEffect(() => () => reader.dispose(), [reader]);\n\n // A project opened outside this page (for example `view project open`) is\n // adopted here for clients without a projectSession projection; the\n // projectSession path adopts through its own record-preserving navigation.\n // This hook stays mounted while the dialog branch returns null, so the\n // effect still runs after a remote open.\n useEffect(() => {\n if (!adoptRemote || client?.projectSession) return;\n adoptRemoteWorkspaceProject(snapshot);\n }, [adoptRemote, client, snapshot]);\n\n useEffect(() => {\n if (!client || client.projectSession) return;\n if (snapshot.workspaceTargetLost === true) {\n setStaleTarget(false);\n return;\n }\n const projectId = snapshot.project?.id;\n const root = snapshot.project?.root;\n if (!projectId || !root || typeof client.listAssets !== 'function') return;\n let cancelled = false;\n void client\n .listAssets(projectId, { tabId: VIEW_WORKSPACE_TAB_ID })\n .catch((caught) => {\n if (!cancelled && shouldOfferWorkspaceRecovery(caught)) setStaleTarget(true);\n });\n return () => {\n cancelled = true;\n };\n }, [client, snapshot.project?.id, snapshot.project?.root, snapshot.workspaceTargetLost]);\n\n const visible =\n typeof snapshot.project?.root === 'string'\n && (snapshot.workspaceTargetLost === true || staleTarget || (\n snapshot.projectTarget?.url && globalThis.location\n && snapshot.projectTarget.url.split('#')[0] !== globalThis.location.href.split('#')[0]\n ));\n\n const onReconnect = useCallback(async () => {\n if (!client || busy) return;\n if (client.projectSession) { await client.projectSession.reconnect(); return; }\n setBusy(true);\n setError(null);\n try {\n await reopenWorkspaceProject(client, { tabId: VIEW_WORKSPACE_TAB_ID, window: globalThis });\n setStaleTarget(false);\n } catch (caught) {\n const message = caught instanceof Error ? caught.message : String(caught);\n setError(message);\n } finally {\n setBusy(false);\n }\n }, [busy, client]);\n\n const onOpenProject = useCallback((event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (!client?.openProject || busy || !projectRoot.trim()) return;\n if (client.projectSession) { void client.projectSession.open(projectRoot.trim()); return; }\n setBusy(true);\n setError(null);\n void client.openProject(projectRoot.trim(), { tabId: VIEW_WORKSPACE_TAB_ID })\n .then(state => navigateToWorkspaceProjectTarget(state))\n .catch(caught => setError(caught instanceof Error ? caught.message : String(caught)))\n .finally(() => setBusy(false));\n }, [busy, client, projectRoot]);\n\n return {\n snapshot,\n visible,\n busy,\n error,\n restoring: sessionState.restoring,\n projectRoot,\n setProjectRoot,\n onOpenProject,\n onReconnect,\n };\n}\n\nconst PROJECT_OPEN_FORM_ID = 'fx-view-project-open';\n\nexport function WorkspaceProjectRecovery({ client }: { client: WorkspaceRecoveryClient }) {\n const { t } = useTranslation();\n const {\n snapshot,\n visible,\n busy,\n error,\n restoring,\n projectRoot,\n setProjectRoot,\n onOpenProject,\n } = useWorkspaceRecovery(client, { adoptRemote: true });\n const inputRef = useRef<HTMLInputElement>(null);\n const pathId = useId();\n const descriptionId = useId();\n\n if ((restoring && busy && !error) ||\n (snapshot.project?.root && (!error || !visible)) || !client.openProject) return null;\n\n return (\n <Dialog\n open\n dismissible={false}\n className=\"fx-view-project-open\"\n title={t('view.projectOpen.title')}\n initialFocusRef={inputRef}\n footer={(\n <Button\n form={PROJECT_OPEN_FORM_ID}\n type=\"submit\"\n variant=\"primary\"\n loading={busy}\n disabled={busy || !projectRoot.trim()}\n >\n {busy ? t('view.projectOpen.busy') : t('view.projectOpen.action')}\n </Button>\n )}\n >\n <form id={PROJECT_OPEN_FORM_ID} onSubmit={onOpenProject}>\n <Text id={descriptionId} variant=\"body\" tone=\"secondary\">\n {t('view.projectOpen.description')}\n </Text>\n <Field label={t('view.projectOpen.pathLabel')} htmlFor={pathId} error={error}>\n <TextInput\n id={pathId}\n ref={inputRef}\n value={projectRoot}\n placeholder={t('view.projectOpen.pathPlaceholder')}\n autoComplete=\"off\"\n spellCheck={false}\n disabled={busy}\n aria-invalid={error ? true : undefined}\n aria-describedby={descriptionId}\n onChange={(event) => setProjectRoot(event.target.value)}\n />\n </Field>\n </form>\n </Dialog>\n );\n}\n\nexport function HeaderConnectionStatus({\n connection,\n workspaceClient,\n}: {\n connection: HostConnection;\n workspaceClient?: WorkspaceRecoveryClient;\n}) {\n const { t } = useTranslation();\n const { visible, busy, error, restoring, onReconnect } = useWorkspaceRecovery(workspaceClient);\n\n if (connection.phase === 'disconnected' || connection.phase === 'unconfigured') {\n return <HostConnectionAnchoredStatus connection={connection} />;\n }\n\n if (restoring && !error) {\n return (\n <HeaderPersistentStatusTooltip\n resetKey=\"workspace-restoring\"\n statusAriaLabel={t('view.projectRecovery.restoringTitle')}\n title={t('view.projectRecovery.restoringTitle')}\n description={t('view.projectRecovery.restoringDescription')}\n >\n <span className=\"fx-view-header__status-dot fx-view-header__status-dot--connecting\" aria-hidden />\n </HeaderPersistentStatusTooltip>\n );\n }\n\n if (visible || error) {\n const reconnectButton = (\n <Button\n variant=\"secondary\"\n size=\"compact\"\n disabled={busy}\n leadingIcon={<RefreshCw className=\"fx-icon\" aria-hidden />}\n onClick={() => void onReconnect()}\n >\n {busy ? t('view.projectRecovery.busy') : t('view.projectRecovery.action')}\n </Button>\n );\n\n return (\n <HeaderPersistentStatusTooltip\n resetKey={error ?? 'workspace-recovery'}\n statusAriaLabel={t('view.projectRecovery.short')}\n title={error ?? t('view.projectRecovery.short')}\n description={error ? undefined : t('view.projectRecovery.description')}\n action={visible ? reconnectButton : undefined}\n >\n <span className=\"fx-view-header__status-dot fx-view-header__status-dot--failed\" aria-hidden />\n </HeaderPersistentStatusTooltip>\n );\n }\n\n return <HostConnectionIndicator connection={connection} />;\n}\n","import { useEffect, useRef } from 'react';\nimport { ErrorNoticeHost, showErrorNotice } from '@forgeax/view-components';\nimport {\n formatWorkspaceCommandError,\n subscribeWorkspaceCommandErrors,\n} from '@forgeax/view-workspace-core/command-error';\nimport { useTranslation } from '../i18n';\n\nfunction noticeKey(formatted: { code?: string; description: string }, operation?: string) {\n return `${operation ?? ''}|${formatted.code ?? ''}|${formatted.description}`;\n}\n\nfunction formatErrorCopyText(\n formatted: {\n code?: string;\n description: string;\n hint?: string;\n detailsText?: string;\n },\n operation?: string,\n) {\n const lines: string[] = [];\n if (operation) lines.push(`operation: ${operation}`);\n if (formatted.code) lines.push(`code: ${formatted.code}`);\n lines.push(`description: ${formatted.description}`);\n if (formatted.hint) lines.push(`hint: ${formatted.hint}`);\n if (formatted.detailsText) {\n if (lines.length > 0) lines.push('');\n lines.push(formatted.detailsText);\n }\n return lines.join('\\n');\n}\n\nexport function WorkspaceCommandErrorHost() {\n const { t } = useTranslation();\n const openKeys = useRef(new Set<string>());\n\n useEffect(() => {\n return subscribeWorkspaceCommandErrors((error: unknown, context: { operation?: string } = {}) => {\n const formatted = formatWorkspaceCommandError(error);\n const operation = typeof context?.operation === 'string' ? context.operation : undefined;\n const key = noticeKey(formatted, operation);\n if (openKeys.current.has(key)) return;\n openKeys.current.add(key);\n showErrorNotice({\n title: operation\n ? t('view.commandError.titleWithOperation', { operation })\n : t('view.commandError.title'),\n code: formatted.code,\n description: formatted.description,\n hint: formatted.hint,\n details: formatted.detailsText,\n detailsLabel: t('view.commandError.details'),\n copyText: formatErrorCopyText(formatted, operation),\n copyLabel: t('view.commandError.copy'),\n copiedLabel: t('view.commandError.copied'),\n closeLabel: t('view.commandError.close'),\n persistent: true,\n onDismiss: () => {\n openKeys.current.delete(key);\n },\n });\n });\n }, [t]);\n\n return <ErrorNoticeHost />;\n}\n","import {\n DockviewReact,\n themeAbyss,\n type DockviewApi,\n type DockviewReadyEvent,\n type GetTabContextMenuItemsParams,\n type IDockviewDefaultTabProps,\n type IDockviewPanelProps,\n} from 'dockview';\nimport { Box, X } from 'lucide-react';\nimport {\n IconButton,\n MenuDropdown,\n PageTabStrip,\n Text,\n type PageTabItem,\n} from '@forgeax/view-components';\nimport { Moon, Sun } from 'lucide-react';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport 'dockview/dist/styles/dockview.css';\n\nimport { useTheme } from '@forgeax/view-components/theme';\nimport { themeNames } from '@forgeax/view-components/tokens';\nimport { SUPPORTED_LOCALES, useTranslation } from '../i18n';\nimport {\n listOpenablePageTypes,\n readPageTypeTitleRevision,\n resolvePageTypeTitle,\n resolveResourcePageType,\n planResourcePageActivation,\n subscribePageTypeTitles,\n} from '../host/page-registry.mjs';\nimport { slotElementId, VIEW_LAYOUT_HOST_ID } from './slots';\nimport {\n applyDefaultDockTitleHidden,\n DockTitleRestoreButton,\n isDockTitleHidden,\n setDockTitleHidden,\n} from './dock-title';\nimport { reportWorkspaceCommandError } from '@forgeax/view-workspace-core/command-error';\nimport { VIEW_PAGE_TYPES, workspaceError } from '@forgeax/view-workspace-core/contract';\nimport { logResourceOpen, summarizeResourceAsset } from '@forgeax/view-workspace-core/resource-open';\nimport { claimsForPage, refreshDockPanelTitles, reconcileDockPanels } from './panel-reconciler.mjs';\nimport { installUeDockDrag } from './ue-drag/controller';\nimport type { HostConnection } from './HostConnectionIndicator';\nimport { ViewTraceExportButton } from './ViewTraceExportButton';\nimport {\n HeaderConnectionStatus,\n WorkspaceProjectRecovery,\n useProjectSessionState,\n type WorkspaceRecoveryClient,\n} from './WorkspaceProjectRecovery';\nimport { WorkspaceCommandErrorHost } from './WorkspaceCommandErrorHost';\n\ntype SlotClaim = {\n id: string;\n pageType: string;\n titleKey?: string;\n closable?: boolean;\n dockTitleHidden?: boolean;\n activity?: { labelKey?: string; icon?: string };\n layout: {\n dock: 'fill' | 'top' | 'bottom' | 'left' | 'right';\n size?: { value: number; unit: 'px' | 'fraction' };\n stack: 'tabs' | 'split';\n order: number;\n };\n};\n\ntype SlotRegistry = {\n subscribe?: (listener: (claims: SlotClaim[]) => void) => () => void;\n getClaims?: () => SlotClaim[];\n resolve: (id: string) => HTMLElement;\n};\ntype PageType = {\n typeId: string;\n titleKey?: string;\n title?: string;\n order: number;\n closable: boolean;\n singleton: boolean;\n initial: boolean;\n openable: boolean;\n layout: 'dock' | 'surface';\n showPanelRail: boolean;\n hideWhenInactive: boolean;\n resourceSelector?: { kinds: readonly string[] } | { fallback: true };\n priority?: number;\n controller?: {\n getTitle?: () => string | undefined;\n subscribeTitle?: (listener: () => void) => () => void;\n dispose?: () => void;\n };\n};\ntype PageRegistry = {\n subscribe?: (listener: (types: PageType[]) => void) => () => void;\n getTypes?: () => PageType[];\n attach: (typeId: string, anchor: HTMLElement) => unknown;\n};\ntype ResourceOpenRequest = {\n requestId: string;\n sequence?: number;\n asset: { guid?: string; kind: string; name?: string };\n};\ntype PageHost = {\n subscribeResourceOpen?: (listener: (request: ResourceOpenRequest) => void) => () => void;\n};\nconst EMPTY_CLAIMS: SlotClaim[] = [];\nconst EMPTY_PAGE_TYPES: PageType[] = [];\n\nfunction createPageId(typeId: string) {\n return `${typeId}-${crypto.randomUUID()}`;\n}\n\nfunction pageIdFor(pageType: PageType) {\n return pageType.singleton ? `page-${pageType.typeId}` : createPageId(pageType.typeId);\n}\n\nfunction useViewPages(pageTypes: readonly PageType[], titleFor: (type: PageType) => string) {\n const [pages, setPages] = useState<PageTabItem[]>([]);\n const [activePageId, setActivePageId] = useState<string | null>(null);\n const typesById = useMemo(\n () => new Map(pageTypes.map((pageType) => [pageType.typeId, pageType])),\n [pageTypes],\n );\n\n useEffect(() => {\n setPages((current) => {\n const next = current\n .filter((page) => typesById.has(page.typeId))\n .map((page) => {\n const pageType = typesById.get(page.typeId)!;\n return { ...page, title: titleFor(pageType), closable: pageType.closable };\n });\n for (const pageType of pageTypes) {\n if (pageType.initial && !next.some((page) => page.typeId === pageType.typeId)) {\n next.push({\n id: pageIdFor(pageType),\n title: titleFor(pageType),\n typeId: pageType.typeId,\n closable: pageType.closable,\n });\n }\n }\n return next;\n });\n }, [pageTypes, titleFor, typesById]);\n\n useEffect(() => {\n if (pages.some((page) => page.id === activePageId)) return;\n setActivePageId(pages[0]?.id ?? null);\n }, [activePageId, pages]);\n\n const selectPage = useCallback((pageId: string) => {\n setActivePageId(pageId);\n }, []);\n\n const closePage = useCallback(\n (pageId: string) => {\n setPages((current) => {\n const next = current.filter((page) => page.id !== pageId);\n if (activePageId === pageId) {\n const closedIndex = current.findIndex((page) => page.id === pageId);\n const fallback = next[Math.min(closedIndex, next.length - 1)] ?? next[0];\n setActivePageId(fallback?.id ?? null);\n }\n return next;\n });\n },\n [activePageId],\n );\n\n const closeOthers = useCallback((pageId: string) => {\n setPages((current) => current.filter((page) => page.id === pageId || page.closable === false));\n setActivePageId(pageId);\n }, []);\n\n const closeToRight = useCallback((pageId: string) => {\n setPages((current) => {\n const index = current.findIndex((page) => page.id === pageId);\n if (index < 0) return current;\n return current.filter((page, i) => i <= index || page.closable === false);\n });\n }, []);\n\n const reorderPages = useCallback((pageId: string, toIndex: number) => {\n setPages((current) => {\n const fromIndex = current.findIndex((page) => page.id === pageId);\n if (fromIndex < 0 || fromIndex === toIndex) return current;\n const next = [...current];\n const [moved] = next.splice(fromIndex, 1);\n next.splice(toIndex, 0, moved);\n return next;\n });\n }, []);\n\n const openPage = useCallback((typeId: string) => {\n const pageType = typesById.get(typeId);\n const plan = planResourcePageActivation(pages, pageType);\n logResourceOpen('shell-open-page', {\n typeId,\n action: plan.action,\n pageId: 'pageId' in plan ? plan.pageId ?? null : null,\n openable: pageType?.openable === true,\n singleton: pageType?.singleton === true,\n }, { level: plan.action === 'none' ? 'warn' : 'info' });\n if (plan.action === 'focus') {\n setActivePageId(plan.pageId);\n return;\n }\n if (plan.action !== 'open' || !pageType) return;\n const id = plan.pageId ?? pageIdFor(pageType);\n setPages((current) => [\n ...current,\n { id, title: titleFor(pageType), typeId, closable: pageType.closable },\n ]);\n setActivePageId(id);\n }, [pages, titleFor, typesById]);\n\n const activePage = useMemo(\n () => pages.find((page) => page.id === activePageId) ?? null,\n [activePageId, pages],\n );\n\n return {\n pages,\n activePageId,\n activePage,\n selectPage,\n closePage,\n closeOthers,\n closeToRight,\n reorderPages,\n openPage,\n };\n}\ntype DockPanelParams = {\n id: string;\n attach: (id: string) => void;\n titleKey?: string;\n closable?: boolean;\n};\n\nfunction ForgeaxDockTab({\n api,\n containerApi: _containerApi,\n params,\n hideClose,\n closeActionOverride,\n onPointerDown,\n onPointerUp,\n onPointerLeave,\n tabLocation: _tabLocation,\n ...rest\n}: IDockviewDefaultTabProps) {\n const { t } = useTranslation();\n const panelParams = params as DockPanelParams | undefined;\n const tabLabel = panelParams?.titleKey ? t(panelParams.titleKey) : api.title;\n const pinned = panelParams?.closable === false;\n const suppressClose = hideClose ?? pinned;\n return (\n <div\n className=\"dv-default-tab fx-dock-tab\"\n {...rest}\n onPointerDown={onPointerDown}\n onPointerUp={(event) => {\n if (event.button === 1 && !suppressClose) {\n event.preventDefault();\n api.close();\n return;\n }\n onPointerUp?.(event);\n }}\n onPointerLeave={onPointerLeave}\n >\n <Box className=\"fx-dock-tab-icon\" size={13} />\n <div className=\"dv-default-tab-content\">{tabLabel}</div>\n {!suppressClose ? (\n <div\n className=\"dv-default-tab-action\"\n role=\"button\"\n aria-label={t('view.close')}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n if (closeActionOverride) closeActionOverride();\n else api.close();\n }}\n >\n <X size={13} />\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction subscribeRegistry(registry: SlotRegistry, onStoreChange: () => void) {\n if (!registry?.subscribe) return () => {};\n return registry.subscribe(() => onStoreChange());\n}\n\nfunction getClaimsSnapshot(registry: SlotRegistry): SlotClaim[] {\n return registry?.getClaims?.() ?? EMPTY_CLAIMS;\n}\n\nfunction subscribePageRegistry(registry: PageRegistry, onStoreChange: () => void) {\n if (!registry?.subscribe) return () => {};\n return registry.subscribe(() => onStoreChange());\n}\n\nfunction getPageTypesSnapshot(registry: PageRegistry): PageType[] {\n return registry?.getTypes?.() ?? EMPTY_PAGE_TYPES;\n}\n\nfunction DockSlot({ params }: IDockviewPanelProps<DockPanelParams>) {\n const id = params.id;\n useLayoutEffect(() => {\n params.attach(id);\n }, [id, params]);\n return (\n <div className=\"fx-view-dock-panel\">\n <div\n id={slotElementId(id)}\n className=\"fx-view-slot-mount\"\n data-forgeax-view-slot={id}\n />\n <DockTitleRestoreButton />\n </div>\n );\n}\n\nfunction PageSurface({\n pageType,\n pageRegistry,\n active,\n}: {\n pageType: PageType;\n pageRegistry: PageRegistry;\n active: boolean;\n}) {\n const anchorRef = useRef<HTMLDivElement | null>(null);\n useLayoutEffect(() => {\n if (anchorRef.current) pageRegistry.attach(pageType.typeId, anchorRef.current);\n }, [pageRegistry, pageType.typeId]);\n return (\n <div\n ref={anchorRef}\n className={`fx-view-page-mount${active ? ' is-active' : ''}`}\n data-forgeax-view-page={pageType.typeId}\n aria-hidden={!active}\n hidden={!active && pageType.hideWhenInactive}\n />\n );\n}\n\nfunction DockPageWorkbench({\n pageId,\n pageTypeId,\n claims,\n slotRegistry,\n titleForClaim,\n active,\n layoutHostId,\n}: {\n pageId: string;\n pageTypeId: string;\n claims: SlotClaim[];\n slotRegistry: SlotRegistry;\n titleForClaim: (claim: SlotClaim) => string;\n active: boolean;\n layoutHostId?: string;\n}) {\n const { t } = useTranslation();\n const apiRef = useRef<DockviewApi | null>(null);\n const workbenchRef = useRef<HTMLElement | null>(null);\n const ueDragDisposeRef = useRef<(() => void) | null>(null);\n const [layoutReady, setLayoutReady] = useState(false);\n const panelClosableById = useMemo(() => {\n const map = new Map<string, boolean>();\n for (const claim of claims) {\n map.set(claim.id, claim.closable !== false);\n }\n return map;\n }, [claims]);\n const onReady = useCallback((event: DockviewReadyEvent) => {\n apiRef.current = event.api;\n ueDragDisposeRef.current?.();\n if (workbenchRef.current) {\n ueDragDisposeRef.current = installUeDockDrag(event.api, workbenchRef.current);\n }\n setLayoutReady(true);\n }, []);\n useEffect(\n () => () => {\n ueDragDisposeRef.current?.();\n ueDragDisposeRef.current = null;\n },\n [],\n );\n const getTabContextMenuItems = useCallback((params: GetTabContextMenuItemsParams) => {\n const hidden = isDockTitleHidden(params.group.element);\n const targetClosable = panelClosableById.get(params.panel.id) ?? true;\n const hasClosableOthers = params.group.panels.some(\n (panel) => panel.id !== params.panel.id && panelClosableById.get(panel.id) !== false,\n );\n const panelItems = [\n ...(targetClosable\n ? [{\n label: t('view.dock.close'),\n action: () => params.panel.api.close(),\n }]\n : []),\n ...(hasClosableOthers\n ? [{\n label: t('view.dock.closeOthers'),\n action: () => {\n for (const panel of [...params.group.panels]) {\n if (panel.id === params.panel.id) continue;\n if (panelClosableById.get(panel.id) === false) continue;\n panel.api.close();\n }\n },\n }]\n : []),\n ];\n if (params.group.panels.length !== 1) return panelItems;\n const titleBarItems = [{\n label: hidden ? t('view.dock.showTitleBar') : t('view.dock.hideTitleBar'),\n action: () => setDockTitleHidden(params.group.element, !hidden),\n }];\n if (panelItems.length === 0) return titleBarItems;\n return [...titleBarItems, 'separator' as const, ...panelItems];\n }, [panelClosableById, t]);\n useEffect(() => {\n if (!layoutReady) return;\n const api = apiRef.current;\n if (!api) return;\n reconcileDockPanels(api, claims, {\n titleFor: titleForClaim,\n attach: (id: string) => {\n if (getClaimsSnapshot(slotRegistry).some((claim) => claim.id === id)) slotRegistry.resolve(id);\n },\n availableWidth: workbenchRef.current?.clientWidth,\n availableHeight: workbenchRef.current?.clientHeight,\n });\n for (const claim of claims) {\n if (claim.dockTitleHidden !== true) continue;\n const panel = api.getPanel(claim.id);\n applyDefaultDockTitleHidden(panel?.group?.element, true);\n }\n }, [claims, layoutReady, slotRegistry, titleForClaim]);\n useLayoutEffect(() => {\n if (!layoutReady) return;\n const api = apiRef.current;\n if (!api) return;\n refreshDockPanelTitles(api, claims, titleForClaim);\n }, [claims, layoutReady, titleForClaim]);\n return (\n <div\n className={`fx-view-workspace-row${active ? ' is-active' : ''}`}\n data-forgeax-view-dock-page={pageTypeId}\n data-forgeax-view-page-id={pageId}\n aria-hidden={!active}\n inert={!active}\n >\n <main\n ref={workbenchRef}\n id={layoutHostId}\n className=\"fx-view-workbench\"\n data-forgeax-view={layoutHostId ? 'layout-host' : undefined}\n >\n <DockviewReact\n className=\"fx-view-dockview\"\n theme={{ ...themeAbyss, name: 'forgeax-view-abyss', gap: 5 }}\n components={{ slot: DockSlot }}\n defaultTabComponent={ForgeaxDockTab}\n onReady={onReady}\n getTabContextMenuItems={getTabContextMenuItems}\n disableFloatingGroups={false}\n hideBorders\n />\n </main>\n </div>\n );\n}\n\nexport function ViewerShell({\n slotRegistry,\n pageRegistry,\n pageHost,\n hostConnection = { phase: 'connected' },\n workspaceClient,\n selectedPageType,\n onSelectPageType,\n}: {\n slotRegistry: SlotRegistry;\n pageRegistry: PageRegistry;\n pageHost?: PageHost;\n hostConnection?: HostConnection;\n workspaceClient?: WorkspaceRecoveryClient;\n selectedPageType?: string;\n onSelectPageType?: (typeId: string) => void;\n}) {\n const { t, i18n } = useTranslation();\n const { theme, setTheme } = useTheme();\n const projectSession = useProjectSessionState(workspaceClient);\n const claims = useSyncExternalStore(\n (listener) => subscribeRegistry(slotRegistry, listener),\n () => getClaimsSnapshot(slotRegistry),\n () => EMPTY_CLAIMS,\n );\n const pageTypes = useSyncExternalStore(\n (listener) => subscribePageRegistry(pageRegistry, listener),\n () => getPageTypesSnapshot(pageRegistry),\n () => EMPTY_PAGE_TYPES,\n );\n const subscribeTitles = useCallback(\n (listener: () => void) => subscribePageTypeTitles(pageTypes, listener),\n [pageTypes],\n );\n const getTitleRevision = useCallback(\n () => readPageTypeTitleRevision(pageTypes),\n [pageTypes],\n );\n const pageTitleRevision = useSyncExternalStore(subscribeTitles, getTitleRevision, getTitleRevision);\n const titleForPageType = useCallback(\n (pageType: PageType) => resolvePageTypeTitle(pageType, t),\n [pageTitleRevision, t],\n );\n const {\n pages,\n activePageId,\n activePage,\n selectPage: selectLocalPage,\n closePage,\n closeOthers,\n closeToRight,\n reorderPages,\n openPage,\n } = useViewPages(pageTypes, titleForPageType);\n const openPageRef = useRef(openPage);\n openPageRef.current = openPage;\n const pageTypesRef = useRef(pageTypes);\n pageTypesRef.current = pageTypes;\n const handledOpenRequest = useRef<{ requestId: string; sequence: number; ok: boolean } | null>(null);\n useEffect(() => {\n if (!pageHost) return undefined;\n if (!pageHost.subscribeResourceOpen) {\n logResourceOpen('shell-open-listener-skipped', {\n reason: 'subscribe-resource-open-missing',\n }, { level: 'warn' });\n return undefined;\n }\n return pageHost.subscribeResourceOpen((request) => {\n const previous = handledOpenRequest.current;\n const sequence = request.sequence ?? 0;\n if (previous?.requestId === request.requestId && previous.sequence === sequence && previous.ok) {\n logResourceOpen('shell-open-duplicate-skipped', {\n requestId: request.requestId,\n sequence,\n });\n return;\n }\n const resolved = resolveResourcePageType(pageTypesRef.current, request.asset);\n if (!resolved.ok) {\n handledOpenRequest.current = { requestId: request.requestId, sequence, ok: false };\n logResourceOpen('shell-resolve-failed', {\n requestId: request.requestId,\n sequence,\n asset: summarizeResourceAsset(request.asset),\n error: resolved.error?.code ?? null,\n pageTypeCount: pageTypesRef.current.length,\n selectorCount: pageTypesRef.current.filter((pageType) => pageType.resourceSelector).length,\n }, { level: 'warn' });\n if (pageTypesRef.current.some((pageType) => pageType.resourceSelector)) {\n reportWorkspaceCommandError(\n workspaceError(\n resolved.error.code,\n resolved.error.expected,\n resolved.error.hint,\n resolved.error.detail,\n ),\n { operation: 'asset.open' },\n );\n }\n return;\n }\n handledOpenRequest.current = { requestId: request.requestId, sequence, ok: true };\n logResourceOpen('shell-resolve-ok', {\n requestId: request.requestId,\n sequence,\n asset: summarizeResourceAsset(request.asset),\n pageType: resolved.pageType.typeId,\n });\n openPageRef.current(resolved.pageType.typeId);\n });\n }, [pageHost, pageTypes]);\n const requestedPageId = pages.find(page => page.typeId === selectedPageType)?.id;\n useEffect(() => {\n if (requestedPageId) selectLocalPage(requestedPageId);\n }, [requestedPageId, selectLocalPage]);\n const selectPage = (pageId: string) => {\n selectLocalPage(pageId);\n const page = pages.find(page => page.id === pageId);\n if (page) onSelectPageType?.(page.typeId);\n };\n const openDockPages = useMemo(\n () => pages.filter((page) => pageTypes.find((pageType) => pageType.typeId === page.typeId)?.layout === 'dock'),\n [pageTypes, pages],\n );\n const openSurfacePageTypes = useMemo(\n () =>\n pageTypes.filter(\n (pageType) =>\n pageType.layout === 'surface' &&\n pages.some((page) => page.typeId === pageType.typeId),\n ),\n [pageTypes, pages],\n );\n const openablePageTypes = useMemo(\n () => (listOpenablePageTypes(pageTypes, pages) as PageType[])\n .map((pageType) => ({ typeId: pageType.typeId, title: titleForPageType(pageType) })),\n [pageTypes, pages, titleForPageType],\n );\n const titleForClaim = useCallback(\n (claim: SlotClaim) => (claim.titleKey ? t(claim.titleKey) : claim.id),\n [i18n.language, t],\n );\n\n useEffect(() => {\n const root = globalThis.document?.documentElement;\n if (!root?.dataset) return undefined;\n if (activePage?.typeId) root.dataset.forgeaxViewActivePage = activePage.typeId;\n else delete root.dataset.forgeaxViewActivePage;\n return () => {\n if (root.dataset.forgeaxViewActivePage === activePage?.typeId) {\n delete root.dataset.forgeaxViewActivePage;\n }\n };\n }, [activePage?.typeId]);\n\n const pageTabLabels = useMemo(\n () => ({\n tabList: t('view.pageTabs.openPages'),\n newPage: t('view.pageTabs.newPage'),\n allPages: t('view.pageTabs.allPages'),\n noOpenableTypes: t('view.pageTabs.noOpenableTypes'),\n closeTab: t('view.pageTabs.closeTab'),\n contextClose: t('view.pageTabs.context.close'),\n contextCloseOthers: t('view.pageTabs.context.closeOthers'),\n contextCloseToRight: t('view.pageTabs.context.closeToRight'),\n }),\n [t],\n );\n\n return (\n <div className=\"fx-view-app\" data-forgeax-view=\"shell\">\n {!projectSession.restoring && <WorkspaceCommandErrorHost />}\n <header className=\"fx-view-header\">\n <div className=\"fx-view-brand\">\n <Text as=\"strong\" variant=\"caption\" tone=\"primary\">ForgeaX View</Text>\n </div>\n <div className=\"fx-view-header__prefs\">\n <ViewTraceExportButton />\n <HeaderConnectionStatus connection={hostConnection} workspaceClient={workspaceClient} />\n <MenuDropdown\n label={t('view.theme')}\n align=\"end\"\n items={themeNames.map((name) => ({\n id: name,\n label: name === 'light' ? t('view.themeLight') : t('view.themeDark'),\n selected: theme === name,\n onSelect: () => setTheme(name),\n }))}\n trigger={(\n <IconButton\n variant=\"quiet\"\n size=\"compact\"\n label={t('view.theme')}\n icon={theme === 'light' ? <Sun className=\"fx-icon\" /> : <Moon className=\"fx-icon\" />}\n />\n )}\n />\n <MenuDropdown\n label={t('view.language')}\n align=\"end\"\n items={SUPPORTED_LOCALES.map((locale) => ({\n id: locale.code,\n label: locale.nativeLabel,\n selected: i18n.language === locale.code,\n onSelect: () => i18n.changeLanguage(locale.code),\n }))}\n trigger={(\n <IconButton\n variant=\"quiet\"\n size=\"compact\"\n label={t('view.language')}\n icon={(\n <span className=\"fx-locale-trigger\" aria-hidden>\n {t(`view.localeShort.${i18n.language}`)}\n </span>\n )}\n />\n )}\n />\n </div>\n </header>\n {workspaceClient ? <WorkspaceProjectRecovery client={workspaceClient} /> : null}\n {projectSession.restoring ? (\n <main className=\"fx-view-project-restoring\" role=\"status\" aria-live=\"polite\">\n <Text as=\"strong\" variant=\"heading\" tone=\"primary\">{t('view.projectRecovery.restoringTitle')}</Text>\n <Text variant=\"body\" tone=\"secondary\">{t('view.projectRecovery.restoringDescription')}</Text>\n </main>\n ) : (<>\n <PageTabStrip\n pages={pages}\n activePageId={activePageId}\n onSelect={selectPage}\n onClose={closePage}\n onCloseOthers={closeOthers}\n onCloseToRight={closeToRight}\n onReorder={reorderPages}\n newPageTypes={openablePageTypes}\n onNewPage={openPage}\n labels={pageTabLabels}\n />\n <div className=\"fx-view-main-col\">\n {openDockPages.map((page) => (\n <DockPageWorkbench\n key={page.id}\n pageId={page.id}\n pageTypeId={page.typeId}\n claims={claimsForPage(claims, page.typeId)}\n slotRegistry={slotRegistry}\n titleForClaim={titleForClaim}\n active={page.id === activePageId}\n layoutHostId={page.typeId === VIEW_PAGE_TYPES.editor ? VIEW_LAYOUT_HOST_ID : undefined}\n />\n ))}\n {openSurfacePageTypes.map((pageType) => (\n <PageSurface\n key={pageType.typeId}\n pageType={pageType}\n pageRegistry={pageRegistry}\n active={activePage?.typeId === pageType.typeId}\n />\n ))}\n </div>\n </>)}\n </div>\n );\n}\n","import { ThemeProvider, initializeTheme } from '@forgeax/view-components/theme';\nimport { OverlayRootProvider } from '@forgeax/view-components';\nimport { StrictMode } from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport { createViewPanelHost } from './host/panel-bridge.mjs';\nimport { createViewPageHost, createViewPageTypeRegistry } from './host/page-registry.mjs';\nimport { mountViewViewer } from './host/frontend.mjs';\nimport { createViewSlotRegistry } from './host/slot-registry.mjs';\nimport { initI18n, t } from './i18n';\nimport type { HostConnection } from './shell/HostConnectionIndicator';\nimport { createBrowserConnection } from './plugins/browser-connection.mjs';\nimport { ViewerShell } from './shell/ViewerShell';\nimport type { WorkspaceRecoveryClient } from './shell/WorkspaceProjectRecovery';\nimport '@forgeax/view-components/styles.css';\nimport './styles.css';\nimport { restoreProjectPreferences } from '@forgeax/view-workspace-core/project-session';\n\nrestoreProjectPreferences();\ninitI18n();\n\nconst bootTheme = initializeTheme('light');\n\ndeclare global {\n interface Window {\n __forgeaxViewSlotRegistry?: ReturnType<typeof createViewSlotRegistry>;\n __forgeaxViewPanelsPromise?: Promise<unknown>;\n __forgeaxViewPanelsUrl?: string;\n __forgeaxViewReady?: { mounted?: unknown; error?: string; unconfigured?: boolean; reason?: string };\n }\n}\n\nconst root = document.getElementById('root');\nif (!root) throw new Error('ForgeaX View viewer requires #root');\n\nwindow.__forgeaxViewSlotRegistry = createViewSlotRegistry(document);\nconst pageRegistry = createViewPageTypeRegistry();\nconst pageHost = createViewPageHost({ registry: pageRegistry });\nconst panelHost = createViewPanelHost({\n registry: window.__forgeaxViewSlotRegistry,\n overlayRoot: root,\n});\nconst useUiDebugFallback = import.meta.env.MODE === 'ui-debug';\n\nlet workspaceClient: WorkspaceRecoveryClient | undefined;\nlet hostConnection: HostConnection = { phase: 'connecting', onReconnect: startConnection };\n\nif (import.meta.env.PROD) {\n window.__forgeaxViewPanelsUrl = '/panels.js';\n} else {\n window.__forgeaxViewPanelsPromise = import('./panels-entry');\n}\n\nconst appRoot = createRoot(root);\n\nfunction connectionFailureMessage(error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n if (/unexpected token.*<|not valid json/i.test(message)) {\n return t('view.connection.errors.invalidBootstrap');\n }\n if (/failed to fetch|networkerror|load failed/i.test(message)) {\n return t('view.connection.errors.network');\n }\n return message;\n}\n\nfunction setHostConnection(patch: Partial<HostConnection>) {\n hostConnection = {\n ...hostConnection,\n ...patch,\n onReconnect: startConnection,\n };\n renderApp();\n}\n\nfunction renderApp() {\n appRoot.render(\n <StrictMode><OverlayRootProvider root={root!}>\n <ThemeProvider defaultTheme={bootTheme} persist applyToDocument className=\"fx-view-root\">\n <ViewerShell\n slotRegistry={window.__forgeaxViewSlotRegistry!}\n pageRegistry={pageRegistry}\n pageHost={pageHost}\n workspaceClient={workspaceClient}\n hostConnection={hostConnection}\n />\n </ThemeProvider>\n </OverlayRootProvider></StrictMode>,\n );\n}\n\nasync function connectToHost(signal: AbortSignal) {\n delete window.__forgeaxViewReady;\n setHostConnection({ phase: 'connecting', detail: undefined, reconnectBusy: true });\n\n let config: {\n configured?: boolean;\n reason?: string;\n frontendEndpoint?: string;\n token?: string;\n frontendTicket?: string;\n };\n try {\n const response = await fetch('/__forgeax/view/bootstrap', { cache: 'no-store', signal });\n if (!response.ok) throw new Error(`View bootstrap failed (${response.status})`);\n config = await response.json();\n } catch (error) {\n if (signal.aborted) return;\n if (!useUiDebugFallback) throw error;\n const { mountViewDevFallback } = await import('./dev-fallback');\n const mounted = await mountViewDevFallback({ panelHost, pageHost, document });\n window.__forgeaxViewReady = {\n mounted,\n unconfigured: true,\n reason: connectionFailureMessage(error),\n };\n setHostConnection({\n phase: 'unconfigured',\n detail: connectionFailureMessage(error),\n reconnectBusy: false,\n });\n return;\n }\n if (signal.aborted) return;\n if (config.configured === false) {\n if (useUiDebugFallback) {\n const { mountViewDevFallback } = await import('./dev-fallback');\n const mounted = await mountViewDevFallback({ panelHost, pageHost, document });\n window.__forgeaxViewReady = {\n mounted,\n unconfigured: true,\n reason: config.reason ?? t('view.connection.unconfigured'),\n };\n setHostConnection({\n phase: 'unconfigured',\n detail: config.reason ?? t('view.connection.unconfigured'),\n reconnectBusy: false,\n });\n return;\n }\n const message = config.reason || t('view.connection.unconfigured');\n window.__forgeaxViewReady = { mounted: [], unconfigured: true, reason: message };\n setHostConnection({ phase: 'unconfigured', detail: message, reconnectBusy: false });\n return;\n }\n const mounted = await mountViewViewer({\n embedded: false,\n endpoint: config.frontendEndpoint,\n token: config.token,\n frontendTicket: config.frontendTicket,\n document,\n window: globalThis,\n resourceBrowser: true,\n viewSlotRegistry: window.__forgeaxViewSlotRegistry,\n panelHost,\n pageRegistry,\n pageHost,\n });\n return mounted;\n}\n\nfunction startConnection() {\n connection.reconnect();\n}\n\nrenderApp();\nconst connection = createBrowserConnection({\n connect: connectToHost,\n onChange: (value: HostConnection & { session?: Awaited<ReturnType<typeof mountViewViewer>> }) => {\n workspaceClient = value.session?.frontendHost.context.get('viewOperationClient') as WorkspaceRecoveryClient | undefined;\n if (value.session) window.__forgeaxViewReady = { mounted: value.session };\n if (value.detail) window.__forgeaxViewReady = { error: connectionFailureMessage(new Error(value.detail)) };\n const detail = value.detail ?? (value.phase === 'unconfigured' ? window.__forgeaxViewReady?.reason : undefined);\n setHostConnection({ ...value, detail: detail ? connectionFailureMessage(new Error(detail)) : undefined });\n },\n});\nwindow.addEventListener('pagehide', () => { void connection.dispose(); }, { once: true });\n"],"file":"main-C-2CHTN_.js"}