@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.
- package/CHANGELOG.md +11 -0
- package/README.md +742 -0
- package/dist/modules/backend.mjs +54 -0
- package/dist/modules/backend.mjs.map +7 -0
- package/dist/modules/browser.mjs +180 -0
- package/dist/modules/browser.mjs.map +7 -0
- package/dist/modules/carrier-contract.mjs +38 -0
- package/dist/modules/carrier-contract.mjs.map +7 -0
- package/dist/modules/carrier.mjs +13 -0
- package/dist/modules/carrier.mjs.map +7 -0
- package/dist/modules/chunks/chunk-2ASWB6IX.mjs +225 -0
- package/dist/modules/chunks/chunk-2ASWB6IX.mjs.map +7 -0
- package/dist/modules/chunks/chunk-2IJKOG2F.mjs +801 -0
- package/dist/modules/chunks/chunk-2IJKOG2F.mjs.map +7 -0
- package/dist/modules/chunks/chunk-2K3BBJ5S.mjs +9 -0
- package/dist/modules/chunks/chunk-2K3BBJ5S.mjs.map +7 -0
- package/dist/modules/chunks/chunk-32GD5LL6.mjs +482 -0
- package/dist/modules/chunks/chunk-32GD5LL6.mjs.map +7 -0
- package/dist/modules/chunks/chunk-3B4KFAEC.mjs +10 -0
- package/dist/modules/chunks/chunk-3B4KFAEC.mjs.map +7 -0
- package/dist/modules/chunks/chunk-46O5WX43.mjs +25 -0
- package/dist/modules/chunks/chunk-46O5WX43.mjs.map +7 -0
- package/dist/modules/chunks/chunk-47J5JXAB.mjs +237 -0
- package/dist/modules/chunks/chunk-47J5JXAB.mjs.map +7 -0
- package/dist/modules/chunks/chunk-4BXQOUDQ.mjs +17 -0
- package/dist/modules/chunks/chunk-4BXQOUDQ.mjs.map +7 -0
- package/dist/modules/chunks/chunk-4GQWYU2V.mjs +126 -0
- package/dist/modules/chunks/chunk-4GQWYU2V.mjs.map +7 -0
- package/dist/modules/chunks/chunk-4N5X2PRQ.mjs +48 -0
- package/dist/modules/chunks/chunk-4N5X2PRQ.mjs.map +7 -0
- package/dist/modules/chunks/chunk-4WXD2KYX.mjs +56 -0
- package/dist/modules/chunks/chunk-4WXD2KYX.mjs.map +7 -0
- package/dist/modules/chunks/chunk-6ZWWVAZK.mjs +468 -0
- package/dist/modules/chunks/chunk-6ZWWVAZK.mjs.map +7 -0
- package/dist/modules/chunks/chunk-73UZNRHN.mjs +296 -0
- package/dist/modules/chunks/chunk-73UZNRHN.mjs.map +7 -0
- package/dist/modules/chunks/chunk-7ITLCRND.mjs +10 -0
- package/dist/modules/chunks/chunk-7ITLCRND.mjs.map +7 -0
- package/dist/modules/chunks/chunk-7TGVWKH7.mjs +59 -0
- package/dist/modules/chunks/chunk-7TGVWKH7.mjs.map +7 -0
- package/dist/modules/chunks/chunk-7URFF53W.mjs +42 -0
- package/dist/modules/chunks/chunk-7URFF53W.mjs.map +7 -0
- package/dist/modules/chunks/chunk-7YSDRIFN.mjs +14 -0
- package/dist/modules/chunks/chunk-7YSDRIFN.mjs.map +7 -0
- package/dist/modules/chunks/chunk-AAFVCQPK.mjs +52 -0
- package/dist/modules/chunks/chunk-AAFVCQPK.mjs.map +7 -0
- package/dist/modules/chunks/chunk-AEK7ZESQ.mjs +18 -0
- package/dist/modules/chunks/chunk-AEK7ZESQ.mjs.map +7 -0
- package/dist/modules/chunks/chunk-AL6ZWIEU.mjs +42 -0
- package/dist/modules/chunks/chunk-AL6ZWIEU.mjs.map +7 -0
- package/dist/modules/chunks/chunk-ALT7XVMQ.mjs +73 -0
- package/dist/modules/chunks/chunk-ALT7XVMQ.mjs.map +7 -0
- package/dist/modules/chunks/chunk-ASI2HBE6.mjs +116 -0
- package/dist/modules/chunks/chunk-ASI2HBE6.mjs.map +7 -0
- package/dist/modules/chunks/chunk-ATWGCH7I.mjs +174 -0
- package/dist/modules/chunks/chunk-ATWGCH7I.mjs.map +7 -0
- package/dist/modules/chunks/chunk-C45U6IIY.mjs +692 -0
- package/dist/modules/chunks/chunk-C45U6IIY.mjs.map +7 -0
- package/dist/modules/chunks/chunk-C7R3YRA7.mjs +98 -0
- package/dist/modules/chunks/chunk-C7R3YRA7.mjs.map +7 -0
- package/dist/modules/chunks/chunk-CRMICXKN.mjs +87 -0
- package/dist/modules/chunks/chunk-CRMICXKN.mjs.map +7 -0
- package/dist/modules/chunks/chunk-CUH2G6UF.mjs +81 -0
- package/dist/modules/chunks/chunk-CUH2G6UF.mjs.map +7 -0
- package/dist/modules/chunks/chunk-D7GWRZLL.mjs +77 -0
- package/dist/modules/chunks/chunk-D7GWRZLL.mjs.map +7 -0
- package/dist/modules/chunks/chunk-DBWUIBE3.mjs +10 -0
- package/dist/modules/chunks/chunk-DBWUIBE3.mjs.map +7 -0
- package/dist/modules/chunks/chunk-DQWVWWUU.mjs +77 -0
- package/dist/modules/chunks/chunk-DQWVWWUU.mjs.map +7 -0
- package/dist/modules/chunks/chunk-DZZ2WFEU.mjs +122 -0
- package/dist/modules/chunks/chunk-DZZ2WFEU.mjs.map +7 -0
- package/dist/modules/chunks/chunk-E4UIAN26.mjs +58 -0
- package/dist/modules/chunks/chunk-E4UIAN26.mjs.map +7 -0
- package/dist/modules/chunks/chunk-EJGBVKFE.mjs +77 -0
- package/dist/modules/chunks/chunk-EJGBVKFE.mjs.map +7 -0
- package/dist/modules/chunks/chunk-EPSTTHWV.mjs +173 -0
- package/dist/modules/chunks/chunk-EPSTTHWV.mjs.map +7 -0
- package/dist/modules/chunks/chunk-ER7T6QJ3.mjs +64 -0
- package/dist/modules/chunks/chunk-ER7T6QJ3.mjs.map +7 -0
- package/dist/modules/chunks/chunk-FD4BAJ6K.mjs +389 -0
- package/dist/modules/chunks/chunk-FD4BAJ6K.mjs.map +7 -0
- package/dist/modules/chunks/chunk-FJM6WWIY.mjs +80 -0
- package/dist/modules/chunks/chunk-FJM6WWIY.mjs.map +7 -0
- package/dist/modules/chunks/chunk-FKCQYDLX.mjs +162 -0
- package/dist/modules/chunks/chunk-FKCQYDLX.mjs.map +7 -0
- package/dist/modules/chunks/chunk-FLGC65SR.mjs +10 -0
- package/dist/modules/chunks/chunk-FLGC65SR.mjs.map +7 -0
- package/dist/modules/chunks/chunk-FMCACPX5.mjs +289 -0
- package/dist/modules/chunks/chunk-FMCACPX5.mjs.map +7 -0
- package/dist/modules/chunks/chunk-FOBRLUQV.mjs +51 -0
- package/dist/modules/chunks/chunk-FOBRLUQV.mjs.map +7 -0
- package/dist/modules/chunks/chunk-FV3DSKZB.mjs +33 -0
- package/dist/modules/chunks/chunk-FV3DSKZB.mjs.map +7 -0
- package/dist/modules/chunks/chunk-G7BAFAGO.mjs +98 -0
- package/dist/modules/chunks/chunk-G7BAFAGO.mjs.map +7 -0
- package/dist/modules/chunks/chunk-GQBZMCTK.mjs +145 -0
- package/dist/modules/chunks/chunk-GQBZMCTK.mjs.map +7 -0
- package/dist/modules/chunks/chunk-GYWIY7AL.mjs +131 -0
- package/dist/modules/chunks/chunk-GYWIY7AL.mjs.map +7 -0
- package/dist/modules/chunks/chunk-H3KNBALD.mjs +256 -0
- package/dist/modules/chunks/chunk-H3KNBALD.mjs.map +7 -0
- package/dist/modules/chunks/chunk-H3M22JDL.mjs +144 -0
- package/dist/modules/chunks/chunk-H3M22JDL.mjs.map +7 -0
- package/dist/modules/chunks/chunk-HES3DNTM.mjs +40 -0
- package/dist/modules/chunks/chunk-HES3DNTM.mjs.map +7 -0
- package/dist/modules/chunks/chunk-I5BFP7SS.mjs +2392 -0
- package/dist/modules/chunks/chunk-I5BFP7SS.mjs.map +7 -0
- package/dist/modules/chunks/chunk-IGRMZYRD.mjs +15 -0
- package/dist/modules/chunks/chunk-IGRMZYRD.mjs.map +7 -0
- package/dist/modules/chunks/chunk-IKNGC766.mjs +321 -0
- package/dist/modules/chunks/chunk-IKNGC766.mjs.map +7 -0
- package/dist/modules/chunks/chunk-IVHNYKZB.mjs +35 -0
- package/dist/modules/chunks/chunk-IVHNYKZB.mjs.map +7 -0
- package/dist/modules/chunks/chunk-JHOURMYW.mjs +101 -0
- package/dist/modules/chunks/chunk-JHOURMYW.mjs.map +7 -0
- package/dist/modules/chunks/chunk-JURXMRFA.mjs +282 -0
- package/dist/modules/chunks/chunk-JURXMRFA.mjs.map +7 -0
- package/dist/modules/chunks/chunk-JWZIREC3.mjs +18 -0
- package/dist/modules/chunks/chunk-JWZIREC3.mjs.map +7 -0
- package/dist/modules/chunks/chunk-KHRTIZ56.mjs +1400 -0
- package/dist/modules/chunks/chunk-KHRTIZ56.mjs.map +7 -0
- package/dist/modules/chunks/chunk-KLJZZ23J.mjs +102 -0
- package/dist/modules/chunks/chunk-KLJZZ23J.mjs.map +7 -0
- package/dist/modules/chunks/chunk-KNBAYU5I.mjs +49 -0
- package/dist/modules/chunks/chunk-KNBAYU5I.mjs.map +7 -0
- package/dist/modules/chunks/chunk-KSZNCFU4.mjs +125 -0
- package/dist/modules/chunks/chunk-KSZNCFU4.mjs.map +7 -0
- package/dist/modules/chunks/chunk-L45W6KM6.mjs +158 -0
- package/dist/modules/chunks/chunk-L45W6KM6.mjs.map +7 -0
- package/dist/modules/chunks/chunk-LERMYZRC.mjs +239 -0
- package/dist/modules/chunks/chunk-LERMYZRC.mjs.map +7 -0
- package/dist/modules/chunks/chunk-LKJCXYSJ.mjs +91 -0
- package/dist/modules/chunks/chunk-LKJCXYSJ.mjs.map +7 -0
- package/dist/modules/chunks/chunk-MBS3EICT.mjs +25 -0
- package/dist/modules/chunks/chunk-MBS3EICT.mjs.map +7 -0
- package/dist/modules/chunks/chunk-MUOQZPVH.mjs +609 -0
- package/dist/modules/chunks/chunk-MUOQZPVH.mjs.map +7 -0
- package/dist/modules/chunks/chunk-MVEPGFSB.mjs +1 -0
- package/dist/modules/chunks/chunk-MVEPGFSB.mjs.map +7 -0
- package/dist/modules/chunks/chunk-NBJKLWJ5.mjs +42 -0
- package/dist/modules/chunks/chunk-NBJKLWJ5.mjs.map +7 -0
- package/dist/modules/chunks/chunk-NBLGKTEM.mjs +86 -0
- package/dist/modules/chunks/chunk-NBLGKTEM.mjs.map +7 -0
- package/dist/modules/chunks/chunk-NI7CS3I2.mjs +110 -0
- package/dist/modules/chunks/chunk-NI7CS3I2.mjs.map +7 -0
- package/dist/modules/chunks/chunk-NJH2OJFC.mjs +2113 -0
- package/dist/modules/chunks/chunk-NJH2OJFC.mjs.map +7 -0
- package/dist/modules/chunks/chunk-OBK4LIJB.mjs +20 -0
- package/dist/modules/chunks/chunk-OBK4LIJB.mjs.map +7 -0
- package/dist/modules/chunks/chunk-PEUT3FW7.mjs +1 -0
- package/dist/modules/chunks/chunk-PEUT3FW7.mjs.map +7 -0
- package/dist/modules/chunks/chunk-PRZOWPDN.mjs +66 -0
- package/dist/modules/chunks/chunk-PRZOWPDN.mjs.map +7 -0
- package/dist/modules/chunks/chunk-Q4RXBGQS.mjs +55 -0
- package/dist/modules/chunks/chunk-Q4RXBGQS.mjs.map +7 -0
- package/dist/modules/chunks/chunk-QBHBKOIL.mjs +55 -0
- package/dist/modules/chunks/chunk-QBHBKOIL.mjs.map +7 -0
- package/dist/modules/chunks/chunk-QD6CCRMG.mjs +20 -0
- package/dist/modules/chunks/chunk-QD6CCRMG.mjs.map +7 -0
- package/dist/modules/chunks/chunk-QF4V23GW.mjs +39 -0
- package/dist/modules/chunks/chunk-QF4V23GW.mjs.map +7 -0
- package/dist/modules/chunks/chunk-QK6W7MJO.mjs +42 -0
- package/dist/modules/chunks/chunk-QK6W7MJO.mjs.map +7 -0
- package/dist/modules/chunks/chunk-QL7V6DK7.mjs +34 -0
- package/dist/modules/chunks/chunk-QL7V6DK7.mjs.map +7 -0
- package/dist/modules/chunks/chunk-QLBQQKRI.mjs +25 -0
- package/dist/modules/chunks/chunk-QLBQQKRI.mjs.map +7 -0
- package/dist/modules/chunks/chunk-QLZQGZDC.mjs +418 -0
- package/dist/modules/chunks/chunk-QLZQGZDC.mjs.map +7 -0
- package/dist/modules/chunks/chunk-QSKQZGK7.mjs +1625 -0
- package/dist/modules/chunks/chunk-QSKQZGK7.mjs.map +7 -0
- package/dist/modules/chunks/chunk-QURKBAG4.mjs +25 -0
- package/dist/modules/chunks/chunk-QURKBAG4.mjs.map +7 -0
- package/dist/modules/chunks/chunk-R274XBEH.mjs +53 -0
- package/dist/modules/chunks/chunk-R274XBEH.mjs.map +7 -0
- package/dist/modules/chunks/chunk-R4I4JEY5.mjs +77 -0
- package/dist/modules/chunks/chunk-R4I4JEY5.mjs.map +7 -0
- package/dist/modules/chunks/chunk-RR6L6VVR.mjs +9 -0
- package/dist/modules/chunks/chunk-RR6L6VVR.mjs.map +7 -0
- package/dist/modules/chunks/chunk-RXF7SBBZ.mjs +125 -0
- package/dist/modules/chunks/chunk-RXF7SBBZ.mjs.map +7 -0
- package/dist/modules/chunks/chunk-SR66S6EJ.mjs +138 -0
- package/dist/modules/chunks/chunk-SR66S6EJ.mjs.map +7 -0
- package/dist/modules/chunks/chunk-SSQMQJ52.mjs +27 -0
- package/dist/modules/chunks/chunk-SSQMQJ52.mjs.map +7 -0
- package/dist/modules/chunks/chunk-TP26TASL.mjs +20 -0
- package/dist/modules/chunks/chunk-TP26TASL.mjs.map +7 -0
- package/dist/modules/chunks/chunk-TSAEK5P3.mjs +50 -0
- package/dist/modules/chunks/chunk-TSAEK5P3.mjs.map +7 -0
- package/dist/modules/chunks/chunk-UAY27HT3.mjs +68 -0
- package/dist/modules/chunks/chunk-UAY27HT3.mjs.map +7 -0
- package/dist/modules/chunks/chunk-UDLIWGWS.mjs +103 -0
- package/dist/modules/chunks/chunk-UDLIWGWS.mjs.map +7 -0
- package/dist/modules/chunks/chunk-UDVQHPWV.mjs +89 -0
- package/dist/modules/chunks/chunk-UDVQHPWV.mjs.map +7 -0
- package/dist/modules/chunks/chunk-UM23W3G7.mjs +237 -0
- package/dist/modules/chunks/chunk-UM23W3G7.mjs.map +7 -0
- package/dist/modules/chunks/chunk-VDZJWEAA.mjs +214 -0
- package/dist/modules/chunks/chunk-VDZJWEAA.mjs.map +7 -0
- package/dist/modules/chunks/chunk-VIGOJWSO.mjs +42 -0
- package/dist/modules/chunks/chunk-VIGOJWSO.mjs.map +7 -0
- package/dist/modules/chunks/chunk-VY3S5BWI.mjs +284 -0
- package/dist/modules/chunks/chunk-VY3S5BWI.mjs.map +7 -0
- package/dist/modules/chunks/chunk-VZXGRZYU.mjs +47 -0
- package/dist/modules/chunks/chunk-VZXGRZYU.mjs.map +7 -0
- package/dist/modules/chunks/chunk-W5DMQZB5.mjs +42 -0
- package/dist/modules/chunks/chunk-W5DMQZB5.mjs.map +7 -0
- package/dist/modules/chunks/chunk-WOMHSTVZ.mjs +918 -0
- package/dist/modules/chunks/chunk-WOMHSTVZ.mjs.map +7 -0
- package/dist/modules/chunks/chunk-XFQT7XCG.mjs +42 -0
- package/dist/modules/chunks/chunk-XFQT7XCG.mjs.map +7 -0
- package/dist/modules/chunks/chunk-XJZEVRYX.mjs +98 -0
- package/dist/modules/chunks/chunk-XJZEVRYX.mjs.map +7 -0
- package/dist/modules/chunks/chunk-XUYFV23R.mjs +317 -0
- package/dist/modules/chunks/chunk-XUYFV23R.mjs.map +7 -0
- package/dist/modules/chunks/chunk-Y5HXCPPQ.mjs +58 -0
- package/dist/modules/chunks/chunk-Y5HXCPPQ.mjs.map +7 -0
- package/dist/modules/chunks/chunk-YTHGRKGI.mjs +147 -0
- package/dist/modules/chunks/chunk-YTHGRKGI.mjs.map +7 -0
- package/dist/modules/chunks/chunk-YVQSDKAO.mjs +341 -0
- package/dist/modules/chunks/chunk-YVQSDKAO.mjs.map +7 -0
- package/dist/modules/chunks/chunk-YYXQDUVT.mjs +123 -0
- package/dist/modules/chunks/chunk-YYXQDUVT.mjs.map +7 -0
- package/dist/modules/chunks/chunk-ZFXZ2NUI.mjs +142 -0
- package/dist/modules/chunks/chunk-ZFXZ2NUI.mjs.map +7 -0
- package/dist/modules/chunks/chunk-ZLNWF4ET.mjs +9 -0
- package/dist/modules/chunks/chunk-ZLNWF4ET.mjs.map +7 -0
- package/dist/modules/chunks/chunk-ZLU5QW2O.mjs +9 -0
- package/dist/modules/chunks/chunk-ZLU5QW2O.mjs.map +7 -0
- package/dist/modules/chunks/chunk-ZNZPYE2V.mjs +28 -0
- package/dist/modules/chunks/chunk-ZNZPYE2V.mjs.map +7 -0
- package/dist/modules/chunks/core-564N45MO.mjs +7480 -0
- package/dist/modules/chunks/core-564N45MO.mjs.map +7 -0
- package/dist/modules/chunks/css-BKH4SVJG.mjs +8 -0
- package/dist/modules/chunks/css-BKH4SVJG.mjs.map +7 -0
- package/dist/modules/chunks/engine-javascript-PDVIGNGR.mjs +3241 -0
- package/dist/modules/chunks/engine-javascript-PDVIGNGR.mjs.map +7 -0
- package/dist/modules/chunks/github-dark-default-6HVTHEWF.mjs +8 -0
- package/dist/modules/chunks/github-dark-default-6HVTHEWF.mjs.map +7 -0
- package/dist/modules/chunks/github-light-default-LAXRA6XL.mjs +8 -0
- package/dist/modules/chunks/github-light-default-LAXRA6XL.mjs.map +7 -0
- package/dist/modules/chunks/glsl-UC3YWUD2.mjs +18 -0
- package/dist/modules/chunks/glsl-UC3YWUD2.mjs.map +7 -0
- package/dist/modules/chunks/html-FRVIUV63.mjs +19 -0
- package/dist/modules/chunks/html-FRVIUV63.mjs.map +7 -0
- package/dist/modules/chunks/javascript-LN3OC7S2.mjs +8 -0
- package/dist/modules/chunks/javascript-LN3OC7S2.mjs.map +7 -0
- package/dist/modules/chunks/json-5CUGWTOP.mjs +11 -0
- package/dist/modules/chunks/json-5CUGWTOP.mjs.map +7 -0
- package/dist/modules/chunks/json5-YZQI5VNO.mjs +11 -0
- package/dist/modules/chunks/json5-YZQI5VNO.mjs.map +7 -0
- package/dist/modules/chunks/jsonc-SWID6VOZ.mjs +11 -0
- package/dist/modules/chunks/jsonc-SWID6VOZ.mjs.map +7 -0
- package/dist/modules/chunks/jsx-A7RDCLJO.mjs +11 -0
- package/dist/modules/chunks/jsx-A7RDCLJO.mjs.map +7 -0
- package/dist/modules/chunks/markdown-QTCU5KP5.mjs +11 -0
- package/dist/modules/chunks/markdown-QTCU5KP5.mjs.map +7 -0
- package/dist/modules/chunks/python-LAZONBIB.mjs +11 -0
- package/dist/modules/chunks/python-LAZONBIB.mjs.map +7 -0
- package/dist/modules/chunks/rust-XWTPJFJO.mjs +11 -0
- package/dist/modules/chunks/rust-XWTPJFJO.mjs.map +7 -0
- package/dist/modules/chunks/scss-CFXRHUUW.mjs +15 -0
- package/dist/modules/chunks/scss-CFXRHUUW.mjs.map +7 -0
- package/dist/modules/chunks/shellscript-OHO3LCVU.mjs +11 -0
- package/dist/modules/chunks/shellscript-OHO3LCVU.mjs.map +7 -0
- package/dist/modules/chunks/toml-IOHFZJ5B.mjs +11 -0
- package/dist/modules/chunks/toml-IOHFZJ5B.mjs.map +7 -0
- package/dist/modules/chunks/tsx-2E6WNX2E.mjs +11 -0
- package/dist/modules/chunks/tsx-2E6WNX2E.mjs.map +7 -0
- package/dist/modules/chunks/typescript-PBKAS54P.mjs +11 -0
- package/dist/modules/chunks/typescript-PBKAS54P.mjs.map +7 -0
- package/dist/modules/chunks/wgsl-PS6QPRLZ.mjs +11 -0
- package/dist/modules/chunks/wgsl-PS6QPRLZ.mjs.map +7 -0
- package/dist/modules/chunks/xml-JECR2ACB.mjs +18 -0
- package/dist/modules/chunks/xml-JECR2ACB.mjs.map +7 -0
- package/dist/modules/chunks/yaml-P2SV4LOE.mjs +11 -0
- package/dist/modules/chunks/yaml-P2SV4LOE.mjs.map +7 -0
- package/dist/modules/cli-contributions.mjs +32 -0
- package/dist/modules/cli-contributions.mjs.map +7 -0
- package/dist/modules/cli.mjs +14 -0
- package/dist/modules/cli.mjs.map +7 -0
- package/dist/modules/command-executor.mjs +65 -0
- package/dist/modules/command-executor.mjs.map +7 -0
- package/dist/modules/commands.mjs +10 -0
- package/dist/modules/commands.mjs.map +7 -0
- package/dist/modules/embedded.mjs +18608 -0
- package/dist/modules/embedded.mjs.map +7 -0
- package/dist/modules/extension-bridge.mjs +18 -0
- package/dist/modules/extension-bridge.mjs.map +7 -0
- package/dist/modules/frontend-root.mjs +61 -0
- package/dist/modules/frontend-root.mjs.map +7 -0
- package/dist/modules/index.mjs +784 -0
- package/dist/modules/index.mjs.map +7 -0
- package/dist/modules/page.mjs +45 -0
- package/dist/modules/page.mjs.map +7 -0
- package/dist/modules/pages/scene.mjs +18 -0
- package/dist/modules/pages/scene.mjs.map +7 -0
- package/dist/modules/plugin.mjs +56 -0
- package/dist/modules/plugin.mjs.map +7 -0
- package/dist/modules/plugins/asset/frontend.mjs +23 -0
- package/dist/modules/plugins/asset/frontend.mjs.map +7 -0
- package/dist/modules/plugins/asset/i18n.mjs +15 -0
- package/dist/modules/plugins/asset/i18n.mjs.map +7 -0
- package/dist/modules/plugins/asset/identity.mjs +42 -0
- package/dist/modules/plugins/asset/identity.mjs.map +7 -0
- package/dist/modules/plugins/asset/schema.mjs +10 -0
- package/dist/modules/plugins/asset/schema.mjs.map +7 -0
- package/dist/modules/plugins/asset/ui.mjs +16 -0
- package/dist/modules/plugins/asset/ui.mjs.map +7 -0
- package/dist/modules/plugins/content-browser/frontend.mjs +17 -0
- package/dist/modules/plugins/content-browser/frontend.mjs.map +7 -0
- package/dist/modules/plugins/content-browser/i18n.mjs +15 -0
- package/dist/modules/plugins/content-browser/i18n.mjs.map +7 -0
- package/dist/modules/plugins/content-browser/identity.mjs +22 -0
- package/dist/modules/plugins/content-browser/identity.mjs.map +7 -0
- package/dist/modules/plugins/content-browser/schema.mjs +12 -0
- package/dist/modules/plugins/content-browser/schema.mjs.map +7 -0
- package/dist/modules/plugins/content-browser/ui.mjs +15 -0
- package/dist/modules/plugins/content-browser/ui.mjs.map +7 -0
- package/dist/modules/plugins/display/api.mjs +10 -0
- package/dist/modules/plugins/display/api.mjs.map +7 -0
- package/dist/modules/plugins/display/backend.mjs +16 -0
- package/dist/modules/plugins/display/backend.mjs.map +7 -0
- package/dist/modules/plugins/display/carrier-contract.mjs +38 -0
- package/dist/modules/plugins/display/carrier-contract.mjs.map +7 -0
- package/dist/modules/plugins/display/carrier.mjs +13 -0
- package/dist/modules/plugins/display/carrier.mjs.map +7 -0
- package/dist/modules/plugins/display/effects.mjs +8 -0
- package/dist/modules/plugins/display/effects.mjs.map +7 -0
- package/dist/modules/plugins/display/frontend.mjs +14 -0
- package/dist/modules/plugins/display/frontend.mjs.map +7 -0
- package/dist/modules/plugins/display/i18n.mjs +58 -0
- package/dist/modules/plugins/display/i18n.mjs.map +7 -0
- package/dist/modules/plugins/display/identity.mjs +30 -0
- package/dist/modules/plugins/display/identity.mjs.map +7 -0
- package/dist/modules/plugins/display/page-broker.mjs +12 -0
- package/dist/modules/plugins/display/page-broker.mjs.map +7 -0
- package/dist/modules/plugins/display/schema.mjs +40 -0
- package/dist/modules/plugins/display/schema.mjs.map +7 -0
- package/dist/modules/plugins/display/ui.mjs +9 -0
- package/dist/modules/plugins/display/ui.mjs.map +7 -0
- package/dist/modules/plugins/inspector/frontend.mjs +17 -0
- package/dist/modules/plugins/inspector/frontend.mjs.map +7 -0
- package/dist/modules/plugins/inspector/i18n.mjs +15 -0
- package/dist/modules/plugins/inspector/i18n.mjs.map +7 -0
- package/dist/modules/plugins/inspector/identity.mjs +22 -0
- package/dist/modules/plugins/inspector/identity.mjs.map +7 -0
- package/dist/modules/plugins/inspector/schema.mjs +12 -0
- package/dist/modules/plugins/inspector/schema.mjs.map +7 -0
- package/dist/modules/plugins/inspector/ui.mjs +16 -0
- package/dist/modules/plugins/inspector/ui.mjs.map +7 -0
- package/dist/modules/plugins/material/frontend.mjs +25 -0
- package/dist/modules/plugins/material/frontend.mjs.map +7 -0
- package/dist/modules/plugins/material/i18n.mjs +15 -0
- package/dist/modules/plugins/material/i18n.mjs.map +7 -0
- package/dist/modules/plugins/material/identity.mjs +60 -0
- package/dist/modules/plugins/material/identity.mjs.map +7 -0
- package/dist/modules/plugins/material/schema.mjs +47 -0
- package/dist/modules/plugins/material/schema.mjs.map +7 -0
- package/dist/modules/plugins/material/ui.mjs +28 -0
- package/dist/modules/plugins/material/ui.mjs.map +7 -0
- package/dist/modules/plugins/mesh/frontend.mjs +23 -0
- package/dist/modules/plugins/mesh/frontend.mjs.map +7 -0
- package/dist/modules/plugins/mesh/i18n.mjs +15 -0
- package/dist/modules/plugins/mesh/i18n.mjs.map +7 -0
- package/dist/modules/plugins/mesh/identity.mjs +54 -0
- package/dist/modules/plugins/mesh/identity.mjs.map +7 -0
- package/dist/modules/plugins/mesh/schema.mjs +10 -0
- package/dist/modules/plugins/mesh/schema.mjs.map +7 -0
- package/dist/modules/plugins/mesh/ui.mjs +26 -0
- package/dist/modules/plugins/mesh/ui.mjs.map +7 -0
- package/dist/modules/plugins/plugins/api.mjs +11 -0
- package/dist/modules/plugins/plugins/api.mjs.map +7 -0
- package/dist/modules/plugins/plugins/backend.mjs +21 -0
- package/dist/modules/plugins/plugins/backend.mjs.map +7 -0
- package/dist/modules/plugins/plugins/cli.mjs +12 -0
- package/dist/modules/plugins/plugins/cli.mjs.map +7 -0
- package/dist/modules/plugins/plugins/frontend.mjs +17 -0
- package/dist/modules/plugins/plugins/frontend.mjs.map +7 -0
- package/dist/modules/plugins/plugins/i18n.mjs +15 -0
- package/dist/modules/plugins/plugins/i18n.mjs.map +7 -0
- package/dist/modules/plugins/plugins/identity.mjs +26 -0
- package/dist/modules/plugins/plugins/identity.mjs.map +7 -0
- package/dist/modules/plugins/plugins/runtime.mjs +50 -0
- package/dist/modules/plugins/plugins/runtime.mjs.map +7 -0
- package/dist/modules/plugins/plugins/schema.mjs +12 -0
- package/dist/modules/plugins/plugins/schema.mjs.map +7 -0
- package/dist/modules/plugins/plugins/ui/panel.mjs +14 -0
- package/dist/modules/plugins/plugins/ui/panel.mjs.map +7 -0
- package/dist/modules/plugins/plugins/ui.mjs +15 -0
- package/dist/modules/plugins/plugins/ui.mjs.map +7 -0
- package/dist/modules/plugins/scene/frontend.mjs +18 -0
- package/dist/modules/plugins/scene/frontend.mjs.map +7 -0
- package/dist/modules/plugins/scene/identity.mjs +14 -0
- package/dist/modules/plugins/scene/identity.mjs.map +7 -0
- package/dist/modules/plugins/scene-tree/frontend.mjs +17 -0
- package/dist/modules/plugins/scene-tree/frontend.mjs.map +7 -0
- package/dist/modules/plugins/scene-tree/i18n.mjs +15 -0
- package/dist/modules/plugins/scene-tree/i18n.mjs.map +7 -0
- package/dist/modules/plugins/scene-tree/identity.mjs +22 -0
- package/dist/modules/plugins/scene-tree/identity.mjs.map +7 -0
- package/dist/modules/plugins/scene-tree/schema.mjs +12 -0
- package/dist/modules/plugins/scene-tree/schema.mjs.map +7 -0
- package/dist/modules/plugins/scene-tree/ui.mjs +16 -0
- package/dist/modules/plugins/scene-tree/ui.mjs.map +7 -0
- package/dist/modules/plugins/texture/frontend.mjs +23 -0
- package/dist/modules/plugins/texture/frontend.mjs.map +7 -0
- package/dist/modules/plugins/texture/i18n.mjs +15 -0
- package/dist/modules/plugins/texture/i18n.mjs.map +7 -0
- package/dist/modules/plugins/texture/identity.mjs +54 -0
- package/dist/modules/plugins/texture/identity.mjs.map +7 -0
- package/dist/modules/plugins/texture/schema.mjs +10 -0
- package/dist/modules/plugins/texture/schema.mjs.map +7 -0
- package/dist/modules/plugins/texture/ui.mjs +26 -0
- package/dist/modules/plugins/texture/ui.mjs.map +7 -0
- package/dist/modules/plugins/viewport/frontend.mjs +27 -0
- package/dist/modules/plugins/viewport/frontend.mjs.map +7 -0
- package/dist/modules/plugins/viewport/identity.mjs +28 -0
- package/dist/modules/plugins/viewport/identity.mjs.map +7 -0
- package/dist/modules/plugins/viewport/presentation-identity.mjs +10 -0
- package/dist/modules/plugins/viewport/presentation-identity.mjs.map +7 -0
- package/dist/modules/plugins/viewport/presentation.mjs +18 -0
- package/dist/modules/plugins/viewport/presentation.mjs.map +7 -0
- package/dist/modules/plugins/viewport/schema.mjs +18 -0
- package/dist/modules/plugins/viewport/schema.mjs.map +7 -0
- package/dist/modules/plugins/viewport/workspace-shell.mjs +29 -0
- package/dist/modules/plugins/viewport/workspace-shell.mjs.map +7 -0
- package/dist/modules/shell/contract.mjs +10 -0
- package/dist/modules/shell/contract.mjs.map +7 -0
- package/dist/modules/shell/frontend.mjs +14 -0
- package/dist/modules/shell/frontend.mjs.map +7 -0
- package/dist/modules/shell/layout-zones.mjs +20 -0
- package/dist/modules/shell/layout-zones.mjs.map +7 -0
- package/dist/modules/start-cli.mjs +57 -0
- package/dist/modules/start-cli.mjs.map +7 -0
- package/dist/modules/start.mjs +18 -0
- package/dist/modules/start.mjs.map +7 -0
- package/dist/modules/viewer/catalog/backend.mjs +47 -0
- package/dist/modules/viewer/catalog/backend.mjs.map +7 -0
- package/dist/modules/viewer/catalog/frontend.mjs +55 -0
- package/dist/modules/viewer/catalog/frontend.mjs.map +7 -0
- package/dist/modules/viewer/catalog/shared.mjs +43 -0
- package/dist/modules/viewer/catalog/shared.mjs.map +7 -0
- package/dist/modules/viewer/catalog.mjs +85 -0
- package/dist/modules/viewer/catalog.mjs.map +7 -0
- package/dist/modules/viewer/cli.mjs +23 -0
- package/dist/modules/viewer/cli.mjs.map +7 -0
- package/dist/modules/viewer-host/frontend.mjs +65 -0
- package/dist/modules/viewer-host/frontend.mjs.map +7 -0
- package/dist/modules/viewer-host/page-registry.mjs +27 -0
- package/dist/modules/viewer-host/page-registry.mjs.map +7 -0
- package/dist/modules/viewer-host/slot-registry.mjs +8 -0
- package/dist/modules/viewer-host/slot-registry.mjs.map +7 -0
- package/dist/modules/viewer-host.mjs +43 -0
- package/dist/modules/viewer-host.mjs.map +7 -0
- package/dist/modules/viewer.mjs +85 -0
- package/dist/modules/viewer.mjs.map +7 -0
- package/dist/modules/workspace/adopt-surface.mjs +16 -0
- package/dist/modules/workspace/adopt-surface.mjs.map +7 -0
- package/dist/modules/workspace/api.mjs +8 -0
- package/dist/modules/workspace/api.mjs.map +7 -0
- package/dist/modules/workspace/backend.mjs +23 -0
- package/dist/modules/workspace/backend.mjs.map +7 -0
- package/dist/modules/workspace/broker.mjs +16 -0
- package/dist/modules/workspace/broker.mjs.map +7 -0
- package/dist/modules/workspace/cli.mjs +9 -0
- package/dist/modules/workspace/cli.mjs.map +7 -0
- package/dist/modules/workspace/client.mjs +15 -0
- package/dist/modules/workspace/client.mjs.map +7 -0
- package/dist/modules/workspace/command-error.mjs +16 -0
- package/dist/modules/workspace/command-error.mjs.map +7 -0
- package/dist/modules/workspace/contract.mjs +71 -0
- package/dist/modules/workspace/contract.mjs.map +7 -0
- package/dist/modules/workspace/demo-client.mjs +127 -0
- package/dist/modules/workspace/demo-client.mjs.map +7 -0
- package/dist/modules/workspace/engine-adapter.mjs +16 -0
- package/dist/modules/workspace/engine-adapter.mjs.map +7 -0
- package/dist/modules/workspace/engine-presentation.mjs +10 -0
- package/dist/modules/workspace/engine-presentation.mjs.map +7 -0
- package/dist/modules/workspace/extension-bridge.mjs +18 -0
- package/dist/modules/workspace/extension-bridge.mjs.map +7 -0
- package/dist/modules/workspace/frontend-plugin.mjs +18 -0
- package/dist/modules/workspace/frontend-plugin.mjs.map +7 -0
- package/dist/modules/workspace/frontend.mjs +29 -0
- package/dist/modules/workspace/frontend.mjs.map +7 -0
- package/dist/modules/workspace/id.mjs +8 -0
- package/dist/modules/workspace/id.mjs.map +7 -0
- package/dist/modules/workspace/inspection-presentation.mjs +12 -0
- package/dist/modules/workspace/inspection-presentation.mjs.map +7 -0
- package/dist/modules/workspace/locale-bridge.mjs +14 -0
- package/dist/modules/workspace/locale-bridge.mjs.map +7 -0
- package/dist/modules/workspace/page-title.mjs +13 -0
- package/dist/modules/workspace/page-title.mjs.map +7 -0
- package/dist/modules/workspace/presentation.mjs +18 -0
- package/dist/modules/workspace/presentation.mjs.map +7 -0
- package/dist/modules/workspace/preview-surface.mjs +17 -0
- package/dist/modules/workspace/preview-surface.mjs.map +7 -0
- package/dist/modules/workspace/project-session.mjs +18 -0
- package/dist/modules/workspace/project-session.mjs.map +7 -0
- package/dist/modules/workspace/render-resize-sync.mjs +12 -0
- package/dist/modules/workspace/render-resize-sync.mjs.map +7 -0
- package/dist/modules/workspace/resident.mjs +16 -0
- package/dist/modules/workspace/resident.mjs.map +7 -0
- package/dist/modules/workspace/resource-open.mjs +34 -0
- package/dist/modules/workspace/resource-open.mjs.map +7 -0
- package/dist/modules/workspace/resource-page.mjs +27 -0
- package/dist/modules/workspace/resource-page.mjs.map +7 -0
- package/dist/modules/workspace/tool-runtime.mjs +14 -0
- package/dist/modules/workspace/tool-runtime.mjs.map +7 -0
- package/dist/modules/workspace/view-trace.mjs +60 -0
- package/dist/modules/workspace/view-trace.mjs.map +7 -0
- package/dist/modules/workspace/workspace-client-connection.mjs +22 -0
- package/dist/modules/workspace/workspace-client-connection.mjs.map +7 -0
- package/dist/modules/workspace/workspace-recovery.mjs +35 -0
- package/dist/modules/workspace/workspace-recovery.mjs.map +7 -0
- package/dist/modules/workspace/workspace-state.mjs +12 -0
- package/dist/modules/workspace/workspace-state.mjs.map +7 -0
- package/dist/modules/workspace-frontend.mjs +17 -0
- package/dist/modules/workspace-frontend.mjs.map +7 -0
- package/dist/viewer/assets/chunk-CilyBKbf.js +1 -0
- package/dist/viewer/assets/core-DSQma37-.js +13 -0
- package/dist/viewer/assets/core-DSQma37-.js.map +1 -0
- package/dist/viewer/assets/css-Bq1BXecw.js +2 -0
- package/dist/viewer/assets/css-Bq1BXecw.js.map +1 -0
- package/dist/viewer/assets/css-CWQWazmX.js +1 -0
- package/dist/viewer/assets/embedded-D4ZDx--W.js +2 -0
- package/dist/viewer/assets/embedded-D4ZDx--W.js.map +1 -0
- package/dist/viewer/assets/engine-javascript-BvokIV9O.js +142 -0
- package/dist/viewer/assets/engine-javascript-BvokIV9O.js.map +1 -0
- package/dist/viewer/assets/github-dark-default-DaDlj-WZ.js +2 -0
- package/dist/viewer/assets/github-dark-default-DaDlj-WZ.js.map +1 -0
- package/dist/viewer/assets/github-light-default-BqhWxAZd.js +2 -0
- package/dist/viewer/assets/github-light-default-BqhWxAZd.js.map +1 -0
- package/dist/viewer/assets/glsl-BJgVnv11.js +2 -0
- package/dist/viewer/assets/glsl-BJgVnv11.js.map +1 -0
- package/dist/viewer/assets/html-AaaHGGyt.js +2 -0
- package/dist/viewer/assets/html-AaaHGGyt.js.map +1 -0
- package/dist/viewer/assets/javascript-BX9W64FE.js +1 -0
- package/dist/viewer/assets/javascript-DQODvD07.js +2 -0
- package/dist/viewer/assets/javascript-DQODvD07.js.map +1 -0
- package/dist/viewer/assets/json-CpcIDpT7.js +2 -0
- package/dist/viewer/assets/json-CpcIDpT7.js.map +1 -0
- package/dist/viewer/assets/json5-Czq4A7dk.js +2 -0
- package/dist/viewer/assets/json5-Czq4A7dk.js.map +1 -0
- package/dist/viewer/assets/jsonc-BXDfCMmu.js +2 -0
- package/dist/viewer/assets/jsonc-BXDfCMmu.js.map +1 -0
- package/dist/viewer/assets/jsx-DAWscEnf.js +2 -0
- package/dist/viewer/assets/jsx-DAWscEnf.js.map +1 -0
- package/dist/viewer/assets/main-C-2CHTN_.js +15 -0
- package/dist/viewer/assets/main-C-2CHTN_.js.map +1 -0
- package/dist/viewer/assets/markdown-Cx1FMNw-.js +2 -0
- package/dist/viewer/assets/markdown-Cx1FMNw-.js.map +1 -0
- package/dist/viewer/assets/panels-entry-Ddhfjgf0.js +46 -0
- package/dist/viewer/assets/panels-entry-Ddhfjgf0.js.map +1 -0
- package/dist/viewer/assets/python-CYPKjWV9.js +2 -0
- package/dist/viewer/assets/python-CYPKjWV9.js.map +1 -0
- package/dist/viewer/assets/rust-0e5cNx_V.js +2 -0
- package/dist/viewer/assets/rust-0e5cNx_V.js.map +1 -0
- package/dist/viewer/assets/scss-B-aKzLbT.js +2 -0
- package/dist/viewer/assets/scss-B-aKzLbT.js.map +1 -0
- package/dist/viewer/assets/shellscript-CpXD-pSm.js +2 -0
- package/dist/viewer/assets/shellscript-CpXD-pSm.js.map +1 -0
- package/dist/viewer/assets/style-ClttNKZk.css +2 -0
- package/dist/viewer/assets/styles-BXozhwiU.js +11 -0
- package/dist/viewer/assets/styles-BXozhwiU.js.map +1 -0
- package/dist/viewer/assets/toml-GmchYTXa.js +2 -0
- package/dist/viewer/assets/toml-GmchYTXa.js.map +1 -0
- package/dist/viewer/assets/tsx-Crj1Bi53.js +2 -0
- package/dist/viewer/assets/tsx-Crj1Bi53.js.map +1 -0
- package/dist/viewer/assets/typescript-xi0cSHCO.js +2 -0
- package/dist/viewer/assets/typescript-xi0cSHCO.js.map +1 -0
- package/dist/viewer/assets/wgsl-BoEPRo9U.js +2 -0
- package/dist/viewer/assets/wgsl-BoEPRo9U.js.map +1 -0
- package/dist/viewer/assets/xml-B8JqQrMD.js +2 -0
- package/dist/viewer/assets/xml-B8JqQrMD.js.map +1 -0
- package/dist/viewer/assets/yaml-DsIB85X9.js +2 -0
- package/dist/viewer/assets/yaml-DsIB85X9.js.map +1 -0
- package/dist/viewer/index.html +15 -0
- package/dist/viewer/panels.js +1 -0
- package/host.pack.json +13 -0
- package/package.json +174 -0
- package/skills/forgeax-view-cli/SKILL.md +74 -0
- package/skills/forgeax-view-start/SKILL.md +202 -0
- package/skills/forgeax-view-start/scripts/start-view.mjs +202 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":["createPluginI18n","i18n","t","subscribeLocale","getLocale"],"ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"sources":["../../../packages/view-components/src/useWorkspaceClientConnected.ts","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/arrow-down-wide-narrow.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/arrow-up-down.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/arrow-up-narrow-wide.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/bone.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/braces.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/camera.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/case-sensitive.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/chevron-left.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/circle-user-round.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/clock.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/crosshair.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/database.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/ellipsis.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/film.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/filter.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/focus.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/folder-open.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/folder.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/globe.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/grid-2x2.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/hard-drive.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/hexagon.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/layers.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/lightbulb.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/list.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/maximize-2.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/minimize-2.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/mouse-pointer-2.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/move-3d.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/paintbrush.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/search-x.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/settings.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/shapes.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/shield-check.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/star-off.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/star.js","../../../node_modules/.pnpm/lucide-react@0.460.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/table-2.js","../../../packages/view-components/src/inspector-form-model.mjs","../../../packages/view-components/src/InspectorForm.tsx","../../../packages/view-plugin-content-browser/src/i18n/index.mjs","../../../packages/view-plugin-content-browser/src/i18n/useTranslation.ts","../../../packages/view-plugin-content-browser/src/schema.mjs","../../../packages/view-plugin-content-browser/src/ui/format.ts","../../../packages/view-plugin-content-browser/src/ui/icons.ts","../../../packages/view-plugin-content-browser/src/ui/derived-view.ts","../../../packages/view-plugin-content-browser/src/ui/CBDetailsList.tsx","../../../packages/view-plugin-content-browser/src/ui/CBGrid.tsx","../../../packages/view-plugin-content-browser/src/ui/CBNavigationBar.tsx","../../../packages/view-plugin-content-browser/src/ui/preview/media-preview-policy.ts","../../../packages/view-plugin-content-browser/src/ui/preview/MediaPreview.tsx","../../../packages/view-plugin-content-browser/src/ui/preview/ext-language.ts","../../../packages/view-plugin-content-browser/src/ui/preview/code-preview-policy.ts","../../../packages/view-plugin-content-browser/src/ui/preview/highlighter.ts","../../../packages/view-plugin-content-browser/src/ui/preview/CodePreview.tsx","../../../packages/view-plugin-content-browser/src/ui/preview/FileContentPreview.tsx","../../../packages/view-plugin-content-browser/src/ui/resize-handle.tsx","../../../packages/view-plugin-content-browser/src/ui/CBPreviewPanel.tsx","../../../packages/view-plugin-content-browser/src/ui/mock-catalog.ts","../../../packages/view-plugin-content-browser/src/ui/workspace-catalog.ts","../../../packages/view-plugin-content-browser/src/ui/ContentBrowserPanel.tsx","../../../packages/view-plugin-content-browser/src/ui/mount.tsx","../../../packages/view-plugin-inspector/src/i18n/index.mjs","../../../packages/view-plugin-inspector/src/i18n/useTranslation.ts","../../../packages/view-plugin-inspector/src/schema.mjs","../../../packages/view-plugin-inspector/src/ui/mockInspector.ts","../../../packages/view-plugin-inspector/src/inspection.mjs","../../../packages/view-plugin-inspector/src/ui/InspectorPanel.tsx","../../../packages/view-plugin-inspector/src/ui/mount.tsx","../../../packages/view-plugin-material/src/i18n/index.mjs","../../../packages/view-plugin-material/src/i18n/useTranslation.ts","../../../packages/view-workspace-core/src/inspection-presentation.mjs","../../../packages/view-plugin-material/src/ui/MaterialPanel.tsx","../../../packages/view-plugin-material/src/ui/MaterialPreviewPanel.tsx","../../../packages/view-plugin-material/src/ui/mount.tsx","../../../packages/view-plugin-mesh/src/i18n/index.mjs","../../../packages/view-plugin-mesh/src/i18n/useTranslation.ts","../../../packages/view-plugin-mesh/src/ui/MeshPreviewPanel.tsx","../../../packages/view-plugin-mesh/src/ui/MeshPropertiesPanel.tsx","../../../packages/view-plugin-mesh/src/ui/mount.tsx","../../../packages/view-plugin-texture/src/i18n/index.mjs","../../../packages/view-plugin-texture/src/i18n/useTranslation.ts","../../../packages/view-plugin-texture/src/ui/TexturePreviewPanel.tsx","../../../packages/view-plugin-texture/src/ui/TexturePropertiesPanel.tsx","../../../packages/view-plugin-texture/src/ui/mount.tsx","../../../packages/view-plugin-asset/src/i18n/index.mjs","../../../packages/view-plugin-asset/src/i18n/useTranslation.ts","../../../packages/view-plugin-asset/src/ui/AssetPropertiesPanel.tsx","../../../packages/view-plugin-asset/src/ui/mount.tsx","../../../packages/view-plugin-plugins/src/i18n/index.mjs","../../../packages/view-plugin-plugins/src/i18n/useTranslation.ts","../../../packages/view-plugin-plugins/src/schema.mjs","../../../packages/view-plugin-plugins/src/ui/plugin-entries.mjs","../../../packages/view-plugin-plugins/src/ui/PluginFilters.tsx","../../../packages/view-plugin-plugins/src/ui/PluginsPanel.tsx","../../../packages/view-plugin-plugins/src/ui/mount.tsx","../../../packages/view-plugin-scene-tree/src/i18n/index.mjs","../../../packages/view-plugin-scene-tree/src/i18n/useTranslation.ts","../../../packages/view-plugin-scene-tree/src/schema.mjs","../../../packages/view-plugin-scene-tree/src/hierarchy-filters.mjs","../../../packages/view-plugin-scene-tree/src/hierarchy.mjs","../../../packages/view-plugin-scene-tree/src/ui/SceneTreePanel.tsx","../../../packages/view-plugin-scene-tree/src/ui/mockHierarchy.ts","../../../packages/view-plugin-scene-tree/src/ui/mount.tsx"],"sourcesContent":["import { useSyncExternalStore } from 'react';\n\ntype WorkspaceConnectionClient = {\n transport?: { connected?: boolean; request?: (...args: unknown[]) => unknown };\n onDisconnect?: (listener: (error?: unknown) => void) => () => void;\n};\n\nfunction readConnected(client?: WorkspaceConnectionClient | null) {\n const transport = client?.transport;\n return Boolean(transport && typeof transport.request === 'function' && transport.connected !== false);\n}\n\nexport function useWorkspaceClientConnected(client?: WorkspaceConnectionClient | null) {\n return useSyncExternalStore(\n (onChange) => client?.onDisconnect?.(onChange) ?? (() => {}),\n () => readConnected(client),\n () => readConnected(client),\n );\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 ArrowDownWideNarrow = createLucideIcon(\"ArrowDownWideNarrow\", [\n [\"path\", { d: \"m3 16 4 4 4-4\", key: \"1co6wj\" }],\n [\"path\", { d: \"M7 20V4\", key: \"1yoxec\" }],\n [\"path\", { d: \"M11 4h10\", key: \"1w87gc\" }],\n [\"path\", { d: \"M11 8h7\", key: \"djye34\" }],\n [\"path\", { d: \"M11 12h4\", key: \"q8tih4\" }]\n]);\n\nexport { ArrowDownWideNarrow as default };\n//# sourceMappingURL=arrow-down-wide-narrow.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 ArrowUpDown = createLucideIcon(\"ArrowUpDown\", [\n [\"path\", { d: \"m21 16-4 4-4-4\", key: \"f6ql7i\" }],\n [\"path\", { d: \"M17 20V4\", key: \"1ejh1v\" }],\n [\"path\", { d: \"m3 8 4-4 4 4\", key: \"11wl7u\" }],\n [\"path\", { d: \"M7 4v16\", key: \"1glfcx\" }]\n]);\n\nexport { ArrowUpDown as default };\n//# sourceMappingURL=arrow-up-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 ArrowUpNarrowWide = createLucideIcon(\"ArrowUpNarrowWide\", [\n [\"path\", { d: \"m3 8 4-4 4 4\", key: \"11wl7u\" }],\n [\"path\", { d: \"M7 4v16\", key: \"1glfcx\" }],\n [\"path\", { d: \"M11 12h4\", key: \"q8tih4\" }],\n [\"path\", { d: \"M11 16h7\", key: \"uosisv\" }],\n [\"path\", { d: \"M11 20h10\", key: \"jvxblo\" }]\n]);\n\nexport { ArrowUpNarrowWide as default };\n//# sourceMappingURL=arrow-up-narrow-wide.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 Bone = createLucideIcon(\"Bone\", [\n [\n \"path\",\n {\n d: \"M17 10c.7-.7 1.69 0 2.5 0a2.5 2.5 0 1 0 0-5 .5.5 0 0 1-.5-.5 2.5 2.5 0 1 0-5 0c0 .81.7 1.8 0 2.5l-7 7c-.7.7-1.69 0-2.5 0a2.5 2.5 0 0 0 0 5c.28 0 .5.22.5.5a2.5 2.5 0 1 0 5 0c0-.81-.7-1.8 0-2.5Z\",\n key: \"w610uw\"\n }\n ]\n]);\n\nexport { Bone as default };\n//# sourceMappingURL=bone.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 Braces = createLucideIcon(\"Braces\", [\n [\n \"path\",\n { d: \"M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1\", key: \"ezmyqa\" }\n ],\n [\n \"path\",\n {\n d: \"M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1\",\n key: \"e1hn23\"\n }\n ]\n]);\n\nexport { Braces as default };\n//# sourceMappingURL=braces.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 Camera = createLucideIcon(\"Camera\", [\n [\n \"path\",\n {\n d: \"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\",\n key: \"1tc9qg\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"13\", r: \"3\", key: \"1vg3eu\" }]\n]);\n\nexport { Camera as default };\n//# sourceMappingURL=camera.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 CaseSensitive = createLucideIcon(\"CaseSensitive\", [\n [\"path\", { d: \"m3 15 4-8 4 8\", key: \"1vwr6u\" }],\n [\"path\", { d: \"M4 13h6\", key: \"1r9ots\" }],\n [\"circle\", { cx: \"18\", cy: \"12\", r: \"3\", key: \"1kchzo\" }],\n [\"path\", { d: \"M21 9v6\", key: \"anns31\" }]\n]);\n\nexport { CaseSensitive as default };\n//# sourceMappingURL=case-sensitive.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 ChevronLeft = createLucideIcon(\"ChevronLeft\", [\n [\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]\n]);\n\nexport { ChevronLeft as default };\n//# sourceMappingURL=chevron-left.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 CircleUserRound = createLucideIcon(\"CircleUserRound\", [\n [\"path\", { d: \"M18 20a6 6 0 0 0-12 0\", key: \"1qehca\" }],\n [\"circle\", { cx: \"12\", cy: \"10\", r: \"4\", key: \"1h16sb\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]\n]);\n\nexport { CircleUserRound as default };\n//# sourceMappingURL=circle-user-round.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 Clock = createLucideIcon(\"Clock\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polyline\", { points: \"12 6 12 12 16 14\", key: \"68esgv\" }]\n]);\n\nexport { Clock as default };\n//# sourceMappingURL=clock.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 Crosshair = createLucideIcon(\"Crosshair\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"22\", x2: \"18\", y1: \"12\", y2: \"12\", key: \"l9bcsi\" }],\n [\"line\", { x1: \"6\", x2: \"2\", y1: \"12\", y2: \"12\", key: \"13hhkx\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"6\", y2: \"2\", key: \"10w3f3\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"22\", y2: \"18\", key: \"15g9kq\" }]\n]);\n\nexport { Crosshair as default };\n//# sourceMappingURL=crosshair.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 Database = createLucideIcon(\"Database\", [\n [\"ellipse\", { cx: \"12\", cy: \"5\", rx: \"9\", ry: \"3\", key: \"msslwz\" }],\n [\"path\", { d: \"M3 5V19A9 3 0 0 0 21 19V5\", key: \"1wlel7\" }],\n [\"path\", { d: \"M3 12A9 3 0 0 0 21 12\", key: \"mv7ke4\" }]\n]);\n\nexport { Database as default };\n//# sourceMappingURL=database.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 Ellipsis = createLucideIcon(\"Ellipsis\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"1\", key: \"41hilf\" }],\n [\"circle\", { cx: \"19\", cy: \"12\", r: \"1\", key: \"1wjl8i\" }],\n [\"circle\", { cx: \"5\", cy: \"12\", r: \"1\", key: \"1pcz8c\" }]\n]);\n\nexport { Ellipsis as default };\n//# sourceMappingURL=ellipsis.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 Film = createLucideIcon(\"Film\", [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M7 3v18\", key: \"bbkbws\" }],\n [\"path\", { d: \"M3 7.5h4\", key: \"zfgn84\" }],\n [\"path\", { d: \"M3 12h18\", key: \"1i2n21\" }],\n [\"path\", { d: \"M3 16.5h4\", key: \"1230mu\" }],\n [\"path\", { d: \"M17 3v18\", key: \"in4fa5\" }],\n [\"path\", { d: \"M17 7.5h4\", key: \"myr1c1\" }],\n [\"path\", { d: \"M17 16.5h4\", key: \"go4c1d\" }]\n]);\n\nexport { Film as default };\n//# sourceMappingURL=film.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 Filter = createLucideIcon(\"Filter\", [\n [\"polygon\", { points: \"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\", key: \"1yg77f\" }]\n]);\n\nexport { Filter as default };\n//# sourceMappingURL=filter.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 Focus = createLucideIcon(\"Focus\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }],\n [\"path\", { d: \"M3 7V5a2 2 0 0 1 2-2h2\", key: \"aa7l1z\" }],\n [\"path\", { d: \"M17 3h2a2 2 0 0 1 2 2v2\", key: \"4qcy5o\" }],\n [\"path\", { d: \"M21 17v2a2 2 0 0 1-2 2h-2\", key: \"6vwrx8\" }],\n [\"path\", { d: \"M7 21H5a2 2 0 0 1-2-2v-2\", key: \"ioqczr\" }]\n]);\n\nexport { Focus as default };\n//# sourceMappingURL=focus.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 FolderOpen = createLucideIcon(\"FolderOpen\", [\n [\n \"path\",\n {\n d: \"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\",\n key: \"usdka0\"\n }\n ]\n]);\n\nexport { FolderOpen as default };\n//# sourceMappingURL=folder-open.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 Folder = createLucideIcon(\"Folder\", [\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n]);\n\nexport { Folder as default };\n//# sourceMappingURL=folder.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 Globe = createLucideIcon(\"Globe\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n]);\n\nexport { Globe as default };\n//# sourceMappingURL=globe.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 Grid2x2 = createLucideIcon(\"Grid2x2\", [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M3 12h18\", key: \"1i2n21\" }],\n [\"path\", { d: \"M12 3v18\", key: \"108xh3\" }]\n]);\n\nexport { Grid2x2 as default };\n//# sourceMappingURL=grid-2x2.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 HardDrive = createLucideIcon(\"HardDrive\", [\n [\"line\", { x1: \"22\", x2: \"2\", y1: \"12\", y2: \"12\", key: \"1y58io\" }],\n [\n \"path\",\n {\n d: \"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\",\n key: \"oot6mr\"\n }\n ],\n [\"line\", { x1: \"6\", x2: \"6.01\", y1: \"16\", y2: \"16\", key: \"sgf278\" }],\n [\"line\", { x1: \"10\", x2: \"10.01\", y1: \"16\", y2: \"16\", key: \"1l4acy\" }]\n]);\n\nexport { HardDrive as default };\n//# sourceMappingURL=hard-drive.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 Hexagon = createLucideIcon(\"Hexagon\", [\n [\n \"path\",\n {\n d: \"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\",\n key: \"yt0hxn\"\n }\n ]\n]);\n\nexport { Hexagon as default };\n//# sourceMappingURL=hexagon.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 Layers = createLucideIcon(\"Layers\", [\n [\n \"path\",\n {\n d: \"m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z\",\n key: \"8b97xw\"\n }\n ],\n [\"path\", { d: \"m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65\", key: \"dd6zsq\" }],\n [\"path\", { d: \"m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65\", key: \"ep9fru\" }]\n]);\n\nexport { Layers as default };\n//# sourceMappingURL=layers.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 Lightbulb = createLucideIcon(\"Lightbulb\", [\n [\n \"path\",\n {\n d: \"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\",\n key: \"1gvzjb\"\n }\n ],\n [\"path\", { d: \"M9 18h6\", key: \"x1upvd\" }],\n [\"path\", { d: \"M10 22h4\", key: \"ceow96\" }]\n]);\n\nexport { Lightbulb as default };\n//# sourceMappingURL=lightbulb.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 List = createLucideIcon(\"List\", [\n [\"path\", { d: \"M3 12h.01\", key: \"nlz23k\" }],\n [\"path\", { d: \"M3 18h.01\", key: \"1tta3j\" }],\n [\"path\", { d: \"M3 6h.01\", key: \"1rqtza\" }],\n [\"path\", { d: \"M8 12h13\", key: \"1za7za\" }],\n [\"path\", { d: \"M8 18h13\", key: \"1lx6n3\" }],\n [\"path\", { d: \"M8 6h13\", key: \"ik3vkj\" }]\n]);\n\nexport { List as default };\n//# sourceMappingURL=list.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 Maximize2 = createLucideIcon(\"Maximize2\", [\n [\"polyline\", { points: \"15 3 21 3 21 9\", key: \"mznyad\" }],\n [\"polyline\", { points: \"9 21 3 21 3 15\", key: \"1avn1i\" }],\n [\"line\", { x1: \"21\", x2: \"14\", y1: \"3\", y2: \"10\", key: \"ota7mn\" }],\n [\"line\", { x1: \"3\", x2: \"10\", y1: \"21\", y2: \"14\", key: \"1atl0r\" }]\n]);\n\nexport { Maximize2 as default };\n//# sourceMappingURL=maximize-2.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 Minimize2 = createLucideIcon(\"Minimize2\", [\n [\"polyline\", { points: \"4 14 10 14 10 20\", key: \"11kfnr\" }],\n [\"polyline\", { points: \"20 10 14 10 14 4\", key: \"rlmsce\" }],\n [\"line\", { x1: \"14\", x2: \"21\", y1: \"10\", y2: \"3\", key: \"o5lafz\" }],\n [\"line\", { x1: \"3\", x2: \"10\", y1: \"21\", y2: \"14\", key: \"1atl0r\" }]\n]);\n\nexport { Minimize2 as default };\n//# sourceMappingURL=minimize-2.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 MousePointer2 = createLucideIcon(\"MousePointer2\", [\n [\n \"path\",\n {\n d: \"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z\",\n key: \"edeuup\"\n }\n ]\n]);\n\nexport { MousePointer2 as default };\n//# sourceMappingURL=mouse-pointer-2.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 Move3d = createLucideIcon(\"Move3d\", [\n [\"path\", { d: \"M5 3v16h16\", key: \"1mqmf9\" }],\n [\"path\", { d: \"m5 19 6-6\", key: \"jh6hbb\" }],\n [\"path\", { d: \"m2 6 3-3 3 3\", key: \"tkyvxa\" }],\n [\"path\", { d: \"m18 16 3 3-3 3\", key: \"1d4glt\" }]\n]);\n\nexport { Move3d as default };\n//# sourceMappingURL=move-3d.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 Paintbrush = createLucideIcon(\"Paintbrush\", [\n [\"path\", { d: \"m14.622 17.897-10.68-2.913\", key: \"vj2p1u\" }],\n [\n \"path\",\n {\n d: \"M18.376 2.622a1 1 0 1 1 3.002 3.002L17.36 9.643a.5.5 0 0 0 0 .707l.944.944a2.41 2.41 0 0 1 0 3.408l-.944.944a.5.5 0 0 1-.707 0L8.354 7.348a.5.5 0 0 1 0-.707l.944-.944a2.41 2.41 0 0 1 3.408 0l.944.944a.5.5 0 0 0 .707 0z\",\n key: \"18tc5c\"\n }\n ],\n [\n \"path\",\n {\n d: \"M9 8c-1.804 2.71-3.97 3.46-6.583 3.948a.507.507 0 0 0-.302.819l7.32 8.883a1 1 0 0 0 1.185.204C12.735 20.405 16 16.792 16 15\",\n key: \"ytzfxy\"\n }\n ]\n]);\n\nexport { Paintbrush as default };\n//# sourceMappingURL=paintbrush.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 SearchX = createLucideIcon(\"SearchX\", [\n [\"path\", { d: \"m13.5 8.5-5 5\", key: \"1cs55j\" }],\n [\"path\", { d: \"m8.5 8.5 5 5\", key: \"a8mexj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"path\", { d: \"m21 21-4.3-4.3\", key: \"1qie3q\" }]\n]);\n\nexport { SearchX as default };\n//# sourceMappingURL=search-x.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 Settings = createLucideIcon(\"Settings\", [\n [\n \"path\",\n {\n d: \"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\",\n key: \"1qme2f\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Settings as default };\n//# sourceMappingURL=settings.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 Shapes = createLucideIcon(\"Shapes\", [\n [\n \"path\",\n {\n d: \"M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z\",\n key: \"1bo67w\"\n }\n ],\n [\"rect\", { x: \"3\", y: \"14\", width: \"7\", height: \"7\", rx: \"1\", key: \"1bkyp8\" }],\n [\"circle\", { cx: \"17.5\", cy: \"17.5\", r: \"3.5\", key: \"w3z12y\" }]\n]);\n\nexport { Shapes as default };\n//# sourceMappingURL=shapes.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 ShieldCheck = createLucideIcon(\"ShieldCheck\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n]);\n\nexport { ShieldCheck as default };\n//# sourceMappingURL=shield-check.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 SlidersHorizontal = createLucideIcon(\"SlidersHorizontal\", [\n [\"line\", { x1: \"21\", x2: \"14\", y1: \"4\", y2: \"4\", key: \"obuewd\" }],\n [\"line\", { x1: \"10\", x2: \"3\", y1: \"4\", y2: \"4\", key: \"1q6298\" }],\n [\"line\", { x1: \"21\", x2: \"12\", y1: \"12\", y2: \"12\", key: \"1iu8h1\" }],\n [\"line\", { x1: \"8\", x2: \"3\", y1: \"12\", y2: \"12\", key: \"ntss68\" }],\n [\"line\", { x1: \"21\", x2: \"16\", y1: \"20\", y2: \"20\", key: \"14d8ph\" }],\n [\"line\", { x1: \"12\", x2: \"3\", y1: \"20\", y2: \"20\", key: \"m0wm8r\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"2\", y2: \"6\", key: \"14e1ph\" }],\n [\"line\", { x1: \"8\", x2: \"8\", y1: \"10\", y2: \"14\", key: \"1i6ji0\" }],\n [\"line\", { x1: \"16\", x2: \"16\", y1: \"18\", y2: \"22\", key: \"1lctlv\" }]\n]);\n\nexport { SlidersHorizontal as default };\n//# sourceMappingURL=sliders-horizontal.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 StarOff = createLucideIcon(\"StarOff\", [\n [\"path\", { d: \"M8.34 8.34 2 9.27l5 4.87L5.82 21 12 17.77 18.18 21l-.59-3.43\", key: \"16m0ql\" }],\n [\"path\", { d: \"M18.42 12.76 22 9.27l-6.91-1L12 2l-1.44 2.91\", key: \"1vt8nq\" }],\n [\"line\", { x1: \"2\", x2: \"22\", y1: \"2\", y2: \"22\", key: \"a6p6uj\" }]\n]);\n\nexport { StarOff as default };\n//# sourceMappingURL=star-off.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 Star = createLucideIcon(\"Star\", [\n [\n \"path\",\n {\n d: \"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\",\n key: \"r04s7s\"\n }\n ]\n]);\n\nexport { Star as default };\n//# sourceMappingURL=star.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 Table2 = createLucideIcon(\"Table2\", [\n [\n \"path\",\n {\n d: \"M9 3H5a2 2 0 0 0-2 2v4m6-6h10a2 2 0 0 1 2 2v4M9 3v18m0 0h10a2 2 0 0 0 2-2V9M9 21H5a2 2 0 0 1-2-2V9m0 0h18\",\n key: \"gugj83\"\n }\n ]\n]);\n\nexport { Table2 as default };\n//# sourceMappingURL=table-2.js.map\n","/** @param {string | number | undefined | null} key */\nexport function formatInspectorFieldLabel(key) {\n if (key == null) return '';\n const text = String(key);\n if (!text) return '';\n return text\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .split(/[\\s_-]+/)\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n}\n\n/** @param {unknown} value */\nfunction numericComponents(value) {\n if (!Array.isArray(value)) return null;\n if (value.length === 0) return null;\n if (!value.every((entry) => typeof entry === 'number' && Number.isFinite(entry))) return null;\n return value;\n}\n\n/** @param {unknown} schema */\nfunction schemaTypeName(schema) {\n if (typeof schema === 'string') return schema.toLowerCase();\n if (schema && typeof schema === 'object' && typeof schema.type === 'string') return schema.type.toLowerCase();\n return '';\n}\n\nconst HEX_COLOR = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\n\n/** @param {unknown} value */\nfunction isAssetRefRecord(value) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = /** @type {Record<string, unknown>} */ (value);\n const identity = record.guid ?? record.id;\n if (typeof identity !== 'string' || identity.trim() === '') return false;\n return Object.values(record).every((entry) => entry == null || typeof entry !== 'object');\n}\n\n/**\n * @param {unknown} schema\n * @param {unknown} value\n * @returns {'bool' | 'number' | 'vector3' | 'vector4' | 'color' | 'asset' | 'enum' | 'text'}\n */\nexport function resolveInspectorFieldKind(schema, value) {\n const type = schemaTypeName(schema);\n\n if (typeof value === 'boolean' || type.includes('bool')) return 'bool';\n if (typeof value === 'number' || type === 'f32' || type === 'f64' || type === 'i32' || type === 'u32' || type === 'number') {\n return 'number';\n }\n\n const array = numericComponents(value);\n if (array?.length === 3) return 'vector3';\n if (array?.length === 4) return 'vector4';\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const record = /** @type {Record<string, unknown>} */ (value);\n if (typeof record.x === 'number' && typeof record.y === 'number' && typeof record.z === 'number') {\n return typeof record.w === 'number' ? 'vector4' : 'vector3';\n }\n }\n\n if (type.includes('enum') || (schema && typeof schema === 'object' && Array.isArray(/** @type {Record<string, unknown>} */ (schema).enum))) {\n return 'enum';\n }\n if (type.includes('color') || (typeof value === 'string' && HEX_COLOR.test(value))) return 'color';\n if (type.includes('asset') || type.includes('guid') || type.includes('ref') || isAssetRefRecord(value)) return 'asset';\n\n if (Array.isArray(value) || (value && typeof value === 'object')) return 'text';\n return 'text';\n}\n\n/** @param {unknown} value @param {string} kind */\nexport function normalizeInspectorFieldValue(value, kind) {\n if (value === undefined) return 'Unavailable';\n\n if (kind === 'vector3') {\n const array = numericComponents(value);\n if (array?.length === 3) return { x: array[0], y: array[1], z: array[2] };\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const record = /** @type {Record<string, number>} */ (value);\n return { x: record.x ?? 0, y: record.y ?? 0, z: record.z ?? 0 };\n }\n return { x: 0, y: 0, z: 0 };\n }\n\n if (kind === 'vector4') {\n const array = numericComponents(value);\n if (array?.length === 4) return { x: array[0], y: array[1], z: array[2], w: array[3] };\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const record = /** @type {Record<string, number>} */ (value);\n return { x: record.x ?? 0, y: record.y ?? 0, z: record.z ?? 0, w: record.w ?? 0 };\n }\n return { x: 0, y: 0, z: 0, w: 0 };\n }\n\n if (kind === 'asset' && value && typeof value === 'object' && !Array.isArray(value)) {\n const record = /** @type {Record<string, unknown>} */ (value);\n return String(record.name ?? record.guid ?? record.id ?? '');\n }\n\n if (kind === 'bool' || kind === 'number') return value;\n if (typeof value === 'object') return JSON.stringify(value);\n return value;\n}\n\n/** @param {string} key @param {string} label @param {string} kind @param {unknown} value @param {string[] | undefined} [options] */\nfunction freezeField(key, label, kind, value, options) {\n return Object.freeze({\n key,\n label,\n kind,\n value: normalizeInspectorFieldValue(value, kind),\n ...(options === undefined ? {} : { options: Object.freeze([...options]) }),\n });\n}\n\nfunction freezeGroup(group) {\n return Object.freeze({\n key: group.key,\n name: group.name,\n category: group.category,\n fields: Object.freeze(group.fields),\n groups: Object.freeze(group.groups),\n });\n}\n\n/** @param {unknown} value */\nfunction objectListItems(value) {\n if (!Array.isArray(value) || value.length === 0) return null;\n if (!value.every((entry) => entry && typeof entry === 'object' && !Array.isArray(entry))) return null;\n return value;\n}\n\n/**\n * @param {Record<string, unknown>} record\n * @param {string} keyPrefix\n */\nfunction partitionRecord(record, keyPrefix) {\n const fields = [];\n const groups = [];\n for (const [key, value] of Object.entries(record)) {\n if (value === undefined || value === null) continue;\n if (typeof value === 'string' && value.trim() === '') continue;\n const path = keyPrefix ? `${keyPrefix}.${key}` : key;\n const name = formatInspectorFieldLabel(key);\n const listed = objectListItems(value);\n if (listed) {\n const child = arrayToGroup(listed, path, name);\n if (child) groups.push(child);\n continue;\n }\n const kind = resolveInspectorFieldKind(undefined, value);\n const nestedObject = value && typeof value === 'object' && !Array.isArray(value)\n && kind !== 'vector3' && kind !== 'vector4' && kind !== 'asset';\n if (nestedObject) {\n const child = recordToGroup(/** @type {Record<string, unknown>} */ (value), path, name, 'all');\n if (child) groups.push(child);\n continue;\n }\n fields.push(freezeField(key, name, kind, value));\n }\n return { fields, groups };\n}\n\n/** @param {Record<string, unknown>} record @param {string} key @param {string} name @param {'all' | 'type' | 'capability'} category */\nfunction recordToGroup(record, key, name, category) {\n const partitioned = partitionRecord(record, key);\n if (partitioned.fields.length === 0 && partitioned.groups.length === 0) return null;\n return freezeGroup({\n key,\n name,\n category,\n fields: partitioned.fields,\n groups: partitioned.groups,\n });\n}\n\n/** @param {Record<string, unknown>[]} items @param {string} path @param {string} name */\nfunction arrayToGroup(items, path, name) {\n const groups = [];\n for (const [index, item] of items.entries()) {\n const label = item.name ?? item.id ?? item.slotName ?? item.guid ?? String(index);\n const child = recordToGroup(item, `${path}.${index}`, formatInspectorFieldLabel(String(label)), 'type');\n if (child) groups.push(child);\n }\n if (groups.length === 0) return null;\n return freezeGroup({\n key: path,\n name,\n category: 'capability',\n fields: [],\n groups,\n });\n}\n\nfunction identityFactFields(inspection) {\n const asset = inspection.asset && typeof inspection.asset === 'object' ? inspection.asset : {};\n const facts = [\n ['guid', 'GUID', inspection.guid ?? asset.guid],\n ['kind', 'Kind', asset.kind],\n ['name', 'Name', asset.name],\n ['path', 'Path', asset.path],\n ['source', 'Source', inspection.source?.path ?? asset.sourcePath],\n ['revision', 'Revision', inspection.revision ?? asset.revision ?? inspection.source?.revision],\n ['package', 'Package', asset.packageId ?? asset.packageUrl],\n ['ddc', 'DDC', inspection.ddc?.state],\n ];\n const fields = [];\n for (const [key, label, value] of facts) {\n if (value === undefined || value === null) continue;\n if (typeof value === 'string' && value.trim() === '') continue;\n fields.push(freezeField(key, label, resolveInspectorFieldKind(undefined, value), value));\n }\n return fields;\n}\n\n/**\n * @param {unknown} inspection\n * @param {{ identityTitle?: string }} [options]\n */\nexport function inspectorFormGroupsFromInspection(inspection, options = {}) {\n if (!inspection || typeof inspection !== 'object' || Array.isArray(inspection)) {\n return Object.freeze([]);\n }\n const identityTitle = options.identityTitle ?? 'Asset';\n const identityFields = identityFactFields(inspection);\n const meta = inspection.meta;\n let metaFields = [];\n let nested = [];\n if (meta && typeof meta === 'object' && !Array.isArray(meta)) {\n const partitioned = partitionRecord(/** @type {Record<string, unknown>} */ (meta), 'meta');\n metaFields = partitioned.fields;\n nested = partitioned.groups;\n }\n const groups = [];\n const fields = [...identityFields, ...metaFields];\n if (fields.length) {\n groups.push(freezeGroup({\n key: 'identity',\n name: identityTitle,\n category: 'type',\n fields,\n groups: [],\n }));\n }\n groups.push(...nested);\n return Object.freeze(groups);\n}\n","import { Box } from 'lucide-react';\nimport { useState, type ReactNode } from 'react';\n\nimport {\n Checkbox,\n CollapsibleSection,\n PropertyRow,\n Select,\n TextInput,\n} from './components';\nimport { inspectorFormGroupsFromInspection } from './inspector-form-model.mjs';\n\nexport type InspectorFormFieldKind =\n | 'vector3'\n | 'vector4'\n | 'number'\n | 'bool'\n | 'text'\n | 'enum'\n | 'color'\n | 'asset';\n\nexport type InspectorFormField = {\n key: string;\n label: string;\n kind: InspectorFormFieldKind;\n value: string | number | boolean | { x: number; y: number; z: number; w?: number };\n options?: string[];\n};\n\nexport type InspectorFormGroup = {\n key: string;\n name: string;\n category?: 'all' | 'type' | 'capability';\n fields: readonly InspectorFormField[];\n groups?: readonly InspectorFormGroup[];\n};\n\nconst READ_ONLY = { readOnly: true, tabIndex: -1 as const };\n\nfunction VectorField({\n axes,\n vector,\n}: {\n axes: readonly ('x' | 'y' | 'z' | 'w')[];\n vector: Record<'x' | 'y' | 'z' | 'w', number>;\n}) {\n return (\n <span className={`fx-inspector-form__vec${axes.length > 3 ? ' fx-inspector-form__vec--4' : ''}`}>\n {axes.map((axis) => (\n <span className={`fx-inspector-form__vcell fx-inspector-form__vcell--${axis}`} key={axis}>\n <span className=\"fx-inspector-form__axis\">{axis.toUpperCase()}</span>\n <span className=\"fx-inspector-form__numfield\">\n <TextInput\n className=\"fx-inspector-form__input fx-inspector-form__input--number\"\n type=\"number\"\n value={vector[axis]}\n {...READ_ONLY}\n />\n </span>\n </span>\n ))}\n </span>\n );\n}\n\nexport function InspectorFieldControl({ field }: { field: InspectorFormField }) {\n if (field.kind === 'vector3' && typeof field.value === 'object' && field.value !== null) {\n const vector = field.value as Record<'x' | 'y' | 'z', number>;\n return <VectorField axes={['x', 'y', 'z']} vector={{ ...vector, w: 0 }} />;\n }\n if (field.kind === 'vector4' && typeof field.value === 'object' && field.value !== null) {\n const vector = field.value as Record<'x' | 'y' | 'z' | 'w', number>;\n return <VectorField axes={['x', 'y', 'z', 'w']} vector={vector} />;\n }\n if (field.kind === 'bool') {\n return (\n <Checkbox\n className=\"fx-inspector-form__checkbox\"\n checked={field.value === true}\n disabled\n hideLabel\n label={field.label}\n />\n );\n }\n if (field.kind === 'enum') {\n return (\n <span className=\"fx-inspector-form__select\">\n <Select className=\"fx-inspector-form__input\" value={String(field.value)} disabled>\n {(field.options ?? [String(field.value)]).map((option) => (\n <option value={option} key={option}>{option}</option>\n ))}\n </Select>\n </span>\n );\n }\n if (field.kind === 'color') {\n return (\n <span className=\"fx-inspector-form__color\">\n <span className=\"fx-inspector-form__swatch\" aria-hidden style={{ background: String(field.value) }} />\n <TextInput className=\"fx-inspector-form__input fx-inspector-form__input--hex\" value={String(field.value)} {...READ_ONLY} />\n </span>\n );\n }\n if (field.kind === 'asset') {\n const empty = !String(field.value);\n return (\n <span className=\"fx-inspector-form__asset\">\n <span className={`fx-inspector-form__asset-thumb${empty ? ' is-empty' : ''}`}>{empty ? null : <Box size={16} />}</span>\n <span className=\"fx-inspector-form__asset-body\">\n <span className=\"fx-inspector-form__asset-combo\">\n <span className={`fx-inspector-form__asset-label${empty ? ' is-empty' : ''}`}>{empty ? 'None' : String(field.value)}</span>\n </span>\n </span>\n </span>\n );\n }\n return (\n <span className={field.kind === 'number' ? 'fx-inspector-form__numfield fx-inspector-form__numfield--solo' : undefined}>\n <TextInput\n className={`fx-inspector-form__input ${field.kind === 'number' ? 'fx-inspector-form__input--number' : 'fx-inspector-form__input--text'}`}\n type={field.kind === 'number' ? 'number' : 'text'}\n value={String(field.value)}\n {...READ_ONLY}\n />\n </span>\n );\n}\n\nfunction FormGroup({\n group,\n nested = false,\n}: {\n group: InspectorFormGroup;\n nested?: boolean;\n}) {\n const [open, setOpen] = useState(true);\n const category = group.category === 'all' ? 'all' : group.category === 'capability' ? 'cap' : 'type';\n return (\n <div className={`fx-inspector-form__group fx-inspector-form__group--${category}${nested ? ' is-nested' : ''}`}>\n <CollapsibleSection\n open={open}\n onOpenChange={setOpen}\n title={(\n <span className=\"fx-inspector-form__title\">\n <span className=\"fx-inspector-form__icon\"><Box size={13} strokeWidth={1.7} /></span>\n <span>{group.name}</span>\n </span>\n )}\n >\n <div className=\"fx-inspector-form__fields\">\n {group.fields.map((field) => (\n <div className=\"fx-inspector-form__row\" key={field.key} data-testid={`inspector-form-field-${group.key}-${field.key}`}>\n <PropertyRow className=\"fx-inspector-form__property\" label={<span title={field.key}>{field.label}</span>}>\n <InspectorFieldControl field={field} />\n </PropertyRow>\n </div>\n ))}\n {(group.groups ?? []).map((child) => (\n <FormGroup group={child} key={child.key} nested />\n ))}\n </div>\n </CollapsibleSection>\n </div>\n );\n}\n\nexport function InspectorForm({\n groups,\n inspection,\n identityTitle,\n className,\n empty,\n}: {\n groups?: readonly InspectorFormGroup[];\n inspection?: unknown;\n identityTitle?: string;\n className?: string;\n empty?: ReactNode;\n}) {\n const resolved = groups ?? inspectorFormGroupsFromInspection(inspection, { identityTitle }) as InspectorFormGroup[];\n if (resolved.length === 0) return empty ?? null;\n return (\n <div className={['fx-inspector-form', className].filter(Boolean).join(' ')} data-view-readonly=\"true\">\n {resolved.map((group) => (\n <FormGroup group={group} key={group.key} />\n ))}\n </div>\n );\n}\n","import { registerViewLocaleSink } from '@forgeax/view-workspace-core/locale-bridge';\nimport en from './locales/en.json' with { type: 'json' };\nimport zh from './locales/zh.json' with { type: 'json' };\n\nfunction createPluginI18n(catalogs) {\n let current = 'zh';\n const listeners = new Set();\n const lookup = (catalog, key) =>\n key.split('.').reduce((value, part) => value?.[part], catalog);\n const t = (key, vars) => {\n const message = lookup(catalogs[current], key) ?? lookup(catalogs.en, key) ?? key;\n return vars\n ? message.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => String(vars[name] ?? ''))\n : message;\n };\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const setLocale = (next) => {\n if (next !== 'en' && next !== 'zh') return;\n current = next;\n for (const listener of listeners) listener();\n };\n return { t, subscribe, getLocale: () => current, setLocale };\n}\n\nconst i18n = createPluginI18n({ en, zh });\n\nexport const t = i18n.t;\nexport const subscribeLocale = i18n.subscribe;\nexport const getLocale = i18n.getLocale;\nexport const setLocale = i18n.setLocale;\n\nregisterViewLocaleSink(i18n.setLocale);\n","import { useCallback, useSyncExternalStore } from 'react';\n\nimport { getLocale, subscribeLocale, t as translate } from './index.mjs';\n\nexport function useTranslation() {\n const locale = useSyncExternalStore(subscribeLocale, getLocale, getLocale);\n const t = useCallback(\n (key: string, vars?: Record<string, string | number>) => translate(key, vars),\n [locale],\n );\n return { t, locale };\n}\n","export const CONTENT_BROWSER_UI_SCHEMA_VERSION = 'forgeax.view.content-browser.ui/1';\n\nexport const CONTENT_BROWSER_ACTIONS = Object.freeze({\n search: 'content-browser.search',\n navigate: 'content-browser.navigate',\n navigateBack: 'content-browser.navigate.back',\n navigateForward: 'content-browser.navigate.forward',\n refresh: 'content-browser.refresh',\n setView: 'content-browser.view.set',\n setThumbnailSize: 'content-browser.thumbnail-size.set',\n setFilter: 'content-browser.filter.set',\n setSort: 'content-browser.sort.set',\n select: 'content-browser.select',\n activate: 'content-browser.activate',\n toggleFavorite: 'content-browser.favorite.toggle',\n toggleSourceGroup: 'content-browser.source-group.toggle',\n toggleDetailPanel: 'content-browser.detail-panel.toggle',\n togglePackExpansion: 'content-browser.pack.expand.toggle',\n showContextMenu: 'content-browser.context-menu.show',\n copyPath: 'content-browser.copy-path',\n});\n\nexport const CONTENT_BROWSER_MODEL_SCHEMA = Object.freeze({\n $id: CONTENT_BROWSER_UI_SCHEMA_VERSION,\n type: 'object',\n required: ['projectLabel', 'folder', 'view', 'files', 'folders'],\n properties: {\n projectLabel: { type: 'string' },\n folder: { type: 'string' },\n view: { enum: ['grid', 'list', 'column'] },\n thumbnailSize: { type: 'number', minimum: 48, maximum: 200 },\n detailPanelOpen: { type: 'boolean' },\n favorites: { type: 'array', items: { type: 'string' } },\n expandedPacks: { type: 'array', items: { type: 'string' } },\n folders: {\n type: 'array',\n items: {\n type: 'object',\n required: ['type', 'path', 'name', 'childCount'],\n properties: {\n type: { const: 'folder' },\n path: { type: 'string' },\n name: { type: 'string' },\n childCount: { type: 'number' },\n },\n },\n },\n files: {\n type: 'array',\n items: {\n type: 'object',\n required: ['type', 'path', 'name', 'family', 'assets'],\n properties: {\n type: { const: 'file' },\n path: { type: 'string' },\n name: { type: 'string' },\n family: {\n enum: ['code', 'config', 'doc', 'scene', 'pack', 'meta', 'image', 'audio', 'model', 'font', 'ui', 'data', 'other'],\n },\n isAssetPackage: { type: 'boolean' },\n assets: {\n type: 'array',\n items: {\n type: 'object',\n required: ['type', 'guid', 'kind', 'name', 'packPath'],\n properties: {\n type: { const: 'asset' },\n guid: { type: 'string' },\n kind: { type: 'string' },\n name: { type: 'string' },\n packPath: { type: 'string' },\n estimatedSize: { type: 'number' },\n packModifiedAt: { type: 'number' },\n },\n },\n },\n },\n },\n },\n },\n});\n","import type { CBFile, CBFileFamily, CBViewItem } from './types';\n\nexport const ALL_FILTER_FAMILIES = [\n 'dir', 'scene', 'pack', 'meta', 'model', 'image', 'audio', 'font', 'ui', 'code', 'config', 'doc', 'data',\n] as const;\n\n/** Sub-asset kinds for the filter menu. `scene` is omitted — use file type Scene instead. */\nexport const FILTERABLE_ASSET_KINDS = [\n 'plugin',\n 'mesh',\n 'material',\n 'texture',\n 'equirect',\n 'cube-texture',\n 'animation-clip',\n 'skeleton',\n 'audio',\n 'font',\n 'ui',\n] as const;\n\nconst SOURCE_TEXT_FAMILIES: ReadonlySet<CBFileFamily> = new Set([\n 'code', 'config', 'doc', 'data', 'pack', 'meta', 'scene',\n]);\nconst SOURCE_VIEW_EXTENSIONS = new Set(['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'json']);\n\nexport function dirOfPath(path: string): string {\n const index = path.lastIndexOf('/');\n return index < 0 ? '' : path.slice(0, index);\n}\n\nexport function childPath(parent: string, name: string): string {\n return parent ? `${parent}/${name}` : name;\n}\n\n/** Sanitise a typed address into a project-relative path (`''` = root). */\nexport function normalizePathInput(raw: string): string {\n return raw.trim().replace(/\\\\/g, '/').replace(/\\/+/g, '/').replace(/^\\/+|\\/+$/g, '');\n}\n\nexport function viewItemKey(item: CBViewItem): string {\n return item.type === 'asset' ? item.guid : item.path;\n}\n\nexport function isResourceGroup(assetCount: number): boolean {\n return assetCount > 1;\n}\n\nexport function fileFamilyOf(name: string): CBFileFamily {\n const lower = name.toLowerCase();\n if (lower.endsWith('.meta.json')) return 'meta';\n if (lower.endsWith('.pack.ts')) return 'pack';\n if (lower.endsWith('.pack.json')) return lower.includes('scene') ? 'scene' : 'pack';\n if (lower.endsWith('.scene.json') || lower === 'scene.json') return 'scene';\n if (lower.endsWith('.colliders.json')) return 'data';\n const ext = lower.split('.').pop() ?? '';\n if (['html', 'css', 'ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'py'].includes(ext)) return 'code';\n if (['json', 'lock'].includes(ext)) return 'config';\n if (['md', 'markdown', 'txt'].includes(ext)) return 'doc';\n if (['png', 'jpg', 'jpeg', 'webp', 'gif', 'svg', 'ico', 'hdr'].includes(ext)) return 'image';\n if (['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a', 'opus'].includes(ext)) return 'audio';\n if (['glb', 'gltf', 'fbx'].includes(ext)) return 'model';\n if (['ttf', 'otf', 'woff', 'woff2'].includes(ext)) return 'font';\n return 'other';\n}\n\nexport function fileFamilyOfWithAssets(\n name: string,\n assets: readonly { kind: string }[],\n): CBFileFamily {\n if (name.toLowerCase().endsWith('.pack.ts')) return 'pack';\n const byName = fileFamilyOf(name);\n if (byName === 'pack' && assets.some((asset) => asset.kind === 'scene')) return 'scene';\n return byName;\n}\n\nexport function isSourceViewableFileName(name: string): boolean {\n const lower = name.toLowerCase();\n if (lower.endsWith('.pack.json') || lower.endsWith('.pack.ts')) return true;\n const ext = lower.includes('.') ? lower.slice(lower.lastIndexOf('.') + 1) : lower;\n return SOURCE_VIEW_EXTENSIONS.has(ext);\n}\n\nexport function fileSupportsDualPreview(\n file: Pick<CBFile, 'family' | 'assets' | 'name'>,\n): boolean {\n if (file.assets.length === 0) return false;\n return SOURCE_TEXT_FAMILIES.has(file.family) || isSourceViewableFileName(file.name);\n}\n\nexport function resolveDualPreviewFile(\n item: CBViewItem,\n diskFiles: readonly CBFile[],\n): CBFile | undefined {\n if (item.type === 'file') return item;\n if (item.type === 'asset') return diskFiles.find((file) => file.path === item.packPath);\n return undefined;\n}\n\nexport function formatBytes(bytes: number | undefined): string {\n if (bytes === undefined || bytes <= 0) return '';\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function formatDate(ms: number | undefined): string {\n if (!ms) return '';\n try {\n return new Date(ms).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n } catch {\n return '';\n }\n}\n\nexport function compareItems(\n a: CBViewItem,\n b: CBViewItem,\n key: 'name' | 'kind' | 'packModifiedAt' | 'estimatedSize',\n dir: 'asc' | 'desc',\n): number {\n const sign = dir === 'desc' ? -1 : 1;\n if (key === 'kind') {\n return sign * itemKind(a).localeCompare(itemKind(b)) || sign * a.name.localeCompare(b.name);\n }\n if (key === 'packModifiedAt') {\n return sign * ((itemModified(a) - itemModified(b)) || a.name.localeCompare(b.name));\n }\n if (key === 'estimatedSize') {\n return sign * ((itemSize(a) - itemSize(b)) || a.name.localeCompare(b.name));\n }\n return sign * a.name.localeCompare(b.name);\n}\n\nfunction itemKind(item: CBViewItem): string {\n if (item.type === 'folder') return 'folder';\n if (item.type === 'file') return item.kindLabel || item.family;\n return item.kind;\n}\n\nfunction itemModified(item: CBViewItem): number {\n if (item.type === 'asset') return item.packModifiedAt ?? 0;\n if (item.type === 'file') return item.packModifiedAt ?? 0;\n return 0;\n}\n\nfunction itemSize(item: CBViewItem): number {\n if (item.type === 'asset') return item.estimatedSize ?? 0;\n if (item.type === 'file') return item.estimatedSize ?? 0;\n return 0;\n}\n\nexport function matchesSearch(item: CBViewItem, query: string): boolean {\n if (!query) return true;\n if (item.type === 'folder') {\n return item.name.toLowerCase().includes(query) || item.path.toLowerCase().includes(query);\n }\n if (item.type === 'file') {\n return item.name.toLowerCase().includes(query)\n || item.path.toLowerCase().includes(query)\n || item.assets.some((asset) => asset.name.toLowerCase().includes(query) || asset.kind.toLowerCase().includes(query));\n }\n return item.name.toLowerCase().includes(query)\n || item.guid.toLowerCase().startsWith(query)\n || item.kind.toLowerCase().includes(query);\n}\n","import {\n Bone,\n Box,\n Braces,\n Clapperboard,\n Database,\n File,\n FileCode2,\n FileText,\n Film,\n Folder,\n FolderOpen,\n Globe,\n Image,\n Layers,\n Music,\n Package,\n Paintbrush,\n Puzzle,\n Type,\n type LucideIcon,\n} from 'lucide-react';\nimport type { CBFileFamily, CBFilterFamily, CBViewItem } from './types';\n\nconst FAMILY_ICONS: Record<CBFilterFamily, LucideIcon> = {\n dir: Folder,\n scene: Clapperboard,\n pack: Package,\n meta: Layers,\n model: Box,\n image: Image,\n audio: Music,\n font: Type,\n ui: Paintbrush,\n code: FileCode2,\n config: Braces,\n doc: FileText,\n data: Database,\n other: File,\n};\n\nconst KIND_ICONS: Record<string, LucideIcon> = {\n plugin: Puzzle,\n mesh: Box,\n material: Paintbrush,\n texture: Image,\n image: Image,\n equirect: Globe,\n 'cube-texture': Globe,\n sampler: Layers,\n 'animation-clip': Film,\n 'animation-graph': Film,\n skeleton: Bone,\n skin: Bone,\n scene: Clapperboard,\n ui: Paintbrush,\n audio: Music,\n font: Type,\n video: Film,\n tileset: Layers,\n 'particle-effect': Layers,\n 'render-pipeline': Layers,\n};\n\nexport function familyIcon(family: CBFilterFamily | CBFileFamily): LucideIcon {\n return FAMILY_ICONS[family] ?? File;\n}\n\nexport function kindIcon(kind: string): LucideIcon {\n return KIND_ICONS[kind] ?? Package;\n}\n\nexport function itemIcon(item: CBViewItem, folderOpen = false): LucideIcon {\n if (item.type === 'folder') return folderOpen ? FolderOpen : Folder;\n if (item.type === 'file') return familyIcon(item.family);\n return kindIcon(item.kind);\n}\n","import {\n ALL_FILTER_FAMILIES,\n FILTERABLE_ASSET_KINDS,\n compareItems,\n dirOfPath,\n matchesSearch,\n} from './format';\nimport type {\n CBAsset,\n CBFile,\n CBFilter,\n CBFilterFamily,\n CBFolder,\n CBKindFilter,\n CBSortDir,\n CBSortKey,\n CBSortState,\n CBViewItem,\n} from './types';\n\nexport function translatedOrFallback(\n t: (key: string) => string,\n key: string,\n fallbackKey: string,\n): string {\n const label = t(key);\n return label === key ? t(fallbackKey) : label;\n}\n\nexport function assetKindLabel(\n kind: string,\n t: (key: string) => string,\n): string {\n return translatedOrFallback(\n t,\n `contentBrowser.assetKinds.${kind}`,\n 'contentBrowser.assetKinds.default',\n );\n}\n\nexport function buildFamilyFilters(\n activeFamilies: ReadonlySet<CBFilterFamily>,\n t: (key: string) => string,\n): CBFilter[] {\n return ALL_FILTER_FAMILIES.map((family) => ({\n id: `family:${family}`,\n family,\n label: translatedOrFallback(\n t,\n family === 'dir' ? 'contentBrowser.fileKinds.dir' : `contentBrowser.fileKinds.${family}`,\n 'contentBrowser.fileKinds.other',\n ),\n active: activeFamilies.has(family),\n }));\n}\n\nexport function buildKindFilters(\n activeKinds: ReadonlySet<string>,\n t: (key: string) => string,\n): CBKindFilter[] {\n return FILTERABLE_ASSET_KINDS.map((kind) => ({\n id: `kind:${kind}`,\n kind,\n label: assetKindLabel(kind, t),\n active: activeKinds.has(kind),\n }));\n}\n\nexport function toggleFilterId(\n filterId: string,\n activeFamilies: ReadonlySet<CBFilterFamily>,\n activeKinds: ReadonlySet<string>,\n): { families: Set<CBFilterFamily>; kinds: Set<string> } {\n const [scope, value] = filterId.split(':');\n const families = new Set(activeFamilies);\n const kinds = new Set(activeKinds);\n if (scope === 'kind' && value) {\n if (kinds.has(value)) kinds.delete(value);\n else kinds.add(value);\n return { families, kinds };\n }\n const family = value as CBFilterFamily;\n if (families.has(family)) families.delete(family);\n else families.add(family);\n return { families, kinds };\n}\n\nexport function fileKindLabel(\n file: Pick<CBFile, 'isAssetPackage' | 'family'>,\n t: (key: string) => string,\n): string {\n return file.isAssetPackage\n ? t('contentBrowser.fileKinds.assetPackage')\n : translatedOrFallback(\n t,\n `contentBrowser.fileKinds.${file.family}`,\n 'contentBrowser.fileKinds.other',\n );\n}\n\nexport function deriveViewItems({\n folders,\n files,\n currentPath,\n searchQuery,\n activeFamilies,\n activeKinds,\n sortState,\n expandedPacks,\n withKindLabel,\n}: {\n folders: readonly CBFolder[];\n files: readonly CBFile[];\n currentPath: string;\n searchQuery: string;\n activeFamilies: ReadonlySet<CBFilterFamily>;\n activeKinds: ReadonlySet<string>;\n sortState: CBSortState;\n expandedPacks: ReadonlySet<string>;\n withKindLabel: (file: CBFile) => CBFile;\n}): {\n foldersInPath: CBFolder[];\n filesInPath: CBFile[];\n viewItems: CBViewItem[];\n searchActive: boolean;\n kindFilterActive: boolean;\n} {\n const query = searchQuery.trim().toLowerCase();\n const searchActive = query !== '';\n const kindFilterActive = activeKinds.size > 0;\n const labeledFiles = files.map(withKindLabel);\n\n const foldersInPath = folders\n .filter((folder) => dirOfPath(folder.path) === currentPath)\n .filter(() => activeFamilies.size === 0 || activeFamilies.has('dir'))\n .filter((folder) => {\n if (!query) return true;\n const prefix = `${folder.path}/`;\n return matchesSearch(folder, query)\n || labeledFiles.some((file) => file.path.startsWith(prefix) && matchesSearch(file, query));\n })\n .toSorted((a, b) => compareItems(a, b, 'name', sortState.dir));\n\n const filesInPath = labeledFiles\n .filter((file) => dirOfPath(file.path) === currentPath)\n .filter((file) => activeFamilies.size === 0 || activeFamilies.has(file.family))\n .filter((file) => !query || matchesSearch(file, query))\n .toSorted((a, b) => compareItems(a, b, sortState.key, sortState.dir));\n\n if (kindFilterActive) {\n const seen = new Set<string>();\n const out: CBAsset[] = [];\n for (const file of filesInPath) {\n for (const asset of file.assets) {\n if (seen.has(asset.guid) || !activeKinds.has(asset.kind)) continue;\n if (query && !matchesSearch(asset, query) && !file.name.toLowerCase().includes(query)) continue;\n seen.add(asset.guid);\n out.push(asset);\n }\n }\n out.sort((a, b) => a.name.localeCompare(b.name));\n return { foldersInPath: [], filesInPath, viewItems: out, searchActive, kindFilterActive };\n }\n\n const items: CBViewItem[] = [...foldersInPath];\n for (const file of filesInPath) {\n if (file.assets.length === 0) {\n items.push(file);\n continue;\n }\n if (file.assets.length === 1) {\n items.push(...file.assets);\n continue;\n }\n items.push(file);\n if (searchActive || expandedPacks.has(file.path)) items.push(...file.assets);\n }\n return { foldersInPath, filesInPath, viewItems: items, searchActive, kindFilterActive };\n}\n\nexport function nextSortState(current: CBSortState, key: CBSortKey): CBSortState {\n if (current.key === key) return { key, dir: current.dir === 'asc' ? 'desc' : 'asc' };\n return { key, dir: 'asc' };\n}\n\nexport function setSortDir(current: CBSortState, dir: CBSortDir): CBSortState {\n return current.dir === dir ? current : { ...current, dir };\n}\n","import { type CSSProperties, type MouseEvent } from 'react';\nimport { Spinner } from '@forgeax/view-components';\nimport { useTranslation } from '../i18n/useTranslation';\nimport { CONTENT_BROWSER_ACTIONS } from '../schema.mjs';\nimport { formatBytes, formatDate, viewItemKey } from './format';\nimport { itemIcon } from './icons';\nimport { assetKindLabel, fileKindLabel } from './derived-view';\nimport type { CBSortKey, CBSortState, CBViewItem } from './types';\n\nconst COLUMNS: readonly { key: CBSortKey; labelKey: string; track: string }[] = [\n { key: 'name', labelKey: 'contentBrowser.details.colName', track: 'minmax(160px, 1fr)' },\n { key: 'kind', labelKey: 'contentBrowser.details.colType', track: '160px' },\n { key: 'estimatedSize', labelKey: 'contentBrowser.details.colSize', track: '90px' },\n { key: 'packModifiedAt', labelKey: 'contentBrowser.details.colModified', track: '130px' },\n];\n\nexport function CBDetailsList({\n items,\n selectedIds,\n openingKeys,\n sortState,\n onSort,\n onSelect,\n onActivate,\n onContextMenu,\n onBlankClick,\n}: {\n items: CBViewItem[];\n selectedIds: ReadonlySet<string>;\n openingKeys?: ReadonlySet<string>;\n sortState: CBSortState;\n onSort: (key: CBSortKey) => void;\n onSelect: (item: CBViewItem, event: MouseEvent) => void;\n onActivate: (item: CBViewItem) => void;\n onContextMenu: (event: MouseEvent, item: CBViewItem) => void;\n onBlankClick: () => void;\n}) {\n const { t } = useTranslation();\n const gridStyle = { '--cb-details-cols': COLUMNS.map((column) => column.track).join(' ') } as CSSProperties;\n\n return (\n <div\n className=\"cb-details-view cb-details-column\"\n role=\"grid\"\n style={gridStyle}\n onClick={(event) => { if (event.target === event.currentTarget) onBlankClick(); }}\n >\n <div className=\"cb-details-header\" role=\"row\">\n {COLUMNS.map((column) => {\n const active = sortState.key === column.key;\n return (\n <button\n key={column.key}\n type=\"button\"\n role=\"columnheader\"\n className={`cb-details-cell cb-details-th${active ? ' active' : ''}`}\n data-active={active ? 'true' : 'false'}\n aria-sort={active ? (sortState.dir === 'asc' ? 'ascending' : 'descending') : 'none'}\n onClick={() => onSort(column.key)}\n >\n <span>{t(column.labelKey)}</span>\n {active ? <span className=\"cb-details-sort-arrow\" aria-hidden=\"true\">{sortState.dir === 'asc' ? '\\u25b2' : '\\u25bc'}</span> : null}\n </button>\n );\n })}\n </div>\n <div className=\"cb-details-body\">\n {items.map((item) => {\n const key = viewItemKey(item);\n const selected = selectedIds.has(key);\n const opening = openingKeys?.has(key) ?? false;\n const Icon = itemIcon(item);\n const typeLabel = item.type === 'folder'\n ? t('contentBrowser.details.typeFolder')\n : item.type === 'file'\n ? item.kindLabel || fileKindLabel(item, t)\n : assetKindLabel(item.kind, t);\n const sizeLabel = item.type === 'folder'\n ? t('contentBrowser.details.itemCount', { count: item.childCount })\n : formatBytes(item.type === 'file' ? item.estimatedSize : item.estimatedSize);\n const modifiedLabel = item.type === 'folder' ? '' : formatDate(item.packModifiedAt);\n return (\n <div\n role=\"row\"\n tabIndex={0}\n className={`cb-details-row${selected ? ' sel' : ''}${opening ? ' is-busy' : ''}`}\n key={key}\n data-action={CONTENT_BROWSER_ACTIONS.select}\n aria-selected={selected}\n aria-busy={opening || undefined}\n onClick={(event) => onSelect(item, event)}\n onDoubleClick={() => onActivate(item)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n onActivate(item);\n } else if (event.key === ' ') {\n event.preventDefault();\n onSelect(item, event as unknown as MouseEvent);\n }\n }}\n onContextMenu={(event) => onContextMenu(event, item)}\n >\n <div className=\"cb-details-cell cb-details-name\" role=\"gridcell\">\n <span className={`cb-details-icon${item.type === 'folder' ? ' cb-folder-icon' : ''}`}><Icon size={16} /></span>\n <span className=\"cb-details-label\">{item.name}</span>\n {opening ? <Spinner className=\"cb-item-busy-inline\" label={t('contentBrowser.opening')} /> : null}\n </div>\n <div className=\"cb-details-cell cb-details-type\" role=\"gridcell\">{typeLabel}</div>\n <div className=\"cb-details-cell cb-details-size\" role=\"gridcell\">{sizeLabel}</div>\n <div className=\"cb-details-cell cb-details-modified\" role=\"gridcell\">{modifiedLabel}</div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { ChevronDown } from 'lucide-react';\nimport { Spinner } from '@forgeax/view-components';\nimport {\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from '../i18n/useTranslation';\nimport { CONTENT_BROWSER_ACTIONS } from '../schema.mjs';\nimport { viewItemKey } from './format';\nimport { itemIcon } from './icons';\nimport { assetKindLabel } from './derived-view';\nimport type { CBFile, CBViewItem, CBViewMode } from './types';\n\nexport function CBGrid({\n items,\n thumbnailSize,\n layout,\n searchActive,\n expandedPacks,\n selectedIds,\n openingKeys,\n onSelect,\n onActivate,\n onContextMenu,\n onTogglePackExpansion,\n onBlankClick,\n}: {\n items: CBViewItem[];\n thumbnailSize: number;\n layout: Exclude<CBViewMode, 'column'>;\n searchActive: boolean;\n expandedPacks: ReadonlySet<string>;\n selectedIds: ReadonlySet<string>;\n openingKeys?: ReadonlySet<string>;\n onSelect: (item: CBViewItem, event: MouseEvent) => void;\n onActivate: (item: CBViewItem) => void;\n onContextMenu: (event: MouseEvent, item: CBViewItem) => void;\n onTogglePackExpansion: (path: string) => void;\n onBlankClick: () => void;\n}) {\n const { t } = useTranslation();\n const rootRef = useRef<HTMLDivElement>(null);\n const [backdrops, setBackdrops] = useState<{ key: string; left: number; top: number; width: number; height: number; radius: string }[]>([]);\n const grouping = !searchActive;\n\n const measureGroups = useCallback(() => {\n const container = rootRef.current;\n if (!container) { setBackdrops((prev) => (prev.length ? [] : prev)); return; }\n const members = container.querySelectorAll<HTMLElement>('[data-cb-group]');\n if (members.length === 0) { setBackdrops((prev) => (prev.length ? [] : prev)); return; }\n const byGroup = new Map<string, HTMLElement[]>();\n members.forEach((el) => {\n const key = el.dataset.cbGroup;\n if (!key) return;\n const list = byGroup.get(key);\n if (list) list.push(el);\n else byGroup.set(key, [el]);\n });\n const pad = layout === 'list' ? 2 : 4;\n const radius = 8;\n // Padding-box right edge (inside any scrollbar). Do not clamp card bounds to\n // this — clamping cuts the backdrop short of the last card once a scrollbar\n // appears. Only the wrapped-row continuation uses it as a full-width edge.\n const containerRight = container.clientWidth;\n const next: typeof backdrops = [];\n for (const [key, els] of byGroup) {\n const rows: { top: number; els: HTMLElement[] }[] = [];\n for (const el of els) {\n const top = el.offsetTop;\n const row = rows.find((entry) => Math.abs(entry.top - top) <= 4);\n if (row) row.els.push(el);\n else rows.push({ top, els: [el] });\n }\n const multiRow = rows.length > 1;\n rows.forEach((row, idx) => {\n let left = Infinity;\n let right = -Infinity;\n let top = Infinity;\n let bottom = -Infinity;\n for (const el of row.els) {\n left = Math.min(left, el.offsetLeft);\n right = Math.max(right, el.offsetLeft + el.offsetWidth);\n top = Math.min(top, el.offsetTop);\n bottom = Math.max(bottom, el.offsetTop + el.offsetHeight);\n }\n const extendLeft = multiRow && idx > 0;\n const extendRight = multiRow && idx < rows.length - 1;\n const x0 = extendLeft ? 0 : left - pad;\n const x1 = extendRight ? containerRight : right + pad;\n next.push({\n key: `${key}#${idx}`,\n left: x0,\n top: top - pad,\n width: x1 - x0,\n height: bottom - top + pad * 2,\n radius: `${extendLeft ? 0 : radius}px ${extendRight ? 0 : radius}px ${extendRight ? 0 : radius}px ${extendLeft ? 0 : radius}px`,\n });\n });\n }\n setBackdrops(next);\n }, [layout]);\n\n useLayoutEffect(() => {\n measureGroups();\n const container = rootRef.current;\n if (!container) return;\n let raf = 0;\n const schedule = () => { cancelAnimationFrame(raf); raf = requestAnimationFrame(measureGroups); };\n const observer = new ResizeObserver(schedule);\n observer.observe(container);\n container.querySelectorAll<HTMLElement>('[data-cb-group]').forEach((el) => observer.observe(el));\n return () => { cancelAnimationFrame(raf); observer.disconnect(); };\n }, [measureGroups, items, expandedPacks, thumbnailSize, searchActive]);\n\n const renderCard = (item: CBViewItem, expanded = false, groupKey?: string): ReactNode => {\n const key = viewItemKey(item);\n const selected = selectedIds.has(key);\n const opening = openingKeys?.has(key) ?? false;\n const Icon = itemIcon(item);\n const isFolder = item.type === 'folder';\n const isFile = item.type === 'file';\n const groupCount = grouping && isFile && item.assets.length >= 2 ? item.assets.length : 0;\n const stacked = groupCount >= 2;\n const meta = isFolder\n ? null\n : isFile\n ? item.kindLabel\n : assetKindLabel(item.kind, t);\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={`cb-grid-item cb-fe-card${isFolder ? ' cb-grid-folder' : ''}${isFile ? ' cb-file-card' : ''}${selected ? ' sel' : ''}${expanded ? ' cb-pack-expanded' : ''}${stacked ? ' cb-group-card' : ''}${groupKey ? ' cb-group-member' : ''}${opening ? ' is-busy' : ''}`}\n key={key}\n data-action={CONTENT_BROWSER_ACTIONS.select}\n data-cb-group={groupKey}\n aria-selected={selected}\n aria-busy={opening || undefined}\n onClick={(event) => onSelect(item, event)}\n onDoubleClick={() => onActivate(item)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n onActivate(item);\n } else if (event.key === ' ') {\n event.preventDefault();\n onSelect(item, event as unknown as MouseEvent);\n }\n }}\n onContextMenu={(event) => onContextMenu(event, item)}\n >\n <span className={`cb-grid-thumb cb-fe-thumb${isFile ? ' cb-file-thumb' : ''}${isFolder ? ' cb-folder-thumb' : ''}`}>\n <span className={isFolder ? 'cb-folder-icon' : 'cb-grid-icon'}><Icon /></span>\n {groupCount >= 1 ? (\n <button\n type=\"button\"\n className={`cb-group-badge${expanded ? ' open' : ''}`}\n data-action={CONTENT_BROWSER_ACTIONS.togglePackExpansion}\n title={t('contentBrowser.menu.expandSubAssets')}\n onClick={(event) => {\n event.stopPropagation();\n onSelect(item, event);\n onTogglePackExpansion((item as CBFile).path);\n }}\n >\n <span className=\"cb-group-badge-num\">{groupCount}</span>\n <ChevronDown size={11} />\n </button>\n ) : null}\n </span>\n <span className={`cb-grid-label cb-fe-label${meta ? ' has-kind' : ''}`}>\n <span className=\"cb-fe-name\">{item.name}</span>\n {meta ? <span className=\"cb-card-meta\">{meta}</span> : null}\n </span>\n {opening ? (\n layout === 'list' ? (\n <Spinner className=\"cb-item-busy-inline\" label={t('contentBrowser.opening')} />\n ) : (\n <span className=\"cb-item-busy-veil\">\n <Spinner label={t('contentBrowser.opening')} />\n </span>\n )\n ) : null}\n </div>\n );\n };\n\n const nodes: ReactNode[] = [];\n for (let index = 0; index < items.length; ) {\n const item = items[index];\n if (!item) { index += 1; continue; }\n if (grouping && item.type === 'file' && item.assets.length >= 2 && expandedPacks.has(item.path)) {\n const guids = new Set(item.assets.map((asset) => asset.guid));\n nodes.push(renderCard(item, true, item.path));\n let nextIndex = index + 1;\n for (; nextIndex < items.length; nextIndex += 1) {\n const next = items[nextIndex];\n if (!next || next.type !== 'asset' || !guids.has(next.guid)) break;\n nodes.push(renderCard(next, false, item.path));\n }\n index = nextIndex;\n continue;\n }\n nodes.push(renderCard(item));\n index += 1;\n }\n\n return (\n <div\n ref={rootRef}\n className={`cb-grid-view cb-fe-grid cb-layout-${layout}`}\n style={{ '--cb-thumb': `${thumbnailSize}px` } as CSSProperties}\n onClick={(event) => { if (event.target === event.currentTarget) onBlankClick(); }}\n >\n {backdrops.length > 0 ? (\n <div className=\"cb-group-backdrops\" aria-hidden=\"true\">\n {backdrops.map((backdrop) => (\n <div key={backdrop.key} className=\"cb-group-backdrop\" style={{ left: backdrop.left, top: backdrop.top, width: backdrop.width, height: backdrop.height, borderRadius: backdrop.radius }} />\n ))}\n </div>\n ) : null}\n {nodes}\n </div>\n );\n}\n","import { ChevronLeft, ChevronRight, Folder, RefreshCw } from 'lucide-react';\nimport { IconButton, MenuDropdown, Toolbar } from '@forgeax/view-components';\nimport { useCallback, useState, type KeyboardEvent, type MouseEvent } from 'react';\nimport { useTranslation } from '../i18n/useTranslation';\nimport { CONTENT_BROWSER_ACTIONS } from '../schema.mjs';\nimport { normalizePathInput } from './format';\n\nfunction immediateChildren(allDirs: readonly string[], path: string): { name: string; path: string }[] {\n const prefix = path ? `${path}/` : '';\n const depth = path ? path.split('/').length : 0;\n const out: { name: string; path: string }[] = [];\n for (const dir of allDirs) {\n if (path && dir === path) continue;\n if (!dir.startsWith(prefix)) continue;\n if (dir.split('/').length !== depth + 1) continue;\n out.push({ name: dir.split('/').pop() ?? dir, path: dir });\n }\n return out.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction LevelChevron({\n levelPath,\n activeNextSeg,\n allDirs,\n onNavigate,\n label,\n}: {\n levelPath: string;\n activeNextSeg: string | null;\n allDirs: readonly string[];\n onNavigate: (path: string) => void;\n label: string;\n}) {\n const children = immediateChildren(allDirs, levelPath);\n if (children.length === 0) {\n return (\n <span className=\"cb-crumb-chevron\" aria-hidden=\"true\">\n <ChevronRight size={12} />\n </span>\n );\n }\n return (\n <span className=\"cb-crumb-chevron\" onClick={(event) => event.stopPropagation()}>\n <MenuDropdown\n label={label}\n align=\"start\"\n className=\"cb-crumb-menu\"\n trigger={\n <button\n type=\"button\"\n className=\"cb-crumb-chevron-btn\"\n aria-label={label}\n title={label}\n onClick={(event) => event.stopPropagation()}\n >\n <ChevronRight size={12} />\n </button>\n }\n items={children.map((child) => ({\n id: child.path,\n label: child.name,\n icon: <Folder size={14} />,\n buttonProps: child.name === activeNextSeg ? { 'data-active': '' } : undefined,\n onSelect: () => onNavigate(child.path),\n }))}\n />\n </span>\n );\n}\n\nexport function CBNavigationBar({\n currentPath,\n projectLabel,\n allDirs,\n canGoBack,\n canGoForward,\n refreshDisabled,\n onBack,\n onForward,\n onRefresh,\n onNavigate,\n}: {\n currentPath: string;\n projectLabel: string;\n allDirs: readonly string[];\n canGoBack: boolean;\n canGoForward: boolean;\n refreshDisabled: boolean;\n onBack: () => void;\n onForward: () => void;\n onRefresh: () => void;\n onNavigate: (path: string) => void;\n}) {\n const { t } = useTranslation();\n const segments = currentPath ? currentPath.split('/').filter(Boolean) : [];\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState('');\n\n const beginEdit = useCallback(() => {\n setDraft(currentPath);\n setEditing(true);\n }, [currentPath]);\n\n const commit = useCallback(() => {\n onNavigate(normalizePathInput(draft));\n setEditing(false);\n }, [draft, onNavigate]);\n\n const onInputKeyDown = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n commit();\n } else if (event.key === 'Escape') {\n event.preventDefault();\n setEditing(false);\n }\n }, [commit]);\n\n const onAddressKeyDown = useCallback((event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n beginEdit();\n }\n }, [beginEdit]);\n\n const stopAndNavigate = (event: MouseEvent<HTMLButtonElement>, path: string) => {\n event.stopPropagation();\n onNavigate(path);\n };\n\n return (\n <Toolbar className=\"cb-navigation-bar\">\n <IconButton\n size=\"compact\"\n variant=\"quiet\"\n label={t('contentBrowser.back')}\n icon={<ChevronLeft size={14} />}\n data-action={CONTENT_BROWSER_ACTIONS.navigateBack}\n disabled={!canGoBack}\n onClick={onBack}\n />\n <IconButton\n size=\"compact\"\n variant=\"quiet\"\n label={t('contentBrowser.forward')}\n icon={<ChevronRight size={14} />}\n data-action={CONTENT_BROWSER_ACTIONS.navigateForward}\n disabled={!canGoForward}\n onClick={onForward}\n />\n <IconButton\n size=\"compact\"\n variant=\"quiet\"\n label={t('contentBrowser.refresh')}\n disabled={refreshDisabled}\n icon={<RefreshCw size={13} />}\n data-action={CONTENT_BROWSER_ACTIONS.refresh}\n onClick={onRefresh}\n />\n <div className=\"cb-address-slot\">\n {editing ? (\n <input\n autoFocus\n spellCheck={false}\n className=\"cb-address-input\"\n value={draft}\n placeholder={t('contentBrowser.actions.editPathPlaceholder')}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={onInputKeyDown}\n onBlur={() => setEditing(false)}\n onFocus={(event) => event.currentTarget.select()}\n />\n ) : (\n <div\n className=\"cb-address\"\n role=\"button\"\n tabIndex={0}\n title={t('contentBrowser.actions.editPath')}\n onClick={beginEdit}\n onKeyDown={onAddressKeyDown}\n >\n <div className=\"cb-address-crumb\">\n <button\n type=\"button\"\n className={segments.length ? 'cb-crumb-item' : 'cb-crumb-item cb-crumb-current'}\n aria-current={segments.length === 0 ? 'page' : undefined}\n data-action={CONTENT_BROWSER_ACTIONS.navigate}\n onClick={(event) => stopAndNavigate(event, '')}\n >\n {projectLabel}\n </button>\n {segments.map((segment, index) => {\n const path = segments.slice(0, index + 1).join('/');\n const parentPath = segments.slice(0, index).join('/');\n const parentLabel = index === 0 ? projectLabel : (segments[index - 1] ?? projectLabel);\n const isCurrent = index === segments.length - 1;\n return (\n <span className=\"cb-crumb-segment\" key={path}>\n <LevelChevron\n levelPath={parentPath}\n activeNextSeg={segment}\n allDirs={allDirs}\n onNavigate={onNavigate}\n label={t('contentBrowser.actions.openSubfolders', { name: parentLabel })}\n />\n <button\n type=\"button\"\n className={isCurrent ? 'cb-crumb-item cb-crumb-current' : 'cb-crumb-item'}\n aria-current={isCurrent ? 'page' : undefined}\n data-action={CONTENT_BROWSER_ACTIONS.navigate}\n onClick={(event) => stopAndNavigate(event, path)}\n >\n {segment}\n </button>\n </span>\n );\n })}\n </div>\n </div>\n )}\n </div>\n </Toolbar>\n );\n}\n","import type { CBFileFamily, PreviewFileInfo } from '../types';\n\n/** Keep in sync with `view-workspace-core/src/file-preview.mjs`. */\nexport const MAX_BINARY_PREVIEW_BYTES = 10 * 1024 * 1024;\n\nexport function isBrowserMediaPreviewKind(kind: string): boolean {\n return kind === 'image' || kind === 'audio' || kind === 'video';\n}\n\nexport function isFontPreviewInfo(info: Pick<PreviewFileInfo, 'kind' | 'mime'>): boolean {\n return info.kind === 'binary' && info.mime.startsWith('font/');\n}\n\nexport function familySuggestsMediaPreview(family: CBFileFamily): boolean {\n return family === 'image' || family === 'audio' || family === 'font';\n}\n\nexport function familySuggestsEnginePreview(family: CBFileFamily): boolean {\n return family === 'model';\n}\n\nexport function svgMarkupSrc(content: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(content)}`;\n}\n\nexport function mediaPreviewBlockedReason(\n info: PreviewFileInfo,\n): 'too-large' | 'unavailable' | null {\n if (info.dataUrl || (info.kind === 'image' && info.content)) return null;\n if (info.size > MAX_BINARY_PREVIEW_BYTES) return 'too-large';\n return 'unavailable';\n}\n","import {\n isBrowserMediaPreviewKind,\n isFontPreviewInfo,\n mediaPreviewBlockedReason,\n svgMarkupSrc,\n} from './media-preview-policy';\nimport type { PreviewFileInfo } from '../types';\n\nexport function MediaPreview({\n info,\n fileName,\n t,\n}: {\n info: PreviewFileInfo;\n fileName: string;\n t: (key: string) => string;\n}) {\n if (isFontPreviewInfo(info)) {\n return <FontPreview info={info} sample={fileName} t={t} />;\n }\n if (!isBrowserMediaPreviewKind(info.kind)) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.noMediaPreview')}</div>;\n }\n\n const blocked = mediaPreviewBlockedReason(info);\n if (blocked === 'too-large') {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.previewTooLarge')}</div>;\n }\n if (blocked === 'unavailable') {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.noMediaPreview')}</div>;\n }\n\n const src = info.dataUrl ?? (info.content ? svgMarkupSrc(info.content) : undefined);\n if (!src) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.noMediaPreview')}</div>;\n }\n\n if (info.kind === 'audio') {\n return (\n <div className=\"cb-preview-media\">\n <audio className=\"cb-preview-audio\" controls preload=\"metadata\" src={src} aria-label={fileName} />\n </div>\n );\n }\n if (info.kind === 'video') {\n return (\n <div className=\"cb-preview-media\">\n <video className=\"cb-preview-video\" controls preload=\"metadata\" src={src} aria-label={fileName} />\n </div>\n );\n }\n return (\n <div className=\"cb-preview-media\">\n <img className=\"cb-preview-image\" src={src} alt={fileName} decoding=\"async\" />\n </div>\n );\n}\n\nfunction FontPreview({\n info,\n sample,\n t,\n}: {\n info: PreviewFileInfo;\n sample: string;\n t: (key: string) => string;\n}) {\n const blocked = mediaPreviewBlockedReason(info);\n if (blocked === 'too-large') {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.previewTooLarge')}</div>;\n }\n if (!info.dataUrl) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.noMediaPreview')}</div>;\n }\n const fontId = `cb-preview-font-${info.path.replace(/[^\\w-]+/g, '-')}`;\n return (\n <div className=\"cb-preview-media cb-preview-font\">\n <style>{`@font-face{font-family:${fontId};src:url(${info.dataUrl});font-display:swap;}`}</style>\n <p className=\"cb-preview-font-sample\" style={{ fontFamily: fontId }}>\n {t('contentBrowser.preview.fontSample')}\n </p>\n <p className=\"cb-preview-font-meta\">{sample}</p>\n </div>\n );\n}\n","export interface LanguageResolution {\n readonly lang: string;\n readonly label: string;\n}\n\nconst EXT_LANGUAGE: Readonly<Record<string, LanguageResolution>> = {\n ts: { lang: 'typescript', label: 'TypeScript' },\n mts: { lang: 'typescript', label: 'TypeScript' },\n cts: { lang: 'typescript', label: 'TypeScript' },\n tsx: { lang: 'tsx', label: 'TSX' },\n js: { lang: 'javascript', label: 'JavaScript' },\n mjs: { lang: 'javascript', label: 'JavaScript' },\n cjs: { lang: 'javascript', label: 'JavaScript' },\n jsx: { lang: 'jsx', label: 'JSX' },\n json: { lang: 'json', label: 'JSON' },\n jsonc: { lang: 'jsonc', label: 'JSONC' },\n json5: { lang: 'json5', label: 'JSON5' },\n css: { lang: 'css', label: 'CSS' },\n scss: { lang: 'scss', label: 'SCSS' },\n html: { lang: 'html', label: 'HTML' },\n htm: { lang: 'html', label: 'HTML' },\n md: { lang: 'markdown', label: 'Markdown' },\n markdown: { lang: 'markdown', label: 'Markdown' },\n py: { lang: 'python', label: 'Python' },\n rs: { lang: 'rust', label: 'Rust' },\n wgsl: { lang: 'wgsl', label: 'WGSL' },\n glsl: { lang: 'glsl', label: 'GLSL' },\n vert: { lang: 'glsl', label: 'GLSL' },\n frag: { lang: 'glsl', label: 'GLSL' },\n sh: { lang: 'shellscript', label: 'Shell' },\n bash: { lang: 'shellscript', label: 'Shell' },\n zsh: { lang: 'shellscript', label: 'Shell' },\n yaml: { lang: 'yaml', label: 'YAML' },\n yml: { lang: 'yaml', label: 'YAML' },\n toml: { lang: 'toml', label: 'TOML' },\n xml: { lang: 'xml', label: 'XML' },\n};\n\nexport function resolveLanguage(ext: string): LanguageResolution | undefined {\n const key = ext.replace(/^\\./, '').toLowerCase();\n return EXT_LANGUAGE[key];\n}\n","import { resolveLanguage } from './ext-language';\n\nexport const MAX_HIGHLIGHT_BYTES = 200 * 1024;\nexport const MAX_HIGHLIGHT_LINES = 5_000;\n\nexport type HighlightDecision =\n | { readonly highlight: true; readonly lang: string; readonly label: string }\n | { readonly highlight: false; readonly reason: 'no-content' | 'unknown-language' | 'too-large' };\n\nexport interface HighlightPolicyInput {\n readonly ext: string;\n readonly size: number;\n readonly content?: string;\n}\n\nfunction countLines(text: string): number {\n let lines = 1;\n for (let index = 0; index < text.length; index += 1) {\n if (text.charCodeAt(index) === 10) lines += 1;\n }\n return lines;\n}\n\nexport function decideHighlight(input: HighlightPolicyInput): HighlightDecision {\n const { ext, size, content } = input;\n if (content == null) return { highlight: false, reason: 'no-content' };\n const resolved = resolveLanguage(ext);\n if (!resolved) return { highlight: false, reason: 'unknown-language' };\n const byteSize = Math.max(size, content.length);\n if (byteSize > MAX_HIGHLIGHT_BYTES || countLines(content) > MAX_HIGHLIGHT_LINES) {\n return { highlight: false, reason: 'too-large' };\n }\n return { highlight: true, lang: resolved.lang, label: resolved.label };\n}\n","// shiki stays a content-browser dependency. Specifiers are static so Vite\n// resolves them from this package's node_modules and code-splits grammars.\n\ntype HighlighterCore = {\n loadLanguage: (lang: unknown) => Promise<unknown>;\n codeToHtml: (code: string, options: { lang: string; theme: string }) => string;\n};\ntype LanguageInput = unknown;\ntype ThemeRegistrationRaw = unknown;\n\nexport type HighlightAppearance = 'light' | 'dark';\n\nexport const HIGHLIGHT_THEMES = {\n light: 'github-light-default',\n dark: 'github-dark-default',\n} as const;\n\ntype LangModule = { readonly default: LanguageInput };\n\nconst LANG_LOADERS: Readonly<Record<string, () => Promise<LangModule>>> = {\n typescript: () => import('shiki/langs/typescript.mjs'),\n tsx: () => import('shiki/langs/tsx.mjs'),\n javascript: () => import('shiki/langs/javascript.mjs'),\n jsx: () => import('shiki/langs/jsx.mjs'),\n json: () => import('shiki/langs/json.mjs'),\n jsonc: () => import('shiki/langs/jsonc.mjs'),\n json5: () => import('shiki/langs/json5.mjs'),\n css: () => import('shiki/langs/css.mjs'),\n scss: () => import('shiki/langs/scss.mjs'),\n html: () => import('shiki/langs/html.mjs'),\n markdown: () => import('shiki/langs/markdown.mjs'),\n python: () => import('shiki/langs/python.mjs'),\n rust: () => import('shiki/langs/rust.mjs'),\n wgsl: () => import('shiki/langs/wgsl.mjs'),\n glsl: () => import('shiki/langs/glsl.mjs'),\n shellscript: () => import('shiki/langs/shellscript.mjs'),\n yaml: () => import('shiki/langs/yaml.mjs'),\n toml: () => import('shiki/langs/toml.mjs'),\n xml: () => import('shiki/langs/xml.mjs'),\n};\n\nlet corePromise: Promise<HighlighterCore> | null = null;\nconst loadedLangs = new Set<string>();\nconst inFlightLangs = new Map<string, Promise<boolean>>();\n\nasync function getCore(): Promise<HighlighterCore> {\n if (!corePromise) {\n corePromise = (async () => {\n const [coreMod, engineMod, darkTheme, lightTheme] = await Promise.all([\n import('shiki/core'),\n import('shiki/engine/javascript'),\n import('shiki/themes/github-dark-default.mjs'),\n import('shiki/themes/github-light-default.mjs'),\n ]);\n const core = await coreMod.createHighlighterCore({\n themes: [darkTheme.default, lightTheme.default],\n langs: [],\n engine: engineMod.createJavaScriptRegexEngine({ forgiving: true }),\n });\n return core as unknown as HighlighterCore;\n })();\n }\n return corePromise as Promise<HighlighterCore>;\n}\n\nasync function ensureLanguage(core: HighlighterCore, lang: string): Promise<boolean> {\n if (loadedLangs.has(lang)) return true;\n const loader = LANG_LOADERS[lang];\n if (!loader) return false;\n let pending = inFlightLangs.get(lang);\n if (!pending) {\n pending = (async () => {\n const mod = await loader();\n await core.loadLanguage(mod.default);\n loadedLangs.add(lang);\n return true;\n })();\n inFlightLangs.set(lang, pending);\n }\n return pending;\n}\n\nexport async function highlightToHtml(\n code: string,\n lang: string,\n appearance: HighlightAppearance = 'dark',\n): Promise<string | null> {\n const core = await getCore();\n const ready = await ensureLanguage(core, lang);\n if (!ready) return null;\n return core.codeToHtml(code, { lang, theme: HIGHLIGHT_THEMES[appearance] });\n}\n","import { useEffect, useState } from 'react';\nimport { useTranslation } from '../../i18n/useTranslation';\nimport { decideHighlight } from './code-preview-policy';\nimport { resolveLanguage } from './ext-language';\nimport { highlightToHtml, type HighlightAppearance } from './highlighter';\n\nfunction readDocumentAppearance(): HighlightAppearance {\n if (typeof document === 'undefined') return 'light';\n return document.documentElement.dataset.theme === 'dark' ? 'dark' : 'light';\n}\n\nfunction useDocumentAppearance(): HighlightAppearance {\n const [appearance, setAppearance] = useState<HighlightAppearance>(readDocumentAppearance);\n useEffect(() => {\n const root = document.documentElement;\n const sync = () => setAppearance(readDocumentAppearance());\n sync();\n const observer = new MutationObserver(sync);\n observer.observe(root, { attributes: true, attributeFilter: ['data-theme'] });\n return () => observer.disconnect();\n }, []);\n return appearance;\n}\n\nexport function CodePreview({\n name,\n ext,\n size,\n content,\n}: {\n name: string;\n ext: string;\n size: number;\n content: string;\n}) {\n const { t } = useTranslation();\n const appearance = useDocumentAppearance();\n const decision = decideHighlight({ ext, size, content });\n const targetLang = decision.highlight ? decision.lang : null;\n const label = resolveLanguage(ext)?.label ?? ext.toUpperCase();\n const [html, setHtml] = useState<string | null>(null);\n\n useEffect(() => {\n setHtml(null);\n if (targetLang == null) return;\n let cancelled = false;\n void highlightToHtml(content, targetLang, appearance)\n .then((out) => { if (!cancelled) setHtml(out); })\n .catch(() => { if (!cancelled) setHtml(null); });\n return () => { cancelled = true; };\n }, [appearance, content, targetLang]);\n\n const skippedForSize = !decision.highlight && decision.reason === 'too-large';\n\n return (\n <div className=\"cb-preview-code\" data-lang={resolveLanguage(ext)?.lang ?? 'text'}>\n <div className=\"cb-preview-code-head\">\n <span className=\"cb-preview-code-badge\">{label}</span>\n {skippedForSize ? <span className=\"cb-preview-code-hint\">{t('contentBrowser.preview.highlightSkipped')}</span> : null}\n </div>\n {html != null\n ? <div className=\"cb-preview-code-shiki\" dangerouslySetInnerHTML={{ __html: html }} />\n : <pre className=\"cb-preview-code-plain\" aria-label={name}>{content}</pre>}\n </div>\n );\n}\n","import type { CBFile, PreviewFileInfo } from '../types';\nimport { familySuggestsEnginePreview, familySuggestsMediaPreview, isBrowserMediaPreviewKind, isFontPreviewInfo } from './media-preview-policy';\nimport { MediaPreview } from './MediaPreview';\nimport { CodePreview } from './CodePreview';\nimport { resolveLanguage } from './ext-language';\n\nexport function FileContentPreview({\n file,\n previewInfo,\n status,\n pendingRemote,\n t,\n}: {\n file: CBFile;\n previewInfo: PreviewFileInfo | null;\n status: 'idle' | 'loading' | 'ready';\n pendingRemote?: boolean;\n t: (key: string) => string;\n}) {\n if (status === 'loading' || pendingRemote) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.loadingSource')}</div>;\n }\n\n if (previewInfo && (isBrowserMediaPreviewKind(previewInfo.kind) || isFontPreviewInfo(previewInfo))) {\n return <MediaPreview info={previewInfo} fileName={file.name} t={t} />;\n }\n if (previewInfo?.kind === 'model' || familySuggestsEnginePreview(file.family)) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.previewEngineRequired')}</div>;\n }\n if (!previewInfo && familySuggestsMediaPreview(file.family)) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.noMediaPreview')}</div>;\n }\n\n const content = previewInfo?.content ?? file.sourcePreview;\n if (content == null) {\n return <div className=\"cb-preview-note\">{t('contentBrowser.preview.noTextPreview')}</div>;\n }\n const dotIndex = file.name.lastIndexOf('.');\n const ext = dotIndex >= 0 ? file.name.slice(dotIndex + 1).toLowerCase() : '';\n if (resolveLanguage(ext)) {\n return (\n <CodePreview\n name={file.name}\n ext={ext}\n size={previewInfo?.size ?? file.estimatedSize ?? 0}\n content={content}\n />\n );\n }\n return (\n <pre className=\"cb-preview-source\">\n <code>{content}</code>\n </pre>\n );\n}\n","import { useEffect, useRef, useState, type PointerEvent } from 'react';\n\nexport function useLocalSize(\n key: string,\n initial: number,\n min: number,\n max: number,\n): readonly [number, (next: number | ((prev: number) => number)) => void] {\n const clamp = (value: number) => Math.min(max, Math.max(min, value));\n const [value, setValueRaw] = useState<number>(() => {\n if (typeof window === 'undefined') return initial;\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return initial;\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? clamp(parsed) : initial;\n } catch {\n return initial;\n }\n });\n useEffect(() => {\n try {\n window.localStorage.setItem(key, String(value));\n } catch {\n /* ignore quota / privacy mode */\n }\n }, [key, value]);\n const setValue = (next: number | ((prev: number) => number)) => {\n setValueRaw((prev) => clamp(typeof next === 'function' ? next(prev) : next));\n };\n return [value, setValue] as const;\n}\n\nexport function ResizeHandle({\n onDrag,\n onDragEnd,\n title,\n}: {\n onDrag: (delta: number) => void;\n onDragEnd?: () => void;\n title?: string;\n}) {\n const startRef = useRef<number | null>(null);\n const onPointerDown = (event: PointerEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n startRef.current = event.clientX;\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n };\n const onPointerMove = (event: PointerEvent<HTMLDivElement>) => {\n if (startRef.current == null) return;\n const delta = event.clientX - startRef.current;\n startRef.current = event.clientX;\n onDrag(delta);\n };\n const finish = (event: PointerEvent<HTMLDivElement>) => {\n if (startRef.current == null) return;\n startRef.current = null;\n try {\n event.currentTarget.releasePointerCapture(event.pointerId);\n } catch {\n /* already released */\n }\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n onDragEnd?.();\n };\n return (\n <div\n className=\"cb-resize-handle\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={finish}\n onPointerCancel={finish}\n title={title}\n role=\"separator\"\n aria-orientation=\"vertical\"\n />\n );\n}\n","import { X } from 'lucide-react';\nimport { IconButton } from '@forgeax/view-components';\nimport { useEffect, useState } from 'react';\nimport { useTranslation } from '../i18n/useTranslation';\nimport { dirOfPath, fileSupportsDualPreview, resolveDualPreviewFile } from './format';\nimport { itemIcon } from './icons';\nimport { assetKindLabel, fileKindLabel } from './derived-view';\nimport { FileContentPreview } from './preview/FileContentPreview';\nimport { ResizeHandle } from './resize-handle';\nimport type { CBFile, CBFilePreviewMode, CBFolder, CBViewItem, PreviewFileInfo } from './types';\n\nexport function CBPreviewPanel({\n previewItem,\n foldersInPath,\n diskFiles,\n projectLabel,\n readPreview,\n onClose,\n onDrag,\n onDragEnd,\n}: {\n previewItem: CBViewItem | null;\n foldersInPath: CBFolder[];\n diskFiles: CBFile[];\n projectLabel: string;\n readPreview?: (path: string, options?: { signal?: AbortSignal }) => Promise<PreviewFileInfo | null>;\n onClose: () => void;\n onDrag: (delta: number) => void;\n onDragEnd: () => void;\n}) {\n const { t } = useTranslation();\n const [filePreviewMode, setFilePreviewMode] = useState<CBFilePreviewMode>('assets');\n const [previewInfo, setPreviewInfo] = useState<PreviewFileInfo | null>(null);\n const [previewStatus, setPreviewStatus] = useState<'idle' | 'loading' | 'ready'>('idle');\n const dualPreviewFile = previewItem ? resolveDualPreviewFile(previewItem, diskFiles) : undefined;\n const showDualPreview = dualPreviewFile !== undefined && fileSupportsDualPreview(dualPreviewFile);\n const previewKey = previewItem ? (previewItem.type === 'asset' ? previewItem.guid : previewItem.path) : null;\n const previewSourcePath = dualPreviewFile?.diskPath || dualPreviewFile?.path || null;\n const dualAssetCount = dualPreviewFile?.assets.length ?? 0;\n const dualSupportsPreview = dualPreviewFile ? fileSupportsDualPreview(dualPreviewFile) : false;\n const embeddedSourcePreview = dualPreviewFile?.sourcePreview ?? null;\n const canReadPreview = typeof readPreview === 'function';\n\n useEffect(() => {\n setFilePreviewMode('assets');\n }, [previewKey]);\n\n useEffect(() => {\n if (!previewSourcePath) {\n setPreviewInfo(null);\n setPreviewStatus('idle');\n return;\n }\n const needsSource = dualAssetCount === 0\n || (dualSupportsPreview && filePreviewMode === 'source');\n if (!needsSource) {\n setPreviewInfo(null);\n setPreviewStatus('idle');\n return;\n }\n if (embeddedSourcePreview != null && !canReadPreview) {\n setPreviewInfo({\n path: dualPreviewFile?.path ?? previewSourcePath,\n kind: 'text',\n mime: 'text/plain; charset=utf-8',\n size: dualPreviewFile?.estimatedSize ?? embeddedSourcePreview.length,\n mtime: dualPreviewFile?.packModifiedAt ?? 0,\n content: embeddedSourcePreview,\n });\n setPreviewStatus('ready');\n return;\n }\n if (!canReadPreview || !readPreview) {\n setPreviewInfo(null);\n setPreviewStatus('ready');\n return;\n }\n let cancelled = false;\n setPreviewInfo(null);\n setPreviewStatus('loading');\n const controller = new AbortController();\n void readPreview(previewSourcePath, { signal: controller.signal })\n .then((info) => {\n if (cancelled) return;\n setPreviewInfo(info);\n setPreviewStatus('ready');\n })\n .catch(() => {\n if (cancelled) return;\n setPreviewInfo(null);\n setPreviewStatus('ready');\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [\n canReadPreview,\n dualAssetCount,\n dualSupportsPreview,\n embeddedSourcePreview,\n filePreviewMode,\n previewSourcePath,\n readPreview,\n ]);\n\n if (!previewItem) {\n return (\n <>\n <ResizeHandle onDrag={onDrag} onDragEnd={onDragEnd} title={t('contentBrowser.actions.resizePreview')} />\n <aside className=\"cb-preview-panel cb-preview-empty\">\n <div className=\"cb-preview-body\">\n <div className=\"cb-preview-note\">{t('contentBrowser.preview.nothingSelected')}</div>\n </div>\n </aside>\n </>\n );\n }\n\n const Icon = itemIcon(previewItem, true);\n const meta = previewItem.type === 'folder'\n ? t('contentBrowser.preview.folderMeta', { path: previewItem.path || projectLabel })\n : previewItem.type === 'file'\n ? t('contentBrowser.preview.fileMeta', { kind: previewItem.kindLabel, path: previewItem.path })\n : t('contentBrowser.preview.assetMeta', { kind: assetKindLabel(previewItem.kind, t), path: previewItem.packPath });\n\n let body;\n if (previewItem.type === 'folder') {\n const kids = [\n ...foldersInPath.filter((folder) => dirOfPath(folder.path) === previewItem.path),\n ...diskFiles.filter((entry) => dirOfPath(entry.path) === previewItem.path),\n ].slice(0, 40);\n body = kids.length === 0 ? (\n <div className=\"cb-preview-note\">{t('contentBrowser.preview.emptyFolder')}</div>\n ) : (\n <div className=\"cb-preview-list\">\n {kids.map((child) => {\n const ChildIcon = itemIcon(child);\n return (\n <div className=\"cb-preview-list-item\" key={child.path}>\n <span className={`cb-preview-list-ico${child.type === 'folder' ? ' cb-folder-icon' : ''}`}><ChildIcon size={15} /></span>\n <span>{child.name}</span>\n <span className=\"sub\">\n {child.type === 'folder'\n ? t('contentBrowser.preview.items', { count: child.childCount })\n : child.kindLabel || fileKindLabel(child, t)}\n </span>\n </div>\n );\n })}\n </div>\n );\n } else if (previewItem.type === 'file') {\n const showSource = filePreviewMode === 'source' && showDualPreview;\n if (previewItem.assets.length > 0 && !showSource) {\n body = <FileAssetList file={previewItem} t={t} />;\n } else {\n body = (\n <FileContentPreview\n file={showDualPreview ? dualPreviewFile ?? previewItem : previewItem}\n previewInfo={previewInfo}\n status={previewStatus}\n pendingRemote={isFilePreviewPending(canReadPreview, previewStatus, previewInfo, showDualPreview ? dualPreviewFile ?? previewItem : previewItem)}\n t={t}\n />\n );\n }\n } else {\n const showSource = showDualPreview && filePreviewMode === 'source' && dualPreviewFile;\n body = showSource ? (\n <FileContentPreview\n file={dualPreviewFile}\n previewInfo={previewInfo}\n status={previewStatus}\n pendingRemote={isFilePreviewPending(canReadPreview, previewStatus, previewInfo, dualPreviewFile)}\n t={t}\n />\n ) : (\n <>\n <div className=\"cb-preview-media cb-preview-asset-hero\">\n <span className=\"cb-preview-hero-icon\"><Icon size={64} /></span>\n </div>\n <div className=\"cb-preview-asset-list\">\n <div className=\"cb-preview-asset-row\">\n <span className=\"cb-preview-list-ico\"><Icon size={15} /></span>\n <div className=\"cb-preview-asset-main\" title={previewItem.packPath}>\n <div title={previewItem.name}>{previewItem.name}</div>\n <div className=\"kind\" title={previewItem.packPath}>{previewItem.packPath}</div>\n </div>\n <span className=\"guid\" title={previewItem.guid}>{previewItem.guid}</span>\n </div>\n </div>\n </>\n );\n }\n\n return (\n <>\n <ResizeHandle onDrag={onDrag} onDragEnd={onDragEnd} title={t('contentBrowser.actions.resizePreview')} />\n <aside className=\"cb-preview-panel\" data-subject-id={previewItem.type === 'asset' ? previewItem.guid : previewItem.path}>\n <div className=\"cb-preview-head\">\n <span className={`cb-preview-ico${previewItem.type === 'folder' ? ' cb-folder-icon' : ''}`}><Icon size={15} /></span>\n <div className=\"cb-preview-title\">\n <div className=\"name\">{previewItem.name}</div>\n <div className=\"meta\">{meta}</div>\n </div>\n <IconButton\n size=\"compact\"\n variant=\"quiet\"\n className=\"cb-preview-close\"\n label={t('contentBrowser.preview.close')}\n icon={<X size={14} />}\n onClick={onClose}\n />\n </div>\n {showDualPreview ? (\n <div className=\"cb-preview-mode-bar\" role=\"tablist\" aria-label={t('contentBrowser.preview.modeAssets')}>\n <button type=\"button\" role=\"tab\" className={`cb-preview-mode-btn${filePreviewMode === 'assets' ? ' is-active' : ''}`} aria-selected={filePreviewMode === 'assets'} onClick={() => setFilePreviewMode('assets')}>\n {t('contentBrowser.preview.modeAssets')}\n </button>\n <button type=\"button\" role=\"tab\" className={`cb-preview-mode-btn${filePreviewMode === 'source' ? ' is-active' : ''}`} aria-selected={filePreviewMode === 'source'} onClick={() => setFilePreviewMode('source')}>\n {t('contentBrowser.preview.modeSource')}\n </button>\n </div>\n ) : null}\n <div className=\"cb-preview-body\">{body}</div>\n </aside>\n </>\n );\n}\n\nfunction FileAssetList({ file, t }: { file: CBFile; t: (key: string, vars?: Record<string, string | number>) => string }) {\n return (\n <div className=\"cb-preview-asset-list\">\n {file.assets.map((asset) => {\n const Icon = itemIcon(asset);\n return (\n <div className=\"cb-preview-asset-row\" key={asset.guid}>\n <span className=\"cb-preview-list-ico\"><Icon size={15} /></span>\n <div className=\"cb-preview-asset-main\">\n <div title={asset.name}>{asset.name}</div>\n <div className=\"kind\" title={assetKindLabel(asset.kind, t)}>{assetKindLabel(asset.kind, t)}</div>\n </div>\n <span className=\"guid\" title={asset.guid}>{asset.guid}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction isFilePreviewPending(\n canReadPreview: boolean,\n status: 'idle' | 'loading' | 'ready',\n previewInfo: PreviewFileInfo | null,\n file: CBFile,\n): boolean {\n if (!canReadPreview || status !== 'idle') return false;\n if (previewInfo) return false;\n return file.sourcePreview == null;\n}\n","import { fileFamilyOfWithAssets, isResourceGroup } from './format';\nimport type { CBAsset, CBFile, CBFileFamily, CBFolder } from './types';\n\nexport const PROJECT_LABEL = '47 game';\n\nconst TODAY = Date.parse('2026-09-18T04:00:00Z');\nconst YESTERDAY = Date.parse('2026-09-17T04:00:00Z');\n\nfunction asset(\n guid: string,\n kind: string,\n name: string,\n packPath: string,\n packIndex: number,\n estimatedSize: number,\n packModifiedAt: number,\n): CBAsset {\n return {\n type: 'asset',\n guid,\n kind,\n name,\n packPath,\n packIndex,\n payload: { mock: true },\n refs: [],\n estimatedSize,\n packModifiedAt,\n };\n}\n\nfunction file(\n path: string,\n assets: CBAsset[],\n extra: { sourcePreview?: string; estimatedSize?: number; packModifiedAt?: number } = {},\n): CBFile {\n const name = path.slice(path.lastIndexOf('/') + 1);\n const family: CBFileFamily = fileFamilyOfWithAssets(name, assets);\n const isAssetPackage = isResourceGroup(assets.length);\n return {\n type: 'file',\n path,\n diskPath: path,\n name,\n family,\n assets,\n isAssetPackage,\n kindLabel: isAssetPackage ? '' : family,\n sourcePreview: extra.sourcePreview,\n estimatedSize: extra.estimatedSize,\n packModifiedAt: extra.packModifiedAt ?? assets[0]?.packModifiedAt,\n };\n}\n\nconst characterAssets = [\n asset('11111111-1111-4111-8111-111111111111', 'mesh', 'HeroMesh', 'assets/character.glb', 0, 482_000, TODAY),\n asset('11111111-1111-4111-8111-111111111112', 'material', 'HeroMaterial', 'assets/character.glb', 1, 12_400, TODAY),\n asset('11111111-1111-4111-8111-111111111113', 'texture', 'HeroAlbedo', 'assets/character.glb', 2, 1_024_000, TODAY),\n];\n\nconst environmentAssets = [\n asset('22222222-2222-4222-8222-222222222221', 'mesh', 'EnvMesh', 'assets/environment.fbx', 0, 1_280_000, YESTERDAY),\n asset('22222222-2222-4222-8222-222222222222', 'material', 'EnvMaterial', 'assets/environment.fbx', 1, 18_200, YESTERDAY),\n asset('22222222-2222-4222-8222-222222222223', 'animation-clip', 'WalkClip', 'assets/environment.fbx', 2, 96_000, YESTERDAY),\n asset('22222222-2222-4222-8222-222222222224', 'skeleton', 'EnvSkeleton', 'assets/environment.fbx', 3, 22_000, YESTERDAY),\n];\n\nconst packMaterials = [\n asset('33333333-3333-4333-8333-333333333331', 'material', 'Metal', 'assets/materials.pack.json', 0, 9_700, TODAY),\n asset('33333333-3333-4333-8333-333333333332', 'material', 'Wood', 'assets/materials.pack.json', 1, 8_200, TODAY),\n];\n\nconst sceneAsset = asset('44444444-4444-4444-8444-444444444441', 'scene', 'Main Scene', 'assets/scene-main.pack.json', 0, 18_200, TODAY);\nconst baseMaterial = asset('55555555-5555-4555-8555-555555555551', 'material', 'BaseMaterial', 'assets/base-material.pack.json', 0, 9_700, TODAY);\nconst skyAsset = asset('66666666-6666-4666-8666-666666666661', 'cube-texture', 'SkyCubemap', 'assets/sky.pack.json', 0, 2_400_000, YESTERDAY);\nconst hudAsset = asset('77777777-7777-4777-8777-777777777771', 'ui', 'HUD', 'assets/hud.pack.json', 0, 12_500, YESTERDAY);\n\nexport const MOCK_FILES: CBFile[] = [\n file('AGENTS.md', [], { sourcePreview: '# AGENTS\\n\\nProject agent notes.\\n', estimatedSize: 7_200, packModifiedAt: TODAY }),\n file('FORGE.md', [], { sourcePreview: '# FORGE\\n\\nWorkspace contract.\\n', estimatedSize: 4_800, packModifiedAt: YESTERDAY }),\n file('capability-adapters.json', [], {\n sourcePreview: '{\\n \"adapters\": [\"content-browser\", \"inspector\"]\\n}\\n',\n estimatedSize: 3_100,\n packModifiedAt: TODAY,\n }),\n file('package.json', [], {\n sourcePreview: '{\\n \"name\": \"47-game\",\\n \"private\": true\\n}\\n',\n estimatedSize: 1_600,\n packModifiedAt: TODAY,\n }),\n file('main.ts', [], {\n sourcePreview: 'export function boot() {\\n return \"47 game\";\\n}\\n',\n estimatedSize: 2_400,\n packModifiedAt: TODAY,\n }),\n file('assets/character.glb', characterAssets, { estimatedSize: 1_520_000, packModifiedAt: TODAY }),\n file('assets/environment.fbx', environmentAssets, { estimatedSize: 2_400_000, packModifiedAt: YESTERDAY }),\n file('assets/materials.pack.json', packMaterials, {\n sourcePreview: '{\\n \"assets\": [\\n { \"kind\": \"material\", \"name\": \"Metal\" },\\n { \"kind\": \"material\", \"name\": \"Wood\" }\\n ]\\n}\\n',\n estimatedSize: 4_200,\n packModifiedAt: TODAY,\n }),\n file('assets/scene-main.pack.json', [sceneAsset], {\n sourcePreview: '{\\n \"assets\": [{ \"kind\": \"scene\", \"name\": \"Main Scene\" }]\\n}\\n',\n estimatedSize: 18_200,\n packModifiedAt: TODAY,\n }),\n file('assets/base-material.pack.json', [baseMaterial], {\n sourcePreview: '{\\n \"assets\": [{ \"kind\": \"material\", \"name\": \"BaseMaterial\" }]\\n}\\n',\n estimatedSize: 9_700,\n packModifiedAt: TODAY,\n }),\n file('assets/sky.pack.json', [skyAsset], {\n sourcePreview: '{\\n \"assets\": [{ \"kind\": \"cube-texture\", \"name\": \"SkyCubemap\" }]\\n}\\n',\n estimatedSize: 2_400_000,\n packModifiedAt: YESTERDAY,\n }),\n file('assets/hud.pack.json', [hudAsset], {\n sourcePreview: '{\\n \"assets\": [{ \"kind\": \"ui\", \"name\": \"HUD\" }]\\n}\\n',\n estimatedSize: 12_500,\n packModifiedAt: YESTERDAY,\n }),\n file('assets/hero.png', [], { estimatedSize: 84_000, packModifiedAt: TODAY }),\n file('assets/shot.wav', [], { estimatedSize: 220_000, packModifiedAt: YESTERDAY }),\n file('assets/Inter.ttf', [], { estimatedSize: 310_000, packModifiedAt: YESTERDAY }),\n file('assets/ground.colliders.json', [], {\n sourcePreview: '{\\n \"colliders\": [{ \"shape\": \"box\" }]\\n}\\n',\n estimatedSize: 1_200,\n packModifiedAt: TODAY,\n }),\n file('scripts/smoke-geometry.mjs', [], {\n sourcePreview: 'export const geometry = { kind: \"box\" };\\n',\n estimatedSize: 3_800,\n packModifiedAt: TODAY,\n }),\n file('scripts/smoke-rotation.mjs', [], {\n sourcePreview: 'export function rotate(dt) { return dt * 0.2; }\\n',\n estimatedSize: 2_100,\n packModifiedAt: YESTERDAY,\n }),\n file('sessions/logs/debug.log', [], { sourcePreview: '[info] boot\\n[debug] frame 1\\n', estimatedSize: 31_000, packModifiedAt: TODAY }),\n file('sessions/logs/latest.log', [], { sourcePreview: '[info] ready\\n', estimatedSize: 11_000, packModifiedAt: TODAY }),\n file('src/index.ts', [], { sourcePreview: 'export {};\\n', estimatedSize: 80, packModifiedAt: YESTERDAY }),\n];\n\nconst folderPaths = ['assets', 'scripts', 'sessions', 'sessions/logs', 'src'];\n\nexport const MOCK_FOLDERS: CBFolder[] = folderPaths.map((path) => {\n const prefix = `${path}/`;\n const fileCount = MOCK_FILES.filter((entry) => entry.path.startsWith(prefix)).length;\n const folderCount = folderPaths.filter((entry) => entry !== path && entry.startsWith(prefix) && !entry.slice(prefix.length).includes('/')).length;\n return {\n type: 'folder',\n path,\n name: path.slice(path.lastIndexOf('/') + 1),\n childCount: fileCount + folderCount,\n };\n});\n\nexport const DIRECTORY_TREE = MOCK_FOLDERS.map((folder) => ({\n path: folder.path,\n name: folder.name,\n depth: folder.path.split('/').length - 1,\n}));\n","import { fileFamilyOfWithAssets, isResourceGroup } from './format';\nimport type { CBAsset, CBFile, CBFolder } from './types';\n\nexport interface CatalogAsset {\n guid: string;\n kind: string;\n name?: string;\n label?: string;\n sourceKey?: string;\n sourcePath?: string;\n path?: string;\n}\n\n/** Presentation of the Engine catalog, not a filesystem inventory. */\nexport function projectCatalog(root: string, assets: readonly CatalogAsset[]) {\n const files = new Map<string, CBFile>();\n const prefix = `${root.replaceAll('\\\\', '/').replace(/\\/$/, '')}/`;\n for (const asset of assets) {\n const source = (asset.sourcePath ?? asset.path ?? asset.guid).replaceAll('\\\\', '/');\n const relative = source.startsWith(prefix) ? source.slice(prefix.length) : source;\n const external = relative.startsWith('/') || /^[a-z]:\\//i.test(relative) || relative.split('/').includes('..');\n // External catalog sources are a presentation group, never project navigation segments.\n const path = external ? `External assets/${encodeURIComponent(source)}` : relative.replace(/^\\.\\//, '');\n let file = files.get(path);\n if (!file) {\n file = { type: 'file', path, diskPath: source, name: source.split('/').at(-1)!,\n family: 'pack', assets: [], isAssetPackage: false, kindLabel: '' };\n files.set(path, file);\n }\n const item: CBAsset = { type: 'asset', guid: asset.guid, kind: asset.kind,\n name: (source.toLowerCase().endsWith('.pack.ts') ? asset.sourceKey : undefined)\n ?? asset.name ?? asset.label ?? asset.guid, packPath: path };\n file.assets.push(item);\n file.family = fileFamilyOfWithAssets(file.name, file.assets);\n file.isAssetPackage = isResourceGroup(file.assets.length);\n }\n const folders = new Map<string, CBFolder>();\n for (const file of files.values()) {\n const parts = file.path.split('/').filter(Boolean).slice(0, -1);\n for (let index = 0; index < parts.length; index++) {\n const path = parts.slice(0, index + 1).join('/');\n if (!folders.has(path)) folders.set(path, { type: 'folder', path, name: parts[index]!, childCount: 0 });\n }\n }\n for (const folder of folders.values()) {\n folder.childCount = [...folders.values(), ...files.values()].filter((item) =>\n item.path.slice(0, item.path.lastIndexOf('/')) === folder.path).length;\n }\n return { files: [...files.values()], folders: [...folders.values()] };\n}\n","import {\n ArrowDownWideNarrow,\n ArrowUpDown,\n ArrowUpNarrowWide,\n CaseSensitive,\n ChevronDown,\n Clock,\n Copy,\n Filter,\n Folder,\n FolderOpen,\n Grid2X2,\n HardDrive,\n List,\n Settings2,\n Shapes,\n Star,\n StarOff,\n Table2,\n} from 'lucide-react';\nimport {\n Button,\n Checkbox,\n ContextMenu,\n EmptyState,\n FloatingMenu,\n IconButton,\n PanelHeader,\n RangeInput,\n SearchField,\n Switch,\n Toolbar,\n anchorRectFromPoint,\n type AnchorRect,\n type MenuItem as FxMenuItem,\n useWorkspaceClientConnected,\n} from '@forgeax/view-components';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport { VIEW_FILE_GET_SERVICE, VIEW_WORKSPACE_TAB_ID, workspaceUiFingerprint } from '@forgeax/view-workspace-core/contract';\nimport { useTranslation } from '../i18n/useTranslation';\nimport { CONTENT_BROWSER_ACTIONS } from '../schema.mjs';\nimport { CBDetailsList } from './CBDetailsList';\nimport { CBGrid } from './CBGrid';\nimport { CBNavigationBar } from './CBNavigationBar';\nimport { CBPreviewPanel } from './CBPreviewPanel';\nimport {\n buildFamilyFilters,\n buildKindFilters,\n deriveViewItems,\n fileKindLabel,\n nextSortState,\n setSortDir,\n toggleFilterId,\n} from './derived-view';\nimport { normalizePathInput, viewItemKey } from './format';\nimport { familyIcon, itemIcon, kindIcon } from './icons';\nimport { DIRECTORY_TREE, MOCK_FILES, MOCK_FOLDERS, PROJECT_LABEL } from './mock-catalog';\nimport { projectCatalog, type CatalogAsset } from './workspace-catalog';\nimport { ResizeHandle, useLocalSize } from './resize-handle';\nimport type {\n CBFilterFamily,\n CBSortDir,\n CBSortKey,\n CBSortState,\n CBViewItem,\n CBViewMode,\n PreviewFileInfo,\n} from './types';\n\ntype BrowserMenuItem =\n | { kind: 'title'; label: string; icon?: ReactNode }\n | { kind: 'separator' }\n | {\n kind: 'item';\n id: string;\n label: string;\n icon?: ReactNode;\n shortcut?: string;\n disabled?: boolean;\n danger?: boolean;\n action: () => void;\n };\ntype ContextMenuState = { anchor: AnchorRect; items: BrowserMenuItem[] } | null;\n\nconst LAYOUT_OPTIONS: readonly { mode: CBViewMode; icon: ReactNode; labelKey: string }[] = [\n { mode: 'grid', icon: <Grid2X2 size={14} />, labelKey: 'contentBrowser.layoutGrid' },\n { mode: 'list', icon: <List size={14} />, labelKey: 'contentBrowser.layoutList' },\n { mode: 'column', icon: <Table2 size={14} />, labelKey: 'contentBrowser.layoutColumn' },\n];\nconst SORT_KEYS: readonly CBSortKey[] = ['name', 'kind', 'packModifiedAt', 'estimatedSize'];\nconst SORT_KEY_ICONS: Record<CBSortKey, typeof CaseSensitive> = {\n name: CaseSensitive,\n kind: Shapes,\n packModifiedAt: Clock,\n estimatedSize: HardDrive,\n};\n\nfunction isContextMenuAnchor(element: HTMLElement) {\n return element.classList.contains('cb-grid-item')\n || element.classList.contains('cb-fe-card')\n || element.classList.contains('cb-details-row')\n || element.classList.contains('cb-source-row');\n}\n\nfunction toFxMenuItems(items: BrowserMenuItem[], close?: () => void): FxMenuItem[] {\n return items.map((item) => {\n if (item.kind === 'separator') return { type: 'separator' };\n if (item.kind === 'title') {\n return { type: 'title', label: <span className=\"cb-menu-title\">{item.icon}{item.label}</span> };\n }\n return {\n id: item.id,\n label: item.label,\n icon: item.icon,\n shortcut: item.shortcut,\n disabled: item.disabled,\n danger: item.danger,\n buttonProps: { 'data-operation': item.id },\n onSelect: () => {\n item.action();\n close?.();\n },\n };\n });\n}\n\nexport function ContentBrowserPanel({\n client,\n demo = false,\n}: {\n client?: ViewWorkspaceClient;\n demo?: boolean;\n}) {\n const { t } = useTranslation();\n const [snapshot, setSnapshot] = useState<{ revision?: number; project?: { id: string; root: string; name?: string } | null; assets?: CatalogAsset[] | null }>({});\n const [loadFailed, setLoadFailed] = useState(false);\n const [actionError, setActionError] = useState('');\n const [loading, setLoading] = useState(false);\n const [openingKeys, setOpeningKeys] = useState(new Set<string>());\n const project = snapshot.project;\n const projectLabel = demo ? PROJECT_LABEL : project?.name ?? project?.root ?? 'No project';\n const catalog = useMemo(() => projectCatalog(project?.root ?? '', snapshot.assets ?? []), [project?.root, snapshot.assets]);\n const files = demo ? MOCK_FILES : catalog.files;\n const folders = demo ? MOCK_FOLDERS : catalog.folders;\n const directoryTree = demo ? DIRECTORY_TREE : folders.map((folder) => ({ ...folder, depth: folder.path.split('/').length - 1 }));\n const clientRef = useRef(client);\n clientRef.current = client;\n const connected = useWorkspaceClientConnected(demo ? undefined : client);\n const readPreview = useCallback((path: string, options?: { signal?: AbortSignal }) => {\n if (demo) return Promise.resolve(null);\n const transport = clientRef.current?.transport;\n if (typeof transport?.request !== 'function') return Promise.resolve(null);\n return transport.request(VIEW_FILE_GET_SERVICE, { path }, options) as Promise<PreviewFileInfo | null>;\n }, [demo]);\n const refresh = useCallback(async (signal?: AbortSignal) => {\n if (demo || !connected || !project || !client) return;\n setLoading(true);\n try {\n await client.listAssets(project.id, { tabId: VIEW_WORKSPACE_TAB_ID, signal });\n if (!signal?.aborted) setLoadFailed(false);\n } catch {\n if (!signal?.aborted) setLoadFailed(true);\n } finally { if (!signal?.aborted) setLoading(false); }\n }, [client, connected, demo, project?.id]);\n useEffect(() => {\n if (demo) return;\n if (!client || !connected) {\n if (!client) setLoadFailed(true);\n return;\n }\n const controller = new AbortController();\n setSnapshot({});\n const accept = (next: typeof snapshot) => {\n if (controller.signal.aborted) return;\n setSnapshot((current) => {\n if ((next.revision ?? 0) < (current.revision ?? 0)) return current;\n if (workspaceUiFingerprint(next) === workspaceUiFingerprint(current)) return current;\n return next;\n });\n setLoadFailed(false);\n };\n const unsubscribe = client.subscribe(accept);\n void client.getState({ signal: controller.signal }).then(accept).catch(() => {\n if (!controller.signal.aborted) setLoadFailed(true);\n });\n return () => { controller.abort(); unsubscribe?.(); };\n }, [client, connected, demo]);\n useEffect(() => {\n if (!connected) return;\n const controller = new AbortController();\n void refresh(controller.signal);\n return () => controller.abort();\n }, [connected, refresh]);\n const [layout, setLayout] = useState<CBViewMode>('grid');\n const [thumbnailSize, setThumbnailSize] = useState(80);\n const [detailPanelOpen, setDetailPanelOpen] = useState(true);\n const [query, setQuery] = useState('');\n const [activeFamilies, setActiveFamilies] = useState<Set<CBFilterFamily>>(new Set());\n const [activeKinds, setActiveKinds] = useState<Set<string>>(new Set());\n const [sortState, setSortState] = useState<CBSortState>({ key: 'name', dir: 'asc' });\n const [history, setHistory] = useState(['']);\n const [historyIndex, setHistoryIndex] = useState(0);\n const [menu, setMenu] = useState<'settings' | 'filter' | 'sort' | null>(null);\n const [contextMenu, setContextMenu] = useState<ContextMenuState>(null);\n const [toolbarMenuAnchor, setToolbarMenuAnchor] = useState<AnchorRect | null>(null);\n const filterButtonRef = useRef<HTMLButtonElement>(null);\n const sortButtonRef = useRef<HTMLButtonElement>(null);\n const settingsButtonRef = useRef<HTMLButtonElement>(null);\n const splitRef = useRef<HTMLDivElement>(null);\n const [groups, setGroups] = useState({ favorites: true, project: true });\n const [favorites, setFavorites] = useState(new Set<string>(demo ? ['assets', 'scripts'] : []));\n const [collapsed, setCollapsed] = useState(new Set<string>());\n const [expandedPacks, setExpandedPacks] = useState<Set<string>>(new Set());\n const [selectedIds, setSelectedIds] = useState(new Set<string>());\n const [selectionAnchor, setSelectionAnchor] = useState<string | null>(null);\n const [previewKey, setPreviewKey] = useState<string | null>(null);\n const previewItem = [...folders, ...files.flatMap((file) => [file, ...file.assets])]\n .find((item) => viewItemKey(item) === previewKey) ?? null;\n const [srcWidth, setSrcWidth] = useLocalSize('view.cb.sourceWidth', 200, 140, 420);\n const [previewWidth, setPreviewWidth] = useLocalSize('view.cb.previewWidth', 280, 180, 560);\n useEffect(() => {\n setHistory(['']);\n setHistoryIndex(0);\n setSelectedIds(new Set());\n setSelectionAnchor(null);\n setPreviewKey(null);\n setExpandedPacks(new Set());\n setFavorites(new Set(demo ? ['assets', 'scripts'] : []));\n setQuery('');\n }, [project?.id, demo]);\n const folder = history[historyIndex] ?? '';\n const familyFilters = useMemo(() => buildFamilyFilters(activeFamilies, t), [activeFamilies, t]);\n const kindFilters = useMemo(() => buildKindFilters(activeKinds, t), [activeKinds, t]);\n const activeFilterCount = activeFamilies.size + activeKinds.size;\n const labeledFiles = useMemo(\n () => files.map((file) => ({ ...file, kindLabel: fileKindLabel(file, t) })),\n [files, t],\n );\n const derived = useMemo(\n () => deriveViewItems({\n folders,\n files: labeledFiles,\n currentPath: folder,\n searchQuery: query,\n activeFamilies,\n activeKinds,\n sortState,\n expandedPacks,\n withKindLabel: (file) => file,\n }),\n [activeFamilies, activeKinds, expandedPacks, folder, folders, labeledFiles, query, sortState],\n );\n const { viewItems, foldersInPath, searchActive } = derived;\n\n const navigate = (path: string) => {\n const normalized = normalizePathInput(path);\n if (normalized === folder) return;\n const next = history.slice(0, historyIndex + 1);\n next.push(normalized);\n setHistory(next);\n setHistoryIndex(next.length - 1);\n };\n\n const selectItem = (item: CBViewItem, event?: Pick<MouseEvent, 'ctrlKey' | 'metaKey' | 'shiftKey'>) => {\n setActionError('');\n const key = viewItemKey(item);\n const toggleOff = Boolean((event?.ctrlKey || event?.metaKey) && selectedIds.has(key));\n setSelectedIds((current) => {\n if (event?.shiftKey && selectionAnchor) {\n const start = viewItems.findIndex((entry) => viewItemKey(entry) === selectionAnchor);\n const end = viewItems.findIndex((entry) => viewItemKey(entry) === key);\n if (start >= 0 && end >= 0) {\n const range = viewItems.slice(Math.min(start, end), Math.max(start, end) + 1).map((entry) => viewItemKey(entry));\n return new Set(event.ctrlKey || event.metaKey ? [...current, ...range] : range);\n }\n }\n if (event?.ctrlKey || event?.metaKey) {\n const next = new Set(current);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n }\n return new Set([key]);\n });\n setSelectionAnchor(key);\n setPreviewKey(viewItemKey(item));\n if (!demo && !toggleOff && item.type === 'asset' && client && project) {\n void client.inspectAsset(item.guid, { projectId: project.id, tabId: VIEW_WORKSPACE_TAB_ID }).catch(() => {});\n }\n };\n\n const assetToOpen = (item: CBViewItem) => item.type === 'asset'\n ? item\n : item.type === 'file' ? item.assets.find(asset => asset.kind === 'scene') ?? item.assets[0] : undefined;\n const canActivate = (item: CBViewItem) => item.type === 'folder' || (!demo && !!client && !!project && !!assetToOpen(item));\n const activateItem = (item: CBViewItem) => {\n setActionError('');\n if (item.type === 'folder') {\n navigate(item.path);\n return;\n }\n if (demo || !client || !project) return;\n const guid = assetToOpen(item)?.guid;\n if (!guid) return;\n const key = viewItemKey(item);\n if (openingKeys.has(key)) return;\n setOpeningKeys((current) => new Set(current).add(key));\n void client.openAsset(guid, { projectId: project.id, tabId: VIEW_WORKSPACE_TAB_ID })\n .catch((error: unknown) => setActionError(error instanceof Error ? error.message : String(error)))\n .finally(() => {\n setOpeningKeys((current) => {\n if (!current.has(key)) return current;\n const next = new Set(current);\n next.delete(key);\n return next;\n });\n });\n };\n\n const toggleFavorite = (path: string) => setFavorites((current) => {\n const next = new Set(current);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n return next;\n });\n\n const togglePackExpansion = (path: string) => setExpandedPacks((current) => {\n const next = new Set(current);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n return next;\n });\n\n const toggleCollapsed = (path: string) => setCollapsed((current) => {\n const next = new Set(current);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n return next;\n });\n\n useEffect(() => {\n if (menu !== 'filter' && menu !== 'sort' && menu !== 'settings') setToolbarMenuAnchor(null);\n }, [menu]);\n\n const showMenu = (event: MouseEvent, items: BrowserMenuItem[]) => {\n event.preventDefault();\n event.stopPropagation();\n setMenu(null);\n setToolbarMenuAnchor(null);\n const target = event.currentTarget as HTMLElement;\n const anchor = isContextMenuAnchor(target)\n ? target.getBoundingClientRect()\n : anchorRectFromPoint(event.clientX, event.clientY);\n setContextMenu({ anchor, items });\n };\n\n const openToolbarMenu = (kind: 'filter' | 'sort' | 'settings') => {\n if (menu === kind) {\n setMenu(null);\n return;\n }\n const ref = kind === 'filter' ? filterButtonRef : kind === 'sort' ? sortButtonRef : settingsButtonRef;\n const rect = ref.current?.getBoundingClientRect();\n if (rect) setToolbarMenuAnchor(rect);\n setMenu(kind);\n };\n\n const folderMenu = (path: string, name: string): BrowserMenuItem[] => [\n { kind: 'title', label: name, icon: <Folder className=\"cb-folder-icon\" size={14} /> },\n { kind: 'item', id: 'open', label: t('contentBrowser.menu.open'), icon: <FolderOpen size={14} />, action: () => navigate(path) },\n {\n kind: 'item',\n id: 'copy-path',\n label: t('contentBrowser.menu.copyPath'),\n icon: <Copy size={14} />,\n action: () => void navigator.clipboard?.writeText(path || projectLabel),\n },\n {\n kind: 'item',\n id: 'favorite',\n label: favorites.has(path) ? t('contentBrowser.menu.removeFromFavorites') : t('contentBrowser.menu.addToFavorites'),\n icon: favorites.has(path) ? <StarOff size={14} /> : <Star size={14} />,\n action: () => toggleFavorite(path),\n },\n ];\n const itemMenu = (item: CBViewItem): BrowserMenuItem[] => {\n const Icon = itemIcon(item);\n if (item.type === 'folder') return folderMenu(item.path, item.name);\n return [\n { kind: 'title', label: item.name, icon: <Icon size={14} /> },\n ...(canActivate(item) ? [{ kind: 'item' as const, id: 'open', label: t('contentBrowser.menu.open'), shortcut: 'Enter', action: () => activateItem(item) }] : []),\n ...(item.type === 'asset'\n ? [{\n kind: 'item' as const,\n id: 'copy-guid',\n label: t('contentBrowser.menu.copyGuid'),\n icon: <Copy size={14} />,\n action: () => void navigator.clipboard?.writeText(item.guid),\n }]\n : []),\n {\n kind: 'item',\n id: 'copy-path',\n label: t('contentBrowser.menu.copyAssetPath'),\n icon: <Copy size={14} />,\n shortcut: 'Ctrl+Shift+C',\n action: () => void navigator.clipboard?.writeText(item.type === 'asset' ? item.packPath : item.path),\n },\n ];\n };\n const blankMenu: BrowserMenuItem[] = [\n { kind: 'title', label: t('contentBrowser.readOnlyTitle') },\n {\n kind: 'item',\n id: 'copy-path',\n label: t('contentBrowser.menu.copyCurrentPath'),\n icon: <Copy size={14} />,\n action: () => void navigator.clipboard?.writeText(folder || projectLabel),\n },\n ];\n\n const applyFilter = (filterId: string) => {\n const next = toggleFilterId(filterId, activeFamilies, activeKinds);\n setActiveFamilies(next.families);\n setActiveKinds(next.kinds);\n };\n\n const renderTreeRow = (path: string, name: string, depth: number, favorite = false) => {\n const hasChildren = directoryTree.some((entry) => entry.path.startsWith(`${path}/`));\n const open = !collapsed.has(path);\n const folderItem = folders.find((entry) => entry.path === path);\n const selected = folder === path;\n const inPath = folder.startsWith(`${path}/`);\n const row = (\n <button\n type=\"button\"\n className={`cb-source-row${selected ? ' is-sel' : inPath ? ' is-path' : ''}${hasChildren && !open ? ' collapsed' : ''}`}\n style={{ paddingLeft: `calc(var(--fx-ref-space-16) + ${depth} * (var(--fx-ref-space-12) + var(--fx-ref-space-2)))` } as CSSProperties}\n onClick={() => {\n navigate(path);\n if (folderItem) {\n setPreviewKey(viewItemKey(folderItem));\n setSelectedIds(new Set([path]));\n setSelectionAnchor(path);\n }\n }}\n onDoubleClick={() => hasChildren && toggleCollapsed(path)}\n onContextMenu={(event) => showMenu(event, folderMenu(path, name))}\n >\n <span\n className={`cb-source-chev${hasChildren ? '' : ' hidden'}${open ? '' : ' collapsed'}`}\n onClick={(event) => {\n if (!hasChildren) return;\n event.stopPropagation();\n toggleCollapsed(path);\n }}\n >\n <ChevronDown size={12} />\n </span>\n <span className=\"cb-source-icon\">{open ? <FolderOpen size={15} /> : <Folder size={15} />}</span>\n <span className=\"cb-source-name\">{name}</span>\n </button>\n );\n if (!favorite) return <div key={`tree-${path}`}>{row}</div>;\n return (\n <div\n className={`cb-source-fav-row${selected ? ' is-sel' : inPath ? ' is-path' : ''}`}\n key={`fav-${path}`}\n >\n {row}\n <button\n type=\"button\"\n className=\"cb-source-unfav\"\n data-action={CONTENT_BROWSER_ACTIONS.toggleFavorite}\n title={t('contentBrowser.unfavorite')}\n aria-label={t('contentBrowser.unfavorite')}\n onClick={(event) => {\n event.stopPropagation();\n toggleFavorite(path);\n }}\n >\n <Star size={11} fill=\"currentColor\" />\n </button>\n </div>\n );\n };\n\n const filterLabel = activeFilterCount === 0\n ? t('contentBrowser.filterAll')\n : activeFilterCount === 1\n ? (familyFilters.find((item) => item.active) ?? kindFilters.find((item) => item.active))!.label\n : t('contentBrowser.filterByType');\n const sortLabels: Record<CBSortKey, string> = {\n name: t('contentBrowser.sort.name'),\n kind: t('contentBrowser.sort.kind'),\n packModifiedAt: t('contentBrowser.sort.modified'),\n estimatedSize: t('contentBrowser.sort.size'),\n };\n\n return (\n <div className=\"cb-root\" data-testid=\"panel-content-browser\" data-view-readonly=\"true\">\n <div\n className=\"cb-split\"\n ref={splitRef}\n style={{ '--cb-src-w': `${srcWidth}px`, '--cb-preview-w': `${previewWidth}px` } as CSSProperties}\n >\n <aside className=\"cb-source-panel\">\n <div className=\"cb-source-tree\">\n <section className=\"cb-source-group\">\n <button type=\"button\" data-action={CONTENT_BROWSER_ACTIONS.toggleSourceGroup} className={`cb-source-group-head${groups.favorites ? '' : ' collapsed'}`} onClick={() => setGroups((current) => ({ ...current, favorites: !current.favorites }))}>\n <span className=\"cb-source-chev\"><ChevronDown size={12} /></span><Star className=\"cb-source-group-icon\" size={15} /><span className=\"cb-source-group-name\">{t('contentBrowser.favorites')}</span>\n </button>\n {groups.favorites ? (\n <div className=\"cb-source-group-body\">\n {favorites.size ? [...favorites].map((path) => renderTreeRow(path, path.split('/').at(-1) ?? path, 0, true)) : <div className=\"cb-source-empty\">{t('contentBrowser.noFavorites')}</div>}\n </div>\n ) : null}\n </section>\n <section className=\"cb-source-group\">\n <button type=\"button\" data-action={CONTENT_BROWSER_ACTIONS.toggleSourceGroup} className={`cb-source-group-head${groups.project ? '' : ' collapsed'}`} onClick={() => setGroups((current) => ({ ...current, project: !current.project }))}>\n <span className=\"cb-source-chev\"><ChevronDown size={12} /></span><FolderOpen className=\"cb-source-group-icon cb-folder-icon\" size={15} /><span className=\"cb-source-group-name\">{projectLabel}</span>\n </button>\n {groups.project ? (\n <div className=\"cb-source-group-body\">\n <button type=\"button\" className={`cb-source-row cb-source-virtual-root${folder === '' ? ' is-sel' : ''}`} onClick={() => navigate('')} onContextMenu={(event) => showMenu(event, folderMenu('', projectLabel))}>\n <span className=\"cb-source-chev\"><ChevronDown size={12} /></span><span className=\"cb-source-icon\"><FolderOpen size={15} /></span><span className=\"cb-source-name\">{t('contentBrowser.all')}</span>\n </button>\n {directoryTree.filter((entry) => {\n if (entry.depth === 0) return true;\n const parent = entry.path.slice(0, entry.path.lastIndexOf('/'));\n return !collapsed.has(parent);\n }).map((entry) => renderTreeRow(entry.path, entry.name, entry.depth + 1))}\n </div>\n ) : null}\n </section>\n </div>\n </aside>\n <ResizeHandle\n title={t('contentBrowser.actions.resizeFolderTree')}\n onDrag={(delta) => {\n const next = srcWidth + delta;\n setSrcWidth(next);\n splitRef.current?.style.setProperty('--cb-src-w', `${Math.min(420, Math.max(140, next))}px`);\n }}\n />\n <section className=\"cb-asset-view\">\n <PanelHeader\n className=\"cb-toolbar\"\n center={\n <CBNavigationBar\n currentPath={folder}\n projectLabel={projectLabel}\n allDirs={folders.map((entry) => entry.path)}\n canGoBack={historyIndex > 0}\n canGoForward={historyIndex < history.length - 1}\n refreshDisabled={!demo && (!project || loading)}\n onBack={() => setHistoryIndex((index) => Math.max(0, index - 1))}\n onForward={() => setHistoryIndex((index) => Math.min(history.length - 1, index + 1))}\n onRefresh={() => void refresh()}\n onNavigate={navigate}\n />\n }\n end={<IconButton ref={settingsButtonRef} size=\"compact\" variant=\"quiet\" label={t('contentBrowser.settings')} icon={<Settings2 size={14} />} onClick={() => openToolbarMenu('settings')} />}\n />\n\n <div className=\"cb-content-body\">\n <div className=\"cb-grid-column\">\n <Toolbar className=\"cb-filter-bar\">\n <Button size=\"compact\" variant=\"quiet\" data-action={CONTENT_BROWSER_ACTIONS.activate}\n disabled={selectedIds.size !== 1 || !previewItem || !canActivate(previewItem)}\n loading={Boolean(previewItem && openingKeys.has(viewItemKey(previewItem)))}\n title={t('contentBrowser.openHint')}\n onClick={() => { if (previewItem) activateItem(previewItem); }}>{t('contentBrowser.menu.open')}</Button>\n <Button ref={filterButtonRef} size=\"compact\" variant=\"quiet\" data-action={CONTENT_BROWSER_ACTIONS.setFilter} className={activeFilterCount ? 'is-active' : undefined} leadingIcon={<Filter size={14} />} onClick={() => openToolbarMenu('filter')}>{filterLabel}</Button>\n <SearchField className=\"cb-search-box\" data-action={CONTENT_BROWSER_ACTIONS.search} value={query} onChange={(event) => setQuery(event.target.value)} onClear={() => setQuery('')} placeholder={t('contentBrowser.searchPlaceholder')} label={t('contentBrowser.search')} />\n <Button ref={sortButtonRef} size=\"compact\" variant=\"quiet\" data-action={CONTENT_BROWSER_ACTIONS.setSort} leadingIcon={<ArrowUpDown size={14} />} onClick={() => openToolbarMenu('sort')}>{sortLabels[sortState.key]}</Button>\n </Toolbar>\n\n {loading ? <div role=\"status\">Loading assets...</div> : null}\n {actionError ? <div role=\"alert\">{actionError}</div> : null}\n {loadFailed ? (\n <EmptyState\n className=\"cb-empty\"\n title={t('contentBrowser.unavailable')}\n description={demo || client ? t('contentBrowser.loadErrorDescription') : t('contentBrowser.unavailableDescription')}\n icon={<FolderOpen size={28} />}\n />\n ) : !demo && !project ? (\n <EmptyState className=\"cb-empty\" title={t('contentBrowser.noProject')} description={t('contentBrowser.openProjectHint')} icon={<FolderOpen size={28} />} />\n ) : viewItems.length === 0 ? (\n <EmptyState className=\"cb-empty\" title={t('contentBrowser.emptyTitle')} description={t('contentBrowser.emptyDescription')} icon={<FolderOpen size={28} />} />\n ) : layout === 'column' ? (\n <CBDetailsList\n items={viewItems}\n selectedIds={selectedIds}\n openingKeys={openingKeys}\n sortState={sortState}\n onSort={(key) => setSortState((current) => nextSortState(current, key))}\n onSelect={selectItem}\n onActivate={activateItem}\n onContextMenu={(event, item) => showMenu(event, itemMenu(item))}\n onBlankClick={() => setSelectedIds(new Set())}\n />\n ) : (\n <CBGrid\n items={viewItems}\n thumbnailSize={thumbnailSize}\n layout={layout}\n searchActive={searchActive}\n expandedPacks={expandedPacks}\n selectedIds={selectedIds}\n openingKeys={openingKeys}\n onSelect={selectItem}\n onActivate={activateItem}\n onContextMenu={(event, item) => showMenu(event, itemMenu(item))}\n onTogglePackExpansion={togglePackExpansion}\n onBlankClick={() => setSelectedIds(new Set())}\n />\n )}\n <footer className=\"cb-status\">\n <span>\n {selectedIds.size\n ? t('contentBrowser.statusSelected', { count: viewItems.length, selected: selectedIds.size })\n : t('contentBrowser.statusCount', { count: viewItems.length })}\n </span>\n <span>{folder || projectLabel}</span>\n </footer>\n </div>\n {detailPanelOpen ? (\n <CBPreviewPanel\n previewItem={previewItem}\n foldersInPath={folders}\n diskFiles={labeledFiles}\n projectLabel={projectLabel}\n readPreview={demo ? undefined : readPreview}\n onClose={() => setPreviewKey(null)}\n onDrag={(delta) => {\n const next = previewWidth - delta;\n setPreviewWidth(next);\n splitRef.current?.style.setProperty('--cb-preview-w', `${Math.min(560, Math.max(180, next))}px`);\n }}\n onDragEnd={() => undefined}\n />\n ) : null}\n </div>\n </section>\n </div>\n\n <FloatingMenu\n open={Boolean(toolbarMenuAnchor && menu === 'filter')}\n anchorRect={toolbarMenuAnchor}\n onClose={() => setMenu(null)}\n ignorePointerWithin={[filterButtonRef]}\n className=\"cb-filter-menu\"\n containerProps={{ onPointerDown: (event) => event.stopPropagation() }}\n >\n <div className=\"cb-filter-menu-body\" data-action={CONTENT_BROWSER_ACTIONS.setFilter}>\n <div className=\"cb-filter-section\">{t('contentBrowser.fileTypeSection')}</div>\n {familyFilters.map((item) => {\n const Icon = familyIcon(item.family);\n return (\n <button type=\"button\" className=\"cb-filter-option\" data-active={item.active ? 'true' : 'false'} key={item.id} onClick={() => applyFilter(item.id)}>\n <Checkbox checked={item.active} onChange={() => applyFilter(item.id)} tabIndex={-1} hideLabel label={item.label} className=\"cb-filter-check\" />\n <Icon size={14} className={`cb-filter-option-icon${item.family === 'dir' ? ' cb-folder-icon' : ''}`} />\n {item.label}\n </button>\n );\n })}\n <div className=\"cb-filter-separator\" />\n <div className=\"cb-filter-section\">{t('contentBrowser.assetTypeSection')}</div>\n {kindFilters.map((item) => {\n const Icon = kindIcon(item.kind);\n return (\n <button type=\"button\" className=\"cb-filter-option\" data-active={item.active ? 'true' : 'false'} key={item.id} onClick={() => applyFilter(item.id)}>\n <Checkbox checked={item.active} onChange={() => applyFilter(item.id)} tabIndex={-1} hideLabel label={item.label} className=\"cb-filter-check\" />\n <Icon size={14} className=\"cb-filter-option-icon\" />\n {item.label}\n </button>\n );\n })}\n <div className=\"cb-filter-separator\" />\n <button type=\"button\" className=\"cb-filter-option cb-filter-clear\" disabled={activeFilterCount === 0} onClick={() => { setActiveFamilies(new Set()); setActiveKinds(new Set()); }}>\n {t('contentBrowser.clearFilters')}\n </button>\n </div>\n </FloatingMenu>\n\n <FloatingMenu\n open={Boolean(toolbarMenuAnchor && menu === 'sort')}\n anchorRect={toolbarMenuAnchor}\n onClose={() => setMenu(null)}\n ignorePointerWithin={[sortButtonRef]}\n containerProps={{ onPointerDown: (event) => event.stopPropagation() }}\n >\n <div className=\"cb-filter-menu-body\">\n <div className=\"cb-filter-section\">{t('contentBrowser.sort.by')}</div>\n {SORT_KEYS.map((key) => {\n const Icon = SORT_KEY_ICONS[key];\n const active = sortState.key === key;\n return (\n <button type=\"button\" className=\"cb-filter-option\" data-active={active ? 'true' : 'false'} key={key} onClick={() => setSortState((current) => nextSortState(current, key))}>\n <span className=\"cb-radio-menu\" data-checked={active ? 'true' : 'false'} />\n <Icon size={14} className=\"cb-filter-option-icon\" />\n {sortLabels[key]}\n </button>\n );\n })}\n <div className=\"cb-filter-separator\" />\n <div className=\"cb-filter-section\">{t('contentBrowser.sort.order')}</div>\n {([['asc', ArrowUpNarrowWide], ['desc', ArrowDownWideNarrow]] as const).map(([dir, Icon]) => {\n const active = sortState.dir === dir;\n return (\n <button type=\"button\" className=\"cb-filter-option\" data-active={active ? 'true' : 'false'} key={dir} onClick={() => setSortState((current) => setSortDir(current, dir as CBSortDir))}>\n <span className=\"cb-radio-menu\" data-checked={active ? 'true' : 'false'} />\n <Icon size={14} className=\"cb-filter-option-icon\" />\n {t(dir === 'asc' ? 'contentBrowser.sort.asc' : 'contentBrowser.sort.desc')}\n </button>\n );\n })}\n </div>\n </FloatingMenu>\n\n <FloatingMenu\n open={Boolean(toolbarMenuAnchor && menu === 'settings')}\n anchorRect={toolbarMenuAnchor}\n onClose={() => setMenu(null)}\n ignorePointerWithin={[settingsButtonRef]}\n containerProps={{ onPointerDown: (event) => event.stopPropagation() }}\n >\n <div className=\"cb-settings-menu\">\n <strong>{t('contentBrowser.layout')}</strong>\n <div className=\"fx-segmented cb-layout-switch\">\n {LAYOUT_OPTIONS.map(({ mode, icon, labelKey }) => (\n <button\n type=\"button\"\n data-action={CONTENT_BROWSER_ACTIONS.setView}\n className=\"fx-segmented__item fx-segmented__item--stacked\"\n data-checked={layout === mode ? 'true' : 'false'}\n key={mode}\n onClick={() => setLayout(mode)}\n >\n {icon}<span>{t(labelKey)}</span>\n </button>\n ))}\n </div>\n <label className=\"cb-settings-row\">\n <span className=\"cb-settings-label\">{t('contentBrowser.thumbnailSize')}</span>\n <RangeInput\n data-action={CONTENT_BROWSER_ACTIONS.setThumbnailSize}\n className=\"cb-settings-range\"\n min={48}\n max={200}\n step={4}\n value={thumbnailSize}\n onChange={(event) => setThumbnailSize(Number(event.target.value))}\n title={t('contentBrowser.actions.thumbnailSize', { size: thumbnailSize })}\n />\n </label>\n <Switch\n layout=\"row\"\n className=\"cb-settings-switch-row\"\n label={t('contentBrowser.actions.detailPanel')}\n checked={detailPanelOpen}\n data-action={CONTENT_BROWSER_ACTIONS.toggleDetailPanel}\n onCheckedChange={setDetailPanelOpen}\n />\n </div>\n </FloatingMenu>\n\n <ContextMenu\n open={Boolean(contextMenu)}\n anchorRect={contextMenu?.anchor ?? null}\n items={contextMenu ? toFxMenuItems(contextMenu.items) : []}\n onClose={() => setContextMenu(null)}\n label={t('contentBrowser.contextMenu')}\n containerProps={{ 'data-action': CONTENT_BROWSER_ACTIONS.showContextMenu }}\n />\n </div>\n );\n}\n","import '@forgeax/view-components/styles.css';\nimport { OverlayRootProvider } from '@forgeax/view-components';\nimport '../i18n/index.mjs';\nimport { createRoot } from 'react-dom/client';\nimport { ContentBrowserPanel } from './ContentBrowserPanel';\nimport './content-browser.css';\n\nexport async function mountContentBrowserPanel(props: {\n client?: unknown;\n demo?: boolean;\n mountElement: HTMLElement;\n overlayRoot?: HTMLElement;\n}) {\n if (!props.mountElement) throw new TypeError('mountContentBrowserPanel requires mountElement');\n const root = createRoot(props.mountElement);\n root.render(\n <OverlayRootProvider root={props.overlayRoot ?? props.mountElement}>\n <ContentBrowserPanel\n client={props.client as never}\n demo={props.demo}\n />\n </OverlayRootProvider>,\n );\n return async () => root.unmount();\n}\n","import { registerViewLocaleSink } from '@forgeax/view-workspace-core/locale-bridge';\nimport en from './locales/en.json' with { type: 'json' };\nimport zh from './locales/zh.json' with { type: 'json' };\n\nfunction createPluginI18n(catalogs) {\n let current = 'zh';\n const listeners = new Set();\n const lookup = (catalog, key) =>\n key.split('.').reduce((value, part) => value?.[part], catalog);\n const t = (key, vars) => {\n const message = lookup(catalogs[current], key) ?? lookup(catalogs.en, key) ?? key;\n return vars\n ? message.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => String(vars[name] ?? ''))\n : message;\n };\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const setLocale = (next) => {\n if (next !== 'en' && next !== 'zh') return;\n current = next;\n for (const listener of listeners) listener();\n };\n return { t, subscribe, getLocale: () => current, setLocale };\n}\n\nconst i18n = createPluginI18n({ en, zh });\n\nexport const t = i18n.t;\nexport const subscribeLocale = i18n.subscribe;\nexport const getLocale = i18n.getLocale;\nexport const setLocale = i18n.setLocale;\n\nregisterViewLocaleSink(i18n.setLocale);\n","import { useCallback, useSyncExternalStore } from 'react';\n\nimport { getLocale, subscribeLocale, t as translate } from './index.mjs';\n\nexport function useTranslation() {\n const locale = useSyncExternalStore(subscribeLocale, getLocale, getLocale);\n const t = useCallback(\n (key: string, vars?: Record<string, string | number>) => translate(key, vars),\n [locale],\n );\n return { t, locale };\n}\n","export const INSPECTOR_UI_SCHEMA_VERSION = 'forgeax.view.inspector.ui/1';\n\nexport const INSPECTOR_ACTIONS = Object.freeze({\n search: 'inspector.search',\n focus: 'inspector.focus',\n copyEntity: 'inspector.entity.copy',\n expandAll: 'inspector.expand-all',\n collapseAll: 'inspector.collapse-all',\n toggleComponent: 'inspector.component.toggle',\n copyComponent: 'inspector.component.copy',\n copyField: 'inspector.field.copy',\n showContextMenu: 'inspector.context-menu.show',\n});\n\nexport const INSPECTOR_MODEL_SCHEMA = Object.freeze({\n $id: INSPECTOR_UI_SCHEMA_VERSION,\n type: ['object', 'null'],\n required: ['id', 'name', 'components'],\n properties: {\n id: { type: 'string' },\n name: { type: 'string' },\n badge: { type: 'string' },\n components: {\n type: 'array',\n items: {\n type: 'object',\n required: ['name', 'fields'],\n properties: {\n name: { type: 'string' },\n icon: { type: 'string' },\n fields: {\n type: 'array',\n items: {\n type: 'object',\n required: ['key', 'label', 'kind', 'value'],\n properties: {\n key: { type: 'string' },\n label: { type: 'string' },\n kind: { enum: ['vector3', 'vector4', 'number', 'bool', 'text', 'enum', 'color', 'asset'] },\n value: {},\n options: { type: 'array', items: { type: 'string' } },\n },\n },\n },\n },\n },\n },\n },\n});\n","export type MockInspectorEntity = {\n id: string;\n name: string;\n badge?: string;\n components: Array<{\n name: string;\n icon: string;\n category?: 'all' | 'type' | 'capability';\n fields: Array<{\n key: string;\n label: string;\n kind: 'vector3' | 'vector4' | 'number' | 'bool' | 'text' | 'enum' | 'color' | 'asset';\n value: string | number | boolean | { x: number; y: number; z: number } | { x: number; y: number; z: number; w: number };\n options?: string[];\n }>;\n }>;\n};\n\nexport const MOCK_INSPECTOR_BY_ID: Record<string, MockInspectorEntity> = {\n ground: {\n id: 'ground',\n name: 'Ground',\n badge: 'Mesh',\n components: [\n {\n name: 'Transform',\n icon: 'move3d',\n category: 'all',\n fields: [\n { key: 'position', label: 'Position', kind: 'vector3', value: { x: 0, y: 0, z: 0 } },\n { key: 'rotation', label: 'Rotation', kind: 'vector3', value: { x: 0, y: 0, z: 0 } },\n { key: 'scale', label: 'Scale', kind: 'vector3', value: { x: 10, y: 0.2, z: 8 } },\n ],\n },\n {\n name: 'MeshFilter',\n icon: 'box',\n category: 'type',\n fields: [{ key: 'mesh', label: 'Mesh', kind: 'asset', value: 'Plane' }],\n },\n {\n name: 'MeshRenderer',\n icon: 'layers',\n category: 'capability',\n fields: [\n { key: 'material', label: 'Material 0', kind: 'asset', value: 'Ground Material' },\n { key: 'castShadows', label: 'Cast Shadows', kind: 'bool', value: true },\n { key: 'receiveShadows', label: 'Receive Shadows', kind: 'bool', value: true },\n ],\n },\n {\n name: 'Collider',\n icon: 'hexagon',\n category: 'capability',\n fields: [\n { key: 'shape', label: 'Shape', kind: 'enum', value: 'Box', options: ['Box', 'Sphere', 'Capsule', 'Mesh'] },\n { key: 'center', label: 'Center', kind: 'vector3', value: { x: 0, y: 0, z: 0 } },\n { key: 'isTrigger', label: 'Is Trigger', kind: 'bool', value: false },\n ],\n },\n ],\n },\n 'red-box': {\n id: 'red-box',\n name: 'RedBox',\n badge: 'Mesh',\n components: [\n {\n name: 'Transform',\n icon: 'move3d',\n category: 'all',\n fields: [\n {\n key: 'position',\n label: 'Position',\n kind: 'vector3',\n value: { x: 0, y: 0.5, z: 2.4 },\n },\n {\n key: 'rotation',\n label: 'Rotation',\n kind: 'vector3',\n value: { x: 0, y: 45, z: 0 },\n },\n {\n key: 'scale',\n label: 'Scale',\n kind: 'vector3',\n value: { x: 1, y: 1, z: 1 },\n },\n ],\n },\n {\n name: 'MeshFilter',\n icon: 'box',\n category: 'type',\n fields: [{ key: 'mesh', label: 'Mesh', kind: 'asset', value: 'Cube' }],\n },\n {\n name: 'MeshRenderer',\n icon: 'layers',\n category: 'capability',\n fields: [\n { key: 'material', label: 'Material 0', kind: 'asset', value: 'Red Material' },\n { key: 'castShadows', label: 'Cast Shadows', kind: 'bool', value: true },\n ],\n },\n ],\n },\n player: {\n id: 'player',\n name: 'Player',\n badge: 'Character',\n components: [\n {\n name: 'Transform',\n icon: 'move3d',\n category: 'all',\n fields: [\n {\n key: 'position',\n label: 'Position',\n kind: 'vector3',\n value: { x: -1.2, y: 0, z: 0 },\n },\n {\n key: 'rotation',\n label: 'Rotation',\n kind: 'vector3',\n value: { x: 0, y: 0, z: 0 },\n },\n {\n key: 'scale',\n label: 'Scale',\n kind: 'vector3',\n value: { x: 1, y: 1, z: 1 },\n },\n ],\n },\n {\n name: 'CharacterController',\n icon: 'user',\n category: 'capability',\n fields: [\n { key: 'speed', label: 'Move Speed', kind: 'number', value: 6 },\n { key: 'jumpHeight', label: 'Jump Height', kind: 'number', value: 1.4 },\n { key: 'enabled', label: 'Enabled', kind: 'bool', value: true },\n ],\n },\n ],\n },\n sun: {\n id: 'sun',\n name: 'Sun',\n badge: 'Light',\n components: [\n {\n name: 'Transform',\n icon: 'move3d',\n category: 'all',\n fields: [\n { key: 'rotation', label: 'Rotation', kind: 'vector3', value: { x: 50, y: -30, z: 0 } },\n ],\n },\n {\n name: 'Light',\n icon: 'sun',\n category: 'type',\n fields: [\n { key: 'type', label: 'Type', kind: 'enum', value: 'Directional', options: ['Directional', 'Point', 'Spot'] },\n { key: 'color', label: 'Color', kind: 'color', value: '#fff4d6' },\n { key: 'intensity', label: 'Intensity', kind: 'number', value: 3.2 },\n { key: 'castShadows', label: 'Cast Shadows', kind: 'bool', value: true },\n ],\n },\n ],\n },\n};\n","import {\n formatInspectorFieldLabel,\n normalizeInspectorFieldValue,\n resolveInspectorFieldKind,\n} from '@forgeax/view-components/inspector-form-model';\n\nexport { formatInspectorFieldLabel };\n\n/**\n * @param {{ entityId: string; label?: string } | null | undefined} primary\n * @param {{ demo?: boolean; mockById?: Record<string, import('./ui/mockInspector.ts').MockInspectorEntity> }} [options]\n */\nexport function resolveObjectInspectorEntity(primary, { demo = false, mockById = null } = {}) {\n if (!primary?.entityId) return null;\n if (demo && mockById?.[primary.entityId]) return mockById[primary.entityId];\n return null;\n}\n\nexport function inspectorEntityFromInspection(inspection) {\n if (!inspection?.entityId || !Array.isArray(inspection.components)) return null;\n return {\n id: inspection.entityId,\n name: inspection.name ?? (inspection.entity === undefined ? inspection.entityId : `Entity ${inspection.entity}`),\n badge: 'Entity',\n components: inspection.components.map((component) => ({\n name: component.name,\n icon: 'box',\n category: 'all',\n fields: Object.entries(component.fields ?? {}).map(([key, schema]) => {\n const rawValue = component.values?.[key];\n const kind = resolveInspectorFieldKind(schema, rawValue);\n return {\n key,\n label: formatInspectorFieldLabel(key),\n kind,\n value: normalizeInspectorFieldValue(rawValue, kind),\n };\n }),\n })),\n };\n}\n","import {\n useOverlayRoot,\n CollapsibleSection,\n EmptyState,\n FloatingMenu,\n IconButton,\n InspectorFieldControl,\n Menu,\n PanelHeader,\n PropertyRow,\n SearchField,\n Spinner,\n Text,\n Toolbar,\n type AnchorRect,\n type MenuItem as FxMenuItem,\n useWorkspaceClientConnected,\n} from '@forgeax/view-components';\nimport {\n Box,\n Camera,\n Check,\n CircleUserRound,\n Copy,\n Crosshair,\n Focus,\n Hexagon,\n Layers,\n Lightbulb,\n Maximize2,\n Minimize2,\n MoreHorizontal,\n MousePointer2,\n Move3d,\n SlidersHorizontal,\n} from 'lucide-react';\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { useTranslation } from '../i18n/useTranslation';\nimport { INSPECTOR_ACTIONS } from '../schema.mjs';\nimport { MOCK_INSPECTOR_BY_ID, type MockInspectorEntity } from './mockInspector';\nimport type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport { createWorkspaceObservation, createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\nimport { jsonUnchanged } from '@forgeax/view-workspace-core/contract';\nimport { inspectorEntityFromInspection, resolveObjectInspectorEntity } from '../inspection.mjs';\n\ntype InspectorComponent = MockInspectorEntity['components'][number];\ntype InspectorField = InspectorComponent['fields'][number];\n\ntype WorkspaceSnapshot = {\n revision?: number;\n preview?: { target: { targetId: string; generation?: number } } | null;\n sceneSelection?: {\n primary?: { entityId: string; label?: string } | null;\n } | null;\n};\n\ntype MenuItem =\n | { kind: 'title'; label: string }\n | { kind: 'separator' }\n | { kind: 'item'; id: string; label: string; icon?: ReactNode; disabled?: boolean; danger?: boolean; forge?: boolean; action: () => void };\ntype MenuState = { x: number; y: number; items: MenuItem[] } | null;\n\ntype InspectionRecord = {\n entityId: string;\n targetId: string;\n generation?: number;\n source: MockInspectorEntity | null;\n};\n\nfunction inspectionMatchesSelection(\n inspection: InspectionRecord | null,\n primary: { entityId: string } | null,\n target: { targetId?: string; generation?: number } | null | undefined,\n) {\n if (!inspection || !primary?.entityId || !target?.targetId) return false;\n return inspection.entityId === primary.entityId\n && inspection.targetId === target.targetId\n && inspection.generation === target.generation;\n}\n\nfunction componentIcon(component: Pick<InspectorComponent, 'name' | 'icon'>, size = 13) {\n const props = { size, strokeWidth: 1.7 };\n if (component.name === 'Transform') return <Move3d {...props} />;\n if (component.name === 'Light') return <Lightbulb {...props} />;\n if (component.name === 'Camera') return <Camera {...props} />;\n if (component.name.includes('Renderer')) return <Layers {...props} />;\n if (component.name.includes('Body') || component.name.includes('Collider')) return <Hexagon {...props} />;\n if (component.name.includes('Character')) return <CircleUserRound {...props} />;\n return <Box {...props} />;\n}\n\nfunction InspectorContextMenu({ state, close }: { state: Exclude<MenuState, null>; close: () => void }) {\n const overlayRoot = useOverlayRoot();\n const { t } = useTranslation();\n useEffect(() => {\n const dismiss = () => close();\n const escape = (event: KeyboardEvent) => event.key === 'Escape' && close();\n window.addEventListener('pointerdown', dismiss);\n window.addEventListener('keydown', escape);\n return () => {\n window.removeEventListener('pointerdown', dismiss);\n window.removeEventListener('keydown', escape);\n };\n }, [close]);\n return createPortal(\n <div\n className=\"insp-context-menu fx-ui\"\n data-action={INSPECTOR_ACTIONS.showContextMenu}\n style={{\n left: Math.max(8, Math.min(state.x, window.innerWidth - 238)),\n top: Math.max(8, Math.min(state.y, window.innerHeight - 300)),\n }}\n onPointerDown={(event) => event.stopPropagation()}\n onContextMenu={(event) => event.preventDefault()}\n >\n <Menu\n label={t('inspector.contextMenu')}\n items={state.items.map((item): FxMenuItem => {\n if (item.kind === 'separator') return { type: 'separator' };\n if (item.kind === 'title') return { type: 'title', label: item.label };\n return {\n id: item.id,\n label: item.label,\n icon: item.forge ? <span className=\"insp-menu-forge\">{item.icon}</span> : item.icon,\n disabled: item.disabled,\n danger: item.danger,\n onSelect: () => { item.action(); close(); },\n };\n })}\n />\n </div>,\n overlayRoot ?? document.body,\n );\n}\n\nfunction InspectorBody({ source, focus }: { source: MockInspectorEntity; focus?: () => void }) {\n const { t } = useTranslation();\n const name = source.name;\n const components = useMemo(() => structuredClone(source.components), [source]);\n const [collapsed, setCollapsed] = useState(new Set<string>());\n const [query, setQuery] = useState('');\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [settingsMenuAnchor, setSettingsMenuAnchor] = useState<AnchorRect | null>(null);\n const settingsButtonRef = useRef<HTMLButtonElement>(null);\n const [copied, setCopied] = useState(false);\n const [contextMenu, setContextMenu] = useState<MenuState>(null);\n const sectionRefs = useRef<Record<string, HTMLDivElement | null>>({});\n\n useEffect(() => {\n if (!settingsOpen) setSettingsMenuAnchor(null);\n }, [settingsOpen]);\n\n const toggleSettingsMenu = () => {\n if (settingsOpen) {\n setSettingsOpen(false);\n return;\n }\n const rect = settingsButtonRef.current?.getBoundingClientRect();\n if (rect) setSettingsMenuAnchor(rect);\n setSettingsOpen(true);\n };\n\n const showContext = (event: MouseEvent, items: MenuItem[]) => {\n event.preventDefault();\n event.stopPropagation();\n setSettingsOpen(false);\n setContextMenu({ x: event.clientX, y: event.clientY, items });\n };\n const componentMenu = (component: InspectorComponent): MenuItem[] => [\n { kind: 'title', label: component.name },\n { kind: 'item', id: 'copy', label: t('inspector.menu.copyComponentJson'), icon: <Copy size={14} />, action: () => void navigator.clipboard?.writeText(JSON.stringify({ [component.name]: component.fields }, null, 2)) },\n ];\n const fieldMenu = (component: InspectorComponent, field: InspectorField): MenuItem[] => [\n { kind: 'title', label: `${component.name}.${field.label}` },\n { kind: 'item', id: 'copy-value', label: t('inspector.menu.copyValue'), icon: <Copy size={14} />, action: () => void navigator.clipboard?.writeText(JSON.stringify(field.value)) },\n ];\n const shownComponents = useMemo(() => {\n const text = query.trim().toLowerCase();\n return components\n .map((component) => ({\n ...component,\n fields: component.fields.filter((field) => (\n !text || component.name.toLowerCase().includes(text) || field.label.toLowerCase().includes(text) || field.key.toLowerCase().includes(text)\n )),\n }))\n .filter((component) => !text || component.name.toLowerCase().includes(text) || component.fields.length > 0);\n }, [components, query]);\n const headerIcon = source.badge === 'Light' ? <Lightbulb size={15} /> : source.badge === 'Character' ? <CircleUserRound size={15} /> : <Box size={15} />;\n\n return (\n <div className=\"fx-inspector__body\">\n <PanelHeader className=\"insp-header\" onContextMenu={(event) => showContext(event, [\n { kind: 'title', label: name },\n { kind: 'item', id: 'focus', label: t('inspector.menu.focusViewport'), icon: <Focus size={14} />, action: () => focus?.(), disabled: !focus },\n { kind: 'item', id: 'copy', label: t('inspector.menu.copyObjectJson'), icon: <Copy size={14} />, action: () => void navigator.clipboard?.writeText(JSON.stringify({ name, components }, null, 2)) },\n ])}\n start={\n <span className=\"insp-header-identity\">\n <span className=\"tico\">{headerIcon}</span>\n <span className=\"insp-header-copy\">\n <Text as=\"span\" variant=\"label\" className=\"insp-header-name\" title={name}>{name}</Text>\n </span>\n </span>\n }\n end={\n <span className=\"insp-header-end\">\n {source.badge ? <span className=\"badge\" title={source.badge}>{source.badge}</span> : null}\n <IconButton data-action={INSPECTOR_ACTIONS.focus} onClick={focus} disabled={!focus} label={t('inspector.focusObject')} icon={<Crosshair size={15} />} variant=\"quiet\" size=\"compact\" />\n <IconButton data-action={INSPECTOR_ACTIONS.copyEntity} label={t('inspector.copyJson')} icon={copied ? <Check size={15} /> : <Copy size={15} />} variant=\"quiet\" size=\"compact\" onClick={() => { void navigator.clipboard?.writeText(JSON.stringify({ name, components }, null, 2)); setCopied(true); window.setTimeout(() => setCopied(false), 1000); }} />\n </span>\n }\n />\n\n <Toolbar className=\"insp-toolbar\">\n <SearchField data-testid=\"insp-search\" data-action={INSPECTOR_ACTIONS.search} value={query} onChange={(event) => setQuery(event.target.value)} onClear={() => setQuery('')} placeholder={t('inspector.searchPlaceholder')} label={t('inspector.searchLabel')} />\n <IconButton ref={settingsButtonRef} className={settingsOpen ? 'is-active' : undefined} data-testid=\"insp-settings\" label={t('inspector.displaySettings')} icon={<SlidersHorizontal size={15} />} variant=\"secondary\" size=\"compact\" onClick={toggleSettingsMenu} />\n </Toolbar>\n\n <div className=\"insp-scroll\" data-testid=\"insp-scroll\">\n <div className=\"dp-comp\">\n <div className=\"ch\">\n <Text as=\"span\" variant=\"caption\" tone=\"muted\">{t('inspector.components')}</Text>\n </div>\n {components.map((component) => (\n <div role=\"button\" tabIndex={0} key={component.name} className=\"comp-row\" data-testid={`insp-comprow-${component.name}`} onClick={() => { setCollapsed((current) => { const next = new Set(current); next.delete(component.name); return next; }); sectionRefs.current[component.name]?.scrollIntoView({ behavior: 'smooth', block: 'start' }); }} onContextMenu={(event) => showContext(event, componentMenu(component))}>\n <span className=\"ci\">{componentIcon(component)}</span><span className=\"comp-name\">{component.name}</span>\n </div>\n ))}\n </div>\n\n <div className=\"dp-body\">\n {shownComponents.length === 0 ? <EmptyState className=\"no-match\" title={t('inspector.noMatchTitle')} description={t('inspector.noMatchDescription')} /> : shownComponents.map((component) => {\n const isCollapsed = collapsed.has(component.name) && !query;\n const category = component.category === 'all' ? 'dim-all' : component.category === 'capability' ? 'dim-cap' : 'dim-type';\n return (\n <div className={`cat ${category}`} key={component.name} ref={(element) => { sectionRefs.current[component.name] = element; }} onContextMenu={(event) => showContext(event, componentMenu(component))}>\n <CollapsibleSection\n open={!isCollapsed}\n onOpenChange={(open) => setCollapsed((current) => { const next = new Set(current); if (open) next.delete(component.name); else next.add(component.name); return next; })}\n triggerProps={{ 'data-action': INSPECTOR_ACTIONS.toggleComponent }}\n title={<span className=\"cat-title\"><span className=\"cat-icon\">{componentIcon(component)}</span><span>{component.name}</span></span>}\n trailing={<span className=\"cacts\"><IconButton className=\"cact\" data-action={INSPECTOR_ACTIONS.copyComponent} label={t('inspector.menu.copyComponentJson')} icon={<Copy size={13} />} variant=\"quiet\" size=\"compact\" onClick={(event) => { event.stopPropagation(); void navigator.clipboard?.writeText(JSON.stringify(component, null, 2)); }} /><IconButton className=\"cact more\" label={t('inspector.more')} icon={<MoreHorizontal size={14} />} variant=\"quiet\" size=\"compact\" onClick={(event) => showContext(event, componentMenu(component))} /></span>}\n >\n <div className=\"cat-fields\">\n {component.fields.length === 0 ? <EmptyState className=\"no-match\" title={t('inspector.noMatchTitle')} description={t('inspector.noMatchComponent')} /> : component.fields.map((field) => (\n <div className=\"f-row-wrap\" key={field.key} data-testid={`insp-field-${component.name}-${field.key}`} onContextMenu={(event) => { event.stopPropagation(); showContext(event, fieldMenu(component, field)); }}>\n <PropertyRow className=\"f-row\" label={<span title={field.key}>{field.label}</span>}>\n <InspectorFieldControl field={field} />\n </PropertyRow>\n </div>\n ))}\n </div>\n </CollapsibleSection>\n </div>\n );\n })}\n </div>\n </div>\n <FloatingMenu\n open={Boolean(settingsMenuAnchor && settingsOpen)}\n anchorRect={settingsMenuAnchor}\n onClose={() => setSettingsOpen(false)}\n ignorePointerWithin={[settingsButtonRef]}\n containerProps={{ onPointerDown: (event) => event.stopPropagation() }}\n >\n <div className=\"fx-insp-menu\">\n <Menu label={t('inspector.displaySettings')} items={[\n { type: 'title', label: t('inspector.displaySettings') },\n { id: 'expand', label: t('inspector.expandAll'), buttonProps: { 'data-action': INSPECTOR_ACTIONS.expandAll }, icon: <Maximize2 size={14} />, onSelect: () => { setCollapsed(new Set()); setSettingsOpen(false); } },\n { id: 'collapse', label: t('inspector.collapseAll'), buttonProps: { 'data-action': INSPECTOR_ACTIONS.collapseAll }, icon: <Minimize2 size={14} />, onSelect: () => { setCollapsed(new Set(components.map((component) => component.name))); setSettingsOpen(false); } },\n ]} />\n </div>\n </FloatingMenu>\n {contextMenu ? <InspectorContextMenu state={contextMenu} close={() => setContextMenu(null)} /> : null}\n </div>\n );\n}\n\nexport function InspectorPanel(props: { client?: ViewWorkspaceClient; demo?: boolean }) {\n const { t } = useTranslation();\n const reader = useMemo(() => createWorkspaceStateReader(props.client), [props.client]);\n const workspace = useSyncExternalStore(\n reader.subscribe,\n () => reader.getSnapshot() as WorkspaceSnapshot | null,\n () => reader.getSnapshot() as WorkspaceSnapshot | null,\n );\n const primary = workspace?.sceneSelection?.primary ?? null;\n const target = workspace?.preview?.target;\n const connected = useWorkspaceClientConnected(props.demo ? undefined : props.client);\n const [inspection, setInspection] = useState<InspectionRecord | null>(null);\n const [loading, setLoading] = useState(false);\n const [failure, setFailure] = useState<string | null>(null);\n const lastDisplaySourceRef = useRef<MockInspectorEntity | null>(null);\n const selectionKey = primary?.entityId && target?.targetId\n ? `${primary.entityId}:${target.targetId}:${target.generation ?? ''}`\n : null;\n useEffect(() => {\n if (!primary?.entityId) lastDisplaySourceRef.current = null;\n }, [primary?.entityId]);\n useEffect(() => {\n if (props.demo || !props.client || !connected || !primary?.entityId || !target?.targetId) {\n setLoading(false);\n return;\n }\n const observation = createWorkspaceObservation(reader, (current: WorkspaceSnapshot | null) =>\n current?.sceneSelection?.primary?.entityId === primary.entityId &&\n current?.preview?.target?.targetId === target.targetId &&\n current?.preview?.target?.generation === target.generation);\n const { signal } = observation;\n let timer: ReturnType<typeof setTimeout>;\n setLoading(true);\n setFailure(null);\n const refresh = async () => {\n if (signal.aborted) return;\n try {\n const result = await props.client!.call('entity.inspect', { entityId: primary.entityId, targetId: target.targetId, targetGeneration: target.generation }, { signal });\n if (signal.aborted) return;\n const source = inspectorEntityFromInspection(result);\n setInspection((current) => {\n const next = { entityId: primary.entityId, targetId: target.targetId, generation: target.generation, source };\n if (\n current &&\n current.entityId === next.entityId &&\n current.targetId === next.targetId &&\n current.generation === next.generation &&\n jsonUnchanged(current.source, next.source)\n ) return current;\n return next;\n });\n setFailure(null);\n setLoading(false);\n } catch (error) {\n if (signal.aborted) return;\n setInspection((current) => {\n if (current == null) return current;\n return null;\n });\n setFailure(String(error));\n setLoading(false);\n }\n if (!signal.aborted) timer = setTimeout(refresh, 500);\n };\n void refresh();\n return () => { observation.dispose(); clearTimeout(timer); };\n // A batched return to the same selection still needs a fresh observation.\n }, [props.client, props.demo, connected, selectionKey, reader, workspace]);\n const inSync = inspectionMatchesSelection(inspection, primary, target);\n const syncedSource = inSync ? inspection?.source ?? null : null;\n useEffect(() => {\n if (syncedSource) lastDisplaySourceRef.current = syncedSource;\n }, [syncedSource]);\n const demoSource = resolveObjectInspectorEntity(primary, { demo: true, mockById: MOCK_INSPECTOR_BY_ID });\n const hasSelection = Boolean(primary?.entityId);\n const displaySource = props.demo\n ? demoSource\n : (syncedSource ?? (hasSelection ? lastDisplaySourceRef.current : null));\n const focus = props.client && target && primary?.entityId ? () => {\n void props.client!.call('entity.focus', { entityId: primary.entityId, targetId: target.targetId, targetGeneration: target.generation }).catch((error: unknown) => setFailure(String(error)));\n } : undefined;\n const showEmpty = props.demo ? !demoSource : !hasSelection || (!displaySource && !loading);\n const showLoadingPane = !props.demo && hasSelection && !displaySource && loading;\n const showStaleOverlay = !props.demo && hasSelection && !inSync && loading && Boolean(displaySource);\n const entityIdAttr = inSync ? syncedSource?.id : (primary?.entityId ?? displaySource?.id);\n return (\n <div\n className=\"fx-inspector fx-ui\"\n data-testid=\"panel-inspector\"\n data-view-readonly=\"true\"\n data-entity-id={entityIdAttr}\n data-inspector-loading={showStaleOverlay || showLoadingPane ? 'true' : undefined}\n >\n {showEmpty ? (\n <EmptyState\n className=\"dp-empty\"\n data-testid=\"insp-empty\"\n title={t('inspector.emptyTitle')}\n description={failure ?? t('inspector.emptyDescription')}\n icon={<MousePointer2 />}\n />\n ) : showLoadingPane ? (\n <div className=\"fx-inspector__loading-pane\" data-testid=\"insp-loading\">\n <Spinner label={t('inspector.loading')} />\n </div>\n ) : displaySource ? (\n <>\n <InspectorBody key={displaySource.id} source={displaySource} focus={focus} />\n {showStaleOverlay ? (\n <div className=\"fx-inspector__loading-veil\" aria-hidden>\n <Spinner label={t('inspector.loading')} />\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n );\n}\n","import '@forgeax/view-components/styles.css';\nimport { OverlayRootProvider } from '@forgeax/view-components';\nimport '../i18n/index.mjs';\nimport { createRoot } from 'react-dom/client';\nimport { InspectorPanel } from './InspectorPanel';\nimport './inspector.css';\n\nexport async function mountInspectorPanel(props: {\n client?: unknown;\n demo?: boolean;\n mountElement: HTMLElement;\n overlayRoot?: HTMLElement;\n}) {\n if (!props.mountElement) throw new TypeError('mountInspectorPanel requires mountElement');\n const root = createRoot(props.mountElement);\n root.render(\n <OverlayRootProvider root={props.overlayRoot ?? props.mountElement}>\n <InspectorPanel client={props.client as never} demo={props.demo} />\n </OverlayRootProvider>,\n );\n return async () => root.unmount();\n}\n","import { registerViewLocaleSink } from '@forgeax/view-workspace-core/locale-bridge';\nimport en from './locales/en.json' with { type: 'json' };\nimport zh from './locales/zh.json' with { type: 'json' };\n\nfunction createPluginI18n(catalogs) {\n let current = 'zh';\n const listeners = new Set();\n const lookup = (catalog, key) =>\n key.split('.').reduce((value, part) => value?.[part], catalog);\n const t = (key, vars) => {\n const message = lookup(catalogs[current], key) ?? lookup(catalogs.en, key) ?? key;\n return vars\n ? message.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => String(vars[name] ?? ''))\n : message;\n };\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const setLocale = (next) => {\n if (next !== 'en' && next !== 'zh') return;\n current = next;\n for (const listener of listeners) listener();\n };\n return { t, subscribe, getLocale: () => current, setLocale };\n}\n\nconst i18n = createPluginI18n({ en, zh });\n\nexport const t = i18n.t;\nexport const subscribeLocale = i18n.subscribe;\nexport const getLocale = i18n.getLocale;\nexport const setLocale = i18n.setLocale;\n\nregisterViewLocaleSink(i18n.setLocale);\n","import { useCallback, useSyncExternalStore } from 'react';\n\nimport { getLocale, subscribeLocale, t as translate } from './index.mjs';\n\nexport function useTranslation() {\n const locale = useSyncExternalStore(subscribeLocale, getLocale, getLocale);\n const t = useCallback(\n (key: string, vars?: Record<string, string | number>) => translate(key, vars),\n [locale],\n );\n return { t, locale };\n}\n","function displayInspectionValue(value) {\n if (value === undefined || value === null) return undefined;\n if (typeof value === 'string' && value.trim() === '') return undefined;\n return typeof value === 'object' ? JSON.stringify(value) : String(value);\n}\n\nfunction addInspectionRow(rows, label, value) {\n const displayed = displayInspectionValue(value);\n if (displayed === undefined) return;\n rows.push(Object.freeze({ label, value: displayed }));\n}\n\n/** Identity rows for a serialized inspection. Kind-specific facts use meta projections. */\nexport function workspaceInspectionFactRows(inspection) {\n if (!inspection || typeof inspection !== 'object' || Array.isArray(inspection)) {\n return Object.freeze([]);\n }\n const asset = inspection.asset && typeof inspection.asset === 'object' ? inspection.asset : {};\n const rows = [];\n addInspectionRow(rows, 'GUID', inspection.guid ?? asset.guid);\n addInspectionRow(rows, 'Kind', asset.kind);\n addInspectionRow(rows, 'Name', asset.name);\n addInspectionRow(rows, 'Path', asset.path);\n addInspectionRow(rows, 'Source', inspection.source?.path ?? asset.sourcePath);\n addInspectionRow(rows, 'Revision', inspection.revision ?? asset.revision ?? inspection.source?.revision);\n addInspectionRow(rows, 'Package', asset.packageId ?? asset.packageUrl);\n if (inspection.ddc?.state) addInspectionRow(rows, 'DDC', inspection.ddc.state);\n return Object.freeze(rows);\n}\n\nexport function workspaceInspectionMetaRows(inspection, keys) {\n const meta = inspection?.meta;\n if (!meta || typeof meta !== 'object' || Array.isArray(meta)) return Object.freeze([]);\n const rows = [];\n for (const key of keys ?? []) {\n addInspectionRow(rows, key, meta[key]);\n }\n return Object.freeze(rows);\n}\n\nexport function unwrapWorkspaceInspection(result) {\n if (!result || typeof result !== 'object') return null;\n const payload = 'inspection' in result && result.inspection !== undefined ? result.inspection : result;\n return payload && typeof payload === 'object' && !Array.isArray(payload) ? payload : null;\n}\n","import { EmptyState, InspectorForm, PanelHeader, type InspectorFormGroup } from '@forgeax/view-components';\nimport { useEffect, useMemo, useState, useSyncExternalStore } from 'react';\nimport { useTranslation } from '../i18n/useTranslation';\nimport type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport { VIEW_WORKSPACE_TAB_ID } from '@forgeax/view-workspace-core/contract';\nimport { unwrapWorkspaceInspection } from '@forgeax/view-workspace-core/inspection-presentation';\nimport { selectWorkspaceResourceSubject } from '@forgeax/view-workspace-core/resource-open';\nimport { createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\nimport { RESOURCE_KINDS } from '../identity.mjs';\nimport './material.css';\n\nexport function MaterialPanel(props: { client?: ViewWorkspaceClient; demo?: boolean }) {\n return <MaterialPropertiesPanel {...props} />;\n}\n\nexport function MaterialPropertiesPanel({\n client,\n demo = false,\n}: {\n client?: ViewWorkspaceClient;\n demo?: boolean;\n}) {\n const { t } = useTranslation();\n if (demo) return <MaterialDemoPanel />;\n if (!client) {\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-material-properties\">\n <EmptyState title={t('material.unavailable')} description={t('material.empty')} />\n </div>\n );\n }\n return <LiveProperties client={client} />;\n}\n\nfunction LiveProperties({ client }: { client: ViewWorkspaceClient }) {\n const { t } = useTranslation();\n const reader = useMemo(() => createWorkspaceStateReader(client), [client]);\n const workspace = useSyncExternalStore(\n reader.subscribe,\n () => reader.getSnapshot(),\n () => reader.getSnapshot(),\n );\n const subject = selectWorkspaceResourceSubject(workspace, RESOURCE_KINDS);\n const projectId = workspace?.project?.id;\n const [inspection, setInspection] = useState<Record<string, unknown> | null>(null);\n const [failed, setFailed] = useState(false);\n\n useEffect(() => {\n if (!subject?.guid || !projectId) {\n setInspection(null);\n setFailed(false);\n return undefined;\n }\n const controller = new AbortController();\n void client.inspectAsset(subject.guid, {\n projectId,\n tabId: VIEW_WORKSPACE_TAB_ID,\n signal: controller.signal,\n }).then((result: unknown) => {\n if (controller.signal.aborted) return;\n setInspection(unwrapWorkspaceInspection(result));\n setFailed(false);\n }).catch(() => {\n if (!controller.signal.aborted) {\n setInspection(null);\n setFailed(true);\n }\n });\n return () => controller.abort();\n }, [client, subject?.guid, projectId]);\n\n if (!subject) {\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-material-properties\">\n <EmptyState title={t('material.empty')} description={t('material.unavailable')} />\n </div>\n );\n }\n if (failed) {\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-material-properties\">\n <EmptyState title={t('material.unavailable')} description={t('material.inspectFailed')} />\n </div>\n );\n }\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-material-properties\" data-view-readonly=\"true\">\n <PanelHeader start={<span><strong>{String(subject.name ?? subject.guid)}</strong></span>} />\n <InspectorForm inspection={inspection ?? { guid: subject.guid, asset: subject }} identityTitle={t('material.facts')} />\n </div>\n );\n}\n\nfunction MaterialDemoPanel() {\n const { t } = useTranslation();\n const groups: InspectorFormGroup[] = [\n {\n key: 'surface',\n name: t('material.surface'),\n category: 'type',\n fields: [\n { key: 'baseColor', label: 'Base Color', kind: 'color', value: '#91a874' },\n { key: 'roughness', label: 'Roughness', kind: 'number', value: 0.48 },\n { key: 'metallic', label: 'Metallic', kind: 'number', value: 0.1 },\n ],\n },\n {\n key: 'textures',\n name: t('material.textureSlots'),\n category: 'capability',\n fields: [\n { key: 'baseColorMap', label: t('material.baseColorMap'), kind: 'asset', value: 'grass_albedo.png' },\n { key: 'normalMap', label: t('material.normalMap'), kind: 'asset', value: '' },\n ],\n },\n ];\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-material-properties\" data-view-readonly=\"true\">\n <PanelHeader start={<span><strong>base-material.pack.json</strong></span>} />\n <InspectorForm groups={groups} />\n </div>\n );\n}\n","import { EmptyState } from '@forgeax/view-components';\nimport { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { bindWorkspacePreviewSurface } from '@forgeax/view-workspace-core/preview-surface';\nimport {\n selectWorkspaceResourcePreview,\n selectWorkspaceResourceSubject,\n} from '@forgeax/view-workspace-core/resource-open';\nimport type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport { createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\nimport { RESOURCE_KINDS } from '../identity.mjs';\nimport { useTranslation } from '../i18n/useTranslation';\nimport './material.css';\n\ntype PreviewOwner = { panelId?: string; pageType?: string };\ntype PreviewTarget = { targetId: string; generation?: number; surfaceId?: string };\ntype PreviewPresentation = {\n surfacePlacement?: string;\n owner?: PreviewOwner;\n createSurface?: (input: {\n target: PreviewTarget;\n document?: Document;\n }) => HTMLElement | null | undefined;\n attach?: (input: {\n target: PreviewTarget;\n element: HTMLElement;\n owner?: PreviewOwner;\n }) => void | (() => void) | Promise<void | (() => void)>;\n};\n\nexport function MaterialPreviewPanel({\n client,\n presentation,\n owner,\n demo = false,\n}: {\n client?: ViewWorkspaceClient;\n presentation?: PreviewPresentation;\n owner?: PreviewOwner;\n demo?: boolean;\n}) {\n const { t } = useTranslation();\n if (demo || !client) {\n return <PreviewEmpty title={t('material.previewEmpty')} description={t('material.previewUnavailable')} />;\n }\n return <LivePreview client={client} presentation={presentation} owner={owner} />;\n}\n\nfunction PreviewEmpty({ title, description }: { title: string; description: string }) {\n return (\n <div className=\"fx-asset-editor fx-asset-preview fx-ui\" data-testid=\"panel-material-preview\">\n <EmptyState title={title} description={description} />\n </div>\n );\n}\n\nfunction LivePreview({\n client,\n presentation,\n owner,\n}: {\n client: ViewWorkspaceClient;\n presentation?: PreviewPresentation;\n owner?: PreviewOwner;\n}) {\n const { t } = useTranslation();\n const reader = useMemo(() => createWorkspaceStateReader(client), [client]);\n const workspace = useSyncExternalStore(reader.subscribe, reader.getSnapshot, reader.getSnapshot);\n const subject = selectWorkspaceResourceSubject(workspace, RESOURCE_KINDS);\n const preview = selectWorkspaceResourcePreview(workspace, subject?.guid);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [failure, setFailure] = useState<{ hint?: string; expected?: string }>();\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !preview?.target) return undefined;\n const bound = bindWorkspacePreviewSurface({\n presentation,\n target: preview.target,\n container,\n owner,\n api: client,\n editorTargetId: workspace?.editorPreview?.target?.targetId,\n });\n if (!bound.ok) {\n setFailure(bound.error);\n return undefined;\n }\n setFailure(undefined);\n return () => { void bound.dispose?.(); };\n }, [\n presentation,\n owner,\n preview?.target,\n preview?.target?.targetId,\n preview?.target?.generation,\n preview?.target?.surfaceId,\n workspace?.editorPreview?.target?.targetId,\n client,\n ]);\n\n if (!subject) {\n return <PreviewEmpty title={t('material.previewEmpty')} description={t('material.previewEmptyDescription')} />;\n }\n if (!preview?.target) {\n return (\n <PreviewEmpty\n title={t('material.previewUnavailable')}\n description={t('material.previewCapabilityMissing')}\n />\n );\n }\n return (\n <div className=\"fx-asset-editor fx-asset-preview fx-ui\" data-testid=\"panel-material-preview\">\n <div\n ref={containerRef}\n className=\"fx-asset-preview-surface\"\n data-forgeax-asset-preview={preview.target.targetId}\n hidden={Boolean(failure)}\n />\n {failure ? (\n <EmptyState\n title={t('material.previewUnavailable')}\n description={failure.hint ?? failure.expected ?? t('material.previewCapabilityMissing')}\n />\n ) : null}\n </div>\n );\n}\n","import '@forgeax/view-components/styles.css';\nimport { OverlayRootProvider } from '@forgeax/view-components';\nimport '../i18n/index.mjs';\nimport { createRoot } from 'react-dom/client';\nimport { MaterialPanel, MaterialPropertiesPanel } from './MaterialPanel';\nimport { MaterialPreviewPanel } from './MaterialPreviewPanel';\nimport './material.css';\n\ntype MountProps = {\n client?: unknown;\n presentation?: unknown;\n owner?: unknown;\n demo?: boolean;\n mountElement: HTMLElement;\n overlayRoot?: HTMLElement;\n};\n\nfunction mount(node: Parameters<ReturnType<typeof createRoot>['render']>[0], props: MountProps) {\n if (!props.mountElement) throw new TypeError('material panel mount requires mountElement');\n const root = createRoot(props.mountElement);\n root.render(\n <OverlayRootProvider root={props.overlayRoot ?? props.mountElement}>\n {node}\n </OverlayRootProvider>,\n );\n return async () => root.unmount();\n}\n\nexport async function mountMaterialPanel(props: MountProps) {\n return mount(\n <MaterialPanel demo={props.demo} client={props.client as never} />,\n props,\n );\n}\n\nexport async function mountMaterialPropertiesPanel(props: MountProps) {\n return mount(\n <MaterialPropertiesPanel demo={props.demo} client={props.client as never} />,\n props,\n );\n}\n\nexport async function mountMaterialPreviewPanel(props: MountProps) {\n return mount(\n <MaterialPreviewPanel\n demo={props.demo}\n client={props.client as never}\n presentation={props.presentation as never}\n owner={props.owner as never}\n />,\n props,\n );\n}\n","import { registerViewLocaleSink } from '@forgeax/view-workspace-core/locale-bridge';\nimport en from './locales/en.json' with { type: 'json' };\nimport zh from './locales/zh.json' with { type: 'json' };\n\nfunction createPluginI18n(catalogs) {\n let current = 'zh';\n const listeners = new Set();\n const lookup = (catalog, key) =>\n key.split('.').reduce((value, part) => value?.[part], catalog);\n const t = (key, vars) => {\n const message = lookup(catalogs[current], key) ?? lookup(catalogs.en, key) ?? key;\n return vars\n ? message.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => String(vars[name] ?? ''))\n : message;\n };\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const setLocale = (next) => {\n if (next !== 'en' && next !== 'zh') return;\n current = next;\n for (const listener of listeners) listener();\n };\n return { t, subscribe, getLocale: () => current, setLocale };\n}\n\nconst i18n = createPluginI18n({ en, zh });\n\nexport const t = i18n.t;\nexport const subscribeLocale = i18n.subscribe;\nexport const getLocale = i18n.getLocale;\nexport const setLocale = i18n.setLocale;\n\nregisterViewLocaleSink(i18n.setLocale);\n","import { useCallback, useSyncExternalStore } from 'react';\n\nimport { getLocale, subscribeLocale, t as translate } from './index.mjs';\n\nexport function useTranslation() {\n const locale = useSyncExternalStore(subscribeLocale, getLocale, getLocale);\n const t = useCallback(\n (key: string, vars?: Record<string, string | number>) => translate(key, vars),\n [locale],\n );\n return { t, locale };\n}\n","import { EmptyState } from '@forgeax/view-components';\nimport { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { bindWorkspacePreviewSurface } from '@forgeax/view-workspace-core/preview-surface';\nimport {\n selectWorkspaceResourcePreview,\n selectWorkspaceResourceSubject,\n} from '@forgeax/view-workspace-core/resource-open';\nimport type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport { createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\nimport { RESOURCE_KINDS } from '../identity.mjs';\nimport { useTranslation } from '../i18n/useTranslation';\nimport './mesh.css';\n\ntype PreviewOwner = { panelId?: string; pageType?: string };\ntype PreviewTarget = { targetId: string; generation?: number; surfaceId?: string };\ntype PreviewPresentation = {\n surfacePlacement?: string;\n owner?: PreviewOwner;\n createSurface?: (input: {\n target: PreviewTarget;\n document?: Document;\n }) => HTMLElement | null | undefined;\n attach?: (input: {\n target: PreviewTarget;\n element: HTMLElement;\n owner?: PreviewOwner;\n }) => void | (() => void) | Promise<void | (() => void)>;\n};\n\nexport function MeshPreviewPanel({\n client,\n presentation,\n owner,\n demo = false,\n}: {\n client?: ViewWorkspaceClient;\n presentation?: PreviewPresentation;\n owner?: PreviewOwner;\n demo?: boolean;\n}) {\n const { t } = useTranslation();\n if (demo || !client) {\n return <PreviewEmpty title={t('mesh.previewEmpty')} description={t('mesh.previewUnavailable')} />;\n }\n return <LivePreview client={client} presentation={presentation} owner={owner} />;\n}\n\nfunction PreviewEmpty({ title, description }: { title: string; description: string }) {\n return (\n <div className=\"fx-asset-editor fx-asset-preview fx-ui\" data-testid=\"panel-mesh-preview\">\n <EmptyState title={title} description={description} />\n </div>\n );\n}\n\nfunction LivePreview({\n client,\n presentation,\n owner,\n}: {\n client: ViewWorkspaceClient;\n presentation?: PreviewPresentation;\n owner?: PreviewOwner;\n}) {\n const { t } = useTranslation();\n const reader = useMemo(() => createWorkspaceStateReader(client), [client]);\n const workspace = useSyncExternalStore(\n reader.subscribe,\n () => reader.getSnapshot(),\n () => reader.getSnapshot(),\n );\n const subject = selectWorkspaceResourceSubject(workspace, RESOURCE_KINDS);\n const preview = selectWorkspaceResourcePreview(workspace, subject?.guid);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [failure, setFailure] = useState<{ hint?: string; expected?: string }>();\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !preview?.target) return undefined;\n const bound = bindWorkspacePreviewSurface({\n presentation,\n target: preview.target,\n container,\n owner,\n api: client,\n editorTargetId: workspace?.editorPreview?.target?.targetId,\n });\n if (!bound.ok) {\n setFailure(bound.error);\n return undefined;\n }\n setFailure(undefined);\n return () => { void bound.dispose?.(); };\n }, [\n presentation,\n owner,\n preview?.target,\n preview?.target?.targetId,\n preview?.target?.generation,\n preview?.target?.surfaceId,\n workspace?.editorPreview?.target?.targetId,\n client,\n ]);\n\n if (!subject) return <PreviewEmpty title={t('mesh.previewEmpty')} description={t('mesh.empty')} />;\n if (!preview?.target) {\n return (\n <PreviewEmpty\n title={t('mesh.previewUnavailable')}\n description={t('mesh.previewCapabilityMissing')}\n />\n );\n }\n return (\n <div className=\"fx-asset-editor fx-asset-preview fx-ui\" data-testid=\"panel-mesh-preview\">\n <div\n ref={containerRef}\n className=\"fx-asset-preview-surface\"\n data-forgeax-asset-preview={preview.target.targetId}\n hidden={Boolean(failure)}\n />\n {failure ? (\n <EmptyState\n title={t('mesh.previewUnavailable')}\n description={failure.hint ?? failure.expected ?? t('mesh.previewCapabilityMissing')}\n />\n ) : null}\n </div>\n );\n}\n","import { EmptyState, InspectorForm, PanelHeader } from '@forgeax/view-components';\nimport { useEffect, useMemo, useState, useSyncExternalStore } from 'react';\nimport type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport { VIEW_WORKSPACE_TAB_ID } from '@forgeax/view-workspace-core/contract';\nimport { unwrapWorkspaceInspection } from '@forgeax/view-workspace-core/inspection-presentation';\nimport { selectWorkspaceResourceSubject } from '@forgeax/view-workspace-core/resource-open';\nimport { createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\nimport { RESOURCE_KINDS } from '../identity.mjs';\nimport { useTranslation } from '../i18n/useTranslation';\nimport './mesh.css';\n\nexport function MeshPropertiesPanel({\n client,\n demo = false,\n}: {\n client?: ViewWorkspaceClient;\n demo?: boolean;\n}) {\n const { t } = useTranslation();\n if (demo || !client) {\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-mesh-properties\">\n <EmptyState title={t('mesh.unavailable')} description={t('mesh.empty')} />\n </div>\n );\n }\n return <LiveProperties client={client} />;\n}\n\nfunction LiveProperties({ client }: { client: ViewWorkspaceClient }) {\n const { t } = useTranslation();\n const reader = useMemo(() => createWorkspaceStateReader(client), [client]);\n const workspace = useSyncExternalStore(\n reader.subscribe,\n () => reader.getSnapshot(),\n () => reader.getSnapshot(),\n );\n const subject = selectWorkspaceResourceSubject(workspace, RESOURCE_KINDS);\n const projectId = workspace?.project?.id;\n const [inspection, setInspection] = useState<Record<string, unknown> | null>(null);\n const [failed, setFailed] = useState(false);\n\n useEffect(() => {\n if (!subject?.guid || !projectId) {\n setInspection(null);\n setFailed(false);\n return undefined;\n }\n const controller = new AbortController();\n void client.inspectAsset(subject.guid, {\n projectId,\n tabId: VIEW_WORKSPACE_TAB_ID,\n signal: controller.signal,\n }).then((result: unknown) => {\n if (controller.signal.aborted) return;\n setInspection(unwrapWorkspaceInspection(result));\n setFailed(false);\n }).catch(() => {\n if (!controller.signal.aborted) {\n setInspection(null);\n setFailed(true);\n }\n });\n return () => controller.abort();\n }, [client, subject?.guid, projectId]);\n\n if (!subject) {\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-mesh-properties\">\n <EmptyState title={t('mesh.empty')} description={t('mesh.unavailable')} />\n </div>\n );\n }\n if (failed) {\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-mesh-properties\">\n <EmptyState title={t('mesh.unavailable')} description={t('mesh.inspectFailed')} />\n </div>\n );\n }\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-mesh-properties\" data-view-readonly=\"true\">\n <PanelHeader start={<span><strong>{String(subject.name ?? subject.guid)}</strong></span>} />\n <InspectorForm inspection={inspection ?? { guid: subject.guid, asset: subject }} identityTitle={t('mesh.facts')} />\n </div>\n );\n}\n","import '@forgeax/view-components/styles.css';\nimport { OverlayRootProvider } from '@forgeax/view-components';\nimport '../i18n/index.mjs';\nimport { createRoot } from 'react-dom/client';\nimport { MeshPreviewPanel } from './MeshPreviewPanel';\nimport { MeshPropertiesPanel } from './MeshPropertiesPanel';\nimport './mesh.css';\n\ntype MountProps = {\n client?: unknown;\n presentation?: unknown;\n owner?: unknown;\n demo?: boolean;\n mountElement: HTMLElement;\n overlayRoot?: HTMLElement;\n};\n\nfunction mountPanel(node: Parameters<ReturnType<typeof createRoot>['render']>[0], props: MountProps) {\n if (!props.mountElement) throw new TypeError('mesh panel mount requires mountElement');\n const root = createRoot(props.mountElement);\n root.render(\n <OverlayRootProvider root={props.overlayRoot ?? props.mountElement}>\n {node}\n </OverlayRootProvider>,\n );\n return async () => root.unmount();\n}\n\nexport async function mountMeshPreviewPanel(props: MountProps) {\n return mountPanel(\n <MeshPreviewPanel demo={props.demo} client={props.client as never} presentation={props.presentation as never} owner={props.owner as never} />,\n props,\n );\n}\n\nexport async function mountMeshPropertiesPanel(props: MountProps) {\n return mountPanel(\n <MeshPropertiesPanel demo={props.demo} client={props.client as never} />,\n props,\n );\n}\n","import { registerViewLocaleSink } from '@forgeax/view-workspace-core/locale-bridge';\nimport en from './locales/en.json' with { type: 'json' };\nimport zh from './locales/zh.json' with { type: 'json' };\n\nfunction createPluginI18n(catalogs) {\n let current = 'zh';\n const listeners = new Set();\n const lookup = (catalog, key) =>\n key.split('.').reduce((value, part) => value?.[part], catalog);\n const t = (key, vars) => {\n const message = lookup(catalogs[current], key) ?? lookup(catalogs.en, key) ?? key;\n return vars\n ? message.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => String(vars[name] ?? ''))\n : message;\n };\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const setLocale = (next) => {\n if (next !== 'en' && next !== 'zh') return;\n current = next;\n for (const listener of listeners) listener();\n };\n return { t, subscribe, getLocale: () => current, setLocale };\n}\n\nconst i18n = createPluginI18n({ en, zh });\n\nexport const t = i18n.t;\nexport const subscribeLocale = i18n.subscribe;\nexport const getLocale = i18n.getLocale;\nexport const setLocale = i18n.setLocale;\n\nregisterViewLocaleSink(i18n.setLocale);\n","import { useCallback, useSyncExternalStore } from 'react';\n\nimport { getLocale, subscribeLocale, t as translate } from './index.mjs';\n\nexport function useTranslation() {\n const locale = useSyncExternalStore(subscribeLocale, getLocale, getLocale);\n const t = useCallback(\n (key: string, vars?: Record<string, string | number>) => translate(key, vars),\n [locale],\n );\n return { t, locale };\n}\n","import { EmptyState } from '@forgeax/view-components';\nimport { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { bindWorkspacePreviewSurface } from '@forgeax/view-workspace-core/preview-surface';\nimport {\n selectWorkspaceResourcePreview,\n selectWorkspaceResourceSubject,\n} from '@forgeax/view-workspace-core/resource-open';\nimport type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport { createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\nimport { RESOURCE_KINDS } from '../identity.mjs';\nimport { useTranslation } from '../i18n/useTranslation';\nimport './texture.css';\n\ntype PreviewOwner = { panelId?: string; pageType?: string };\ntype PreviewTarget = { targetId: string; generation?: number; surfaceId?: string };\ntype PreviewPresentation = {\n surfacePlacement?: string;\n owner?: PreviewOwner;\n createSurface?: (input: {\n target: PreviewTarget;\n document?: Document;\n }) => HTMLElement | null | undefined;\n attach?: (input: {\n target: PreviewTarget;\n element: HTMLElement;\n owner?: PreviewOwner;\n }) => void | (() => void) | Promise<void | (() => void)>;\n};\n\nexport function TexturePreviewPanel({\n client,\n presentation,\n owner,\n demo = false,\n}: {\n client?: ViewWorkspaceClient;\n presentation?: PreviewPresentation;\n owner?: PreviewOwner;\n demo?: boolean;\n}) {\n const { t } = useTranslation();\n if (demo || !client) {\n return <PreviewEmpty title={t('texture.previewEmpty')} description={t('texture.previewUnavailable')} />;\n }\n return <LivePreview client={client} presentation={presentation} owner={owner} />;\n}\n\nfunction PreviewEmpty({ title, description }: { title: string; description: string }) {\n return (\n <div className=\"fx-asset-editor fx-asset-preview fx-ui\" data-testid=\"panel-texture-preview\">\n <EmptyState title={title} description={description} />\n </div>\n );\n}\n\nfunction LivePreview({\n client,\n presentation,\n owner,\n}: {\n client: ViewWorkspaceClient;\n presentation?: PreviewPresentation;\n owner?: PreviewOwner;\n}) {\n const { t } = useTranslation();\n const reader = useMemo(() => createWorkspaceStateReader(client), [client]);\n const workspace = useSyncExternalStore(\n reader.subscribe,\n () => reader.getSnapshot(),\n () => reader.getSnapshot(),\n );\n const subject = selectWorkspaceResourceSubject(workspace, RESOURCE_KINDS);\n const preview = selectWorkspaceResourcePreview(workspace, subject?.guid);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [failure, setFailure] = useState<{ hint?: string; expected?: string }>();\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !preview?.target) return undefined;\n const bound = bindWorkspacePreviewSurface({\n presentation,\n target: preview.target,\n container,\n owner,\n api: client,\n editorTargetId: workspace?.editorPreview?.target?.targetId,\n });\n if (!bound.ok) {\n setFailure(bound.error);\n return undefined;\n }\n setFailure(undefined);\n return () => { void bound.dispose?.(); };\n }, [\n presentation,\n owner,\n preview?.target,\n preview?.target?.targetId,\n preview?.target?.generation,\n preview?.target?.surfaceId,\n workspace?.editorPreview?.target?.targetId,\n client,\n ]);\n\n if (!subject) return <PreviewEmpty title={t('texture.previewEmpty')} description={t('texture.empty')} />;\n if (!preview?.target) {\n return (\n <PreviewEmpty\n title={t('texture.previewUnavailable')}\n description={t('texture.previewCapabilityMissing')}\n />\n );\n }\n return (\n <div className=\"fx-asset-editor fx-asset-preview fx-ui\" data-testid=\"panel-texture-preview\">\n <div\n ref={containerRef}\n className=\"fx-asset-preview-surface\"\n data-forgeax-asset-preview={preview.target.targetId}\n hidden={Boolean(failure)}\n />\n {failure ? (\n <EmptyState\n title={t('texture.previewUnavailable')}\n description={failure.hint ?? failure.expected ?? t('texture.previewCapabilityMissing')}\n />\n ) : null}\n </div>\n );\n}\n","import { EmptyState, InspectorForm, PanelHeader } from '@forgeax/view-components';\nimport { useEffect, useMemo, useState, useSyncExternalStore } from 'react';\nimport type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport { VIEW_WORKSPACE_TAB_ID } from '@forgeax/view-workspace-core/contract';\nimport { unwrapWorkspaceInspection } from '@forgeax/view-workspace-core/inspection-presentation';\nimport { selectWorkspaceResourceSubject } from '@forgeax/view-workspace-core/resource-open';\nimport { createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\nimport { RESOURCE_KINDS } from '../identity.mjs';\nimport { useTranslation } from '../i18n/useTranslation';\nimport './texture.css';\n\nexport function TexturePropertiesPanel({\n client,\n demo = false,\n}: {\n client?: ViewWorkspaceClient;\n demo?: boolean;\n}) {\n const { t } = useTranslation();\n if (demo || !client) {\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-texture-properties\">\n <EmptyState title={t('texture.unavailable')} description={t('texture.empty')} />\n </div>\n );\n }\n return <LiveProperties client={client} />;\n}\n\nfunction LiveProperties({ client }: { client: ViewWorkspaceClient }) {\n const { t } = useTranslation();\n const reader = useMemo(() => createWorkspaceStateReader(client), [client]);\n const workspace = useSyncExternalStore(\n reader.subscribe,\n () => reader.getSnapshot(),\n () => reader.getSnapshot(),\n );\n const subject = selectWorkspaceResourceSubject(workspace, RESOURCE_KINDS);\n const projectId = workspace?.project?.id;\n const [inspection, setInspection] = useState<Record<string, unknown> | null>(null);\n const [failed, setFailed] = useState(false);\n\n useEffect(() => {\n if (!subject?.guid || !projectId) {\n setInspection(null);\n setFailed(false);\n return undefined;\n }\n const controller = new AbortController();\n void client.inspectAsset(subject.guid, {\n projectId,\n tabId: VIEW_WORKSPACE_TAB_ID,\n signal: controller.signal,\n }).then((result: unknown) => {\n if (controller.signal.aborted) return;\n setInspection(unwrapWorkspaceInspection(result));\n setFailed(false);\n }).catch(() => {\n if (!controller.signal.aborted) {\n setInspection(null);\n setFailed(true);\n }\n });\n return () => controller.abort();\n }, [client, subject?.guid, projectId]);\n\n if (!subject) {\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-texture-properties\">\n <EmptyState title={t('texture.empty')} description={t('texture.unavailable')} />\n </div>\n );\n }\n if (failed) {\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-texture-properties\">\n <EmptyState title={t('texture.unavailable')} description={t('texture.inspectFailed')} />\n </div>\n );\n }\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-texture-properties\" data-view-readonly=\"true\">\n <PanelHeader start={<span><strong>{String(subject.name ?? subject.guid)}</strong></span>} />\n <InspectorForm inspection={inspection ?? { guid: subject.guid, asset: subject }} identityTitle={t('texture.facts')} />\n </div>\n );\n}\n","import '@forgeax/view-components/styles.css';\nimport { OverlayRootProvider } from '@forgeax/view-components';\nimport '../i18n/index.mjs';\nimport { createRoot } from 'react-dom/client';\nimport { TexturePreviewPanel } from './TexturePreviewPanel';\nimport { TexturePropertiesPanel } from './TexturePropertiesPanel';\nimport './texture.css';\n\ntype MountProps = {\n client?: unknown;\n presentation?: unknown;\n owner?: unknown;\n demo?: boolean;\n mountElement: HTMLElement;\n overlayRoot?: HTMLElement;\n};\n\nfunction mountPanel(node: Parameters<ReturnType<typeof createRoot>['render']>[0], props: MountProps) {\n if (!props.mountElement) throw new TypeError('texture panel mount requires mountElement');\n const root = createRoot(props.mountElement);\n root.render(\n <OverlayRootProvider root={props.overlayRoot ?? props.mountElement}>\n {node}\n </OverlayRootProvider>,\n );\n return async () => root.unmount();\n}\n\nexport async function mountTexturePreviewPanel(props: MountProps) {\n return mountPanel(\n <TexturePreviewPanel demo={props.demo} client={props.client as never} presentation={props.presentation as never} owner={props.owner as never} />,\n props,\n );\n}\n\nexport async function mountTexturePropertiesPanel(props: MountProps) {\n return mountPanel(\n <TexturePropertiesPanel demo={props.demo} client={props.client as never} />,\n props,\n );\n}\n","import { registerViewLocaleSink } from '@forgeax/view-workspace-core/locale-bridge';\nimport en from './locales/en.json' with { type: 'json' };\nimport zh from './locales/zh.json' with { type: 'json' };\n\nfunction createPluginI18n(catalogs) {\n let current = 'zh';\n const listeners = new Set();\n const lookup = (catalog, key) =>\n key.split('.').reduce((value, part) => value?.[part], catalog);\n const t = (key, vars) => {\n const message = lookup(catalogs[current], key) ?? lookup(catalogs.en, key) ?? key;\n return vars\n ? message.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => String(vars[name] ?? ''))\n : message;\n };\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const setLocale = (next) => {\n if (next !== 'en' && next !== 'zh') return;\n current = next;\n for (const listener of listeners) listener();\n };\n return { t, subscribe, getLocale: () => current, setLocale };\n}\n\nconst i18n = createPluginI18n({ en, zh });\n\nexport const t = i18n.t;\nexport const subscribeLocale = i18n.subscribe;\nexport const getLocale = i18n.getLocale;\nexport const setLocale = i18n.setLocale;\n\nregisterViewLocaleSink(i18n.setLocale);\n","import { useCallback, useSyncExternalStore } from 'react';\n\nimport { getLocale, subscribeLocale, t as translate } from './index.mjs';\n\nexport function useTranslation() {\n const locale = useSyncExternalStore(subscribeLocale, getLocale, getLocale);\n const t = useCallback(\n (key: string, vars?: Record<string, string | number>) => translate(key, vars),\n [locale],\n );\n return { t, locale };\n}\n","import { EmptyState, InspectorForm, PanelHeader } from '@forgeax/view-components';\nimport { useEffect, useMemo, useState, useSyncExternalStore } from 'react';\nimport type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport { VIEW_WORKSPACE_TAB_ID } from '@forgeax/view-workspace-core/contract';\nimport { unwrapWorkspaceInspection } from '@forgeax/view-workspace-core/inspection-presentation';\nimport { createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\nimport { useTranslation } from '../i18n/useTranslation';\nimport './asset.css';\n\nexport function AssetPropertiesPanel({\n client,\n demo = false,\n}: {\n client?: ViewWorkspaceClient;\n demo?: boolean;\n}) {\n const { t } = useTranslation();\n if (demo || !client) {\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-asset-properties\">\n <EmptyState title={t('asset.unavailable')} description={t('asset.empty')} />\n </div>\n );\n }\n return <LiveProperties client={client} />;\n}\n\nfunction LiveProperties({ client }: { client: ViewWorkspaceClient }) {\n const { t } = useTranslation();\n const reader = useMemo(() => createWorkspaceStateReader(client), [client]);\n const workspace = useSyncExternalStore(\n reader.subscribe,\n () => reader.getSnapshot(),\n () => reader.getSnapshot(),\n );\n const subject = workspace?.openRequest?.asset;\n const projectId = workspace?.project?.id;\n const [inspection, setInspection] = useState<Record<string, unknown> | null>(null);\n const [failed, setFailed] = useState(false);\n\n useEffect(() => {\n if (!subject?.guid || !projectId) {\n setInspection(null);\n setFailed(false);\n return undefined;\n }\n const controller = new AbortController();\n void client.inspectAsset(subject.guid, {\n projectId,\n tabId: VIEW_WORKSPACE_TAB_ID,\n signal: controller.signal,\n }).then((result: unknown) => {\n if (controller.signal.aborted) return;\n setInspection(unwrapWorkspaceInspection(result));\n setFailed(false);\n }).catch(() => {\n if (!controller.signal.aborted) {\n setInspection(null);\n setFailed(true);\n }\n });\n return () => controller.abort();\n }, [client, subject?.guid, projectId]);\n\n if (!subject) {\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-asset-properties\">\n <EmptyState title={t('asset.empty')} description={t('asset.unavailable')} />\n </div>\n );\n }\n if (failed) {\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-asset-properties\">\n <EmptyState title={t('asset.unavailable')} description={t('asset.inspectFailed')} />\n </div>\n );\n }\n const inspectionRecord = inspection ?? { guid: subject.guid, asset: subject };\n return (\n <div className=\"fx-asset-editor fx-ui\" data-testid=\"panel-asset-properties\" data-view-readonly=\"true\">\n <PanelHeader start={<span><strong>{String(subject.name ?? subject.guid)}</strong></span>} />\n <InspectorForm inspection={inspectionRecord} identityTitle={t('asset.facts')} />\n </div>\n );\n}\n","import '@forgeax/view-components/styles.css';\nimport { OverlayRootProvider } from '@forgeax/view-components';\nimport '../i18n/index.mjs';\nimport { createRoot } from 'react-dom/client';\nimport { AssetPropertiesPanel } from './AssetPropertiesPanel';\nimport './asset.css';\n\ntype MountProps = {\n client?: unknown;\n demo?: boolean;\n mountElement: HTMLElement;\n overlayRoot?: HTMLElement;\n};\n\nexport async function mountAssetPropertiesPanel(props: MountProps) {\n if (!props.mountElement) throw new TypeError('asset panel mount requires mountElement');\n const root = createRoot(props.mountElement);\n root.render(\n <OverlayRootProvider root={props.overlayRoot ?? props.mountElement}>\n <AssetPropertiesPanel demo={props.demo} client={props.client as never} />\n </OverlayRootProvider>,\n );\n return async () => root.unmount();\n}\n","import { registerViewLocaleSink } from '@forgeax/view-workspace-core/locale-bridge';\nimport en from './locales/en.json' with { type: 'json' };\nimport zh from './locales/zh.json' with { type: 'json' };\n\nfunction createPluginI18n(catalogs) {\n let current = 'zh';\n const listeners = new Set();\n const lookup = (catalog, key) =>\n key.split('.').reduce((value, part) => value?.[part], catalog);\n const t = (key, vars) => {\n const message = lookup(catalogs[current], key) ?? lookup(catalogs.en, key) ?? key;\n return vars\n ? message.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => String(vars[name] ?? ''))\n : message;\n };\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const setLocale = (next) => {\n if (next !== 'en' && next !== 'zh') return;\n current = next;\n for (const listener of listeners) listener();\n };\n return { t, subscribe, getLocale: () => current, setLocale };\n}\n\nconst i18n = createPluginI18n({ en, zh });\n\nexport const t = i18n.t;\nexport const subscribeLocale = i18n.subscribe;\nexport const getLocale = i18n.getLocale;\nexport const setLocale = i18n.setLocale;\n\nregisterViewLocaleSink(i18n.setLocale);\n","import { useCallback, useSyncExternalStore } from 'react';\n\nimport { getLocale, subscribeLocale, t as translate } from './index.mjs';\n\nexport function useTranslation() {\n const locale = useSyncExternalStore(subscribeLocale, getLocale, getLocale);\n const t = useCallback(\n (key: string, vars?: Record<string, string | number>) => translate(key, vars),\n [locale],\n );\n return { t, locale };\n}\n","export const PLUGINS_UI_SCHEMA_VERSION = 'forgeax.view.plugins.ui/1';\n\nexport const PLUGINS_ACTIONS = Object.freeze({\n search: 'plugins.search',\n refresh: 'plugins.refresh',\n select: 'plugins.select',\n});\n\nexport const PLUGINS_MODEL_SCHEMA = Object.freeze({\n $id: PLUGINS_UI_SCHEMA_VERSION,\n type: 'object',\n required: ['entries'],\n properties: {\n entries: {\n type: 'array',\n items: {\n type: 'object',\n required: ['sourceId', 'label', 'version', 'state'],\n properties: {\n sourceId: { type: 'string' },\n label: { type: 'string' },\n version: { type: 'string' },\n state: { enum: ['active', 'inactive', 'error'] },\n },\n },\n },\n },\n});\n","export const PLUGIN_TAGS = Object.freeze(['backend', 'frontend', 'game', 'asset', 'api', 'cli']);\n\nfunction entriesFor(source) {\n const { sourceId, kind, assembly, actual, plugins = [], api } = source;\n const installed = new Map((actual?.entries ?? []).map(entry => [entry.entryId ?? entry.id, entry]));\n // Backend assembly.current is the FRONTEND projection, not backend installations.\n const records = plugins;\n const declared = new Map();\n for (const entry of records) {\n const id = entry.entryId ?? entry.id;\n declared.set(id, { ...declared.get(id), ...entry });\n }\n const entries = new Map();\n for (const entry of declared.values()) {\n const entryId = entry.entryId ?? entry.id;\n if (!entryId) continue;\n const module = entry.module ?? entry.name;\n const observed = installed.get(entryId);\n const realm = observed?.realm ?? entry.realm;\n const operations = (api?.operations ?? []).filter(({ owner }) => owner && (\n entryId === `provider:${owner.sourceId}:${owner.providerId}` ||\n entryId === owner.fiberId || (entry.fiberId !== undefined && String(entry.fiberId) === String(owner.fiberId))\n ));\n const tags = new Set();\n if (kind === 'backend' || kind === 'frontend') tags.add(kind);\n // A View frontend may use Engine's engine realm. Realm alone is not gameplay evidence.\n const required = observed?.requiredServices ?? entry.requiredServices ?? [];\n if (kind === 'game' || kind === 'engine' ||\n (realm === 'engine' && required.some(service => service === 'world' || service === 'gameHost'))) tags.add('game');\n if (entry.assetGuid) tags.add('asset');\n if (operations.length) tags.add('api');\n const commands = operations.map(({ descriptor }) => descriptor?.path ?? descriptor?.id?.split('.'))\n .filter(path => Array.isArray(path) && path.length > 0).map(path => path.join(' '));\n if (commands.length || entry.commandContract) tags.add('cli');\n entries.set(entryId, {\n sourceId, entryId, module,\n label: module && module !== 'unknown' ? module : entry.program || entry.assetGuid || '', kind,\n ...(entry.assetGuid ? { assetGuid: entry.assetGuid } : {}),\n ...(entry.program ? { program: entry.program } : {}),\n realm,\n version: entry.program && entry.program === assembly?.root?.program ? assembly.root.codeRevision : '',\n state: observed?.fiberState ?? entry.fiberState ?? (entry.disabled || entry.desiredState === 'disabled' ? 'disabled' : 'unknown'),\n tags: [...tags],\n operations: operations.map(operation => operation.descriptor.id),\n commands,\n });\n }\n return [...entries.values()];\n}\n\n/** Both public clients are supported; methods must keep their transport-bound receiver. */\nexport function pluginInspector(client) {\n const inspect = typeof client?.inspect === 'function' ? client.inspect : client?.inspectPlugins;\n if (typeof client?.sources !== 'function' || typeof inspect !== 'function') return undefined;\n return { sources: client.sources.bind(client), inspect: inspect.bind(client) };\n}\n\n/** One failed or unavailable source must not masquerade as a complete frontend-only inventory. */\nexport async function loadPluginSnapshot({ client, hostAssembly, connectionId } = {}) {\n const sources = [];\n const issues = [];\n const local = hostAssembly ? {\n sourceId: connectionId ? `view-frontend:${connectionId}` : 'view-frontend',\n kind: 'frontend', assembly: hostAssembly.current, actual: hostAssembly.status,\n plugins: (hostAssembly.inspection ?? []).map(item => ({\n entryId: `fiber:${item.uid}`,\n module: item.name,\n fiberState: item.state,\n ...(item.origin?.guid ? { assetGuid: item.origin.guid } : {}),\n ...(item.origin?.program ? { program: item.origin.program } : {}),\n missingServices: item.missingServices,\n })), local: true,\n } : undefined;\n const inspector = pluginInspector(client);\n if (!inspector) issues.push({ sourceId: 'remote-hosts', message: 'Remote Host inspection unavailable. Only locally observed entries are shown.' });\n else {\n try {\n const listed = await inspector.sources();\n const ownConnection = connectionId ?? listed.caller?.connectionId;\n if (local && ownConnection) local.sourceId = `view-frontend:${ownConnection}`;\n const remote = (listed.sources ?? []).filter(source => !local || !ownConnection ||\n (source.sourceId !== local.sourceId && source.connection?.connectionId !== ownConnection));\n const results = await Promise.allSettled(remote.map(source => inspector.inspect({\n sourceId: source.sourceId, generation: source.generation,\n })));\n results.forEach((result, index) => {\n const source = remote[index];\n if (result.status === 'fulfilled') sources.push({ ...source, ...result.value });\n else {\n sources.push({ ...source, unavailable: true });\n issues.push({ sourceId: source.sourceId, message: result.reason?.message ?? String(result.reason) });\n }\n });\n } catch (cause) {\n issues.push({ sourceId: 'remote-hosts', message: cause?.message ?? String(cause) });\n }\n }\n if (local) sources.push(local);\n sources.sort((a, b) => (a.kind === 'backend' ? 0 : 1) - (b.kind === 'backend' ? 0 : 1) || a.sourceId.localeCompare(b.sourceId));\n return { sources, entries: sources.flatMap(entriesFor), issues };\n}\n\n/** Entry-only callers require complete inspection; the UI can display partial snapshots. */\nexport async function loadPluginEntries(options) {\n const snapshot = await loadPluginSnapshot(options);\n if (snapshot.issues.length) throw new Error(snapshot.issues.map(issue => issue.message).join('; '));\n return snapshot.entries;\n}\n\n/** Search and Host selection intersect; selected capability tags use AND semantics.\n * @param {any[]} entries\n * @param {{ query?: string, sourceId?: string, tags?: string[] }} options\n */\nexport function filterPluginEntries(entries, { query = '', sourceId = '', tags = [] } = {}) {\n const search = query.trim().toLowerCase();\n return entries.filter(entry => (!sourceId || entry.sourceId === sourceId) &&\n tags.every(tag => entry.tags.includes(tag)) &&\n [entry.entryId, entry.module, entry.assetGuid, entry.program, entry.sourceId, entry.kind, entry.realm, entry.state,\n ...entry.tags, ...entry.operations, ...entry.commands].join(' ').toLowerCase().includes(search));\n}\n","import { Button, Text } from '@forgeax/view-components';\nimport { useTranslation } from '../i18n/useTranslation';\nimport { PLUGIN_TAGS } from './plugin-entries.mjs';\n\nexport type PluginSource = { sourceId: string; kind: string; local?: boolean; unavailable?: boolean };\n\nexport function PluginFilters({ sources, sourceId, tags, counts, total, onSource, onTag, onReset }: {\n sources: PluginSource[];\n sourceId: string;\n tags: string[];\n counts: Record<string, number>;\n total: number;\n onSource: (sourceId: string) => void;\n onTag: (tag: string) => void;\n onReset: () => void;\n}) {\n const { t } = useTranslation();\n return <div className=\"fx-plugins-filters\">\n <div className=\"fx-plugins-filter-row\" role=\"group\" aria-label={t('plugins.hosts')}>\n <Text variant=\"caption\" className=\"fx-plugins-filter-label\">{t('plugins.hosts')}</Text>\n <Button size=\"compact\" variant=\"quiet\" className=\"fx-plugin-filter\" aria-pressed={!sourceId}\n data-plugin-host=\"all\" onClick={() => onSource('')}>{t('plugins.allHosts')} <span>{total}</span></Button>\n {sources.map(source => <Button key={source.sourceId} size=\"compact\" variant=\"quiet\"\n className=\"fx-plugin-filter\" aria-pressed={sourceId === source.sourceId} title={source.sourceId}\n data-plugin-host={source.sourceId} onClick={() => onSource(source.sourceId)}>\n {source.local ? t('plugins.thisFrontend') : source.sourceId}\n <span>{counts[`host:${source.sourceId}`] ?? 0}{source.unavailable ? ' !' : ''}</span>\n </Button>)}\n </div>\n <div className=\"fx-plugins-filter-row\" role=\"group\" aria-label={t('plugins.tags')}>\n <Text variant=\"caption\" className=\"fx-plugins-filter-label\">{t('plugins.tags')}</Text>\n {PLUGIN_TAGS.map((tag: string) => <Button key={tag} size=\"compact\" variant=\"quiet\"\n className=\"fx-plugin-filter\" aria-pressed={tags.includes(tag)} title={t(`plugins.tagHelp.${tag}`)}\n data-plugin-tag={tag} onClick={() => onTag(tag)}>{t(`plugins.tag.${tag}`)} <span>{counts[tag] ?? 0}</span></Button>)}\n <Button size=\"compact\" variant=\"quiet\" data-action=\"plugins.reset\" onClick={onReset}>{t('plugins.reset')}</Button>\n </div>\n <Text variant=\"caption\" className=\"fx-plugins-filter-help\">{t('plugins.filterHelp')}</Text>\n </div>;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { jsonUnchanged } from '@forgeax/view-workspace-core/contract';\nimport {\n EmptyState,\n IconButton,\n PanelHeader,\n SearchField,\n Status,\n Surface,\n Text,\n Toolbar,\n type StatusTone,\n} from '@forgeax/view-components';\nimport { Box, Package, RefreshCw, SearchX, ShieldCheck } from 'lucide-react';\nimport { useTranslation } from '../i18n/useTranslation';\nimport { PLUGINS_ACTIONS } from '../schema.mjs';\n\nimport { filterPluginEntries, loadPluginSnapshot, PLUGIN_TAGS } from './plugin-entries.mjs';\nimport { PluginFilters, type PluginSource } from './PluginFilters';\n\ntype PluginEntry = {\n entryId: string;\n module: string;\n sourceId: string;\n label: string;\n version: string;\n state: string;\n kind?: string;\n tags: string[];\n operations: string[];\n commands: string[];\n assetGuid?: string;\n program?: string;\n};\n\ntype PluginsInspectorClient = {\n sources?: (options?: { signal?: AbortSignal }) => Promise<unknown>;\n inspect?: (options: {\n sourceId: string;\n generation: number;\n signal?: AbortSignal;\n }) => Promise<unknown>;\n inspectPlugins?: PluginsInspectorClient['inspect'];\n};\n\nfunction pluginType(entry: PluginEntry) {\n return entry.kind ?? 'unknown';\n}\n\nfunction stateTone(state: string): StatusTone {\n if (state === 'active') return 'success';\n if (state === 'failed' || state === 'error') return 'error';\n if (state === 'pending' || state === 'loading' || state === 'unloading') return 'warning';\n return 'info';\n}\n\nexport function PluginsPanel(props: { client?: PluginsInspectorClient; workspaceClient?: PluginsInspectorClient; hostAssembly?: unknown; connectionId?: string }) {\n const { t } = useTranslation();\n const inspector = props.client ?? props.workspaceClient;\n const [entries, setEntries] = useState<PluginEntry[]>([]);\n const [sources, setSources] = useState<PluginSource[]>([]);\n const [issues, setIssues] = useState<{ sourceId: string; message: string }[]>([]);\n const [sourceId, setSourceId] = useState('');\n const [tags, setTags] = useState<string[]>([]);\n const [query, setQuery] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [selectedEntryId, setSelectedEntryId] = useState<string | null>(null);\n\n const request = useRef(0);\n const refresh = useCallback(async () => {\n const revision = ++request.current;\n setLoading(true);\n setError(null);\n try {\n const snapshot = await loadPluginSnapshot({ client: inspector, hostAssembly: props.hostAssembly, connectionId: props.connectionId });\n if (revision !== request.current) return;\n setEntries((current) => jsonUnchanged(current, snapshot.entries) ? current : snapshot.entries);\n setSources((current) => jsonUnchanged(current, snapshot.sources) ? current : snapshot.sources);\n setIssues((current) => jsonUnchanged(current, snapshot.issues) ? current : snapshot.issues);\n } catch (cause) {\n if (revision !== request.current) return;\n setEntries([]);\n setSources([]);\n setIssues([]);\n setError(cause instanceof Error ? cause.message : t('plugins.loadErrorTitle'));\n } finally {\n if (revision === request.current) setLoading(false);\n }\n }, [inspector, props.hostAssembly, props.connectionId, t]);\n\n useEffect(() => {\n void refresh();\n return () => { request.current += 1; };\n }, [refresh]);\n\n const filtered: PluginEntry[] = filterPluginEntries(entries, { query, sourceId, tags });\n const candidates: PluginEntry[] = filterPluginEntries(entries, { query, sourceId });\n const counts: Record<string, number> = Object.fromEntries(PLUGIN_TAGS.map((tag: string) => [tag, candidates.filter(entry => entry.tags.includes(tag)).length]));\n for (const source of sources) counts[`host:${source.sourceId}`] = entries.filter(entry => entry.sourceId === source.sourceId).length;\n const reset = () => { setQuery(''); setSourceId(''); setTags([]); };\n\n const hostTone: StatusTone = error ? 'error' : loading || issues.length ? 'warning' : 'info';\n const hostLabel = error\n ? t('plugins.loadErrorTitle')\n : loading\n ? t('plugins.loading')\n : issues.length ? t('plugins.partial') : t('plugins.observed');\n\n return (\n <Surface className=\"fx-plugins fx-ui\" tone=\"sidebar\" data-testid=\"panel-plugins\">\n <PanelHeader\n className=\"fx-plugins-header\"\n start={<Text as=\"h2\" variant=\"heading\">{t('plugins.title')}</Text>}\n center={(\n <Toolbar className=\"fx-plugins-toolbar\" aria-label={t('plugins.toolbar')}>\n <SearchField\n data-action={PLUGINS_ACTIONS.search}\n label={t('plugins.filterLabel')}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onClear={() => setQuery('')}\n placeholder={t('plugins.filterPlaceholder')}\n />\n </Toolbar>\n )}\n end={(\n <IconButton\n data-action={PLUGINS_ACTIONS.refresh}\n label={t('plugins.refresh')}\n icon={<RefreshCw className=\"fx-icon\" />}\n variant=\"quiet\"\n size=\"compact\"\n disabled={loading}\n onClick={() => void refresh()}\n />\n )}\n />\n <PluginFilters sources={sources} sourceId={sourceId} tags={tags} counts={counts} total={entries.length}\n onSource={setSourceId} onTag={tag => setTags(current => current.includes(tag) ? current.filter(value => value !== tag) : [...current, tag])}\n onReset={reset} />\n <div className=\"fx-plugins-summary\">\n <Text as=\"span\" variant=\"caption\">\n <ShieldCheck className=\"fx-icon\" /> {t('plugins.resultCount', { count: filtered.length, total: entries.length })}\n </Text>\n <Status tone={hostTone}>{hostLabel}</Status>\n </div>\n {issues.length > 0 ? <div className=\"fx-plugins-notice\" role=\"status\" data-testid=\"plugins-partial\">\n {issues.map(issue => <p key={issue.sourceId}>{issue.sourceId}: {issue.message}</p>)}\n </div> : null}\n <div className=\"fx-plugins-list\">\n {!error && sources.filter(source => filtered.some(entry => entry.sourceId === source.sourceId)).map(source => <section\n key={source.sourceId} className=\"fx-plugin-source\" aria-label={source.sourceId}>\n <div className=\"fx-plugin-source-header\"><Text variant=\"caption\">{source.sourceId}</Text>\n <Text variant=\"caption\">{filtered.filter(entry => entry.sourceId === source.sourceId).length}</Text></div>\n {filtered.filter(entry => entry.sourceId === source.sourceId).map((entry) => {\n const entryId = `${entry.sourceId}:${entry.entryId}`;\n const sourceId = entry.sourceId;\n const label = entry.label || t('plugins.unnamed');\n const version = entry.version || '—';\n const selected = selectedEntryId === entryId;\n const type = pluginType(entry);\n return (\n <button\n type=\"button\"\n key={entryId}\n data-action={PLUGINS_ACTIONS.select}\n className={`fx-plugin-row${selected ? ' selected' : ''}`}\n data-plugin-kind={type}\n data-plugin-tags={entry.tags.join(' ')}\n data-source-id={sourceId}\n data-entry-id={entry.entryId}\n data-asset-guid={entry.assetGuid}\n aria-pressed={selected}\n onClick={() => setSelectedEntryId(entryId)}\n >\n <span className=\"fx-plugin-icon\">{sourceId.includes('view-plugin') || sourceId.includes('viewport') ? <Package size={15} /> : <Box size={15} />}</span>\n <span className=\"fx-plugin-copy\">\n <strong title={label}>{label}</strong>\n {entry.program && entry.program !== label ? <small title={entry.program}>{entry.program}</small> : null}\n {entry.assetGuid ? <small title={t('plugins.sourceAssetGuidHelp')}>{t('plugins.sourceAssetGuid')}: {entry.assetGuid}</small> : null}\n {selected && entry.operations.length > 0 ? <small className=\"fx-plugin-operations\">{entry.commands.join(' · ')}</small> : null}\n </span>\n <span className=\"fx-plugin-tags\">{entry.tags.map(tag => <Status key={tag} className=\"fx-plugin-type\" tone=\"info\" pill icon={null}>{t(`plugins.tag.${tag}`)}</Status>)}</span>\n <span className=\"fx-plugin-version\">{version}</span>\n <Status className=\"fx-plugin-state\" tone={stateTone(entry.state)} pill>\n {entry.state}\n </Status>\n </button>\n );\n })}</section>)}\n {!error && !loading && filtered.length === 0 ? (\n <EmptyState\n icon={<SearchX className=\"fx-plugins-empty-icon\" />}\n title={entries.length === 0 ? t('plugins.empty') : t('plugins.emptyTitle')}\n description={tags.includes('game') && !entries.some(entry => entry.tags.includes('game'))\n ? t('plugins.gameUnavailable') : entries.length === 0 ? t('plugins.unavailable') : t('plugins.emptyDescription')}\n />\n ) : null}\n {error ? (\n <EmptyState\n title={t('plugins.loadErrorTitle')}\n description={error}\n action={<IconButton label={t('plugins.retry')} icon={<RefreshCw className=\"fx-icon\" />} onClick={() => void refresh()} />}\n />\n ) : null}\n </div>\n </Surface>\n );\n}\n","import { OverlayRootProvider } from '@forgeax/view-components';\nimport '../i18n/index.mjs';\nimport { createRoot } from 'react-dom/client';\nimport { PluginsPanel } from './PluginsPanel';\nimport './plugins.css';\n\nexport async function mountPluginsPanel(props: {\n hostAssembly?: unknown;\n connectionId?: string;\n client?: unknown;\n workspaceClient?: unknown;\n mountElement: HTMLElement;\n overlayRoot?: HTMLElement;\n}) {\n if (!props.mountElement) throw new TypeError('mountPluginsPanel requires mountElement');\n const root = createRoot(props.mountElement);\n root.render(\n <OverlayRootProvider root={props.overlayRoot ?? props.mountElement}>\n <PluginsPanel\n hostAssembly={props.hostAssembly}\n connectionId={props.connectionId}\n client={props.client as never}\n workspaceClient={props.workspaceClient as never}\n />\n </OverlayRootProvider>,\n );\n return async () => root.unmount();\n}\n","import { registerViewLocaleSink } from '@forgeax/view-workspace-core/locale-bridge';\nimport en from './locales/en.json' with { type: 'json' };\nimport zh from './locales/zh.json' with { type: 'json' };\n\nfunction createPluginI18n(catalogs) {\n let current = 'zh';\n const listeners = new Set();\n const lookup = (catalog, key) =>\n key.split('.').reduce((value, part) => value?.[part], catalog);\n const t = (key, vars) => {\n const message = lookup(catalogs[current], key) ?? lookup(catalogs.en, key) ?? key;\n return vars\n ? message.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => String(vars[name] ?? ''))\n : message;\n };\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const setLocale = (next) => {\n if (next !== 'en' && next !== 'zh') return;\n current = next;\n for (const listener of listeners) listener();\n };\n return { t, subscribe, getLocale: () => current, setLocale };\n}\n\nconst i18n = createPluginI18n({ en, zh });\n\nexport const t = i18n.t;\nexport const subscribeLocale = i18n.subscribe;\nexport const getLocale = i18n.getLocale;\nexport const setLocale = i18n.setLocale;\n\nregisterViewLocaleSink(i18n.setLocale);\n","import { useCallback, useSyncExternalStore } from 'react';\n\nimport { getLocale, subscribeLocale, t as translate } from './index.mjs';\n\nexport function useTranslation() {\n const locale = useSyncExternalStore(subscribeLocale, getLocale, getLocale);\n const t = useCallback(\n (key: string, vars?: Record<string, string | number>) => translate(key, vars),\n [locale],\n );\n return { t, locale };\n}\n","export const SCENE_TREE_UI_SCHEMA_VERSION = 'forgeax.view.scene-tree.ui/1';\n\nexport const SCENE_TREE_ACTIONS = Object.freeze({\n search: 'scene-tree.search',\n toggleColumn: 'scene-tree.column.toggle',\n expandAll: 'scene-tree.expand-all',\n collapseAll: 'scene-tree.collapse-all',\n toggleExpanded: 'scene-tree.expanded.toggle',\n toggleVisibility: 'scene-tree.visibility.toggle',\n select: 'scene-tree.select',\n selectRange: 'scene-tree.select-range',\n create: 'scene-tree.create',\n rename: 'scene-tree.rename',\n duplicate: 'scene-tree.duplicate',\n delete: 'scene-tree.delete',\n reparent: 'scene-tree.reparent',\n group: 'scene-tree.group',\n focus: 'scene-tree.focus',\n copyJson: 'scene-tree.copy-json',\n referenceInChat: 'scene-tree.reference-in-chat',\n showContextMenu: 'scene-tree.context-menu.show',\n});\n\nexport const SCENE_TREE_MODEL_SCHEMA = Object.freeze({\n $id: SCENE_TREE_UI_SCHEMA_VERSION,\n type: 'object',\n required: ['rows'],\n properties: {\n rows: {\n type: 'array',\n items: {\n type: 'object',\n required: ['id', 'name', 'typeLabel', 'depth', 'kind'],\n properties: {\n id: { type: 'string' },\n name: { type: 'string' },\n typeLabel: { type: 'string' },\n depth: { type: 'integer', minimum: 0 },\n kind: { enum: ['folder', 'entity'] },\n hidden: { type: 'boolean' },\n hasChildren: { type: 'boolean' },\n expanded: { type: 'boolean' },\n },\n },\n },\n },\n});\n","/**\n * Scene-tree type filters mirror forgeax-editor hierarchy filter options:\n * option ids are component schema names from the Engine host, not UI enums.\n */\n\nconst CATEGORY_RULES = [\n { test: /Camera/, category: 'camera' },\n { test: /Light/, category: 'light' },\n { test: /Character|Controller/, category: 'character' },\n { test: /PlayerStart/, category: 'start' },\n { test: /Spawner/, category: 'spawner' },\n { test: /Mesh/, category: 'mesh' },\n];\n\nfunction categoryRank(category) {\n const index = CATEGORY_RULES.findIndex((rule) => rule.category === category);\n return index === -1 ? CATEGORY_RULES.length : index;\n}\n\n/** @param {string} id */\nexport function hierarchyTypeCategory(id) {\n if (id === 'group') return 'group';\n if (id === 'entity') return 'entity';\n for (const rule of CATEGORY_RULES) {\n if (rule.test.test(id)) return rule.category;\n }\n return 'generic';\n}\n\n/** @param {string} a @param {string} b */\nexport function compareComponentFilterIds(a, b) {\n const ra = categoryRank(hierarchyTypeCategory(a));\n const rb = categoryRank(hierarchyTypeCategory(b));\n return ra - rb || a.localeCompare(b);\n}\n\n/**\n * @param {readonly string[]} componentNames\n * @param {ReadonlySet<string>} activeFilters\n */\nexport function entityMatchesSceneTreeFilters(componentNames, activeFilters) {\n if (activeFilters.size === 0) return true;\n return componentNames.some((name) => activeFilters.has(name));\n}\n\n/**\n * Build filter options from a component schema name list and optional counts.\n * View derives these options from the loaded entity component identities.\n *\n * @param {readonly string[]} schemaNames\n * @param {ReadonlyMap<string, number>} [counts]\n */\nexport function buildSceneTreeFilterOptions(schemaNames, counts = new Map()) {\n const seen = new Set();\n const options = [];\n for (const name of schemaNames) {\n const id = String(name);\n if (!id || seen.has(id)) continue;\n seen.add(id);\n const count = counts.get(id);\n options.push({\n id,\n ...(count === undefined ? {} : { count }),\n });\n }\n options.sort((left, right) => compareComponentFilterIds(left.id, right.id));\n return options;\n}\n","import { buildSceneTreeFilterOptions } from './hierarchy-filters.mjs';\n\n/**\n * Normalize Engine `scene-tree.get` payloads into panel rows.\n * View does not author hierarchy; it only projects the latest Engine response.\n */\n\n/**\n * @param {unknown} result\n * @returns {Array<Record<string, unknown>>}\n */\nfunction projectEntityRows(result) {\n if (!result || typeof result !== 'object') return [];\n const nodes = result.nodes;\n if (!Array.isArray(nodes)) return [];\n const rows = [];\n const seen = new Set();\n const flat = nodes.filter(node => node && typeof node === 'object');\n const byId = new Map(flat.map(node => [String(node.entityId), node]));\n const children = new Map();\n for (const node of flat) {\n if (node.parentId && byId.has(node.parentId)) {\n const siblings = children.get(node.parentId) ?? [];\n siblings.push(node);\n children.set(node.parentId, siblings);\n }\n }\n const visit = (root) => {\n const stack = [{ node: root, depth: 0 }];\n while (stack.length) {\n const { node, depth } = stack.pop();\n const id = String(node.entityId ?? '');\n if (!id || seen.has(id)) continue;\n seen.add(id);\n const descendants = children.get(id) ?? [];\n const componentNames = Array.isArray(node.componentNames) ? node.componentNames.filter(name => typeof name === 'string') : [];\n const typeKey = componentNames.includes('Camera') ? 'camera'\n : componentNames.includes('DirectionalLight') ? 'directionalLight'\n : componentNames.includes('MeshFilter') ? 'mesh' : 'entity';\n rows.push({ id, componentNames, name: String(node.name ?? (node.entity === undefined ? id : `Entity ${node.entity}`)), typeKey,\n depth,\n kind: 'entity',\n ...(descendants.length ? { hasChildren: true, expanded: depth < 1 } : {}) });\n for (let i = descendants.length - 1; i >= 0; i--) stack.push({ node: descendants[i], depth: depth + 1 });\n }\n };\n for (const node of flat) if (!node.parentId || !byId.has(node.parentId)) visit(node);\n // Preserve discoverability for cyclic or partial parent projections.\n for (const node of flat) visit(node);\n return rows;\n}\n\n/** Counts describe the loaded rows; Engine owns only component identities. */\nexport function sceneTreeComponentFilters(rows) {\n const counts = new Map();\n for (const row of rows) for (const name of row.componentNames ?? []) counts.set(name, (counts.get(name) ?? 0) + 1);\n return buildSceneTreeFilterOptions([...counts.keys()], counts);\n}\n\n/** This grouping row belongs only to View and is never sent as an entity reference. */\nexport const HIERARCHY_SCENE_FOLDER_ID = 'hierarchy:scene-root';\nexport function isSceneRootRow(row) { return row?.id === HIERARCHY_SCENE_FOLDER_ID; }\nexport function wrapWithVirtualSceneRoot(rows) {\n if (rows.some(isSceneRootRow)) return rows.map(row => isSceneRootRow(row) ? { ...row, virtual: true } : row);\n return [{ id: HIERARCHY_SCENE_FOLDER_ID, name: 'Scene', typeKey: 'folder', depth: 0,\n kind: 'folder', virtual: true, hasChildren: rows.length > 0, expanded: true },\n ...rows.map(row => ({ ...row, depth: row.depth + 1 }))];\n}\nexport function normalizeSceneTreeRows(result) { return wrapWithVirtualSceneRoot(projectEntityRows(result)); }\nexport function normalizeSceneTreeResponse(result) {\n const rows = normalizeSceneTreeRows(result);\n return { rows, filterOptions: sceneTreeComponentFilters(rows) };\n}\n","import {\n Box,\n Braces,\n Camera,\n ChevronDown,\n ChevronRight,\n CircleUserRound,\n Crosshair,\n Filter,\n Folder,\n Layers,\n Lightbulb,\n Maximize2,\n Minimize2,\n Settings,\n X,\n} from 'lucide-react';\nimport {\n Checkbox,\n EmptyState,\n useOverlayRoot,\n FloatingMenu,\n IconButton,\n PanelHeader,\n SearchField,\n Toolbar,\n useWorkspaceClientConnected,\n type AnchorRect,\n} from '@forgeax/view-components';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { useTranslation } from '../i18n/useTranslation';\nimport { SCENE_TREE_ACTIONS } from '../schema.mjs';\nimport type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport { VIEW_WORKSPACE_TAB_ID, jsonUnchanged } from '@forgeax/view-workspace-core/contract';\nimport { createWorkspaceObservation, createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\nimport {\n MOCK_HIERARCHY_ROWS,\n type MockHierarchyRow,\n} from './mockHierarchy';\nimport {\n entityMatchesSceneTreeFilters,\n hierarchyTypeCategory,\n} from '../hierarchy-filters.mjs';\nimport {\n HIERARCHY_SCENE_FOLDER_ID,\n isSceneRootRow,\n sceneTreeComponentFilters,\n normalizeSceneTreeRows,\n} from '../hierarchy.mjs';\n\ntype SceneTreeFilterOption = {\n id: string;\n label?: string;\n count?: number;\n};\n\ntype SceneSelectionClient = Pick<\n ViewWorkspaceClient,\n 'subscribe' | 'getState' | 'selectSceneEntity' | 'getSceneTree' | 'call' | 'onDisconnect' | 'transport'\n>;\n\ntype WorkspacePreviewSnapshot = {\n revision?: number;\n project?: { id: string } | null;\n preview?: {\n asset?: { guid?: string; name?: string };\n target?: { targetId?: string; generation?: number };\n } | null;\n};\n\ntype MenuItem =\n | { kind: 'title'; label: string; icon?: ReactNode }\n | { kind: 'separator' }\n | {\n kind: 'item';\n id: string;\n label: string;\n icon?: ReactNode;\n shortcut?: string;\n disabled?: boolean;\n danger?: boolean;\n forge?: boolean;\n children?: MenuItem[];\n action?: () => void;\n };\ntype MenuState = { x: number; y: number; items: MenuItem[] } | null;\n\nconst HIERARCHY_ROWS: MockHierarchyRow[] = MOCK_HIERARCHY_ROWS.map((row) => ({ ...row }));\n\nfunction rowComponentNames(row: MockHierarchyRow) {\n if (Array.isArray(row.componentNames) && row.componentNames.length > 0) {\n return row.componentNames;\n }\n return row.typeKey ? [String(row.typeKey)] : [];\n}\n\nfunction rowType(row: MockHierarchyRow) {\n if (isSceneRootRow(row)) return 'scene';\n if (row.kind === 'folder') return 'group';\n const primary = rowComponentNames(row).find((name) => name !== 'Transform') ?? row.typeKey;\n if (!primary) return 'mesh';\n return hierarchyTypeCategory(String(primary));\n}\n\nfunction filterOptionIcon(id: string) {\n switch (hierarchyTypeCategory(id)) {\n case 'camera': return <Camera size={14} />;\n case 'light': return <Lightbulb size={14} />;\n case 'character': return <CircleUserRound size={14} />;\n case 'group': return <Layers size={14} />;\n default: return <Box size={14} />;\n }\n}\n\nfunction RowIcon({ row }: { row: MockHierarchyRow }) {\n if (isSceneRootRow(row)) return <Folder size={15} />;\n if (row.kind === 'folder') return <Layers size={15} />;\n if (row.typeKey === 'directionalLight') return <Lightbulb size={15} />;\n if (row.typeKey === 'camera') return <Camera size={15} />;\n if (row.name === 'Player') return <CircleUserRound size={15} />;\n return <Box size={15} />;\n}\n\nfunction HierarchyContextMenu({ state, close }: { state: Exclude<MenuState, null>; close: () => void }) {\n const overlayRoot = useOverlayRoot();\n const [submenu, setSubmenu] = useState<string | null>(null);\n useEffect(() => {\n const dismiss = () => close();\n const escape = (event: KeyboardEvent) => event.key === 'Escape' && close();\n window.addEventListener('pointerdown', dismiss);\n window.addEventListener('keydown', escape);\n return () => {\n window.removeEventListener('pointerdown', dismiss);\n window.removeEventListener('keydown', escape);\n };\n }, [close]);\n const renderItems = (items: MenuItem[], nested = false) => (\n <div className={nested ? 'hier-context-submenu' : 'hier-context-menu'}>\n {items.map((item, index) => {\n if (item.kind === 'separator') return <i className=\"hier-context-separator\" key={`sep-${index}`} />;\n if (item.kind === 'title') return <div className=\"hier-context-title\" key={`title-${index}`}>{item.icon}{item.label}</div>;\n return (\n <div className=\"hier-context-item-wrap\" key={item.id} onPointerEnter={() => item.children && setSubmenu(item.id)}>\n <button\n type=\"button\"\n role=\"menuitem\"\n data-operation={item.id}\n data-danger={item.danger || undefined}\n data-forge={item.forge || undefined}\n disabled={item.disabled}\n onClick={() => {\n if (item.children) {\n setSubmenu(submenu === item.id ? null : item.id);\n return;\n }\n item.action?.();\n close();\n }}\n >\n <span className=\"hier-context-icon\">{item.icon}</span>\n <span>{item.label}</span>\n {item.shortcut ? <kbd>{item.shortcut}</kbd> : null}\n {item.children ? <ChevronRight size={12} /> : null}\n </button>\n {item.children && submenu === item.id ? renderItems(item.children, true) : null}\n </div>\n );\n })}\n </div>\n );\n return createPortal(\n <div\n className=\"hier-context-position\"\n data-action={SCENE_TREE_ACTIONS.showContextMenu}\n role=\"menu\"\n style={{\n left: Math.max(8, Math.min(state.x, window.innerWidth - 260)),\n top: Math.max(8, Math.min(state.y, window.innerHeight - 420)),\n }}\n onPointerDown={(event) => event.stopPropagation()}\n onContextMenu={(event) => event.preventDefault()}\n >\n {renderItems(state.items)}\n </div>,\n overlayRoot ?? document.body,\n );\n}\n\nfunction highlighted(value: string, query: string) {\n const index = value.toLowerCase().indexOf(query.toLowerCase());\n if (!query || index < 0) return value;\n return <>{value.slice(0, index)}<mark className=\"hl\">{value.slice(index, index + query.length)}</mark>{value.slice(index + query.length)}</>;\n}\n\nexport function SceneTreePanel(props: { client?: SceneSelectionClient; demo?: boolean }) {\n if (props.demo) return <SceneTreeDemoPanel client={props.client} />;\n if (!props.client) {\n return (\n <EmptyState\n title=\"Scene hierarchy unavailable\"\n description=\"Connect to the View workspace API to load the Engine scene tree.\"\n />\n );\n }\n return <SceneTreeLivePanel client={props.client} />;\n}\n\nfunction useEngineSceneRows(\n client: SceneSelectionClient,\n workspace: WorkspacePreviewSnapshot | null,\n connected: boolean,\n reader: ReturnType<typeof createWorkspaceStateReader>,\n) {\n const [projection, setProjection] = useState<{ key: string; rows: MockHierarchyRow[]; failed: boolean; hasMore: boolean } | null>(null);\n const [pageCount, setPageCount] = useState(1);\n const target = workspace?.preview?.target;\n const projectId = workspace?.project?.id;\n const key = `${target?.targetId}:${target?.generation}`;\n const current = projection?.key === key ? projection : null;\n const rows = current?.rows ?? [];\n\n useEffect(() => { setPageCount(1); }, [target?.targetId, target?.generation]);\n\n useEffect(() => {\n if (!connected || !target?.targetId || !projectId) {\n if (!connected) return;\n setProjection(null);\n return;\n }\n const observation = createWorkspaceObservation(reader, (current: WorkspacePreviewSnapshot | null) =>\n current?.project?.id === projectId &&\n current?.preview?.target?.targetId === target.targetId &&\n current?.preview?.target?.generation === target.generation);\n const { signal } = observation;\n let timer: ReturnType<typeof setTimeout>;\n const refresh = async () => {\n if (signal.aborted) return;\n let retryDelay = 500;\n try {\n const binding = {\n tabId: VIEW_WORKSPACE_TAB_ID, projectId, targetId: target.targetId,\n targetGeneration: target.generation, signal,\n };\n const result = await client.getSceneTree({ ...binding, limit: 1000 });\n if (signal.aborted) return;\n const nodes = [...(result.nodes ?? [])];\n let nextOffset = result.nextOffset;\n for (let page = 1; page < pageCount && nextOffset !== null && nextOffset !== undefined; page++) {\n const next = await client.getSceneTree({ ...binding, offset: nextOffset, revision: result.revision, limit: 1000 });\n if (signal.aborted) return;\n nodes.push(...next.nodes);\n nextOffset = next.nextOffset;\n }\n if (signal.aborted) return;\n setProjection((current) => {\n const next = { key, rows: normalizeSceneTreeRows({ ...result, nodes }) as MockHierarchyRow[], hasMore: nextOffset !== null && nextOffset !== undefined, failed: false };\n if (\n current?.key === next.key &&\n current.failed === next.failed &&\n current.hasMore === next.hasMore &&\n jsonUnchanged(current.rows, next.rows)\n ) return current;\n return next;\n });\n } catch {\n if (signal.aborted) return;\n setProjection((current) => {\n if (current?.key === key && current.failed && !current.hasMore && current.rows.length === 0) return current;\n return { key, rows: [], hasMore: false, failed: true };\n });\n retryDelay = 1500;\n }\n if (!signal.aborted) {\n timer = setTimeout(refresh, retryDelay);\n }\n };\n void refresh();\n return () => { observation.dispose(); clearTimeout(timer); };\n // Include the published snapshot: React may batch A -> B -> A into one\n // render after the observation for A has already been revoked.\n }, [client, connected, projectId, target?.targetId, target?.generation, pageCount, key, reader, workspace]);\n\n return { rows, filterOptions: sceneTreeComponentFilters(rows), failed: current?.failed ?? false, hasMore: current?.hasMore ?? false, loadMore: () => setPageCount(value => value + 1) };\n}\n\nfunction SceneTreeLivePanel({ client }: { client: SceneSelectionClient }) {\n const { t } = useTranslation();\n const reader = useMemo(() => createWorkspaceStateReader(client), [client]);\n const workspace = useSyncExternalStore(\n reader.subscribe,\n () => reader.getSnapshot() as WorkspacePreviewSnapshot | null,\n () => reader.getSnapshot() as WorkspacePreviewSnapshot | null,\n );\n const connected = useWorkspaceClientConnected(client);\n const { rows, filterOptions, failed, hasMore, loadMore } = useEngineSceneRows(client, workspace, connected, reader);\n\n if (!workspace?.preview?.target?.targetId) {\n return (\n <EmptyState\n title={t('sceneTree.unavailable')}\n description=\"Open a scene preview from the Content Browser to load the Engine hierarchy.\"\n />\n );\n }\n if (failed) {\n return (\n <EmptyState\n title={t('sceneTree.unavailable')}\n description={t('sceneTree.loadErrorDescription')}\n />\n );\n }\n if (rows.length === 0) return <EmptyState title=\"Loading hierarchy\" description=\"Reading the selected Engine target.\" />;\n return <>\n {hasMore && <button type=\"button\" onClick={loadMore}>Showing {Math.max(0, rows.length - 1)} entities. Load more</button>}\n <SceneTreeDemoPanel key={`${workspace.preview?.target?.targetId}:${workspace.preview?.target?.generation}`}\n client={client} rows={rows} filterOptions={filterOptions} />\n </>;\n}\n\nfunction SceneTreeDemoPanel({\n client,\n rows: rowsOverride,\n filterOptions: filterOptionsOverride = [],\n}: {\n client?: SceneSelectionClient;\n rows?: MockHierarchyRow[];\n filterOptions?: SceneTreeFilterOption[];\n}) {\n const { t } = useTranslation();\n const reader = useMemo(() => createWorkspaceStateReader(client), [client]);\n const workspace = useSyncExternalStore(\n reader.subscribe,\n () => reader.getSnapshot() as (WorkspacePreviewSnapshot & { sceneSelection?: { primary?: { entityId: string } | null } | null }) | null,\n () => reader.getSnapshot() as (WorkspacePreviewSnapshot & { sceneSelection?: { primary?: { entityId: string } | null } | null }) | null,\n );\n const externalEntityId = workspace?.sceneSelection?.primary?.entityId ?? null;\n const sceneIdentity = workspace?.preview?.asset?.guid ?? workspace?.preview?.target?.targetId ?? null;\n const rows = rowsOverride ?? HIERARCHY_ROWS;\n const rowLabel = useCallback(\n (row: MockHierarchyRow) => (isSceneRootRow(row) ? t('sceneTree.sceneRoot') : row.name),\n [t],\n );\n const typeLabelFor = useCallback(\n (row: MockHierarchyRow) => {\n if (row.kind === 'folder') return t('sceneTree.types.folder');\n if (row.typeKey) {\n const key = `sceneTree.types.${row.typeKey}`;\n const label = t(key);\n return label === key ? t('sceneTree.types.entity') : label;\n }\n return '';\n },\n [t],\n );\n const filterOptions = filterOptionsOverride;\n const componentTypeLabel = useCallback((id: string) => {\n const key = `sceneTree.types.${id}`;\n const label = t(key);\n return label === key ? id : label;\n }, [t]);\n const resolvedFilterOptions = useMemo(\n () => filterOptions.map((option) => ({\n ...option,\n label: option.label ?? componentTypeLabel(option.id),\n })),\n [componentTypeLabel, filterOptions],\n );\n const [query, setQuery] = useState('');\n const [filters, setFilters] = useState(new Set<string>());\n const [expanded, setExpanded] = useState(() => new Set(\n rows.filter((row) => row.expanded || isSceneRootRow(row)).map((row) => row.id),\n ));\n const [columns, setColumns] = useState({ type: true, id: false });\n const [headerMenu, setHeaderMenu] = useState<'filter' | 'settings' | null>(null);\n const [headerMenuAnchor, setHeaderMenuAnchor] = useState<AnchorRect | null>(null);\n const filterButtonRef = useRef<HTMLButtonElement>(null);\n const settingsButtonRef = useRef<HTMLButtonElement>(null);\n const [contextMenu, setContextMenu] = useState<MenuState>(null);\n const [selected, setSelected] = useState(new Set<string>());\n const [anchor, setAnchor] = useState<string | null>(null);\n\n useEffect(() => {\n setExpanded((current) => {\n if (current.has(HIERARCHY_SCENE_FOLDER_ID)) return current;\n const next = new Set(current);\n next.add(HIERARCHY_SCENE_FOLDER_ID);\n return next;\n });\n }, [sceneIdentity]);\n\n useEffect(() => {\n if (externalEntityId && rows.some((row) => row.id === externalEntityId)) {\n setSelected(new Set([externalEntityId]));\n setAnchor(externalEntityId);\n }\n }, [externalEntityId, rows]);\n\n useEffect(() => {\n const allowed = new Set(resolvedFilterOptions.map((option) => option.id));\n setFilters((current) => {\n if (current.size === 0) return current;\n const next = new Set([...current].filter((id) => allowed.has(id)));\n return next.size === current.size ? current : next;\n });\n }, [resolvedFilterOptions]);\n\n const publishSceneSelection = (row: MockHierarchyRow) => {\n if (row.kind !== 'entity' || !client?.selectSceneEntity) return;\n const target = workspace?.preview?.target;\n if (!target?.targetId) return;\n void client.selectSceneEntity(row.id, {\n label: row.name,\n tabId: VIEW_WORKSPACE_TAB_ID,\n targetId: target.targetId,\n targetGeneration: target.generation,\n }).catch(() => {});\n };\n\n const visibleRows = useMemo(() => {\n const text = query.trim().toLowerCase();\n const filtering = text.length > 0 || filters.size > 0;\n if (filtering) {\n return rows.filter((row) => {\n const names = rowComponentNames(row);\n const typeText = typeLabelFor(row).toLowerCase();\n const componentText = names.join(' ').toLowerCase();\n const textMatch = !text\n || rowLabel(row).toLowerCase().includes(text)\n || typeText.includes(text)\n || componentText.includes(text);\n const typeMatch = entityMatchesSceneTreeFilters(names, filters);\n return !isSceneRootRow(row) && textMatch && typeMatch;\n }).map((row) => ({ ...row, depth: 0 }));\n }\n const collapsedDepths: number[] = [];\n return rows.filter((row) => {\n while (collapsedDepths.length && collapsedDepths.at(-1)! >= row.depth) collapsedDepths.pop();\n const hiddenByParent = collapsedDepths.length > 0;\n if (row.hasChildren && !expanded.has(row.id)) collapsedDepths.push(row.depth);\n return !hiddenByParent;\n });\n }, [expanded, filters, query, rowLabel, rows, typeLabelFor]);\n\n const selectRow = (row: MockHierarchyRow, event: MouseEvent) => {\n if (row.kind === 'folder') {\n setExpanded((current) => {\n const next = new Set(current);\n if (next.has(row.id)) next.delete(row.id); else next.add(row.id);\n return next;\n });\n return;\n }\n const ordered = visibleRows.filter((entry) => entry.kind === 'entity').map((entry) => entry.id);\n let next: Set<string>;\n if (event.shiftKey && anchor) {\n const from = ordered.indexOf(anchor);\n const to = ordered.indexOf(row.id);\n next = new Set(ordered.slice(Math.min(from, to), Math.max(from, to) + 1));\n } else if (event.ctrlKey || event.metaKey) {\n next = new Set(selected);\n if (next.has(row.id)) next.delete(row.id); else next.add(row.id);\n setAnchor(row.id);\n } else {\n next = new Set([row.id]);\n setAnchor(row.id);\n }\n setSelected(next);\n publishSceneSelection(row);\n };\n const showContext = (event: MouseEvent, items: MenuItem[]) => {\n event.preventDefault();\n event.stopPropagation();\n setHeaderMenu(null);\n setContextMenu({ x: event.clientX, y: event.clientY, items });\n };\n const blankMenu = useCallback((): MenuItem[] => [\n { kind: 'title', label: t('sceneTree.readOnlyTitle') },\n { kind: 'item', id: 'clear-filter', label: t('sceneTree.menu.clearSearchAndFilters'), icon: <X size={14} />, disabled: !query && filters.size === 0, action: () => { setQuery(''); setFilters(new Set()); } },\n { kind: 'item', id: 'focus', label: t('sceneTree.menu.focusSelection'), icon: <Crosshair size={14} />, shortcut: 'F', disabled: selected.size === 0, action: () => {} },\n ], [filters.size, query, selected.size, t]);\n const rowMenu = useCallback((row: MockHierarchyRow): MenuItem[] => [\n { kind: 'title', label: rowLabel(row), icon: <RowIcon row={row} /> },\n { kind: 'item', id: 'copy-json', label: t('sceneTree.menu.copyJson'), icon: <Braces size={14} />, action: () => void navigator.clipboard?.writeText(JSON.stringify(row, null, 2)) },\n { kind: 'item', id: 'focus', label: t('sceneTree.menu.focusInViewport'), icon: <Crosshair size={14} />, shortcut: 'F', disabled: !workspace?.preview || isSceneRootRow(row), action: () => { const target = workspace?.preview?.target; if (target) void client?.call('entity.focus', { entityId: row.id, targetId: target.targetId, targetGeneration: target.generation }); } },\n ], [rowLabel, t, client, workspace?.preview]);\n useEffect(() => {\n if (!headerMenu) setHeaderMenuAnchor(null);\n }, [headerMenu]);\n\n const openHeaderMenu = (kind: 'filter' | 'settings') => {\n if (headerMenu === kind) {\n setHeaderMenu(null);\n return;\n }\n const ref = kind === 'filter' ? filterButtonRef : settingsButtonRef;\n const rect = ref.current?.getBoundingClientRect();\n if (rect) setHeaderMenuAnchor(rect);\n setHeaderMenu(kind);\n };\n\n const toggleTypeFilter = (filterId: string) => {\n setFilters((current) => {\n const next = new Set(current);\n if (next.has(filterId)) next.delete(filterId);\n else next.add(filterId);\n return next;\n });\n };\n\n return (\n <div\n className=\"panel outliner-panel\"\n data-testid=\"panel-hierarchy\"\n data-view-readonly=\"true\"\n role=\"tree\"\n tabIndex={0}\n onKeyDown={(event) => {\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'a') {\n event.preventDefault();\n setSelected(new Set(rows.filter((row) => row.kind === 'entity').map((row) => row.id)));\n }\n }}\n >\n <PanelHeader\n className=\"fx-hier-toolbar\"\n data-testid=\"hier-toolbar\"\n start={(\n <Toolbar>\n <IconButton\n ref={filterButtonRef}\n className={filters.size ? 'active' : undefined}\n label={t('sceneTree.filterByType')}\n icon={<Filter size={14} />}\n size=\"compact\"\n onClick={() => openHeaderMenu('filter')}\n />\n </Toolbar>\n )}\n center={(\n <SearchField\n className=\"fx-hier-search\"\n data-testid=\"hier-search\"\n data-action={SCENE_TREE_ACTIONS.search}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onClear={() => setQuery('')}\n placeholder={t('sceneTree.searchPlaceholder')}\n label={t('sceneTree.searchLabel')}\n />\n )}\n end={(\n <Toolbar>\n <IconButton\n ref={settingsButtonRef}\n label={t('sceneTree.displaySettings')}\n icon={<Settings size={14} />}\n size=\"compact\"\n onClick={() => openHeaderMenu('settings')}\n />\n </Toolbar>\n )}\n />\n <div className=\"ol-colhead\" data-testid=\"hier-colhead\">\n <span className=\"ch-caret\" aria-hidden />\n <span className=\"ch-name sortable\">{t('sceneTree.columnName')}</span>\n {columns.type ? <span className=\"ch-type sortable col-type\">{t('sceneTree.columnType')}</span> : null}\n {columns.id ? <span className=\"ch-id sortable col-id\">{t('sceneTree.columnId')}</span> : null}\n </div>\n <div\n className=\"ol-body\"\n data-testid=\"hier-root-dropzone\"\n onClick={(event) => {\n if (event.target === event.currentTarget) setSelected(new Set());\n }}\n onContextMenu={(event) => {\n if (!(event.target as HTMLElement).closest('.tn')) showContext(event, blankMenu());\n }}\n >\n {visibleRows.length === 0 ? (\n <EmptyState\n className=\"hier-no-match\"\n title={t('sceneTree.noMatchTitle')}\n description={t('sceneTree.noMatchDescription')}\n />\n ) : visibleRows.map((row) => {\n const isSelected = selected.has(row.id);\n const isHidden = row.hidden === true;\n const isExpanded = expanded.has(row.id);\n return (\n <div\n key={row.id}\n className={`tn k-${rowType(row)}${isSelected ? ' sel' : ''}${isHidden ? ' dim' : ''}`}\n data-testid={isSceneRootRow(row) ? 'hier-row-scene-folder' : `hier-row-${row.id}`}\n data-action={SCENE_TREE_ACTIONS.select}\n style={{ paddingLeft: `calc(var(--fx-ref-space-8) + ${row.depth} * var(--hier-indent-step, calc(var(--fx-ref-space-12) + var(--fx-ref-space-2))))` }}\n role=\"treeitem\"\n aria-selected={isSelected}\n tabIndex={isSelected ? 0 : -1}\n onClick={(event) => selectRow(row, event)}\n onContextMenu={(event) => {\n if (!selected.has(row.id)) {\n setSelected(new Set([row.id]));\n if (row.kind === 'entity') publishSceneSelection(row);\n }\n showContext(event, isSceneRootRow(row) ? blankMenu() : rowMenu(row));\n }}\n >\n <button\n type=\"button\"\n className=\"caret\"\n data-action={SCENE_TREE_ACTIONS.toggleExpanded}\n disabled={!row.hasChildren}\n tabIndex={-1}\n onClick={(event) => {\n event.stopPropagation();\n if (!row.hasChildren) return;\n setExpanded((current) => {\n const next = new Set(current);\n if (next.has(row.id)) next.delete(row.id);\n else next.add(row.id);\n return next;\n });\n }}\n >\n {row.hasChildren ? (isExpanded ? <ChevronDown size={12} /> : <ChevronRight size={12} />) : null}\n </button>\n <span className=\"ico\"><RowIcon row={row} /></span>\n <span className=\"name-cell\">\n <span className=\"nm\">{highlighted(rowLabel(row), query)}</span>\n </span>\n {columns.type ? <span className=\"cell type col-type\"><span className=\"kind\">{typeLabelFor(row)}</span></span> : null}\n {columns.id ? <span className=\"cell id col-id\">{isSceneRootRow(row) ? '' : `#${row.id}`}</span> : null}\n </div>\n );\n })}\n </div>\n <FloatingMenu\n open={Boolean(headerMenuAnchor && headerMenu === 'filter')}\n anchorRect={headerMenuAnchor}\n onClose={() => setHeaderMenu(null)}\n ignorePointerWithin={[filterButtonRef]}\n className=\"hier-filter-menu\"\n containerProps={{ onPointerDown: (event) => event.stopPropagation() }}\n >\n <div className=\"hier-filter-menu-body\">\n <div className=\"hier-filter-section\">{t('sceneTree.filterByType')}</div>\n {resolvedFilterOptions.map((filter) => {\n const active = filters.has(filter.id);\n return (\n <button\n type=\"button\"\n className=\"hier-filter-option\"\n data-active={active ? 'true' : 'false'}\n key={filter.id}\n onClick={() => toggleTypeFilter(filter.id)}\n >\n <Checkbox\n checked={active}\n onChange={() => toggleTypeFilter(filter.id)}\n tabIndex={-1}\n hideLabel\n label={filter.label}\n className=\"hier-filter-check\"\n />\n <span className=\"hier-filter-option-icon\" aria-hidden>{filterOptionIcon(filter.id)}</span>\n {filter.label}\n </button>\n );\n })}\n <div className=\"hier-filter-separator\" />\n <button\n type=\"button\"\n className=\"hier-filter-option hier-filter-clear\"\n disabled={filters.size === 0}\n onClick={() => setFilters(new Set())}\n >\n {t('sceneTree.clearFilters')}\n </button>\n </div>\n </FloatingMenu>\n <FloatingMenu\n open={Boolean(headerMenuAnchor && headerMenu === 'settings')}\n anchorRect={headerMenuAnchor}\n onClose={() => setHeaderMenu(null)}\n ignorePointerWithin={[settingsButtonRef]}\n className=\"hier-filter-menu\"\n containerProps={{ onPointerDown: (event) => event.stopPropagation() }}\n >\n <div className=\"hier-filter-menu-body hierarchy-header-menu-settings\">\n <div className=\"hier-filter-section\">{t('sceneTree.columns')}</div>\n {(['type', 'id'] as const).map((column) => {\n const label = column === 'type'\n ? t('sceneTree.columnType')\n : t('sceneTree.columnId');\n const checked = columns[column];\n const toggle = () => setColumns((current) => ({ ...current, [column]: !current[column] }));\n return (\n <button\n type=\"button\"\n className=\"hier-filter-option\"\n data-action={SCENE_TREE_ACTIONS.toggleColumn}\n data-active={checked ? 'true' : 'false'}\n key={column}\n onClick={toggle}\n >\n <Checkbox\n checked={checked}\n onChange={toggle}\n tabIndex={-1}\n hideLabel\n label={label}\n className=\"hier-filter-check\"\n />\n {label}\n </button>\n );\n })}\n <div className=\"hier-filter-separator\" />\n <button\n type=\"button\"\n className=\"hier-filter-option hier-filter-action\"\n data-action={SCENE_TREE_ACTIONS.expandAll}\n onClick={() => setExpanded(new Set(rows.filter((row) => row.hasChildren).map((row) => row.id)))}\n >\n <Maximize2 size={14} className=\"hier-filter-option-icon\" />\n {t('sceneTree.expandAll')}\n </button>\n <button\n type=\"button\"\n className=\"hier-filter-option hier-filter-action\"\n data-action={SCENE_TREE_ACTIONS.collapseAll}\n onClick={() => setExpanded(new Set(rows.filter(isSceneRootRow).map((row) => row.id)))}\n >\n <Minimize2 size={14} className=\"hier-filter-option-icon\" />\n {t('sceneTree.collapseAll')}\n </button>\n </div>\n </FloatingMenu>\n {contextMenu ? <HierarchyContextMenu state={contextMenu} close={() => setContextMenu(null)} /> : null}\n </div>\n );\n}\n","import { HIERARCHY_SCENE_FOLDER_ID } from '../hierarchy.mjs';\n\nexport type SceneEntityTypeKey =\n | 'mesh'\n | 'directionalLight'\n | 'sky'\n | 'folder'\n | 'entity'\n | 'playerStart'\n | 'camera';\n\nexport type MockHierarchyRow = {\n id: string;\n name: string;\n typeKey?: SceneEntityTypeKey;\n componentNames?: string[];\n depth: number;\n kind: 'folder' | 'entity';\n virtual?: boolean;\n hidden?: boolean;\n hasChildren?: boolean;\n expanded?: boolean;\n};\n\n/** Static scene tree matching the ForgeaX editor outliner layout (visual reference only). */\nexport const MOCK_HIERARCHY_ROWS: MockHierarchyRow[] = [\n { id: HIERARCHY_SCENE_FOLDER_ID, name: 'Scene', typeKey: 'folder', depth: 0, kind: 'folder', virtual: true, hasChildren: true, expanded: true },\n { id: 'ground', name: 'Ground', typeKey: 'mesh', componentNames: ['MeshRenderer', 'Transform'], depth: 1, kind: 'entity' },\n { id: 'tree-trunk', name: 'TreeTrunk', typeKey: 'mesh', componentNames: ['MeshRenderer', 'Transform'], depth: 1, kind: 'entity' },\n { id: 'red-box', name: 'RedBox', typeKey: 'mesh', componentNames: ['MeshRenderer', 'Transform'], depth: 1, kind: 'entity' },\n { id: 'blue-ball', name: 'BlueBall', typeKey: 'mesh', componentNames: ['MeshRenderer', 'Transform'], depth: 1, kind: 'entity' },\n { id: 'sun', name: 'Sun', typeKey: 'directionalLight', componentNames: ['DirectionalLight', 'Transform'], depth: 1, kind: 'entity' },\n { id: 'skybox', name: 'Skybox', typeKey: 'sky', componentNames: ['SkyLight', 'Transform'], depth: 1, kind: 'entity' },\n { id: 'player', name: 'Player', typeKey: 'mesh', componentNames: ['CharacterController', 'MeshRenderer', 'Transform'], depth: 1, kind: 'entity' },\n { id: 'props', name: 'Props', depth: 1, kind: 'folder', hasChildren: true, expanded: true },\n { id: 'crate-a', name: 'Crate_A', typeKey: 'mesh', componentNames: ['MeshRenderer', 'Transform'], depth: 2, kind: 'entity' },\n { id: 'crate-b', name: 'Crate_B', typeKey: 'mesh', componentNames: ['MeshRenderer', 'Transform'], depth: 2, kind: 'entity' },\n];\n","import '@forgeax/view-components/styles.css';\nimport { OverlayRootProvider } from '@forgeax/view-components';\nimport '../i18n/index.mjs';\nimport { createRoot } from 'react-dom/client';\nimport { SceneTreePanel } from './SceneTreePanel';\nimport './scene-tree.css';\n\nexport async function mountSceneTreePanel(props: {\n client?: unknown;\n demo?: boolean;\n mountElement: HTMLElement;\n overlayRoot?: HTMLElement;\n}) {\n if (!props.mountElement) throw new TypeError('mountSceneTreePanel requires mountElement');\n const root = createRoot(props.mountElement);\n root.render(\n <OverlayRootProvider root={props.overlayRoot ?? props.mountElement}>\n <SceneTreePanel client={props.client as never} demo={props.demo} />\n </OverlayRootProvider>,\n );\n return async () => root.unmount();\n}\n"],"file":"panels-entry-Ddhfjgf0.js"}
|