termdock 1.4.328 → 1.4.329
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/dist/client/assets/{App-xr2R4dST.js → App-D9G1XjRn.js} +54 -54
- package/dist/client/assets/App-D9G1XjRn.js.br +0 -0
- package/dist/client/assets/App-D9G1XjRn.js.gz +0 -0
- package/dist/client/assets/{ArchitecturePanel-XprzcGMT.js → ArchitecturePanel-Db0No7hm.js} +2 -2
- package/dist/client/assets/ArchitecturePanel-Db0No7hm.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-Db0No7hm.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-g83lCwJi.js → ChangeWalkthroughPanel-iNaVjdNU.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-iNaVjdNU.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-iNaVjdNU.js.gz +0 -0
- package/dist/client/assets/{CollaborationMainWorkspace-BbkFTnw1.js → CollaborationMainWorkspace-Qek-VG70.js} +1 -1
- package/dist/client/assets/CollaborationMainWorkspace-Qek-VG70.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-Qek-VG70.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-BuRZBZGa.js +2 -0
- package/dist/client/assets/{ComputerControlView-yBUQcmwF.js → ComputerControlView-CzooFU9V.js} +4 -4
- package/dist/client/assets/ComputerControlView-CzooFU9V.js.br +0 -0
- package/dist/client/assets/ComputerControlView-CzooFU9V.js.gz +0 -0
- package/dist/client/assets/{DagPlayground--KDWJkVL.js → DagPlayground-BfcGoLqt.js} +1 -1
- package/dist/client/assets/DagPlayground-BfcGoLqt.js.br +0 -0
- package/dist/client/assets/DagPlayground-BfcGoLqt.js.gz +0 -0
- package/dist/client/assets/{DiffLab-BAyGlKKp.js → DiffLab-5lLS4TTe.js} +1 -1
- package/dist/client/assets/DiffLab-5lLS4TTe.js.br +0 -0
- package/dist/client/assets/{DiffLab-BAyGlKKp.js.gz → DiffLab-5lLS4TTe.js.gz} +0 -0
- package/dist/client/assets/{DiffReview-CLKpyDPZ.js → DiffReview-Bm5VsO_2.js} +1 -1
- package/dist/client/assets/DiffReview-Bm5VsO_2.js.br +0 -0
- package/dist/client/assets/DiffReview-Bm5VsO_2.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-BoFElesI.js → DiffReviewLab-CokJ4CU0.js} +1 -1
- package/dist/client/assets/DiffReviewLab-CokJ4CU0.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CokJ4CU0.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-DDiASWHf.js → DiffViewer-CYl7f8Ni.js} +1 -1
- package/dist/client/assets/DiffViewer-CYl7f8Ni.js.br +0 -0
- package/dist/client/assets/DiffViewer-CYl7f8Ni.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-PJWJT35T.js → ModelPreview-GyVcgKyk.js} +1 -1
- package/dist/client/assets/ModelPreview-GyVcgKyk.js.br +0 -0
- package/dist/client/assets/ModelPreview-GyVcgKyk.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-CfOJHcXO.js → RightSidebar-BVTTEpbi.js} +3 -3
- package/dist/client/assets/RightSidebar-BVTTEpbi.js.br +0 -0
- package/dist/client/assets/RightSidebar-BVTTEpbi.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-CwEvSK80.js → abnfDiagram-VCTEODGH-Bn3DRY7x.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-Bn3DRY7x.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-Bn3DRY7x.js.gz +0 -0
- package/dist/client/assets/{app-DNnVU3VK.js → app-D5VZp8rc.js} +3 -3
- package/dist/client/assets/app-D5VZp8rc.js.br +0 -0
- package/dist/client/assets/app-D5VZp8rc.js.gz +0 -0
- package/dist/client/assets/{arc-Ctz1KMpY.js → arc-Du7GNk7G.js} +1 -1
- package/dist/client/assets/arc-Du7GNk7G.js.br +0 -0
- package/dist/client/assets/arc-Du7GNk7G.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-DJSgVQQQ.js → architectureDiagram-5GKGNRK7-DhxS0QdH.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DhxS0QdH.js.br +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-DJSgVQQQ.js.gz → architectureDiagram-5GKGNRK7-DhxS0QdH.js.gz} +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-N_yr-Q8w.js → blockDiagram-I7D4REHJ-Wv6QW34G.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-Wv6QW34G.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-Wv6QW34G.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-DVQnawpY.js → c4Diagram-7LVT6UL2-BX7uuZf8.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-BX7uuZf8.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BX7uuZf8.js.gz +0 -0
- package/dist/client/assets/channel-DRDG9HMw.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-BXZwjzSA.js → chunk-2Q5K7J3B-DUyA5Q_x.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-mKa-FMDa.js → chunk-5VM5RSS4-CsqOe_v4.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-BW5JuQIW.js → chunk-F27PBJKO-CcO_-Kak.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-CcO_-Kak.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CcO_-Kak.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-CDGBumC-.js → chunk-IMKFNOWR-CQJ1dzSN.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-CQJ1dzSN.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CQJ1dzSN.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-CGx9O6IX.js → chunk-JWPE2WC7-oUpFzQDX.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-BkWYxDSy.js → chunk-POPQ4Y6H-C1YXcY1K.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-BGwkXakv.js → chunk-SVP7TREG-BWjHeocC.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-BWjHeocC.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BWjHeocC.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-CMxjLRcv.js → chunk-TICWLB2K-DQ0mCrXn.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-DQ0mCrXn.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DQ0mCrXn.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-DCIQ1i4z.js → chunk-XXDRQBXY-SHYrjdLW.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-CjINloiI.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-CjINloiI.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-Des2am0k.js → cose-bilkent-JH36ORCC-BBhGCaX-.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-BBhGCaX-.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-BBhGCaX-.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-BOJs6wCD.js → cynefin-OW5HDTMX-7coImPkF.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-7coImPkF.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-7coImPkF.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-DVLqWiJ6.js → cynefinDiagram-5FMLGOSQ-Cnoxl1HL.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Cnoxl1HL.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Cnoxl1HL.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-e7mtFW8V.js → dagre-GXQ25YYZ-B6fpGrH1.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-B6fpGrH1.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-B6fpGrH1.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-B9P-CEm4.js → diagram-S7CK7UJ4-Sprx3hA_.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-Sprx3hA_.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-Sprx3hA_.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-DvTmtjeC.js → diagram-UQ7AKVKN-BOXGQUJw.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-BOXGQUJw.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BOXGQUJw.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-BmwhsB8_.js → diagram-VSXAHHWV-kPY7jhp2.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-kPY7jhp2.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-kPY7jhp2.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-CvV9NUzM.js → diagram-VX7I27RA-07j7wunW.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-07j7wunW.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-07j7wunW.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-DT1POaEF.js → diagram-Z3DM3KII-CbWJovUP.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-CbWJovUP.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-CbWJovUP.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-QZNS7lcr.js → ebnfDiagram-PWID7BFC-CqoHnUPd.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-CqoHnUPd.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-CqoHnUPd.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-C9KhKBAJ.js → erDiagram-RLTQ6QDP-eJuQs4se.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-eJuQs4se.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-eJuQs4se.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-Du-YKajw.js → flowDiagram-HODETNUW-DSgseCP6.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-DSgseCP6.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-DSgseCP6.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-I9ibR23C.js → ganttDiagram-EL5Y4UJY-Ca5MVluD.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-Ca5MVluD.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-Ca5MVluD.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-BE8k_FL7.js → gestureArbiter-CGaUInum.js} +1 -1
- package/dist/client/assets/gestureArbiter-CGaUInum.js.br +0 -0
- package/dist/client/assets/gestureArbiter-CGaUInum.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BK6myYCK.js → gitGraphDiagram-WWUBYQGX-BgAMalup.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BgAMalup.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BgAMalup.js.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-D1tExNKF.js → infoDiagram-27XIBGKW-DvrmPX6I.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CwY6cf7s.js → ishikawaDiagram-5VMMS53U-BIxEg0pl.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BIxEg0pl.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BIxEg0pl.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-Cqy1TbUI.js → journeyDiagram-3NMN7TZE-BI8B1o2v.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BI8B1o2v.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BI8B1o2v.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-SXzevtXv.js → kanban-definition-UXKFOSKX-tBgvPAXx.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-tBgvPAXx.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-tBgvPAXx.js.gz +0 -0
- package/dist/client/assets/{layout-CFH4KsMu.js → layout-F6rDt84Y.js} +1 -1
- package/dist/client/assets/layout-F6rDt84Y.js.br +0 -0
- package/dist/client/assets/layout-F6rDt84Y.js.gz +0 -0
- package/dist/client/assets/{linear-DSGS6T8F.js → linear-QaUhDwi6.js} +1 -1
- package/dist/client/assets/linear-QaUhDwi6.js.br +0 -0
- package/dist/client/assets/linear-QaUhDwi6.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-BpDQIw7m.js → mermaid.core-BHNVcgJG.js} +5 -5
- package/dist/client/assets/mermaid.core-BHNVcgJG.js.br +0 -0
- package/dist/client/assets/mermaid.core-BHNVcgJG.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-D7H6k38f.js → mindmap-definition-YA3MSWOX-CW_qv6SM.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-CW_qv6SM.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-CW_qv6SM.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-B4SLDWeK.js → passwordBootstrap-xwlVHcmC.js} +1 -1
- package/dist/client/assets/passwordBootstrap-xwlVHcmC.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-xwlVHcmC.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-DT21hoef.js → pegDiagram-XKGWAZYB-DN89bpor.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-DN89bpor.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-DN89bpor.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-CP_7qBRV.js → pieDiagram-E7YTZNPT-DIxGatjK.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-DIxGatjK.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-DIxGatjK.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-CLBVrI3n.js → quadrantDiagram-AXDQQJYC-hA4Rk-Iv.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-hA4Rk-Iv.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-hA4Rk-Iv.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-DJoM5WtF.js → railroadDiagram-O6MQD6OU-CQft_cg4.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CQft_cg4.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CQft_cg4.js.gz +0 -0
- package/dist/client/assets/{rdpSession-C0jVZfFV.js → rdpSession-_Wi6QGVy.js} +1 -1
- package/dist/client/assets/rdpSession-_Wi6QGVy.js.br +0 -0
- package/dist/client/assets/rdpSession-_Wi6QGVy.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-LCYPFdN8.js → referenceLongPress-CHQPhmmv.js} +1 -1
- package/dist/client/assets/referenceLongPress-CHQPhmmv.js.br +0 -0
- package/dist/client/assets/referenceLongPress-CHQPhmmv.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-BHLyxBdU.js → requirementDiagram-BXWQKSXE-CAMtoGH8.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CAMtoGH8.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CAMtoGH8.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CUgEsLUw.js → sankeyDiagram-P5KCCOFB-USLSjs28.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-USLSjs28.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-USLSjs28.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-qEb89gHp.js → sequenceDiagram-WJ2MYXX4-D22gyoMc.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D22gyoMc.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D22gyoMc.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-BUOHBGK2.js → sizeCapture-INFHLROL-BAWAxmev.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-BAWAxmev.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BAWAxmev.js.gz +0 -0
- package/dist/client/assets/{sparkles-Cm9xs8pz.js → sparkles-BK6dvO4C.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-Dx0afnU6.js → stateDiagram-D77RDMKH-Dd8Kz_3m.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-Dd8Kz_3m.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-Dd8Kz_3m.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-b4HSZCSL.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-DeG8X6CN.js → swimlanes-42K2YHIH-BjLw9hF1.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-BjLw9hF1.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-BjLw9hF1.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-C2ZVrP3k.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-Bkts868I.js → timeline-definition-24CTP7MA-DVis9e2K.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-DVis9e2K.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-DVis9e2K.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-D1VnXjVL.js → triangle-alert-CiksAjZK.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-BOoHxntl.js → vennDiagram-4TSXK5OY-CNwJhMgu.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-CNwJhMgu.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-CNwJhMgu.js.gz +0 -0
- package/dist/client/assets/{videoCompression-BONtNnBl.js → videoCompression-CeWiTlti.js} +1 -1
- package/dist/client/assets/videoCompression-CeWiTlti.js.br +0 -0
- package/dist/client/assets/videoCompression-CeWiTlti.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-BAuuRkvt.js → wardleyDiagram-VM6X3IG4-COCAMRlj.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-COCAMRlj.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-COCAMRlj.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DvJOw2Ss.js → xychartDiagram-S5SC5T6Z-BUmr1Xe8.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BUmr1Xe8.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BUmr1Xe8.js.gz +0 -0
- package/dist/client/index.html +1 -1
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw.js +1 -1
- package/dist/client/sw.js.br +0 -0
- package/dist/client/sw.js.gz +0 -0
- package/dist/server/routes/rdp.js +1 -1
- package/dist/server/routes/terminal.js +44 -24
- package/dist/server/utils/tmuxClientCapabilities.js +1 -1
- package/dist/server/utils/tmuxSizeOwnership.js +18 -0
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-xr2R4dST.js.br +0 -0
- package/dist/client/assets/App-xr2R4dST.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-XprzcGMT.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-XprzcGMT.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-g83lCwJi.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-g83lCwJi.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BbkFTnw1.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BbkFTnw1.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-C8Nrrlcz.js +0 -2
- package/dist/client/assets/ComputerControlView-yBUQcmwF.js.br +0 -0
- package/dist/client/assets/ComputerControlView-yBUQcmwF.js.gz +0 -0
- package/dist/client/assets/DagPlayground--KDWJkVL.js.br +0 -0
- package/dist/client/assets/DagPlayground--KDWJkVL.js.gz +0 -0
- package/dist/client/assets/DiffLab-BAyGlKKp.js.br +0 -0
- package/dist/client/assets/DiffReview-CLKpyDPZ.js.br +0 -0
- package/dist/client/assets/DiffReview-CLKpyDPZ.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-BoFElesI.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-BoFElesI.js.gz +0 -0
- package/dist/client/assets/DiffViewer-DDiASWHf.js.br +0 -0
- package/dist/client/assets/DiffViewer-DDiASWHf.js.gz +0 -0
- package/dist/client/assets/ModelPreview-PJWJT35T.js.br +0 -0
- package/dist/client/assets/ModelPreview-PJWJT35T.js.gz +0 -0
- package/dist/client/assets/RightSidebar-CfOJHcXO.js.br +0 -0
- package/dist/client/assets/RightSidebar-CfOJHcXO.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CwEvSK80.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CwEvSK80.js.gz +0 -0
- package/dist/client/assets/app-DNnVU3VK.js.br +0 -0
- package/dist/client/assets/app-DNnVU3VK.js.gz +0 -0
- package/dist/client/assets/arc-Ctz1KMpY.js.br +0 -0
- package/dist/client/assets/arc-Ctz1KMpY.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DJSgVQQQ.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-N_yr-Q8w.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-N_yr-Q8w.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DVQnawpY.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DVQnawpY.js.gz +0 -0
- package/dist/client/assets/channel-b8iCTsm_.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-BW5JuQIW.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-BW5JuQIW.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CDGBumC-.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CDGBumC-.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BGwkXakv.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BGwkXakv.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-CMxjLRcv.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-CMxjLRcv.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-DrGmXJ_R.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DrGmXJ_R.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-Des2am0k.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Des2am0k.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BOJs6wCD.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BOJs6wCD.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DVLqWiJ6.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DVLqWiJ6.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-e7mtFW8V.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-e7mtFW8V.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-B9P-CEm4.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-B9P-CEm4.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DvTmtjeC.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DvTmtjeC.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BmwhsB8_.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BmwhsB8_.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CvV9NUzM.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CvV9NUzM.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DT1POaEF.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DT1POaEF.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-QZNS7lcr.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-QZNS7lcr.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-C9KhKBAJ.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-C9KhKBAJ.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-Du-YKajw.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-Du-YKajw.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-I9ibR23C.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-I9ibR23C.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-BE8k_FL7.js.br +0 -0
- package/dist/client/assets/gestureArbiter-BE8k_FL7.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BK6myYCK.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BK6myYCK.js.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CwY6cf7s.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CwY6cf7s.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Cqy1TbUI.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Cqy1TbUI.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-SXzevtXv.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-SXzevtXv.js.gz +0 -0
- package/dist/client/assets/layout-CFH4KsMu.js.br +0 -0
- package/dist/client/assets/layout-CFH4KsMu.js.gz +0 -0
- package/dist/client/assets/linear-DSGS6T8F.js.br +0 -0
- package/dist/client/assets/linear-DSGS6T8F.js.gz +0 -0
- package/dist/client/assets/mermaid.core-BpDQIw7m.js.br +0 -0
- package/dist/client/assets/mermaid.core-BpDQIw7m.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-D7H6k38f.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-D7H6k38f.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-B4SLDWeK.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-B4SLDWeK.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-DT21hoef.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-DT21hoef.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CP_7qBRV.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CP_7qBRV.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CLBVrI3n.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CLBVrI3n.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DJoM5WtF.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DJoM5WtF.js.gz +0 -0
- package/dist/client/assets/rdpSession-C0jVZfFV.js.br +0 -0
- package/dist/client/assets/rdpSession-C0jVZfFV.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-LCYPFdN8.js.br +0 -0
- package/dist/client/assets/referenceLongPress-LCYPFdN8.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BHLyxBdU.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BHLyxBdU.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CUgEsLUw.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CUgEsLUw.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-qEb89gHp.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-qEb89gHp.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BUOHBGK2.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BUOHBGK2.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-Dx0afnU6.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-Dx0afnU6.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CzHE6VoX.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-DeG8X6CN.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-DeG8X6CN.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B4wu-iuA.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-Bkts868I.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-Bkts868I.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-BOoHxntl.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-BOoHxntl.js.gz +0 -0
- package/dist/client/assets/videoCompression-BONtNnBl.js.br +0 -0
- package/dist/client/assets/videoCompression-BONtNnBl.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BAuuRkvt.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BAuuRkvt.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DvJOw2Ss.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DvJOw2Ss.js.gz +0 -0
package/dist/client/assets/{ComputerControlView-yBUQcmwF.js → ComputerControlView-CzooFU9V.js}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/rdpSession-
|
|
2
|
-
import{ah as Ve,cz as Ot,df as St,bA as t,a4 as Ft,cw as $e,bz as qe,W as yt,o as vt,l as Kt,X as $t,_ as wt}from"./app-DNnVU3VK.js";import{b as s,r as Ze}from"./dnd-BCFAPC0L.js";import{a as Ut}from"./ChangeWalkthroughPanel-g83lCwJi.js";import{s as Ct,Y as kt,K as Ge,j as jt}from"./App-xr2R4dST.js";import{M as Bt}from"./triangle-alert-D1VnXjVL.js";const Vt=[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]],Ht=Ve("mouse-pointer-2",Vt);const Yt=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],Xt=Ve("settings-2",Yt);const Wt=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14",key:"1vmskp"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],qt=Ve("zoom-in",Wt);const Zt=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Gt=Ve("zoom-out",Zt);function Qe(e){const n=e==="darwin"?"mac":e==="win32"?"windows":"linux",c={host:"127.0.0.1",platform:n,protocol:n==="mac"?"vnc":"rdp",port:"3389",username:"",domain:"",ignoreCert:!1,rememberLogin:!0};return{target:"local",local:c,remote:{...c,host:""},viewOnly:!1,fit:!0,autoConnect:!0}}function Et(e,n){const c=Qe(n);if(!e||typeof e!="object")return c;const a=e,i=(y,u)=>{const l=y&&typeof y=="object"?y:{},g=(f,x)=>typeof l[f]=="string"&&l[f].length<=x&&!/[\x00-\x1f]/.test(l[f])?l[f]:u[f];return{host:g("host",253),username:g("username",255),domain:g("domain",255),platform:["mac","linux","windows"].includes(String(l.platform))?l.platform:u.platform,protocol:l.protocol==="rdp"||l.protocol==="vnc"?l.protocol:u.protocol,port:typeof l.port=="string"&&/^\d{0,5}$/.test(l.port)&&Number(l.port)<=65535?l.port:u.port,ignoreCert:l.ignoreCert===!0,rememberLogin:l.rememberLogin!==!1}};return{target:a.target==="remote"?"remote":"local",local:{...i(a.local,c.local),host:"127.0.0.1"},remote:i(a.remote,c.remote),viewOnly:a.viewOnly===!0,fit:a.fit!==!1,autoConnect:a.autoConnect!==!1}}function Tt(e){return JSON.stringify([e.host.trim().toLowerCase(),e.protocol,e.protocol==="vnc"?5900:Number(e.port),e.username.trim(),e.domain.trim()])}function Jt(e){const[n,c]=s.useState(Qe),[a,i]=s.useState(!1),[y,u]=s.useState("loading"),[l,g]=s.useState(0),[f,x]=s.useState([]),[k,v]=s.useState("idle"),b=s.useRef(n),P=s.useRef(0),E=s.useRef(0),h=s.useRef(""),p=s.useRef(null),j=s.useRef(new Set),N=s.useCallback(S=>{b.current=S(b.current),P.current++,c(b.current),u("saving")},[]);s.useEffect(()=>{const S=++E.current;P.current=0,h.current="",p.current=null,b.current=Qe(),c(b.current),i(!1),u("loading"),x([]),v("idle");const T=new AbortController;return fetch("/api/computer/preferences",{signal:T.signal}).then(async R=>{if(!R.ok)throw new Error("PREFERENCES_LOAD_FAILED");return await R.json()}).then(R=>{if(S!==E.current||T.signal.aborted)return;let w=Et(R.preferences);const V=P.current>0;if(!R.configured&&!V)try{const I=localStorage.getItem(`termdock:computer-host:${e}`);if(I){const J=/^(127\.0\.0\.1|localhost|::1|\[::1\])$/i.test(I)?"local":"remote";w=Et({...w,target:J,[J]:{...w[J],host:I,platform:localStorage.getItem(`termdock:computer-platform:${e}`)||w[J].platform,protocol:localStorage.getItem(`termdock:computer-protocol:${e}`)||"vnc",port:localStorage.getItem(`termdock:computer-rdp-port:${e}`)||"3389"}}),P.current++}}catch{}V||(b.current=w),h.current=R.configured?JSON.stringify(w):"",c(b.current),i(!0),u(R.configured?"saved":"saving"),x(Array.isArray(R.credentialKeys)?R.credentialKeys.filter(I=>typeof I=="string"):[]),v(R.credentialError?"error":"idle")}).catch(()=>{!T.signal.aborted&&S===E.current&&u("error")}),()=>{++E.current,T.abort();for(const R of j.current)R.abort();j.current.clear()}},[e,l]);const _=s.useCallback(()=>{if(p.current)return p.current;if(!a)return Promise.resolve(!1);const S=E.current,T=(async()=>{for(;h.current!==JSON.stringify(b.current);){const R=JSON.stringify(b.current),w=new AbortController;j.current.add(w),u("saving");try{if(!(await fetch("/api/computer/preferences",{method:"PUT",headers:{"Content-Type":"application/json"},body:R,signal:w.signal})).ok)throw new Error("PREFERENCES_SAVE_FAILED");if(S!==E.current)return!1;h.current=R}catch{return S===E.current&&u("error"),!1}finally{j.current.delete(w)}}return S===E.current&&u("saved"),!0})();return p.current=T,T.finally(()=>{p.current===T&&(p.current=null)}),T},[a]);s.useEffect(()=>{if(!a||h.current===JSON.stringify(n))return;const S=setTimeout(()=>{_()},300);return()=>clearTimeout(S)},[a,n,_]);const Y=s.useCallback(async(S,T,R)=>{const w=E.current,V=new AbortController;S!=="use"&&v("saving");try{if(!await _()||w!==E.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");j.current.add(V);const I=await fetch(`/api/computer/credentials/${S}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({profile:T,...S==="save"?{password:R}:{}}),signal:V.signal});if(w!==E.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");if(!I.ok)throw new Error(S==="use"&&I.status===404?"COMPUTER_CREDENTIALS_MISSING":"COMPUTER_CREDENTIALS_FAILED");const K=await I.json();if(w!==E.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");const J=Tt(T);if(S==="save"&&x(ee=>[...new Set([...ee,J])]),S==="forget"&&x(ee=>ee.filter(we=>we!==J)),S==="use"&&(typeof K.password!="string"||!K.password))throw new Error("COMPUTER_CREDENTIALS_MISSING");return v("idle"),K.password}catch(I){throw w===E.current&&!V.signal.aborted&&v("error"),I}finally{j.current.delete(V)}},[_]);return{preferences:n,change:N,loaded:a,saveState:y,flush:_,credentialKeys:f,loginState:k,credentialRequest:Y,retry:()=>a?void _():g(S=>S+1)}}class Qt{binaryType="arraybuffer";protocol="";CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;onopen=null;onmessage=null;onerror=null;onclose=null;socket;get readyState(){return this.socket.readyState}constructor(n,c){this.socket=Ot(`/api/computer/ws?host=${encodeURIComponent(n)}`),this.socket.onopen=a=>this.onopen?.(a),this.socket.onerror=a=>this.onerror?.(a),this.socket.onclose=a=>{(a.code!==1e3||a.reason)&&c(a.reason||"COMPUTER_DISCONNECTED"),this.onclose?.(a)},this.socket.onmessage=a=>{try{const i=JSON.parse(a.data);if(i.type!=="data"||typeof i.data!="string"||!Number.isSafeInteger(i.seq))throw new Error("Invalid VNC record");const y=Uint8Array.from(atob(i.data),u=>u.charCodeAt(0));this.onmessage?.(new MessageEvent("message",{data:y.buffer})),this.socket.readyState===1&&this.socket.send(JSON.stringify({type:"ack",seq:i.seq}))}catch{c("COMPUTER_INVALID_MESSAGE"),this.close(),this.onclose?.(new CloseEvent("close",{code:4400}))}}}send(n){const c=ArrayBuffer.isView(n)?new Uint8Array(n.buffer,n.byteOffset,n.byteLength):new Uint8Array(n);for(let a=0;a<c.length;a+=32*1024){const i=c.subarray(a,a+32768);let y="";for(const u of i)y+=String.fromCharCode(u);this.socket.send(JSON.stringify({type:"data",data:btoa(y)}))}}close(){this.socket.close()}}function er(e){return e==="mac"||e==="linux"||e==="windows"}function tr(e){const n=e==="mac"?[65513,"MetaLeft"]:[65507,"ControlLeft"],c=e==="mac"?n:[65515,"MetaLeft"];return{escape:[[65307,"Escape"]],enter:[[65293,"Enter"]],backspace:[[65288,"Backspace"]],tab:[e==="mac"?n:[65513,"AltLeft"],[65289,"Tab"]],search:e==="mac"?[c,[32,"Space"]]:[c],copy:[n,[99,"KeyC"]],paste:[n,[118,"KeyV"]],up:[[65362,"ArrowUp"]],down:[[65364,"ArrowDown"]],left:[[65361,"ArrowLeft"]],right:[[65363,"ArrowRight"]]}}function rr(e){const n=e;return{rendersCursor:!0,position:()=>({x:Number.isFinite(n._mousePos.x)?n._display.absX(n._mousePos.x):n._fbWidth/2,y:Number.isFinite(n._mousePos.y)?n._display.absY(n._mousePos.y):n._fbHeight/2}),size:()=>({width:n._fbWidth,height:n._fbHeight}),surface:()=>n._canvas,send:(c,a,i)=>{const y=n._display.scale,u=(c-n._display.absX(0))*y,l=(a-n._display.absY(0))*y;n._mousePos={x:u,y:l},n._mouseMoveTimer!==null&&clearTimeout(n._mouseMoveTimer),n._mouseMoveTimer=null,n._mouseButtonMask=i,n._mouseLastMoveTime=Date.now(),n._sendMouse(u,l,i);const g=n._canvas.getBoundingClientRect();n._cursor?.move(g.left+u,g.top+l)}}}function nr(e,n,c){const a=new AbortController,i=new Set,y=new Set;let u,l,g=!1,f=performance.now();const x=()=>i.size>0||y.size>0,k=h=>{u=void 0,!(g||!x())&&(performance.now()-f>1e3||(c.record("browser-frame",{time:h,interval:l===void 0?null:h-l,logical:n.position?.(),renderer:n.observeCursor?.()}),l=h,u=requestAnimationFrame(k)))},v=()=>{x()?u===void 0&&(l=void 0,u=requestAnimationFrame(k)):(u!==void 0&&cancelAnimationFrame(u),u=void 0,l=void 0)},b=h=>{if(h.pointerType!=="touch"&&h.pointerType!=="pen")return;f=performance.now(),h.type==="pointerdown"?i.add(h.pointerId):(h.type==="pointerup"||h.type==="pointercancel"||h.type==="lostpointercapture")&&i.delete(h.pointerId);const p=h.getCoalescedEvents?.()??[];c.record("raw-pointer",{type:h.type,time:h.timeStamp,id:h.pointerId,pointerType:h.pointerType,client:[h.clientX,h.clientY],trusted:h.isTrusted,coalesced:p.slice(-16).map(j=>[j.timeStamp,j.clientX,j.clientY])}),v()},P=h=>{f=performance.now(),y.clear();for(const p of Array.from(h.touches))y.add(p.identifier);c.record("raw-touch",{type:h.type,time:h.timeStamp,trusted:h.isTrusted,touches:Array.from(h.touches,p=>[p.identifier,p.clientX,p.clientY]),changed:Array.from(h.changedTouches,p=>[p.identifier,p.clientX,p.clientY])}),v()},E={capture:!0,passive:!0,signal:a.signal};for(const h of["pointerdown","pointermove","pointerup","pointercancel","lostpointercapture"])e.addEventListener(h,b,E);for(const h of["touchstart","touchmove","touchend","touchcancel"])e.addEventListener(h,P,E);return c.record("observation-start",{version:2,pointerEvents:typeof PointerEvent<"u",touchEvents:"ontouchstart"in window}),()=>{g=!0,a.abort(),u!==void 0&&cancelAnimationFrame(u),c.record("observation-stop"),c.flush("observation-stop")}}const Lt="termdock:computer-touch-mode:v1";function or(){try{const e=localStorage.getItem(Lt);if(e==="trackpad"||e==="direct")return e}catch{}return navigator.maxTouchPoints>0&&window.matchMedia("(any-pointer: coarse)").matches?"trackpad":"direct"}function sr(e){try{localStorage.setItem(Lt,e)}catch{}}const Oe=8,ar=300,cr=450,Nt=18,ir=50,Ue=(e,n)=>Math.max(0,Math.min(e,Math.max(0,n-1)));function lr(e,n,c,a,i={}){const y=new AbortController,u=i.trace?nr(e,n,i.trace):void 0,l=new Map;let g=0,f=0,x=!1,k=!1,v=!1,b=!1,P=0,E=1,h="pending",p=[],j={x:0,y:0},N={x:0,y:0},_,Y=0,S=0,T,R=!0,w,V=!1;const I=()=>{const o=n.size(),d=a.current??={x:o.width/2,y:o.height/2};return d.x=Ue(d.x,o.width),d.y=Ue(d.y,o.height),d};let K;const J=()=>{const o=n.size();if((!K||K.width!==o.width||K.height!==o.height)&&(R=!0),!R&&K)return K;const d=n.surface(),C=e.getBoundingClientRect(),$=d.getBoundingClientRect(),D=[];for(let M=d.parentElement;M&&M!==e;M=M.parentElement){const F=getComputedStyle(M),B=/auto|scroll/.test(F.overflowX)?Math.max(0,M.scrollWidth-M.clientWidth):0,se=/auto|scroll/.test(F.overflowY)?Math.max(0,M.scrollHeight-M.clientHeight):0;if(!B&&!se)continue;const ae=M.getBoundingClientRect();D.push({element:M,left:ae.left-C.left,top:ae.top-C.top,right:ae.right-C.left,bottom:ae.bottom-C.top,maxX:B,maxY:se})}return K={...o,left:$.left-C.left,top:$.top-C.top,scaleX:o.width&&$.width?$.width/o.width:1,scaleY:o.height&&$.height?$.height/o.height:1,viewportWidth:C.width,viewportHeight:C.height,clientLeft:C.left,clientTop:C.top,scrollers:D},R=!1,K},ee=(o,d)=>{if(!i.trace)return;const C=K;i.trace.record(o,{mode:i.mode,pointerType:d?.pointerType,pointerId:d?.pointerId,client:d?[d.clientX,d.clientY]:void 0,inputTime:d?.timeStamp,target:a.current?[a.current.x,a.current.y]:null,actual:n.position?.(),buttons:S,fingers:l.size,moved:x,pinching:b,scrolling:v,zoom:i.zoom?.get(),scale:C?[C.scaleX,C.scaleY]:void 0,surface:C?[C.left,C.top,C.width,C.height]:void 0,viewport:C?[C.clientLeft,C.clientTop,C.viewportWidth,C.viewportHeight]:void 0})};i.trace?.record("touchpad-attached",{mode:i.mode,viewOnly:i.viewOnly}),c.hidden=!0;const we=()=>{const o=J(),d=I();if(!o.width||!o.height||b||i.viewOnly)return;let C=o.left+d.x*o.scaleX,$=o.top+d.y*o.scaleY;for(const D of o.scrollers){if(D.maxX){const M=D.element.scrollLeft,F=C<D.left+20?C-D.left-20:C>D.right-20?C-D.right+20:0,B=Math.max(0,Math.min(D.maxX,M+F));M!==B&&(D.element.scrollLeft=B,C-=B-M,o.left-=B-M)}if(D.maxY){const M=D.element.scrollTop,F=$<D.top+20?$-D.top-20:$>D.bottom-20?$-D.bottom+20:0,B=Math.max(0,Math.min(D.maxY,M+F));M!==B&&(D.element.scrollTop=B,$-=B-M,o.top-=B-M)}}},ne=(o=S)=>{if(i.viewOnly)return;const d=I(),C=n.position?.();n.send(Math.round(d.x),Math.round(d.y),o),i.trace?.record("send",{target:[Math.round(d.x),Math.round(d.y)],buttons:o,before:C,after:n.position?.()})},Me=()=>{T=void 0,we();let o=0;for(;Math.abs(Y)>=Nt&&o++<8;){const d=Y>0?16:8;ne(d),ne(0),Y-=Math.sign(Y)*Nt}},Ce=()=>{V||(T??=requestAnimationFrame(Me))},Pe=()=>{T!==void 0&&(cancelAnimationFrame(T),Me())},q=()=>{T!==void 0&&cancelAnimationFrame(T),T=void 0,Y=0},ke=()=>{clearTimeout(w),Pe(),S&&(S=0,ne())},re=o=>{o.cancelable&&o.preventDefault(),o.stopImmediatePropagation()},Q=()=>{const[o,d]=[...l.values()];return{distance:Math.hypot(o.x-d.x,o.y-d.y),x:(o.x+d.x)/2,y:(o.y+d.y)/2}},U=(o=!1)=>{if(V||k||l.size!==2||f!==2)return;const d=Q();if(h==="pending"){const C=[...l.values()].map((B,se)=>({x:B.x-p[se].x,y:B.y-p[se].y})),$=C.map(B=>Math.hypot(B.x,B.y));if(Math.max(...$)<Oe)return;if(!o&&Math.min(...$)<Oe){_??=setTimeout(()=>{_=void 0,U(!0)},ir);return}clearTimeout(_),_=void 0;const D=Math.abs(d.distance-P),M=C[0].x*C[1].x+C[0].y*C[1].y<0,F=Math.min(...$)>=Oe?M:D>Math.max(Math.abs(d.x-j.x),Math.abs(d.y-j.y));h=i.zoom&&D>=Oe&&F?"pinch":i.mode==="direct"&&i.zoom&&i.zoom.get()>1?"pan":"scroll",b=h==="pinch",x=!0,ee("two-finger-classified")}h==="pinch"&&P>0?(i.zoom?.set(E*d.distance/P,d),i.zoom?.pan(d.x-N.x,d.y-N.y),R=!0):h==="pan"?(i.zoom?.pan(d.x-N.x,d.y-N.y),R=!0):Y+=N.y-d.y,N=d,Ce()},te=o=>{const d=J();a.current={x:Ue((o.clientX-d.clientLeft-d.left)/d.scaleX,d.width),y:Ue((o.clientY-d.clientTop-d.top)/d.scaleY,d.height)}},de=o=>{if(!(o.pointerType!=="touch"&&o.pointerType!=="pen")){re(o),l.size||(R=!0,clearTimeout(_),_=void 0,g=performance.now(),f=0,x=!1,k=!1,v=!1,b=!1,Y=0,i.mode==="direct"?te(o):n.position&&(a.current={...n.position()},I())),l.set(o.pointerId,{x:o.clientX,y:o.clientY,startX:o.clientX,startY:o.clientY}),f=Math.max(f,l.size),ee("down",o);try{e.setPointerCapture(o.pointerId)}catch{}if(clearTimeout(w),l.size===1&&f===1)w=setTimeout(()=>{!V&&l.size===1&&!x&&!k&&(S=1,ne())},cr);else if(ke(),v=!0,l.size===2&&f===2){const d=Q();P=d.distance,E=i.zoom?.get()??1,j=N=d,h="pending",p=[...l.values()].map(({x:C,y:$})=>({x:C,y:$}))}else k=!0,clearTimeout(_),_=void 0}},pe=o=>{if(o.pointerType==="mouse")return;const d=l.get(o.pointerId);if(!d)return;re(o);const C=o.clientX-d.x,$=o.clientY-d.y;if(d.x=o.clientX,d.y=o.clientY,ee("move-input",o),Math.hypot(d.x-d.startX,d.y-d.startY)>Oe&&(x=!0,clearTimeout(w)),l.size===2&&!k)U();else if(l.size===1&&!v&&!k){if(i.mode==="direct"){te(o),x&&(S=1),ne(),Ce();return}const D=I(),M=J();D.x+=C/M.scaleX,D.y+=$/M.scaleY,I(),ne(),Ce()}},Ie=o=>{if(!l.has(o.pointerId))return;re(o),ee(o.type,o),clearTimeout(_),_=void 0;const d=S!==0;o.type!=="pointerup"&&(k=!0,q()),ke(),l.delete(o.pointerId);try{e.hasPointerCapture(o.pointerId)&&e.releasePointerCapture(o.pointerId)}catch{}l.size||(Y=0,!k&&!d&&!x&&f<=2&&performance.now()-g<=ar&&(i.mode!=="direct"||f===1)&&(ne(f===2?4:1),ne(0)),ee("gesture-end",o),i.trace?.flush("gesture-end"))},je=()=>{k=!0,q(),clearTimeout(_),_=void 0,ke();const o=[...l.keys()];l.clear(),Y=0;for(const d of o)try{e.hasPointerCapture(d)&&e.releasePointerCapture(d)}catch{}},X={capture:!0,passive:!1,signal:y.signal};e.addEventListener("pointerdown",de,X),e.addEventListener("pointermove",pe,X),e.addEventListener("pointerup",Ie,X),e.addEventListener("pointercancel",Ie,X),e.addEventListener("lostpointercapture",Ie,X);for(const o of["touchstart","touchmove","touchend","touchcancel","contextmenu"])e.addEventListener(o,re,X);const oe=()=>{R=!0,Ce()};e.addEventListener("scroll",oe,{capture:!0,signal:y.signal}),window.addEventListener("blur",je,{signal:y.signal});const L=()=>{document.hidden&&je()};document.addEventListener("visibilitychange",L,{signal:y.signal});const W=new ResizeObserver(oe);return W.observe(e),W.observe(n.surface()),!a.current&&n.position&&(a.current={...n.position()}),we(),()=>{V||(V=!0,ee("touchpad-detached"),y.abort(),je(),W.disconnect(),c.hidden=!0,u?.(),i.trace?.flush("touchpad-detached"))}}function ur(e,n){e=Math.max(1,e||1280),n=Math.max(1,n||800);const c=Math.max(1,640/e,480/n);return{width:Math.max(640,Math.min(2560,Math.round(e*c))),height:Math.max(480,Math.min(1600,Math.round(n*c)))}}const Je="",dr={Enter:"enter",Backspace:"backspace",Delete:"delete",Tab:"tab",ArrowUp:"up",ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right"};function pr({sendText:e,sendKey:n,sendChord:c,commandKey:a=[65515,"MetaLeft"],inputRef:i,onFocusChange:y}){const{t:u}=St(),l=s.useRef(null),g=s.useRef(!1),f=s.useRef(null),x=i??l,k=s.useRef({sendText:e,sendKey:n});k.current={sendText:e,sendKey:n};const[v,b]=s.useState(!1),P=()=>{x.current&&(x.current.value=Je,x.current.setSelectionRange(1,1)),b(!1)},E=()=>{const p=(x.current?.value||"").replace(/^\u200b/,"");p&&k.current.sendText(p),P()},h=()=>{f.current!==null&&(cancelAnimationFrame(f.current),f.current=null),E()};return s.useLayoutEffect(()=>{const p=x.current;p.value=Je,p.setSelectionRange(1,1),p.focus({preventScroll:!0});const j=N=>{if(g.current||N.isComposing)return;const _=N.inputType==="deleteContentBackward"?"backspace":N.inputType==="deleteContentForward"?"delete":["insertLineBreak","insertParagraph"].includes(N.inputType)?"enter":null;if(!_)return;N.preventDefault();const Y=_==="enter"&&f.current!==null;h(),Y||k.current.sendKey(_)};return p.addEventListener("beforeinput",j),()=>{if(p.removeEventListener("beforeinput",j),f.current!==null){cancelAnimationFrame(f.current),f.current=null;const N=p.value.replace(/^\u200b/,"");!g.current&&N&&k.current.sendText(N)}}},[]),t.jsxs("div",{className:"relative shrink-0 border-t border-border bg-surface px-3 py-2",children:[!v&&t.jsx("span",{"aria-hidden":"true",className:"pointer-events-none absolute inset-y-2 left-6 flex items-center text-sm text-muted-foreground",children:u("computer.keyboardPlaceholder")}),t.jsx("input",{ref:x,className:"min-h-11 w-full rounded-md border border-border bg-background px-3 text-base outline-none focus:border-primary","aria-label":u("computer.keyboardInput"),autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",spellCheck:!1,inputMode:"text",enterKeyHint:"enter",maxLength:1025,defaultValue:Je,onChange:p=>{if(b(!!p.target.value.replace(/^\u200b/,"")),g.current||p.nativeEvent.isComposing||f.current!==null)return;p.nativeEvent.inputType==="deleteContentBackward"&&!p.target.value?(k.current.sendKey("backspace"),P()):E()},onCompositionStart:()=>{f.current!==null&&h(),g.current=!0},onCompositionEnd:()=>{g.current=!1,f.current!==null&&cancelAnimationFrame(f.current),f.current=requestAnimationFrame(()=>{f.current=null,E()})},onFocus:()=>y?.(!0),onBlur:()=>{!g.current&&f.current!==null&&h(),y?.(!1)},onKeyDown:p=>{if(g.current||p.nativeEvent.isComposing||p.keyCode===229)return;const j=p.ctrlKey||p.altKey||p.metaKey,N=(p.ctrlKey||p.metaKey)&&!p.altKey&&p.key.toLowerCase()==="v";if(c&&!N&&!p.getModifierState("AltGraph")&&(j||p.shiftKey)){const S={Enter:65293,Backspace:65288,Delete:65535,Tab:65289,ArrowUp:65362,ArrowDown:65364,ArrowLeft:65361,ArrowRight:65363,Home:65360,End:65367,PageUp:65365,PageDown:65366}[p.key]??(j&&p.key.length===1?p.key.toLowerCase().codePointAt(0):void 0);if(S!==void 0){p.preventDefault(),h();const T=[];p.ctrlKey&&T.push([65507,"ControlLeft"]),p.altKey&&T.push([65513,"AltLeft"]),p.metaKey&&!T.some(([R])=>R===a[0])&&T.push(a),p.shiftKey&&T.push([65505,"ShiftLeft"]),T.push([S,p.code||p.key]),c(T);return}}const _=dr[p.key];_&&(p.preventDefault(),h(),k.current.sendKey(_))}})]})}function mr(e){let n=[],c=null;const a=new Map,i=()=>{c=null,n.splice(0,32).forEach(y=>{e(y),y[2]?a.set(y[0],y):a.delete(y[0])}),n.length&&(c=requestAnimationFrame(i))};return{send(y){n.push(...y),c===null&&i()},clear(){c!==null&&cancelAnimationFrame(c),c=null,n=[];const y=[...a.values()].reverse();a.clear();for(const[u,l]of y)try{e([u,l,!1])}catch{}}}}const fr=e=>Math.max(1,Math.min(8,Number.isFinite(e)?e:1));function hr(e,n){let c=1;const a="viewportZoom"in e,i=e,y=()=>a?e.pointerTarget.surface():i._canvas,u=()=>a?e.viewportScroller:i._screen,l=a?void 0:i._updateScale;return l&&(i._updateScale=function(){l.call(i),i._display.scale*=c}),{get:()=>c,set(g,f){const x=fr(g),k=y(),v=u(),b=k.getBoundingClientRect(),P=v.getBoundingClientRect(),E=f??{x:P.left+P.width/2,y:P.top+P.height/2},h={x:(E.x-b.left)/(b.width||1),y:(E.y-b.top)/(b.height||1)};c=x,a?e.viewportZoom=c:i._updateScale();const p=k.getBoundingClientRect();v.scrollLeft+=p.left+h.x*p.width-E.x,v.scrollTop+=p.top+h.y*p.height-E.y,c===1&&(v.scrollLeft=0,v.scrollTop=0),n(c)},pan(g,f){const x=u();x.scrollLeft-=g,x.scrollTop-=f},dispose(){l&&(i._updateScale=l)}}}function gr(e,n){const c=e,a=c._keyboard,i=a._target,y=e.focus,u=document.createElement("textarea");u.tabIndex=-1,u.setAttribute("aria-label","Remote desktop keyboard"),u.autocapitalize="off",u.autocomplete="off",u.spellcheck=!1,Object.assign(u.style,{position:"absolute",left:"0",top:"0",width:"1px",height:"1px",fontSize:"16px",opacity:"0",pointerEvents:"none"}),c._screen.append(u);const l=new AbortController;let g=!1,f=null,x=!1;const k=()=>{c._mouseMoveTimer!==null&&clearTimeout(c._mouseMoveTimer),c._mouseMoveTimer=null,c._mouseButtonMask&&(c._mouseButtonMask=0,c._sendMouse(c._mousePos.x,c._mousePos.y,0))};window.addEventListener("blur",k,{signal:l.signal}),document.addEventListener("visibilitychange",()=>{document.hidden&&(a._allKeysUp(),k())},{signal:l.signal});const v=()=>{f!==null&&cancelAnimationFrame(f),f=null;const b=u.value;u.value="",b&&!e.viewOnly&&n(b)};return u.addEventListener("keydown",b=>{(g||b.isComposing||b.keyCode===229)&&b.stopImmediatePropagation()},{capture:!0,signal:l.signal}),u.addEventListener("compositionstart",()=>{f!==null&&v(),g=!0,a._allKeysUp()},{signal:l.signal}),u.addEventListener("compositionend",()=>{g=!1,f!==null&&cancelAnimationFrame(f),f=requestAnimationFrame(v)},{signal:l.signal}),u.addEventListener("input",b=>{!g&&!b.isComposing&&f===null&&v()},{signal:l.signal}),u.addEventListener("blur",()=>{!g&&f!==null&&v(),a._allKeysUp()},{signal:l.signal}),a.ungrab(),a._target=u,e.viewOnly||a.grab(),e.focus=b=>{!x&&!e.viewOnly&&u.focus(b)},document.activeElement===i&&e.focus({preventScroll:!0}),()=>{x||(x=!0,f!==null&&(g?cancelAnimationFrame(f):v()),k(),l.abort(),a.ungrab(),a._target=i,e.viewOnly||a.grab(),e.focus=y,u.remove())}}function*xr(e){for(const n of e.replace(/\r\n?/g,`
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/rdpSession-_Wi6QGVy.js","assets/app-D5VZp8rc.js","assets/react-XDCjal2T.js","assets/dnd-BCFAPC0L.js","assets/terminal-C7X98Amf.js","assets/index-C6xPtOPw.css","assets/ChangeWalkthroughPanel-iNaVjdNU.js","assets/sparkles-BK6dvO4C.js","assets/triangle-alert-CiksAjZK.js","assets/App-D9G1XjRn.js","assets/gestureArbiter-CGaUInum.js","assets/gestureArbiter-C2J0D0kV.css","assets/referenceLongPress-CHQPhmmv.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{ah as Ve,cz as Ot,df as St,bA as t,a4 as Ft,cw as $e,bz as We,W as yt,o as vt,l as Kt,X as $t,_ as wt}from"./app-D5VZp8rc.js";import{b as s,r as Ze}from"./dnd-BCFAPC0L.js";import{a as Ut}from"./ChangeWalkthroughPanel-iNaVjdNU.js";import{s as Ct,Y as kt,K as Ge,j as jt}from"./App-D9G1XjRn.js";import{M as Bt}from"./triangle-alert-CiksAjZK.js";const Vt=[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]],Ht=Ve("mouse-pointer-2",Vt);const Yt=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],Xt=Ve("settings-2",Yt);const qt=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14",key:"1vmskp"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Wt=Ve("zoom-in",qt);const Zt=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Gt=Ve("zoom-out",Zt);function Qe(e){const n=e==="darwin"?"mac":e==="win32"?"windows":"linux",c={host:"127.0.0.1",platform:n,protocol:n==="mac"?"vnc":"rdp",port:"3389",username:"",domain:"",ignoreCert:!1,rememberLogin:!0};return{target:"local",local:c,remote:{...c,host:""},viewOnly:!1,fit:!0,autoConnect:!0}}function Et(e,n){const c=Qe(n);if(!e||typeof e!="object")return c;const a=e,i=(y,u)=>{const l=y&&typeof y=="object"?y:{},g=(f,x)=>typeof l[f]=="string"&&l[f].length<=x&&!/[\x00-\x1f]/.test(l[f])?l[f]:u[f];return{host:g("host",253),username:g("username",255),domain:g("domain",255),platform:["mac","linux","windows"].includes(String(l.platform))?l.platform:u.platform,protocol:l.protocol==="rdp"||l.protocol==="vnc"?l.protocol:u.protocol,port:typeof l.port=="string"&&/^\d{0,5}$/.test(l.port)&&Number(l.port)<=65535?l.port:u.port,ignoreCert:l.ignoreCert===!0,rememberLogin:l.rememberLogin!==!1}};return{target:a.target==="remote"?"remote":"local",local:{...i(a.local,c.local),host:"127.0.0.1"},remote:i(a.remote,c.remote),viewOnly:a.viewOnly===!0,fit:a.fit!==!1,autoConnect:a.autoConnect!==!1}}function Tt(e){return JSON.stringify([e.host.trim().toLowerCase(),e.protocol,e.protocol==="vnc"?5900:Number(e.port),e.username.trim(),e.domain.trim()])}function Jt(e){const[n,c]=s.useState(Qe),[a,i]=s.useState(!1),[y,u]=s.useState("loading"),[l,g]=s.useState(0),[f,x]=s.useState([]),[k,v]=s.useState("idle"),b=s.useRef(n),P=s.useRef(0),E=s.useRef(0),h=s.useRef(""),p=s.useRef(null),j=s.useRef(new Set),N=s.useCallback(S=>{b.current=S(b.current),P.current++,c(b.current),u("saving")},[]);s.useEffect(()=>{const S=++E.current;P.current=0,h.current="",p.current=null,b.current=Qe(),c(b.current),i(!1),u("loading"),x([]),v("idle");const T=new AbortController;return fetch("/api/computer/preferences",{signal:T.signal}).then(async R=>{if(!R.ok)throw new Error("PREFERENCES_LOAD_FAILED");return await R.json()}).then(R=>{if(S!==E.current||T.signal.aborted)return;let w=Et(R.preferences);const V=P.current>0;if(!R.configured&&!V)try{const I=localStorage.getItem(`termdock:computer-host:${e}`);if(I){const J=/^(127\.0\.0\.1|localhost|::1|\[::1\])$/i.test(I)?"local":"remote";w=Et({...w,target:J,[J]:{...w[J],host:I,platform:localStorage.getItem(`termdock:computer-platform:${e}`)||w[J].platform,protocol:localStorage.getItem(`termdock:computer-protocol:${e}`)||"vnc",port:localStorage.getItem(`termdock:computer-rdp-port:${e}`)||"3389"}}),P.current++}}catch{}V||(b.current=w),h.current=R.configured?JSON.stringify(w):"",c(b.current),i(!0),u(R.configured?"saved":"saving"),x(Array.isArray(R.credentialKeys)?R.credentialKeys.filter(I=>typeof I=="string"):[]),v(R.credentialError?"error":"idle")}).catch(()=>{!T.signal.aborted&&S===E.current&&u("error")}),()=>{++E.current,T.abort();for(const R of j.current)R.abort();j.current.clear()}},[e,l]);const _=s.useCallback(()=>{if(p.current)return p.current;if(!a)return Promise.resolve(!1);const S=E.current,T=(async()=>{for(;h.current!==JSON.stringify(b.current);){const R=JSON.stringify(b.current),w=new AbortController;j.current.add(w),u("saving");try{if(!(await fetch("/api/computer/preferences",{method:"PUT",headers:{"Content-Type":"application/json"},body:R,signal:w.signal})).ok)throw new Error("PREFERENCES_SAVE_FAILED");if(S!==E.current)return!1;h.current=R}catch{return S===E.current&&u("error"),!1}finally{j.current.delete(w)}}return S===E.current&&u("saved"),!0})();return p.current=T,T.finally(()=>{p.current===T&&(p.current=null)}),T},[a]);s.useEffect(()=>{if(!a||h.current===JSON.stringify(n))return;const S=setTimeout(()=>{_()},300);return()=>clearTimeout(S)},[a,n,_]);const Y=s.useCallback(async(S,T,R)=>{const w=E.current,V=new AbortController;S!=="use"&&v("saving");try{if(!await _()||w!==E.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");j.current.add(V);const I=await fetch(`/api/computer/credentials/${S}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({profile:T,...S==="save"?{password:R}:{}}),signal:V.signal});if(w!==E.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");if(!I.ok)throw new Error(S==="use"&&I.status===404?"COMPUTER_CREDENTIALS_MISSING":"COMPUTER_CREDENTIALS_FAILED");const K=await I.json();if(w!==E.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");const J=Tt(T);if(S==="save"&&x(ee=>[...new Set([...ee,J])]),S==="forget"&&x(ee=>ee.filter(we=>we!==J)),S==="use"&&(typeof K.password!="string"||!K.password))throw new Error("COMPUTER_CREDENTIALS_MISSING");return v("idle"),K.password}catch(I){throw w===E.current&&!V.signal.aborted&&v("error"),I}finally{j.current.delete(V)}},[_]);return{preferences:n,change:N,loaded:a,saveState:y,flush:_,credentialKeys:f,loginState:k,credentialRequest:Y,retry:()=>a?void _():g(S=>S+1)}}class Qt{binaryType="arraybuffer";protocol="";CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;onopen=null;onmessage=null;onerror=null;onclose=null;socket;get readyState(){return this.socket.readyState}constructor(n,c){this.socket=Ot(`/api/computer/ws?host=${encodeURIComponent(n)}`),this.socket.onopen=a=>this.onopen?.(a),this.socket.onerror=a=>this.onerror?.(a),this.socket.onclose=a=>{(a.code!==1e3||a.reason)&&c(a.reason||"COMPUTER_DISCONNECTED"),this.onclose?.(a)},this.socket.onmessage=a=>{try{const i=JSON.parse(a.data);if(i.type!=="data"||typeof i.data!="string"||!Number.isSafeInteger(i.seq))throw new Error("Invalid VNC record");const y=Uint8Array.from(atob(i.data),u=>u.charCodeAt(0));this.onmessage?.(new MessageEvent("message",{data:y.buffer})),this.socket.readyState===1&&this.socket.send(JSON.stringify({type:"ack",seq:i.seq}))}catch{c("COMPUTER_INVALID_MESSAGE"),this.close(),this.onclose?.(new CloseEvent("close",{code:4400}))}}}send(n){const c=ArrayBuffer.isView(n)?new Uint8Array(n.buffer,n.byteOffset,n.byteLength):new Uint8Array(n);for(let a=0;a<c.length;a+=32*1024){const i=c.subarray(a,a+32768);let y="";for(const u of i)y+=String.fromCharCode(u);this.socket.send(JSON.stringify({type:"data",data:btoa(y)}))}}close(){this.socket.close()}}function er(e){return e==="mac"||e==="linux"||e==="windows"}function tr(e){const n=e==="mac"?[65513,"MetaLeft"]:[65507,"ControlLeft"],c=e==="mac"?n:[65515,"MetaLeft"];return{escape:[[65307,"Escape"]],enter:[[65293,"Enter"]],backspace:[[65288,"Backspace"]],tab:[e==="mac"?n:[65513,"AltLeft"],[65289,"Tab"]],search:e==="mac"?[c,[32,"Space"]]:[c],copy:[n,[99,"KeyC"]],paste:[n,[118,"KeyV"]],up:[[65362,"ArrowUp"]],down:[[65364,"ArrowDown"]],left:[[65361,"ArrowLeft"]],right:[[65363,"ArrowRight"]]}}function rr(e){const n=e;return{rendersCursor:!0,position:()=>({x:Number.isFinite(n._mousePos.x)?n._display.absX(n._mousePos.x):n._fbWidth/2,y:Number.isFinite(n._mousePos.y)?n._display.absY(n._mousePos.y):n._fbHeight/2}),size:()=>({width:n._fbWidth,height:n._fbHeight}),surface:()=>n._canvas,send:(c,a,i)=>{const y=n._display.scale,u=(c-n._display.absX(0))*y,l=(a-n._display.absY(0))*y;n._mousePos={x:u,y:l},n._mouseMoveTimer!==null&&clearTimeout(n._mouseMoveTimer),n._mouseMoveTimer=null,n._mouseButtonMask=i,n._mouseLastMoveTime=Date.now(),n._sendMouse(u,l,i);const g=n._canvas.getBoundingClientRect();n._cursor?.move(g.left+u,g.top+l)}}}function nr(e,n,c){const a=new AbortController,i=new Set,y=new Set;let u,l,g=!1,f=performance.now();const x=()=>i.size>0||y.size>0,k=h=>{u=void 0,!(g||!x())&&(performance.now()-f>1e3||(c.record("browser-frame",{time:h,interval:l===void 0?null:h-l,logical:n.position?.(),renderer:n.observeCursor?.()}),l=h,u=requestAnimationFrame(k)))},v=()=>{x()?u===void 0&&(l=void 0,u=requestAnimationFrame(k)):(u!==void 0&&cancelAnimationFrame(u),u=void 0,l=void 0)},b=h=>{if(h.pointerType!=="touch"&&h.pointerType!=="pen")return;f=performance.now(),h.type==="pointerdown"?i.add(h.pointerId):(h.type==="pointerup"||h.type==="pointercancel"||h.type==="lostpointercapture")&&i.delete(h.pointerId);const p=h.getCoalescedEvents?.()??[];c.record("raw-pointer",{type:h.type,time:h.timeStamp,id:h.pointerId,pointerType:h.pointerType,client:[h.clientX,h.clientY],trusted:h.isTrusted,coalesced:p.slice(-16).map(j=>[j.timeStamp,j.clientX,j.clientY])}),v()},P=h=>{f=performance.now(),y.clear();for(const p of Array.from(h.touches))y.add(p.identifier);c.record("raw-touch",{type:h.type,time:h.timeStamp,trusted:h.isTrusted,touches:Array.from(h.touches,p=>[p.identifier,p.clientX,p.clientY]),changed:Array.from(h.changedTouches,p=>[p.identifier,p.clientX,p.clientY])}),v()},E={capture:!0,passive:!0,signal:a.signal};for(const h of["pointerdown","pointermove","pointerup","pointercancel","lostpointercapture"])e.addEventListener(h,b,E);for(const h of["touchstart","touchmove","touchend","touchcancel"])e.addEventListener(h,P,E);return c.record("observation-start",{version:2,pointerEvents:typeof PointerEvent<"u",touchEvents:"ontouchstart"in window}),()=>{g=!0,a.abort(),u!==void 0&&cancelAnimationFrame(u),c.record("observation-stop"),c.flush("observation-stop")}}const Lt="termdock:computer-touch-mode:v1";function or(){try{const e=localStorage.getItem(Lt);if(e==="trackpad"||e==="direct")return e}catch{}return navigator.maxTouchPoints>0&&window.matchMedia("(any-pointer: coarse)").matches?"trackpad":"direct"}function sr(e){try{localStorage.setItem(Lt,e)}catch{}}const Oe=8,ar=300,cr=450,Nt=18,ir=50,Ue=(e,n)=>Math.max(0,Math.min(e,Math.max(0,n-1)));function lr(e,n,c,a,i={}){const y=new AbortController,u=i.trace?nr(e,n,i.trace):void 0,l=new Map;let g=0,f=0,x=!1,k=!1,v=!1,b=!1,P=0,E=1,h="pending",p=[],j={x:0,y:0},N={x:0,y:0},_,Y=0,S=0,T,R=!0,w,V=!1;const I=()=>{const o=n.size(),d=a.current??={x:o.width/2,y:o.height/2};return d.x=Ue(d.x,o.width),d.y=Ue(d.y,o.height),d};let K;const J=()=>{const o=n.size();if((!K||K.width!==o.width||K.height!==o.height)&&(R=!0),!R&&K)return K;const d=n.surface(),C=e.getBoundingClientRect(),$=d.getBoundingClientRect(),D=[];for(let M=d.parentElement;M&&M!==e;M=M.parentElement){const F=getComputedStyle(M),B=/auto|scroll/.test(F.overflowX)?Math.max(0,M.scrollWidth-M.clientWidth):0,oe=/auto|scroll/.test(F.overflowY)?Math.max(0,M.scrollHeight-M.clientHeight):0;if(!B&&!oe)continue;const se=M.getBoundingClientRect();D.push({element:M,left:se.left-C.left,top:se.top-C.top,right:se.right-C.left,bottom:se.bottom-C.top,maxX:B,maxY:oe})}return K={...o,left:$.left-C.left,top:$.top-C.top,scaleX:o.width&&$.width?$.width/o.width:1,scaleY:o.height&&$.height?$.height/o.height:1,viewportWidth:C.width,viewportHeight:C.height,clientLeft:C.left,clientTop:C.top,scrollers:D},R=!1,K},ee=(o,d)=>{if(!i.trace)return;const C=K;i.trace.record(o,{mode:i.mode,pointerType:d?.pointerType,pointerId:d?.pointerId,client:d?[d.clientX,d.clientY]:void 0,inputTime:d?.timeStamp,target:a.current?[a.current.x,a.current.y]:null,actual:n.position?.(),buttons:S,fingers:l.size,moved:x,pinching:b,scrolling:v,zoom:i.zoom?.get(),scale:C?[C.scaleX,C.scaleY]:void 0,surface:C?[C.left,C.top,C.width,C.height]:void 0,viewport:C?[C.clientLeft,C.clientTop,C.viewportWidth,C.viewportHeight]:void 0})};i.trace?.record("touchpad-attached",{mode:i.mode,viewOnly:i.viewOnly}),c.hidden=!0;const we=()=>{const o=J(),d=I();if(!o.width||!o.height||b||i.viewOnly)return;let C=o.left+d.x*o.scaleX,$=o.top+d.y*o.scaleY;for(const D of o.scrollers){if(D.maxX){const M=D.element.scrollLeft,F=C<D.left+20?C-D.left-20:C>D.right-20?C-D.right+20:0,B=Math.max(0,Math.min(D.maxX,M+F));M!==B&&(D.element.scrollLeft=B,C-=B-M,o.left-=B-M)}if(D.maxY){const M=D.element.scrollTop,F=$<D.top+20?$-D.top-20:$>D.bottom-20?$-D.bottom+20:0,B=Math.max(0,Math.min(D.maxY,M+F));M!==B&&(D.element.scrollTop=B,$-=B-M,o.top-=B-M)}}},ne=(o=S)=>{if(i.viewOnly)return;const d=I(),C=n.position?.();n.send(Math.round(d.x),Math.round(d.y),o),i.trace?.record("send",{target:[Math.round(d.x),Math.round(d.y)],buttons:o,before:C,after:n.position?.()})},Me=()=>{T=void 0,we();let o=0;for(;Math.abs(Y)>=Nt&&o++<8;){const d=Y>0?16:8;ne(d),ne(0),Y-=Math.sign(Y)*Nt}},Ce=()=>{V||(T??=requestAnimationFrame(Me))},Pe=()=>{T!==void 0&&(cancelAnimationFrame(T),Me())},W=()=>{T!==void 0&&cancelAnimationFrame(T),T=void 0,Y=0},ke=()=>{clearTimeout(w),Pe(),S&&(S=0,ne())},re=o=>{o.cancelable&&o.preventDefault(),o.stopImmediatePropagation()},Q=()=>{const[o,d]=[...l.values()];return{distance:Math.hypot(o.x-d.x,o.y-d.y),x:(o.x+d.x)/2,y:(o.y+d.y)/2}},U=(o=!1)=>{if(V||k||l.size!==2||f!==2)return;const d=Q();if(h==="pending"){const C=[...l.values()].map((B,oe)=>({x:B.x-p[oe].x,y:B.y-p[oe].y})),$=C.map(B=>Math.hypot(B.x,B.y));if(Math.max(...$)<Oe)return;if(!o&&Math.min(...$)<Oe){_??=setTimeout(()=>{_=void 0,U(!0)},ir);return}clearTimeout(_),_=void 0;const D=Math.abs(d.distance-P),M=C[0].x*C[1].x+C[0].y*C[1].y<0,F=Math.min(...$)>=Oe?M:D>Math.max(Math.abs(d.x-j.x),Math.abs(d.y-j.y));h=i.zoom&&D>=Oe&&F?"pinch":i.mode==="direct"&&i.zoom&&i.zoom.get()>1?"pan":"scroll",b=h==="pinch",x=!0,ee("two-finger-classified")}h==="pinch"&&P>0?(i.zoom?.set(E*d.distance/P,d),i.zoom?.pan(d.x-N.x,d.y-N.y),R=!0):h==="pan"?(i.zoom?.pan(d.x-N.x,d.y-N.y),R=!0):Y+=N.y-d.y,N=d,Ce()},te=o=>{const d=J();a.current={x:Ue((o.clientX-d.clientLeft-d.left)/d.scaleX,d.width),y:Ue((o.clientY-d.clientTop-d.top)/d.scaleY,d.height)}},ue=o=>{if(!(o.pointerType!=="touch"&&o.pointerType!=="pen")){re(o),l.size||(R=!0,clearTimeout(_),_=void 0,g=performance.now(),f=0,x=!1,k=!1,v=!1,b=!1,Y=0,i.mode==="direct"?te(o):n.position&&(a.current={...n.position()},I())),l.set(o.pointerId,{x:o.clientX,y:o.clientY,startX:o.clientX,startY:o.clientY}),f=Math.max(f,l.size),ee("down",o);try{e.setPointerCapture(o.pointerId)}catch{}if(clearTimeout(w),l.size===1&&f===1)w=setTimeout(()=>{!V&&l.size===1&&!x&&!k&&(S=1,ne())},cr);else if(ke(),v=!0,l.size===2&&f===2){const d=Q();P=d.distance,E=i.zoom?.get()??1,j=N=d,h="pending",p=[...l.values()].map(({x:C,y:$})=>({x:C,y:$}))}else k=!0,clearTimeout(_),_=void 0}},de=o=>{if(o.pointerType==="mouse")return;const d=l.get(o.pointerId);if(!d)return;re(o);const C=o.clientX-d.x,$=o.clientY-d.y;if(d.x=o.clientX,d.y=o.clientY,ee("move-input",o),Math.hypot(d.x-d.startX,d.y-d.startY)>Oe&&(x=!0,clearTimeout(w)),l.size===2&&!k)U();else if(l.size===1&&!v&&!k){if(i.mode==="direct"){te(o),x&&(S=1),ne(),Ce();return}const D=I(),M=J();D.x+=C/M.scaleX,D.y+=$/M.scaleY,I(),ne(),Ce()}},Ie=o=>{if(!l.has(o.pointerId))return;re(o),ee(o.type,o),clearTimeout(_),_=void 0;const d=S!==0;o.type!=="pointerup"&&(k=!0,W()),ke(),l.delete(o.pointerId);try{e.hasPointerCapture(o.pointerId)&&e.releasePointerCapture(o.pointerId)}catch{}l.size||(Y=0,!k&&!d&&!x&&f<=2&&performance.now()-g<=ar&&(i.mode!=="direct"||f===1)&&(ne(f===2?4:1),ne(0)),ee("gesture-end",o),i.trace?.flush("gesture-end"))},je=()=>{k=!0,W(),clearTimeout(_),_=void 0,ke();const o=[...l.keys()];l.clear(),Y=0;for(const d of o)try{e.hasPointerCapture(d)&&e.releasePointerCapture(d)}catch{}},X={capture:!0,passive:!1,signal:y.signal};e.addEventListener("pointerdown",ue,X),e.addEventListener("pointermove",de,X),e.addEventListener("pointerup",Ie,X),e.addEventListener("pointercancel",Ie,X),e.addEventListener("lostpointercapture",Ie,X);for(const o of["touchstart","touchmove","touchend","touchcancel","contextmenu"])e.addEventListener(o,re,X);const be=()=>{R=!0,Ce()};e.addEventListener("scroll",be,{capture:!0,signal:y.signal}),window.addEventListener("blur",je,{signal:y.signal});const L=()=>{document.hidden&&je()};document.addEventListener("visibilitychange",L,{signal:y.signal});const q=new ResizeObserver(be);return q.observe(e),q.observe(n.surface()),!a.current&&n.position&&(a.current={...n.position()}),we(),()=>{V||(V=!0,ee("touchpad-detached"),y.abort(),je(),q.disconnect(),c.hidden=!0,u?.(),i.trace?.flush("touchpad-detached"))}}function ur(e,n){e=Math.max(1,e||1280),n=Math.max(1,n||800);const c=Math.max(1,640/e,480/n);return{width:Math.max(640,Math.min(2560,Math.round(e*c))),height:Math.max(480,Math.min(1600,Math.round(n*c)))}}const Je="",dr={Enter:"enter",Backspace:"backspace",Delete:"delete",Tab:"tab",ArrowUp:"up",ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right"};function pr({sendText:e,sendKey:n,sendChord:c,commandKey:a=[65515,"MetaLeft"],inputRef:i,onFocusChange:y}){const{t:u}=St(),l=s.useRef(null),g=s.useRef(!1),f=s.useRef(null),x=i??l,k=s.useRef({sendText:e,sendKey:n});k.current={sendText:e,sendKey:n};const[v,b]=s.useState(!1),P=()=>{x.current&&(x.current.value=Je,x.current.setSelectionRange(1,1)),b(!1)},E=()=>{const p=(x.current?.value||"").replace(/^\u200b/,"");p&&k.current.sendText(p),P()},h=()=>{f.current!==null&&(cancelAnimationFrame(f.current),f.current=null),E()};return s.useLayoutEffect(()=>{const p=x.current;p.value=Je,p.setSelectionRange(1,1),p.focus({preventScroll:!0});const j=N=>{if(g.current||N.isComposing)return;const _=N.inputType==="deleteContentBackward"?"backspace":N.inputType==="deleteContentForward"?"delete":["insertLineBreak","insertParagraph"].includes(N.inputType)?"enter":null;if(!_)return;N.preventDefault();const Y=_==="enter"&&f.current!==null;h(),Y||k.current.sendKey(_)};return p.addEventListener("beforeinput",j),()=>{if(p.removeEventListener("beforeinput",j),f.current!==null){cancelAnimationFrame(f.current),f.current=null;const N=p.value.replace(/^\u200b/,"");!g.current&&N&&k.current.sendText(N)}}},[]),t.jsxs("div",{className:"relative shrink-0 border-t border-border bg-surface px-3 py-2",children:[!v&&t.jsx("span",{"aria-hidden":"true",className:"pointer-events-none absolute inset-y-2 left-6 flex items-center text-sm text-muted-foreground",children:u("computer.keyboardPlaceholder")}),t.jsx("input",{ref:x,className:"min-h-11 w-full rounded-md border border-border bg-background px-3 text-base outline-none focus:border-primary","aria-label":u("computer.keyboardInput"),autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",spellCheck:!1,inputMode:"text",enterKeyHint:"enter",maxLength:1025,defaultValue:Je,onChange:p=>{if(b(!!p.target.value.replace(/^\u200b/,"")),g.current||p.nativeEvent.isComposing||f.current!==null)return;p.nativeEvent.inputType==="deleteContentBackward"&&!p.target.value?(k.current.sendKey("backspace"),P()):E()},onCompositionStart:()=>{f.current!==null&&h(),g.current=!0},onCompositionEnd:()=>{g.current=!1,f.current!==null&&cancelAnimationFrame(f.current),f.current=requestAnimationFrame(()=>{f.current=null,E()})},onFocus:()=>y?.(!0),onBlur:()=>{!g.current&&f.current!==null&&h(),y?.(!1)},onKeyDown:p=>{if(g.current||p.nativeEvent.isComposing||p.keyCode===229)return;const j=p.ctrlKey||p.altKey||p.metaKey,N=(p.ctrlKey||p.metaKey)&&!p.altKey&&p.key.toLowerCase()==="v";if(c&&!N&&!p.getModifierState("AltGraph")&&(j||p.shiftKey)){const S={Enter:65293,Backspace:65288,Delete:65535,Tab:65289,ArrowUp:65362,ArrowDown:65364,ArrowLeft:65361,ArrowRight:65363,Home:65360,End:65367,PageUp:65365,PageDown:65366}[p.key]??(j&&p.key.length===1?p.key.toLowerCase().codePointAt(0):void 0);if(S!==void 0){p.preventDefault(),h();const T=[];p.ctrlKey&&T.push([65507,"ControlLeft"]),p.altKey&&T.push([65513,"AltLeft"]),p.metaKey&&!T.some(([R])=>R===a[0])&&T.push(a),p.shiftKey&&T.push([65505,"ShiftLeft"]),T.push([S,p.code||p.key]),c(T);return}}const _=dr[p.key];_&&(p.preventDefault(),h(),k.current.sendKey(_))}})]})}function mr(e){let n=[],c=null;const a=new Map,i=()=>{c=null,n.splice(0,32).forEach(y=>{e(y),y[2]?a.set(y[0],y):a.delete(y[0])}),n.length&&(c=requestAnimationFrame(i))};return{send(y){n.push(...y),c===null&&i()},clear(){c!==null&&cancelAnimationFrame(c),c=null,n=[];const y=[...a.values()].reverse();a.clear();for(const[u,l]of y)try{e([u,l,!1])}catch{}}}}const fr=e=>Math.max(1,Math.min(8,Number.isFinite(e)?e:1));function hr(e,n){let c=1;const a="viewportZoom"in e,i=e,y=()=>a?e.pointerTarget.surface():i._canvas,u=()=>a?e.viewportScroller:i._screen,l=a?void 0:i._updateScale;return l&&(i._updateScale=function(){l.call(i),i._display.scale*=c}),{get:()=>c,set(g,f){const x=fr(g),k=y(),v=u(),b=k.getBoundingClientRect(),P=v.getBoundingClientRect(),E=f??{x:P.left+P.width/2,y:P.top+P.height/2},h={x:(E.x-b.left)/(b.width||1),y:(E.y-b.top)/(b.height||1)};c=x,a?e.viewportZoom=c:i._updateScale();const p=k.getBoundingClientRect();v.scrollLeft+=p.left+h.x*p.width-E.x,v.scrollTop+=p.top+h.y*p.height-E.y,c===1&&(v.scrollLeft=0,v.scrollTop=0),n(c)},pan(g,f){const x=u();x.scrollLeft-=g,x.scrollTop-=f},dispose(){l&&(i._updateScale=l)}}}function gr(e,n){const c=e,a=c._keyboard,i=a._target,y=e.focus,u=document.createElement("textarea");u.tabIndex=-1,u.setAttribute("aria-label","Remote desktop keyboard"),u.autocapitalize="off",u.autocomplete="off",u.spellcheck=!1,Object.assign(u.style,{position:"absolute",left:"0",top:"0",width:"1px",height:"1px",fontSize:"16px",opacity:"0",pointerEvents:"none"}),c._screen.append(u);const l=new AbortController;let g=!1,f=null,x=!1;const k=()=>{c._mouseMoveTimer!==null&&clearTimeout(c._mouseMoveTimer),c._mouseMoveTimer=null,c._mouseButtonMask&&(c._mouseButtonMask=0,c._sendMouse(c._mousePos.x,c._mousePos.y,0))};window.addEventListener("blur",k,{signal:l.signal}),document.addEventListener("visibilitychange",()=>{document.hidden&&(a._allKeysUp(),k())},{signal:l.signal});const v=()=>{f!==null&&cancelAnimationFrame(f),f=null;const b=u.value;u.value="",b&&!e.viewOnly&&n(b)};return u.addEventListener("keydown",b=>{(g||b.isComposing||b.keyCode===229)&&b.stopImmediatePropagation()},{capture:!0,signal:l.signal}),u.addEventListener("compositionstart",()=>{f!==null&&v(),g=!0,a._allKeysUp()},{signal:l.signal}),u.addEventListener("compositionend",()=>{g=!1,f!==null&&cancelAnimationFrame(f),f=requestAnimationFrame(v)},{signal:l.signal}),u.addEventListener("input",b=>{!g&&!b.isComposing&&f===null&&v()},{signal:l.signal}),u.addEventListener("blur",()=>{!g&&f!==null&&v(),a._allKeysUp()},{signal:l.signal}),a.ungrab(),a._target=u,e.viewOnly||a.grab(),e.focus=b=>{!x&&!e.viewOnly&&u.focus(b)},document.activeElement===i&&e.focus({preventScroll:!0}),()=>{x||(x=!0,f!==null&&(g?cancelAnimationFrame(f):v()),k(),l.abort(),a.ungrab(),a._target=i,e.viewOnly||a.grab(),e.focus=y,u.remove())}}function*xr(e){for(const n of e.replace(/\r\n?/g,`
|
|
3
3
|
`)){const c=n.codePointAt(0);yield n===`
|
|
4
|
-
`?65293:n===" "?65289:c<256?c:16777216|c}}const et=1048576;function br(e,n,c){const a=new AbortController;let i=!1,y=-1/0,u=!0;const l=new Set,g=v=>{if(!(v.ctrlKey||v.metaKey)||v.altKey||v.isComposing)return;const b=v.key.toLowerCase();b==="v"?(i=v.shiftKey,l.add(v.code||v.key),v.stopImmediatePropagation()):(b==="c"||b==="x")&&(y=performance.now())},f=v=>{v.preventDefault(),v.stopImmediatePropagation();const b=v.clipboardData;if(!b||!Array.from(b.types).includes("text/plain")){c.failed();return}const P=b.getData("text/plain");if(P.length>et){c.failed();return}try{c.paste(P,i)}catch{c.failed()}i=!1},x=v=>{const b=v.detail?.text;if(typeof b!="string"||b.length>et){c.failed();return}c.receive(b),performance.now()-y<2e3&&(y=-1/0,navigator.clipboard?.writeText?navigator.clipboard.writeText(b).catch(()=>{u&&c.failed()}):c.failed())},k={capture:!0,signal:a.signal};return e.addEventListener("keydown",g,k),e.addEventListener("keyup",v=>{l.delete(v.code||v.key)&&v.stopImmediatePropagation()},k),e.addEventListener("paste",f,k),n.addEventListener("clipboard",x,{signal:a.signal}),n.addEventListener("clipboarderror",c.failed,{signal:a.signal}),window.addEventListener("blur",()=>{l.clear(),i=!1,y=-1/0},{signal:a.signal}),()=>{u=!1,a.abort()}}function yr(){const e=performance.now(),n=e+15*6e4,c=`motion-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;let a=[],i=0,y=0,u=!1,l;const g=f=>{if(clearTimeout(l),l=void 0,!a.length)return;const x=a;a=[];for(let k=0;k<x.length;k+=64)Ft("info","COMPUTER_MOTION_TRACE",{version:2,id:c,sequence:++y,startedAt:performance.timeOrigin+e,reason:f,dropped:k?0:i,samples:x.slice(k,k+64)});i=0};return{record(f,x={}){if(u)return;const k=performance.now()-e;if(performance.now()>=n){g("expired"),u=!0;return}a.length>=8192&&(a.splice(2048,1),i++),a.push([Math.round(k*10)/10,f,x]),clearTimeout(l),l=setTimeout(()=>g("idle"),750)},flush:g,dispose(){u||(u=!0,g("dispose"))}}}const xe="inline-flex min-h-9 items-center justify-center gap-1.5 rounded-md border border-border px-2.5 text-xs hover:bg-surface-2 disabled:opacity-40",be="min-h-11 w-full rounded-md border border-border bg-background px-2 text-sm outline-none focus:border-primary";function Be(e){return/API_NOT_ALLOWED|AUTHORIZATION|revoked|PAIRING/.test(e)?"computer.permission":e.includes("RDP_BACKEND_UNAVAILABLE")?"computer.rdpBackendUnavailable":e.includes("RDP_CERTIFICATE")?"computer.rdpCertificate":e.includes("CREDENTIALS_MISSING")?"computer.loginExpired":e.includes("CREDENTIALS_FAILED")?"computer.loginSaveFailed":e.includes("AUTH_FAILED")?"computer.authFailed":e.includes("RDP_FAILED")?"computer.rdpFailed":e.includes("SCREEN_SHARING_OFF")?"computer.sharingOff":e.includes("PRIVATE_HOST_ONLY")?"computer.privateOnly":e.includes("INVALID_HOST")?"computer.invalidHost":e.includes("TIMEOUT")?"computer.timeout":e.includes("UNREACHABLE")?"computer.unreachable":e.includes("DISCONNECTED")?"computer.disconnected":"computer.failed"}function vr(){const{t:e}=St(),n=s.useMemo(()=>yr(),[]);s.useEffect(()=>(n.record("panel-open",{viewport:[window.innerWidth,window.innerHeight],dpr:window.devicePixelRatio}),n.flush("panel-open"),()=>n.flush("panel-unmounted")),[n]);const[c,a]=s.useState(()=>$e()?.targetPeerId??""),[i,y]=s.useState(null),{preferences:u,change:l,loaded:g,saveState:f,flush:x,retry:k,credentialKeys:v,loginState:b,credentialRequest:P}=Jt(c),E=u.target==="local",h=u[u.target],{host:p,platform:j,protocol:N,port:_,domain:Y,ignoreCert:S,username:T}=h,R=N==="rdp"&&i?.rdpAvailable===!1,{viewOnly:w,fit:V}=u,I=h.rememberLogin&&v.includes(Tt(h)),K=r=>l(m=>({...m,[m.target]:{...m[m.target],...r}})),J=r=>K({username:r}),ee=r=>K({domain:r}),we=r=>{K({ignoreCert:r}),x()},ne=r=>K({port:r}),Me=r=>{r&&(ye.current(),ze.clear(),W(null)),l(m=>({...m,viewOnly:r})),x()},[Ce,Pe]=s.useState(!1),q=tr(j),ke=j==="mac"?"⌘V":"Ctrl+V",[re,Q]=s.useState(""),[U,te]=s.useState("idle"),[de,pe]=s.useState(null),[Ie,je]=s.useState(""),[X,oe]=s.useState(!1),[L,W]=s.useState(null),o=s.useRef(null),[d,C]=s.useState(!1),[$,D]=s.useState(!1),M=s.useRef(0),[F,B]=s.useState(()=>navigator.maxTouchPoints>0||window.innerWidth<=640);s.useEffect(()=>{const r=()=>B(navigator.maxTouchPoints>0||window.innerWidth<=640);return window.addEventListener("resize",r),()=>window.removeEventListener("resize",r)},[]);const se=L==="keyboard"&&d&&(!F||!window.visualViewport||$),[ae,tt]=s.useState(1),ce=s.useRef(null),rt=s.useRef(null),[Ee,nt]=s.useState(""),[At,Ne]=s.useState(!1),[He,ot]=s.useState(null),[_t,ie]=s.useState(!1),[Rt,Ye]=s.useState(!1),[Mt,Pt]=s.useState(!1),[me,It]=s.useState(or),st=s.useRef(null),at=s.useRef(null),ye=s.useRef(()=>{}),De=s.useRef(()=>{}),[ct,Dt]=s.useState(qe),Ae=s.useRef(!1),ve=s.useRef(""),it=s.useRef(()=>{}),lt=s.useRef(null),Fe=s.useRef(null),fe=s.useMemo(()=>{const r=document.createElement("div");return r.className="h-full w-full min-h-0 overflow-hidden",r},[]),O=s.useRef(null),ut=s.useRef(!1);ut.current=U==="connected"&&!w;const ze=s.useMemo(()=>mr(([r,m,z])=>O.current?.sendKey(r,m,z)),[]),Xe=s.useRef(null),he=s.useRef(0),We=s.useRef(void 0),le=s.useCallback(()=>{ye.current(),De.current(),ce.current?.dispose(),ce.current=null,ze.clear(),at.current=null,he.current++,clearTimeout(We.current);const r=O.current;O.current=null,r?.disconnect(),Xe.current?.close(),Xe.current=null,fe.replaceChildren()},[fe,ze]);s.useLayoutEffect(()=>(Fe.current?.appendChild(fe),()=>{fe.remove()}),[fe,X]),s.useEffect(()=>()=>le(),[le]),s.useEffect(()=>{const r=()=>{const m=qe();Dt(m),!m&&(Ae.current=!1,ve.current="",le(),te("idle"),Q(""),oe(!1),W(null))};return window.addEventListener(yt,r),()=>window.removeEventListener(yt,r)},[le]),s.useEffect(()=>{const r=()=>a($e()?.targetPeerId??"");return window.addEventListener(vt,r),()=>window.removeEventListener(vt,r)},[]),s.useEffect(()=>{le(),Ae.current=!1,ve.current="",te("idle"),pe(null),Q(""),y(null),oe(!1),W(null),Pe(!1),je(""),nt(""),Ne(!1);const r=new AbortController;return fetch("/api/computer/status",{signal:r.signal}).then(async m=>{if(!m.ok)throw new Error(m.status===403?"API_NOT_ALLOWED":"COMPUTER_FAILED");return await m.json()}).then(m=>{r.signal.aborted||y(m)}).catch(m=>{r.signal.aborted||pe(Be(String(m)))}),()=>{r.abort(),le()}},[c,le]),s.useEffect(()=>{w&&De.current(),O.current&&(O.current.viewOnly=w)},[w]),s.useEffect(()=>{O.current&&(O.current.scaleViewport=V)},[V]),s.useEffect(()=>{O.current&&"pauseResize"in O.current&&(O.current.pauseResize=!!L)},[L]),s.useEffect(()=>{const r=O.current;r&&("keyboardActive"in r?r.keyboardActive=L==="keyboard":r.focusOnClick=L!=="keyboard")},[L]);const dt=r=>{r===E||Z||!g||(Q(""),pe(null),l(m=>({...m,target:r?"local":"remote"})),x())},pt=()=>{Ae.current=!0,ve.current="",le(),te("idle"),Q(""),oe(!1),W(null),Ne(!1)},mt=async r=>{if(r?.preventDefault(),R)return;if(Ae.current=!0,U==="credentials"&&O.current&&"sendCredentials"in O.current){ve.current=re,O.current.sendCredentials({username:T,password:re}),te("connecting");return}if(!qe()||!g||!re&&!I)return;x(),ot(null),ie(!1),Ye(!1),le(),pe(null),je(""),te("connecting"),Ne(!1);const m=he.current,z=H=>{m===he.current&&(le(),te("error"),pe(H),W(null),ve.current="",(H==="computer.authFailed"||H==="computer.permission"||H==="computer.loginExpired")&&Q(""),I&&(H==="computer.authFailed"||H==="computer.loginExpired")&&P("forget",h).catch(()=>{}))};We.current=setTimeout(()=>z("computer.timeout"),6e4);try{let H=re||await P("use",h);if(m!==he.current)return;ve.current=H||"";let G;if(N==="rdp"){const{RdpSession:ue}=await wt(async()=>{const{RdpSession:Le}=await import("./rdpSession-C0jVZfFV.js");return{RdpSession:Le}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]));if(m!==he.current)return;document.activeElement?.blur?.(),Ze.flushSync(()=>{te("connecting"),window.innerWidth<=640&&oe(!0)});const Se=Fe.current?.getBoundingClientRect(),Te=ur(Se?.width||1280,Se?.height||800);G=new ue(fe,{host:p.trim(),port:Number(_),username:T.trim(),password:H||"",domain:Y.trim(),ignoreCert:S,...Te},Le=>z(Be(Le)),n)}else{const{default:ue}=await wt(async()=>{const{default:Le}=await import("./rfb-CxsXsMUX.js");return{default:Le}},[]);if(m!==he.current)return;const Se=new Qt(p.trim(),Le=>z(Be(Le)));Xe.current=Se;const Te=new ue(fe,Se,{shared:!0,credentials:{username:T.trim()||void 0,password:H}});Te.background="var(--chrome-bg)",Te.resizeSession=!1,Te.qualityLevel=6,Te.compressionLevel=2,G=Te}H=void 0,O.current=G,G.scaleViewport=V,G.viewOnly=w,G.addEventListener("connect",()=>{if(m!==he.current)return;clearTimeout(We.current),te("connected"),Q(""),window.innerWidth<=640&&(document.activeElement?.blur?.(),oe(!0));const ue=ve.current;ve.current="",h.rememberLogin&&ue&&P("save",h,ue).catch(()=>{})}),G.addEventListener("credentialsrequired",ue=>{if(m!==he.current)return;const Se=ue.detail.types;Pt(Se.includes("username")),te("credentials")}),G.addEventListener("securityfailure",()=>z("computer.authFailed")),G.addEventListener("disconnect",()=>z("computer.disconnected")),G.addEventListener("desktopname",ue=>{m===he.current&&je(ue.detail.name)})}catch(H){z(Be(String(H)))}},ge=r=>{const m=O.current;!m||U!=="connected"||w||(L==="keyboard"?o.current?.focus({preventScroll:!0}):L!=="clipboard"&&!F&&m.focus?.({preventScroll:!0}),ze.send([...r.map(([z,H])=>[z,H,!0]),...[...r].reverse().map(([z,H])=>[z,H,!1])]))},A=U==="connected",Z=U==="connecting"||U==="credentials",Ke=A||U==="connecting";s.useEffect(()=>{const r=O.current;if(!A||!r||!("viewportZoom"in r)&&!("_display"in r))return;const m=hr(r,tt);return ce.current=m,tt(1),()=>{m.dispose(),ce.current===m&&(ce.current=null)}},[A]),s.useEffect(()=>{const r=O.current,m=Fe.current,z=st.current;if(!A||L&&L!=="keyboard"||me!=="trackpad"&&!(navigator.maxTouchPoints>0)||!r||!m||!z)return;const H="pointerTarget"in r?r.pointerTarget:rr(r),G=lr(m,H,z,at,{mode:me,zoom:ce.current??void 0,viewOnly:w,trace:n});return ye.current=G,()=>{G(),ye.current===G&&(ye.current=()=>{})}},[A,w,me,X,L,n]),s.useEffect(()=>{const r=O.current;if(!(!A||w||!r))return br(fe,r,{paste:(m,z)=>{r.clipboardPasteFrom(m),ge(z?[...q.paste.slice(0,1),[65505,"ShiftLeft"],...q.paste.slice(1)]:q.paste),Ne(!0),ie(!1)},receive:m=>{ot(m),Ye(!1)},failed:()=>{ie(!0),W("clipboard")}})},[A,w,j,fe]),s.useEffect(()=>{const r=O.current;if(!A||w||!r||"pointerTarget"in r||!("_keyboard"in r))return;const m=gr(r,gt);return De.current=m,()=>{m(),De.current===m&&(De.current=()=>{})}},[A,w]);const ft=r=>{r!==me&&(ye.current(),It(r),sr(r))};it.current=()=>{mt()},s.useEffect(()=>{ct&&g&&i&&!R&&u.autoConnect&&I&&U==="idle"&&!Ae.current&&it.current()},[ct,g,i,R,u.autoConnect,I,U]);const ht=()=>{Ae.current=!0,P("forget",h).catch(()=>{})},_e=r=>{if(r==="keyboard"){if(L==="keyboard"&&!se){o.current?.blur(),o.current?.focus({preventScroll:!0});return}ye.current(),M.current=window.visualViewport?.height??window.innerHeight,Ze.flushSync(()=>{C(!1),D(!1),W(m=>m===r?null:r)})}else ye.current(),W(m=>m===r?null:r)},zt=()=>{ce.current?.set(1),l(r=>({...r,fit:!0})),x()},gt=r=>{if(!O.current||!ut.current)return;const m=[];for(const z of xr(r))m.push([z,null,!0],[z,null,!1]);ze.send(m)};s.useEffect(()=>{if(!A||L!=="keyboard"&&L!=="clipboard"||!window.visualViewport)return;const r=window.visualViewport,m=rt.current,z=()=>{L==="keyboard"&&D(d&&M.current-r.height>100),X&&m&&r.height>=160&&(m.style.height=`${r.height}px`,m.style.top=`${r.offsetTop}px`)};return z(),r.addEventListener("resize",z),r.addEventListener("scroll",z),()=>{r.removeEventListener("resize",z),r.removeEventListener("scroll",z),m&&(m.style.height="",m.style.top="")}},[A,L,X,d]);const xt=t.jsxs("div",{className:"flex shrink-0 items-center text-xs",role:"group","aria-label":e("computer.desktopZoom"),title:F?e("computer.pinchHint"):void 0,children:[t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center","aria-label":e("computer.zoomOut"),disabled:!A||ae<=1,onPointerDown:r=>r.preventDefault(),onClick:()=>ce.current?.set(ae/1.25),children:t.jsx(Gt,{size:16})}),t.jsxs("button",{type:"button",className:"min-h-11 min-w-11","aria-label":e("computer.resetZoom"),disabled:!A,onPointerDown:r=>r.preventDefault(),onClick:zt,children:[Math.round(ae*100),"%"]}),t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center","aria-label":e("computer.zoomIn"),disabled:!A||ae>=8,onPointerDown:r=>r.preventDefault(),onClick:()=>ce.current?.set(ae*1.25),children:t.jsx(qt,{size:16})}),F&&t.jsx("span",{className:"hidden pr-2 text-[10px] text-muted-foreground sm:inline",children:e("computer.pinchHint")})]}),Re=`flex shrink-0 items-center justify-center rounded-md hover:bg-surface-2 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary ${F?"min-h-11 min-w-11":"h-8 min-w-8"}`,bt=t.jsxs("div",{ref:rt,className:`flex min-h-0 flex-col bg-surface text-foreground ${X?"fixed inset-0 z-modal-panel h-dvh pb-[env(safe-area-inset-bottom)] pt-[env(safe-area-inset-top)]":"relative h-full"}`,role:X?"dialog":void 0,"aria-modal":X||void 0,"aria-label":e("computer.title"),onKeyDown:r=>{r.stopPropagation(),r.key==="Escape"&&!r.nativeEvent.isComposing&&L&&(r.preventDefault(),W(null))},onKeyUp:r=>r.stopPropagation(),children:[t.jsxs("div",{className:`relative z-30 flex shrink-0 items-center gap-2 border-b border-border bg-surface px-2 ${F?"min-h-12":"min-h-8"}`,children:[X&&t.jsx("button",{type:"button",className:Re,onClick:()=>{oe(!1),W(null)},"aria-label":e("computer.exitFullscreen"),children:t.jsx(Ut,{size:20})}),t.jsx(Kt,{size:16,className:"shrink-0 text-muted-foreground"}),t.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",children:A&&(Ie||(E?i?.hostname||$e()?.serviceName:p))||e("computer.title")}),A&&t.jsx("span",{className:"text-[11px] text-primary",children:e("computer.connected")}),A&&b==="error"&&t.jsx("span",{role:"alert",className:"text-[11px] text-destructive",children:e("computer.loginSaveFailed")}),A&&f==="saving"&&t.jsx("span",{role:"status","aria-label":e("computer.settingsSaving"),title:e("computer.settingsSaving"),children:t.jsx(Ct,{size:12,className:"animate-spin text-muted-foreground"})}),A&&f==="error"&&t.jsxs("button",{type:"button",className:xe,title:e("computer.settingsSaveFailed"),"aria-label":e("computer.settingsSaveFailed"),onClick:k,children:["! ",e("computer.retry")]}),Z&&t.jsxs("button",{type:"button",className:`${Re} gap-1 px-1 text-xs`,onClick:pt,children:[t.jsx(kt,{size:14}),e("computer.cancel")]}),A&&!F&&L==="keyboard"&&t.jsx("button",{type:"button",className:Re,onClick:()=>_e("keyboard"),"aria-label":e("computer.keyboard"),"aria-pressed":se,children:t.jsx(Ge,{size:18})}),A&&!F&&t.jsx("button",{type:"button",className:`${Re} ${L==="clipboard"?"bg-surface-2 text-primary":""}`,disabled:w,onClick:()=>_e("clipboard"),"aria-label":e("computer.clipboardTool"),title:e("computer.clipboardTool"),"aria-pressed":L==="clipboard",children:t.jsx(jt,{size:18})}),A&&!X&&t.jsxs("button",{type:"button",className:`${Re} gap-1 px-1 text-xs`,onClick:()=>oe(!0),"aria-label":e("computer.fullscreen"),children:[t.jsx(Bt,{size:16}),e("computer.expand")]}),A&&t.jsx("button",{type:"button",className:Re,onClick:()=>_e("tools"),"aria-label":e("computer.tools"),"aria-expanded":L==="tools",children:t.jsx(Xt,{size:18})})]}),!Ke&&t.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto p-4 sm:p-6",children:t.jsxs("div",{className:"mx-auto w-full max-w-md",children:[t.jsxs("form",{className:"space-y-3",onSubmit:r=>{mt(r)},children:[t.jsxs("div",{className:"grid grid-cols-2 gap-1 rounded-lg bg-background p-1",role:"group","aria-label":e("computer.target"),children:[t.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${E?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":E,disabled:Z||!i||!g,onClick:()=>dt(!0),children:e("computer.thisComputer")}),t.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${E?"text-muted-foreground hover:bg-surface":"bg-surface-2 text-foreground"}`,"aria-pressed":!E,disabled:Z||!g,onClick:()=>dt(!1),children:e("computer.otherComputer")})]}),E?t.jsx("p",{className:"text-xs leading-relaxed text-muted-foreground",role:"status",children:i?e("computer.localService",{name:$e()?.serviceName||i.hostname}):e("computer.loading")}):t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e("computer.host")}),t.jsx("input",{className:be,value:p,disabled:Z||!g,onChange:r=>{K({host:r.target.value,domain:"",ignoreCert:!1}),Q(""),pe(null)},placeholder:e("computer.hostPlaceholder"),onBlur:()=>{x()},autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,required:!0,maxLength:253})]}),t.jsxs("p",{className:"text-xs text-muted-foreground",children:[j==="mac"?"macOS":j==="linux"?"Ubuntu / Linux":"Windows"," · ",N.toUpperCase()," · ",N==="rdp"?_||"3389":"5900",w?` · ${e("computer.viewOnly")}`:""]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e(N==="rdp"?"computer.rdpUsername":"computer.username")}),t.jsx("input",{className:be,value:T,disabled:!g,onChange:r=>J(r.target.value),onBlur:()=>{x()},autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",required:N==="rdp"||U==="credentials"&&Mt,maxLength:255})]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e("computer.password")}),t.jsx("input",{className:be,type:"password",value:re,disabled:!g,onChange:r=>Q(r.target.value),placeholder:I&&U!=="credentials"?e("computer.savedPassword"):void 0,autoComplete:"new-password",required:!I||U==="credentials",maxLength:1024})]}),t.jsx("p",{className:"text-[11px] leading-relaxed text-muted-foreground",children:e(N==="rdp"?"computer.rdpLoginHint":"computer.vncLoginHint")}),t.jsxs("div",{className:"flex min-h-11 items-center justify-between gap-2 text-xs",children:[t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:h.rememberLogin,disabled:Z||!g||b==="saving",onChange:r=>{const m=r.target.checked;K({rememberLogin:m}),!m&&I?P("forget",{...h,rememberLogin:m}).catch(()=>{}):x()}}),e("computer.rememberLogin")]}),I&&t.jsx("button",{type:"button",className:"min-h-11 text-muted-foreground underline",disabled:Z||b==="saving",onClick:ht,children:e("computer.forgetLogin")})]}),b==="error"&&!de&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e("computer.loginSaveFailed")}),R&&t.jsxs("div",{role:"status",className:"space-y-1 text-xs leading-relaxed text-muted-foreground",children:[t.jsx("p",{children:e("computer.rdpBackendUnavailable")}),t.jsx("p",{children:e("computer.rdpBackendRecovery")})]}),U==="credentials"&&t.jsx("p",{className:"text-xs text-primary",children:e("computer.credentials")}),de&&t.jsxs("div",{role:"alert",className:"rounded-md bg-surface-2 p-3 text-xs leading-relaxed text-destructive",children:[e(de),de==="computer.rdpCertificate"&&t.jsxs("label",{className:"mt-1 flex min-h-11 items-center gap-2 text-foreground",children:[t.jsx("input",{type:"checkbox",checked:S,onChange:r=>we(r.target.checked)}),e("computer.trustCertificateHere")]}),U==="error"&&de!=="computer.rdpCertificate"&&t.jsx("button",{type:"button",className:"mt-1 block min-h-9 text-foreground underline",onClick:()=>{Pe(!0),requestAnimationFrame(()=>lt.current?.scrollIntoView?.({block:"nearest",behavior:"smooth"}))},children:e("computer.checkSettings")})]}),t.jsx("button",{type:"submit",className:"inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-md bg-primary px-3 text-sm font-medium text-primary-foreground disabled:opacity-40",disabled:!g||R||b==="saving"||E&&!i||!p.trim()||!re&&(!I||U==="credentials")||N==="rdp"&&(!T.trim()||!Number.isInteger(Number(_))||Number(_)<1||Number(_)>65535),children:e(U==="credentials"?"computer.authenticate":U==="error"?"computer.retryConnect":"computer.connect")}),t.jsxs("details",{ref:lt,className:"border-b border-border text-xs",open:Ce,onToggle:r=>Pe(r.currentTarget.open),children:[t.jsxs("summary",{className:"flex min-h-11 cursor-pointer list-none items-center justify-between text-muted-foreground",children:[t.jsx("span",{children:e("computer.advanced")}),t.jsx("span",{"aria-hidden":"true",children:Ce?"−":"+"})]}),t.jsxs("div",{className:"space-y-3 pb-4",children:[t.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.platform")}),t.jsxs("select",{className:be,value:j,disabled:Z||!g,onChange:r=>{er(r.target.value)&&K({platform:r.target.value,protocol:r.target.value==="mac"?"vnc":"rdp",ignoreCert:!1}),Q(""),x()},children:[t.jsx("option",{value:"mac",children:"macOS"}),t.jsx("option",{value:"linux",children:"Ubuntu / Linux"}),t.jsx("option",{value:"windows",children:"Windows"})]})]}),t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.protocol")}),t.jsxs("select",{className:be,value:N,disabled:Z||!g,onChange:r=>{K({protocol:r.target.value==="rdp"?"rdp":"vnc"}),Q(""),pe(null),x()},children:[t.jsx("option",{value:"rdp",children:"RDP"}),t.jsx("option",{value:"vnc",children:"VNC"})]})]})]}),N==="rdp"&&t.jsxs(t.Fragment,{children:[t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.port")}),t.jsx("input",{className:be,type:"number",min:1,max:65535,step:1,value:_,disabled:Z||!g,onBlur:()=>{x()},onChange:r=>ne(r.target.value)})]}),t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.domain")}),t.jsx("input",{className:be,value:Y,disabled:Z||!g,onBlur:()=>{x()},onChange:r=>ee(r.target.value),autoComplete:"off",maxLength:255})]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:S,disabled:Z||!g,onChange:r=>we(r.target.checked)}),e("computer.trustCertificate")]})]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:w,disabled:Z||!g,onChange:r=>Me(r.target.checked)}),e("computer.viewOnly")]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:u.autoConnect,disabled:Z||!g,onChange:r=>{l(m=>({...m,autoConnect:r.target.checked})),x()}}),e("computer.autoConnect")]})]})]})]}),t.jsxs("p",{role:"status",className:"mt-2 text-[11px] leading-relaxed text-muted-foreground",children:[e(f==="saved"?"computer.settingsSaved":f==="error"?g?"computer.settingsSaveFailed":"computer.settingsLoadFailed":f==="loading"?"computer.settingsLoading":"computer.settingsSaving"),f==="error"&&t.jsx("button",{type:"button",className:"ml-2 min-h-9 text-primary underline",onClick:k,children:e("computer.retry")})]}),t.jsxs("details",{className:"text-xs",children:[t.jsx("summary",{className:"flex min-h-11 cursor-pointer items-center text-muted-foreground",children:e("computer.setup")}),t.jsxs("ol",{className:"ml-4 list-decimal space-y-2 pt-2 leading-relaxed text-muted-foreground",children:[t.jsx("li",{children:e(N==="rdp"?j==="linux"?"computer.rdpLinuxStep1":"computer.rdpStep1":j==="mac"?"computer.step1":j==="linux"?"computer.linuxStep1":"computer.windowsStep1")}),t.jsx("li",{children:e(N==="rdp"?"computer.rdpStep2":j==="mac"?"computer.step2":j==="linux"?"computer.linuxStep2":"computer.windowsStep2")}),t.jsx("li",{children:e("computer.step3")})]}),N==="vnc"&&j==="linux"&&t.jsxs(t.Fragment,{children:[t.jsx("p",{className:"mt-3 leading-relaxed text-muted-foreground",children:e("computer.linuxCommandHint")}),t.jsx("pre",{className:"mt-2 overflow-x-auto rounded-md bg-background p-2 text-[11px]",children:t.jsx("code",{children:`sudo apt install x11vnc
|
|
4
|
+
`?65293:n===" "?65289:c<256?c:16777216|c}}const et=1048576;function br(e,n,c){const a=new AbortController;let i=!1,y=-1/0,u=!0;const l=new Set,g=v=>{if(!(v.ctrlKey||v.metaKey)||v.altKey||v.isComposing)return;const b=v.key.toLowerCase();b==="v"?(i=v.shiftKey,l.add(v.code||v.key),v.stopImmediatePropagation()):(b==="c"||b==="x")&&(y=performance.now())},f=v=>{v.preventDefault(),v.stopImmediatePropagation();const b=v.clipboardData;if(!b||!Array.from(b.types).includes("text/plain")){c.failed();return}const P=b.getData("text/plain");if(P.length>et){c.failed();return}try{c.paste(P,i)}catch{c.failed()}i=!1},x=v=>{const b=v.detail?.text;if(typeof b!="string"||b.length>et){c.failed();return}c.receive(b),performance.now()-y<2e3&&(y=-1/0,navigator.clipboard?.writeText?navigator.clipboard.writeText(b).catch(()=>{u&&c.failed()}):c.failed())},k={capture:!0,signal:a.signal};return e.addEventListener("keydown",g,k),e.addEventListener("keyup",v=>{l.delete(v.code||v.key)&&v.stopImmediatePropagation()},k),e.addEventListener("paste",f,k),n.addEventListener("clipboard",x,{signal:a.signal}),n.addEventListener("clipboarderror",c.failed,{signal:a.signal}),window.addEventListener("blur",()=>{l.clear(),i=!1,y=-1/0},{signal:a.signal}),()=>{u=!1,a.abort()}}function yr(){const e=performance.now(),n=e+15*6e4,c=`motion-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;let a=[],i=0,y=0,u=!1,l;const g=f=>{if(clearTimeout(l),l=void 0,!a.length)return;const x=a;a=[];for(let k=0;k<x.length;k+=64)Ft("info","COMPUTER_MOTION_TRACE",{version:2,id:c,sequence:++y,startedAt:performance.timeOrigin+e,reason:f,dropped:k?0:i,samples:x.slice(k,k+64)});i=0};return{record(f,x={}){if(u)return;const k=performance.now()-e;if(performance.now()>=n){g("expired"),u=!0;return}a.length>=8192&&(a.splice(2048,1),i++),a.push([Math.round(k*10)/10,f,x]),clearTimeout(l),l=setTimeout(()=>g("idle"),750)},flush:g,dispose(){u||(u=!0,g("dispose"))}}}const ge="inline-flex min-h-9 items-center justify-center gap-1.5 rounded-md border border-border px-2.5 text-xs hover:bg-surface-2 disabled:opacity-40",xe="min-h-11 w-full rounded-md border border-border bg-background px-2 text-sm outline-none focus:border-primary";function Be(e){return/API_NOT_ALLOWED|AUTHORIZATION|revoked|PAIRING/.test(e)?"computer.permission":e.includes("RDP_BACKEND_UNAVAILABLE")?"computer.rdpBackendUnavailable":e.includes("RDP_CERTIFICATE")?"computer.rdpCertificate":e.includes("CREDENTIALS_MISSING")?"computer.loginExpired":e.includes("CREDENTIALS_FAILED")?"computer.loginSaveFailed":e.includes("AUTH_FAILED")?"computer.authFailed":e.includes("RDP_FAILED")?"computer.rdpFailed":e.includes("SCREEN_SHARING_OFF")?"computer.sharingOff":e.includes("PRIVATE_HOST_ONLY")?"computer.privateOnly":e.includes("INVALID_HOST")?"computer.invalidHost":e.includes("TIMEOUT")?"computer.timeout":e.includes("UNREACHABLE")?"computer.unreachable":e.includes("DISCONNECTED")?"computer.disconnected":"computer.failed"}function vr(){const{t:e}=St(),n=s.useMemo(()=>yr(),[]);s.useEffect(()=>(n.record("panel-open",{viewport:[window.innerWidth,window.innerHeight],dpr:window.devicePixelRatio}),n.flush("panel-open"),()=>n.flush("panel-unmounted")),[n]);const[c,a]=s.useState(()=>$e()?.targetPeerId??""),[i,y]=s.useState(null),{preferences:u,change:l,loaded:g,saveState:f,flush:x,retry:k,credentialKeys:v,loginState:b,credentialRequest:P}=Jt(c),E=u.target==="local",h=u[u.target],{host:p,platform:j,protocol:N,port:_,domain:Y,ignoreCert:S,username:T}=h,R=N==="rdp"&&i?.rdpAvailable===!1,{viewOnly:w,fit:V}=u,I=h.rememberLogin&&v.includes(Tt(h)),K=r=>l(m=>({...m,[m.target]:{...m[m.target],...r}})),J=r=>K({username:r}),ee=r=>K({domain:r}),we=r=>{K({ignoreCert:r}),x()},ne=r=>K({port:r}),Me=r=>{r&&(ye.current(),ze.clear(),q(null)),l(m=>({...m,viewOnly:r})),x()},[Ce,Pe]=s.useState(!1),W=tr(j),ke=j==="mac"?"⌘V":"Ctrl+V",[re,Q]=s.useState(""),[U,te]=s.useState("idle"),[ue,de]=s.useState(null),[Ie,je]=s.useState(""),[X,be]=s.useState(!1),[L,q]=s.useState(null),o=s.useRef(null),[d,C]=s.useState(!1),[$,D]=s.useState(!1),M=s.useRef(0),[F,B]=s.useState(()=>navigator.maxTouchPoints>0||window.innerWidth<=640);s.useEffect(()=>{const r=()=>B(navigator.maxTouchPoints>0||window.innerWidth<=640);return window.addEventListener("resize",r),()=>window.removeEventListener("resize",r)},[]);const oe=L==="keyboard"&&d&&(!F||!window.visualViewport||$),[se,tt]=s.useState(1),ae=s.useRef(null),rt=s.useRef(null),[Ee,nt]=s.useState(""),[At,Ne]=s.useState(!1),[He,ot]=s.useState(null),[_t,ce]=s.useState(!1),[Rt,Ye]=s.useState(!1),[Mt,Pt]=s.useState(!1),[pe,It]=s.useState(or),st=s.useRef(null),at=s.useRef(null),ye=s.useRef(()=>{}),De=s.useRef(()=>{}),[ct,Dt]=s.useState(We),Ae=s.useRef(!1),ve=s.useRef(""),it=s.useRef(()=>{}),lt=s.useRef(null),Fe=s.useRef(null),me=s.useMemo(()=>{const r=document.createElement("div");return r.className="h-full w-full min-h-0 overflow-hidden",r},[]),O=s.useRef(null),ut=s.useRef(!1);ut.current=U==="connected"&&!w;const ze=s.useMemo(()=>mr(([r,m,z])=>O.current?.sendKey(r,m,z)),[]),Xe=s.useRef(null),fe=s.useRef(0),qe=s.useRef(void 0),ie=s.useCallback(()=>{ye.current(),De.current(),ae.current?.dispose(),ae.current=null,ze.clear(),at.current=null,fe.current++,clearTimeout(qe.current);const r=O.current;O.current=null,r?.disconnect(),Xe.current?.close(),Xe.current=null,me.replaceChildren()},[me,ze]);s.useLayoutEffect(()=>(Fe.current?.appendChild(me),()=>{me.remove()}),[me,X]),s.useEffect(()=>()=>ie(),[ie]),s.useEffect(()=>{const r=()=>{const m=We();Dt(m),!m&&(Ae.current=!1,ve.current="",ie(),te("idle"),Q(""),be(!1),q(null))};return window.addEventListener(yt,r),()=>window.removeEventListener(yt,r)},[ie]),s.useEffect(()=>{const r=()=>a($e()?.targetPeerId??"");return window.addEventListener(vt,r),()=>window.removeEventListener(vt,r)},[]),s.useEffect(()=>{ie(),Ae.current=!1,ve.current="",te("idle"),de(null),Q(""),y(null),be(!1),q(null),Pe(!1),je(""),nt(""),Ne(!1);const r=new AbortController;return fetch("/api/computer/status",{signal:r.signal}).then(async m=>{if(!m.ok)throw new Error(m.status===403?"API_NOT_ALLOWED":"COMPUTER_FAILED");return await m.json()}).then(m=>{r.signal.aborted||y(m)}).catch(m=>{r.signal.aborted||de(Be(String(m)))}),()=>{r.abort(),ie()}},[c,ie]),s.useEffect(()=>{w&&De.current(),O.current&&(O.current.viewOnly=w)},[w]),s.useEffect(()=>{O.current&&(O.current.scaleViewport=V)},[V]),s.useEffect(()=>{O.current&&"pauseResize"in O.current&&(O.current.pauseResize=!!L)},[L]),s.useEffect(()=>{const r=O.current;r&&("keyboardActive"in r?r.keyboardActive=L==="keyboard":r.focusOnClick=L!=="keyboard")},[L]);const dt=r=>{r===E||Z||!g||(Q(""),de(null),l(m=>({...m,target:r?"local":"remote"})),x())},pt=()=>{Ae.current=!0,ve.current="",ie(),te("idle"),Q(""),be(!1),q(null),Ne(!1)},mt=async r=>{if(r?.preventDefault(),R)return;if(Ae.current=!0,U==="credentials"&&O.current&&"sendCredentials"in O.current){ve.current=re,O.current.sendCredentials({username:T,password:re}),te("connecting");return}if(!We()||!g||!re&&!I)return;x(),ot(null),ce(!1),Ye(!1),ie(),de(null),je(""),te("connecting"),Ne(!1);const m=fe.current,z=H=>{m===fe.current&&(ie(),te("error"),de(H),q(null),ve.current="",(H==="computer.authFailed"||H==="computer.permission"||H==="computer.loginExpired")&&Q(""),I&&(H==="computer.authFailed"||H==="computer.loginExpired")&&P("forget",h).catch(()=>{}))};qe.current=setTimeout(()=>z("computer.timeout"),6e4);try{let H=re||await P("use",h);if(m!==fe.current)return;ve.current=H||"";let G;if(N==="rdp"){const{RdpSession:le}=await wt(async()=>{const{RdpSession:Le}=await import("./rdpSession-_Wi6QGVy.js");return{RdpSession:Le}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]));if(m!==fe.current)return;document.activeElement?.blur?.(),Ze.flushSync(()=>{te("connecting")});const Se=Fe.current?.getBoundingClientRect(),Te=ur(Se?.width||1280,Se?.height||800);G=new le(me,{host:p.trim(),port:Number(_),username:T.trim(),password:H||"",domain:Y.trim(),ignoreCert:S,...Te},Le=>z(Be(Le)),n)}else{const{default:le}=await wt(async()=>{const{default:Le}=await import("./rfb-CxsXsMUX.js");return{default:Le}},[]);if(m!==fe.current)return;const Se=new Qt(p.trim(),Le=>z(Be(Le)));Xe.current=Se;const Te=new le(me,Se,{shared:!0,credentials:{username:T.trim()||void 0,password:H}});Te.background="var(--chrome-bg)",Te.resizeSession=!1,Te.qualityLevel=6,Te.compressionLevel=2,G=Te}H=void 0,O.current=G,G.scaleViewport=V,G.viewOnly=w,G.addEventListener("connect",()=>{if(m!==fe.current)return;clearTimeout(qe.current),te("connected"),Q(""),window.innerWidth<=640&&document.activeElement?.blur?.();const le=ve.current;ve.current="",h.rememberLogin&&le&&P("save",h,le).catch(()=>{})}),G.addEventListener("credentialsrequired",le=>{if(m!==fe.current)return;const Se=le.detail.types;Pt(Se.includes("username")),te("credentials")}),G.addEventListener("securityfailure",()=>z("computer.authFailed")),G.addEventListener("disconnect",()=>z("computer.disconnected")),G.addEventListener("desktopname",le=>{m===fe.current&&je(le.detail.name)})}catch(H){z(Be(String(H)))}},he=r=>{const m=O.current;!m||U!=="connected"||w||(L==="keyboard"?o.current?.focus({preventScroll:!0}):L!=="clipboard"&&!F&&m.focus?.({preventScroll:!0}),ze.send([...r.map(([z,H])=>[z,H,!0]),...[...r].reverse().map(([z,H])=>[z,H,!1])]))},A=U==="connected",Z=U==="connecting"||U==="credentials",Ke=A||U==="connecting";s.useEffect(()=>{const r=O.current;if(!A||!r||!("viewportZoom"in r)&&!("_display"in r))return;const m=hr(r,tt);return ae.current=m,tt(1),()=>{m.dispose(),ae.current===m&&(ae.current=null)}},[A]),s.useEffect(()=>{const r=O.current,m=Fe.current,z=st.current;if(!A||L&&L!=="keyboard"||pe!=="trackpad"&&!(navigator.maxTouchPoints>0)||!r||!m||!z)return;const H="pointerTarget"in r?r.pointerTarget:rr(r),G=lr(m,H,z,at,{mode:pe,zoom:ae.current??void 0,viewOnly:w,trace:n});return ye.current=G,()=>{G(),ye.current===G&&(ye.current=()=>{})}},[A,w,pe,X,L,n]),s.useEffect(()=>{const r=O.current;if(!(!A||w||!r))return br(me,r,{paste:(m,z)=>{r.clipboardPasteFrom(m),he(z?[...W.paste.slice(0,1),[65505,"ShiftLeft"],...W.paste.slice(1)]:W.paste),Ne(!0),ce(!1)},receive:m=>{ot(m),Ye(!1)},failed:()=>{ce(!0),q("clipboard")}})},[A,w,j,me]),s.useEffect(()=>{const r=O.current;if(!A||w||!r||"pointerTarget"in r||!("_keyboard"in r))return;const m=gr(r,gt);return De.current=m,()=>{m(),De.current===m&&(De.current=()=>{})}},[A,w]);const ft=r=>{r!==pe&&(ye.current(),It(r),sr(r))};it.current=()=>{mt()},s.useEffect(()=>{ct&&g&&i&&!R&&u.autoConnect&&I&&U==="idle"&&!Ae.current&&it.current()},[ct,g,i,R,u.autoConnect,I,U]);const ht=()=>{Ae.current=!0,P("forget",h).catch(()=>{})},_e=r=>{if(r==="keyboard"){if(L==="keyboard"&&!oe){o.current?.blur(),o.current?.focus({preventScroll:!0});return}ye.current(),M.current=window.visualViewport?.height??window.innerHeight,Ze.flushSync(()=>{C(!1),D(!1),q(m=>m===r?null:r)})}else ye.current(),q(m=>m===r?null:r)},zt=()=>{ae.current?.set(1),l(r=>({...r,fit:!0})),x()},gt=r=>{if(!O.current||!ut.current)return;const m=[];for(const z of xr(r))m.push([z,null,!0],[z,null,!1]);ze.send(m)};s.useEffect(()=>{if(!A||L!=="keyboard"&&L!=="clipboard"||!window.visualViewport)return;const r=window.visualViewport,m=rt.current,z=()=>{L==="keyboard"&&D(d&&M.current-r.height>100),X&&m&&r.height>=160&&(m.style.height=`${r.height}px`,m.style.top=`${r.offsetTop}px`)};return z(),r.addEventListener("resize",z),r.addEventListener("scroll",z),()=>{r.removeEventListener("resize",z),r.removeEventListener("scroll",z),m&&(m.style.height="",m.style.top="")}},[A,L,X,d]);const xt=t.jsxs("div",{className:"flex shrink-0 items-center text-xs",role:"group","aria-label":e("computer.desktopZoom"),title:F?e("computer.pinchHint"):void 0,children:[t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center","aria-label":e("computer.zoomOut"),disabled:!A||se<=1,onPointerDown:r=>r.preventDefault(),onClick:()=>ae.current?.set(se/1.25),children:t.jsx(Gt,{size:16})}),t.jsxs("button",{type:"button",className:"min-h-11 min-w-11","aria-label":e("computer.resetZoom"),disabled:!A,onPointerDown:r=>r.preventDefault(),onClick:zt,children:[Math.round(se*100),"%"]}),t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center","aria-label":e("computer.zoomIn"),disabled:!A||se>=8,onPointerDown:r=>r.preventDefault(),onClick:()=>ae.current?.set(se*1.25),children:t.jsx(Wt,{size:16})}),F&&t.jsx("span",{className:"hidden pr-2 text-[10px] text-muted-foreground sm:inline",children:e("computer.pinchHint")})]}),Re=`flex shrink-0 items-center justify-center rounded-md hover:bg-surface-2 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary ${F?"min-h-11 min-w-11":"h-8 min-w-8"}`,bt=t.jsxs("div",{ref:rt,className:`flex min-h-0 flex-col bg-surface text-foreground ${X?"fixed inset-0 z-modal-panel h-dvh pb-[env(safe-area-inset-bottom)] pt-[env(safe-area-inset-top)]":"relative h-full"}`,role:X?"dialog":void 0,"aria-modal":X||void 0,"aria-label":e("computer.title"),onKeyDown:r=>{r.stopPropagation(),r.key==="Escape"&&!r.nativeEvent.isComposing&&L&&(r.preventDefault(),q(null))},onKeyUp:r=>r.stopPropagation(),children:[t.jsxs("div",{className:`relative z-30 flex shrink-0 items-center gap-2 border-b border-border bg-surface px-2 ${F?"min-h-12":"min-h-8"}`,children:[X&&t.jsx("button",{type:"button",className:Re,onClick:()=>{be(!1),q(null)},"aria-label":e("computer.exitFullscreen"),children:t.jsx(Ut,{size:20})}),t.jsx(Kt,{size:16,className:"shrink-0 text-muted-foreground"}),t.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",children:A&&(Ie||(E?i?.hostname||$e()?.serviceName:p))||e("computer.title")}),A&&t.jsx("span",{className:"text-[11px] text-primary",children:e("computer.connected")}),A&&b==="error"&&t.jsx("span",{role:"alert",className:"text-[11px] text-destructive",children:e("computer.loginSaveFailed")}),A&&f==="saving"&&t.jsx("span",{role:"status","aria-label":e("computer.settingsSaving"),title:e("computer.settingsSaving"),children:t.jsx(Ct,{size:12,className:"animate-spin text-muted-foreground"})}),A&&f==="error"&&t.jsxs("button",{type:"button",className:ge,title:e("computer.settingsSaveFailed"),"aria-label":e("computer.settingsSaveFailed"),onClick:k,children:["! ",e("computer.retry")]}),Z&&t.jsxs("button",{type:"button",className:`${Re} gap-1 px-1 text-xs`,onClick:pt,children:[t.jsx(kt,{size:14}),e("computer.cancel")]}),A&&!F&&L==="keyboard"&&t.jsx("button",{type:"button",className:Re,onClick:()=>_e("keyboard"),"aria-label":e("computer.keyboard"),"aria-pressed":oe,children:t.jsx(Ge,{size:18})}),A&&!F&&t.jsx("button",{type:"button",className:`${Re} ${L==="clipboard"?"bg-surface-2 text-primary":""}`,disabled:w,onClick:()=>_e("clipboard"),"aria-label":e("computer.clipboardTool"),title:e("computer.clipboardTool"),"aria-pressed":L==="clipboard",children:t.jsx(jt,{size:18})}),A&&!X&&t.jsxs("button",{type:"button",className:`${Re} gap-1 px-1 text-xs`,onClick:()=>be(!0),"aria-label":e("computer.fullscreen"),children:[t.jsx(Bt,{size:16}),e("computer.expand")]}),A&&t.jsx("button",{type:"button",className:Re,onClick:()=>_e("tools"),"aria-label":e("computer.tools"),"aria-expanded":L==="tools",children:t.jsx(Xt,{size:18})})]}),!Ke&&t.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto p-4 sm:p-6",children:t.jsxs("div",{className:"mx-auto w-full max-w-md",children:[t.jsxs("form",{className:"space-y-3",onSubmit:r=>{mt(r)},children:[t.jsxs("div",{className:"grid grid-cols-2 gap-1 rounded-lg bg-background p-1",role:"group","aria-label":e("computer.target"),children:[t.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${E?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":E,disabled:Z||!i||!g,onClick:()=>dt(!0),children:e("computer.thisComputer")}),t.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${E?"text-muted-foreground hover:bg-surface":"bg-surface-2 text-foreground"}`,"aria-pressed":!E,disabled:Z||!g,onClick:()=>dt(!1),children:e("computer.otherComputer")})]}),E?t.jsx("p",{className:"text-xs leading-relaxed text-muted-foreground",role:"status",children:i?e("computer.localService",{name:$e()?.serviceName||i.hostname}):e("computer.loading")}):t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e("computer.host")}),t.jsx("input",{className:xe,value:p,disabled:Z||!g,onChange:r=>{K({host:r.target.value,domain:"",ignoreCert:!1}),Q(""),de(null)},placeholder:e("computer.hostPlaceholder"),onBlur:()=>{x()},autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,required:!0,maxLength:253})]}),t.jsxs("p",{className:"text-xs text-muted-foreground",children:[j==="mac"?"macOS":j==="linux"?"Ubuntu / Linux":"Windows"," · ",N.toUpperCase()," · ",N==="rdp"?_||"3389":"5900",w?` · ${e("computer.viewOnly")}`:""]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e(N==="rdp"?"computer.rdpUsername":"computer.username")}),t.jsx("input",{className:xe,value:T,disabled:!g,onChange:r=>J(r.target.value),onBlur:()=>{x()},autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",required:N==="rdp"||U==="credentials"&&Mt,maxLength:255})]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e("computer.password")}),t.jsx("input",{className:xe,type:"password",value:re,disabled:!g,onChange:r=>Q(r.target.value),placeholder:I&&U!=="credentials"?e("computer.savedPassword"):void 0,autoComplete:"new-password",required:!I||U==="credentials",maxLength:1024})]}),t.jsx("p",{className:"text-[11px] leading-relaxed text-muted-foreground",children:e(N==="rdp"?"computer.rdpLoginHint":"computer.vncLoginHint")}),t.jsxs("div",{className:"flex min-h-11 items-center justify-between gap-2 text-xs",children:[t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:h.rememberLogin,disabled:Z||!g||b==="saving",onChange:r=>{const m=r.target.checked;K({rememberLogin:m}),!m&&I?P("forget",{...h,rememberLogin:m}).catch(()=>{}):x()}}),e("computer.rememberLogin")]}),I&&t.jsx("button",{type:"button",className:"min-h-11 text-muted-foreground underline",disabled:Z||b==="saving",onClick:ht,children:e("computer.forgetLogin")})]}),b==="error"&&!ue&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e("computer.loginSaveFailed")}),R&&t.jsxs("div",{role:"status",className:"space-y-1 text-xs leading-relaxed text-muted-foreground",children:[t.jsx("p",{children:e("computer.rdpBackendUnavailable")}),t.jsx("p",{children:e("computer.rdpBackendRecovery")})]}),U==="credentials"&&t.jsx("p",{className:"text-xs text-primary",children:e("computer.credentials")}),ue&&t.jsxs("div",{role:"alert",className:"rounded-md bg-surface-2 p-3 text-xs leading-relaxed text-destructive",children:[e(ue),ue==="computer.rdpCertificate"&&t.jsxs("label",{className:"mt-1 flex min-h-11 items-center gap-2 text-foreground",children:[t.jsx("input",{type:"checkbox",checked:S,onChange:r=>we(r.target.checked)}),e("computer.trustCertificateHere")]}),U==="error"&&ue!=="computer.rdpCertificate"&&t.jsx("button",{type:"button",className:"mt-1 block min-h-9 text-foreground underline",onClick:()=>{Pe(!0),requestAnimationFrame(()=>lt.current?.scrollIntoView?.({block:"nearest",behavior:"smooth"}))},children:e("computer.checkSettings")})]}),t.jsx("button",{type:"submit",className:"inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-md bg-primary px-3 text-sm font-medium text-primary-foreground disabled:opacity-40",disabled:!g||R||b==="saving"||E&&!i||!p.trim()||!re&&(!I||U==="credentials")||N==="rdp"&&(!T.trim()||!Number.isInteger(Number(_))||Number(_)<1||Number(_)>65535),children:e(U==="credentials"?"computer.authenticate":U==="error"?"computer.retryConnect":"computer.connect")}),t.jsxs("details",{ref:lt,className:"border-b border-border text-xs",open:Ce,onToggle:r=>Pe(r.currentTarget.open),children:[t.jsxs("summary",{className:"flex min-h-11 cursor-pointer list-none items-center justify-between text-muted-foreground",children:[t.jsx("span",{children:e("computer.advanced")}),t.jsx("span",{"aria-hidden":"true",children:Ce?"−":"+"})]}),t.jsxs("div",{className:"space-y-3 pb-4",children:[t.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.platform")}),t.jsxs("select",{className:xe,value:j,disabled:Z||!g,onChange:r=>{er(r.target.value)&&K({platform:r.target.value,protocol:r.target.value==="mac"?"vnc":"rdp",ignoreCert:!1}),Q(""),x()},children:[t.jsx("option",{value:"mac",children:"macOS"}),t.jsx("option",{value:"linux",children:"Ubuntu / Linux"}),t.jsx("option",{value:"windows",children:"Windows"})]})]}),t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.protocol")}),t.jsxs("select",{className:xe,value:N,disabled:Z||!g,onChange:r=>{K({protocol:r.target.value==="rdp"?"rdp":"vnc"}),Q(""),de(null),x()},children:[t.jsx("option",{value:"rdp",children:"RDP"}),t.jsx("option",{value:"vnc",children:"VNC"})]})]})]}),N==="rdp"&&t.jsxs(t.Fragment,{children:[t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.port")}),t.jsx("input",{className:xe,type:"number",min:1,max:65535,step:1,value:_,disabled:Z||!g,onBlur:()=>{x()},onChange:r=>ne(r.target.value)})]}),t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.domain")}),t.jsx("input",{className:xe,value:Y,disabled:Z||!g,onBlur:()=>{x()},onChange:r=>ee(r.target.value),autoComplete:"off",maxLength:255})]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:S,disabled:Z||!g,onChange:r=>we(r.target.checked)}),e("computer.trustCertificate")]})]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:w,disabled:Z||!g,onChange:r=>Me(r.target.checked)}),e("computer.viewOnly")]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:u.autoConnect,disabled:Z||!g,onChange:r=>{l(m=>({...m,autoConnect:r.target.checked})),x()}}),e("computer.autoConnect")]})]})]})]}),t.jsxs("p",{role:"status",className:"mt-2 text-[11px] leading-relaxed text-muted-foreground",children:[e(f==="saved"?"computer.settingsSaved":f==="error"?g?"computer.settingsSaveFailed":"computer.settingsLoadFailed":f==="loading"?"computer.settingsLoading":"computer.settingsSaving"),f==="error"&&t.jsx("button",{type:"button",className:"ml-2 min-h-9 text-primary underline",onClick:k,children:e("computer.retry")})]}),t.jsxs("details",{className:"text-xs",children:[t.jsx("summary",{className:"flex min-h-11 cursor-pointer items-center text-muted-foreground",children:e("computer.setup")}),t.jsxs("ol",{className:"ml-4 list-decimal space-y-2 pt-2 leading-relaxed text-muted-foreground",children:[t.jsx("li",{children:e(N==="rdp"?j==="linux"?"computer.rdpLinuxStep1":"computer.rdpStep1":j==="mac"?"computer.step1":j==="linux"?"computer.linuxStep1":"computer.windowsStep1")}),t.jsx("li",{children:e(N==="rdp"?"computer.rdpStep2":j==="mac"?"computer.step2":j==="linux"?"computer.linuxStep2":"computer.windowsStep2")}),t.jsx("li",{children:e("computer.step3")})]}),N==="vnc"&&j==="linux"&&t.jsxs(t.Fragment,{children:[t.jsx("p",{className:"mt-3 leading-relaxed text-muted-foreground",children:e("computer.linuxCommandHint")}),t.jsx("pre",{className:"mt-2 overflow-x-auto rounded-md bg-background p-2 text-[11px]",children:t.jsx("code",{children:`sudo apt install x11vnc
|
|
5
5
|
x11vnc -storepasswd
|
|
6
|
-
x11vnc -display "$DISPLAY" -auth guess -localhost -usepw -forever -shared -rfbport 5900`})}),t.jsx("p",{className:"mt-2 leading-relaxed text-muted-foreground",children:e("computer.linuxProtocolHint")})]}),t.jsx("p",{className:"mt-3 leading-relaxed text-muted-foreground",children:e(N==="rdp"?"computer.rdpNetworkHint":"computer.networkHint")})]})]})}),A&&L==="tools"&&t.jsx("button",{type:"button",className:`absolute inset-x-0 ${F?"bottom-14 top-12":"bottom-0 top-8"} z-20 bg-background/40`,"aria-label":e("computer.returnToDesktop"),onClick:()=>
|
|
6
|
+
x11vnc -display "$DISPLAY" -auth guess -localhost -usepw -forever -shared -rfbport 5900`})}),t.jsx("p",{className:"mt-2 leading-relaxed text-muted-foreground",children:e("computer.linuxProtocolHint")})]}),t.jsx("p",{className:"mt-3 leading-relaxed text-muted-foreground",children:e(N==="rdp"?"computer.rdpNetworkHint":"computer.networkHint")})]})]})}),A&&L==="tools"&&t.jsx("button",{type:"button",className:`absolute inset-x-0 ${F?"bottom-14 top-12":"bottom-0 top-8"} z-20 bg-background/40`,"aria-label":e("computer.returnToDesktop"),onClick:()=>q(null)}),A&&t.jsxs("div",{hidden:L!=="tools",className:`${L==="tools"?"flex":"hidden"} absolute inset-x-3 ${F?"top-14":"top-10"} z-30 max-h-[calc(100%-7rem)] flex-wrap items-center gap-3 overflow-y-auto rounded-lg border border-border bg-surface px-4 py-3 text-xs shadow-lg [&_button]:min-h-11 [&_select]:min-h-11 [&_label]:min-h-11`,role:"region","aria-label":e("computer.tools"),children:[t.jsxs("div",{className:"flex w-full items-center justify-between",children:[t.jsx("span",{className:"font-medium",children:e("computer.tools")}),t.jsx("button",{type:"button",className:"flex min-w-11 items-center justify-center","aria-label":e("computer.closeTools"),onClick:()=>q(null),children:t.jsx($t,{size:18})})]}),F&&t.jsx("div",{className:"flex w-full items-center gap-2",children:t.jsx("div",{className:"inline-flex rounded-md bg-background p-0.5",role:"group","aria-label":e("computer.touchMode"),children:["trackpad","direct"].map(r=>t.jsx("button",{type:"button",className:`min-h-9 rounded px-3 text-xs ${pe===r?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":pe===r,onClick:()=>ft(r),children:e(r==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")},r))})}),!F&&t.jsxs(t.Fragment,{children:[xt,t.jsxs("button",{type:"button",className:ge,disabled:w,onClick:()=>_e("keyboard"),children:[t.jsx(Ge,{size:14}),e("computer.keyboard")]})]}),t.jsxs("label",{className:"flex min-h-9 items-center gap-1.5",children:[t.jsx("input",{type:"checkbox",checked:w,onChange:r=>Me(r.target.checked)}),e("computer.viewOnly")]}),t.jsx("button",{type:"button",className:ge,onClick:()=>{ae.current?.set(1),l(r=>({...r,fit:!r.fit})),x()},children:e(V?"computer.actualSize":"computer.fit")}),t.jsxs("select",{className:`${ge} min-w-0 bg-surface`,"aria-label":e("computer.shortcuts"),value:"",disabled:w,onChange:r=>{he(W[r.target.value]??[])},children:[t.jsx("option",{value:"",disabled:!0,children:e("computer.shortcuts")}),t.jsxs("option",{value:"tab",children:[j==="mac"?"⌘ Tab":"Alt+Tab"," · ",e("computer.switchApps")]}),t.jsxs("option",{value:"search",children:[j==="mac"?"⌘ Space":"Super / Win"," · ",e(j==="mac"?"computer.spotlight":"computer.systemSearch")]}),t.jsx("option",{value:"copy",children:j==="mac"?"⌘C":"Ctrl+C"}),t.jsx("option",{value:"paste",children:ke}),t.jsx("option",{value:"escape",children:"Esc"}),t.jsx("option",{value:"enter",children:"Enter"}),t.jsx("option",{value:"backspace",children:"⌫"}),t.jsx("option",{value:"up",children:"↑"}),t.jsx("option",{value:"down",children:"↓"}),t.jsx("option",{value:"left",children:"←"}),t.jsx("option",{value:"right",children:"→"})]}),t.jsxs("div",{className:"flex w-full items-center justify-between border-t border-border pt-2",children:[I&&t.jsx("button",{type:"button",className:ge,disabled:b==="saving",onClick:ht,children:e("computer.forgetLogin")}),t.jsxs("button",{type:"button",className:`${ge} ml-auto text-destructive`,onClick:pt,children:[t.jsx(kt,{size:14}),e("computer.disconnect")]})]})]}),t.jsxs("div",{ref:Fe,"data-sidebar-gesture-ignore":"",className:`relative z-10 min-h-0 flex-1 overflow-hidden bg-[var(--chrome-bg)] ${Ke?"":"hidden"}`,onMouseDownCapture:r=>{L==="keyboard"&&r.preventDefault()},style:{touchAction:A?"none":void 0},"aria-label":e("computer.remoteTitle"),children:[!A&&Ke&&t.jsxs("div",{role:"status",className:"absolute inset-0 z-20 flex items-center justify-center gap-2 bg-surface text-xs text-muted-foreground",children:[t.jsx(Ct,{size:16,className:"animate-spin"}),e("computer.connecting")]}),A&&t.jsx("div",{ref:st,hidden:!0,"aria-hidden":"true",className:"pointer-events-none absolute left-0 top-0 z-20 h-5 w-5 will-change-transform"})]}),t.jsx("div",{hidden:L!=="tools",children:A&&F&&!w&&t.jsx("p",{className:"shrink-0 border-t border-border px-2 py-1 text-[10px] leading-relaxed text-muted-foreground",children:e(pe==="trackpad"?"computer.trackpadHint":"computer.directTouchHint")})}),A&&L==="keyboard"&&!w&&t.jsxs(t.Fragment,{children:[t.jsx(pr,{sendChord:he,commandKey:W.copy[0],inputRef:o,onFocusChange:C,sendText:gt,sendKey:r=>he(r==="tab"?[[65289,"Tab"]]:r==="delete"?[[65535,"Delete"]]:W[r])}),t.jsx("div",{className:"grid shrink-0 grid-cols-6 gap-1 bg-surface px-1",role:"group","aria-label":e("computer.keyboardNavigation"),children:["escape","left","down","up","right","selectAll"].map(r=>t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-sm hover:bg-surface-2","aria-label":e(`computer.key${r[0].toUpperCase()}${r.slice(1)}`),onPointerDown:m=>m.preventDefault(),onClick:()=>he(r==="selectAll"?[...W.copy.slice(0,1),[97,"KeyA"]]:W[r]),children:{escape:"Esc",left:"←",down:"↓",up:"↑",right:"→",selectAll:j==="mac"?"⌘A":"Ctrl+A"}[r]},r))})]}),A&&L==="clipboard"&&!w&&t.jsxs("form",{className:"shrink-0 space-y-2 border-t border-border p-3",onSubmit:r=>{if(r.preventDefault(),!(!Ee||!O.current))try{O.current.clipboardPasteFrom(Ee),Ne(!0),ce(!1)}catch{ce(!0)}},children:[t.jsx("textarea",{className:`${xe} min-w-0 resize-none py-2 text-base`,rows:2,"aria-label":e("computer.clipboard"),placeholder:e("computer.clipboardPlaceholder"),value:Ee,onChange:r=>{nt(r.target.value),Ne(!1)},maxLength:et}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx("button",{type:"submit",className:`${ge} min-h-11 flex-1`,disabled:!Ee,children:e("computer.clipboard")}),t.jsx("button",{type:"button",className:`${ge} min-h-11`,onClick:()=>{try{Ee&&O.current?.clipboardPasteFrom(Ee),he(W.paste),ce(!1),Ne(!!Ee)}catch{ce(!0)}},children:ke})]}),t.jsx("p",{role:"status",className:"text-[10px] leading-relaxed text-muted-foreground",children:At?e("computer.clipboardSent"):e("computer.clipboardHint",{shortcut:ke})}),He!==null&&t.jsxs("div",{className:"space-y-1",children:[t.jsx("textarea",{className:`${xe} resize-none py-2 text-base`,rows:2,readOnly:!0,value:He,"aria-label":e("computer.remoteClipboard"),onFocus:r=>r.currentTarget.select()}),t.jsx("button",{type:"button",className:ge,onClick:()=>{if(!navigator.clipboard?.writeText){ce(!0);return}navigator.clipboard.writeText(He).then(()=>{Ye(!0),ce(!1)},()=>ce(!0))},children:e(Rt?"computer.clipboardCopied":"computer.copyToDevice")})]}),_t&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e("computer.clipboardAccessFailed")}),ue&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e(ue)})]}),Ke&&F&&t.jsxs("div",{className:"relative z-30 flex shrink-0 items-center border-t border-border bg-surface px-1 py-1 text-[11px]",children:[t.jsxs("div",{className:`grid min-w-0 flex-1 ${L==="keyboard"?"grid-cols-5":"grid-cols-3"}`,children:[t.jsxs("button",{type:"button",className:`flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md ${oe?"bg-surface-2 text-primary":""}`,disabled:!A||w,onClick:()=>_e("keyboard"),"aria-pressed":oe,children:[t.jsx(Ge,{size:18}),e("computer.keyboard")]}),t.jsxs("button",{type:"button",className:`flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md ${L==="clipboard"?"bg-surface-2 text-primary":""}`,disabled:!A||w,onClick:()=>_e("clipboard"),"aria-pressed":L==="clipboard",children:[t.jsx(jt,{size:18}),e("computer.clipboardTool")]}),L==="keyboard"?t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-sm",onPointerDown:r=>r.preventDefault(),onClick:()=>he([[65289,"Tab"]]),children:"Tab"}),t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-lg",onPointerDown:r=>r.preventDefault(),onClick:()=>he(W.backspace),children:"⌫"}),t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-lg",onPointerDown:r=>r.preventDefault(),onClick:()=>he(W.enter),children:"↵"})]}):t.jsx(t.Fragment,{children:t.jsxs("button",{type:"button",className:"flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md",disabled:!A||w,onClick:()=>ft(pe==="trackpad"?"direct":"trackpad"),"aria-label":e("computer.switchTouchMode"),children:[t.jsx(Ht,{size:18}),e(pe==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")]})})]}),xt]})]});return X?Ze.createPortal(bt,document.body):bt}const Nr=Object.freeze(Object.defineProperty({__proto__:null,default:vr},Symbol.toStringTag,{value:"Module"}));export{et as C,Nr as a,xr as b,ur as c};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{bA as t}from"./app-
|
|
1
|
+
import{bA as t}from"./app-D5VZp8rc.js";import{C as s}from"./ChangeWalkthroughPanel-iNaVjdNU.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";import"./sparkles-BK6dvO4C.js";import"./triangle-alert-CiksAjZK.js";const e="/tmp/termdock-dag-playground",i={version:1,id:"dag-playground",repoRoot:e,workspaceRoot:e,title:"改动解释升级为可点击导览",summary:"这是一页免登录 playground,用真实 ChangeWalkthroughPanel 调 DAG 的节点、边、label 和密度。",generatedBy:"dag-playground",injectedAt:Date.now(),highlights:[{what:"先看总览,再看链路",effect:"读者不用先进入 diff,也能理解整批改动目的。",tag:"理解"},{what:"多条链路直接画出来",effect:"分支、汇合、验证路径不再靠 next 文本猜。",tag:"链路"},{what:"点击节点跳回证据",effect:"导览和真实 diff 之间形成闭环。",tag:"导航"}],nodes:[{id:"export",title:"导出 section 级 diff",kind:"source",business:"CLI 把 hunk 拆成多个连续改动 section,并为每个 section 生成稳定 fingerprint。这里故意写长一点,用来验证 DAG 节点是否会按照真实文本高度撑开,而不是被固定高度裁掉。",anchor:{repoRoot:e,filePath:"src/server/cli.ts",hunkIndex:0,sectionIndex:0}},{id:"prompt",title:"约束 AI 输出",kind:"process",business:"提示词要求先写总览,再逐 section 生成解释。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/RightSidebar.tsx",hunkIndex:0}},{id:"schema",title:"校验导览结构",kind:"process",business:"检查节点、边和锚点字段是否完整。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:0}},{id:"fallback",title:"补齐兼容字段",kind:"process",business:"旧版结果缺字段时生成稳定回退值。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:1}},{id:"store",title:"保存整批导览结构",kind:"process",business:"服务端把 walkthrough 作为一等数据持久化。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:0}},{id:"api",title:"前端读取总览",kind:"api",business:"一次请求拿到 records 和 walkthroughs。",anchor:{repoRoot:e,filePath:"src/lib/terminal/api.ts",hunkIndex:0}},{id:"panel",title:"渲染 DAG 导览",kind:"ui",business:"用节点和边表达实现链路,节点可点击。节点内容可能是一两句话,也可能包含较长的业务解释;布局需要先测量 DOM 高度,再重新计算每一行节点的 y 坐标和连线端点。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/ChangeWalkthroughPanel.tsx",hunkIndex:0}},{id:"jump",title:"跳回真实 diff",kind:"ui",business:"点击节点后定位到文件、hunk 或 section。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/RightSidebar.tsx",hunkIndex:1}},{id:"section",title:"贴近改动展示解释",kind:"ui",business:"section 解释跟在对应 diff 块后面,而不是堆在 hunk 顶部。这个节点也故意写得更长,用来观察右侧分支和下方验证节点的连线是否会避让变高后的卡片。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/DiffViewer.tsx",hunkIndex:0,sectionIndex:1}},{id:"verify",title:"验证导出和注入",kind:"test",business:"跑 lint、install、health、资源检查和注入自测。"}],edges:[{from:"export",to:"prompt",label:"提供输入",desc:"sectionFingerprint 让 AI 可以稳定引用。"},{from:"export",to:"schema",label:"结构校验",desc:"先确认输入可以稳定落库。"},{from:"export",to:"fallback",label:"兼容旧数据",desc:"为历史记录补齐必要字段。"},{from:"prompt",to:"store",label:"注入",desc:"AI payload 写回本地服务。"},{from:"schema",to:"store",label:"通过后保存",desc:"合法结构进入存储层。"},{from:"fallback",to:"store",label:"归一化后保存",desc:"兼容数据与新数据走同一链路。"},{from:"store",to:"api",label:"读取",desc:"浏览器从服务端拿到导览。"},{from:"api",to:"panel",label:"渲染",desc:"结构化数据变成导览图。"},{from:"panel",to:"jump",label:"点击",desc:"节点驱动 diff 定位。"},{from:"jump",to:"section",label:"定位",desc:"落到对应 section 解释。"},{from:"export",to:"verify",label:"验证",desc:"导出结构要覆盖 tracked/untracked。"},{from:"section",to:"verify",label:"回归",desc:"确认展示位置和交互。"}],sections:[],risks:[{title:"边和 label 不能遮住节点主体。"},{title:"窄侧栏下横向滚动要可控。"}],checks:["在 360px、560px、900px 宽度下截图检查。","确认边的箭头、label 背板和节点层级清楚。","确认节点点击区域和 hover 状态可感知。"]};function p(){return t.jsx("div",{className:"min-h-screen bg-background p-5 text-foreground","data-dag-playground":!0,children:t.jsxs("div",{className:"mx-auto max-w-[72rem]",children:[t.jsxs("div",{className:"mb-3",children:[t.jsx("h1",{className:"text-sm font-semibold",children:"DAG Playground"}),t.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:"Auth-free playground for tuning the real ChangeWalkthroughPanel."})]}),t.jsxs("div",{className:"grid gap-4 lg:grid-cols-[360px_minmax(0,1fr)]",children:[t.jsx("div",{className:"min-w-0",children:t.jsx(s,{walkthroughs:[i],repoRoot:e,onNavigate:o=>{console.info("[DagPlayground] navigate",o)}})}),t.jsx("div",{className:"min-w-0",children:t.jsx(s,{walkthroughs:[i],repoRoot:e,onNavigate:o=>{console.info("[DagPlayground] navigate",o)}})})]})]})})}export{p as DagPlayground};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{bA as e}from"./app-
|
|
1
|
+
import{bA as e}from"./app-D5VZp8rc.js";import{b as a}from"./dnd-BCFAPC0L.js";import{c as M,S as _,D as T}from"./DiffViewer-CYl7f8Ni.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./referenceLongPress-CHQPhmmv.js";const w=`diff --git a/CommentGap.kt b/CommentGap.kt
|
|
2
2
|
--- a/CommentGap.kt
|
|
3
3
|
+++ b/CommentGap.kt
|
|
4
4
|
@@ -1,4 +1,4 @@
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ah as Ye,bA as r,e as dt,d as ft,df as ht,du as mt,ax as pt,a as xt,dt as gt,bV as vt,X as bt}from"./app-DNnVU3VK.js";import{b as o,r as Je}from"./dnd-BCFAPC0L.js";import{h as Ze,F as yt,b as wt,c as Ke}from"./gestureArbiter-BE8k_FL7.js";import{S as et}from"./sparkles-Cm9xs8pz.js";import{D as kt,i as Rt}from"./DiffViewer-DDiASWHf.js";const jt=[["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 19h8",key:"c3s6r1"}],["path",{d:"M3 10a2 2 0 0 0 2 2h3",key:"1npucw"}],["path",{d:"M3 5v12a2 2 0 0 0 2 2h3",key:"x1gjn2"}]],Nt=Ye("list-tree",jt);const Mt=[["path",{d:"M3 5h.01",key:"18ugdj"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 19h.01",key:"noohij"}],["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 19h13",key:"m83p4d"}]],Tt=Ye("list",Mt);function tt({selected:t,depth:n=0,title:c,leading:m,children:h,trailing:i,role:y,tabIndex:x,ariaExpanded:g,onClick:f,onKeyDown:b,onPointerDown:z,onPointerUp:T,onPointerCancel:F,dataAttributes:B}){return r.jsxs("div",{role:y,tabIndex:x,"aria-expanded":g,title:c,onClick:f,onKeyDown:b,onPointerDown:z,onPointerUp:T,onPointerCancel:F,...B,className:`group flex w-full cursor-pointer items-center gap-1 rounded px-2 py-1.5 text-left text-[13px] transition active:scale-[0.99] ${t?"bg-surface-elevated text-foreground":"text-muted-foreground hover:bg-surface-2 hover:text-foreground"}`,style:{paddingLeft:`${n*14+8}px`},children:[r.jsx("span",{className:"flex min-w-[14px] shrink-0 items-center justify-center text-muted-foreground/80",children:m}),r.jsx("span",{className:"min-w-0 flex-1",children:h}),i]})}function rt(t){return t.path.replace(/^\/+/,"")}function Dt(t){if(t.displayName!==void 0||t.displayDir!==void 0)return{name:t.displayName||t.path,dir:t.displayDir||""};const n=t.path.split("/").filter(Boolean);return{name:n.pop()||t.path,dir:n.join("/")}}function nt(t,n){const c=new Map,m=(i,y,x,g)=>{const f=i.get(y);if(f)return f;const b={path:x,name:y,childCount:0,directories:[],files:[]};return i.set(y,b),g?.directories.push(b),b};for(const i of t){const y=n(i).split("/").filter(Boolean);if(y.length<=1)continue;let x=c,g=null,f="";for(const b of y.slice(0,-1)){f=f?`${f}/${b}`:b;const z=m(x,b,f,g);g=z,x=new Map(z.directories.map(T=>[T.name,T]))}g?.files.push(i)}const h=i=>{const y=i.directories.map(h).sort((g,f)=>g.name.localeCompare(f.name)),x=i.files.sort((g,f)=>g.path.localeCompare(f.path));return{...i,directories:y,files:x,childCount:y.reduce((g,f)=>g+f.childCount,0)+x.length}};return Array.from(c.values()).map(h).sort((i,y)=>i.name.localeCompare(y.name))}function Pe(t,n,c=0){const m=n.selectedKey===t.key||n.selectedKey===t.path||n.selectedKey===t.absolutePath,h=Dt(t);return r.jsx(tt,{selected:m,role:"button",tabIndex:0,title:t.title??t.absolutePath??t.path,onClick:()=>{Ze()||n.onSelectFile(t)},onKeyDown:i=>{i.key!=="Enter"&&i.key!==" "||(i.preventDefault(),n.onSelectFile(t))},leading:n.renderLeading(t),depth:c,trailing:n.renderTrailing?.(t),dataAttributes:{"data-diff-selection-path":t.key,"data-diff-file-path":t.path,"data-diff-absolute-path":t.absolutePath??"","data-diff-status":t.status},children:r.jsxs("span",{className:"select-text","data-sidebar-selectable":!0,children:[r.jsx("span",{className:`block truncate leading-snug ${m?"font-medium":""}`,children:h.name}),n.mode!=="tree"&&h.dir&&r.jsx("span",{className:"block truncate text-[10px] text-muted-foreground/75",children:h.dir}),n.renderSubtitle?.(t)]})},t.key)}function st(t,n,c,m,h){let i=t;const y=[t.name];for(;i.files.length===0&&i.directories.length===1;)i=i.directories[0],y.push(i.name);const x=y.join("/"),g=`${n}:${i.path}`,f=c.collapsedDirectoryKeys.has(g);return r.jsxs("div",{className:"space-y-px",children:[r.jsx(tt,{role:"button",tabIndex:0,onClick:()=>{Ze()||c.onToggleDirectory(g)},onKeyDown:b=>{b.key!=="Enter"&&b.key!==" "||(b.preventDefault(),c.onToggleDirectory(g))},ariaExpanded:!f,depth:m,title:i.path,leading:f?r.jsx(dt,{size:13}):r.jsx(ft,{size:13}),trailing:r.jsxs("span",{className:"flex shrink-0 items-center gap-1",children:[r.jsx("span",{className:"shrink-0 rounded bg-surface-2 px-1.5 py-0.5 text-[10px] text-muted-foreground/60 transition group-hover:text-muted-foreground",children:i.childCount}),c.renderDirectoryTrailing?.(i.path,h)]}),children:r.jsxs("span",{className:"flex min-w-0 items-center gap-1",children:[r.jsx(yt,{size:14,className:"shrink-0 text-[color:var(--folder)]"}),r.jsx("span",{className:"min-w-0 flex-1 truncate leading-snug select-text","data-sidebar-selectable":!0,children:x})]})}),!f&&r.jsxs("div",{className:"space-y-px",children:[i.directories.map(b=>st(b,n,c,m+1,h)),i.files.length>0&&r.jsx("div",{className:"space-y-px",children:i.files.map(b=>Pe(b,c,m+1))})]})]},g)}function St(t,n){const c=n.getFileTreePath??rt,m=t.files.filter(i=>c(i).split("/").filter(Boolean).length<=1),h=nt(t.files,c);return r.jsxs("div",{className:"space-y-px",children:[h.map(i=>st(i,t.key,n,0,t)),m.length>0&&r.jsx("div",{className:"space-y-px",children:m.map(i=>Pe(i,n))})]})}function It(t,n=rt){const c=[],m=i=>{for(const y of i.directories)m(y);c.push(...i.files)};for(const i of nt(t,n))m(i);const h=new Set(c.map(i=>i.key));return c.push(...t.filter(i=>!h.has(i.key))),c}function Et(t){return r.jsx("div",{className:t.mode==="tree"?"space-y-px pt-1":"space-y-2",children:t.groups.map(n=>{const c=!!n.header,m=!!n.collapsed;return r.jsxs("section",{className:c?"overflow-hidden rounded-lg border border-border/15 bg-surface/60":"",children:[n.header,!m&&r.jsx("div",{className:t.mode==="tree"?c?"space-y-px bg-surface/60 p-1":"space-y-px":c?"space-y-px bg-surface/60 p-1.5":"space-y-px",children:t.mode==="tree"?St(n,t):n.files.map(h=>Pe(h,t))})]},n.key)})})}const Ce="termdock:diff-review:list-width:v1",Ct=120,He=320,qe=220,Ft=560;function _t(t){return typeof t=="number"&&Number.isFinite(t)}function Ue(t,n){const c=Math.max(qe,n-360),m=Math.min(Ft,c);return Math.min(m,Math.max(qe,t))}function At(){return vt(Ce,_t)??He}function zt({list:t,detail:n,mobile:c,mobileListHeader:m,mobileDetailHeader:h,desktopListHeader:i,backLabel:y,onMobileSlideChange:x,externalSwiperRef:g,desktopLayout:f="split",onDetailScroll:b,desktopSidePanel:z,desktopListClassName:T,detailOwnsScroll:F=!1}){const{t:B}=ht(),P=o.useRef(null),q=o.useRef(null),I=o.useRef(null),[U,$]=o.useState(At);o.useEffect(()=>{if(c||f!=="split")return;const p=q.current;p&&$(j=>Ue(j,p.clientWidth))},[f,c]);const ae=o.useCallback(p=>{c||f!=="split"||(p.preventDefault(),I.current={startX:p.clientX,startWidth:U,pointerId:p.pointerId},p.currentTarget.setPointerCapture(p.pointerId))},[f,U,c]),ue=o.useCallback(p=>{const j=I.current;if(!j||j.pointerId!==p.pointerId)return;const D=q.current?.clientWidth??window.innerWidth,_=Ue(j.startWidth+p.clientX-j.startX,D);$(_),mt(Ce,_,Ct)},[]),ie=o.useCallback(p=>{const j=I.current;if(!(!j||j.pointerId!==p.pointerId)){I.current=null,pt(Ce);try{p.currentTarget.releasePointerCapture(p.pointerId)}catch{}}},[]);if(c){const p=()=>{const v=P.current;v&&v.slideTo(1)},j=()=>{const v=P.current;v&&v.slideTo(0)},D=typeof t=="function"?t({slideToDetail:p}):t,_=typeof h=="function"?h({slideToList:j,slideToDetail:p}):h;return r.jsxs(wt,{className:"h-full min-h-0 w-full",slidesPerView:1,resistanceRatio:.45,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:".swiper-no-swiping",allowTouchMove:!1,touchAngle:75,touchStartPreventDefault:!1,onSwiper:v=>{P.current=v,g&&(g.current=v)},onSlideChange:v=>{x?.(v.activeIndex)},children:[r.jsx(Ke,{className:"h-full min-h-0",children:r.jsxs("div",{className:"flex h-full min-h-0 flex-col overflow-hidden",children:[m&&r.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 py-2",children:m}),r.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain",children:D})]})}),r.jsx(Ke,{className:"h-full min-h-0",children:r.jsxs("div",{className:"flex h-full min-h-0 flex-col overflow-hidden bg-surface",children:[r.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 py-2",children:_??r.jsxs("button",{type:"button",onClick:j,className:"inline-flex h-9 shrink-0 items-center gap-1.5 rounded-full bg-surface-2 px-3 text-xs font-semibold text-muted-foreground transition hover:bg-surface-elevated hover:text-foreground active:scale-95",children:[r.jsx(xt,{size:14}),y]})}),r.jsx("div",{className:F?"min-h-0 flex-1 overflow-hidden":"termdock-diff-stream-scroller min-h-0 flex-1 overflow-y-auto overscroll-contain",onScroll:F?void 0:v=>b?.(v.currentTarget),children:n})]})})]})}const W=typeof t=="function"?t({slideToDetail:()=>{}}):t;return f==="stacked"?F?r.jsxs("div",{className:"termdock-native-select min-h-0 flex-1 overflow-hidden px-2 pb-[calc(env(safe-area-inset-bottom)+4.5rem)]",children:[i&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:i}),W,r.jsx("div",{className:"mt-3 h-[calc(100%-3rem)] min-h-0 overflow-hidden rounded-xl border border-border/15 bg-surface",children:n})]}):r.jsxs("div",{className:"termdock-native-select termdock-diff-stream-scroller min-h-0 flex-1 overflow-y-auto overscroll-contain px-2 pb-[calc(env(safe-area-inset-bottom)+4.5rem)]",onScroll:p=>b?.(p.currentTarget),children:[i&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:i}),W,r.jsx("div",{className:"mt-3 overflow-hidden rounded-xl border border-border/15 bg-surface",children:n})]}):r.jsxs("div",{ref:q,className:"flex h-full min-h-0 overflow-hidden",children:[z,r.jsxs("div",{className:T??"shrink-0 overflow-y-auto overscroll-contain border-r border-border/15 bg-surface",style:{width:U},children:[i&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:i}),W]}),r.jsx("div",{role:"separator","aria-orientation":"vertical","aria-label":B("diffViewer.resizeNavigation"),title:B("diffViewer.resizeNavigation"),className:"group relative z-10 w-2 shrink-0 cursor-col-resize touch-none border-r border-border/15 bg-surface",onPointerDown:ae,onPointerMove:ue,onPointerUp:ie,onPointerCancel:ie,onDoubleClick:()=>{$(He),gt(Ce,He)},children:r.jsx("span",{className:"pointer-events-none absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-border/30 transition group-hover:bg-primary/60"})}),r.jsx("div",{className:F?"min-w-0 flex-1 overflow-hidden":"termdock-diff-stream-scroller min-w-0 flex-1 overflow-y-auto overscroll-contain",onScroll:F?void 0:p=>b?.(p.currentTarget),children:n})]})}function Lt({mode:t,onModeChange:n,showAi:c=!1}){return r.jsxs("div",{className:"inline-flex h-7 shrink-0 overflow-hidden rounded-md bg-surface-2 p-0.5",children:[r.jsx("button",{type:"button",onClick:()=>n("list"),"aria-pressed":t==="list",className:`inline-flex h-6 w-7 items-center justify-center rounded-md transition active:scale-95 ${t==="list"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(Tt,{size:13})}),r.jsx("button",{type:"button",onClick:()=>n("tree"),"aria-pressed":t==="tree",className:`inline-flex h-6 w-7 items-center justify-center rounded-md transition active:scale-95 ${t==="tree"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(Nt,{size:13})}),c&&r.jsx("button",{type:"button",onClick:()=>n("ai"),"aria-pressed":t==="ai",className:`inline-flex h-6 w-7 items-center justify-center rounded-md transition active:scale-95 ${t==="ai"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(et,{size:13})})]})}function Ht({groups:t,mode:n,onModeChange:c,selectedKey:m,collapsedDirectoryKeys:h,onToggleDirectory:i,onSelectFile:y,renderLeading:x,renderTrailing:g,renderDirectoryTrailing:f,renderSubtitle:b,detail:z,mobile:T,backLabel:F,compact:B=!1,emptyContent:P,listPrefix:q,aiContent:I,listContainerClassName:U="px-2 py-2",detailContainerClassName:$="termdock-native-select termdock-diff-stream-scroller min-h-0",renderListHeader:ae,renderMobileDetailHeader:ue,externalSwiperRef:ie,onMobileSlideChange:W,slideToDetailOnMobile:p=!0,desktopLayout:j="split",onDetailScroll:D,desktopSidePanel:_,desktopListClassName:v,detailOwnsScroll:ee}){const[V,O]=o.useState(!1);o.useEffect(()=>{if(!V)return;const A=L=>{L.key==="Escape"&&O(!1)};return document.addEventListener("keydown",A),()=>document.removeEventListener("keydown",A)},[V]);const de=r.jsx(Lt,{mode:n,onModeChange:c,showAi:!!I}),pe=n==="tree"?"tree":"list",xe=ae?ae(de):r.jsx("div",{className:"flex justify-end",children:de}),ge=t.some(A=>A.files.length>0),te=r.jsx(zt,{mobile:V?!1:T,backLabel:F,externalSwiperRef:ie,onMobileSlideChange:W,desktopLayout:V?"split":j,onDetailScroll:D,desktopSidePanel:_,desktopListClassName:v,detailOwnsScroll:ee,mobileListHeader:T?xe:void 0,desktopListHeader:T?void 0:xe,mobileDetailHeader:ue,list:({slideToDetail:A})=>r.jsx("div",{className:U,children:n==="ai"?typeof I=="function"?I({slideToDetail:A,fullscreen:V,toggleFullscreen:()=>O(L=>!L)}):I??P:r.jsxs(r.Fragment,{children:[q,ge?r.jsx(Et,{groups:t,selectedKey:m,mode:pe,mobile:T,compact:B,collapsedDirectoryKeys:h,onToggleDirectory:i,onSelectFile:L=>{y(L),T&&p&&window.requestAnimationFrame(A)},renderLeading:x,renderTrailing:g,renderDirectoryTrailing:f,renderSubtitle:b}):P]})}),detail:r.jsx("div",{className:ee?"h-full min-h-0":$,children:z})});return!V||typeof document>"u"?te:Je.createPortal(r.jsxs("div",{className:"fixed inset-0 z-modal-panel flex min-h-0 flex-col bg-surface text-foreground",children:[r.jsxs("div",{className:"flex h-12 shrink-0 items-center justify-between border-b border-border/15 bg-[var(--chrome-bg)] px-3",children:[r.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[r.jsx(et,{size:15,className:"shrink-0 text-primary"}),r.jsx("span",{className:"truncate text-[12px] font-semibold",children:"DAG Review"}),r.jsx("span",{className:"hidden text-[10px] text-muted-foreground sm:inline",children:"Select a step to inspect its exact change"})]}),r.jsx("button",{type:"button",onClick:()=>O(!1),className:"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95",title:"Exit full-screen DAG review (Esc)","aria-label":"Exit full-screen DAG review",children:r.jsx(bt,{size:16})})]}),r.jsx("div",{className:"min-h-0 flex-1",children:te})]}),document.body)}const Pt=96,ze=44;function Wt({file:t,repoRoot:n,selectionPath:c,displayName:m,displayDir:h,selected:i,activePane:y,visible:x,reusableContent:g=!1,estimatedHeight:f,lightweight:b=!1,wrap:z,viewType:T,inlineMode:F,diffOptions:B,reloadKey:P=0,auditRecords:q,diffOverride:I,oldSourceRef:U,preparedDiff:$,renderBadge:ae,onInsertDiffReference:ue,onHunkGitAction:ie,previewReverts:W,onReferenceCopied:p,insertedReferenceKey:j,copiedReferenceKey:D,onClearAuditRecord:_,onContentReady:v,onHeightChange:ee}){const V=o.useRef(null),O=o.useRef(null),de=o.useRef(null),[pe,xe]=o.useState(null),ge=o.useRef(64),te=o.useRef(f??104),A=o.useRef(null),L=o.useRef(null),Q=o.useRef(!1),le=o.useRef(!1),E=o.useRef(null),[re,je]=o.useState(!1),[Ne,Se]=o.useState(!1),ve=t.absolutePath||(n?`${n}/${t.path}`:t.path),N=o.useCallback(()=>{le.current||(le.current=!0,Se(!0),v?.(c))},[v,c]);o.useLayoutEffect(()=>{if(!(I!==void 0&&x&&le.current))return Q.current=!1,le.current=!1,A.current=null,L.current=null,E.current!==null&&(window.clearTimeout(E.current),E.current=null),je(!1),Se(!1),()=>{E.current!==null&&(window.clearTimeout(E.current),E.current=null)}},[I,$,P,g,x]),o.useLayoutEffect(()=>{const X=A.current;!re||X===null||Math.abs((f??104)-X)>=1||(A.current=null,N())},[N,f,re]),o.useLayoutEffect(()=>{if(!x||!re)return;const X=de.current;if(!X)return;const be=()=>{if(!Q.current)return;const Y=X.firstElementChild;if(!Y)return;const K=Math.ceil(Math.max(Y.getBoundingClientRect().height,Y.scrollHeight,64)),he=ge.current;if(K>0&&he!==K&&(ge.current=K,xe(K)),!V.current)return;const C=O.current?.getBoundingClientRect().height??ze,se=Math.ceil(C+K+1);se<=0||L.current===se||(L.current=se,E.current!==null&&window.clearTimeout(E.current),E.current=window.setTimeout(()=>{if(E.current=null,!Q.current)return;const H=L.current;if(H===null)return;const S=te.current;if(le.current){te.current=H,Math.abs(S-H)>=1&&ee?.(c,S,H),v?.(c);return}if(A.current=H,Math.abs(S-H)<1||!ee){te.current=H,A.current=null,N();return}te.current=H,ee(c,S,H)},Pt))};if(be(),typeof ResizeObserver>"u")return;const fe=new ResizeObserver(be);return fe.observe(X),X.firstElementChild&&fe.observe(X.firstElementChild),O.current&&fe.observe(O.current),()=>fe.disconnect()},[N,v,ee,c,re,x,z,T,F]);const G=x&&!Ne;return r.jsxs("div",{ref:V,"data-diff-stream-item":c,"data-diff-selection-path":c,"data-diff-file-path":t.path,"data-diff-absolute-path":ve,className:`scroll-mt-3 border-b border-border/15 last:border-b-0 ${G||!x?"overflow-hidden":""} ${i?"bg-surface-elevated/35":""}`,style:x?G?{height:f??104}:void 0:{height:f??104},children:[r.jsxs("div",{ref:O,"data-diff-stream-header":!0,className:`sticky top-0 z-10 flex min-w-0 items-center gap-2 border-b border-border/15 px-3 py-2 ${i?"bg-surface-elevated":"bg-surface"}`,children:[ae(t.status),r.jsxs("div",{className:"min-w-0 flex-1",title:ve,children:[r.jsx("div",{className:"truncate text-xs font-semibold text-foreground",children:m}),h&&r.jsx("div",{className:"truncate text-[10px] text-muted-foreground",children:h})]})]}),r.jsxs("div",{ref:de,className:"relative","data-diff-stream-body":!0,style:x?{minHeight:Ne?64:Math.max(pe??64,(f??104)-ze)}:{height:Math.max(pe??64,(f??104)-ze)},children:[x?r.jsx(kt,{active:y,repoRoot:n,filePath:t.path,referenceFilePath:ve,changedFile:t,wrap:z,viewType:T,inlineMode:F,diffOptions:B,reloadKey:P,embedded:!0,lightweight:b,auditRecords:q,diffOverride:I,oldSourceRef:U,preparedDiff:$,onClearAuditRecord:_,onContentReady:()=>{if(g){Q.current=!0,je(!0),N();return}Q.current||(Q.current=!0,je(!0))},onInsertDiffReference:ue,onHunkGitAction:ie,previewReverts:W,onReferenceCopied:p,insertedReferenceKey:j,copiedReferenceKey:D}):r.jsx("div",{className:"flex h-full min-h-16 items-center justify-center bg-surface px-3 py-4 text-center text-xs text-muted-foreground",children:t.path}),x&&re&&!Ne&&r.jsx("div",{"data-diff-measuring-overlay":!0,className:"absolute inset-0 z-20 bg-surface"})]})]})}const Oe=8,Le=1600,Qe=104,Bt=1e3,Re=new Map;function $t(t,n){for(Re.delete(t),Re.set(t,n);Re.size>Bt;){const c=Re.keys().next().value;if(c===void 0)break;Re.delete(c)}}function Vt(t,n){return!!(t&&t.diffOverride===n.diffOverride&&t.oldSourceRef===n.oldSourceRef&&t.reloadKey===n.reloadKey&&t.wrap===n.wrap&&t.viewType===n.viewType&&t.inlineMode===n.inlineMode&&t.algorithm===n.algorithm&&t.whitespace===n.whitespace&&t.context===n.context)}const Gt={added:{label:"A",className:"text-[color:var(--diff-insert-strong)]",title:"Added"},modified:{label:"M",className:"text-[color:var(--diff-hunk-accent)]",title:"Modified"},deleted:{label:"D",className:"text-[color:var(--diff-delete-strong)]",title:"Deleted"},renamed:{label:"R",className:"text-muted-foreground",title:"Renamed"},copied:{label:"C",className:"text-[color:var(--diff-insert-strong)]",title:"Copied"},untracked:{label:"U",className:"text-[color:var(--diff-insert-strong)]",title:"Untracked (new file)"},conflicted:{label:"!",className:"text-destructive",title:"Conflicted"},unknown:{label:"?",className:"text-muted-foreground",title:"Unknown"}};function Zt({status:t}){const n=Gt[t]??{label:"?",className:"text-muted-foreground",title:t};return r.jsx("span",{className:`w-4 shrink-0 text-center text-[10px] font-mono font-bold ${n.className}`,title:n.title,children:n.label})}function er(t,n){return n?{key:n,nonce:t.nonce+1}:t}function tr({files:t,groups:n,selectedKey:c,onSelectFile:m,mode:h,onModeChange:i,collapsedDirectoryKeys:y,onToggleDirectory:x,renderLeading:g,renderTrailing:f,renderDirectoryTrailing:b,renderSubtitle:z,renderStreamBadge:T,onInsertDiffReference:F,onHunkGitAction:B,onReferenceCopied:P,insertedReferenceKey:q,copiedReferenceKey:I,onClearAuditRecord:U,mobile:$,backLabel:ae,compact:ue,desktopLayout:ie,wrap:W,diffViewType:p,inlineMode:j,diffOptions:D,activePane:_,reloadKey:v=0,renderListHeader:ee,renderMobileDetailHeader:V,emptyContent:O,listPrefix:de,aiContent:pe,listContainerClassName:xe,detailContainerClassName:ge,desktopSidePanel:te,desktopListClassName:A,onDetailScroll:L,initialDetailScrollTop:Q,preserveScrollOnUpdate:le=!1,scrollToKey:E,scrollToKeyNonce:re=0,externalSwiperRef:je,onMobileSlideChange:Ne,slideToDetailOnMobile:Se}){const ve=o.useMemo(()=>e=>c===e.key||c===e.path||c===e.absolutePath,[c]),N=o.useMemo(()=>{const e=new Map;for(const a of t)e.set(a.key,a),a.path&&e.set(a.path,a),a.absolutePath&&e.set(a.absolutePath,a);const s=[],l=new Set;for(const a of n){const d=h==="tree"?It(a.files):a.files;for(const w of d){const u=e.get(w.key);!u||l.has(u.key)||(s.push(u),l.add(u.key))}}for(const a of t)l.has(a.key)||s.push(a);return s},[t,n,h]),G=o.useRef(null),X=o.useRef(null),be=o.useRef(null),fe=o.useRef(v),Y=o.useRef(0),K=o.useRef(null),he=o.useRef(new Map(Re)),ne=o.useRef({key:null,top:0}),C=o.useRef(new Set),se=o.useRef(new Map),H=o.useRef(new Map),S=o.useRef(null),We=o.useRef(()=>{}),Me=o.useRef([]),me=o.useRef(new Map),Be=o.useRef({tops:[],heights:[],bottom:0}),[Ie,ot]=o.useState(()=>new Set),[ct,at]=o.useState(0),[J,ye]=o.useState({top:0,height:0}),Te=o.useMemo(()=>N.map(e=>e.key),[N]),Ee=Te.join("");H.current=o.useMemo(()=>new Map(N.map(e=>[e.key,{diffOverride:e.diffOverride,oldSourceRef:e.oldSourceRef,reloadKey:v,wrap:W,viewType:p,inlineMode:j,algorithm:D?.algorithm,whitespace:D?.whitespace,context:D?.context}])),[N,v,W,p,j,D?.algorithm,D?.whitespace,D?.context]),Me.current=Te,me.current=o.useMemo(()=>new Map(Te.map((e,s)=>[e,s])),[Te]);const k=o.useMemo(()=>{const e=Te.map(a=>he.current.get(a)??Qe),s=new Array(e.length);for(let a=0;a<e.length;a+=1)s[a]=a===0?0:s[a-1]+e[a-1];const l=e.length>0?s[e.length-1]+e[e.length-1]:0;return{tops:s,heights:e,bottom:l}},[ct,Ee]);Be.current=k;const oe=o.useMemo(()=>E?N.find(e=>E===e.key||E===e.path||E===e.absolutePath)?.key??null:null,[N,E]),Fe=o.useMemo(()=>c?N.find(e=>c===e.key||c===e.path||c===e.absolutePath)?.key??null:null,[N,c]),De=o.useMemo(()=>{const e=k.tops.length;if(e===0)return-1;let s=0,l=e;for(;s<l;){const a=Math.floor((s+l)/2);k.tops[a]<=J.top+1?s=a+1:l=a}return Math.min(e-1,Math.max(0,s-1))},[k.tops,J.top]),ce=o.useCallback(e=>{C.current=e,ot(e)},[]),$e=o.useMemo(()=>{const e=J.top-Le,s=J.top+J.height+Le,l=new Set;let a=0,d=k.tops.length;for(;a<d;){const u=Math.floor((a+d)/2);k.tops[u]<=e?a=u+1:d=u}const w=Math.max(0,a-1);for(let u=w;u<k.tops.length;u+=1){const R=k.tops[u];if(R>s)break;R+k.heights[u]>=e&&R<=s&&l.add(u)}for(let u=De-1;u<=De+1;u+=1)u>=0&&u<k.tops.length&&l.add(u);for(const u of Ie){const R=me.current.get(u);R!==void 0&&l.add(R)}return Array.from(l).sort((u,R)=>u-R)},[k,J,Ie,De]),_e=o.useCallback(()=>{if(!_||S.current)return;const e=Me.current;if(e.length===0)return;const s=ne.current.key,l=Math.min(e.length-1,(s!==null?me.current.get(s):void 0)??Math.max(0,De)),a=u=>Math.abs((me.current.get(u)??0)-l),d=[];C.current.has(e[l])||d.push(e[l]);for(let u=1;u<=Oe;u+=1){const R=l+u,M=l-u;R<e.length&&!C.current.has(e[R])&&d.push(e[R]),M>=0&&!C.current.has(e[M])&&d.push(e[M])}const w=d[0];if(w){if(C.current.size>=Oe){const u=a(w),R=Array.from(C.current).filter(Z=>Z!==S.current).sort((Z,ke)=>a(ke)-a(Z))[0];if(!R||a(R)<=u)return;const M=new Set(C.current);M.delete(R),ce(M)}S.current=w,ce(new Set(C.current).add(w))}},[_,ce,De]);We.current=_e;const we=o.useCallback(e=>{if(C.current.has(e))return;const s=S.current;if(s&&s!==e){const l=new Set(C.current);l.delete(s),ce(l),S.current=null}S.current=e,ce(new Set(C.current).add(e))},[ce]),Ve=o.useCallback(e=>{if(!C.current.has(e))return;const s=H.current.get(e);s&&se.current.set(e,s),S.current===e&&(S.current=null),window.requestAnimationFrame(()=>We.current())},[]),Ge=o.useCallback((e,s,l)=>{if(Math.abs(l-s)<1)return;const a=he.current.get(e);a!==void 0&&Math.abs(a-l)<1||(he.current.set(e,l),$t(e,l),at(d=>d+1))},[]);o.useLayoutEffect(()=>{if(fe.current!==v){fe.current=v;for(const e of N){if(e.diffOverride!==void 0)continue;const s=qt(e.path,e.repoRoot);Rt(s,e.repoRoot??void 0,D)}}},[N,D,v]),o.useLayoutEffect(()=>{const e=G.current;if(!e)return;const s=()=>{const a=Math.max(0,Math.ceil(e.clientHeight));if(a===0)return;const d=e.scrollTop;ye(w=>w.height===a&&w.top===d?w:{top:d,height:a})};if(s(),typeof ResizeObserver>"u")return;const l=new ResizeObserver(s);return l.observe(e),()=>l.disconnect()},[$]),o.useEffect(()=>{_&&Fe&&we(Fe)},[_,we,Fe]),o.useEffect(()=>{const e=new Set(Me.current);for(const s of Array.from(he.current.keys()))e.has(s)||he.current.delete(s);for(const s of Array.from(C.current))if(!e.has(s)){const l=new Set(C.current);l.delete(s),ce(l)}for(const s of Array.from(se.current.keys()))e.has(s)||se.current.delete(s);if(S.current&&!e.has(S.current)&&(S.current=null),N.length===0){S.current=null,se.current.clear(),ce(new Set);return}_e()},[N.length,Ee,_e,$e,ce]);const Xe=o.useCallback(e=>{G.current=e;const s=Y.current,l=e.scrollTop;Y.current=l;const a=d=>{const w=Be.current,u=Me.current;let R=0,M=w.tops.length;for(;R<M;){const Ae=Math.floor((R+M)/2);w.tops[Ae]<=d+1?R=Ae+1:M=Ae}const Z=Math.min(u.length-1,Math.max(0,R-1)),ke=u[Z]??null;ne.current={key:ke,top:w.tops[Z]??0},ke&&we(ke)};Math.abs(l-s)>=Le?(Je.flushSync(()=>{ye({top:l,height:e.clientHeight})}),a(l)):K.current===null&&(K.current=window.requestAnimationFrame(()=>{K.current=null;const d=G.current;if(d){const w=d.scrollTop;ye({top:w,height:d.clientHeight}),a(w)}})),L?.(e)},[L,we]);o.useEffect(()=>()=>{K.current!==null&&window.cancelAnimationFrame(K.current)},[]),o.useLayoutEffect(()=>{const e=G.current;if(!e)return;const s=ne.current;if(s.key===null)return;const l=me.current.get(s.key);if(l===void 0)return;const a=(k.tops[l]??s.top)-s.top;if(Math.abs(a)<1)return;const d=e.scrollTop+a;Y.current=d,ye(w=>({top:d,height:w.height})),typeof e.scrollTo=="function"?e.scrollTo({top:d,behavior:"instant"}):e.scrollTop=d},[k]),o.useLayoutEffect(()=>{const e=Me.current,s=k.tops;if(e.length===0){ne.current={key:null,top:0};return}const l=Y.current,a=l+(G.current?.clientHeight??J.height),d=ne.current;if(d.key!==null){const M=me.current.get(d.key);if(M!==void 0){const Z=s[M]??0;if(Z+(k.heights[M]??Qe)>l&&Z<a){ne.current={key:d.key,top:Z};return}}}let w=0,u=s.length;for(;w<u;){const M=Math.floor((w+u)/2);s[M]<=l+1?w=M+1:u=M}const R=Math.min(s.length-1,Math.max(0,w-1));ne.current={key:e[R]??null,top:s[R]??0}}),o.useLayoutEffect(()=>{if(!oe)return;const e=X.current;if(e?.key===oe&&e.nonce===re)return;const s=me.current.get(oe);if(s===void 0)return;we(oe),ne.current={key:oe,top:k.tops[s]??0};const l=G.current;if(!l||l.clientHeight===0||J.height!==l.clientHeight)return;X.current={key:oe,nonce:re};const a=k.tops[s]??0;typeof l.scrollTo=="function"?l.scrollTo({top:a,behavior:"instant"}):l.scrollTop=a;const d=l.scrollTop;Y.current=d,ye({top:d,height:l.clientHeight})},[k,J.height,we,oe,re]),o.useLayoutEffect(()=>{if(Q===void 0||oe)return;const e=Ee;if(be.current===e||le&&be.current!==null)return;const s=G.current;if(!s)return;be.current=e;const l=Math.max(0,k.bottom-s.clientHeight),a=Math.min(Math.max(0,Q),l);typeof s.scrollTo=="function"?s.scrollTo({top:a,behavior:"instant"}):s.scrollTop=a;const d=s.scrollTop;Y.current=d,ye({top:d,height:s.clientHeight})},[k.bottom,Q,Ee,le,oe]);const it=o.useCallback((e,s)=>{const l=ve(e),a=H.current.get(e.key),d=a!==void 0&&Vt(se.current.get(e.key),a);return r.jsx(Xt,{item:e,repoRoot:e.repoRoot,selectionPath:e.key,displayName:e.displayName,displayDir:e.displayDir,selected:l,activePane:_,visible:Ie.has(e.key),reusableContent:d,estimatedHeight:s,lightweight:!1,wrap:W,viewType:p,inlineMode:j,diffOptions:D,reloadKey:v,auditRecords:e.auditRecords,diffOverride:e.diffOverride,oldSourceRef:e.oldSourceRef,renderStreamBadge:T,onInsertDiffReference:e.onInsertDiffReference??F,onHunkGitAction:e.onHunkGitAction??B,previewReverts:e.previewReverts,onReferenceCopied:P,insertedReferenceKey:q,copiedReferenceKey:I,onClearAuditRecord:U,onContentReady:Ve,onHeightChange:Ge})},[_,I,D,p,Ve,Ge,j,q,ve,Ie,U,B,F,P,v,T,W]),lt=r.jsx("div",{"data-diff-stream-content":!0,"data-diff-stream-canvas":!0,className:"termdock-diff-stream relative overflow-clip bg-surface will-change-transform",style:{height:Math.max(k.bottom,(k.tops.at(-1)??0)+J.height)},children:$e.map(e=>{const s=N[e];return s?r.jsx("div",{"data-diff-canvas-slot":s.key,className:"absolute inset-x-0",style:{top:k.tops[e]},children:it(s,k.heights[e])},s.key):null})}),ut=r.jsx("div",{ref:G,className:"termdock-diff-stream termdock-diff-stream-scroller h-full max-h-full min-h-0 overflow-y-auto overscroll-contain bg-surface [overflow-anchor:none]",onScroll:e=>Xe(e.currentTarget),children:lt});return r.jsx(Ht,{groups:n,mode:h,onModeChange:i,selectedKey:c,collapsedDirectoryKeys:y,onToggleDirectory:x,onSelectFile:m,renderLeading:g,renderTrailing:f,renderDirectoryTrailing:b,renderSubtitle:z,detail:ut,mobile:$,backLabel:ae,compact:ue,emptyContent:O,listPrefix:de,aiContent:pe,listContainerClassName:xe,detailContainerClassName:ge,renderListHeader:ee,renderMobileDetailHeader:V,externalSwiperRef:je,onMobileSlideChange:Ne,slideToDetailOnMobile:Se,desktopLayout:ie,onDetailScroll:Xe,desktopSidePanel:te,desktopListClassName:A,detailOwnsScroll:!0})}const Xt=o.memo(function({item:n,renderStreamBadge:c,...m}){return r.jsx(Wt,{...m,file:Kt(n),renderBadge:h=>c(h,n)})});function Kt(t){return{path:t.path,oldPath:t.oldPath,absolutePath:t.absolutePath,status:t.status}}function qt(t,n){if(t)return n&&t.startsWith(`${n}/`)?t.slice(n.length+1):t}export{Zt as C,tr as D,Nt as L,It as f,er as n};
|
|
1
|
+
import{ah as Ye,bA as r,e as dt,d as ft,df as ht,du as mt,ax as pt,a as xt,dt as gt,bV as vt,X as bt}from"./app-D5VZp8rc.js";import{b as o,r as Je}from"./dnd-BCFAPC0L.js";import{h as Ze,F as yt,b as wt,c as Ke}from"./gestureArbiter-CGaUInum.js";import{S as et}from"./sparkles-BK6dvO4C.js";import{D as kt,i as Rt}from"./DiffViewer-CYl7f8Ni.js";const jt=[["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 19h8",key:"c3s6r1"}],["path",{d:"M3 10a2 2 0 0 0 2 2h3",key:"1npucw"}],["path",{d:"M3 5v12a2 2 0 0 0 2 2h3",key:"x1gjn2"}]],Nt=Ye("list-tree",jt);const Mt=[["path",{d:"M3 5h.01",key:"18ugdj"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 19h.01",key:"noohij"}],["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 19h13",key:"m83p4d"}]],Tt=Ye("list",Mt);function tt({selected:t,depth:n=0,title:c,leading:m,children:h,trailing:i,role:y,tabIndex:x,ariaExpanded:g,onClick:f,onKeyDown:b,onPointerDown:z,onPointerUp:T,onPointerCancel:F,dataAttributes:B}){return r.jsxs("div",{role:y,tabIndex:x,"aria-expanded":g,title:c,onClick:f,onKeyDown:b,onPointerDown:z,onPointerUp:T,onPointerCancel:F,...B,className:`group flex w-full cursor-pointer items-center gap-1 rounded px-2 py-1.5 text-left text-[13px] transition active:scale-[0.99] ${t?"bg-surface-elevated text-foreground":"text-muted-foreground hover:bg-surface-2 hover:text-foreground"}`,style:{paddingLeft:`${n*14+8}px`},children:[r.jsx("span",{className:"flex min-w-[14px] shrink-0 items-center justify-center text-muted-foreground/80",children:m}),r.jsx("span",{className:"min-w-0 flex-1",children:h}),i]})}function rt(t){return t.path.replace(/^\/+/,"")}function Dt(t){if(t.displayName!==void 0||t.displayDir!==void 0)return{name:t.displayName||t.path,dir:t.displayDir||""};const n=t.path.split("/").filter(Boolean);return{name:n.pop()||t.path,dir:n.join("/")}}function nt(t,n){const c=new Map,m=(i,y,x,g)=>{const f=i.get(y);if(f)return f;const b={path:x,name:y,childCount:0,directories:[],files:[]};return i.set(y,b),g?.directories.push(b),b};for(const i of t){const y=n(i).split("/").filter(Boolean);if(y.length<=1)continue;let x=c,g=null,f="";for(const b of y.slice(0,-1)){f=f?`${f}/${b}`:b;const z=m(x,b,f,g);g=z,x=new Map(z.directories.map(T=>[T.name,T]))}g?.files.push(i)}const h=i=>{const y=i.directories.map(h).sort((g,f)=>g.name.localeCompare(f.name)),x=i.files.sort((g,f)=>g.path.localeCompare(f.path));return{...i,directories:y,files:x,childCount:y.reduce((g,f)=>g+f.childCount,0)+x.length}};return Array.from(c.values()).map(h).sort((i,y)=>i.name.localeCompare(y.name))}function Pe(t,n,c=0){const m=n.selectedKey===t.key||n.selectedKey===t.path||n.selectedKey===t.absolutePath,h=Dt(t);return r.jsx(tt,{selected:m,role:"button",tabIndex:0,title:t.title??t.absolutePath??t.path,onClick:()=>{Ze()||n.onSelectFile(t)},onKeyDown:i=>{i.key!=="Enter"&&i.key!==" "||(i.preventDefault(),n.onSelectFile(t))},leading:n.renderLeading(t),depth:c,trailing:n.renderTrailing?.(t),dataAttributes:{"data-diff-selection-path":t.key,"data-diff-file-path":t.path,"data-diff-absolute-path":t.absolutePath??"","data-diff-status":t.status},children:r.jsxs("span",{className:"select-text","data-sidebar-selectable":!0,children:[r.jsx("span",{className:`block truncate leading-snug ${m?"font-medium":""}`,children:h.name}),n.mode!=="tree"&&h.dir&&r.jsx("span",{className:"block truncate text-[10px] text-muted-foreground/75",children:h.dir}),n.renderSubtitle?.(t)]})},t.key)}function st(t,n,c,m,h){let i=t;const y=[t.name];for(;i.files.length===0&&i.directories.length===1;)i=i.directories[0],y.push(i.name);const x=y.join("/"),g=`${n}:${i.path}`,f=c.collapsedDirectoryKeys.has(g);return r.jsxs("div",{className:"space-y-px",children:[r.jsx(tt,{role:"button",tabIndex:0,onClick:()=>{Ze()||c.onToggleDirectory(g)},onKeyDown:b=>{b.key!=="Enter"&&b.key!==" "||(b.preventDefault(),c.onToggleDirectory(g))},ariaExpanded:!f,depth:m,title:i.path,leading:f?r.jsx(dt,{size:13}):r.jsx(ft,{size:13}),trailing:r.jsxs("span",{className:"flex shrink-0 items-center gap-1",children:[r.jsx("span",{className:"shrink-0 rounded bg-surface-2 px-1.5 py-0.5 text-[10px] text-muted-foreground/60 transition group-hover:text-muted-foreground",children:i.childCount}),c.renderDirectoryTrailing?.(i.path,h)]}),children:r.jsxs("span",{className:"flex min-w-0 items-center gap-1",children:[r.jsx(yt,{size:14,className:"shrink-0 text-[color:var(--folder)]"}),r.jsx("span",{className:"min-w-0 flex-1 truncate leading-snug select-text","data-sidebar-selectable":!0,children:x})]})}),!f&&r.jsxs("div",{className:"space-y-px",children:[i.directories.map(b=>st(b,n,c,m+1,h)),i.files.length>0&&r.jsx("div",{className:"space-y-px",children:i.files.map(b=>Pe(b,c,m+1))})]})]},g)}function St(t,n){const c=n.getFileTreePath??rt,m=t.files.filter(i=>c(i).split("/").filter(Boolean).length<=1),h=nt(t.files,c);return r.jsxs("div",{className:"space-y-px",children:[h.map(i=>st(i,t.key,n,0,t)),m.length>0&&r.jsx("div",{className:"space-y-px",children:m.map(i=>Pe(i,n))})]})}function It(t,n=rt){const c=[],m=i=>{for(const y of i.directories)m(y);c.push(...i.files)};for(const i of nt(t,n))m(i);const h=new Set(c.map(i=>i.key));return c.push(...t.filter(i=>!h.has(i.key))),c}function Et(t){return r.jsx("div",{className:t.mode==="tree"?"space-y-px pt-1":"space-y-2",children:t.groups.map(n=>{const c=!!n.header,m=!!n.collapsed;return r.jsxs("section",{className:c?"overflow-hidden rounded-lg border border-border/15 bg-surface/60":"",children:[n.header,!m&&r.jsx("div",{className:t.mode==="tree"?c?"space-y-px bg-surface/60 p-1":"space-y-px":c?"space-y-px bg-surface/60 p-1.5":"space-y-px",children:t.mode==="tree"?St(n,t):n.files.map(h=>Pe(h,t))})]},n.key)})})}const Ce="termdock:diff-review:list-width:v1",Ct=120,He=320,qe=220,Ft=560;function _t(t){return typeof t=="number"&&Number.isFinite(t)}function Ue(t,n){const c=Math.max(qe,n-360),m=Math.min(Ft,c);return Math.min(m,Math.max(qe,t))}function At(){return vt(Ce,_t)??He}function zt({list:t,detail:n,mobile:c,mobileListHeader:m,mobileDetailHeader:h,desktopListHeader:i,backLabel:y,onMobileSlideChange:x,externalSwiperRef:g,desktopLayout:f="split",onDetailScroll:b,desktopSidePanel:z,desktopListClassName:T,detailOwnsScroll:F=!1}){const{t:B}=ht(),P=o.useRef(null),q=o.useRef(null),I=o.useRef(null),[U,$]=o.useState(At);o.useEffect(()=>{if(c||f!=="split")return;const p=q.current;p&&$(j=>Ue(j,p.clientWidth))},[f,c]);const ae=o.useCallback(p=>{c||f!=="split"||(p.preventDefault(),I.current={startX:p.clientX,startWidth:U,pointerId:p.pointerId},p.currentTarget.setPointerCapture(p.pointerId))},[f,U,c]),ue=o.useCallback(p=>{const j=I.current;if(!j||j.pointerId!==p.pointerId)return;const D=q.current?.clientWidth??window.innerWidth,_=Ue(j.startWidth+p.clientX-j.startX,D);$(_),mt(Ce,_,Ct)},[]),ie=o.useCallback(p=>{const j=I.current;if(!(!j||j.pointerId!==p.pointerId)){I.current=null,pt(Ce);try{p.currentTarget.releasePointerCapture(p.pointerId)}catch{}}},[]);if(c){const p=()=>{const v=P.current;v&&v.slideTo(1)},j=()=>{const v=P.current;v&&v.slideTo(0)},D=typeof t=="function"?t({slideToDetail:p}):t,_=typeof h=="function"?h({slideToList:j,slideToDetail:p}):h;return r.jsxs(wt,{className:"h-full min-h-0 w-full",slidesPerView:1,resistanceRatio:.45,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:".swiper-no-swiping",allowTouchMove:!1,touchAngle:75,touchStartPreventDefault:!1,onSwiper:v=>{P.current=v,g&&(g.current=v)},onSlideChange:v=>{x?.(v.activeIndex)},children:[r.jsx(Ke,{className:"h-full min-h-0",children:r.jsxs("div",{className:"flex h-full min-h-0 flex-col overflow-hidden",children:[m&&r.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 py-2",children:m}),r.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain",children:D})]})}),r.jsx(Ke,{className:"h-full min-h-0",children:r.jsxs("div",{className:"flex h-full min-h-0 flex-col overflow-hidden bg-surface",children:[r.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 py-2",children:_??r.jsxs("button",{type:"button",onClick:j,className:"inline-flex h-9 shrink-0 items-center gap-1.5 rounded-full bg-surface-2 px-3 text-xs font-semibold text-muted-foreground transition hover:bg-surface-elevated hover:text-foreground active:scale-95",children:[r.jsx(xt,{size:14}),y]})}),r.jsx("div",{className:F?"min-h-0 flex-1 overflow-hidden":"termdock-diff-stream-scroller min-h-0 flex-1 overflow-y-auto overscroll-contain",onScroll:F?void 0:v=>b?.(v.currentTarget),children:n})]})})]})}const W=typeof t=="function"?t({slideToDetail:()=>{}}):t;return f==="stacked"?F?r.jsxs("div",{className:"termdock-native-select min-h-0 flex-1 overflow-hidden px-2 pb-[calc(env(safe-area-inset-bottom)+4.5rem)]",children:[i&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:i}),W,r.jsx("div",{className:"mt-3 h-[calc(100%-3rem)] min-h-0 overflow-hidden rounded-xl border border-border/15 bg-surface",children:n})]}):r.jsxs("div",{className:"termdock-native-select termdock-diff-stream-scroller min-h-0 flex-1 overflow-y-auto overscroll-contain px-2 pb-[calc(env(safe-area-inset-bottom)+4.5rem)]",onScroll:p=>b?.(p.currentTarget),children:[i&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:i}),W,r.jsx("div",{className:"mt-3 overflow-hidden rounded-xl border border-border/15 bg-surface",children:n})]}):r.jsxs("div",{ref:q,className:"flex h-full min-h-0 overflow-hidden",children:[z,r.jsxs("div",{className:T??"shrink-0 overflow-y-auto overscroll-contain border-r border-border/15 bg-surface",style:{width:U},children:[i&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:i}),W]}),r.jsx("div",{role:"separator","aria-orientation":"vertical","aria-label":B("diffViewer.resizeNavigation"),title:B("diffViewer.resizeNavigation"),className:"group relative z-10 w-2 shrink-0 cursor-col-resize touch-none border-r border-border/15 bg-surface",onPointerDown:ae,onPointerMove:ue,onPointerUp:ie,onPointerCancel:ie,onDoubleClick:()=>{$(He),gt(Ce,He)},children:r.jsx("span",{className:"pointer-events-none absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-border/30 transition group-hover:bg-primary/60"})}),r.jsx("div",{className:F?"min-w-0 flex-1 overflow-hidden":"termdock-diff-stream-scroller min-w-0 flex-1 overflow-y-auto overscroll-contain",onScroll:F?void 0:p=>b?.(p.currentTarget),children:n})]})}function Lt({mode:t,onModeChange:n,showAi:c=!1}){return r.jsxs("div",{className:"inline-flex h-7 shrink-0 overflow-hidden rounded-md bg-surface-2 p-0.5",children:[r.jsx("button",{type:"button",onClick:()=>n("list"),"aria-pressed":t==="list",className:`inline-flex h-6 w-7 items-center justify-center rounded-md transition active:scale-95 ${t==="list"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(Tt,{size:13})}),r.jsx("button",{type:"button",onClick:()=>n("tree"),"aria-pressed":t==="tree",className:`inline-flex h-6 w-7 items-center justify-center rounded-md transition active:scale-95 ${t==="tree"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(Nt,{size:13})}),c&&r.jsx("button",{type:"button",onClick:()=>n("ai"),"aria-pressed":t==="ai",className:`inline-flex h-6 w-7 items-center justify-center rounded-md transition active:scale-95 ${t==="ai"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(et,{size:13})})]})}function Ht({groups:t,mode:n,onModeChange:c,selectedKey:m,collapsedDirectoryKeys:h,onToggleDirectory:i,onSelectFile:y,renderLeading:x,renderTrailing:g,renderDirectoryTrailing:f,renderSubtitle:b,detail:z,mobile:T,backLabel:F,compact:B=!1,emptyContent:P,listPrefix:q,aiContent:I,listContainerClassName:U="px-2 py-2",detailContainerClassName:$="termdock-native-select termdock-diff-stream-scroller min-h-0",renderListHeader:ae,renderMobileDetailHeader:ue,externalSwiperRef:ie,onMobileSlideChange:W,slideToDetailOnMobile:p=!0,desktopLayout:j="split",onDetailScroll:D,desktopSidePanel:_,desktopListClassName:v,detailOwnsScroll:ee}){const[V,O]=o.useState(!1);o.useEffect(()=>{if(!V)return;const A=L=>{L.key==="Escape"&&O(!1)};return document.addEventListener("keydown",A),()=>document.removeEventListener("keydown",A)},[V]);const de=r.jsx(Lt,{mode:n,onModeChange:c,showAi:!!I}),pe=n==="tree"?"tree":"list",xe=ae?ae(de):r.jsx("div",{className:"flex justify-end",children:de}),ge=t.some(A=>A.files.length>0),te=r.jsx(zt,{mobile:V?!1:T,backLabel:F,externalSwiperRef:ie,onMobileSlideChange:W,desktopLayout:V?"split":j,onDetailScroll:D,desktopSidePanel:_,desktopListClassName:v,detailOwnsScroll:ee,mobileListHeader:T?xe:void 0,desktopListHeader:T?void 0:xe,mobileDetailHeader:ue,list:({slideToDetail:A})=>r.jsx("div",{className:U,children:n==="ai"?typeof I=="function"?I({slideToDetail:A,fullscreen:V,toggleFullscreen:()=>O(L=>!L)}):I??P:r.jsxs(r.Fragment,{children:[q,ge?r.jsx(Et,{groups:t,selectedKey:m,mode:pe,mobile:T,compact:B,collapsedDirectoryKeys:h,onToggleDirectory:i,onSelectFile:L=>{y(L),T&&p&&window.requestAnimationFrame(A)},renderLeading:x,renderTrailing:g,renderDirectoryTrailing:f,renderSubtitle:b}):P]})}),detail:r.jsx("div",{className:ee?"h-full min-h-0":$,children:z})});return!V||typeof document>"u"?te:Je.createPortal(r.jsxs("div",{className:"fixed inset-0 z-modal-panel flex min-h-0 flex-col bg-surface text-foreground",children:[r.jsxs("div",{className:"flex h-12 shrink-0 items-center justify-between border-b border-border/15 bg-[var(--chrome-bg)] px-3",children:[r.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[r.jsx(et,{size:15,className:"shrink-0 text-primary"}),r.jsx("span",{className:"truncate text-[12px] font-semibold",children:"DAG Review"}),r.jsx("span",{className:"hidden text-[10px] text-muted-foreground sm:inline",children:"Select a step to inspect its exact change"})]}),r.jsx("button",{type:"button",onClick:()=>O(!1),className:"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95",title:"Exit full-screen DAG review (Esc)","aria-label":"Exit full-screen DAG review",children:r.jsx(bt,{size:16})})]}),r.jsx("div",{className:"min-h-0 flex-1",children:te})]}),document.body)}const Pt=96,ze=44;function Wt({file:t,repoRoot:n,selectionPath:c,displayName:m,displayDir:h,selected:i,activePane:y,visible:x,reusableContent:g=!1,estimatedHeight:f,lightweight:b=!1,wrap:z,viewType:T,inlineMode:F,diffOptions:B,reloadKey:P=0,auditRecords:q,diffOverride:I,oldSourceRef:U,preparedDiff:$,renderBadge:ae,onInsertDiffReference:ue,onHunkGitAction:ie,previewReverts:W,onReferenceCopied:p,insertedReferenceKey:j,copiedReferenceKey:D,onClearAuditRecord:_,onContentReady:v,onHeightChange:ee}){const V=o.useRef(null),O=o.useRef(null),de=o.useRef(null),[pe,xe]=o.useState(null),ge=o.useRef(64),te=o.useRef(f??104),A=o.useRef(null),L=o.useRef(null),Q=o.useRef(!1),le=o.useRef(!1),E=o.useRef(null),[re,je]=o.useState(!1),[Ne,Se]=o.useState(!1),ve=t.absolutePath||(n?`${n}/${t.path}`:t.path),N=o.useCallback(()=>{le.current||(le.current=!0,Se(!0),v?.(c))},[v,c]);o.useLayoutEffect(()=>{if(!(I!==void 0&&x&&le.current))return Q.current=!1,le.current=!1,A.current=null,L.current=null,E.current!==null&&(window.clearTimeout(E.current),E.current=null),je(!1),Se(!1),()=>{E.current!==null&&(window.clearTimeout(E.current),E.current=null)}},[I,$,P,g,x]),o.useLayoutEffect(()=>{const X=A.current;!re||X===null||Math.abs((f??104)-X)>=1||(A.current=null,N())},[N,f,re]),o.useLayoutEffect(()=>{if(!x||!re)return;const X=de.current;if(!X)return;const be=()=>{if(!Q.current)return;const Y=X.firstElementChild;if(!Y)return;const K=Math.ceil(Math.max(Y.getBoundingClientRect().height,Y.scrollHeight,64)),he=ge.current;if(K>0&&he!==K&&(ge.current=K,xe(K)),!V.current)return;const C=O.current?.getBoundingClientRect().height??ze,se=Math.ceil(C+K+1);se<=0||L.current===se||(L.current=se,E.current!==null&&window.clearTimeout(E.current),E.current=window.setTimeout(()=>{if(E.current=null,!Q.current)return;const H=L.current;if(H===null)return;const S=te.current;if(le.current){te.current=H,Math.abs(S-H)>=1&&ee?.(c,S,H),v?.(c);return}if(A.current=H,Math.abs(S-H)<1||!ee){te.current=H,A.current=null,N();return}te.current=H,ee(c,S,H)},Pt))};if(be(),typeof ResizeObserver>"u")return;const fe=new ResizeObserver(be);return fe.observe(X),X.firstElementChild&&fe.observe(X.firstElementChild),O.current&&fe.observe(O.current),()=>fe.disconnect()},[N,v,ee,c,re,x,z,T,F]);const G=x&&!Ne;return r.jsxs("div",{ref:V,"data-diff-stream-item":c,"data-diff-selection-path":c,"data-diff-file-path":t.path,"data-diff-absolute-path":ve,className:`scroll-mt-3 border-b border-border/15 last:border-b-0 ${G||!x?"overflow-hidden":""} ${i?"bg-surface-elevated/35":""}`,style:x?G?{height:f??104}:void 0:{height:f??104},children:[r.jsxs("div",{ref:O,"data-diff-stream-header":!0,className:`sticky top-0 z-10 flex min-w-0 items-center gap-2 border-b border-border/15 px-3 py-2 ${i?"bg-surface-elevated":"bg-surface"}`,children:[ae(t.status),r.jsxs("div",{className:"min-w-0 flex-1",title:ve,children:[r.jsx("div",{className:"truncate text-xs font-semibold text-foreground",children:m}),h&&r.jsx("div",{className:"truncate text-[10px] text-muted-foreground",children:h})]})]}),r.jsxs("div",{ref:de,className:"relative","data-diff-stream-body":!0,style:x?{minHeight:Ne?64:Math.max(pe??64,(f??104)-ze)}:{height:Math.max(pe??64,(f??104)-ze)},children:[x?r.jsx(kt,{active:y,repoRoot:n,filePath:t.path,referenceFilePath:ve,changedFile:t,wrap:z,viewType:T,inlineMode:F,diffOptions:B,reloadKey:P,embedded:!0,lightweight:b,auditRecords:q,diffOverride:I,oldSourceRef:U,preparedDiff:$,onClearAuditRecord:_,onContentReady:()=>{if(g){Q.current=!0,je(!0),N();return}Q.current||(Q.current=!0,je(!0))},onInsertDiffReference:ue,onHunkGitAction:ie,previewReverts:W,onReferenceCopied:p,insertedReferenceKey:j,copiedReferenceKey:D}):r.jsx("div",{className:"flex h-full min-h-16 items-center justify-center bg-surface px-3 py-4 text-center text-xs text-muted-foreground",children:t.path}),x&&re&&!Ne&&r.jsx("div",{"data-diff-measuring-overlay":!0,className:"absolute inset-0 z-20 bg-surface"})]})]})}const Oe=8,Le=1600,Qe=104,Bt=1e3,Re=new Map;function $t(t,n){for(Re.delete(t),Re.set(t,n);Re.size>Bt;){const c=Re.keys().next().value;if(c===void 0)break;Re.delete(c)}}function Vt(t,n){return!!(t&&t.diffOverride===n.diffOverride&&t.oldSourceRef===n.oldSourceRef&&t.reloadKey===n.reloadKey&&t.wrap===n.wrap&&t.viewType===n.viewType&&t.inlineMode===n.inlineMode&&t.algorithm===n.algorithm&&t.whitespace===n.whitespace&&t.context===n.context)}const Gt={added:{label:"A",className:"text-[color:var(--diff-insert-strong)]",title:"Added"},modified:{label:"M",className:"text-[color:var(--diff-hunk-accent)]",title:"Modified"},deleted:{label:"D",className:"text-[color:var(--diff-delete-strong)]",title:"Deleted"},renamed:{label:"R",className:"text-muted-foreground",title:"Renamed"},copied:{label:"C",className:"text-[color:var(--diff-insert-strong)]",title:"Copied"},untracked:{label:"U",className:"text-[color:var(--diff-insert-strong)]",title:"Untracked (new file)"},conflicted:{label:"!",className:"text-destructive",title:"Conflicted"},unknown:{label:"?",className:"text-muted-foreground",title:"Unknown"}};function Zt({status:t}){const n=Gt[t]??{label:"?",className:"text-muted-foreground",title:t};return r.jsx("span",{className:`w-4 shrink-0 text-center text-[10px] font-mono font-bold ${n.className}`,title:n.title,children:n.label})}function er(t,n){return n?{key:n,nonce:t.nonce+1}:t}function tr({files:t,groups:n,selectedKey:c,onSelectFile:m,mode:h,onModeChange:i,collapsedDirectoryKeys:y,onToggleDirectory:x,renderLeading:g,renderTrailing:f,renderDirectoryTrailing:b,renderSubtitle:z,renderStreamBadge:T,onInsertDiffReference:F,onHunkGitAction:B,onReferenceCopied:P,insertedReferenceKey:q,copiedReferenceKey:I,onClearAuditRecord:U,mobile:$,backLabel:ae,compact:ue,desktopLayout:ie,wrap:W,diffViewType:p,inlineMode:j,diffOptions:D,activePane:_,reloadKey:v=0,renderListHeader:ee,renderMobileDetailHeader:V,emptyContent:O,listPrefix:de,aiContent:pe,listContainerClassName:xe,detailContainerClassName:ge,desktopSidePanel:te,desktopListClassName:A,onDetailScroll:L,initialDetailScrollTop:Q,preserveScrollOnUpdate:le=!1,scrollToKey:E,scrollToKeyNonce:re=0,externalSwiperRef:je,onMobileSlideChange:Ne,slideToDetailOnMobile:Se}){const ve=o.useMemo(()=>e=>c===e.key||c===e.path||c===e.absolutePath,[c]),N=o.useMemo(()=>{const e=new Map;for(const a of t)e.set(a.key,a),a.path&&e.set(a.path,a),a.absolutePath&&e.set(a.absolutePath,a);const s=[],l=new Set;for(const a of n){const d=h==="tree"?It(a.files):a.files;for(const w of d){const u=e.get(w.key);!u||l.has(u.key)||(s.push(u),l.add(u.key))}}for(const a of t)l.has(a.key)||s.push(a);return s},[t,n,h]),G=o.useRef(null),X=o.useRef(null),be=o.useRef(null),fe=o.useRef(v),Y=o.useRef(0),K=o.useRef(null),he=o.useRef(new Map(Re)),ne=o.useRef({key:null,top:0}),C=o.useRef(new Set),se=o.useRef(new Map),H=o.useRef(new Map),S=o.useRef(null),We=o.useRef(()=>{}),Me=o.useRef([]),me=o.useRef(new Map),Be=o.useRef({tops:[],heights:[],bottom:0}),[Ie,ot]=o.useState(()=>new Set),[ct,at]=o.useState(0),[J,ye]=o.useState({top:0,height:0}),Te=o.useMemo(()=>N.map(e=>e.key),[N]),Ee=Te.join("");H.current=o.useMemo(()=>new Map(N.map(e=>[e.key,{diffOverride:e.diffOverride,oldSourceRef:e.oldSourceRef,reloadKey:v,wrap:W,viewType:p,inlineMode:j,algorithm:D?.algorithm,whitespace:D?.whitespace,context:D?.context}])),[N,v,W,p,j,D?.algorithm,D?.whitespace,D?.context]),Me.current=Te,me.current=o.useMemo(()=>new Map(Te.map((e,s)=>[e,s])),[Te]);const k=o.useMemo(()=>{const e=Te.map(a=>he.current.get(a)??Qe),s=new Array(e.length);for(let a=0;a<e.length;a+=1)s[a]=a===0?0:s[a-1]+e[a-1];const l=e.length>0?s[e.length-1]+e[e.length-1]:0;return{tops:s,heights:e,bottom:l}},[ct,Ee]);Be.current=k;const oe=o.useMemo(()=>E?N.find(e=>E===e.key||E===e.path||E===e.absolutePath)?.key??null:null,[N,E]),Fe=o.useMemo(()=>c?N.find(e=>c===e.key||c===e.path||c===e.absolutePath)?.key??null:null,[N,c]),De=o.useMemo(()=>{const e=k.tops.length;if(e===0)return-1;let s=0,l=e;for(;s<l;){const a=Math.floor((s+l)/2);k.tops[a]<=J.top+1?s=a+1:l=a}return Math.min(e-1,Math.max(0,s-1))},[k.tops,J.top]),ce=o.useCallback(e=>{C.current=e,ot(e)},[]),$e=o.useMemo(()=>{const e=J.top-Le,s=J.top+J.height+Le,l=new Set;let a=0,d=k.tops.length;for(;a<d;){const u=Math.floor((a+d)/2);k.tops[u]<=e?a=u+1:d=u}const w=Math.max(0,a-1);for(let u=w;u<k.tops.length;u+=1){const R=k.tops[u];if(R>s)break;R+k.heights[u]>=e&&R<=s&&l.add(u)}for(let u=De-1;u<=De+1;u+=1)u>=0&&u<k.tops.length&&l.add(u);for(const u of Ie){const R=me.current.get(u);R!==void 0&&l.add(R)}return Array.from(l).sort((u,R)=>u-R)},[k,J,Ie,De]),_e=o.useCallback(()=>{if(!_||S.current)return;const e=Me.current;if(e.length===0)return;const s=ne.current.key,l=Math.min(e.length-1,(s!==null?me.current.get(s):void 0)??Math.max(0,De)),a=u=>Math.abs((me.current.get(u)??0)-l),d=[];C.current.has(e[l])||d.push(e[l]);for(let u=1;u<=Oe;u+=1){const R=l+u,M=l-u;R<e.length&&!C.current.has(e[R])&&d.push(e[R]),M>=0&&!C.current.has(e[M])&&d.push(e[M])}const w=d[0];if(w){if(C.current.size>=Oe){const u=a(w),R=Array.from(C.current).filter(Z=>Z!==S.current).sort((Z,ke)=>a(ke)-a(Z))[0];if(!R||a(R)<=u)return;const M=new Set(C.current);M.delete(R),ce(M)}S.current=w,ce(new Set(C.current).add(w))}},[_,ce,De]);We.current=_e;const we=o.useCallback(e=>{if(C.current.has(e))return;const s=S.current;if(s&&s!==e){const l=new Set(C.current);l.delete(s),ce(l),S.current=null}S.current=e,ce(new Set(C.current).add(e))},[ce]),Ve=o.useCallback(e=>{if(!C.current.has(e))return;const s=H.current.get(e);s&&se.current.set(e,s),S.current===e&&(S.current=null),window.requestAnimationFrame(()=>We.current())},[]),Ge=o.useCallback((e,s,l)=>{if(Math.abs(l-s)<1)return;const a=he.current.get(e);a!==void 0&&Math.abs(a-l)<1||(he.current.set(e,l),$t(e,l),at(d=>d+1))},[]);o.useLayoutEffect(()=>{if(fe.current!==v){fe.current=v;for(const e of N){if(e.diffOverride!==void 0)continue;const s=qt(e.path,e.repoRoot);Rt(s,e.repoRoot??void 0,D)}}},[N,D,v]),o.useLayoutEffect(()=>{const e=G.current;if(!e)return;const s=()=>{const a=Math.max(0,Math.ceil(e.clientHeight));if(a===0)return;const d=e.scrollTop;ye(w=>w.height===a&&w.top===d?w:{top:d,height:a})};if(s(),typeof ResizeObserver>"u")return;const l=new ResizeObserver(s);return l.observe(e),()=>l.disconnect()},[$]),o.useEffect(()=>{_&&Fe&&we(Fe)},[_,we,Fe]),o.useEffect(()=>{const e=new Set(Me.current);for(const s of Array.from(he.current.keys()))e.has(s)||he.current.delete(s);for(const s of Array.from(C.current))if(!e.has(s)){const l=new Set(C.current);l.delete(s),ce(l)}for(const s of Array.from(se.current.keys()))e.has(s)||se.current.delete(s);if(S.current&&!e.has(S.current)&&(S.current=null),N.length===0){S.current=null,se.current.clear(),ce(new Set);return}_e()},[N.length,Ee,_e,$e,ce]);const Xe=o.useCallback(e=>{G.current=e;const s=Y.current,l=e.scrollTop;Y.current=l;const a=d=>{const w=Be.current,u=Me.current;let R=0,M=w.tops.length;for(;R<M;){const Ae=Math.floor((R+M)/2);w.tops[Ae]<=d+1?R=Ae+1:M=Ae}const Z=Math.min(u.length-1,Math.max(0,R-1)),ke=u[Z]??null;ne.current={key:ke,top:w.tops[Z]??0},ke&&we(ke)};Math.abs(l-s)>=Le?(Je.flushSync(()=>{ye({top:l,height:e.clientHeight})}),a(l)):K.current===null&&(K.current=window.requestAnimationFrame(()=>{K.current=null;const d=G.current;if(d){const w=d.scrollTop;ye({top:w,height:d.clientHeight}),a(w)}})),L?.(e)},[L,we]);o.useEffect(()=>()=>{K.current!==null&&window.cancelAnimationFrame(K.current)},[]),o.useLayoutEffect(()=>{const e=G.current;if(!e)return;const s=ne.current;if(s.key===null)return;const l=me.current.get(s.key);if(l===void 0)return;const a=(k.tops[l]??s.top)-s.top;if(Math.abs(a)<1)return;const d=e.scrollTop+a;Y.current=d,ye(w=>({top:d,height:w.height})),typeof e.scrollTo=="function"?e.scrollTo({top:d,behavior:"instant"}):e.scrollTop=d},[k]),o.useLayoutEffect(()=>{const e=Me.current,s=k.tops;if(e.length===0){ne.current={key:null,top:0};return}const l=Y.current,a=l+(G.current?.clientHeight??J.height),d=ne.current;if(d.key!==null){const M=me.current.get(d.key);if(M!==void 0){const Z=s[M]??0;if(Z+(k.heights[M]??Qe)>l&&Z<a){ne.current={key:d.key,top:Z};return}}}let w=0,u=s.length;for(;w<u;){const M=Math.floor((w+u)/2);s[M]<=l+1?w=M+1:u=M}const R=Math.min(s.length-1,Math.max(0,w-1));ne.current={key:e[R]??null,top:s[R]??0}}),o.useLayoutEffect(()=>{if(!oe)return;const e=X.current;if(e?.key===oe&&e.nonce===re)return;const s=me.current.get(oe);if(s===void 0)return;we(oe),ne.current={key:oe,top:k.tops[s]??0};const l=G.current;if(!l||l.clientHeight===0||J.height!==l.clientHeight)return;X.current={key:oe,nonce:re};const a=k.tops[s]??0;typeof l.scrollTo=="function"?l.scrollTo({top:a,behavior:"instant"}):l.scrollTop=a;const d=l.scrollTop;Y.current=d,ye({top:d,height:l.clientHeight})},[k,J.height,we,oe,re]),o.useLayoutEffect(()=>{if(Q===void 0||oe)return;const e=Ee;if(be.current===e||le&&be.current!==null)return;const s=G.current;if(!s)return;be.current=e;const l=Math.max(0,k.bottom-s.clientHeight),a=Math.min(Math.max(0,Q),l);typeof s.scrollTo=="function"?s.scrollTo({top:a,behavior:"instant"}):s.scrollTop=a;const d=s.scrollTop;Y.current=d,ye({top:d,height:s.clientHeight})},[k.bottom,Q,Ee,le,oe]);const it=o.useCallback((e,s)=>{const l=ve(e),a=H.current.get(e.key),d=a!==void 0&&Vt(se.current.get(e.key),a);return r.jsx(Xt,{item:e,repoRoot:e.repoRoot,selectionPath:e.key,displayName:e.displayName,displayDir:e.displayDir,selected:l,activePane:_,visible:Ie.has(e.key),reusableContent:d,estimatedHeight:s,lightweight:!1,wrap:W,viewType:p,inlineMode:j,diffOptions:D,reloadKey:v,auditRecords:e.auditRecords,diffOverride:e.diffOverride,oldSourceRef:e.oldSourceRef,renderStreamBadge:T,onInsertDiffReference:e.onInsertDiffReference??F,onHunkGitAction:e.onHunkGitAction??B,previewReverts:e.previewReverts,onReferenceCopied:P,insertedReferenceKey:q,copiedReferenceKey:I,onClearAuditRecord:U,onContentReady:Ve,onHeightChange:Ge})},[_,I,D,p,Ve,Ge,j,q,ve,Ie,U,B,F,P,v,T,W]),lt=r.jsx("div",{"data-diff-stream-content":!0,"data-diff-stream-canvas":!0,className:"termdock-diff-stream relative overflow-clip bg-surface will-change-transform",style:{height:Math.max(k.bottom,(k.tops.at(-1)??0)+J.height)},children:$e.map(e=>{const s=N[e];return s?r.jsx("div",{"data-diff-canvas-slot":s.key,className:"absolute inset-x-0",style:{top:k.tops[e]},children:it(s,k.heights[e])},s.key):null})}),ut=r.jsx("div",{ref:G,className:"termdock-diff-stream termdock-diff-stream-scroller h-full max-h-full min-h-0 overflow-y-auto overscroll-contain bg-surface [overflow-anchor:none]",onScroll:e=>Xe(e.currentTarget),children:lt});return r.jsx(Ht,{groups:n,mode:h,onModeChange:i,selectedKey:c,collapsedDirectoryKeys:y,onToggleDirectory:x,onSelectFile:m,renderLeading:g,renderTrailing:f,renderDirectoryTrailing:b,renderSubtitle:z,detail:ut,mobile:$,backLabel:ae,compact:ue,emptyContent:O,listPrefix:de,aiContent:pe,listContainerClassName:xe,detailContainerClassName:ge,renderListHeader:ee,renderMobileDetailHeader:V,externalSwiperRef:je,onMobileSlideChange:Ne,slideToDetailOnMobile:Se,desktopLayout:ie,onDetailScroll:Xe,desktopSidePanel:te,desktopListClassName:A,detailOwnsScroll:!0})}const Xt=o.memo(function({item:n,renderStreamBadge:c,...m}){return r.jsx(Wt,{...m,file:Kt(n),renderBadge:h=>c(h,n)})});function Kt(t){return{path:t.path,oldPath:t.oldPath,absolutePath:t.absolutePath,status:t.status}}function qt(t,n){if(t)return n&&t.startsWith(`${n}/`)?t.slice(n.length+1):t}export{Zt as C,tr as D,Nt as L,It as f,er as n};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{bA as i}from"./app-
|
|
1
|
+
import{bA as i}from"./app-D5VZp8rc.js";import{b as n}from"./dnd-BCFAPC0L.js";import{D as I}from"./DiffReview-Bm5VsO_2.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./gestureArbiter-CGaUInum.js";import"./sparkles-BK6dvO4C.js";import"./DiffViewer-CYl7f8Ni.js";import"./referenceLongPress-CHQPhmmv.js";const x=40,b="/tmp/termdock-diff-review-lab";function S(r,c,l=!1){const d=[`diff --git a/${r} b/${r}`,`--- a/${r}`,`+++ b/${r}`,`@@ -1,${c} +1,${c} @@`];for(let t=0;t<c;t+=1)t%5===0&&d.push(`-const removed_${t} = ${t};`),t%3===0&&d.push(`+const added_${t} = ${t} * 2;`),d.push(` context line ${t} in ${r}${l?" long content for repeated wrap and resize checks".repeat(10):""}`);return d.join(`
|
|
2
2
|
`)}function T(r,c,l){return Array.from({length:x},(d,t)=>{const f=6+t*7%60,a=`src/module${String(t).padStart(2,"0")}/File${t}.ts`,m=`${b}/${a}`,w=S(a,f,l),o=S(a,1,l);return{key:m,path:a,absolutePath:m,status:"modified",repoRoot:b,displayName:`File${t}.ts`,displayDir:`src/module${String(t).padStart(2,"0")} · ${f} lines`,diffOverride:!c||r.has(t)?w:o,auditRecords:[]}})}function B(){const[r,c]=n.useState(()=>new URLSearchParams(window.location.search).get("wrap")!=="off"),[l,d]=n.useState(()=>new URLSearchParams(window.location.search).get("view")==="split"),t=n.useMemo(()=>new URLSearchParams(window.location.search).get("long")==="1",[]),f=n.useMemo(()=>{if(typeof window>"u")return 0;const e=new URLSearchParams(window.location.search).get("delay"),s=e===null?0:Number.parseInt(e,10);return Number.isInteger(s)&&s>0?s:0},[]),a=f>0,[m,w]=n.useState(()=>new Set);n.useEffect(()=>{if(!a)return;const e=Array.from({length:x},(s,u)=>window.setTimeout(()=>{w(M=>{const g=new Set(M);return g.add(u),g})},f+u*20));return()=>e.forEach(s=>window.clearTimeout(s))},[a,f]);const o=n.useMemo(()=>T(m,a,t),[m,a,t]),k=n.useMemo(()=>[{key:"mock-repo",root:b,label:"diff-review-lab",files:o.map(e=>({key:e.key,path:e.path,absolutePath:e.absolutePath,displayName:e.displayName,displayDir:e.displayDir,status:e.status}))}],[o]),p=n.useMemo(()=>{if(typeof window>"u")return null;const e=new URLSearchParams(window.location.search).get("select");if(e===null)return null;const s=Number.parseInt(e,10);return Number.isInteger(s)&&s>=0&&s<o.length?s:null},[o.length]),[h,$]=n.useState(()=>p!==null?o[p].key:null),[y,R]=n.useState(()=>({key:p!==null?o[p].key:null,nonce:p!==null?1:0})),[N,v]=n.useState("list"),[D,j]=n.useState(new Set),[L,P]=n.useState(p!==null?1:0);return i.jsxs("div",{className:"flex h-screen flex-col bg-background text-foreground","data-diff-review-lab":!0,children:[i.jsxs("div",{className:"shrink-0 border-b border-border/20 px-3 py-2 text-xs text-muted-foreground",children:[i.jsxs("button",{type:"button",className:"mr-2 rounded bg-surface-2 px-2 py-1",onClick:()=>c(e=>!e),"aria-pressed":r,children:["Wrap ",r?"on":"off"]}),i.jsx("button",{type:"button",className:"mr-2 rounded bg-surface-2 px-2 py-1",onClick:()=>d(e=>!e),"aria-pressed":l,children:l?"Split":"Unified"}),"DiffReview Lab · ",o.length," mock files · selected: ",i.jsx("span",{"data-lab-selected":!0,children:h??"none"})," · slide ",L]}),i.jsx("div",{className:"min-h-0 flex-1",children:i.jsx(I,{mobile:!0,backLabel:"Back",files:o,groups:k,selectedKey:h,scrollToKey:y.key,scrollToKeyNonce:y.nonce,mode:N,onModeChange:e=>{e!=="ai"&&v(e)},collapsedDirectoryKeys:D,onToggleDirectory:e=>j(s=>{const u=new Set(s);return u.has(e)?u.delete(e):u.add(e),u}),onSelectFile:e=>{$(e.key),R(s=>({key:e.key,nonce:s.nonce+1}))},onMobileSlideChange:P,renderLeading:()=>null,renderStreamBadge:e=>i.jsx("span",{className:"text-[10px] text-muted-foreground",children:e}),wrap:r,diffViewType:l?"split":"unified",activePane:!0})})]})}export{B as DiffReviewLab};
|
|
Binary file
|
|
Binary file
|