@futdevpro/ccap 1.1.3075 → 1.1.3080
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/client-dist/{agent-instances.module-KMDHSKZ4.js → agent-instances.module-T3FIPSNM.js} +2 -2
- package/client-dist/{ca.module-UFZ673QV.js → ca.module-SERHUBQ4.js} +2 -2
- package/client-dist/{cc-usage-dashboard.component-7SVL4655.js → cc-usage-dashboard.component-JOXT7BKW.js} +2 -2
- package/client-dist/{cc.module-CELKAICY.js → cc.module-HXLPF5AR.js} +2 -2
- package/client-dist/{chunk-IBEEERME.js → chunk-3CNQKHOG.js} +2 -2
- package/client-dist/{chunk-6NP6KTMT.js → chunk-3JNMH7S2.js} +2 -2
- package/client-dist/{chunk-UUSAWRX3.js → chunk-44LSDHLE.js} +2 -2
- package/client-dist/{chunk-YWYRUHMF.js → chunk-4QJQ42Z2.js} +2 -2
- package/client-dist/{chunk-SAXWCRO6.js → chunk-6RBMBOAL.js} +2 -2
- package/client-dist/{chunk-KNOMPBSJ.js → chunk-7UVQNGAS.js} +2 -2
- package/client-dist/{chunk-WIR4YLIH.js → chunk-ADZQ7RWS.js} +2 -2
- package/client-dist/{chunk-OMFFX7YK.js → chunk-AFIOQKJM.js} +2 -2
- package/client-dist/{chunk-5AJSTSPQ.js → chunk-AYMTESIQ.js} +2 -2
- package/client-dist/{chunk-4Z5O6VPA.js → chunk-BKZUZRTC.js} +2 -2
- package/client-dist/{chunk-JG5Q3JVT.js → chunk-D47FE53T.js} +2 -2
- package/client-dist/{chunk-X3GGEQX4.js → chunk-EGDK3H4V.js} +2 -2
- package/client-dist/{chunk-V5LVMGFH.js → chunk-EQP2GOHM.js} +2 -2
- package/client-dist/{chunk-DMKI2NI4.js → chunk-FWJC7PZ5.js} +2 -2
- package/client-dist/{chunk-Y3IYFOUV.js → chunk-GCPHDFMB.js} +2 -2
- package/client-dist/{chunk-RNW2MHYJ.js → chunk-GEMMP35S.js} +2 -2
- package/client-dist/{chunk-VD4UTTK4.js → chunk-H6AWRT5Q.js} +2 -2
- package/client-dist/{chunk-6IVXAZ5Q.js → chunk-HIZPGG42.js} +2 -2
- package/client-dist/{chunk-CVPHGREM.js → chunk-HKFQB2DP.js} +2 -2
- package/client-dist/{chunk-CVPHGREM.js.map → chunk-HKFQB2DP.js.map} +1 -1
- package/client-dist/{chunk-MDQPTKAF.js → chunk-ICSRQYOG.js} +2 -2
- package/client-dist/{chunk-PEFIP4XV.js → chunk-IHXS3RZI.js} +2 -2
- package/client-dist/{chunk-HT42SMVF.js → chunk-IM4THCNH.js} +2 -2
- package/client-dist/{chunk-Z7BXVJFI.js → chunk-J5FHTYJI.js} +2 -2
- package/client-dist/{chunk-GOJ2BKBK.js → chunk-JAAFDVEO.js} +2 -2
- package/client-dist/{chunk-SNOC26VO.js → chunk-KIXP6BPF.js} +2 -2
- package/client-dist/{chunk-Y3NX2CVH.js → chunk-LE6MT4FU.js} +2 -2
- package/client-dist/{chunk-JBIIJKI7.js → chunk-LI5BFFUF.js} +2 -2
- package/client-dist/{chunk-P225OQT6.js → chunk-LSG4FC4S.js} +2 -2
- package/client-dist/{chunk-4RYENVYD.js → chunk-N3U7GSXB.js} +2 -2
- package/client-dist/{chunk-PFMXIL6Q.js → chunk-NYTGXX6H.js} +2 -2
- package/client-dist/{chunk-C25SJ3GD.js → chunk-OGLCZ5PF.js} +2 -2
- package/client-dist/{chunk-ZMDZSATC.js → chunk-OQDWKISV.js} +2 -2
- package/client-dist/{chunk-IHD3A3VJ.js → chunk-P25XSELJ.js} +2 -2
- package/client-dist/{chunk-66GVMP4E.js → chunk-P4ZNYMDK.js} +2 -2
- package/client-dist/{chunk-7XLTR6EG.js → chunk-PJUFFAQO.js} +2 -2
- package/client-dist/{chunk-XTO3TUDD.js → chunk-Q5M3WLDQ.js} +2 -2
- package/client-dist/{chunk-T65APERX.js → chunk-QDWAQWHI.js} +2 -2
- package/client-dist/{chunk-SQTDTLN5.js → chunk-RFR32U64.js} +2 -2
- package/client-dist/{chunk-UZ5HALNF.js → chunk-RMWBPGDF.js} +2 -2
- package/client-dist/{chunk-PX6NHARQ.js → chunk-RTI3MIMV.js} +2 -2
- package/client-dist/{chunk-BPNTOY5H.js → chunk-SARFTVZD.js} +2 -2
- package/client-dist/{chunk-GUFSULIV.js → chunk-SOM7BFLB.js} +2 -2
- package/client-dist/{chunk-QBMUNTPI.js → chunk-TAEPIX4H.js} +2 -2
- package/client-dist/{chunk-5U4X34IL.js → chunk-TDNLCOTM.js} +2 -2
- package/client-dist/{chunk-UHUWUC7M.js → chunk-TJZTR4ZA.js} +2 -2
- package/client-dist/{chunk-C4FR6MGD.js → chunk-TQRFQTYL.js} +2 -2
- package/client-dist/{chunk-3QWIS6II.js → chunk-U6FT5DX6.js} +2 -2
- package/client-dist/{chunk-XM5EFWIR.js → chunk-UEJF4FN2.js} +2 -2
- package/client-dist/{chunk-3DHOZ33I.js → chunk-VS7XCNU4.js} +2 -2
- package/client-dist/{chunk-JDD5JCDL.js → chunk-VZZRCCYJ.js} +2 -2
- package/client-dist/{chunk-LOW2T5EN.js → chunk-WBSH4VM3.js} +2 -2
- package/client-dist/{chunk-HP3EPFWM.js → chunk-WH4AQVRT.js} +2 -2
- package/client-dist/{chunk-GH5VWU3U.js → chunk-X3UVLBOY.js} +2 -2
- package/client-dist/{chunk-PA6AYAQG.js → chunk-ZEACNG3V.js} +2 -2
- package/client-dist/{chunk-QCZNNHFJ.js → chunk-ZPYMYX4G.js} +2 -2
- package/client-dist/{chunk-MSFBFUNE.js → chunk-ZUABLPQU.js} +2 -2
- package/client-dist/{consultant.module-RZRUBXLH.js → consultant.module-TMQIDQRI.js} +2 -2
- package/client-dist/{crd.module-ES3LI5YW.js → crd.module-4WLV2OFB.js} +2 -2
- package/client-dist/{dashboard.module-6QJCQJLT.js → dashboard.module-IKIYOYBX.js} +2 -2
- package/client-dist/{do.module-KORWDOOP.js → do.module-HCL5N6UW.js} +3 -3
- package/client-dist/do.module-HCL5N6UW.js.map +7 -0
- package/client-dist/{document-library.module-XMYMNK7O.js → document-library.module-AL7ZLZAD.js} +2 -2
- package/client-dist/{embedding-eval.module-Q5KGUAPB.js → embedding-eval.module-QDFOESPD.js} +2 -2
- package/client-dist/{embedding-registry.module-OFOLSIDZ.js → embedding-registry.module-XUGDYKZR.js} +2 -2
- package/client-dist/{err.module-ZNRHAUD6.js → err.module-DVGALBD3.js} +2 -2
- package/client-dist/{feedback.module-232OL5FG.js → feedback.module-LFR2FOID.js} +2 -2
- package/client-dist/{host-runtime-mcp.module-DQN6JD64.js → host-runtime-mcp.module-LCBJZ6RC.js} +2 -2
- package/client-dist/index.html +1 -1
- package/client-dist/{live-dev-pipeline.module-NKOD4TSO.js → live-dev-pipeline.module-4D2IPHP6.js} +2 -2
- package/client-dist/{logs.module-PTAL5EGZ.js → logs.module-MEPAEBYW.js} +2 -2
- package/client-dist/{main-ROJC4F74.js → main-PK5UCYRP.js} +3 -3
- package/client-dist/{master-control-remote-poc.module-VQFMXTV5.js → master-control-remote-poc.module-LLBVMF4X.js} +2 -2
- package/client-dist/{mobile-app.module-Z6GT7XCU.js → mobile-app.module-SDJ2NQM7.js} +2 -2
- package/client-dist/{model-registry.module-4742AOMK.js → model-registry.module-ZQCHARJO.js} +2 -2
- package/client-dist/{oc.module-2MKCG3G4.js → oc.module-5NKEVNFH.js} +2 -2
- package/client-dist/{orc.module-AF2S2JMB.js → orc.module-MK5GH4GP.js} +2 -2
- package/client-dist/{project-management.module-FQ7AJMWK.js → project-management.module-Y5CAZ5HP.js} +2 -2
- package/client-dist/project-source-routed.module-ZINEDOO3.js +2 -0
- package/client-dist/{scheduler.module-2CWJNW3K.js → scheduler.module-2O7ZHXQZ.js} +2 -2
- package/client-dist/{session.module-WIJML45U.js → session.module-SYN2WJPA.js} +8 -8
- package/client-dist/session.module-SYN2WJPA.js.map +7 -0
- package/client-dist/{set.module-3SSRNODO.js → set.module-TLGYA74I.js} +2 -2
- package/client-dist/{setup.module-B6O6TCZ5.js → setup.module-T6K3OZUU.js} +2 -2
- package/client-dist/{terminals.module-67UPORK2.js → terminals.module-ARGBB72C.js} +2 -2
- package/client-dist/{voice-notes-poc.module-VLZCIKQ3.js → voice-notes-poc.module-GTOSJJ7N.js} +2 -2
- package/client-dist/{wfs.module-MPF7SS3P.js → wfs.module-OUVID73U.js} +2 -2
- package/package.json +1 -1
- package/client-dist/do.module-KORWDOOP.js.map +0 -7
- package/client-dist/project-source-routed.module-DSLYQI6U.js +0 -2
- package/client-dist/session.module-WIJML45U.js.map +0 -7
- /package/client-dist/{agent-instances.module-KMDHSKZ4.js.map → agent-instances.module-T3FIPSNM.js.map} +0 -0
- /package/client-dist/{ca.module-UFZ673QV.js.map → ca.module-SERHUBQ4.js.map} +0 -0
- /package/client-dist/{cc-usage-dashboard.component-7SVL4655.js.map → cc-usage-dashboard.component-JOXT7BKW.js.map} +0 -0
- /package/client-dist/{cc.module-CELKAICY.js.map → cc.module-HXLPF5AR.js.map} +0 -0
- /package/client-dist/{chunk-IBEEERME.js.map → chunk-3CNQKHOG.js.map} +0 -0
- /package/client-dist/{chunk-6NP6KTMT.js.map → chunk-3JNMH7S2.js.map} +0 -0
- /package/client-dist/{chunk-UUSAWRX3.js.map → chunk-44LSDHLE.js.map} +0 -0
- /package/client-dist/{chunk-YWYRUHMF.js.map → chunk-4QJQ42Z2.js.map} +0 -0
- /package/client-dist/{chunk-SAXWCRO6.js.map → chunk-6RBMBOAL.js.map} +0 -0
- /package/client-dist/{chunk-KNOMPBSJ.js.map → chunk-7UVQNGAS.js.map} +0 -0
- /package/client-dist/{chunk-WIR4YLIH.js.map → chunk-ADZQ7RWS.js.map} +0 -0
- /package/client-dist/{chunk-OMFFX7YK.js.map → chunk-AFIOQKJM.js.map} +0 -0
- /package/client-dist/{chunk-5AJSTSPQ.js.map → chunk-AYMTESIQ.js.map} +0 -0
- /package/client-dist/{chunk-4Z5O6VPA.js.map → chunk-BKZUZRTC.js.map} +0 -0
- /package/client-dist/{chunk-JG5Q3JVT.js.map → chunk-D47FE53T.js.map} +0 -0
- /package/client-dist/{chunk-X3GGEQX4.js.map → chunk-EGDK3H4V.js.map} +0 -0
- /package/client-dist/{chunk-V5LVMGFH.js.map → chunk-EQP2GOHM.js.map} +0 -0
- /package/client-dist/{chunk-DMKI2NI4.js.map → chunk-FWJC7PZ5.js.map} +0 -0
- /package/client-dist/{chunk-Y3IYFOUV.js.map → chunk-GCPHDFMB.js.map} +0 -0
- /package/client-dist/{chunk-RNW2MHYJ.js.map → chunk-GEMMP35S.js.map} +0 -0
- /package/client-dist/{chunk-VD4UTTK4.js.map → chunk-H6AWRT5Q.js.map} +0 -0
- /package/client-dist/{chunk-6IVXAZ5Q.js.map → chunk-HIZPGG42.js.map} +0 -0
- /package/client-dist/{chunk-MDQPTKAF.js.map → chunk-ICSRQYOG.js.map} +0 -0
- /package/client-dist/{chunk-PEFIP4XV.js.map → chunk-IHXS3RZI.js.map} +0 -0
- /package/client-dist/{chunk-HT42SMVF.js.map → chunk-IM4THCNH.js.map} +0 -0
- /package/client-dist/{chunk-Z7BXVJFI.js.map → chunk-J5FHTYJI.js.map} +0 -0
- /package/client-dist/{chunk-GOJ2BKBK.js.map → chunk-JAAFDVEO.js.map} +0 -0
- /package/client-dist/{chunk-SNOC26VO.js.map → chunk-KIXP6BPF.js.map} +0 -0
- /package/client-dist/{chunk-Y3NX2CVH.js.map → chunk-LE6MT4FU.js.map} +0 -0
- /package/client-dist/{chunk-JBIIJKI7.js.map → chunk-LI5BFFUF.js.map} +0 -0
- /package/client-dist/{chunk-P225OQT6.js.map → chunk-LSG4FC4S.js.map} +0 -0
- /package/client-dist/{chunk-4RYENVYD.js.map → chunk-N3U7GSXB.js.map} +0 -0
- /package/client-dist/{chunk-PFMXIL6Q.js.map → chunk-NYTGXX6H.js.map} +0 -0
- /package/client-dist/{chunk-C25SJ3GD.js.map → chunk-OGLCZ5PF.js.map} +0 -0
- /package/client-dist/{chunk-ZMDZSATC.js.map → chunk-OQDWKISV.js.map} +0 -0
- /package/client-dist/{chunk-IHD3A3VJ.js.map → chunk-P25XSELJ.js.map} +0 -0
- /package/client-dist/{chunk-66GVMP4E.js.map → chunk-P4ZNYMDK.js.map} +0 -0
- /package/client-dist/{chunk-7XLTR6EG.js.map → chunk-PJUFFAQO.js.map} +0 -0
- /package/client-dist/{chunk-XTO3TUDD.js.map → chunk-Q5M3WLDQ.js.map} +0 -0
- /package/client-dist/{chunk-T65APERX.js.map → chunk-QDWAQWHI.js.map} +0 -0
- /package/client-dist/{chunk-SQTDTLN5.js.map → chunk-RFR32U64.js.map} +0 -0
- /package/client-dist/{chunk-UZ5HALNF.js.map → chunk-RMWBPGDF.js.map} +0 -0
- /package/client-dist/{chunk-PX6NHARQ.js.map → chunk-RTI3MIMV.js.map} +0 -0
- /package/client-dist/{chunk-BPNTOY5H.js.map → chunk-SARFTVZD.js.map} +0 -0
- /package/client-dist/{chunk-GUFSULIV.js.map → chunk-SOM7BFLB.js.map} +0 -0
- /package/client-dist/{chunk-QBMUNTPI.js.map → chunk-TAEPIX4H.js.map} +0 -0
- /package/client-dist/{chunk-5U4X34IL.js.map → chunk-TDNLCOTM.js.map} +0 -0
- /package/client-dist/{chunk-UHUWUC7M.js.map → chunk-TJZTR4ZA.js.map} +0 -0
- /package/client-dist/{chunk-C4FR6MGD.js.map → chunk-TQRFQTYL.js.map} +0 -0
- /package/client-dist/{chunk-3QWIS6II.js.map → chunk-U6FT5DX6.js.map} +0 -0
- /package/client-dist/{chunk-XM5EFWIR.js.map → chunk-UEJF4FN2.js.map} +0 -0
- /package/client-dist/{chunk-3DHOZ33I.js.map → chunk-VS7XCNU4.js.map} +0 -0
- /package/client-dist/{chunk-JDD5JCDL.js.map → chunk-VZZRCCYJ.js.map} +0 -0
- /package/client-dist/{chunk-LOW2T5EN.js.map → chunk-WBSH4VM3.js.map} +0 -0
- /package/client-dist/{chunk-HP3EPFWM.js.map → chunk-WH4AQVRT.js.map} +0 -0
- /package/client-dist/{chunk-GH5VWU3U.js.map → chunk-X3UVLBOY.js.map} +0 -0
- /package/client-dist/{chunk-PA6AYAQG.js.map → chunk-ZEACNG3V.js.map} +0 -0
- /package/client-dist/{chunk-QCZNNHFJ.js.map → chunk-ZPYMYX4G.js.map} +0 -0
- /package/client-dist/{chunk-MSFBFUNE.js.map → chunk-ZUABLPQU.js.map} +0 -0
- /package/client-dist/{consultant.module-RZRUBXLH.js.map → consultant.module-TMQIDQRI.js.map} +0 -0
- /package/client-dist/{crd.module-ES3LI5YW.js.map → crd.module-4WLV2OFB.js.map} +0 -0
- /package/client-dist/{dashboard.module-6QJCQJLT.js.map → dashboard.module-IKIYOYBX.js.map} +0 -0
- /package/client-dist/{document-library.module-XMYMNK7O.js.map → document-library.module-AL7ZLZAD.js.map} +0 -0
- /package/client-dist/{embedding-eval.module-Q5KGUAPB.js.map → embedding-eval.module-QDFOESPD.js.map} +0 -0
- /package/client-dist/{embedding-registry.module-OFOLSIDZ.js.map → embedding-registry.module-XUGDYKZR.js.map} +0 -0
- /package/client-dist/{err.module-ZNRHAUD6.js.map → err.module-DVGALBD3.js.map} +0 -0
- /package/client-dist/{feedback.module-232OL5FG.js.map → feedback.module-LFR2FOID.js.map} +0 -0
- /package/client-dist/{host-runtime-mcp.module-DQN6JD64.js.map → host-runtime-mcp.module-LCBJZ6RC.js.map} +0 -0
- /package/client-dist/{live-dev-pipeline.module-NKOD4TSO.js.map → live-dev-pipeline.module-4D2IPHP6.js.map} +0 -0
- /package/client-dist/{logs.module-PTAL5EGZ.js.map → logs.module-MEPAEBYW.js.map} +0 -0
- /package/client-dist/{main-ROJC4F74.js.map → main-PK5UCYRP.js.map} +0 -0
- /package/client-dist/{master-control-remote-poc.module-VQFMXTV5.js.map → master-control-remote-poc.module-LLBVMF4X.js.map} +0 -0
- /package/client-dist/{mobile-app.module-Z6GT7XCU.js.map → mobile-app.module-SDJ2NQM7.js.map} +0 -0
- /package/client-dist/{model-registry.module-4742AOMK.js.map → model-registry.module-ZQCHARJO.js.map} +0 -0
- /package/client-dist/{oc.module-2MKCG3G4.js.map → oc.module-5NKEVNFH.js.map} +0 -0
- /package/client-dist/{orc.module-AF2S2JMB.js.map → orc.module-MK5GH4GP.js.map} +0 -0
- /package/client-dist/{project-management.module-FQ7AJMWK.js.map → project-management.module-Y5CAZ5HP.js.map} +0 -0
- /package/client-dist/{project-source-routed.module-DSLYQI6U.js.map → project-source-routed.module-ZINEDOO3.js.map} +0 -0
- /package/client-dist/{scheduler.module-2CWJNW3K.js.map → scheduler.module-2O7ZHXQZ.js.map} +0 -0
- /package/client-dist/{set.module-3SSRNODO.js.map → set.module-TLGYA74I.js.map} +0 -0
- /package/client-dist/{setup.module-B6O6TCZ5.js.map → setup.module-T6K3OZUU.js.map} +0 -0
- /package/client-dist/{terminals.module-67UPORK2.js.map → terminals.module-ARGBB72C.js.map} +0 -0
- /package/client-dist/{voice-notes-poc.module-VLZCIKQ3.js.map → voice-notes-poc.module-GTOSJJ7N.js.map} +0 -0
- /package/client-dist/{wfs.module-MPF7SS3P.js.map → wfs.module-OUVID73U.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["src/app/_modules/dark-office/_components/ccap-dark-office/dark-office.component.ts", "src/app/_modules/dark-office/_components/ccap-dark-office/do.component.html", "src/app/_modules/dark-office/_collections/utils/do-diagnostics.util.ts", "src/app/_modules/dark-office/_collections/consts/do-tile-system.const.ts", "src/app/_modules/dark-office/_collections/utils/do-scene-character-panel-instance-id.util.ts", "src/app/_modules/dark-office/_components/do-char-parts/do-char-lower-body/do-char-lower-body.component.ts", "src/app/_modules/dark-office/_components/do-char-parts/do-char-lower-body/do-char-lower-body.component.html", "src/app/_modules/dark-office/_collections/consts/do-openclaw-claw-svg.const.ts", "src/app/_modules/dark-office/_components/do-char-parts/do-char-arms/do-char-arms.component.ts", "src/app/_modules/dark-office/_components/do-char-parts/do-char-arms/do-char-arms.component.html", "src/app/_modules/dark-office/_components/do-char-parts/do-char-torso/do-char-torso.component.ts", "src/app/_modules/dark-office/_components/do-char-parts/do-char-torso/do-char-torso.component.html", "src/app/_modules/dark-office/_components/do-char-parts/do-char-neck-head/do-char-neck-head.component.ts", "src/app/_modules/dark-office/_components/do-char-parts/do-char-neck-head/do-char-neck-head.component.html", "src/app/_modules/dark-office/_components/do-char-parts/do-char-face/do-char-face.component.ts", "src/app/_modules/dark-office/_components/do-char-parts/do-char-face/do-char-face.component.html", "src/app/_modules/dark-office/_components/do-char-parts/do-char-hair/do-char-hair.component.ts", "src/app/_modules/dark-office/_components/do-char-parts/do-char-hair/do-char-hair.component.html", "src/app/_modules/dark-office/_components/do-char-body/do-char-body.component.ts", "src/app/_modules/dark-office/_components/do-char-body/do-char-body.component.html", "src/app/_modules/dark-office/_components/do-character-preview/do-character-preview.component.ts", "src/app/_modules/dark-office/_components/do-character-preview/do-character-preview.component.html", "src/app/_modules/dark-office/_components/do-visual-editor/do-visual-editor.component.ts", "src/app/_modules/dark-office/_components/do-visual-editor/do-visual-editor.component.html", "src/app/_modules/dark-office/_components/do-chat-popup/do-chat-popup.component.ts", "src/app/_modules/dark-office/_components/do-chat-popup/do-chat-popup.component.html", "src/app/_modules/dark-office/_components/do-instance-panel/do-instance-panel.component.ts", "src/app/_modules/dark-office/_components/do-instance-panel/do-instance-panel.component.html", "src/app/_modules/dark-office/_collections/instance-status/do-instance-status-detail-display.util.ts", "src/app/_modules/dark-office/_components/do-instance-status-detail/do-instance-status-detail.component.ts", "src/app/_modules/dark-office/_components/do-instance-status-detail/do-instance-status-detail.component.html", "src/app/_modules/dark-office/_collections/scene/do-bubble-content.util.ts", "src/app/_enums/dark-office/do-bubble-event-type.enum.ts", "src/app/_modules/dark-office/_collections/scene/do-bubble-event-type.util.ts", "src/app/_modules/dark-office/_components/do-svg-char/do-svg-char.component.ts", "src/app/_modules/dark-office/_components/do-svg-char/do-svg-char.component.html", "src/app/_modules/dark-office/_components/do-office-scene/do-scene.component.ts", "src/app/_modules/dark-office/_components/do-office-scene/do-office-scene.component.html", "src/app/_modules/dark-office/do.module.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, inject, OnDestroy, OnInit } from '@angular/core';\n\nimport { second } from '@futdevpro/fsm-dynamo';\n\nimport { environment } from '../../../../../environments/environment';\nimport { CCAP_GlobalError_ControlService } from '../../../../_services/control-services/ccap-global-error.control-service';\nimport { DarkOffice_DataService } from '../../_services/dark-office.data-service';\nimport { DO_Diagnostics_Util } from '../../_collections/utils/do-diagnostics.util';\n\n/**\n * Dark Office fő nézet.\n * Shell komponens: fallback polling-ot indítja (instance data), do-office-scene-t rendereli.\n *\n * ## Adatforrás\n * **Elsődleges:** socket push (`instance-data:session-status-updated` event) → azonnali UI frissítés.\n * **Fallback:** polling (30s intervallum) → `GET /instance-data/list` endpoint, safety net ha socket-ről\n * kimaradna valami (pl. reconnect, új instance).\n */\n@Component({\n selector: 'app-ccap-dark-office',\n templateUrl: './do.component.html',\n host: { class: 'block h-full overflow-hidden' },\n})\n/** DarkOffice_Component class. */\nexport class DarkOffice_Component implements OnInit, OnDestroy { // ccap-review-disable-line module-prefix\n\n /** Fallback polling intervallum (safety net – a real-time frissítés socket push-on keresztül jön). */\n private static readonly refreshIntervalMs: number = 30 * second;\n\n readonly darkOffice_DS: DarkOffice_DataService = inject(DarkOffice_DataService);\n\n private readonly globalError_CS: CCAP_GlobalError_ControlService = inject(CCAP_GlobalError_ControlService);\n\n private refreshTimerId: ReturnType<typeof setInterval> | undefined;\n\n ngOnInit(): void {\n void this.darkOffice_DS.loadInstanceData();\n this.refreshTimerId = setInterval((): void => {\n void this.darkOffice_DS.loadInstanceData();\n }, DarkOffice_Component.refreshIntervalMs);\n }\n\n ngOnDestroy(): void {\n if (this.refreshTimerId !== undefined) {\n clearInterval(this.refreshTimerId);\n }\n }\n\n /**\n * Kézi frissítés gomb.\n */\n refreshNow(): void {\n void this.darkOffice_DS.loadInstanceData();\n }\n\n /**\n * Diagnostics JSON snapshot másolása a vágólapra (ugyanaz a scene szabály, mint a `characters_$`).\n * Sikertelen másolásnál globális error UI — nem dobunk a kliens error path-on.\n */\n async copyDiagnosticsToClipboard(): Promise<void> {\n const snapshot = DO_Diagnostics_Util.buildSnapshot({\n instances: this.darkOffice_DS.instances_$(),\n characters: this.darkOffice_DS.characters_$(),\n nowMs: Date.now(),\n clientVersion: environment.version,\n });\n const text: string = JSON.stringify(snapshot, null, 2);\n const result = await this.globalError_CS.copyToClipboard(text);\n if (!result.ok) {\n this.globalError_CS.showError(result.error, 'dark-office-diagnostics-copy');\n }\n }\n}\n", "<div class=\"h-full bg-ccapBackground relative overflow-hidden\">\n <!-- Játék iroda jelenet – teljes területet kitölti -->\n <app-do-office-scene></app-do-office-scene>\n\n <!-- Felső info overlay -->\n <div class=\"absolute top-2 left-2 z-10 flex items-center gap-2 pointer-events-none\">\n <span class=\"text-[11px] text-neutral-500 font-mono bg-ccapBackground/80 backdrop-blur-sm\n px-2 py-0.5 rounded border border-neutral-700/50 pointer-events-auto\">\n {{ darkOffice_DS.instances_$().length }} instance\n </span>\n <button type=\"button\"\n (click)=\"refreshNow()\"\n [disabled]=\"darkOffice_DS.loading_$()\"\n class=\"px-2 py-0.5 border border-neonCyan/30 rounded text-neutral-400 text-[11px]\n hover:bg-neutral-800 hover:border-neonCyan/60 disabled:opacity-40\n transition-colors bg-ccapBackground/80 backdrop-blur-sm pointer-events-auto\">\n {{ darkOffice_DS.loading_$() ? '...' : 'Refresh' }}\n </button>\n <button type=\"button\"\n (click)=\"copyDiagnosticsToClipboard()\"\n title=\"Dark Office állapot és scene rationale másolása JSON-ban (diagnostics export)\"\n class=\"p-1 border border-neutral-600/50 rounded text-neutral-400 hover:bg-neutral-800\n hover:border-neonCyan/50 transition-colors bg-ccapBackground/80 backdrop-blur-sm\n pointer-events-auto inline-flex items-center justify-center\"\n aria-label=\"Copy diagnostics JSON\">\n <svg class=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"/>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/>\n </svg>\n </button>\n </div>\n\n <!-- Jelmagyarázat overlay -->\n <div class=\"absolute bottom-2 left-2 z-10 flex items-center gap-3 text-[11px] text-neutral-600\n bg-ccapBackground/70 backdrop-blur-sm px-2 py-1 rounded border border-neutral-700/30\n pointer-events-none\">\n <span class=\"flex items-center gap-1\">\n <span class=\"w-1.5 h-1.5 rounded-full bg-emerald-400/70 inline-block\"></span>\n Dolgozik\n </span>\n <span class=\"flex items-center gap-1\">\n <span class=\"w-1.5 h-1.5 rounded-full bg-amber-400/70 inline-block\"></span>\n Idle\n </span>\n <span class=\"flex items-center gap-1\">\n <span class=\"w-1.5 h-1.5 rounded-full bg-neutral-600 inline-block\"></span>\n Offline\n </span>\n </div>\n</div>\n", "import { DO_Presence_Type } from '../../../../_enums/dark-office/ccap-dark-office-presence.enum';\nimport {\n DO_DiagnosticsCharacterSlice_Interface,\n DO_DiagnosticsInstanceSlice_Interface,\n DO_DiagnosticsPanelRowSlice_Interface,\n DO_DiagnosticsSnapshot_Interface,\n} from '../../../../_models/interfaces/dark-office/do-dark-office-diagnostics-snapshot.interface';\nimport { DO_OfficeInstanceState_Interface } from '../../../../_models/interfaces/dark-office/do-office-instance-state.interface';\nimport { CA_IInstanceData_SessionStatus_Interface } from '../../../external-sessions/_modules/cursor-acp/_models/interfaces/ca-cai-instance-data-status.interface';\nimport { CC_CciInstanceData_SessionStatus_Interface } from '../../../external-sessions/_modules/claude-code/_models/interfaces/cc-cci-instance-data-status.interface';\nimport { ExS_InstanceData_SessionStatus_Interface } from '../../../external-sessions/_models/interfaces/exs-instance-data-status.interface';\nimport { Oc_IInstanceData_SessionStatus_Interface } from '../../../external-sessions/_modules/openclaw/_models/interfaces/oc-oci-instance-data.interface';\nimport { DO_SceneSessionEligibility_Util } from '../scene/do-scene-session-eligibility.util';\n\n/**\n * Dark Office diagnostics JSON snapshot építés — ugyanaz a scene expand szabály, mint a `characters_$`\n * (`DO_SceneSessionEligibility_Util` + working / fallback logika).\n */\nexport class DO_Diagnostics_Util {\n\n /**\n * Strukturált snapshot másoláshoz / debug export-hoz.\n */\n static buildSnapshot(params: {\n instances: DO_OfficeInstanceState_Interface[];\n characters: DO_OfficeInstanceState_Interface[];\n nowMs: number;\n clientVersion?: string;\n }): DO_DiagnosticsSnapshot_Interface {\n const rationale: {\n perCharacter: string[];\n skippedOffline: string[];\n } = DO_Diagnostics_Util.buildSceneExpandRationale({\n instances: params.instances,\n nowMs: params.nowMs,\n });\n return {\n exportedAt: new Date(params.nowMs).toISOString(),\n clientVersion: params.clientVersion,\n instances: params.instances.map(\n (inst: DO_OfficeInstanceState_Interface): DO_DiagnosticsInstanceSlice_Interface =>\n DO_Diagnostics_Util.mapInstanceSlice(inst),\n ),\n characters: params.characters.map(\n (ch: DO_OfficeInstanceState_Interface): DO_DiagnosticsCharacterSlice_Interface =>\n DO_Diagnostics_Util.mapCharacterSlice(ch),\n ),\n characterRationale: rationale.perCharacter,\n skippedInstancesRationale: rationale.skippedOffline,\n };\n }\n\n /**\n * `expandInstancesToCharacters` rationale — offline skip + karakter soronkénti angol magyarázat.\n */\n private static buildSceneExpandRationale(params: {\n instances: DO_OfficeInstanceState_Interface[];\n nowMs: number;\n }): { perCharacter: string[]; skippedOffline: string[] } {\n const perCharacter: string[] = [];\n const skippedOffline: string[] = [];\n const windowMs: number = DO_SceneSessionEligibility_Util.sceneRecentActivityWindowMs;\n for (const inst of params.instances) {\n if (inst.presence === DO_Presence_Type.offline) {\n skippedOffline.push(`offline_skipped:instanceId=${inst.instanceId}`);\n continue;\n }\n const sessions: (\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface\n )[] = inst.rawSessionStatuses ?? [];\n if (sessions.length <= 1) {\n perCharacter.push(`single_row_instance:instanceId=${inst.instanceId}`);\n continue;\n }\n const workingRecentSessions: (\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface\n )[] = sessions.filter(\n (\n session:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface,\n ): boolean =>\n DO_SceneSessionEligibility_Util.isWorkingSessionRecentAndOnline({\n row: session,\n nowMs: params.nowMs,\n windowMs: windowMs,\n }),\n );\n if (workingRecentSessions.length === 0) {\n const picked:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface\n | null = DO_SceneSessionEligibility_Util.pickNewestSessionByLastActivity({\n sessions: sessions,\n });\n const primaryId: string = picked?.sessionId ?? 'none';\n perCharacter.push(\n `fallback_all_sessions_idle:instanceId=${inst.instanceId}:primarySessionId=${primaryId}`,\n );\n continue;\n }\n for (const session of workingRecentSessions) {\n perCharacter.push(\n `composite_working_session:instanceId=${inst.instanceId}:sessionId=${session.sessionId}`,\n );\n }\n }\n return { perCharacter: perCharacter, skippedOffline: skippedOffline };\n }\n\n /**\n * Instance állapot → diagnostics szelet.\n */\n private static mapInstanceSlice(\n inst: DO_OfficeInstanceState_Interface,\n ): DO_DiagnosticsInstanceSlice_Interface {\n const rows: DO_DiagnosticsPanelRowSlice_Interface[] = inst.panelActiveSessionRows.map(\n (row): DO_DiagnosticsPanelRowSlice_Interface => ({\n sessionId: row.sessionId,\n presence: row.presence,\n displayLabel: row.displayLabel,\n }),\n );\n const raw: (\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface\n )[] = inst.rawSessionStatuses ?? [];\n return {\n instanceId: inst.instanceId,\n characterType: inst.characterType,\n presence: inst.presence,\n activitySummary: inst.activitySummary,\n latestSessionId: inst.latestSessionId,\n connectionStatus: inst.connectionStatus,\n rawSessionStatuses: raw,\n assignedSlotIndex: inst.assignedSlotIndex,\n panelActiveSessionRows: rows,\n visualsDisplayName: inst.visuals.displayName,\n };\n }\n\n /**\n * Scene karakter → diagnostics szelet.\n */\n private static mapCharacterSlice(\n ch: DO_OfficeInstanceState_Interface,\n ): DO_DiagnosticsCharacterSlice_Interface {\n return {\n instanceId: ch.instanceId,\n sessionId: ch.sessionId,\n presence: ch.presence,\n scenePlacement: ch.scenePlacement,\n activitySummary: ch.activitySummary,\n assignedSlotIndex: ch.assignedSlotIndex,\n latestSessionId: ch.latestSessionId,\n animState: ch.animState,\n };\n }\n}\n", "/**\n * Dark Office tile rendszer konstansok.\n * A teljes iroda jelenet egy tile-alapú SVG koordináta rendszerben él.\n * Eredeti referencia: coordinator office-view (48×27 tile @ 32px/tile).\n */\n\n/** Egy tile mérete SVG egységben. */\nexport const DO_TILE: number = 32;\n\n/** Világ szélessége tile-okban. */\nexport const DO_WORLD_TW: number = 48;\n/** Világ magassága tile-okban (Meeting Room + alsó zóna — +4 tile). */\nexport const DO_WORLD_TH: number = 31;\n\n/** Világ szélessége SVG egységben. */\nexport const DO_WORLD_W: number = DO_WORLD_TW * DO_TILE; // 1536\n/** Világ magassága SVG egységben. */\nexport const DO_WORLD_H: number = DO_WORLD_TH * DO_TILE; // 864\n\n/**\n * Dark Office tile rendszer util – statikus metódusokkal.\n */\nexport class DoTileSystem_Util {\n /**\n * Tile-számot SVG egységre konvertáló helper.\n * Például: doT(5) = 160 SVG egység.\n */\n static doT(tiles: number): number {\n return tiles * DO_TILE;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Iroda geometria (tile-snap)\n// ---------------------------------------------------------------------------\n\n/** Padló kezdő tile X. */\nexport const DO_FLOOR_TX: number = 4;\n/** Padló kezdő tile Y. */\nexport const DO_FLOOR_TY: number = 3;\n/** Padló szélesség tile-ban. */\nexport const DO_FLOOR_TW: number = 40;\n/** Padló magasság tile-ban. */\nexport const DO_FLOOR_TH: number = 18;\n\n/** Padló bal X (SVG egység). */\nexport const DO_FLOOR_X: number = DoTileSystem_Util.doT(DO_FLOOR_TX); // 128\n/** Padló felső Y (SVG egység). */\nexport const DO_FLOOR_Y: number = DoTileSystem_Util.doT(DO_FLOOR_TY); // 96\n/** Padló szélesség (SVG egység). */\nexport const DO_FLOOR_W: number = DoTileSystem_Util.doT(DO_FLOOR_TW); // 1280\n/** Padló magasság (SVG egység). */\nexport const DO_FLOOR_H: number = DoTileSystem_Util.doT(DO_FLOOR_TH); // 576\n\n/** Fal vastagság tile-ban. */\nexport const DO_WALL_T: number = 1;\n\n/** Zóna határ tile X (workspace bal | lounge jobb). */\nexport const DO_ZONE_SPLIT_TX: number = 32;\n/** Zóna határ X (SVG egység). */\nexport const DO_ZONE_SPLIT_X: number = DoTileSystem_Util.doT(DO_ZONE_SPLIT_TX); // 1024\n\n// ---------------------------------------------------------------------------\n// Zoom limitek\n// ---------------------------------------------------------------------------\n\n/** Minimum zoom (kicsinyítés). */\nexport const DO_ZOOM_MIN: number = 0.5;\n/** Maximum zoom (nagyítás). */\nexport const DO_ZOOM_MAX: number = 6;\n/** Zoom szorzó egy wheel tick-enként. */\nexport const DO_ZOOM_FACTOR: number = 1.15;\n\n// ---------------------------------------------------------------------------\n// Drag / Pan\n// ---------------------------------------------------------------------------\n\n/** Long press késleltetés (ms) bal gombos drag indításához. */\nexport const DO_DRAG_LONG_PRESS_MS: number = 200;\n/** A világ hányad része maradjon mindig látható pan közben (0–1). */\nexport const DO_PAN_VISIBLE_RATIO: number = 0.1;\n", "import { DO_OfficeInstanceState_Interface } from '../../../../_models/interfaces/dark-office/do-office-instance-state.interface';\n\n/**\n * Dark Office scene karakter → bal panel `instances_$` sor `instanceId` feloldás.\n *\n * A `buildPerSessionOfficeCharacter` composite kulcsot használ (`base::sessionId`); a státusz modal\n * és a vizuál editor lookup csak a panel-szintű azonosítót ismeri (`resolveOfficeInstanceById`).\n */\nexport class DO_SceneCharacterPanelInstanceId_Util {\n\n /**\n * Panel instance id — scene `DO_OfficeInstanceState_Interface` alapján.\n */\n static resolve(params: { character: DO_OfficeInstanceState_Interface }): string {\n const character: DO_OfficeInstanceState_Interface = params.character;\n const sessionId: string | undefined = character.sessionId;\n const instanceId: string = character.instanceId;\n if (!sessionId || sessionId.trim().length === 0) {\n return instanceId;\n }\n const suffix: string = `::${sessionId}`;\n if (instanceId.endsWith(suffix)) {\n return instanceId.slice(0, instanceId.length - suffix.length);\n }\n return instanceId;\n }\n}\n", "import { Component, input, InputSignal, ViewEncapsulation } from '@angular/core';\n\n/**\n * Dark Office karakter alsó test: cipők + lábak.\n * SVG `<g>` attribute selector — scene graph-ban és önálló `<svg>`-ben is használható.\n */\n@Component({\n selector: '[app-do-char-lower-body]',\n templateUrl: './do-char-lower-body.component.html',\n styleUrl: './do-char-lower-body.component.scss',\n encapsulation: ViewEncapsulation.None,\n})\n/** DO_CharLowerBody_Component class. */\nexport class DO_CharLowerBody_Component {\n\n /** Nadrágszín. */\n readonly pantsColor: InputSignal<string> = input.required<string>();\n\n /** Séta animáció aktív-e (lábmozgás CSS osztály). */\n readonly isWalking: InputSignal<boolean> = input<boolean>(false);\n}\n", "<!-- Cipők (orrész szélesebb, felső highlight) -->\n<svg:path d=\"M11,63 Q10,63 10,64 L9.5,67 Q9.5,68 10.5,68 L19,68 Q20,68 20,67 L20,64 Q20,63 19,63 Z\" fill=\"#1a1a2e\"/>\n<svg:path d=\"M21,63 Q20,63 20,64 L19.5,67 Q19.5,68 20.5,68 L29,68 Q30,68 30,67 L30,64 Q30,63 29,63 Z\" fill=\"#1a1a2e\"/>\n<!-- Cipő felső highlight -->\n<svg:rect x=\"11\" y=\"63\" width=\"8\" height=\"1\" rx=\"0.5\" fill=\"rgba(255,255,255,0.06)\"/>\n<svg:rect x=\"21\" y=\"63\" width=\"8\" height=\"1\" rx=\"0.5\" fill=\"rgba(255,255,255,0.06)\"/>\n\n<!-- Lábak -->\n<svg:g class=\"do-leg-left\" [class.do-leg--walking]=\"isWalking()\">\n <svg:rect x=\"11\" y=\"44\" width=\"7\" height=\"20\" rx=\"1.5\"\n [attr.fill]=\"pantsColor()\"/>\n <!-- 3D fény overlay -->\n <svg:rect x=\"11\" y=\"44\" width=\"7\" height=\"20\" rx=\"1.5\" fill=\"url(#doLight3D)\"/>\n <svg:rect x=\"15\" y=\"45\" width=\"3\" height=\"18\" rx=\"1\" fill=\"rgba(10,15,25,0.12)\"/>\n</svg:g>\n<svg:g class=\"do-leg-right\" [class.do-leg--walking]=\"isWalking()\">\n <svg:rect x=\"22\" y=\"44\" width=\"7\" height=\"20\" rx=\"1.5\"\n [attr.fill]=\"pantsColor()\"/>\n <!-- 3D fény overlay -->\n <svg:rect x=\"22\" y=\"44\" width=\"7\" height=\"20\" rx=\"1.5\" fill=\"url(#doLight3D)\"/>\n <svg:rect x=\"22\" y=\"45\" width=\"3\" height=\"18\" rx=\"1\" fill=\"rgba(10,15,25,0.12)\"/>\n</svg:g>\n", "/**\n * OpenClaw instance karakter lobster-claw kéz SVG path és transform konstansok.\n * Lefelé nyíló, kerekebb kétujjas pincser; standing viewBox 40×72; ülő viewBox 52×56.\n */\n\n/**\n * Bal oldali claw path (álló / séta / dolgozik — do-character, do-char-arms).\n */\nexport const DO_OPENCLAW_CLAW_PATH_LEFT_STANDING: string =\n 'M7.1,40.5 C6.2,40.2 5.1,40.4 4.2,41 C2.5,42 1.4,43.8 1.6,45.5 C1.8,46.8 2.8,47.7 4.2,47.7 C5.4,47.6 6.4,46.8 6.7,45.5'\n + ' C6.95,44.5 6.85,43.5 6.5,42.7 C6.65,42.4 7.1,42.5 7.55,43 C8.35,44 8.55,45.2 8.25,46.2 C8,47 7.15,47.45 6.45,47.2'\n + ' C5.85,46.95 5.65,46.2 5.85,45.5 C6.1,44.5 6.75,43.5 7.25,42.4 C7.55,41.6 7.35,40.9 7.1,40.5 Z';\n\n/**\n * Bal oldali claw path (ülő póz — do-character, középvonal x=26).\n */\nexport const DO_OPENCLAW_CLAW_PATH_LEFT_SITTING: string =\n 'M11.5,36.5 C10.2,36.2 9,36.5 8,37.2 C6.2,38.5 5.2,40.5 5.4,42.2 C5.6,43.6 6.6,44.6 8.1,44.6 C9.4,44.55 10.5,43.7 10.85,42.4'\n + ' C11.1,41.4 11,40.4 10.6,39.6 C10.75,39.35 11.25,39.45 11.75,40 C12.65,41.1 12.9,42.5 12.55,43.6 C12.25,44.4 11.35,44.85 10.65,44.65'\n + ' C10.05,44.45 9.85,43.7 10.05,42.9 C10.35,41.8 11,40.8 11.45,39.7 C11.65,38.9 11.55,37.8 11.5,36.5 Z';\n\n/**\n * Jobb kéz: tükrözés x=20 körül (standing viewBox szélesség 40).\n */\nexport const DO_OPENCLAW_CLAW_TRANSFORM_MIRROR_X20: string =\n 'translate(20,0) scale(-1,1) translate(-20,0)';\n\n/**\n * Jobb kéz: tükrözés x=26 körül (ülő viewBox, karakter közép).\n */\nexport const DO_OPENCLAW_CLAW_TRANSFORM_MIRROR_X26: string =\n 'translate(26,0) scale(-1,1) translate(-26,0)';\n", "import { Component, input, InputSignal } from '@angular/core';\n\nimport { DO_CharacterType_Type } from '../../../../../_enums/dark-office/do-character-type.enum';\nimport { DO_ClothingStyle_Type } from '../../../../../_enums/dark-office/do-clothing-style.enum';\nimport {\n DO_OPENCLAW_CLAW_PATH_LEFT_STANDING,\n DO_OPENCLAW_CLAW_TRANSFORM_MIRROR_X20,\n} from '../../../_collections/consts/do-openclaw-claw-svg.const';\n\n/**\n * Dark Office karakter karok: felső kar (sleeve) + alkar (forearm) + kezek.\n * Tartalmazza a váll-kar összekötő ellipsziseket és a kar alatti kontakt-árnyékot.\n */\n@Component({\n selector: '[app-do-char-arms]',\n templateUrl: './do-char-arms.component.html',\n})\n/** DO_CharArms_Component class. */\nexport class DO_CharArms_Component {\n\n /** Bőrszín (alkar casual stílusnál + kéz). */\n readonly skinColor: InputSignal<string> = input.required<string>();\n\n /** Felsőruha szín (sleeve + long-sleeve forearm). */\n readonly shirtColor: InputSignal<string> = input.required<string>();\n\n /** Ruha stílus (hoodie/formal/casual — meghatározza a kar felépítését). */\n readonly clothingStyle: InputSignal<DO_ClothingStyle_Type> = input.required<DO_ClothingStyle_Type>();\n\n /** Karakter típus (OpenClaw → lobster claw kéz). */\n readonly characterType: InputSignal<DO_CharacterType_Type> =\n input<DO_CharacterType_Type>(DO_CharacterType_Type.ccap);\n\n /** Enum referenciák a template-hez. */\n readonly clothingType = DO_ClothingStyle_Type;\n readonly charType = DO_CharacterType_Type;\n\n /** OpenClaw lobster-claw bal path (standing viewBox). */\n readonly openclawClawPathLeftStanding: string = DO_OPENCLAW_CLAW_PATH_LEFT_STANDING;\n\n /** OpenClaw jobb kéz tükrözés (x=20). */\n readonly openclawClawMirrorX20: string = DO_OPENCLAW_CLAW_TRANSFORM_MIRROR_X20;\n}\n", "<!-- Bal felső kar (sleeve — enyhe ív, fent szélesebb, lent szűkebb) -->\n@switch (clothingStyle()) {\n @case (clothingType.hoodie) {\n <svg:path d=\"M2,19 Q0,20 1,27 L2.5,33 L9,33 L10.5,27 Q12,20 10,19 Z\"\n [attr.fill]=\"shirtColor()\" />\n <svg:path d=\"M2,19 Q0,20 1,27 L2.5,33 L9,33 L10.5,27 Q12,20 10,19 Z\"\n fill=\"url(#doLight3D)\"/>\n }\n @case (clothingType.formal) {\n <svg:path d=\"M3,19 Q1,20 1.5,27 L3,33 L9,33 L10.5,27 Q11,20 9,19 Z\"\n [attr.fill]=\"shirtColor()\" />\n <svg:path d=\"M3,19 Q1,20 1.5,27 L3,33 L9,33 L10.5,27 Q11,20 9,19 Z\"\n fill=\"url(#doLight3D)\"/>\n }\n @default {\n <svg:path d=\"M3,19 Q1,20 1.5,27 L3,33 L9,33 L10.5,27 Q11,20 9,19 Z\"\n [attr.fill]=\"shirtColor()\" />\n <svg:path d=\"M3,19 Q1,20 1.5,27 L3,33 L9,33 L10.5,27 Q11,20 9,19 Z\"\n fill=\"url(#doLight3D)\"/>\n <!-- Ujj alsó él (ruha-bőr elválasztás) -->\n <svg:rect x=\"2\" y=\"32\" width=\"8\" height=\"1\" rx=\"0.5\" fill=\"rgba(10,15,25,0.14)\"/>\n }\n}\n<!-- Bal felső kar belső árnyék -->\n<svg:rect x=\"7\" y=\"21\" width=\"4\" height=\"10\" rx=\"1.5\" fill=\"rgba(10,15,25,0.10)\"/>\n\n<!-- Jobb felső kar (sleeve) -->\n@switch (clothingStyle()) {\n @case (clothingType.hoodie) {\n <svg:path d=\"M30,19 Q28,20 29,27 L30.5,33 L37,33 L38.5,27 Q40,20 38,19 Z\"\n [attr.fill]=\"shirtColor()\" />\n <svg:path d=\"M30,19 Q28,20 29,27 L30.5,33 L37,33 L38.5,27 Q40,20 38,19 Z\"\n fill=\"url(#doLight3D)\"/>\n }\n @case (clothingType.formal) {\n <svg:path d=\"M31,19 Q29,20 29.5,27 L31,33 L37,33 L38.5,27 Q39,20 37,19 Z\"\n [attr.fill]=\"shirtColor()\" />\n <svg:path d=\"M31,19 Q29,20 29.5,27 L31,33 L37,33 L38.5,27 Q39,20 37,19 Z\"\n fill=\"url(#doLight3D)\"/>\n }\n @default {\n <svg:path d=\"M31,19 Q29,20 29.5,27 L31,33 L37,33 L38.5,27 Q39,20 37,19 Z\"\n [attr.fill]=\"shirtColor()\" />\n <svg:path d=\"M31,19 Q29,20 29.5,27 L31,33 L37,33 L38.5,27 Q39,20 37,19 Z\"\n fill=\"url(#doLight3D)\"/>\n <svg:rect x=\"30\" y=\"32\" width=\"8\" height=\"1\" rx=\"0.5\" fill=\"rgba(10,15,25,0.14)\"/>\n }\n}\n\n<!-- Bal alkar (szűkebb csukló) -->\n@switch (clothingStyle()) {\n @case (clothingType.hoodie) {\n <svg:path d=\"M2.5,31 Q1.5,32 2,37 L3,42 L8,42 L9,37 Q9.5,32 8.5,31 Z\"\n [attr.fill]=\"shirtColor()\"/>\n <svg:path d=\"M2.5,31 Q1.5,32 2,37 L3,42 L8,42 L9,37 Q9.5,32 8.5,31 Z\"\n fill=\"url(#doLight3D)\"/>\n <svg:rect x=\"2\" y=\"39.5\" width=\"7\" height=\"2\" rx=\"0.8\" fill=\"rgba(10,15,25,0.10)\"/>\n }\n @case (clothingType.formal) {\n <svg:path d=\"M3,31 Q2,32 2.5,36 L3.5,39 L8,39 L9,36 Q9.5,32 8.5,31 Z\"\n [attr.fill]=\"shirtColor()\"/>\n <svg:path d=\"M3,31 Q2,32 2.5,36 L3.5,39 L8,39 L9,36 Q9.5,32 8.5,31 Z\"\n fill=\"url(#doLight3D)\"/>\n <svg:rect x=\"3\" y=\"38\" width=\"6\" height=\"3\" rx=\"1\" fill=\"#dde0e4\"/>\n }\n @default {\n <svg:path d=\"M3,31 Q2,32 2.5,37 L3.5,42 L8,42 L9,37 Q9.5,32 8.5,31 Z\"\n [attr.fill]=\"skinColor()\"/>\n <svg:path d=\"M3,31 Q2,32 2.5,37 L3.5,42 L8,42 L9,37 Q9.5,32 8.5,31 Z\"\n fill=\"url(#doLight3D)\"/>\n <svg:rect x=\"6\" y=\"33\" width=\"3\" height=\"7\" rx=\"1\" fill=\"rgba(30,15,10,0.08)\"/>\n }\n}\n\n<!-- Jobb alkar -->\n@switch (clothingStyle()) {\n @case (clothingType.hoodie) {\n <svg:path d=\"M31.5,31 Q30.5,32 31,37 L32,42 L37,42 L38,37 Q38.5,32 37.5,31 Z\"\n [attr.fill]=\"shirtColor()\"/>\n <svg:path d=\"M31.5,31 Q30.5,32 31,37 L32,42 L37,42 L38,37 Q38.5,32 37.5,31 Z\"\n fill=\"url(#doLight3D)\"/>\n <svg:rect x=\"31\" y=\"39.5\" width=\"7\" height=\"2\" rx=\"0.8\" fill=\"rgba(10,15,25,0.10)\"/>\n }\n @case (clothingType.formal) {\n <svg:path d=\"M31,31 Q30,32 30.5,36 L31.5,39 L36,39 L37,36 Q37.5,32 36.5,31 Z\"\n [attr.fill]=\"shirtColor()\"/>\n <svg:path d=\"M31,31 Q30,32 30.5,36 L31.5,39 L36,39 L37,36 Q37.5,32 36.5,31 Z\"\n fill=\"url(#doLight3D)\"/>\n <svg:rect x=\"31\" y=\"38\" width=\"6\" height=\"3\" rx=\"1\" fill=\"#dde0e4\"/>\n }\n @default {\n <svg:path d=\"M31,31 Q30,32 30.5,37 L31.5,42 L36,42 L37,37 Q37.5,32 36.5,31 Z\"\n [attr.fill]=\"skinColor()\"/>\n <svg:path d=\"M31,31 Q30,32 30.5,37 L31.5,42 L36,42 L37,37 Q37.5,32 36.5,31 Z\"\n fill=\"url(#doLight3D)\"/>\n <svg:rect x=\"31\" y=\"33\" width=\"3\" height=\"7\" rx=\"1\" fill=\"rgba(30,15,10,0.08)\"/>\n }\n}\n\n<!-- Kar alatti kontakt-árnyék -->\n<svg:ellipse cx=\"6\" cy=\"20\" rx=\"4\" ry=\"1.2\" fill=\"rgba(10,15,25,0.15)\"/>\n<svg:ellipse cx=\"34\" cy=\"20\" rx=\"4\" ry=\"1.2\" fill=\"rgba(10,15,25,0.15)\"/>\n\n<!-- Kezek — OpenClaw: lefelé nyíló, kerekebb lobster-claw + specular highlight -->\n@if (characterType() === charType.openclaw) {\n <svg:g>\n <svg:path [attr.d]=\"openclawClawPathLeftStanding\"\n fill=\"#c0392b\" stroke=\"#1a0808\" stroke-width=\"0.55\"\n stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n <svg:ellipse cx=\"3.4\" cy=\"42.8\" rx=\"1.05\" ry=\"0.68\" fill=\"rgba(255,255,255,0.45)\"/>\n <svg:ellipse cx=\"5.95\" cy=\"45.05\" rx=\"0.78\" ry=\"0.52\" fill=\"rgba(255,255,255,0.33)\"/>\n </svg:g>\n <svg:g [attr.transform]=\"openclawClawMirrorX20\">\n <svg:path [attr.d]=\"openclawClawPathLeftStanding\"\n fill=\"#c0392b\" stroke=\"#1a0808\" stroke-width=\"0.55\"\n stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n <svg:ellipse cx=\"3.4\" cy=\"42.8\" rx=\"1.05\" ry=\"0.68\" fill=\"rgba(255,255,255,0.45)\"/>\n <svg:ellipse cx=\"5.95\" cy=\"45.05\" rx=\"0.78\" ry=\"0.52\" fill=\"rgba(255,255,255,0.33)\"/>\n </svg:g>\n} @else {\n <!-- Bal kéz (hüvelykujj oldal hosszabb) -->\n <svg:path d=\"M3.5,41 L3,43.5 Q3,44.5 4,44.5 L7.5,44 Q8.5,44 8.5,43 L8.5,41 Z\"\n [attr.fill]=\"skinColor()\"/>\n <!-- Jobb kéz -->\n <svg:path d=\"M36.5,41 L37,43.5 Q37,44.5 36,44.5 L32.5,44 Q31.5,44 31.5,43 L31.5,41 Z\"\n [attr.fill]=\"skinColor()\"/>\n}\n", "import { Component, input, InputSignal } from '@angular/core';\n\nimport { DO_ClothingStyle_Type } from '../../../../../_enums/dark-office/do-clothing-style.enum';\n\n/**\n * Dark Office karakter törzs: váll-kar összekötő ívek + tapered törzs path + ruha részletek.\n * Tartalmazza az öv/derékvonalat, törzs árnyékot és highlight-ot.\n */\n@Component({\n selector: '[app-do-char-torso]',\n templateUrl: './do-char-torso.component.html',\n})\n/** DO_CharTorso_Component class. */\nexport class DO_CharTorso_Component {\n\n /** Felsőruha szín. */\n readonly shirtColor: InputSignal<string> = input.required<string>();\n\n /** Ruha stílus. */\n readonly clothingStyle: InputSignal<DO_ClothingStyle_Type> = input.required<DO_ClothingStyle_Type>();\n\n /** Working állapot (formal részletek rejtve háttal álláskor). */\n readonly isWorking: InputSignal<boolean> = input<boolean>(false);\n\n /** Enum referencia a template-hez. */\n readonly clothingType = DO_ClothingStyle_Type;\n}\n", "<!-- Törzs (ívelt vállvonal: közép magasabb, szélek lejtenek) -->\n@switch (clothingStyle()) {\n @case (clothingType.hoodie) {\n <svg:path d=\"M4,21 Q4,18 9,18 Q20,16 31,18 Q36,18 36,21 L32,45 Q32,46 30,46 L10,46 Q8,46 8,45 Z\"\n [attr.fill]=\"shirtColor()\"/>\n <!-- 3D fény overlay -->\n <svg:path d=\"M4,21 Q4,18 9,18 Q20,16 31,18 Q36,18 36,21 L32,45 Q32,46 30,46 L10,46 Q8,46 8,45 Z\"\n fill=\"url(#doLight3D)\"/>\n <svg:path d=\"M14,20 Q20,25 26,20\" stroke=\"rgba(10,15,25,0.14)\" stroke-width=\"1\"\n fill=\"none\" stroke-linecap=\"round\"/>\n @if (!isWorking()) {\n <svg:rect x=\"13\" y=\"36\" width=\"14\" height=\"8\" rx=\"2\" fill=\"rgba(10,15,25,0.10)\"/>\n }\n }\n @case (clothingType.formal) {\n <!-- Zakó test (ívelt váll, szűkülő derék) -->\n <svg:path d=\"M5,21 Q5,18 10,18 Q20,16 30,18 Q35,18 35,21 L31,44 Q31,45 30,45 L10,45 Q9,45 9,44 Z\"\n [attr.fill]=\"shirtColor()\"/>\n <!-- 3D fény overlay -->\n <svg:path d=\"M5,21 Q5,18 10,18 Q20,16 30,18 Q35,18 35,21 L31,44 Q31,45 30,45 L10,45 Q9,45 9,44 Z\"\n fill=\"url(#doLight3D)\"/>\n @if (!isWorking()) {\n <!-- Ing mellrésze -->\n <svg:path d=\"M16,17 L16,45 L24,45 L24,17 Z\" fill=\"#dde0e4\" opacity=\"0.9\"/>\n <!-- Zakó középvonal (két szárny elválasztás) -->\n <svg:line x1=\"15.5\" y1=\"20\" x2=\"16\" y2=\"45\" stroke=\"rgba(10,15,25,0.10)\" stroke-width=\"0.6\"/>\n <svg:line x1=\"24.5\" y1=\"20\" x2=\"24\" y2=\"45\" stroke=\"rgba(10,15,25,0.10)\" stroke-width=\"0.6\"/>\n <!-- Hajtóka (lapel) -->\n <svg:path d=\"M16,18 L14,20 L16,26\" fill=\"rgba(10,15,25,0.08)\"/>\n <svg:path d=\"M24,18 L26,20 L24,26\" fill=\"rgba(10,15,25,0.08)\"/>\n <!-- Nyakkendő árnyék (gallér alá bújik) -->\n <svg:rect x=\"18\" y=\"17.5\" width=\"4\" height=\"2\" rx=\"0.5\" fill=\"rgba(10,15,25,0.12)\"/>\n <!-- Nyakkendő -->\n <svg:path d=\"M19,18.5 L20,20.5 L21,18.5\" fill=\"#7f2d2d\"/>\n <svg:rect x=\"18.5\" y=\"20.5\" width=\"3\" height=\"13\" rx=\"0.8\" fill=\"#7f2d2d\"/>\n <svg:path d=\"M18,33.5 L20,37 L22,33.5\" fill=\"#7f2d2d\"/>\n }\n }\n @default {\n <svg:path d=\"M5,21 Q5,18 10,18 Q20,16 30,18 Q35,18 35,21 L31,44 Q31,45 30,45 L10,45 Q9,45 9,44 Z\"\n [attr.fill]=\"shirtColor()\"/>\n <!-- 3D fény overlay -->\n <svg:path d=\"M5,21 Q5,18 10,18 Q20,16 30,18 Q35,18 35,21 L31,44 Q31,45 30,45 L10,45 Q9,45 9,44 Z\"\n fill=\"url(#doLight3D)\"/>\n <svg:path d=\"M16,19 Q20,22 24,19\" stroke=\"rgba(10,15,25,0.14)\" stroke-width=\"0.8\"\n fill=\"none\" stroke-linecap=\"round\"/>\n }\n}\n\n<!-- Öv/derékvonal -->\n<svg:rect x=\"9\" y=\"42.5\" width=\"22\" height=\"1.5\" rx=\"0.5\" fill=\"rgba(10,15,25,0.15)\"/>\n<!-- Törzs jobb oldali árnyék -->\n<svg:path d=\"M24,19 L31,21 L31,44 Q31,45 30,45 L22,45 Z\" fill=\"rgba(10,15,25,0.12)\"/>\n", "import { Component, input, InputSignal } from '@angular/core';\n\n/**\n * Dark Office karakter nyak + fej: nyak rect, fej path (organic jaw), árnyék rétegek.\n *\n * A fej highlight gradiens `url(#id)` — a szülő SVG `<defs>`-ben lévő linearGradient `id`-ja.\n * Külön beágyazott SVG-knál (pl. instance panel) globálisan egyedi `id` kell, ezért override-olható.\n */\n@Component({\n selector: '[app-do-char-neck-head]',\n templateUrl: './do-char-neck-head.component.html',\n})\n/** DO_CharNeckHead_Component class. */\nexport class DO_CharNeckHead_Component {\n\n /** Bőrszín. */\n readonly skinColor: InputSignal<string> = input.required<string>();\n\n /**\n * A `<linearGradient>` elem `id` a szülő SVG-ben (fej 3D fény overlay fill).\n * Alapértelmezés: fő jelenet `do-office-scene` defs (`doLightVert`).\n */\n readonly headLightGradientElementId: InputSignal<string> = input<string>('doLightVert');\n}\n", "<!-- Nyak (szélesebb — természetes nyak-váll kapcsolat) -->\n<svg:rect x=\"16\" y=\"13\" width=\"8\" height=\"6\" rx=\"1\"\n [attr.fill]=\"skinColor()\"/>\n<svg:ellipse cx=\"20\" cy=\"14\" rx=\"5\" ry=\"1.5\" fill=\"rgba(30,15,10,0.16)\"/>\n\n<!-- Fej (koponyatető szélesebb, állvonal szűkebb) -->\n<svg:path d=\"M11.5,7.5 Q11.5,1.5 20,1.5 Q28.5,1.5 28.5,7.5 Q28.5,12.5 25,14 L15,14 Q11.5,12.5 11.5,7.5 Z\"\n [attr.fill]=\"skinColor()\"/>\n<!-- Fej 3D fény overlay (gradiens id — szülő defs, globálisan egyedi kell több SVG mellett) -->\n<svg:path d=\"M11.5,7.5 Q11.5,1.5 20,1.5 Q28.5,1.5 28.5,7.5 Q28.5,12.5 25,14 L15,14 Q11.5,12.5 11.5,7.5 Z\"\n [attr.fill]=\"'url(#' + headLightGradientElementId() + ')'\"/>\n<!-- Fej-törzs kontakt-árnyék -->\n<svg:ellipse cx=\"20\" cy=\"17\" rx=\"8\" ry=\"1.8\" fill=\"rgba(10,15,25,0.18)\"/>\n<!-- Fej jobb oldali árnyék -->\n<svg:path d=\"M24,3 Q28.5,5 28.5,7.5 Q28.5,12.5 25,14 L22,14 Q25,11 24,3 Z\"\n fill=\"rgba(30,15,10,0.07)\"/>\n", "import { Component, input, InputSignal } from '@angular/core';\n\n/**\n * Dark Office karakter arc: szemöldök, szemhéj, szem (sclera+iris+pupil+catchlight), orr, száj.\n * A szülő komponens felelős a láthatóságért (working állapotban rejtett a scene-ben).\n */\n@Component({\n selector: '[app-do-char-face]',\n templateUrl: './do-char-face.component.html',\n})\n/** DO_CharFace_Component class. */\nexport class DO_CharFace_Component {\n\n /** Szemszín (írisz). */\n readonly eyeColor: InputSignal<string> = input.required<string>();\n}\n", "<!-- Szem fehérje -->\n<svg:ellipse cx=\"16\" cy=\"7.2\" rx=\"2.2\" ry=\"1.6\" fill=\"white\" opacity=\"0.92\"/>\n<svg:ellipse cx=\"24\" cy=\"7.2\" rx=\"2.2\" ry=\"1.6\" fill=\"white\" opacity=\"0.92\"/>\n\n<!-- Írisz -->\n<svg:circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\" [attr.fill]=\"eyeColor()\"/>\n<svg:circle cx=\"24.5\" cy=\"7.5\" r=\"1.2\" [attr.fill]=\"eyeColor()\"/>\n\n<!-- Pupilla -->\n<svg:circle cx=\"16.6\" cy=\"7.6\" r=\"0.55\" fill=\"#111\"/>\n<svg:circle cx=\"24.6\" cy=\"7.6\" r=\"0.55\" fill=\"#111\"/>\n\n<!-- Catchlight -->\n<svg:circle cx=\"15.8\" cy=\"6.8\" r=\"0.4\" fill=\"white\" opacity=\"0.6\"/>\n<svg:circle cx=\"23.8\" cy=\"6.8\" r=\"0.4\" fill=\"white\" opacity=\"0.6\"/>\n\n<!-- Száj -->\n<svg:path d=\"M17.5,11.5 Q20,13 22.5,11.5\" stroke=\"#a0522d\" stroke-width=\"0.8\"\n fill=\"none\" stroke-linecap=\"round\"/>\n", "import { Component, input, InputSignal } from '@angular/core';\n\nimport { DO_HairStyle_Type } from '../../../../../_enums/dark-office/do-hair-style.enum';\n\n/**\n * Dark Office karakter haj: 6 hajstílus variáns (short, long, spiky, curly, mohawk, bald).\n */\n@Component({\n selector: '[app-do-char-hair]',\n templateUrl: './do-char-hair.component.html',\n})\n/** DO_CharHair_Component class. */\nexport class DO_CharHair_Component {\n\n /** Hajszín. */\n readonly hairColor: InputSignal<string> = input.required<string>();\n\n /** Hajstílus. */\n readonly hairStyle: InputSignal<DO_HairStyle_Type> = input.required<DO_HairStyle_Type>();\n\n /** Enum referencia a template-hez. */\n readonly hairType = DO_HairStyle_Type;\n}\n", "@switch (hairStyle()) {\n @case (hairType.short) {\n <!-- Fő kupola (volumennel, természetes kontúr) -->\n <svg:path d=\"M10.5,7 Q10,3.5 12,0.5 Q15,-1.5 20,-1.5 Q25,-1.5 28,0.5 Q30,3.5 29.5,7\n Q27,4 20,3.5 Q13,4 10.5,7 Z\"\n [attr.fill]=\"hairColor()\"/>\n <!-- Bal oldali haj (fülre simuló organikus ív) -->\n <svg:path d=\"M10.5,7 Q9.5,5 10.5,2 Q11,0.5 12,0.5 Q10.5,3 10,6.5 Q10,8 10.5,9.5 Z\"\n [attr.fill]=\"hairColor()\"/>\n <!-- Jobb oldali haj -->\n <svg:path d=\"M29.5,7 Q30.5,5 29.5,2 Q29,0.5 28,0.5 Q29.5,3 30,6.5 Q30,8 29.5,9.5 Z\"\n [attr.fill]=\"hairColor()\"/>\n <!-- Felső highlight ív -->\n <svg:path d=\"M14,0.5 Q17,-1.5 20,-1.5 Q23,-1.5 26,0.5 Q23,-0.5 20,-0.5 Q17,-0.5 14,0.5 Z\"\n fill=\"white\" opacity=\"0.10\"/>\n }\n @case (hairType.long) {\n <!-- Fő kupola -->\n <svg:path d=\"M10.5,7 Q10,3.5 12,0.5 Q15,-1.5 20,-1.5 Q25,-1.5 28,0.5 Q30,3.5 29.5,7\n Q27,4 20,3.5 Q13,4 10.5,7 Z\"\n [attr.fill]=\"hairColor()\"/>\n <!-- Bal oldali hosszú tincs (vállig érő, enyhe hullám) -->\n <svg:path d=\"M10.5,7 Q9,5 10.5,2 Q11,0.5 12,0.5 Q10,3 9.5,7 Q9,11 9.5,15\n Q10,17 10.5,16 Q10,13 10,10 Q10,8 10.5,7 Z\"\n [attr.fill]=\"hairColor()\"/>\n <!-- Jobb oldali hosszú tincs -->\n <svg:path d=\"M29.5,7 Q31,5 29.5,2 Q29,0.5 28,0.5 Q30,3 30.5,7 Q31,11 30.5,15\n Q30,17 29.5,16 Q30,13 30,10 Q30,8 29.5,7 Z\"\n [attr.fill]=\"hairColor()\"/>\n <!-- Felső highlight -->\n <svg:path d=\"M14,0.5 Q17,-1.5 20,-1.5 Q23,-1.5 26,0.5 Q23,-0.5 20,-0.5 Q17,-0.5 14,0.5 Z\"\n fill=\"white\" opacity=\"0.10\"/>\n }\n @case (hairType.spiky) {\n <!-- Tüskés haj (organikus path — 3 tüske felfelé) -->\n <svg:path d=\"M11,6 Q11,3 13,1 L14,-2.5 Q15,-4 16,-0.5 L17,1 Q18,-0.5 19,-3.5\n Q20,-5 21,-3.5 L22,0.5 Q23,-0.5 24,-2.5 Q25,-4 26,-0.5 L27,1\n Q29,3 29,6 Q27,4 20,3.5 Q13,4 11,6 Z\"\n [attr.fill]=\"hairColor()\"/>\n <!-- Tüske csúcs highlight-ok -->\n <svg:path d=\"M14.5,-1.5 Q15,-3.5 15.5,-1 Z\" fill=\"white\" opacity=\"0.10\"/>\n <svg:path d=\"M19.5,-2.5 Q20,-4.5 20.5,-2.5 Z\" fill=\"white\" opacity=\"0.10\"/>\n <svg:path d=\"M24.5,-1.5 Q25,-3.5 25.5,-1 Z\" fill=\"white\" opacity=\"0.10\"/>\n }\n @case (hairType.curly) {\n <!-- Göndör: sűrű, változatos méretű fürtök -->\n <svg:circle cx=\"14\" cy=\"2\" r=\"5\" [attr.fill]=\"hairColor()\"/>\n <svg:circle cx=\"20\" cy=\"0.5\" r=\"5\" [attr.fill]=\"hairColor()\"/>\n <svg:circle cx=\"26\" cy=\"2\" r=\"5\" [attr.fill]=\"hairColor()\"/>\n <svg:circle cx=\"11\" cy=\"6\" r=\"4\" [attr.fill]=\"hairColor()\"/>\n <svg:circle cx=\"29\" cy=\"6\" r=\"4\" [attr.fill]=\"hairColor()\"/>\n <svg:circle cx=\"17\" cy=\"-1\" r=\"3\" [attr.fill]=\"hairColor()\"/>\n <svg:circle cx=\"23\" cy=\"-1\" r=\"3\" [attr.fill]=\"hairColor()\"/>\n <!-- Highlight fürtök -->\n <svg:circle cx=\"16\" cy=\"0\" r=\"2.5\" fill=\"white\" opacity=\"0.06\"/>\n <svg:circle cx=\"24\" cy=\"0\" r=\"2.5\" fill=\"white\" opacity=\"0.06\"/>\n }\n @case (hairType.mohawk) {\n <!-- Taréj alap (koponyára simuló) -->\n <svg:path d=\"M15,6 Q14,4 16,2 Q18,1 20,1 Q22,1 24,2 Q26,4 25,6\n Q23,4 20,3.5 Q17,4 15,6 Z\"\n [attr.fill]=\"hairColor()\"/>\n <!-- Taréj (alul széles, felül csúcsos) -->\n <svg:path d=\"M16,4 Q15,2 16.5,-1 Q18,-3.5 20,-5 Q22,-3.5 23.5,-1 Q25,2 24,4\n Q22,2 20,1.5 Q18,2 16,4 Z\"\n [attr.fill]=\"hairColor()\"/>\n <!-- Taréj highlight (középvonal) -->\n <svg:path d=\"M19.5,-0.5 Q20,-4.5 20.5,-0.5 Q20,-1 19.5,-0.5 Z\" fill=\"white\" opacity=\"0.12\"/>\n }\n @default {\n <!-- bald -->\n }\n}\n", "import { Component, computed, input, InputSignal, Signal } from '@angular/core';\n\nimport { DO_BodyType_Type } from '../../../../_enums/dark-office/do-body-type.enum';\nimport { DO_CharacterType_Type } from '../../../../_enums/dark-office/do-character-type.enum';\nimport { DO_ClothingStyle_Type } from '../../../../_enums/dark-office/do-clothing-style.enum';\nimport { DO_HairStyle_Type } from '../../../../_enums/dark-office/do-hair-style.enum';\nimport { DO_CharacterVisuals_Response } from '../../../../_models/interfaces/dark-office/do-character-visuals.interface';\n\n/**\n * Dark Office karakter test renderelő komponens.\n * Újrafelhasználható SVG karakter — azonos vizuál a scene-ben használt do-svg-char-ral,\n * de önálló `<svg>` elemként renderel (nem scene graph `<g>` attribute selector).\n *\n * Felhasználás: vizuál editor előnézet, instance panel avatar, bármilyen karakter preview.\n * Nem tartalmaz: animáció, pozíció, név label, activity buborék.\n */\n@Component({\n selector: 'app-do-char-body',\n templateUrl: './do-char-body.component.html',\n})\n/** DO_CharBody_Component class. */\nexport class DO_CharBody_Component {\n\n /** Karakter vizuál beállítások. */\n readonly visuals: InputSignal<DO_CharacterVisuals_Response> = input.required<DO_CharacterVisuals_Response>();\n\n /** Karakter típus (OpenClaw → lobster claw kéz). */\n readonly characterType: InputSignal<DO_CharacterType_Type> =\n input<DO_CharacterType_Type>(DO_CharacterType_Type.ccap);\n\n /** Enum referenciák a template-hez. */\n readonly hairType = DO_HairStyle_Type;\n readonly clothingType = DO_ClothingStyle_Type;\n readonly charType = DO_CharacterType_Type;\n\n /** Body type – felső test SVG transform. */\n readonly upperBodyTransform_$: Signal<string> = computed((): string => {\n const bodyType: DO_BodyType_Type = this.visuals().bodyType ?? DO_BodyType_Type.average;\n switch (bodyType) {\n case DO_BodyType_Type.slim: return 'translate(20,0) scale(0.82,1) translate(-20,0)';\n case DO_BodyType_Type.stocky: return 'translate(20,0) scale(1.15,1) translate(-20,0)';\n case DO_BodyType_Type.athletic: return 'translate(20,0) scale(1.1,1) translate(-20,0)';\n default: return '';\n }\n });\n\n /** Body type – alsó test SVG transform. */\n readonly lowerBodyTransform_$: Signal<string> = computed((): string => {\n const bodyType: DO_BodyType_Type = this.visuals().bodyType ?? DO_BodyType_Type.average;\n switch (bodyType) {\n case DO_BodyType_Type.slim: return 'translate(20,0) scale(0.85,1) translate(-20,0)';\n case DO_BodyType_Type.stocky: return 'translate(20,0) scale(1.1,1) translate(-20,0)';\n case DO_BodyType_Type.athletic: return 'translate(20,0) scale(0.92,1) translate(-20,0)';\n default: return '';\n }\n });\n}\n", "<!--\n Önálló karakter SVG — ugyanaz a vizuál mint a do-svg-char scene renderelés,\n de saját <svg> wrapperben, animáció/pozíció logika nélkül.\n-->\n<svg viewBox=\"-1 -6 42 78\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\n <!-- Preview lokális defs: filter + fény gradiens -->\n <defs>\n <linearGradient id=\"doLight3DLocal\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0.5\">\n <stop offset=\"0%\" stop-color=\"white\" stop-opacity=\"0.12\"/>\n <stop offset=\"40%\" stop-color=\"white\" stop-opacity=\"0.02\"/>\n <stop offset=\"100%\" stop-color=\"black\" stop-opacity=\"0.15\"/>\n </linearGradient>\n <linearGradient id=\"doLightVertLocal\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"white\" stop-opacity=\"0.10\"/>\n <stop offset=\"50%\" stop-color=\"white\" stop-opacity=\"0\"/>\n <stop offset=\"100%\" stop-color=\"black\" stop-opacity=\"0.08\"/>\n </linearGradient>\n <filter id=\"doCharEffectLocal\" x=\"-30%\" y=\"-20%\" width=\"160%\" height=\"150%\">\n <feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"1.5\" result=\"shadow\"/>\n <feOffset dx=\"1\" dy=\"2\" in=\"shadow\" result=\"offsetShadow\"/>\n <feFlood flood-color=\"#050510\" flood-opacity=\"0.4\" result=\"shadowColor\"/>\n <feComposite in=\"shadowColor\" in2=\"offsetShadow\" operator=\"in\" result=\"coloredShadow\"/>\n <feMorphology operator=\"dilate\" radius=\"0.3\" in=\"SourceAlpha\" result=\"expanded\"/>\n <feGaussianBlur stdDeviation=\"1.2\" in=\"expanded\" result=\"rimBlur\"/>\n <feFlood flood-color=\"#00e5ff\" flood-opacity=\"0.12\" result=\"rimColor\"/>\n <feComposite in=\"rimColor\" in2=\"rimBlur\" operator=\"in\" result=\"rimGlow\"/>\n <feMerge>\n <feMergeNode in=\"coloredShadow\"/>\n <feMergeNode in=\"rimGlow\"/>\n <feMergeNode in=\"SourceGraphic\"/>\n </feMerge>\n </filter>\n </defs>\n\n <!-- Talajárnyék -->\n <ellipse cx=\"20\" cy=\"70\" rx=\"14\" ry=\"3\" fill=\"black\" opacity=\"0.20\"/>\n <ellipse cx=\"20\" cy=\"69.5\" rx=\"8\" ry=\"1.5\" fill=\"black\" opacity=\"0.35\"/>\n\n <g filter=\"url(#doCharEffectLocal)\">\n\n <!-- Alsó test (body type transform: lábak) -->\n <g [attr.transform]=\"lowerBodyTransform_$()\">\n <g app-do-char-lower-body\n [pantsColor]=\"visuals().pantsColor\"></g>\n </g>\n\n <!-- Felső test (body type transform: kar + törzs) -->\n <g [attr.transform]=\"upperBodyTransform_$()\">\n <g app-do-char-arms\n [skinColor]=\"visuals().skinColor\"\n [shirtColor]=\"visuals().shirtColor\"\n [clothingStyle]=\"visuals().clothingStyle\"\n [characterType]=\"characterType()\"></g>\n\n <g app-do-char-torso\n [shirtColor]=\"visuals().shirtColor\"\n [clothingStyle]=\"visuals().clothingStyle\"></g>\n </g>\n\n <g app-do-char-neck-head\n [skinColor]=\"visuals().skinColor\"\n [headLightGradientElementId]=\"'doLightVertLocal'\"></g>\n\n <g app-do-char-face\n [eyeColor]=\"visuals().eyeColor\"></g>\n\n <g app-do-char-hair\n [hairColor]=\"visuals().hairColor\"\n [hairStyle]=\"visuals().hairStyle\"></g>\n </g>\n\n</svg>\n", "import {\n Component,\n input,\n InputSignal,\n output,\n OutputEmitterRef,\n} from '@angular/core';\n\nimport { DO_CharacterType_Type } from '../../../../_enums/dark-office/do-character-type.enum';\nimport { DO_CharacterVisuals_Response } from '../../../../_models/interfaces/dark-office/do-character-visuals.interface';\n\n/**\n * Dark Office karakter előnézet (SVG test + név + rövid instance ID).\n *\n * ## Felelősség\n * Ugyanaz a vizuál mint a **Karakter beállítások** modal bal oszlopa (`app-do-char-body`),\n * újrahasználható: vizuál editor és instance státusz részletező popup.\n * Nem tartalmaz szerkesztő kontrollokat — csak megjelenítés.\n */\n@Component({\n selector: 'app-do-character-preview',\n templateUrl: './do-character-preview.component.html',\n styleUrl: './do-character-preview.component.scss',\n})\n/** DO_CharacterPreview_Component class. */\nexport class DO_CharacterPreview_Component {\n\n /** Karakter vizuál (színek, stílusok). */\n readonly visuals: InputSignal<DO_CharacterVisuals_Response> =\n input.required<DO_CharacterVisuals_Response>();\n\n /** CCAP vs OpenClaw (robot kéz / OC). */\n readonly characterType: InputSignal<DO_CharacterType_Type> =\n input<DO_CharacterType_Type>(DO_CharacterType_Type.ccap);\n\n /** Instance azonosító — rövidítve jelenik meg a név alatt; üres → sor elrejtve. */\n readonly instanceId: InputSignal<string | null> = input<string | null>(null);\n\n /**\n * Ha `false`, a megjelenítési név sor elmarad (pl. státusz modal címsor már tartalmazza —\n * duplikáció elkerülése).\n */\n readonly showDisplayName: InputSignal<boolean> = input<boolean>(true);\n\n /**\n * Ha `false`, a rövidített instance ID felirat elmarad (pl. Office UI blokkban már van teljes\n * `instanceId`).\n */\n readonly showInstanceIdLine: InputSignal<boolean> = input<boolean>(true);\n\n /**\n * Elrendezés: `editor` — vizuál modal bal oszlop (szegély, nagyobb SVG);\n * `status` — státusz popup jobb oszlop (kisebb keret).\n */\n readonly variant: InputSignal<'editor' | 'status'> = input<'editor' | 'status'>('editor');\n\n /**\n * Ha `true`, a karakter SVG kattintásra `characterSettingsRequest` (Instance Details → vizuál editor).\n */\n readonly isCharacterSettingsClickEnabled: InputSignal<boolean> = input<boolean>(false);\n\n /** Karakterkép aktiválás — szülő nyitja a Karakter beállítások modalt. */\n readonly characterSettingsRequest: OutputEmitterRef<void> = output();\n\n /**\n * Karakter preview kattintás — csak engedélyezett módon emitel (modal bezárás a szülőn).\n */\n handleCharacterImageClick(event: MouseEvent): void {\n if (!this.isCharacterSettingsClickEnabled()) {\n return;\n }\n event.stopPropagation();\n this.characterSettingsRequest.emit();\n }\n\n /**\n * Billentyűzet: Enter / Space ugyanaz mint kattintás (a11y).\n */\n handleCharacterImageKeydown(event: KeyboardEvent): void {\n if (!this.isCharacterSettingsClickEnabled()) {\n return;\n }\n if (event.key !== 'Enter' && event.key !== ' ') {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n this.characterSettingsRequest.emit();\n }\n}\n", "<div class=\"do-character-preview\"\n [class.do-character-preview--editor]=\"variant() === 'editor'\"\n [class.do-character-preview--status]=\"variant() === 'status'\">\n\n <div class=\"do-character-preview__svg-wrap\"\n [class.do-character-preview__svg-wrap--clickable]=\"isCharacterSettingsClickEnabled()\"\n [attr.role]=\"isCharacterSettingsClickEnabled() ? 'button' : null\"\n [attr.tabindex]=\"isCharacterSettingsClickEnabled() ? 0 : -1\"\n [attr.title]=\"isCharacterSettingsClickEnabled() ? 'Open character settings' : null\"\n (click)=\"handleCharacterImageClick($event)\"\n (keydown)=\"handleCharacterImageKeydown($event)\">\n <app-do-char-body class=\"do-character-preview__svg\"\n [visuals]=\"visuals()\"\n [characterType]=\"characterType()\">\n </app-do-char-body>\n </div>\n\n @if (showDisplayName()) {\n <div class=\"do-character-preview__name\">{{ visuals().displayName || '—' }}</div>\n }\n\n @if (showInstanceIdLine() && instanceId(); as oid) {\n <div class=\"do-character-preview__id\">{{ oid | slice:0:12 }}…</div>\n }\n</div>\n", "import { Component, EventEmitter, inject, Input, OnInit, Output } from '@angular/core';\n\nimport { DO_BodyType_Type } from '../../../../_enums/dark-office/do-body-type.enum';\nimport { DO_CharacterType_Type } from '../../../../_enums/dark-office/do-character-type.enum';\nimport { DO_ClothingStyle_Type } from '../../../../_enums/dark-office/do-clothing-style.enum';\nimport { DO_HairStyle_Type } from '../../../../_enums/dark-office/do-hair-style.enum';\nimport { DO_CharacterVisuals_Response } from '../../../../_models/interfaces/dark-office/do-character-visuals.interface';\nimport { DO_OfficeInstanceState_Interface } from '../../../../_models/interfaces/dark-office/do-office-instance-state.interface';\nimport { DarkOffice_DataService } from '../../_services/dark-office.data-service';\nimport {\n DO_EYE_COLORS,\n DO_HAIR_COLORS,\n DO_PANTS_COLORS,\n DO_SHIRT_COLORS,\n DO_SKIN_COLORS,\n} from '../../_collections/consts/do-character-defaults.const';\n\n/**\n * Dark Office vizuál editor komponens.\n * Egy instance karakterének megjelenését lehet állítani:\n * hajszín/stílus, bőrszín, ingszín/stílus, nadrágszín, szemszín, megjelenítési név.\n *\n * ## Mentés\n * Változások azonnal megjelennek a UI-ban (optimistic update a data service signal-jén),\n * majd debounce-oltan (300ms) PATCH-elődnek a szerverre (`PATCH /instance-data/by-ccap/:ccapId`).\n * A `displayName` a szerver-oldali `name` mezőbe, a többi a `darkOfficeVisuals` objektumba kerül.\n */\n@Component({\n selector: 'app-do-visual-editor',\n templateUrl: './do-visual-editor.component.html',\n styleUrl: './do-visual-editor.component.scss',\n})\n/** DO_VisualEditor_Component class. */\nexport class DO_VisualEditor_Component implements OnInit {\n\n @Input() instanceState!: DO_OfficeInstanceState_Interface;\n\n /** Szerkesztő bezárása. */\n @Output() close: EventEmitter<void> = new EventEmitter<void>();\n\n /** Szerkesztett vizuál másolat (közvetlen módosításhoz). */\n editVisuals!: DO_CharacterVisuals_Response;\n\n /** Enum referenciák a template-hez. */\n readonly hairType = DO_HairStyle_Type;\n readonly clothingType = DO_ClothingStyle_Type;\n readonly charType = DO_CharacterType_Type;\n readonly bodyType = DO_BodyType_Type;\n\n readonly skinColors: string[] = DO_SKIN_COLORS;\n readonly hairColors: string[] = DO_HAIR_COLORS;\n readonly shirtColors: string[] = DO_SHIRT_COLORS;\n readonly pantsColors: string[] = DO_PANTS_COLORS;\n readonly eyeColors: string[] = DO_EYE_COLORS;\n\n readonly hairStyles: DO_HairStyle_Type[] = [\n DO_HairStyle_Type.short,\n DO_HairStyle_Type.long,\n DO_HairStyle_Type.spiky,\n DO_HairStyle_Type.curly,\n DO_HairStyle_Type.mohawk,\n DO_HairStyle_Type.bald,\n ];\n\n readonly clothingStyles: DO_ClothingStyle_Type[] = [\n DO_ClothingStyle_Type.casual,\n DO_ClothingStyle_Type.formal,\n DO_ClothingStyle_Type.hoodie,\n DO_ClothingStyle_Type.tshirt,\n ];\n\n readonly bodyTypes: DO_BodyType_Type[] = [\n DO_BodyType_Type.average,\n DO_BodyType_Type.slim,\n DO_BodyType_Type.stocky,\n DO_BodyType_Type.athletic,\n ];\n\n readonly hairStyleLabels: Record<DO_HairStyle_Type, string> = {\n [DO_HairStyle_Type.short]: 'Rövid',\n [DO_HairStyle_Type.long]: 'Hosszú',\n [DO_HairStyle_Type.spiky]: 'Tüskés',\n [DO_HairStyle_Type.curly]: 'Göndör',\n [DO_HairStyle_Type.mohawk]: 'Mohikán',\n [DO_HairStyle_Type.bald]: 'Kopasz',\n };\n\n readonly clothingStyleLabels: Record<DO_ClothingStyle_Type, string> = {\n [DO_ClothingStyle_Type.casual]: 'Casual',\n [DO_ClothingStyle_Type.formal]: 'Öltöny',\n [DO_ClothingStyle_Type.hoodie]: 'Hoodie',\n [DO_ClothingStyle_Type.tshirt]: 'Póló',\n };\n\n readonly bodyTypeLabels: Record<DO_BodyType_Type, string> = {\n [DO_BodyType_Type.average]: 'Átlagos',\n [DO_BodyType_Type.slim]: 'Vékony',\n [DO_BodyType_Type.stocky]: 'Tömzsi',\n [DO_BodyType_Type.athletic]: 'Atlétikus',\n };\n\n private readonly darkOffice_DS: DarkOffice_DataService =\n inject(DarkOffice_DataService);\n\n ngOnInit(): void {\n this.editVisuals = { ...this.instanceState.visuals };\n }\n\n /**\n * Szín vagy stílus módosítása: közvetlen mentés.\n */\n applyChange(field: keyof DO_CharacterVisuals_Response, value: string): void {\n this.editVisuals = { ...this.editVisuals, [field]: value };\n this.darkOffice_DS.saveVisuals(this.instanceState.instanceId, { ...this.editVisuals });\n }\n\n /**\n * Megjelenítési név mentése.\n */\n handleDisplayNameChange(name: string): void {\n this.editVisuals.displayName = name;\n this.darkOffice_DS.saveVisuals(this.instanceState.instanceId, { ...this.editVisuals });\n }\n\n /**\n * Szerkesztő bezárása.\n */\n handleClose(): void {\n this.close.emit();\n }\n}\n", "<div class=\"do-editor-layout\">\n\n <app-do-character-preview\n variant=\"editor\"\n [visuals]=\"editVisuals\"\n [characterType]=\"instanceState.characterType ?? charType.ccap\"\n [instanceId]=\"instanceState.instanceId\">\n </app-do-character-preview>\n\n <!-- Jobb oldal: beállítások -->\n <div class=\"do-settings-col\">\n\n <!-- Megjelenítési név -->\n <div class=\"do-editor-section\">\n <label class=\"do-editor-label\">Megjelenítési név</label>\n <input type=\"text\"\n class=\"do-editor-input\"\n [value]=\"editVisuals.displayName\"\n placeholder=\"Név…\"\n maxlength=\"20\"\n (input)=\"handleDisplayNameChange($any($event.target).value)\" />\n </div>\n\n <!-- Bőrszín -->\n <div class=\"do-editor-section\">\n <label class=\"do-editor-label\">Bőrszín</label>\n <div class=\"do-color-row\">\n @for (color of skinColors; track color) {\n <button type=\"button\"\n class=\"do-color-swatch\"\n [class.do-color-swatch--active]=\"editVisuals.skinColor === color\"\n [style.background]=\"color\"\n [attr.title]=\"color\"\n (click)=\"applyChange('skinColor', color)\">\n </button>\n }\n </div>\n </div>\n\n <!-- Hajszín -->\n <div class=\"do-editor-section\">\n <label class=\"do-editor-label\">Hajszín</label>\n <div class=\"do-color-row\">\n @for (color of hairColors; track color) {\n <button type=\"button\"\n class=\"do-color-swatch\"\n [class.do-color-swatch--active]=\"editVisuals.hairColor === color\"\n [style.background]=\"color\"\n [attr.title]=\"color\"\n (click)=\"applyChange('hairColor', color)\">\n </button>\n }\n </div>\n </div>\n\n <!-- Hajstílus -->\n <div class=\"do-editor-section\">\n <label class=\"do-editor-label\">Hajstílus</label>\n <div class=\"do-style-row\">\n @for (style of hairStyles; track style) {\n <button type=\"button\"\n class=\"do-style-btn\"\n [class.do-style-btn--active]=\"editVisuals.hairStyle === style\"\n (click)=\"applyChange('hairStyle', style)\">\n {{ hairStyleLabels[style] }}\n </button>\n }\n </div>\n </div>\n\n <!-- Ingszín -->\n <div class=\"do-editor-section\">\n <label class=\"do-editor-label\">Felsőruha szín</label>\n <div class=\"do-color-row\">\n @for (color of shirtColors; track color) {\n <button type=\"button\"\n class=\"do-color-swatch\"\n [class.do-color-swatch--active]=\"editVisuals.shirtColor === color\"\n [style.background]=\"color\"\n [attr.title]=\"color\"\n (click)=\"applyChange('shirtColor', color)\">\n </button>\n }\n </div>\n </div>\n\n <!-- Ing stílus -->\n <div class=\"do-editor-section\">\n <label class=\"do-editor-label\">Ruha stílus</label>\n <div class=\"do-style-row\">\n @for (style of clothingStyles; track style) {\n <button type=\"button\"\n class=\"do-style-btn\"\n [class.do-style-btn--active]=\"editVisuals.clothingStyle === style\"\n (click)=\"applyChange('clothingStyle', style)\">\n {{ clothingStyleLabels[style] }}\n </button>\n }\n </div>\n </div>\n\n <!-- Testtípus -->\n <div class=\"do-editor-section\">\n <label class=\"do-editor-label\">Testtípus</label>\n <div class=\"do-style-row\">\n @for (type of bodyTypes; track type) {\n <button type=\"button\"\n class=\"do-style-btn\"\n [class.do-style-btn--active]=\"editVisuals.bodyType === type\"\n (click)=\"applyChange('bodyType', type)\">\n {{ bodyTypeLabels[type] }}\n </button>\n }\n </div>\n </div>\n\n <!-- Nadrágszín -->\n <div class=\"do-editor-section\">\n <label class=\"do-editor-label\">Nadrágszín</label>\n <div class=\"do-color-row\">\n @for (color of pantsColors; track color) {\n <button type=\"button\"\n class=\"do-color-swatch\"\n [class.do-color-swatch--active]=\"editVisuals.pantsColor === color\"\n [style.background]=\"color\"\n [attr.title]=\"color\"\n (click)=\"applyChange('pantsColor', color)\">\n </button>\n }\n </div>\n </div>\n\n <!-- Szemszín -->\n <div class=\"do-editor-section\">\n <label class=\"do-editor-label\">Szemszín</label>\n <div class=\"do-color-row\">\n @for (color of eyeColors; track color) {\n <button type=\"button\"\n class=\"do-color-swatch\"\n [class.do-color-swatch--active]=\"editVisuals.eyeColor === color\"\n [style.background]=\"color\"\n [attr.title]=\"color\"\n (click)=\"applyChange('eyeColor', color)\">\n </button>\n }\n </div>\n </div>\n\n </div>\n</div>\n", "import { Component, computed, effect, EventEmitter, inject, input, InputSignal, OnDestroy, Output, Signal } from '@angular/core';\n\nimport {\n Session_DataService,\n} from '../../../session/_services/data-services/session.data-service';\nimport { DO_CharacterType_Type } from '../../../../_enums/dark-office/do-character-type.enum';\n\n/**\n * Dark Office chat popup (REQ-DO-BUBBLE-CLICK-POPUP-001).\n *\n * A gondolat buborékra kattintva megnyíló unified `s-modal`-os overlay. CCAP session esetén\n * az utolsó üzeneteket mutatja a `Session_DataService`-ből; CC/OC/CA session esetén csak\n * a type-aware „Open full view\" link látszik (inline detail-komponens-embed Slice 2b\n * follow-up — a routed detail komponensek input-driven refaktort igényelnek). A header\n * és close-flow a shared `S_Modal_Component`-ből származik (Escape / backdrop / X).\n */\n@Component({\n selector: 'app-do-chat-popup',\n templateUrl: './do-chat-popup.component.html',\n styleUrl: './do-chat-popup.component.scss',\n})\n/** DO_ChatPopup_Component class. */\nexport class DO_ChatPopup_Component implements OnDestroy {\n\n /** Session azonosító amelynek üzeneteit mutatjuk. */\n readonly sessionId: InputSignal<string> = input<string>('');\n\n /** Session típus a type-aware route + detail-komponens kiválasztáshoz. */\n readonly sessionType: InputSignal<DO_CharacterType_Type | null> = input<DO_CharacterType_Type | null>(null);\n\n /** Popup bezárása. */\n @Output() close: EventEmitter<void> = new EventEmitter<void>();\n\n readonly session_DS: Session_DataService = inject(Session_DataService);\n\n /** Template-ben enum összehasonlításhoz. */\n readonly charType: typeof DO_CharacterType_Type = DO_CharacterType_Type;\n\n /**\n * Type-aware „Open full view\" route. CCAP session → `/session/:id`; CC → `/cc-session/:id`;\n * OC → `/oc-session/:id`; CA → `/ca-session/:id`. Ismeretlen típus → CCAP fallback.\n */\n readonly fullViewRoute_$: Signal<string> = computed((): string => {\n const id: string = this.sessionId();\n if (!id) {\n return '';\n }\n switch (this.sessionType()) {\n case DO_CharacterType_Type.ccSession:\n return `/cc-session/${id}`;\n case DO_CharacterType_Type.openclaw:\n return `/oc-session/${id}`;\n case DO_CharacterType_Type.caSession:\n return `/ca-session/${id}`;\n default:\n return `/session/${id}`;\n }\n });\n\n /** Inline üzenetlista csak CCAP session-höz mutatható (a többi típus a saját rendert kéri). */\n readonly showInlineMessages_$: Signal<boolean> = computed((): boolean => {\n const t: DO_CharacterType_Type | null = this.sessionType();\n return t === DO_CharacterType_Type.ccap || t === null;\n });\n\n constructor() {\n // sessionId / showInlineMessages változására CCAP üzenetek lekérése.\n effect((): void => {\n const id: string = this.sessionId();\n const inline: boolean = this.showInlineMessages_$();\n if (id && inline) {\n void this.session_DS.loadInitialChunk({ sessionId: id });\n }\n });\n }\n\n ngOnDestroy(): void {\n // Üzenetek jelzése törlése, hogy a következő megnyitáskor frissen töltse.\n this.session_DS.clearMessages();\n }\n\n /** Bezárás (s-modal `closed` output) — parent „close\" event-en keresztül. */\n handleClose(): void {\n this.close.emit();\n }\n}\n", "<!--\n REQ-DO-BUBBLE-CLICK-POPUP-001 — unified s-modal wrapper a Dark Office bubble-click flow-hoz.\n Title: „Legutolsó csevegés\". Body első blokk: session-id rövidítve + type-aware „Open full\n view\" link. CCAP-ra inline üzenetek; egyéb session-típusokra csak a típus-cimke.\n Close: s-modal Escape / backdrop / X.\n-->\n<app-s-modal [isOpen]=\"!!sessionId()\"\n title=\"Legutolsó csevegés\"\n maxWidth=\"2xl\"\n zIndex=\"50\"\n (closed)=\"handleClose()\">\n\n <!-- Session-id + type-aware route link (header alá kerül a body tetejére) -->\n <div class=\"do-popup-session-meta\">\n <span class=\"do-popup-session-id\">{{ sessionId() | slice:0:16 }}…</span>\n @if (fullViewRoute_$()) {\n <a [href]=\"fullViewRoute_$()\" target=\"_blank\" class=\"do-popup-open-link\">\n Teljes nézet ↗\n </a>\n }\n </div>\n\n <div class=\"do-popup-messages\">\n\n @if (!showInlineMessages_$()) {\n <!-- Nem-CCAP session: csak típus-cimke + link, inline üzenet-render Slice 2b follow-up. -->\n <div class=\"do-popup-typed-cta\">\n @switch (sessionType()) {\n @case (charType.ccSession) { <span>Claude Code session</span> }\n @case (charType.openclaw) { <span>OpenClaw session</span> }\n @case (charType.caSession) { <span>Cursor ACP session</span> }\n @default { <span>Session</span> }\n }\n </div>\n }\n\n @if (showInlineMessages_$()) {\n\n @if (session_DS.messagesLoading_$() && !session_DS.messages_$().length) {\n <div class=\"do-popup-loading\">\n <span class=\"do-popup-loading-dot\"></span>\n <span>Üzenetek betöltése…</span>\n </div>\n }\n\n @if (session_DS.messagesLoadError_$()) {\n <div class=\"do-popup-error\">\n Üzenetek betöltése sikertelen.\n </div>\n }\n\n @for (msg of session_DS.messages_$(); track msg.clientListKey) {\n <div class=\"do-msg\"\n [class.do-msg--user]=\"msg.role === 'user'\"\n [class.do-msg--assistant]=\"msg.role === 'assistant'\"\n [class.do-msg--system]=\"msg.role === 'system' || msg.role === 'tool'\">\n\n <span class=\"do-msg-role\">\n @if (msg.role === 'user') { Én }\n @else if (msg.role === 'assistant') { Agent }\n @else { Rendszer }\n </span>\n\n <div class=\"do-msg-content\">{{ msg.content }}</div>\n </div>\n }\n\n @if (!session_DS.messages_$().length && !session_DS.messagesLoading_$() && !session_DS.messagesLoadError_$()) {\n <div class=\"do-popup-empty\">Nincs üzenet ebben a session-ben.</div>\n }\n\n }\n </div>\n</app-s-modal>\n", "import { Component, inject, input, InputSignal, output, OutputEmitterRef, signal } from '@angular/core';\n\nimport { DO_Presence_Type } from '../../../../_enums/dark-office/ccap-dark-office-presence.enum';\nimport { DO_OfficeInstanceState_Interface } from '../../../../_models/interfaces/dark-office/do-office-instance-state.interface';\nimport { Shr_LocalStoragePersistence_Util } from '../../../shared/_collections/utils/storage/shr-local-storage-persistence.util';\nimport { DarkOffice_DataService } from '../../_services/dark-office.data-service';\n\n/** localStorage kulcs a collapsed-állapot perzisztáláshoz (REQ-DO-COLLAPSE-001). */\nconst DO_INSTANCE_PANEL_COLLAPSED_STORAGE_KEY: string = 'ccap-do-instance-panel-collapsed';\n\n/** localStorage kulcs a per-instance Sessions sub-card collapsed-állapot perzisztáláshoz (REQ-DO-002). */\nconst DO_INSTANCE_SESSIONS_COLLAPSED_STORAGE_KEY: string = 'ccap-do-instance-sessions-collapsed';\n\n/**\n * Dark Office bal oldali instance panel overlay.\n *\n * ## Felelősség\n * Megjelenít egy lebegő panelt a jelenet bal szélén, ahol egymás alatt\n * sorakoznak az instance-ok: mini karakter fej (SVG), név, presence státusz\n * pont és utolsó üzenet / activity összefoglaló.\n *\n * ## Interakció\n * - **Kattintás:** instance státusz részletező modal megnyitása (`DarkOffice_DataService`)\n * - **Dupla kattintás:** vizuál editor megnyitása (instanceClick output)\n */\n@Component({\n selector: 'app-do-instance-panel',\n templateUrl: './do-instance-panel.component.html',\n styleUrl: './do-instance-panel.component.scss',\n})\n/** DO_InstancePanel_Component class. */\nexport class DO_InstancePanel_Component {\n\n /** Megjelenítendő instance-ok listája. */\n readonly instances: InputSignal<DO_OfficeInstanceState_Interface[]> = input.required();\n\n /** Instance dupla kattintás esemény — vizuál editor megnyitás (instanceId-t emitál). */\n readonly instanceClick: OutputEmitterRef<string> = output();\n\n readonly darkOffice_DS: DarkOffice_DataService = inject(DarkOffice_DataService);\n\n /** Enum referenciák a template-hez (presence → panel szegély / háttér osztályok). */\n readonly presenceType = DO_Presence_Type;\n\n /**\n * Panel collapsed-állapot (REQ-DO-COLLAPSE-001).\n * Ha true, csak a header sor látható az instance-listával együtt rejtve. localStorage-ba\n * perzisztálódik, hogy egy oldal-újratöltésen át megmaradjon.\n */\n readonly isCollapsed_$ = signal<boolean>(DO_InstancePanel_Component.readCollapsedFromStorage());\n\n /**\n * Per-instance Sessions sub-card collapsed-állapot (REQ-DO-002).\n *\n * Map: `instanceId → collapsed?`. Hiányzó kulcs default-érték: **true** (collapsed),\n * hogy a panel kompakt maradjon, és csak az érdeklődő user nyissa ki a header-toggle-lel.\n * localStorage JSON map-ként perzisztálódik a `DO_INSTANCE_SESSIONS_COLLAPSED_STORAGE_KEY`\n * kulcson.\n */\n readonly sessionsCollapsedByInstance_$ = signal<Record<string, boolean | undefined>>(\n DO_InstancePanel_Component.readSessionsCollapsedMapFromStorage(),\n );\n\n /** Header gomb kattintásra: toggle collapsed-állapot + storage írás. */\n handleToggleCollapsed(): void {\n const next: boolean = !this.isCollapsed_$();\n this.isCollapsed_$.set(next);\n DO_InstancePanel_Component.writeCollapsedToStorage(next);\n }\n\n /**\n * Per-instance Sessions sub-card header kattintás (REQ-DO-002): toggle + per-instance storage.\n *\n * Hiányzó kulcs default-értéke `true` (collapsed); első toggle expand-ra megy. A `next` map\n * teljes shallow copy, hogy a signal write triggerelje a re-rendert.\n */\n handleToggleInstanceSessions(instanceId: string): void {\n const current: Record<string, boolean | undefined> = this.sessionsCollapsedByInstance_$();\n const isCurrentlyCollapsed: boolean = current[instanceId] ?? true;\n const next: Record<string, boolean | undefined> = { ...current, [instanceId]: !isCurrentlyCollapsed };\n this.sessionsCollapsedByInstance_$.set(next);\n DO_InstancePanel_Component.writeSessionsCollapsedMapToStorage(next);\n }\n\n /**\n * Böngészőből kiolvassa a panel collapsed-állapotát (default: false = nyitott).\n *\n * REQ-UI-MENU-STATE-001 (cycle 463): top-level function → private static method\n * (CLAUDE.md compliance); a `localStorage.getItem === 'true'` minta a shared\n * `Shr_LocalStoragePersistence_Util.readString === 'true'`-on megy. A\n * default false (`null === 'true'` → false) változatlan.\n */\n private static readCollapsedFromStorage(): boolean {\n return Shr_LocalStoragePersistence_Util.readString(DO_INSTANCE_PANEL_COLLAPSED_STORAGE_KEY) === 'true';\n }\n\n /**\n * Perzisztálja a panel collapsed-állapotát (REQ-DO-COLLAPSE-001).\n *\n * REQ-UI-MENU-STATE-001 (cycle 463): top-level function → private static method.\n * A `localStorage.setItem(KEY, String(collapsed))` most a shared\n * `Shr_LocalStoragePersistence_Util.writeString(KEY, String(collapsed))`-on\n * megy. Szándékosan writeString(String(value)) NEM writeBoolean — a meglévő\n * spec assertion (`localStorage.getItem === 'true'`) + on-disk format\n * megőrzéséhez.\n */\n private static writeCollapsedToStorage(collapsed: boolean): void {\n Shr_LocalStoragePersistence_Util.writeString(DO_INSTANCE_PANEL_COLLAPSED_STORAGE_KEY, String(collapsed));\n }\n\n /**\n * Per-instance Sessions sub-card collapsed-map kiolvasása (REQ-DO-002).\n *\n * JSON-parse a `localStorage`-ből. Hibás vagy hiányzó érték → üres map (`{}`), így a\n * default-érték (collapsed=true) érvényesül minden ismeretlen instance-ra.\n */\n private static readSessionsCollapsedMapFromStorage(): Record<string, boolean | undefined> {\n const raw: string | null =\n Shr_LocalStoragePersistence_Util.readString(DO_INSTANCE_SESSIONS_COLLAPSED_STORAGE_KEY);\n if (!raw) {\n return {};\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, boolean | undefined>;\n }\n return {};\n } catch {\n return {};\n }\n }\n\n /**\n * Per-instance Sessions sub-card collapsed-map perzisztálása (REQ-DO-002).\n * JSON-stringify-olva tárolja a teljes mappet egyetlen storage kulcson.\n */\n private static writeSessionsCollapsedMapToStorage(map: Record<string, boolean | undefined>): void {\n Shr_LocalStoragePersistence_Util.writeString(\n DO_INSTANCE_SESSIONS_COLLAPSED_STORAGE_KEY,\n JSON.stringify(map),\n );\n }\n\n /**\n * Panel megosztott `<defs>` — `<linearGradient>` id (egyezés: template `do-instance-panel.component.html`).\n */\n readonly panelAvatarGradientElementId: string = 'doLightVertDoPanel';\n\n /**\n * Panel megosztott `<defs>` — `<filter>` id (avatar csoport `filter=\"url(#…)\"`).\n */\n readonly panelAvatarFilterElementId: string = 'doCharEffectDoPanel';\n\n /**\n * Egyszeres kattintás — státusz részletező modal (overlay helyett központi popup).\n */\n handleInstanceClick(instanceId: string): void {\n this.darkOffice_DS.openInstanceStatusDetail(instanceId);\n }\n\n /**\n * Dupla kattintás — vizuál editor megnyitás (szülőnek delegáljuk).\n * Az egyszeres kattintások előbb megnyithatták a státusz modalt — azt itt zárjuk.\n */\n handleInstanceDblClick(instanceId: string): void {\n this.darkOffice_DS.closeInstanceStatusDetail();\n this.instanceClick.emit(instanceId);\n }\n}\n", "<!--\n Megosztott defs: egyedi id-k — a fő do-office-scene SVG <defs> id-i ütköznének\n ugyanazon dokumentumban (globális id namespace).\n-->\n<svg class=\"do-panel-shared-defs\" aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <linearGradient id=\"doLightVertDoPanel\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"white\" stop-opacity=\"0.10\"/>\n <stop offset=\"50%\" stop-color=\"white\" stop-opacity=\"0\"/>\n <stop offset=\"100%\" stop-color=\"black\" stop-opacity=\"0.08\"/>\n </linearGradient>\n <filter id=\"doCharEffectDoPanel\" x=\"-30%\" y=\"-20%\" width=\"160%\" height=\"150%\">\n <feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"1.5\" result=\"shadow\"/>\n <feOffset dx=\"1\" dy=\"2\" in=\"shadow\" result=\"offsetShadow\"/>\n <feFlood flood-color=\"#050510\" flood-opacity=\"0.4\" result=\"shadowColor\"/>\n <feComposite in=\"shadowColor\" in2=\"offsetShadow\" operator=\"in\" result=\"coloredShadow\"/>\n <feMorphology operator=\"dilate\" radius=\"0.3\" in=\"SourceAlpha\" result=\"expanded\"/>\n <feGaussianBlur stdDeviation=\"1.2\" in=\"expanded\" result=\"rimBlur\"/>\n <feFlood flood-color=\"#00e5ff\" flood-opacity=\"0.12\" result=\"rimColor\"/>\n <feComposite in=\"rimColor\" in2=\"rimBlur\" operator=\"in\" result=\"rimGlow\"/>\n <feMerge>\n <feMergeNode in=\"coloredShadow\"/>\n <feMergeNode in=\"rimGlow\"/>\n <feMergeNode in=\"SourceGraphic\"/>\n </feMerge>\n </filter>\n </defs>\n</svg>\n\n<!-- REQ-DO-COLLAPSE-001: kollabálható header — csukva csak a fejlec látszik. -->\n<div class=\"do-panel-header\"\n (click)=\"handleToggleCollapsed()\"\n (mousedown)=\"$event.stopPropagation()\"\n [attr.role]=\"'button'\"\n [attr.aria-expanded]=\"!isCollapsed_$()\"\n [attr.title]=\"isCollapsed_$() ? 'Instance lista kibontása' : 'Instance lista becsukása'\">\n <span class=\"do-panel-header-icon\" aria-hidden=\"true\">\n @if (isCollapsed_$()) { ▸ } @else { ▾ }\n </span>\n <span class=\"do-panel-header-label\">\n Instances ({{ instances().length }})\n </span>\n</div>\n\n<!-- Instance kártyák (lebegő, egyenként hátteres) — REQ-DO-COLLAPSE-001: collapsed alatt rejtve. -->\n@if (!isCollapsed_$()) {\n@for (instance of instances(); track instance.instanceId) {\n <div class=\"do-panel-item\"\n [class.do-panel-item--working]=\"instance.presence === presenceType.working\"\n [class.do-panel-item--idle]=\"instance.presence === presenceType.idle\"\n [class.do-panel-item--offline]=\"instance.presence === presenceType.offline\"\n (click)=\"handleInstanceClick(instance.instanceId)\"\n (dblclick)=\"handleInstanceDblClick(instance.instanceId)\">\n\n <!-- Összefoglaló sor (mindig látható) -->\n <div class=\"do-panel-row\">\n <!-- Mini fej: ugyanazok a part komponensek mint do-svg-char (arc mindig látszik) -->\n <div class=\"do-panel-avatar\">\n <svg viewBox=\"8 -6 24 26\"\n class=\"do-panel-avatar-svg\"\n overflow=\"hidden\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g [attr.filter]=\"'url(#' + panelAvatarFilterElementId + ')'\">\n <!-- Belső koordináta-rendszer egyeztetése a scene do-svg-char testével -->\n <g transform=\"scale(0.8) translate(-20, -68)\">\n <g app-do-char-neck-head\n [skinColor]=\"instance.visuals.skinColor\"\n [headLightGradientElementId]=\"panelAvatarGradientElementId\"></g>\n <g app-do-char-face [eyeColor]=\"instance.visuals.eyeColor\"></g>\n <g app-do-char-hair\n [hairColor]=\"instance.visuals.hairColor\"\n [hairStyle]=\"instance.visuals.hairStyle\"></g>\n </g>\n </g>\n </svg>\n\n <!-- Presence státusz pont -->\n <span class=\"do-panel-status-dot\"></span>\n </div>\n\n <!-- Név, activity, last message, derived label (template: nincs formatter hívás) -->\n <div class=\"do-panel-info\">\n <span class=\"do-panel-name\">\n {{ instance.visuals.displayName || instance.instanceId }}\n </span>\n <span class=\"do-panel-summary\">{{ instance.activitySummary }}</span>\n @if (instance.lastMessage) {\n <span class=\"do-panel-last-msg\">{{ instance.lastMessage }}</span>\n }\n @if (instance.lastMessageDerivedStatusLabel) {\n <span class=\"do-panel-derived\">{{ instance.lastMessageDerivedStatusLabel }}</span>\n }\n </div>\n </div>\n\n @if (instance.panelActiveSessionRows.length > 0) {\n @let sessionsCollapsedMap = sessionsCollapsedByInstance_$();\n @let isSessionsCollapsed = (sessionsCollapsedMap[instance.instanceId] ?? true);\n <!-- REQ-DO-002 Sessions sub-card: header-toggle-vel kollabolható extra kártya. -->\n <div class=\"do-panel-active-sessions\"\n [class.do-panel-active-sessions--collapsed]=\"isSessionsCollapsed\"\n (click)=\"$event.stopPropagation()\">\n <button type=\"button\"\n class=\"do-panel-active-sessions-header\"\n (click)=\"handleToggleInstanceSessions(instance.instanceId)\"\n [attr.aria-expanded]=\"!isSessionsCollapsed\"\n [attr.aria-label]=\"isSessionsCollapsed ? 'Aktív sessionök kibontása' : 'Aktív sessionök becsukása'\">\n <span class=\"do-panel-active-sessions-title\">\n Active sessions ({{ instance.panelActiveSessionRows.length }})\n </span>\n <span class=\"do-panel-active-sessions-toggle\" aria-hidden=\"true\">\n {{ isSessionsCollapsed ? '▸' : '▾' }}\n </span>\n </button>\n @if (!isSessionsCollapsed) {\n <div class=\"do-panel-active-sessions-body\">\n @for (activeRow of instance.panelActiveSessionRows; track activeRow.sessionId) {\n <div class=\"do-panel-active-row\">\n <div class=\"do-panel-active-row-head\">\n <span class=\"do-panel-active-row-label\">{{ activeRow.displayLabel }}</span>\n @switch (activeRow.presence) {\n @case (presenceType.working) {\n <span class=\"do-panel-active-pill do-panel-active-pill--working\">Working</span>\n }\n @case (presenceType.idle) {\n <span class=\"do-panel-active-pill do-panel-active-pill--idle\">Idle</span>\n }\n @case (presenceType.offline) {\n <span class=\"do-panel-active-pill do-panel-active-pill--offline\">Offline</span>\n }\n }\n </div>\n <span class=\"do-panel-active-summary\">{{ activeRow.activitySummary }}</span>\n @if (activeRow.lastMessagePreview) {\n <span class=\"do-panel-active-msg\">{{ activeRow.lastMessagePreview }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n}\n}\n\n", "import { DO_Presence_Type } from '../../../../_enums/dark-office/ccap-dark-office-presence.enum';\nimport { DO_BodyType_Type } from '../../../../_enums/dark-office/do-body-type.enum';\nimport { DO_CharacterAnim_Type } from '../../../../_enums/dark-office/do-character-anim.enum';\nimport { DO_CharacterType_Type } from '../../../../_enums/dark-office/do-character-type.enum';\nimport { DO_ClothingStyle_Type } from '../../../../_enums/dark-office/do-clothing-style.enum';\nimport { DO_HairStyle_Type } from '../../../../_enums/dark-office/do-hair-style.enum';\nimport { ExS_InstanceDataStatus_Type } from '../../../external-sessions/_enums/exs-instance-data-status.enum';\nimport { Oc_iConnectionStatus_Type } from '../../../external-sessions/_modules/openclaw/_enums/oc-oci-connection-status.enum';\nimport { AC_RunFlowPhase_Type } from '../../../../_enums/run-session/ccap-run-flow-phase.enum';\n\n/**\n * Dark Office instance státusz modal — enum és primitív mezők megjelenítési stringjei.\n * A template-ben nem hívunk formatter metódusokat; a komponens `computed()` ezeket hívja.\n */\nexport class DO_InstanceStatusDetailDisplay_Util {\n\n /**\n * Opcionális szöveg normalizálása üres stringre.\n */\n static formatOptional(value: string | null | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n return value;\n }\n\n /**\n * Presence enum megjelenítése.\n */\n static formatPresence(presence: DO_Presence_Type): string {\n switch (presence) {\n case DO_Presence_Type.working:\n return 'Working';\n case DO_Presence_Type.idle:\n return 'Idle';\n case DO_Presence_Type.offline:\n return 'Offline';\n default:\n return String(presence);\n }\n }\n\n /**\n * OCI gateway connection status megjelenítése.\n */\n static formatConnectionStatus(\n status: Oc_iConnectionStatus_Type | null | undefined,\n ): string {\n if (status === null || status === undefined) {\n return '';\n }\n switch (status) {\n case Oc_iConnectionStatus_Type.connected:\n return 'Connected';\n case Oc_iConnectionStatus_Type.disconnected:\n return 'Disconnected';\n case Oc_iConnectionStatus_Type.error:\n return 'Error';\n case Oc_iConnectionStatus_Type.unreachable:\n return 'Unreachable';\n default:\n return String(status);\n }\n }\n\n /**\n * CCAP instance-data `status` mező megjelenítése.\n */\n static formatInstanceDataStatus(status: ExS_InstanceDataStatus_Type): string {\n switch (status) {\n case ExS_InstanceDataStatus_Type.active:\n return 'active';\n case ExS_InstanceDataStatus_Type.inactive:\n return 'inactive';\n case ExS_InstanceDataStatus_Type.maintenance:\n return 'maintenance';\n default:\n return String(status);\n }\n }\n\n /**\n * Karakter típus (CCAP vs OpenClaw) megjelenítése.\n */\n static formatCharacterType(type: DO_CharacterType_Type | undefined): string {\n if (type === DO_CharacterType_Type.openclaw) {\n return 'OpenClaw';\n }\n if (type === DO_CharacterType_Type.ccSession) {\n return 'CC Session instance';\n }\n if (type === DO_CharacterType_Type.caSession) {\n return 'CA Session instance';\n }\n return 'CCAP';\n }\n\n /**\n * Dark Office animáció állapot megjelenítése.\n */\n static formatAnimState(anim: DO_CharacterAnim_Type): string {\n switch (anim) {\n case DO_CharacterAnim_Type.standing:\n return 'standing';\n case DO_CharacterAnim_Type.working:\n return 'working';\n case DO_CharacterAnim_Type.sitting:\n return 'sitting';\n case DO_CharacterAnim_Type.walkingIn:\n return 'walking-in';\n case DO_CharacterAnim_Type.walkingOut:\n return 'walking-out';\n case DO_CharacterAnim_Type.walkingBetween:\n return 'walking-between';\n default:\n return String(anim);\n }\n }\n\n /**\n * Hajstílus enum megjelenítése (kebab-case value).\n */\n static formatHairStyle(style: DO_HairStyle_Type): string {\n return String(style);\n }\n\n /**\n * Hajstílus opcionális (részleges szerver payload).\n */\n static formatHairStyleOptional(style: DO_HairStyle_Type | undefined): string {\n if (style === undefined) {\n return '—';\n }\n return String(style);\n }\n\n /**\n * Ruha stílus enum megjelenítése.\n */\n static formatClothingStyle(style: DO_ClothingStyle_Type): string {\n return String(style);\n }\n\n /**\n * Ruha stílus opcionális (részleges szerver payload).\n */\n static formatClothingStyleOptional(style: DO_ClothingStyle_Type | undefined): string {\n if (style === undefined) {\n return '—';\n }\n return String(style);\n }\n\n /**\n * Testtípus enum megjelenítése.\n */\n static formatBodyType(body: DO_BodyType_Type): string {\n return String(body);\n }\n\n /**\n * Testtípus a szerver snapshot részleges `darkOfficeVisuals` mezőjéhez (hiány → em dash).\n */\n static formatBodyTypeOptional(body: DO_BodyType_Type | undefined): string {\n if (body === undefined) {\n return '—';\n }\n return String(body);\n }\n\n /**\n * Valószínű CSS hex szín (#rgb / #rrggbb / alpha variánsok) — swatch megjelenítéshez.\n */\n static looksLikeHexCssColor(value: string): boolean {\n const t: string = value.trim();\n return /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(t);\n }\n\n /**\n * Presence pill BEM módosító (pl. `do-status-pill--presence-working`).\n */\n static presenceBadgeModifier(presence: DO_Presence_Type): string {\n switch (presence) {\n case DO_Presence_Type.working:\n return 'working';\n case DO_Presence_Type.idle:\n return 'idle';\n case DO_Presence_Type.offline:\n return 'offline';\n default:\n return 'unknown';\n }\n }\n\n /**\n * Gateway connection pill módosító.\n */\n static connectionBadgeModifier(\n status: Oc_iConnectionStatus_Type | null | undefined,\n ): string {\n if (status === null || status === undefined) {\n return 'none';\n }\n switch (status) {\n case Oc_iConnectionStatus_Type.connected:\n return 'connected';\n case Oc_iConnectionStatus_Type.disconnected:\n return 'disconnected';\n case Oc_iConnectionStatus_Type.error:\n return 'error';\n case Oc_iConnectionStatus_Type.unreachable:\n return 'unreachable';\n default:\n return 'unknown';\n }\n }\n\n /**\n * CCAP instance-data üzemi `status` pill módosító.\n */\n static instanceDataStatusBadgeModifier(status: ExS_InstanceDataStatus_Type): string {\n switch (status) {\n case ExS_InstanceDataStatus_Type.active:\n return 'active';\n case ExS_InstanceDataStatus_Type.inactive:\n return 'inactive';\n case ExS_InstanceDataStatus_Type.maintenance:\n return 'maintenance';\n default:\n return 'unknown';\n }\n }\n\n /**\n * Karakter típus pill módosító.\n */\n static characterTypeBadgeModifier(type: DO_CharacterType_Type | undefined): string {\n if (type === DO_CharacterType_Type.openclaw) {\n return 'openclaw';\n }\n if (type === DO_CharacterType_Type.ccSession) {\n return 'ccSession';\n }\n if (type === DO_CharacterType_Type.caSession) {\n return 'caSession';\n }\n return 'ccap';\n }\n\n /**\n * Anim állapot pill módosító (finomabb vizuál).\n */\n static animBadgeModifier(anim: DO_CharacterAnim_Type): string {\n switch (anim) {\n case DO_CharacterAnim_Type.working:\n return 'working';\n case DO_CharacterAnim_Type.sitting:\n case DO_CharacterAnim_Type.standing:\n return 'idlePose';\n case DO_CharacterAnim_Type.walkingIn:\n case DO_CharacterAnim_Type.walkingOut:\n case DO_CharacterAnim_Type.walkingBetween:\n return 'transit';\n default:\n return 'unknown';\n }\n }\n\n /**\n * Run-flow phase megjelenítése (technical value).\n */\n static formatRunPhase(phase: AC_RunFlowPhase_Type | undefined): string {\n if (phase === undefined) {\n return '';\n }\n return String(phase);\n }\n\n /**\n * Boolean megjelenítése.\n */\n static formatBoolean(value: boolean): string {\n return value ? 'true' : 'false';\n }\n}\n", "import { Component, computed, inject } from '@angular/core';\n\nimport { DO_CaiOfficeInstanceId_Util } from '../../_collections/utils/do-cai-office-instance-id.util';\nimport { DO_CciOfficeInstanceId_Util } from '../../_collections/utils/do-cci-office-instance-id.util';\nimport { DO_InstanceStatusDetailDisplay_Util } from '../../_collections/instance-status/do-instance-status-detail-display.util';\nimport { DO_Presence_Type } from '../../../../_enums/dark-office/ccap-dark-office-presence.enum';\nimport { DO_CharacterAnim_Type } from '../../../../_enums/dark-office/do-character-anim.enum';\nimport { DO_CharacterType_Type } from '../../../../_enums/dark-office/do-character-type.enum';\nimport { ExS_InstanceDataStatus_Type } from '../../../external-sessions/_enums/exs-instance-data-status.enum';\nimport { Oc_iConnectionStatus_Type } from '../../../external-sessions/_modules/openclaw/_enums/oc-oci-connection-status.enum';\nimport { DarkOffice_DataService } from '../../_services/dark-office.data-service';\nimport { ExS_InstanceData_SessionStatus_Interface } from '../../../external-sessions/_models/interfaces/exs-instance-data-status.interface';\nimport { ExS_InstanceData_Response } from '../../../external-sessions/_models/interfaces/exs-instance-data.interface';\nimport { DO_OfficeInstanceState_Interface } from '../../../../_models/interfaces/dark-office/do-office-instance-state.interface';\nimport { CA_IInstanceData_Response } from '../../../external-sessions/_modules/cursor-acp/_models/interfaces/ca-cai-instance-data.interface';\nimport { CA_IInstanceData_SessionStatus_Interface } from '../../../external-sessions/_modules/cursor-acp/_models/interfaces/ca-cai-instance-data-status.interface';\nimport { CC_CciInstanceData_Response } from '../../../external-sessions/_modules/claude-code/_models/interfaces/cc-cci-instance-data.interface';\nimport { CC_CciInstanceData_SessionStatus_Interface } from '../../../external-sessions/_modules/claude-code/_models/interfaces/cc-cci-instance-data-status.interface';\nimport {\n Oc_IInstanceData_Response,\n Oc_IInstanceData_SessionStatus_Interface,\n} from '../../../external-sessions/_modules/openclaw/_models/interfaces/oc-oci-instance-data.interface';\n\n/** Office UI állapot egy sora — badge vagy sima szöveg (template @switch). */\ntype DO_InstanceStatusDetail_OfficeStateLine =\n | {\n kind: 'presence';\n label: string;\n presence: DO_Presence_Type;\n badgeMod: string;\n display: string;\n }\n | {\n kind: 'connection';\n label: string;\n status: Oc_iConnectionStatus_Type | null | undefined;\n badgeMod: string;\n display: string;\n }\n | {\n kind: 'characterType';\n label: string;\n charType: DO_CharacterType_Type | undefined;\n badgeMod: string;\n display: string;\n }\n | { kind: 'anim'; label: string; anim: DO_CharacterAnim_Type; badgeMod: string; display: string }\n | { kind: 'text'; label: string; value: string };\n\n/** Runtime snapshot sor — státusz pill vagy sima KV. */\ntype DO_InstanceStatusDetail_CcapSnapshotLine =\n | { kind: 'kv'; label: string; value: string }\n | {\n kind: 'instanceDataStatus';\n label: string;\n status: ExS_InstanceDataStatus_Type;\n badgeMod: string;\n display: string;\n };\n\ntype DO_InstanceStatusDetail_OciSnapshotLine =\n | { kind: 'kv'; label: string; value: string }\n | {\n kind: 'connection';\n label: string;\n status: Oc_iConnectionStatus_Type;\n badgeMod: string;\n display: string;\n };\n\n/** CCAP session blokk adatai. */\ntype DO_InstanceStatusDetail_CcapSessionRow = {\n sessionId: string;\n sessionName: string;\n presence: string;\n presenceBadgeMod: string;\n lastActivityAt: string;\n hasActiveRun: string;\n hasActiveRunPositive: boolean;\n activeRunId: string;\n activeRunPhase: string;\n activitySummary: string;\n lastMessage: string;\n};\n\n/** OCI session blokk adatai. */\ntype DO_InstanceStatusDetail_OciSessionRow = {\n sessionId: string;\n sessionName: string;\n presence: string;\n presenceBadgeMod: string;\n lastActivityAt: string;\n hasActiveSession: string;\n hasActiveSessionPositive: boolean;\n activitySummary: string;\n lastMessage: string;\n};\n\n/** CCI session blokk adatai. */\ntype DO_InstanceStatusDetail_CciSessionRow = {\n sessionId: string;\n sessionName: string;\n presence: string;\n presenceBadgeMod: string;\n lastActivityAt: string;\n hasActiveSession: string;\n hasActiveSessionPositive: boolean;\n currentCcSessionStatus: string;\n activitySummary: string;\n lastMessage: string;\n};\n\n/** CAI session blokk adatai. */\ntype DO_InstanceStatusDetail_CaiSessionRow = {\n sessionId: string;\n sessionName: string;\n presence: string;\n presenceBadgeMod: string;\n lastActivityAt: string;\n hasActiveSession: string;\n hasActiveSessionPositive: boolean;\n currentCaSessionStatus: string;\n activitySummary: string;\n lastMessage: string;\n};\n\n/**\n * Dark Office instance státusz részletező modal.\n *\n * ## Felelősség\n * Az instance panel overlay-en kiválasztott karakterhez központi popup: **office UI snapshot**\n * (`DO_OfficeInstanceState_Interface`) + ahol van, a **runtime listából** CCAP vagy OCI instance-data\n * sor és `sessionStatuses` táblázat. A megjelenítendő sorok `computed()` signalokból jönnek — a\n * template-ben nincs display-metódus hívás (Angular best practice + projekt szabály).\n * Session sor forrás / prune / hint: **kizárólag** `DarkOffice_DataService` (SSOT) — nincs közvetlen modal util hívás.\n */\n@Component({\n selector: 'app-do-instance-status-detail',\n templateUrl: './do-instance-status-detail.component.html',\n styleUrl: './do-instance-status-detail.component.scss',\n})\n/** DO_InstanceStatusDetail_Component class. */\nexport class DO_InstanceStatusDetail_Component {\n\n readonly darkOffice_DS: DarkOffice_DataService = inject(DarkOffice_DataService);\n\n /** Template: `characterType` fallback CCAP-ra a preview inputhoz. */\n readonly charTypeEnum = DO_CharacterType_Type;\n\n /** Kiválasztott instance office állapota (null ha nincs ID vagy nincs a listában). */\n readonly officeInstance_$ = computed((): DO_OfficeInstanceState_Interface | null => {\n return this.darkOffice_DS.resolveOfficeInstanceById(\n this.darkOffice_DS.instanceStatusDetailInstanceId_$(),\n );\n });\n\n /** Modal címsor: displayName vagy instanceId. */\n readonly modalTitle_$ = computed((): string => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n const id: string | null = this.darkOffice_DS.instanceStatusDetailInstanceId_$();\n return id ? `Instance — ${id}` : 'Instance status';\n }\n const name: string = DO_InstanceStatusDetailDisplay_Util.formatOptional(inst.visuals.displayName);\n return name ? name : inst.instanceId;\n });\n\n /**\n * Office UI állapot sorok — badge típusok discriminated union (strukturált template).\n */\n readonly officeStateLines_$ = computed((): DO_InstanceStatusDetail_OfficeStateLine[] => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return [];\n }\n const lines: DO_InstanceStatusDetail_OfficeStateLine[] = [\n { kind: 'text', label: 'instanceId', value: inst.instanceId },\n {\n kind: 'presence',\n label: 'presence',\n presence: inst.presence,\n badgeMod: DO_InstanceStatusDetailDisplay_Util.presenceBadgeModifier(inst.presence),\n display: DO_InstanceStatusDetailDisplay_Util.formatPresence(inst.presence),\n },\n { kind: 'text', label: 'activitySummary', value: inst.activitySummary || '—' },\n {\n kind: 'text',\n label: 'currentRunFlowPhase',\n value:\n DO_InstanceStatusDetailDisplay_Util.formatOptional(inst.currentRunFlowPhase ?? undefined) || '—',\n },\n {\n kind: 'text',\n label: 'latestSessionId',\n value: DO_InstanceStatusDetailDisplay_Util.formatOptional(inst.latestSessionId ?? undefined) || '—',\n },\n {\n kind: 'anim',\n label: 'animState',\n anim: inst.animState,\n badgeMod: DO_InstanceStatusDetailDisplay_Util.animBadgeModifier(inst.animState),\n display: DO_InstanceStatusDetailDisplay_Util.formatAnimState(inst.animState),\n },\n inst.previousPresence !== null\n ? {\n kind: 'presence',\n label: 'previousPresence',\n presence: inst.previousPresence,\n badgeMod: DO_InstanceStatusDetailDisplay_Util.presenceBadgeModifier(inst.previousPresence),\n display: DO_InstanceStatusDetailDisplay_Util.formatPresence(inst.previousPresence),\n }\n : { kind: 'text', label: 'previousPresence', value: '—' },\n { kind: 'text', label: 'lastMessage', value: inst.lastMessage || '—' },\n { kind: 'text', label: 'assignedSlotIndex', value: String(inst.assignedSlotIndex) },\n {\n kind: 'characterType',\n label: 'characterType',\n charType: inst.characterType,\n badgeMod: DO_InstanceStatusDetailDisplay_Util.characterTypeBadgeModifier(inst.characterType),\n display: DO_InstanceStatusDetailDisplay_Util.formatCharacterType(inst.characterType),\n },\n {\n kind: 'connection',\n label: 'connectionStatus',\n status: inst.connectionStatus,\n badgeMod: DO_InstanceStatusDetailDisplay_Util.connectionBadgeModifier(inst.connectionStatus),\n display:\n DO_InstanceStatusDetailDisplay_Util.formatConnectionStatus(inst.connectionStatus) || '—',\n },\n ];\n // OpenClaw: gateway `connectionStatus` az OCI runtime blokkban is megjelenik — duplikáció elkerülése.\n const charType: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n if (charType === DO_CharacterType_Type.openclaw) {\n const ociRow: Oc_IInstanceData_Response | undefined =\n this.darkOffice_DS.getOciInstanceDataSnapshot(inst.instanceId);\n if (ociRow) {\n return lines.filter(\n (line: DO_InstanceStatusDetail_OfficeStateLine): boolean =>\n !(line.kind === 'connection' && line.label === 'connectionStatus'),\n );\n }\n }\n return lines;\n });\n\n /**\n * Ha a runtime listában nincs megfelelő sor, rövid magyarázat (socket-only frissítés / régi load).\n */\n readonly rawSnapshotHint_$ = computed((): string => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return '';\n }\n return this.darkOffice_DS.buildInstanceStatusDetailRuntimeHint(inst);\n });\n\n /** CCAP runtime snapshot sorok (pill + KV). */\n readonly ccapSnapshotLines_$ = computed((): DO_InstanceStatusDetail_CcapSnapshotLine[] => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return [];\n }\n const type: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n if (\n type === DO_CharacterType_Type.openclaw\n || type === DO_CharacterType_Type.ccSession\n || type === DO_CharacterType_Type.caSession\n ) {\n return [];\n }\n const data: ExS_InstanceData_Response | undefined = this.darkOffice_DS.getCcapInstanceDataSnapshot(\n inst.instanceId,\n );\n if (!data) {\n return [];\n }\n const resolvedCcapSessions: ExS_InstanceData_SessionStatus_Interface[] =\n this.darkOffice_DS.resolveModalCcapSessionStatuses(inst);\n const statusesLen: number = resolvedCcapSessions.length;\n let ccapLines: DO_InstanceStatusDetail_CcapSnapshotLine[] = [\n { kind: 'kv', label: '_id', value: data._id },\n { kind: 'kv', label: 'ccapId', value: data.ccapId },\n {\n kind: 'kv',\n label: 'name',\n value: DO_InstanceStatusDetailDisplay_Util.formatOptional(data.name) || '—',\n },\n {\n kind: 'instanceDataStatus',\n label: 'status',\n status: data.status,\n badgeMod: DO_InstanceStatusDetailDisplay_Util.instanceDataStatusBadgeModifier(data.status),\n display: DO_InstanceStatusDetailDisplay_Util.formatInstanceDataStatus(data.status),\n },\n { kind: 'kv', label: '__created', value: data.__created },\n { kind: 'kv', label: '__updated', value: data.__updated },\n { kind: 'kv', label: 'sessionStatuses.length', value: String(statusesLen) },\n ];\n if (data.ccapId === inst.instanceId) {\n ccapLines = ccapLines.filter(\n (ln: DO_InstanceStatusDetail_CcapSnapshotLine): boolean =>\n !(ln.kind === 'kv' && ln.label === 'ccapId'),\n );\n }\n const ccapOfficeDisplayName: string = inst.visuals.displayName.trim();\n const ccapDataNameTrim: string = (data.name ?? '').trim();\n if (ccapOfficeDisplayName.length > 0 && ccapDataNameTrim === ccapOfficeDisplayName) {\n ccapLines = ccapLines.filter(\n (ln: DO_InstanceStatusDetail_CcapSnapshotLine): boolean =>\n !(ln.kind === 'kv' && ln.label === 'name'),\n );\n }\n return ccapLines;\n });\n\n /** OCI runtime snapshot sorok. */\n readonly ociSnapshotLines_$ = computed((): DO_InstanceStatusDetail_OciSnapshotLine[] => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return [];\n }\n const type: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n if (type !== DO_CharacterType_Type.openclaw) {\n return [];\n }\n const data: Oc_IInstanceData_Response | undefined = this.darkOffice_DS.getOciInstanceDataSnapshot(\n inst.instanceId,\n );\n if (!data) {\n return [];\n }\n const resolvedOciSessions: Oc_IInstanceData_SessionStatus_Interface[] =\n this.darkOffice_DS.resolveModalOciSessionStatuses(inst);\n const statusesLen: number = resolvedOciSessions.length;\n let ociLines: DO_InstanceStatusDetail_OciSnapshotLine[] = [\n { kind: 'kv', label: '_id', value: data._id },\n { kind: 'kv', label: 'instanceId', value: data.instanceId },\n {\n kind: 'kv',\n label: 'label',\n value: DO_InstanceStatusDetailDisplay_Util.formatOptional(data.label) || '—',\n },\n { kind: 'kv', label: 'gatewayUrl', value: data.gatewayUrl },\n {\n kind: 'connection',\n label: 'connectionStatus',\n status: data.connectionStatus,\n badgeMod: DO_InstanceStatusDetailDisplay_Util.connectionBadgeModifier(data.connectionStatus),\n display: DO_InstanceStatusDetailDisplay_Util.formatConnectionStatus(data.connectionStatus),\n },\n {\n kind: 'kv',\n label: 'lastConnectedAt',\n value: DO_InstanceStatusDetailDisplay_Util.formatOptional(data.lastConnectedAt) || '—',\n },\n { kind: 'kv', label: '__created', value: data.__created },\n { kind: 'kv', label: '__updated', value: data.__updated },\n { kind: 'kv', label: 'sessionStatuses.length', value: String(statusesLen) },\n ];\n if (data.instanceId === inst.instanceId) {\n ociLines = ociLines.filter(\n (ln: DO_InstanceStatusDetail_OciSnapshotLine): boolean =>\n !(ln.kind === 'kv' && ln.label === 'instanceId'),\n );\n }\n const ociDisplayName: string = inst.visuals.displayName.trim();\n const ociLabelTrim: string = (data.label ?? '').trim();\n if (ociDisplayName.length > 0 && ociLabelTrim === ociDisplayName) {\n ociLines = ociLines.filter(\n (ln: DO_InstanceStatusDetail_OciSnapshotLine): boolean =>\n !(ln.kind === 'kv' && ln.label === 'label'),\n );\n }\n return ociLines;\n });\n\n /** CCI runtime snapshot sorok (ugyanaz a pill mint CCAP instance-data status). */\n readonly cciSnapshotLines_$ = computed((): DO_InstanceStatusDetail_CcapSnapshotLine[] => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return [];\n }\n const type: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n if (type !== DO_CharacterType_Type.ccSession) {\n return [];\n }\n const ccapId: string | null = DO_CciOfficeInstanceId_Util.parseCcapId(inst.instanceId);\n if (!ccapId) {\n return [];\n }\n const data: CC_CciInstanceData_Response | undefined =\n this.darkOffice_DS.getCciInstanceDataSnapshot(ccapId);\n if (!data) {\n return [];\n }\n const resolvedCciSessions: CC_CciInstanceData_SessionStatus_Interface[] =\n this.darkOffice_DS.resolveModalCciSessionStatuses(inst);\n const statusesLen: number = resolvedCciSessions.length;\n let cciLines: DO_InstanceStatusDetail_CcapSnapshotLine[] = [\n { kind: 'kv', label: '_id', value: data._id },\n { kind: 'kv', label: 'ccapId', value: data.ccapId },\n {\n kind: 'kv',\n label: 'name',\n value: DO_InstanceStatusDetailDisplay_Util.formatOptional(data.name) || '—',\n },\n {\n kind: 'instanceDataStatus',\n label: 'status',\n status: data.status,\n badgeMod: DO_InstanceStatusDetailDisplay_Util.instanceDataStatusBadgeModifier(data.status),\n display: DO_InstanceStatusDetailDisplay_Util.formatInstanceDataStatus(data.status),\n },\n { kind: 'kv', label: '__created', value: data.__created },\n { kind: 'kv', label: '__updated', value: data.__updated },\n { kind: 'kv', label: 'sessionStatuses.length', value: String(statusesLen) },\n ];\n if (data.ccapId === ccapId) {\n cciLines = cciLines.filter(\n (ln: DO_InstanceStatusDetail_CcapSnapshotLine): boolean =>\n !(ln.kind === 'kv' && ln.label === 'ccapId'),\n );\n }\n const cciDisplayName: string = inst.visuals.displayName.trim();\n const cciDataNameTrim: string = (data.name ?? '').trim();\n if (cciDisplayName.length > 0 && cciDataNameTrim === cciDisplayName) {\n cciLines = cciLines.filter(\n (ln: DO_InstanceStatusDetail_CcapSnapshotLine): boolean =>\n !(ln.kind === 'kv' && ln.label === 'name'),\n );\n }\n return cciLines;\n });\n\n /** CAI runtime snapshot sorok (CCI mintával megegyező KV + pill). */\n readonly caiSnapshotLines_$ = computed((): DO_InstanceStatusDetail_CcapSnapshotLine[] => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return [];\n }\n const type: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n if (type !== DO_CharacterType_Type.caSession) {\n return [];\n }\n const ccapId: string | null = DO_CaiOfficeInstanceId_Util.parseCcapId(inst.instanceId);\n if (!ccapId) {\n return [];\n }\n const data: CA_IInstanceData_Response | undefined =\n this.darkOffice_DS.getCaiInstanceDataSnapshot(ccapId);\n if (!data) {\n return [];\n }\n const resolvedCaiSessions: CA_IInstanceData_SessionStatus_Interface[] =\n this.darkOffice_DS.resolveModalCaiSessionStatuses(inst);\n const statusesLen: number = resolvedCaiSessions.length;\n let caiLines: DO_InstanceStatusDetail_CcapSnapshotLine[] = [\n { kind: 'kv', label: '_id', value: data._id },\n { kind: 'kv', label: 'ccapId', value: data.ccapId },\n {\n kind: 'kv',\n label: 'name',\n value: DO_InstanceStatusDetailDisplay_Util.formatOptional(data.name) || '—',\n },\n {\n kind: 'instanceDataStatus',\n label: 'status',\n status: data.status,\n badgeMod: DO_InstanceStatusDetailDisplay_Util.instanceDataStatusBadgeModifier(data.status),\n display: DO_InstanceStatusDetailDisplay_Util.formatInstanceDataStatus(data.status),\n },\n { kind: 'kv', label: '__created', value: data.__created },\n { kind: 'kv', label: '__updated', value: data.__updated },\n { kind: 'kv', label: 'sessionStatuses.length', value: String(statusesLen) },\n ];\n if (data.ccapId === ccapId) {\n caiLines = caiLines.filter(\n (ln: DO_InstanceStatusDetail_CcapSnapshotLine): boolean =>\n !(ln.kind === 'kv' && ln.label === 'ccapId'),\n );\n }\n const caiDisplayName: string = inst.visuals.displayName.trim();\n const caiDataNameTrim: string = (data.name ?? '').trim();\n if (caiDisplayName.length > 0 && caiDataNameTrim === caiDisplayName) {\n caiLines = caiLines.filter(\n (ln: DO_InstanceStatusDetail_CcapSnapshotLine): boolean =>\n !(ln.kind === 'kv' && ln.label === 'name'),\n );\n }\n return caiLines;\n });\n\n /** CCAP session státuszok táblázata. */\n readonly ccapSessionRows_$ = computed((): DO_InstanceStatusDetail_CcapSessionRow[] => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return [];\n }\n const type: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n if (\n type === DO_CharacterType_Type.openclaw\n || type === DO_CharacterType_Type.ccSession\n || type === DO_CharacterType_Type.caSession\n ) {\n return [];\n }\n const sessions: ExS_InstanceData_SessionStatus_Interface[] =\n this.darkOffice_DS.resolveModalCcapSessionStatuses(inst);\n if (sessions.length === 0) {\n return [];\n }\n return sessions.map(\n (s: ExS_InstanceData_SessionStatus_Interface): DO_InstanceStatusDetail_CcapSessionRow => ({\n sessionId: s.sessionId,\n sessionName: DO_InstanceStatusDetailDisplay_Util.formatOptional(s.sessionName),\n presence: DO_InstanceStatusDetailDisplay_Util.formatPresence(s.presence),\n presenceBadgeMod: DO_InstanceStatusDetailDisplay_Util.presenceBadgeModifier(s.presence),\n lastActivityAt: s.lastActivityAt,\n hasActiveRun: DO_InstanceStatusDetailDisplay_Util.formatBoolean(s.hasActiveRun),\n hasActiveRunPositive: s.hasActiveRun,\n activeRunId: DO_InstanceStatusDetailDisplay_Util.formatOptional(s.activeRunId),\n activeRunPhase: DO_InstanceStatusDetailDisplay_Util.formatRunPhase(s.activeRunPhase),\n activitySummary: s.activitySummary,\n lastMessage: DO_InstanceStatusDetailDisplay_Util.formatOptional(s.lastMessage),\n }),\n );\n });\n\n /** CCI session státusz táblázat. */\n readonly cciSessionRows_$ = computed((): DO_InstanceStatusDetail_CciSessionRow[] => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return [];\n }\n const type: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n if (type !== DO_CharacterType_Type.ccSession) {\n return [];\n }\n const ccapId: string | null = DO_CciOfficeInstanceId_Util.parseCcapId(inst.instanceId);\n if (!ccapId) {\n return [];\n }\n const sessions: CC_CciInstanceData_SessionStatus_Interface[] =\n this.darkOffice_DS.resolveModalCciSessionStatuses(inst);\n if (sessions.length === 0) {\n return [];\n }\n return sessions.map(\n (s: CC_CciInstanceData_SessionStatus_Interface): DO_InstanceStatusDetail_CciSessionRow => ({\n sessionId: s.sessionId,\n sessionName: DO_InstanceStatusDetailDisplay_Util.formatOptional(s.sessionName),\n presence: DO_InstanceStatusDetailDisplay_Util.formatPresence(s.presence),\n presenceBadgeMod: DO_InstanceStatusDetailDisplay_Util.presenceBadgeModifier(s.presence),\n lastActivityAt: s.lastActivityAt,\n hasActiveSession: DO_InstanceStatusDetailDisplay_Util.formatBoolean(s.hasActiveSession),\n hasActiveSessionPositive: s.hasActiveSession,\n currentCcSessionStatus:\n DO_InstanceStatusDetailDisplay_Util.formatOptional(s.currentCcSessionStatus) || '—',\n activitySummary: s.activitySummary,\n lastMessage: DO_InstanceStatusDetailDisplay_Util.formatOptional(s.lastMessage),\n }),\n );\n });\n\n /** CAI session státusz táblázat. */\n readonly caiSessionRows_$ = computed((): DO_InstanceStatusDetail_CaiSessionRow[] => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return [];\n }\n const type: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n if (type !== DO_CharacterType_Type.caSession) {\n return [];\n }\n const ccapId: string | null = DO_CaiOfficeInstanceId_Util.parseCcapId(inst.instanceId);\n if (!ccapId) {\n return [];\n }\n const sessions: CA_IInstanceData_SessionStatus_Interface[] =\n this.darkOffice_DS.resolveModalCaiSessionStatuses(inst);\n if (sessions.length === 0) {\n return [];\n }\n return sessions.map(\n (s: CA_IInstanceData_SessionStatus_Interface): DO_InstanceStatusDetail_CaiSessionRow => ({\n sessionId: s.sessionId,\n sessionName: DO_InstanceStatusDetailDisplay_Util.formatOptional(s.sessionName),\n presence: DO_InstanceStatusDetailDisplay_Util.formatPresence(s.presence),\n presenceBadgeMod: DO_InstanceStatusDetailDisplay_Util.presenceBadgeModifier(s.presence),\n lastActivityAt: s.lastActivityAt,\n hasActiveSession: DO_InstanceStatusDetailDisplay_Util.formatBoolean(s.hasActiveSession),\n hasActiveSessionPositive: s.hasActiveSession,\n currentCaSessionStatus:\n DO_InstanceStatusDetailDisplay_Util.formatOptional(s.currentCaSessionStatus) || '—',\n activitySummary: s.activitySummary,\n lastMessage: DO_InstanceStatusDetailDisplay_Util.formatOptional(s.lastMessage),\n }),\n );\n });\n\n /** OCI session státuszok táblázata. */\n readonly ociSessionRows_$ = computed((): DO_InstanceStatusDetail_OciSessionRow[] => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return [];\n }\n const type: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n if (type !== DO_CharacterType_Type.openclaw) {\n return [];\n }\n const sessions: Oc_IInstanceData_SessionStatus_Interface[] =\n this.darkOffice_DS.resolveModalOciSessionStatuses(inst);\n if (sessions.length === 0) {\n return [];\n }\n return sessions.map(\n (s: Oc_IInstanceData_SessionStatus_Interface): DO_InstanceStatusDetail_OciSessionRow => ({\n sessionId: s.sessionId,\n sessionName: DO_InstanceStatusDetailDisplay_Util.formatOptional(s.sessionName),\n presence: DO_InstanceStatusDetailDisplay_Util.formatPresence(s.presence),\n presenceBadgeMod: DO_InstanceStatusDetailDisplay_Util.presenceBadgeModifier(s.presence),\n lastActivityAt: s.lastActivityAt,\n hasActiveSession: DO_InstanceStatusDetailDisplay_Util.formatBoolean(s.hasActiveSession),\n hasActiveSessionPositive: s.hasActiveSession,\n activitySummary: s.activitySummary,\n lastMessage: DO_InstanceStatusDetailDisplay_Util.formatOptional(s.lastMessage),\n }),\n );\n });\n\n /** CCAP snapshot betöltve — üres session lista üzenethez. */\n readonly hasCcapRuntimeSnapshot_$ = computed((): boolean => {\n return this.ccapSnapshotLines_$().length > 0;\n });\n\n /** OCI snapshot betöltve. */\n readonly hasOciRuntimeSnapshot_$ = computed((): boolean => {\n return this.ociSnapshotLines_$().length > 0;\n });\n\n /** CCI snapshot betöltve. */\n readonly hasCciRuntimeSnapshot_$ = computed((): boolean => {\n return this.cciSnapshotLines_$().length > 0;\n });\n\n /** CAI snapshot betöltve. */\n readonly hasCaiRuntimeSnapshot_$ = computed((): boolean => {\n return this.caiSnapshotLines_$().length > 0;\n });\n\n /** `true` ha CCAP instance-data sor (nyers `ccapId` office kulcs). */\n readonly isCcapDetail_$ = computed((): boolean => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return false;\n }\n const type: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n return type === DO_CharacterType_Type.ccap;\n });\n\n /** `true` ha CCI (`cci:` + ccapId office kulcs). */\n readonly isCciDetail_$ = computed((): boolean => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return false;\n }\n const type: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n return type === DO_CharacterType_Type.ccSession;\n });\n\n /** `true` ha CAI (`cai:` + ccapId office kulcs). */\n readonly isCaiDetail_$ = computed((): boolean => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return false;\n }\n const type: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n return type === DO_CharacterType_Type.caSession;\n });\n\n /** `true` ha OCI (OpenClaw) instance. */\n readonly isOciDetail_$ = computed((): boolean => {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return false;\n }\n const type: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n return type === DO_CharacterType_Type.openclaw;\n });\n\n /** Modal bezárása — data-service signal nullázása. */\n handleClosed(): void {\n this.darkOffice_DS.closeInstanceStatusDetail();\n }\n\n /**\n * Karakter preview kattintás — Instance Details zárás + Karakter beállítások (vizuál editor),\n * ugyanazzal a panel `instanceId`-val mint a bal panel dupla kattintás.\n */\n handleOpenCharacterSettingsFromPreview(): void {\n const inst: DO_OfficeInstanceState_Interface | null = this.officeInstance_$();\n if (!inst) {\n return;\n }\n this.darkOffice_DS.closeInstanceStatusDetail();\n this.darkOffice_DS.selectInstance(inst.instanceId);\n }\n}\n", "<app-s-modal [isOpen]=\"true\"\n [title]=\"modalTitle_$()\"\n [maxWidth]=\"'5xl'\"\n (closed)=\"handleClosed()\">\n\n @if (!officeInstance_$()) {\n <p class=\"text-sm text-neutral-400\">\n Instance not found in office list (may have left while this dialog was open).\n </p>\n } @else {\n @if (rawSnapshotHint_$()) {\n <p class=\"do-status-warn text-xs text-amber-400/90 mb-4 border border-amber-500/30 rounded px-3 py-2\">\n {{ rawSnapshotHint_$() }}\n </p>\n }\n\n <p class=\"text-xs text-neutral-500 mb-4 border-l-2 border-neutral-600 pl-2 leading-relaxed\">\n <span class=\"text-neutral-400\">Session events:</span>\n CC Session stream + Timeline a\n <a routerLink=\"/cc-session\" class=\"text-neonCyan hover:underline\">CC Sessions</a>\n modulban.\n CCAP agent futáslépések: monitoring pipeline; instance tracking összefoglaló dev doc:\n <span class=\"text-neutral-400\">2026-04-05-dark-office-instance-tracking-ssot.md</span>.\n </p>\n\n <!-- Felső: két oszlop — office állapot + karakter vizuál -->\n <div class=\"do-status-detail-columns\">\n <section class=\"do-status-card\">\n <h3 class=\"do-status-card__title\">Office UI state</h3>\n <div class=\"do-status-field-grid\">\n @for (line of officeStateLines_$(); track line.label) {\n <div class=\"do-field-row\">\n <span class=\"do-field-row__k\">{{ line.label }}</span>\n <div class=\"do-field-row__v\">\n @switch (line.kind) {\n @case ('presence') {\n <span class=\"do-pill do-pill--presence\"\n [attr.data-m]=\"line.badgeMod\">{{ line.display }}</span>\n }\n @case ('connection') {\n <span class=\"do-pill do-pill--conn\"\n [attr.data-m]=\"line.badgeMod\">{{ line.display }}</span>\n }\n @case ('characterType') {\n <span class=\"do-pill do-pill--ctype\"\n [attr.data-m]=\"line.badgeMod\">{{ line.display }}</span>\n }\n @case ('anim') {\n <span class=\"do-pill do-pill--anim\"\n [attr.data-m]=\"line.badgeMod\">{{ line.display }}</span>\n }\n @case ('text') {\n <span class=\"do-field-text\"\n [class.do-field-text--mono]=\"line.label === 'instanceId' || line.label === 'latestSessionId'\"\n [class.do-field-text--muted]=\"line.value === '—'\">{{ line.value }}</span>\n }\n }\n </div>\n </div>\n }\n </div>\n </section>\n\n <section class=\"do-status-card do-status-card--preview\">\n <h3 class=\"do-status-card__title\">Character preview</h3>\n <app-do-character-preview\n variant=\"status\"\n [showDisplayName]=\"false\"\n [showInstanceIdLine]=\"false\"\n [visuals]=\"officeInstance_$()!.visuals\"\n [characterType]=\"officeInstance_$()!.characterType ?? charTypeEnum.ccap\"\n [instanceId]=\"officeInstance_$()!.instanceId\"\n [isCharacterSettingsClickEnabled]=\"true\"\n (characterSettingsRequest)=\"handleOpenCharacterSettingsFromPreview()\">\n </app-do-character-preview>\n </section>\n </div>\n\n @if (isCcapDetail_$()) {\n <section class=\"do-status-card do-status-card--wide\">\n <h3 class=\"do-status-card__title\">CCAP instance data (runtime snapshot)</h3>\n @if (!ccapSnapshotLines_$().length) {\n <p class=\"text-xs text-neutral-500\">No CCAP root row loaded.</p>\n } @else {\n <div class=\"do-snapshot-grid\">\n @for (ln of ccapSnapshotLines_$(); track ln.label) {\n <div class=\"do-field-row do-field-row--compact\">\n <span class=\"do-field-row__k\">{{ ln.label }}</span>\n <div class=\"do-field-row__v\">\n @switch (ln.kind) {\n @case ('kv') {\n <span class=\"do-field-text do-field-text--mono\"\n [class.do-field-text--muted]=\"ln.value === '—'\">{{ ln.value }}</span>\n }\n @case ('instanceDataStatus') {\n <span class=\"do-pill do-pill--idata\"\n [attr.data-m]=\"ln.badgeMod\">{{ ln.display }}</span>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n <h4 class=\"do-status-subtitle\">Sessions</h4>\n @if (!ccapSessionRows_$().length && hasCcapRuntimeSnapshot_$()) {\n <div class=\"do-session-empty\">\n No session rows — <span class=\"font-mono\">sessionStatuses</span> is empty.\n </div>\n }\n <div class=\"do-session-stack\">\n @for (r of ccapSessionRows_$(); track r.sessionId) {\n <article class=\"do-session-block\">\n <header class=\"do-session-block__head\">\n <span class=\"do-session-block__id font-mono\">{{ r.sessionId }}</span>\n <span class=\"do-pill do-pill--presence do-pill--sm\"\n [attr.data-m]=\"r.presenceBadgeMod\">{{ r.presence }}</span>\n </header>\n @if (r.sessionName) {\n <p class=\"do-session-block__name\">{{ r.sessionName }}</p>\n }\n <div class=\"do-session-block__grid\">\n <div class=\"do-session-kv\">\n <span class=\"do-session-kv__k\">lastActivityAt</span>\n <span class=\"do-session-kv__v font-mono text-[11px]\">{{ r.lastActivityAt }}</span>\n </div>\n <div class=\"do-session-kv\">\n <span class=\"do-session-kv__k\">hasActiveRun</span>\n <span class=\"do-pill do-pill--bool do-pill--sm\"\n [attr.data-on]=\"r.hasActiveRunPositive ? '1' : '0'\">{{ r.hasActiveRun }}</span>\n </div>\n <div class=\"do-session-kv do-session-kv--full\">\n <span class=\"do-session-kv__k\">activeRunId</span>\n <span class=\"do-session-kv__v font-mono break-all\">{{ r.activeRunId || '—' }}</span>\n </div>\n <div class=\"do-session-kv do-session-kv--full\">\n <span class=\"do-session-kv__k\">activeRunPhase</span>\n <span class=\"do-session-kv__v font-mono break-all\">{{ r.activeRunPhase || '—' }}</span>\n </div>\n <div class=\"do-session-kv do-session-kv--full\">\n <span class=\"do-session-kv__k\">activitySummary</span>\n <span class=\"do-session-kv__v\">{{ r.activitySummary }}</span>\n </div>\n <div class=\"do-session-kv do-session-kv--full\">\n <span class=\"do-session-kv__k\">lastMessage</span>\n <span class=\"do-session-kv__v\">{{ r.lastMessage || '—' }}</span>\n </div>\n </div>\n </article>\n }\n </div>\n </section>\n } @else if (isCciDetail_$()) {\n <section class=\"do-status-card do-status-card--wide\">\n <h3 class=\"do-status-card__title\">CCI instance data (runtime snapshot)</h3>\n @if (!cciSnapshotLines_$().length) {\n <p class=\"text-xs text-neutral-500\">No CCI root row loaded.</p>\n } @else {\n <div class=\"do-snapshot-grid\">\n @for (ln of cciSnapshotLines_$(); track ln.label) {\n <div class=\"do-field-row do-field-row--compact\">\n <span class=\"do-field-row__k\">{{ ln.label }}</span>\n <div class=\"do-field-row__v\">\n @switch (ln.kind) {\n @case ('kv') {\n <span class=\"do-field-text do-field-text--mono\"\n [class.do-field-text--muted]=\"ln.value === '—'\">{{ ln.value }}</span>\n }\n @case ('instanceDataStatus') {\n <span class=\"do-pill do-pill--idata\"\n [attr.data-m]=\"ln.badgeMod\">{{ ln.display }}</span>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n <h4 class=\"do-status-subtitle\">CC Sessions</h4>\n @if (!cciSessionRows_$().length && hasCciRuntimeSnapshot_$()) {\n <div class=\"do-session-empty\">\n No session rows — <span class=\"font-mono\">sessionStatuses</span> is empty.\n </div>\n }\n <div class=\"do-session-stack\">\n @for (r of cciSessionRows_$(); track r.sessionId) {\n <article class=\"do-session-block\">\n <header class=\"do-session-block__head\">\n <span class=\"do-session-block__id font-mono\">{{ r.sessionId }}</span>\n <span class=\"do-pill do-pill--presence do-pill--sm\"\n [attr.data-m]=\"r.presenceBadgeMod\">{{ r.presence }}</span>\n </header>\n @if (r.sessionName) {\n <p class=\"do-session-block__name\">{{ r.sessionName }}</p>\n }\n <div class=\"do-session-block__grid\">\n <div class=\"do-session-kv\">\n <span class=\"do-session-kv__k\">lastActivityAt</span>\n <span class=\"do-session-kv__v font-mono text-[11px]\">{{ r.lastActivityAt }}</span>\n </div>\n <div class=\"do-session-kv\">\n <span class=\"do-session-kv__k\">hasActiveSession</span>\n <span class=\"do-pill do-pill--bool do-pill--sm\"\n [attr.data-on]=\"r.hasActiveSessionPositive ? '1' : '0'\">{{ r.hasActiveSession }}</span>\n </div>\n <div class=\"do-session-kv do-session-kv--full\">\n <span class=\"do-session-kv__k\">currentCcSessionStatus</span>\n <span class=\"do-session-kv__v font-mono break-all\">{{ r.currentCcSessionStatus }}</span>\n </div>\n <div class=\"do-session-kv do-session-kv--full\">\n <span class=\"do-session-kv__k\">activitySummary</span>\n <span class=\"do-session-kv__v\">{{ r.activitySummary }}</span>\n </div>\n <div class=\"do-session-kv do-session-kv--full\">\n <span class=\"do-session-kv__k\">lastMessage</span>\n <span class=\"do-session-kv__v\">{{ r.lastMessage || '—' }}</span>\n </div>\n </div>\n </article>\n }\n </div>\n </section>\n } @else if (isCaiDetail_$()) {\n <section class=\"do-status-card do-status-card--wide\">\n <h3 class=\"do-status-card__title\">CAI instance data (runtime snapshot)</h3>\n @if (!caiSnapshotLines_$().length) {\n <p class=\"text-xs text-neutral-500\">No CAI root row loaded.</p>\n } @else {\n <div class=\"do-snapshot-grid\">\n @for (ln of caiSnapshotLines_$(); track ln.label) {\n <div class=\"do-field-row do-field-row--compact\">\n <span class=\"do-field-row__k\">{{ ln.label }}</span>\n <div class=\"do-field-row__v\">\n @switch (ln.kind) {\n @case ('kv') {\n <span class=\"do-field-text do-field-text--mono\"\n [class.do-field-text--muted]=\"ln.value === '—'\">{{ ln.value }}</span>\n }\n @case ('instanceDataStatus') {\n <span class=\"do-pill do-pill--idata\"\n [attr.data-m]=\"ln.badgeMod\">{{ ln.display }}</span>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n <h4 class=\"do-status-subtitle\">CA Sessions</h4>\n @if (!caiSessionRows_$().length && hasCaiRuntimeSnapshot_$()) {\n <div class=\"do-session-empty\">\n No session rows — <span class=\"font-mono\">sessionStatuses</span> is empty.\n </div>\n }\n <div class=\"do-session-stack\">\n @for (r of caiSessionRows_$(); track r.sessionId) {\n <article class=\"do-session-block\">\n <header class=\"do-session-block__head\">\n <span class=\"do-session-block__id font-mono\">{{ r.sessionId }}</span>\n <span class=\"do-pill do-pill--presence do-pill--sm\"\n [attr.data-m]=\"r.presenceBadgeMod\">{{ r.presence }}</span>\n </header>\n @if (r.sessionName) {\n <p class=\"do-session-block__name\">{{ r.sessionName }}</p>\n }\n <div class=\"do-session-block__grid\">\n <div class=\"do-session-kv\">\n <span class=\"do-session-kv__k\">lastActivityAt</span>\n <span class=\"do-session-kv__v font-mono text-[11px]\">{{ r.lastActivityAt }}</span>\n </div>\n <div class=\"do-session-kv\">\n <span class=\"do-session-kv__k\">hasActiveSession</span>\n <span class=\"do-pill do-pill--bool do-pill--sm\"\n [attr.data-on]=\"r.hasActiveSessionPositive ? '1' : '0'\">{{ r.hasActiveSession }}</span>\n </div>\n <div class=\"do-session-kv do-session-kv--full\">\n <span class=\"do-session-kv__k\">currentCaSessionStatus</span>\n <span class=\"do-session-kv__v font-mono break-all\">{{ r.currentCaSessionStatus }}</span>\n </div>\n <div class=\"do-session-kv do-session-kv--full\">\n <span class=\"do-session-kv__k\">activitySummary</span>\n <span class=\"do-session-kv__v\">{{ r.activitySummary }}</span>\n </div>\n <div class=\"do-session-kv do-session-kv--full\">\n <span class=\"do-session-kv__k\">lastMessage</span>\n <span class=\"do-session-kv__v\">{{ r.lastMessage || '—' }}</span>\n </div>\n </div>\n </article>\n }\n </div>\n </section>\n } @else if (isOciDetail_$()) {\n <section class=\"do-status-card do-status-card--wide\">\n <h3 class=\"do-status-card__title\">OCI instance data (runtime snapshot)</h3>\n @if (!ociSnapshotLines_$().length) {\n <p class=\"text-xs text-neutral-500\">No OCI root row loaded.</p>\n } @else {\n <div class=\"do-snapshot-grid\">\n @for (ln of ociSnapshotLines_$(); track ln.label) {\n <div class=\"do-field-row do-field-row--compact\">\n <span class=\"do-field-row__k\">{{ ln.label }}</span>\n <div class=\"do-field-row__v\">\n @switch (ln.kind) {\n @case ('kv') {\n <span class=\"do-field-text do-field-text--mono\"\n [class.do-field-text--muted]=\"ln.value === '—'\">{{ ln.value }}</span>\n }\n @case ('connection') {\n <span class=\"do-pill do-pill--conn\"\n [attr.data-m]=\"ln.badgeMod\">{{ ln.display }}</span>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n <h4 class=\"do-status-subtitle\">Sessions</h4>\n @if (!ociSessionRows_$().length && hasOciRuntimeSnapshot_$()) {\n <div class=\"do-session-empty\">\n No session rows — <span class=\"font-mono\">sessionStatuses</span> is empty.\n </div>\n }\n <div class=\"do-session-stack\">\n @for (r of ociSessionRows_$(); track r.sessionId) {\n <article class=\"do-session-block\">\n <header class=\"do-session-block__head\">\n <span class=\"do-session-block__id font-mono\">{{ r.sessionId }}</span>\n <span class=\"do-pill do-pill--presence do-pill--sm\"\n [attr.data-m]=\"r.presenceBadgeMod\">{{ r.presence }}</span>\n </header>\n @if (r.sessionName) {\n <p class=\"do-session-block__name\">{{ r.sessionName }}</p>\n }\n <div class=\"do-session-block__grid\">\n <div class=\"do-session-kv\">\n <span class=\"do-session-kv__k\">lastActivityAt</span>\n <span class=\"do-session-kv__v font-mono text-[11px]\">{{ r.lastActivityAt }}</span>\n </div>\n <div class=\"do-session-kv\">\n <span class=\"do-session-kv__k\">hasActiveSession</span>\n <span class=\"do-pill do-pill--bool do-pill--sm\"\n [attr.data-on]=\"r.hasActiveSessionPositive ? '1' : '0'\">{{ r.hasActiveSession }}</span>\n </div>\n <div class=\"do-session-kv do-session-kv--full\">\n <span class=\"do-session-kv__k\">activitySummary</span>\n <span class=\"do-session-kv__v\">{{ r.activitySummary }}</span>\n </div>\n <div class=\"do-session-kv do-session-kv--full\">\n <span class=\"do-session-kv__k\">lastMessage</span>\n <span class=\"do-session-kv__v\">{{ r.lastMessage || '—' }}</span>\n </div>\n </div>\n </article>\n }\n </div>\n </section>\n } @else {\n <p class=\"text-xs text-neutral-500\">No instance-data snapshot block for this character type.</p>\n }\n }\n</app-s-modal>\n", "/**\n * Dark Office gondolat-buborék tartalom szűrő (REQ-DO-BUBBLE-USER-PART-001).\n *\n * A karakterek feletti chat-bubble az **utolsó message user-facing részét** jelenítse meg,\n * ne a tool-call szintaxist vagy structured-payload zajt. Ez egy kliens-oldali heurisztikus\n * szűrő: a bemenő `lastMessage` plain string-ből kiszedi a kódblokkokat / tool-output-mintákat\n * / structured-marker-eket, csak a tiszta prose maradjon.\n *\n * Server-oldali `assembled-message normalizer` (REQ-API-SES-CHATONLY-MCP-001) gondoskodik\n * a strukturált message-block szűrésről; ez a kliens-oldali helper olyan esetekre, amikor\n * a `lastMessage` még tartalmaz markdown / tool-zajt.\n */\nconst BUBBLE_PREVIEW_MAX: number = 120;\n\n/** Szigorú tool-marker prefixek — sor elején törlésre kerülnek. */\nconst TOOL_LINE_PREFIXES: string[] = [\n '[TOOL]',\n '[QUEUE]',\n 'Calling tool:',\n 'Tool result:',\n 'Tool error:',\n];\n\n/**\n * Static util — a karakter-buborék user-facing tartalmát kinyeri és csonkolja a `lastMessage` plain\n * string-ből. Lásd a fájl-fejléc magyarázatát a REQ-DO-BUBBLE-USER-PART-001 viselkedéshez.\n */\nexport class DO_BubbleContent_Util {\n\n /**\n * `lastMessage` → user-facing prose preview (max 120 char). Üres vagy csak-zaj input → `''`.\n */\n static extractUserFacingPart(lastMessage: string): string {\n const stripped: string = DO_BubbleContent_Util.stripStructuredNoise(lastMessage);\n const prose: string = DO_BubbleContent_Util.collapseWhitespace(stripped);\n return DO_BubbleContent_Util.truncate(prose, BUBBLE_PREVIEW_MAX);\n }\n\n /** Markdown fenced code-blokkok és tool-line-ok eltávolítása. */\n private static stripStructuredNoise(text: string): string {\n if (!text) {\n return '';\n }\n // Markdown code-fence-ek (```...```) kivágása teljes blokkban (multi-line).\n let result: string = text.replace(/```[\\s\\S]*?```/g, ' ');\n // Tool-marker prefixű sorok eltávolítása.\n const lines: string[] = result.split(/\\r?\\n/);\n const kept: string[] = lines.filter((line: string): boolean => {\n const trimmed: string = line.trim();\n if (!trimmed) {\n return false;\n }\n for (const prefix of TOOL_LINE_PREFIXES) {\n if (trimmed.startsWith(prefix)) {\n return false;\n }\n }\n // Shell prompt sor: `$ command`\n if (/^\\$\\s/.test(trimmed)) {\n return false;\n }\n // Single-line JSON / object literal: kezdődik {-vel, végződik }-vel.\n if (/^\\{.*\\}$/.test(trimmed)) {\n return false;\n }\n return true;\n });\n result = kept.join(' ');\n return result;\n }\n\n /** Több whitespace → egy szóköz, trim. */\n private static collapseWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n }\n\n /** Truncate ellipsis-szel, ha hosszabb mint a max. */\n private static truncate(text: string, max: number): string {\n if (text.length <= max) {\n return text;\n }\n return text.slice(0, max - 1).trimEnd() + '…';\n }\n}\n", "/**\n * Dark Office karakter-bubble event-típus jelölő (REQ-DO-BUBBLE-DECOR-001).\n *\n * A bubble mellett megjelenő színes „icon orb\" ezt használja a háttérszín és a glyph\n * megválasztásához — a user egy pillantással lássa, milyen típusú event a bubble tartalma.\n * Heurisztikus detektálás: `DO_BubbleEventType_Util.detectFromText`.\n */\nexport enum DO_BubbleEventType_Type {\n /** Általános üzenet (assistant prose, info). Default fallback. */\n message = 'message',\n /** Tool / parancs futtatás (Bash, Read, Edit, WebSearch stb.). */\n tool = 'tool',\n /** Tool eredmény / output. */\n toolResult = 'tool-result',\n /** Status / phase átmenet (run-flow phase change). */\n status = 'status',\n /** Hiba / error event. */\n error = 'error',\n /** Queue / waiting event. */\n queued = 'queued',\n}\n", "import { DO_BubbleEventType_Type } from '../../../../_enums/dark-office/do-bubble-event-type.enum';\n\n/**\n * Heurisztikus event-típus detekció a bubble szöveg-tartalmából (REQ-DO-BUBBLE-DECOR-001).\n *\n * Egyszerű prefix / kulcsszó-mintákkal sorolja be a `lastMessage`-et típusokba, amikből a\n * `do-svg-char` template-je kiválasztja a megfelelő színes „icon orb\" háttérszínét és glyph-ját.\n * Server-oldali strukturált message-block-osztályozás (REQ-API-SES-CHATONLY-MCP-001) hosszú\n * távon kiválthatja ezt — addig a kliens-oldali heurisztika MVP-szinten elég.\n */\n\n/** [TOOL] / [QUEUE] / hasonló prefix-flag-ek. */\nconst ERROR_TOKENS: string[] = ['error', 'failed', 'fail:', 'exception', 'cannot', 'unable'];\nconst TOOL_TOKENS: string[] = ['calling tool:', 'running:', '$ ', 'bash', 'webSearch'];\nconst TOOL_RESULT_TOKENS: string[] = ['tool result:', 'output:', 'stdout:'];\nconst STATUS_TOKENS: string[] = ['phase:', 'status:', 'state:', 'transitioning', 'starting', 'finishing'];\n\n/**\n * Static util — a `lastMessage` plain string alapján DO_BubbleEventType_Type-ot ad vissza.\n */\nexport class DO_BubbleEventType_Util {\n\n /**\n * `text` → event-típus heurisztika. Üres / null input → `message` (default fallback).\n *\n * Sorrend: [TOOL] / [QUEUE] strikt prefixek először, aztán keyword-mintázatok\n * (case-insensitive). Ha semmi nem illeszkedik, default `message`.\n */\n static detectFromText(text: string | null | undefined): DO_BubbleEventType_Type {\n if (!text) {\n return DO_BubbleEventType_Type.message;\n }\n const trimmed: string = text.trim();\n const lower: string = trimmed.toLowerCase();\n\n // Strikt prefix-flag-ek.\n if (trimmed.startsWith('[TOOL]')) {\n return DO_BubbleEventType_Type.tool;\n }\n if (trimmed.startsWith('[QUEUE]')) {\n return DO_BubbleEventType_Type.queued;\n }\n\n // Keyword-mintázatok prioritás-sorrendben.\n if (DO_BubbleEventType_Util.containsAny(lower, ERROR_TOKENS)) {\n return DO_BubbleEventType_Type.error;\n }\n if (DO_BubbleEventType_Util.containsAny(lower, TOOL_RESULT_TOKENS)) {\n return DO_BubbleEventType_Type.toolResult;\n }\n if (DO_BubbleEventType_Util.containsAny(lower, TOOL_TOKENS)) {\n return DO_BubbleEventType_Type.tool;\n }\n if (DO_BubbleEventType_Util.containsAny(lower, STATUS_TOKENS)) {\n return DO_BubbleEventType_Type.status;\n }\n return DO_BubbleEventType_Type.message;\n }\n\n /** Igaz, ha a `haystack` tartalmazza valamelyik `tokens` elemet (substring match). */\n private static containsAny(haystack: string, tokens: string[]): boolean {\n for (const token of tokens) {\n if (haystack.includes(token)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Háttérszín a megadott event-típushoz (REQ-DO-BUBBLE-DECOR-001).\n * Cyberpunk paletta — current és history bubble-ök közös lookup-ja.\n */\n static orbFillFor(t: DO_BubbleEventType_Type): string {\n switch (t) {\n case DO_BubbleEventType_Type.tool: return '#f59e0b';\n case DO_BubbleEventType_Type.toolResult: return '#34d399';\n case DO_BubbleEventType_Type.status: return '#818cf8';\n case DO_BubbleEventType_Type.error: return '#f87171';\n case DO_BubbleEventType_Type.queued: return '#60a5fa';\n default: return '#22d3ee';\n }\n }\n\n /** Glyph (unicode) a megadott event-típushoz. */\n static orbGlyphFor(t: DO_BubbleEventType_Type): string {\n switch (t) {\n case DO_BubbleEventType_Type.tool: return '⚙';\n case DO_BubbleEventType_Type.toolResult: return '✓';\n case DO_BubbleEventType_Type.status: return '◐';\n case DO_BubbleEventType_Type.error: return '!';\n case DO_BubbleEventType_Type.queued: return '⏳';\n default: return '💬';\n }\n }\n\n /** Aria-label / tooltip szöveg az orb-on (accessibility). */\n static orbLabelFor(t: DO_BubbleEventType_Type): string {\n switch (t) {\n case DO_BubbleEventType_Type.tool: return 'Tool execution';\n case DO_BubbleEventType_Type.toolResult: return 'Tool result';\n case DO_BubbleEventType_Type.status: return 'Status change';\n case DO_BubbleEventType_Type.error: return 'Error';\n case DO_BubbleEventType_Type.queued: return 'Queued';\n default: return 'Message';\n }\n }\n}\n", "import {\n Component,\n computed,\n effect,\n EffectRef,\n EventEmitter,\n HostBinding,\n inject,\n input,\n InputSignal,\n OnDestroy,\n Output,\n Signal,\n WritableSignal,\n signal,\n} from '@angular/core';\n\nimport { DO_Layout_DataService } from '../../_services/do-layout.data-service';\nimport { DO_Presence_Type } from '../../../../_enums/dark-office/ccap-dark-office-presence.enum';\nimport { DO_CharacterScenePlacement_Type } from '../../../../_enums/dark-office/do-character-scene-placement.enum';\nimport { DO_BodyType_Type } from '../../../../_enums/dark-office/do-body-type.enum';\nimport { DO_CharacterAnim_Type } from '../../../../_enums/dark-office/do-character-anim.enum';\nimport { DO_CharacterType_Type } from '../../../../_enums/dark-office/do-character-type.enum';\nimport { DO_ClothingStyle_Type } from '../../../../_enums/dark-office/do-clothing-style.enum';\nimport { DO_HairStyle_Type } from '../../../../_enums/dark-office/do-hair-style.enum';\nimport { DO_OfficeInstanceState_Interface } from '../../../../_models/interfaces/dark-office/do-office-instance-state.interface';\nimport { DO_BubbleContent_Util } from '../../_collections/scene/do-bubble-content.util';\nimport { DO_BubbleEventType_Type } from '../../../../_enums/dark-office/do-bubble-event-type.enum';\nimport { DO_BubbleEventType_Util } from '../../_collections/scene/do-bubble-event-type.util';\nimport { DO_SvgSlot_Interface } from '../../_collections/consts/do-svg-slots.const';\n\n/** Walk-in/out animáció időtartam (ms). */\nconst WALK_DURATION_MS: number = 2000;\n/** Név label max karakter. */\nconst NAME_MAX_LEN: number = 10;\n/** Session név max karakter (kisebb font, szélesebb hely). */\nconst SESSION_NAME_MAX_LEN: number = 14;\n/** Activity szöveg max karakter. */\nconst ACTIVITY_MAX_LEN: number = 28;\n/** History bubble max elem (REQ-DO-BUBBLE-DECOR-001 follow-up): legfeljebb 3 előzmény. */\nconst BUBBLE_HISTORY_MAX: number = 3;\n\n/**\n * Bubble history-buffer egy entry-je (REQ-DO-BUBBLE-DECOR-001 follow-up).\n * Pre-computált orb-metaadat a render-time elkerülésére.\n */\ninterface DO_BubbleHistoryEntry {\n /** Megjelenítendő szöveg (csonkítva ACTIVITY_MAX_LEN-re). */\n text: string;\n /** Detektált event-típus. */\n eventType: DO_BubbleEventType_Type;\n /** Orb háttérszín (#hex). */\n orbFill: string;\n /** Orb glyph (unicode). */\n orbGlyph: string;\n /** Orb aria-label (accessibility). */\n orbLabel: string;\n}\n\n/**\n * Dark Office SVG karakter komponens.\n * Attribute selector: `<svg:g app-do-svg-char>` — SVG `<g>` elemre alkalmazható.\n * CSS transform-al pozicionál a slot-ba, walk-in/out animáció transition-nel.\n */\n@Component({\n selector: '[app-do-svg-char]',\n templateUrl: './do-svg-char.component.html',\n styleUrl: './do-svg-char.component.scss',\n})\n/** DO_SvgChar_Component class. */\nexport class DO_SvgChar_Component implements OnDestroy {\n\n private readonly layout_DS: DO_Layout_DataService = inject(DO_Layout_DataService);\n\n /** Instance állapot (parent-ből). */\n readonly instanceState: InputSignal<DO_OfficeInstanceState_Interface> = input.required();\n\n /** Gondolat buborék kattintás (sessionId-val, ha van). */\n @Output() readonly bubbleClick: EventEmitter<string> = new EventEmitter<string>();\n\n /** Enum referenciák a template-hez. */\n readonly hairType = DO_HairStyle_Type;\n readonly clothingType = DO_ClothingStyle_Type;\n readonly charType = DO_CharacterType_Type;\n\n // ---------------------------------------------------------------------------\n // Animáció állapot\n // ---------------------------------------------------------------------------\n\n /** Walk-in timer: animáció után átvált végső állapotra. */\n private walkInTimerId: ReturnType<typeof setTimeout> | null = null;\n /** Walk-in fázisban van-e (door → slot animáció). */\n private readonly atDoorForWalkIn_$: WritableSignal<boolean> = signal(false);\n /** Feloldott animáció állapot (walkIn végen → working/sitting). */\n readonly resolvedAnim_$: WritableSignal<DO_CharacterAnim_Type> = signal(DO_CharacterAnim_Type.standing);\n /** Animáció effect referencia (cleanup-hoz). */\n private readonly animEffectRef: EffectRef;\n /** Message-history rolling buffer effect referencia (REQ-DO-BUBBLE-DECOR-001 follow-up). */\n private readonly historyEffectRef: EffectRef;\n\n /** `ngOnDestroy` után ne fusson `syncAnimState` (queueMicrotask). */\n private isAnimEffectDestroyed: boolean = false;\n\n /**\n * Rolling history-buffer az utolsó N message-hez (REQ-DO-BUBBLE-DECOR-001 follow-up).\n *\n * Komponens-lokális signal: minden `lastMessage` változás push-olódik a buffer elejére\n * (newest first), max `BUBBLE_HISTORY_MAX` elem (3). Üres / unchanged lastMessage nem\n * push-olódik (nem duplikálódunk, ha az érték steady). A jelenlegi (legfrissebb) bubble\n * ezen kívüli; a `messageHistory_$` az ELŐZŐ N event-et tartalmazza.\n *\n * Az orb-metaadat (`fill`, `glyph`, `label`) **pre-computálva** kerül a buffer entry-be,\n * hogy a template ne hívjon method-ot — kompozit signal-érték property-access-szel olvasható.\n */\n readonly messageHistory_$: WritableSignal<DO_BubbleHistoryEntry[]> = signal([]);\n\n /** Utolsó látott `lastMessage` érték — a duplikálás-elkerüléshez. */\n private lastSeenMessage: string = '';\n\n constructor() {\n // queueMicrotask: signal write nem a effect szinkron fázisában — NG0600 elkerülése (allowSignalWrites nem mindig elég).\n this.animEffectRef = effect((): void => {\n const state: DO_OfficeInstanceState_Interface = this.instanceState();\n queueMicrotask((): void => {\n if (this.isAnimEffectDestroyed) {\n return;\n }\n this.syncAnimState(state);\n });\n });\n\n // Message-history rolling buffer effect (REQ-DO-BUBBLE-DECOR-001 follow-up).\n this.historyEffectRef = effect((): void => {\n const newMsg: string = this.instanceState().lastMessage ?? '';\n queueMicrotask((): void => {\n if (this.isAnimEffectDestroyed) {\n return;\n }\n this.recordMessageHistory(newMsg);\n });\n });\n }\n\n ngOnDestroy(): void {\n this.isAnimEffectDestroyed = true;\n if (this.walkInTimerId) clearTimeout(this.walkInTimerId);\n this.animEffectRef.destroy();\n this.historyEffectRef.destroy();\n }\n\n /**\n * Új lastMessage rögzítése a history-bufferben (REQ-DO-BUBBLE-DECOR-001 follow-up).\n *\n * Ha az új érték üres VAGY megegyezik az utolsóval → no-op. Egyébként:\n * a buffer elejére push-olja az új { text, eventType } entry-t (newest first), és\n * `BUBBLE_HISTORY_MAX` (3) elem után slice-eli. Az aktuális (legfrissebb) bubble\n * tartalma a `truncatedLastMessage_$` computed-ben jelenik meg, NEM a history bufferben.\n */\n private recordMessageHistory(newMsg: string): void {\n if (!newMsg || newMsg === this.lastSeenMessage) {\n return;\n }\n // Az ELŐZŐ message kerül a history-buffer elejére (a most érkező az aktuális bubble).\n if (this.lastSeenMessage) {\n const eventType: DO_BubbleEventType_Type =\n DO_BubbleEventType_Util.detectFromText(this.lastSeenMessage);\n const truncated: string = this.lastSeenMessage.length > ACTIVITY_MAX_LEN\n ? this.lastSeenMessage.slice(0, ACTIVITY_MAX_LEN - 1) + '…'\n : this.lastSeenMessage;\n const previous: DO_BubbleHistoryEntry = {\n text: truncated,\n eventType: eventType,\n orbFill: DO_BubbleEventType_Util.orbFillFor(eventType),\n orbGlyph: DO_BubbleEventType_Util.orbGlyphFor(eventType),\n orbLabel: DO_BubbleEventType_Util.orbLabelFor(eventType),\n };\n this.messageHistory_$.update((h: DO_BubbleHistoryEntry[]): DO_BubbleHistoryEntry[] =>\n [previous, ...h].slice(0, BUBBLE_HISTORY_MAX),\n );\n }\n this.lastSeenMessage = newMsg;\n }\n\n // ---------------------------------------------------------------------------\n // Pozíció + Transform (host binding)\n // ---------------------------------------------------------------------------\n\n /** Slot pozíció presence alapján (overflow esetén dinamikus pozíció). */\n readonly slotPosition_$: Signal<DO_SvgSlot_Interface> = computed((): DO_SvgSlot_Interface => {\n const state: DO_OfficeInstanceState_Interface = this.instanceState();\n const isWorking: boolean = state.presence === DO_Presence_Type.working;\n const placement: DO_CharacterScenePlacement_Type | undefined = state.scenePlacement;\n const d = this.layout_DS.derived_$();\n let slots: DO_SvgSlot_Interface[];\n if (placement === DO_CharacterScenePlacement_Type.meeting) {\n slots = d.meetingSlots;\n } else if (isWorking) {\n slots = d.workstationSlots;\n } else {\n slots = d.restSlots;\n }\n const idx: number = Math.max(0, state.assignedSlotIndex);\n if (idx < slots.length) {\n return slots[idx];\n }\n // Overflow: dinamikus pozíció a definiált slotokon túl (soronként 3 oszlop).\n const overflowIdx: number = idx - slots.length;\n const col: number = overflowIdx % 3;\n const row: number = Math.floor(overflowIdx / 3);\n if (placement === DO_CharacterScenePlacement_Type.meeting) {\n const fc = d.floorConference;\n return { x: fc.x + 48 + col * 72, y: fc.y + 40 + row * 44 };\n }\n if (isWorking) {\n return { x: d.floorWorkspace.x + 80 + col * 96, y: d.floorWorkspace.y + 80 + row * 120 };\n }\n const restCols: number = Math.max(1, this.layout_DS.grid_$().restCols);\n const colO: number = overflowIdx % restCols;\n const rowO: number = Math.floor(overflowIdx / restCols);\n const stepX: number = Math.max(72, Math.round((d.floorLounge.w - 80) / Math.max(1, restCols)));\n const stepY: number = Math.max(88, Math.round(d.floorLounge.h / Math.max(2, this.layout_DS.grid_$().restRows + 1)));\n return {\n x: d.floorLounge.x + 40 + colO * stepX,\n y: d.floorLounge.y + 52 + rowO * stepY,\n };\n });\n\n /** Aktuális cél pozíció (walk animáció figyelembevételével). */\n readonly targetPosition_$: Signal<DO_SvgSlot_Interface> = computed((): DO_SvgSlot_Interface => {\n const anim: DO_CharacterAnim_Type = this.resolvedAnim_$();\n if (anim === DO_CharacterAnim_Type.walkingOut) return this.layout_DS.getDoorPosition();\n if (this.atDoorForWalkIn_$()) return this.layout_DS.getDoorPosition();\n return this.slotPosition_$();\n });\n\n /** CSS transform a host `<g>` elemen (pozicionálás). */\n @HostBinding('style.transform')\n get hostTransform(): string {\n const pos: DO_SvgSlot_Interface = this.targetPosition_$();\n return `translate(${pos.x}px, ${pos.y}px)`;\n }\n\n readonly hostTransition_$ = computed((): string => {\n const anim: DO_CharacterAnim_Type = this.resolvedAnim_$();\n if (anim === DO_CharacterAnim_Type.walkingIn && !this.atDoorForWalkIn_$()) {\n return `transform ${WALK_DURATION_MS}ms ease-in-out`;\n }\n if (anim === DO_CharacterAnim_Type.walkingOut) {\n return `transform ${WALK_DURATION_MS}ms ease-in-out, opacity ${WALK_DURATION_MS}ms ease-in`;\n }\n if (anim === DO_CharacterAnim_Type.walkingBetween) {\n return `transform ${WALK_DURATION_MS}ms ease-in-out`;\n }\n return 'none';\n });\n\n @HostBinding('style.transition')\n get hostTransition(): string {\n return this.hostTransition_$();\n }\n\n /** Walk-out opacity animáció. */\n @HostBinding('style.opacity')\n get hostOpacity(): string {\n return this.resolvedAnim_$() === DO_CharacterAnim_Type.walkingOut ? '0' : '1';\n }\n\n /** Transform origin SVG-hez: bal felső sarok (0,0). */\n @HostBinding('style.transform-origin')\n get hostTransformOrigin(): string {\n return '0 0';\n }\n\n // ---------------------------------------------------------------------------\n // Megjelenítés segédek (template-hez)\n // ---------------------------------------------------------------------------\n\n /** Megjelenítendő név (display name vagy instanceId rövidítve). */\n readonly displayName_$: Signal<string> = computed((): string => {\n const state: DO_OfficeInstanceState_Interface = this.instanceState();\n const custom: string = state.visuals?.displayName?.trim() ?? '';\n if (custom) return custom.length > NAME_MAX_LEN ? custom.slice(0, NAME_MAX_LEN) : custom;\n const id: string = state.instanceId ?? '';\n return id.length > NAME_MAX_LEN ? id.slice(0, NAME_MAX_LEN) : id;\n });\n\n /** Rövidített session név (karakter név alatti alcím). */\n readonly displaySessionName_$: Signal<string> = computed((): string => {\n const name: string = this.instanceState().sessionName ?? '';\n if (!name) return '';\n return name.length > SESSION_NAME_MAX_LEN ? name.slice(0, SESSION_NAME_MAX_LEN - 1) + '…' : name;\n });\n\n /**\n * Rövidített utolsó üzenet szöveg a buborékhoz (REQ-DO-BUBBLE-USER-PART-001).\n *\n * A `lastMessage` plain string átfut a `DO_BubbleContent_Util.extractUserFacingPart` heurisztikus\n * szűrőn (markdown code-fence, shell prompt, tool-marker, single-line JSON eltávolítás), majd\n * SVG-bubble méretre csonkítva (max `ACTIVITY_MAX_LEN` char). Ha a szűrt eredmény üres,\n * fallback az `activitySummary`-re (rövid label, pl. „Working\" / „Idle\").\n */\n readonly truncatedLastMessage_$: Signal<string> = computed((): string => {\n const state: DO_OfficeInstanceState_Interface = this.instanceState();\n const filtered: string = DO_BubbleContent_Util.extractUserFacingPart(state.lastMessage ?? '');\n const source: string = filtered || (state.activitySummary ?? '');\n if (!source) {\n return '';\n }\n return source.length > ACTIVITY_MAX_LEN\n ? source.slice(0, ACTIVITY_MAX_LEN - 1) + '…'\n : source;\n });\n\n /** Üzenet buborék szélességét megbecsülő helper (SVG egységben). */\n readonly bubbleWidth_$: Signal<number> = computed((): number => {\n const len: number = this.truncatedLastMessage_$().length;\n return Math.max(40, Math.min(100, len * 3.2 + 16));\n });\n\n /**\n * Bubble event-típus heurisztikus detekció (REQ-DO-BUBBLE-DECOR-001) — a `lastMessage`\n * szöveg-tartalmából. A template az icon-orb háttérszínét és glyph-ját ehhez igazítja.\n */\n readonly bubbleEventType_$: Signal<DO_BubbleEventType_Type> = computed(\n (): DO_BubbleEventType_Type => {\n return DO_BubbleEventType_Util.detectFromText(this.instanceState().lastMessage);\n },\n );\n\n /**\n * Icon-orb háttérszín a bubble event-típushoz (REQ-DO-BUBBLE-DECOR-001).\n * A logika a `DO_BubbleEventType_Util.orbFillFor` static helper-ben (közös history bubble-rel).\n */\n readonly bubbleOrbFill_$: Signal<string> = computed((): string => {\n return DO_BubbleEventType_Util.orbFillFor(this.bubbleEventType_$());\n });\n\n /**\n * Icon-orb glyph (unicode) a bubble event-típushoz (REQ-DO-BUBBLE-DECOR-001).\n * Kis SVG-text-ben jelenik meg az orb közepén.\n */\n readonly bubbleOrbGlyph_$: Signal<string> = computed((): string => {\n return DO_BubbleEventType_Util.orbGlyphFor(this.bubbleEventType_$());\n });\n\n /**\n * Aria-label / tooltip szöveg az orb-on (accessibility — REQ-DO-BUBBLE-DECOR-001).\n */\n readonly bubbleOrbLabel_$: Signal<string> = computed((): string => {\n return DO_BubbleEventType_Util.orbLabelFor(this.bubbleEventType_$());\n });\n\n // ---------------------------------------------------------------------------\n // Body type transform-ok\n // ---------------------------------------------------------------------------\n\n /** Body type – felső test (törzs + kar) SVG transform. */\n readonly upperBodyTransform_$: Signal<string> = computed((): string => {\n const bodyType: DO_BodyType_Type = this.instanceState().visuals.bodyType ?? DO_BodyType_Type.average;\n switch (bodyType) {\n case DO_BodyType_Type.slim: return 'translate(20,0) scale(0.82,1) translate(-20,0)';\n case DO_BodyType_Type.stocky: return 'translate(20,0) scale(1.15,1) translate(-20,0)';\n case DO_BodyType_Type.athletic: return 'translate(20,0) scale(1.1,1) translate(-20,0)';\n default: return '';\n }\n });\n\n /** Body type – alsó test (lábak) SVG transform. */\n readonly lowerBodyTransform_$: Signal<string> = computed((): string => {\n const bodyType: DO_BodyType_Type = this.instanceState().visuals.bodyType ?? DO_BodyType_Type.average;\n switch (bodyType) {\n case DO_BodyType_Type.slim: return 'translate(20,0) scale(0.85,1) translate(-20,0)';\n case DO_BodyType_Type.stocky: return 'translate(20,0) scale(1.1,1) translate(-20,0)';\n case DO_BodyType_Type.athletic: return 'translate(20,0) scale(0.92,1) translate(-20,0)';\n default: return '';\n }\n });\n\n /** Working animáció aktív-e. */\n readonly isWorking_$: Signal<boolean> = computed(\n (): boolean => this.resolvedAnim_$() === DO_CharacterAnim_Type.working,\n );\n\n /**\n * Walking animáció aktív-e (lábmozgás).\n *\n * Tartalmazza az `idleWalking` állapotot is (REQ-DO-CHAR-IDLE-WALK-001) — a karakter\n * 5–15 perc idle-walk fázisban folyamatos leg-swing-et mutat, jelezve hogy „még itt vagyok,\n * de nincs feladat\". A tranzíciós walkingIn/walkingOut/walkingBetween 2s alatt befejezi a\n * lábmozgást, az idleWalking viszont a teljes 15 perces ablak alatt steady állapotú.\n */\n readonly isWalking_$: Signal<boolean> = computed((): boolean => {\n const anim: DO_CharacterAnim_Type = this.resolvedAnim_$();\n return anim === DO_CharacterAnim_Type.walkingIn\n || anim === DO_CharacterAnim_Type.walkingOut\n || anim === DO_CharacterAnim_Type.walkingBetween\n || anim === DO_CharacterAnim_Type.idleWalking;\n });\n\n /** Gondolat buborék kattintható-e (van session hozzárendelve). */\n readonly isBubbleClickable_$: Signal<boolean> = computed(\n (): boolean => !!this.instanceState().latestSessionId,\n );\n\n /** Buborék vízszintes eltolás SVG egységben (szomszédos buborékok átfedésének elkerülésére). */\n readonly bubbleOffsetX_$: Signal<number> = computed((): number => {\n const slotIndex: number = this.instanceState().assignedSlotIndex;\n return slotIndex % 2 === 0 ? -18 : 18;\n });\n\n /** Buborék farok polygon pontjai (eltolás kompenzációval, karakter közepére mutat). */\n readonly bubbleTailPoints_$: Signal<string> = computed((): string => {\n const ox: number = this.bubbleOffsetX_$();\n return `${ox - 4},-68.5 ${ox + 4},-68.5 0,-64`;\n });\n\n /**\n * Gondolat buborékra kattintás kezelése.\n * Csak akkor emit-el ha van latestSessionId. Propagáció megállítása\n * szükséges, hogy ne trigger-elje a karakter kattintás handlert.\n */\n handleBubbleClick(event: Event): void {\n event.stopPropagation();\n const sessionId: string | null = this.instanceState().latestSessionId;\n if (sessionId) {\n this.bubbleClick.emit(sessionId);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Privát animáció logika\n // ---------------------------------------------------------------------------\n\n /**\n * Animáció állapot szinkronizálás instance state változásra.\n * Walk-in: door pozícióból indul, delay után slot-ba mozog.\n */\n private syncAnimState(state: DO_OfficeInstanceState_Interface): void {\n if (this.walkInTimerId) {\n clearTimeout(this.walkInTimerId);\n this.walkInTimerId = null;\n }\n\n const anim: DO_CharacterAnim_Type = state.animState;\n\n if (anim === DO_CharacterAnim_Type.walkingIn) {\n // Door pozícióból indulunk, 50ms delay után slot-ra váltunk (transition animálja)\n this.resolvedAnim_$.set(DO_CharacterAnim_Type.walkingIn);\n this.atDoorForWalkIn_$.set(true);\n this.walkInTimerId = setTimeout((): void => {\n this.atDoorForWalkIn_$.set(false);\n // Walk animáció végén végleges állapot\n this.walkInTimerId = setTimeout((): void => {\n const finalAnim: DO_CharacterAnim_Type =\n state.presence === DO_Presence_Type.working\n ? DO_CharacterAnim_Type.working\n : DO_CharacterAnim_Type.sitting;\n this.resolvedAnim_$.set(finalAnim);\n this.walkInTimerId = null;\n }, WALK_DURATION_MS);\n }, 50);\n return;\n }\n\n // Slotok közötti séta (idle↔working): pozíció transition-nel animálódik, végén végleges póz\n if (anim === DO_CharacterAnim_Type.walkingBetween) {\n this.atDoorForWalkIn_$.set(false);\n this.resolvedAnim_$.set(DO_CharacterAnim_Type.walkingBetween);\n this.walkInTimerId = setTimeout((): void => {\n const finalAnim: DO_CharacterAnim_Type =\n state.presence === DO_Presence_Type.working\n ? DO_CharacterAnim_Type.working\n : DO_CharacterAnim_Type.sitting;\n this.resolvedAnim_$.set(finalAnim);\n this.walkInTimerId = null;\n }, WALK_DURATION_MS);\n return;\n }\n\n this.atDoorForWalkIn_$.set(false);\n this.resolvedAnim_$.set(anim ?? DO_CharacterAnim_Type.standing);\n }\n}\n", "<!-- Talajárnyék (4 réteg: fokozatos mélység, erősebb kontakt) -->\n<svg:ellipse cx=\"0\" cy=\"5\" rx=\"20\" ry=\"4.5\" fill=\"black\" opacity=\"0.08\"/>\n<svg:ellipse cx=\"0\" cy=\"4\" rx=\"15\" ry=\"3.5\" fill=\"black\" opacity=\"0.15\"/>\n<svg:ellipse cx=\"0\" cy=\"3\" rx=\"10\" ry=\"2.5\" fill=\"black\" opacity=\"0.25\"/>\n<svg:ellipse cx=\"0\" cy=\"2\" rx=\"5\" ry=\"1.2\" fill=\"black\" opacity=\"0.40\"/>\n\n<svg:g transform=\"scale(0.8) translate(-20, -68)\" filter=\"url(#doCharEffect)\">\n <svg:g class=\"do-char-body\"\n [class.do-char-body--working]=\"isWorking_$()\">\n\n <!-- Alsó test (body type transform: lábak) -->\n <svg:g [attr.transform]=\"lowerBodyTransform_$()\">\n <svg:g app-do-char-lower-body\n [pantsColor]=\"instanceState().visuals.pantsColor\"\n [isWalking]=\"isWalking_$()\"></svg:g>\n </svg:g>\n\n <!-- Felső test (body type transform: kar + törzs) -->\n <svg:g [attr.transform]=\"upperBodyTransform_$()\">\n <svg:g app-do-char-arms\n [skinColor]=\"instanceState().visuals.skinColor\"\n [shirtColor]=\"instanceState().visuals.shirtColor\"\n [clothingStyle]=\"instanceState().visuals.clothingStyle\"\n [characterType]=\"instanceState().characterType ?? charType.ccap\"></svg:g>\n\n <svg:g app-do-char-torso\n [shirtColor]=\"instanceState().visuals.shirtColor\"\n [clothingStyle]=\"instanceState().visuals.clothingStyle\"\n [isWorking]=\"isWorking_$()\"></svg:g>\n </svg:g>\n\n <svg:g app-do-char-neck-head\n [skinColor]=\"instanceState().visuals.skinColor\"></svg:g>\n\n @if (!isWorking_$()) {\n <svg:g app-do-char-face\n [eyeColor]=\"instanceState().visuals.eyeColor\"></svg:g>\n }\n\n <svg:g app-do-char-hair\n [hairColor]=\"instanceState().visuals.hairColor\"\n [hairStyle]=\"instanceState().visuals.hairStyle\"></svg:g>\n\n </svg:g>\n</svg:g>\n\n<!-- Név label (neon kerettel) — session névvel bővül ha van -->\n<svg:g>\n @if (displaySessionName_$()) {\n <svg:rect [attr.x]=\"-25\" y=\"9\" width=\"50\" height=\"20\" rx=\"4\"\n fill=\"none\" stroke=\"rgba(0,229,255,0.08)\" stroke-width=\"1.5\"\n filter=\"url(#doGlowSmall)\"/>\n <svg:rect [attr.x]=\"-24\" y=\"10\" width=\"48\" height=\"18\" rx=\"3\"\n fill=\"rgba(10,12,16,0.82)\" stroke=\"rgba(0,229,255,0.15)\" stroke-width=\"0.4\"/>\n } @else {\n <svg:rect [attr.x]=\"-25\" y=\"9\" width=\"50\" height=\"12\" rx=\"4\"\n fill=\"none\" stroke=\"rgba(0,229,255,0.08)\" stroke-width=\"1.5\"\n filter=\"url(#doGlowSmall)\"/>\n <svg:rect [attr.x]=\"-24\" y=\"10\" width=\"48\" height=\"10\" rx=\"3\"\n fill=\"rgba(10,12,16,0.82)\" stroke=\"rgba(0,229,255,0.15)\" stroke-width=\"0.4\"/>\n }\n <svg:text x=\"0\" y=\"17\" text-anchor=\"middle\"\n fill=\"#d1d5db\" font-size=\"6\" font-family=\"monospace\">\n {{ displayName_$() }}\n </svg:text>\n @if (displaySessionName_$()) {\n <svg:text x=\"0\" y=\"24\" text-anchor=\"middle\"\n fill=\"#22d3ee\" font-size=\"4\" font-family=\"monospace\" opacity=\"0.8\">\n {{ displaySessionName_$() }}\n </svg:text>\n }\n</svg:g>\n\n<!-- Üzenet buborék: van lastMessage → megjelenik, offline presence esetén is. -->\n<!--\n REQ-DO-BUBBLE-DECOR-001 follow-up: history bubble-ök az aktuális (current) bubble FÖLÖTT\n (newest first @index=0, alacsonyabb y-érték = SVG-ben fentebb). Maximum 3 előzmény;\n szürkés / áttetszőbb stílus + saját icon-orb minden bubble-höz.\n-->\n@for (h of messageHistory_$(); track $index; let idx = $index) {\n <svg:g class=\"do-char-bubble do-char-bubble--history\">\n <svg:g [attr.transform]=\"'translate(' + bubbleOffsetX_$() + ', ' + (-12 - idx * 12) + ')'\">\n <svg:rect [attr.x]=\"-bubbleWidth_$() / 2\" y=\"-82\"\n [attr.width]=\"bubbleWidth_$()\" height=\"11\" rx=\"3\"\n fill=\"rgba(15,20,30,0.55)\"\n stroke=\"rgba(148,163,184,0.25)\" stroke-width=\"0.4\"/>\n <svg:text x=\"0\" y=\"-74\" text-anchor=\"middle\"\n fill=\"rgba(148,163,184,0.7)\" font-size=\"3.6\" font-family=\"monospace\">\n {{ h.text }}\n </svg:text>\n <svg:g class=\"do-char-bubble-orb\">\n <svg:title>{{ h.orbLabel }}</svg:title>\n <svg:circle [attr.cx]=\"-bubbleWidth_$() / 2 - 5\" cy=\"-77\"\n r=\"2.5\"\n [attr.fill]=\"h.orbFill\"\n fill-opacity=\"0.7\"\n stroke=\"rgba(15,20,30,0.95)\"\n stroke-width=\"0.3\"/>\n <svg:text [attr.x]=\"-bubbleWidth_$() / 2 - 5\" y=\"-76\"\n text-anchor=\"middle\"\n fill=\"#0a0a0a\"\n font-size=\"2.6\" font-family=\"monospace\" font-weight=\"bold\">\n {{ h.orbGlyph }}\n </svg:text>\n </svg:g>\n </svg:g>\n </svg:g>\n}\n\n@if (truncatedLastMessage_$()) {\n <svg:g class=\"do-char-bubble\"\n [class.do-char-bubble--clickable]=\"isBubbleClickable_$()\"\n (click)=\"handleBubbleClick($event)\">\n\n <svg:g [attr.transform]=\"'translate(' + bubbleOffsetX_$() + ', 0)'\">\n <svg:rect [attr.x]=\"-bubbleWidth_$() / 2 - 4\" y=\"-86\"\n [attr.width]=\"bubbleWidth_$() + 8\" height=\"24\" rx=\"6\"\n fill=\"transparent\"/>\n <svg:rect [attr.x]=\"-bubbleWidth_$() / 2 - 1\" y=\"-83\"\n [attr.width]=\"bubbleWidth_$() + 2\" height=\"16\" rx=\"5\"\n fill=\"none\" stroke=\"rgba(0,255,200,0.15)\" stroke-width=\"2\"\n filter=\"url(#doGlowSmall)\"/>\n <svg:rect [attr.x]=\"-bubbleWidth_$() / 2\" y=\"-82\"\n [attr.width]=\"bubbleWidth_$()\" height=\"14\" rx=\"4\"\n fill=\"rgba(15,20,30,0.92)\"\n stroke=\"rgba(0,255,200,0.4)\" stroke-width=\"0.6\"/>\n <svg:text x=\"0\" y=\"-73\" text-anchor=\"middle\"\n fill=\"#cbd5e1\" font-size=\"4.5\" font-family=\"monospace\">\n {{ truncatedLastMessage_$() }}\n </svg:text>\n\n <!--\n REQ-DO-BUBBLE-DECOR-001: bubble bal oldali színes „icon orb\" — event-típus jelölő.\n Pozíció: a bubble bal éle előtt 6 SVG egységgel, vertikálisan a bubble közepén.\n -->\n <svg:g class=\"do-char-bubble-orb\">\n <svg:title>{{ bubbleOrbLabel_$() }}</svg:title>\n <svg:circle [attr.cx]=\"-bubbleWidth_$() / 2 - 6\" cy=\"-75\"\n r=\"3.5\"\n [attr.fill]=\"bubbleOrbFill_$()\"\n stroke=\"rgba(15,20,30,0.95)\"\n stroke-width=\"0.4\"\n filter=\"url(#doGlowSmall)\"/>\n <svg:text [attr.x]=\"-bubbleWidth_$() / 2 - 6\" y=\"-73.5\"\n text-anchor=\"middle\"\n fill=\"#0a0a0a\"\n font-size=\"3.6\" font-family=\"monospace\" font-weight=\"bold\">\n {{ bubbleOrbGlyph_$() }}\n </svg:text>\n </svg:g>\n </svg:g>\n\n <svg:polygon [attr.points]=\"bubbleTailPoints_$()\" fill=\"rgba(15,20,30,0.92)\"/>\n <svg:line [attr.x1]=\"bubbleOffsetX_$() - 3.5\" y1=\"-68.5\" x2=\"0\" y2=\"-64.5\"\n stroke=\"rgba(0,255,200,0.4)\" stroke-width=\"0.5\"/>\n <svg:line [attr.x1]=\"bubbleOffsetX_$() + 3.5\" y1=\"-68.5\" x2=\"0\" y2=\"-64.5\"\n stroke=\"rgba(0,255,200,0.4)\" stroke-width=\"0.5\"/>\n </svg:g>\n}\n", "import {\n AfterViewInit,\n Component,\n computed,\n ElementRef,\n inject,\n OnDestroy,\n Signal,\n ViewChild,\n WritableSignal,\n signal,\n} from '@angular/core';\n\nimport { DarkOffice_DataService } from '../../_services/dark-office.data-service';\nimport { DO_Layout_DataService } from '../../_services/do-layout.data-service';\nimport { DO_OfficeInstanceState_Interface } from '../../../../_models/interfaces/dark-office/do-office-instance-state.interface';\nimport {\n DO_ZOOM_MIN,\n DO_ZOOM_MAX,\n DO_PAN_VISIBLE_RATIO,\n} from '../../_collections/consts/do-tile-system.const';\nimport { DO_SceneCharacterPanelInstanceId_Util } from '../../_collections/utils/do-scene-character-panel-instance-id.util';\nimport { DO_OfficeLayoutRect_Interface } from '../../_collections/do-office-layout/do-office-layout-derived.interface';\n\n/**\n * Legacy `doForestEdge` artwork bounds — a fák/bokrok ebben a 1536×864 box-ban vannak szerkesztve.\n */\nconst DO_SCENE_LEGACY_FOREST_W: number = 1536;\nconst DO_SCENE_LEGACY_FOREST_H: number = 864;\n\n/**\n * Dark Office iroda jelenet komponens – SVG viewport zoom/pan-nel.\n *\n * Koordináta rendszer: dinamikus világ (`DO_Layout_DataService` → `derived_$`).\n * A zoom a viewBox dinamikus számításával valósul meg (nem CSS transform),\n * ahogy a régi koordinátor office-view-jában is történt.\n *\n * - Egér-kerék: zoom a cursor pozíció megtartásával\n * - Bal/középső gomb + drag: pan (csak zoomolt állapotban)\n * - +/−/↺ gombok: center-alapú zoom\n *\n * ## Adat SSOT\n * Instance lista és karakter lista: közvetlenül `DarkOffice_DataService` signaljai a template-ben —\n * nincs duplikált `computed` wrapper a scene komponensben.\n */\n@Component({\n selector: 'app-do-office-scene',\n templateUrl: './do-office-scene.component.html',\n styleUrl: './do-office-scene.component.scss',\n})\n/** DO_Scene_Component class. */\nexport class DO_Scene_Component implements AfterViewInit, OnDestroy {\n\n readonly darkOffice_DS: DarkOffice_DataService = inject(DarkOffice_DataService);\n\n readonly officeLayout_DS: DO_Layout_DataService = inject(DO_Layout_DataService);\n\n /** SVG világ méret — template clearing rect (signal). */\n readonly sceneWorldW_$: Signal<number> = computed(\n (): number => this.officeLayout_DS.derived_$().worldW,\n );\n readonly sceneWorldH_$: Signal<number> = computed(\n (): number => this.officeLayout_DS.derived_$().worldH,\n );\n\n /** Template rövidítés — derivált layout egy signalban. */\n readonly layoutDerived_$ = computed(() => this.officeLayout_DS.derived_$());\n\n /**\n * Nagy háttér rect — `environmentOverflowPx` + dinamikus világ (pan közben ne legyen üres rész).\n */\n readonly environmentBackdropRect_$ = computed((): DO_OfficeLayoutRect_Interface => {\n const d = this.officeLayout_DS.derived_$();\n const o: number = d.environmentOverflowPx;\n const ww: number = d.worldW;\n const wh: number = d.worldH;\n return {\n x: -o,\n y: -o,\n w: o * 2 + ww,\n h: o * 2 + wh,\n };\n });\n\n /**\n * Déli fa-sor: legacy alj (864) → aktuális `worldH` (Y translate, nincs fix `+124` hack).\n */\n readonly forestSouthGroupTransform_$ = computed((): string => {\n const dy: number = this.officeLayout_DS.derived_$().worldH - DO_SCENE_LEGACY_FOREST_H;\n return `translate(0, ${dy})`;\n });\n\n /**\n * Keleti fa-sor: jobb szél illesztése a szélesebb / keskenyebb világhoz.\n */\n readonly forestEastGroupTransform_$ = computed((): string => {\n const dx: number = this.officeLayout_DS.derived_$().worldW - DO_SCENE_LEGACY_FOREST_W;\n return `translate(${dx}, 0)`;\n });\n\n /**\n * Bejárati ösvény — `door` alól a világ déli széléig (neon szegélyek).\n */\n readonly entrancePathRect_$ = computed((): DO_OfficeLayoutRect_Interface => {\n const d = this.officeLayout_DS.derived_$();\n const w: number = 96;\n return {\n x: d.door.x - w / 2,\n y: d.door.y,\n w: w,\n h: Math.max(40, d.worldH - d.door.y),\n };\n });\n\n /** Déli utcai lámpák bázis — legacy (90,710) / (1440,710) anchor, `door` közelében újraszámolva. */\n readonly decorLampSouthWestBase_$ = computed((): { x: number; y: number } => {\n const d = this.officeLayout_DS.derived_$();\n const x: number = Math.max(24, Math.min(d.door.x - 420, d.worldW - 120));\n return { x: x, y: d.door.y + 6 };\n });\n\n readonly decorLampSouthEastBase_$ = computed((): { x: number; y: number } => {\n const d = this.officeLayout_DS.derived_$();\n const x: number = Math.min(d.worldW - 30, Math.max(d.door.x + 420, 120));\n return { x: x, y: d.door.y + 6 };\n });\n\n /** Északi ablaksáv — dinamikus épületszélességhez. */\n readonly northWindowRects_$ = computed((): DO_OfficeLayoutRect_Interface[] => {\n const b: DO_OfficeLayoutRect_Interface = this.officeLayout_DS.derived_$().buildingOuter;\n const count: number = 5;\n const padX: number = 64;\n const gap: number = 16;\n const usable: number = b.w - 2 * padX - gap * (count - 1);\n const ww: number = Math.max(48, usable / count);\n const out: DO_OfficeLayoutRect_Interface[] = [];\n for (let i: number = 0; i < count; i++) {\n out.push({\n x: b.x + padX + i * (ww + gap),\n y: b.y + 4,\n w: ww,\n h: 24,\n });\n }\n return out;\n });\n\n @ViewChild('svgElement') private readonly svgRef!: ElementRef<SVGSVGElement>;\n\n /** Kiválasztott instance állapot (vizuál editor modal — data-service lookup SSOT). */\n readonly selectedInstance_$: Signal<DO_OfficeInstanceState_Interface | null> = computed(\n (): DO_OfficeInstanceState_Interface | null =>\n this.darkOffice_DS.resolveOfficeInstanceById(this.darkOffice_DS.selectedInstanceId_$()),\n );\n\n // ---------------------------------------------------------------------------\n // Zoom / Pan állapot\n // ---------------------------------------------------------------------------\n\n /** Zoom szint (1 = világ kitölti a nézetet, >1 = nagyítás). */\n readonly scale_$: WritableSignal<number> = signal(1);\n /** Viewport center X (SVG koordináta). Alapértelmezés: világ közepe. */\n readonly centerX_$: WritableSignal<number> = signal(912);\n /** Viewport center Y (SVG koordináta). Alapértelmezés: világ közepe. */\n readonly centerY_$: WritableSignal<number> = signal(528);\n /** Drag folyamatban van-e (cursor megjelenítéshez). */\n readonly isDragging_$: WritableSignal<boolean> = signal(false);\n\n /**\n * Dinamikus SVG viewBox string.\n * viewBox = \"minX minY width height\", ahol:\n * width = WORLD_W / scale\n * height = WORLD_H / scale\n * minX = clampedCenterX - width/2\n * minY = clampedCenterY - height/2\n */\n readonly viewBox_$: Signal<string> = computed((): string => {\n const s: number = this.scale_$();\n const ww: number = this.sceneWorldW_$();\n const wh: number = this.sceneWorldH_$();\n const vw: number = ww / s;\n const vh: number = wh / s;\n const cx: number = this.clampCenter(this.centerX_$(), ww, vw);\n const cy: number = this.clampCenter(this.centerY_$(), wh, vh);\n return `${cx - vw / 2} ${cy - vh / 2} ${vw} ${vh}`;\n });\n\n /** Zoom százalékban megjelenítve. */\n readonly zoomPercent_$: Signal<number> = computed((): number => Math.round(this.scale_$() * 100));\n /** Zoom a maximumon van-e. */\n readonly isZoomMax_$: Signal<boolean> = computed((): boolean => this.scale_$() >= DO_ZOOM_MAX);\n /** Zoom az alap (1.0) értéken van-e. */\n readonly isZoomMin_$: Signal<boolean> = computed((): boolean => this.scale_$() <= DO_ZOOM_MIN);\n\n /** Wheel event handler referencia (eltávolításhoz). */\n private readonly wheelHandler = (event: WheelEvent): void => { this.onWheel(event); };\n private dragStartMouseX: number = 0;\n private dragStartMouseY: number = 0;\n private dragStartCx: number = 0;\n private dragStartCy: number = 0;\n\n /**\n * Aktív pointer-ek nyilvántartása pinch-zoom-hoz (REQ-DO-TOUCH-001).\n * Pointer Events API egységes mouse + touch + pen kezelést ad; Map a pointerId-ra\n * indexelve tárolja az aktív lenyomott ujjak / kurzorok pozícióját.\n */\n private readonly activePointers: Map<number, { x: number; y: number }> = new Map();\n /** Pinch-zoom kezdő ujjtávolság (két aktív pointer közötti euklideszi távolság px-ben). */\n private pinchStartDistance: number = 0;\n /** Pinch-zoom kezdő scale (a két ujj lenyomásának pillanatában). */\n private pinchStartScale: number = 1;\n /** Pinch-zoom kezdő center X (a két ujj lenyomásának pillanatában). */\n private pinchStartCenterX: number = 0;\n /** Pinch-zoom kezdő center Y. */\n private pinchStartCenterY: number = 0;\n /** Pinch-zoom kezdő midpoint X — a két ujj közepe screen px-ben (anchor-at-midpoint). */\n private pinchStartMidX: number = 0;\n /** Pinch-zoom kezdő midpoint Y. */\n private pinchStartMidY: number = 0;\n\n ngAfterViewInit(): void {\n // passive: false szükséges a preventDefault() híváshoz (scroll blokkolás)\n this.svgRef.nativeElement.addEventListener('wheel', this.wheelHandler, { passive: false });\n }\n\n ngOnDestroy(): void {\n this.svgRef?.nativeElement.removeEventListener('wheel', this.wheelHandler);\n }\n\n /** Karakter track fn @for-hoz. */\n trackInstance(instance: DO_OfficeInstanceState_Interface): string {\n return instance.instanceId;\n }\n\n // ---------------------------------------------------------------------------\n // Karakter / editor / chat interakciók (delegálás a data service felé)\n // ---------------------------------------------------------------------------\n\n /**\n * Jeleneti karakter egyszeres kattintás — ugyanaz a Instance státusz modal, mint a bal panelen.\n */\n handleSceneCharacterClick(character: DO_OfficeInstanceState_Interface): void {\n const panelInstanceId: string = DO_SceneCharacterPanelInstanceId_Util.resolve({ character: character });\n this.darkOffice_DS.openInstanceStatusDetail(panelInstanceId);\n }\n\n /**\n * Jeleneti karakter dupla kattintás — panel kártyával azonos: státusz modal zárás + vizuál editor.\n */\n handleSceneCharacterDblClick(character: DO_OfficeInstanceState_Interface): void {\n const panelInstanceId: string = DO_SceneCharacterPanelInstanceId_Util.resolve({ character: character });\n this.darkOffice_DS.closeInstanceStatusDetail();\n this.darkOffice_DS.selectInstance(panelInstanceId);\n }\n\n /** Bal panel dupla kattintás — Karakter beállítások (vizuál editor) megnyitása. */\n handlePanelOpenVisualEditor(instanceId: string): void {\n this.darkOffice_DS.selectInstance(instanceId);\n }\n\n /**\n * Chat popup megnyitása (REQ-DO-BUBBLE-CLICK-POPUP-001).\n *\n * A `character` kontextusból kiolvassuk a `characterType`-ot, így a popup tudja, milyen\n * típusú session-t mutat (CCAP/CC/OC/CA) — type-aware route link + jövőbeli detail-komponens\n * kiválasztáshoz (DO-C Slice 2b follow-up).\n */\n handleThoughtBubbleClick(sessionId: string, character: DO_OfficeInstanceState_Interface): void {\n this.darkOffice_DS.openChatPopup(sessionId, character.characterType ?? null);\n }\n\n /** Vizuál editor bezárása. */\n handleEditorClose(): void {\n this.darkOffice_DS.selectInstance(null);\n }\n\n /** Chat popup bezárása. */\n handleChatPopupClose(): void {\n this.darkOffice_DS.closeChatPopup();\n }\n\n /** Error overlay bezárása. */\n handleErrorDismiss(): void {\n this.darkOffice_DS.dismissError();\n }\n\n // ---------------------------------------------------------------------------\n // Zoom gombok\n // ---------------------------------------------------------------------------\n\n /** Zoom növelés (center-alapú, additív lépés mint a régi koordinátor +/- billentyűje). */\n handleZoomIn(): void {\n this.applyZoomAtPoint(this.scale_$() + 0.15, 0.5, 0.5);\n }\n\n /** Zoom csökkentés (center-alapú). */\n handleZoomOut(): void {\n this.applyZoomAtPoint(this.scale_$() - 0.15, 0.5, 0.5);\n }\n\n /** Zoom és pan visszaállítása alaphelyzetbe (fit world). */\n handleZoomReset(): void {\n this.scale_$.set(1);\n this.centerX_$.set(this.sceneWorldW_$() / 2);\n this.centerY_$.set(this.sceneWorldH_$() / 2);\n }\n\n // ---------------------------------------------------------------------------\n // Pointer events: pan (1 ujj / mouse-bal/középső gomb) + pinch zoom (2 ujj)\n // REQ-DO-TOUCH-001 — egységes mouse + touch + pen kezelés Pointer Events API-val.\n // ---------------------------------------------------------------------------\n\n /**\n * Pointer down — aktív pointer-ek Map-be regisztrálása + módváltás:\n *\n * - 1 pointer (mouse-bal/középső, vagy első ujj) → pan-drag kezdet.\n * - 2 pointer (második ujj lenyomva) → pinch-zoom kezdet, pan leáll.\n * - 3+ pointer → ignorálódik.\n *\n * Mouse esetén csak `event.button` 0 (bal) vagy 1 (középső) számít aktívnak. Touch / pen\n * pointer-eknél `event.button` általában 0, így minden ujj-tap regisztrálódik.\n */\n handlePointerDown(event: PointerEvent): void {\n if (event.pointerType === 'mouse' && event.button !== 0 && event.button !== 1) {\n return;\n }\n event.preventDefault();\n this.activePointers.set(event.pointerId, { x: event.clientX, y: event.clientY });\n\n if (this.activePointers.size === 1) {\n this.beginPan(event.clientX, event.clientY);\n } else if (this.activePointers.size === 2) {\n this.beginPinch();\n }\n }\n\n /**\n * Pointer move — az aktív pointer pozícióját frissíti, majd:\n *\n * - 1 aktív pointer + folyamatban lévő pan → pan delta számítás (screen px → SVG koord).\n * - 2 aktív pointer → pinch-zoom: aktuális ujjtávolság / kezdő-távolság ráta a scale-en.\n *\n * Pointer-id alapján szűr — csak a saját, már lekapott pointerek mozgására reagál.\n */\n handlePointerMove(event: PointerEvent): void {\n if (!this.activePointers.has(event.pointerId)) {\n return;\n }\n this.activePointers.set(event.pointerId, { x: event.clientX, y: event.clientY });\n\n if (this.activePointers.size === 1 && this.isDragging_$()) {\n const svg: SVGSVGElement = this.svgRef.nativeElement;\n const rect: DOMRect = svg.getBoundingClientRect();\n const s: number = this.scale_$();\n const svgDx: number = (event.clientX - this.dragStartMouseX) * (this.sceneWorldW_$() / s) / rect.width;\n const svgDy: number = (event.clientY - this.dragStartMouseY) * (this.sceneWorldH_$() / s) / rect.height;\n this.centerX_$.set(this.dragStartCx - svgDx);\n this.centerY_$.set(this.dragStartCy - svgDy);\n } else if (this.activePointers.size === 2) {\n this.applyPinchZoom();\n }\n }\n\n /**\n * Pointer up / cancel / leave — pointer-t eltávolítja a Map-ből, és módváltást kezel:\n *\n * - 0 pointer maradt → pan leáll, idle állapot.\n * - 1 pointer maradt (pinch-ből kilépve) → a maradék ujj/kurzor pan-folytatást indít\n * az aktuális pozícióból (smooth UX, nem ugrik a center).\n */\n handlePointerUp(event: PointerEvent): void {\n if (!this.activePointers.has(event.pointerId)) {\n return;\n }\n this.activePointers.delete(event.pointerId);\n\n if (this.activePointers.size === 0) {\n this.isDragging_$.set(false);\n } else if (this.activePointers.size === 1) {\n const remaining: { x: number; y: number } =\n Array.from(this.activePointers.values())[0];\n this.beginPan(remaining.x, remaining.y);\n }\n }\n\n /** Pan-drag kezdete megadott screen-pozícióból. */\n private beginPan(clientX: number, clientY: number): void {\n this.isDragging_$.set(true);\n this.dragStartMouseX = clientX;\n this.dragStartMouseY = clientY;\n this.dragStartCx = this.centerX_$();\n this.dragStartCy = this.centerY_$();\n }\n\n /**\n * Pinch-zoom kezdete (REQ-DO-TOUCH-001 Slice 2).\n *\n * Lekapja a két aktív pointer távolságát + a kezdő scale-t + a kezdő center-pozíciót +\n * a két ujj képernyő-középpontját. A `applyPinchZoom` ezekből számítja az új center-t,\n * úgy hogy a két ujj alatti VILÁG-pont a képernyőn ugyanott maradjon (anchor at midpoint).\n */\n private beginPinch(): void {\n this.isDragging_$.set(false);\n const pts: { x: number; y: number }[] = Array.from(this.activePointers.values());\n if (pts.length < 2) {\n return;\n }\n const dx: number = pts[1].x - pts[0].x;\n const dy: number = pts[1].y - pts[0].y;\n this.pinchStartDistance = Math.hypot(dx, dy);\n this.pinchStartScale = this.scale_$();\n this.pinchStartCenterX = this.centerX_$();\n this.pinchStartCenterY = this.centerY_$();\n // Mid-point a két ujj között a pinch START pillanatában (screen px).\n this.pinchStartMidX = (pts[0].x + pts[1].x) / 2;\n this.pinchStartMidY = (pts[0].y + pts[1].y) / 2;\n }\n\n /**\n * Aktuális pinch-zoom alkalmazása a két aktív pointer alapján (REQ-DO-TOUCH-001 Slice 2).\n *\n * Anchor-at-midpoint logika a `zoomAtScreenPoint` mintára:\n * 1. Meghatározza a kezdő midpoint (két ujj közepe a pinch START pillanatban)\n * alatti VILÁG koordinátát.\n * 2. Új scale = pinchStartScale * (currentDistance / pinchStartDistance), clamp.\n * 3. Új center: a midpoint alatti world pont az aktuális midpoint alatt marad\n * (pinch közben a két ujj közötti pozíció a vízszintesen-stabil).\n */\n private applyPinchZoom(): void {\n const pts: { x: number; y: number }[] = Array.from(this.activePointers.values());\n if (pts.length < 2 || this.pinchStartDistance < 1) {\n return;\n }\n const dx: number = pts[1].x - pts[0].x;\n const dy: number = pts[1].y - pts[0].y;\n const currentDistance: number = Math.hypot(dx, dy);\n const ratio: number = currentDistance / this.pinchStartDistance;\n const newScale: number = Math.max(\n DO_ZOOM_MIN,\n Math.min(DO_ZOOM_MAX, this.pinchStartScale * ratio),\n );\n if (Math.abs(newScale - this.scale_$()) < 1e-6) {\n return;\n }\n // Anchor-at-midpoint: a két ujj kezdő-középpontja alatti VILÁG-pont képernyőn-stabil.\n const svg: SVGSVGElement = this.svgRef.nativeElement;\n const rect: DOMRect = svg.getBoundingClientRect();\n const startFractionX: number = (this.pinchStartMidX - rect.left) / rect.width;\n const startFractionY: number = (this.pinchStartMidY - rect.top) / rect.height;\n const ww: number = this.sceneWorldW_$();\n const wh: number = this.sceneWorldH_$();\n // Világ-pont az kezdő midpoint alatt (pinch START pillanat).\n const worldX: number =\n this.pinchStartCenterX + (ww / this.pinchStartScale) * (startFractionX - 0.5);\n const worldY: number =\n this.pinchStartCenterY + (wh / this.pinchStartScale) * (startFractionY - 0.5);\n // Aktuális midpoint az aktuális ujj-pozíciókból.\n const currentMidX: number = (pts[0].x + pts[1].x) / 2;\n const currentMidY: number = (pts[0].y + pts[1].y) / 2;\n const currentFractionX: number = (currentMidX - rect.left) / rect.width;\n const currentFractionY: number = (currentMidY - rect.top) / rect.height;\n // Új center: a worldX/Y a currentMidX/Y alatt jelenjen meg az új scale-en.\n const newCx: number = worldX + (ww / newScale) * (0.5 - currentFractionX);\n const newCy: number = worldY + (wh / newScale) * (0.5 - currentFractionY);\n this.scale_$.set(newScale);\n this.centerX_$.set(newCx);\n this.centerY_$.set(newCy);\n }\n\n // ---------------------------------------------------------------------------\n // Privát zoom logika (régi koordinátor office-view mintája: \"zoomAtScreenPoint\")\n // ---------------------------------------------------------------------------\n\n /**\n * Egér-kerék zoom – 1:1 port a régi koordinátor SvgStage handleWheel-ből.\n *\n * 3 lépés:\n * 1. Meghatározza a világ koordinátát az egér alatt (worldX, worldY)\n * 2. Additív zoom delta a deltaY-ból (nem fix lépés → simább trackpad + scroll)\n * 3. Új center: a world pont az egér alatt a képernyőn ugyanott marad\n */\n private onWheel(event: WheelEvent): void {\n event.preventDefault();\n const svg: SVGSVGElement = this.svgRef.nativeElement;\n const rect: DOMRect = svg.getBoundingClientRect();\n const fractionX: number = (event.clientX - rect.left) / rect.width;\n const fractionY: number = (event.clientY - rect.top) / rect.height;\n\n const oldScale: number = this.scale_$();\n const cx: number = this.centerX_$();\n const cy: number = this.centerY_$();\n\n // 1) Világ koordináta az egér alatt\n const worldX: number = cx + (this.sceneWorldW_$() / oldScale) * (fractionX - 0.5);\n const worldY: number = cy + (this.sceneWorldH_$() / oldScale) * (fractionY - 0.5);\n\n // 2) Additív zoom delta (régi koordinátor: -deltaY * 0.001)\n const zoomDelta: number = -event.deltaY * 0.001;\n const newScale: number = Math.max(DO_ZOOM_MIN, Math.min(DO_ZOOM_MAX, oldScale + zoomDelta));\n if (Math.abs(newScale - oldScale) < 1e-6) return;\n\n // 3) Új center – az egér alatti world pont a screen-en fix marad\n const newCx: number = worldX + (this.sceneWorldW_$() / newScale) * (0.5 - fractionX);\n const newCy: number = worldY + (this.sceneWorldH_$() / newScale) * (0.5 - fractionY);\n\n this.scale_$.set(newScale);\n this.centerX_$.set(newCx);\n this.centerY_$.set(newCy);\n }\n\n /**\n * Zoom adott pontra (gombok, billentyű).\n * Ugyanaz a 3 lépéses offset számítás mint a wheel-nél,\n * fx/fy = 0.5 esetén a center nem mozdul (center-alapú zoom).\n */\n private applyZoomAtPoint(targetScale: number, fx: number, fy: number): void {\n const oldScale: number = this.scale_$();\n const newScale: number = Math.max(DO_ZOOM_MIN, Math.min(DO_ZOOM_MAX, targetScale));\n if (Math.abs(newScale - oldScale) < 1e-6) return;\n\n const cx: number = this.centerX_$();\n const cy: number = this.centerY_$();\n\n // Világ pont a screen frakciónál\n const worldX: number = cx + (this.sceneWorldW_$() / oldScale) * (fx - 0.5);\n const worldY: number = cy + (this.sceneWorldH_$() / oldScale) * (fy - 0.5);\n\n // Új center – a world pont ugyanott marad\n const newCx: number = worldX + (this.sceneWorldW_$() / newScale) * (0.5 - fx);\n const newCy: number = worldY + (this.sceneWorldH_$() / newScale) * (0.5 - fy);\n\n this.scale_$.set(newScale);\n this.centerX_$.set(newCx);\n this.centerY_$.set(newCy);\n }\n\n /**\n * Center koordináta clampelés – a világ DO_PAN_VISIBLE_RATIO része mindig látható marad.\n * Bármilyen zoom szintnél engedélyezi a pan-t, de a világ 10%-a mindig a képernyőn marad.\n *\n * Matek (10%-os limit esetén):\n * Jobbra húzáskor: viewport bal széle ≤ worldSize * 0.9 → center ≤ 0.9 * worldSize + viewSize/2\n * Balra húzáskor: viewport jobb széle ≥ worldSize * 0.1 → center ≥ 0.1 * worldSize - viewSize/2\n */\n private clampCenter(center: number, worldSize: number, viewSize: number): number {\n const margin: number = worldSize * DO_PAN_VISIBLE_RATIO;\n const min: number = margin - viewSize / 2;\n const max: number = worldSize - margin + viewSize / 2;\n return Math.min(max, Math.max(min, center));\n }\n}\n", "<!-- Iroda jelenet fő konténer -->\n<div class=\"do-scene-container\"\n [class.do-scene--dragging]=\"isDragging_$()\">\n\n <!-- SVG viewport – viewBox alapú zoom/pan + multitouch (REQ-DO-TOUCH-001) -->\n <svg #svgElement\n class=\"do-svg-canvas\"\n [attr.viewBox]=\"viewBox_$()\"\n preserveAspectRatio=\"xMidYMid meet\"\n xmlns=\"http://www.w3.org/2000/svg\"\n (pointerdown)=\"handlePointerDown($event)\"\n (pointermove)=\"handlePointerMove($event)\"\n (pointerup)=\"handlePointerUp($event)\"\n (pointercancel)=\"handlePointerUp($event)\"\n (pointerleave)=\"handlePointerUp($event)\">\n\n <!-- ============================================================= -->\n <!-- SVG defs: filterek, minták, gradiensek -->\n <!-- ============================================================= -->\n <defs>\n <filter id=\"doGlowSmall\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\n <feGaussianBlur stdDeviation=\"2\" result=\"blur\"/>\n <feMerge><feMergeNode in=\"blur\"/><feMergeNode in=\"SourceGraphic\"/></feMerge>\n </filter>\n <filter id=\"doGlowMid\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\n <feGaussianBlur stdDeviation=\"5\" result=\"blur\"/>\n <feMerge><feMergeNode in=\"blur\"/><feMergeNode in=\"SourceGraphic\"/></feMerge>\n </filter>\n <filter id=\"doGlowWide\" x=\"-80%\" y=\"-80%\" width=\"260%\" height=\"260%\">\n <feGaussianBlur stdDeviation=\"8\" result=\"blur\"/>\n <feMerge><feMergeNode in=\"blur\"/><feMergeNode in=\"SourceGraphic\"/></feMerge>\n </filter>\n\n <!-- Univerzális 3D fény-árnyék gradiens (balról jön a fény — törzs, kar, láb) -->\n <linearGradient id=\"doLight3D\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0.5\">\n <stop offset=\"0%\" stop-color=\"white\" stop-opacity=\"0.12\"/>\n <stop offset=\"40%\" stop-color=\"white\" stop-opacity=\"0.02\"/>\n <stop offset=\"100%\" stop-color=\"black\" stop-opacity=\"0.15\"/>\n </linearGradient>\n\n <!-- Vertikális fény gradiens (felülről lefelé — arc, haj) -->\n <linearGradient id=\"doLightVert\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"white\" stop-opacity=\"0.10\"/>\n <stop offset=\"50%\" stop-color=\"white\" stop-opacity=\"0\"/>\n <stop offset=\"100%\" stop-color=\"black\" stop-opacity=\"0.08\"/>\n </linearGradient>\n\n <!-- Karakter vizuális effekt: soft drop-shadow + neon rim-fény -->\n <filter id=\"doCharEffect\" x=\"-30%\" y=\"-20%\" width=\"160%\" height=\"150%\">\n <!-- Soft drop-shadow (mélység) -->\n <feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"1.5\" result=\"shadow\"/>\n <feOffset dx=\"1\" dy=\"2\" in=\"shadow\" result=\"offsetShadow\"/>\n <feFlood flood-color=\"#050510\" flood-opacity=\"0.4\" result=\"shadowColor\"/>\n <feComposite in=\"shadowColor\" in2=\"offsetShadow\" operator=\"in\" result=\"coloredShadow\"/>\n <!-- Neon rim glow (cyberpunk környezeti fény) -->\n <feMorphology operator=\"dilate\" radius=\"0.3\" in=\"SourceAlpha\" result=\"expanded\"/>\n <feGaussianBlur stdDeviation=\"1.2\" in=\"expanded\" result=\"rimBlur\"/>\n <feFlood flood-color=\"#00e5ff\" flood-opacity=\"0.12\" result=\"rimColor\"/>\n <feComposite in=\"rimColor\" in2=\"rimBlur\" operator=\"in\" result=\"rimGlow\"/>\n <!-- Összeállítás: árnyék → rim fény → karakter -->\n <feMerge>\n <feMergeNode in=\"coloredShadow\"/>\n <feMergeNode in=\"rimGlow\"/>\n <feMergeNode in=\"SourceGraphic\"/>\n </feMerge>\n </filter>\n\n <!-- Workspace padló grid minta (cyan) – erősebb opacity -->\n <pattern id=\"doFloorGridWork\"\n [attr.x]=\"layoutDerived_$().floorWorkspace.x\"\n [attr.y]=\"layoutDerived_$().floorWorkspace.y\"\n width=\"32\" height=\"32\"\n patternUnits=\"userSpaceOnUse\">\n <line x1=\"0\" y1=\"0\" x2=\"32\" y2=\"0\"\n stroke=\"#00e5ff\" stroke-width=\"0.4\" opacity=\"0.12\"/>\n <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"32\"\n stroke=\"#00e5ff\" stroke-width=\"0.4\" opacity=\"0.12\"/>\n <circle cx=\"0\" cy=\"0\" r=\"0.7\" fill=\"#00e5ff\" opacity=\"0.1\"/>\n </pattern>\n\n <!-- Lounge padló grid minta (magenta) -->\n <pattern id=\"doFloorGridLounge\"\n [attr.x]=\"layoutDerived_$().floorLounge.x\"\n [attr.y]=\"layoutDerived_$().floorLounge.y\"\n width=\"32\" height=\"32\"\n patternUnits=\"userSpaceOnUse\">\n <line x1=\"0\" y1=\"0\" x2=\"32\" y2=\"0\"\n stroke=\"#ff2dd9\" stroke-width=\"0.35\" opacity=\"0.09\"/>\n <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"32\"\n stroke=\"#ff2dd9\" stroke-width=\"0.35\" opacity=\"0.09\"/>\n <circle cx=\"0\" cy=\"0\" r=\"0.6\" fill=\"#ff2dd9\" opacity=\"0.07\"/>\n </pattern>\n\n <pattern id=\"doFloorGridConference\"\n [attr.x]=\"layoutDerived_$().floorConference.x\"\n [attr.y]=\"layoutDerived_$().floorConference.y\"\n width=\"32\" height=\"32\"\n patternUnits=\"userSpaceOnUse\">\n <line x1=\"0\" y1=\"0\" x2=\"32\" y2=\"0\"\n stroke=\"#00e5ff\" stroke-width=\"0.35\" opacity=\"0.1\"/>\n <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"32\"\n stroke=\"#ff2dd9\" stroke-width=\"0.35\" opacity=\"0.09\"/>\n <circle cx=\"0\" cy=\"0\" r=\"0.55\" fill=\"#00e5ff\" opacity=\"0.06\"/>\n </pattern>\n\n <!-- Ablak üveg tükröződés gradiens -->\n <linearGradient id=\"doGlassReflection\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"white\" stop-opacity=\"0.08\"/>\n <stop offset=\"30%\" stop-color=\"white\" stop-opacity=\"0.02\"/>\n <stop offset=\"50%\" stop-color=\"white\" stop-opacity=\"0.06\"/>\n <stop offset=\"100%\" stop-color=\"white\" stop-opacity=\"0.01\"/>\n </linearGradient>\n\n <!--\n ╔══════════════════════════════════════════════════════════════════╗\n ║ doForestTile — Sűrű erdő ismétlődő SVG pattern ║\n ╠══════════════════════════════════════════════════════════════════╣\n ║ ║\n ║ Méret: 144×144 SVG egység (4.5×4.5 TILE @ 32px/tile). ║\n ║ Alkalmazás: fill=\"url(#doForestTile)\" a pályán kívüli ║\n ║ területre (végtelenül ismétlődik minden irányban). ║\n ║ ║\n ║ Felépítés (5 réteg, lentről felfelé): ║\n ║ 1. Sötét talaj alap (#081210) ║\n ║ 2. Moha foltok (r=4-5, #0d1a10, op 0.25-0.3) ║\n ║ 3. Bokrok (ellipszisek, rx=8-9, 3 zöld árnyalat) ║\n ║ 4. Fa lombkoronák (circle-ök, r=6-17, átfedő) ║\n ║ 5. Neon fénypontok (cyan #39ff88 + magenta #ff2dd9) ║\n ║ ║\n ║ Fa felépítés: ║\n ║ - Törzs: rect, fill=#1a120a (sötét barna), w=3-5, h=10-14 ║\n ║ - Fő lombkorona: circle, r=11-17 (legnagyobb zöld kör) ║\n ║ - 2 szatellit lombkorona: kisebb circle-ök offset-elve ║\n ║ - Opcionális neon outline: stroke=#39ff88, op 0.05-0.07 ║\n ║ ║\n ║ Zöld árnyalatok (lombkorona palette): ║\n ║ #14381c — világos erdőzöld (fő lombkorona) ║\n ║ #123218 — közepes erdőzöld (szatellit) ║\n ║ #0f2d16 — sötét erdőzöld (szatellit / mélység) ║\n ║ ║\n ║ Varratmentes illesztés (seamless tiling): ║\n ║ A tile széleit átlépő lombkoronák „wrappelve\" vannak: ║\n ║ ha egy kör cx=5-nél r=13-mal átlóg balra (cx-r < 0), ║\n ║ egy azonos másolat cx=5+144=149-nél jelenik meg a jobb ║\n ║ szélnél. Így a szomszédos tile-ok illeszkedésénél a kör ║\n ║ teljessé áll össze. Mind a 4 szél + sarkok kezelve. ║\n ║ ║\n ║ Fa típusok és pozíciók: ║\n ║ T1 (36,28) r=16 nagy │ T2 (90,20) r=14 közepes ║\n ║ T3 (60,63) r=17 nagy │ T4 (115,58) r=12 kis ║\n ║ T5 (25,93) r=15 köz. │ T6 (80,98) r=16 nagy ║\n ║ T7 (125,108) r=11 kis │ ║\n ║ Szél-fák (wrappelt): ║\n ║ TE1 bal (5,48) r=13 → jobb (149,48) ║\n ║ TE2 jobb (139,128) r=12 → bal (-5,128) ║\n ║ TE3 felső (42,2) r=12 → alsó (42,146) ║\n ║ TE4 alsó (110,138) r=12 → felső (110,-6) ║\n ╚══════════════════════════════════════════════════════════════════╝\n -->\n <pattern id=\"doForestTile\" width=\"144\" height=\"144\"\n patternUnits=\"userSpaceOnUse\">\n <!-- 1. réteg: sötét talaj alap -->\n <rect width=\"144\" height=\"144\" fill=\"#081210\"/>\n\n <!-- 4. réteg: belső fák (lombkoronák nem lépik át a tile széleit) -->\n <!-- T1 (36,30) nagy -->\n <rect x=\"34\" y=\"42\" width=\"4\" height=\"13\" fill=\"#1a120a\" rx=\"1\"/>\n <circle cx=\"36\" cy=\"28\" r=\"16\" fill=\"#14381c\"/>\n <circle cx=\"27\" cy=\"22\" r=\"10\" fill=\"#123218\"/>\n <circle cx=\"45\" cy=\"23\" r=\"9\" fill=\"#0f2d16\"/>\n <circle cx=\"36\" cy=\"28\" r=\"16\" fill=\"none\" stroke=\"#39ff88\" stroke-width=\"0.3\" opacity=\"0.06\"/>\n <!-- T2 (90,22) közepes -->\n <rect x=\"88\" y=\"33\" width=\"4\" height=\"11\" fill=\"#1a120a\" rx=\"1\"/>\n <circle cx=\"90\" cy=\"20\" r=\"14\" fill=\"#123218\"/>\n <circle cx=\"82\" cy=\"14\" r=\"9\" fill=\"#14381c\"/>\n <circle cx=\"99\" cy=\"16\" r=\"8\" fill=\"#0f2d16\"/>\n <!-- T3 (60,65) nagy -->\n <rect x=\"58\" y=\"78\" width=\"5\" height=\"14\" fill=\"#1a120a\" rx=\"1\"/>\n <circle cx=\"60\" cy=\"63\" r=\"17\" fill=\"#14381c\"/>\n <circle cx=\"51\" cy=\"56\" r=\"11\" fill=\"#0f2d16\"/>\n <circle cx=\"70\" cy=\"58\" r=\"10\" fill=\"#123218\"/>\n <circle cx=\"60\" cy=\"63\" r=\"17\" fill=\"none\" stroke=\"#39ff88\" stroke-width=\"0.3\" opacity=\"0.05\"/>\n <!-- T4 (115,60) kis -->\n <rect x=\"113\" y=\"68\" width=\"3\" height=\"10\" fill=\"#1a120a\" rx=\"1\"/>\n <circle cx=\"115\" cy=\"58\" r=\"12\" fill=\"#123218\"/>\n <circle cx=\"108\" cy=\"53\" r=\"7\" fill=\"#14381c\"/>\n <circle cx=\"122\" cy=\"55\" r=\"6\" fill=\"#0f2d16\"/>\n <!-- T5 (25,95) közepes -->\n <rect x=\"23\" y=\"106\" width=\"4\" height=\"12\" fill=\"#1a120a\" rx=\"1\"/>\n <circle cx=\"25\" cy=\"93\" r=\"15\" fill=\"#14381c\"/>\n <circle cx=\"17\" cy=\"87\" r=\"9\" fill=\"#123218\"/>\n <circle cx=\"34\" cy=\"88\" r=\"8\" fill=\"#0f2d16\"/>\n <!-- T6 (80,100) nagy -->\n <rect x=\"78\" y=\"114\" width=\"5\" height=\"14\" fill=\"#1a120a\" rx=\"1\"/>\n <circle cx=\"80\" cy=\"98\" r=\"16\" fill=\"#123218\"/>\n <circle cx=\"71\" cy=\"91\" r=\"10\" fill=\"#14381c\"/>\n <circle cx=\"89\" cy=\"93\" r=\"9\" fill=\"#0f2d16\"/>\n <circle cx=\"80\" cy=\"98\" r=\"16\" fill=\"none\" stroke=\"#39ff88\" stroke-width=\"0.3\" opacity=\"0.07\"/>\n <!-- T7 (125,110) kis -->\n <rect x=\"123\" y=\"120\" width=\"3\" height=\"10\" fill=\"#1a120a\" rx=\"1\"/>\n <circle cx=\"125\" cy=\"108\" r=\"11\" fill=\"#14381c\"/>\n <circle cx=\"118\" cy=\"103\" r=\"7\" fill=\"#0f2d16\"/>\n <circle cx=\"132\" cy=\"104\" r=\"6\" fill=\"#123218\"/>\n\n <!--\n 4b. réteg: széleket átlépő fák.\n Wrapping szabály: elem cx±r átlóg a tile (0..144) szélén →\n azonos másolat a szemben lévő szélre (offset ±144).\n Ez biztosítja, hogy szomszédos tile-ok illeszkedésénél a lombkorona\n ne legyen levágva, hanem folyamatosan átmenjen a következő tile-ba.\n -->\n <!-- TE1: bal (cx=5,cy=50) r=13 + jobb (cx=149) -->\n <circle cx=\"5\" cy=\"48\" r=\"13\" fill=\"#14381c\"/>\n <circle cx=\"-3\" cy=\"42\" r=\"8\" fill=\"#123218\"/>\n <circle cx=\"13\" cy=\"43\" r=\"7\" fill=\"#0f2d16\"/>\n <circle cx=\"149\" cy=\"48\" r=\"13\" fill=\"#14381c\"/>\n <circle cx=\"141\" cy=\"42\" r=\"8\" fill=\"#123218\"/>\n <circle cx=\"157\" cy=\"43\" r=\"7\" fill=\"#0f2d16\"/>\n <!-- TE2: jobb (cx=139,cy=130) r=12 + bal (cx=-5) -->\n <circle cx=\"139\" cy=\"128\" r=\"12\" fill=\"#123218\"/>\n <circle cx=\"132\" cy=\"123\" r=\"7\" fill=\"#14381c\"/>\n <circle cx=\"-5\" cy=\"128\" r=\"12\" fill=\"#123218\"/>\n <circle cx=\"-12\" cy=\"123\" r=\"7\" fill=\"#14381c\"/>\n <!-- TE3: felső (cx=42,cy=4) r=12 + alsó (cy=148) -->\n <circle cx=\"42\" cy=\"2\" r=\"12\" fill=\"#123218\"/>\n <circle cx=\"35\" cy=\"-3\" r=\"7\" fill=\"#0f2d16\"/>\n <circle cx=\"50\" cy=\"-1\" r=\"6\" fill=\"#14381c\"/>\n <circle cx=\"42\" cy=\"146\" r=\"12\" fill=\"#123218\"/>\n <circle cx=\"35\" cy=\"141\" r=\"7\" fill=\"#0f2d16\"/>\n <circle cx=\"50\" cy=\"143\" r=\"6\" fill=\"#14381c\"/>\n <!-- TE4: alsó (cx=110,cy=140) r=12 + felső (cy=-4) -->\n <circle cx=\"110\" cy=\"138\" r=\"12\" fill=\"#14381c\"/>\n <circle cx=\"103\" cy=\"133\" r=\"7\" fill=\"#123218\"/>\n <circle cx=\"110\" cy=\"-6\" r=\"12\" fill=\"#14381c\"/>\n <circle cx=\"103\" cy=\"-11\" r=\"7\" fill=\"#123218\"/>\n\n <!-- 3. réteg: bokrok (alacsony ellipszisek a fák közötti résekben) -->\n <ellipse cx=\"18\" cy=\"18\" rx=\"9\" ry=\"5\" fill=\"#123218\" opacity=\"0.7\"/>\n <ellipse cx=\"72\" cy=\"38\" rx=\"8\" ry=\"4\" fill=\"#0f2d16\" opacity=\"0.6\"/>\n <ellipse cx=\"130\" cy=\"42\" rx=\"9\" ry=\"5\" fill=\"#14381c\" opacity=\"0.6\"/>\n <ellipse cx=\"48\" cy=\"88\" rx=\"8\" ry=\"4\" fill=\"#123218\" opacity=\"0.6\"/>\n <ellipse cx=\"105\" cy=\"82\" rx=\"9\" ry=\"5\" fill=\"#0f2d16\" opacity=\"0.55\"/>\n <ellipse cx=\"15\" cy=\"130\" rx=\"8\" ry=\"4\" fill=\"#14381c\" opacity=\"0.55\"/>\n <ellipse cx=\"65\" cy=\"128\" rx=\"9\" ry=\"5\" fill=\"#123218\" opacity=\"0.6\"/>\n <ellipse cx=\"100\" cy=\"135\" rx=\"8\" ry=\"4\" fill=\"#0f2d16\" opacity=\"0.5\"/>\n\n <!-- 2. réteg: moha / talajtextúra foltok (sötét zöld, a talajra enyhe változatosságot ad) -->\n <circle cx=\"55\" cy=\"15\" r=\"5\" fill=\"#0d1a10\" opacity=\"0.3\"/>\n <circle cx=\"120\" cy=\"28\" r=\"4\" fill=\"#0d1a10\" opacity=\"0.3\"/>\n <circle cx=\"20\" cy=\"72\" r=\"5\" fill=\"#0d1a10\" opacity=\"0.3\"/>\n <circle cx=\"95\" cy=\"55\" r=\"4\" fill=\"#0d1a10\" opacity=\"0.25\"/>\n <circle cx=\"42\" cy=\"115\" r=\"5\" fill=\"#0d1a10\" opacity=\"0.3\"/>\n <circle cx=\"135\" cy=\"90\" r=\"4\" fill=\"#0d1a10\" opacity=\"0.25\"/>\n\n <!-- 5. réteg: neon fénypontok (enyhe derengés a talajon, 2 szín: cyan + magenta) -->\n <circle cx=\"75\" cy=\"12\" r=\"0.7\" fill=\"#39ff88\" opacity=\"0.15\"/>\n <circle cx=\"75\" cy=\"12\" r=\"2.5\" fill=\"#39ff88\" opacity=\"0.02\"/>\n <circle cx=\"15\" cy=\"108\" r=\"0.6\" fill=\"#39ff88\" opacity=\"0.12\"/>\n <circle cx=\"15\" cy=\"108\" r=\"2\" fill=\"#39ff88\" opacity=\"0.02\"/>\n <circle cx=\"130\" cy=\"75\" r=\"0.5\" fill=\"#ff2dd9\" opacity=\"0.08\"/>\n <circle cx=\"130\" cy=\"75\" r=\"1.5\" fill=\"#ff2dd9\" opacity=\"0.012\"/>\n </pattern>\n </defs>\n\n <!-- ============================================================= -->\n <!-- Layer 1: Környezet (háttér, fű, fák, tech debris, ösvény) -->\n <!-- ============================================================= -->\n <g id=\"doEnvironment\">\n <!--\n Háttér rétegezés (alulról felfelé):\n 1. Fű alap: 2 réteg (base + overlay) – kiterjesztve a pályán túlra is,\n hogy pan közben mindig legyen háttér.\n 2. Erdő pattern (doForestTile): a teljes területre ráfestve, de a pálya\n területét a 3. lépés felülírja → így csak a pályán KÍVÜL látszik.\n 3. Pálya területe (0,0 – worldW×worldH): tiszta fű, elfedi az erdő mintát.\n Ez adja az iroda körüli tisztást.\n A `environmentOverflowPx` + dinamikus világ méret biztosítja, hogy szélsőséges\n pan esetén se látszódjon üres háttér.\n -->\n <!-- 1. Fű alap – kiterjesztve a pályán túlra is -->\n <rect [attr.x]=\"environmentBackdropRect_$().x\"\n [attr.y]=\"environmentBackdropRect_$().y\"\n [attr.width]=\"environmentBackdropRect_$().w\"\n [attr.height]=\"environmentBackdropRect_$().h\"\n fill=\"#0a120e\"/>\n <rect [attr.x]=\"environmentBackdropRect_$().x\"\n [attr.y]=\"environmentBackdropRect_$().y\"\n [attr.width]=\"environmentBackdropRect_$().w\"\n [attr.height]=\"environmentBackdropRect_$().h\"\n fill=\"#0b150f\" opacity=\"0.6\"/>\n <!-- 2. Erdő pattern a teljes területre (pályán kívül látszódik) -->\n <rect [attr.x]=\"environmentBackdropRect_$().x\"\n [attr.y]=\"environmentBackdropRect_$().y\"\n [attr.width]=\"environmentBackdropRect_$().w\"\n [attr.height]=\"environmentBackdropRect_$().h\"\n fill=\"url(#doForestTile)\"/>\n <!-- 3. Pálya területe: tiszta fű, felülírja az erdő mintát → iroda körüli tisztás -->\n <rect x=\"0\" y=\"0\" [attr.width]=\"sceneWorldW_$()\" [attr.height]=\"sceneWorldH_$()\" fill=\"#0a120e\"/>\n <rect x=\"0\" y=\"0\" [attr.width]=\"sceneWorldW_$()\" [attr.height]=\"sceneWorldH_$()\" fill=\"#0b150f\" opacity=\"0.6\"/>\n <!-- Fű textúra (sötétebb foltok) -->\n <circle cx=\"200\" cy=\"780\" r=\"18\" fill=\"#0d1a10\" opacity=\"0.4\"/>\n <circle cx=\"1350\" cy=\"50\" r=\"22\" fill=\"#0d1a10\" opacity=\"0.3\"/>\n <circle cx=\"60\" cy=\"400\" r=\"15\" fill=\"#0d1a10\" opacity=\"0.35\"/>\n <circle cx=\"1470\" cy=\"450\" r=\"20\" fill=\"#0d1a10\" opacity=\"0.3\"/>\n\n <!--\n ╔══════════════════════════════════════════════════════════════════╗\n ║ doForestEdge — Erdő szegély (pálya peremén álló fasor) ║\n ╠══════════════════════════════════════════════════════════════════╣\n ║ ║\n ║ Cél: természetes átmenet az erdő pattern és a pálya tisztása ║\n ║ között. A lombkoronák a pálya szélénél „belógnak\" a ║\n ║ játéktérre (negatív y / x értékek + kis pozitív értékek), ║\n ║ így nincs éles vágás az erdő és a fű között. ║\n ║ ║\n ║ Felépítés (4 égtáj): ║\n ║ - Észak (y ≈ -20..12): 16 fa + 7 bokor, x: -10..1550 ║\n ║ - Dél (y ≈ 854..880): 16 fa + 6 bokor, x: -10..1550 ║\n ║ → hézag x=720..870 körül: ajtó/bejárat szabad látó ║\n ║ - Nyugat (x ≈ -14..14): 7 fa + 6 bokor, y: 90..750 ║\n ║ - Kelet (x ≈ 1524..1550): 7 fa + 6 bokor, y: 90..750 ║\n ║ ║\n ║ Minden fa = 2 lombkorona circle (fő + szatellit): ║\n ║ - Fő: r=17-22, szatellit: r=11-14 ║\n ║ - Színek: #14381c, #123218, #0f2d16 keverten ║\n ║ Bokrok = ellipszisek (rx=11-14, ry=5-7) a fák között. ║\n ║ ║\n ║ Összesen: ~46 fa (92 lombkorona) + 25 bokor. ║\n ║ Opacity: 0.9 (enyhe transzparencia mélység-hatásért). ║\n ║ ║\n ║ Koordináta rendszer: erdő artwork legacy = 0,0 – 1536,864; ║\n ║ déli/keleti csoport translate a dinamikus worldW/worldH-hoz. ║\n ║ Negatív értékek: a pálya szélén túl (az erdő pattern ║\n ║ területe fölé rajzolódnak, de a clearing rect fölé is). ║\n ╚══════════════════════════════════════════════════════════════════╝\n -->\n <g id=\"doForestEdge\" opacity=\"0.9\">\n <!-- ========== Északi szél (y ≈ -20..40, fák lombja benyúlik) ========== -->\n <circle cx=\"-10\" cy=\"-5\" r=\"22\" fill=\"#14381c\"/>\n <circle cx=\"-20\" cy=\"-12\" r=\"14\" fill=\"#123218\"/>\n <circle cx=\"60\" cy=\"0\" r=\"20\" fill=\"#123218\"/>\n <circle cx=\"50\" cy=\"-8\" r=\"13\" fill=\"#0f2d16\"/>\n <circle cx=\"72\" cy=\"-5\" r=\"11\" fill=\"#14381c\"/>\n <circle cx=\"150\" cy=\"-5\" r=\"18\" fill=\"#14381c\"/>\n <circle cx=\"140\" cy=\"-12\" r=\"12\" fill=\"#123218\"/>\n <circle cx=\"250\" cy=\"2\" r=\"20\" fill=\"#123218\"/>\n <circle cx=\"240\" cy=\"-6\" r=\"13\" fill=\"#0f2d16\"/>\n <circle cx=\"262\" cy=\"-3\" r=\"11\" fill=\"#14381c\"/>\n <circle cx=\"360\" cy=\"-3\" r=\"17\" fill=\"#14381c\"/>\n <circle cx=\"352\" cy=\"-10\" r=\"11\" fill=\"#123218\"/>\n <circle cx=\"470\" cy=\"0\" r=\"19\" fill=\"#0f2d16\"/>\n <circle cx=\"460\" cy=\"-8\" r=\"12\" fill=\"#14381c\"/>\n <circle cx=\"580\" cy=\"-4\" r=\"18\" fill=\"#123218\"/>\n <circle cx=\"570\" cy=\"-11\" r=\"11\" fill=\"#14381c\"/>\n <circle cx=\"700\" cy=\"2\" r=\"20\" fill=\"#14381c\"/>\n <circle cx=\"690\" cy=\"-6\" r=\"13\" fill=\"#0f2d16\"/>\n <circle cx=\"830\" cy=\"-2\" r=\"17\" fill=\"#123218\"/>\n <circle cx=\"820\" cy=\"-9\" r=\"11\" fill=\"#14381c\"/>\n <circle cx=\"950\" cy=\"0\" r=\"19\" fill=\"#14381c\"/>\n <circle cx=\"940\" cy=\"-8\" r=\"12\" fill=\"#0f2d16\"/>\n <circle cx=\"1080\" cy=\"-3\" r=\"18\" fill=\"#123218\"/>\n <circle cx=\"1070\" cy=\"-10\" r=\"11\" fill=\"#14381c\"/>\n <circle cx=\"1200\" cy=\"2\" r=\"20\" fill=\"#14381c\"/>\n <circle cx=\"1190\" cy=\"-6\" r=\"13\" fill=\"#123218\"/>\n <circle cx=\"1320\" cy=\"-1\" r=\"17\" fill=\"#0f2d16\"/>\n <circle cx=\"1312\" cy=\"-8\" r=\"11\" fill=\"#14381c\"/>\n <circle cx=\"1430\" cy=\"0\" r=\"19\" fill=\"#14381c\"/>\n <circle cx=\"1420\" cy=\"-7\" r=\"12\" fill=\"#123218\"/>\n <circle cx=\"1540\" cy=\"-3\" r=\"22\" fill=\"#123218\"/>\n <circle cx=\"1550\" cy=\"-10\" r=\"14\" fill=\"#0f2d16\"/>\n <!-- Északi bokrok -->\n <ellipse cx=\"100\" cy=\"12\" rx=\"14\" ry=\"7\" fill=\"#123218\" opacity=\"0.6\"/>\n <ellipse cx=\"310\" cy=\"8\" rx=\"12\" ry=\"6\" fill=\"#0f2d16\" opacity=\"0.55\"/>\n <ellipse cx=\"530\" cy=\"10\" rx=\"13\" ry=\"6\" fill=\"#14381c\" opacity=\"0.5\"/>\n <ellipse cx=\"770\" cy=\"6\" rx=\"14\" ry=\"7\" fill=\"#123218\" opacity=\"0.55\"/>\n <ellipse cx=\"1000\" cy=\"10\" rx=\"12\" ry=\"6\" fill=\"#0f2d16\" opacity=\"0.5\"/>\n <ellipse cx=\"1260\" cy=\"8\" rx=\"13\" ry=\"6\" fill=\"#14381c\" opacity=\"0.55\"/>\n <ellipse cx=\"1480\" cy=\"12\" rx=\"12\" ry=\"6\" fill=\"#123218\" opacity=\"0.5\"/>\n\n <!-- ========== Déli szél (legacy y ≈ 868) — translate(0, worldH - 864) ========== -->\n <g [attr.transform]=\"forestSouthGroupTransform_$()\">\n <circle cx=\"-10\" cy=\"868\" r=\"22\" fill=\"#14381c\"/>\n <circle cx=\"-18\" cy=\"876\" r=\"14\" fill=\"#0f2d16\"/>\n <circle cx=\"70\" cy=\"870\" r=\"19\" fill=\"#123218\"/>\n <circle cx=\"60\" cy=\"878\" r=\"12\" fill=\"#14381c\"/>\n <circle cx=\"180\" cy=\"866\" r=\"20\" fill=\"#14381c\"/>\n <circle cx=\"170\" cy=\"874\" r=\"13\" fill=\"#123218\"/>\n <circle cx=\"300\" cy=\"872\" r=\"17\" fill=\"#0f2d16\"/>\n <circle cx=\"292\" cy=\"880\" r=\"11\" fill=\"#14381c\"/>\n <circle cx=\"420\" cy=\"868\" r=\"19\" fill=\"#123218\"/>\n <circle cx=\"410\" cy=\"876\" r=\"12\" fill=\"#14381c\"/>\n <circle cx=\"550\" cy=\"870\" r=\"18\" fill=\"#14381c\"/>\n <circle cx=\"540\" cy=\"878\" r=\"11\" fill=\"#0f2d16\"/>\n <circle cx=\"660\" cy=\"866\" r=\"20\" fill=\"#123218\"/>\n <circle cx=\"650\" cy=\"874\" r=\"13\" fill=\"#14381c\"/>\n <!-- Ajtó körül hagyunk helyet (720-816) -->\n <circle cx=\"870\" cy=\"868\" r=\"19\" fill=\"#14381c\"/>\n <circle cx=\"860\" cy=\"876\" r=\"12\" fill=\"#123218\"/>\n <circle cx=\"990\" cy=\"872\" r=\"18\" fill=\"#0f2d16\"/>\n <circle cx=\"980\" cy=\"880\" r=\"11\" fill=\"#14381c\"/>\n <circle cx=\"1110\" cy=\"868\" r=\"20\" fill=\"#123218\"/>\n <circle cx=\"1100\" cy=\"876\" r=\"13\" fill=\"#14381c\"/>\n <circle cx=\"1230\" cy=\"870\" r=\"17\" fill=\"#14381c\"/>\n <circle cx=\"1222\" cy=\"878\" r=\"11\" fill=\"#0f2d16\"/>\n <circle cx=\"1350\" cy=\"866\" r=\"19\" fill=\"#123218\"/>\n <circle cx=\"1340\" cy=\"874\" r=\"12\" fill=\"#14381c\"/>\n <circle cx=\"1460\" cy=\"870\" r=\"18\" fill=\"#14381c\"/>\n <circle cx=\"1450\" cy=\"878\" r=\"11\" fill=\"#123218\"/>\n <circle cx=\"1540\" cy=\"868\" r=\"22\" fill=\"#123218\"/>\n <circle cx=\"1550\" cy=\"876\" r=\"14\" fill=\"#0f2d16\"/>\n <!-- Déli bokrok -->\n <ellipse cx=\"130\" cy=\"858\" rx=\"13\" ry=\"6\" fill=\"#123218\" opacity=\"0.6\"/>\n <ellipse cx=\"360\" cy=\"854\" rx=\"12\" ry=\"6\" fill=\"#0f2d16\" opacity=\"0.55\"/>\n <ellipse cx=\"500\" cy=\"856\" rx=\"14\" ry=\"7\" fill=\"#14381c\" opacity=\"0.5\"/>\n <ellipse cx=\"940\" cy=\"854\" rx=\"13\" ry=\"6\" fill=\"#123218\" opacity=\"0.55\"/>\n <ellipse cx=\"1170\" cy=\"858\" rx=\"12\" ry=\"6\" fill=\"#0f2d16\" opacity=\"0.5\"/>\n <ellipse cx=\"1400\" cy=\"856\" rx=\"14\" ry=\"7\" fill=\"#14381c\" opacity=\"0.55\"/>\n </g>\n\n <!-- ========== Nyugati szél (x ≈ -20..30) ========== -->\n <circle cx=\"-5\" cy=\"100\" r=\"20\" fill=\"#123218\"/>\n <circle cx=\"-14\" cy=\"92\" r=\"13\" fill=\"#14381c\"/>\n <circle cx=\"5\" cy=\"94\" r=\"10\" fill=\"#0f2d16\"/>\n <circle cx=\"-3\" cy=\"200\" r=\"18\" fill=\"#14381c\"/>\n <circle cx=\"-12\" cy=\"192\" r=\"11\" fill=\"#123218\"/>\n <circle cx=\"-5\" cy=\"310\" r=\"20\" fill=\"#123218\"/>\n <circle cx=\"-14\" cy=\"302\" r=\"13\" fill=\"#0f2d16\"/>\n <circle cx=\"-2\" cy=\"420\" r=\"17\" fill=\"#14381c\"/>\n <circle cx=\"-10\" cy=\"412\" r=\"11\" fill=\"#123218\"/>\n <circle cx=\"-5\" cy=\"530\" r=\"19\" fill=\"#0f2d16\"/>\n <circle cx=\"-14\" cy=\"522\" r=\"12\" fill=\"#14381c\"/>\n <circle cx=\"-3\" cy=\"640\" r=\"18\" fill=\"#123218\"/>\n <circle cx=\"-12\" cy=\"632\" r=\"11\" fill=\"#14381c\"/>\n <circle cx=\"-5\" cy=\"750\" r=\"20\" fill=\"#14381c\"/>\n <circle cx=\"-14\" cy=\"742\" r=\"13\" fill=\"#0f2d16\"/>\n <!-- Nyugati bokrok -->\n <ellipse cx=\"12\" cy=\"150\" rx=\"12\" ry=\"6\" fill=\"#0f2d16\" opacity=\"0.55\"/>\n <ellipse cx=\"8\" cy=\"260\" rx=\"11\" ry=\"5\" fill=\"#14381c\" opacity=\"0.5\"/>\n <ellipse cx=\"14\" cy=\"370\" rx=\"12\" ry=\"6\" fill=\"#123218\" opacity=\"0.55\"/>\n <ellipse cx=\"10\" cy=\"480\" rx=\"11\" ry=\"5\" fill=\"#0f2d16\" opacity=\"0.5\"/>\n <ellipse cx=\"12\" cy=\"590\" rx=\"12\" ry=\"6\" fill=\"#14381c\" opacity=\"0.55\"/>\n <ellipse cx=\"8\" cy=\"700\" rx=\"11\" ry=\"5\" fill=\"#123218\" opacity=\"0.5\"/>\n\n <!-- ========== Keleti szél (legacy x ≈ 1510..1556) — translate(worldW - 1536, 0) ========== -->\n <g [attr.transform]=\"forestEastGroupTransform_$()\">\n <circle cx=\"1542\" cy=\"90\" r=\"20\" fill=\"#14381c\"/>\n <circle cx=\"1550\" cy=\"82\" r=\"13\" fill=\"#123218\"/>\n <circle cx=\"1542\" cy=\"200\" r=\"18\" fill=\"#123218\"/>\n <circle cx=\"1550\" cy=\"192\" r=\"11\" fill=\"#0f2d16\"/>\n <circle cx=\"1540\" cy=\"310\" r=\"20\" fill=\"#14381c\"/>\n <circle cx=\"1548\" cy=\"302\" r=\"13\" fill=\"#123218\"/>\n <circle cx=\"1542\" cy=\"420\" r=\"17\" fill=\"#0f2d16\"/>\n <circle cx=\"1550\" cy=\"412\" r=\"11\" fill=\"#14381c\"/>\n <circle cx=\"1540\" cy=\"530\" r=\"19\" fill=\"#123218\"/>\n <circle cx=\"1548\" cy=\"522\" r=\"12\" fill=\"#14381c\"/>\n <circle cx=\"1542\" cy=\"640\" r=\"18\" fill=\"#14381c\"/>\n <circle cx=\"1550\" cy=\"632\" r=\"11\" fill=\"#0f2d16\"/>\n <circle cx=\"1540\" cy=\"750\" r=\"20\" fill=\"#123218\"/>\n <circle cx=\"1548\" cy=\"742\" r=\"13\" fill=\"#14381c\"/>\n <!-- Keleti bokrok -->\n <ellipse cx=\"1526\" cy=\"150\" rx=\"12\" ry=\"6\" fill=\"#123218\" opacity=\"0.55\"/>\n <ellipse cx=\"1530\" cy=\"260\" rx=\"11\" ry=\"5\" fill=\"#0f2d16\" opacity=\"0.5\"/>\n <ellipse cx=\"1524\" cy=\"370\" rx=\"12\" ry=\"6\" fill=\"#14381c\" opacity=\"0.55\"/>\n <ellipse cx=\"1528\" cy=\"480\" rx=\"11\" ry=\"5\" fill=\"#123218\" opacity=\"0.5\"/>\n <ellipse cx=\"1526\" cy=\"590\" rx=\"12\" ry=\"6\" fill=\"#0f2d16\" opacity=\"0.55\"/>\n <ellipse cx=\"1530\" cy=\"700\" rx=\"11\" ry=\"5\" fill=\"#14381c\" opacity=\"0.5\"/>\n </g>\n </g>\n\n <!-- Neon utcai lámpák (4 db, fénykúppal) -->\n <g>\n <!-- Bal felső (cyan) -->\n <rect x=\"18\" y=\"120\" width=\"4\" height=\"24\" fill=\"#1a1a2e\"/>\n <rect x=\"14\" y=\"116\" width=\"12\" height=\"6\" rx=\"2\" fill=\"#1a1a2e\"\n stroke=\"#00e5ff\" stroke-width=\"0.8\" opacity=\"0.7\"/>\n <circle cx=\"20\" cy=\"119\" r=\"3\" fill=\"#00e5ff\" opacity=\"0.6\"/>\n <circle cx=\"20\" cy=\"119\" r=\"10\" fill=\"#00e5ff\" opacity=\"0.06\"/>\n <ellipse cx=\"20\" cy=\"148\" rx=\"14\" ry=\"6\" fill=\"#00e5ff\" opacity=\"0.04\"/>\n <!-- Jobb felső (magenta) — ugyanaz az X eltolás mint a keleti fasor -->\n <g [attr.transform]=\"forestEastGroupTransform_$()\">\n <rect x=\"1514\" y=\"115\" width=\"4\" height=\"24\" fill=\"#1a1a2e\"/>\n <rect x=\"1510\" y=\"111\" width=\"12\" height=\"6\" rx=\"2\" fill=\"#1a1a2e\"\n stroke=\"#ff2dd9\" stroke-width=\"0.8\" opacity=\"0.7\"/>\n <circle cx=\"1516\" cy=\"114\" r=\"3\" fill=\"#ff2dd9\" opacity=\"0.6\"/>\n <circle cx=\"1516\" cy=\"114\" r=\"10\" fill=\"#ff2dd9\" opacity=\"0.06\"/>\n <ellipse cx=\"1516\" cy=\"143\" rx=\"14\" ry=\"6\" fill=\"#ff2dd9\" opacity=\"0.04\"/>\n </g>\n <!-- Bal alsó (green) — bázis (90,710) -->\n <g [attr.transform]=\"'translate(' + (decorLampSouthWestBase_$().x - 90) + ',' + (decorLampSouthWestBase_$().y - 710) + ')'\">\n <rect x=\"90\" y=\"710\" width=\"4\" height=\"24\" fill=\"#1a1a2e\"/>\n <rect x=\"86\" y=\"706\" width=\"12\" height=\"6\" rx=\"2\" fill=\"#1a1a2e\"\n stroke=\"#39ff88\" stroke-width=\"0.8\" opacity=\"0.7\"/>\n <circle cx=\"92\" cy=\"709\" r=\"3\" fill=\"#39ff88\" opacity=\"0.6\"/>\n <circle cx=\"92\" cy=\"709\" r=\"10\" fill=\"#39ff88\" opacity=\"0.06\"/>\n <ellipse cx=\"92\" cy=\"738\" rx=\"14\" ry=\"6\" fill=\"#39ff88\" opacity=\"0.04\"/>\n </g>\n <!-- Jobb alsó (green) — bázis (1440,710) -->\n <g [attr.transform]=\"'translate(' + (decorLampSouthEastBase_$().x - 1440) + ',' + (decorLampSouthEastBase_$().y - 710) + ')'\">\n <rect x=\"1440\" y=\"710\" width=\"4\" height=\"24\" fill=\"#1a1a2e\"/>\n <rect x=\"1436\" y=\"706\" width=\"12\" height=\"6\" rx=\"2\" fill=\"#1a1a2e\"\n stroke=\"#39ff88\" stroke-width=\"0.8\" opacity=\"0.7\"/>\n <circle cx=\"1442\" cy=\"709\" r=\"3\" fill=\"#39ff88\" opacity=\"0.6\"/>\n <circle cx=\"1442\" cy=\"709\" r=\"10\" fill=\"#39ff88\" opacity=\"0.06\"/>\n <ellipse cx=\"1442\" cy=\"738\" rx=\"14\" ry=\"6\" fill=\"#39ff88\" opacity=\"0.04\"/>\n </g>\n </g>\n\n <!-- Tech debris (neon pontok a talajon) -->\n <circle cx=\"15\" cy=\"500\" r=\"1.5\" fill=\"#7d5cff\" opacity=\"0.4\"/>\n <circle cx=\"15\" cy=\"500\" r=\"4\" fill=\"#7d5cff\" opacity=\"0.04\"/>\n <g [attr.transform]=\"forestEastGroupTransform_$()\">\n <circle cx=\"1520\" cy=\"300\" r=\"1.5\" fill=\"#00e5ff\" opacity=\"0.35\"/>\n <circle cx=\"1520\" cy=\"300\" r=\"4\" fill=\"#00e5ff\" opacity=\"0.04\"/>\n <circle cx=\"1460\" cy=\"840\" r=\"1.2\" fill=\"#ffc857\" opacity=\"0.3\"/>\n <circle cx=\"1460\" cy=\"840\" r=\"3.5\" fill=\"#ffc857\" opacity=\"0.04\"/>\n </g>\n <circle cx=\"80\" cy=\"50\" r=\"1\" fill=\"#ff2dd9\" opacity=\"0.3\"/>\n <circle cx=\"80\" cy=\"50\" r=\"3\" fill=\"#ff2dd9\" opacity=\"0.04\"/>\n <circle [attr.cx]=\"layoutDerived_$().door.x\"\n [attr.cy]=\"layoutDerived_$().door.y - 48\"\n r=\"1\" fill=\"#39ff88\" opacity=\"0.35\"/>\n <circle [attr.cx]=\"layoutDerived_$().door.x\"\n [attr.cy]=\"layoutDerived_$().door.y - 48\"\n r=\"3\" fill=\"#39ff88\" opacity=\"0.04\"/>\n <circle cx=\"400\" cy=\"20\" r=\"1.2\" fill=\"#ff4d6d\" opacity=\"0.3\"/>\n <circle cx=\"400\" cy=\"20\" r=\"3.5\" fill=\"#ff4d6d\" opacity=\"0.04\"/>\n\n <!-- Bejárati ösvény (ajtó → világ alja, neon szegélyekkel) -->\n <rect [attr.x]=\"entrancePathRect_$().x\"\n [attr.y]=\"entrancePathRect_$().y\"\n [attr.width]=\"entrancePathRect_$().w\"\n [attr.height]=\"entrancePathRect_$().h\"\n fill=\"#0e160f\" rx=\"2\"/>\n <line [attr.x1]=\"entrancePathRect_$().x\"\n [attr.y1]=\"entrancePathRect_$().y + 2\"\n [attr.x2]=\"entrancePathRect_$().x\"\n [attr.y2]=\"entrancePathRect_$().y + entrancePathRect_$().h - 4\"\n stroke=\"#39ff88\" stroke-width=\"0.8\" opacity=\"0.15\"/>\n <line [attr.x1]=\"entrancePathRect_$().x + entrancePathRect_$().w\"\n [attr.y1]=\"entrancePathRect_$().y + 2\"\n [attr.x2]=\"entrancePathRect_$().x + entrancePathRect_$().w\"\n [attr.y2]=\"entrancePathRect_$().y + entrancePathRect_$().h - 4\"\n stroke=\"#39ff88\" stroke-width=\"0.8\" opacity=\"0.15\"/>\n </g>\n\n <!-- ============================================================= -->\n <!-- Layer 2: Padló (épületen belül) -->\n <!-- ============================================================= -->\n <g id=\"doGround\">\n <rect [attr.x]=\"layoutDerived_$().floorWorkspace.x\"\n [attr.y]=\"layoutDerived_$().floorWorkspace.y\"\n [attr.width]=\"layoutDerived_$().floorWorkspace.w\"\n [attr.height]=\"layoutDerived_$().floorWorkspace.h\"\n fill=\"#101022\" opacity=\"0.6\"/>\n <rect [attr.x]=\"layoutDerived_$().floorWorkspace.x\"\n [attr.y]=\"layoutDerived_$().floorWorkspace.y\"\n [attr.width]=\"layoutDerived_$().floorWorkspace.w\"\n [attr.height]=\"layoutDerived_$().floorWorkspace.h\"\n fill=\"url(#doFloorGridWork)\"/>\n\n <rect [attr.x]=\"layoutDerived_$().floorLobby.x\"\n [attr.y]=\"layoutDerived_$().floorLobby.y\"\n [attr.width]=\"layoutDerived_$().floorLobby.w\"\n [attr.height]=\"layoutDerived_$().floorLobby.h\"\n fill=\"#0e1218\" opacity=\"0.92\"/>\n <rect [attr.x]=\"layoutDerived_$().floorLobby.x\"\n [attr.y]=\"layoutDerived_$().floorLobby.y\"\n [attr.width]=\"layoutDerived_$().floorLobby.w\"\n [attr.height]=\"layoutDerived_$().floorLobby.h\"\n fill=\"#141820\" opacity=\"0.35\"/>\n\n <rect [attr.x]=\"layoutDerived_$().floorLounge.x\"\n [attr.y]=\"layoutDerived_$().floorLounge.y\"\n [attr.width]=\"layoutDerived_$().floorLounge.w\"\n [attr.height]=\"layoutDerived_$().floorLounge.h\"\n fill=\"#111126\" opacity=\"0.6\"/>\n <rect [attr.x]=\"layoutDerived_$().floorLounge.x\"\n [attr.y]=\"layoutDerived_$().floorLounge.y\"\n [attr.width]=\"layoutDerived_$().floorLounge.w\"\n [attr.height]=\"layoutDerived_$().floorLounge.h\"\n fill=\"url(#doFloorGridLounge)\"/>\n\n <rect [attr.x]=\"layoutDerived_$().floorConference.x\"\n [attr.y]=\"layoutDerived_$().floorConference.y\"\n [attr.width]=\"layoutDerived_$().floorConference.w\"\n [attr.height]=\"layoutDerived_$().floorConference.h\"\n fill=\"#101022\" opacity=\"0.55\"/>\n <rect [attr.x]=\"layoutDerived_$().floorConference.x\"\n [attr.y]=\"layoutDerived_$().floorConference.y\"\n [attr.width]=\"layoutDerived_$().floorConference.w\"\n [attr.height]=\"layoutDerived_$().floorConference.h\"\n fill=\"url(#doFloorGridConference)\" opacity=\"0.5\"/>\n\n <line [attr.x1]=\"layoutDerived_$().zoneSplitX\"\n [attr.y1]=\"layoutDerived_$().floorWorkspace.y\"\n [attr.x2]=\"layoutDerived_$().zoneSplitX\"\n [attr.y2]=\"layoutDerived_$().floorLounge.y + layoutDerived_$().floorLounge.h\"\n stroke=\"#00e5ff\" stroke-width=\"3\" opacity=\"0.08\" filter=\"url(#doGlowMid)\"/>\n <line [attr.x1]=\"layoutDerived_$().zoneSplitX\"\n [attr.y1]=\"layoutDerived_$().floorWorkspace.y\"\n [attr.x2]=\"layoutDerived_$().zoneSplitX\"\n [attr.y2]=\"layoutDerived_$().floorLounge.y + layoutDerived_$().floorLounge.h\"\n stroke=\"#00e5ff\" stroke-width=\"1.2\" opacity=\"0.3\"/>\n <line [attr.x1]=\"layoutDerived_$().zoneSplitX + 1.5\"\n [attr.y1]=\"layoutDerived_$().floorWorkspace.y\"\n [attr.x2]=\"layoutDerived_$().zoneSplitX + 1.5\"\n [attr.y2]=\"layoutDerived_$().floorLounge.y + layoutDerived_$().floorLounge.h\"\n stroke=\"#ff2dd9\" stroke-width=\"1.2\" opacity=\"0.25\"/>\n\n <line [attr.x1]=\"layoutDerived_$().zoneSplitLobbyLoungeX\"\n [attr.y1]=\"layoutDerived_$().floorWorkspace.y\"\n [attr.x2]=\"layoutDerived_$().zoneSplitLobbyLoungeX\"\n [attr.y2]=\"layoutDerived_$().floorLounge.y + layoutDerived_$().floorLounge.h\"\n stroke=\"#00e5ff\" stroke-width=\"3\" opacity=\"0.06\" filter=\"url(#doGlowMid)\"/>\n <line [attr.x1]=\"layoutDerived_$().zoneSplitLobbyLoungeX\"\n [attr.y1]=\"layoutDerived_$().floorWorkspace.y\"\n [attr.x2]=\"layoutDerived_$().zoneSplitLobbyLoungeX\"\n [attr.y2]=\"layoutDerived_$().floorLounge.y + layoutDerived_$().floorLounge.h\"\n stroke=\"#ff2dd9\" stroke-width=\"1.2\" opacity=\"0.22\"/>\n </g>\n\n <!-- ============================================================= -->\n <!-- Layer 3: Épület keret (falak, ablakok, bejárat) -->\n <!-- ============================================================= -->\n <g id=\"doBuilding\">\n <rect [attr.x]=\"layoutDerived_$().buildingOuter.x\"\n [attr.y]=\"layoutDerived_$().buildingOuter.y\"\n [attr.width]=\"layoutDerived_$().buildingOuter.w\"\n [attr.height]=\"layoutDerived_$().buildingOuter.h\"\n fill=\"none\" stroke=\"#2e2e58\" stroke-width=\"2\" rx=\"4\"/>\n <rect [attr.x]=\"layoutDerived_$().buildingOuter.x\"\n [attr.y]=\"layoutDerived_$().buildingOuter.y\"\n [attr.width]=\"layoutDerived_$().buildingOuter.w\"\n [attr.height]=\"layoutDerived_$().buildingOuter.h\"\n fill=\"#161630\" opacity=\"0.3\" rx=\"4\"/>\n\n <line [attr.x1]=\"layoutDerived_$().buildingOuter.x + 4\"\n [attr.y1]=\"layoutDerived_$().buildingOuter.y + 4\"\n [attr.x2]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 4\"\n [attr.y2]=\"layoutDerived_$().buildingOuter.y + 4\"\n stroke=\"#00e5ff\" stroke-width=\"3\" opacity=\"0.06\" filter=\"url(#doGlowSmall)\"/>\n <line [attr.x1]=\"layoutDerived_$().buildingOuter.x + 4\"\n [attr.y1]=\"layoutDerived_$().buildingOuter.y + 4\"\n [attr.x2]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 4\"\n [attr.y2]=\"layoutDerived_$().buildingOuter.y + 4\"\n stroke=\"#00e5ff\" stroke-width=\"1\" opacity=\"0.25\"/>\n <line [attr.x1]=\"layoutDerived_$().buildingOuter.x + 4\"\n [attr.y1]=\"layoutDerived_$().buildingOuter.y + layoutDerived_$().buildingOuter.h - 4\"\n [attr.x2]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 4\"\n [attr.y2]=\"layoutDerived_$().buildingOuter.y + layoutDerived_$().buildingOuter.h - 4\"\n stroke=\"#00e5ff\" stroke-width=\"3\" opacity=\"0.06\" filter=\"url(#doGlowSmall)\"/>\n <line [attr.x1]=\"layoutDerived_$().buildingOuter.x + 4\"\n [attr.y1]=\"layoutDerived_$().buildingOuter.y + layoutDerived_$().buildingOuter.h - 4\"\n [attr.x2]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 4\"\n [attr.y2]=\"layoutDerived_$().buildingOuter.y + layoutDerived_$().buildingOuter.h - 4\"\n stroke=\"#00e5ff\" stroke-width=\"1\" opacity=\"0.25\"/>\n <line [attr.x1]=\"layoutDerived_$().buildingOuter.x + 4\"\n [attr.y1]=\"layoutDerived_$().buildingOuter.y + 4\"\n [attr.x2]=\"layoutDerived_$().buildingOuter.x + 4\"\n [attr.y2]=\"layoutDerived_$().buildingOuter.y + layoutDerived_$().buildingOuter.h - 4\"\n stroke=\"#ff2dd9\" stroke-width=\"3\" opacity=\"0.06\" filter=\"url(#doGlowSmall)\"/>\n <line [attr.x1]=\"layoutDerived_$().buildingOuter.x + 4\"\n [attr.y1]=\"layoutDerived_$().buildingOuter.y + 4\"\n [attr.x2]=\"layoutDerived_$().buildingOuter.x + 4\"\n [attr.y2]=\"layoutDerived_$().buildingOuter.y + layoutDerived_$().buildingOuter.h - 4\"\n stroke=\"#ff2dd9\" stroke-width=\"1\" opacity=\"0.25\"/>\n <line [attr.x1]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 4\"\n [attr.y1]=\"layoutDerived_$().buildingOuter.y + 4\"\n [attr.x2]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 4\"\n [attr.y2]=\"layoutDerived_$().buildingOuter.y + layoutDerived_$().buildingOuter.h - 4\"\n stroke=\"#ff2dd9\" stroke-width=\"3\" opacity=\"0.06\" filter=\"url(#doGlowSmall)\"/>\n <line [attr.x1]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 4\"\n [attr.y1]=\"layoutDerived_$().buildingOuter.y + 4\"\n [attr.x2]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 4\"\n [attr.y2]=\"layoutDerived_$().buildingOuter.y + layoutDerived_$().buildingOuter.h - 4\"\n stroke=\"#ff2dd9\" stroke-width=\"1\" opacity=\"0.25\"/>\n\n <rect [attr.x]=\"layoutDerived_$().buildingOuter.x\"\n [attr.y]=\"layoutDerived_$().buildingOuter.y\"\n width=\"32\" height=\"32\" fill=\"none\"\n stroke=\"#00e5ff\" stroke-width=\"0.5\" opacity=\"0.15\" rx=\"2\"/>\n <rect [attr.x]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 32\"\n [attr.y]=\"layoutDerived_$().buildingOuter.y\"\n width=\"32\" height=\"32\" fill=\"none\"\n stroke=\"#ff2dd9\" stroke-width=\"0.5\" opacity=\"0.15\" rx=\"2\"/>\n <rect [attr.x]=\"layoutDerived_$().buildingOuter.x\"\n [attr.y]=\"layoutDerived_$().buildingOuter.y + layoutDerived_$().buildingOuter.h - 32\"\n width=\"32\" height=\"32\" fill=\"none\"\n stroke=\"#ff2dd9\" stroke-width=\"0.5\" opacity=\"0.15\" rx=\"2\"/>\n <rect [attr.x]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 32\"\n [attr.y]=\"layoutDerived_$().buildingOuter.y + layoutDerived_$().buildingOuter.h - 32\"\n width=\"32\" height=\"32\" fill=\"none\"\n stroke=\"#00e5ff\" stroke-width=\"0.5\" opacity=\"0.15\" rx=\"2\"/>\n\n <g id=\"doWindowsNorth\">\n @for (win of northWindowRects_$(); track $index) {\n <g>\n <rect [attr.x]=\"win.x\" [attr.y]=\"win.y\" [attr.width]=\"win.w\" [attr.height]=\"win.h\"\n fill=\"#0c1028\" rx=\"2\"\n stroke=\"#00e5ff\" stroke-width=\"0.8\" opacity=\"0.4\"/>\n <rect [attr.x]=\"win.x\" [attr.y]=\"win.y\" [attr.width]=\"win.w\" [attr.height]=\"win.h\"\n fill=\"url(#doGlassReflection)\"/>\n <line [attr.x1]=\"win.x + win.w * 0.25\" [attr.y1]=\"win.y\"\n [attr.x2]=\"win.x + win.w * 0.25\" [attr.y2]=\"win.y + win.h\"\n stroke=\"#3a3a60\" stroke-width=\"0.5\" opacity=\"0.4\"/>\n <line [attr.x1]=\"win.x + win.w * 0.5\" [attr.y1]=\"win.y\"\n [attr.x2]=\"win.x + win.w * 0.5\" [attr.y2]=\"win.y + win.h\"\n stroke=\"#3a3a60\" stroke-width=\"0.5\" opacity=\"0.4\"/>\n <line [attr.x1]=\"win.x + win.w * 0.75\" [attr.y1]=\"win.y\"\n [attr.x2]=\"win.x + win.w * 0.75\" [attr.y2]=\"win.y + win.h\"\n stroke=\"#3a3a60\" stroke-width=\"0.5\" opacity=\"0.4\"/>\n </g>\n }\n </g>\n\n <g id=\"doWindowsEast\">\n @for (ey of [0, 1, 2]; track ey) {\n <g>\n <rect\n [attr.x]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 28\"\n [attr.y]=\"layoutDerived_$().buildingOuter.y + 76 + ey * 180\"\n width=\"24\" height=\"128\" fill=\"#0c1028\" rx=\"2\"\n stroke=\"#ff2dd9\" stroke-width=\"0.8\" opacity=\"0.4\"/>\n <rect\n [attr.x]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 28\"\n [attr.y]=\"layoutDerived_$().buildingOuter.y + 76 + ey * 180\"\n width=\"24\" height=\"128\" fill=\"url(#doGlassReflection)\"/>\n <line\n [attr.x1]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 28\"\n [attr.y1]=\"layoutDerived_$().buildingOuter.y + 76 + ey * 180 + 32\"\n [attr.x2]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 4\"\n [attr.y2]=\"layoutDerived_$().buildingOuter.y + 76 + ey * 180 + 32\"\n stroke=\"#3a3a60\" stroke-width=\"0.5\" opacity=\"0.4\"/>\n <line\n [attr.x1]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 28\"\n [attr.y1]=\"layoutDerived_$().buildingOuter.y + 76 + ey * 180 + 64\"\n [attr.x2]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 4\"\n [attr.y2]=\"layoutDerived_$().buildingOuter.y + 76 + ey * 180 + 64\"\n stroke=\"#3a3a60\" stroke-width=\"0.5\" opacity=\"0.4\"/>\n <line\n [attr.x1]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 28\"\n [attr.y1]=\"layoutDerived_$().buildingOuter.y + 76 + ey * 180 + 96\"\n [attr.x2]=\"layoutDerived_$().buildingOuter.x + layoutDerived_$().buildingOuter.w - 4\"\n [attr.y2]=\"layoutDerived_$().buildingOuter.y + 76 + ey * 180 + 96\"\n stroke=\"#3a3a60\" stroke-width=\"0.5\" opacity=\"0.4\"/>\n </g>\n }\n </g>\n\n <g id=\"doEntrance\">\n <rect [attr.x]=\"layoutDerived_$().door.x - 48\"\n [attr.y]=\"layoutDerived_$().door.y - 8\"\n width=\"96\" height=\"24\" fill=\"#0c1028\" rx=\"1\"/>\n <rect [attr.x]=\"layoutDerived_$().door.x - 46\"\n [attr.y]=\"layoutDerived_$().door.y - 6\"\n width=\"44\" height=\"20\" fill=\"#0c1028\" rx=\"1\"\n stroke=\"#39ff88\" stroke-width=\"0.8\" opacity=\"0.35\"/>\n <rect [attr.x]=\"layoutDerived_$().door.x - 46\"\n [attr.y]=\"layoutDerived_$().door.y - 6\"\n width=\"44\" height=\"20\" fill=\"url(#doGlassReflection)\"/>\n <rect [attr.x]=\"layoutDerived_$().door.x + 2\"\n [attr.y]=\"layoutDerived_$().door.y - 6\"\n width=\"44\" height=\"20\" fill=\"#0c1028\" rx=\"1\"\n stroke=\"#39ff88\" stroke-width=\"0.8\" opacity=\"0.35\"/>\n <rect [attr.x]=\"layoutDerived_$().door.x + 2\"\n [attr.y]=\"layoutDerived_$().door.y - 6\"\n width=\"44\" height=\"20\" fill=\"url(#doGlassReflection)\"/>\n <line [attr.x1]=\"layoutDerived_$().door.x\"\n [attr.y1]=\"layoutDerived_$().door.y - 6\"\n [attr.x2]=\"layoutDerived_$().door.x\"\n [attr.y2]=\"layoutDerived_$().door.y + 14\"\n stroke=\"#39ff88\" stroke-width=\"1\" opacity=\"0.5\"/>\n <rect [attr.x]=\"layoutDerived_$().door.x - 30\"\n [attr.y]=\"layoutDerived_$().door.y - 24\"\n width=\"60\" height=\"14\" fill=\"#161630\" rx=\"2\"\n stroke=\"#39ff88\" stroke-width=\"0.8\" opacity=\"0.5\"/>\n <text [attr.x]=\"layoutDerived_$().door.x\"\n [attr.y]=\"layoutDerived_$().door.y - 13\"\n text-anchor=\"middle\"\n fill=\"#39ff88\" font-size=\"8\" font-weight=\"bold\" font-family=\"monospace\" opacity=\"0.8\">\n CCAP\n </text>\n <line [attr.x1]=\"layoutDerived_$().door.x - 26\"\n [attr.y1]=\"layoutDerived_$().door.y - 9\"\n [attr.x2]=\"layoutDerived_$().door.x + 26\"\n [attr.y2]=\"layoutDerived_$().door.y - 9\"\n stroke=\"#39ff88\" stroke-width=\"1.5\" opacity=\"0.3\" filter=\"url(#doGlowSmall)\"/>\n <line [attr.x1]=\"layoutDerived_$().door.x - 48\"\n [attr.y1]=\"layoutDerived_$().door.y + 16\"\n [attr.x2]=\"layoutDerived_$().door.x + 48\"\n [attr.y2]=\"layoutDerived_$().door.y + 16\"\n stroke=\"#39ff88\" stroke-width=\"2\" opacity=\"0.35\" filter=\"url(#doGlowSmall)\"/>\n </g>\n </g>\n\n <!-- ============================================================= -->\n <!-- Layer 4: Belső bútorok -->\n <!-- ============================================================= -->\n <g id=\"doInterior\">\n <text [attr.x]=\"layoutDerived_$().labelWorkspaceX\"\n [attr.y]=\"layoutDerived_$().ceilingNeonY - 12\"\n text-anchor=\"middle\"\n fill=\"#6060a0\" font-size=\"8\" font-family=\"monospace\" opacity=\"0.5\">\n WORKSPACE\n </text>\n <text [attr.x]=\"layoutDerived_$().floorLobby.x + layoutDerived_$().floorLobby.w / 2\"\n [attr.y]=\"layoutDerived_$().ceilingNeonY - 12\"\n text-anchor=\"middle\"\n fill=\"#505870\" font-size=\"8\" font-family=\"monospace\" opacity=\"0.4\">\n LOBBY\n </text>\n <text [attr.x]=\"layoutDerived_$().labelLoungeX\"\n [attr.y]=\"layoutDerived_$().ceilingNeonY - 12\"\n text-anchor=\"middle\"\n fill=\"#8060a0\" font-size=\"8\" font-family=\"monospace\" opacity=\"0.5\">\n LOUNGE\n </text>\n <text [attr.x]=\"layoutDerived_$().labelConferenceX\"\n [attr.y]=\"layoutDerived_$().floorConference.y + 20\"\n text-anchor=\"middle\"\n fill=\"#6060a0\" font-size=\"8\" font-family=\"monospace\" opacity=\"0.5\">\n CONFERENCE\n </text>\n\n <line [attr.x1]=\"layoutDerived_$().floorWorkspace.x + 8\"\n [attr.y1]=\"layoutDerived_$().topFloorBottomY\"\n [attr.x2]=\"layoutDerived_$().floorWorkspace.x + layoutDerived_$().floorWorkspace.w - 8\"\n [attr.y2]=\"layoutDerived_$().topFloorBottomY\"\n stroke=\"#00e5ff\" stroke-width=\"1.2\" opacity=\"0.22\"/>\n <line [attr.x1]=\"layoutDerived_$().floorWorkspace.x + 8\"\n [attr.y1]=\"layoutDerived_$().topFloorBottomY + 1.5\"\n [attr.x2]=\"layoutDerived_$().floorWorkspace.x + layoutDerived_$().floorWorkspace.w - 8\"\n [attr.y2]=\"layoutDerived_$().topFloorBottomY + 1.5\"\n stroke=\"#ff2dd9\" stroke-width=\"1\" opacity=\"0.18\"/>\n\n @for (desk of layoutDerived_$().workstationDesks; track desk.trackId) {\n <g>\n <rect [attr.x]=\"desk.x\" [attr.y]=\"desk.y\" width=\"64\" height=\"32\" fill=\"#1e1e38\" rx=\"2\"\n stroke=\"#50508a\" stroke-width=\"0.6\"/>\n <rect [attr.x]=\"desk.x + 2\" [attr.y]=\"desk.y + 2\" width=\"60\" height=\"28\" fill=\"#262646\" rx=\"1\"/>\n @if (desk.monitorIsCyan) {\n <rect [attr.x]=\"desk.x + 18\" [attr.y]=\"desk.y + 4\" width=\"24\" height=\"14\" fill=\"#0a1a40\" rx=\"1\"\n stroke=\"#00e5ff\" stroke-width=\"0.5\" opacity=\"0.6\"/>\n <line [attr.x1]=\"desk.x + 20\" [attr.y1]=\"desk.y + 9\"\n [attr.x2]=\"desk.x + 40\" [attr.y2]=\"desk.y + 9\"\n stroke=\"#00e5ff\" stroke-width=\"0.3\" opacity=\"0.35\"/>\n } @else {\n <rect [attr.x]=\"desk.x + 18\" [attr.y]=\"desk.y + 4\" width=\"24\" height=\"14\" fill=\"#0a1a40\" rx=\"1\"\n stroke=\"#ff2dd9\" stroke-width=\"0.5\" opacity=\"0.6\"/>\n <line [attr.x1]=\"desk.x + 20\" [attr.y1]=\"desk.y + 9\"\n [attr.x2]=\"desk.x + 40\" [attr.y2]=\"desk.y + 9\"\n stroke=\"#ff2dd9\" stroke-width=\"0.3\" opacity=\"0.35\"/>\n }\n <ellipse [attr.cx]=\"desk.x + 32\" [attr.cy]=\"desk.y + 40\" rx=\"10\" ry=\"6\" fill=\"#14142a\" opacity=\"0.7\"/>\n <ellipse [attr.cx]=\"desk.x + 32\" [attr.cy]=\"desk.y + 40\" rx=\"7\" ry=\"4\" fill=\"#1e1e38\"\n stroke=\"#50508a\" stroke-width=\"0.4\"/>\n </g>\n }\n\n <!-- Konferencia bútorok (harmadik zóna — ugyanaz a neon / monospace nyelv) -->\n <g id=\"doConferenceFurniture\">\n <rect [attr.x]=\"layoutDerived_$().conference.table.x\"\n [attr.y]=\"layoutDerived_$().conference.table.y\"\n [attr.width]=\"layoutDerived_$().conference.table.w\"\n [attr.height]=\"layoutDerived_$().conference.table.h\"\n fill=\"#1c1c36\" rx=\"4\"\n stroke=\"#00e5ff\" stroke-width=\"0.9\" opacity=\"0.45\"/>\n <rect [attr.x]=\"layoutDerived_$().conference.table.x + 4\"\n [attr.y]=\"layoutDerived_$().conference.table.y + 4\"\n [attr.width]=\"layoutDerived_$().conference.table.w - 8\"\n [attr.height]=\"layoutDerived_$().conference.table.h - 8\"\n fill=\"#222240\" rx=\"3\" opacity=\"0.9\"/>\n <line [attr.x1]=\"layoutDerived_$().conference.table.x + 12\"\n [attr.y1]=\"layoutDerived_$().conference.table.y + 16\"\n [attr.x2]=\"layoutDerived_$().conference.table.x + layoutDerived_$().conference.table.w - 12\"\n [attr.y2]=\"layoutDerived_$().conference.table.y + 16\"\n stroke=\"#ff2dd9\" stroke-width=\"0.6\" opacity=\"0.35\"/>\n @for (c of layoutDerived_$().conference.chairs; track c.trackId) {\n <g>\n <ellipse [attr.cx]=\"c.x\" [attr.cy]=\"c.y\" rx=\"16\" ry=\"11\"\n fill=\"#14142a\" opacity=\"0.88\"\n stroke=\"#ff2dd9\" stroke-width=\"0.55\" opacity=\"0.5\"/>\n <ellipse [attr.cx]=\"c.x\" [attr.cy]=\"c.y\" rx=\"11\" ry=\"7\"\n fill=\"#1e1e38\" stroke=\"#50508a\" stroke-width=\"0.35\"/>\n </g>\n }\n </g>\n\n <!-- Szerver rack (részletesebb: polcok, LED-ek, neon keret, glow) -->\n <g [attr.transform]=\"'translate(' + (layoutDerived_$().floorWorkspace.x - 128) + ',0)'\">\n <rect x=\"480\" y=\"128\" width=\"64\" height=\"64\" fill=\"#181832\" rx=\"3\"\n stroke=\"#50508a\" stroke-width=\"0.8\"/>\n <rect x=\"482\" y=\"130\" width=\"60\" height=\"60\" fill=\"#222240\" rx=\"2\"/>\n <line x1=\"482\" y1=\"145\" x2=\"542\" y2=\"145\" stroke=\"#3a3a60\" stroke-width=\"0.6\"/>\n <line x1=\"482\" y1=\"160\" x2=\"542\" y2=\"160\" stroke=\"#3a3a60\" stroke-width=\"0.6\"/>\n <line x1=\"482\" y1=\"175\" x2=\"542\" y2=\"175\" stroke=\"#3a3a60\" stroke-width=\"0.6\"/>\n <circle cx=\"538\" cy=\"136\" r=\"1.5\" fill=\"#00e5ff\" opacity=\"0.7\"/>\n <circle cx=\"538\" cy=\"142\" r=\"1.5\" fill=\"#ff2dd9\" opacity=\"0.7\"/>\n <circle cx=\"538\" cy=\"152\" r=\"1.5\" fill=\"#39ff88\" opacity=\"0.7\"/>\n <circle cx=\"538\" cy=\"158\" r=\"1.5\" fill=\"#39ff88\" opacity=\"0.7\"/>\n <circle cx=\"538\" cy=\"168\" r=\"1.5\" fill=\"#ff4d4d\" opacity=\"0.5\"/>\n <circle cx=\"538\" cy=\"174\" r=\"1.5\" fill=\"#00e5ff\" opacity=\"0.5\"/>\n <rect x=\"480\" y=\"128\" width=\"64\" height=\"64\" fill=\"none\" rx=\"3\"\n stroke=\"#00e5ff\" stroke-width=\"0.5\" opacity=\"0.15\"/>\n <ellipse cx=\"512\" cy=\"194\" rx=\"8\" ry=\"2\" fill=\"#00e5ff\" opacity=\"0.02\"/>\n </g>\n\n @for (sofa of layoutDerived_$().loungeSofas; track sofa.trackId) {\n <g>\n <rect [attr.x]=\"sofa.x\" [attr.y]=\"sofa.y\" [attr.width]=\"sofa.w\" [attr.height]=\"sofa.h\"\n fill=\"#1c1c36\" rx=\"5\"\n stroke=\"#ff2dd9\" stroke-width=\"0.8\" opacity=\"0.35\"/>\n <rect [attr.x]=\"sofa.x + 4\" [attr.y]=\"sofa.y + 4\"\n [attr.width]=\"sofa.w - 8\" [attr.height]=\"sofa.h - 8\"\n fill=\"#282848\" rx=\"4\"/>\n <ellipse [attr.cx]=\"sofa.x + 28\" [attr.cy]=\"sofa.y + sofa.h / 2\"\n rx=\"12\" ry=\"9\" fill=\"#222240\" opacity=\"0.6\"/>\n <ellipse [attr.cx]=\"sofa.x + sofa.w - 28\" [attr.cy]=\"sofa.y + sofa.h / 2\"\n rx=\"12\" ry=\"9\" fill=\"#222240\" opacity=\"0.6\"/>\n <rect [attr.x]=\"sofa.x + 2\" [attr.y]=\"sofa.y - 2\"\n [attr.width]=\"sofa.w - 4\" height=\"6\" fill=\"#1c1c36\" rx=\"3\"/>\n </g>\n }\n\n <g id=\"doLoungeCoffeeTable\">\n <rect [attr.x]=\"layoutDerived_$().floorLounge.x + layoutDerived_$().floorLounge.w - 100\"\n [attr.y]=\"layoutDerived_$().floorLounge.y + layoutDerived_$().floorLounge.h / 2 - 16\"\n width=\"44\" height=\"32\" fill=\"#1c1c36\" rx=\"3\"\n stroke=\"#50508a\" stroke-width=\"0.6\"/>\n <rect [attr.x]=\"layoutDerived_$().floorLounge.x + layoutDerived_$().floorLounge.w - 96\"\n [attr.y]=\"layoutDerived_$().floorLounge.y + layoutDerived_$().floorLounge.h / 2 - 12\"\n width=\"36\" height=\"24\" fill=\"#282848\" rx=\"2\"/>\n <circle [attr.cx]=\"layoutDerived_$().floorLounge.x + layoutDerived_$().floorLounge.w - 84\"\n [attr.cy]=\"layoutDerived_$().floorLounge.y + layoutDerived_$().floorLounge.h / 2\"\n r=\"5\" fill=\"#1a1006\" opacity=\"0.3\"/>\n <circle [attr.cx]=\"layoutDerived_$().floorLounge.x + layoutDerived_$().floorLounge.w - 84\"\n [attr.cy]=\"layoutDerived_$().floorLounge.y + layoutDerived_$().floorLounge.h / 2\"\n r=\"3\" fill=\"#3a2810\" opacity=\"0.5\"/>\n <ellipse [attr.cx]=\"layoutDerived_$().floorLounge.x + layoutDerived_$().floorLounge.w - 84\"\n [attr.cy]=\"layoutDerived_$().floorLounge.y + layoutDerived_$().floorLounge.h / 2 - 1\"\n rx=\"2.5\" ry=\"1.5\" fill=\"#5a3a18\" opacity=\"0.4\"/>\n <rect [attr.x]=\"layoutDerived_$().floorLounge.x + layoutDerived_$().floorLounge.w - 72\"\n [attr.y]=\"layoutDerived_$().floorLounge.y + layoutDerived_$().floorLounge.h / 2 - 6\"\n width=\"10\" height=\"14\" fill=\"#1e1e38\" rx=\"1\"\n stroke=\"#50508a\" stroke-width=\"0.3\" opacity=\"0.4\"/>\n </g>\n\n <!-- Mennyezeti neon csíkok (dupla réteg: glow + vonal) -->\n <line [attr.x1]=\"layoutDerived_$().floorWorkspace.x + 12\"\n [attr.y1]=\"layoutDerived_$().ceilingNeonY\"\n [attr.x2]=\"layoutDerived_$().zoneSplitX - 8\"\n [attr.y2]=\"layoutDerived_$().ceilingNeonY\"\n stroke=\"#00e5ff\" stroke-width=\"3\" opacity=\"0.1\" filter=\"url(#doGlowMid)\"/>\n <line [attr.x1]=\"layoutDerived_$().floorWorkspace.x + 12\"\n [attr.y1]=\"layoutDerived_$().ceilingNeonY\"\n [attr.x2]=\"layoutDerived_$().zoneSplitX - 8\"\n [attr.y2]=\"layoutDerived_$().ceilingNeonY\"\n stroke=\"#00e5ff\" stroke-width=\"1.2\" opacity=\"0.35\"/>\n <line [attr.x1]=\"layoutDerived_$().zoneSplitX + 8\"\n [attr.y1]=\"layoutDerived_$().ceilingNeonY\"\n [attr.x2]=\"layoutDerived_$().zoneSplitLobbyLoungeX - 8\"\n [attr.y2]=\"layoutDerived_$().ceilingNeonY\"\n stroke=\"#606878\" stroke-width=\"2\" opacity=\"0.08\" filter=\"url(#doGlowMid)\"/>\n <line [attr.x1]=\"layoutDerived_$().zoneSplitX + 8\"\n [attr.y1]=\"layoutDerived_$().ceilingNeonY\"\n [attr.x2]=\"layoutDerived_$().zoneSplitLobbyLoungeX - 8\"\n [attr.y2]=\"layoutDerived_$().ceilingNeonY\"\n stroke=\"#606878\" stroke-width=\"1\" opacity=\"0.28\"/>\n <line [attr.x1]=\"layoutDerived_$().zoneSplitLobbyLoungeX + 8\"\n [attr.y1]=\"layoutDerived_$().ceilingNeonY\"\n [attr.x2]=\"layoutDerived_$().floorLounge.x + layoutDerived_$().floorLounge.w - 12\"\n [attr.y2]=\"layoutDerived_$().ceilingNeonY\"\n stroke=\"#ff2dd9\" stroke-width=\"3\" opacity=\"0.08\" filter=\"url(#doGlowMid)\"/>\n <line [attr.x1]=\"layoutDerived_$().zoneSplitLobbyLoungeX + 8\"\n [attr.y1]=\"layoutDerived_$().ceilingNeonY\"\n [attr.x2]=\"layoutDerived_$().floorLounge.x + layoutDerived_$().floorLounge.w - 12\"\n [attr.y2]=\"layoutDerived_$().ceilingNeonY\"\n stroke=\"#ff2dd9\" stroke-width=\"1.2\" opacity=\"0.3\"/>\n\n <!-- Mennyezeti lámpák (warm glow) — workspace / lounge közép és harmadolók -->\n <circle [attr.cx]=\"layoutDerived_$().labelWorkspaceX - 200\"\n [attr.cy]=\"layoutDerived_$().ceilingNeonY + 2\" r=\"6\" fill=\"#ffc857\" opacity=\"0.1\"/>\n <circle [attr.cx]=\"layoutDerived_$().labelWorkspaceX - 200\"\n [attr.cy]=\"layoutDerived_$().ceilingNeonY + 2\" r=\"2.5\" fill=\"#ffc857\" opacity=\"0.3\"/>\n <circle [attr.cx]=\"layoutDerived_$().labelWorkspaceX\"\n [attr.cy]=\"layoutDerived_$().ceilingNeonY + 2\" r=\"6\" fill=\"#ffc857\" opacity=\"0.12\"/>\n <circle [attr.cx]=\"layoutDerived_$().labelWorkspaceX\"\n [attr.cy]=\"layoutDerived_$().ceilingNeonY + 2\" r=\"2.5\" fill=\"#ffc857\" opacity=\"0.35\"/>\n <circle [attr.cx]=\"layoutDerived_$().labelWorkspaceX + 200\"\n [attr.cy]=\"layoutDerived_$().ceilingNeonY + 2\" r=\"5\" fill=\"#ffc857\" opacity=\"0.08\"/>\n <circle [attr.cx]=\"layoutDerived_$().labelWorkspaceX + 200\"\n [attr.cy]=\"layoutDerived_$().ceilingNeonY + 2\" r=\"2\" fill=\"#ffc857\" opacity=\"0.25\"/>\n <circle [attr.cx]=\"layoutDerived_$().labelLoungeX - 120\"\n [attr.cy]=\"layoutDerived_$().ceilingNeonY + 2\" r=\"5\" fill=\"#ff2dd9\" opacity=\"0.1\"/>\n <circle [attr.cx]=\"layoutDerived_$().labelLoungeX - 120\"\n [attr.cy]=\"layoutDerived_$().ceilingNeonY + 2\" r=\"2\" fill=\"#ff2dd9\" opacity=\"0.25\"/>\n <circle [attr.cx]=\"layoutDerived_$().labelLoungeX + 120\"\n [attr.cy]=\"layoutDerived_$().ceilingNeonY + 2\" r=\"5\" fill=\"#ff2dd9\" opacity=\"0.08\"/>\n <circle [attr.cx]=\"layoutDerived_$().labelLoungeX + 120\"\n [attr.cy]=\"layoutDerived_$().ceilingNeonY + 2\" r=\"2\" fill=\"#ff2dd9\" opacity=\"0.2\"/>\n\n <!-- Cserepes növények (multi-circle lombkorona) -->\n <!-- Workspace 1 -->\n <rect x=\"156\" y=\"274\" width=\"8\" height=\"10\" fill=\"#1a120a\" rx=\"2\"/>\n <rect x=\"154\" y=\"270\" width=\"12\" height=\"6\" fill=\"#1e1e38\" rx=\"2\"/>\n <circle cx=\"160\" cy=\"264\" r=\"8\" fill=\"#14381c\" opacity=\"0.7\"/>\n <circle cx=\"154\" cy=\"260\" r=\"5\" fill=\"#123218\" opacity=\"0.6\"/>\n <circle cx=\"166\" cy=\"261\" r=\"5\" fill=\"#14381c\" opacity=\"0.6\"/>\n <!-- Workspace 2 -->\n <rect x=\"446\" y=\"274\" width=\"8\" height=\"9\" fill=\"#1a120a\" rx=\"2\"/>\n <rect x=\"444\" y=\"270\" width=\"12\" height=\"6\" fill=\"#1e1e38\" rx=\"2\"/>\n <circle cx=\"450\" cy=\"264\" r=\"7\" fill=\"#123218\" opacity=\"0.7\"/>\n <circle cx=\"444\" cy=\"261\" r=\"4.5\" fill=\"#14381c\" opacity=\"0.6\"/>\n <circle cx=\"456\" cy=\"262\" r=\"4\" fill=\"#123218\" opacity=\"0.5\"/>\n <!-- Lounge 1 -->\n <rect x=\"1076\" y=\"146\" width=\"8\" height=\"9\" fill=\"#1a120a\" rx=\"2\"/>\n <rect x=\"1074\" y=\"142\" width=\"12\" height=\"6\" fill=\"#1e1e38\" rx=\"2\"/>\n <circle cx=\"1080\" cy=\"136\" r=\"7\" fill=\"#14381c\" opacity=\"0.6\"/>\n <circle cx=\"1074\" cy=\"133\" r=\"4.5\" fill=\"#123218\" opacity=\"0.5\"/>\n <circle cx=\"1086\" cy=\"134\" r=\"4\" fill=\"#14381c\" opacity=\"0.5\"/>\n <!-- Lounge 2 -->\n <rect x=\"1376\" y=\"526\" width=\"8\" height=\"10\" fill=\"#1a120a\" rx=\"2\"/>\n <rect x=\"1374\" y=\"522\" width=\"12\" height=\"6\" fill=\"#1e1e38\" rx=\"2\"/>\n <circle cx=\"1380\" cy=\"516\" r=\"8\" fill=\"#123218\" opacity=\"0.6\"/>\n <circle cx=\"1374\" cy=\"512\" r=\"5\" fill=\"#14381c\" opacity=\"0.5\"/>\n <circle cx=\"1386\" cy=\"514\" r=\"5\" fill=\"#123218\" opacity=\"0.5\"/>\n </g>\n\n <!-- ============================================================= -->\n <!-- Layer 5: Fény effektek -->\n <!-- ============================================================= -->\n <g id=\"doFxOver\">\n <!-- Bejárat fénykúp — ajtó pozíció a layout SSOT-ból -->\n <ellipse [attr.cx]=\"layoutDerived_$().door.x\"\n [attr.cy]=\"layoutDerived_$().door.y + 8\"\n rx=\"60\" ry=\"22\" fill=\"#39ff88\" opacity=\"0.12\"/>\n <ellipse [attr.cx]=\"layoutDerived_$().door.x\"\n [attr.cy]=\"layoutDerived_$().door.y + 8\"\n rx=\"35\" ry=\"12\" fill=\"#39ff88\" opacity=\"0.06\"/>\n </g>\n\n <!-- ============================================================= -->\n <!-- Layer 6: Karakterek -->\n <!-- ============================================================= -->\n @for (character of darkOffice_DS.characters_$(); track trackInstance(character)) {\n <svg:g app-do-svg-char [instanceState]=\"character\"\n style=\"cursor: pointer\"\n (click)=\"handleSceneCharacterClick(character)\"\n (dblclick)=\"handleSceneCharacterDblClick(character)\"\n (bubbleClick)=\"handleThoughtBubbleClick($event, character)\"></svg:g>\n }\n\n </svg>\n\n <!-- ================================================================= -->\n <!-- Instance panel overlay (bal oldal) -->\n <!-- ================================================================= -->\n @if (darkOffice_DS.instances_$().length) {\n <app-do-instance-panel\n [instances]=\"darkOffice_DS.instances_$()\"\n (instanceClick)=\"handlePanelOpenVisualEditor($event)\"\n (mousedown)=\"$event.stopPropagation()\">\n </app-do-instance-panel>\n }\n\n <!-- ================================================================= -->\n <!-- Zoom kontrollok overlay (HTML, nem SVG – nem zoomolódik) -->\n <!-- ================================================================= -->\n <div class=\"do-zoom-controls\" (mousedown)=\"$event.stopPropagation()\">\n <button type=\"button\"\n class=\"do-zoom-btn\"\n title=\"Zoom in\"\n (click)=\"handleZoomIn()\"\n [disabled]=\"isZoomMax_$()\">+</button>\n <span class=\"do-zoom-label\">{{ zoomPercent_$() }}%</span>\n <button type=\"button\"\n class=\"do-zoom-btn\"\n title=\"Zoom out\"\n (click)=\"handleZoomOut()\"\n [disabled]=\"isZoomMin_$()\">−</button>\n <button type=\"button\"\n class=\"do-zoom-btn do-zoom-reset-btn\"\n title=\"Reset view\"\n (click)=\"handleZoomReset()\"\n [disabled]=\"isZoomMin_$()\">↺</button>\n </div>\n\n <!--\n Szerver-nem-elérhető jelzést a globális CCAP_ServerUnavailableOverlay_Component adja\n (app.component.html) — itt nem duplikáljuk (BUG-DO-001).\n -->\n @if (!darkOffice_DS.loading_$() && !darkOffice_DS.instances_$().length && !darkOffice_DS.isServerUnreachable_$()) {\n <!-- Üres iroda üzenet (csak ha a szerver elérhető és nincs loading) -->\n <div class=\"do-empty-label\">\n <span>Az iroda üres – nincs online instance.</span>\n </div>\n }\n\n <!-- Loading overlay -->\n @if (darkOffice_DS.loading_$() && !darkOffice_DS.instances_$().length) {\n <div class=\"do-loading-overlay\">\n <span class=\"do-loading-dot\"></span>\n </div>\n }\n\n <!-- Error overlay (bezárható) -->\n @if (darkOffice_DS.loadError_$()) {\n <div class=\"do-error-overlay\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"do-error-panel\">\n <button type=\"button\"\n class=\"do-error-close-btn\"\n title=\"Bezárás\"\n (click)=\"handleErrorDismiss()\">✕</button>\n <app-ccap-error-display [error]=\"darkOffice_DS.loadError_$()\">\n </app-ccap-error-display>\n </div>\n </div>\n }\n</div>\n\n<!-- Karakter beállítások modal -->\n@if (selectedInstance_$()) {\n <app-s-modal [isOpen]=\"!!selectedInstance_$()\"\n [title]=\"'Karakter beállítások'\"\n [maxWidth]=\"'6xl'\"\n (closed)=\"handleEditorClose()\">\n <app-do-visual-editor [instanceState]=\"selectedInstance_$()!\"\n (close)=\"handleEditorClose()\">\n </app-do-visual-editor>\n </app-s-modal>\n}\n\n<!-- Session chat popup (gondolat buborék kattintásra, REQ-DO-BUBBLE-CLICK-POPUP-001) -->\n@if (darkOffice_DS.chatPopupSessionId_$()) {\n <app-do-chat-popup\n [sessionId]=\"darkOffice_DS.chatPopupSessionId_$()!\"\n [sessionType]=\"darkOffice_DS.chatPopupSessionType_$()\"\n (close)=\"handleChatPopupClose()\">\n </app-do-chat-popup>\n}\n\n<!-- Instance státusz részletező (overlay panel egyszeres kattintás) -->\n@if (darkOffice_DS.instanceStatusDetailInstanceId_$()) {\n <app-do-instance-status-detail></app-do-instance-status-detail>\n}\n", "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { CCAP_ErrorDisplay_Component } from '../../_components/ccap-error-display/ccap-error-display.component';\nimport { S_Modal_Component } from '../shared/_components/s-modal/s-modal.component';\nimport { DarkOffice_Component } from './_components/ccap-dark-office/dark-office.component';\nimport { DO_Scene_Component } from './_components/do-office-scene/do-scene.component';\nimport { DO_ThoughtBubble_Component } from './_components/do-thought-bubble/do-thought-bubble.component';\nimport { DO_VisualEditor_Component } from './_components/do-visual-editor/do-visual-editor.component';\nimport { DO_ChatPopup_Component } from './_components/do-chat-popup/do-chat-popup.component';\nimport { DO_InstancePanel_Component } from './_components/do-instance-panel/do-instance-panel.component';\nimport { DO_InstanceStatusDetail_Component } from './_components/do-instance-status-detail/do-instance-status-detail.component';\nimport { DO_SvgChar_Component } from './_components/do-svg-char/do-svg-char.component';\nimport { DO_CharacterPreview_Component } from './_components/do-character-preview/do-character-preview.component';\nimport { DO_CharBody_Component } from './_components/do-char-body/do-char-body.component';\nimport { DO_CharLowerBody_Component } from './_components/do-char-parts/do-char-lower-body/do-char-lower-body.component';\nimport { DO_CharArms_Component } from './_components/do-char-parts/do-char-arms/do-char-arms.component';\nimport { DO_CharTorso_Component } from './_components/do-char-parts/do-char-torso/do-char-torso.component';\nimport { DO_CharNeckHead_Component } from './_components/do-char-parts/do-char-neck-head/do-char-neck-head.component';\nimport { DO_CharFace_Component } from './_components/do-char-parts/do-char-face/do-char-face.component';\nimport { DO_CharHair_Component } from './_components/do-char-parts/do-char-hair/do-char-hair.component';\n\n/** Dark Office modul route-ok. */\nconst darkOfficeRoutes: Routes = [\n {\n path: '',\n pathMatch: 'full',\n component: DarkOffice_Component,\n },\n];\n\n/**\n * Dark Office modul.\n * Játékos iroda nézet: multi-instance monitoring, pixel-art karakterek,\n * walk in/out animáció, gondolat buborék, vizuál editor, chat popup.\n */\n@NgModule({\n declarations: [\n DarkOffice_Component,\n DO_Scene_Component,\n DO_ThoughtBubble_Component,\n DO_VisualEditor_Component,\n DO_ChatPopup_Component,\n DO_InstancePanel_Component,\n DO_InstanceStatusDetail_Component,\n DO_SvgChar_Component,\n DO_CharacterPreview_Component,\n DO_CharBody_Component,\n DO_CharLowerBody_Component,\n DO_CharArms_Component,\n DO_CharTorso_Component,\n DO_CharNeckHead_Component,\n DO_CharFace_Component,\n DO_CharHair_Component,\n ],\n imports: [\n CommonModule,\n RouterModule.forChild(darkOfficeRoutes),\n CCAP_ErrorDisplay_Component,\n S_Modal_Component,\n ],\n})\n/** DarkOffice_Module class. */\nexport class DarkOffice_Module {}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_fsm_dynamo", "DO_Diagnostics_Util", "buildSnapshot", "params", "rationale", "buildSceneExpandRationale", "instances", "nowMs", "exportedAt", "Date", "toISOString", "clientVersion", "map", "inst", "mapInstanceSlice", "characters", "ch", "mapCharacterSlice", "characterRationale", "perCharacter", "skippedInstancesRationale", "skippedOffline", "windowMs", "DO_SceneSessionEligibility_Util", "sceneRecentActivityWindowMs", "presence", "DO_Presence_Type", "offline", "push", "instanceId", "sessions", "rawSessionStatuses", "length", "workingRecentSessions", "filter", "session", "isWorkingSessionRecentAndOnline", "row", "primaryId", "pickNewestSessionByLastActivity", "sessionId", "rows", "panelActiveSessionRows", "displayLabel", "raw", "characterType", "activitySummary", "latestSessionId", "connectionStatus", "assignedSlotIndex", "visualsDisplayName", "visuals", "displayName", "scenePlacement", "animState", "DoTileSystem_Util", "doT", "tiles", "DO_TILE", "DO_FLOOR_TX", "DO_FLOOR_TY", "DO_FLOOR_TW", "DO_FLOOR_TH", "DO_FLOOR_X", "DO_FLOOR_Y", "DO_FLOOR_W", "DO_FLOOR_H", "DO_ZONE_SPLIT_TX", "DO_ZONE_SPLIT_X", "DoTileSystem_Util", "doT", "DO_ZOOM_MIN", "DO_ZOOM_MAX", "DO_PAN_VISIBLE_RATIO", "DO_SceneCharacterPanelInstanceId_Util", "resolve", "params", "character", "sessionId", "instanceId", "trim", "length", "suffix", "endsWith", "slice", "DO_CharLowerBody_Component", "pantsColor", "input", "required", "isWalking", "selectors", "inputs", "attrs", "_c0", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275element", "\u0275\u0275elementStart", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275classProp", "DO_OPENCLAW_CLAW_PATH_LEFT_STANDING", "DO_OPENCLAW_CLAW_TRANSFORM_MIRROR_X20", "\u0275\u0275element", "\u0275\u0275elementStart", "\u0275\u0275elementEnd", "\u0275\u0275advance", "DO_CharArms_Component", "skinColor", "input", "required", "shirtColor", "clothingStyle", "characterType", "DO_CharacterType_Type", "ccap", "clothingType", "DO_ClothingStyle_Type", "charType", "openclawClawPathLeftStanding", "DO_OPENCLAW_CLAW_PATH_LEFT_STANDING", "openclawClawMirrorX20", "DO_OPENCLAW_CLAW_TRANSFORM_MIRROR_X20", "selectors", "inputs", "attrs", "_c0", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "DO_CharArms_Component_Case_0_Template", "DO_CharArms_Component_Case_1_Template", "DO_CharArms_Component_Case_2_Template", "DO_CharArms_Component_Case_4_Template", "DO_CharArms_Component_Case_5_Template", "DO_CharArms_Component_Case_6_Template", "DO_CharArms_Component_Case_7_Template", "DO_CharArms_Component_Case_8_Template", "DO_CharArms_Component_Case_9_Template", "DO_CharArms_Component_Case_10_Template", "DO_CharArms_Component_Case_11_Template", "DO_CharArms_Component_Case_12_Template", "DO_CharArms_Component_Conditional_15_Template", "DO_CharArms_Component_Conditional_16_Template", "\u0275\u0275conditional", "tmp_0_0", "hoodie", "formal", "tmp_1_0", "tmp_2_0", "tmp_3_0", "openclaw", "\u0275\u0275element", "\u0275\u0275template", "DO_CharTorso_Component_Case_0_Conditional_3_Template", "\u0275\u0275advance", "\u0275\u0275conditional", "ctx_r0", "isWorking", "DO_CharTorso_Component_Case_1_Conditional_2_Template", "DO_CharTorso_Component", "shirtColor", "input", "required", "clothingStyle", "clothingType", "DO_ClothingStyle_Type", "selectors", "inputs", "attrs", "_c0", "decls", "vars", "consts", "template", "rf", "ctx", "DO_CharTorso_Component_Case_0_Template", "DO_CharTorso_Component_Case_1_Template", "DO_CharTorso_Component_Case_2_Template", "tmp_0_0", "hoodie", "formal", "DO_CharNeckHead_Component", "skinColor", "input", "required", "headLightGradientElementId", "selectors", "inputs", "attrs", "_c0", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275element", "\u0275\u0275advance", "DO_CharFace_Component", "eyeColor", "input", "required", "selectors", "inputs", "attrs", "_c0", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275element", "\u0275\u0275advance", "\u0275\u0275element", "\u0275\u0275advance", "DO_CharHair_Component", "hairColor", "input", "required", "hairStyle", "hairType", "DO_HairStyle_Type", "selectors", "inputs", "attrs", "_c0", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "DO_CharHair_Component_Case_0_Template", "DO_CharHair_Component_Case_1_Template", "DO_CharHair_Component_Case_2_Template", "DO_CharHair_Component_Case_3_Template", "DO_CharHair_Component_Case_4_Template", "DO_CharHair_Component_Case_5_Template", "\u0275\u0275conditional", "tmp_0_0", "short", "long", "spiky", "curly", "mohawk", "DO_CharBody_Component", "visuals", "input", "required", "characterType", "DO_CharacterType_Type", "ccap", "hairType", "DO_HairStyle_Type", "clothingType", "DO_ClothingStyle_Type", "charType", "upperBodyTransform_$", "computed", "bodyType", "DO_BodyType_Type", "average", "slim", "stocky", "athletic", "lowerBodyTransform_$", "selectors", "inputs", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275property", "pantsColor", "skinColor", "shirtColor", "clothingStyle", "eyeColor", "hairColor", "hairStyle", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "ctx_r0", "visuals", "displayName", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind3", "ctx", "DO_CharacterPreview_Component", "input", "required", "characterType", "DO_CharacterType_Type", "ccap", "instanceId", "showDisplayName", "showInstanceIdLine", "variant", "isCharacterSettingsClickEnabled", "characterSettingsRequest", "output", "handleCharacterImageClick", "event", "stopPropagation", "emit", "handleCharacterImageKeydown", "key", "preventDefault", "selectors", "inputs", "outputs", "decls", "vars", "consts", "template", "rf", "\u0275\u0275listener", "$event", "\u0275\u0275element", "\u0275\u0275template", "DO_CharacterPreview_Component_Conditional_3_Template", "DO_CharacterPreview_Component_Conditional_4_Template", "\u0275\u0275classProp", "\u0275\u0275property", "\u0275\u0275conditional", "tmp_9_0", "\u0275\u0275elementStart", "\u0275\u0275listener", "color_r2", "\u0275\u0275restoreView", "_r1", "$implicit", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "applyChange", "\u0275\u0275elementEnd", "\u0275\u0275styleProp", "\u0275\u0275classProp", "editVisuals", "skinColor", "color_r5", "_r4", "hairColor", "style_r7", "_r6", "\u0275\u0275text", "hairStyle", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "hairStyleLabels", "color_r9", "_r8", "shirtColor", "style_r11", "_r10", "clothingStyle", "clothingStyleLabels", "type_r13", "_r12", "bodyType", "bodyTypeLabels", "color_r15", "_r14", "pantsColor", "color_r17", "_r16", "eyeColor", "DO_VisualEditor_Component", "instanceState", "close", "EventEmitter", "hairType", "DO_HairStyle_Type", "clothingType", "DO_ClothingStyle_Type", "charType", "DO_CharacterType_Type", "DO_BodyType_Type", "skinColors", "DO_SKIN_COLORS", "hairColors", "DO_HAIR_COLORS", "shirtColors", "DO_SHIRT_COLORS", "pantsColors", "DO_PANTS_COLORS", "eyeColors", "DO_EYE_COLORS", "hairStyles", "short", "long", "spiky", "curly", "mohawk", "bald", "clothingStyles", "casual", "formal", "hoodie", "tshirt", "bodyTypes", "average", "slim", "stocky", "athletic", "darkOffice_DS", "inject", "DarkOffice_DataService", "ngOnInit", "__spreadValues", "visuals", "field", "value", "__spreadProps", "saveVisuals", "instanceId", "handleDisplayNameChange", "name", "displayName", "handleClose", "emit", "selectors", "inputs", "outputs", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275element", "$event", "target", "\u0275\u0275repeaterCreate", "DO_VisualEditor_Component_For_12_Template", "\u0275\u0275repeaterTrackByIdentity", "DO_VisualEditor_Component_For_18_Template", "DO_VisualEditor_Component_For_24_Template", "DO_VisualEditor_Component_For_30_Template", "DO_VisualEditor_Component_For_36_Template", "DO_VisualEditor_Component_For_42_Template", "DO_VisualEditor_Component_For_48_Template", "DO_VisualEditor_Component_For_54_Template", "\u0275\u0275property", "tmp_1_0", "characterType", "undefined", "ccap", "\u0275\u0275repeater", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "ctx_r0", "fullViewRoute_$", "\u0275\u0275sanitizeUrl", "\u0275\u0275template", "DO_ChatPopup_Component_Conditional_7_Case_1_Template", "DO_ChatPopup_Component_Conditional_7_Case_2_Template", "DO_ChatPopup_Component_Conditional_7_Case_3_Template", "DO_ChatPopup_Component_Conditional_7_Case_4_Template", "\u0275\u0275advance", "\u0275\u0275conditional", "tmp_1_0", "sessionType", "charType", "ccSession", "openclaw", "caSession", "\u0275\u0275element", "DO_ChatPopup_Component_Conditional_8_For_3_Conditional_2_Template", "DO_ChatPopup_Component_Conditional_8_For_3_Conditional_3_Template", "DO_ChatPopup_Component_Conditional_8_For_3_Conditional_4_Template", "\u0275\u0275classProp", "msg_r2", "role", "\u0275\u0275textInterpolate", "content", "DO_ChatPopup_Component_Conditional_8_Conditional_0_Template", "DO_ChatPopup_Component_Conditional_8_Conditional_1_Template", "\u0275\u0275repeaterCreate", "DO_ChatPopup_Component_Conditional_8_For_3_Template", "_forTrack0", "DO_ChatPopup_Component_Conditional_8_Conditional_4_Template", "session_DS", "messagesLoading_$", "messages_$", "length", "messagesLoadError_$", "\u0275\u0275repeater", "DO_ChatPopup_Component", "sessionId", "input", "close", "EventEmitter", "inject", "Session_DataService", "DO_CharacterType_Type", "computed", "id", "showInlineMessages_$", "t", "ccap", "constructor", "effect", "inline", "loadInitialChunk", "ngOnDestroy", "clearMessages", "handleClose", "emit", "selectors", "inputs", "outputs", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275listener", "DO_ChatPopup_Component_Conditional_5_Template", "DO_ChatPopup_Component_Conditional_7_Template", "DO_ChatPopup_Component_Conditional_8_Template", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind3", "\u0275\u0275text", "\u0275\u0275elementStart", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "instance_r2", "lastMessage", "lastMessageDerivedStatusLabel", "activeRow_r5", "lastMessagePreview", "\u0275\u0275template", "DO_InstancePanel_Component_Conditional_25_For_1_Conditional_17_Conditional_8_For_2_Case_4_Template", "DO_InstancePanel_Component_Conditional_25_For_1_Conditional_17_Conditional_8_For_2_Case_5_Template", "DO_InstancePanel_Component_Conditional_25_For_1_Conditional_17_Conditional_8_For_2_Case_6_Template", "DO_InstancePanel_Component_Conditional_25_For_1_Conditional_17_Conditional_8_For_2_Conditional_9_Template", "displayLabel", "\u0275\u0275conditional", "tmp_26_0", "presence", "ctx_r2", "presenceType", "working", "idle", "offline", "activitySummary", "\u0275\u0275repeaterCreate", "DO_InstancePanel_Component_Conditional_25_For_1_Conditional_17_Conditional_8_For_2_Template", "_forTrack1", "\u0275\u0275repeater", "panelActiveSessionRows", "\u0275\u0275declareLet", "\u0275\u0275listener", "$event", "i0", "\u0275\u0275restoreView", "_r4", "\u0275\u0275resetView", "stopPropagation", "\u0275\u0275nextContext", "$implicit", "handleToggleInstanceSessions", "instanceId", "DO_InstancePanel_Component_Conditional_25_For_1_Conditional_17_Conditional_8_Template", "sessionsCollapsedByInstance_$", "\u0275\u0275classProp", "isSessionsCollapsed_r7", "\u0275\u0275textInterpolate1", "length", "_r1", "handleInstanceClick", "handleInstanceDblClick", "\u0275\u0275element", "DO_InstancePanel_Component_Conditional_25_For_1_Conditional_15_Template", "DO_InstancePanel_Component_Conditional_25_For_1_Conditional_16_Template", "DO_InstancePanel_Component_Conditional_25_For_1_Conditional_17_Template", "\u0275\u0275property", "visuals", "skinColor", "panelAvatarGradientElementId", "eyeColor", "hairColor", "hairStyle", "displayName", "DO_InstancePanel_Component_Conditional_25_For_1_Template", "_forTrack0", "instances", "DO_INSTANCE_PANEL_COLLAPSED_STORAGE_KEY", "DO_INSTANCE_SESSIONS_COLLAPSED_STORAGE_KEY", "DO_InstancePanel_Component", "input", "required", "instanceClick", "output", "darkOffice_DS", "inject", "DarkOffice_DataService", "DO_Presence_Type", "isCollapsed_$", "signal", "readCollapsedFromStorage", "readSessionsCollapsedMapFromStorage", "handleToggleCollapsed", "next", "set", "writeCollapsedToStorage", "current", "isCurrentlyCollapsed", "__spreadProps", "__spreadValues", "writeSessionsCollapsedMapToStorage", "Shr_LocalStoragePersistence_Util", "readString", "collapsed", "writeString", "String", "raw", "parsed", "JSON", "parse", "Array", "isArray", "map", "stringify", "panelAvatarFilterElementId", "openInstanceStatusDetail", "closeInstanceStatusDetail", "emit", "selectors", "inputs", "outputs", "decls", "vars", "consts", "template", "rf", "ctx", "DO_InstancePanel_Component_Conditional_21_Template", "DO_InstancePanel_Component_Conditional_22_Template", "DO_InstancePanel_Component_Conditional_25_Template", "DO_InstanceStatusDetailDisplay_Util", "formatOptional", "value", "formatPresence", "presence", "DO_Presence_Type", "working", "idle", "offline", "String", "formatConnectionStatus", "status", "Oc_iConnectionStatus_Type", "connected", "disconnected", "error", "unreachable", "formatInstanceDataStatus", "ExS_InstanceDataStatus_Type", "active", "inactive", "maintenance", "formatCharacterType", "type", "DO_CharacterType_Type", "openclaw", "ccSession", "caSession", "formatAnimState", "anim", "DO_CharacterAnim_Type", "standing", "sitting", "walkingIn", "walkingOut", "walkingBetween", "formatHairStyle", "style", "formatHairStyleOptional", "undefined", "formatClothingStyle", "formatClothingStyleOptional", "formatBodyType", "body", "formatBodyTypeOptional", "looksLikeHexCssColor", "t", "trim", "test", "presenceBadgeModifier", "connectionBadgeModifier", "instanceDataStatusBadgeModifier", "characterTypeBadgeModifier", "animBadgeModifier", "formatRunPhase", "phase", "formatBoolean", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "ctx_r1", "rawSnapshotHint_$", "\u0275\u0275textInterpolate", "line_r3", "display", "\u0275\u0275classProp", "label", "value", "\u0275\u0275template", "DO_InstanceStatusDetail_Component_Conditional_2_For_17_Case_4_Template", "DO_InstanceStatusDetail_Component_Conditional_2_For_17_Case_5_Template", "DO_InstanceStatusDetail_Component_Conditional_2_For_17_Case_6_Template", "DO_InstanceStatusDetail_Component_Conditional_2_For_17_Case_7_Template", "DO_InstanceStatusDetail_Component_Conditional_2_For_17_Case_8_Template", "\u0275\u0275conditional", "tmp_12_0", "kind", "ln_r4", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_22_Conditional_4_For_2_Case_4_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_22_Conditional_4_For_2_Case_5_Template", "tmp_14_0", "\u0275\u0275repeaterCreate", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_22_Conditional_4_For_2_Template", "_forTrack0", "\u0275\u0275repeater", "ccapSnapshotLines_$", "r_r5", "sessionName", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_22_For_10_Conditional_6_Template", "sessionId", "presence", "lastActivityAt", "hasActiveRun", "activeRunId", "activeRunPhase", "activitySummary", "lastMessage", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_22_Conditional_3_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_22_Conditional_4_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_22_Conditional_7_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_22_For_10_Template", "_forTrack1", "length", "ccapSessionRows_$", "hasCcapRuntimeSnapshot_$", "ln_r6", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_23_Conditional_4_For_2_Case_4_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_23_Conditional_4_For_2_Case_5_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_23_Conditional_4_For_2_Template", "cciSnapshotLines_$", "r_r7", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_23_For_10_Conditional_6_Template", "hasActiveSession", "currentCcSessionStatus", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_23_Conditional_3_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_23_Conditional_4_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_23_Conditional_7_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_23_For_10_Template", "cciSessionRows_$", "hasCciRuntimeSnapshot_$", "ln_r8", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_24_Conditional_4_For_2_Case_4_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_24_Conditional_4_For_2_Case_5_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_24_Conditional_4_For_2_Template", "caiSnapshotLines_$", "r_r9", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_24_For_10_Conditional_6_Template", "currentCaSessionStatus", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_24_Conditional_3_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_24_Conditional_4_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_24_Conditional_7_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_24_For_10_Template", "caiSessionRows_$", "hasCaiRuntimeSnapshot_$", "ln_r10", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_25_Conditional_4_For_2_Case_4_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_25_Conditional_4_For_2_Case_5_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_25_Conditional_4_For_2_Template", "ociSnapshotLines_$", "r_r11", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_25_For_10_Conditional_6_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_25_Conditional_3_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_25_Conditional_4_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_25_Conditional_7_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_25_For_10_Template", "ociSessionRows_$", "hasOciRuntimeSnapshot_$", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_0_Template", "DO_InstanceStatusDetail_Component_Conditional_2_For_17_Template", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleOpenCharacterSettingsFromPreview", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_22_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_23_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_24_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_25_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Conditional_26_Template", "officeStateLines_$", "\u0275\u0275property", "officeInstance_$", "visuals", "tmp_6_0", "characterType", "undefined", "charTypeEnum", "ccap", "instanceId", "isCcapDetail_$", "isCciDetail_$", "isCaiDetail_$", "isOciDetail_$", "DO_InstanceStatusDetail_Component", "darkOffice_DS", "inject", "DarkOffice_DataService", "DO_CharacterType_Type", "computed", "resolveOfficeInstanceById", "instanceStatusDetailInstanceId_$", "modalTitle_$", "inst", "id", "name", "DO_InstanceStatusDetailDisplay_Util", "formatOptional", "displayName", "lines", "badgeMod", "presenceBadgeModifier", "formatPresence", "currentRunFlowPhase", "latestSessionId", "anim", "animState", "animBadgeModifier", "formatAnimState", "previousPresence", "String", "assignedSlotIndex", "charType", "characterTypeBadgeModifier", "formatCharacterType", "status", "connectionStatus", "connectionBadgeModifier", "formatConnectionStatus", "openclaw", "getOciInstanceDataSnapshot", "filter", "line", "buildInstanceStatusDetailRuntimeHint", "type", "ccSession", "caSession", "data", "getCcapInstanceDataSnapshot", "statusesLen", "resolveModalCcapSessionStatuses", "ccapLines", "_id", "ccapId", "instanceDataStatusBadgeModifier", "formatInstanceDataStatus", "__created", "__updated", "ln", "ccapOfficeDisplayName", "trim", "ccapDataNameTrim", "resolveModalOciSessionStatuses", "ociLines", "gatewayUrl", "lastConnectedAt", "ociDisplayName", "ociLabelTrim", "DO_CciOfficeInstanceId_Util", "parseCcapId", "getCciInstanceDataSnapshot", "resolveModalCciSessionStatuses", "cciLines", "cciDisplayName", "cciDataNameTrim", "DO_CaiOfficeInstanceId_Util", "getCaiInstanceDataSnapshot", "resolveModalCaiSessionStatuses", "caiLines", "caiDisplayName", "caiDataNameTrim", "sessions", "map", "s", "presenceBadgeMod", "formatBoolean", "hasActiveRunPositive", "formatRunPhase", "hasActiveSessionPositive", "handleClosed", "closeInstanceStatusDetail", "selectInstance", "selectors", "decls", "vars", "consts", "template", "rf", "ctx", "DO_InstanceStatusDetail_Component_Conditional_1_Template", "DO_InstanceStatusDetail_Component_Conditional_2_Template", "TOOL_LINE_PREFIXES", "DO_BubbleContent_Util", "extractUserFacingPart", "lastMessage", "stripped", "stripStructuredNoise", "prose", "collapseWhitespace", "truncate", "BUBBLE_PREVIEW_MAX", "text", "result", "replace", "split", "filter", "line", "trimmed", "trim", "prefix", "startsWith", "test", "join", "max", "length", "slice", "trimEnd", "DO_BubbleEventType_Type", "ERROR_TOKENS", "TOOL_TOKENS", "TOOL_RESULT_TOKENS", "STATUS_TOKENS", "DO_BubbleEventType_Util", "detectFromText", "text", "DO_BubbleEventType_Type", "message", "trimmed", "trim", "lower", "toLowerCase", "startsWith", "tool", "queued", "containsAny", "error", "toolResult", "status", "haystack", "tokens", "token", "includes", "orbFillFor", "t", "orbGlyphFor", "orbLabelFor", "\u0275\u0275element", "\u0275\u0275property", "ctx_r0", "instanceState", "visuals", "eyeColor", "\u0275\u0275advance", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275textInterpolate1", "displaySessionName_$", "h_r2", "text", "\u0275\u0275textInterpolate", "orbLabel", "orbGlyph", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r4", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleBubbleClick", "\u0275\u0275classProp", "isBubbleClickable_$", "truncatedLastMessage_$", "bubbleOrbLabel_$", "bubbleOrbGlyph_$", "WALK_DURATION_MS", "NAME_MAX_LEN", "SESSION_NAME_MAX_LEN", "ACTIVITY_MAX_LEN", "BUBBLE_HISTORY_MAX", "DO_SvgChar_Component", "layout_DS", "inject", "DO_Layout_DataService", "input", "required", "bubbleClick", "EventEmitter", "hairType", "DO_HairStyle_Type", "clothingType", "DO_ClothingStyle_Type", "charType", "DO_CharacterType_Type", "walkInTimerId", "atDoorForWalkIn_$", "signal", "resolvedAnim_$", "DO_CharacterAnim_Type", "standing", "animEffectRef", "historyEffectRef", "isAnimEffectDestroyed", "messageHistory_$", "lastSeenMessage", "constructor", "effect", "state", "queueMicrotask", "syncAnimState", "newMsg", "lastMessage", "recordMessageHistory", "ngOnDestroy", "clearTimeout", "destroy", "eventType", "DO_BubbleEventType_Util", "detectFromText", "previous", "length", "slice", "orbFill", "orbFillFor", "orbGlyphFor", "orbLabelFor", "update", "h", "slotPosition_$", "computed", "isWorking", "presence", "DO_Presence_Type", "working", "placement", "scenePlacement", "d", "derived_$", "slots", "DO_CharacterScenePlacement_Type", "meeting", "meetingSlots", "workstationSlots", "restSlots", "idx", "Math", "max", "assignedSlotIndex", "overflowIdx", "col", "row", "floor", "fc", "floorConference", "x", "y", "floorWorkspace", "restCols", "grid_$", "colO", "rowO", "stepX", "round", "floorLounge", "w", "stepY", "restRows", "targetPosition_$", "walkingOut", "getDoorPosition", "hostTransform", "pos", "hostTransition_$", "anim", "walkingIn", "walkingBetween", "hostTransition", "hostOpacity", "hostTransformOrigin", "displayName_$", "custom", "displayName", "trim", "id", "instanceId", "name", "sessionName", "source", "DO_BubbleContent_Util", "extractUserFacingPart", "activitySummary", "bubbleWidth_$", "len", "min", "bubbleEventType_$", "bubbleOrbFill_$", "upperBodyTransform_$", "bodyType", "DO_BodyType_Type", "average", "slim", "stocky", "athletic", "lowerBodyTransform_$", "isWorking_$", "isWalking_$", "idleWalking", "latestSessionId", "bubbleOffsetX_$", "bubbleTailPoints_$", "ox", "event", "stopPropagation", "sessionId", "emit", "animState", "set", "setTimeout", "finalAnim", "sitting", "selectors", "hostVars", "hostBindings", "rf", "ctx", "\u0275\u0275styleProp", "\u0275\u0275template", "DO_SvgChar_Component_Conditional_12_Template", "DO_SvgChar_Component_Conditional_15_Template", "DO_SvgChar_Component_Conditional_16_Template", "DO_SvgChar_Component_Conditional_19_Template", "\u0275\u0275repeaterCreate", "DO_SvgChar_Component_For_21_Template", "\u0275\u0275repeaterTrackByIndex", "DO_SvgChar_Component_Conditional_22_Template", "pantsColor", "skinColor", "shirtColor", "clothingStyle", "tmp_8_0", "characterType", "undefined", "ccap", "\u0275\u0275conditional", "hairColor", "hairStyle", "\u0275\u0275repeater", "trackInstance", "$item", "\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275template", "DO_Scene_Component_For_356_Conditional_3_Template", "DO_Scene_Component_For_356_Conditional_4_Template", "\u0275\u0275conditional", "desk_r5", "monitorIsCyan", "\u0275\u0275listener", "character_r9", "\u0275\u0275restoreView", "_r8", "$implicit", "ctx_r3", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleSceneCharacterClick", "handleSceneCharacterDblClick", "$event", "handleThoughtBubbleClick", "\u0275\u0275property", "_r10", "handlePanelOpenVisualEditor", "i0", "stopPropagation", "darkOffice_DS", "instances_$", "\u0275\u0275text", "_r11", "handleErrorDismiss", "loadError_$", "_r12", "handleEditorClose", "selectedInstance_$", "_r13", "handleChatPopupClose", "chatPopupSessionId_$", "chatPopupSessionType_$", "DO_SCENE_LEGACY_FOREST_W", "DO_SCENE_LEGACY_FOREST_H", "DO_Scene_Component", "inject", "DarkOffice_DataService", "officeLayout_DS", "DO_Layout_DataService", "sceneWorldW_$", "computed", "derived_$", "worldW", "sceneWorldH_$", "worldH", "layoutDerived_$", "environmentBackdropRect_$", "d", "o", "environmentOverflowPx", "ww", "wh", "x", "y", "w", "h", "forestSouthGroupTransform_$", "forestEastGroupTransform_$", "entrancePathRect_$", "door", "Math", "max", "decorLampSouthWestBase_$", "min", "decorLampSouthEastBase_$", "northWindowRects_$", "b", "buildingOuter", "count", "padX", "gap", "usable", "out", "i", "push", "svgRef", "resolveOfficeInstanceById", "selectedInstanceId_$", "scale_$", "signal", "centerX_$", "centerY_$", "isDragging_$", "viewBox_$", "s", "vw", "vh", "cx", "clampCenter", "cy", "zoomPercent_$", "round", "isZoomMax_$", "DO_ZOOM_MAX", "isZoomMin_$", "DO_ZOOM_MIN", "wheelHandler", "event", "onWheel", "dragStartMouseX", "dragStartMouseY", "dragStartCx", "dragStartCy", "activePointers", "Map", "pinchStartDistance", "pinchStartScale", "pinchStartCenterX", "pinchStartCenterY", "pinchStartMidX", "pinchStartMidY", "ngAfterViewInit", "nativeElement", "addEventListener", "passive", "ngOnDestroy", "removeEventListener", "instance", "instanceId", "character", "panelInstanceId", "DO_SceneCharacterPanelInstanceId_Util", "resolve", "openInstanceStatusDetail", "closeInstanceStatusDetail", "selectInstance", "sessionId", "openChatPopup", "characterType", "closeChatPopup", "dismissError", "handleZoomIn", "applyZoomAtPoint", "handleZoomOut", "handleZoomReset", "set", "handlePointerDown", "pointerType", "button", "preventDefault", "pointerId", "clientX", "clientY", "size", "beginPan", "beginPinch", "handlePointerMove", "has", "rect", "getBoundingClientRect", "svgDx", "width", "svgDy", "height", "applyPinchZoom", "handlePointerUp", "delete", "remaining", "Array", "from", "values", "pts", "length", "dx", "dy", "hypot", "ratio", "newScale", "abs", "startFractionX", "left", "startFractionY", "top", "worldX", "worldY", "currentMidX", "currentMidY", "currentFractionX", "currentFractionY", "newCx", "newCy", "fractionX", "fractionY", "oldScale", "zoomDelta", "deltaY", "targetScale", "fx", "fy", "center", "worldSize", "viewSize", "margin", "DO_PAN_VISIBLE_RATIO", "selectors", "viewQuery", "rf", "ctx", "_r1", "\u0275\u0275repeaterCreate", "DO_Scene_Component_For_328_Template", "\u0275\u0275repeaterTrackByIndex", "DO_Scene_Component_For_331_Template", "\u0275\u0275repeaterTrackByIdentity", "DO_Scene_Component_For_356_Template", "_forTrack0", "DO_Scene_Component_For_362_Template", "DO_Scene_Component_For_378_Template", "DO_Scene_Component_For_426_Template", "_forTrack1", "DO_Scene_Component_Conditional_427_Template", "DO_Scene_Component_Conditional_437_Template", "DO_Scene_Component_Conditional_438_Template", "DO_Scene_Component_Conditional_439_Template", "DO_Scene_Component_Conditional_440_Template", "DO_Scene_Component_Conditional_441_Template", "DO_Scene_Component_Conditional_442_Template", "\u0275\u0275classProp", "\u0275\u0275repeater", "\u0275\u0275pureFunction0", "_c1", "workstationDesks", "conference", "chairs", "loungeSofas", "characters_$", "\u0275\u0275textInterpolate1", "loading_$", "isServerUnreachable_$", "instanceStatusDetailInstanceId_$", "DarkOffice_Component", "refreshIntervalMs", "second", "darkOffice_DS", "inject", "DarkOffice_DataService", "globalError_CS", "CCAP_GlobalError_ControlService", "refreshTimerId", "ngOnInit", "loadInstanceData", "setInterval", "ngOnDestroy", "undefined", "clearInterval", "refreshNow", "copyDiagnosticsToClipboard", "__async", "snapshot", "DO_Diagnostics_Util", "buildSnapshot", "instances", "instances_$", "characters", "characters_$", "nowMs", "Date", "now", "clientVersion", "environment", "version", "text", "JSON", "stringify", "result", "copyToClipboard", "ok", "showError", "error", "selectors", "hostAttrs", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275listener", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "length", "\u0275\u0275property", "loading_$", "darkOfficeRoutes", "path", "pathMatch", "component", "DarkOffice_Component", "DarkOffice_Module", "CommonModule", "RouterModule", "forChild", "CCAP_ErrorDisplay_Component", "S_Modal_Component"]
|
|
7
|
+
}
|