@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,162 @@
|
|
|
1
|
+
import {
|
|
2
|
+
traceView
|
|
3
|
+
} from "./chunk-2IJKOG2F.mjs";
|
|
4
|
+
import {
|
|
5
|
+
createWorkspaceStateReader
|
|
6
|
+
} from "./chunk-FJM6WWIY.mjs";
|
|
7
|
+
|
|
8
|
+
// packages/view-workspace-core/src/resource-open.mjs
|
|
9
|
+
var LOG_PREFIX = "[forgeax.view.resource-open]";
|
|
10
|
+
var EDITOR_ASSET_KIND = "scene";
|
|
11
|
+
var TYPE_PREVIEW_KINDS = Object.freeze(["material", "mesh", "texture"]);
|
|
12
|
+
function summarizeResourceAsset(asset) {
|
|
13
|
+
if (!asset || typeof asset !== "object") return null;
|
|
14
|
+
return {
|
|
15
|
+
guid: typeof asset.guid === "string" ? asset.guid : null,
|
|
16
|
+
kind: typeof asset.kind === "string" ? asset.kind : null
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function isEditorWorkspaceAsset(asset) {
|
|
20
|
+
return asset?.kind === EDITOR_ASSET_KIND;
|
|
21
|
+
}
|
|
22
|
+
function isTypePreviewAsset(asset) {
|
|
23
|
+
return TYPE_PREVIEW_KINDS.includes(asset?.kind);
|
|
24
|
+
}
|
|
25
|
+
function selectEditorWorkspacePreview(previews, preferredTargetId) {
|
|
26
|
+
const list = (Array.isArray(previews) ? previews : []).filter(
|
|
27
|
+
(entry) => entry?.target?.targetId != null
|
|
28
|
+
);
|
|
29
|
+
if (preferredTargetId != null && preferredTargetId !== "") {
|
|
30
|
+
const preferred = list.find(
|
|
31
|
+
(entry) => String(entry.target.targetId) === String(preferredTargetId)
|
|
32
|
+
);
|
|
33
|
+
if (preferred && !isTypePreviewAsset(preferred.asset)) return preferred;
|
|
34
|
+
}
|
|
35
|
+
const scenes = list.filter((entry) => isEditorWorkspaceAsset(entry.asset));
|
|
36
|
+
if (scenes.length === 1) return scenes[0];
|
|
37
|
+
const editorWorlds = list.filter((entry) => !isTypePreviewAsset(entry.asset));
|
|
38
|
+
return editorWorlds.length === 1 ? editorWorlds[0] : void 0;
|
|
39
|
+
}
|
|
40
|
+
function selectWorkspaceEditorSurfaceTarget(state) {
|
|
41
|
+
if (state?.editorPreview?.target) return state.editorPreview.target;
|
|
42
|
+
const preview = state?.preview;
|
|
43
|
+
if (preview?.target && !isTypePreviewAsset(preview.asset)) return preview.target;
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
function editorSceneTargetIds(previews, editorPreview) {
|
|
47
|
+
const ids = /* @__PURE__ */ new Set();
|
|
48
|
+
const add = (entry) => {
|
|
49
|
+
if (entry?.target?.targetId == null) return;
|
|
50
|
+
ids.add(String(entry.target.targetId));
|
|
51
|
+
};
|
|
52
|
+
add(editorPreview);
|
|
53
|
+
for (const entry of Array.isArray(previews) ? previews : []) {
|
|
54
|
+
if (isEditorWorkspaceAsset(entry?.asset)) add(entry);
|
|
55
|
+
}
|
|
56
|
+
return ids;
|
|
57
|
+
}
|
|
58
|
+
function logResourceOpen(event, data = {}, { level = "info" } = {}) {
|
|
59
|
+
const logger = typeof console === "undefined" ? void 0 : console[level];
|
|
60
|
+
if (typeof logger === "function") logger(LOG_PREFIX, event, data);
|
|
61
|
+
try {
|
|
62
|
+
traceView("resource-open", event, data);
|
|
63
|
+
} catch {
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function isKind(asset, kinds) {
|
|
67
|
+
return Boolean(asset && kinds.includes(asset.kind) && typeof asset.guid === "string" && asset.guid !== "");
|
|
68
|
+
}
|
|
69
|
+
function extraPreviewEntries(snapshot) {
|
|
70
|
+
const editorIds = editorSceneTargetIds(snapshot?.previews, snapshot?.editorPreview);
|
|
71
|
+
return (Array.isArray(snapshot?.previews) ? snapshot.previews : []).filter((entry) => {
|
|
72
|
+
if (!entry?.asset || entry.target?.targetId == null) return false;
|
|
73
|
+
if (isEditorWorkspaceAsset(entry.asset)) return false;
|
|
74
|
+
if (editorIds.has(String(entry.target.targetId))) return false;
|
|
75
|
+
return true;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function resourceOpenEntry(snapshot, kind) {
|
|
79
|
+
const opens = snapshot?.resourceOpens;
|
|
80
|
+
if (!opens || typeof opens !== "object" || kind == null) return void 0;
|
|
81
|
+
return opens[kind];
|
|
82
|
+
}
|
|
83
|
+
function selectWorkspaceResourceSubject(snapshot, kinds) {
|
|
84
|
+
const accepted = Array.isArray(kinds) ? kinds : [];
|
|
85
|
+
if (accepted.length === 0) {
|
|
86
|
+
const asset = snapshot?.openRequest?.asset;
|
|
87
|
+
return typeof asset?.guid === "string" && asset.guid !== "" ? asset : void 0;
|
|
88
|
+
}
|
|
89
|
+
const extras = extraPreviewEntries(snapshot);
|
|
90
|
+
const candidates = [
|
|
91
|
+
snapshot?.openRequest?.asset,
|
|
92
|
+
snapshot?.openRequest?.preview?.asset,
|
|
93
|
+
...accepted.flatMap((kind) => [
|
|
94
|
+
resourceOpenEntry(snapshot, kind)?.asset,
|
|
95
|
+
resourceOpenEntry(snapshot, kind)?.preview?.asset
|
|
96
|
+
]),
|
|
97
|
+
...[...extras].reverse().map((entry) => entry.asset),
|
|
98
|
+
snapshot?.inspection?.asset
|
|
99
|
+
];
|
|
100
|
+
return candidates.find((asset) => isKind(asset, accepted));
|
|
101
|
+
}
|
|
102
|
+
function selectWorkspaceResourcePreview(snapshot, guid) {
|
|
103
|
+
if (typeof guid !== "string" || guid === "") return void 0;
|
|
104
|
+
return extraPreviewEntries(snapshot).find((entry) => entry.asset.guid === guid);
|
|
105
|
+
}
|
|
106
|
+
function openRequestSequence(request) {
|
|
107
|
+
return request && Number.isSafeInteger(request.sequence) ? request.sequence : 0;
|
|
108
|
+
}
|
|
109
|
+
function observeWorkspaceOpenRequests(client, onOpen) {
|
|
110
|
+
if (typeof onOpen !== "function") {
|
|
111
|
+
throw new TypeError("observeWorkspaceOpenRequests requires onOpen");
|
|
112
|
+
}
|
|
113
|
+
const reader = createWorkspaceStateReader(client);
|
|
114
|
+
let lastSequence = 0;
|
|
115
|
+
let primed = false;
|
|
116
|
+
const unsubscribe = reader.subscribe(() => {
|
|
117
|
+
const snapshot = reader.getSnapshot();
|
|
118
|
+
if (!snapshot) return;
|
|
119
|
+
const request = snapshot.openRequest;
|
|
120
|
+
const sequence = openRequestSequence(request);
|
|
121
|
+
if (!primed) {
|
|
122
|
+
primed = true;
|
|
123
|
+
lastSequence = sequence;
|
|
124
|
+
logResourceOpen("open-request-baseline", {
|
|
125
|
+
requestId: request?.requestId ?? null,
|
|
126
|
+
sequence: lastSequence,
|
|
127
|
+
asset: summarizeResourceAsset(request?.asset)
|
|
128
|
+
});
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (!request || sequence <= lastSequence) return;
|
|
132
|
+
lastSequence = sequence;
|
|
133
|
+
logResourceOpen("open-request-observed", {
|
|
134
|
+
requestId: request.requestId,
|
|
135
|
+
sequence: request.sequence,
|
|
136
|
+
asset: summarizeResourceAsset(request.asset),
|
|
137
|
+
hasPreview: Boolean(request.preview?.target),
|
|
138
|
+
previewTargetId: request.preview?.target?.targetId ?? null
|
|
139
|
+
});
|
|
140
|
+
onOpen(request);
|
|
141
|
+
});
|
|
142
|
+
return () => {
|
|
143
|
+
unsubscribe();
|
|
144
|
+
reader.dispose();
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export {
|
|
149
|
+
EDITOR_ASSET_KIND,
|
|
150
|
+
TYPE_PREVIEW_KINDS,
|
|
151
|
+
summarizeResourceAsset,
|
|
152
|
+
isEditorWorkspaceAsset,
|
|
153
|
+
isTypePreviewAsset,
|
|
154
|
+
selectEditorWorkspacePreview,
|
|
155
|
+
selectWorkspaceEditorSurfaceTarget,
|
|
156
|
+
editorSceneTargetIds,
|
|
157
|
+
logResourceOpen,
|
|
158
|
+
selectWorkspaceResourceSubject,
|
|
159
|
+
selectWorkspaceResourcePreview,
|
|
160
|
+
observeWorkspaceOpenRequests
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=chunk-FKCQYDLX.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../packages/view-workspace-core/src/resource-open.mjs"],
|
|
4
|
+
"sourcesContent": ["import { createWorkspaceStateReader } from './workspace-state.mjs';\nimport { traceView } from './view-trace.mjs';\n\nconst LOG_PREFIX = '[forgeax.view.resource-open]';\n\n/** Editor viewport hosts the scene world. All other kinds are type-previews. */\nexport const EDITOR_ASSET_KIND = 'scene';\nexport const TYPE_PREVIEW_KINDS = Object.freeze(['material', 'mesh', 'texture']);\n\nexport function summarizeResourceAsset(asset) {\n if (!asset || typeof asset !== 'object') return null;\n return {\n guid: typeof asset.guid === 'string' ? asset.guid : null,\n kind: typeof asset.kind === 'string' ? asset.kind : null,\n };\n}\n\nexport function isEditorWorkspaceAsset(asset) {\n return asset?.kind === EDITOR_ASSET_KIND;\n}\n\nexport function isTypePreviewAsset(asset) {\n return TYPE_PREVIEW_KINDS.includes(asset?.kind);\n}\n\n/**\n * Editor identity is the scene world, never Engine array order.\n * A pinned editor target wins even when Engine omits kind on the live preview.\n * Otherwise the unique remaining non-type-preview world is the editor.\n */\nexport function selectEditorWorkspacePreview(previews, preferredTargetId) {\n const list = (Array.isArray(previews) ? previews : []).filter(\n (entry) => entry?.target?.targetId != null,\n );\n if (preferredTargetId != null && preferredTargetId !== '') {\n const preferred = list.find(\n (entry) => String(entry.target.targetId) === String(preferredTargetId),\n );\n if (preferred && !isTypePreviewAsset(preferred.asset)) return preferred;\n }\n const scenes = list.filter((entry) => isEditorWorkspaceAsset(entry.asset));\n if (scenes.length === 1) return scenes[0];\n const editorWorlds = list.filter((entry) => !isTypePreviewAsset(entry.asset));\n return editorWorlds.length === 1 ? editorWorlds[0] : undefined;\n}\n\n/**\n * Viewport overlay target. Dock claim can render before editorPreview is\n * classified; the bound preview is the live scene world until then.\n */\nexport function selectWorkspaceEditorSurfaceTarget(state) {\n if (state?.editorPreview?.target) return state.editorPreview.target;\n const preview = state?.preview;\n if (preview?.target && !isTypePreviewAsset(preview.asset)) return preview.target;\n return null;\n}\n\nexport function editorSceneTargetIds(previews, editorPreview) {\n const ids = new Set();\n const add = (entry) => {\n if (entry?.target?.targetId == null) return;\n ids.add(String(entry.target.targetId));\n };\n add(editorPreview);\n for (const entry of Array.isArray(previews) ? previews : []) {\n if (isEditorWorkspaceAsset(entry?.asset)) add(entry);\n }\n return ids;\n}\n\n/** Console breadcrumb for the asset.open \u2192 openRequest \u2192 openPage path. */\nexport function logResourceOpen(event, data = {}, { level = 'info' } = {}) {\n const logger = typeof console === 'undefined' ? undefined : console[level];\n if (typeof logger === 'function') logger(LOG_PREFIX, event, data);\n try {\n traceView('resource-open', event, data);\n } catch {\n // Trace dump is optional; console breadcrumbs still stand alone.\n }\n}\n\nfunction isKind(asset, kinds) {\n return Boolean(asset && kinds.includes(asset.kind) && typeof asset.guid === 'string' && asset.guid !== '');\n}\n\nfunction extraPreviewEntries(snapshot) {\n const editorIds = editorSceneTargetIds(snapshot?.previews, snapshot?.editorPreview);\n return (Array.isArray(snapshot?.previews) ? snapshot.previews : []).filter((entry) => {\n if (!entry?.asset || entry.target?.targetId == null) return false;\n if (isEditorWorkspaceAsset(entry.asset)) return false;\n if (editorIds.has(String(entry.target.targetId))) return false;\n return true;\n });\n}\n\nfunction resourceOpenEntry(snapshot, kind) {\n const opens = snapshot?.resourceOpens;\n if (!opens || typeof opens !== 'object' || kind == null) return undefined;\n return opens[kind];\n}\n\n/**\n * Each asset editor page keeps the last matching asset after later opens.\n * `openRequest` is only the most recent open, so material/mesh tabs must\n * fall back to live extras and per-kind resourceOpens.\n */\nexport function selectWorkspaceResourceSubject(snapshot, kinds) {\n const accepted = Array.isArray(kinds) ? kinds : [];\n if (accepted.length === 0) {\n const asset = snapshot?.openRequest?.asset;\n return typeof asset?.guid === 'string' && asset.guid !== '' ? asset : undefined;\n }\n const extras = extraPreviewEntries(snapshot);\n const candidates = [\n snapshot?.openRequest?.asset,\n snapshot?.openRequest?.preview?.asset,\n ...accepted.flatMap((kind) => [\n resourceOpenEntry(snapshot, kind)?.asset,\n resourceOpenEntry(snapshot, kind)?.preview?.asset,\n ]),\n ...[...extras].reverse().map((entry) => entry.asset),\n snapshot?.inspection?.asset,\n ];\n return candidates.find((asset) => isKind(asset, accepted));\n}\n\nexport function selectWorkspaceResourcePreview(snapshot, guid) {\n if (typeof guid !== 'string' || guid === '') return undefined;\n // Open requests retain the last asset for each editor page. Only Engine's\n // current preview projection proves that a target is still alive.\n return extraPreviewEntries(snapshot).find((entry) => entry.asset.guid === guid);\n}\n\nfunction openRequestSequence(request) {\n return request && Number.isSafeInteger(request.sequence) ? request.sequence : 0;\n}\n\n/**\n * Observe later workspace openRequest sequences once each. The first snapshot\n * only baselines a retained sequence so a reconnect does not reopen pages.\n * Fiber owners must call the returned disposer; this helper holds no domain state.\n */\nexport function observeWorkspaceOpenRequests(client, onOpen) {\n if (typeof onOpen !== 'function') {\n throw new TypeError('observeWorkspaceOpenRequests requires onOpen');\n }\n const reader = createWorkspaceStateReader(client);\n let lastSequence = 0;\n let primed = false;\n const unsubscribe = reader.subscribe(() => {\n const snapshot = reader.getSnapshot();\n if (!snapshot) return;\n const request = snapshot.openRequest;\n const sequence = openRequestSequence(request);\n if (!primed) {\n primed = true;\n lastSequence = sequence;\n logResourceOpen('open-request-baseline', {\n requestId: request?.requestId ?? null,\n sequence: lastSequence,\n asset: summarizeResourceAsset(request?.asset),\n });\n return;\n }\n if (!request || sequence <= lastSequence) return;\n lastSequence = sequence;\n logResourceOpen('open-request-observed', {\n requestId: request.requestId,\n sequence: request.sequence,\n asset: summarizeResourceAsset(request.asset),\n hasPreview: Boolean(request.preview?.target),\n previewTargetId: request.preview?.target?.targetId ?? null,\n });\n onOpen(request);\n });\n return () => {\n unsubscribe();\n reader.dispose();\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import {
|
|
2
|
+
VIEW_WORKSPACE_TAB_ID
|
|
3
|
+
} from "./chunk-32GD5LL6.mjs";
|
|
4
|
+
|
|
5
|
+
// packages/view-workspace-core/src/project-session.mjs
|
|
6
|
+
var KEY = "forgeax.view.project-session/1";
|
|
7
|
+
var HASH = "forgeaxViewRestore";
|
|
8
|
+
var PREFERENCES = ["forgeax-view-theme", "forgeax.view.locale"];
|
|
9
|
+
var isLoopback = (hostname) => ["localhost", "127.0.0.1", "[::1]"].includes(hostname);
|
|
10
|
+
function restoreProjectPreferences(window = globalThis) {
|
|
11
|
+
const record = readProjectSession(window);
|
|
12
|
+
for (const key of PREFERENCES) {
|
|
13
|
+
const value = record?.preferences?.[key];
|
|
14
|
+
if (typeof value === "string") {
|
|
15
|
+
try {
|
|
16
|
+
window.localStorage?.setItem(key, value);
|
|
17
|
+
} catch {
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function readProjectSession(window = globalThis) {
|
|
23
|
+
try {
|
|
24
|
+
const hash = new URLSearchParams(new URL(window.location.href).hash.slice(1));
|
|
25
|
+
const raw = hash.get(HASH) ?? window.sessionStorage?.getItem(KEY) ?? "null";
|
|
26
|
+
if (raw.length > 64e3) return null;
|
|
27
|
+
const value = JSON.parse(raw);
|
|
28
|
+
if (value?.version !== 1 || typeof value.root !== "string" || !value.root.trim()) return null;
|
|
29
|
+
if (value.targetId !== void 0 && typeof value.targetId !== "string") return null;
|
|
30
|
+
if (value.resources !== void 0 && (!Array.isArray(value.resources) || value.resources.length > 32 || !value.resources.every((guid) => typeof guid === "string"))) return null;
|
|
31
|
+
const presentation = value.presentation;
|
|
32
|
+
if (presentation !== void 0 && (!presentation || typeof presentation !== "object" || Array.isArray(presentation) || presentation.pageOrder !== void 0 && (!Array.isArray(presentation.pageOrder) || !presentation.pageOrder.every((type) => typeof type === "string")) || presentation.activeType !== void 0 && typeof presentation.activeType !== "string" || presentation.layouts !== void 0 && (!presentation.layouts || typeof presentation.layouts !== "object" || Array.isArray(presentation.layouts)))) return null;
|
|
33
|
+
if (value.entry) {
|
|
34
|
+
const entry = new URL(value.entry);
|
|
35
|
+
const current = new URL(window.location.href);
|
|
36
|
+
const sameHost = entry.hostname === current.hostname || isLoopback(entry.hostname) && isLoopback(current.hostname);
|
|
37
|
+
if (!sameHost || entry.protocol !== current.protocol || !["http:", "https:"].includes(entry.protocol) || entry.username || entry.password) return null;
|
|
38
|
+
}
|
|
39
|
+
return { version: 1, root: value.root, entry: value.entry, targetId: value.targetId, preferences: value.preferences };
|
|
40
|
+
} catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function save(window, value) {
|
|
45
|
+
if (!value) return;
|
|
46
|
+
value.preferences = {};
|
|
47
|
+
for (const key of PREFERENCES) {
|
|
48
|
+
try {
|
|
49
|
+
const preference = window.localStorage?.getItem(key);
|
|
50
|
+
if (preference) value.preferences[key] = preference;
|
|
51
|
+
} catch {
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
window.sessionStorage?.setItem(KEY, JSON.stringify(value));
|
|
56
|
+
} catch {
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function projectSessionUrl(url, record) {
|
|
60
|
+
const next = new URL(url);
|
|
61
|
+
next.hash = new URLSearchParams({ [HASH]: JSON.stringify(record) }).toString();
|
|
62
|
+
return next.href;
|
|
63
|
+
}
|
|
64
|
+
function navigateProjectSession(snapshot, window = globalThis, record = readProjectSession(window)) {
|
|
65
|
+
const url = snapshot?.projectTarget?.url;
|
|
66
|
+
if (!url || !window.location?.assign) return;
|
|
67
|
+
if (!snapshot.project?.root) {
|
|
68
|
+
window.location.assign(url);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const current = new URL(window.location.href);
|
|
72
|
+
const next = {
|
|
73
|
+
...record,
|
|
74
|
+
version: 1,
|
|
75
|
+
root: snapshot.project.root,
|
|
76
|
+
targetId: snapshot.projectTarget.targetId,
|
|
77
|
+
entry: record?.entry ?? current.origin + current.pathname
|
|
78
|
+
};
|
|
79
|
+
save(window, next);
|
|
80
|
+
window.location.assign(projectSessionUrl(url, next));
|
|
81
|
+
}
|
|
82
|
+
function createProjectSession(client, { window = globalThis } = {}) {
|
|
83
|
+
let disposed = false;
|
|
84
|
+
let record = readProjectSession(window);
|
|
85
|
+
const location = window.location;
|
|
86
|
+
const url = location?.href ? new URL(location.href) : null;
|
|
87
|
+
const explicitRoot = url?.searchParams.get("project")?.trim();
|
|
88
|
+
const pageTarget = url?.searchParams.get("forgeaxWorkspaceTarget");
|
|
89
|
+
const navigation = window.performance?.getEntriesByType?.("navigation")?.[0];
|
|
90
|
+
let state = {
|
|
91
|
+
snapshot: {},
|
|
92
|
+
busy: false,
|
|
93
|
+
error: null,
|
|
94
|
+
restoring: Boolean(pageTarget ? navigation?.type === "reload" : explicitRoot || record?.root && record?.targetId)
|
|
95
|
+
};
|
|
96
|
+
let initializing = true;
|
|
97
|
+
let retryTimer;
|
|
98
|
+
let cancelDelay;
|
|
99
|
+
let reconnecting;
|
|
100
|
+
let cancelNavigation;
|
|
101
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
102
|
+
const controller = new AbortController();
|
|
103
|
+
const options = { tabId: VIEW_WORKSPACE_TAB_ID, signal: controller.signal };
|
|
104
|
+
const changed = (patch) => {
|
|
105
|
+
if (disposed) return;
|
|
106
|
+
state = { ...state, ...patch };
|
|
107
|
+
for (const listener of listeners) listener(state);
|
|
108
|
+
};
|
|
109
|
+
const accept = (snapshot) => {
|
|
110
|
+
if (disposed || (snapshot.revision ?? 0) < (state.snapshot.revision ?? -1)) return;
|
|
111
|
+
changed({ snapshot });
|
|
112
|
+
const remoteTargetUrl = snapshot?.projectTarget?.url;
|
|
113
|
+
if (!pageTarget && !explicitRoot && !record?.targetId && !initializing && snapshot?.workspaceTargetLost !== true && typeof snapshot?.project?.root === "string" && snapshot.project.root.trim() !== "" && typeof remoteTargetUrl === "string" && remoteTargetUrl.trim() !== "") {
|
|
114
|
+
void Promise.resolve(navigate(snapshot)).catch(fail);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (initializing || !pageTarget || snapshot.projectTarget?.targetId !== pageTarget || !snapshot.project?.root) return;
|
|
118
|
+
record = {
|
|
119
|
+
...record,
|
|
120
|
+
version: 1,
|
|
121
|
+
root: snapshot.project.root,
|
|
122
|
+
targetId: pageTarget
|
|
123
|
+
};
|
|
124
|
+
save(window, record);
|
|
125
|
+
};
|
|
126
|
+
const fail = (error) => changed({ busy: false, error: error instanceof Error ? error.message : String(error) });
|
|
127
|
+
const run = async (action) => {
|
|
128
|
+
if (disposed || state.busy) return;
|
|
129
|
+
changed({ busy: true, error: null, restoring: true });
|
|
130
|
+
try {
|
|
131
|
+
await action();
|
|
132
|
+
} catch (error) {
|
|
133
|
+
if (!controller.signal.aborted) fail(error);
|
|
134
|
+
} finally {
|
|
135
|
+
changed({ busy: false });
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
const navigate = (snapshot) => {
|
|
139
|
+
if (disposed) return;
|
|
140
|
+
record = {
|
|
141
|
+
...record,
|
|
142
|
+
version: 1,
|
|
143
|
+
root: snapshot?.project?.root,
|
|
144
|
+
targetId: snapshot?.projectTarget?.targetId
|
|
145
|
+
};
|
|
146
|
+
if (!snapshot?.projectTarget?.url || !window.addEventListener) return navigateProjectSession(snapshot, window, record);
|
|
147
|
+
return new Promise((resolve) => {
|
|
148
|
+
const leave = () => {
|
|
149
|
+
window.removeEventListener("pagehide", leave);
|
|
150
|
+
cancelNavigation = void 0;
|
|
151
|
+
resolve();
|
|
152
|
+
};
|
|
153
|
+
cancelNavigation = leave;
|
|
154
|
+
window.addEventListener("pagehide", leave, { once: true });
|
|
155
|
+
try {
|
|
156
|
+
navigateProjectSession(snapshot, window, record);
|
|
157
|
+
} catch (error) {
|
|
158
|
+
leave();
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
const recover = async () => {
|
|
164
|
+
const snapshot = await client.getState({ signal: controller.signal });
|
|
165
|
+
accept(snapshot);
|
|
166
|
+
const expectedTargetId = pageTarget ?? record?.targetId;
|
|
167
|
+
if (!expectedTargetId || snapshot.projectTarget?.targetId !== expectedTargetId)
|
|
168
|
+
throw new Error("The project changed in another page. Open the current View entry and choose a project explicitly.");
|
|
169
|
+
return navigate(await client.reopenProject({ ...options, expectedTargetId, expectedTargetState: "lost" }));
|
|
170
|
+
};
|
|
171
|
+
const open = (root) => run(async () => {
|
|
172
|
+
const snapshot = await client.getState({ signal: controller.signal });
|
|
173
|
+
accept(snapshot);
|
|
174
|
+
if (snapshot.project) {
|
|
175
|
+
if (snapshot.project.root !== root) throw new Error("Another project is already open. Close it explicitly before opening a different project.");
|
|
176
|
+
record = { ...record, version: 1, root, targetId: snapshot.projectTarget?.targetId };
|
|
177
|
+
await recover();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
record = { version: 1, root, entry: url ? url.origin + url.pathname : void 0 };
|
|
181
|
+
return navigate(await client.openProject(root, { ...options, expectedTargetId: null }));
|
|
182
|
+
});
|
|
183
|
+
const reconnect = () => run(recover);
|
|
184
|
+
const stop = client.subscribe(accept);
|
|
185
|
+
const probeEntry = async () => {
|
|
186
|
+
if (!record?.entry || disposed) return;
|
|
187
|
+
changed({ busy: true, error: null, restoring: true });
|
|
188
|
+
for (const delay of [0, 250, 500, 1e3, 2e3, 4e3]) {
|
|
189
|
+
await new Promise((resolve) => {
|
|
190
|
+
cancelDelay = resolve;
|
|
191
|
+
retryTimer = setTimeout(resolve, delay);
|
|
192
|
+
});
|
|
193
|
+
cancelDelay = void 0;
|
|
194
|
+
if (disposed) return;
|
|
195
|
+
try {
|
|
196
|
+
const response = await window.fetch(new URL("/__forgeax/view/health", record.entry), {
|
|
197
|
+
cache: "no-store",
|
|
198
|
+
signal: AbortSignal.any([controller.signal, AbortSignal.timeout(2e3)])
|
|
199
|
+
});
|
|
200
|
+
if (!response.ok) throw new Error("View entry is unavailable");
|
|
201
|
+
if (!disposed) {
|
|
202
|
+
const destination = projectSessionUrl(record.entry, record);
|
|
203
|
+
if (!window.addEventListener) location.replace(destination);
|
|
204
|
+
else await new Promise((resolve) => {
|
|
205
|
+
const leave = () => {
|
|
206
|
+
window.removeEventListener("pagehide", leave);
|
|
207
|
+
cancelNavigation = void 0;
|
|
208
|
+
resolve();
|
|
209
|
+
};
|
|
210
|
+
cancelNavigation = leave;
|
|
211
|
+
window.addEventListener("pagehide", leave, { once: true });
|
|
212
|
+
try {
|
|
213
|
+
location.replace(destination);
|
|
214
|
+
} catch (error) {
|
|
215
|
+
leave();
|
|
216
|
+
throw error;
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
return;
|
|
221
|
+
} catch (error) {
|
|
222
|
+
if (disposed) return;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
fail(new Error("View is unavailable. Start or reconnect the backend and View, then retry."));
|
|
226
|
+
};
|
|
227
|
+
const returnToEntry = () => reconnecting ??= probeEntry().finally(() => {
|
|
228
|
+
reconnecting = void 0;
|
|
229
|
+
});
|
|
230
|
+
const disconnect = pageTarget ? client.onDisconnect?.((error) => {
|
|
231
|
+
if (/stopped|stopping|unauthorized|forbidden|incompatible/i.test(error?.message ?? "")) {
|
|
232
|
+
fail(error);
|
|
233
|
+
} else void returnToEntry();
|
|
234
|
+
}) : void 0;
|
|
235
|
+
const ready = (async () => {
|
|
236
|
+
if (!url) return;
|
|
237
|
+
if (url.hash.includes(HASH)) {
|
|
238
|
+
save(window, record);
|
|
239
|
+
url.hash = "";
|
|
240
|
+
window.history?.replaceState(null, "", url.href);
|
|
241
|
+
}
|
|
242
|
+
if (pageTarget && navigation?.type === "reload") {
|
|
243
|
+
if (!record?.entry) throw new Error("The View entry for this project session is unavailable. Open View and choose the project again.");
|
|
244
|
+
await returnToEntry();
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
const snapshot = await client.getState({ signal: controller.signal });
|
|
248
|
+
accept(snapshot);
|
|
249
|
+
if (!pageTarget) {
|
|
250
|
+
if (explicitRoot) await open(explicitRoot);
|
|
251
|
+
else if (record?.root && record?.targetId) await reconnect();
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
})().catch(fail).finally(() => {
|
|
255
|
+
initializing = false;
|
|
256
|
+
accept(state.snapshot);
|
|
257
|
+
});
|
|
258
|
+
return {
|
|
259
|
+
ready,
|
|
260
|
+
open,
|
|
261
|
+
reconnect,
|
|
262
|
+
reconnectHost: returnToEntry,
|
|
263
|
+
getSnapshot: () => state,
|
|
264
|
+
subscribe(listener) {
|
|
265
|
+
listeners.add(listener);
|
|
266
|
+
listener(state);
|
|
267
|
+
return () => listeners.delete(listener);
|
|
268
|
+
},
|
|
269
|
+
dispose() {
|
|
270
|
+
disposed = true;
|
|
271
|
+
controller.abort();
|
|
272
|
+
clearTimeout(retryTimer);
|
|
273
|
+
cancelDelay?.();
|
|
274
|
+
cancelNavigation?.();
|
|
275
|
+
disconnect?.();
|
|
276
|
+
stop();
|
|
277
|
+
listeners.clear();
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export {
|
|
283
|
+
restoreProjectPreferences,
|
|
284
|
+
readProjectSession,
|
|
285
|
+
projectSessionUrl,
|
|
286
|
+
navigateProjectSession,
|
|
287
|
+
createProjectSession
|
|
288
|
+
};
|
|
289
|
+
//# sourceMappingURL=chunk-FMCACPX5.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../packages/view-workspace-core/src/project-session.mjs"],
|
|
4
|
+
"sourcesContent": ["import { VIEW_WORKSPACE_TAB_ID } from './contract.mjs';\n\nconst KEY = 'forgeax.view.project-session/1';\nconst HASH = 'forgeaxViewRestore';\nconst PREFERENCES = ['forgeax-view-theme', 'forgeax.view.locale'];\nconst isLoopback = hostname => ['localhost', '127.0.0.1', '[::1]'].includes(hostname);\n\nexport function restoreProjectPreferences(window = globalThis) {\n const record = readProjectSession(window);\n for (const key of PREFERENCES) {\n const value = record?.preferences?.[key];\n if (typeof value === 'string') {\n try { window.localStorage?.setItem(key, value); } catch { /* Optional preference. */ }\n }\n }\n}\n\nexport function readProjectSession(window = globalThis) {\n try {\n const hash = new URLSearchParams(new URL(window.location.href).hash.slice(1));\n const raw = hash.get(HASH) ?? window.sessionStorage?.getItem(KEY) ?? 'null';\n if (raw.length > 64000) return null;\n const value = JSON.parse(raw);\n if (value?.version !== 1 || typeof value.root !== 'string' || !value.root.trim()) return null;\n if (value.targetId !== undefined && typeof value.targetId !== 'string') return null;\n if (value.resources !== undefined && (!Array.isArray(value.resources) ||\n value.resources.length > 32 || !value.resources.every(guid => typeof guid === 'string'))) return null;\n const presentation = value.presentation;\n if (presentation !== undefined && (!presentation || typeof presentation !== 'object' || Array.isArray(presentation) ||\n (presentation.pageOrder !== undefined && (!Array.isArray(presentation.pageOrder) ||\n !presentation.pageOrder.every(type => typeof type === 'string'))) ||\n (presentation.activeType !== undefined && typeof presentation.activeType !== 'string') ||\n (presentation.layouts !== undefined && (!presentation.layouts || typeof presentation.layouts !== 'object' ||\n Array.isArray(presentation.layouts))))) return null;\n if (value.entry) {\n const entry = new URL(value.entry);\n const current = new URL(window.location.href);\n const sameHost = entry.hostname === current.hostname || (isLoopback(entry.hostname) && isLoopback(current.hostname));\n if (!sameHost || entry.protocol !== current.protocol ||\n !['http:', 'https:'].includes(entry.protocol) || entry.username || entry.password) return null;\n }\n // Read old records without reviving their resource, camera or layout history.\n return { version: 1, root: value.root, entry: value.entry, targetId: value.targetId, preferences: value.preferences };\n } catch { return null; }\n}\n\nfunction save(window, value) {\n if (!value) return;\n value.preferences = {};\n for (const key of PREFERENCES) {\n try {\n const preference = window.localStorage?.getItem(key);\n if (preference) value.preferences[key] = preference;\n } catch { /* Storage is optional. */ }\n }\n try { window.sessionStorage?.setItem(KEY, JSON.stringify(value)); } catch { /* Storage is optional. */ }\n}\n\nexport function projectSessionUrl(url, record) {\n const next = new URL(url);\n next.hash = new URLSearchParams({ [HASH]: JSON.stringify(record) }).toString();\n return next.href;\n}\n\n/** Transfer the confirmed project identity across origins, never runtime history. */\nexport function navigateProjectSession(snapshot, window = globalThis, record = readProjectSession(window)) {\n const url = snapshot?.projectTarget?.url;\n if (!url || !window.location?.assign) return;\n if (!snapshot.project?.root) { window.location.assign(url); return; }\n const current = new URL(window.location.href);\n const next = {\n ...record, version: 1, root: snapshot.project.root,\n targetId: snapshot.projectTarget.targetId,\n entry: record?.entry ?? current.origin + current.pathname,\n };\n save(window, next);\n window.location.assign(projectSessionUrl(url, next));\n}\n\n/** One Cordis-owned project intent/recovery projection shared by all React consumers. */\nexport function createProjectSession(client, { window = globalThis } = {}) {\n let disposed = false;\n let record = readProjectSession(window);\n const location = window.location;\n const url = location?.href ? new URL(location.href) : null;\n const explicitRoot = url?.searchParams.get('project')?.trim();\n const pageTarget = url?.searchParams.get('forgeaxWorkspaceTarget');\n const navigation = window.performance?.getEntriesByType?.('navigation')?.[0];\n let state = {\n snapshot: {}, busy: false, error: null,\n restoring: Boolean(pageTarget ? navigation?.type === 'reload' : explicitRoot || (record?.root && record?.targetId)),\n };\n let initializing = true;\n let retryTimer;\n let cancelDelay;\n let reconnecting;\n let cancelNavigation;\n const listeners = new Set();\n const controller = new AbortController();\n const options = { tabId: VIEW_WORKSPACE_TAB_ID, signal: controller.signal };\n const changed = patch => {\n if (disposed) return;\n state = { ...state, ...patch };\n for (const listener of listeners) listener(state);\n };\n const accept = snapshot => {\n if (disposed || (snapshot.revision ?? 0) < (state.snapshot.revision ?? -1)) return;\n changed({ snapshot });\n // A project opened outside this page (for example `view project open`)\n // is adopted by an empty shell that holds no earlier target identity.\n // Headed documents carry pageTarget and never adopt; a page remembering\n // another target keeps its explicit conflict instead of chasing someone\n // else's session.\n const remoteTargetUrl = snapshot?.projectTarget?.url;\n if (!pageTarget && !explicitRoot && !record?.targetId && !initializing\n && snapshot?.workspaceTargetLost !== true\n && typeof snapshot?.project?.root === 'string' && snapshot.project.root.trim() !== ''\n && typeof remoteTargetUrl === 'string' && remoteTargetUrl.trim() !== '') {\n void Promise.resolve(navigate(snapshot)).catch(fail);\n return;\n }\n if (initializing || !pageTarget || snapshot.projectTarget?.targetId !== pageTarget || !snapshot.project?.root) return;\n record = {\n ...record, version: 1, root: snapshot.project.root, targetId: pageTarget,\n };\n save(window, record);\n };\n const fail = error => changed({ busy: false, error: error instanceof Error ? error.message : String(error) });\n const run = async action => {\n if (disposed || state.busy) return;\n changed({ busy: true, error: null, restoring: true });\n try { await action(); }\n catch (error) { if (!controller.signal.aborted) fail(error); }\n finally { changed({ busy: false }); }\n };\n const navigate = snapshot => {\n if (disposed) return;\n record = { ...record, version: 1, root: snapshot?.project?.root,\n targetId: snapshot?.projectTarget?.targetId };\n if (!snapshot?.projectTarget?.url || !window.addEventListener) return navigateProjectSession(snapshot, window, record);\n // Keep this document's activation pending until the browser leaves. Starting\n // another App here races the old project server's guarded replacement.\n return new Promise(resolve => {\n const leave = () => {\n window.removeEventListener('pagehide', leave);\n cancelNavigation = undefined;\n resolve();\n };\n cancelNavigation = leave;\n window.addEventListener('pagehide', leave, { once: true });\n try { navigateProjectSession(snapshot, window, record); }\n catch (error) { leave(); throw error; }\n });\n };\n const recover = async () => {\n const snapshot = await client.getState({ signal: controller.signal });\n accept(snapshot);\n const expectedTargetId = pageTarget ?? record?.targetId;\n if (!expectedTargetId || snapshot.projectTarget?.targetId !== expectedTargetId)\n throw new Error('The project changed in another page. Open the current View entry and choose a project explicitly.');\n return navigate(await client.reopenProject({ ...options, expectedTargetId, expectedTargetState: 'lost' }));\n };\n const open = root => run(async () => {\n const snapshot = await client.getState({ signal: controller.signal });\n accept(snapshot);\n if (snapshot.project) {\n if (snapshot.project.root !== root) throw new Error('Another project is already open. Close it explicitly before opening a different project.');\n record = { ...record, version: 1, root, targetId: snapshot.projectTarget?.targetId };\n await recover();\n return;\n }\n record = { version: 1, root, entry: url ? url.origin + url.pathname : undefined };\n return navigate(await client.openProject(root, { ...options, expectedTargetId: null }));\n });\n const reconnect = () => run(recover);\n const stop = client.subscribe(accept);\n const probeEntry = async () => {\n if (!record?.entry || disposed) return;\n changed({ busy: true, error: null, restoring: true });\n for (const delay of [0, 250, 500, 1000, 2000, 4000]) {\n await new Promise(resolve => {\n cancelDelay = resolve;\n retryTimer = setTimeout(resolve, delay);\n });\n cancelDelay = undefined;\n if (disposed) return;\n try {\n const response = await window.fetch(new URL('/__forgeax/view/health', record.entry), {\n cache: 'no-store', signal: AbortSignal.any([controller.signal, AbortSignal.timeout(2000)]),\n });\n if (!response.ok) throw new Error('View entry is unavailable');\n if (!disposed) {\n const destination = projectSessionUrl(record.entry, record);\n if (!window.addEventListener) location.replace(destination);\n else await new Promise(resolve => {\n const leave = () => {\n window.removeEventListener('pagehide', leave);\n cancelNavigation = undefined;\n resolve();\n };\n cancelNavigation = leave;\n window.addEventListener('pagehide', leave, { once: true });\n try { location.replace(destination); }\n catch (error) { leave(); throw error; }\n });\n }\n return;\n } catch (error) { if (disposed) return; }\n }\n fail(new Error('View is unavailable. Start or reconnect the backend and View, then retry.'));\n };\n const returnToEntry = () => reconnecting ??= probeEntry().finally(() => { reconnecting = undefined; });\n const disconnect = pageTarget ? client.onDisconnect?.(error => {\n if (/stopped|stopping|unauthorized|forbidden|incompatible/i.test(error?.message ?? '')) {\n fail(error);\n } else void returnToEntry();\n }) : undefined;\n const ready = (async () => {\n if (!url) return;\n if (url.hash.includes(HASH)) {\n save(window, record);\n url.hash = '';\n window.history?.replaceState(null, '', url.href);\n }\n // The client uses the resident View endpoint, so closing the old project\n // server cannot interrupt this guarded replacement. Never revive its World.\n if (pageTarget && navigation?.type === 'reload') {\n if (!record?.entry) throw new Error('The View entry for this project session is unavailable. Open View and choose the project again.');\n await returnToEntry();\n return;\n }\n const snapshot = await client.getState({ signal: controller.signal });\n accept(snapshot);\n if (!pageTarget) {\n if (explicitRoot) await open(explicitRoot);\n else if (record?.root && record?.targetId) await reconnect();\n // A project remote-opened before this page loaded leaves no explicit\n // intent and no remembered target here; the post-initialization accept\n // below adopts its headed document.\n return;\n }\n })().catch(fail).finally(() => { initializing = false; accept(state.snapshot); });\n return {\n ready, open, reconnect,\n reconnectHost: returnToEntry,\n getSnapshot: () => state,\n subscribe(listener) { listeners.add(listener); listener(state); return () => listeners.delete(listener); },\n dispose() {\n disposed = true;\n controller.abort();\n clearTimeout(retryTimer);\n cancelDelay?.();\n cancelNavigation?.();\n disconnect?.();\n stop();\n listeners.clear();\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// packages/view-workspace-core/src/locale-bridge.mjs
|
|
2
|
+
var pluginSinks = /* @__PURE__ */ new Set();
|
|
3
|
+
var shellListeners = /* @__PURE__ */ new Set();
|
|
4
|
+
var viewLocale = "zh";
|
|
5
|
+
function notifyPlugins(locale) {
|
|
6
|
+
for (const sink of pluginSinks) {
|
|
7
|
+
try {
|
|
8
|
+
sink(locale);
|
|
9
|
+
} catch {
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function notifyShell() {
|
|
14
|
+
for (const listener of shellListeners) listener();
|
|
15
|
+
}
|
|
16
|
+
function getViewLocale() {
|
|
17
|
+
return viewLocale;
|
|
18
|
+
}
|
|
19
|
+
function subscribeViewLocale(listener) {
|
|
20
|
+
if (typeof listener !== "function") {
|
|
21
|
+
throw new TypeError("subscribeViewLocale requires a listener function");
|
|
22
|
+
}
|
|
23
|
+
shellListeners.add(listener);
|
|
24
|
+
return () => shellListeners.delete(listener);
|
|
25
|
+
}
|
|
26
|
+
function setViewLocale(locale) {
|
|
27
|
+
if (locale !== "en" && locale !== "zh") return;
|
|
28
|
+
if (viewLocale === locale) return;
|
|
29
|
+
viewLocale = locale;
|
|
30
|
+
notifyPlugins(locale);
|
|
31
|
+
notifyShell();
|
|
32
|
+
if (typeof document !== "undefined") {
|
|
33
|
+
document.documentElement.lang = locale;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function registerViewLocaleSink(setLocale) {
|
|
37
|
+
if (typeof setLocale !== "function") {
|
|
38
|
+
throw new TypeError("registerViewLocaleSink requires a setLocale function");
|
|
39
|
+
}
|
|
40
|
+
pluginSinks.add(setLocale);
|
|
41
|
+
setLocale(viewLocale);
|
|
42
|
+
return () => pluginSinks.delete(setLocale);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export {
|
|
46
|
+
getViewLocale,
|
|
47
|
+
subscribeViewLocale,
|
|
48
|
+
setViewLocale,
|
|
49
|
+
registerViewLocaleSink
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=chunk-FOBRLUQV.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../packages/view-workspace-core/src/locale-bridge.mjs"],
|
|
4
|
+
"sourcesContent": ["/** @typedef {'en' | 'zh'} ViewLocale */\n\nconst pluginSinks = new Set();\nconst shellListeners = new Set();\n\n/** @type {ViewLocale} */\nlet viewLocale = 'zh';\n\nfunction notifyPlugins(locale) {\n for (const sink of pluginSinks) {\n try {\n sink(locale);\n } catch {\n /* isolated plugin failure */\n }\n }\n}\n\nfunction notifyShell() {\n for (const listener of shellListeners) listener();\n}\n\n/**\n * Active UI locale for the entire View shell (single source of truth).\n */\nexport function getViewLocale() {\n return viewLocale;\n}\n\nexport function subscribeViewLocale(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('subscribeViewLocale requires a listener function');\n }\n shellListeners.add(listener);\n return () => shellListeners.delete(listener);\n}\n\n/**\n * Change locale for shell React trees and every registered product-plugin i18n sink.\n */\nexport function setViewLocale(locale) {\n if (locale !== 'en' && locale !== 'zh') return;\n if (viewLocale === locale) return;\n viewLocale = locale;\n notifyPlugins(locale);\n notifyShell();\n if (typeof document !== 'undefined') {\n document.documentElement.lang = locale;\n }\n}\n\n/**\n * @param {(locale: ViewLocale) => void} setLocale\n * @returns {() => void} unregister\n */\nexport function registerViewLocaleSink(setLocale) {\n if (typeof setLocale !== 'function') {\n throw new TypeError('registerViewLocaleSink requires a setLocale function');\n }\n pluginSinks.add(setLocale);\n setLocale(viewLocale);\n return () => pluginSinks.delete(setLocale);\n}\n"],
|
|
5
|
+
"mappings": ";AAEA,IAAM,cAAc,oBAAI,IAAI;AAC5B,IAAM,iBAAiB,oBAAI,IAAI;AAG/B,IAAI,aAAa;AAEjB,SAAS,cAAc,QAAQ;AAC7B,aAAW,QAAQ,aAAa;AAC9B,QAAI;AACF,WAAK,MAAM;AAAA,IACb,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,SAAS,cAAc;AACrB,aAAW,YAAY,eAAgB,UAAS;AAClD;AAKO,SAAS,gBAAgB;AAC9B,SAAO;AACT;AAEO,SAAS,oBAAoB,UAAU;AAC5C,MAAI,OAAO,aAAa,YAAY;AAClC,UAAM,IAAI,UAAU,kDAAkD;AAAA,EACxE;AACA,iBAAe,IAAI,QAAQ;AAC3B,SAAO,MAAM,eAAe,OAAO,QAAQ;AAC7C;AAKO,SAAS,cAAc,QAAQ;AACpC,MAAI,WAAW,QAAQ,WAAW,KAAM;AACxC,MAAI,eAAe,OAAQ;AAC3B,eAAa;AACb,gBAAc,MAAM;AACpB,cAAY;AACZ,MAAI,OAAO,aAAa,aAAa;AACnC,aAAS,gBAAgB,OAAO;AAAA,EAClC;AACF;AAMO,SAAS,uBAAuB,WAAW;AAChD,MAAI,OAAO,cAAc,YAAY;AACnC,UAAM,IAAI,UAAU,sDAAsD;AAAA,EAC5E;AACA,cAAY,IAAI,SAAS;AACzB,YAAU,UAAU;AACpB,SAAO,MAAM,YAAY,OAAO,SAAS;AAC3C;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createWorkspaceStateReader
|
|
3
|
+
} from "./chunk-FJM6WWIY.mjs";
|
|
4
|
+
|
|
5
|
+
// packages/view-workspace-core/src/page-title.mjs
|
|
6
|
+
function editorPageTitleFromWorkspace(state) {
|
|
7
|
+
const asset = state && typeof state === "object" ? state.preview?.asset : void 0;
|
|
8
|
+
if (!asset || typeof asset !== "object") return void 0;
|
|
9
|
+
for (const candidate of [asset.name, asset.label]) {
|
|
10
|
+
if (typeof candidate === "string" && candidate.trim() !== "") return candidate.trim();
|
|
11
|
+
}
|
|
12
|
+
return void 0;
|
|
13
|
+
}
|
|
14
|
+
function createEditorPageTitleController(client) {
|
|
15
|
+
const reader = createWorkspaceStateReader(client);
|
|
16
|
+
return Object.freeze({
|
|
17
|
+
getTitle() {
|
|
18
|
+
return editorPageTitleFromWorkspace(reader.getSnapshot());
|
|
19
|
+
},
|
|
20
|
+
subscribeTitle(listener) {
|
|
21
|
+
return reader.subscribe(listener);
|
|
22
|
+
},
|
|
23
|
+
dispose() {
|
|
24
|
+
reader.dispose();
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export {
|
|
30
|
+
editorPageTitleFromWorkspace,
|
|
31
|
+
createEditorPageTitleController
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=chunk-FV3DSKZB.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../packages/view-workspace-core/src/page-title.mjs"],
|
|
4
|
+
"sourcesContent": ["import { createWorkspaceStateReader } from './workspace-state.mjs';\n\n/**\n * Live title for the editor page. The Host workspace snapshot is the SSOT:\n * when a preview/scene is bound, the tab shows that asset's name. The page\n * type's titleKey remains the idle fallback \u2014 this helper never invents a\n * static label, so the shell stays decoupled from scene vocabulary.\n *\n * @param {unknown} state\n * @returns {string | undefined}\n */\nexport function editorPageTitleFromWorkspace(state) {\n const asset = state && typeof state === 'object' ? state.preview?.asset : undefined;\n if (!asset || typeof asset !== 'object') return undefined;\n for (const candidate of [asset.name, asset.label]) {\n if (typeof candidate === 'string' && candidate.trim() !== '') return candidate.trim();\n }\n return undefined;\n}\n\n/**\n * Page controller matching forgeax-interface: `getTitle()` reads now,\n * `subscribeTitle()` fires when the workspace snapshot changes. No polling,\n * and ViewerShell does not read preview.asset itself.\n *\n * @param {unknown} client\n */\nexport function createEditorPageTitleController(client) {\n const reader = createWorkspaceStateReader(client);\n return Object.freeze({\n getTitle() {\n return editorPageTitleFromWorkspace(reader.getSnapshot());\n },\n subscribeTitle(listener) {\n return reader.subscribe(listener);\n },\n dispose() {\n reader.dispose();\n },\n });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;AAWO,SAAS,6BAA6B,OAAO;AAClD,QAAM,QAAQ,SAAS,OAAO,UAAU,WAAW,MAAM,SAAS,QAAQ;AAC1E,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,aAAW,aAAa,CAAC,MAAM,MAAM,MAAM,KAAK,GAAG;AACjD,QAAI,OAAO,cAAc,YAAY,UAAU,KAAK,MAAM,GAAI,QAAO,UAAU,KAAK;AAAA,EACtF;AACA,SAAO;AACT;AASO,SAAS,gCAAgC,QAAQ;AACtD,QAAM,SAAS,2BAA2B,MAAM;AAChD,SAAO,OAAO,OAAO;AAAA,IACnB,WAAW;AACT,aAAO,6BAA6B,OAAO,YAAY,CAAC;AAAA,IAC1D;AAAA,IACA,eAAe,UAAU;AACvB,aAAO,OAAO,UAAU,QAAQ;AAAA,IAClC;AAAA,IACA,UAAU;AACR,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|