@hienlh/ppm 0.23.12 → 0.23.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +186 -0
- package/CLAUDE.md +41 -6
- package/THIRD-PARTY-NOTICES.md +2 -2
- package/assets/skills/ppm/SKILL.md +5 -4
- package/assets/skills/ppm/references/cli-reference.md +34 -8
- package/assets/skills/ppm/references/common-tasks.md +8 -4
- package/assets/skills/ppm/references/http-api.md +65 -17
- package/bun.lock +53 -41
- package/dist/web/assets/_basePickBy-CPcPjurU.js +1 -0
- package/dist/web/assets/_basePickBy-CPcPjurU.js.br +0 -0
- package/dist/web/assets/_basePickBy-CPcPjurU.js.gz +0 -0
- package/dist/web/assets/_baseUniq-DI0z-mx3.js +1 -0
- package/dist/web/assets/_baseUniq-DI0z-mx3.js.br +0 -0
- package/dist/web/assets/_baseUniq-DI0z-mx3.js.gz +0 -0
- package/dist/web/assets/accounts-settings-section-DU-lTifs.js +1 -0
- package/dist/web/assets/accounts-settings-section-DU-lTifs.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-DU-lTifs.js.gz +0 -0
- package/dist/web/assets/adaptive-context-menu-Cq7ynvIn.js +1 -0
- package/dist/web/assets/adaptive-context-menu-Cq7ynvIn.js.br +0 -0
- package/dist/web/assets/adaptive-context-menu-Cq7ynvIn.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-At6Rt-Yf.js +2 -0
- package/dist/web/assets/agent-session-sheet-At6Rt-Yf.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-At6Rt-Yf.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-store-BoBrAw5i.js +1 -0
- package/dist/web/assets/agent-session-window-content-CB_uvabH.js +1 -0
- package/dist/web/assets/agent-session-window-content-CB_uvabH.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-CB_uvabH.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-Czearm3I.js +1 -0
- package/dist/web/assets/ai-resource-editor-Czearm3I.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-Czearm3I.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-AOgAUCgH.js +1 -0
- package/dist/web/assets/ai-settings-section-B_OFMlrt.js +1 -0
- package/dist/web/assets/ai-settings-section-B_OFMlrt.js.br +0 -0
- package/dist/web/assets/ai-settings-section-B_OFMlrt.js.gz +0 -0
- package/dist/web/assets/android-tab-L7DmLfHG.js +2 -0
- package/dist/web/assets/android-tab-L7DmLfHG.js.br +0 -0
- package/dist/web/assets/android-tab-L7DmLfHG.js.gz +0 -0
- package/dist/web/assets/angular-html-DUhpSne7.js +1 -0
- package/dist/web/assets/angular-html-DUhpSne7.js.br +0 -0
- package/dist/web/assets/angular-html-DUhpSne7.js.gz +0 -0
- package/dist/web/assets/angular-ts-_PmhBAvx.js +1 -0
- package/dist/web/assets/angular-ts-_PmhBAvx.js.br +0 -0
- package/dist/web/assets/angular-ts-_PmhBAvx.js.gz +0 -0
- package/dist/web/assets/api-client-DAQfiXg0.js +1 -0
- package/dist/web/assets/api-client-OiA8Ida1.js +1 -0
- package/dist/web/assets/api-client-OiA8Ida1.js.br +0 -0
- package/dist/web/assets/api-client-OiA8Ida1.js.gz +0 -0
- package/dist/web/assets/api-settings-D2H6gjen.js +1 -0
- package/dist/web/assets/api-settings-D2H6gjen.js.br +0 -0
- package/dist/web/assets/api-settings-D2H6gjen.js.gz +0 -0
- package/dist/web/assets/api-settings-DHhcUHtx.js +1 -0
- package/dist/web/assets/api-themes-CE8gPZ3X.js +1 -0
- package/dist/web/assets/apl-Qu0ab_nv.js +1 -0
- package/dist/web/assets/apl-Qu0ab_nv.js.br +0 -0
- package/dist/web/assets/apl-Qu0ab_nv.js.gz +0 -0
- package/dist/web/assets/appearance-settings-section-s3KWKTBm.js +1 -0
- package/dist/web/assets/appearance-settings-section-s3KWKTBm.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-s3KWKTBm.js.gz +0 -0
- package/dist/web/assets/apps-panel-DaojtUvh.js +1 -0
- package/dist/web/assets/apps-panel-DaojtUvh.js.br +0 -0
- package/dist/web/assets/apps-panel-DaojtUvh.js.gz +0 -0
- package/dist/web/assets/arc-Cbj2MTZU.js +1 -0
- package/dist/web/assets/arc-Cbj2MTZU.js.br +0 -0
- package/dist/web/assets/arc-Cbj2MTZU.js.gz +0 -0
- package/dist/web/assets/architecture-PBZL5I3N-BsjZHebV.js +1 -0
- package/dist/web/assets/architectureDiagram-2XIMDMQ5-B5N-uzUB.js +36 -0
- package/dist/web/assets/architectureDiagram-2XIMDMQ5-B5N-uzUB.js.br +0 -0
- package/dist/web/assets/architectureDiagram-2XIMDMQ5-B5N-uzUB.js.gz +0 -0
- package/dist/web/assets/astro-6xSNo-2E.js +1 -0
- package/dist/web/assets/astro-6xSNo-2E.js.br +0 -0
- package/dist/web/assets/astro-6xSNo-2E.js.gz +0 -0
- package/dist/web/assets/audio-preview-CWcPZqTA.js +1 -0
- package/dist/web/assets/audio-preview-CWcPZqTA.js.br +4 -0
- package/dist/web/assets/audio-preview-CWcPZqTA.js.gz +0 -0
- package/dist/web/assets/blade-p7SMjkdK.js +1 -0
- package/dist/web/assets/blade-p7SMjkdK.js.br +0 -0
- package/dist/web/assets/blade-p7SMjkdK.js.gz +0 -0
- package/dist/web/assets/blockDiagram-WCTKOSBZ-CNZJl-ap.js +132 -0
- package/dist/web/assets/blockDiagram-WCTKOSBZ-CNZJl-ap.js.br +0 -0
- package/dist/web/assets/blockDiagram-WCTKOSBZ-CNZJl-ap.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-9UB4ccpF.js +1 -0
- package/dist/web/assets/branch-review-tab-9UB4ccpF.js.br +0 -0
- package/dist/web/assets/branch-review-tab-9UB4ccpF.js.gz +0 -0
- package/dist/web/assets/bsl-D0bT3Wjp.js +1 -0
- package/dist/web/assets/bsl-D0bT3Wjp.js.br +0 -0
- package/dist/web/assets/bsl-D0bT3Wjp.js.gz +0 -0
- package/dist/web/assets/button-Br60hGkw.js +1 -0
- package/dist/web/assets/button-Br60hGkw.js.br +0 -0
- package/dist/web/assets/button-Br60hGkw.js.gz +0 -0
- package/dist/web/assets/c4Diagram-IC4MRINW-hDrfu-4_.js +10 -0
- package/dist/web/assets/c4Diagram-IC4MRINW-hDrfu-4_.js.br +0 -0
- package/dist/web/assets/c4Diagram-IC4MRINW-hDrfu-4_.js.gz +0 -0
- package/dist/web/assets/cairo-DTuGb2w7.js +1 -0
- package/dist/web/assets/cairo-DTuGb2w7.js.br +0 -0
- package/dist/web/assets/cairo-DTuGb2w7.js.gz +0 -0
- package/dist/web/assets/channel-BYWG7Wl4.js +1 -0
- package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js +1 -0
- package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js.br +0 -0
- package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js.gz +0 -0
- package/dist/web/assets/chat-tab-DMVb_mgx.js +1 -0
- package/dist/web/assets/chat-tab-DMVb_mgx.js.br +0 -0
- package/dist/web/assets/chat-tab-DMVb_mgx.js.gz +0 -0
- package/dist/web/assets/chat-tab-s7uAnh-h.js +17 -0
- package/dist/web/assets/chat-tab-s7uAnh-h.js.br +0 -0
- package/dist/web/assets/chat-tab-s7uAnh-h.js.gz +0 -0
- package/dist/web/assets/chunk-4BX2VUAB-hVAt6yvs.js +1 -0
- package/dist/web/assets/chunk-55IACEB6-C01pkYAe.js +1 -0
- package/dist/web/assets/chunk-7E7YKBS2-DzI9lMJG.js +1 -0
- package/dist/web/assets/chunk-7R4GIKGN-vQspoIwd.js +80 -0
- package/dist/web/assets/chunk-7R4GIKGN-vQspoIwd.js.br +0 -0
- package/dist/web/assets/chunk-7R4GIKGN-vQspoIwd.js.gz +0 -0
- package/dist/web/assets/chunk-C72U2L5F-B6xz3XVo.js +1 -0
- package/dist/web/assets/chunk-EGIJ26TM-piMHBD4l.js +1 -0
- package/dist/web/assets/chunk-FMBD7UC4-e6MPEMRh.js +15 -0
- package/dist/web/assets/chunk-GEFDOKGD-DnsnpeGb.js +2 -0
- package/dist/web/assets/chunk-GEFDOKGD-DnsnpeGb.js.br +0 -0
- package/dist/web/assets/chunk-GEFDOKGD-DnsnpeGb.js.gz +0 -0
- package/dist/web/assets/chunk-GLR3WWYH-Co8QL50g.js +2 -0
- package/dist/web/assets/chunk-GLR3WWYH-Co8QL50g.js.br +0 -0
- package/dist/web/assets/chunk-GLR3WWYH-Co8QL50g.js.gz +0 -0
- package/dist/web/assets/chunk-HHEYEP7N-CErk3LHZ.js +1 -0
- package/dist/web/assets/chunk-JSJVCQXG-B8pwPgsI.js +1 -0
- package/dist/web/assets/chunk-JSJVCQXG-B8pwPgsI.js.br +0 -0
- package/dist/web/assets/chunk-JSJVCQXG-B8pwPgsI.js.gz +0 -0
- package/dist/web/assets/chunk-KX2RTZJC-DeYfi-Vl.js +1 -0
- package/dist/web/assets/chunk-KYZI473N-B6LAvX90.js +53 -0
- package/dist/web/assets/chunk-KYZI473N-B6LAvX90.js.br +0 -0
- package/dist/web/assets/chunk-KYZI473N-B6LAvX90.js.gz +0 -0
- package/dist/web/assets/chunk-L3YUKLVL-BM-EQ2IR.js +1 -0
- package/dist/web/assets/chunk-MX3YWQON-EGGLXe7u.js +1 -0
- package/dist/web/assets/chunk-MX3YWQON-EGGLXe7u.js.br +0 -0
- package/dist/web/assets/chunk-MX3YWQON-EGGLXe7u.js.gz +0 -0
- package/dist/web/assets/chunk-NQ4KR5QH-BHn5FEPA.js +220 -0
- package/dist/web/assets/chunk-NQ4KR5QH-BHn5FEPA.js.br +0 -0
- package/dist/web/assets/chunk-NQ4KR5QH-BHn5FEPA.js.gz +0 -0
- package/dist/web/assets/chunk-O4XLMI2P-DeFJl-l6.js +7 -0
- package/dist/web/assets/chunk-O4XLMI2P-DeFJl-l6.js.br +0 -0
- package/dist/web/assets/chunk-O4XLMI2P-DeFJl-l6.js.gz +0 -0
- package/dist/web/assets/chunk-OZEHJAEY-BwMHWpJ8.js +1 -0
- package/dist/web/assets/chunk-OZEHJAEY-BwMHWpJ8.js.br +0 -0
- package/dist/web/assets/chunk-OZEHJAEY-BwMHWpJ8.js.gz +0 -0
- package/dist/web/assets/chunk-PQ6SQG4A-B9GHRcOM.js +1 -0
- package/dist/web/assets/chunk-PQ6SQG4A-B9GHRcOM.js.br +0 -0
- package/dist/web/assets/chunk-PQ6SQG4A-B9GHRcOM.js.gz +0 -0
- package/dist/web/assets/chunk-PU5JKC2W-DJY3yjhJ.js +11 -0
- package/dist/web/assets/chunk-PU5JKC2W-DJY3yjhJ.js.br +0 -0
- package/dist/web/assets/chunk-PU5JKC2W-DJY3yjhJ.js.gz +0 -0
- package/dist/web/assets/chunk-QZHKN3VN--KxlfM05.js +1 -0
- package/dist/web/assets/chunk-R5LLSJPH-B8fEAHWI.js +1 -0
- package/dist/web/assets/chunk-WL4C6EOR-CTOYdnLV.js +189 -0
- package/dist/web/assets/chunk-WL4C6EOR-CTOYdnLV.js.br +0 -0
- package/dist/web/assets/chunk-WL4C6EOR-CTOYdnLV.js.gz +0 -0
- package/dist/web/assets/chunk-XIRO2GV7-CzjzQGr1.js +1 -0
- package/dist/web/assets/chunk-XPW4576I-CYBtYKPi.js +32 -0
- package/dist/web/assets/chunk-XPW4576I-CYBtYKPi.js.br +0 -0
- package/dist/web/assets/chunk-XPW4576I-CYBtYKPi.js.gz +0 -0
- package/dist/web/assets/chunk-XZSTWKYB-CkPHeT47.js +94 -0
- package/dist/web/assets/chunk-XZSTWKYB-CkPHeT47.js.br +0 -0
- package/dist/web/assets/chunk-XZSTWKYB-CkPHeT47.js.gz +0 -0
- package/dist/web/assets/chunk-YBOYWFTD-DVV5zPYi.js +1 -0
- package/dist/web/assets/classDiagram-VBA2DB6C-fXft2ivd.js +1 -0
- package/dist/web/assets/classDiagram-v2-RAHNMMFH-3Pc0szA4.js +1 -0
- package/dist/web/assets/clipboard-D3XnL7CB.js +1 -0
- package/dist/web/assets/clipboard-D3XnL7CB.js.br +0 -0
- package/dist/web/assets/clipboard-D3XnL7CB.js.gz +0 -0
- package/dist/web/assets/clone-BbqYojVU.js +1 -0
- package/dist/web/assets/cobol-N66t9bre.js +1 -0
- package/dist/web/assets/cobol-N66t9bre.js.br +0 -0
- package/dist/web/assets/cobol-N66t9bre.js.gz +0 -0
- package/dist/web/assets/code-editor-JK49X9EX.js +10 -0
- package/dist/web/assets/code-editor-JK49X9EX.js.br +0 -0
- package/dist/web/assets/code-editor-JK49X9EX.js.gz +0 -0
- package/dist/web/assets/code-fence-vHZyBehL.js +1 -0
- package/dist/web/assets/codex-reset-credit-button-CxJsBnff.js +1 -0
- package/dist/web/assets/codex-reset-credit-button-CxJsBnff.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-CxJsBnff.js.gz +0 -0
- package/dist/web/assets/coffee-DH4EPzT2.js +1 -0
- package/dist/web/assets/coffee-DH4EPzT2.js.br +0 -0
- package/dist/web/assets/coffee-DH4EPzT2.js.gz +0 -0
- package/dist/web/assets/conflict-editor-rOpVkK9P.js +19 -0
- package/dist/web/assets/conflict-editor-rOpVkK9P.js.br +0 -0
- package/dist/web/assets/conflict-editor-rOpVkK9P.js.gz +0 -0
- package/dist/web/assets/connection-form-tab-BGmb918E.js +4 -0
- package/dist/web/assets/connection-form-tab-BGmb918E.js.br +0 -0
- package/dist/web/assets/connection-form-tab-BGmb918E.js.gz +0 -0
- package/dist/web/assets/context-menu-BoQ6lxte.js +1 -0
- package/dist/web/assets/context-menu-BoQ6lxte.js.br +0 -0
- package/dist/web/assets/context-menu-BoQ6lxte.js.gz +0 -0
- package/dist/web/assets/cose-bilkent-S5V4N54A-mB8HA52z.js +1 -0
- package/dist/web/assets/cose-bilkent-S5V4N54A-mB8HA52z.js.br +0 -0
- package/dist/web/assets/cose-bilkent-S5V4N54A-mB8HA52z.js.gz +0 -0
- package/dist/web/assets/cpp-D9qUQN_l.js +1 -0
- package/dist/web/assets/cpp-D9qUQN_l.js.br +0 -0
- package/dist/web/assets/cpp-D9qUQN_l.js.gz +0 -0
- package/dist/web/assets/crystal-BbeV_Mwx.js +1 -0
- package/dist/web/assets/crystal-BbeV_Mwx.js.br +0 -0
- package/dist/web/assets/crystal-BbeV_Mwx.js.gz +0 -0
- package/dist/web/assets/csv-preview-CM7su92m.js +10 -0
- package/dist/web/assets/csv-preview-CM7su92m.js.br +0 -0
- package/dist/web/assets/csv-preview-CM7su92m.js.gz +0 -0
- package/dist/web/assets/dagre-DCmRVAkd.js +1 -0
- package/dist/web/assets/dagre-DCmRVAkd.js.br +0 -0
- package/dist/web/assets/dagre-DCmRVAkd.js.gz +0 -0
- package/dist/web/assets/dagre-KLK3FWXG-BbiZfyLJ.js +4 -0
- package/dist/web/assets/dagre-KLK3FWXG-BbiZfyLJ.js.br +0 -0
- package/dist/web/assets/dagre-KLK3FWXG-BbiZfyLJ.js.gz +0 -0
- package/dist/web/assets/database-drivers-section-C6ZKPWaE.js +1 -0
- package/dist/web/assets/database-drivers-section-C6ZKPWaE.js.br +0 -0
- package/dist/web/assets/database-drivers-section-C6ZKPWaE.js.gz +0 -0
- package/dist/web/assets/db-explorer-store-BcLxq-X0.js +1 -0
- package/dist/web/assets/db-explorer-store-BcLxq-X0.js.br +0 -0
- package/dist/web/assets/db-explorer-store-BcLxq-X0.js.gz +0 -0
- package/dist/web/assets/db-tab-parts-DvmnlA6V.js +1 -0
- package/dist/web/assets/db-tab-parts-DvmnlA6V.js.br +0 -0
- package/dist/web/assets/db-tab-parts-DvmnlA6V.js.gz +0 -0
- package/dist/web/assets/db-types-9ac-eYxf.js +1 -0
- package/dist/web/assets/db-types-9ac-eYxf.js.br +0 -0
- package/dist/web/assets/db-types-9ac-eYxf.js.gz +0 -0
- package/dist/web/assets/design-canvas-check-Bo76Q6Qr.js +1 -0
- package/dist/web/assets/design-canvas-check-Bo76Q6Qr.js.br +0 -0
- package/dist/web/assets/design-canvas-check-Bo76Q6Qr.js.gz +0 -0
- package/dist/web/assets/design-export-client-ClwRg798.js +1 -0
- package/dist/web/assets/design-export-client-ClwRg798.js.br +0 -0
- package/dist/web/assets/design-export-client-ClwRg798.js.gz +0 -0
- package/dist/web/assets/design-responsive-dialog-Cdccv3Nw.js +1 -0
- package/dist/web/assets/design-responsive-dialog-Cdccv3Nw.js.br +0 -0
- package/dist/web/assets/design-responsive-dialog-Cdccv3Nw.js.gz +0 -0
- package/dist/web/assets/design-settings-section-CuxZSLAr.js +2 -0
- package/dist/web/assets/design-settings-section-CuxZSLAr.js.br +0 -0
- package/dist/web/assets/design-settings-section-CuxZSLAr.js.gz +0 -0
- package/dist/web/assets/design-skill-suggestion-DZQjG8FV.js +3 -0
- package/dist/web/assets/design-skill-suggestion-DZQjG8FV.js.br +0 -0
- package/dist/web/assets/design-skill-suggestion-DZQjG8FV.js.gz +0 -0
- package/dist/web/assets/design-tab-JlKmHVkd.js +57 -0
- package/dist/web/assets/design-tab-JlKmHVkd.js.br +0 -0
- package/dist/web/assets/design-tab-JlKmHVkd.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-C1EwWf4Z.js +1 -0
- package/dist/web/assets/designs-sidebar-panel-C1EwWf4Z.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-C1EwWf4Z.js.gz +0 -0
- package/dist/web/assets/diagram-E7M64L7V-DqWzOwQy.js +24 -0
- package/dist/web/assets/diagram-E7M64L7V-DqWzOwQy.js.br +0 -0
- package/dist/web/assets/diagram-E7M64L7V-DqWzOwQy.js.gz +0 -0
- package/dist/web/assets/diagram-IFDJBPK2-Dxmm5YBr.js +43 -0
- package/dist/web/assets/diagram-IFDJBPK2-Dxmm5YBr.js.br +0 -0
- package/dist/web/assets/diagram-IFDJBPK2-Dxmm5YBr.js.gz +0 -0
- package/dist/web/assets/diagram-P4PSJMXO-D1gJGa3M.js +24 -0
- package/dist/web/assets/diagram-P4PSJMXO-D1gJGa3M.js.br +0 -0
- package/dist/web/assets/diagram-P4PSJMXO-D1gJGa3M.js.gz +0 -0
- package/dist/web/assets/dialog-DOaEX6AK.js +1 -0
- package/dist/web/assets/dialog-DOaEX6AK.js.br +0 -0
- package/dist/web/assets/dialog-DOaEX6AK.js.gz +0 -0
- package/dist/web/assets/diff-viewer-FidH7Nsq.js +4 -0
- package/dist/web/assets/diff-viewer-FidH7Nsq.js.br +0 -0
- package/dist/web/assets/diff-viewer-FidH7Nsq.js.gz +0 -0
- package/dist/web/assets/docx-preview-ENiLGqzy.js +12 -0
- package/dist/web/assets/docx-preview-ENiLGqzy.js.br +0 -0
- package/dist/web/assets/docx-preview-ENiLGqzy.js.gz +0 -0
- package/dist/web/assets/dropdown-menu-DB3yyoVz.js +1 -0
- package/dist/web/assets/dropdown-menu-DB3yyoVz.js.br +0 -0
- package/dist/web/assets/dropdown-menu-DB3yyoVz.js.gz +0 -0
- package/dist/web/assets/edge-vA_btsvt.js +1 -0
- package/dist/web/assets/edge-vA_btsvt.js.br +0 -0
- package/dist/web/assets/edge-vA_btsvt.js.gz +0 -0
- package/dist/web/assets/edit-diff-preview-D4EqC86X.js +7 -0
- package/dist/web/assets/edit-diff-preview-D4EqC86X.js.br +0 -0
- package/dist/web/assets/edit-diff-preview-D4EqC86X.js.gz +0 -0
- package/dist/web/assets/editor-dialog-DC7dUWAX.js +1 -0
- package/dist/web/assets/editor-dialog-DC7dUWAX.js.br +0 -0
- package/dist/web/assets/editor-dialog-DC7dUWAX.js.gz +0 -0
- package/dist/web/assets/editor-language-service-0pN0TxYN.js +1 -0
- package/dist/web/assets/editor-language-service-0pN0TxYN.js.br +0 -0
- package/dist/web/assets/editor-language-service-0pN0TxYN.js.gz +0 -0
- package/dist/web/assets/elixir-jDRKDZoF.js +1 -0
- package/dist/web/assets/elixir-jDRKDZoF.js.br +0 -0
- package/dist/web/assets/elixir-jDRKDZoF.js.gz +0 -0
- package/dist/web/assets/elm-DAS3eMJt.js +1 -0
- package/dist/web/assets/elm-DAS3eMJt.js.br +0 -0
- package/dist/web/assets/elm-DAS3eMJt.js.gz +0 -0
- package/dist/web/assets/erDiagram-INFDFZHY-DU44Y1XS.js +70 -0
- package/dist/web/assets/erDiagram-INFDFZHY-DU44Y1XS.js.br +0 -0
- package/dist/web/assets/erDiagram-INFDFZHY-DU44Y1XS.js.gz +0 -0
- package/dist/web/assets/erb-C7IJmpH8.js +1 -0
- package/dist/web/assets/erb-C7IJmpH8.js.br +0 -0
- package/dist/web/assets/erb-C7IJmpH8.js.gz +0 -0
- package/dist/web/assets/erlang-DW-GAdmv.js +1 -0
- package/dist/web/assets/erlang-DW-GAdmv.js.br +0 -0
- package/dist/web/assets/erlang-DW-GAdmv.js.gz +0 -0
- package/dist/web/assets/explorer-body-tFaUp9_Q.js +2 -0
- package/dist/web/assets/explorer-body-tFaUp9_Q.js.br +0 -0
- package/dist/web/assets/explorer-body-tFaUp9_Q.js.gz +0 -0
- package/dist/web/assets/explorer-model-BmgFEsj1.js +1 -0
- package/dist/web/assets/explorer-model-BmgFEsj1.js.br +0 -0
- package/dist/web/assets/explorer-model-BmgFEsj1.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-XnRTZT_X.js +1 -0
- package/dist/web/assets/explorer-window-content-XnRTZT_X.js.br +0 -0
- package/dist/web/assets/explorer-window-content-XnRTZT_X.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-DEbwRPf1.js +1 -0
- package/dist/web/assets/extension-manager-section-DEbwRPf1.js.br +0 -0
- package/dist/web/assets/extension-manager-section-DEbwRPf1.js.gz +0 -0
- package/dist/web/assets/extension-webview-C9ApceLU.js +12 -0
- package/dist/web/assets/extension-webview-C9ApceLU.js.br +0 -0
- package/dist/web/assets/extension-webview-C9ApceLU.js.gz +0 -0
- package/dist/web/assets/file-diff-lX1a7RLF.js +1 -0
- package/dist/web/assets/file-icons-DpwcJLL4.js +1 -0
- package/dist/web/assets/file-icons-DpwcJLL4.js.br +0 -0
- package/dist/web/assets/file-icons-DpwcJLL4.js.gz +0 -0
- package/dist/web/assets/file-icons.generated-BTxvyD8L.css +1 -0
- package/dist/web/assets/file-icons.generated-BTxvyD8L.css.br +0 -0
- package/dist/web/assets/file-icons.generated-BTxvyD8L.css.gz +0 -0
- package/dist/web/assets/file-store-Bk1WYfdy.js +1 -0
- package/dist/web/assets/file-store-Bk1WYfdy.js.br +0 -0
- package/dist/web/assets/file-store-Bk1WYfdy.js.gz +0 -0
- package/dist/web/assets/files-settings-section-C8MacVFQ.js +1 -0
- package/dist/web/assets/files-settings-section-C8MacVFQ.js.br +0 -0
- package/dist/web/assets/files-settings-section-C8MacVFQ.js.gz +0 -0
- package/dist/web/assets/filter-dialog-frame-CoWlaNRy.js +1 -0
- package/dist/web/assets/filter-dialog-frame-CoWlaNRy.js.br +0 -0
- package/dist/web/assets/filter-dialog-frame-CoWlaNRy.js.gz +0 -0
- package/dist/web/assets/flowDiagram-PKNHOUZH-XzNJSFMz.js +162 -0
- package/dist/web/assets/flowDiagram-PKNHOUZH-XzNJSFMz.js.br +0 -0
- package/dist/web/assets/flowDiagram-PKNHOUZH-XzNJSFMz.js.gz +0 -0
- package/dist/web/assets/format-file-meta-C0LKHE3e.js +1 -0
- package/dist/web/assets/format-file-meta-C0LKHE3e.js.br +0 -0
- package/dist/web/assets/format-file-meta-C0LKHE3e.js.gz +0 -0
- package/dist/web/assets/fortran-fixed-form-DrQbMSkt.js +1 -0
- package/dist/web/assets/fortran-fixed-form-DrQbMSkt.js.br +0 -0
- package/dist/web/assets/fortran-fixed-form-DrQbMSkt.js.gz +0 -0
- package/dist/web/assets/fs-api-BQrIEcvo.js +1 -0
- package/dist/web/assets/fs-api-BQrIEcvo.js.br +0 -0
- package/dist/web/assets/fs-api-BQrIEcvo.js.gz +0 -0
- package/dist/web/assets/fsharp-DvDj84Ys.js +1 -0
- package/dist/web/assets/fsharp-DvDj84Ys.js.br +0 -0
- package/dist/web/assets/fsharp-DvDj84Ys.js.gz +0 -0
- package/dist/web/assets/ganttDiagram-A5KZAMGK-5AL8Egrk.js +292 -0
- package/dist/web/assets/ganttDiagram-A5KZAMGK-5AL8Egrk.js.br +0 -0
- package/dist/web/assets/ganttDiagram-A5KZAMGK-5AL8Egrk.js.gz +0 -0
- package/dist/web/assets/gdresource-CPgY7R2s.js +1 -0
- package/dist/web/assets/gdresource-CPgY7R2s.js.br +0 -0
- package/dist/web/assets/gdresource-CPgY7R2s.js.gz +0 -0
- package/dist/web/assets/general-settings-section-DZRRGdlQ.js +1 -0
- package/dist/web/assets/general-settings-section-DZRRGdlQ.js.br +0 -0
- package/dist/web/assets/general-settings-section-DZRRGdlQ.js.gz +0 -0
- package/dist/web/assets/git-commit-NJ9iGbTd.js +1 -0
- package/dist/web/assets/git-commit-NJ9iGbTd.js.br +4 -0
- package/dist/web/assets/git-commit-NJ9iGbTd.js.gz +0 -0
- package/dist/web/assets/git-commit-horizontal-BVihXafd.js +1 -0
- package/dist/web/assets/git-log-panel-g2pBnu6r.js +1 -0
- package/dist/web/assets/git-log-panel-g2pBnu6r.js.br +0 -0
- package/dist/web/assets/git-log-panel-g2pBnu6r.js.gz +0 -0
- package/dist/web/assets/git-rebase-Cm4Uf8Bj.js +1 -0
- package/dist/web/assets/git-repo-store-BOYLnV67.js +1 -0
- package/dist/web/assets/git-repo-store-BOYLnV67.js.br +0 -0
- package/dist/web/assets/git-repo-store-BOYLnV67.js.gz +0 -0
- package/dist/web/assets/git-review-tab-BzI5mxWd.js +3 -0
- package/dist/web/assets/git-review-tab-BzI5mxWd.js.br +0 -0
- package/dist/web/assets/git-review-tab-BzI5mxWd.js.gz +0 -0
- package/dist/web/assets/gitGraph-HDMCJU4V-6AuIeDPs.js +1 -0
- package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-DzKvk1bR.js +65 -0
- package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-DzKvk1bR.js.br +0 -0
- package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-DzKvk1bR.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-BxvI3ehr.js +177 -0
- package/dist/web/assets/glide-data-grid-BxvI3ehr.js.br +0 -0
- package/dist/web/assets/glide-data-grid-BxvI3ehr.js.gz +0 -0
- package/dist/web/assets/glimmer-js-BrXGdFD2.js +1 -0
- package/dist/web/assets/glimmer-js-BrXGdFD2.js.br +0 -0
- package/dist/web/assets/glimmer-js-BrXGdFD2.js.gz +0 -0
- package/dist/web/assets/glimmer-ts-V0NFutRE.js +1 -0
- package/dist/web/assets/glimmer-ts-V0NFutRE.js.br +0 -0
- package/dist/web/assets/glimmer-ts-V0NFutRE.js.gz +0 -0
- package/dist/web/assets/glsl-DtvoVBT2.js +1 -0
- package/dist/web/assets/glsl-DtvoVBT2.js.br +0 -0
- package/dist/web/assets/glsl-DtvoVBT2.js.gz +0 -0
- package/dist/web/assets/graphlib-BpGCrXCx.js +1 -0
- package/dist/web/assets/graphlib-BpGCrXCx.js.br +0 -0
- package/dist/web/assets/graphlib-BpGCrXCx.js.gz +0 -0
- package/dist/web/assets/graphql-BM_SRktm.js +1 -0
- package/dist/web/assets/graphql-BM_SRktm.js.br +0 -0
- package/dist/web/assets/graphql-BM_SRktm.js.gz +0 -0
- package/dist/web/assets/grid-save-dialog-D55Po6Vu.js +2 -0
- package/dist/web/assets/grid-save-dialog-D55Po6Vu.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-D55Po6Vu.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-CoMC-Fx1.js +1 -0
- package/dist/web/assets/group-chat-tab-CoMC-Fx1.js.br +0 -0
- package/dist/web/assets/group-chat-tab-CoMC-Fx1.js.gz +0 -0
- package/dist/web/assets/hack-Ban3lpvB.js +1 -0
- package/dist/web/assets/hack-Ban3lpvB.js.br +0 -0
- package/dist/web/assets/hack-Ban3lpvB.js.gz +0 -0
- package/dist/web/assets/haml-CmZRp0VI.js +1 -0
- package/dist/web/assets/haml-CmZRp0VI.js.br +0 -0
- package/dist/web/assets/haml-CmZRp0VI.js.gz +0 -0
- package/dist/web/assets/handlebars-BTEDAMAb.js +1 -0
- package/dist/web/assets/handlebars-BTEDAMAb.js.br +0 -0
- package/dist/web/assets/handlebars-BTEDAMAb.js.gz +0 -0
- package/dist/web/assets/html-ItWVe1s-.js +1 -0
- package/dist/web/assets/html-ItWVe1s-.js.br +0 -0
- package/dist/web/assets/html-ItWVe1s-.js.gz +0 -0
- package/dist/web/assets/html-derivative-D_5yGE7d.js +1 -0
- package/dist/web/assets/http-7C1QiRf1.js +1 -0
- package/dist/web/assets/http-7C1QiRf1.js.br +0 -0
- package/dist/web/assets/http-7C1QiRf1.js.gz +0 -0
- package/dist/web/assets/hurl-Pypp_tSf.js +1 -0
- package/dist/web/assets/hurl-Pypp_tSf.js.br +0 -0
- package/dist/web/assets/hurl-Pypp_tSf.js.gz +0 -0
- package/dist/web/assets/hxml-C2EdtM37.js +1 -0
- package/dist/web/assets/hxml-C2EdtM37.js.br +0 -0
- package/dist/web/assets/hxml-C2EdtM37.js.gz +0 -0
- package/dist/web/assets/icons-JMA45Ifw.js +1 -0
- package/dist/web/assets/icons-JMA45Ifw.js.br +0 -0
- package/dist/web/assets/icons-JMA45Ifw.js.gz +0 -0
- package/dist/web/assets/image-preview-D7KR11Xo.js +1 -0
- package/dist/web/assets/impexp-state-BWKOuRGj.js +4 -0
- package/dist/web/assets/impexp-state-BWKOuRGj.js.br +0 -0
- package/dist/web/assets/impexp-state-BWKOuRGj.js.gz +0 -0
- package/dist/web/assets/impexp-tab-JF6JF8eO.js +1 -0
- package/dist/web/assets/impexp-tab-JF6JF8eO.js.br +0 -0
- package/dist/web/assets/impexp-tab-JF6JF8eO.js.gz +0 -0
- package/dist/web/assets/index-DyYGWFVa.css +1 -0
- package/dist/web/assets/index-DyYGWFVa.css.br +0 -0
- package/dist/web/assets/index-DyYGWFVa.css.gz +0 -0
- package/dist/web/assets/index-ItT-dTPV.js +59 -0
- package/dist/web/assets/index-ItT-dTPV.js.br +0 -0
- package/dist/web/assets/index-ItT-dTPV.js.gz +0 -0
- package/dist/web/assets/info-3K5VOQVL-CE88wNg6.js +1 -0
- package/dist/web/assets/infoDiagram-LFFYTUFH-BCnHmp4F.js +2 -0
- package/dist/web/assets/input-CKGoVpYv.js +1 -0
- package/dist/web/assets/isEmpty-dcb0OVvj.js +1 -0
- package/dist/web/assets/isEmpty-dcb0OVvj.js.br +0 -0
- package/dist/web/assets/isEmpty-dcb0OVvj.js.gz +0 -0
- package/dist/web/assets/ishikawaDiagram-PHBUUO56-gS3UZ04x.js +70 -0
- package/dist/web/assets/ishikawaDiagram-PHBUUO56-gS3UZ04x.js.br +0 -0
- package/dist/web/assets/ishikawaDiagram-PHBUUO56-gS3UZ04x.js.gz +0 -0
- package/dist/web/assets/jinja-CUU2G4qS.js +1 -0
- package/dist/web/assets/jinja-CUU2G4qS.js.br +0 -0
- package/dist/web/assets/jinja-CUU2G4qS.js.gz +0 -0
- package/dist/web/assets/jira-watcher-section-CvyXLyjO.js +1 -0
- package/dist/web/assets/jison-Cafe7d1m.js +1 -0
- package/dist/web/assets/jison-Cafe7d1m.js.br +0 -0
- package/dist/web/assets/jison-Cafe7d1m.js.gz +0 -0
- package/dist/web/assets/journeyDiagram-4ABVD52K-COVa2Vge.js +139 -0
- package/dist/web/assets/journeyDiagram-4ABVD52K-COVa2Vge.js.br +0 -0
- package/dist/web/assets/journeyDiagram-4ABVD52K-COVa2Vge.js.gz +0 -0
- package/dist/web/assets/julia-6B24A_s4.js +1 -0
- package/dist/web/assets/julia-6B24A_s4.js.br +0 -0
- package/dist/web/assets/julia-6B24A_s4.js.gz +0 -0
- package/dist/web/assets/just-B-sDN3xg.js +1 -0
- package/dist/web/assets/just-B-sDN3xg.js.br +0 -0
- package/dist/web/assets/just-B-sDN3xg.js.gz +0 -0
- package/dist/web/assets/kanban-definition-K7BYSVSG-CtqP4i48.js +89 -0
- package/dist/web/assets/kanban-definition-K7BYSVSG-CtqP4i48.js.br +0 -0
- package/dist/web/assets/kanban-definition-K7BYSVSG-CtqP4i48.js.gz +0 -0
- package/dist/web/assets/keybindings-store-CeEtx6js.js +1 -0
- package/dist/web/assets/keyboard-shortcuts-section-MUIE0Rvf.js +1 -0
- package/dist/web/assets/keyboard-shortcuts-section-MUIE0Rvf.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-MUIE0Rvf.js.gz +0 -0
- package/dist/web/assets/language-servers-section-DiYURB24.js +2 -0
- package/dist/web/assets/language-servers-section-DiYURB24.js.br +0 -0
- package/dist/web/assets/language-servers-section-DiYURB24.js.gz +0 -0
- package/dist/web/assets/latex-BRjk2Rtm.js +1 -0
- package/dist/web/assets/latex-BRjk2Rtm.js.br +0 -0
- package/dist/web/assets/latex-BRjk2Rtm.js.gz +0 -0
- package/dist/web/assets/line-DXN3CJk7.js +1 -0
- package/dist/web/assets/linear-A-Z2llI9.js +1 -0
- package/dist/web/assets/linear-A-Z2llI9.js.br +0 -0
- package/dist/web/assets/linear-A-Z2llI9.js.gz +0 -0
- package/dist/web/assets/liquid-C5GHq6B-.js +1 -0
- package/dist/web/assets/liquid-C5GHq6B-.js.br +0 -0
- package/dist/web/assets/liquid-C5GHq6B-.js.gz +0 -0
- package/dist/web/assets/logs-app-C4OVSXwd.css +1 -0
- package/dist/web/assets/logs-app-C4OVSXwd.css.br +0 -0
- package/dist/web/assets/logs-app-C4OVSXwd.css.gz +0 -0
- package/dist/web/assets/logs-app-CJlNqOdc.js +13 -0
- package/dist/web/assets/logs-app-CJlNqOdc.js.br +0 -0
- package/dist/web/assets/logs-app-CJlNqOdc.js.gz +0 -0
- package/dist/web/assets/logs-tab-BoAlm_8H.js +1 -0
- package/dist/web/assets/logs-window-content-nNm4jl1s.js +1 -0
- package/dist/web/assets/lsp-client-LnKiMWeG.js +1 -0
- package/dist/web/assets/lsp-client-LnKiMWeG.js.br +0 -0
- package/dist/web/assets/lsp-client-LnKiMWeG.js.gz +0 -0
- package/dist/web/assets/lua-CREU2Cg5.js +1 -0
- package/dist/web/assets/lua-CREU2Cg5.js.br +0 -0
- package/dist/web/assets/lua-CREU2Cg5.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-8Hef5MLx.js +1 -0
- package/dist/web/assets/markdown-renderer-BH_CFPJw.js +5 -0
- package/dist/web/assets/markdown-renderer-BH_CFPJw.js.br +0 -0
- package/dist/web/assets/markdown-renderer-BH_CFPJw.js.gz +0 -0
- package/dist/web/assets/marko-A01nJSfd.js +1 -0
- package/dist/web/assets/marko-A01nJSfd.js.br +0 -0
- package/dist/web/assets/marko-A01nJSfd.js.gz +0 -0
- package/dist/web/assets/mdc-coGBHeYV.js +1 -0
- package/dist/web/assets/mdc-coGBHeYV.js.br +0 -0
- package/dist/web/assets/mdc-coGBHeYV.js.gz +0 -0
- package/dist/web/assets/media-url-CsdZ6q_T.js +1 -0
- package/dist/web/assets/mermaid-parser.core-BwbMfUJY.js +4 -0
- package/dist/web/assets/mermaid-parser.core-BwbMfUJY.js.br +0 -0
- package/dist/web/assets/mermaid-parser.core-BwbMfUJY.js.gz +0 -0
- package/dist/web/assets/mermaid.core-DNHX7DSU.js +11 -0
- package/dist/web/assets/mermaid.core-DNHX7DSU.js.br +0 -0
- package/dist/web/assets/mermaid.core-DNHX7DSU.js.gz +0 -0
- package/dist/web/assets/mindmap-definition-YRQLILUH-B7las60M.js +68 -0
- package/dist/web/assets/mindmap-definition-YRQLILUH-B7las60M.js.br +0 -0
- package/dist/web/assets/mindmap-definition-YRQLILUH-B7las60M.js.gz +0 -0
- package/dist/web/assets/mobile-bottom-sheet-CGmmdp_5.js +1 -0
- package/dist/web/assets/mobile-bottom-sheet-CGmmdp_5.js.br +0 -0
- package/dist/web/assets/mobile-bottom-sheet-CGmmdp_5.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Dh2ZECzL.js +1 -0
- package/dist/web/assets/mobile-explorer-sheet-Dh2ZECzL.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Dh2ZECzL.js.gz +0 -0
- package/dist/web/assets/monaco-dotenv-language-IZxwhtNA.js +1 -0
- package/dist/web/assets/new-design-dialog-CgBUrVFx.js +1 -0
- package/dist/web/assets/new-design-dialog-CgBUrVFx.js.br +0 -0
- package/dist/web/assets/new-design-dialog-CgBUrVFx.js.gz +0 -0
- package/dist/web/assets/nextflow-DKFYidyC.js +1 -0
- package/dist/web/assets/nextflow-DKFYidyC.js.br +0 -0
- package/dist/web/assets/nextflow-DKFYidyC.js.gz +0 -0
- package/dist/web/assets/nginx-B9Y4fsja.js +1 -0
- package/dist/web/assets/nginx-B9Y4fsja.js.br +0 -0
- package/dist/web/assets/nginx-B9Y4fsja.js.gz +0 -0
- package/dist/web/assets/nim-BEDyxLED.js +1 -0
- package/dist/web/assets/nim-BEDyxLED.js.br +0 -0
- package/dist/web/assets/nim-BEDyxLED.js.gz +0 -0
- package/dist/web/assets/notification-store-CXC7u6MW.js +1 -0
- package/dist/web/assets/notifications-settings-section-CPbx23nU.js +1 -0
- package/dist/web/assets/notifications-settings-section-CPbx23nU.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-CPbx23nU.js.gz +0 -0
- package/dist/web/assets/onboarding-entry--MWe4amV.js +1 -0
- package/dist/web/assets/onboarding-entry--MWe4amV.js.br +0 -0
- package/dist/web/assets/onboarding-entry--MWe4amV.js.gz +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DZYQekRt.js +1 -0
- package/dist/web/assets/onboarding-quick-orientation-DZYQekRt.js.br +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DZYQekRt.js.gz +0 -0
- package/dist/web/assets/open-db-tabs-CkQe49j_.js +1 -0
- package/dist/web/assets/open-db-tabs-CkQe49j_.js.br +0 -0
- package/dist/web/assets/open-db-tabs-CkQe49j_.js.gz +0 -0
- package/dist/web/assets/open-settings-DsGBn73g.js +1 -0
- package/dist/web/assets/ordinal-U3GzwL7N.js +1 -0
- package/dist/web/assets/ordinal-U3GzwL7N.js.br +0 -0
- package/dist/web/assets/ordinal-U3GzwL7N.js.gz +0 -0
- package/dist/web/assets/overview-panel-CcUGDvnt.js +1 -0
- package/dist/web/assets/overview-panel-CcUGDvnt.js.br +0 -0
- package/dist/web/assets/overview-panel-CcUGDvnt.js.gz +0 -0
- package/dist/web/assets/packet-RMMSAZCW-m_QfwO7e.js +1 -0
- package/dist/web/assets/panel-store-DmP16Fo0.js +1 -0
- package/dist/web/assets/panel-store-DmP16Fo0.js.br +0 -0
- package/dist/web/assets/panel-store-DmP16Fo0.js.gz +0 -0
- package/dist/web/assets/patch-tab-metadata-B-jH5svY.js +1 -0
- package/dist/web/assets/pdf-preview-DMUIWb9B.js +1 -0
- package/dist/web/assets/pdf-preview-DMUIWb9B.js.br +0 -0
- package/dist/web/assets/pdf-preview-DMUIWb9B.js.gz +0 -0
- package/dist/web/assets/performance-panel-CJDLUwrs.js +3 -0
- package/dist/web/assets/performance-panel-CJDLUwrs.js.br +0 -0
- package/dist/web/assets/performance-panel-CJDLUwrs.js.gz +0 -0
- package/dist/web/assets/perl-CSnMi18C.js +1 -0
- package/dist/web/assets/perl-CSnMi18C.js.br +0 -0
- package/dist/web/assets/perl-CSnMi18C.js.gz +0 -0
- package/dist/web/assets/php-BXzT2401.js +1 -0
- package/dist/web/assets/php-BXzT2401.js.br +0 -0
- package/dist/web/assets/php-BXzT2401.js.gz +0 -0
- package/dist/web/assets/pie-UPGHQEXC-CLkXafuF.js +1 -0
- package/dist/web/assets/pieDiagram-SKSYHLDU-BO4P6Wpl.js +30 -0
- package/dist/web/assets/pieDiagram-SKSYHLDU-BO4P6Wpl.js.br +0 -0
- package/dist/web/assets/pieDiagram-SKSYHLDU-BO4P6Wpl.js.gz +0 -0
- package/dist/web/assets/ppmbot-settings-section-DTCTPQ-R.js +1 -0
- package/dist/web/assets/ppmbot-settings-section-DTCTPQ-R.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-DTCTPQ-R.js.gz +0 -0
- package/dist/web/assets/pptx-export-BxmgltJ4.js +111 -0
- package/dist/web/assets/pptx-export-BxmgltJ4.js.br +0 -0
- package/dist/web/assets/pptx-export-BxmgltJ4.js.gz +0 -0
- package/dist/web/assets/problems-panel-DX32QDH_.js +1 -0
- package/dist/web/assets/problems-panel-DX32QDH_.js.br +0 -0
- package/dist/web/assets/problems-panel-DX32QDH_.js.gz +0 -0
- package/dist/web/assets/process-row-format-CBw-CQCx.js +1 -0
- package/dist/web/assets/process-table-CX-NhOg6.js +1 -0
- package/dist/web/assets/process-table-CX-NhOg6.js.br +0 -0
- package/dist/web/assets/process-table-CX-NhOg6.js.gz +0 -0
- package/dist/web/assets/project-framework-store-Bi5dyHdx.js +1 -0
- package/dist/web/assets/project-store-CEGoLMOl.js +1 -0
- package/dist/web/assets/project-store-CEGoLMOl.js.br +0 -0
- package/dist/web/assets/project-store-CEGoLMOl.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-BGNvFe7e.js +1 -0
- package/dist/web/assets/proxy-settings-section-BGNvFe7e.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-BGNvFe7e.js.gz +0 -0
- package/dist/web/assets/pug-Bv9xupen.js +1 -0
- package/dist/web/assets/pug-Bv9xupen.js.br +0 -0
- package/dist/web/assets/pug-Bv9xupen.js.gz +0 -0
- package/dist/web/assets/qml-C3E1ICV4.js +1 -0
- package/dist/web/assets/qml-C3E1ICV4.js.br +0 -0
- package/dist/web/assets/qml-C3E1ICV4.js.gz +0 -0
- package/dist/web/assets/quadrantDiagram-337W2JSQ-B4TWXN8P.js +7 -0
- package/dist/web/assets/quadrantDiagram-337W2JSQ-B4TWXN8P.js.br +0 -0
- package/dist/web/assets/quadrantDiagram-337W2JSQ-B4TWXN8P.js.gz +0 -0
- package/dist/web/assets/query-audit-section-DTHI5GP7.js +1 -0
- package/dist/web/assets/query-audit-section-DTHI5GP7.js.br +0 -0
- package/dist/web/assets/query-audit-section-DTHI5GP7.js.gz +0 -0
- package/dist/web/assets/query-tab-qMlIkHRk.js +22 -0
- package/dist/web/assets/query-tab-qMlIkHRk.js.br +0 -0
- package/dist/web/assets/query-tab-qMlIkHRk.js.gz +0 -0
- package/dist/web/assets/radar-KQ55EAFF-BMCQVm9g.js +1 -0
- package/dist/web/assets/razor-wo4lUwpU.js +1 -0
- package/dist/web/assets/razor-wo4lUwpU.js.br +0 -0
- package/dist/web/assets/razor-wo4lUwpU.js.gz +0 -0
- package/dist/web/assets/remote-access-settings-section-t2BYAA9g.js +1 -0
- package/dist/web/assets/remote-access-settings-section-t2BYAA9g.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-t2BYAA9g.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-ChUU6Jts.js +1 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-ChUU6Jts.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-ChUU6Jts.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-_bopEtCa.js +2 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-_bopEtCa.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-_bopEtCa.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-D9G4kDfa.js +1 -0
- package/dist/web/assets/remote-desktop-mobile-view-D9G4kDfa.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-D9G4kDfa.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-Yz9eVB3-.js +1 -0
- package/dist/web/assets/remote-desktop-readiness-gate-Yz9eVB3-.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-Yz9eVB3-.js.gz +0 -0
- package/dist/web/assets/remote-desktop-settings-section-BTGGSjZY.js +1 -0
- package/dist/web/assets/remote-desktop-settings-section-BTGGSjZY.js.br +0 -0
- package/dist/web/assets/remote-desktop-settings-section-BTGGSjZY.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-B8ZaG2bL.js +1 -0
- package/dist/web/assets/remote-desktop-window-content-B8ZaG2bL.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-B8ZaG2bL.js.gz +0 -0
- package/dist/web/assets/rename-object-dialog-FSlcdUoB.js +1 -0
- package/dist/web/assets/rename-object-dialog-FSlcdUoB.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-FSlcdUoB.js.gz +0 -0
- package/dist/web/assets/requirementDiagram-Z7DCOOCP-C3bEBd6h.js +73 -0
- package/dist/web/assets/requirementDiagram-Z7DCOOCP-C3bEBd6h.js.br +0 -0
- package/dist/web/assets/requirementDiagram-Z7DCOOCP-C3bEBd6h.js.gz +0 -0
- package/dist/web/assets/review-code-CfuJeLYd.js +5 -0
- package/dist/web/assets/review-code-CfuJeLYd.js.br +0 -0
- package/dist/web/assets/review-code-CfuJeLYd.js.gz +0 -0
- package/dist/web/assets/rst-BP6JFRY2.js +1 -0
- package/dist/web/assets/rst-BP6JFRY2.js.br +0 -0
- package/dist/web/assets/rst-BP6JFRY2.js.gz +0 -0
- package/dist/web/assets/ruby-EPVx8l1i.js +1 -0
- package/dist/web/assets/ruby-EPVx8l1i.js.br +0 -0
- package/dist/web/assets/ruby-EPVx8l1i.js.gz +0 -0
- package/dist/web/assets/run-in-terminal-Bk9Bw7G1.js +1 -0
- package/dist/web/assets/run-in-terminal-button-DFPQUlZs.js +1 -0
- package/dist/web/assets/sankeyDiagram-WA2Y5GQK-BxAKhnHw.js +10 -0
- package/dist/web/assets/sankeyDiagram-WA2Y5GQK-BxAKhnHw.js.br +0 -0
- package/dist/web/assets/sankeyDiagram-WA2Y5GQK-BxAKhnHw.js.gz +0 -0
- package/dist/web/assets/sas-NhxEMTOf.js +1 -0
- package/dist/web/assets/sas-NhxEMTOf.js.br +0 -0
- package/dist/web/assets/sas-NhxEMTOf.js.gz +0 -0
- package/dist/web/assets/save-as-dialog-Bj9VpGYf.js +1 -0
- package/dist/web/assets/save-as-dialog-Bj9VpGYf.js.br +0 -0
- package/dist/web/assets/save-as-dialog-Bj9VpGYf.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-DNJ4K7zS.js +1 -0
- package/dist/web/assets/schedules-settings-section-DNJ4K7zS.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-DNJ4K7zS.js.gz +0 -0
- package/dist/web/assets/scroll-area-6Am1KMiB.js +1 -0
- package/dist/web/assets/scroll-area-6Am1KMiB.js.br +0 -0
- package/dist/web/assets/scroll-area-6Am1KMiB.js.gz +0 -0
- package/dist/web/assets/scss-DdAMYXTJ.js +1 -0
- package/dist/web/assets/scss-DdAMYXTJ.js.br +0 -0
- package/dist/web/assets/scss-DdAMYXTJ.js.gz +0 -0
- package/dist/web/assets/send-to-chat-Bcm_Lcog.js +1 -0
- package/dist/web/assets/send-to-chat-Bcm_Lcog.js.br +0 -0
- package/dist/web/assets/send-to-chat-Bcm_Lcog.js.gz +0 -0
- package/dist/web/assets/separator-BOYUIPkH.js +1 -0
- package/dist/web/assets/sequenceDiagram-2WXFIKYE-Dfq9uyFD.js +145 -0
- package/dist/web/assets/sequenceDiagram-2WXFIKYE-Dfq9uyFD.js.br +0 -0
- package/dist/web/assets/sequenceDiagram-2WXFIKYE-Dfq9uyFD.js.gz +0 -0
- package/dist/web/assets/services-panel-CBRTsROB.js +1 -0
- package/dist/web/assets/services-panel-CBRTsROB.js.br +0 -0
- package/dist/web/assets/services-panel-CBRTsROB.js.gz +0 -0
- package/dist/web/assets/session-changes-bar-BRopa3Dh.js +1 -0
- package/dist/web/assets/session-changes-bar-BRopa3Dh.js.br +0 -0
- package/dist/web/assets/session-changes-bar-BRopa3Dh.js.gz +0 -0
- package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js +1 -0
- package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js.br +0 -0
- package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js.gz +0 -0
- package/dist/web/assets/session-review-tab--kNB_FKQ.js +6 -0
- package/dist/web/assets/session-review-tab--kNB_FKQ.js.br +0 -0
- package/dist/web/assets/session-review-tab--kNB_FKQ.js.gz +0 -0
- package/dist/web/assets/session-turns-gmrmXzeg.js +9 -0
- package/dist/web/assets/session-turns-gmrmXzeg.js.br +0 -0
- package/dist/web/assets/session-turns-gmrmXzeg.js.gz +0 -0
- package/dist/web/assets/settings-body-B-s0fEjc.js +1 -0
- package/dist/web/assets/settings-body-B-s0fEjc.js.br +0 -0
- package/dist/web/assets/settings-body-B-s0fEjc.js.gz +0 -0
- package/dist/web/assets/settings-categories-CcR9eL3x.js +1 -0
- package/dist/web/assets/settings-categories-CcR9eL3x.js.br +0 -0
- package/dist/web/assets/settings-categories-CcR9eL3x.js.gz +0 -0
- package/dist/web/assets/settings-section-content-BJ35dy5r.js +1 -0
- package/dist/web/assets/settings-section-content-DckksvTg.js +2 -0
- package/dist/web/assets/settings-section-content-DckksvTg.js.br +0 -0
- package/dist/web/assets/settings-section-content-DckksvTg.js.gz +0 -0
- package/dist/web/assets/settings-store-WeJyQVL8.js +2 -0
- package/dist/web/assets/settings-store-WeJyQVL8.js.br +0 -0
- package/dist/web/assets/settings-store-WeJyQVL8.js.gz +0 -0
- package/dist/web/assets/settings-tab-BlX33GEN.js +1 -0
- package/dist/web/assets/settings-window-content-B-7yV1_q.js +1 -0
- package/dist/web/assets/shaderlab-Cv3mWofL.js +1 -0
- package/dist/web/assets/shaderlab-Cv3mWofL.js.br +0 -0
- package/dist/web/assets/shaderlab-Cv3mWofL.js.gz +0 -0
- package/dist/web/assets/shellsession-47z2x_c2.js +1 -0
- package/dist/web/assets/slash-command-picker-BBcy6w6m.js +1 -0
- package/dist/web/assets/slash-command-picker-BBcy6w6m.js.br +0 -0
- package/dist/web/assets/slash-command-picker-BBcy6w6m.js.gz +0 -0
- package/dist/web/assets/sortable-header-B9gfWik4.js +1 -0
- package/dist/web/assets/sortable-header-B9gfWik4.js.br +0 -0
- package/dist/web/assets/sortable-header-B9gfWik4.js.gz +0 -0
- package/dist/web/assets/soy-DbMmewuy.js +1 -0
- package/dist/web/assets/soy-DbMmewuy.js.br +0 -0
- package/dist/web/assets/soy-DbMmewuy.js.gz +0 -0
- package/dist/web/assets/sparql-TvnQmFDh.js +1 -0
- package/dist/web/assets/sparql-TvnQmFDh.js.br +0 -0
- package/dist/web/assets/sparql-TvnQmFDh.js.gz +0 -0
- package/dist/web/assets/sql-completion-provider-CaTHVr1l.js +5 -0
- package/dist/web/assets/sql-completion-provider-CaTHVr1l.js.br +0 -0
- package/dist/web/assets/sql-completion-provider-CaTHVr1l.js.gz +0 -0
- package/dist/web/assets/sql-identifiers-DDISwQor.js +1 -0
- package/dist/web/assets/sql-identifiers-DDISwQor.js.br +0 -0
- package/dist/web/assets/sql-identifiers-DDISwQor.js.gz +0 -0
- package/dist/web/assets/sql-object-tab-DVo4bxRI.js +1 -0
- package/dist/web/assets/sql-object-tab-DVo4bxRI.js.br +0 -0
- package/dist/web/assets/sql-object-tab-DVo4bxRI.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-BGfIpl5x.js +1 -0
- package/dist/web/assets/sqlite-viewer-BGfIpl5x.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-BGfIpl5x.js.gz +0 -0
- package/dist/web/assets/start-ellipsis-rBh37k0n.js +1 -0
- package/dist/web/assets/stata-ColYzPoX.js +1 -0
- package/dist/web/assets/stata-ColYzPoX.js.br +0 -0
- package/dist/web/assets/stata-ColYzPoX.js.gz +0 -0
- package/dist/web/assets/stateDiagram-RAJIS63D-B8YqGq27.js +1 -0
- package/dist/web/assets/stateDiagram-RAJIS63D-B8YqGq27.js.br +0 -0
- package/dist/web/assets/stateDiagram-RAJIS63D-B8YqGq27.js.gz +0 -0
- package/dist/web/assets/stateDiagram-v2-FVOUBMTO-U76Fcmmw.js +1 -0
- package/dist/web/assets/structure-save-dialog-STK_RFCK.js +1 -0
- package/dist/web/assets/structure-save-dialog-STK_RFCK.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-STK_RFCK.js.gz +0 -0
- package/dist/web/assets/structure-tab-DuLnsTC4.js +3 -0
- package/dist/web/assets/structure-tab-DuLnsTC4.js.br +0 -0
- package/dist/web/assets/structure-tab-DuLnsTC4.js.gz +0 -0
- package/dist/web/assets/surrealql-Bq6PTSr5.js +1 -0
- package/dist/web/assets/surrealql-Bq6PTSr5.js.br +0 -0
- package/dist/web/assets/surrealql-Bq6PTSr5.js.gz +0 -0
- package/dist/web/assets/svelte-QMQkUlOI.js +1 -0
- package/dist/web/assets/svelte-QMQkUlOI.js.br +0 -0
- package/dist/web/assets/svelte-QMQkUlOI.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-BIjW16Pb.js +2 -0
- package/dist/web/assets/system-monitor-body-BIjW16Pb.js.br +0 -0
- package/dist/web/assets/system-monitor-body-BIjW16Pb.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-B6_tC9LO.js +1 -0
- package/dist/web/assets/system-monitor-window-content-CwBzqMUe.js +1 -0
- package/dist/web/assets/tab-host-window-content-CpdEjkZd.js +1 -0
- package/dist/web/assets/tab-host-window-content-CpdEjkZd.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-CpdEjkZd.js.gz +0 -0
- package/dist/web/assets/tab-store-nNzRNfVV.js +1 -0
- package/dist/web/assets/table-tab-B5asfTBP.js +2 -0
- package/dist/web/assets/table-tab-B5asfTBP.js.br +0 -0
- package/dist/web/assets/table-tab-B5asfTBP.js.gz +0 -0
- package/dist/web/assets/telegram-bot-token-field-BiqKbXwE.js +1 -0
- package/dist/web/assets/telegram-bot-token-field-BiqKbXwE.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-BiqKbXwE.js.gz +0 -0
- package/dist/web/assets/templ-C1kESo-I.js +1 -0
- package/dist/web/assets/templ-C1kESo-I.js.br +0 -0
- package/dist/web/assets/templ-C1kESo-I.js.gz +0 -0
- package/dist/web/assets/terminal-tab-DpMONMVB.js +3 -0
- package/dist/web/assets/terminal-tab-DpMONMVB.js.br +0 -0
- package/dist/web/assets/terminal-tab-DpMONMVB.js.gz +0 -0
- package/dist/web/assets/tex-B0snethp.js +1 -0
- package/dist/web/assets/tex-B0snethp.js.br +0 -0
- package/dist/web/assets/tex-B0snethp.js.gz +0 -0
- package/dist/web/assets/timeline-definition-YZTLITO2-3U3p-lPX.js +61 -0
- package/dist/web/assets/timeline-definition-YZTLITO2-3U3p-lPX.js.br +0 -0
- package/dist/web/assets/timeline-definition-YZTLITO2-3U3p-lPX.js.gz +0 -0
- package/dist/web/assets/tool-cards-DoDKxqN4.js +14 -0
- package/dist/web/assets/tool-cards-DoDKxqN4.js.br +0 -0
- package/dist/web/assets/tool-cards-DoDKxqN4.js.gz +0 -0
- package/dist/web/assets/treemap-KZPCXAKY-X6uv-HhJ.js +1 -0
- package/dist/web/assets/ts-tags-XXdX0qhp.js +1 -0
- package/dist/web/assets/ts-tags-XXdX0qhp.js.br +0 -0
- package/dist/web/assets/ts-tags-XXdX0qhp.js.gz +0 -0
- package/dist/web/assets/twig-DIZPhfGq.js +1 -0
- package/dist/web/assets/twig-DIZPhfGq.js.br +0 -0
- package/dist/web/assets/twig-DIZPhfGq.js.gz +0 -0
- package/dist/web/assets/use-at-most-wide-BQFi1Sjv.js +1 -0
- package/dist/web/assets/use-blob-url-D7ElNPnW.js +1 -0
- package/dist/web/assets/use-db-driver-installed-BscdI-wS.js +1 -0
- package/dist/web/assets/use-db-read-DYuyNA5i.js +1 -0
- package/dist/web/assets/use-db-read-DYuyNA5i.js.br +0 -0
- package/dist/web/assets/use-db-read-DYuyNA5i.js.gz +0 -0
- package/dist/web/assets/use-db-tab-Cr4lXxwF.js +1 -0
- package/dist/web/assets/use-db-tab-Cr4lXxwF.js.br +0 -0
- package/dist/web/assets/use-db-tab-Cr4lXxwF.js.gz +0 -0
- package/dist/web/assets/use-design-canvas-check-DKlyMp-S.js +1 -0
- package/dist/web/assets/use-design-canvas-check-DKlyMp-S.js.br +0 -0
- package/dist/web/assets/use-design-canvas-check-DKlyMp-S.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-DS0HrHJ3.js +16 -0
- package/dist/web/assets/use-inline-blame-DS0HrHJ3.js.br +0 -0
- package/dist/web/assets/use-inline-blame-DS0HrHJ3.js.gz +0 -0
- package/dist/web/assets/use-lsp-BTVDYrt6.js +6 -0
- package/dist/web/assets/use-lsp-BTVDYrt6.js.br +0 -0
- package/dist/web/assets/use-lsp-BTVDYrt6.js.gz +0 -0
- package/dist/web/assets/use-monaco-theme-DqnhExsm.js +1 -0
- package/dist/web/assets/use-opener-focus-C5L5UUJs.js +1 -0
- package/dist/web/assets/use-process-kill-D-SGQxDn.js +1 -0
- package/dist/web/assets/use-process-kill-D-SGQxDn.js.br +0 -0
- package/dist/web/assets/use-process-kill-D-SGQxDn.js.gz +0 -0
- package/dist/web/assets/use-sql-schema-info-DRb9dAKi.js +4 -0
- package/dist/web/assets/use-sql-schema-info-DRb9dAKi.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-DRb9dAKi.js.gz +0 -0
- package/dist/web/assets/use-websocket-C6RnlNVJ.js +1 -0
- package/dist/web/assets/vendor-ui-CS1GvlOm.js +45 -0
- package/dist/web/assets/vendor-ui-CS1GvlOm.js.br +0 -0
- package/dist/web/assets/vendor-ui-CS1GvlOm.js.gz +0 -0
- package/dist/web/assets/vennDiagram-LZ73GAT5-DA_6uAVT.js +34 -0
- package/dist/web/assets/vennDiagram-LZ73GAT5-DA_6uAVT.js.br +0 -0
- package/dist/web/assets/vennDiagram-LZ73GAT5-DA_6uAVT.js.gz +0 -0
- package/dist/web/assets/video-preview-CYzeUPfH.js +1 -0
- package/dist/web/assets/video-preview-CYzeUPfH.js.br +0 -0
- package/dist/web/assets/video-preview-CYzeUPfH.js.gz +0 -0
- package/dist/web/assets/voice-settings-section-C01d-toF.js +1 -0
- package/dist/web/assets/voice-settings-section-C01d-toF.js.br +0 -0
- package/dist/web/assets/voice-settings-section-C01d-toF.js.gz +0 -0
- package/dist/web/assets/vue-Bzq4wgkZ.js +1 -0
- package/dist/web/assets/vue-Bzq4wgkZ.js.br +0 -0
- package/dist/web/assets/vue-Bzq4wgkZ.js.gz +0 -0
- package/dist/web/assets/vue-html-Cw1hn392.js +1 -0
- package/dist/web/assets/vue-html-Cw1hn392.js.br +0 -0
- package/dist/web/assets/vue-html-Cw1hn392.js.gz +0 -0
- package/dist/web/assets/vue-vine-BnNe0hw6.js +1 -0
- package/dist/web/assets/vue-vine-BnNe0hw6.js.br +0 -0
- package/dist/web/assets/vue-vine-BnNe0hw6.js.gz +0 -0
- package/dist/web/assets/web-preview-tab-F5C3quQs.js +1 -0
- package/dist/web/assets/web-preview-tab-F5C3quQs.js.br +0 -0
- package/dist/web/assets/web-preview-tab-F5C3quQs.js.gz +0 -0
- package/dist/web/assets/window-pip-registry-DSoB7T3k.js +1 -0
- package/dist/web/assets/window-store-zJczRsv4.js +1 -0
- package/dist/web/assets/window-store-zJczRsv4.js.br +0 -0
- package/dist/web/assets/window-store-zJczRsv4.js.gz +0 -0
- package/dist/web/assets/ws-auth-cWeQ7_61.js +1 -0
- package/dist/web/assets/xml-B_Dd-eqG.js +1 -0
- package/dist/web/assets/xml-B_Dd-eqG.js.br +0 -0
- package/dist/web/assets/xml-B_Dd-eqG.js.gz +0 -0
- package/dist/web/assets/xsl-gLqXzcUZ.js +1 -0
- package/dist/web/assets/xsl-gLqXzcUZ.js.br +0 -0
- package/dist/web/assets/xsl-gLqXzcUZ.js.gz +0 -0
- package/dist/web/assets/xychartDiagram-JWTSCODW-B02PE8Cu.js +7 -0
- package/dist/web/assets/xychartDiagram-JWTSCODW-B02PE8Cu.js.br +0 -0
- package/dist/web/assets/xychartDiagram-JWTSCODW-B02PE8Cu.js.gz +0 -0
- package/dist/web/index.html +52 -35
- package/dist/web/index.html.br +0 -0
- package/dist/web/index.html.gz +0 -0
- package/dist/web/sw.js +1 -1
- package/dist/web/sw.js.br +0 -0
- package/dist/web/sw.js.gz +0 -0
- package/docs/architecture/ai-chat-and-providers.md +389 -0
- package/docs/architecture/data-and-storage.md +108 -172
- package/docs/architecture/integrations.md +12 -4
- package/docs/architecture/workspace-and-ui.md +168 -6
- package/docs/code-standards.md +30 -1
- package/docs/codebase-summary.md +36 -23
- package/docs/deployment-guide.md +56 -12
- package/docs/project-overview-pdr.md +2 -2
- package/docs/project-roadmap.md +21 -2
- package/docs/system-architecture.md +12 -7
- package/package.json +4 -3
- package/packages/ext-git-graph/src/checkout-pathspec.test.ts +52 -0
- package/packages/ext-git-graph/src/commit-detail-escaping.test.ts +84 -30
- package/packages/ext-git-graph/src/commit-detail-status.test.ts +83 -0
- package/packages/ext-git-graph/src/commit-keeps-typing.test.ts +54 -0
- package/packages/ext-git-graph/src/commit-paging.test.ts +93 -0
- package/packages/ext-git-graph/src/discard-undo-toast.test.ts +46 -0
- package/packages/ext-git-graph/src/extension.ts +517 -308
- package/packages/ext-git-graph/src/fetch-through-ppm.test.ts +152 -0
- package/packages/ext-git-graph/src/git-log-parser.ts +3 -1
- package/packages/ext-git-graph/src/gone-branch-filter.test.ts +65 -0
- package/packages/ext-git-graph/src/inspector-file-icons.test.ts +93 -0
- package/packages/ext-git-graph/src/log-args.test.ts +2 -2
- package/packages/ext-git-graph/src/outside-ref-changes.test.ts +185 -0
- package/packages/ext-git-graph/src/panel-test-harness.ts +242 -0
- package/packages/ext-git-graph/src/ppm-git.test.ts +76 -0
- package/packages/ext-git-graph/src/ppm-git.ts +151 -0
- package/packages/ext-git-graph/src/remote-head-refs.test.ts +32 -0
- package/packages/ext-git-graph/src/request-answers.test.ts +76 -0
- package/packages/ext-git-graph/src/search-marks.test.ts +53 -0
- package/packages/ext-git-graph/src/stash-list.test.ts +56 -0
- package/packages/ext-git-graph/src/types.ts +53 -16
- package/packages/ext-git-graph/src/undo-commit-webview.test.ts +82 -0
- package/packages/ext-git-graph/src/undo-targets-through-ppm.test.ts +164 -0
- package/packages/ext-git-graph/src/webview-html.test.ts +529 -595
- package/packages/ext-git-graph/src/webview-html.ts +144 -3765
- package/packages/ext-git-graph/src/webview-icons.generated.ts +69 -0
- package/packages/ext-git-graph/src/webview-protocol.test.ts +135 -0
- package/packages/ext-git-graph/src/webview-script-actions.ts +1291 -0
- package/packages/ext-git-graph/src/webview-script-core.ts +624 -0
- package/packages/ext-git-graph/src/webview-script-graph.ts +570 -0
- package/packages/ext-git-graph/src/webview-script-inspector.ts +571 -0
- package/packages/ext-git-graph/src/webview-script-list.ts +696 -0
- package/packages/ext-git-graph/src/webview-script-main.ts +279 -0
- package/packages/ext-git-graph/src/webview-script-settings.ts +285 -0
- package/packages/ext-git-graph/src/webview-styles.ts +615 -0
- package/packages/ext-git-graph/src/wip-model.ts +299 -0
- package/scripts/gen-db-driver-locks.ts +41 -0
- package/scripts/gen-file-icons.ts +27 -0
- package/scripts/gen-git-graph-icons.ts +135 -0
- package/scripts/gen-product-icons.ts +34 -0
- package/scripts/vite-glide-eager-editors.ts +37 -0
- package/src/cli/commands/config-cmd.ts +10 -0
- package/src/cli/commands/db-cmd.ts +279 -50
- package/src/cli/commands/logs.ts +26 -7
- package/src/cli/utils/tty-prompt.ts +51 -0
- package/src/index.ts +4 -0
- package/src/lib/account-crypto.ts +6 -0
- package/src/providers/claude-agent-sdk-query-options.ts +111 -0
- package/src/providers/claude-agent-sdk.ts +326 -133
- package/src/providers/claude-warm-spare.ts +26 -9
- package/src/providers/cli-provider-base.ts +28 -5
- package/src/providers/codex-app-server/codex-event-mapper.ts +4 -9
- package/src/providers/codex-app-server/codex-file-baselines.ts +47 -0
- package/src/providers/codex-app-server/codex-history.ts +1 -1
- package/src/providers/codex-app-server/codex-jsonrpc-client.ts +57 -11
- package/src/providers/codex-app-server/codex-patch.ts +68 -4
- package/src/providers/codex-app-server/codex-provider.ts +76 -14
- package/src/providers/codex-app-server/codex-rollout-header.ts +2 -1
- package/src/providers/codex-app-server/codex-rollout-items.ts +22 -0
- package/src/providers/codex-app-server/codex-thread-params.ts +34 -1
- package/src/providers/cursor-cli/cursor-history.ts +2 -1
- package/src/providers/registry.ts +12 -7
- package/src/server/index.ts +224 -103
- package/src/server/middleware/access-log.ts +127 -0
- package/src/server/middleware/auth.ts +8 -0
- package/src/server/routes/accounts.ts +13 -2
- package/src/server/routes/android.ts +6 -0
- package/src/server/routes/chat-file-changes.ts +215 -0
- package/src/server/routes/chat-history-page.ts +116 -0
- package/src/server/routes/chat.ts +125 -38
- package/src/server/routes/database-changeset.ts +178 -0
- package/src/server/routes/database-drivers.ts +36 -0
- package/src/server/routes/database-grid-export.ts +212 -0
- package/src/server/routes/database-grid.ts +317 -0
- package/src/server/routes/database-impexp.ts +317 -0
- package/src/server/routes/database-query.ts +186 -0
- package/src/server/routes/database-route-helpers.ts +130 -0
- package/src/server/routes/database-structure.ts +292 -0
- package/src/server/routes/database.ts +539 -280
- package/src/server/routes/design-settings.ts +30 -6
- package/src/server/routes/git.ts +254 -16
- package/src/server/routes/html-preview.ts +42 -9
- package/src/server/routes/jira-watcher-routes.ts +7 -1
- package/src/server/routes/logs.ts +158 -0
- package/src/server/routes/mcp.ts +11 -1
- package/src/server/routes/notifications.ts +192 -0
- package/src/server/routes/port-forwarding.ts +19 -19
- package/src/server/routes/project-scoped.ts +0 -2
- package/src/server/routes/query-audit-hook.ts +37 -31
- package/src/server/routes/remote-desktop.ts +19 -0
- package/src/server/routes/settings.ts +140 -45
- package/src/server/routes/system-services.ts +12 -6
- package/src/server/routes/tailscale.ts +70 -0
- package/src/server/routes/trace.ts +4 -1
- package/src/server/routes/tunnel-spawn.ts +55 -12
- package/src/server/routes/tunnel.ts +5 -0
- package/src/server/routes/tunnels.ts +63 -11
- package/src/server/routes/upgrade.ts +5 -1
- package/src/server/ws/android.ts +36 -11
- package/src/server/ws/chat.ts +294 -69
- package/src/server/ws/extensions.ts +13 -10
- package/src/server/ws/global.ts +14 -0
- package/src/server/ws/group-chat.ts +5 -0
- package/src/server/ws/lsp.ts +29 -4
- package/src/server/ws/remote-desktop.ts +25 -9
- package/src/server/ws/terminal.ts +8 -1
- package/src/services/account-pick.service.ts +1 -1
- package/src/services/account-selector.service.ts +76 -14
- package/src/services/account.service.ts +54 -23
- package/src/services/agent-transcript/agent-transcript-activity.ts +11 -4
- package/src/services/ai-chat-env.ts +28 -0
- package/src/services/android/android-operations.ts +10 -0
- package/src/services/android/android-session.ts +20 -0
- package/src/services/android/android-video.ts +41 -7
- package/src/services/android/avd-manager.ts +21 -3
- package/src/services/android/emulator-launcher.ts +40 -2
- package/src/services/autostart-register.ts +24 -8
- package/src/services/bash-output-spy.ts +6 -3
- package/src/services/binary-content.ts +8 -0
- package/src/services/binary-upgrade-apply.ts +5 -0
- package/src/services/binary-upgrade-download.ts +9 -1
- package/src/services/binary-upgrade-swap.ts +18 -3
- package/src/services/chat-prepare/chat-prepare.service.ts +4 -1
- package/src/services/chat-prepare/settle-within-budget.ts +10 -3
- package/src/services/chat-search.service.ts +4 -2
- package/src/services/chat.service.ts +115 -5
- package/src/services/claude-transcript-exists.ts +24 -0
- package/src/services/cloud-ws.service.ts +46 -12
- package/src/services/cloud.service.ts +40 -9
- package/src/services/cloudflared.service.ts +25 -3
- package/src/services/codex-account-cooldown.ts +4 -0
- package/src/services/codex-account-login.ts +15 -4
- package/src/services/compact-segment.ts +156 -0
- package/src/services/compaction-savings.ts +8 -2
- package/src/services/config-secret-keys.ts +2 -0
- package/src/services/config.service.ts +44 -6
- package/src/services/database/analyser-mysql.ts +384 -0
- package/src/services/database/analyser-postgres.ts +259 -0
- package/src/services/database/analyser-sqlite.ts +411 -0
- package/src/services/database/changeset.service.ts +60 -0
- package/src/services/database/changeset.ts +473 -0
- package/src/services/database/connection-config.ts +370 -0
- package/src/services/database/connection-database.ts +90 -0
- package/src/services/database/connection-endpoint.ts +160 -0
- package/src/services/database/connection-login.ts +144 -0
- package/src/services/database/connection-test.ts +191 -0
- package/src/services/database/db-errors.ts +57 -0
- package/src/services/database/db-values.ts +45 -0
- package/src/services/database/ddl/ddl-common.ts +47 -0
- package/src/services/database/ddl/ddl-mysql.ts +202 -0
- package/src/services/database/ddl/ddl-objects.ts +116 -0
- package/src/services/database/ddl/ddl-postgres.ts +208 -0
- package/src/services/database/ddl/ddl-sqlite.ts +172 -0
- package/src/services/database/ddl/ddl-types.ts +61 -0
- package/src/services/database/ddl/sqlite-alter-plan.ts +61 -0
- package/src/services/database/ddl/sqlite-apply.ts +112 -0
- package/src/services/database/ddl/sqlite-recreate.ts +202 -0
- package/src/services/database/ddl/table-diff.ts +187 -0
- package/src/services/database/dialect-mysql.ts +58 -0
- package/src/services/database/dialect-postgres.ts +52 -0
- package/src/services/database/dialect-sqlite.ts +30 -0
- package/src/services/database/dialect.ts +108 -0
- package/src/services/database/dialects.ts +20 -0
- package/src/services/database/drivers/db-driver-catalog.ts +99 -0
- package/src/services/database/drivers/db-driver-install.ts +348 -0
- package/src/services/database/drivers/db-driver-loader.ts +103 -0
- package/src/services/database/drivers/db-driver-locks.generated.json +201 -0
- package/src/services/database/drivers/db-driver-store.ts +75 -0
- package/src/services/database/export-batch.ts +68 -0
- package/src/services/database/file-database.ts +105 -0
- package/src/services/database/grid-cell.ts +80 -0
- package/src/services/database/grid-export-text.ts +318 -0
- package/src/services/database/grid-export-tickets.ts +61 -0
- package/src/services/database/grid-export-xlsx.ts +296 -0
- package/src/services/database/grid-export.ts +13 -0
- package/src/services/database/grid-query-builder.ts +397 -0
- package/src/services/database/grid.service.ts +157 -0
- package/src/services/database/host-files.ts +52 -0
- package/src/services/database/impexp/column-map.ts +58 -0
- package/src/services/database/impexp/export-job-runner.ts +281 -0
- package/src/services/database/impexp/impexp-files.ts +118 -0
- package/src/services/database/impexp/impexp-job-store.ts +195 -0
- package/src/services/database/impexp/impexp-request.ts +279 -0
- package/src/services/database/impexp/import-job-runner.ts +181 -0
- package/src/services/database/impexp/import-table-writer.ts +319 -0
- package/src/services/database/impexp/import-uploads.ts +167 -0
- package/src/services/database/impexp/readers/csv-reader.ts +359 -0
- package/src/services/database/impexp/readers/file-rows.ts +59 -0
- package/src/services/database/impexp/readers/file-text.ts +80 -0
- package/src/services/database/impexp/readers/json-reader.ts +505 -0
- package/src/services/database/impexp/zip-output.ts +55 -0
- package/src/services/database/init-adapters.ts +4 -0
- package/src/services/database/isolation-level.ts +18 -0
- package/src/services/database/mysql-adapter.ts +62 -0
- package/src/services/database/object-scripts.ts +20 -0
- package/src/services/database/object-sql-mysql.ts +53 -0
- package/src/services/database/object-sql-postgres.ts +265 -0
- package/src/services/database/object-sql-sqlite.ts +25 -0
- package/src/services/database/postgres-adapter.ts +93 -23
- package/src/services/database/postgres-array-nulls.ts +101 -0
- package/src/services/database/postgres-connect-options.ts +92 -0
- package/src/services/database/query-script-runner.ts +203 -0
- package/src/services/database/readonly-check.ts +39 -15
- package/src/services/database/sqlite-adapter.ts +100 -17
- package/src/services/database/ssh-agent-socket.ts +50 -0
- package/src/services/database/ssh-known-hosts.ts +113 -0
- package/src/services/database/ssh-tunnel.ts +613 -0
- package/src/services/database/structure-change-request.ts +214 -0
- package/src/services/database/structure-edit.service.ts +143 -0
- package/src/services/database/tls-identity-check.ts +81 -0
- package/src/services/db-backup/db-backup-restore.ts +14 -2
- package/src/services/db.service.ts +153 -54
- package/src/services/design/bridge/bridge-script.ts +14 -6
- package/src/services/design/bridge/html-preview-bridge.ts +23 -0
- package/src/services/design/comments/design-comments-store.ts +7 -2
- package/src/services/design/design-skill-install.service.ts +269 -0
- package/src/services/design/design-turn-snapshot.ts +5 -2
- package/src/services/design/mcp/design-mcp-endpoint.ts +15 -77
- package/src/services/design/mcp/design-mcp-tokens.ts +9 -65
- package/src/services/design/preview/design-preview-html.ts +1 -1
- package/src/services/draft.service.ts +10 -3
- package/src/services/edge-forwarder.ts +50 -3
- package/src/services/event-loop-lag.ts +37 -2
- package/src/services/extension-host-worker.ts +41 -6
- package/src/services/extension-installer.ts +13 -5
- package/src/services/extension-manifest.ts +9 -2
- package/src/services/extension-rpc-handlers.ts +39 -4
- package/src/services/extension-rpc.ts +31 -2
- package/src/services/extension.service.ts +48 -13
- package/src/services/file-lines.ts +2 -2
- package/src/services/file-list-index.service.ts +17 -1
- package/src/services/file-watcher/linux-inotify.ts +47 -6
- package/src/services/file-watcher/watch-tree.ts +42 -6
- package/src/services/file-watcher.service.ts +15 -7
- package/src/services/file.service.ts +6 -0
- package/src/services/fs-ops/fs-core-ops.ts +5 -1
- package/src/services/fs-ops/fs-git-init.service.ts +13 -1
- package/src/services/fs-ops/fs-ops-copy-move.service.ts +5 -0
- package/src/services/fs-ops/fs-ops-mutate.service.ts +6 -1
- package/src/services/fs-ops/fs-ops-trash.service.ts +17 -3
- package/src/services/git-changes/diff-sections.ts +230 -0
- package/src/services/git-changes/git-changes.service.ts +471 -0
- package/src/services/git-changes/git-events.ts +28 -0
- package/src/services/git-changes/git-operation.ts +86 -0
- package/src/services/git-changes/porcelain-v2.ts +117 -0
- package/src/services/git-commit-draft.service.ts +51 -0
- package/src/services/git-discard-journal/git-discard-journal.service.ts +412 -0
- package/src/services/git-hunks/git-hunks.service.ts +50 -11
- package/src/services/git-workflow/git-workflow.service.ts +198 -0
- package/src/services/git.service.ts +64 -8
- package/src/services/group-chat/group-chat.service.ts +31 -5
- package/src/services/group-chat/responder-router.ts +15 -3
- package/src/services/host-info/host-info.service.ts +16 -0
- package/src/services/host-info/spawn-runner.ts +25 -0
- package/src/services/jira-config.service.ts +13 -1
- package/src/services/jira-debug-session.service.ts +19 -4
- package/src/services/jira-watcher.service.ts +53 -11
- package/src/services/jsonl-transcript-parser.ts +49 -19
- package/src/services/log-level-config.ts +36 -0
- package/src/services/logger.ts +280 -0
- package/src/services/logs/browser-logs.ts +84 -0
- package/src/services/logs/github-issues.ts +76 -0
- package/src/services/logs/log-ai.ts +40 -0
- package/src/services/logs/log-columns.ts +160 -0
- package/src/services/logs/log-environment.ts +94 -0
- package/src/services/logs/log-file-index.ts +355 -0
- package/src/services/logs/log-issues.ts +390 -0
- package/src/services/logs/log-live.ts +82 -0
- package/src/services/logs/log-report-draft.ts +63 -0
- package/src/services/logs/log-store.ts +609 -0
- package/src/services/lsp/lsp-install.ts +199 -11
- package/src/services/lsp/lsp-manager.ts +31 -7
- package/src/services/lsp/lsp-release-catalog.ts +87 -0
- package/src/services/lsp/lsp-session.ts +29 -2
- package/src/services/lsp/server-registry.ts +85 -18
- package/src/services/mcp-http-endpoint.ts +127 -0
- package/src/services/mcp-oauth/mcp-oauth-flows.ts +11 -4
- package/src/services/mcp-session-tokens.ts +77 -0
- package/src/services/media-transcode/ffmpeg-capabilities.ts +33 -2
- package/src/services/media-transcode/transcode-stream.ts +7 -1
- package/src/services/memory-diagnostics.ts +86 -0
- package/src/services/mysql.service.ts +1065 -0
- package/src/services/named-tunnel/cloudflared-login-helpers.ts +4 -2
- package/src/services/named-tunnel/cloudflared-login.service.ts +15 -2
- package/src/services/named-tunnel/named-tunnel-setup-confirm.ts +7 -1
- package/src/services/named-tunnel/named-tunnel-setup.service.ts +9 -1
- package/src/services/nested-subagent-spy.ts +7 -4
- package/src/services/notification-format.ts +74 -0
- package/src/services/notification-link.ts +22 -0
- package/src/services/notification.service.ts +157 -12
- package/src/services/ntfy-notification.service.ts +134 -0
- package/src/services/picked-account-binding.ts +7 -1
- package/src/services/port-forward/forward-hop.ts +296 -0
- package/src/services/port-forward/frame-ancestors.ts +117 -0
- package/src/services/port-forward/tailscale-forward.ts +261 -0
- package/src/services/postgres.service.ts +815 -21
- package/src/services/ppmbot/cli-reference-default.ts +17 -4
- package/src/services/ppmbot/ppmbot-delegation.ts +8 -0
- package/src/services/ppmbot/ppmbot-service.ts +58 -46
- package/src/services/ppmbot/ppmbot-session.ts +14 -10
- package/src/services/ppmbot/ppmbot-streamer.ts +6 -3
- package/src/services/ppmbot/ppmbot-telegram.ts +45 -13
- package/src/services/project.service.ts +12 -1
- package/src/services/provider-usage/usage-registry.ts +12 -2
- package/src/services/proxy-agent-anthropic-bridge.ts +11 -1
- package/src/services/proxy-agent-bridge.ts +11 -1
- package/src/services/proxy-agent-turn.ts +25 -2
- package/src/services/proxy-image-bridge.ts +2 -2
- package/src/services/proxy-openai-bridge.ts +1 -1
- package/src/services/proxy-sdk-bridge.ts +1 -1
- package/src/services/proxy.service.ts +32 -9
- package/src/services/query-audit/query-audit.service.ts +10 -2
- package/src/services/read-lines.ts +16 -4
- package/src/services/redact-secrets.ts +23 -2
- package/src/services/remote-desktop/ffmpeg-install.ts +85 -0
- package/src/services/remote-desktop/mediamtx-install.service.ts +11 -2
- package/src/services/remote-desktop/mediamtx-process.ts +31 -2
- package/src/services/remote-desktop/remote-desktop-audio.ts +24 -7
- package/src/services/remote-desktop/remote-desktop-capture-input.ts +7 -4
- package/src/services/remote-desktop/remote-desktop-capture-wayland.ts +30 -10
- package/src/services/remote-desktop/remote-desktop-capture.ts +40 -6
- package/src/services/remote-desktop/remote-desktop-displays-win32.ts +92 -0
- package/src/services/remote-desktop/remote-desktop-displays.ts +8 -5
- package/src/services/remote-desktop/remote-desktop-input-uinput.ts +20 -1
- package/src/services/remote-desktop/remote-desktop-input-win32.ts +49 -9
- package/src/services/remote-desktop/remote-desktop-portal.ts +19 -3
- package/src/services/remote-desktop/remote-desktop-privacy.ts +8 -1
- package/src/services/remote-desktop/remote-desktop-requirements.ts +3 -2
- package/src/services/remote-desktop/remote-desktop-resolution.ts +6 -0
- package/src/services/remote-desktop/remote-desktop-session.ts +111 -27
- package/src/services/remote-desktop/remote-desktop-x11.ts +25 -2
- package/src/services/scheduler-core.ts +22 -10
- package/src/services/scheduler-runner.ts +28 -10
- package/src/services/sd-notify.ts +26 -2
- package/src/services/session-file-baselines/reverse-unified-diff.ts +85 -0
- package/src/services/session-file-baselines/session-file-baselines.service.ts +241 -0
- package/src/services/session-file-baselines/session-file-blame.ts +200 -0
- package/src/services/session-file-baselines/session-file-changes.service.ts +321 -0
- package/src/services/session-file-baselines/session-file-history.ts +347 -0
- package/src/services/session-file-baselines/session-review-actions.ts +560 -0
- package/src/services/session-file-baselines/session-review-blocks.ts +90 -0
- package/src/services/session-file-baselines/session-review-marks.ts +90 -0
- package/src/services/session-file-baselines/session-turn-revert.ts +374 -0
- package/src/services/session-file-baselines/shell-change-tracker.ts +489 -0
- package/src/services/session-trace/session-trace-db.ts +14 -1
- package/src/services/session-trace/session-trace-store.ts +56 -0
- package/src/services/session-trace/turn-stop-reader.ts +70 -0
- package/src/services/speech-to-text/whisper-install.service.ts +13 -1
- package/src/services/sqlite-types.ts +2 -0
- package/src/services/sqlite.service.ts +507 -13
- package/src/services/supervisor-state.ts +6 -4
- package/src/services/supervisor-stopped-page.ts +6 -6
- package/src/services/supervisor.ts +118 -44
- package/src/services/system-metrics/gpu-collector-nvidia.ts +13 -3
- package/src/services/system-metrics/kill-request-handler.ts +9 -8
- package/src/services/system-metrics/powershell-session.ts +40 -7
- package/src/services/system-metrics/process-collector-windows.ts +4 -3
- package/src/services/system-metrics/process-net-collector-darwin.ts +13 -5
- package/src/services/system-metrics/signal-request-handler.ts +9 -8
- package/src/services/system-metrics/system-metrics-platform.ts +11 -2
- package/src/services/system-metrics/system-metrics.service.ts +31 -4
- package/src/services/system-services/app-icon-service.ts +19 -1
- package/src/services/system-services/app-icons-windows.ts +105 -0
- package/src/services/system-services/apps-windows-native.ts +233 -0
- package/src/services/system-services/apps-windows.ts +156 -0
- package/src/services/system-services/launchd-collector.ts +12 -1
- package/src/services/system-services/service-backend.ts +6 -3
- package/src/services/system-services/systemd-collector.ts +9 -1
- package/src/services/system-services/windows-services-parse.ts +186 -0
- package/src/services/system-services/windows-services.ts +200 -0
- package/src/services/tab-tools-mcp/tab-open-broker.ts +135 -0
- package/src/services/tab-tools-mcp/tab-target.ts +88 -0
- package/src/services/tab-tools-mcp/tab-tools-mcp-endpoint.ts +116 -0
- package/src/services/tab-tools-mcp/tab-tools-mcp-tokens.ts +36 -0
- package/src/services/tab-tools-mcp/tab-tools-mcp-tool.ts +78 -0
- package/src/services/table-cache.service.ts +4 -2
- package/src/services/tailscale/tailscale-app-service.ts +239 -0
- package/src/services/tailscale/tailscale-cli.ts +48 -0
- package/src/services/tailscale/tailscale-login.ts +257 -0
- package/src/services/tailscale/tailscale-state.ts +198 -0
- package/src/services/telegram-bot-api.ts +80 -0
- package/src/services/telegram-bots.ts +131 -0
- package/src/services/telegram-connect.service.ts +262 -0
- package/src/services/telegram-notification.service.ts +48 -55
- package/src/services/terminal.service.ts +46 -11
- package/src/services/theme-import/fetch-url.ts +11 -2
- package/src/services/tunnel-registry-parse.ts +4 -0
- package/src/services/tunnel.service.ts +15 -0
- package/src/services/upgrade.service.ts +30 -2
- package/src/services/web-push/web-push-crypto.ts +150 -0
- package/src/services/web-push/web-push-store.ts +116 -0
- package/src/services/web-push/web-push.service.ts +240 -0
- package/src/shared/agent-transcript-protocol.ts +4 -1
- package/src/shared/chat-reply.ts +51 -0
- package/src/shared/db-changeset.ts +89 -0
- package/src/shared/db-column-kind.ts +90 -0
- package/src/shared/db-connection-config.ts +256 -0
- package/src/shared/db-connection-url.ts +252 -0
- package/src/shared/db-drivers.ts +36 -0
- package/src/shared/db-explorer-prefs.ts +123 -0
- package/src/shared/db-filter-parser.ts +534 -0
- package/src/shared/db-grid-export.ts +88 -0
- package/src/shared/db-grid.ts +234 -0
- package/src/shared/db-impexp.ts +313 -0
- package/src/shared/db-lookup-prefs.ts +37 -0
- package/src/shared/db-query-script.ts +110 -0
- package/src/shared/db-structure-change.ts +83 -0
- package/src/shared/db-structure.ts +195 -0
- package/src/shared/db-table-model.ts +500 -0
- package/src/shared/db-types.ts +31 -0
- package/src/shared/design-canvas-check-format.ts +23 -0
- package/src/shared/design-skill-suggestion.ts +20 -4
- package/src/shared/git-changes.ts +220 -0
- package/src/shared/log-fingerprint.ts +32 -0
- package/src/shared/log-levels.ts +41 -0
- package/src/shared/log-redact.ts +82 -0
- package/src/shared/logs-api.ts +145 -0
- package/src/shared/logs-model.ts +230 -0
- package/src/shared/notification-settings.ts +184 -0
- package/src/shared/ppmbot-telegram.ts +16 -0
- package/src/shared/review-blocks.ts +222 -0
- package/src/shared/session-file-changes.ts +136 -0
- package/src/shared/split-sql-statements.ts +388 -0
- package/src/shared/sql-identifiers.ts +97 -0
- package/src/shared/tab-open-protocol.ts +70 -0
- package/src/shared/tailscale-setup.ts +126 -0
- package/src/shared/terminal-size.ts +23 -0
- package/src/shared/tool-result-content.ts +5 -0
- package/src/shared/turn-stop.ts +30 -0
- package/src/shared/user-agent-label.ts +59 -0
- package/src/shared/web-push-payload.ts +41 -0
- package/src/types/api.ts +12 -3
- package/src/types/chat.ts +6 -0
- package/src/types/config.ts +25 -0
- package/src/types/database.ts +215 -7
- package/src/types/system-metrics.ts +9 -5
- package/src/types/system-services.ts +8 -3
- package/src/web/app.tsx +31 -7
- package/src/web/components/auth/login-screen.tsx +21 -10
- package/src/web/components/chat/change-file-row.tsx +1 -79
- package/src/web/components/chat/chat-history-bar.tsx +3 -2
- package/src/web/components/chat/chat-tab.tsx +183 -39
- package/src/web/components/chat/chat-toolbar-overflow-menu.tsx +7 -1
- package/src/web/components/chat/message-action-bar.tsx +3 -1
- package/src/web/components/chat/message-input.tsx +66 -8
- package/src/web/components/chat/message-list.tsx +146 -9
- package/src/web/components/chat/message-reply-reference.ts +43 -0
- package/src/web/components/chat/message-user-bubble.tsx +10 -3
- package/src/web/components/chat/reply-card.tsx +28 -0
- package/src/web/components/chat/running-agents-bar.tsx +78 -44
- package/src/web/components/chat/session-change-row.tsx +118 -0
- package/src/web/components/chat/session-changes-bar.tsx +219 -0
- package/src/web/components/chat/session-changes-context.tsx +21 -0
- package/src/web/components/chat/tab-tool-card.tsx +93 -0
- package/src/web/components/chat/tool-cards.tsx +11 -0
- package/src/web/components/chat/turn-change-pill.tsx +20 -2
- package/src/web/components/chat/turn-change-review.tsx +383 -0
- package/src/web/components/chat/turn-change-rollup.tsx +15 -4
- package/src/web/components/chat/turn-change-sheet.tsx +103 -94
- package/src/web/components/chat/turn-change-tray.tsx +90 -93
- package/src/web/components/chat/turn-stop-bar.tsx +42 -0
- package/src/web/components/chat/user-message-parse.ts +5 -2
- package/src/web/components/database/connection-color-picker.tsx +42 -46
- package/src/web/components/database/connection-form/connection-advanced-pane.tsx +82 -0
- package/src/web/components/database/connection-form/connection-form-state.ts +719 -0
- package/src/web/components/database/connection-form/connection-form-tab.tsx +160 -0
- package/src/web/components/database/connection-form/connection-general-pane.tsx +231 -0
- package/src/web/components/database/connection-form/connection-ssh-pane.tsx +136 -0
- package/src/web/components/database/connection-form/connection-ssl-pane.tsx +68 -0
- package/src/web/components/database/connection-form/connection-test-result.tsx +90 -0
- package/src/web/components/database/connection-form/database-picker.tsx +136 -0
- package/src/web/components/database/connection-form/engine-tiles.tsx +72 -0
- package/src/web/components/database/connection-form/form-controls.tsx +219 -0
- package/src/web/components/database/connection-form/use-connection-form.ts +369 -0
- package/src/web/components/database/connection-import-export.tsx +6 -5
- package/src/web/components/database/connections-section/connection-menus.ts +100 -0
- package/src/web/components/database/connections-section/connection-tree-model.ts +113 -0
- package/src/web/components/database/connections-section/connections-section.tsx +432 -0
- package/src/web/components/database/connections-section/delete-connection-dialog.tsx +75 -0
- package/src/web/components/database/connections-section/folder-name-input.tsx +41 -0
- package/src/web/components/database/database-sidebar.tsx +55 -78
- package/src/web/components/database/db-login/db-login-dialog.tsx +255 -0
- package/src/web/components/database/db-login/db-login-store.ts +63 -0
- package/src/web/components/database/db-rows-status.tsx +32 -0
- package/src/web/components/database/db-sidebar-reveal.ts +66 -0
- package/src/web/components/database/db-tab-parts.tsx +117 -0
- package/src/web/components/database/driver-missing-notice.tsx +72 -0
- package/src/web/components/database/explorer/db-explorer-store.ts +658 -0
- package/src/web/components/database/explorer/explorer-menu.tsx +193 -0
- package/src/web/components/database/explorer/explorer-model.ts +341 -0
- package/src/web/components/database/explorer/open-db-tabs.ts +160 -0
- package/src/web/components/database/explorer/open-new-query.ts +22 -0
- package/src/web/components/database/explorer/open-new-table.ts +37 -0
- package/src/web/components/database/explorer/sql-templates.ts +110 -0
- package/src/web/components/database/explorer/tree-parts.tsx +109 -0
- package/src/web/components/database/explorer/use-db-explorer-sync.ts +25 -0
- package/src/web/components/database/explorer/use-row-menu.ts +37 -0
- package/src/web/components/database/explorer/use-tree-keys.ts +92 -0
- package/src/web/components/database/export-button.tsx +96 -113
- package/src/web/components/database/extract-query-table.ts +4 -3
- package/src/web/components/database/focused-database-prompt.tsx +85 -0
- package/src/web/components/database/glide-context-menu.tsx +52 -62
- package/src/web/components/database/glide-data-grid.tsx +1401 -157
- package/src/web/components/database/glide-grid-theme.ts +49 -2
- package/src/web/components/database/glide-grid-types.ts +222 -48
- package/src/web/components/database/glide-header-menu.tsx +52 -103
- package/src/web/components/database/glide-save-bar.tsx +4 -3
- package/src/web/components/database/grid/cell-context-menu.tsx +151 -0
- package/src/web/components/database/grid/cell-data-formats.ts +298 -0
- package/src/web/components/database/grid/cell-data-panel.tsx +662 -0
- package/src/web/components/database/grid/cell-display.ts +52 -0
- package/src/web/components/database/grid/cell-editor.tsx +55 -0
- package/src/web/components/database/grid/cell-menu.ts +210 -0
- package/src/web/components/database/grid/change-marks.ts +51 -0
- package/src/web/components/database/grid/column-filter-cell.ts +34 -0
- package/src/web/components/database/grid/column-menu.ts +51 -0
- package/src/web/components/database/grid/columns-panel.tsx +241 -0
- package/src/web/components/database/grid/columns-sheet.tsx +172 -0
- package/src/web/components/database/grid/copy-as.ts +170 -0
- package/src/web/components/database/grid/dictionary-lookup-dialog.tsx +169 -0
- package/src/web/components/database/grid/fetch-all-dialog.tsx +51 -0
- package/src/web/components/database/grid/filter-chips.tsx +107 -0
- package/src/web/components/database/grid/filter-dialog-frame.tsx +95 -0
- package/src/web/components/database/grid/filter-dialog-host.tsx +43 -0
- package/src/web/components/database/grid/filter-funnel-menu.ts +131 -0
- package/src/web/components/database/grid/filter-multiple-values-dialog.tsx +61 -0
- package/src/web/components/database/grid/filter-row.tsx +216 -0
- package/src/web/components/database/grid/filter-sheet.tsx +227 -0
- package/src/web/components/database/grid/filters-panel.tsx +163 -0
- package/src/web/components/database/grid/fk-cell-button.ts +67 -0
- package/src/web/components/database/grid/fk-cell-editor.tsx +36 -0
- package/src/web/components/database/grid/form-view-model.ts +263 -0
- package/src/web/components/database/grid/form-view.tsx +505 -0
- package/src/web/components/database/grid/generate-sql-dialog.tsx +135 -0
- package/src/web/components/database/grid/generate-sql.ts +101 -0
- package/src/web/components/database/grid/grid-changeset.ts +262 -0
- package/src/web/components/database/grid/grid-filters.ts +172 -0
- package/src/web/components/database/grid/grid-header-overlay.tsx +140 -0
- package/src/web/components/database/grid/grid-save-dialog.tsx +251 -0
- package/src/web/components/database/grid/grid-save-host.tsx +19 -0
- package/src/web/components/database/grid/grid-save-model.ts +64 -0
- package/src/web/components/database/grid/grid-save-store.ts +65 -0
- package/src/web/components/database/grid/grid-status-bar.tsx +54 -0
- package/src/web/components/database/grid/header-bands.ts +232 -0
- package/src/web/components/database/grid/json-document.ts +139 -0
- package/src/web/components/database/grid/json-tree.tsx +74 -0
- package/src/web/components/database/grid/load-more.ts +22 -0
- package/src/web/components/database/grid/master-detail-split.tsx +233 -0
- package/src/web/components/database/grid/pick-table.tsx +109 -0
- package/src/web/components/database/grid/reference-filter.ts +48 -0
- package/src/web/components/database/grid/references-panel.tsx +82 -0
- package/src/web/components/database/grid/references.ts +104 -0
- package/src/web/components/database/grid/refresh-menu.tsx +133 -0
- package/src/web/components/database/grid/row-form-sheet.tsx +234 -0
- package/src/web/components/database/grid/selection-commands.ts +124 -0
- package/src/web/components/database/grid/selection-stats.ts +131 -0
- package/src/web/components/database/grid/set-filter-dialog.tsx +93 -0
- package/src/web/components/database/grid/table-keys.ts +130 -0
- package/src/web/components/database/grid/table-toolbar.tsx +326 -0
- package/src/web/components/database/grid/table-view-state.ts +63 -0
- package/src/web/components/database/grid/text-value-dialog.tsx +80 -0
- package/src/web/components/database/grid/use-cell-long-press.ts +146 -0
- package/src/web/components/database/grid/use-changeset.ts +48 -0
- package/src/web/components/database/grid/use-filter-pickers.ts +76 -0
- package/src/web/components/database/grid/use-grid-copy.ts +99 -0
- package/src/web/components/database/grid/use-opener-focus.ts +17 -0
- package/src/web/components/database/grid/use-pick-search.ts +38 -0
- package/src/web/components/database/grid/use-table-filters.ts +84 -0
- package/src/web/components/database/grid/value-filter-text.ts +96 -0
- package/src/web/components/database/grid/value-lookup-dialog.tsx +91 -0
- package/src/web/components/database/impexp/impexp-columns-dialog.tsx +171 -0
- package/src/web/components/database/impexp/impexp-config.tsx +131 -0
- package/src/web/components/database/impexp/impexp-database-fields.tsx +107 -0
- package/src/web/components/database/impexp/impexp-file-input.tsx +118 -0
- package/src/web/components/database/impexp/impexp-format-options.tsx +127 -0
- package/src/web/components/database/impexp/impexp-map-table.tsx +187 -0
- package/src/web/components/database/impexp/impexp-parts.tsx +77 -0
- package/src/web/components/database/impexp/impexp-side-panes.tsx +191 -0
- package/src/web/components/database/impexp/impexp-state.ts +590 -0
- package/src/web/components/database/impexp/impexp-tab.tsx +222 -0
- package/src/web/components/database/impexp/impexp-tables-select.tsx +169 -0
- package/src/web/components/database/impexp/impexp-upload.ts +52 -0
- package/src/web/components/database/impexp/open-impexp-tab.ts +58 -0
- package/src/web/components/database/impexp/use-impexp-database.ts +75 -0
- package/src/web/components/database/impexp/use-impexp-job.ts +114 -0
- package/src/web/components/database/object-tree/object-menus.ts +141 -0
- package/src/web/components/database/object-tree/object-tree-model.ts +132 -0
- package/src/web/components/database/object-tree/objects-section.tsx +503 -0
- package/src/web/components/database/open-connection-form.ts +21 -0
- package/src/web/components/database/query/discard-result-edits-dialog.tsx +43 -0
- package/src/web/components/database/query/format-sql.ts +67 -0
- package/src/web/components/database/query/history-panel.tsx +177 -0
- package/src/web/components/database/query/messages-panel.tsx +98 -0
- package/src/web/components/database/query/query-file.ts +56 -0
- package/src/web/components/database/query/query-history.ts +56 -0
- package/src/web/components/database/query/query-run-state.ts +282 -0
- package/src/web/components/database/query/query-tab.tsx +397 -0
- package/src/web/components/database/query/query-target-picker.tsx +95 -0
- package/src/web/components/database/query/result-tabs.tsx +104 -0
- package/src/web/components/database/query/result-view.tsx +111 -0
- package/src/web/components/database/query/use-query-file-save.tsx +117 -0
- package/src/web/components/database/query/use-query-runner.ts +202 -0
- package/src/web/components/database/query/use-sql-schema-info.ts +40 -0
- package/src/web/components/database/reformat-cursor.ts +40 -0
- package/src/web/components/database/sidebar-split.tsx +89 -0
- package/src/web/components/database/sql-completion-provider.ts +149 -49
- package/src/web/components/database/sql-object/sql-object-model.ts +39 -0
- package/src/web/components/database/sql-object/sql-object-tab.tsx +138 -0
- package/src/web/components/database/sql-query-editor.tsx +203 -36
- package/src/web/components/database/sql-run.ts +40 -0
- package/src/web/components/database/structure/structure-model.ts +90 -0
- package/src/web/components/database/structure/structure-tab.tsx +326 -0
- package/src/web/components/database/table/table-tab.tsx +694 -0
- package/src/web/components/database/table-editor/column-dialog.tsx +129 -0
- package/src/web/components/database/table-editor/editor-dialog.tsx +122 -0
- package/src/web/components/database/table-editor/foreign-key-dialog.tsx +188 -0
- package/src/web/components/database/table-editor/key-dialog.tsx +197 -0
- package/src/web/components/database/table-editor/rename-object-dialog.tsx +45 -0
- package/src/web/components/database/table-editor/structure-save-dialog.tsx +167 -0
- package/src/web/components/database/table-editor/structure-save-host.tsx +24 -0
- package/src/web/components/database/table-editor/structure-save-model.ts +91 -0
- package/src/web/components/database/table-editor/structure-save-store.ts +52 -0
- package/src/web/components/database/table-editor/table-editor-commands.ts +27 -0
- package/src/web/components/database/table-editor/table-editor-dialogs.tsx +32 -0
- package/src/web/components/database/table-editor/table-editor-model.ts +252 -0
- package/src/web/components/database/table-editor/table-editor.tsx +485 -0
- package/src/web/components/database/table-editor/use-table-editor-tab.ts +145 -0
- package/src/web/components/database/use-connections.ts +39 -85
- package/src/web/components/database/use-database.ts +419 -214
- package/src/web/components/database/use-db-read.ts +88 -0
- package/src/web/components/database/use-db-tab.ts +68 -0
- package/src/web/components/database/use-glide-cell-content.ts +81 -88
- package/src/web/components/database/use-glide-columns.ts +16 -32
- package/src/web/components/database/use-glide-grid-actions.ts +44 -99
- package/src/web/components/database/use-glide-selection.ts +6 -18
- package/src/web/components/design/design-skill-suggestion.tsx +46 -11
- package/src/web/components/editor/code-editor.tsx +81 -47
- package/src/web/components/editor/conflict-editor.tsx +4 -1
- package/src/web/components/editor/diff-viewer.tsx +40 -4
- package/src/web/components/editor/editor-fix-with-ai.tsx +111 -0
- package/src/web/components/editor/editor-selection-context.tsx +70 -0
- package/src/web/components/editor/html-preview.tsx +48 -9
- package/src/web/components/editor/lsp-status.tsx +18 -4
- package/src/web/components/editor/video-player/video-player-controls.tsx +19 -3
- package/src/web/components/editor/video-player/video-player.tsx +67 -14
- package/src/web/components/extensions/extension-webview.tsx +44 -9
- package/src/web/components/extensions/webview-external-link.ts +29 -0
- package/src/web/components/extensions/webview-file-icons.ts +87 -0
- package/src/web/components/extensions/webview-theme.ts +12 -0
- package/src/web/components/floating-window/window-content-registry.ts +2 -0
- package/src/web/components/floating-window/window-geometry.ts +3 -3
- package/src/web/components/floating-window/window-store-types.ts +1 -1
- package/src/web/components/git/git-branch-row.tsx +138 -0
- package/src/web/components/git/git-change-parts.tsx +142 -0
- package/src/web/components/git/git-change-row.tsx +218 -0
- package/src/web/components/git/git-change-tree.tsx +190 -0
- package/src/web/components/git/git-commit-composer.tsx +126 -0
- package/src/web/components/git/git-confirm.tsx +84 -0
- package/src/web/components/git/git-operation-banner.tsx +48 -0
- package/src/web/components/git/git-stash-section.tsx +128 -0
- package/src/web/components/git/git-status-panel.tsx +588 -1043
- package/src/web/components/git/git-worktree-panel.tsx +7 -7
- package/src/web/components/git-review/git-review-block.tsx +356 -0
- package/src/web/components/git-review/git-review-desktop.tsx +355 -0
- package/src/web/components/git-review/git-review-parts.tsx +238 -0
- package/src/web/components/git-review/git-review-phone.tsx +230 -0
- package/src/web/components/git-review/git-review-tab.tsx +123 -0
- package/src/web/components/layout/cloud-share-named-tunnel-row.tsx +2 -2
- package/src/web/components/layout/command-palette-db-commands.ts +56 -0
- package/src/web/components/layout/command-palette.tsx +41 -16
- package/src/web/components/layout/draggable-tab.tsx +7 -0
- package/src/web/components/layout/mobile-drawer.tsx +27 -14
- package/src/web/components/layout/mobile-nav.tsx +4 -3
- package/src/web/components/layout/mobile-tab-switcher-sheet.tsx +8 -1
- package/src/web/components/layout/nav-section-rail.tsx +22 -6
- package/src/web/components/layout/sidebar.tsx +2 -2
- package/src/web/components/layout/status-bar.tsx +3 -0
- package/src/web/components/layout/tab-bar.tsx +5 -8
- package/src/web/components/layout/tab-close-confirm-dialog.tsx +62 -0
- package/src/web/components/layout/tab-content.tsx +47 -7
- package/src/web/components/layout/tab-pool.tsx +10 -2
- package/src/web/components/layout/upgrade-button.tsx +3 -2
- package/src/web/components/logs/logs-actions.ts +84 -0
- package/src/web/components/logs/logs-app.tsx +265 -0
- package/src/web/components/logs/logs-client.ts +31 -0
- package/src/web/components/logs/logs-issues-pane.tsx +214 -0
- package/src/web/components/logs/logs-pane.tsx +683 -0
- package/src/web/components/logs/logs-phone-pane.tsx +365 -0
- package/src/web/components/logs/logs-report-pane.tsx +440 -0
- package/src/web/components/logs/logs-report-store.ts +153 -0
- package/src/web/components/logs/logs-state.ts +93 -0
- package/src/web/components/logs/logs-tab.tsx +4 -0
- package/src/web/components/logs/logs-ui.tsx +104 -0
- package/src/web/components/logs/logs-window-content.tsx +13 -0
- package/src/web/components/logs/logs.css +440 -0
- package/src/web/components/logs/open-logs.ts +65 -0
- package/src/web/components/logs/use-follow-list.ts +90 -0
- package/src/web/components/logs/use-logs-badge.ts +57 -0
- package/src/web/components/logs/use-logs-feed.ts +251 -0
- package/src/web/components/logs/use-logs-issues.ts +61 -0
- package/src/web/components/onboarding/onboarding-quick-orientation.tsx +4 -4
- package/src/web/components/os-explorer/views/inline-name-input.tsx +13 -4
- package/src/web/components/remote-desktop/ffmpeg-install-button.tsx +59 -0
- package/src/web/components/remote-desktop/remote-desktop-readiness-gate.tsx +2 -0
- package/src/web/components/remote-desktop/use-remote-desktop-readiness.ts +1 -0
- package/src/web/components/session-review/review-code.tsx +507 -0
- package/src/web/components/session-review/review-desktop.tsx +256 -0
- package/src/web/components/session-review/review-parts.tsx +267 -0
- package/src/web/components/session-review/review-phone.tsx +206 -0
- package/src/web/components/session-review/review-tokens.tsx +70 -0
- package/src/web/components/session-review/review-view.tsx +158 -0
- package/src/web/components/session-review/session-review-tab.tsx +71 -0
- package/src/web/components/settings/ai-settings-section.tsx +20 -0
- package/src/web/components/settings/database-drivers-section.tsx +251 -0
- package/src/web/components/settings/design-settings-section.tsx +52 -3
- package/src/web/components/settings/language-servers-section.tsx +8 -2
- package/src/web/components/settings/notifications-settings-section.tsx +463 -24
- package/src/web/components/settings/ntfy-server-form.tsx +192 -0
- package/src/web/components/settings/open-settings.ts +11 -9
- package/src/web/components/settings/ppmbot-settings-section.tsx +6 -214
- package/src/web/components/settings/ppmbot-telegram-section.tsx +139 -0
- package/src/web/components/settings/remote-access/public-link-pane.tsx +282 -0
- package/src/web/components/settings/remote-access/remote-access-settings-section.tsx +49 -0
- package/src/web/components/settings/remote-access/remote-access-tab-store.ts +24 -0
- package/src/web/components/settings/run-in-terminal-button.tsx +32 -0
- package/src/web/components/settings/settings-body.tsx +14 -2
- package/src/web/components/settings/settings-categories.ts +14 -1
- package/src/web/components/settings/settings-rows.tsx +61 -0
- package/src/web/components/settings/settings-section-content.tsx +2 -0
- package/src/web/components/settings/tailscale/tailscale-settings-section.tsx +410 -0
- package/src/web/components/settings/tailscale/tailscale-setup-steps.tsx +248 -0
- package/src/web/components/settings/tailscale/tailscale-sign-in-dialog.tsx +98 -0
- package/src/web/components/settings/tailscale/tailscale-ui.tsx +81 -0
- package/src/web/components/settings/telegram-bot-token-field.tsx +129 -0
- package/src/web/components/settings/telegram-connect.tsx +147 -0
- package/src/web/components/settings/voice-settings-section.tsx +28 -3
- package/src/web/components/sqlite/sqlite-viewer.tsx +92 -134
- package/src/web/components/system/apps/app-rows.ts +19 -3
- package/src/web/components/system/apps/apps-panel.tsx +3 -1
- package/src/web/components/system/services/service-action-confirm.tsx +20 -1
- package/src/web/components/system/services/service-details-sheet.tsx +14 -4
- package/src/web/components/system/services/service-details-text.ts +5 -0
- package/src/web/components/system/services/services-panel.tsx +7 -5
- package/src/web/components/terminal/terminal-selection-chat.tsx +178 -0
- package/src/web/components/terminal/terminal-tab.tsx +10 -6
- package/src/web/components/tunnels/named-tunnel/named-tunnel-copy.ts +1 -20
- package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-content.tsx +1 -1
- package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-popup.tsx +2 -2
- package/src/web/components/tunnels/named-tunnel/use-named-tunnel-setup.ts +1 -1
- package/src/web/components/tunnels/open-port-forwarding.ts +17 -0
- package/src/web/components/tunnels/port-forwarding-panel.tsx +370 -0
- package/src/web/components/ui/adaptive-context-menu.tsx +32 -3
- package/src/web/components/ui/sidebar-header.tsx +1 -1
- package/src/web/components/web-preview/open-web-preview-tab.ts +14 -0
- package/src/web/components/web-preview/web-preview-tab.tsx +92 -0
- package/src/web/hooks/use-at-most-wide.ts +20 -0
- package/src/web/hooks/use-chat.ts +214 -11
- package/src/web/hooks/use-commit-draft.ts +59 -0
- package/src/web/hooks/use-db-driver-installed.ts +16 -0
- package/src/web/hooks/use-draft.ts +25 -15
- package/src/web/hooks/use-extension-ws.ts +15 -1
- package/src/web/hooks/use-git-changes.ts +114 -0
- package/src/web/hooks/use-git-review.ts +617 -0
- package/src/web/hooks/use-global-events.ts +5 -0
- package/src/web/hooks/use-lsp.ts +4 -2
- package/src/web/hooks/use-notification-clicks.ts +43 -0
- package/src/web/hooks/use-session-file-changes.ts +100 -0
- package/src/web/hooks/use-session-review.ts +554 -0
- package/src/web/hooks/use-session-turns.ts +65 -0
- package/src/web/hooks/use-terminal.ts +19 -5
- package/src/web/hooks/use-turn-review.ts +204 -0
- package/src/web/hooks/use-url-sync.ts +15 -12
- package/src/web/lib/aggregate-turn-file-changes.ts +127 -35
- package/src/web/lib/ai-tab-placement.ts +102 -0
- package/src/web/lib/api-client.ts +113 -47
- package/src/web/lib/api-settings.ts +1 -0
- package/src/web/lib/api-tailscale.ts +12 -0
- package/src/web/lib/api-tunnels.ts +13 -1
- package/src/web/lib/code-fence.ts +7 -0
- package/src/web/lib/db-drivers.ts +41 -0
- package/src/web/lib/db-table-edit.ts +94 -0
- package/src/web/lib/db-tabs.ts +273 -0
- package/src/web/lib/design/api-design-settings.ts +11 -0
- package/src/web/lib/file-icon-name.ts +6 -0
- package/src/web/lib/file-icons.generated.ts +10 -1
- package/src/web/lib/file-icons.tsx +34 -6
- package/src/web/lib/git-changes-view.ts +292 -0
- package/src/web/lib/git-file-tree.ts +8 -8
- package/src/web/lib/git-review-model.ts +496 -0
- package/src/web/lib/html-preview-loads.ts +87 -0
- package/src/web/lib/icons.generated.tsx +41 -1
- package/src/web/lib/logs/logs-report.ts +128 -0
- package/src/web/lib/logs/logs-view-model.ts +201 -0
- package/src/web/lib/lsp/lsp-client.ts +1 -1
- package/src/web/lib/lsp/lsp-documents.ts +8 -0
- package/src/web/lib/lsp/register-providers.ts +5 -1
- package/src/web/lib/monaco-lightbulb-gutter.ts +32 -0
- package/src/web/lib/open-ai-tab.ts +160 -0
- package/src/web/lib/open-git-review.ts +24 -0
- package/src/web/lib/read-ndjson.ts +35 -0
- package/src/web/lib/running-agent-rows.ts +14 -16
- package/src/web/lib/send-to-chat.ts +55 -9
- package/src/web/lib/session-file-changes-client.ts +148 -0
- package/src/web/lib/session-file-changes.ts +69 -0
- package/src/web/lib/session-review-model.ts +379 -0
- package/src/web/lib/session-turns.ts +123 -0
- package/src/web/lib/sidebar-tabs/tab-registry.ts +1 -1
- package/src/web/lib/tab-tool-call.ts +69 -0
- package/src/web/lib/tab-type-icons.ts +12 -3
- package/src/web/lib/turn-review.ts +102 -0
- package/src/web/lib/web-preview-url.ts +31 -0
- package/src/web/lib/web-push-client.ts +91 -0
- package/src/web/lib/web-push-support.ts +88 -0
- package/src/web/stores/chat-jump-store.ts +31 -0
- package/src/web/stores/commit-draft-store.ts +119 -0
- package/src/web/stores/db-rows-status-store.ts +31 -0
- package/src/web/stores/git-status-store.ts +21 -2
- package/src/web/stores/panel-store.ts +34 -0
- package/src/web/stores/panel-utils.ts +69 -8
- package/src/web/stores/session-turns-store.ts +40 -0
- package/src/web/stores/settings-store.ts +72 -42
- package/src/web/stores/tab-close-confirm-store.ts +59 -0
- package/src/web/stores/tab-store.ts +10 -2
- package/src/web/stores/unsaved-grid-rows-store.ts +42 -0
- package/src/web/stores/window-panel-persistence.ts +23 -10
- package/src/web/styles/file-icons.generated.css +6 -0
- package/src/web/styles/globals.css +54 -0
- package/src/web/sw-notification-click.ts +51 -0
- package/src/web/sw.ts +35 -0
- package/src/web/theme/adapters/shiki-adapter.ts +55 -1
- package/templates/skill/SKILL.md.tmpl +4 -3
- package/templates/skill/common-tasks.md +8 -4
- package/vite.config.ts +3 -0
- package/dist/web/assets/_basePickBy-BEVUuplK.js +0 -1
- package/dist/web/assets/_basePickBy-BEVUuplK.js.br +0 -0
- package/dist/web/assets/_basePickBy-BEVUuplK.js.gz +0 -0
- package/dist/web/assets/_baseUniq-qb_BgEfK.js +0 -1
- package/dist/web/assets/_baseUniq-qb_BgEfK.js.br +0 -0
- package/dist/web/assets/_baseUniq-qb_BgEfK.js.gz +0 -0
- package/dist/web/assets/accounts-settings-section-CGe5ikvs.js +0 -1
- package/dist/web/assets/accounts-settings-section-CGe5ikvs.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-CGe5ikvs.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-store-_OeezCXB.js +0 -1
- package/dist/web/assets/agent-session-sheet-vBhfHYrC.js +0 -2
- package/dist/web/assets/agent-session-sheet-vBhfHYrC.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-vBhfHYrC.js.gz +0 -0
- package/dist/web/assets/agent-session-window-content-BxIxDN5i.js +0 -1
- package/dist/web/assets/agent-session-window-content-BxIxDN5i.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-BxIxDN5i.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-Y8clBPRv.js +0 -1
- package/dist/web/assets/ai-resource-editor-Y8clBPRv.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-Y8clBPRv.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-BB8vscte.js +0 -1
- package/dist/web/assets/ai-settings-section-Ck8uN_Bw.js +0 -1
- package/dist/web/assets/ai-settings-section-Ck8uN_Bw.js.br +0 -0
- package/dist/web/assets/ai-settings-section-Ck8uN_Bw.js.gz +0 -0
- package/dist/web/assets/android-tab-BIOUVVoW.js +0 -2
- package/dist/web/assets/android-tab-BIOUVVoW.js.br +0 -0
- package/dist/web/assets/android-tab-BIOUVVoW.js.gz +0 -0
- package/dist/web/assets/angular-html-Djm1KT_p.js +0 -1
- package/dist/web/assets/angular-html-Djm1KT_p.js.br +0 -0
- package/dist/web/assets/angular-html-Djm1KT_p.js.gz +0 -0
- package/dist/web/assets/angular-ts-D8ZYU4i0.js +0 -1
- package/dist/web/assets/angular-ts-D8ZYU4i0.js.br +0 -0
- package/dist/web/assets/angular-ts-D8ZYU4i0.js.gz +0 -0
- package/dist/web/assets/api-client-CbrcysYC.js +0 -1
- package/dist/web/assets/api-client-F5Zi1sR0.js +0 -1
- package/dist/web/assets/api-client-F5Zi1sR0.js.br +0 -0
- package/dist/web/assets/api-client-F5Zi1sR0.js.gz +0 -0
- package/dist/web/assets/api-settings-Cc_CpfmC.js +0 -1
- package/dist/web/assets/api-settings-Cc_CpfmC.js.br +0 -0
- package/dist/web/assets/api-settings-Cc_CpfmC.js.gz +0 -0
- package/dist/web/assets/api-settings-D1axn9vm.js +0 -1
- package/dist/web/assets/api-themes-BtMBSjuM.js +0 -1
- package/dist/web/assets/apl-Bxk9ez2r.js +0 -1
- package/dist/web/assets/apl-Bxk9ez2r.js.br +0 -0
- package/dist/web/assets/apl-Bxk9ez2r.js.gz +0 -0
- package/dist/web/assets/appearance-settings-section-Bv5_n9lH.js +0 -1
- package/dist/web/assets/appearance-settings-section-Bv5_n9lH.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-Bv5_n9lH.js.gz +0 -0
- package/dist/web/assets/apps-panel-DXHF0QEv.js +0 -1
- package/dist/web/assets/apps-panel-DXHF0QEv.js.br +0 -0
- package/dist/web/assets/apps-panel-DXHF0QEv.js.gz +0 -0
- package/dist/web/assets/arc-CrBOnruw.js +0 -1
- package/dist/web/assets/arc-CrBOnruw.js.br +0 -0
- package/dist/web/assets/arc-CrBOnruw.js.gz +0 -0
- package/dist/web/assets/architecture-PBZL5I3N-bv6Z6ZTl.js +0 -1
- package/dist/web/assets/architectureDiagram-2XIMDMQ5-sFj2GCA0.js +0 -36
- package/dist/web/assets/architectureDiagram-2XIMDMQ5-sFj2GCA0.js.br +0 -0
- package/dist/web/assets/architectureDiagram-2XIMDMQ5-sFj2GCA0.js.gz +0 -0
- package/dist/web/assets/astro-CCE8GTuJ.js +0 -1
- package/dist/web/assets/astro-CCE8GTuJ.js.br +0 -0
- package/dist/web/assets/astro-CCE8GTuJ.js.gz +0 -0
- package/dist/web/assets/audio-preview-DpjOKEm4.js +0 -1
- package/dist/web/assets/audio-preview-DpjOKEm4.js.br +0 -0
- package/dist/web/assets/audio-preview-DpjOKEm4.js.gz +0 -0
- package/dist/web/assets/blade-pJLFJ0pe.js +0 -1
- package/dist/web/assets/blade-pJLFJ0pe.js.br +0 -0
- package/dist/web/assets/blade-pJLFJ0pe.js.gz +0 -0
- package/dist/web/assets/blockDiagram-WCTKOSBZ-DFag_MHk.js +0 -132
- package/dist/web/assets/blockDiagram-WCTKOSBZ-DFag_MHk.js.br +0 -0
- package/dist/web/assets/blockDiagram-WCTKOSBZ-DFag_MHk.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-4dgMNadQ.js +0 -1
- package/dist/web/assets/branch-review-tab-4dgMNadQ.js.br +0 -0
- package/dist/web/assets/branch-review-tab-4dgMNadQ.js.gz +0 -0
- package/dist/web/assets/bsl-DJPQP6gj.js +0 -1
- package/dist/web/assets/bsl-DJPQP6gj.js.br +0 -0
- package/dist/web/assets/bsl-DJPQP6gj.js.gz +0 -0
- package/dist/web/assets/button-DeAyLH9U.js +0 -1
- package/dist/web/assets/button-DeAyLH9U.js.br +0 -0
- package/dist/web/assets/button-DeAyLH9U.js.gz +0 -0
- package/dist/web/assets/c4Diagram-IC4MRINW-Bs9OCCbR.js +0 -10
- package/dist/web/assets/c4Diagram-IC4MRINW-Bs9OCCbR.js.br +0 -0
- package/dist/web/assets/c4Diagram-IC4MRINW-Bs9OCCbR.js.gz +0 -0
- package/dist/web/assets/cairo-6pdze4qN.js +0 -1
- package/dist/web/assets/cairo-6pdze4qN.js.br +0 -0
- package/dist/web/assets/cairo-6pdze4qN.js.gz +0 -0
- package/dist/web/assets/channel-C97aABFT.js +0 -1
- package/dist/web/assets/chat-preparation-cache-BUCR58h4.js +0 -1
- package/dist/web/assets/chat-preparation-cache-BUCR58h4.js.br +0 -0
- package/dist/web/assets/chat-preparation-cache-BUCR58h4.js.gz +0 -0
- package/dist/web/assets/chat-tab-Bbe_77oJ.js +0 -15
- package/dist/web/assets/chat-tab-Bbe_77oJ.js.br +0 -0
- package/dist/web/assets/chat-tab-Bbe_77oJ.js.gz +0 -0
- package/dist/web/assets/chat-tab-D3i5O3dO.js +0 -1
- package/dist/web/assets/chat-tab-D3i5O3dO.js.br +0 -0
- package/dist/web/assets/chat-tab-D3i5O3dO.js.gz +0 -0
- package/dist/web/assets/chunk-4BX2VUAB-Dd8hGWzs.js +0 -1
- package/dist/web/assets/chunk-55IACEB6-BUOmRdCb.js +0 -1
- package/dist/web/assets/chunk-7E7YKBS2-D5i9aZ57.js +0 -1
- package/dist/web/assets/chunk-7R4GIKGN-DBr9s6EE.js +0 -80
- package/dist/web/assets/chunk-7R4GIKGN-DBr9s6EE.js.br +0 -0
- package/dist/web/assets/chunk-7R4GIKGN-DBr9s6EE.js.gz +0 -0
- package/dist/web/assets/chunk-C72U2L5F-CEUvONYx.js +0 -1
- package/dist/web/assets/chunk-EGIJ26TM-BG89sF-p.js +0 -1
- package/dist/web/assets/chunk-FMBD7UC4-BDtpoO-Q.js +0 -15
- package/dist/web/assets/chunk-GEFDOKGD-lFQnV7FQ.js +0 -2
- package/dist/web/assets/chunk-GEFDOKGD-lFQnV7FQ.js.br +0 -0
- package/dist/web/assets/chunk-GEFDOKGD-lFQnV7FQ.js.gz +0 -0
- package/dist/web/assets/chunk-GLR3WWYH-CBQYONd8.js +0 -2
- package/dist/web/assets/chunk-GLR3WWYH-CBQYONd8.js.br +0 -0
- package/dist/web/assets/chunk-GLR3WWYH-CBQYONd8.js.gz +0 -0
- package/dist/web/assets/chunk-HHEYEP7N-Cz5o2sXg.js +0 -1
- package/dist/web/assets/chunk-JSJVCQXG-FBF1o1AC.js +0 -1
- package/dist/web/assets/chunk-JSJVCQXG-FBF1o1AC.js.br +0 -0
- package/dist/web/assets/chunk-JSJVCQXG-FBF1o1AC.js.gz +0 -0
- package/dist/web/assets/chunk-KX2RTZJC-Dfwu46M7.js +0 -1
- package/dist/web/assets/chunk-KYZI473N-DQTRCz9g.js +0 -53
- package/dist/web/assets/chunk-KYZI473N-DQTRCz9g.js.br +0 -0
- package/dist/web/assets/chunk-KYZI473N-DQTRCz9g.js.gz +0 -0
- package/dist/web/assets/chunk-L3YUKLVL-DytBx0nd.js +0 -1
- package/dist/web/assets/chunk-MX3YWQON-Da7GPDei.js +0 -1
- package/dist/web/assets/chunk-MX3YWQON-Da7GPDei.js.br +0 -0
- package/dist/web/assets/chunk-MX3YWQON-Da7GPDei.js.gz +0 -0
- package/dist/web/assets/chunk-NQ4KR5QH-D9-qngPN.js +0 -220
- package/dist/web/assets/chunk-NQ4KR5QH-D9-qngPN.js.br +0 -0
- package/dist/web/assets/chunk-NQ4KR5QH-D9-qngPN.js.gz +0 -0
- package/dist/web/assets/chunk-O4XLMI2P-BFAbMP-p.js +0 -7
- package/dist/web/assets/chunk-O4XLMI2P-BFAbMP-p.js.br +0 -0
- package/dist/web/assets/chunk-O4XLMI2P-BFAbMP-p.js.gz +0 -0
- package/dist/web/assets/chunk-OZEHJAEY-DM7Vtv5V.js +0 -1
- package/dist/web/assets/chunk-OZEHJAEY-DM7Vtv5V.js.br +0 -0
- package/dist/web/assets/chunk-OZEHJAEY-DM7Vtv5V.js.gz +0 -0
- package/dist/web/assets/chunk-PQ6SQG4A-CfSY-HG3.js +0 -1
- package/dist/web/assets/chunk-PQ6SQG4A-CfSY-HG3.js.br +0 -0
- package/dist/web/assets/chunk-PQ6SQG4A-CfSY-HG3.js.gz +0 -0
- package/dist/web/assets/chunk-PU5JKC2W-BFI9jx5F.js +0 -11
- package/dist/web/assets/chunk-PU5JKC2W-BFI9jx5F.js.br +0 -0
- package/dist/web/assets/chunk-PU5JKC2W-BFI9jx5F.js.gz +0 -0
- package/dist/web/assets/chunk-QZHKN3VN-_jIwYKZ3.js +0 -1
- package/dist/web/assets/chunk-R5LLSJPH-CZY_f--s.js +0 -1
- package/dist/web/assets/chunk-WL4C6EOR-BUFIzsiK.js +0 -189
- package/dist/web/assets/chunk-WL4C6EOR-BUFIzsiK.js.br +0 -0
- package/dist/web/assets/chunk-WL4C6EOR-BUFIzsiK.js.gz +0 -0
- package/dist/web/assets/chunk-XIRO2GV7-BxPFOPRI.js +0 -1
- package/dist/web/assets/chunk-XPW4576I-DfOF_qdG.js +0 -32
- package/dist/web/assets/chunk-XPW4576I-DfOF_qdG.js.br +0 -0
- package/dist/web/assets/chunk-XPW4576I-DfOF_qdG.js.gz +0 -0
- package/dist/web/assets/chunk-XZSTWKYB-BNlQ8dIW.js +0 -94
- package/dist/web/assets/chunk-XZSTWKYB-BNlQ8dIW.js.br +0 -0
- package/dist/web/assets/chunk-XZSTWKYB-BNlQ8dIW.js.gz +0 -0
- package/dist/web/assets/chunk-YBOYWFTD-0Is1vHmh.js +0 -1
- package/dist/web/assets/classDiagram-VBA2DB6C-HwLNQY_4.js +0 -1
- package/dist/web/assets/classDiagram-v2-RAHNMMFH-CLUQCcjH.js +0 -1
- package/dist/web/assets/clone-B5kRZECd.js +0 -1
- package/dist/web/assets/cobol-6JrtZ3xT.js +0 -1
- package/dist/web/assets/cobol-6JrtZ3xT.js.br +0 -0
- package/dist/web/assets/cobol-6JrtZ3xT.js.gz +0 -0
- package/dist/web/assets/code-editor-DXsIWoQ1.js +0 -7
- package/dist/web/assets/code-editor-DXsIWoQ1.js.br +0 -0
- package/dist/web/assets/code-editor-DXsIWoQ1.js.gz +0 -0
- package/dist/web/assets/codex-reset-credit-button-DRhievFQ.js +0 -1
- package/dist/web/assets/codex-reset-credit-button-DRhievFQ.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-DRhievFQ.js.gz +0 -0
- package/dist/web/assets/coffee-eR0Qd-vR.js +0 -1
- package/dist/web/assets/coffee-eR0Qd-vR.js.br +0 -0
- package/dist/web/assets/coffee-eR0Qd-vR.js.gz +0 -0
- package/dist/web/assets/conflict-editor-D_RImo_V.js +0 -19
- package/dist/web/assets/conflict-editor-D_RImo_V.js.br +0 -0
- package/dist/web/assets/conflict-editor-D_RImo_V.js.gz +0 -0
- package/dist/web/assets/context-menu-7OX80HDB.js +0 -1
- package/dist/web/assets/context-menu-7OX80HDB.js.br +0 -0
- package/dist/web/assets/context-menu-7OX80HDB.js.gz +0 -0
- package/dist/web/assets/cose-bilkent-S5V4N54A-CAPPRjYz.js +0 -1
- package/dist/web/assets/cose-bilkent-S5V4N54A-CAPPRjYz.js.br +0 -0
- package/dist/web/assets/cose-bilkent-S5V4N54A-CAPPRjYz.js.gz +0 -0
- package/dist/web/assets/cpp-Bp_Laxmd.js +0 -1
- package/dist/web/assets/cpp-Bp_Laxmd.js.br +0 -0
- package/dist/web/assets/cpp-Bp_Laxmd.js.gz +0 -0
- package/dist/web/assets/crystal-bc0lS6i8.js +0 -1
- package/dist/web/assets/crystal-bc0lS6i8.js.br +0 -0
- package/dist/web/assets/crystal-bc0lS6i8.js.gz +0 -0
- package/dist/web/assets/csv-parser-CoxPdyLw.js +0 -6
- package/dist/web/assets/csv-parser-CoxPdyLw.js.br +0 -0
- package/dist/web/assets/csv-parser-CoxPdyLw.js.gz +0 -0
- package/dist/web/assets/csv-preview-BuFdfLo3.js +0 -2
- package/dist/web/assets/csv-preview-BuFdfLo3.js.br +0 -0
- package/dist/web/assets/csv-preview-BuFdfLo3.js.gz +0 -0
- package/dist/web/assets/dagre-D__SE4Ki.js +0 -1
- package/dist/web/assets/dagre-D__SE4Ki.js.br +0 -0
- package/dist/web/assets/dagre-D__SE4Ki.js.gz +0 -0
- package/dist/web/assets/dagre-KLK3FWXG-By-0HuN_.js +0 -4
- package/dist/web/assets/dagre-KLK3FWXG-By-0HuN_.js.br +0 -0
- package/dist/web/assets/dagre-KLK3FWXG-By-0HuN_.js.gz +0 -0
- package/dist/web/assets/data-grid-overlay-editor-CeZoduke.js +0 -1
- package/dist/web/assets/data-grid-overlay-editor-CeZoduke.js.br +0 -0
- package/dist/web/assets/data-grid-overlay-editor-CeZoduke.js.gz +0 -0
- package/dist/web/assets/data-grid-types-CHD9-pon.js +0 -1
- package/dist/web/assets/data-grid-types-CHD9-pon.js.br +0 -0
- package/dist/web/assets/data-grid-types-CHD9-pon.js.gz +0 -0
- package/dist/web/assets/database-viewer-ChcbYn9E.js +0 -1
- package/dist/web/assets/database-viewer-ChcbYn9E.js.br +0 -0
- package/dist/web/assets/database-viewer-ChcbYn9E.js.gz +0 -0
- package/dist/web/assets/design-export-client-BfdZB7xK.js +0 -1
- package/dist/web/assets/design-export-client-BfdZB7xK.js.br +0 -0
- package/dist/web/assets/design-export-client-BfdZB7xK.js.gz +0 -0
- package/dist/web/assets/design-responsive-dialog-BiYy3ibS.js +0 -1
- package/dist/web/assets/design-responsive-dialog-BiYy3ibS.js.br +0 -0
- package/dist/web/assets/design-responsive-dialog-BiYy3ibS.js.gz +0 -0
- package/dist/web/assets/design-settings-section-B_xOf51h.js +0 -2
- package/dist/web/assets/design-settings-section-B_xOf51h.js.br +0 -0
- package/dist/web/assets/design-settings-section-B_xOf51h.js.gz +0 -0
- package/dist/web/assets/design-skill-suggestion-BbEDg15Z.js +0 -3
- package/dist/web/assets/design-skill-suggestion-BbEDg15Z.js.br +0 -0
- package/dist/web/assets/design-skill-suggestion-BbEDg15Z.js.gz +0 -0
- package/dist/web/assets/design-tab-BQSYJ4cS.js +0 -57
- package/dist/web/assets/design-tab-BQSYJ4cS.js.br +0 -0
- package/dist/web/assets/design-tab-BQSYJ4cS.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-AiPaYfSU.js +0 -1
- package/dist/web/assets/designs-sidebar-panel-AiPaYfSU.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-AiPaYfSU.js.gz +0 -0
- package/dist/web/assets/diagram-E7M64L7V-w1uoD2zJ.js +0 -24
- package/dist/web/assets/diagram-E7M64L7V-w1uoD2zJ.js.br +0 -0
- package/dist/web/assets/diagram-E7M64L7V-w1uoD2zJ.js.gz +0 -0
- package/dist/web/assets/diagram-IFDJBPK2-DIZ1Hm8C.js +0 -43
- package/dist/web/assets/diagram-IFDJBPK2-DIZ1Hm8C.js.br +0 -0
- package/dist/web/assets/diagram-IFDJBPK2-DIZ1Hm8C.js.gz +0 -0
- package/dist/web/assets/diagram-P4PSJMXO-DJg8_uM2.js +0 -24
- package/dist/web/assets/diagram-P4PSJMXO-DJg8_uM2.js.br +0 -0
- package/dist/web/assets/diagram-P4PSJMXO-DJg8_uM2.js.gz +0 -0
- package/dist/web/assets/dialog-Bocc0Fgb.js +0 -1
- package/dist/web/assets/dialog-Bocc0Fgb.js.br +0 -0
- package/dist/web/assets/dialog-Bocc0Fgb.js.gz +0 -0
- package/dist/web/assets/diff-viewer-BZ6glGK-.js +0 -4
- package/dist/web/assets/diff-viewer-BZ6glGK-.js.br +0 -0
- package/dist/web/assets/diff-viewer-BZ6glGK-.js.gz +0 -0
- package/dist/web/assets/dist-CBtAY9iX.js +0 -1
- package/dist/web/assets/dist-CBtAY9iX.js.br +0 -0
- package/dist/web/assets/dist-CBtAY9iX.js.gz +0 -0
- package/dist/web/assets/dist-CWwUZUqE.js +0 -11
- package/dist/web/assets/dist-CWwUZUqE.js.br +0 -0
- package/dist/web/assets/dist-CWwUZUqE.js.gz +0 -0
- package/dist/web/assets/docx-preview-Dt6RQpfA.js +0 -12
- package/dist/web/assets/docx-preview-Dt6RQpfA.js.br +0 -0
- package/dist/web/assets/docx-preview-Dt6RQpfA.js.gz +0 -0
- package/dist/web/assets/edge-BxayftlC.js +0 -1
- package/dist/web/assets/edge-BxayftlC.js.br +0 -0
- package/dist/web/assets/edge-BxayftlC.js.gz +0 -0
- package/dist/web/assets/edit-diff-preview-D-FNLOU2.js +0 -7
- package/dist/web/assets/edit-diff-preview-D-FNLOU2.js.br +0 -0
- package/dist/web/assets/edit-diff-preview-D-FNLOU2.js.gz +0 -0
- package/dist/web/assets/editor-language-service-4sbsdqBV.js +0 -1
- package/dist/web/assets/editor-language-service-4sbsdqBV.js.br +0 -0
- package/dist/web/assets/editor-language-service-4sbsdqBV.js.gz +0 -0
- package/dist/web/assets/elixir-CncTBq2d.js +0 -1
- package/dist/web/assets/elixir-CncTBq2d.js.br +0 -0
- package/dist/web/assets/elixir-CncTBq2d.js.gz +0 -0
- package/dist/web/assets/elm-1uJDe5N1.js +0 -1
- package/dist/web/assets/elm-1uJDe5N1.js.br +0 -0
- package/dist/web/assets/elm-1uJDe5N1.js.gz +0 -0
- package/dist/web/assets/erDiagram-INFDFZHY-CXGHzu5w.js +0 -70
- package/dist/web/assets/erDiagram-INFDFZHY-CXGHzu5w.js.br +0 -0
- package/dist/web/assets/erDiagram-INFDFZHY-CXGHzu5w.js.gz +0 -0
- package/dist/web/assets/erb-dH8FUiNl.js +0 -1
- package/dist/web/assets/erb-dH8FUiNl.js.br +0 -0
- package/dist/web/assets/erb-dH8FUiNl.js.gz +0 -0
- package/dist/web/assets/erlang-D0F-1O48.js +0 -1
- package/dist/web/assets/erlang-D0F-1O48.js.br +0 -0
- package/dist/web/assets/erlang-D0F-1O48.js.gz +0 -0
- package/dist/web/assets/esm-C3TeLjGW.js +0 -2
- package/dist/web/assets/esm-C3TeLjGW.js.br +0 -0
- package/dist/web/assets/esm-C3TeLjGW.js.gz +0 -0
- package/dist/web/assets/explorer-body-DbgrG1fe.js +0 -2
- package/dist/web/assets/explorer-body-DbgrG1fe.js.br +0 -0
- package/dist/web/assets/explorer-body-DbgrG1fe.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-BCjWvHpp.js +0 -1
- package/dist/web/assets/explorer-window-content-BCjWvHpp.js.br +0 -0
- package/dist/web/assets/explorer-window-content-BCjWvHpp.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-DiMF4RnT.js +0 -1
- package/dist/web/assets/extension-manager-section-DiMF4RnT.js.br +0 -0
- package/dist/web/assets/extension-manager-section-DiMF4RnT.js.gz +0 -0
- package/dist/web/assets/extension-webview-Coti6Vfw.js +0 -12
- package/dist/web/assets/extension-webview-Coti6Vfw.js.br +0 -0
- package/dist/web/assets/extension-webview-Coti6Vfw.js.gz +0 -0
- package/dist/web/assets/file-icons-CK0J4QSy.js +0 -1
- package/dist/web/assets/file-icons-CK0J4QSy.js.br +0 -0
- package/dist/web/assets/file-icons-CK0J4QSy.js.gz +0 -0
- package/dist/web/assets/file-icons.generated-BtBErEwb.css +0 -1
- package/dist/web/assets/file-icons.generated-BtBErEwb.css.br +0 -0
- package/dist/web/assets/file-icons.generated-BtBErEwb.css.gz +0 -0
- package/dist/web/assets/file-store-Cm7-pHux.js +0 -1
- package/dist/web/assets/file-store-Cm7-pHux.js.br +0 -0
- package/dist/web/assets/file-store-Cm7-pHux.js.gz +0 -0
- package/dist/web/assets/files-settings-section-ZTVwOwx0.js +0 -1
- package/dist/web/assets/files-settings-section-ZTVwOwx0.js.br +0 -0
- package/dist/web/assets/files-settings-section-ZTVwOwx0.js.gz +0 -0
- package/dist/web/assets/flowDiagram-PKNHOUZH-CZmY6JEk.js +0 -162
- package/dist/web/assets/flowDiagram-PKNHOUZH-CZmY6JEk.js.br +0 -0
- package/dist/web/assets/flowDiagram-PKNHOUZH-CZmY6JEk.js.gz +0 -0
- package/dist/web/assets/format-file-meta-Drxf2J-k.js +0 -1
- package/dist/web/assets/format-file-meta-Drxf2J-k.js.br +0 -0
- package/dist/web/assets/format-file-meta-Drxf2J-k.js.gz +0 -0
- package/dist/web/assets/fortran-fixed-form-DB7wVefV.js +0 -1
- package/dist/web/assets/fortran-fixed-form-DB7wVefV.js.br +0 -0
- package/dist/web/assets/fortran-fixed-form-DB7wVefV.js.gz +0 -0
- package/dist/web/assets/fs-api-IX9SHt5k.js +0 -1
- package/dist/web/assets/fs-api-IX9SHt5k.js.br +0 -0
- package/dist/web/assets/fs-api-IX9SHt5k.js.gz +0 -0
- package/dist/web/assets/fsharp-B5-po_gS.js +0 -1
- package/dist/web/assets/fsharp-B5-po_gS.js.br +0 -0
- package/dist/web/assets/fsharp-B5-po_gS.js.gz +0 -0
- package/dist/web/assets/ganttDiagram-A5KZAMGK-CZbyfmux.js +0 -292
- package/dist/web/assets/ganttDiagram-A5KZAMGK-CZbyfmux.js.br +0 -0
- package/dist/web/assets/ganttDiagram-A5KZAMGK-CZbyfmux.js.gz +0 -0
- package/dist/web/assets/gdresource-DkWx6_xT.js +0 -1
- package/dist/web/assets/gdresource-DkWx6_xT.js.br +0 -0
- package/dist/web/assets/gdresource-DkWx6_xT.js.gz +0 -0
- package/dist/web/assets/general-settings-section-B7Hjx_fb.js +0 -1
- package/dist/web/assets/general-settings-section-B7Hjx_fb.js.br +0 -0
- package/dist/web/assets/general-settings-section-B7Hjx_fb.js.gz +0 -0
- package/dist/web/assets/git-commit-XsMhdamD.js +0 -1
- package/dist/web/assets/git-commit-XsMhdamD.js.br +0 -0
- package/dist/web/assets/git-commit-XsMhdamD.js.gz +0 -0
- package/dist/web/assets/git-log-panel-CbcJ_YEH.js +0 -1
- package/dist/web/assets/git-log-panel-CbcJ_YEH.js.br +0 -0
- package/dist/web/assets/git-log-panel-CbcJ_YEH.js.gz +0 -0
- package/dist/web/assets/git-rebase-CXs4QunZ.js +0 -1
- package/dist/web/assets/git-repo-store-B_u5RzIM.js +0 -1
- package/dist/web/assets/git-repo-store-B_u5RzIM.js.br +0 -0
- package/dist/web/assets/git-repo-store-B_u5RzIM.js.gz +0 -0
- package/dist/web/assets/gitGraph-HDMCJU4V-COyQftEp.js +0 -1
- package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-C9g4d3bV.js +0 -65
- package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-C9g4d3bV.js.br +0 -0
- package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-C9g4d3bV.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-BfByGSf1.js +0 -141
- package/dist/web/assets/glide-data-grid-BfByGSf1.js.br +0 -0
- package/dist/web/assets/glide-data-grid-BfByGSf1.js.gz +0 -0
- package/dist/web/assets/glimmer-js-CHoxSy4K.js +0 -1
- package/dist/web/assets/glimmer-js-CHoxSy4K.js.br +0 -0
- package/dist/web/assets/glimmer-js-CHoxSy4K.js.gz +0 -0
- package/dist/web/assets/glimmer-ts-DY0DCf-r.js +0 -1
- package/dist/web/assets/glimmer-ts-DY0DCf-r.js.br +0 -0
- package/dist/web/assets/glimmer-ts-DY0DCf-r.js.gz +0 -0
- package/dist/web/assets/glsl-E9hxFBBJ.js +0 -1
- package/dist/web/assets/glsl-E9hxFBBJ.js.br +0 -0
- package/dist/web/assets/glsl-E9hxFBBJ.js.gz +0 -0
- package/dist/web/assets/graphlib-eYluCODn.js +0 -1
- package/dist/web/assets/graphlib-eYluCODn.js.br +0 -0
- package/dist/web/assets/graphlib-eYluCODn.js.gz +0 -0
- package/dist/web/assets/graphql-DAalq3Uo.js +0 -1
- package/dist/web/assets/graphql-DAalq3Uo.js.br +0 -0
- package/dist/web/assets/graphql-DAalq3Uo.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-DCo9OP3D.js +0 -1
- package/dist/web/assets/group-chat-tab-DCo9OP3D.js.br +0 -0
- package/dist/web/assets/group-chat-tab-DCo9OP3D.js.gz +0 -0
- package/dist/web/assets/hack-e6ehmpqx.js +0 -1
- package/dist/web/assets/hack-e6ehmpqx.js.br +0 -0
- package/dist/web/assets/hack-e6ehmpqx.js.gz +0 -0
- package/dist/web/assets/haml-Pr4yq62b.js +0 -1
- package/dist/web/assets/haml-Pr4yq62b.js.br +0 -0
- package/dist/web/assets/haml-Pr4yq62b.js.gz +0 -0
- package/dist/web/assets/handlebars-ZERVZ8gn.js +0 -1
- package/dist/web/assets/handlebars-ZERVZ8gn.js.br +0 -0
- package/dist/web/assets/handlebars-ZERVZ8gn.js.gz +0 -0
- package/dist/web/assets/html-BmwVFf5D.js +0 -1
- package/dist/web/assets/html-BmwVFf5D.js.br +0 -0
- package/dist/web/assets/html-BmwVFf5D.js.gz +0 -0
- package/dist/web/assets/html-derivative-C1JIrmAY.js +0 -1
- package/dist/web/assets/http-BI6PtTvX.js +0 -1
- package/dist/web/assets/http-BI6PtTvX.js.br +0 -0
- package/dist/web/assets/http-BI6PtTvX.js.gz +0 -0
- package/dist/web/assets/hurl-CJGLGxAF.js +0 -1
- package/dist/web/assets/hurl-CJGLGxAF.js.br +0 -0
- package/dist/web/assets/hurl-CJGLGxAF.js.gz +0 -0
- package/dist/web/assets/hxml-B6i0QuF9.js +0 -1
- package/dist/web/assets/hxml-B6i0QuF9.js.br +0 -0
- package/dist/web/assets/hxml-B6i0QuF9.js.gz +0 -0
- package/dist/web/assets/icons-CO_II6D-.js +0 -1
- package/dist/web/assets/icons-CO_II6D-.js.br +0 -0
- package/dist/web/assets/icons-CO_II6D-.js.gz +0 -0
- package/dist/web/assets/image-preview-Cjlps7Pt.js +0 -1
- package/dist/web/assets/index-CyDLBddf.js +0 -52
- package/dist/web/assets/index-CyDLBddf.js.br +0 -0
- package/dist/web/assets/index-CyDLBddf.js.gz +0 -0
- package/dist/web/assets/index-Dh5apC3I.css +0 -1
- package/dist/web/assets/index-Dh5apC3I.css.br +0 -0
- package/dist/web/assets/index-Dh5apC3I.css.gz +0 -0
- package/dist/web/assets/info-3K5VOQVL-M5BVLjMe.js +0 -1
- package/dist/web/assets/infoDiagram-LFFYTUFH-BpJuT5o9.js +0 -2
- package/dist/web/assets/input-CG8PS8mS.js +0 -1
- package/dist/web/assets/isEmpty-BjAN1oSC.js +0 -1
- package/dist/web/assets/isEmpty-BjAN1oSC.js.br +0 -0
- package/dist/web/assets/isEmpty-BjAN1oSC.js.gz +0 -0
- package/dist/web/assets/ishikawaDiagram-PHBUUO56-JbOmOY2f.js +0 -70
- package/dist/web/assets/ishikawaDiagram-PHBUUO56-JbOmOY2f.js.br +0 -0
- package/dist/web/assets/ishikawaDiagram-PHBUUO56-JbOmOY2f.js.gz +0 -0
- package/dist/web/assets/jinja-CM-duDMo.js +0 -1
- package/dist/web/assets/jinja-CM-duDMo.js.br +0 -0
- package/dist/web/assets/jinja-CM-duDMo.js.gz +0 -0
- package/dist/web/assets/jira-watcher-section-Dz_-sUC2.js +0 -1
- package/dist/web/assets/jison-F9rAmqyI.js +0 -1
- package/dist/web/assets/jison-F9rAmqyI.js.br +0 -0
- package/dist/web/assets/jison-F9rAmqyI.js.gz +0 -0
- package/dist/web/assets/journeyDiagram-4ABVD52K-C7_tilrE.js +0 -139
- package/dist/web/assets/journeyDiagram-4ABVD52K-C7_tilrE.js.br +0 -0
- package/dist/web/assets/journeyDiagram-4ABVD52K-C7_tilrE.js.gz +0 -0
- package/dist/web/assets/julia-AVSSuAUz.js +0 -1
- package/dist/web/assets/julia-AVSSuAUz.js.br +0 -0
- package/dist/web/assets/julia-AVSSuAUz.js.gz +0 -0
- package/dist/web/assets/just-Dw8IR-fy.js +0 -1
- package/dist/web/assets/just-Dw8IR-fy.js.br +0 -0
- package/dist/web/assets/just-Dw8IR-fy.js.gz +0 -0
- package/dist/web/assets/kanban-definition-K7BYSVSG-DvbxKeXt.js +0 -89
- package/dist/web/assets/kanban-definition-K7BYSVSG-DvbxKeXt.js.br +0 -0
- package/dist/web/assets/kanban-definition-K7BYSVSG-DvbxKeXt.js.gz +0 -0
- package/dist/web/assets/keybindings-store-BTq5Z7XP.js +0 -1
- package/dist/web/assets/keyboard-shortcuts-section-Ba5NYwlG.js +0 -1
- package/dist/web/assets/keyboard-shortcuts-section-Ba5NYwlG.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-Ba5NYwlG.js.gz +0 -0
- package/dist/web/assets/language-servers-section-DJJ7SFXo.js +0 -2
- package/dist/web/assets/language-servers-section-DJJ7SFXo.js.br +0 -0
- package/dist/web/assets/language-servers-section-DJJ7SFXo.js.gz +0 -0
- package/dist/web/assets/latex-37_9fLdz.js +0 -1
- package/dist/web/assets/latex-37_9fLdz.js.br +0 -0
- package/dist/web/assets/latex-37_9fLdz.js.gz +0 -0
- package/dist/web/assets/lib-6APiJkU3.js +0 -4
- package/dist/web/assets/lib-6APiJkU3.js.br +0 -0
- package/dist/web/assets/lib-6APiJkU3.js.gz +0 -0
- package/dist/web/assets/line-CYtSrseF.js +0 -1
- package/dist/web/assets/linear-DyCrWAir.js +0 -1
- package/dist/web/assets/linear-DyCrWAir.js.br +0 -0
- package/dist/web/assets/linear-DyCrWAir.js.gz +0 -0
- package/dist/web/assets/liquid-CaR1gaJt.js +0 -1
- package/dist/web/assets/liquid-CaR1gaJt.js.br +0 -0
- package/dist/web/assets/liquid-CaR1gaJt.js.gz +0 -0
- package/dist/web/assets/lsp-client-Dr3vQ1bb.js +0 -1
- package/dist/web/assets/lsp-client-Dr3vQ1bb.js.br +0 -0
- package/dist/web/assets/lsp-client-Dr3vQ1bb.js.gz +0 -0
- package/dist/web/assets/lua-IFhrYmKl.js +0 -1
- package/dist/web/assets/lua-IFhrYmKl.js.br +0 -0
- package/dist/web/assets/lua-IFhrYmKl.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-CmnqFfTU.js +0 -5
- package/dist/web/assets/markdown-renderer-CmnqFfTU.js.br +0 -0
- package/dist/web/assets/markdown-renderer-CmnqFfTU.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-LJdVMbGl.js +0 -1
- package/dist/web/assets/marko-2g0T6atb.js +0 -1
- package/dist/web/assets/marko-2g0T6atb.js.br +0 -0
- package/dist/web/assets/marko-2g0T6atb.js.gz +0 -0
- package/dist/web/assets/mdc-Dku_3sTh.js +0 -1
- package/dist/web/assets/mdc-Dku_3sTh.js.br +0 -0
- package/dist/web/assets/mdc-Dku_3sTh.js.gz +0 -0
- package/dist/web/assets/media-url-CrT-qulZ.js +0 -1
- package/dist/web/assets/mermaid-parser.core-C5vBM3kO.js +0 -4
- package/dist/web/assets/mermaid-parser.core-C5vBM3kO.js.br +0 -0
- package/dist/web/assets/mermaid-parser.core-C5vBM3kO.js.gz +0 -0
- package/dist/web/assets/mermaid.core-D5SAzB7L.js +0 -11
- package/dist/web/assets/mermaid.core-D5SAzB7L.js.br +0 -0
- package/dist/web/assets/mermaid.core-D5SAzB7L.js.gz +0 -0
- package/dist/web/assets/mindmap-definition-YRQLILUH-juNCbDFr.js +0 -68
- package/dist/web/assets/mindmap-definition-YRQLILUH-juNCbDFr.js.br +0 -0
- package/dist/web/assets/mindmap-definition-YRQLILUH-juNCbDFr.js.gz +0 -0
- package/dist/web/assets/mobile-bottom-sheet-D4UyOatB.js +0 -1
- package/dist/web/assets/mobile-bottom-sheet-D4UyOatB.js.br +0 -0
- package/dist/web/assets/mobile-bottom-sheet-D4UyOatB.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-BiIhZtJ2.js +0 -1
- package/dist/web/assets/mobile-explorer-sheet-BiIhZtJ2.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-BiIhZtJ2.js.gz +0 -0
- package/dist/web/assets/monaco-dotenv-language-DbSss7YR.js +0 -1
- package/dist/web/assets/new-design-dialog-DI_hxvFV.js +0 -1
- package/dist/web/assets/new-design-dialog-DI_hxvFV.js.br +0 -0
- package/dist/web/assets/new-design-dialog-DI_hxvFV.js.gz +0 -0
- package/dist/web/assets/nextflow-DwUrPV3b.js +0 -1
- package/dist/web/assets/nextflow-DwUrPV3b.js.br +0 -0
- package/dist/web/assets/nextflow-DwUrPV3b.js.gz +0 -0
- package/dist/web/assets/nginx-D10J2vrQ.js +0 -1
- package/dist/web/assets/nginx-D10J2vrQ.js.br +0 -0
- package/dist/web/assets/nginx-D10J2vrQ.js.gz +0 -0
- package/dist/web/assets/nim-BonDnBCZ.js +0 -1
- package/dist/web/assets/nim-BonDnBCZ.js.br +0 -0
- package/dist/web/assets/nim-BonDnBCZ.js.gz +0 -0
- package/dist/web/assets/notification-store-9lBSplOV.js +0 -1
- package/dist/web/assets/notifications-settings-section-0s-2OKRv.js +0 -1
- package/dist/web/assets/notifications-settings-section-0s-2OKRv.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-0s-2OKRv.js.gz +0 -0
- package/dist/web/assets/number-overlay-editor-CHqPl6Pv.js +0 -9
- package/dist/web/assets/number-overlay-editor-CHqPl6Pv.js.br +0 -0
- package/dist/web/assets/number-overlay-editor-CHqPl6Pv.js.gz +0 -0
- package/dist/web/assets/onboarding-entry-CGFdGLLP.js +0 -1
- package/dist/web/assets/onboarding-entry-CGFdGLLP.js.br +0 -0
- package/dist/web/assets/onboarding-entry-CGFdGLLP.js.gz +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DPHYFMbA.js +0 -1
- package/dist/web/assets/onboarding-quick-orientation-DPHYFMbA.js.br +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DPHYFMbA.js.gz +0 -0
- package/dist/web/assets/ordinal-CEpaoDoJ.js +0 -1
- package/dist/web/assets/ordinal-CEpaoDoJ.js.br +0 -0
- package/dist/web/assets/ordinal-CEpaoDoJ.js.gz +0 -0
- package/dist/web/assets/overview-panel-3htxfZS2.js +0 -1
- package/dist/web/assets/overview-panel-3htxfZS2.js.br +0 -0
- package/dist/web/assets/overview-panel-3htxfZS2.js.gz +0 -0
- package/dist/web/assets/packet-RMMSAZCW-DCgVLum2.js +0 -1
- package/dist/web/assets/panel-store-B6PoCwBA.js +0 -1
- package/dist/web/assets/panel-store-B6PoCwBA.js.br +0 -0
- package/dist/web/assets/panel-store-B6PoCwBA.js.gz +0 -0
- package/dist/web/assets/pdf-preview-B8A4T-ES.js +0 -1
- package/dist/web/assets/pdf-preview-B8A4T-ES.js.br +0 -0
- package/dist/web/assets/pdf-preview-B8A4T-ES.js.gz +0 -0
- package/dist/web/assets/performance-panel-V8gpnnf7.js +0 -3
- package/dist/web/assets/performance-panel-V8gpnnf7.js.br +0 -0
- package/dist/web/assets/performance-panel-V8gpnnf7.js.gz +0 -0
- package/dist/web/assets/perl-DmdIiZTm.js +0 -1
- package/dist/web/assets/perl-DmdIiZTm.js.br +0 -0
- package/dist/web/assets/perl-DmdIiZTm.js.gz +0 -0
- package/dist/web/assets/php-DXGvCIY0.js +0 -1
- package/dist/web/assets/php-DXGvCIY0.js.br +0 -0
- package/dist/web/assets/php-DXGvCIY0.js.gz +0 -0
- package/dist/web/assets/pie-UPGHQEXC-pxihnmef.js +0 -1
- package/dist/web/assets/pieDiagram-SKSYHLDU-CiJCYElI.js +0 -30
- package/dist/web/assets/pieDiagram-SKSYHLDU-CiJCYElI.js.br +0 -0
- package/dist/web/assets/pieDiagram-SKSYHLDU-CiJCYElI.js.gz +0 -0
- package/dist/web/assets/postgres-viewer-sWS-ogTC.js +0 -3
- package/dist/web/assets/postgres-viewer-sWS-ogTC.js.br +0 -0
- package/dist/web/assets/postgres-viewer-sWS-ogTC.js.gz +0 -0
- package/dist/web/assets/ppmbot-settings-section-CT8vvlzk.js +0 -1
- package/dist/web/assets/ppmbot-settings-section-CT8vvlzk.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-CT8vvlzk.js.gz +0 -0
- package/dist/web/assets/pptx-export-Ugjv0hso.js +0 -111
- package/dist/web/assets/pptx-export-Ugjv0hso.js.br +0 -0
- package/dist/web/assets/pptx-export-Ugjv0hso.js.gz +0 -0
- package/dist/web/assets/problems-panel-Gcy79pSS.js +0 -1
- package/dist/web/assets/problems-panel-Gcy79pSS.js.br +0 -0
- package/dist/web/assets/problems-panel-Gcy79pSS.js.gz +0 -0
- package/dist/web/assets/process-row-format-u6y7lOee.js +0 -1
- package/dist/web/assets/process-table-BUTIp9Oy.js +0 -1
- package/dist/web/assets/process-table-BUTIp9Oy.js.br +0 -0
- package/dist/web/assets/process-table-BUTIp9Oy.js.gz +0 -0
- package/dist/web/assets/project-store-CCimwgGF.js +0 -1
- package/dist/web/assets/project-store-CCimwgGF.js.br +0 -0
- package/dist/web/assets/project-store-CCimwgGF.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-Buv_8y54.js +0 -1
- package/dist/web/assets/proxy-settings-section-Buv_8y54.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-Buv_8y54.js.gz +0 -0
- package/dist/web/assets/pug-BgMlgmpT.js +0 -1
- package/dist/web/assets/pug-BgMlgmpT.js.br +0 -0
- package/dist/web/assets/pug-BgMlgmpT.js.gz +0 -0
- package/dist/web/assets/qml-DjqBS8bc.js +0 -1
- package/dist/web/assets/qml-DjqBS8bc.js.br +0 -0
- package/dist/web/assets/qml-DjqBS8bc.js.gz +0 -0
- package/dist/web/assets/quadrantDiagram-337W2JSQ-D3q5dHQe.js +0 -7
- package/dist/web/assets/quadrantDiagram-337W2JSQ-D3q5dHQe.js.br +0 -0
- package/dist/web/assets/quadrantDiagram-337W2JSQ-D3q5dHQe.js.gz +0 -0
- package/dist/web/assets/query-audit-section-N2DQtgJx.js +0 -1
- package/dist/web/assets/query-audit-section-N2DQtgJx.js.br +0 -0
- package/dist/web/assets/query-audit-section-N2DQtgJx.js.gz +0 -0
- package/dist/web/assets/radar-KQ55EAFF-CeeNXQSm.js +0 -1
- package/dist/web/assets/razor-CzV29vlj.js +0 -1
- package/dist/web/assets/razor-CzV29vlj.js.br +0 -0
- package/dist/web/assets/razor-CzV29vlj.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-CRvJqmaz.js +0 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-CRvJqmaz.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-CRvJqmaz.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-BoYINLbJ.js +0 -2
- package/dist/web/assets/remote-desktop-mobile-sheet-BoYINLbJ.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-BoYINLbJ.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DPdP0yYu.js +0 -1
- package/dist/web/assets/remote-desktop-mobile-view-DPdP0yYu.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DPdP0yYu.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BeQ_Jrp7.js +0 -1
- package/dist/web/assets/remote-desktop-readiness-gate-BeQ_Jrp7.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BeQ_Jrp7.js.gz +0 -0
- package/dist/web/assets/remote-desktop-settings-section-Bs4sHS3l.js +0 -1
- package/dist/web/assets/remote-desktop-settings-section-Bs4sHS3l.js.br +0 -0
- package/dist/web/assets/remote-desktop-settings-section-Bs4sHS3l.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-DDr__JxQ.js +0 -1
- package/dist/web/assets/remote-desktop-window-content-DDr__JxQ.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-DDr__JxQ.js.gz +0 -0
- package/dist/web/assets/requirementDiagram-Z7DCOOCP-BZfeEsxv.js +0 -73
- package/dist/web/assets/requirementDiagram-Z7DCOOCP-BZfeEsxv.js.br +0 -0
- package/dist/web/assets/requirementDiagram-Z7DCOOCP-BZfeEsxv.js.gz +0 -0
- package/dist/web/assets/rst-DffOOLD7.js +0 -1
- package/dist/web/assets/rst-DffOOLD7.js.br +0 -0
- package/dist/web/assets/rst-DffOOLD7.js.gz +0 -0
- package/dist/web/assets/ruby-C5DczJCc.js +0 -1
- package/dist/web/assets/ruby-C5DczJCc.js.br +0 -0
- package/dist/web/assets/ruby-C5DczJCc.js.gz +0 -0
- package/dist/web/assets/run-in-terminal-DCBNtYHQ.js +0 -1
- package/dist/web/assets/sankeyDiagram-WA2Y5GQK-CxM5iAJY.js +0 -10
- package/dist/web/assets/sankeyDiagram-WA2Y5GQK-CxM5iAJY.js.br +0 -0
- package/dist/web/assets/sankeyDiagram-WA2Y5GQK-CxM5iAJY.js.gz +0 -0
- package/dist/web/assets/sas-CoO1xLdH.js +0 -1
- package/dist/web/assets/sas-CoO1xLdH.js.br +0 -0
- package/dist/web/assets/sas-CoO1xLdH.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-_cHX2qOa.js +0 -1
- package/dist/web/assets/schedules-settings-section-_cHX2qOa.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-_cHX2qOa.js.gz +0 -0
- package/dist/web/assets/scroll-area-sjOeAfoD.js +0 -1
- package/dist/web/assets/scroll-area-sjOeAfoD.js.br +0 -0
- package/dist/web/assets/scroll-area-sjOeAfoD.js.gz +0 -0
- package/dist/web/assets/scss-d9PFDNvb.js +0 -1
- package/dist/web/assets/scss-d9PFDNvb.js.br +0 -0
- package/dist/web/assets/scss-d9PFDNvb.js.gz +0 -0
- package/dist/web/assets/send-to-chat-dNqNV7Y4.js +0 -1
- package/dist/web/assets/send-to-chat-dNqNV7Y4.js.br +0 -0
- package/dist/web/assets/send-to-chat-dNqNV7Y4.js.gz +0 -0
- package/dist/web/assets/separator-dHj3Km--.js +0 -1
- package/dist/web/assets/sequenceDiagram-2WXFIKYE-D4PdZNfQ.js +0 -145
- package/dist/web/assets/sequenceDiagram-2WXFIKYE-D4PdZNfQ.js.br +0 -0
- package/dist/web/assets/sequenceDiagram-2WXFIKYE-D4PdZNfQ.js.gz +0 -0
- package/dist/web/assets/services-panel-Dm54cnW3.js +0 -1
- package/dist/web/assets/services-panel-Dm54cnW3.js.br +0 -0
- package/dist/web/assets/services-panel-Dm54cnW3.js.gz +0 -0
- package/dist/web/assets/session-list-sync-triggers-ATvz-1g3.js +0 -1
- package/dist/web/assets/session-list-sync-triggers-ATvz-1g3.js.br +0 -0
- package/dist/web/assets/session-list-sync-triggers-ATvz-1g3.js.gz +0 -0
- package/dist/web/assets/settings-body-DRRQNaDA.js +0 -1
- package/dist/web/assets/settings-body-DRRQNaDA.js.br +0 -0
- package/dist/web/assets/settings-body-DRRQNaDA.js.gz +0 -0
- package/dist/web/assets/settings-section-content-DRaHfvm8.js +0 -1
- package/dist/web/assets/settings-section-content-U3mIx6hF.js +0 -2
- package/dist/web/assets/settings-section-content-U3mIx6hF.js.br +0 -0
- package/dist/web/assets/settings-section-content-U3mIx6hF.js.gz +0 -0
- package/dist/web/assets/settings-store-Cyuo8ceh.js +0 -2
- package/dist/web/assets/settings-store-Cyuo8ceh.js.br +0 -0
- package/dist/web/assets/settings-store-Cyuo8ceh.js.gz +0 -0
- package/dist/web/assets/settings-tab-CB_BhHTK.js +0 -1
- package/dist/web/assets/settings-window-content-CgZIMNX8.js +0 -1
- package/dist/web/assets/shaderlab-BkB57LhQ.js +0 -1
- package/dist/web/assets/shaderlab-BkB57LhQ.js.br +0 -0
- package/dist/web/assets/shaderlab-BkB57LhQ.js.gz +0 -0
- package/dist/web/assets/shellsession-CTpUym8_.js +0 -1
- package/dist/web/assets/slash-command-picker-CQlIqMW0.js +0 -1
- package/dist/web/assets/slash-command-picker-CQlIqMW0.js.br +0 -0
- package/dist/web/assets/slash-command-picker-CQlIqMW0.js.gz +0 -0
- package/dist/web/assets/sortable-header-BOa8o7NJ.js +0 -1
- package/dist/web/assets/sortable-header-BOa8o7NJ.js.br +0 -0
- package/dist/web/assets/sortable-header-BOa8o7NJ.js.gz +0 -0
- package/dist/web/assets/soy-CGmWpNZ2.js +0 -1
- package/dist/web/assets/soy-CGmWpNZ2.js.br +0 -0
- package/dist/web/assets/soy-CGmWpNZ2.js.gz +0 -0
- package/dist/web/assets/sparql-DtdOj_MX.js +0 -1
- package/dist/web/assets/sparql-DtdOj_MX.js.br +0 -0
- package/dist/web/assets/sparql-DtdOj_MX.js.gz +0 -0
- package/dist/web/assets/sql-query-editor--Z4bcqd8.js +0 -1
- package/dist/web/assets/sql-query-editor--Z4bcqd8.js.br +0 -0
- package/dist/web/assets/sql-query-editor--Z4bcqd8.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-CSmX3qaj.js +0 -1
- package/dist/web/assets/sqlite-viewer-CSmX3qaj.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-CSmX3qaj.js.gz +0 -0
- package/dist/web/assets/stata-6W_BX14b.js +0 -1
- package/dist/web/assets/stata-6W_BX14b.js.br +0 -0
- package/dist/web/assets/stata-6W_BX14b.js.gz +0 -0
- package/dist/web/assets/stateDiagram-RAJIS63D-BasP-g7l.js +0 -1
- package/dist/web/assets/stateDiagram-RAJIS63D-BasP-g7l.js.br +0 -0
- package/dist/web/assets/stateDiagram-RAJIS63D-BasP-g7l.js.gz +0 -0
- package/dist/web/assets/stateDiagram-v2-FVOUBMTO-DH7CpDey.js +0 -1
- package/dist/web/assets/surrealql-BhmbH4Yk.js +0 -1
- package/dist/web/assets/surrealql-BhmbH4Yk.js.br +0 -0
- package/dist/web/assets/surrealql-BhmbH4Yk.js.gz +0 -0
- package/dist/web/assets/svelte-D6EOFdO-.js +0 -1
- package/dist/web/assets/svelte-D6EOFdO-.js.br +0 -0
- package/dist/web/assets/svelte-D6EOFdO-.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-LannpU6H.js +0 -2
- package/dist/web/assets/system-monitor-body-LannpU6H.js.br +0 -0
- package/dist/web/assets/system-monitor-body-LannpU6H.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-BfVucwEF.js +0 -1
- package/dist/web/assets/system-monitor-window-content-kLNW9Ln3.js +0 -1
- package/dist/web/assets/tab-host-window-content-II_FtOYM.js +0 -1
- package/dist/web/assets/tab-host-window-content-II_FtOYM.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-II_FtOYM.js.gz +0 -0
- package/dist/web/assets/tab-store-DCpc0g0Q.js +0 -1
- package/dist/web/assets/templ-DuLJgZN8.js +0 -1
- package/dist/web/assets/templ-DuLJgZN8.js.br +0 -0
- package/dist/web/assets/templ-DuLJgZN8.js.gz +0 -0
- package/dist/web/assets/terminal-tab-CTe2polt.js +0 -3
- package/dist/web/assets/terminal-tab-CTe2polt.js.br +0 -0
- package/dist/web/assets/terminal-tab-CTe2polt.js.gz +0 -0
- package/dist/web/assets/tex-D8IJD2J1.js +0 -1
- package/dist/web/assets/tex-D8IJD2J1.js.br +0 -0
- package/dist/web/assets/tex-D8IJD2J1.js.gz +0 -0
- package/dist/web/assets/timeline-definition-YZTLITO2-Do92I8eh.js +0 -61
- package/dist/web/assets/timeline-definition-YZTLITO2-Do92I8eh.js.br +0 -0
- package/dist/web/assets/timeline-definition-YZTLITO2-Do92I8eh.js.gz +0 -0
- package/dist/web/assets/tool-cards-rxLXbBSm.js +0 -9
- package/dist/web/assets/tool-cards-rxLXbBSm.js.br +0 -0
- package/dist/web/assets/tool-cards-rxLXbBSm.js.gz +0 -0
- package/dist/web/assets/treemap-KZPCXAKY-OVcqjFQG.js +0 -1
- package/dist/web/assets/ts-tags-BxVcUOvj.js +0 -1
- package/dist/web/assets/ts-tags-BxVcUOvj.js.br +0 -0
- package/dist/web/assets/ts-tags-BxVcUOvj.js.gz +0 -0
- package/dist/web/assets/twig-BT8vDHa2.js +0 -1
- package/dist/web/assets/twig-BT8vDHa2.js.br +0 -0
- package/dist/web/assets/twig-BT8vDHa2.js.gz +0 -0
- package/dist/web/assets/use-blob-url-BC69n15x.js +0 -1
- package/dist/web/assets/use-inline-blame-CxZ_QWzS.js +0 -16
- package/dist/web/assets/use-inline-blame-CxZ_QWzS.js.br +0 -0
- package/dist/web/assets/use-inline-blame-CxZ_QWzS.js.gz +0 -0
- package/dist/web/assets/use-lsp-gCNE5A9K.js +0 -6
- package/dist/web/assets/use-lsp-gCNE5A9K.js.br +0 -0
- package/dist/web/assets/use-lsp-gCNE5A9K.js.gz +0 -0
- package/dist/web/assets/use-monaco-theme-DvNGcCvz.js +0 -1
- package/dist/web/assets/use-process-kill-Cbiu1mbY.js +0 -1
- package/dist/web/assets/use-process-kill-Cbiu1mbY.js.br +0 -0
- package/dist/web/assets/use-process-kill-Cbiu1mbY.js.gz +0 -0
- package/dist/web/assets/use-websocket-AC7EG1LK.js +0 -1
- package/dist/web/assets/vendor-ui-P9Ym7hCv.js +0 -45
- package/dist/web/assets/vendor-ui-P9Ym7hCv.js.br +0 -0
- package/dist/web/assets/vendor-ui-P9Ym7hCv.js.gz +0 -0
- package/dist/web/assets/vennDiagram-LZ73GAT5-ITFNzHRx.js +0 -34
- package/dist/web/assets/vennDiagram-LZ73GAT5-ITFNzHRx.js.br +0 -0
- package/dist/web/assets/vennDiagram-LZ73GAT5-ITFNzHRx.js.gz +0 -0
- package/dist/web/assets/video-preview-C2Y61WUE.js +0 -1
- package/dist/web/assets/video-preview-C2Y61WUE.js.br +0 -0
- package/dist/web/assets/video-preview-C2Y61WUE.js.gz +0 -0
- package/dist/web/assets/voice-settings-section-DCXZeLYI.js +0 -1
- package/dist/web/assets/voice-settings-section-DCXZeLYI.js.br +0 -0
- package/dist/web/assets/voice-settings-section-DCXZeLYI.js.gz +0 -0
- package/dist/web/assets/vue-BcyG2SyR.js +0 -1
- package/dist/web/assets/vue-BcyG2SyR.js.br +0 -0
- package/dist/web/assets/vue-BcyG2SyR.js.gz +0 -0
- package/dist/web/assets/vue-html-D8iVjZTe.js +0 -1
- package/dist/web/assets/vue-html-D8iVjZTe.js.br +0 -0
- package/dist/web/assets/vue-html-D8iVjZTe.js.gz +0 -0
- package/dist/web/assets/vue-vine-DxBjHHk4.js +0 -1
- package/dist/web/assets/vue-vine-DxBjHHk4.js.br +0 -0
- package/dist/web/assets/vue-vine-DxBjHHk4.js.gz +0 -0
- package/dist/web/assets/window-pip-registry-9Y9LQQYS.js +0 -1
- package/dist/web/assets/window-store-vo1N70nK.js +0 -1
- package/dist/web/assets/window-store-vo1N70nK.js.br +0 -0
- package/dist/web/assets/window-store-vo1N70nK.js.gz +0 -0
- package/dist/web/assets/ws-auth-Ytui7dXP.js +0 -1
- package/dist/web/assets/xml-Zepcw_qF.js +0 -1
- package/dist/web/assets/xml-Zepcw_qF.js.br +0 -0
- package/dist/web/assets/xml-Zepcw_qF.js.gz +0 -0
- package/dist/web/assets/xsl-_m-WMWv3.js +0 -1
- package/dist/web/assets/xsl-_m-WMWv3.js.br +0 -0
- package/dist/web/assets/xsl-_m-WMWv3.js.gz +0 -0
- package/dist/web/assets/xychartDiagram-JWTSCODW-Z12EI4TX.js +0 -7
- package/dist/web/assets/xychartDiagram-JWTSCODW-Z12EI4TX.js.br +0 -0
- package/dist/web/assets/xychartDiagram-JWTSCODW-Z12EI4TX.js.gz +0 -0
- package/src/server/routes/fs-sqlite.ts +0 -129
- package/src/server/routes/postgres.ts +0 -92
- package/src/server/routes/sqlite.ts +0 -148
- package/src/services/database/split-sql-statements.ts +0 -95
- package/src/web/components/chat/change-edit-list.tsx +0 -50
- package/src/web/components/database/connection-form-dialog.tsx +0 -252
- package/src/web/components/database/connection-list.tsx +0 -192
- package/src/web/components/database/connection-row.tsx +0 -104
- package/src/web/components/database/database-viewer.tsx +0 -353
- package/src/web/components/database/glide-column-search.tsx +0 -81
- package/src/web/components/database/glide-data-preview-panel.tsx +0 -114
- package/src/web/components/database/glide-grid-pagination.tsx +0 -34
- package/src/web/components/database/glide-grid-toolbar.tsx +0 -105
- package/src/web/components/database/resolve-preview-data.ts +0 -62
- package/src/web/components/database/schema-table-tree.tsx +0 -98
- package/src/web/components/database/split-sql-statements.ts +0 -116
- package/src/web/components/database/use-db-tree-expansion.ts +0 -74
- package/src/web/components/database/use-glide-pending-edits.ts +0 -72
- package/src/web/components/database/use-glide-row-pinning.ts +0 -35
- package/src/web/components/postgres/postgres-viewer.tsx +0 -283
- package/src/web/components/postgres/use-postgres.ts +0 -161
- package/src/web/components/shared/bug-report-popup.tsx +0 -59
- package/src/web/components/sqlite/sqlite-data-grid.tsx +0 -213
- package/src/web/components/sqlite/sqlite-query-editor.tsx +0 -10
- package/src/web/components/sqlite/sqlite-table-list.tsx +0 -48
- package/src/web/components/sqlite/use-sqlite.ts +0 -135
- package/src/web/components/tunnels/named-tunnel/named-tunnel-section.tsx +0 -159
- package/src/web/components/tunnels/public-tunnel-switch.tsx +0 -82
- package/src/web/components/tunnels/tunnel-manager-tab.tsx +0 -207
- package/src/web/lib/report-bug.ts +0 -79
- /package/dist/web/assets/{__vite-browser-external-C5mXParC.js → __vite-browser-external-B4VNaaaA.js} +0 -0
- /package/dist/web/assets/{abap-Ds6L4g_T.js → abap-BIHt2d9F.js} +0 -0
- /package/dist/web/assets/{abap-Ds6L4g_T.js.br → abap-BIHt2d9F.js.br} +0 -0
- /package/dist/web/assets/{abap-Ds6L4g_T.js.gz → abap-BIHt2d9F.js.gz} +0 -0
- /package/dist/web/assets/{actionscript-3-CLNiH4aj.js → actionscript-3-rbCNRHFj.js} +0 -0
- /package/dist/web/assets/{actionscript-3-CLNiH4aj.js.br → actionscript-3-rbCNRHFj.js.br} +0 -0
- /package/dist/web/assets/{actionscript-3-CLNiH4aj.js.gz → actionscript-3-rbCNRHFj.js.gz} +0 -0
- /package/dist/web/assets/{ada-BoiebnO1.js → ada-CN94LQTJ.js} +0 -0
- /package/dist/web/assets/{ada-BoiebnO1.js.br → ada-CN94LQTJ.js.br} +0 -0
- /package/dist/web/assets/{ada-BoiebnO1.js.gz → ada-CN94LQTJ.js.gz} +0 -0
- /package/dist/web/assets/{andromeeda-CdMZLp1H.js → andromeeda-BsmcoXuQ.js} +0 -0
- /package/dist/web/assets/{andromeeda-CdMZLp1H.js.br → andromeeda-BsmcoXuQ.js.br} +0 -0
- /package/dist/web/assets/{andromeeda-CdMZLp1H.js.gz → andromeeda-BsmcoXuQ.js.gz} +0 -0
- /package/dist/web/assets/{apache-BKOdPQIP.js → apache-pRQmqcVZ.js} +0 -0
- /package/dist/web/assets/{apache-BKOdPQIP.js.br → apache-pRQmqcVZ.js.br} +0 -0
- /package/dist/web/assets/{apache-BKOdPQIP.js.gz → apache-pRQmqcVZ.js.gz} +0 -0
- /package/dist/web/assets/{apex-kTmPDDVo.js → apex-CNEumC1X.js} +0 -0
- /package/dist/web/assets/{apex-kTmPDDVo.js.br → apex-CNEumC1X.js.br} +0 -0
- /package/dist/web/assets/{apex-kTmPDDVo.js.gz → apex-CNEumC1X.js.gz} +0 -0
- /package/dist/web/assets/{applescript-C65SMPLe.js → applescript-DjEVsS-3.js} +0 -0
- /package/dist/web/assets/{applescript-C65SMPLe.js.br → applescript-DjEVsS-3.js.br} +0 -0
- /package/dist/web/assets/{applescript-C65SMPLe.js.gz → applescript-DjEVsS-3.js.gz} +0 -0
- /package/dist/web/assets/{apply-theme-Cc_cmrD5.js → apply-theme-ORrEdHKT.js} +0 -0
- /package/dist/web/assets/{ara-BKT6no2T.js → ara-DbhZRlTL.js} +0 -0
- /package/dist/web/assets/{ara-BKT6no2T.js.br → ara-DbhZRlTL.js.br} +0 -0
- /package/dist/web/assets/{ara-BKT6no2T.js.gz → ara-DbhZRlTL.js.gz} +0 -0
- /package/dist/web/assets/{array-F4LNYbhF.js → array-BQrdK5nm.js} +0 -0
- /package/dist/web/assets/{asciidoc-BGur0ue3.js → asciidoc-BsfbAXIK.js} +0 -0
- /package/dist/web/assets/{asciidoc-BGur0ue3.js.br → asciidoc-BsfbAXIK.js.br} +0 -0
- /package/dist/web/assets/{asciidoc-BGur0ue3.js.gz → asciidoc-BsfbAXIK.js.gz} +0 -0
- /package/dist/web/assets/{asm-DOfgqCKD.js → asm-Vw5NMXjI.js} +0 -0
- /package/dist/web/assets/{asm-DOfgqCKD.js.br → asm-Vw5NMXjI.js.br} +0 -0
- /package/dist/web/assets/{asm-DOfgqCKD.js.gz → asm-Vw5NMXjI.js.gz} +0 -0
- /package/dist/web/assets/{aurora-x-D64MWGxe.js → aurora-x-CoahU6sR.js} +0 -0
- /package/dist/web/assets/{aurora-x-D64MWGxe.js.br → aurora-x-CoahU6sR.js.br} +0 -0
- /package/dist/web/assets/{aurora-x-D64MWGxe.js.gz → aurora-x-CoahU6sR.js.gz} +0 -0
- /package/dist/web/assets/{awk-B_r8LcWp.js → awk-ChKjCxHz.js} +0 -0
- /package/dist/web/assets/{awk-B_r8LcWp.js.br → awk-ChKjCxHz.js.br} +0 -0
- /package/dist/web/assets/{awk-B_r8LcWp.js.gz → awk-ChKjCxHz.js.gz} +0 -0
- /package/dist/web/assets/{ayu-dark-DlDyr9-5.js → ayu-dark-By9RKxTf.js} +0 -0
- /package/dist/web/assets/{ayu-dark-DlDyr9-5.js.br → ayu-dark-By9RKxTf.js.br} +0 -0
- /package/dist/web/assets/{ayu-dark-DlDyr9-5.js.gz → ayu-dark-By9RKxTf.js.gz} +0 -0
- /package/dist/web/assets/{ayu-light-BF0a181n.js → ayu-light-CEsgeLON.js} +0 -0
- /package/dist/web/assets/{ayu-light-BF0a181n.js.br → ayu-light-CEsgeLON.js.br} +0 -0
- /package/dist/web/assets/{ayu-light-BF0a181n.js.gz → ayu-light-CEsgeLON.js.gz} +0 -0
- /package/dist/web/assets/{ayu-mirage-B6hnRsHM.js → ayu-mirage-CYrtwSLW.js} +0 -0
- /package/dist/web/assets/{ayu-mirage-B6hnRsHM.js.br → ayu-mirage-CYrtwSLW.js.br} +0 -0
- /package/dist/web/assets/{ayu-mirage-B6hnRsHM.js.gz → ayu-mirage-CYrtwSLW.js.gz} +0 -0
- /package/dist/web/assets/{ballerina-CyhD34qA.js → ballerina-CCSVz22W.js} +0 -0
- /package/dist/web/assets/{ballerina-CyhD34qA.js.br → ballerina-CCSVz22W.js.br} +0 -0
- /package/dist/web/assets/{ballerina-CyhD34qA.js.gz → ballerina-CCSVz22W.js.gz} +0 -0
- /package/dist/web/assets/{bat-wHB_k1YG.js → bat-DU4--CMj.js} +0 -0
- /package/dist/web/assets/{bat-wHB_k1YG.js.br → bat-DU4--CMj.js.br} +0 -0
- /package/dist/web/assets/{bat-wHB_k1YG.js.gz → bat-DU4--CMj.js.gz} +0 -0
- /package/dist/web/assets/{beancount-SUF8MnzM.js → beancount-DF_tlRlF.js} +0 -0
- /package/dist/web/assets/{beancount-SUF8MnzM.js.br → beancount-DF_tlRlF.js.br} +0 -0
- /package/dist/web/assets/{beancount-SUF8MnzM.js.gz → beancount-DF_tlRlF.js.gz} +0 -0
- /package/dist/web/assets/{berry-BP_34_jr.js → berry-CZTnatvO.js} +0 -0
- /package/dist/web/assets/{berry-BP_34_jr.js.br → berry-CZTnatvO.js.br} +0 -0
- /package/dist/web/assets/{berry-BP_34_jr.js.gz → berry-CZTnatvO.js.gz} +0 -0
- /package/dist/web/assets/{bibtex-DKgKw2bN.js → bibtex-BSpXy8jk.js} +0 -0
- /package/dist/web/assets/{bibtex-DKgKw2bN.js.br → bibtex-BSpXy8jk.js.br} +0 -0
- /package/dist/web/assets/{bibtex-DKgKw2bN.js.gz → bibtex-BSpXy8jk.js.gz} +0 -0
- /package/dist/web/assets/{bicep-BjU-KQeN.js → bicep-yv1Ydq5Z.js} +0 -0
- /package/dist/web/assets/{bicep-BjU-KQeN.js.br → bicep-yv1Ydq5Z.js.br} +0 -0
- /package/dist/web/assets/{bicep-BjU-KQeN.js.gz → bicep-yv1Ydq5Z.js.gz} +0 -0
- /package/dist/web/assets/{bird2-CCFmrT2P.js → bird2-Db7Z7SMN.js} +0 -0
- /package/dist/web/assets/{bird2-CCFmrT2P.js.br → bird2-Db7Z7SMN.js.br} +0 -0
- /package/dist/web/assets/{bird2-CCFmrT2P.js.gz → bird2-Db7Z7SMN.js.gz} +0 -0
- /package/dist/web/assets/{c-BX-1170_.js → c-D2iyQzEt.js} +0 -0
- /package/dist/web/assets/{c-BX-1170_.js.br → c-D2iyQzEt.js.br} +0 -0
- /package/dist/web/assets/{c-BX-1170_.js.gz → c-D2iyQzEt.js.gz} +0 -0
- /package/dist/web/assets/{c3-DSc4IcLQ.js → c3-N4mKyst9.js} +0 -0
- /package/dist/web/assets/{c3-DSc4IcLQ.js.br → c3-N4mKyst9.js.br} +0 -0
- /package/dist/web/assets/{c3-DSc4IcLQ.js.gz → c3-N4mKyst9.js.gz} +0 -0
- /package/dist/web/assets/{cadence-CUaLlWyn.js → cadence-BYK8tFFk.js} +0 -0
- /package/dist/web/assets/{cadence-CUaLlWyn.js.br → cadence-BYK8tFFk.js.br} +0 -0
- /package/dist/web/assets/{cadence-CUaLlWyn.js.gz → cadence-BYK8tFFk.js.gz} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-DeE2-kd5.js → can-open-in-ppm-CwrBTXOy.js} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-DeE2-kd5.js.br → can-open-in-ppm-CwrBTXOy.js.br} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-DeE2-kd5.js.gz → can-open-in-ppm-CwrBTXOy.js.gz} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-BT3IMDYa.js → catppuccin-frappe-BK9Tv2XG.js} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-BT3IMDYa.js.br → catppuccin-frappe-BK9Tv2XG.js.br} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-BT3IMDYa.js.gz → catppuccin-frappe-BK9Tv2XG.js.gz} +0 -0
- /package/dist/web/assets/{catppuccin-latte-DM9i15n3.js → catppuccin-latte-De4mVCp3.js} +0 -0
- /package/dist/web/assets/{catppuccin-latte-DM9i15n3.js.br → catppuccin-latte-De4mVCp3.js.br} +0 -0
- /package/dist/web/assets/{catppuccin-latte-DM9i15n3.js.gz → catppuccin-latte-De4mVCp3.js.gz} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-CAEDr_h3.js → catppuccin-macchiato-Bxt_D7cs.js} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-CAEDr_h3.js.br → catppuccin-macchiato-Bxt_D7cs.js.br} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-CAEDr_h3.js.gz → catppuccin-macchiato-Bxt_D7cs.js.gz} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-BzOmDckq.js → catppuccin-mocha-Dz2o8gN7.js} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-BzOmDckq.js.br → catppuccin-mocha-Dz2o8gN7.js.br} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-BzOmDckq.js.gz → catppuccin-mocha-Dz2o8gN7.js.gz} +0 -0
- /package/dist/web/assets/{clarity-BijZXjQ6.js → clarity-BJdh0Pw-.js} +0 -0
- /package/dist/web/assets/{clarity-BijZXjQ6.js.br → clarity-BJdh0Pw-.js.br} +0 -0
- /package/dist/web/assets/{clarity-BijZXjQ6.js.gz → clarity-BJdh0Pw-.js.gz} +0 -0
- /package/dist/web/assets/{clojure--ad2221W.js → clojure-DG-FYGzn.js} +0 -0
- /package/dist/web/assets/{clojure--ad2221W.js.br → clojure-DG-FYGzn.js.br} +0 -0
- /package/dist/web/assets/{clojure--ad2221W.js.gz → clojure-DG-FYGzn.js.gz} +0 -0
- /package/dist/web/assets/{cmake-DyjUMpXU.js → cmake-D1imEXan.js} +0 -0
- /package/dist/web/assets/{cmake-DyjUMpXU.js.br → cmake-D1imEXan.js.br} +0 -0
- /package/dist/web/assets/{cmake-DyjUMpXU.js.gz → cmake-D1imEXan.js.gz} +0 -0
- /package/dist/web/assets/{codeowners-BeMhKnC9.js → codeowners-YpylTFB5.js} +0 -0
- /package/dist/web/assets/{codeql-BGtwwp5_.js → codeql-ajDEPgqi.js} +0 -0
- /package/dist/web/assets/{codeql-BGtwwp5_.js.br → codeql-ajDEPgqi.js.br} +0 -0
- /package/dist/web/assets/{codeql-BGtwwp5_.js.gz → codeql-ajDEPgqi.js.gz} +0 -0
- /package/dist/web/assets/{common-lisp--ldIKs5M.js → common-lisp-C2sCrd-m.js} +0 -0
- /package/dist/web/assets/{common-lisp--ldIKs5M.js.br → common-lisp-C2sCrd-m.js.br} +0 -0
- /package/dist/web/assets/{common-lisp--ldIKs5M.js.gz → common-lisp-C2sCrd-m.js.gz} +0 -0
- /package/dist/web/assets/{coq-CRn01_Db.js → coq-BqybyDc9.js} +0 -0
- /package/dist/web/assets/{coq-CRn01_Db.js.br → coq-BqybyDc9.js.br} +0 -0
- /package/dist/web/assets/{coq-CRn01_Db.js.gz → coq-BqybyDc9.js.gz} +0 -0
- /package/dist/web/assets/{csharp-CuWM1IYq.js → csharp-nKCEiujy.js} +0 -0
- /package/dist/web/assets/{csharp-CuWM1IYq.js.br → csharp-nKCEiujy.js.br} +0 -0
- /package/dist/web/assets/{csharp-CuWM1IYq.js.gz → csharp-nKCEiujy.js.gz} +0 -0
- /package/dist/web/assets/{css-CQ_jz6Vl.js → css-BwwQrFr3.js} +0 -0
- /package/dist/web/assets/{css-CQ_jz6Vl.js.br → css-BwwQrFr3.js.br} +0 -0
- /package/dist/web/assets/{css-CQ_jz6Vl.js.gz → css-BwwQrFr3.js.gz} +0 -0
- /package/dist/web/assets/{csv-DP77pbR8.js → csv-Nh9vQwQm.js} +0 -0
- /package/dist/web/assets/{csv-DP77pbR8.js.br → csv-Nh9vQwQm.js.br} +0 -0
- /package/dist/web/assets/{csv-DP77pbR8.js.gz → csv-Nh9vQwQm.js.gz} +0 -0
- /package/dist/web/assets/{cue-DScL5ELc.js → cue-Ch79RPsU.js} +0 -0
- /package/dist/web/assets/{cue-DScL5ELc.js.br → cue-Ch79RPsU.js.br} +0 -0
- /package/dist/web/assets/{cue-DScL5ELc.js.gz → cue-Ch79RPsU.js.gz} +0 -0
- /package/dist/web/assets/{cypher-8ehI2vrw.js → cypher-CgiOQ6hs.js} +0 -0
- /package/dist/web/assets/{cypher-8ehI2vrw.js.br → cypher-CgiOQ6hs.js.br} +0 -0
- /package/dist/web/assets/{cypher-8ehI2vrw.js.gz → cypher-CgiOQ6hs.js.gz} +0 -0
- /package/dist/web/assets/{cytoscape.esm-BokGhmK2.js → cytoscape.esm-9PBaSM25.js} +0 -0
- /package/dist/web/assets/{cytoscape.esm-BokGhmK2.js.br → cytoscape.esm-9PBaSM25.js.br} +0 -0
- /package/dist/web/assets/{cytoscape.esm-BokGhmK2.js.gz → cytoscape.esm-9PBaSM25.js.gz} +0 -0
- /package/dist/web/assets/{d-BvFZUewv.js → d-CmBcySpH.js} +0 -0
- /package/dist/web/assets/{d-BvFZUewv.js.br → d-CmBcySpH.js.br} +0 -0
- /package/dist/web/assets/{d-BvFZUewv.js.gz → d-CmBcySpH.js.gz} +0 -0
- /package/dist/web/assets/{dark-plus-DKLywSFP.js → dark-plus-COLEX2ui.js} +0 -0
- /package/dist/web/assets/{dark-plus-DKLywSFP.js.br → dark-plus-COLEX2ui.js.br} +0 -0
- /package/dist/web/assets/{dark-plus-DKLywSFP.js.gz → dark-plus-COLEX2ui.js.gz} +0 -0
- /package/dist/web/assets/{dart-Cs_NJAZ7.js → dart-BTAArMcJ.js} +0 -0
- /package/dist/web/assets/{dart-Cs_NJAZ7.js.br → dart-BTAArMcJ.js.br} +0 -0
- /package/dist/web/assets/{dart-Cs_NJAZ7.js.gz → dart-BTAArMcJ.js.gz} +0 -0
- /package/dist/web/assets/{dax-BB8KgXzI.js → dax-BbZzRY9i.js} +0 -0
- /package/dist/web/assets/{dax-BB8KgXzI.js.br → dax-BbZzRY9i.js.br} +0 -0
- /package/dist/web/assets/{dax-BB8KgXzI.js.gz → dax-BbZzRY9i.js.gz} +0 -0
- /package/dist/web/assets/{defaultLocale-4xAk2LVU.js → defaultLocale-1Phej3f6.js} +0 -0
- /package/dist/web/assets/{defaultLocale-4xAk2LVU.js.br → defaultLocale-1Phej3f6.js.br} +0 -0
- /package/dist/web/assets/{defaultLocale-4xAk2LVU.js.gz → defaultLocale-1Phej3f6.js.gz} +0 -0
- /package/dist/web/assets/{design-system-status-label-ekiLyjKn.js → design-system-status-label-Cus6e2Df.js} +0 -0
- /package/dist/web/assets/{desktop-Cs6Sk5Pu.js → desktop-OmQvU3-J.js} +0 -0
- /package/dist/web/assets/{desktop-Cs6Sk5Pu.js.br → desktop-OmQvU3-J.js.br} +0 -0
- /package/dist/web/assets/{desktop-Cs6Sk5Pu.js.gz → desktop-OmQvU3-J.js.gz} +0 -0
- /package/dist/web/assets/{diff-CXSq83h3.js → diff-BEPnb9Fb.js} +0 -0
- /package/dist/web/assets/{diff-CXSq83h3.js.br → diff-BEPnb9Fb.js.br} +0 -0
- /package/dist/web/assets/{diff-CXSq83h3.js.gz → diff-BEPnb9Fb.js.gz} +0 -0
- /package/dist/web/assets/{dist-D7mSb2HC.js → dist--v_QGJF6.js} +0 -0
- /package/dist/web/assets/{dist-D7mSb2HC.js.br → dist--v_QGJF6.js.br} +0 -0
- /package/dist/web/assets/{dist-D7mSb2HC.js.gz → dist--v_QGJF6.js.gz} +0 -0
- /package/dist/web/assets/{dist-0EbiTA3n.js → dist-ChawRilJ.js} +0 -0
- /package/dist/web/assets/{dist-0EbiTA3n.js.br → dist-ChawRilJ.js.br} +0 -0
- /package/dist/web/assets/{dist-0EbiTA3n.js.gz → dist-ChawRilJ.js.gz} +0 -0
- /package/dist/web/assets/{docker-BX5p1mZ3.js → docker-Cg17HgTD.js} +0 -0
- /package/dist/web/assets/{docker-BX5p1mZ3.js.br → docker-Cg17HgTD.js.br} +0 -0
- /package/dist/web/assets/{docker-BX5p1mZ3.js.gz → docker-Cg17HgTD.js.gz} +0 -0
- /package/dist/web/assets/{dotenv-D8xdMiRo.js → dotenv-DEMIaY7V.js} +0 -0
- /package/dist/web/assets/{dotenv-D8xdMiRo.js.br → dotenv-DEMIaY7V.js.br} +0 -0
- /package/dist/web/assets/{dotenv-D8xdMiRo.js.gz → dotenv-DEMIaY7V.js.gz} +0 -0
- /package/dist/web/assets/{dracula-BNPKmiGE.js → dracula-BkCFq8SO.js} +0 -0
- /package/dist/web/assets/{dracula-BNPKmiGE.js.br → dracula-BkCFq8SO.js.br} +0 -0
- /package/dist/web/assets/{dracula-BNPKmiGE.js.gz → dracula-BkCFq8SO.js.gz} +0 -0
- /package/dist/web/assets/{dracula-soft-Bv4lLEFc.js → dracula-soft-Cjp6-ltF.js} +0 -0
- /package/dist/web/assets/{dracula-soft-Bv4lLEFc.js.br → dracula-soft-Cjp6-ltF.js.br} +0 -0
- /package/dist/web/assets/{dracula-soft-Bv4lLEFc.js.gz → dracula-soft-Cjp6-ltF.js.gz} +0 -0
- /package/dist/web/assets/{dream-maker-Yg8FPJu3.js → dream-maker-Ce7Y_UKj.js} +0 -0
- /package/dist/web/assets/{dream-maker-Yg8FPJu3.js.br → dream-maker-Ce7Y_UKj.js.br} +0 -0
- /package/dist/web/assets/{dream-maker-Yg8FPJu3.js.gz → dream-maker-Ce7Y_UKj.js.gz} +0 -0
- /package/dist/web/assets/{editor-font-CBszn6vt.js → editor-font-CdxKRKX-.js} +0 -0
- /package/dist/web/assets/{emacs-lisp-kBgNJmB7.js → emacs-lisp-BjpyfTbN.js} +0 -0
- /package/dist/web/assets/{emacs-lisp-kBgNJmB7.js.br → emacs-lisp-BjpyfTbN.js.br} +0 -0
- /package/dist/web/assets/{emacs-lisp-kBgNJmB7.js.gz → emacs-lisp-BjpyfTbN.js.gz} +0 -0
- /package/dist/web/assets/{everforest-dark-7XTfQW4s.js → everforest-dark-9r4okw1s.js} +0 -0
- /package/dist/web/assets/{everforest-dark-7XTfQW4s.js.br → everforest-dark-9r4okw1s.js.br} +0 -0
- /package/dist/web/assets/{everforest-dark-7XTfQW4s.js.gz → everforest-dark-9r4okw1s.js.gz} +0 -0
- /package/dist/web/assets/{everforest-light-CmPZPQmV.js → everforest-light-GCQTZ3Ju.js} +0 -0
- /package/dist/web/assets/{everforest-light-CmPZPQmV.js.br → everforest-light-GCQTZ3Ju.js.br} +0 -0
- /package/dist/web/assets/{everforest-light-CmPZPQmV.js.gz → everforest-light-GCQTZ3Ju.js.gz} +0 -0
- /package/dist/web/assets/{fennel-Dm71IPM6.js → fennel-ITjY5Z6u.js} +0 -0
- /package/dist/web/assets/{fennel-Dm71IPM6.js.br → fennel-ITjY5Z6u.js.br} +0 -0
- /package/dist/web/assets/{fennel-Dm71IPM6.js.gz → fennel-ITjY5Z6u.js.gz} +0 -0
- /package/dist/web/assets/{fish-CIzcfZjZ.js → fish-DP2uEzyg.js} +0 -0
- /package/dist/web/assets/{fish-CIzcfZjZ.js.br → fish-DP2uEzyg.js.br} +0 -0
- /package/dist/web/assets/{fish-CIzcfZjZ.js.gz → fish-DP2uEzyg.js.gz} +0 -0
- /package/dist/web/assets/{fluent-DFSMEphj.js → fluent-irzaP1f6.js} +0 -0
- /package/dist/web/assets/{fluent-DFSMEphj.js.br → fluent-irzaP1f6.js.br} +0 -0
- /package/dist/web/assets/{fluent-DFSMEphj.js.gz → fluent-irzaP1f6.js.gz} +0 -0
- /package/dist/web/assets/{format-bytes-FQmpZ25A.js → format-bytes-B2kC4sbB.js} +0 -0
- /package/dist/web/assets/{format-date-BMtvCeb9.js → format-date-CSHaU2wN.js} +0 -0
- /package/dist/web/assets/{fortran-free-form-xnlj2dLW.js → fortran-free-form-BAPoainr.js} +0 -0
- /package/dist/web/assets/{fortran-free-form-xnlj2dLW.js.br → fortran-free-form-BAPoainr.js.br} +0 -0
- /package/dist/web/assets/{fortran-free-form-xnlj2dLW.js.gz → fortran-free-form-BAPoainr.js.gz} +0 -0
- /package/dist/web/assets/{gdscript-DFnznHD1.js → gdscript-DJ098V1z.js} +0 -0
- /package/dist/web/assets/{gdscript-DFnznHD1.js.br → gdscript-DJ098V1z.js.br} +0 -0
- /package/dist/web/assets/{gdscript-DFnznHD1.js.gz → gdscript-DJ098V1z.js.gz} +0 -0
- /package/dist/web/assets/{gdshader-B9wvgXVU.js → gdshader-DS2Jfy-K.js} +0 -0
- /package/dist/web/assets/{gdshader-B9wvgXVU.js.br → gdshader-DS2Jfy-K.js.br} +0 -0
- /package/dist/web/assets/{gdshader-B9wvgXVU.js.gz → gdshader-DS2Jfy-K.js.gz} +0 -0
- /package/dist/web/assets/{genie-Bz0RXdFf.js → genie-CqfOaFFx.js} +0 -0
- /package/dist/web/assets/{genie-Bz0RXdFf.js.br → genie-CqfOaFFx.js.br} +0 -0
- /package/dist/web/assets/{genie-Bz0RXdFf.js.gz → genie-CqfOaFFx.js.gz} +0 -0
- /package/dist/web/assets/{gherkin-ZD8lWd_U.js → gherkin-CoZ2ucDH.js} +0 -0
- /package/dist/web/assets/{gherkin-ZD8lWd_U.js.br → gherkin-CoZ2ucDH.js.br} +0 -0
- /package/dist/web/assets/{gherkin-ZD8lWd_U.js.gz → gherkin-CoZ2ucDH.js.gz} +0 -0
- /package/dist/web/assets/{github-dark-D8IE4lln.js → github-dark-BNLgnSO9.js} +0 -0
- /package/dist/web/assets/{github-dark-D8IE4lln.js.br → github-dark-BNLgnSO9.js.br} +0 -0
- /package/dist/web/assets/{github-dark-D8IE4lln.js.gz → github-dark-BNLgnSO9.js.gz} +0 -0
- /package/dist/web/assets/{github-dark-default-Bv2-je5j.js → github-dark-default-CYlSggwi.js} +0 -0
- /package/dist/web/assets/{github-dark-default-Bv2-je5j.js.br → github-dark-default-CYlSggwi.js.br} +0 -0
- /package/dist/web/assets/{github-dark-default-Bv2-je5j.js.gz → github-dark-default-CYlSggwi.js.gz} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-Dn2Abfcl.js → github-dark-dimmed-DumUysDk.js} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-Dn2Abfcl.js.br → github-dark-dimmed-DumUysDk.js.br} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-Dn2Abfcl.js.gz → github-dark-dimmed-DumUysDk.js.gz} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-CPYPXNHn.js → github-dark-high-contrast-TKrcDJ2I.js} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-CPYPXNHn.js.br → github-dark-high-contrast-TKrcDJ2I.js.br} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-CPYPXNHn.js.gz → github-dark-high-contrast-TKrcDJ2I.js.gz} +0 -0
- /package/dist/web/assets/{github-light-CVOMBMvb.js → github-light-DVENFHLJ.js} +0 -0
- /package/dist/web/assets/{github-light-CVOMBMvb.js.br → github-light-DVENFHLJ.js.br} +0 -0
- /package/dist/web/assets/{github-light-CVOMBMvb.js.gz → github-light-DVENFHLJ.js.gz} +0 -0
- /package/dist/web/assets/{github-light-default-6Ayk6lJY.js → github-light-default-DtN8AGcE.js} +0 -0
- /package/dist/web/assets/{github-light-default-6Ayk6lJY.js.br → github-light-default-DtN8AGcE.js.br} +0 -0
- /package/dist/web/assets/{github-light-default-6Ayk6lJY.js.gz → github-light-default-DtN8AGcE.js.gz} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-BTGKd6JI.js → github-light-high-contrast-NSyF37x4.js} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-BTGKd6JI.js.br → github-light-high-contrast-NSyF37x4.js.br} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-BTGKd6JI.js.gz → github-light-high-contrast-NSyF37x4.js.gz} +0 -0
- /package/dist/web/assets/{gleam-UeA7_OU8.js → gleam-hp4NMSb5.js} +0 -0
- /package/dist/web/assets/{gleam-UeA7_OU8.js.br → gleam-hp4NMSb5.js.br} +0 -0
- /package/dist/web/assets/{gleam-UeA7_OU8.js.gz → gleam-hp4NMSb5.js.gz} +0 -0
- /package/dist/web/assets/{gn-DrdNDhFj.js → gn-Dptw2PEu.js} +0 -0
- /package/dist/web/assets/{gn-DrdNDhFj.js.br → gn-Dptw2PEu.js.br} +0 -0
- /package/dist/web/assets/{gn-DrdNDhFj.js.gz → gn-Dptw2PEu.js.gz} +0 -0
- /package/dist/web/assets/{gnuplot-D8vxhaGw.js → gnuplot-9juRzjwv.js} +0 -0
- /package/dist/web/assets/{gnuplot-D8vxhaGw.js.br → gnuplot-9juRzjwv.js.br} +0 -0
- /package/dist/web/assets/{gnuplot-D8vxhaGw.js.gz → gnuplot-9juRzjwv.js.gz} +0 -0
- /package/dist/web/assets/{go-atNMhmH3.js → go-D-QLCda0.js} +0 -0
- /package/dist/web/assets/{go-atNMhmH3.js.br → go-D-QLCda0.js.br} +0 -0
- /package/dist/web/assets/{go-atNMhmH3.js.gz → go-D-QLCda0.js.gz} +0 -0
- /package/dist/web/assets/{groovy-CLRzHDW2.js → groovy-DHKNy6Eh.js} +0 -0
- /package/dist/web/assets/{groovy-CLRzHDW2.js.br → groovy-DHKNy6Eh.js.br} +0 -0
- /package/dist/web/assets/{groovy-CLRzHDW2.js.gz → groovy-DHKNy6Eh.js.gz} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-CMSNCrAk.js → gruvbox-dark-hard-BFD6aQdB.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-CMSNCrAk.js.br → gruvbox-dark-hard-BFD6aQdB.js.br} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-CMSNCrAk.js.gz → gruvbox-dark-hard-BFD6aQdB.js.gz} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-CR5wAM1c.js → gruvbox-dark-medium-D5llYBNp.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-CR5wAM1c.js.br → gruvbox-dark-medium-D5llYBNp.js.br} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-CR5wAM1c.js.gz → gruvbox-dark-medium-D5llYBNp.js.gz} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-Ba1gP2O2.js → gruvbox-dark-soft-DOztQmNR.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-Ba1gP2O2.js.br → gruvbox-dark-soft-DOztQmNR.js.br} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-Ba1gP2O2.js.gz → gruvbox-dark-soft-DOztQmNR.js.gz} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-ChSY383t.js → gruvbox-light-hard-BFGD-8Pd.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-ChSY383t.js.br → gruvbox-light-hard-BFGD-8Pd.js.br} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-ChSY383t.js.gz → gruvbox-light-hard-BFGD-8Pd.js.gz} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-DebZzeA2.js → gruvbox-light-medium-DzoyXgT7.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-DebZzeA2.js.br → gruvbox-light-medium-DzoyXgT7.js.br} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-DebZzeA2.js.gz → gruvbox-light-medium-DzoyXgT7.js.gz} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-CEWqv8Ew.js → gruvbox-light-soft-B1Ix2zLN.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-CEWqv8Ew.js.br → gruvbox-light-soft-B1Ix2zLN.js.br} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-CEWqv8Ew.js.gz → gruvbox-light-soft-B1Ix2zLN.js.gz} +0 -0
- /package/dist/web/assets/{haskell-CkgCblz9.js → haskell-BnrJ0k7G.js} +0 -0
- /package/dist/web/assets/{haskell-CkgCblz9.js.br → haskell-BnrJ0k7G.js.br} +0 -0
- /package/dist/web/assets/{haskell-CkgCblz9.js.gz → haskell-BnrJ0k7G.js.gz} +0 -0
- /package/dist/web/assets/{haxe-DwOdNXRl.js → haxe-DwShHT_-.js} +0 -0
- /package/dist/web/assets/{haxe-DwOdNXRl.js.br → haxe-DwShHT_-.js.br} +0 -0
- /package/dist/web/assets/{haxe-DwOdNXRl.js.gz → haxe-DwShHT_-.js.gz} +0 -0
- /package/dist/web/assets/{hcl-DXsxN8nX.js → hcl-VOjEibVB.js} +0 -0
- /package/dist/web/assets/{hcl-DXsxN8nX.js.br → hcl-VOjEibVB.js.br} +0 -0
- /package/dist/web/assets/{hcl-DXsxN8nX.js.gz → hcl-VOjEibVB.js.gz} +0 -0
- /package/dist/web/assets/{hjson-oBOZxrL4.js → hjson-BHEn7pNn.js} +0 -0
- /package/dist/web/assets/{hjson-oBOZxrL4.js.br → hjson-BHEn7pNn.js.br} +0 -0
- /package/dist/web/assets/{hjson-oBOZxrL4.js.gz → hjson-BHEn7pNn.js.gz} +0 -0
- /package/dist/web/assets/{hlsl-VEZxDU3L.js → hlsl-CrvxlGii.js} +0 -0
- /package/dist/web/assets/{hlsl-VEZxDU3L.js.br → hlsl-CrvxlGii.js.br} +0 -0
- /package/dist/web/assets/{hlsl-VEZxDU3L.js.gz → hlsl-CrvxlGii.js.gz} +0 -0
- /package/dist/web/assets/{horizon-C_xHTsMO.js → horizon-D3T-P0u6.js} +0 -0
- /package/dist/web/assets/{horizon-C_xHTsMO.js.br → horizon-D3T-P0u6.js.br} +0 -0
- /package/dist/web/assets/{horizon-C_xHTsMO.js.gz → horizon-D3T-P0u6.js.gz} +0 -0
- /package/dist/web/assets/{horizon-bright-CJd-vMFG.js → horizon-bright-vifGsEdk.js} +0 -0
- /package/dist/web/assets/{horizon-bright-CJd-vMFG.js.br → horizon-bright-vifGsEdk.js.br} +0 -0
- /package/dist/web/assets/{horizon-bright-CJd-vMFG.js.gz → horizon-bright-vifGsEdk.js.gz} +0 -0
- /package/dist/web/assets/{houston-BYOfZpV9.js → houston-IrOgT7r4.js} +0 -0
- /package/dist/web/assets/{houston-BYOfZpV9.js.br → houston-IrOgT7r4.js.br} +0 -0
- /package/dist/web/assets/{houston-BYOfZpV9.js.gz → houston-IrOgT7r4.js.gz} +0 -0
- /package/dist/web/assets/{hy-DiruP4wR.js → hy-5eSgTJ8G.js} +0 -0
- /package/dist/web/assets/{hy-DiruP4wR.js.br → hy-5eSgTJ8G.js.br} +0 -0
- /package/dist/web/assets/{hy-DiruP4wR.js.gz → hy-5eSgTJ8G.js.gz} +0 -0
- /package/dist/web/assets/{image-gallery-B16hO6Ab.js → image-gallery-BuxSgBug.js} +0 -0
- /package/dist/web/assets/{image-preview-geometry-D4Ihz4UV.js → image-preview-geometry-CCq8rio7.js} +0 -0
- /package/dist/web/assets/{imba-BBm5cmpQ.js → imba-Dp0I4DVl.js} +0 -0
- /package/dist/web/assets/{imba-BBm5cmpQ.js.br → imba-Dp0I4DVl.js.br} +0 -0
- /package/dist/web/assets/{imba-BBm5cmpQ.js.gz → imba-Dp0I4DVl.js.gz} +0 -0
- /package/dist/web/assets/{ini-DIjchSIH.js → ini-CHDKad9O.js} +0 -0
- /package/dist/web/assets/{ini-DIjchSIH.js.br → ini-CHDKad9O.js.br} +0 -0
- /package/dist/web/assets/{ini-DIjchSIH.js.gz → ini-CHDKad9O.js.gz} +0 -0
- /package/dist/web/assets/{init-Cf64k-PQ.js → init-YGhXRxki.js} +0 -0
- /package/dist/web/assets/{isArrayLikeObject-DoNOpNUH.js → isArrayLikeObject-DHTG10am.js} +0 -0
- /package/dist/web/assets/{isArrayLikeObject-DoNOpNUH.js.br → isArrayLikeObject-DHTG10am.js.br} +0 -0
- /package/dist/web/assets/{isArrayLikeObject-DoNOpNUH.js.gz → isArrayLikeObject-DHTG10am.js.gz} +0 -0
- /package/dist/web/assets/{java-BjdsRxXN.js → java-ClnCQCSW.js} +0 -0
- /package/dist/web/assets/{java-BjdsRxXN.js.br → java-ClnCQCSW.js.br} +0 -0
- /package/dist/web/assets/{java-BjdsRxXN.js.gz → java-ClnCQCSW.js.gz} +0 -0
- /package/dist/web/assets/{javascript-R2SZ_OEC.js → javascript-D1PM1fYV.js} +0 -0
- /package/dist/web/assets/{javascript-R2SZ_OEC.js.br → javascript-D1PM1fYV.js.br} +0 -0
- /package/dist/web/assets/{javascript-R2SZ_OEC.js.gz → javascript-D1PM1fYV.js.gz} +0 -0
- /package/dist/web/assets/{json-CYCJeTwK.js → json-DELY1EIR.js} +0 -0
- /package/dist/web/assets/{json-CYCJeTwK.js.br → json-DELY1EIR.js.br} +0 -0
- /package/dist/web/assets/{json-CYCJeTwK.js.gz → json-DELY1EIR.js.gz} +0 -0
- /package/dist/web/assets/{json5-0Pz845K0.js → json5-D6f_uNwJ.js} +0 -0
- /package/dist/web/assets/{json5-0Pz845K0.js.br → json5-D6f_uNwJ.js.br} +0 -0
- /package/dist/web/assets/{json5-0Pz845K0.js.gz → json5-D6f_uNwJ.js.gz} +0 -0
- /package/dist/web/assets/{jsonc-B0jdT4uM.js → jsonc-DrHCdmos.js} +0 -0
- /package/dist/web/assets/{jsonc-B0jdT4uM.js.br → jsonc-DrHCdmos.js.br} +0 -0
- /package/dist/web/assets/{jsonc-B0jdT4uM.js.gz → jsonc-DrHCdmos.js.gz} +0 -0
- /package/dist/web/assets/{jsonl-CdvFKZtz.js → jsonl-Cwc3cXEL.js} +0 -0
- /package/dist/web/assets/{jsonl-CdvFKZtz.js.br → jsonl-Cwc3cXEL.js.br} +0 -0
- /package/dist/web/assets/{jsonl-CdvFKZtz.js.gz → jsonl-Cwc3cXEL.js.gz} +0 -0
- /package/dist/web/assets/{jsonnet-BYd5ZGqe.js → jsonnet-BwZfaIFT.js} +0 -0
- /package/dist/web/assets/{jsonnet-BYd5ZGqe.js.br → jsonnet-BwZfaIFT.js.br} +0 -0
- /package/dist/web/assets/{jsonnet-BYd5ZGqe.js.gz → jsonnet-BwZfaIFT.js.gz} +0 -0
- /package/dist/web/assets/{jssm-BlBU_IK1.js → jssm-BpEmg_MT.js} +0 -0
- /package/dist/web/assets/{jssm-BlBU_IK1.js.br → jssm-BpEmg_MT.js.br} +0 -0
- /package/dist/web/assets/{jssm-BlBU_IK1.js.gz → jssm-BpEmg_MT.js.gz} +0 -0
- /package/dist/web/assets/{jsx-CsWR7aMm.js → jsx-BOrwA6ld.js} +0 -0
- /package/dist/web/assets/{jsx-CsWR7aMm.js.br → jsx-BOrwA6ld.js.br} +0 -0
- /package/dist/web/assets/{jsx-CsWR7aMm.js.gz → jsx-BOrwA6ld.js.gz} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-C6ogFc3X.js → kanagawa-dragon-DRfVaGIX.js} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-C6ogFc3X.js.br → kanagawa-dragon-DRfVaGIX.js.br} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-C6ogFc3X.js.gz → kanagawa-dragon-DRfVaGIX.js.gz} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-8esZNUbA.js → kanagawa-lotus-CjOlny0Q.js} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-8esZNUbA.js.br → kanagawa-lotus-CjOlny0Q.js.br} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-8esZNUbA.js.gz → kanagawa-lotus-CjOlny0Q.js.gz} +0 -0
- /package/dist/web/assets/{kanagawa-wave-C-yWQ6RD.js → kanagawa-wave-DvdM88a4.js} +0 -0
- /package/dist/web/assets/{kanagawa-wave-C-yWQ6RD.js.br → kanagawa-wave-DvdM88a4.js.br} +0 -0
- /package/dist/web/assets/{kanagawa-wave-C-yWQ6RD.js.gz → kanagawa-wave-DvdM88a4.js.gz} +0 -0
- /package/dist/web/assets/{katex-Cz0KLyXA.js → katex-BHtqYBze.js} +0 -0
- /package/dist/web/assets/{katex-Cz0KLyXA.js.br → katex-BHtqYBze.js.br} +0 -0
- /package/dist/web/assets/{katex-Cz0KLyXA.js.gz → katex-BHtqYBze.js.gz} +0 -0
- /package/dist/web/assets/{kdl-D712OVXR.js → kdl-DSo3PvM0.js} +0 -0
- /package/dist/web/assets/{kdl-D712OVXR.js.br → kdl-DSo3PvM0.js.br} +0 -0
- /package/dist/web/assets/{kdl-D712OVXR.js.gz → kdl-DSo3PvM0.js.gz} +0 -0
- /package/dist/web/assets/{kotlin-BEUa7XzN.js → kotlin-BV8TwCGu.js} +0 -0
- /package/dist/web/assets/{kotlin-BEUa7XzN.js.br → kotlin-BV8TwCGu.js.br} +0 -0
- /package/dist/web/assets/{kotlin-BEUa7XzN.js.gz → kotlin-BV8TwCGu.js.gz} +0 -0
- /package/dist/web/assets/{kusto-n4J6aIey.js → kusto-DCo1Fdmm.js} +0 -0
- /package/dist/web/assets/{kusto-n4J6aIey.js.br → kusto-DCo1Fdmm.js.br} +0 -0
- /package/dist/web/assets/{kusto-n4J6aIey.js.gz → kusto-DCo1Fdmm.js.gz} +0 -0
- /package/dist/web/assets/{laserwave-CddL9sH-.js → laserwave-DPX9FvD9.js} +0 -0
- /package/dist/web/assets/{laserwave-CddL9sH-.js.br → laserwave-DPX9FvD9.js.br} +0 -0
- /package/dist/web/assets/{laserwave-CddL9sH-.js.gz → laserwave-DPX9FvD9.js.gz} +0 -0
- /package/dist/web/assets/{lean-CS8dnaPi.js → lean-Cya8dqZu.js} +0 -0
- /package/dist/web/assets/{lean-CS8dnaPi.js.br → lean-Cya8dqZu.js.br} +0 -0
- /package/dist/web/assets/{lean-CS8dnaPi.js.gz → lean-Cya8dqZu.js.gz} +0 -0
- /package/dist/web/assets/{less-D7VWEXeK.js → less-CJUPgkIs.js} +0 -0
- /package/dist/web/assets/{less-D7VWEXeK.js.br → less-CJUPgkIs.js.br} +0 -0
- /package/dist/web/assets/{less-D7VWEXeK.js.gz → less-CJUPgkIs.js.gz} +0 -0
- /package/dist/web/assets/{libesm-5wREk7JN.js → libesm-B6LsX5wH.js} +0 -0
- /package/dist/web/assets/{libesm-5wREk7JN.js.br → libesm-B6LsX5wH.js.br} +0 -0
- /package/dist/web/assets/{libesm-5wREk7JN.js.gz → libesm-B6LsX5wH.js.gz} +0 -0
- /package/dist/web/assets/{light-plus-DUh-yC9k.js → light-plus-BXXrlFJH.js} +0 -0
- /package/dist/web/assets/{light-plus-DUh-yC9k.js.br → light-plus-BXXrlFJH.js.br} +0 -0
- /package/dist/web/assets/{light-plus-DUh-yC9k.js.gz → light-plus-BXXrlFJH.js.gz} +0 -0
- /package/dist/web/assets/{llvm-P1D8XyMB.js → llvm-CUbQanZr.js} +0 -0
- /package/dist/web/assets/{llvm-P1D8XyMB.js.br → llvm-CUbQanZr.js.br} +0 -0
- /package/dist/web/assets/{llvm-P1D8XyMB.js.gz → llvm-CUbQanZr.js.gz} +0 -0
- /package/dist/web/assets/{log-BGft0RQz.js → log-B3fFlSMd.js} +0 -0
- /package/dist/web/assets/{log-BGft0RQz.js.br → log-B3fFlSMd.js.br} +0 -0
- /package/dist/web/assets/{log-BGft0RQz.js.gz → log-B3fFlSMd.js.gz} +0 -0
- /package/dist/web/assets/{logo-uFZx2JEw.js → logo-ucAyw6zf.js} +0 -0
- /package/dist/web/assets/{logo-uFZx2JEw.js.br → logo-ucAyw6zf.js.br} +0 -0
- /package/dist/web/assets/{logo-uFZx2JEw.js.gz → logo-ucAyw6zf.js.gz} +0 -0
- /package/dist/web/assets/{luau-aDpnpIe3.js → luau-C4l6TSTB.js} +0 -0
- /package/dist/web/assets/{luau-aDpnpIe3.js.br → luau-C4l6TSTB.js.br} +0 -0
- /package/dist/web/assets/{luau-aDpnpIe3.js.gz → luau-C4l6TSTB.js.gz} +0 -0
- /package/dist/web/assets/{make-DwjpJeU5.js → make-CDtGIVc7.js} +0 -0
- /package/dist/web/assets/{make-DwjpJeU5.js.br → make-CDtGIVc7.js.br} +0 -0
- /package/dist/web/assets/{make-DwjpJeU5.js.gz → make-CDtGIVc7.js.gz} +0 -0
- /package/dist/web/assets/{markdown-DC-eWqXi.js → markdown-CH1zKu2p.js} +0 -0
- /package/dist/web/assets/{markdown-DC-eWqXi.js.br → markdown-CH1zKu2p.js.br} +0 -0
- /package/dist/web/assets/{markdown-DC-eWqXi.js.gz → markdown-CH1zKu2p.js.gz} +0 -0
- /package/dist/web/assets/{marked.esm-DDb9MclE.js → marked.esm-jqwIt-AK.js} +0 -0
- /package/dist/web/assets/{marked.esm-DDb9MclE.js.br → marked.esm-jqwIt-AK.js.br} +0 -0
- /package/dist/web/assets/{marked.esm-DDb9MclE.js.gz → marked.esm-jqwIt-AK.js.gz} +0 -0
- /package/dist/web/assets/{material-theme-9BivM5cB.js → material-theme-CEuGVTmh.js} +0 -0
- /package/dist/web/assets/{material-theme-9BivM5cB.js.br → material-theme-CEuGVTmh.js.br} +0 -0
- /package/dist/web/assets/{material-theme-9BivM5cB.js.gz → material-theme-CEuGVTmh.js.gz} +0 -0
- /package/dist/web/assets/{material-theme-darker-Bg7I3WIw.js → material-theme-darker-CUZ3MoIr.js} +0 -0
- /package/dist/web/assets/{material-theme-darker-Bg7I3WIw.js.br → material-theme-darker-CUZ3MoIr.js.br} +0 -0
- /package/dist/web/assets/{material-theme-darker-Bg7I3WIw.js.gz → material-theme-darker-CUZ3MoIr.js.gz} +0 -0
- /package/dist/web/assets/{material-theme-lighter-BoEshpBb.js → material-theme-lighter-DxAqJSid.js} +0 -0
- /package/dist/web/assets/{material-theme-lighter-BoEshpBb.js.br → material-theme-lighter-DxAqJSid.js.br} +0 -0
- /package/dist/web/assets/{material-theme-lighter-BoEshpBb.js.gz → material-theme-lighter-DxAqJSid.js.gz} +0 -0
- /package/dist/web/assets/{material-theme-ocean-CmKcBlBP.js → material-theme-ocean-BSvvHJp6.js} +0 -0
- /package/dist/web/assets/{material-theme-ocean-CmKcBlBP.js.br → material-theme-ocean-BSvvHJp6.js.br} +0 -0
- /package/dist/web/assets/{material-theme-ocean-CmKcBlBP.js.gz → material-theme-ocean-BSvvHJp6.js.gz} +0 -0
- /package/dist/web/assets/{material-theme-palenight-CUyfHC0C.js → material-theme-palenight-QVOl50_m.js} +0 -0
- /package/dist/web/assets/{material-theme-palenight-CUyfHC0C.js.br → material-theme-palenight-QVOl50_m.js.br} +0 -0
- /package/dist/web/assets/{material-theme-palenight-CUyfHC0C.js.gz → material-theme-palenight-QVOl50_m.js.gz} +0 -0
- /package/dist/web/assets/{math-DAaFbMeh.js → math-iYw0Gln4.js} +0 -0
- /package/dist/web/assets/{matlab-CqBfVqYF.js → matlab-CZLQLwUp.js} +0 -0
- /package/dist/web/assets/{matlab-CqBfVqYF.js.br → matlab-CZLQLwUp.js.br} +0 -0
- /package/dist/web/assets/{matlab-CqBfVqYF.js.gz → matlab-CZLQLwUp.js.gz} +0 -0
- /package/dist/web/assets/{mdx-CdC2mVzF.js → mdx-DO4NJsOo.js} +0 -0
- /package/dist/web/assets/{mdx-CdC2mVzF.js.br → mdx-DO4NJsOo.js.br} +0 -0
- /package/dist/web/assets/{mdx-CdC2mVzF.js.gz → mdx-DO4NJsOo.js.gz} +0 -0
- /package/dist/web/assets/{mermaid-B542RnGP.js → mermaid-CIwzg1uO.js} +0 -0
- /package/dist/web/assets/{mermaid-B542RnGP.js.br → mermaid-CIwzg1uO.js.br} +0 -0
- /package/dist/web/assets/{mermaid-B542RnGP.js.gz → mermaid-CIwzg1uO.js.gz} +0 -0
- /package/dist/web/assets/{metric-chart-canvas-D7f-LQ8x.js → metric-chart-canvas-LAMaVJTu.js} +0 -0
- /package/dist/web/assets/{metric-chart-canvas-D7f-LQ8x.js.br → metric-chart-canvas-LAMaVJTu.js.br} +0 -0
- /package/dist/web/assets/{metric-chart-canvas-D7f-LQ8x.js.gz → metric-chart-canvas-LAMaVJTu.js.gz} +0 -0
- /package/dist/web/assets/{min-dark-uGP-9UE_.js → min-dark-BdIgslXy.js} +0 -0
- /package/dist/web/assets/{min-dark-uGP-9UE_.js.br → min-dark-BdIgslXy.js.br} +0 -0
- /package/dist/web/assets/{min-dark-uGP-9UE_.js.gz → min-dark-BdIgslXy.js.gz} +0 -0
- /package/dist/web/assets/{min-light-BkFlXt3G.js → min-light-DyU-T1r2.js} +0 -0
- /package/dist/web/assets/{min-light-BkFlXt3G.js.br → min-light-DyU-T1r2.js.br} +0 -0
- /package/dist/web/assets/{min-light-BkFlXt3G.js.gz → min-light-DyU-T1r2.js.gz} +0 -0
- /package/dist/web/assets/{mipsasm-CkaxcMA-.js → mipsasm-DRad-Klm.js} +0 -0
- /package/dist/web/assets/{mipsasm-CkaxcMA-.js.br → mipsasm-DRad-Klm.js.br} +0 -0
- /package/dist/web/assets/{mipsasm-CkaxcMA-.js.gz → mipsasm-DRad-Klm.js.gz} +0 -0
- /package/dist/web/assets/{mojo-DDh7AQLv.js → mojo-DXp5LDOc.js} +0 -0
- /package/dist/web/assets/{mojo-DDh7AQLv.js.br → mojo-DXp5LDOc.js.br} +0 -0
- /package/dist/web/assets/{mojo-DDh7AQLv.js.gz → mojo-DXp5LDOc.js.gz} +0 -0
- /package/dist/web/assets/{monokai-BA4dkSrE.js → monokai-BiKX3qby.js} +0 -0
- /package/dist/web/assets/{monokai-BA4dkSrE.js.br → monokai-BiKX3qby.js.br} +0 -0
- /package/dist/web/assets/{monokai-BA4dkSrE.js.gz → monokai-BiKX3qby.js.gz} +0 -0
- /package/dist/web/assets/{moonbit-DGxZDax4.js → moonbit-BOUoLF5r.js} +0 -0
- /package/dist/web/assets/{moonbit-DGxZDax4.js.br → moonbit-BOUoLF5r.js.br} +0 -0
- /package/dist/web/assets/{moonbit-DGxZDax4.js.gz → moonbit-BOUoLF5r.js.gz} +0 -0
- /package/dist/web/assets/{move-C1HZaVNc.js → move-Dlk64FWK.js} +0 -0
- /package/dist/web/assets/{move-C1HZaVNc.js.br → move-Dlk64FWK.js.br} +0 -0
- /package/dist/web/assets/{move-C1HZaVNc.js.gz → move-Dlk64FWK.js.gz} +0 -0
- /package/dist/web/assets/{narrat-g4c9qhYS.js → narrat-B-qd2Lh0.js} +0 -0
- /package/dist/web/assets/{narrat-g4c9qhYS.js.br → narrat-B-qd2Lh0.js.br} +0 -0
- /package/dist/web/assets/{narrat-g4c9qhYS.js.gz → narrat-B-qd2Lh0.js.gz} +0 -0
- /package/dist/web/assets/{nextflow-groovy-CisdbLPv.js → nextflow-groovy-iAMYas0F.js} +0 -0
- /package/dist/web/assets/{nextflow-groovy-CisdbLPv.js.br → nextflow-groovy-iAMYas0F.js.br} +0 -0
- /package/dist/web/assets/{nextflow-groovy-CisdbLPv.js.gz → nextflow-groovy-iAMYas0F.js.gz} +0 -0
- /package/dist/web/assets/{night-owl-ds7NNgBg.js → night-owl-3YNqjftR.js} +0 -0
- /package/dist/web/assets/{night-owl-ds7NNgBg.js.br → night-owl-3YNqjftR.js.br} +0 -0
- /package/dist/web/assets/{night-owl-ds7NNgBg.js.gz → night-owl-3YNqjftR.js.gz} +0 -0
- /package/dist/web/assets/{night-owl-light-DurCGAfC.js → night-owl-light-GIncHb5w.js} +0 -0
- /package/dist/web/assets/{night-owl-light-DurCGAfC.js.br → night-owl-light-GIncHb5w.js.br} +0 -0
- /package/dist/web/assets/{night-owl-light-DurCGAfC.js.gz → night-owl-light-GIncHb5w.js.gz} +0 -0
- /package/dist/web/assets/{nix-D7kCv9F9.js → nix-xjlEb3uw.js} +0 -0
- /package/dist/web/assets/{nix-D7kCv9F9.js.br → nix-xjlEb3uw.js.br} +0 -0
- /package/dist/web/assets/{nix-D7kCv9F9.js.gz → nix-xjlEb3uw.js.gz} +0 -0
- /package/dist/web/assets/{nord-C-O3ceAv.js → nord-C8tvWx7P.js} +0 -0
- /package/dist/web/assets/{nord-C-O3ceAv.js.br → nord-C8tvWx7P.js.br} +0 -0
- /package/dist/web/assets/{nord-C-O3ceAv.js.gz → nord-C8tvWx7P.js.gz} +0 -0
- /package/dist/web/assets/{nushell-oUYTGkzu.js → nushell-BqBb4pU6.js} +0 -0
- /package/dist/web/assets/{nushell-oUYTGkzu.js.br → nushell-BqBb4pU6.js.br} +0 -0
- /package/dist/web/assets/{nushell-oUYTGkzu.js.gz → nushell-BqBb4pU6.js.gz} +0 -0
- /package/dist/web/assets/{objective-c-CzqHoRSj.js → objective-c-Bk6s0Cn5.js} +0 -0
- /package/dist/web/assets/{objective-c-CzqHoRSj.js.br → objective-c-Bk6s0Cn5.js.br} +0 -0
- /package/dist/web/assets/{objective-c-CzqHoRSj.js.gz → objective-c-Bk6s0Cn5.js.gz} +0 -0
- /package/dist/web/assets/{objective-cpp-DJ8fgF2d.js → objective-cpp-DGTVWQ3V.js} +0 -0
- /package/dist/web/assets/{objective-cpp-DJ8fgF2d.js.br → objective-cpp-DGTVWQ3V.js.br} +0 -0
- /package/dist/web/assets/{objective-cpp-DJ8fgF2d.js.gz → objective-cpp-DGTVWQ3V.js.gz} +0 -0
- /package/dist/web/assets/{ocaml-B_nWFfqA.js → ocaml-D6wPQ4kw.js} +0 -0
- /package/dist/web/assets/{ocaml-B_nWFfqA.js.br → ocaml-D6wPQ4kw.js.br} +0 -0
- /package/dist/web/assets/{ocaml-B_nWFfqA.js.gz → ocaml-D6wPQ4kw.js.gz} +0 -0
- /package/dist/web/assets/{odin-BUQfWY13.js → odin-C9mw2xRN.js} +0 -0
- /package/dist/web/assets/{odin-BUQfWY13.js.br → odin-C9mw2xRN.js.br} +0 -0
- /package/dist/web/assets/{odin-BUQfWY13.js.gz → odin-C9mw2xRN.js.gz} +0 -0
- /package/dist/web/assets/{one-dark-pro-DJQor_US.js → one-dark-pro-SMBlneFb.js} +0 -0
- /package/dist/web/assets/{one-dark-pro-DJQor_US.js.br → one-dark-pro-SMBlneFb.js.br} +0 -0
- /package/dist/web/assets/{one-dark-pro-DJQor_US.js.gz → one-dark-pro-SMBlneFb.js.gz} +0 -0
- /package/dist/web/assets/{one-light-BMvQ1R6M.js → one-light-C9JMU1Cx.js} +0 -0
- /package/dist/web/assets/{one-light-BMvQ1R6M.js.br → one-light-C9JMU1Cx.js.br} +0 -0
- /package/dist/web/assets/{one-light-BMvQ1R6M.js.gz → one-light-C9JMU1Cx.js.gz} +0 -0
- /package/dist/web/assets/{openscad-DTylcqP8.js → openscad-C0I9CtuA.js} +0 -0
- /package/dist/web/assets/{openscad-DTylcqP8.js.br → openscad-C0I9CtuA.js.br} +0 -0
- /package/dist/web/assets/{openscad-DTylcqP8.js.gz → openscad-C0I9CtuA.js.gz} +0 -0
- /package/dist/web/assets/{pascal-D0N_7LGg.js → pascal-D0z4DJnY.js} +0 -0
- /package/dist/web/assets/{pascal-D0N_7LGg.js.br → pascal-D0z4DJnY.js.br} +0 -0
- /package/dist/web/assets/{pascal-D0N_7LGg.js.gz → pascal-D0z4DJnY.js.gz} +0 -0
- /package/dist/web/assets/{path-LyOWnqX5.js → path-z62pEMqs.js} +0 -0
- /package/dist/web/assets/{path-LyOWnqX5.js.br → path-z62pEMqs.js.br} +0 -0
- /package/dist/web/assets/{path-LyOWnqX5.js.gz → path-z62pEMqs.js.gz} +0 -0
- /package/dist/web/assets/{pkl-HQNdCmJT.js → pkl-CITYNGVz.js} +0 -0
- /package/dist/web/assets/{pkl-HQNdCmJT.js.br → pkl-CITYNGVz.js.br} +0 -0
- /package/dist/web/assets/{pkl-HQNdCmJT.js.gz → pkl-CITYNGVz.js.gz} +0 -0
- /package/dist/web/assets/{plastic-QMrjD10f.js → plastic-Bf0T6rmg.js} +0 -0
- /package/dist/web/assets/{plastic-QMrjD10f.js.br → plastic-Bf0T6rmg.js.br} +0 -0
- /package/dist/web/assets/{plastic-QMrjD10f.js.gz → plastic-Bf0T6rmg.js.gz} +0 -0
- /package/dist/web/assets/{plsql-Ds9EzM4F.js → plsql-Chr907pu.js} +0 -0
- /package/dist/web/assets/{plsql-Ds9EzM4F.js.br → plsql-Chr907pu.js.br} +0 -0
- /package/dist/web/assets/{plsql-Ds9EzM4F.js.gz → plsql-Chr907pu.js.gz} +0 -0
- /package/dist/web/assets/{po-CM8JtETE.js → po-07U75CYV.js} +0 -0
- /package/dist/web/assets/{po-CM8JtETE.js.br → po-07U75CYV.js.br} +0 -0
- /package/dist/web/assets/{po-CM8JtETE.js.gz → po-07U75CYV.js.gz} +0 -0
- /package/dist/web/assets/{poimandres-fat7kglW.js → poimandres-B0T4qwXY.js} +0 -0
- /package/dist/web/assets/{poimandres-fat7kglW.js.br → poimandres-B0T4qwXY.js.br} +0 -0
- /package/dist/web/assets/{poimandres-fat7kglW.js.gz → poimandres-B0T4qwXY.js.gz} +0 -0
- /package/dist/web/assets/{polar-CnOzO2UD.js → polar-BvNJMMV5.js} +0 -0
- /package/dist/web/assets/{polar-CnOzO2UD.js.br → polar-BvNJMMV5.js.br} +0 -0
- /package/dist/web/assets/{polar-CnOzO2UD.js.gz → polar-BvNJMMV5.js.gz} +0 -0
- /package/dist/web/assets/{portal-container-context-NFSuymMu.js → portal-container-context-BXAsDqrB.js} +0 -0
- /package/dist/web/assets/{postcss-BaqfiaQC.js → postcss-BSdf-zzo.js} +0 -0
- /package/dist/web/assets/{postcss-BaqfiaQC.js.br → postcss-BSdf-zzo.js.br} +0 -0
- /package/dist/web/assets/{postcss-BaqfiaQC.js.gz → postcss-BSdf-zzo.js.gz} +0 -0
- /package/dist/web/assets/{powerquery-CtMX6ik_.js → powerquery-B2Ad_HK8.js} +0 -0
- /package/dist/web/assets/{powerquery-CtMX6ik_.js.br → powerquery-B2Ad_HK8.js.br} +0 -0
- /package/dist/web/assets/{powerquery-CtMX6ik_.js.gz → powerquery-B2Ad_HK8.js.gz} +0 -0
- /package/dist/web/assets/{powershell-BaTgHUxS.js → powershell-DO5WY2v2.js} +0 -0
- /package/dist/web/assets/{powershell-BaTgHUxS.js.br → powershell-DO5WY2v2.js.br} +0 -0
- /package/dist/web/assets/{powershell-BaTgHUxS.js.gz → powershell-DO5WY2v2.js.gz} +0 -0
- /package/dist/web/assets/{preload-helper-BEFjQwLd.js → preload-helper-CM8YhcCa.js} +0 -0
- /package/dist/web/assets/{preload-helper-BEFjQwLd.js.br → preload-helper-CM8YhcCa.js.br} +0 -0
- /package/dist/web/assets/{preload-helper-BEFjQwLd.js.gz → preload-helper-CM8YhcCa.js.gz} +0 -0
- /package/dist/web/assets/{prisma-BLaoUK-7.js → prisma-BfaRPYzs.js} +0 -0
- /package/dist/web/assets/{prisma-BLaoUK-7.js.br → prisma-BfaRPYzs.js.br} +0 -0
- /package/dist/web/assets/{prisma-BLaoUK-7.js.gz → prisma-BfaRPYzs.js.gz} +0 -0
- /package/dist/web/assets/{prolog-0I-GhZLt.js → prolog-Cz0Nue9e.js} +0 -0
- /package/dist/web/assets/{prolog-0I-GhZLt.js.br → prolog-Cz0Nue9e.js.br} +0 -0
- /package/dist/web/assets/{prolog-0I-GhZLt.js.gz → prolog-Cz0Nue9e.js.gz} +0 -0
- /package/dist/web/assets/{proto-CHfg51WI.js → proto-FVleUZJO.js} +0 -0
- /package/dist/web/assets/{proto-CHfg51WI.js.br → proto-FVleUZJO.js.br} +0 -0
- /package/dist/web/assets/{proto-CHfg51WI.js.gz → proto-FVleUZJO.js.gz} +0 -0
- /package/dist/web/assets/{puppet-B0WZdEhx.js → puppet-BEX5o7hE.js} +0 -0
- /package/dist/web/assets/{puppet-B0WZdEhx.js.br → puppet-BEX5o7hE.js.br} +0 -0
- /package/dist/web/assets/{puppet-B0WZdEhx.js.gz → puppet-BEX5o7hE.js.gz} +0 -0
- /package/dist/web/assets/{purescript-CrVZ4Uql.js → purescript-BZX6Kw4j.js} +0 -0
- /package/dist/web/assets/{purescript-CrVZ4Uql.js.br → purescript-BZX6Kw4j.js.br} +0 -0
- /package/dist/web/assets/{purescript-CrVZ4Uql.js.gz → purescript-BZX6Kw4j.js.gz} +0 -0
- /package/dist/web/assets/{python-aEpe7ZUF.js → python-CO89UIxE.js} +0 -0
- /package/dist/web/assets/{python-aEpe7ZUF.js.br → python-CO89UIxE.js.br} +0 -0
- /package/dist/web/assets/{python-aEpe7ZUF.js.gz → python-CO89UIxE.js.gz} +0 -0
- /package/dist/web/assets/{qmldir-DxTPc3lc.js → qmldir-DH526DWB.js} +0 -0
- /package/dist/web/assets/{qss-D-nPbCGx.js → qss-wp8im4Iz.js} +0 -0
- /package/dist/web/assets/{qss-D-nPbCGx.js.br → qss-wp8im4Iz.js.br} +0 -0
- /package/dist/web/assets/{qss-D-nPbCGx.js.gz → qss-wp8im4Iz.js.gz} +0 -0
- /package/dist/web/assets/{r-BLnTqw3q.js → r-Ct7VghHm.js} +0 -0
- /package/dist/web/assets/{r-BLnTqw3q.js.br → r-Ct7VghHm.js.br} +0 -0
- /package/dist/web/assets/{r-BLnTqw3q.js.gz → r-Ct7VghHm.js.gz} +0 -0
- /package/dist/web/assets/{racket-DNO4210g.js → racket-BQvbOE5D.js} +0 -0
- /package/dist/web/assets/{racket-DNO4210g.js.br → racket-BQvbOE5D.js.br} +0 -0
- /package/dist/web/assets/{racket-DNO4210g.js.gz → racket-BQvbOE5D.js.gz} +0 -0
- /package/dist/web/assets/{raku-iZJO4hxf.js → raku-B0iWSynj.js} +0 -0
- /package/dist/web/assets/{raku-iZJO4hxf.js.br → raku-B0iWSynj.js.br} +0 -0
- /package/dist/web/assets/{raku-iZJO4hxf.js.gz → raku-B0iWSynj.js.gz} +0 -0
- /package/dist/web/assets/{react-CzUPVyyG.js → react-PkBxFcos.js} +0 -0
- /package/dist/web/assets/{red-F3EQNsNx.js → red-Cm00r9eI.js} +0 -0
- /package/dist/web/assets/{red-F3EQNsNx.js.br → red-Cm00r9eI.js.br} +0 -0
- /package/dist/web/assets/{red-F3EQNsNx.js.gz → red-Cm00r9eI.js.gz} +0 -0
- /package/dist/web/assets/{reg-DD_Uwu3t.js → reg-CBuhna22.js} +0 -0
- /package/dist/web/assets/{reg-DD_Uwu3t.js.br → reg-CBuhna22.js.br} +0 -0
- /package/dist/web/assets/{reg-DD_Uwu3t.js.gz → reg-CBuhna22.js.gz} +0 -0
- /package/dist/web/assets/{regexp-D3RlqUxN.js → regexp-BebzP4Rp.js} +0 -0
- /package/dist/web/assets/{regexp-D3RlqUxN.js.br → regexp-BebzP4Rp.js.br} +0 -0
- /package/dist/web/assets/{regexp-D3RlqUxN.js.gz → regexp-BebzP4Rp.js.gz} +0 -0
- /package/dist/web/assets/{rel-DM5GSHUR.js → rel-BYzlBhbq.js} +0 -0
- /package/dist/web/assets/{rel-DM5GSHUR.js.br → rel-BYzlBhbq.js.br} +0 -0
- /package/dist/web/assets/{rel-DM5GSHUR.js.gz → rel-BYzlBhbq.js.gz} +0 -0
- /package/dist/web/assets/{resolve-theme-STMsK2vc.js → resolve-theme-BqoL27BW.js} +0 -0
- /package/dist/web/assets/{resolve-theme-STMsK2vc.js.br → resolve-theme-BqoL27BW.js.br} +0 -0
- /package/dist/web/assets/{resolve-theme-STMsK2vc.js.gz → resolve-theme-BqoL27BW.js.gz} +0 -0
- /package/dist/web/assets/{riscv-C_jO4gJw.js → riscv-CQQP0Ro9.js} +0 -0
- /package/dist/web/assets/{riscv-C_jO4gJw.js.br → riscv-CQQP0Ro9.js.br} +0 -0
- /package/dist/web/assets/{riscv-C_jO4gJw.js.gz → riscv-CQQP0Ro9.js.gz} +0 -0
- /package/dist/web/assets/{ron--r6_MG5U.js → ron-j1ON9YzM.js} +0 -0
- /package/dist/web/assets/{ron--r6_MG5U.js.br → ron-j1ON9YzM.js.br} +0 -0
- /package/dist/web/assets/{ron--r6_MG5U.js.gz → ron-j1ON9YzM.js.gz} +0 -0
- /package/dist/web/assets/{rose-pine-NjvlliYf.js → rose-pine-Cbri3jon.js} +0 -0
- /package/dist/web/assets/{rose-pine-NjvlliYf.js.br → rose-pine-Cbri3jon.js.br} +0 -0
- /package/dist/web/assets/{rose-pine-NjvlliYf.js.gz → rose-pine-Cbri3jon.js.gz} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-DnsL01oA.js → rose-pine-dawn-BMuvKrGo.js} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-DnsL01oA.js.br → rose-pine-dawn-BMuvKrGo.js.br} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-DnsL01oA.js.gz → rose-pine-dawn-BMuvKrGo.js.gz} +0 -0
- /package/dist/web/assets/{rose-pine-moon-DQTuCjVy.js → rose-pine-moon-4biZzaYD.js} +0 -0
- /package/dist/web/assets/{rose-pine-moon-DQTuCjVy.js.br → rose-pine-moon-4biZzaYD.js.br} +0 -0
- /package/dist/web/assets/{rose-pine-moon-DQTuCjVy.js.gz → rose-pine-moon-4biZzaYD.js.gz} +0 -0
- /package/dist/web/assets/{rosmsg-BQrgxzms.js → rosmsg-CXx22rtz.js} +0 -0
- /package/dist/web/assets/{rosmsg-BQrgxzms.js.br → rosmsg-CXx22rtz.js.br} +0 -0
- /package/dist/web/assets/{rosmsg-BQrgxzms.js.gz → rosmsg-CXx22rtz.js.gz} +0 -0
- /package/dist/web/assets/{rough.esm-CSLcW3u5.js → rough.esm-DK8Fp44C.js} +0 -0
- /package/dist/web/assets/{rough.esm-CSLcW3u5.js.br → rough.esm-DK8Fp44C.js.br} +0 -0
- /package/dist/web/assets/{rough.esm-CSLcW3u5.js.gz → rough.esm-DK8Fp44C.js.gz} +0 -0
- /package/dist/web/assets/{rust-CP39BBh-.js → rust-D28cFIhL.js} +0 -0
- /package/dist/web/assets/{rust-CP39BBh-.js.br → rust-D28cFIhL.js.br} +0 -0
- /package/dist/web/assets/{rust-CP39BBh-.js.gz → rust-D28cFIhL.js.gz} +0 -0
- /package/dist/web/assets/{sass-CMiN16ff.js → sass-DtNw4V28.js} +0 -0
- /package/dist/web/assets/{sass-CMiN16ff.js.br → sass-DtNw4V28.js.br} +0 -0
- /package/dist/web/assets/{sass-CMiN16ff.js.gz → sass-DtNw4V28.js.gz} +0 -0
- /package/dist/web/assets/{scala-jm4Hro87.js → scala-hv69_YQC.js} +0 -0
- /package/dist/web/assets/{scala-jm4Hro87.js.br → scala-hv69_YQC.js.br} +0 -0
- /package/dist/web/assets/{scala-jm4Hro87.js.gz → scala-hv69_YQC.js.gz} +0 -0
- /package/dist/web/assets/{scheme-Ct_BnC2r.js → scheme-Dtp9B_ng.js} +0 -0
- /package/dist/web/assets/{scheme-Ct_BnC2r.js.br → scheme-Dtp9B_ng.js.br} +0 -0
- /package/dist/web/assets/{scheme-Ct_BnC2r.js.gz → scheme-Dtp9B_ng.js.gz} +0 -0
- /package/dist/web/assets/{sdbl-CnOjqCoH.js → sdbl-DEwEngAE.js} +0 -0
- /package/dist/web/assets/{sdbl-CnOjqCoH.js.br → sdbl-DEwEngAE.js.br} +0 -0
- /package/dist/web/assets/{sdbl-CnOjqCoH.js.gz → sdbl-DEwEngAE.js.gz} +0 -0
- /package/dist/web/assets/{shellscript-C6sdrDvR.js → shellscript-CYnZDrks.js} +0 -0
- /package/dist/web/assets/{shellscript-C6sdrDvR.js.br → shellscript-CYnZDrks.js.br} +0 -0
- /package/dist/web/assets/{shellscript-C6sdrDvR.js.gz → shellscript-CYnZDrks.js.gz} +0 -0
- /package/dist/web/assets/{slack-dark-BOdgeH19.js → slack-dark-DT0E0ABt.js} +0 -0
- /package/dist/web/assets/{slack-dark-BOdgeH19.js.br → slack-dark-DT0E0ABt.js.br} +0 -0
- /package/dist/web/assets/{slack-dark-BOdgeH19.js.gz → slack-dark-DT0E0ABt.js.gz} +0 -0
- /package/dist/web/assets/{slack-ochin-DBMQIw0j.js → slack-ochin-DHHiQnxo.js} +0 -0
- /package/dist/web/assets/{slack-ochin-DBMQIw0j.js.br → slack-ochin-DHHiQnxo.js.br} +0 -0
- /package/dist/web/assets/{slack-ochin-DBMQIw0j.js.gz → slack-ochin-DHHiQnxo.js.gz} +0 -0
- /package/dist/web/assets/{smalltalk-BMQqYubg.js → smalltalk-BF_I35xJ.js} +0 -0
- /package/dist/web/assets/{smalltalk-BMQqYubg.js.br → smalltalk-BF_I35xJ.js.br} +0 -0
- /package/dist/web/assets/{smalltalk-BMQqYubg.js.gz → smalltalk-BF_I35xJ.js.gz} +0 -0
- /package/dist/web/assets/{snazzy-light-DwnLbrVG.js → snazzy-light-Cv7tIZo9.js} +0 -0
- /package/dist/web/assets/{snazzy-light-DwnLbrVG.js.br → snazzy-light-Cv7tIZo9.js.br} +0 -0
- /package/dist/web/assets/{snazzy-light-DwnLbrVG.js.gz → snazzy-light-Cv7tIZo9.js.gz} +0 -0
- /package/dist/web/assets/{solarized-dark-DXJnupYd.js → solarized-dark-wZ5YPCys.js} +0 -0
- /package/dist/web/assets/{solarized-dark-DXJnupYd.js.br → solarized-dark-wZ5YPCys.js.br} +0 -0
- /package/dist/web/assets/{solarized-dark-DXJnupYd.js.gz → solarized-dark-wZ5YPCys.js.gz} +0 -0
- /package/dist/web/assets/{solarized-light-DqhyrtI4.js → solarized-light-DGDOr1AS.js} +0 -0
- /package/dist/web/assets/{solarized-light-DqhyrtI4.js.br → solarized-light-DGDOr1AS.js.br} +0 -0
- /package/dist/web/assets/{solarized-light-DqhyrtI4.js.gz → solarized-light-DGDOr1AS.js.gz} +0 -0
- /package/dist/web/assets/{solidity-BM0p0sku.js → solidity-BJknuPqJ.js} +0 -0
- /package/dist/web/assets/{solidity-BM0p0sku.js.br → solidity-BJknuPqJ.js.br} +0 -0
- /package/dist/web/assets/{solidity-BM0p0sku.js.gz → solidity-BJknuPqJ.js.gz} +0 -0
- /package/dist/web/assets/{splunk-Cq6_jbaY.js → splunk-B1ClO_KU.js} +0 -0
- /package/dist/web/assets/{splunk-Cq6_jbaY.js.br → splunk-B1ClO_KU.js.br} +0 -0
- /package/dist/web/assets/{splunk-Cq6_jbaY.js.gz → splunk-B1ClO_KU.js.gz} +0 -0
- /package/dist/web/assets/{sql-CPfIb_cO.js → sql-CEkBuGIw.js} +0 -0
- /package/dist/web/assets/{sql-CPfIb_cO.js.br → sql-CEkBuGIw.js.br} +0 -0
- /package/dist/web/assets/{sql-CPfIb_cO.js.gz → sql-CEkBuGIw.js.gz} +0 -0
- /package/dist/web/assets/{src-C7A68uNq.js → src-C1GX5Kxw.js} +0 -0
- /package/dist/web/assets/{src-C7A68uNq.js.br → src-C1GX5Kxw.js.br} +0 -0
- /package/dist/web/assets/{src-C7A68uNq.js.gz → src-C1GX5Kxw.js.gz} +0 -0
- /package/dist/web/assets/{ssh-config-GRgzMVtG.js → ssh-config-kgM67Sf6.js} +0 -0
- /package/dist/web/assets/{ssh-config-GRgzMVtG.js.br → ssh-config-kgM67Sf6.js.br} +0 -0
- /package/dist/web/assets/{ssh-config-GRgzMVtG.js.gz → ssh-config-kgM67Sf6.js.gz} +0 -0
- /package/dist/web/assets/{stylus-DNs7ubf9.js → stylus-RcVaInR-.js} +0 -0
- /package/dist/web/assets/{stylus-DNs7ubf9.js.br → stylus-RcVaInR-.js.br} +0 -0
- /package/dist/web/assets/{stylus-DNs7ubf9.js.gz → stylus-RcVaInR-.js.gz} +0 -0
- /package/dist/web/assets/{swift-BQV34vng.js → swift-Cm0fh2lX.js} +0 -0
- /package/dist/web/assets/{swift-BQV34vng.js.br → swift-Cm0fh2lX.js.br} +0 -0
- /package/dist/web/assets/{swift-BQV34vng.js.gz → swift-Cm0fh2lX.js.gz} +0 -0
- /package/dist/web/assets/{synthwave-84-CypcdXbA.js → synthwave-84-CwLiazxr.js} +0 -0
- /package/dist/web/assets/{synthwave-84-CypcdXbA.js.br → synthwave-84-CwLiazxr.js.br} +0 -0
- /package/dist/web/assets/{synthwave-84-CypcdXbA.js.gz → synthwave-84-CwLiazxr.js.gz} +0 -0
- /package/dist/web/assets/{system-verilog-DaLPjQ4v.js → system-verilog-CzYaDVLH.js} +0 -0
- /package/dist/web/assets/{system-verilog-DaLPjQ4v.js.br → system-verilog-CzYaDVLH.js.br} +0 -0
- /package/dist/web/assets/{system-verilog-DaLPjQ4v.js.gz → system-verilog-CzYaDVLH.js.gz} +0 -0
- /package/dist/web/assets/{systemd-CXHFtmNc.js → systemd-DbSagfLw.js} +0 -0
- /package/dist/web/assets/{systemd-CXHFtmNc.js.br → systemd-DbSagfLw.js.br} +0 -0
- /package/dist/web/assets/{systemd-CXHFtmNc.js.gz → systemd-DbSagfLw.js.gz} +0 -0
- /package/dist/web/assets/{talonscript-DI9nO5jX.js → talonscript-BCFnWejL.js} +0 -0
- /package/dist/web/assets/{talonscript-DI9nO5jX.js.br → talonscript-BCFnWejL.js.br} +0 -0
- /package/dist/web/assets/{talonscript-DI9nO5jX.js.gz → talonscript-BCFnWejL.js.gz} +0 -0
- /package/dist/web/assets/{tasl-BAQyAl0c.js → tasl-BUdqtEe1.js} +0 -0
- /package/dist/web/assets/{tasl-BAQyAl0c.js.br → tasl-BUdqtEe1.js.br} +0 -0
- /package/dist/web/assets/{tasl-BAQyAl0c.js.gz → tasl-BUdqtEe1.js.gz} +0 -0
- /package/dist/web/assets/{tcl-BP_ozI58.js → tcl-CR_lTV9N.js} +0 -0
- /package/dist/web/assets/{tcl-BP_ozI58.js.br → tcl-CR_lTV9N.js.br} +0 -0
- /package/dist/web/assets/{tcl-BP_ozI58.js.gz → tcl-CR_lTV9N.js.gz} +0 -0
- /package/dist/web/assets/{terraform-NrndR0yZ.js → terraform-Bqsha-xe.js} +0 -0
- /package/dist/web/assets/{terraform-NrndR0yZ.js.br → terraform-Bqsha-xe.js.br} +0 -0
- /package/dist/web/assets/{terraform-NrndR0yZ.js.gz → terraform-Bqsha-xe.js.gz} +0 -0
- /package/dist/web/assets/{tokyo-night-CbUQlN8D.js → tokyo-night-Cnuo6JB6.js} +0 -0
- /package/dist/web/assets/{tokyo-night-CbUQlN8D.js.br → tokyo-night-Cnuo6JB6.js.br} +0 -0
- /package/dist/web/assets/{tokyo-night-CbUQlN8D.js.gz → tokyo-night-Cnuo6JB6.js.gz} +0 -0
- /package/dist/web/assets/{toml-BM_zrMLj.js → toml-CLFdhT22.js} +0 -0
- /package/dist/web/assets/{toml-BM_zrMLj.js.br → toml-CLFdhT22.js.br} +0 -0
- /package/dist/web/assets/{toml-BM_zrMLj.js.gz → toml-CLFdhT22.js.gz} +0 -0
- /package/dist/web/assets/{tsv-CfyllNPO.js → tsv-Dw3tLrZN.js} +0 -0
- /package/dist/web/assets/{tsx-BROcpVjE.js → tsx-BuCbOiJi.js} +0 -0
- /package/dist/web/assets/{tsx-BROcpVjE.js.br → tsx-BuCbOiJi.js.br} +0 -0
- /package/dist/web/assets/{tsx-BROcpVjE.js.gz → tsx-BuCbOiJi.js.gz} +0 -0
- /package/dist/web/assets/{turtle-CHmyeS9k.js → turtle-BMKMfTrj.js} +0 -0
- /package/dist/web/assets/{turtle-CHmyeS9k.js.br → turtle-BMKMfTrj.js.br} +0 -0
- /package/dist/web/assets/{turtle-CHmyeS9k.js.gz → turtle-BMKMfTrj.js.gz} +0 -0
- /package/dist/web/assets/{typescript-BVwspRg8.js → typescript-Y6cbFqno.js} +0 -0
- /package/dist/web/assets/{typescript-BVwspRg8.js.br → typescript-Y6cbFqno.js.br} +0 -0
- /package/dist/web/assets/{typescript-BVwspRg8.js.gz → typescript-Y6cbFqno.js.gz} +0 -0
- /package/dist/web/assets/{typespec-DXRppCgc.js → typespec-EbgGJHV_.js} +0 -0
- /package/dist/web/assets/{typespec-DXRppCgc.js.br → typespec-EbgGJHV_.js.br} +0 -0
- /package/dist/web/assets/{typespec-DXRppCgc.js.gz → typespec-EbgGJHV_.js.gz} +0 -0
- /package/dist/web/assets/{typst-L5uwArOj.js → typst-CQXV2SzX.js} +0 -0
- /package/dist/web/assets/{typst-L5uwArOj.js.br → typst-CQXV2SzX.js.br} +0 -0
- /package/dist/web/assets/{typst-L5uwArOj.js.gz → typst-CQXV2SzX.js.gz} +0 -0
- /package/dist/web/assets/{use-h264-canvas-decoder-BfO9QrlH.js → use-h264-canvas-decoder-DAjp9oHe.js} +0 -0
- /package/dist/web/assets/{use-h264-canvas-decoder-BfO9QrlH.js.br → use-h264-canvas-decoder-DAjp9oHe.js.br} +0 -0
- /package/dist/web/assets/{use-h264-canvas-decoder-BfO9QrlH.js.gz → use-h264-canvas-decoder-DAjp9oHe.js.gz} +0 -0
- /package/dist/web/assets/{use-is-mobile-BClDZJP5.js → use-is-mobile-BXHbkfs9.js} +0 -0
- /package/dist/web/assets/{use-visual-viewport-BGpcMnIx.js → use-visual-viewport-CQ6-A0Dt.js} +0 -0
- /package/dist/web/assets/{utils-btZ8C8-R.js → utils-Bslrbb-G.js} +0 -0
- /package/dist/web/assets/{utils-btZ8C8-R.js.br → utils-Bslrbb-G.js.br} +0 -0
- /package/dist/web/assets/{utils-btZ8C8-R.js.gz → utils-Bslrbb-G.js.gz} +0 -0
- /package/dist/web/assets/{v-Bz99d5uk.js → v-Ci1jObJJ.js} +0 -0
- /package/dist/web/assets/{v-Bz99d5uk.js.br → v-Ci1jObJJ.js.br} +0 -0
- /package/dist/web/assets/{v-Bz99d5uk.js.gz → v-Ci1jObJJ.js.gz} +0 -0
- /package/dist/web/assets/{vala-B-CtBLX1.js → vala-C_NdfqrY.js} +0 -0
- /package/dist/web/assets/{vala-B-CtBLX1.js.br → vala-C_NdfqrY.js.br} +0 -0
- /package/dist/web/assets/{vala-B-CtBLX1.js.gz → vala-C_NdfqrY.js.gz} +0 -0
- /package/dist/web/assets/{vb-DHqiz9Cp.js → vb-K_r_h_s8.js} +0 -0
- /package/dist/web/assets/{vb-DHqiz9Cp.js.br → vb-K_r_h_s8.js.br} +0 -0
- /package/dist/web/assets/{vb-DHqiz9Cp.js.gz → vb-K_r_h_s8.js.gz} +0 -0
- /package/dist/web/assets/{vendor-xterm-CfasyE0m.js → vendor-xterm-sFX94k3w.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-CfasyE0m.js.br → vendor-xterm-sFX94k3w.js.br} +0 -0
- /package/dist/web/assets/{vendor-xterm-CfasyE0m.js.gz → vendor-xterm-sFX94k3w.js.gz} +0 -0
- /package/dist/web/assets/{verilog-DbTkSkM7.js → verilog-DQPYLsZI.js} +0 -0
- /package/dist/web/assets/{verilog-DbTkSkM7.js.br → verilog-DQPYLsZI.js.br} +0 -0
- /package/dist/web/assets/{verilog-DbTkSkM7.js.gz → verilog-DQPYLsZI.js.gz} +0 -0
- /package/dist/web/assets/{vesper-2aVei4Le.js → vesper-BrmzEV8s.js} +0 -0
- /package/dist/web/assets/{vesper-2aVei4Le.js.br → vesper-BrmzEV8s.js.br} +0 -0
- /package/dist/web/assets/{vesper-2aVei4Le.js.gz → vesper-BrmzEV8s.js.gz} +0 -0
- /package/dist/web/assets/{vhdl-BJJSCnQQ.js → vhdl-CjxQGaH2.js} +0 -0
- /package/dist/web/assets/{vhdl-BJJSCnQQ.js.br → vhdl-CjxQGaH2.js.br} +0 -0
- /package/dist/web/assets/{vhdl-BJJSCnQQ.js.gz → vhdl-CjxQGaH2.js.gz} +0 -0
- /package/dist/web/assets/{viml-qxSvRN8n.js → viml-CTKJNQH1.js} +0 -0
- /package/dist/web/assets/{viml-qxSvRN8n.js.br → viml-CTKJNQH1.js.br} +0 -0
- /package/dist/web/assets/{viml-qxSvRN8n.js.gz → viml-CTKJNQH1.js.gz} +0 -0
- /package/dist/web/assets/{vitesse-black-CjR1y0Bv.js → vitesse-black-i-H_3p1i.js} +0 -0
- /package/dist/web/assets/{vitesse-black-CjR1y0Bv.js.br → vitesse-black-i-H_3p1i.js.br} +0 -0
- /package/dist/web/assets/{vitesse-black-CjR1y0Bv.js.gz → vitesse-black-i-H_3p1i.js.gz} +0 -0
- /package/dist/web/assets/{vitesse-dark-jrcdsqkn.js → vitesse-dark-DZC_Yy3_.js} +0 -0
- /package/dist/web/assets/{vitesse-dark-jrcdsqkn.js.br → vitesse-dark-DZC_Yy3_.js.br} +0 -0
- /package/dist/web/assets/{vitesse-dark-jrcdsqkn.js.gz → vitesse-dark-DZC_Yy3_.js.gz} +0 -0
- /package/dist/web/assets/{vitesse-light-DkC_qU0k.js → vitesse-light-rf4kpmk8.js} +0 -0
- /package/dist/web/assets/{vitesse-light-DkC_qU0k.js.br → vitesse-light-rf4kpmk8.js.br} +0 -0
- /package/dist/web/assets/{vitesse-light-DkC_qU0k.js.gz → vitesse-light-rf4kpmk8.js.gz} +0 -0
- /package/dist/web/assets/{vyper-WAhkfwIX.js → vyper-BLnOw4Nf.js} +0 -0
- /package/dist/web/assets/{vyper-WAhkfwIX.js.br → vyper-BLnOw4Nf.js.br} +0 -0
- /package/dist/web/assets/{vyper-WAhkfwIX.js.gz → vyper-BLnOw4Nf.js.gz} +0 -0
- /package/dist/web/assets/{wasm-BYGI5YYa.js → wasm-CTwH9oN2.js} +0 -0
- /package/dist/web/assets/{wasm-BYGI5YYa.js.br → wasm-CTwH9oN2.js.br} +0 -0
- /package/dist/web/assets/{wasm-BYGI5YYa.js.gz → wasm-CTwH9oN2.js.gz} +0 -0
- /package/dist/web/assets/{wasm-Miuao4O0.js → wasm-CWeHvGNG.js} +0 -0
- /package/dist/web/assets/{wasm-Miuao4O0.js.br → wasm-CWeHvGNG.js.br} +0 -0
- /package/dist/web/assets/{wasm-Miuao4O0.js.gz → wasm-CWeHvGNG.js.gz} +0 -0
- /package/dist/web/assets/{wenyan-Dd5qjF8u.js → wenyan-CLwdRuzd.js} +0 -0
- /package/dist/web/assets/{wenyan-Dd5qjF8u.js.br → wenyan-CLwdRuzd.js.br} +0 -0
- /package/dist/web/assets/{wenyan-Dd5qjF8u.js.gz → wenyan-CLwdRuzd.js.gz} +0 -0
- /package/dist/web/assets/{wgsl-C3T5a0UO.js → wgsl-CBTDMVJR.js} +0 -0
- /package/dist/web/assets/{wgsl-C3T5a0UO.js.br → wgsl-CBTDMVJR.js.br} +0 -0
- /package/dist/web/assets/{wgsl-C3T5a0UO.js.gz → wgsl-CBTDMVJR.js.gz} +0 -0
- /package/dist/web/assets/{wikitext-CvCJjxSa.js → wikitext-CQHrF84e.js} +0 -0
- /package/dist/web/assets/{wikitext-CvCJjxSa.js.br → wikitext-CQHrF84e.js.br} +0 -0
- /package/dist/web/assets/{wikitext-CvCJjxSa.js.gz → wikitext-CQHrF84e.js.gz} +0 -0
- /package/dist/web/assets/{wit-DybvG9BU.js → wit-8xdbdipU.js} +0 -0
- /package/dist/web/assets/{wit-DybvG9BU.js.br → wit-8xdbdipU.js.br} +0 -0
- /package/dist/web/assets/{wit-DybvG9BU.js.gz → wit-8xdbdipU.js.gz} +0 -0
- /package/dist/web/assets/{wolfram-CdhnrpZ7.js → wolfram-tFwx32a_.js} +0 -0
- /package/dist/web/assets/{wolfram-CdhnrpZ7.js.br → wolfram-tFwx32a_.js.br} +0 -0
- /package/dist/web/assets/{wolfram-CdhnrpZ7.js.gz → wolfram-tFwx32a_.js.gz} +0 -0
- /package/dist/web/assets/{yaml-B0HIje0z.js → yaml-D5O1CXgB.js} +0 -0
- /package/dist/web/assets/{yaml-B0HIje0z.js.br → yaml-D5O1CXgB.js.br} +0 -0
- /package/dist/web/assets/{yaml-B0HIje0z.js.gz → yaml-D5O1CXgB.js.gz} +0 -0
- /package/dist/web/assets/{zenscript-CcLSNTvD.js → zenscript-B10Pj7JT.js} +0 -0
- /package/dist/web/assets/{zenscript-CcLSNTvD.js.br → zenscript-B10Pj7JT.js.br} +0 -0
- /package/dist/web/assets/{zenscript-CcLSNTvD.js.gz → zenscript-B10Pj7JT.js.gz} +0 -0
- /package/dist/web/assets/{zig-dAelYAUr.js → zig-BZKcTtrK.js} +0 -0
- /package/dist/web/assets/{zig-dAelYAUr.js.br → zig-BZKcTtrK.js.br} +0 -0
- /package/dist/web/assets/{zig-dAelYAUr.js.gz → zig-BZKcTtrK.js.gz} +0 -0
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* The Git Graph panel: one HTML document with its stylesheet and script
|
|
3
|
+
* inlined, since the webview runs in a sandboxed iframe that can load nothing.
|
|
4
|
+
*
|
|
5
|
+
* The markup here is the frame the script fills in. The script itself is one
|
|
6
|
+
* classic <script> assembled from the parts below, which share one scope —
|
|
7
|
+
* webview-script-core.ts says what that allows and what it rules out.
|
|
4
8
|
*/
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
9
|
+
import { WEBVIEW_ICONS } from "./webview-icons.generated.ts";
|
|
10
|
+
import { actionsScript } from "./webview-script-actions.ts";
|
|
11
|
+
import { coreScript } from "./webview-script-core.ts";
|
|
12
|
+
import { graphScript } from "./webview-script-graph.ts";
|
|
13
|
+
import { inspectorScript } from "./webview-script-inspector.ts";
|
|
14
|
+
import { listScript } from "./webview-script-list.ts";
|
|
15
|
+
import { mainScript } from "./webview-script-main.ts";
|
|
16
|
+
import { settingsScript } from "./webview-script-settings.ts";
|
|
17
|
+
import { graphStyles } from "./webview-styles.ts";
|
|
7
18
|
|
|
8
19
|
/*
|
|
9
20
|
* The narrowest the message column may get, in px. The graph column is capped
|
|
@@ -18,3799 +29,167 @@ const MESSAGE_MIN_W = 240;
|
|
|
18
29
|
/** The narrowest the graph column may get, automatically or by dragging. */
|
|
19
30
|
const GRAPH_MIN_W = 40;
|
|
20
31
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
</
|
|
30
|
-
<
|
|
31
|
-
|
|
32
|
-
<header id="toolbar">
|
|
33
|
-
<div class="toolbar-left">
|
|
34
|
-
<div id="branch-selector" class="branch-dropdown">
|
|
35
|
-
<button id="branch-trigger" class="branch-trigger">All Branches</button>
|
|
36
|
-
<div id="branch-dropdown-menu" class="branch-dropdown-menu hidden">
|
|
37
|
-
<input id="branch-filter" type="text" placeholder="Filter branches..." class="branch-filter-input" />
|
|
38
|
-
<div id="branch-list" class="branch-list"></div>
|
|
39
|
-
</div>
|
|
40
|
-
</div>
|
|
41
|
-
<button id="btn-refresh" title="Refresh"></button>
|
|
42
|
-
<button id="btn-fetch" title="Fetch from remotes"></button>
|
|
32
|
+
function icon(name: string, cls?: string): string {
|
|
33
|
+
const svg = WEBVIEW_ICONS[name];
|
|
34
|
+
if (!svg) throw new Error(`Git Graph markup asks for an icon that is not generated: ${name}`);
|
|
35
|
+
return cls ? svg.replace('class="ic"', `class="ic ${cls}"`) : svg;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function toolbarHtml(): string {
|
|
39
|
+
return `<header id="toolbar">
|
|
40
|
+
<button type="button" id="branch-selector" class="gg-scope" aria-haspopup="menu">${icon("branch", "ic-sm")}<span id="scope-label" class="scope-lbl">All branches</span>${icon("chev-d", "ic-xs")}</button>
|
|
41
|
+
<div id="find-bar">
|
|
42
|
+
<label class="gg-find">${icon("search", "ic-sm")}<input id="find-input" type="text" placeholder="Find commits" aria-label="Find commits" autocomplete="off" spellcheck="false"><span id="find-count" class="count" aria-live="polite"></span><button type="button" id="find-prev" class="step" title="Previous match (Shift+Enter)" aria-label="Previous match">${icon("chev-u", "ic-xs")}</button><button type="button" id="find-next" class="step" title="Next match (Enter)" aria-label="Next match">${icon("chev-d", "ic-xs")}</button><button type="button" id="find-close" class="clear" title="Clear (Esc)" aria-label="Clear search">${icon("x", "ic-xs")}</button><button type="button" id="find-mode" class="mode" aria-haspopup="menu">Loaded</button></label>
|
|
43
43
|
</div>
|
|
44
|
-
<
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
44
|
+
<span class="grow"></span>
|
|
45
|
+
<button type="button" id="btn-stash" class="tool wide opt" aria-haspopup="menu" title="Stashes" aria-label="Stashes">${icon("stash")}<span class="n"></span></button>
|
|
46
|
+
<button type="button" id="btn-worktree" class="tool wide opt" aria-haspopup="menu" title="Worktrees" aria-label="Worktrees">${icon("folder")}<span class="n"></span></button>
|
|
47
|
+
<button type="button" id="btn-submodule" class="tool wide opt hidden" aria-haspopup="menu" title="Submodules" aria-label="Submodules">${icon("cube")}<span class="n"></span></button>
|
|
48
|
+
<span class="sep"></span>
|
|
49
|
+
<span id="sync" class="sync" role="group" aria-label="Sync with the remote">
|
|
50
|
+
<button type="button" id="btn-fetch">${icon("sync", "ic-sm")}<span class="lbl">Fetch</span></button>
|
|
51
|
+
<button type="button" id="btn-pull" disabled>${icon("pull", "ic-sm")}<span class="lbl">Pull</span><span class="num"></span></button>
|
|
52
|
+
<button type="button" id="btn-push" disabled>${icon("push", "ic-sm")}<span class="lbl">Push</span><span class="num hot"></span></button>
|
|
53
|
+
</span>
|
|
54
|
+
<button type="button" id="btn-sync-m" class="sc-sync hidden"></button>
|
|
55
|
+
<span class="sep"></span>
|
|
56
|
+
<button type="button" id="btn-find" class="tool" title="Find (Ctrl+F)" aria-label="Find commits">${icon("search")}</button>
|
|
57
|
+
<button type="button" id="btn-view" class="tool" aria-haspopup="menu" title="View options" aria-label="View options">${icon("options")}</button>
|
|
58
|
+
<button type="button" id="btn-inspector" class="tool" aria-pressed="false" title="Show details" aria-label="Details">${icon("panel-right")}</button>
|
|
59
|
+
</header>`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function listHtml(): string {
|
|
63
|
+
return `<div id="gg-main">
|
|
64
|
+
<div id="graph-area">
|
|
65
|
+
<div id="graph-container" class="scroll-thin">
|
|
66
|
+
<div id="graph-header" class="commit-row header-row" role="row">
|
|
67
|
+
<div class="col-graph">Graph<div class="graph-resize-handle" id="graph-resize-handle"></div></div>
|
|
68
|
+
<div class="col-message">Message</div>
|
|
69
|
+
<div class="col-changes">Changes</div>
|
|
70
|
+
<div class="col-author">Author</div>
|
|
71
|
+
<div class="col-date">Date</div>
|
|
72
|
+
<div class="col-hash">Hash</div>
|
|
66
73
|
</div>
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
<div id="submodule-popover" class="worktree-popover hidden">
|
|
71
|
-
<div class="worktree-popover-header"><span>Submodules</span></div>
|
|
72
|
-
<div id="submodule-list" class="worktree-list"></div>
|
|
73
|
-
<div class="worktree-popover-footer">
|
|
74
|
-
<button id="sm-update-all" class="btn-sm">Update all</button>
|
|
75
|
-
</div>
|
|
74
|
+
<div id="commit-list-wrapper">
|
|
75
|
+
<div id="graph-clip"><div id="graph-svg-container"></div></div>
|
|
76
|
+
<div id="commit-list" role="rowgroup"></div>
|
|
76
77
|
</div>
|
|
78
|
+
<div id="loading" class="loading hidden">Loading…</div>
|
|
77
79
|
</div>
|
|
78
|
-
<
|
|
79
|
-
<
|
|
80
|
-
<
|
|
80
|
+
<div id="graph-pan-bar" class="hidden" aria-hidden="true"><div id="graph-pan-thumb"></div></div>
|
|
81
|
+
<div id="scroll-markers" aria-hidden="true"></div>
|
|
82
|
+
<div id="search-results" class="search-results hidden scroll-thin"></div>
|
|
81
83
|
</div>
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
</select>
|
|
92
|
-
<span id="find-count"></span>
|
|
93
|
-
<button id="find-prev" title="Previous">↑</button>
|
|
94
|
-
<button id="find-next" title="Next">↓</button>
|
|
95
|
-
<button id="find-close" title="Close">×</button>
|
|
96
|
-
</div>
|
|
97
|
-
<div id="search-results" class="search-results hidden"></div>
|
|
98
|
-
<div id="graph-area">
|
|
99
|
-
<div id="graph-container">
|
|
100
|
-
<div id="graph-header" class="commit-row header-row">
|
|
101
|
-
<div class="col-refs">Branch / Tag</div>
|
|
102
|
-
<div class="col-graph">Graph<div class="graph-resize-handle" id="graph-resize-handle"></div></div>
|
|
103
|
-
<div class="col-message">Message</div>
|
|
104
|
-
<div class="col-changes">Changes</div>
|
|
105
|
-
<div class="col-author">Author</div>
|
|
106
|
-
<div class="col-date">Date</div>
|
|
107
|
-
<div class="col-hash">Hash</div>
|
|
108
|
-
</div>
|
|
109
|
-
<div id="commit-list-wrapper">
|
|
110
|
-
<div id="graph-clip"><div id="graph-svg-container"></div></div>
|
|
111
|
-
<div id="commit-list"></div>
|
|
112
|
-
</div>
|
|
113
|
-
<div id="loading" class="loading hidden">Loading...</div>
|
|
114
|
-
</div>
|
|
115
|
-
<div id="graph-pan-bar" class="hidden" aria-hidden="true"><div id="graph-pan-thumb"></div></div>
|
|
116
|
-
<div id="scroll-markers" aria-hidden="true"></div>
|
|
117
|
-
</div>
|
|
118
|
-
<div id="detail-panel" class="detail-panel hidden"></div>
|
|
119
|
-
<div id="settings-panel" class="settings-panel">
|
|
84
|
+
<div id="sheet-scrim" class="hidden"></div>
|
|
85
|
+
<aside id="detail-panel" class="detail-panel scroll-thin" aria-label="Details"></aside>
|
|
86
|
+
</div>`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function settingsHtml(): string {
|
|
90
|
+
const row = (label: string, control: string) => `<div class="setting-row"><label>${label}</label>${control}</div>`;
|
|
91
|
+
const check = (id: string) => `<input type="checkbox" id="${id}">`;
|
|
92
|
+
return `<div id="settings-panel" role="dialog" aria-label="Git Graph settings">
|
|
120
93
|
<div class="settings-header">
|
|
121
|
-
<h3>Git Graph
|
|
122
|
-
<button id="settings-close" title="Close"
|
|
94
|
+
<h3>Git Graph settings</h3>
|
|
95
|
+
<button type="button" id="settings-close" class="tool" title="Close" aria-label="Close settings">${icon("x")}</button>
|
|
123
96
|
</div>
|
|
124
|
-
<div class="settings-body">
|
|
97
|
+
<div class="settings-body scroll-thin">
|
|
125
98
|
<details class="settings-section" open>
|
|
126
99
|
<summary>General</summary>
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
<
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
100
|
+
${row("Commits per page", '<input type="number" id="s-maxCommits" min="10" max="10000" step="50">')}
|
|
101
|
+
${row("Show tags", check("s-showTags"))}
|
|
102
|
+
${row("Show stashes", check("s-showStashes"))}
|
|
103
|
+
${row("Show remote branches", check("s-showRemoteBranches"))}
|
|
104
|
+
${row("First parent only", check("s-firstParentOnly"))}
|
|
105
|
+
${row("Graph style", '<select id="s-graphStyle"><option value="rounded">Rounded</option><option value="angular">Angular</option></select>')}
|
|
106
|
+
${row("Dates", '<select id="s-dateFormat"><option value="relative">Relative</option><option value="absolute">Absolute</option><option value="iso">ISO</option></select>')}
|
|
107
|
+
${row("Order", '<select id="s-commitOrdering"><option value="topo">Topological</option><option value="date">Commit date</option><option value="author-date">Author date</option></select>')}
|
|
108
|
+
${row("Fetch automatically", '<select id="s-autoFetchInterval"><option value="0">Never</option><option value="10">Every 10 seconds</option><option value="30">Every 30 seconds</option><option value="60">Every minute</option><option value="120">Every 2 minutes</option><option value="300">Every 5 minutes</option></select>')}
|
|
136
109
|
</details>
|
|
137
110
|
<details class="settings-section" open>
|
|
138
111
|
<summary>Columns</summary>
|
|
139
|
-
<p
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
<div class="setting-row"><label>Hash</label><input type="checkbox" id="s-colHash"></div>
|
|
112
|
+
<p>The View menu has the same list. A narrow panel drops the last few by itself, whatever is ticked here.</p>
|
|
113
|
+
${row("Changes", check("s-colChanges"))}
|
|
114
|
+
${row("Author", check("s-colAuthor"))}
|
|
115
|
+
${row("Date", check("s-colDate"))}
|
|
116
|
+
${row("Hash", check("s-colHash"))}
|
|
145
117
|
</details>
|
|
146
118
|
<details class="settings-section" open>
|
|
147
|
-
<summary>
|
|
148
|
-
<
|
|
149
|
-
|
|
150
|
-
|
|
119
|
+
<summary>Your name and email</summary>
|
|
120
|
+
<p>What this repository's commits are signed with (git config user.name and user.email).</p>
|
|
121
|
+
${row("Name", '<input type="text" id="s-userName" placeholder="user.name">')}
|
|
122
|
+
${row("Email", '<input type="text" id="s-userEmail" placeholder="user.email">')}
|
|
123
|
+
<div class="setting-row"><span></span><button type="button" id="s-saveUser" class="btn xs outline">Save</button></div>
|
|
151
124
|
</details>
|
|
152
125
|
<details class="settings-section" open>
|
|
153
126
|
<summary>Remotes</summary>
|
|
154
127
|
<div id="s-remotes-list"></div>
|
|
155
128
|
<div class="add-remote-form">
|
|
156
|
-
<input type="text" id="s-newRemoteName" placeholder="Remote name">
|
|
157
|
-
<input type="text" id="s-newRemoteUrl" placeholder="Remote URL">
|
|
158
|
-
<button id="s-addRemote" class="btn-sm"
|
|
129
|
+
<input type="text" id="s-newRemoteName" placeholder="Name" aria-label="Remote name">
|
|
130
|
+
<input type="text" id="s-newRemoteUrl" placeholder="URL" aria-label="Remote URL">
|
|
131
|
+
<button type="button" id="s-addRemote" class="btn xs outline">${icon("plus", "ic-sm")}Add remote</button>
|
|
159
132
|
</div>
|
|
160
133
|
</details>
|
|
161
134
|
<details class="settings-section">
|
|
162
|
-
<summary>Issue
|
|
163
|
-
<p
|
|
135
|
+
<summary>Issue links</summary>
|
|
136
|
+
<p>Turn issue references in commit messages into links.</p>
|
|
164
137
|
<div id="issue-rules-list"></div>
|
|
165
|
-
<button id="add-issue-rule" class="btn
|
|
138
|
+
<button type="button" id="add-issue-rule" class="btn xs outline">${icon("plus", "ic-sm")}Add rule</button>
|
|
166
139
|
</details>
|
|
167
140
|
<details class="settings-section">
|
|
168
|
-
<summary>Pull
|
|
169
|
-
|
|
141
|
+
<summary>Pull requests</summary>
|
|
142
|
+
${row("Provider", '<select id="pr-provider"><option value="">Off</option><option value="github">GitHub</option><option value="gitlab">GitLab</option><option value="bitbucket">Bitbucket</option><option value="custom">Custom</option></select>')}
|
|
170
143
|
<div id="pr-config" class="hidden">
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
<p
|
|
176
|
-
<div class="setting-row"
|
|
144
|
+
${row("Owner", '<input type="text" id="pr-owner" placeholder="owner or organisation">')}
|
|
145
|
+
${row("Repository", '<input type="text" id="pr-repo" placeholder="repository name">')}
|
|
146
|
+
${row("Target branch", '<input type="text" id="pr-target" placeholder="main">')}
|
|
147
|
+
${row("Link", '<input type="text" id="pr-url-template" placeholder="https://…">')}
|
|
148
|
+
<p class="settings-note" id="pr-vars"></p>
|
|
149
|
+
<div class="setting-row"><span></span><button type="button" id="pr-save" class="btn xs outline">Save</button></div>
|
|
177
150
|
</div>
|
|
178
151
|
</details>
|
|
179
152
|
</div>
|
|
180
|
-
</div
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
153
|
+
</div>`;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function getWebviewHtml(): string {
|
|
157
|
+
const script = [
|
|
158
|
+
coreScript(MESSAGE_MIN_W, GRAPH_MIN_W),
|
|
159
|
+
graphScript(),
|
|
160
|
+
listScript(),
|
|
161
|
+
inspectorScript(),
|
|
162
|
+
actionsScript(),
|
|
163
|
+
settingsScript(),
|
|
164
|
+
mainScript(),
|
|
165
|
+
].join("\n");
|
|
166
|
+
return `<!DOCTYPE html>
|
|
167
|
+
<html>
|
|
168
|
+
<head>
|
|
169
|
+
<meta charset="utf-8">
|
|
170
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
171
|
+
<style>
|
|
172
|
+
${graphStyles(MESSAGE_MIN_W)}
|
|
173
|
+
</style>
|
|
174
|
+
</head>
|
|
175
|
+
<body>
|
|
176
|
+
<div id="app">
|
|
177
|
+
${toolbarHtml()}
|
|
178
|
+
<div id="op-banner" class="op-banner hidden" role="status"></div>
|
|
179
|
+
${listHtml()}
|
|
180
|
+
<footer id="status-bar">
|
|
181
|
+
<span id="status-text">Loading repository…</span>
|
|
182
|
+
<span class="grow"></span>
|
|
183
|
+
<button type="button" id="btn-load-more" class="btn xs ghost hidden">Load more</button>
|
|
184
|
+
</footer>
|
|
184
185
|
</div>
|
|
185
|
-
|
|
186
|
+
${settingsHtml()}
|
|
187
|
+
<div id="menu-scrim" class="hidden"></div>
|
|
188
|
+
<div id="context-menu" class="menu hidden" role="menu"></div>
|
|
189
|
+
<div id="toast-host" aria-live="polite"></div>
|
|
186
190
|
<script>
|
|
187
|
-
${
|
|
191
|
+
${script}
|
|
188
192
|
</script>
|
|
189
193
|
</body>
|
|
190
194
|
</html>`;
|
|
191
195
|
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Dark values, emitted twice by design.
|
|
195
|
-
*
|
|
196
|
-
* The panel is a sandboxed iframe and cannot see the app's theme, so on its own
|
|
197
|
-
* the only question it can ask is prefers-color-scheme — the *OS* setting,
|
|
198
|
-
* which is why a light app still showed a dark graph. The host now stamps
|
|
199
|
-
* data-ppm-theme on this document and injects the app's own tokens
|
|
200
|
-
* (src/web/components/extensions/webview-theme.ts); the media query is the
|
|
201
|
-
* fallback for a host that says nothing, and it must not override an explicit
|
|
202
|
-
* light. Values are a charcoal rather than near-black so the toolbar, the list
|
|
203
|
-
* and the banded rows read as three surfaces instead of one slab.
|
|
204
|
-
*/
|
|
205
|
-
const DARK_TOKENS = `
|
|
206
|
-
--bg: #16171c; --surface: #1d1f26; --text: #ecedf0; --subtext: #a2a5b0; --subtle: #6b6f7c;
|
|
207
|
-
--border: #262932; --border2: #383c48; --selected: #1e293b;
|
|
208
|
-
--band: color-mix(in srgb, var(--text) 6%, transparent);
|
|
209
|
-
`;
|
|
210
|
-
|
|
211
|
-
function getStyles(): string {
|
|
212
|
-
return `
|
|
213
|
-
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
214
|
-
:root {
|
|
215
|
-
--bg: #ffffff; --surface: #f4f4f5; --text: #09090b; --subtext: #71717a; --subtle: #a1a1aa;
|
|
216
|
-
--border: #e4e4e7; --border2: #d4d4d8; --blue: #3b82f6; --red: #ef4444; --green: #22c55e;
|
|
217
|
-
--yellow: #eab308; --purple: #8b5cf6; --orange: #f97316;
|
|
218
|
-
--selected: #eff6ff;
|
|
219
|
-
/* Zebra banding. Stronger in dark below, because the same percentage is not
|
|
220
|
-
equally visible in both directions: a wash of near-black over white shows
|
|
221
|
-
up where the same lift of near-white over a near-black row does not, which
|
|
222
|
-
is what left the list looking like one flat slab. */
|
|
223
|
-
--band: color-mix(in srgb, var(--text) 3.5%, transparent);
|
|
224
|
-
/* Derived, never injected: the app has no hover token and some of its themes
|
|
225
|
-
give the same colour to both panel surfaces, which would leave a hovered
|
|
226
|
-
row looking untouched. A tint of the text colour flips with the mode and
|
|
227
|
-
stacks on top of the zebra banding instead of replacing it. */
|
|
228
|
-
--surface-hover: color-mix(in srgb, var(--text) 8%, transparent);
|
|
229
|
-
/* Width of the branch/tag column. Fixed, because the graph is one SVG overlay
|
|
230
|
-
drawn on a single grid and it starts where this column ends. */
|
|
231
|
-
--refs-col-w: 170px;
|
|
232
|
-
|
|
233
|
-
${FONT_TOKENS}
|
|
234
|
-
}
|
|
235
|
-
:root[data-ppm-theme="dark"] { ${DARK_TOKENS} }
|
|
236
|
-
@media (prefers-color-scheme: dark) {
|
|
237
|
-
:root:not([data-ppm-theme="light"]) { ${DARK_TOKENS} }
|
|
238
|
-
}
|
|
239
|
-
body { font-family: var(--ui-font); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; background: var(--bg); color: var(--text); font-size: 12px; overflow: hidden; height: 100vh; display: flex; flex-direction: column; }
|
|
240
|
-
#app { display: flex; flex-direction: column; height: 100vh; }
|
|
241
|
-
|
|
242
|
-
/* Toolbar */
|
|
243
|
-
#toolbar { display: flex; justify-content: space-between; align-items: center; padding: 4px 10px; border-bottom: 1px solid var(--border); background: var(--surface); flex-shrink: 0; }
|
|
244
|
-
.toolbar-left, .toolbar-right { display: flex; align-items: center; gap: 4px; }
|
|
245
|
-
select { background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 3px 6px; font-size: 11px; }
|
|
246
|
-
button { background: transparent; color: var(--text); border: 1px solid var(--border); border-radius: 5px; padding: 3px 8px; font-size: 11px; cursor: pointer; min-width: 24px; min-height: 24px; transition: background 0.15s, border-color 0.15s; }
|
|
247
|
-
button:hover { background: var(--surface-hover); border-color: var(--border2); }
|
|
248
|
-
button:active { background: var(--surface); }
|
|
249
|
-
.btn-fetching { opacity: 0.6; pointer-events: none; }
|
|
250
|
-
|
|
251
|
-
/* Branch dropdown */
|
|
252
|
-
.branch-dropdown { position: relative; }
|
|
253
|
-
.branch-trigger { background: var(--bg); color: var(--text); border: 1px solid var(--border); border-radius: 5px; padding: 3px 22px 3px 7px; font-size: 11px; cursor: pointer; min-width: 120px; text-align: left; position: relative; }
|
|
254
|
-
.branch-trigger::after { content: '\\25BC'; font-size: 8px; position: absolute; right: 8px; top: 50%; transform: translateY(-50%); color: var(--subtext); }
|
|
255
|
-
.branch-dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 60; background: var(--surface); border: 1px solid var(--border2); border-radius: 6px; box-shadow: 0 4px 12px rgba(0,0,0,0.15); min-width: 220px; max-height: 300px; display: flex; flex-direction: column; margin-top: 2px; }
|
|
256
|
-
.branch-filter-input { padding: 4px 7px; border: none; border-bottom: 1px solid var(--border); background: var(--bg); color: var(--text); font-size: 11px; outline: none; border-radius: 5px 5px 0 0; }
|
|
257
|
-
.branch-list { overflow-y: auto; max-height: 250px; }
|
|
258
|
-
.branch-option { padding: 4px 8px; cursor: pointer; font-size: 11px; display: flex; align-items: center; gap: 5px; }
|
|
259
|
-
.branch-option:hover { background: var(--surface-hover); }
|
|
260
|
-
.branch-option.selected { background: var(--selected); font-weight: 600; }
|
|
261
|
-
|
|
262
|
-
/* Worktree popover */
|
|
263
|
-
.worktree-dropdown { position: relative; }
|
|
264
|
-
#btn-worktree { display: flex; align-items: center; gap: 3px; font-size: 11px; padding: 3px 6px; }
|
|
265
|
-
#btn-worktree .wt-count { background: var(--accent, #58a6ff); color: #fff; font-size: 9px; border-radius: 7px; padding: 0 4px; min-width: 14px; text-align: center; line-height: 14px; }
|
|
266
|
-
.worktree-popover { position: absolute; top: 100%; right: 0; z-index: 60; background: var(--surface); border: 1px solid var(--border2); border-radius: 8px; box-shadow: 0 4px 16px rgba(0,0,0,0.2); min-width: 300px; max-width: 400px; margin-top: 4px; display: flex; flex-direction: column; }
|
|
267
|
-
.worktree-popover-header { padding: 8px 12px; font-size: 12px; font-weight: 600; border-bottom: 1px solid var(--border); }
|
|
268
|
-
.worktree-list { overflow-y: auto; max-height: 240px; }
|
|
269
|
-
.wt-item { padding: 8px 12px; border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 8px; font-size: 12px; }
|
|
270
|
-
.wt-item:last-child { border-bottom: none; }
|
|
271
|
-
.wt-item-info { flex: 1; min-width: 0; }
|
|
272
|
-
.wt-item-branch { font-weight: 600; display: flex; align-items: center; gap: 4px; }
|
|
273
|
-
.wt-item-path { font-size: 10px; color: var(--subtext); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
274
|
-
.wt-badge { font-size: 9px; padding: 1px 4px; border-radius: 4px; background: var(--border); color: var(--subtext); }
|
|
275
|
-
.wt-badge-current { background: var(--accent, #58a6ff); color: #fff; }
|
|
276
|
-
.wt-item-active { background: var(--selected); }
|
|
277
|
-
.wt-badge-locked { background: #d29922; color: #fff; }
|
|
278
|
-
.wt-item-actions { display: flex; gap: 4px; flex-shrink: 0; }
|
|
279
|
-
.wt-item-actions button { min-width: 24px; min-height: 24px; padding: 2px 6px; font-size: 10px; }
|
|
280
|
-
.worktree-popover-footer { padding: 8px 12px; border-top: 1px solid var(--border); display: flex; gap: 6px; }
|
|
281
|
-
.worktree-popover-footer .btn-sm { flex: 1; }
|
|
282
|
-
.wt-empty { padding: 16px; text-align: center; font-size: 11px; color: var(--subtext); }
|
|
283
|
-
|
|
284
|
-
/* Submodules reuse the worktree popover chrome; only the badges differ. */
|
|
285
|
-
.submodule-dropdown { position: relative; }
|
|
286
|
-
#btn-submodule { display: flex; align-items: center; gap: 3px; font-size: 11px; padding: 3px 6px; }
|
|
287
|
-
#btn-submodule .sm-count { background: var(--accent, #58a6ff); color: #fff; font-size: 9px; border-radius: 7px; padding: 0 4px; min-width: 14px; text-align: center; line-height: 14px; }
|
|
288
|
-
.sm-badge-uninitialized { background: var(--border); color: var(--subtext); }
|
|
289
|
-
.sm-badge-modified { background: #d29922; color: #fff; }
|
|
290
|
-
.sm-badge-conflicted { background: #f85149; color: #fff; }
|
|
291
|
-
@media (max-width: 768px) { .branch-option { padding: 10px 12px; min-height: 44px; } }
|
|
292
|
-
|
|
293
|
-
/* Stash popover */
|
|
294
|
-
.stash-dropdown { position: relative; }
|
|
295
|
-
#btn-stash { display: flex; align-items: center; gap: 3px; font-size: 11px; padding: 3px 6px; }
|
|
296
|
-
#btn-stash .stash-count { background: var(--accent, #58a6ff); color: #fff; font-size: 9px; border-radius: 7px; padding: 0 4px; min-width: 14px; text-align: center; line-height: 14px; }
|
|
297
|
-
.stash-popover { position: absolute; top: 100%; right: 0; z-index: 60; background: var(--surface); border: 1px solid var(--border2); border-radius: 8px; box-shadow: 0 4px 16px rgba(0,0,0,0.2); min-width: 300px; max-width: 400px; margin-top: 4px; display: flex; flex-direction: column; }
|
|
298
|
-
.stash-popover-header { padding: 8px 12px; font-size: 12px; font-weight: 600; border-bottom: 1px solid var(--border); }
|
|
299
|
-
.stash-list { overflow-y: auto; max-height: 240px; }
|
|
300
|
-
.stash-item { padding: 8px 12px; border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 8px; font-size: 12px; }
|
|
301
|
-
.stash-item:last-child { border-bottom: none; }
|
|
302
|
-
.stash-item-info { flex: 1; min-width: 0; }
|
|
303
|
-
.stash-item-ref { font-weight: 600; font-size: 11px; color: var(--subtext); }
|
|
304
|
-
.stash-item-msg { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
305
|
-
.stash-item-actions { display: flex; gap: 4px; flex-shrink: 0; }
|
|
306
|
-
.stash-item-actions button { min-width: 24px; min-height: 24px; padding: 2px 6px; font-size: 10px; }
|
|
307
|
-
.stash-empty { padding: 16px; text-align: center; font-size: 11px; color: var(--subtext); }
|
|
308
|
-
.stash-popover-footer { padding: 8px 12px; border-top: 1px solid var(--border); display: flex; gap: 6px; }
|
|
309
|
-
.stash-popover-footer .btn-sm { flex: 1; }
|
|
310
|
-
|
|
311
|
-
/* Merge/rebase banner */
|
|
312
|
-
.merge-banner { padding: 8px 12px; background: rgba(133, 77, 14, 0.12); border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 8px; font-size: 12px; flex-shrink: 0; }
|
|
313
|
-
.merge-banner .banner-icon { color: #eab308; }
|
|
314
|
-
.merge-banner .banner-text { flex: 1; }
|
|
315
|
-
.merge-banner .banner-actions { display: flex; gap: 4px; }
|
|
316
|
-
.merge-banner .banner-actions button { font-size: 11px; padding: 2px 8px; }
|
|
317
|
-
.merge-banner .btn-continue { background: var(--green); color: #fff; border-color: transparent; }
|
|
318
|
-
.merge-banner .btn-abort { background: var(--red); color: #fff; border-color: transparent; }
|
|
319
|
-
|
|
320
|
-
/* Conflict section */
|
|
321
|
-
.conflict-header { padding: 4px 0; font-size: 12px; font-weight: 600; color: var(--red); display: flex; align-items: center; gap: 4px; }
|
|
322
|
-
.file-status-U { color: var(--red); font-weight: bold; }
|
|
323
|
-
|
|
324
|
-
/* Find bar */
|
|
325
|
-
.find-bar { display: flex; align-items: center; gap: 5px; padding: 4px 10px; border-bottom: 1px solid var(--border); background: var(--surface); }
|
|
326
|
-
.find-bar input { flex: 1; background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 3px 6px; font-size: 11px; }
|
|
327
|
-
.find-bar input:focus { outline: none; border-color: var(--blue); }
|
|
328
|
-
#find-count { font-size: 10px; color: var(--subtext); min-width: 50px; }
|
|
329
|
-
.hidden { display: none !important; }
|
|
330
|
-
|
|
331
|
-
/* Graph container. The scroller is wrapped, because the scroll markers have to
|
|
332
|
-
sit beside it in a box that does not scroll with the rows. */
|
|
333
|
-
#graph-area { position: relative; flex: 1; min-height: 0; display: flex; }
|
|
334
|
-
#graph-container { flex: 1; min-width: 0; overflow-y: auto; overflow-x: hidden; }
|
|
335
|
-
/* Where in the whole history the things worth scrolling to are: the checked-out
|
|
336
|
-
commit, the selected row, and every search match. Over the scrollbar, like
|
|
337
|
-
VS Code's own overview ruler, and never clickable — dragging the scrollbar
|
|
338
|
-
underneath has to keep working. */
|
|
339
|
-
#scroll-markers { position: absolute; right: 0; top: 0; bottom: 0; width: 5px; pointer-events: none; z-index: 3; }
|
|
340
|
-
.scroll-marker { position: absolute; right: 0; width: 5px; height: 2px; border-radius: 1px; transform: translateY(-50%); }
|
|
341
|
-
.sm-search { background: var(--yellow); }
|
|
342
|
-
.sm-head { background: var(--green); height: 3px; }
|
|
343
|
-
.sm-selected { background: var(--blue); height: 3px; }
|
|
344
|
-
.commit-row { display: flex; align-items: center; cursor: pointer; height: 30px; padding: 0 6px; font-size: 12px; box-sizing: border-box; overflow: hidden; }
|
|
345
|
-
/* Banding, before the hover and selected rules on purpose: it has the same
|
|
346
|
-
specificity as they do, so source order is what decides the winner. Do not
|
|
347
|
-
qualify it with #commit-list — an id would raise it above both of them and
|
|
348
|
-
every other row would stop showing hover and selection. The header row is a
|
|
349
|
-
.commit-row too but is the first child of its own parent, so it is odd. */
|
|
350
|
-
.commit-row:nth-child(even) { background: var(--band); }
|
|
351
|
-
.commit-row:hover { background: var(--surface-hover); }
|
|
352
|
-
.commit-row.header-row { background: var(--surface); cursor: default; font-weight: 600; font-size: 10px; color: var(--subtext); text-transform: uppercase; letter-spacing: 0.5px; position: sticky; top: 0; z-index: 2; border-bottom: 1px solid var(--border); height: 24px; }
|
|
353
|
-
.commit-row.header-row .col-message::before { display: none; }
|
|
354
|
-
/* A tint and a bar, not a flood: with fifteen rows on screen a 15% yellow
|
|
355
|
-
wash over half of them buried the list it was meant to annotate. The
|
|
356
|
-
scroll markers carry where the rest of the matches are. */
|
|
357
|
-
.commit-row.search-match { background: color-mix(in srgb, var(--yellow) 9%, transparent); box-shadow: inset 2px 0 0 var(--yellow); }
|
|
358
|
-
/* After the match rule on purpose: the row you clicked should look selected,
|
|
359
|
-
even when it is also a match. Which of the two it is stays visible in the
|
|
360
|
-
find bar's count and in the scroll markers. */
|
|
361
|
-
.commit-row.selected { background: var(--selected); box-shadow: inset 2px 0 0 var(--blue); }
|
|
362
|
-
.commit-row.virtual { opacity: 0.85; font-style: italic; }
|
|
363
|
-
.commit-row.virtual .col-message { color: var(--subtext); }
|
|
364
|
-
.commit-row.stash-row { opacity: 0.75; }
|
|
365
|
-
.commit-row.stash-row .col-message { color: var(--subtext); font-style: italic; }
|
|
366
|
-
.file-clickable { cursor: pointer; border-radius: 3px; padding: 2px 4px; margin: 0 -4px; }
|
|
367
|
-
.file-clickable:hover { background: var(--surface-hover); }
|
|
368
|
-
/* Refs get a column of their own so every message starts at the same x — a
|
|
369
|
-
branch badge pushing the text right was most of why the list read as ragged.
|
|
370
|
-
The width has to be fixed rather than content-sized: rows are separate flex
|
|
371
|
-
containers, so an auto width would put each row's graph at a different x, and
|
|
372
|
-
the graph is one SVG overlay drawn on a single grid. */
|
|
373
|
-
.col-refs { width: var(--refs-col-w, 170px); min-width: var(--refs-col-w, 170px); flex-shrink: 0; overflow: hidden; white-space: nowrap; display: flex; align-items: center; justify-content: flex-end; gap: 3px; padding-right: 6px; }
|
|
374
|
-
.col-refs .ref-badge { min-width: 0; overflow: hidden; text-overflow: ellipsis; margin-right: 0; }
|
|
375
|
-
.col-graph { width: var(--graph-col-w, 120px); min-width: var(--graph-col-w, 80px); overflow: hidden; flex-shrink: 0; position: relative; }
|
|
376
|
-
.graph-resize-handle { position: absolute; right: 0; top: 0; bottom: 0; width: 6px; cursor: col-resize; z-index: 3; background: transparent; }
|
|
377
|
-
.graph-resize-handle:hover, .graph-resize-handle.dragging { background: var(--blue); opacity: 0.5; }
|
|
378
|
-
/* Panning the graph is a drag on the graph itself, so there is no scrollbar in
|
|
379
|
-
the table taking a row of its own — a real one cannot go on the overlay,
|
|
380
|
-
which is as tall as the whole history, and in a 24px header row the thumb
|
|
381
|
-
lands across the word "Graph". What is left is a hint: where in the lanes the
|
|
382
|
-
column currently is, shown while a drag or a wheel is moving it and faded out
|
|
383
|
-
after. It is positioned over the graph area rather than inside the scroller,
|
|
384
|
-
so it neither scrolls away nor displaces a row. */
|
|
385
|
-
/* A row's graph cell is an empty spacer, and the row centres its cells — so
|
|
386
|
-
without this it is 0px tall and the pointer that looks like it is on the
|
|
387
|
-
graph is really on the row behind it, which is what decides whether a drag
|
|
388
|
-
pans or selects a commit. Not the header's cell: that one has a label in it,
|
|
389
|
-
and stretching it takes the label off the line the other headings sit on. */
|
|
390
|
-
.commit-row:not(.header-row) .col-graph { align-self: stretch; touch-action: pan-y; }
|
|
391
|
-
:root.graph-can-pan .commit-row:not(.header-row) .col-graph { cursor: grab; }
|
|
392
|
-
:root.graph-panning .commit-row:not(.header-row) .col-graph { cursor: grabbing; }
|
|
393
|
-
#graph-pan-bar { position: absolute; z-index: 4; bottom: 6px; left: calc(var(--refs-col-w, 170px) + 6px); width: var(--graph-col-w, 120px); height: 4px; border-radius: 2px; background: color-mix(in srgb, var(--text) 10%, transparent); opacity: 0; transition: opacity 0.4s ease; pointer-events: none; }
|
|
394
|
-
#graph-pan-bar.visible { opacity: 1; transition-duration: 0.1s; }
|
|
395
|
-
#graph-pan-thumb { position: absolute; top: 0; bottom: 0; border-radius: 2px; background: var(--subtext); }
|
|
396
|
-
/* The message never shrinks past a readable measure. Every other column is
|
|
397
|
-
either fixed or hidden by the width tiers, so without a floor here this one
|
|
398
|
-
absorbs the whole shortfall and disappears. */
|
|
399
|
-
.col-message { flex: 1; min-width: ${MESSAGE_MIN_W}px; padding: 0 6px 0 12px; position: relative; display: flex; flex-direction: column; justify-content: center; align-self: stretch; overflow: hidden; }
|
|
400
|
-
/* The lane's colour, restated where the eye reads the message. The row centres
|
|
401
|
-
its cells, so this one has to stretch or the tick has nothing to span. */
|
|
402
|
-
.col-message::before { content: ''; position: absolute; left: 3px; top: 7px; bottom: 7px; width: 2px; border-radius: 1px; background: var(--lane, transparent); opacity: 0.65; }
|
|
403
|
-
.msg-subject { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
404
|
-
/* Author, date and hash again, for the phone layout that has no room for their
|
|
405
|
-
columns. Hidden until that layout asks for it. */
|
|
406
|
-
.msg-meta { display: none; }
|
|
407
|
-
/* Lines added and removed. Tabular figures so the columns of digits line up
|
|
408
|
-
down the list rather than jittering with the glyph widths. */
|
|
409
|
-
.col-changes { width: 84px; min-width: 84px; flex-shrink: 0; font-size: 11px; font-variant-numeric: tabular-nums; display: flex; align-items: center; gap: 5px; }
|
|
410
|
-
.col-changes .ch-add { color: var(--green); }
|
|
411
|
-
.col-changes .ch-del { color: var(--red); }
|
|
412
|
-
.col-author { width: 130px; min-width: 130px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: var(--subtext); font-size: 11px; }
|
|
413
|
-
.avatar { width: 16px; height: 16px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: 7px; font-weight: 700; color: #fff; flex-shrink: 0; letter-spacing: -0.2px; }
|
|
414
|
-
|
|
415
|
-
/* Author hover card */
|
|
416
|
-
.author-card { position: fixed; z-index: 80; background: var(--surface); border: 1px solid var(--border2); border-radius: 8px; box-shadow: 0 6px 20px rgba(0,0,0,0.25); padding: 8px 10px; font-size: 11px; max-width: 280px; pointer-events: none; }
|
|
417
|
-
.author-card .ac-head { display: flex; align-items: center; gap: 6px; font-weight: 600; margin-bottom: 4px; }
|
|
418
|
-
.author-card .ac-row { color: var(--subtext); font-size: 10px; }
|
|
419
|
-
|
|
420
|
-
/* Drag a ref badge onto a commit row to merge or rebase onto it */
|
|
421
|
-
.ref-badge[draggable=true] { cursor: grab; }
|
|
422
|
-
.commit-row.drop-target { outline: 2px dashed var(--blue); outline-offset: -2px; background: var(--selected); }
|
|
423
|
-
.ref-badge.dragging { opacity: 0.45; }
|
|
424
|
-
|
|
425
|
-
/* Whole-history search results */
|
|
426
|
-
.search-results { position: absolute; top: 56px; left: 8px; right: 8px; max-height: 55vh; z-index: 45; background: var(--surface); border: 1px solid var(--border2); border-radius: 8px; box-shadow: 0 8px 24px rgba(0,0,0,0.25); overflow: auto; }
|
|
427
|
-
.sr-head { padding: 6px 10px; font-size: 10px; color: var(--subtext); border-bottom: 1px solid var(--border); position: sticky; top: 0; background: var(--surface); }
|
|
428
|
-
.sr-item { padding: 6px 10px; border-bottom: 1px solid var(--border); cursor: pointer; }
|
|
429
|
-
.sr-item:hover { background: var(--surface-hover); }
|
|
430
|
-
.sr-subject { font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
431
|
-
.sr-meta { font-size: 10px; color: var(--subtext); display: flex; gap: 6px; align-items: center; margin-top: 2px; }
|
|
432
|
-
.sr-hash { font-family: var(--mono-font); }
|
|
433
|
-
.col-date { width: 80px; min-width: 80px; color: var(--subtext); font-size: 11px; }
|
|
434
|
-
.col-hash { width: 60px; min-width: 60px; font-family: var(--mono-font); font-size: 10px; color: var(--subtle); }
|
|
435
|
-
|
|
436
|
-
/* Columns the reader turned off, from the header's context menu or from
|
|
437
|
-
Settings. Declared after :root so the refs variable — which is where the
|
|
438
|
-
graph overlay starts, not just how wide a cell is — loses to this one on
|
|
439
|
-
source order; the two have the same specificity. */
|
|
440
|
-
.cols-no-refs { --refs-col-w: 0px; }
|
|
441
|
-
.cols-no-refs .col-refs { display: none; }
|
|
442
|
-
.cols-no-changes .col-changes { display: none; }
|
|
443
|
-
.cols-no-author .col-author { display: none; }
|
|
444
|
-
.cols-no-date .col-date { display: none; }
|
|
445
|
-
.cols-no-hash .col-hash { display: none; }
|
|
446
|
-
|
|
447
|
-
/* Ref badges — border + tinted bg + dark text */
|
|
448
|
-
.ref-badge { display: inline-flex; align-items: center; gap: 3px; padding: 0px 5px; border-radius: 3px; font-size: 9px; font-weight: 600; margin-right: 3px; vertical-align: middle; line-height: 16px; border: 1px solid; color: #1a1a1a; }
|
|
449
|
-
.ref-head { border-color: var(--green); background: color-mix(in srgb, var(--green) 12%, transparent); }
|
|
450
|
-
.ref-local { border-color: var(--blue); background: color-mix(in srgb, var(--blue) 12%, transparent); }
|
|
451
|
-
.ref-remote { border-color: var(--purple); background: color-mix(in srgb, var(--purple) 12%, transparent); }
|
|
452
|
-
.ref-tag { border-color: var(--yellow); background: color-mix(in srgb, var(--yellow) 12%, transparent); }
|
|
453
|
-
.ref-stash { border-color: #808080; background: color-mix(in srgb, #808080 12%, transparent); }
|
|
454
|
-
:root[data-ppm-theme="dark"] .ref-badge { color: #e4e4e7; }
|
|
455
|
-
@media (prefers-color-scheme: dark) {
|
|
456
|
-
:root:not([data-ppm-theme="light"]) .ref-badge { color: #e4e4e7; }
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
/* SVG graph — single SVG overlay.
|
|
460
|
-
The clip box is what keeps the overlay inside its column: the SVG is drawn at
|
|
461
|
-
whatever width the lanes need, which in a repository with enough parallel
|
|
462
|
-
branches is wider than the panel. Unclipped it paints over the message,
|
|
463
|
-
changes and author columns — it is positioned and they are not, so it wins
|
|
464
|
-
the paint order — and capping the column without clipping only trades a
|
|
465
|
-
missing message for one with branch lines drawn through it. What the clip
|
|
466
|
-
hides is reached by panning: --graph-pan-x, driven by a drag on the graph. */
|
|
467
|
-
#commit-list-wrapper { position: relative; }
|
|
468
|
-
#graph-clip { position: absolute; top: 0; left: calc(var(--refs-col-w, 170px) + 6px); width: var(--graph-col-w, 120px); height: 100%; overflow: hidden; z-index: 1; pointer-events: none; }
|
|
469
|
-
/* The clip box starts where the graph cell starts — 6px being the row's own
|
|
470
|
-
padding — and the drawing keeps the 2px it always had inside it. Written the
|
|
471
|
-
other way round, as one offset of 8px on the box, the box ends 2px past its
|
|
472
|
-
column and the first pixels of the message have a branch line through them. */
|
|
473
|
-
#graph-svg-container { position: absolute; top: 0; left: 2px; transform: translateX(calc(-1 * var(--graph-pan-x, 0px))); }
|
|
474
|
-
#graph-svg-container circle { pointer-events: auto; cursor: pointer; }
|
|
475
|
-
#graph-svg-container .line { stroke-width: 2; fill: none; }
|
|
476
|
-
/* The checked-out commit wears a thicker ring rather than a different shape,
|
|
477
|
-
so it still reads as the same kind of thing as every row above it. */
|
|
478
|
-
#graph-svg-container .graphCurrent { stroke-width: 3.5; }
|
|
479
|
-
#graph-svg-container .node-initials { font-size: 8px; font-weight: 700; fill: #fff; pointer-events: none; user-select: none; letter-spacing: -0.3px; }
|
|
480
|
-
.commit-row.graph-hover { background: var(--surface-hover); }
|
|
481
|
-
|
|
482
|
-
/* Detail panel. The panel itself carries no padding, because the header is a
|
|
483
|
-
full-width sticky bar and each pane below it pads itself; anything else
|
|
484
|
-
written into the panel wraps itself in .detail-pad. */
|
|
485
|
-
.detail-panel { border-top: 1px solid var(--border2); background: var(--surface); max-height: 40vh; overflow-y: auto; flex-shrink: 0; }
|
|
486
|
-
.detail-panel h3 { font-size: 13px; margin-bottom: 6px; }
|
|
487
|
-
.detail-pad { padding: 8px 12px; }
|
|
488
|
-
|
|
489
|
-
.detail-head { display: flex; align-items: center; gap: 8px; padding: 7px 12px; border-bottom: 1px solid var(--border); background: var(--surface); position: sticky; top: 0; z-index: 2; flex-shrink: 0; }
|
|
490
|
-
.detail-head .avatar { width: 20px; height: 20px; font-size: 8px; }
|
|
491
|
-
.detail-who { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
|
|
492
|
-
.detail-author { font-size: 12px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
493
|
-
.detail-when { font-size: 11px; color: var(--subtext); white-space: nowrap; }
|
|
494
|
-
.detail-head-actions { margin-left: auto; display: flex; align-items: center; gap: 4px; flex-shrink: 0; }
|
|
495
|
-
|
|
496
|
-
/* The panel's only dismiss. Escape closes it too, but a touch screen has no
|
|
497
|
-
Escape key, so a panel opened by a tap could not be put away at all — it
|
|
498
|
-
sits over a third of the graph until another commit is tapped. It took the
|
|
499
|
-
place of the two hash chips, which were a convenience: the metadata grid
|
|
500
|
-
two lines below carries the hash and the parents in full.
|
|
501
|
-
|
|
502
|
-
It stays 24px of ink on every device. The generic pointer: coarse button rule
|
|
503
|
-
further down took it to 32, which is still under the 44 a finger needs, and
|
|
504
|
-
growing the button itself would grow the header with it - this sits in a
|
|
505
|
-
sticky bar above a panel that is already capped at 35vh on a phone. So the
|
|
506
|
-
tap area grows instead, through an invisible overlay, which is the same thing
|
|
507
|
-
the app does for its own 20px controls. Nothing else lives in
|
|
508
|
-
.detail-head-actions, and what it reaches on the left is the committed-when
|
|
509
|
-
text, which is not clickable. */
|
|
510
|
-
.detail-close { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; padding: 0; border: none; border-radius: 5px; background: none; color: var(--subtext); }
|
|
511
|
-
.detail-close:hover { background: var(--surface-hover); color: var(--text); }
|
|
512
|
-
|
|
513
|
-
/* Two columns when there is room. A commit message is hard-wrapped by whoever
|
|
514
|
-
wrote it, so on a wide panel it fills half the width and the rest of the row
|
|
515
|
-
is empty; the file list goes there instead of below the fold. Each pane pads
|
|
516
|
-
itself, because above the breakpoint each one also scrolls itself. */
|
|
517
|
-
.detail-grid { display: grid; grid-template-columns: minmax(0, 1fr); }
|
|
518
|
-
.detail-msg { padding: 12px 16px 16px; min-width: 0; }
|
|
519
|
-
.detail-files { padding: 8px 12px 12px; min-width: 0; }
|
|
520
|
-
/* Full hashes, both emails and both dates, in a label/value grid. One rule
|
|
521
|
-
under it separates the provenance from the message; the subject carries none
|
|
522
|
-
of its own, because two hairlines in a 360px panel is a lot of furniture and
|
|
523
|
-
14px semibold against 11.5px monospace already reads as two things. The rule
|
|
524
|
-
belongs here rather than to the body, which is capped at a readable measure
|
|
525
|
-
and would stop the border short of the pane for no visible reason. */
|
|
526
|
-
.detail-meta { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 5px 14px; align-items: baseline; font-size: 11.5px; margin-bottom: 14px; padding-bottom: 13px; border-bottom: 1px solid var(--border); }
|
|
527
|
-
.meta-label { color: var(--subtext); font-size: 11.5px; white-space: nowrap; }
|
|
528
|
-
.meta-cells { display: flex; flex-wrap: wrap; align-items: baseline; gap: 3px 14px; min-width: 0; }
|
|
529
|
-
.meta-value { min-width: 0; overflow-wrap: anywhere; cursor: pointer; }
|
|
530
|
-
.meta-value.mono { font-family: var(--mono-font); font-size: 11.5px; color: var(--subtext); }
|
|
531
|
-
/* The eight characters that identify the commit carry the contrast; the other
|
|
532
|
-
thirty-two are there to be copied, not read. */
|
|
533
|
-
.hash-lead { color: var(--text); font-weight: 600; }
|
|
534
|
-
.meta-name { color: var(--text); }
|
|
535
|
-
.meta-email { color: var(--subtext); margin-left: 6px; }
|
|
536
|
-
.meta-value:hover .hash-lead, .meta-value:hover .meta-name, .meta-value:hover .meta-email { color: var(--blue); }
|
|
537
|
-
.meta-value:hover { color: var(--blue); }
|
|
538
|
-
.meta-value.copied, .meta-value.copied .hash-lead, .meta-value.copied .meta-name, .meta-value.copied .meta-email { color: var(--green); }
|
|
539
|
-
.meta-value.copy-failed, .meta-value.copy-failed .hash-lead, .meta-value.copy-failed .meta-name, .meta-value.copy-failed .meta-email { color: var(--red); }
|
|
540
|
-
.meta-when { color: var(--subtext); font-variant-numeric: tabular-nums; }
|
|
541
|
-
.detail-subject { font-size: 15px; font-weight: 600; line-height: 1.4; letter-spacing: -0.1px; }
|
|
542
|
-
|
|
543
|
-
/* The body. A paragraph its author wrapped at 72 columns is set as prose in the
|
|
544
|
-
UI font and reflowed to the pane it is actually in — verbatim monospace gave
|
|
545
|
-
a ragged half-filled column of the wrong width. A list or an aligned block is
|
|
546
|
-
not reflowable and keeps its breaks and its monospace; splitCommitBody
|
|
547
|
-
decides which is which. */
|
|
548
|
-
.detail-text { margin-top: 13px; }
|
|
549
|
-
.msg-p { font-size: 13px; line-height: 1.7; max-width: 68ch; }
|
|
550
|
-
.msg-pre { font-family: var(--mono-font); font-size: 12px; line-height: 1.6; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
551
|
-
/* The reset zeroes every margin, so the space between paragraphs is set here
|
|
552
|
-
rather than inherited from the browser's default for a p element. */
|
|
553
|
-
.msg-p + .msg-p, .msg-p + .msg-pre, .msg-pre + .msg-p, .msg-pre + .msg-pre { margin-top: 13px; }
|
|
554
|
-
|
|
555
|
-
/* One scrollbar per pane above the breakpoint. A long message and a long file
|
|
556
|
-
list are two lists of unrelated length, and scrolling the pair as one means
|
|
557
|
-
reaching the twentieth file by pushing the message off the screen. Below it
|
|
558
|
-
they are stacked, and two scrollers inside one short panel is a trap for a
|
|
559
|
-
thumb — so there the panel scrolls as a whole, as it always did. */
|
|
560
|
-
@media (min-width: 900px) {
|
|
561
|
-
.detail-panel.split { display: flex; flex-direction: column; overflow: hidden; }
|
|
562
|
-
.detail-grid.has-files { grid-template-columns: minmax(0, 1fr) minmax(260px, 38%); }
|
|
563
|
-
.detail-panel.split .detail-grid { flex: 1 1 auto; min-height: 0; }
|
|
564
|
-
.detail-panel.split .detail-grid > * { overflow-y: auto; overscroll-behavior: contain; min-height: 0; }
|
|
565
|
-
.detail-panel.split .detail-files { border-left: 1px solid var(--border); padding-top: 0; }
|
|
566
|
-
/* The pane's own top padding would sit above a sticky header, leaving a strip
|
|
567
|
-
for rows to scroll through; the header carries that space instead. */
|
|
568
|
-
.detail-panel.split .files-head { position: sticky; top: 0; background: var(--surface); z-index: 1; padding: 8px 0 3px; }
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
.file-list { margin-top: 8px; min-width: 0; }
|
|
572
|
-
.detail-files .file-list { margin-top: 0; }
|
|
573
|
-
.files-head { display: flex; align-items: center; gap: 8px; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--subtext); border-bottom: 1px solid var(--border); margin-bottom: 3px; }
|
|
574
|
-
.files-head .file-view-toggle { margin-bottom: 0; }
|
|
575
|
-
.files-total { margin-left: auto; font-family: var(--mono-font); font-size: 10px; letter-spacing: 0; text-transform: none; font-variant-numeric: tabular-nums; }
|
|
576
|
-
.files-total .add { color: var(--green); }
|
|
577
|
-
.files-total .del { color: var(--red); }
|
|
578
|
-
|
|
579
|
-
.file-item { display: flex; align-items: center; gap: 6px; padding: 2px 4px; border-radius: 4px; font-size: 11px; font-family: var(--mono-font); min-width: 0; }
|
|
580
|
-
.file-item.file-clickable { cursor: pointer; }
|
|
581
|
-
.file-item.file-clickable:hover { background: var(--surface-hover); }
|
|
582
|
-
/* Name first, then the directory it is in: the column is narrow, so what has
|
|
583
|
-
to survive the ellipsis is the file name. */
|
|
584
|
-
.file-item .file-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex-shrink: 0; max-width: 60%; }
|
|
585
|
-
/* The directory takes the slack, which is what leaves the stats and the row's
|
|
586
|
-
buttons together at the right edge instead of both claiming the same auto
|
|
587
|
-
margin and meeting somewhere in the middle. */
|
|
588
|
-
.file-item .file-dir { color: var(--subtle); font-size: 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; flex: 1 1 auto; }
|
|
589
|
-
.file-status { display: inline-block; width: 14px; text-align: center; font-weight: 700; font-size: 10px; }
|
|
590
|
-
.file-status-A { color: var(--green); }
|
|
591
|
-
.file-status-M { color: var(--yellow); }
|
|
592
|
-
.file-status-D { color: var(--red); }
|
|
593
|
-
.file-status-R { color: var(--blue); }
|
|
594
|
-
.file-stat { color: var(--subtext); font-size: 11px; margin-left: auto; }
|
|
595
|
-
.file-stat .add { color: var(--green); }
|
|
596
|
-
.file-stat .del { color: var(--red); }
|
|
597
|
-
|
|
598
|
-
/* File view toggle */
|
|
599
|
-
.file-view-toggle { display: flex; gap: 2px; margin-bottom: 6px; }
|
|
600
|
-
.toggle-btn { padding: 2px 6px; font-size: 12px; min-width: 28px; min-height: 28px; border: 1px solid var(--border); border-radius: 4px; background: transparent; cursor: pointer; }
|
|
601
|
-
.toggle-btn.active { background: var(--surface-hover); border-color: var(--border2); }
|
|
602
|
-
.tree-dir { display: flex; align-items: center; gap: 4px; padding: 2px 0; font-size: 12px; color: var(--subtext); }
|
|
603
|
-
.tree-dir-name { font-weight: 500; color: var(--text); }
|
|
604
|
-
.tree-dir-count { font-size: 11px; color: var(--subtle); }
|
|
605
|
-
|
|
606
|
-
/* File actions */
|
|
607
|
-
.file-actions { display: flex; gap: 2px; margin-left: 6px; flex-shrink: 0; }
|
|
608
|
-
.file-action-btn { min-width: 24px; min-height: 24px; padding: 0 4px; border: none; background: transparent; cursor: pointer; border-radius: 4px; font-size: 12px; color: var(--subtext); display: flex; align-items: center; justify-content: center; }
|
|
609
|
-
.file-action-btn:hover { background: var(--surface-hover); color: var(--text); }
|
|
610
|
-
.file-action-btn[data-action="discard"]:hover { color: var(--red); }
|
|
611
|
-
.section-actions { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; }
|
|
612
|
-
.commit-section { margin-top: 12px; border-top: 1px solid var(--border); padding-top: 12px; }
|
|
613
|
-
.commit-section textarea { width: 100%; background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 6px; padding: 8px; font-size: 12px; font-family: inherit; resize: vertical; min-height: 60px; }
|
|
614
|
-
.commit-section textarea:focus { outline: none; border-color: var(--blue); }
|
|
615
|
-
.commit-actions { display: flex; justify-content: flex-end; margin-top: 6px; gap: 6px; }
|
|
616
|
-
.btn-commit { background: var(--green); color: #fff; border-color: transparent; padding: 4px 16px; font-weight: 600; }
|
|
617
|
-
.btn-commit:disabled { opacity: 0.4; cursor: not-allowed; }
|
|
618
|
-
.btn-commit:hover:not(:disabled) { opacity: 0.9; }
|
|
619
|
-
@media (max-width: 768px) { .file-action-btn { min-width: 36px; min-height: 36px; } }
|
|
620
|
-
|
|
621
|
-
/* Status bar */
|
|
622
|
-
#status-bar { display: flex; align-items: center; padding: 4px 12px; border-top: 1px solid var(--border); background: var(--surface); font-size: 11px; color: var(--subtext); flex-shrink: 0; }
|
|
623
|
-
|
|
624
|
-
/* Context menu */
|
|
625
|
-
.context-menu { position: fixed; background: var(--surface); border: 1px solid var(--border2); border-radius: 6px; padding: 4px 0; min-width: 180px; z-index: 100; box-shadow: 0 4px 12px rgba(0,0,0,0.15); }
|
|
626
|
-
.ctx-item { padding: 6px 12px; cursor: pointer; font-size: 12px; display: flex; align-items: center; gap: 8px; }
|
|
627
|
-
.ctx-item:hover { background: var(--surface-hover); }
|
|
628
|
-
.ctx-item.destructive { color: var(--red); }
|
|
629
|
-
/* A column of its own for the tick, so a list of toggles does not shift
|
|
630
|
-
sideways as they are ticked and unticked. */
|
|
631
|
-
.ctx-tick { width: 12px; flex-shrink: 0; color: var(--blue); }
|
|
632
|
-
.ctx-item.disabled { opacity: 0.5; cursor: default; }
|
|
633
|
-
.ctx-item.disabled:hover { background: transparent; }
|
|
634
|
-
.ctx-separator { border-top: 1px solid var(--border); margin: 4px 0; }
|
|
635
|
-
|
|
636
|
-
/* Loading */
|
|
637
|
-
.loading { text-align: center; padding: 16px; color: var(--subtext); }
|
|
638
|
-
|
|
639
|
-
/* Settings panel */
|
|
640
|
-
.settings-panel { position: absolute; right: 0; top: 0; bottom: 0; width: 340px; background: var(--surface); border-left: 1px solid var(--border2); z-index: 50; overflow-y: auto; transform: translateX(100%); transition: transform 0.2s ease; display: flex; flex-direction: column; }
|
|
641
|
-
.settings-panel.open { transform: translateX(0); }
|
|
642
|
-
.settings-header { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; border-bottom: 1px solid var(--border); flex-shrink: 0; }
|
|
643
|
-
.settings-header h3 { font-size: 14px; font-weight: 600; }
|
|
644
|
-
.settings-body { flex: 1; overflow-y: auto; padding: 8px 0; }
|
|
645
|
-
.settings-section { border-bottom: 1px solid var(--border); padding: 8px 14px; }
|
|
646
|
-
.settings-section summary { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--subtext); cursor: pointer; padding: 4px 0; user-select: none; }
|
|
647
|
-
.settings-section[open] summary { margin-bottom: 6px; }
|
|
648
|
-
.setting-row { display: flex; align-items: center; justify-content: space-between; padding: 5px 0; font-size: 12px; gap: 8px; }
|
|
649
|
-
.setting-row label { flex: 1; min-width: 0; }
|
|
650
|
-
.setting-row input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--blue); flex-shrink: 0; }
|
|
651
|
-
.setting-row input[type="number"] { width: 72px; background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 3px 6px; font-size: 12px; }
|
|
652
|
-
.setting-row select { background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 3px 6px; font-size: 12px; min-width: 100px; }
|
|
653
|
-
.setting-row input[type="text"] { flex: 1; background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 3px 6px; font-size: 12px; }
|
|
654
|
-
.btn-sm { font-size: 11px; padding: 3px 10px; border-radius: 6px; min-width: 0; min-height: 0; }
|
|
655
|
-
.remote-item { padding: 6px 0; border-bottom: 1px solid var(--border); font-size: 12px; }
|
|
656
|
-
.remote-item:last-child { border-bottom: none; }
|
|
657
|
-
.remote-item .remote-name { font-weight: 600; margin-bottom: 2px; }
|
|
658
|
-
.remote-item .remote-url { color: var(--subtext); font-family: var(--mono-font); font-size: 11px; word-break: break-all; }
|
|
659
|
-
.remote-actions { display: flex; gap: 4px; margin-top: 4px; }
|
|
660
|
-
.add-remote-form { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; }
|
|
661
|
-
.add-remote-form input { background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 4px 6px; font-size: 12px; }
|
|
662
|
-
.issue-rule-row { display: flex; gap: 4px; align-items: center; margin-bottom: 4px; }
|
|
663
|
-
.issue-rule-row input { flex: 1; background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 3px 6px; font-size: 11px; font-family: var(--mono-font); }
|
|
664
|
-
.issue-rule-row input.rule-error { border-color: var(--red); }
|
|
665
|
-
.issue-rule-row .rule-remove { min-width: 24px; min-height: 24px; padding: 0; font-size: 14px; color: var(--red); border: none; }
|
|
666
|
-
@media (max-width: 768px) { .settings-panel { width: 100%; } }
|
|
667
|
-
|
|
668
|
-
/* Dialog overlay */
|
|
669
|
-
.dialog-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.4); z-index: 200; display: flex; align-items: center; justify-content: center; }
|
|
670
|
-
.dialog { background: var(--surface); border: 1px solid var(--border2); border-radius: 8px; padding: 16px; min-width: 300px; max-width: 400px; box-shadow: 0 8px 24px rgba(0,0,0,0.2); }
|
|
671
|
-
.dialog h3 { font-size: 14px; margin-bottom: 12px; }
|
|
672
|
-
.dialog p { font-size: 12px; color: var(--subtext); margin-bottom: 12px; }
|
|
673
|
-
.dialog p.warning { color: var(--red); font-weight: 600; }
|
|
674
|
-
.dialog input, .dialog select { width: 100%; background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 6px 8px; font-size: 12px; margin-bottom: 12px; }
|
|
675
|
-
.dialog input:focus, .dialog select:focus { outline: none; border-color: var(--blue); }
|
|
676
|
-
.dialog-actions { display: flex; justify-content: flex-end; gap: 8px; }
|
|
677
|
-
.dialog-actions button { min-width: 64px; }
|
|
678
|
-
.dialog-actions .btn-primary { background: var(--blue); color: #fff; border-color: transparent; }
|
|
679
|
-
.dialog-actions .btn-danger { background: var(--red); color: #fff; border-color: transparent; }
|
|
680
|
-
|
|
681
|
-
/* Links in commit messages */
|
|
682
|
-
.commit-link { color: var(--blue); text-decoration: none; cursor: pointer; }
|
|
683
|
-
.commit-link:hover { text-decoration: underline; }
|
|
684
|
-
|
|
685
|
-
/* Toast notifications */
|
|
686
|
-
.toast { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); padding: 8px 16px; border-radius: 6px; font-size: 12px; z-index: 300; animation: toast-in 0.3s ease; max-width: 80%; pointer-events: none; }
|
|
687
|
-
.toast-error { background: var(--red); color: #fff; }
|
|
688
|
-
.toast-success { background: var(--green); color: #fff; }
|
|
689
|
-
.toast-info { background: var(--blue); color: #fff; }
|
|
690
|
-
@keyframes toast-in { from { opacity: 0; transform: translateX(-50%) translateY(10px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } }
|
|
691
|
-
|
|
692
|
-
/* Touch devices — compact mobile layout */
|
|
693
|
-
@media (pointer: coarse) {
|
|
694
|
-
.commit-row { height: 32px; }
|
|
695
|
-
.ctx-item { padding: 8px 12px; min-height: 36px; }
|
|
696
|
-
button { min-width: 32px; min-height: 32px; padding: 2px 6px; }
|
|
697
|
-
/* The one way out of the detail panel, and the only place 32 is not enough:
|
|
698
|
-
a phone has no Escape key, so a panel opened by a tap is closed by this
|
|
699
|
-
button or not at all. 10px each side takes the 24px box to 44, and the 32px
|
|
700
|
-
the rule above gives it to 52. */
|
|
701
|
-
.detail-close::before { content: ''; position: absolute; inset: -10px; }
|
|
702
|
-
#app { flex-direction: column; }
|
|
703
|
-
#toolbar { order: 10; border-bottom: none; border-top: 1px solid var(--border); padding: 2px 6px; }
|
|
704
|
-
#toolbar button { font-size: 10px; }
|
|
705
|
-
.branch-trigger { font-size: 10px !important; padding: 2px 6px !important; }
|
|
706
|
-
#graph-area { order: 1; }
|
|
707
|
-
/* A safety net, not the layout: the width tiers below are what make the row
|
|
708
|
-
fit. This only means that a row which still does not fit — every optional
|
|
709
|
-
column switched back on in a small panel — can be reached by scrolling
|
|
710
|
-
rather than clipped away. */
|
|
711
|
-
#graph-container { overflow-x: auto; overflow-y: auto; }
|
|
712
|
-
#find-bar { order: 0; }
|
|
713
|
-
#status-bar { order: 9; }
|
|
714
|
-
.commit-row.header-row { min-height: 20px; }
|
|
715
|
-
.detail-panel { order: 8; max-height: 35vh; }
|
|
716
|
-
}
|
|
717
|
-
/* Width tiers. Columns leave in order of how little they carry, so that the
|
|
718
|
-
graph and the message keep their room instead of the message paying for
|
|
719
|
-
everything. They apply to every pointer type: a tablet held in portrait is
|
|
720
|
-
as narrow as the window a mouse drags to half the screen, and one layout for
|
|
721
|
-
a width is one thing to reason about. The user's own column choices (the
|
|
722
|
-
header's context menu) decide what is shown when there IS room; these decide
|
|
723
|
-
what there is room for. */
|
|
724
|
-
@media (max-width: 900px) {
|
|
725
|
-
.col-date, .col-hash { display: none; }
|
|
726
|
-
}
|
|
727
|
-
@media (max-width: 760px) {
|
|
728
|
-
.col-changes { display: none; }
|
|
729
|
-
}
|
|
730
|
-
/* Phone layout: the graph and the message, with author/date/hash under the
|
|
731
|
-
subject. Six columns of fragments is not a list of commits, and 44px is the
|
|
732
|
-
minimum touch target this row has to be anyway. isNarrowLayout() in the
|
|
733
|
-
script uses this same 640px, because it decides where the ref badges go. */
|
|
734
|
-
@media (max-width: 640px) {
|
|
735
|
-
:root { --refs-col-w: 0px; }
|
|
736
|
-
/* The floor the wide layout keeps for the message is the whole row here, and
|
|
737
|
-
a floor wider than the panel is what makes a row overflow its own box. */
|
|
738
|
-
.col-message { min-width: 0; }
|
|
739
|
-
.commit-row { height: 44px; }
|
|
740
|
-
.commit-row.header-row { height: 24px; }
|
|
741
|
-
.col-refs, .col-changes, .col-author, .col-date, .col-hash { display: none; }
|
|
742
|
-
.col-message { gap: 1px; }
|
|
743
|
-
.msg-meta { display: block; font-size: 10px; color: var(--subtext); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
744
|
-
.col-message .ref-badge { max-width: 90px; overflow: hidden; text-overflow: ellipsis; }
|
|
745
|
-
}
|
|
746
|
-
`;
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
function getScript(): string {
|
|
750
|
-
return `
|
|
751
|
-
const vscode = acquireVsCodeApi();
|
|
752
|
-
const SVG_NS = 'http://www.w3.org/2000/svg';
|
|
753
|
-
const NULL_VERTEX_ID = -1;
|
|
754
|
-
const GRAPH_COLORS = ['#4ec9b0','#569cd6','#c586c0','#ce9178','#dcdcaa','#4fc1ff','#d7ba7d','#9cdcfe','#b5cea8','#d16969'];
|
|
755
|
-
const graphConfig = {
|
|
756
|
-
colours: GRAPH_COLORS,
|
|
757
|
-
// Wide enough apart that two adjacent lanes' author avatars do not touch,
|
|
758
|
-
// and tall enough that an 18px avatar is the row rather than a dot in it.
|
|
759
|
-
grid: { x: 22, y: 30, offsetX: 14, offsetY: 15, expandY: 60 },
|
|
760
|
-
nodeR: 9,
|
|
761
|
-
style: 'rounded'
|
|
762
|
-
};
|
|
763
|
-
|
|
764
|
-
// --- State ---
|
|
765
|
-
const DEFAULT_SETTINGS = {
|
|
766
|
-
maxCommits: 300, showTags: true, showStashes: true, showRemoteBranches: true,
|
|
767
|
-
graphStyle: 'rounded', firstParentOnly: false, dateFormat: 'relative', commitOrdering: 'topo',
|
|
768
|
-
issueLinkingRules: [{ pattern: '#(\\\\d+)', url: '' }], prCreation: null,
|
|
769
|
-
autoFetchInterval: 0,
|
|
770
|
-
colRefs: true, colChanges: true, colAuthor: true, colDate: true, colHash: true,
|
|
771
|
-
};
|
|
772
|
-
|
|
773
|
-
/** Optional columns, in the order the header declares them. */
|
|
774
|
-
const OPTIONAL_COLUMNS = [
|
|
775
|
-
{ key: 'colRefs', cls: 'cols-no-refs', label: 'Branch / Tag' },
|
|
776
|
-
{ key: 'colChanges', cls: 'cols-no-changes', label: 'Changes' },
|
|
777
|
-
{ key: 'colAuthor', cls: 'cols-no-author', label: 'Author' },
|
|
778
|
-
{ key: 'colDate', cls: 'cols-no-date', label: 'Date' },
|
|
779
|
-
{ key: 'colHash', cls: 'cols-no-hash', label: 'Hash' },
|
|
780
|
-
];
|
|
781
|
-
const MESSAGE_MIN_W = ${MESSAGE_MIN_W};
|
|
782
|
-
const GRAPH_MIN_W = ${GRAPH_MIN_W};
|
|
783
|
-
|
|
784
|
-
const state = {
|
|
785
|
-
repo: '',
|
|
786
|
-
commits: [],
|
|
787
|
-
branches: [],
|
|
788
|
-
tags: [],
|
|
789
|
-
remotes: [],
|
|
790
|
-
stashes: [],
|
|
791
|
-
currentBranch: '',
|
|
792
|
-
head: '',
|
|
793
|
-
selectedCommit: null,
|
|
794
|
-
expandedCommit: null,
|
|
795
|
-
maxCommits: 300,
|
|
796
|
-
loading: false,
|
|
797
|
-
uncommitted: null,
|
|
798
|
-
searchMatches: [],
|
|
799
|
-
/** hash -> {files, insertions, deletions}; arrives after the commits. */
|
|
800
|
-
stats: {},
|
|
801
|
-
searchIndex: -1,
|
|
802
|
-
settings: { ...DEFAULT_SETTINGS },
|
|
803
|
-
userDetails: { name: '', email: '' },
|
|
804
|
-
/** Dragged width of the graph column, or null while it sizes itself. */
|
|
805
|
-
graphColWidth: null,
|
|
806
|
-
/** Width the lanes actually need — what the column is capped against. */
|
|
807
|
-
graphWidth: 0,
|
|
808
|
-
/** How far the graph is panned inside its column. */
|
|
809
|
-
graphPanX: 0,
|
|
810
|
-
fileViewMode: 'list',
|
|
811
|
-
worktrees: [],
|
|
812
|
-
submodules: [],
|
|
813
|
-
mergeState: null,
|
|
814
|
-
_lastDetail: null,
|
|
815
|
-
};
|
|
816
|
-
|
|
817
|
-
// --- SVG Icons ---
|
|
818
|
-
const ICONS = {
|
|
819
|
-
refresh: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="23 4 23 10 17 10"/><polyline points="1 20 1 14 7 14"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>',
|
|
820
|
-
download: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>',
|
|
821
|
-
search: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>',
|
|
822
|
-
settings: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-2 2 2 2 0 01-2-2v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83 0 2 2 0 010-2.83l.06-.06A1.65 1.65 0 004.68 15a1.65 1.65 0 00-1.51-1H3a2 2 0 01-2-2 2 2 0 012-2h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 010-2.83 2 2 0 012.83 0l.06.06A1.65 1.65 0 009 4.68a1.65 1.65 0 001-1.51V3a2 2 0 012-2 2 2 0 012 2v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 0 2 2 0 010 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21a2 2 0 012 2 2 2 0 01-2 2h-.09a1.65 1.65 0 00-1.51 1z"/></svg>',
|
|
823
|
-
folderOpen: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2l-1-5H4l-1 5a2 2 0 002 2z"/></svg>',
|
|
824
|
-
file: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14.5 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V7.5L14.5 2z"/><polyline points="14 2 14 8 20 8"/></svg>',
|
|
825
|
-
list: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="8" y1="6" x2="21" y2="6"/><line x1="8" y1="12" x2="21" y2="12"/><line x1="8" y1="18" x2="21" y2="18"/><line x1="3" y1="6" x2="3.01" y2="6"/><line x1="3" y1="12" x2="3.01" y2="12"/><line x1="3" y1="18" x2="3.01" y2="18"/></svg>',
|
|
826
|
-
tree: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"/></svg>',
|
|
827
|
-
plus: '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>',
|
|
828
|
-
minus: '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="12" x2="19" y2="12"/></svg>',
|
|
829
|
-
x: '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',
|
|
830
|
-
fileOpen: '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>',
|
|
831
|
-
gitBranch: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" y1="3" x2="6" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 01-9 9"/></svg>',
|
|
832
|
-
trash: '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2"/></svg>',
|
|
833
|
-
archive: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="21 8 21 21 3 21 3 8"/><rect x="1" y="3" width="22" height="5"/><line x1="10" y1="12" x2="14" y2="12"/></svg>',
|
|
834
|
-
history: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v5h5"/><path d="M3.05 13A9 9 0 106 5.3L3 8"/><path d="M12 7v5l4 2"/></svg>',
|
|
835
|
-
};
|
|
836
|
-
|
|
837
|
-
// --- Toast notifications ---
|
|
838
|
-
function showToast(message, type) {
|
|
839
|
-
const existing = document.querySelector('.toast');
|
|
840
|
-
if (existing) existing.remove();
|
|
841
|
-
const el = document.createElement('div');
|
|
842
|
-
el.className = 'toast toast-' + (type || 'error');
|
|
843
|
-
el.textContent = message;
|
|
844
|
-
document.body.appendChild(el);
|
|
845
|
-
setTimeout(() => { if (el.parentNode) el.remove(); }, 4000);
|
|
846
|
-
}
|
|
847
|
-
|
|
848
|
-
// --- Init ---
|
|
849
|
-
document.getElementById('btn-refresh').innerHTML = ICONS.refresh;
|
|
850
|
-
document.getElementById('btn-fetch').innerHTML = ICONS.download;
|
|
851
|
-
document.getElementById('btn-submodule').innerHTML = ICONS.folderOpen + ' <span class="sm-count" style="display:none">0</span>';
|
|
852
|
-
document.getElementById('btn-reflog').innerHTML = ICONS.history;
|
|
853
|
-
document.getElementById('btn-find').innerHTML = ICONS.search;
|
|
854
|
-
document.getElementById('btn-settings').innerHTML = ICONS.settings;
|
|
855
|
-
document.getElementById('btn-worktree').innerHTML = ICONS.gitBranch + ' <span class="wt-count" style="display:none">0</span>';
|
|
856
|
-
document.getElementById('btn-stash').innerHTML = ICONS.archive + ' <span class="stash-count" style="display:none">0</span>';
|
|
857
|
-
vscode.postMessage({ command: 'ready' });
|
|
858
|
-
|
|
859
|
-
// --- Message handler ---
|
|
860
|
-
/*
|
|
861
|
-
* The row's layout is decided in JS as well as in CSS (the ref badges live in
|
|
862
|
-
* their own column on a wide screen and inline on a narrow one), so crossing
|
|
863
|
-
* the breakpoint has to rebuild the rows. Without this, rotating a phone would
|
|
864
|
-
* leave the badges in a column that CSS has just hidden.
|
|
865
|
-
*/
|
|
866
|
-
let gWasNarrow = null;
|
|
867
|
-
window.addEventListener('resize', () => {
|
|
868
|
-
const narrow = isNarrowLayout();
|
|
869
|
-
if (gWasNarrow === narrow) return;
|
|
870
|
-
gWasNarrow = narrow;
|
|
871
|
-
if (state.commits.length > 0) renderCommitList();
|
|
872
|
-
});
|
|
873
|
-
|
|
874
|
-
window.addEventListener('message', (event) => {
|
|
875
|
-
const msg = event.data;
|
|
876
|
-
switch (msg.command) {
|
|
877
|
-
case 'loadSearchResults':
|
|
878
|
-
renderSearchResults(msg.data);
|
|
879
|
-
break;
|
|
880
|
-
case 'loadRepoInfo':
|
|
881
|
-
state.repo = msg.data.path;
|
|
882
|
-
state.branches = msg.data.branches;
|
|
883
|
-
state.tags = msg.data.tags;
|
|
884
|
-
state.remotes = msg.data.remotes;
|
|
885
|
-
state.stashes = msg.data.stashes;
|
|
886
|
-
state.head = msg.data.head;
|
|
887
|
-
state.currentBranch = msg.data.currentBranch;
|
|
888
|
-
renderBranchSelector();
|
|
889
|
-
updateStatus();
|
|
890
|
-
if (document.getElementById('settings-panel').classList.contains('open')) renderRemotesList();
|
|
891
|
-
break;
|
|
892
|
-
case 'loadCommits':
|
|
893
|
-
if (msg.append) {
|
|
894
|
-
state.commits = state.commits.concat(msg.data);
|
|
895
|
-
} else {
|
|
896
|
-
state.commits = msg.data;
|
|
897
|
-
// Not an append means the list was replaced — a branch change, a
|
|
898
|
-
// refresh. Hashes are unique so keeping the old numbers would not be
|
|
899
|
-
// wrong, but nothing would ever read them again and nothing would ever
|
|
900
|
-
// drop them either: a long session switching branches grows a map of
|
|
901
|
-
// every commit it has ever looked at.
|
|
902
|
-
state.stats = {};
|
|
903
|
-
}
|
|
904
|
-
renderCommitList();
|
|
905
|
-
updateStatus();
|
|
906
|
-
state.loading = false;
|
|
907
|
-
document.getElementById('loading').classList.add('hidden');
|
|
908
|
-
break;
|
|
909
|
-
case 'loadCommitStats':
|
|
910
|
-
Object.assign(state.stats, msg.data);
|
|
911
|
-
applyCommitStats();
|
|
912
|
-
break;
|
|
913
|
-
case 'commitDetails':
|
|
914
|
-
// The answer has to still be the question. Arrow-keying down the list
|
|
915
|
-
// spawns one "git show" per row with nothing cancelling the last, so they
|
|
916
|
-
// come back in whatever order they finish: click A then B quickly and the
|
|
917
|
-
// panel could show A while B is highlighted, and deselecting A while its
|
|
918
|
-
// request was in flight popped the panel open again for a commit that is
|
|
919
|
-
// no longer selected. (No backticks in here: this whole script is a
|
|
920
|
-
// template literal, and one would end it hundreds of lines early.)
|
|
921
|
-
if (msg.data && msg.data.hash === state.selectedCommit) renderDetailPanel(msg.data);
|
|
922
|
-
break;
|
|
923
|
-
case 'refresh':
|
|
924
|
-
state.commits = msg.data;
|
|
925
|
-
if (msg.repoInfo) {
|
|
926
|
-
state.branches = msg.repoInfo.branches;
|
|
927
|
-
state.tags = msg.repoInfo.tags;
|
|
928
|
-
state.remotes = msg.repoInfo.remotes;
|
|
929
|
-
state.stashes = msg.repoInfo.stashes;
|
|
930
|
-
state.head = msg.repoInfo.head;
|
|
931
|
-
state.currentBranch = msg.repoInfo.currentBranch;
|
|
932
|
-
renderBranchSelector();
|
|
933
|
-
}
|
|
934
|
-
renderCommitList();
|
|
935
|
-
updateStatus();
|
|
936
|
-
break;
|
|
937
|
-
case 'loadUncommitted':
|
|
938
|
-
state.uncommitted = msg.data;
|
|
939
|
-
state.mergeState = msg.data?.mergeState || null;
|
|
940
|
-
renderCommitList();
|
|
941
|
-
renderMergeBanner();
|
|
942
|
-
if (state.selectedCommit === 'uncommitted') {
|
|
943
|
-
const u = msg.data;
|
|
944
|
-
if (!u || (u.staged.length === 0 && u.unstaged.length === 0 && (!u.conflicted || u.conflicted.length === 0))) {
|
|
945
|
-
state.selectedCommit = null;
|
|
946
|
-
state.expandedCommit = null;
|
|
947
|
-
document.getElementById('detail-panel').classList.add('hidden');
|
|
948
|
-
} else {
|
|
949
|
-
renderUncommittedDetail();
|
|
950
|
-
}
|
|
951
|
-
}
|
|
952
|
-
break;
|
|
953
|
-
case 'loadSearchResults':
|
|
954
|
-
renderSearchResults(msg.data);
|
|
955
|
-
break;
|
|
956
|
-
case 'loadSettings':
|
|
957
|
-
state.settings = { ...DEFAULT_SETTINGS, ...msg.data };
|
|
958
|
-
state.maxCommits = state.settings.maxCommits;
|
|
959
|
-
applySettingsToUI();
|
|
960
|
-
break;
|
|
961
|
-
case 'loadUserDetails':
|
|
962
|
-
state.userDetails = msg.data;
|
|
963
|
-
document.getElementById('s-userName').value = msg.data.name;
|
|
964
|
-
document.getElementById('s-userEmail').value = msg.data.email;
|
|
965
|
-
break;
|
|
966
|
-
case 'loadOwnerRepo':
|
|
967
|
-
if (msg.data.owner) document.getElementById('pr-owner').value = msg.data.owner;
|
|
968
|
-
if (msg.data.repo) document.getElementById('pr-repo').value = msg.data.repo;
|
|
969
|
-
break;
|
|
970
|
-
case 'actionResult':
|
|
971
|
-
if (msg.action === 'fetch') {
|
|
972
|
-
fetchInProgress = false;
|
|
973
|
-
btnFetch.classList.remove('btn-fetching');
|
|
974
|
-
btnFetch.title = 'Fetch from remotes';
|
|
975
|
-
if (!msg.result.ok) {
|
|
976
|
-
document.getElementById('status-text').textContent = 'Fetch failed: ' + (msg.result.error || 'Unknown error');
|
|
977
|
-
}
|
|
978
|
-
} else if (!msg.result.ok && msg.action === 'createBranch' && msg.result.error && msg.result.error.includes('already exists')) {
|
|
979
|
-
// Extract branch name from error: "fatal: a branch named 'X' already exists"
|
|
980
|
-
const branchMatch = msg.result.error.match(/branch named '([^']+)'/);
|
|
981
|
-
const branchName = branchMatch ? branchMatch[1] : 'this branch';
|
|
982
|
-
showDialog({
|
|
983
|
-
title: 'Branch Already Exists',
|
|
984
|
-
message: 'A branch named <b>' + escHtml(branchName) + '</b> already exists, do you want to replace it with this new branch?',
|
|
985
|
-
rawMessage: true,
|
|
986
|
-
confirmLabel: 'Yes, replace the existing branch',
|
|
987
|
-
cancelLabel: 'No, choose another branch name',
|
|
988
|
-
onConfirm: () => gitAction('createBranch', { ...msg.args, force: true }),
|
|
989
|
-
});
|
|
990
|
-
} else if (!msg.result.ok) {
|
|
991
|
-
showToast('Git action failed: ' + (msg.result.error || 'Unknown error'), 'error');
|
|
992
|
-
}
|
|
993
|
-
// Refresh worktree list after worktree mutations
|
|
994
|
-
if (msg.result.ok && (msg.action === 'addWorktree' || msg.action === 'removeWorktree' || msg.action === 'pruneWorktrees')) {
|
|
995
|
-
vscode.postMessage({ command: 'requestWorktrees' });
|
|
996
|
-
}
|
|
997
|
-
// Refresh stash list after stash mutations
|
|
998
|
-
if (msg.result.ok && ['stashSave','stashPop','stashDrop','stashApply'].includes(msg.action)) {
|
|
999
|
-
vscode.postMessage({ command: 'requestStashes' });
|
|
1000
|
-
}
|
|
1001
|
-
break;
|
|
1002
|
-
case 'loadWorktrees':
|
|
1003
|
-
state.worktrees = msg.data || [];
|
|
1004
|
-
renderWorktreeList();
|
|
1005
|
-
break;
|
|
1006
|
-
case 'loadSubmodules':
|
|
1007
|
-
state.submodules = msg.data || [];
|
|
1008
|
-
renderSubmoduleList();
|
|
1009
|
-
break;
|
|
1010
|
-
case 'loadStashes':
|
|
1011
|
-
state.stashes = msg.data || [];
|
|
1012
|
-
renderStashList();
|
|
1013
|
-
if (state.commits.length > 0) renderCommitList();
|
|
1014
|
-
break;
|
|
1015
|
-
case 'error':
|
|
1016
|
-
document.getElementById('status-text').textContent = 'Error: ' + msg.message;
|
|
1017
|
-
break;
|
|
1018
|
-
}
|
|
1019
|
-
});
|
|
1020
|
-
|
|
1021
|
-
// --- File context menu: blame / history for one file ---
|
|
1022
|
-
function showFileContextMenu(x, y, filePath, hash) {
|
|
1023
|
-
const items = [
|
|
1024
|
-
{ label: 'Blame this file', action: () => vscode.postMessage({ command: 'openBlame', filePath }) },
|
|
1025
|
-
];
|
|
1026
|
-
if (hash && hash !== 'uncommitted' && hash !== 'staged') {
|
|
1027
|
-
items.push({ label: 'Blame at ' + hash.substring(0, 7), action: () => vscode.postMessage({ command: 'openBlame', filePath, hash }) });
|
|
1028
|
-
}
|
|
1029
|
-
items.push(
|
|
1030
|
-
{ label: 'File history', action: () => vscode.postMessage({ command: 'openFileHistory', filePath }) },
|
|
1031
|
-
{ separator: true },
|
|
1032
|
-
{ label: 'Open file', action: () => vscode.postMessage({ command: 'openFile', filePath }) },
|
|
1033
|
-
);
|
|
1034
|
-
renderContextMenu(x, y, items);
|
|
1035
|
-
}
|
|
1036
|
-
|
|
1037
|
-
document.getElementById('detail-panel').addEventListener('contextmenu', (e) => {
|
|
1038
|
-
const item = e.target.closest('.file-item');
|
|
1039
|
-
if (!item || !item.dataset.path) return;
|
|
1040
|
-
e.preventDefault();
|
|
1041
|
-
e.stopPropagation();
|
|
1042
|
-
showFileContextMenu(e.clientX, e.clientY, item.dataset.path, item.dataset.hash);
|
|
1043
|
-
});
|
|
1044
|
-
|
|
1045
|
-
// --- File click delegation (opens diff tab) ---
|
|
1046
|
-
document.getElementById('detail-panel').addEventListener('click', (e) => {
|
|
1047
|
-
// The header's dismiss.
|
|
1048
|
-
if (e.target.closest('.detail-close')) { e.stopPropagation(); closeDetailPanel(); return; }
|
|
1049
|
-
// Metadata values. The clipboard write is silent, so the thing clicked says
|
|
1050
|
-
// it happened.
|
|
1051
|
-
const copySource = e.target.closest('[data-copy]');
|
|
1052
|
-
if (copySource) {
|
|
1053
|
-
e.stopPropagation();
|
|
1054
|
-
// The green flash is the only evidence the user gets, so it waits for the
|
|
1055
|
-
// answer rather than assuming one. A failure says so instead of lying.
|
|
1056
|
-
copyText(copySource.dataset.copy).then((ok) => {
|
|
1057
|
-
const cls = ok ? 'copied' : 'copy-failed';
|
|
1058
|
-
copySource.classList.add(cls);
|
|
1059
|
-
setTimeout(() => copySource.classList.remove(cls), 900);
|
|
1060
|
-
});
|
|
1061
|
-
return;
|
|
1062
|
-
}
|
|
1063
|
-
// File-level action buttons (stage/unstage/discard/open)
|
|
1064
|
-
const actionBtn = e.target.closest('.file-action-btn');
|
|
1065
|
-
if (actionBtn) {
|
|
1066
|
-
e.stopPropagation();
|
|
1067
|
-
const action = actionBtn.dataset.action;
|
|
1068
|
-
const file = actionBtn.dataset.file;
|
|
1069
|
-
if (action === 'open') {
|
|
1070
|
-
vscode.postMessage({ command: 'openFile', filePath: file });
|
|
1071
|
-
} else if (action === 'open-conflict') {
|
|
1072
|
-
vscode.postMessage({ command: 'openConflictFile', filePath: file });
|
|
1073
|
-
} else if (action === 'stage') {
|
|
1074
|
-
vscode.postMessage({ command: 'gitAction', action: 'stage', args: { files: [file] } });
|
|
1075
|
-
} else if (action === 'unstage') {
|
|
1076
|
-
vscode.postMessage({ command: 'gitAction', action: 'unstage', args: { files: [file] } });
|
|
1077
|
-
} else if (action === 'discard') {
|
|
1078
|
-
showDialog({
|
|
1079
|
-
title: 'Discard Changes',
|
|
1080
|
-
message: 'Discard changes to "' + file + '"? This cannot be undone.',
|
|
1081
|
-
destructive: true,
|
|
1082
|
-
confirmLabel: 'Discard',
|
|
1083
|
-
onConfirm: () => vscode.postMessage({ command: 'gitAction', action: 'discard', args: { files: [file] } }),
|
|
1084
|
-
});
|
|
1085
|
-
}
|
|
1086
|
-
return;
|
|
1087
|
-
}
|
|
1088
|
-
// Section-level actions (Stage All / Unstage All)
|
|
1089
|
-
const sectionBtn = e.target.closest('.section-action-btn');
|
|
1090
|
-
if (sectionBtn) {
|
|
1091
|
-
e.stopPropagation();
|
|
1092
|
-
const action = sectionBtn.dataset.action;
|
|
1093
|
-
if (action === 'stage-all') {
|
|
1094
|
-
const files = state.uncommitted.unstaged.map(f => f.path);
|
|
1095
|
-
vscode.postMessage({ command: 'gitAction', action: 'stage', args: { files } });
|
|
1096
|
-
} else if (action === 'unstage-all') {
|
|
1097
|
-
const files = state.uncommitted.staged.map(f => f.path);
|
|
1098
|
-
vscode.postMessage({ command: 'gitAction', action: 'unstage', args: { files } });
|
|
1099
|
-
}
|
|
1100
|
-
return;
|
|
1101
|
-
}
|
|
1102
|
-
// Toggle buttons (tree/list view)
|
|
1103
|
-
const toggleBtn = e.target.closest('.toggle-btn[data-view]');
|
|
1104
|
-
if (toggleBtn) {
|
|
1105
|
-
state.fileViewMode = toggleBtn.dataset.view;
|
|
1106
|
-
if (state.selectedCommit === 'uncommitted') {
|
|
1107
|
-
renderUncommittedDetail();
|
|
1108
|
-
} else if (state._lastDetail) {
|
|
1109
|
-
renderDetailPanel(state._lastDetail);
|
|
1110
|
-
}
|
|
1111
|
-
return;
|
|
1112
|
-
}
|
|
1113
|
-
// File click (opens diff)
|
|
1114
|
-
const item = e.target.closest('.file-clickable');
|
|
1115
|
-
if (!item) return;
|
|
1116
|
-
const filePath = item.dataset.path;
|
|
1117
|
-
const hash = item.dataset.hash;
|
|
1118
|
-
const parentHash = item.dataset.parent || null;
|
|
1119
|
-
if (filePath && hash) {
|
|
1120
|
-
vscode.postMessage({ command: 'openDiff', filePath, hash, parentHash });
|
|
1121
|
-
}
|
|
1122
|
-
});
|
|
1123
|
-
|
|
1124
|
-
/* Blame and history are per-file, so the commit detail's file list is the
|
|
1125
|
-
natural place to reach them. */
|
|
1126
|
-
function showFileContextMenu(x, y, filePath, hash) {
|
|
1127
|
-
const committed = hash && hash !== 'uncommitted' && hash !== 'staged';
|
|
1128
|
-
const items = [
|
|
1129
|
-
{ label: 'Blame this file', action: () => vscode.postMessage({ command: 'openBlame', filePath }) },
|
|
1130
|
-
];
|
|
1131
|
-
if (committed) {
|
|
1132
|
-
items.push({ label: 'Blame at ' + hash.substring(0, 7), action: () => vscode.postMessage({ command: 'openBlame', filePath, hash }) });
|
|
1133
|
-
}
|
|
1134
|
-
items.push(
|
|
1135
|
-
{ label: 'File history', action: () => vscode.postMessage({ command: 'openFileHistory', filePath }) },
|
|
1136
|
-
{ separator: true },
|
|
1137
|
-
{ label: 'Open file', action: () => vscode.postMessage({ command: 'openFile', filePath }) },
|
|
1138
|
-
);
|
|
1139
|
-
renderContextMenu(x, y, items);
|
|
1140
|
-
}
|
|
1141
|
-
|
|
1142
|
-
document.getElementById('detail-panel').addEventListener('contextmenu', (e) => {
|
|
1143
|
-
const item = e.target.closest('.file-clickable');
|
|
1144
|
-
if (!item) return;
|
|
1145
|
-
e.preventDefault();
|
|
1146
|
-
e.stopPropagation();
|
|
1147
|
-
showFileContextMenu(e.clientX, e.clientY, item.dataset.path || item.dataset.file, item.dataset.hash);
|
|
1148
|
-
});
|
|
1149
|
-
|
|
1150
|
-
/* Touch has no right-click, and the detail panel re-renders on every selection,
|
|
1151
|
-
so the long-press is delegated rather than bound per row. */
|
|
1152
|
-
(function setupFileLongPress() {
|
|
1153
|
-
const panel = document.getElementById('detail-panel');
|
|
1154
|
-
let timer = null, startX = 0, startY = 0, target = null;
|
|
1155
|
-
panel.addEventListener('touchstart', (e) => {
|
|
1156
|
-
target = e.target.closest('.file-clickable');
|
|
1157
|
-
if (!target) return;
|
|
1158
|
-
startX = e.touches[0].clientX;
|
|
1159
|
-
startY = e.touches[0].clientY;
|
|
1160
|
-
timer = setTimeout(() => {
|
|
1161
|
-
e.preventDefault();
|
|
1162
|
-
showFileContextMenu(startX, startY, target.dataset.path || target.dataset.file, target.dataset.hash);
|
|
1163
|
-
target = null;
|
|
1164
|
-
}, 500);
|
|
1165
|
-
}, { passive: false });
|
|
1166
|
-
const cancel = () => { if (timer) { clearTimeout(timer); timer = null; } };
|
|
1167
|
-
panel.addEventListener('touchmove', (e) => {
|
|
1168
|
-
if (timer && (Math.abs(e.touches[0].clientX - startX) > 10 || Math.abs(e.touches[0].clientY - startY) > 10)) cancel();
|
|
1169
|
-
}, { passive: true });
|
|
1170
|
-
panel.addEventListener('touchend', cancel);
|
|
1171
|
-
panel.addEventListener('touchcancel', cancel);
|
|
1172
|
-
})();
|
|
1173
|
-
|
|
1174
|
-
// --- Branch dropdown ---
|
|
1175
|
-
let selectedBranch = 'all';
|
|
1176
|
-
const branchTrigger = document.getElementById('branch-trigger');
|
|
1177
|
-
const branchMenu = document.getElementById('branch-dropdown-menu');
|
|
1178
|
-
const branchFilterInput = document.getElementById('branch-filter');
|
|
1179
|
-
const branchListEl = document.getElementById('branch-list');
|
|
1180
|
-
|
|
1181
|
-
branchTrigger.addEventListener('click', (e) => {
|
|
1182
|
-
e.stopPropagation();
|
|
1183
|
-
const wasHidden = branchMenu.classList.contains('hidden');
|
|
1184
|
-
branchMenu.classList.toggle('hidden');
|
|
1185
|
-
if (wasHidden) {
|
|
1186
|
-
branchFilterInput.value = '';
|
|
1187
|
-
renderBranchOptions('');
|
|
1188
|
-
branchFilterInput.focus();
|
|
1189
|
-
}
|
|
1190
|
-
});
|
|
1191
|
-
|
|
1192
|
-
document.addEventListener('click', (e) => {
|
|
1193
|
-
if (!e.target.closest('#branch-selector')) branchMenu.classList.add('hidden');
|
|
1194
|
-
});
|
|
1195
|
-
|
|
1196
|
-
branchFilterInput.addEventListener('input', () => {
|
|
1197
|
-
renderBranchOptions(branchFilterInput.value.toLowerCase());
|
|
1198
|
-
});
|
|
1199
|
-
branchFilterInput.addEventListener('click', (e) => e.stopPropagation());
|
|
1200
|
-
|
|
1201
|
-
function renderBranchOptions(filter) {
|
|
1202
|
-
const options = [{ name: 'all', label: 'All Branches', current: false }];
|
|
1203
|
-
state.branches.forEach(b => {
|
|
1204
|
-
if (b.remote && !state.settings.showRemoteBranches) return;
|
|
1205
|
-
options.push({ name: b.name, label: (b.current ? '* ' : '') + b.name, current: b.current });
|
|
1206
|
-
});
|
|
1207
|
-
const filtered = filter ? options.filter(o => o.label.toLowerCase().includes(filter)) : options;
|
|
1208
|
-
branchListEl.innerHTML = filtered.map(o =>
|
|
1209
|
-
'<div class="branch-option' + (o.name === selectedBranch ? ' selected' : '') + '" data-branch="' + escHtml(o.name) + '">' + escHtml(o.label) + '</div>'
|
|
1210
|
-
).join('');
|
|
1211
|
-
}
|
|
1212
|
-
|
|
1213
|
-
branchListEl.addEventListener('click', (e) => {
|
|
1214
|
-
const opt = e.target.closest('.branch-option');
|
|
1215
|
-
if (!opt) return;
|
|
1216
|
-
const branch = opt.dataset.branch;
|
|
1217
|
-
selectedBranch = branch;
|
|
1218
|
-
branchTrigger.textContent = branch === 'all' ? 'All Branches' : branch;
|
|
1219
|
-
branchMenu.classList.add('hidden');
|
|
1220
|
-
state.commits = [];
|
|
1221
|
-
document.getElementById('commit-list').innerHTML = '';
|
|
1222
|
-
vscode.postMessage({ command: 'requestCommits', branch, maxCommits: state.maxCommits });
|
|
1223
|
-
});
|
|
1224
|
-
|
|
1225
|
-
function renderBranchSelector() {
|
|
1226
|
-
const branchNames = state.branches.map(b => b.name);
|
|
1227
|
-
if (selectedBranch !== 'all' && !branchNames.includes(selectedBranch)) selectedBranch = 'all';
|
|
1228
|
-
branchTrigger.textContent = selectedBranch === 'all' ? 'All Branches' : selectedBranch;
|
|
1229
|
-
}
|
|
1230
|
-
|
|
1231
|
-
// --- Refresh ---
|
|
1232
|
-
document.getElementById('btn-refresh').addEventListener('click', () => {
|
|
1233
|
-
state.commits = [];
|
|
1234
|
-
document.getElementById('commit-list').innerHTML = '';
|
|
1235
|
-
vscode.postMessage({ command: 'requestRepoInfo' });
|
|
1236
|
-
vscode.postMessage({ command: 'requestCommits', maxCommits: state.maxCommits });
|
|
1237
|
-
});
|
|
1238
|
-
|
|
1239
|
-
// --- Fetch ---
|
|
1240
|
-
const btnFetch = document.getElementById('btn-fetch');
|
|
1241
|
-
let fetchInProgress = false;
|
|
1242
|
-
let autoFetchTimer = null;
|
|
1243
|
-
|
|
1244
|
-
function doFetch() {
|
|
1245
|
-
fetchInProgress = true;
|
|
1246
|
-
btnFetch.classList.add('btn-fetching');
|
|
1247
|
-
btnFetch.title = 'Fetching...';
|
|
1248
|
-
vscode.postMessage({ command: 'gitAction', action: 'fetch', args: { prune: true } });
|
|
1249
|
-
}
|
|
1250
|
-
|
|
1251
|
-
btnFetch.addEventListener('click', () => { if (!fetchInProgress) doFetch(); });
|
|
1252
|
-
|
|
1253
|
-
function startAutoFetch(intervalSec) {
|
|
1254
|
-
stopAutoFetch();
|
|
1255
|
-
if (!intervalSec || intervalSec <= 0) return;
|
|
1256
|
-
const ms = Math.max(intervalSec, 10) * 1000;
|
|
1257
|
-
autoFetchTimer = setInterval(() => { if (!fetchInProgress) doFetch(); }, ms);
|
|
1258
|
-
}
|
|
1259
|
-
function stopAutoFetch() {
|
|
1260
|
-
if (autoFetchTimer) { clearInterval(autoFetchTimer); autoFetchTimer = null; }
|
|
1261
|
-
}
|
|
1262
|
-
|
|
1263
|
-
// --- Worktree popover ---
|
|
1264
|
-
const wtPopover = document.getElementById('worktree-popover');
|
|
1265
|
-
const btnWorktree = document.getElementById('btn-worktree');
|
|
1266
|
-
|
|
1267
|
-
btnWorktree.addEventListener('click', (e) => {
|
|
1268
|
-
e.stopPropagation();
|
|
1269
|
-
const wasHidden = wtPopover.classList.contains('hidden');
|
|
1270
|
-
wtPopover.classList.toggle('hidden');
|
|
1271
|
-
if (wasHidden) vscode.postMessage({ command: 'requestWorktrees' });
|
|
1272
|
-
});
|
|
1273
|
-
|
|
1274
|
-
document.addEventListener('click', (e) => {
|
|
1275
|
-
if (!e.target.closest('.worktree-dropdown')) wtPopover.classList.add('hidden');
|
|
1276
|
-
});
|
|
1277
|
-
|
|
1278
|
-
function renderWorktreeList() {
|
|
1279
|
-
const listEl = document.getElementById('worktree-list');
|
|
1280
|
-
const countEl = btnWorktree.querySelector('.wt-count');
|
|
1281
|
-
const wts = state.worktrees;
|
|
1282
|
-
if (countEl) {
|
|
1283
|
-
countEl.textContent = wts.length;
|
|
1284
|
-
countEl.style.display = wts.length > 1 ? '' : 'none';
|
|
1285
|
-
}
|
|
1286
|
-
if (!wts.length) {
|
|
1287
|
-
listEl.innerHTML = '<div class="wt-empty">No worktrees found</div>';
|
|
1288
|
-
return;
|
|
1289
|
-
}
|
|
1290
|
-
listEl.innerHTML = wts.map((wt, i) => {
|
|
1291
|
-
const branchName = wt.branch || (wt.isDetached ? 'detached HEAD' : '(bare)');
|
|
1292
|
-
const shortHash = wt.head ? wt.head.substring(0, 7) : '';
|
|
1293
|
-
const isCurrent = wt.path === state.repo;
|
|
1294
|
-
let badges = '';
|
|
1295
|
-
if (isCurrent) badges += ' <span class="wt-badge wt-badge-current">current</span>';
|
|
1296
|
-
if (wt.isMain && !isCurrent) badges += ' <span class="wt-badge">main</span>';
|
|
1297
|
-
if (wt.locked) badges += ' <span class="wt-badge wt-badge-locked">locked</span>';
|
|
1298
|
-
if (wt.prunable) badges += ' <span class="wt-badge">prunable</span>';
|
|
1299
|
-
if (wt.isDetached) badges += ' <span class="wt-badge">detached</span>';
|
|
1300
|
-
const actions = isCurrent ? ''
|
|
1301
|
-
: '<button class="wt-open" data-idx="' + i + '" title="Open in PPM">' + ICONS.fileOpen + '</button>'
|
|
1302
|
-
+ (wt.isMain ? '' : '<button class="wt-remove" data-idx="' + i + '" title="Remove worktree">' + ICONS.trash + '</button>');
|
|
1303
|
-
return '<div class="wt-item' + (isCurrent ? ' wt-item-active' : '') + '">'
|
|
1304
|
-
+ '<div class="wt-item-info">'
|
|
1305
|
-
+ '<div class="wt-item-branch">' + ICONS.gitBranch + ' ' + escHtml(branchName) + badges + '</div>'
|
|
1306
|
-
+ '<div class="wt-item-path" title="' + escHtml(wt.path) + '">' + escHtml(wt.path) + ' <span style="color:var(--subtle)">' + shortHash + '</span></div>'
|
|
1307
|
-
+ '</div>'
|
|
1308
|
-
+ (actions ? '<div class="wt-item-actions">' + actions + '</div>' : '')
|
|
1309
|
-
+ '</div>';
|
|
1310
|
-
}).join('');
|
|
1311
|
-
|
|
1312
|
-
// Bind action buttons
|
|
1313
|
-
listEl.querySelectorAll('.wt-open').forEach(btn => {
|
|
1314
|
-
btn.addEventListener('click', (e) => {
|
|
1315
|
-
e.stopPropagation();
|
|
1316
|
-
const wt = state.worktrees[parseInt(btn.dataset.idx)];
|
|
1317
|
-
if (wt) vscode.postMessage({ command: 'openWorktree', path: wt.path });
|
|
1318
|
-
});
|
|
1319
|
-
});
|
|
1320
|
-
listEl.querySelectorAll('.wt-remove').forEach(btn => {
|
|
1321
|
-
btn.addEventListener('click', (e) => {
|
|
1322
|
-
e.stopPropagation();
|
|
1323
|
-
const wt = state.worktrees[parseInt(btn.dataset.idx)];
|
|
1324
|
-
if (!wt) return;
|
|
1325
|
-
showDialog({
|
|
1326
|
-
title: 'Remove Worktree',
|
|
1327
|
-
message: 'Remove worktree at "' + wt.path + '"?',
|
|
1328
|
-
destructive: true,
|
|
1329
|
-
confirmLabel: 'Remove',
|
|
1330
|
-
onConfirm: () => vscode.postMessage({ command: 'removeWorktree', path: wt.path }),
|
|
1331
|
-
});
|
|
1332
|
-
});
|
|
1333
|
-
});
|
|
1334
|
-
}
|
|
1335
|
-
|
|
1336
|
-
/* --- Submodules ---
|
|
1337
|
-
The whole control stays hidden in the common case: most repositories have no
|
|
1338
|
-
submodules, and an always-visible empty dropdown is just noise in a toolbar
|
|
1339
|
-
that is already tight on a phone. */
|
|
1340
|
-
const smWrap = document.getElementById('submodule-wrap');
|
|
1341
|
-
const smPopover = document.getElementById('submodule-popover');
|
|
1342
|
-
document.getElementById('btn-submodule').addEventListener('click', (e) => {
|
|
1343
|
-
e.stopPropagation();
|
|
1344
|
-
smPopover.classList.toggle('hidden');
|
|
1345
|
-
if (!smPopover.classList.contains('hidden')) vscode.postMessage({ command: 'requestSubmodules' });
|
|
1346
|
-
});
|
|
1347
|
-
document.addEventListener('click', (e) => {
|
|
1348
|
-
if (!e.target.closest('.submodule-dropdown')) smPopover.classList.add('hidden');
|
|
1349
|
-
});
|
|
1350
|
-
|
|
1351
|
-
const SM_STATE_TEXT = {
|
|
1352
|
-
current: 'up to date',
|
|
1353
|
-
uninitialized: 'not checked out',
|
|
1354
|
-
modified: 'differs from the recorded commit',
|
|
1355
|
-
conflicted: 'has merge conflicts',
|
|
1356
|
-
};
|
|
1357
|
-
|
|
1358
|
-
function renderSubmoduleList() {
|
|
1359
|
-
const subs = state.submodules;
|
|
1360
|
-
smWrap.classList.toggle('hidden', subs.length === 0);
|
|
1361
|
-
if (!subs.length) { smPopover.classList.add('hidden'); return; }
|
|
1362
|
-
|
|
1363
|
-
const stale = subs.filter((sm) => sm.state !== 'current').length;
|
|
1364
|
-
const countEl = document.getElementById('btn-submodule').querySelector('.sm-count');
|
|
1365
|
-
if (countEl) {
|
|
1366
|
-
countEl.textContent = stale || subs.length;
|
|
1367
|
-
countEl.style.display = '';
|
|
1368
|
-
}
|
|
1369
|
-
|
|
1370
|
-
const listEl = document.getElementById('submodule-list');
|
|
1371
|
-
listEl.innerHTML = subs.map((sm, i) => {
|
|
1372
|
-
const badge = sm.state === 'current' ? ''
|
|
1373
|
-
: ' <span class="wt-badge sm-badge-' + escHtml(sm.state) + '">' + escHtml(sm.state) + '</span>';
|
|
1374
|
-
const name = sm.path.split('/').pop() || sm.path;
|
|
1375
|
-
return '<div class="wt-item">'
|
|
1376
|
-
+ '<div class="wt-item-info">'
|
|
1377
|
-
+ '<div class="wt-item-branch">' + escHtml(name) + badge + '</div>'
|
|
1378
|
-
+ '<div class="wt-item-path" title="' + escHtml(SM_STATE_TEXT[sm.state] || '') + '">'
|
|
1379
|
-
+ escHtml(sm.path) + ' <span style="color:var(--subtle)">' + escHtml(sm.hash.slice(0, 7)) + '</span>'
|
|
1380
|
-
+ (sm.describe ? ' ' + escHtml(sm.describe) : '')
|
|
1381
|
-
+ '</div>'
|
|
1382
|
-
+ '</div>'
|
|
1383
|
-
+ '<div class="wt-item-actions">'
|
|
1384
|
-
+ '<button class="sm-update" data-idx="' + i + '" title="Checkout the recorded commit">' + ICONS.download + '</button>'
|
|
1385
|
-
+ (sm.state === 'uninitialized' ? ''
|
|
1386
|
-
: '<button class="sm-open" data-idx="' + i + '" title="Open in PPM">' + ICONS.fileOpen + '</button>')
|
|
1387
|
-
+ '</div>'
|
|
1388
|
-
+ '</div>';
|
|
1389
|
-
}).join('');
|
|
1390
|
-
|
|
1391
|
-
listEl.querySelectorAll('.sm-update').forEach((btn) => {
|
|
1392
|
-
btn.addEventListener('click', (e) => {
|
|
1393
|
-
e.stopPropagation();
|
|
1394
|
-
const sm = state.submodules[parseInt(btn.dataset.idx)];
|
|
1395
|
-
if (sm) vscode.postMessage({ command: 'updateSubmodule', path: sm.path });
|
|
1396
|
-
});
|
|
1397
|
-
});
|
|
1398
|
-
listEl.querySelectorAll('.sm-open').forEach((btn) => {
|
|
1399
|
-
btn.addEventListener('click', (e) => {
|
|
1400
|
-
e.stopPropagation();
|
|
1401
|
-
const sm = state.submodules[parseInt(btn.dataset.idx)];
|
|
1402
|
-
if (sm) vscode.postMessage({ command: 'openSubmodule', path: sm.path });
|
|
1403
|
-
});
|
|
1404
|
-
});
|
|
1405
|
-
}
|
|
1406
|
-
|
|
1407
|
-
document.getElementById('sm-update-all').addEventListener('click', () => {
|
|
1408
|
-
showDialog({
|
|
1409
|
-
title: 'Update Submodules',
|
|
1410
|
-
message: 'Check out the recorded commit in every submodule? Local changes inside them are left alone, but the checkout moves.',
|
|
1411
|
-
confirmLabel: 'Update all',
|
|
1412
|
-
onConfirm: () => {
|
|
1413
|
-
for (const sm of state.submodules) vscode.postMessage({ command: 'updateSubmodule', path: sm.path });
|
|
1414
|
-
},
|
|
1415
|
-
});
|
|
1416
|
-
});
|
|
1417
|
-
|
|
1418
|
-
document.getElementById('wt-add').addEventListener('click', () => {
|
|
1419
|
-
showCreateWorktreeDialog();
|
|
1420
|
-
});
|
|
1421
|
-
|
|
1422
|
-
document.getElementById('wt-prune').addEventListener('click', () => {
|
|
1423
|
-
showDialog({
|
|
1424
|
-
title: 'Prune Worktrees',
|
|
1425
|
-
message: 'Remove stale worktree entries (worktrees whose directories no longer exist)?',
|
|
1426
|
-
confirmLabel: 'Prune',
|
|
1427
|
-
onConfirm: () => vscode.postMessage({ command: 'pruneWorktrees' }),
|
|
1428
|
-
});
|
|
1429
|
-
});
|
|
1430
|
-
|
|
1431
|
-
function showCreateWorktreeDialog(startPoint) {
|
|
1432
|
-
const overlay = document.createElement('div');
|
|
1433
|
-
overlay.className = 'dialog-overlay';
|
|
1434
|
-
const dialog = document.createElement('div');
|
|
1435
|
-
dialog.className = 'dialog';
|
|
1436
|
-
dialog.innerHTML = '<h3>Add Worktree</h3>'
|
|
1437
|
-
+ '<p style="font-size:12px;margin-bottom:8px">Path for the new worktree directory:</p>'
|
|
1438
|
-
+ '<input type="text" id="wt-dialog-path" placeholder="/path/to/worktree" style="width:100%;margin-bottom:8px" />'
|
|
1439
|
-
+ '<p style="font-size:12px;margin-bottom:4px">Branch:</p>'
|
|
1440
|
-
+ '<div style="display:flex;gap:8px;margin-bottom:6px">'
|
|
1441
|
-
+ '<label style="font-size:11px;display:flex;align-items:center;gap:4px"><input type="radio" name="wt-branch-mode" value="existing" checked /> Existing branch</label>'
|
|
1442
|
-
+ '<label style="font-size:11px;display:flex;align-items:center;gap:4px"><input type="radio" name="wt-branch-mode" value="new" /> New branch</label>'
|
|
1443
|
-
+ '</div>'
|
|
1444
|
-
+ '<input type="text" id="wt-dialog-branch" placeholder="Branch name" style="width:100%;margin-bottom:8px" />'
|
|
1445
|
-
+ (startPoint ? '<input type="hidden" id="wt-dialog-start" value="' + escHtml(startPoint) + '" />' : '<input type="text" id="wt-dialog-start" placeholder="Start point (commit/branch, optional)" style="width:100%;margin-bottom:8px" />');
|
|
1446
|
-
|
|
1447
|
-
const actions = document.createElement('div');
|
|
1448
|
-
actions.className = 'dialog-actions';
|
|
1449
|
-
const cancelBtn = document.createElement('button');
|
|
1450
|
-
cancelBtn.textContent = 'Cancel';
|
|
1451
|
-
cancelBtn.className = 'secondary';
|
|
1452
|
-
cancelBtn.addEventListener('click', () => overlay.remove());
|
|
1453
|
-
const confirmBtn = document.createElement('button');
|
|
1454
|
-
confirmBtn.textContent = 'Create';
|
|
1455
|
-
confirmBtn.className = 'btn-primary';
|
|
1456
|
-
confirmBtn.addEventListener('click', () => {
|
|
1457
|
-
const path = dialog.querySelector('#wt-dialog-path').value.trim();
|
|
1458
|
-
if (!path) { showToast('Path is required', 'error'); return; }
|
|
1459
|
-
const branch = dialog.querySelector('#wt-dialog-branch').value.trim();
|
|
1460
|
-
const mode = dialog.querySelector('input[name="wt-branch-mode"]:checked').value;
|
|
1461
|
-
const sp = dialog.querySelector('#wt-dialog-start');
|
|
1462
|
-
const startPt = sp ? sp.value.trim() : '';
|
|
1463
|
-
const msg = { command: 'addWorktree', path };
|
|
1464
|
-
if (mode === 'new' && branch) { msg.newBranch = branch; }
|
|
1465
|
-
else if (branch) { msg.branch = branch; }
|
|
1466
|
-
if (startPt) msg.startPoint = startPt;
|
|
1467
|
-
vscode.postMessage(msg);
|
|
1468
|
-
overlay.remove();
|
|
1469
|
-
});
|
|
1470
|
-
actions.appendChild(cancelBtn);
|
|
1471
|
-
actions.appendChild(confirmBtn);
|
|
1472
|
-
dialog.appendChild(actions);
|
|
1473
|
-
overlay.appendChild(dialog);
|
|
1474
|
-
document.body.appendChild(overlay);
|
|
1475
|
-
setTimeout(() => dialog.querySelector('#wt-dialog-path').focus(), 50);
|
|
1476
|
-
overlay.addEventListener('keydown', (e) => {
|
|
1477
|
-
if (e.key === 'Escape') overlay.remove();
|
|
1478
|
-
if (e.key === 'Enter') confirmBtn.click();
|
|
1479
|
-
});
|
|
1480
|
-
}
|
|
1481
|
-
|
|
1482
|
-
// --- Merge/rebase banner ---
|
|
1483
|
-
function renderMergeBanner() {
|
|
1484
|
-
let banner = document.getElementById('merge-banner');
|
|
1485
|
-
if (!state.mergeState) {
|
|
1486
|
-
if (banner) banner.remove();
|
|
1487
|
-
return;
|
|
1488
|
-
}
|
|
1489
|
-
const ms = state.mergeState;
|
|
1490
|
-
const typeLabel = ms.type === 'cherry-pick' ? 'Cherry-pick' : ms.type.charAt(0).toUpperCase() + ms.type.slice(1);
|
|
1491
|
-
const progressText = ms.progress ? ' (' + ms.progress + ')' : '';
|
|
1492
|
-
const msgText = ms.message ? ' — ' + escHtml(ms.message) : '';
|
|
1493
|
-
|
|
1494
|
-
let buttonsHtml = '';
|
|
1495
|
-
if (ms.type === 'rebase') {
|
|
1496
|
-
buttonsHtml = '<button class="btn-sm btn-continue" data-merge-action="rebaseContinue">Continue</button>'
|
|
1497
|
-
+ '<button class="btn-sm" data-merge-action="rebaseSkip">Skip</button>'
|
|
1498
|
-
+ '<button class="btn-sm btn-abort" data-merge-action="rebaseAbort">Abort</button>';
|
|
1499
|
-
} else if (ms.type === 'merge') {
|
|
1500
|
-
buttonsHtml = '<button class="btn-sm btn-abort" data-merge-action="mergeAbort">Abort</button>';
|
|
1501
|
-
} else if (ms.type === 'cherry-pick') {
|
|
1502
|
-
buttonsHtml = '<button class="btn-sm btn-continue" data-merge-action="cherryPickContinue">Continue</button>'
|
|
1503
|
-
+ '<button class="btn-sm btn-abort" data-merge-action="cherryPickAbort">Abort</button>';
|
|
1504
|
-
}
|
|
1505
|
-
|
|
1506
|
-
if (!banner) {
|
|
1507
|
-
banner = document.createElement('div');
|
|
1508
|
-
banner.id = 'merge-banner';
|
|
1509
|
-
banner.className = 'merge-banner';
|
|
1510
|
-
const toolbar = document.getElementById('toolbar');
|
|
1511
|
-
toolbar.parentNode.insertBefore(banner, toolbar.nextSibling);
|
|
1512
|
-
}
|
|
1513
|
-
banner.innerHTML = '<span class="banner-icon">⚠</span>'
|
|
1514
|
-
+ '<span class="banner-text"><strong>' + typeLabel + ' in progress' + progressText + '</strong>' + msgText + '</span>'
|
|
1515
|
-
+ '<div class="banner-actions">' + buttonsHtml + '</div>';
|
|
1516
|
-
|
|
1517
|
-
banner.querySelectorAll('[data-merge-action]').forEach(btn => {
|
|
1518
|
-
btn.addEventListener('click', () => {
|
|
1519
|
-
const action = btn.dataset.mergeAction;
|
|
1520
|
-
if (action.includes('Abort')) {
|
|
1521
|
-
showDialog({
|
|
1522
|
-
title: 'Abort ' + typeLabel,
|
|
1523
|
-
message: 'Abort the current ' + ms.type + '? Any resolved conflicts will be lost.',
|
|
1524
|
-
destructive: true,
|
|
1525
|
-
confirmLabel: 'Abort',
|
|
1526
|
-
onConfirm: () => gitAction(action, {}),
|
|
1527
|
-
});
|
|
1528
|
-
} else {
|
|
1529
|
-
gitAction(action, {});
|
|
1530
|
-
}
|
|
1531
|
-
});
|
|
1532
|
-
});
|
|
1533
|
-
}
|
|
1534
|
-
|
|
1535
|
-
// --- Stash popover ---
|
|
1536
|
-
const btnStash = document.getElementById('btn-stash');
|
|
1537
|
-
const stashPopover = document.getElementById('stash-popover');
|
|
1538
|
-
|
|
1539
|
-
btnStash.addEventListener('click', (e) => {
|
|
1540
|
-
e.stopPropagation();
|
|
1541
|
-
const wasHidden = stashPopover.classList.contains('hidden');
|
|
1542
|
-
stashPopover.classList.toggle('hidden');
|
|
1543
|
-
if (wasHidden) vscode.postMessage({ command: 'requestStashes' });
|
|
1544
|
-
});
|
|
1545
|
-
|
|
1546
|
-
document.addEventListener('click', (e) => {
|
|
1547
|
-
if (!e.target.closest('.stash-dropdown')) stashPopover.classList.add('hidden');
|
|
1548
|
-
});
|
|
1549
|
-
|
|
1550
|
-
function renderStashList() {
|
|
1551
|
-
const listEl = document.getElementById('stash-list');
|
|
1552
|
-
const countEl = btnStash.querySelector('.stash-count');
|
|
1553
|
-
const stashes = state.stashes;
|
|
1554
|
-
if (countEl) {
|
|
1555
|
-
countEl.textContent = stashes.length;
|
|
1556
|
-
countEl.style.display = stashes.length > 0 ? '' : 'none';
|
|
1557
|
-
}
|
|
1558
|
-
if (!stashes.length) {
|
|
1559
|
-
listEl.innerHTML = '<div class="stash-empty">No stashes</div>';
|
|
1560
|
-
return;
|
|
1561
|
-
}
|
|
1562
|
-
listEl.innerHTML = stashes.map((s, i) => {
|
|
1563
|
-
const ref = 'stash@{' + s.index + '}';
|
|
1564
|
-
return '<div class="stash-item">'
|
|
1565
|
-
+ '<div class="stash-item-info">'
|
|
1566
|
-
+ '<div class="stash-item-ref">' + escHtml(ref) + '</div>'
|
|
1567
|
-
+ '<div class="stash-item-msg" title="' + escHtml(s.message) + '">' + escHtml(s.message) + '</div>'
|
|
1568
|
-
+ '</div>'
|
|
1569
|
-
+ '<div class="stash-item-actions">'
|
|
1570
|
-
+ '<button class="stash-apply btn-sm" data-idx="' + i + '" title="Apply (keep stash)">Apply</button>'
|
|
1571
|
-
+ '<button class="stash-pop btn-sm" data-idx="' + i + '" title="Pop (apply & remove)">Pop</button>'
|
|
1572
|
-
+ '<button class="stash-drop btn-sm" data-idx="' + i + '" title="Drop (delete)">Drop</button>'
|
|
1573
|
-
+ '</div>'
|
|
1574
|
-
+ '</div>';
|
|
1575
|
-
}).join('');
|
|
1576
|
-
|
|
1577
|
-
listEl.querySelectorAll('.stash-apply').forEach(btn => {
|
|
1578
|
-
btn.addEventListener('click', (e) => {
|
|
1579
|
-
e.stopPropagation();
|
|
1580
|
-
const s = state.stashes[parseInt(btn.dataset.idx)];
|
|
1581
|
-
if (s) gitAction('stashApply', { stashRef: 'stash@{' + s.index + '}' });
|
|
1582
|
-
});
|
|
1583
|
-
});
|
|
1584
|
-
listEl.querySelectorAll('.stash-pop').forEach(btn => {
|
|
1585
|
-
btn.addEventListener('click', (e) => {
|
|
1586
|
-
e.stopPropagation();
|
|
1587
|
-
const s = state.stashes[parseInt(btn.dataset.idx)];
|
|
1588
|
-
if (s) gitAction('stashPop', { stashRef: 'stash@{' + s.index + '}' });
|
|
1589
|
-
});
|
|
1590
|
-
});
|
|
1591
|
-
listEl.querySelectorAll('.stash-drop').forEach(btn => {
|
|
1592
|
-
btn.addEventListener('click', (e) => {
|
|
1593
|
-
e.stopPropagation();
|
|
1594
|
-
const s = state.stashes[parseInt(btn.dataset.idx)];
|
|
1595
|
-
if (!s) return;
|
|
1596
|
-
showDialog({
|
|
1597
|
-
title: 'Drop Stash',
|
|
1598
|
-
message: 'Delete stash@{' + s.index + '}? This cannot be undone.',
|
|
1599
|
-
destructive: true,
|
|
1600
|
-
confirmLabel: 'Drop',
|
|
1601
|
-
onConfirm: () => gitAction('stashDrop', { stashRef: 'stash@{' + s.index + '}' }),
|
|
1602
|
-
});
|
|
1603
|
-
});
|
|
1604
|
-
});
|
|
1605
|
-
}
|
|
1606
|
-
|
|
1607
|
-
document.getElementById('stash-save').addEventListener('click', () => {
|
|
1608
|
-
showDialog({
|
|
1609
|
-
title: 'Stash Changes',
|
|
1610
|
-
input: { placeholder: 'Stash message (optional)' },
|
|
1611
|
-
confirmLabel: 'Stash',
|
|
1612
|
-
onConfirm: (msg) => gitAction('stashSave', msg ? { message: msg } : {}),
|
|
1613
|
-
});
|
|
1614
|
-
});
|
|
1615
|
-
|
|
1616
|
-
// --- Graph column resize ---
|
|
1617
|
-
{
|
|
1618
|
-
const resizeHandle = document.getElementById('graph-resize-handle');
|
|
1619
|
-
let resizing = false, startX = 0, startW = 0;
|
|
1620
|
-
resizeHandle.addEventListener('pointerdown', (e) => {
|
|
1621
|
-
e.preventDefault();
|
|
1622
|
-
resizing = true;
|
|
1623
|
-
startX = e.clientX;
|
|
1624
|
-
startW = document.querySelector('.col-graph').offsetWidth;
|
|
1625
|
-
resizeHandle.classList.add('dragging');
|
|
1626
|
-
resizeHandle.setPointerCapture(e.pointerId);
|
|
1627
|
-
});
|
|
1628
|
-
// Both ends of the drag go through the same cap the automatic width uses: a
|
|
1629
|
-
// hand-dragged column wider than the panel is the bug this whole path is
|
|
1630
|
-
// about, and a ceiling of its own would also be a ceiling the automatic width
|
|
1631
|
-
// could exceed and the drag could then never restore.
|
|
1632
|
-
const dragTo = (e) => {
|
|
1633
|
-
state.graphColWidth = Math.max(GRAPH_MIN_W, startW + e.clientX - startX);
|
|
1634
|
-
applyGraphColWidth();
|
|
1635
|
-
};
|
|
1636
|
-
resizeHandle.addEventListener('pointermove', (e) => { if (resizing) dragTo(e); });
|
|
1637
|
-
resizeHandle.addEventListener('pointerup', (e) => {
|
|
1638
|
-
if (!resizing) return;
|
|
1639
|
-
resizing = false;
|
|
1640
|
-
resizeHandle.classList.remove('dragging');
|
|
1641
|
-
dragTo(e);
|
|
1642
|
-
});
|
|
1643
|
-
resizeHandle.addEventListener('dblclick', () => {
|
|
1644
|
-
state.graphColWidth = null;
|
|
1645
|
-
applyGraphColWidth();
|
|
1646
|
-
});
|
|
1647
|
-
}
|
|
1648
|
-
|
|
1649
|
-
// --- Panning the graph inside its column ---
|
|
1650
|
-
{
|
|
1651
|
-
const list = document.getElementById('commit-list');
|
|
1652
|
-
let tracking = false, panned = false, startX = 0, startY = 0, startPan = 0, pointerId = null;
|
|
1653
|
-
|
|
1654
|
-
list.addEventListener('pointerdown', (e) => {
|
|
1655
|
-
if (e.button !== 0 || !e.target.closest || !e.target.closest('.col-graph')) return;
|
|
1656
|
-
if (graphPanMax() <= 0) return;
|
|
1657
|
-
tracking = true;
|
|
1658
|
-
panned = false;
|
|
1659
|
-
startX = e.clientX;
|
|
1660
|
-
startY = e.clientY;
|
|
1661
|
-
startPan = state.graphPanX;
|
|
1662
|
-
pointerId = e.pointerId;
|
|
1663
|
-
});
|
|
1664
|
-
|
|
1665
|
-
list.addEventListener('pointermove', (e) => {
|
|
1666
|
-
if (!tracking) return;
|
|
1667
|
-
const dx = e.clientX - startX;
|
|
1668
|
-
if (!panned) {
|
|
1669
|
-
// Sideways and past the slop before this is a pan: anything else is the
|
|
1670
|
-
// press that selects a commit, or the finger that scrolls the list —
|
|
1671
|
-
// .col-graph is touch-action: pan-y so the browser keeps that one.
|
|
1672
|
-
if (Math.abs(dx) < 4 || Math.abs(dx) <= Math.abs(e.clientY - startY)) return;
|
|
1673
|
-
panned = true;
|
|
1674
|
-
list.setPointerCapture(pointerId);
|
|
1675
|
-
document.documentElement.classList.add('graph-panning');
|
|
1676
|
-
showPanHint(true);
|
|
1677
|
-
}
|
|
1678
|
-
state.graphPanX = startPan - dx;
|
|
1679
|
-
applyGraphPan();
|
|
1680
|
-
});
|
|
1681
|
-
|
|
1682
|
-
const endPan = () => {
|
|
1683
|
-
if (!tracking) return;
|
|
1684
|
-
tracking = false;
|
|
1685
|
-
if (!panned) return;
|
|
1686
|
-
try { list.releasePointerCapture(pointerId); } catch (err) { /* already released */ }
|
|
1687
|
-
document.documentElement.classList.remove('graph-panning');
|
|
1688
|
-
showPanHint(false);
|
|
1689
|
-
};
|
|
1690
|
-
list.addEventListener('pointerup', endPan);
|
|
1691
|
-
list.addEventListener('pointercancel', endPan);
|
|
1692
|
-
// A drag is not a click. Captured on the way down, because the row's own
|
|
1693
|
-
// handler would otherwise open the commit the pan happened to end on.
|
|
1694
|
-
list.addEventListener('click', (e) => {
|
|
1695
|
-
if (!panned) return;
|
|
1696
|
-
panned = false;
|
|
1697
|
-
e.stopPropagation();
|
|
1698
|
-
e.preventDefault();
|
|
1699
|
-
}, true);
|
|
1700
|
-
|
|
1701
|
-
// A trackpad's sideways gesture and shift+wheel, over the list itself. The
|
|
1702
|
-
// overlay cannot take these: it is pointer-events: none so that a click lands
|
|
1703
|
-
// on the row underneath it.
|
|
1704
|
-
document.getElementById('graph-container').addEventListener('wheel', (e) => {
|
|
1705
|
-
const dx = e.shiftKey ? e.deltaY : e.deltaX;
|
|
1706
|
-
if (!dx || (!e.shiftKey && Math.abs(e.deltaX) <= Math.abs(e.deltaY))) return;
|
|
1707
|
-
const before = state.graphPanX;
|
|
1708
|
-
panGraphBy(dx);
|
|
1709
|
-
if (state.graphPanX !== before) e.preventDefault();
|
|
1710
|
-
}, { passive: false });
|
|
1711
|
-
// The cap is a share of the panel's width, so it is only right until the
|
|
1712
|
-
// panel changes size — and nothing re-renders the graph when a window is
|
|
1713
|
-
// dragged or a sibling panel opens.
|
|
1714
|
-
if (typeof ResizeObserver === 'function') {
|
|
1715
|
-
new ResizeObserver(() => applyGraphColWidth()).observe(document.getElementById('graph-container'));
|
|
1716
|
-
}
|
|
1717
|
-
}
|
|
1718
|
-
|
|
1719
|
-
// --- Columns the reader chose to see ---
|
|
1720
|
-
function applyColumnVisibility() {
|
|
1721
|
-
const root = document.documentElement;
|
|
1722
|
-
OPTIONAL_COLUMNS.forEach((col) => {
|
|
1723
|
-
root.classList.toggle(col.cls, state.settings[col.key] === false);
|
|
1724
|
-
});
|
|
1725
|
-
// Hiding a column hands its width to the graph, and no resize fires for it.
|
|
1726
|
-
applyGraphColWidth();
|
|
1727
|
-
}
|
|
1728
|
-
|
|
1729
|
-
/**
|
|
1730
|
-
* Whether a column is hidden by the panel's width whatever the setting says.
|
|
1731
|
-
* The menu marks those rather than hiding them, so that a tick doing nothing is
|
|
1732
|
-
* never the only explanation on offer.
|
|
1733
|
-
*/
|
|
1734
|
-
function columnBlockedByWidth(key) {
|
|
1735
|
-
if (typeof window.matchMedia !== 'function') return false;
|
|
1736
|
-
if (key === 'colDate' || key === 'colHash') return window.matchMedia('(max-width: 900px)').matches;
|
|
1737
|
-
if (key === 'colChanges') return window.matchMedia('(max-width: 760px)').matches;
|
|
1738
|
-
return false;
|
|
1739
|
-
}
|
|
1740
|
-
|
|
1741
|
-
function setColumnVisible(key, visible) {
|
|
1742
|
-
state.settings[key] = visible;
|
|
1743
|
-
vscode.postMessage({ command: 'updateSetting', key, value: visible });
|
|
1744
|
-
applyColumnVisibility();
|
|
1745
|
-
const box = document.getElementById('s-' + key);
|
|
1746
|
-
if (box) box.checked = visible;
|
|
1747
|
-
}
|
|
1748
|
-
|
|
1749
|
-
function showColumnMenu(x, y) {
|
|
1750
|
-
renderContextMenu(x, y, OPTIONAL_COLUMNS.map((col) => ({
|
|
1751
|
-
label: col.label + (columnBlockedByWidth(col.key) ? ' — needs a wider panel' : ''),
|
|
1752
|
-
checked: state.settings[col.key] !== false,
|
|
1753
|
-
disabled: columnBlockedByWidth(col.key),
|
|
1754
|
-
action: () => setColumnVisible(col.key, state.settings[col.key] === false),
|
|
1755
|
-
})));
|
|
1756
|
-
}
|
|
1757
|
-
|
|
1758
|
-
{
|
|
1759
|
-
const header = document.getElementById('graph-header');
|
|
1760
|
-
header.addEventListener('contextmenu', (e) => {
|
|
1761
|
-
e.preventDefault();
|
|
1762
|
-
showColumnMenu(e.clientX, e.clientY);
|
|
1763
|
-
});
|
|
1764
|
-
setupLongPress(header, (x, y) => showColumnMenu(x, y));
|
|
1765
|
-
}
|
|
1766
|
-
|
|
1767
|
-
// --- Graph rendering (faithful port of vscode-git-graph graph.ts) ---
|
|
1768
|
-
|
|
1769
|
-
class GBranch {
|
|
1770
|
-
constructor(colour, isStash) {
|
|
1771
|
-
this._colour = colour;
|
|
1772
|
-
this._isStash = !!isStash;
|
|
1773
|
-
this._end = 0;
|
|
1774
|
-
this._lines = [];
|
|
1775
|
-
this._numUncommitted = 0;
|
|
1776
|
-
}
|
|
1777
|
-
addLine(p1, p2, isCommitted, lockedFirst) {
|
|
1778
|
-
this._lines.push({ p1, p2, lockedFirst });
|
|
1779
|
-
if (isCommitted) {
|
|
1780
|
-
if (p2.x === 0 && p2.y < this._numUncommitted) this._numUncommitted = p2.y;
|
|
1781
|
-
} else {
|
|
1782
|
-
this._numUncommitted++;
|
|
1783
|
-
}
|
|
1784
|
-
}
|
|
1785
|
-
getColour() { return this._colour; }
|
|
1786
|
-
getEnd() { return this._end; }
|
|
1787
|
-
setEnd(end) { this._end = end; }
|
|
1788
|
-
|
|
1789
|
-
draw(svg, config, expandAt) {
|
|
1790
|
-
const colour = this._isStash ? '#808080' : config.colours[this._colour % config.colours.length];
|
|
1791
|
-
const d = config.grid.y * (config.style === 'angular' ? 0.38 : 0.8);
|
|
1792
|
-
const pxLines = [];
|
|
1793
|
-
let curPath = '';
|
|
1794
|
-
|
|
1795
|
-
for (let i = 0; i < this._lines.length; i++) {
|
|
1796
|
-
const ln = this._lines[i];
|
|
1797
|
-
let x1 = ln.p1.x * config.grid.x + config.grid.offsetX;
|
|
1798
|
-
let y1 = ln.p1.y * config.grid.y + config.grid.offsetY;
|
|
1799
|
-
let x2 = ln.p2.x * config.grid.x + config.grid.offsetX;
|
|
1800
|
-
let y2 = ln.p2.y * config.grid.y + config.grid.offsetY;
|
|
1801
|
-
|
|
1802
|
-
if (expandAt > -1) {
|
|
1803
|
-
if (ln.p1.y > expandAt) {
|
|
1804
|
-
y1 += config.grid.expandY; y2 += config.grid.expandY;
|
|
1805
|
-
} else if (ln.p2.y > expandAt) {
|
|
1806
|
-
if (x1 === x2) {
|
|
1807
|
-
y2 += config.grid.expandY;
|
|
1808
|
-
} else if (ln.lockedFirst) {
|
|
1809
|
-
pxLines.push({ p1: { x: x1, y: y1 }, p2: { x: x2, y: y2 }, isC: i >= this._numUncommitted, lf: ln.lockedFirst });
|
|
1810
|
-
pxLines.push({ p1: { x: x2, y: y1 + config.grid.y }, p2: { x: x2, y: y2 + config.grid.expandY }, isC: i >= this._numUncommitted, lf: ln.lockedFirst });
|
|
1811
|
-
continue;
|
|
1812
|
-
} else {
|
|
1813
|
-
pxLines.push({ p1: { x: x1, y: y1 }, p2: { x: x1, y: y2 - config.grid.y + config.grid.expandY }, isC: i >= this._numUncommitted, lf: ln.lockedFirst });
|
|
1814
|
-
y1 += config.grid.expandY; y2 += config.grid.expandY;
|
|
1815
|
-
}
|
|
1816
|
-
}
|
|
1817
|
-
}
|
|
1818
|
-
pxLines.push({ p1: { x: x1, y: y1 }, p2: { x: x2, y: y2 }, isC: i >= this._numUncommitted, lf: ln.lockedFirst });
|
|
1819
|
-
}
|
|
1820
|
-
|
|
1821
|
-
// Simplify consecutive vertical segments
|
|
1822
|
-
let si = 0;
|
|
1823
|
-
while (si < pxLines.length - 1) {
|
|
1824
|
-
const a = pxLines[si], b = pxLines[si + 1];
|
|
1825
|
-
if (a.p1.x === a.p2.x && a.p2.x === b.p1.x && b.p1.x === b.p2.x && a.p2.y === b.p1.y && a.isC === b.isC) {
|
|
1826
|
-
a.p2.y = b.p2.y;
|
|
1827
|
-
pxLines.splice(si + 1, 1);
|
|
1828
|
-
} else { si++; }
|
|
1829
|
-
}
|
|
1830
|
-
|
|
1831
|
-
// Build SVG paths
|
|
1832
|
-
for (let i = 0; i < pxLines.length; i++) {
|
|
1833
|
-
const pl = pxLines[i];
|
|
1834
|
-
const x1 = pl.p1.x, y1 = pl.p1.y, x2 = pl.p2.x, y2 = pl.p2.y;
|
|
1835
|
-
|
|
1836
|
-
if (curPath !== '' && i > 0 && pl.isC !== pxLines[i - 1].isC) {
|
|
1837
|
-
GBranch._drawPath(svg, curPath, pxLines[i - 1].isC, colour);
|
|
1838
|
-
curPath = '';
|
|
1839
|
-
}
|
|
1840
|
-
if (curPath === '' || (i > 0 && (x1 !== pxLines[i - 1].p2.x || y1 !== pxLines[i - 1].p2.y))) {
|
|
1841
|
-
curPath += 'M' + x1.toFixed(0) + ',' + y1.toFixed(1);
|
|
1842
|
-
}
|
|
1843
|
-
if (x1 === x2) {
|
|
1844
|
-
curPath += 'L' + x2.toFixed(0) + ',' + y2.toFixed(1);
|
|
1845
|
-
} else if (config.style === 'angular') {
|
|
1846
|
-
curPath += 'L' + (pl.lf ? (x2.toFixed(0) + ',' + (y2 - d).toFixed(1)) : (x1.toFixed(0) + ',' + (y1 + d).toFixed(1))) + 'L' + x2.toFixed(0) + ',' + y2.toFixed(1);
|
|
1847
|
-
} else {
|
|
1848
|
-
curPath += 'C' + x1.toFixed(0) + ',' + (y1 + d).toFixed(1) + ' ' + x2.toFixed(0) + ',' + (y2 - d).toFixed(1) + ' ' + x2.toFixed(0) + ',' + y2.toFixed(1);
|
|
1849
|
-
}
|
|
1850
|
-
}
|
|
1851
|
-
if (curPath !== '') GBranch._drawPath(svg, curPath, pxLines[pxLines.length - 1].isC, colour);
|
|
1852
|
-
}
|
|
1853
|
-
|
|
1854
|
-
static _drawPath(svg, path, isCommitted, colour) {
|
|
1855
|
-
const line = document.createElementNS(SVG_NS, 'path');
|
|
1856
|
-
line.setAttribute('class', 'line');
|
|
1857
|
-
line.setAttribute('d', path);
|
|
1858
|
-
line.setAttribute('stroke', isCommitted ? colour : '#808080');
|
|
1859
|
-
if (!isCommitted) line.setAttribute('stroke-dasharray', '2');
|
|
1860
|
-
svg.appendChild(line);
|
|
1861
|
-
}
|
|
1862
|
-
}
|
|
1863
|
-
|
|
1864
|
-
class GVertex {
|
|
1865
|
-
constructor(id, isStash, author) {
|
|
1866
|
-
this.id = id;
|
|
1867
|
-
this.isStash = isStash;
|
|
1868
|
-
/** {name, email} of the commit's author, or null for a row that has none. */
|
|
1869
|
-
this._author = author || null;
|
|
1870
|
-
this._x = 0;
|
|
1871
|
-
this._children = [];
|
|
1872
|
-
this._parents = [];
|
|
1873
|
-
this._nextParent = 0;
|
|
1874
|
-
this._onBranch = null;
|
|
1875
|
-
this._isCommitted = true;
|
|
1876
|
-
this._isCurrent = false;
|
|
1877
|
-
this._nextX = 0;
|
|
1878
|
-
this._connections = [];
|
|
1879
|
-
}
|
|
1880
|
-
addChild(v) { this._children.push(v); }
|
|
1881
|
-
getChildren() { return this._children; }
|
|
1882
|
-
addParent(v) { this._parents.push(v); }
|
|
1883
|
-
getParents() { return this._parents; }
|
|
1884
|
-
hasParents() { return this._parents.length > 0; }
|
|
1885
|
-
getNextParent() { return this._nextParent < this._parents.length ? this._parents[this._nextParent] : null; }
|
|
1886
|
-
registerParentProcessed() { this._nextParent++; }
|
|
1887
|
-
isMerge() { return this._parents.length > 1; }
|
|
1888
|
-
|
|
1889
|
-
addToBranch(branch, x) { if (this._onBranch === null) { this._onBranch = branch; this._x = x; } }
|
|
1890
|
-
isNotOnBranch() { return this._onBranch === null; }
|
|
1891
|
-
isOnThisBranch(branch) { return this._onBranch === branch; }
|
|
1892
|
-
getBranch() { return this._onBranch; }
|
|
1893
|
-
|
|
1894
|
-
getPoint() { return { x: this._x, y: this.id }; }
|
|
1895
|
-
getNextPoint() { return { x: this._nextX, y: this.id }; }
|
|
1896
|
-
|
|
1897
|
-
getPointConnectingTo(vertex, onBranch) {
|
|
1898
|
-
for (let i = 0; i < this._connections.length; i++) {
|
|
1899
|
-
if (this._connections[i].connectsTo === vertex && this._connections[i].onBranch === onBranch) return { x: i, y: this.id };
|
|
1900
|
-
}
|
|
1901
|
-
return null;
|
|
1902
|
-
}
|
|
1903
|
-
registerUnavailablePoint(x, connectsTo, onBranch) {
|
|
1904
|
-
if (x === this._nextX) { this._nextX = x + 1; this._connections[x] = { connectsTo, onBranch }; }
|
|
1905
|
-
}
|
|
1906
|
-
|
|
1907
|
-
getColour() { return this._onBranch !== null ? this._onBranch.getColour() : 0; }
|
|
1908
|
-
getIsCommitted() { return this._isCommitted; }
|
|
1909
|
-
setNotCommitted() { this._isCommitted = false; }
|
|
1910
|
-
setCurrent() { this._isCurrent = true; }
|
|
1911
|
-
|
|
1912
|
-
/*
|
|
1913
|
-
* The node is the author's avatar, ringed in the lane's colour — which is
|
|
1914
|
-
* what makes a graph readable as *who* rather than as a column of identical
|
|
1915
|
-
* dots. Initials, never a fetched image: an avatar service would mean handing
|
|
1916
|
-
* every committer's email address to a third party, which a self-hosted tool
|
|
1917
|
-
* must not do quietly.
|
|
1918
|
-
*
|
|
1919
|
-
* Rows with no author — uncommitted changes, a stash — keep a plain dot,
|
|
1920
|
-
* because inventing initials for them would be a lie.
|
|
1921
|
-
*/
|
|
1922
|
-
draw(svg, config, expandOffset, overListener, outListener) {
|
|
1923
|
-
if (this._onBranch === null) return;
|
|
1924
|
-
const STASH_COLOR = '#808080';
|
|
1925
|
-
const colour = this.isStash ? STASH_COLOR
|
|
1926
|
-
: this._isCommitted ? config.colours[this._onBranch.getColour() % config.colours.length] : '#808080';
|
|
1927
|
-
const cx = (this._x * config.grid.x + config.grid.offsetX).toString();
|
|
1928
|
-
const cy = (this.id * config.grid.y + config.grid.offsetY + (expandOffset ? config.grid.expandY : 0)).toString();
|
|
1929
|
-
const named = this._isCommitted && !this.isStash && !!this._author && !!this._author.name;
|
|
1930
|
-
const r = named ? (config.nodeR || 9) : 4.5;
|
|
1931
|
-
|
|
1932
|
-
const circle = document.createElementNS(SVG_NS, 'circle');
|
|
1933
|
-
circle.dataset.id = this.id.toString();
|
|
1934
|
-
circle.dataset.r = r.toString();
|
|
1935
|
-
circle.setAttribute('cx', cx);
|
|
1936
|
-
circle.setAttribute('cy', cy);
|
|
1937
|
-
circle.setAttribute('r', r.toString());
|
|
1938
|
-
circle.setAttribute('stroke', colour);
|
|
1939
|
-
circle.setAttribute('stroke-width', named ? '2' : '0');
|
|
1940
|
-
circle.setAttribute('fill', named ? authorColor(this._author.email || this._author.name) : colour);
|
|
1941
|
-
if (this._isCurrent) circle.setAttribute('class', 'graphCurrent');
|
|
1942
|
-
svg.appendChild(circle);
|
|
1943
|
-
|
|
1944
|
-
if (named) {
|
|
1945
|
-
const label = document.createElementNS(SVG_NS, 'text');
|
|
1946
|
-
label.setAttribute('class', 'node-initials');
|
|
1947
|
-
label.setAttribute('x', cx);
|
|
1948
|
-
label.setAttribute('y', cy);
|
|
1949
|
-
label.setAttribute('text-anchor', 'middle');
|
|
1950
|
-
label.setAttribute('dominant-baseline', 'central');
|
|
1951
|
-
label.textContent = authorInitials(this._author.name);
|
|
1952
|
-
svg.appendChild(label);
|
|
1953
|
-
}
|
|
1954
|
-
|
|
1955
|
-
circle.addEventListener('mouseover', overListener);
|
|
1956
|
-
circle.addEventListener('mouseout', outListener);
|
|
1957
|
-
}
|
|
1958
|
-
}
|
|
1959
|
-
|
|
1960
|
-
// --- Graph layout state ---
|
|
1961
|
-
let gVertices = [], gBranches = [], gAvailColours = [], gCommitLookup = {};
|
|
1962
|
-
|
|
1963
|
-
function graphLoadCommits(commits) {
|
|
1964
|
-
gVertices = []; gBranches = []; gAvailColours = [];
|
|
1965
|
-
if (commits.length === 0) return;
|
|
1966
|
-
|
|
1967
|
-
const nullVertex = new GVertex(NULL_VERTEX_ID, false);
|
|
1968
|
-
const lookup = {};
|
|
1969
|
-
for (let i = 0; i < commits.length; i++) {
|
|
1970
|
-
lookup[commits[i].hash] = i;
|
|
1971
|
-
gVertices.push(new GVertex(i, !!commits[i]._isStash, { name: commits[i].author, email: commits[i].authorEmail }));
|
|
1972
|
-
}
|
|
1973
|
-
gCommitLookup = lookup;
|
|
1974
|
-
|
|
1975
|
-
for (let i = 0; i < commits.length; i++) {
|
|
1976
|
-
for (let j = 0; j < commits[i].parents.length; j++) {
|
|
1977
|
-
const ph = commits[i].parents[j];
|
|
1978
|
-
if (typeof lookup[ph] === 'number') {
|
|
1979
|
-
gVertices[i].addParent(gVertices[lookup[ph]]);
|
|
1980
|
-
gVertices[lookup[ph]].addChild(gVertices[i]);
|
|
1981
|
-
} else {
|
|
1982
|
-
gVertices[i].addParent(nullVertex);
|
|
1983
|
-
}
|
|
1984
|
-
}
|
|
1985
|
-
}
|
|
1986
|
-
|
|
1987
|
-
if (state.head && typeof lookup[state.head] === 'number') {
|
|
1988
|
-
gVertices[lookup[state.head]].setCurrent();
|
|
1989
|
-
}
|
|
1990
|
-
|
|
1991
|
-
let i = 0;
|
|
1992
|
-
while (i < gVertices.length) {
|
|
1993
|
-
if (gVertices[i].getNextParent() !== null || gVertices[i].isNotOnBranch()) {
|
|
1994
|
-
graphDeterminePath(i);
|
|
1995
|
-
} else { i++; }
|
|
1996
|
-
}
|
|
1997
|
-
}
|
|
1998
|
-
|
|
1999
|
-
function graphDeterminePath(startAt) {
|
|
2000
|
-
let i = startAt;
|
|
2001
|
-
let vertex = gVertices[i], parentVertex = gVertices[i].getNextParent(), curVertex;
|
|
2002
|
-
let lastPoint = vertex.isNotOnBranch() ? vertex.getNextPoint() : vertex.getPoint(), curPoint;
|
|
2003
|
-
|
|
2004
|
-
if (parentVertex !== null && parentVertex.id !== NULL_VERTEX_ID && vertex.isMerge() && !vertex.isNotOnBranch() && !parentVertex.isNotOnBranch()) {
|
|
2005
|
-
let foundPtp = false, pBranch = parentVertex.getBranch();
|
|
2006
|
-
for (i = startAt + 1; i < gVertices.length; i++) {
|
|
2007
|
-
curVertex = gVertices[i];
|
|
2008
|
-
curPoint = curVertex.getPointConnectingTo(parentVertex, pBranch);
|
|
2009
|
-
if (curPoint !== null) { foundPtp = true; } else { curPoint = curVertex.getNextPoint(); }
|
|
2010
|
-
pBranch.addLine(lastPoint, curPoint, vertex.getIsCommitted(), !foundPtp && curVertex !== parentVertex ? lastPoint.x < curPoint.x : true);
|
|
2011
|
-
curVertex.registerUnavailablePoint(curPoint.x, parentVertex, pBranch);
|
|
2012
|
-
lastPoint = curPoint;
|
|
2013
|
-
if (foundPtp) { vertex.registerParentProcessed(); break; }
|
|
2014
|
-
}
|
|
2015
|
-
} else {
|
|
2016
|
-
const branch = new GBranch(graphGetAvailableColour(startAt), vertex.isStash);
|
|
2017
|
-
vertex.addToBranch(branch, lastPoint.x);
|
|
2018
|
-
vertex.registerUnavailablePoint(lastPoint.x, vertex, branch);
|
|
2019
|
-
for (i = startAt + 1; i < gVertices.length; i++) {
|
|
2020
|
-
curVertex = gVertices[i];
|
|
2021
|
-
curPoint = parentVertex === curVertex && !parentVertex.isNotOnBranch() ? curVertex.getPoint() : curVertex.getNextPoint();
|
|
2022
|
-
branch.addLine(lastPoint, curPoint, vertex.getIsCommitted(), lastPoint.x < curPoint.x);
|
|
2023
|
-
curVertex.registerUnavailablePoint(curPoint.x, parentVertex, branch);
|
|
2024
|
-
lastPoint = curPoint;
|
|
2025
|
-
if (parentVertex === curVertex) {
|
|
2026
|
-
vertex.registerParentProcessed();
|
|
2027
|
-
const onBranch = !parentVertex.isNotOnBranch();
|
|
2028
|
-
parentVertex.addToBranch(branch, curPoint.x);
|
|
2029
|
-
vertex = parentVertex;
|
|
2030
|
-
parentVertex = vertex.getNextParent();
|
|
2031
|
-
if (parentVertex === null || onBranch) break;
|
|
2032
|
-
}
|
|
2033
|
-
}
|
|
2034
|
-
if (i === gVertices.length && parentVertex !== null && parentVertex.id === NULL_VERTEX_ID) {
|
|
2035
|
-
vertex.registerParentProcessed();
|
|
2036
|
-
}
|
|
2037
|
-
branch.setEnd(i);
|
|
2038
|
-
gBranches.push(branch);
|
|
2039
|
-
gAvailColours[branch.getColour()] = i;
|
|
2040
|
-
}
|
|
2041
|
-
}
|
|
2042
|
-
|
|
2043
|
-
function graphGetAvailableColour(startAt) {
|
|
2044
|
-
for (let i = 0; i < gAvailColours.length; i++) {
|
|
2045
|
-
if (startAt > gAvailColours[i]) return i;
|
|
2046
|
-
}
|
|
2047
|
-
gAvailColours.push(0);
|
|
2048
|
-
return gAvailColours.length - 1;
|
|
2049
|
-
}
|
|
2050
|
-
|
|
2051
|
-
function graphRender(expandIdx) {
|
|
2052
|
-
const container = document.getElementById('graph-svg-container');
|
|
2053
|
-
container.innerHTML = '';
|
|
2054
|
-
if (gVertices.length === 0) { state.graphWidth = GRAPH_MIN_W; applyGraphColWidth(); return; }
|
|
2055
|
-
|
|
2056
|
-
// Measure actual row height (may be fractional due to browser zoom)
|
|
2057
|
-
// and use it for SVG grid to prevent cumulative sub-pixel drift
|
|
2058
|
-
const firstRow = document.querySelector('#commit-list .commit-row');
|
|
2059
|
-
const rowH = firstRow ? firstRow.getBoundingClientRect().height : graphConfig.grid.y;
|
|
2060
|
-
const cfg = { ...graphConfig, grid: { ...graphConfig.grid, y: rowH, offsetY: rowH / 2 } };
|
|
2061
|
-
|
|
2062
|
-
const svg = document.createElementNS(SVG_NS, 'svg');
|
|
2063
|
-
const group = document.createElementNS(SVG_NS, 'g');
|
|
2064
|
-
|
|
2065
|
-
for (let i = 0; i < gBranches.length; i++) gBranches[i].draw(group, cfg, expandIdx);
|
|
2066
|
-
|
|
2067
|
-
const overL = (e) => graphVertexOver(e), outL = (e) => graphVertexOut(e);
|
|
2068
|
-
for (let i = 0; i < gVertices.length; i++) {
|
|
2069
|
-
gVertices[i].draw(group, cfg, expandIdx > -1 && i > expandIdx, overL, outL);
|
|
2070
|
-
}
|
|
2071
|
-
|
|
2072
|
-
svg.appendChild(group);
|
|
2073
|
-
|
|
2074
|
-
let maxX = 0;
|
|
2075
|
-
for (let i = 0; i < gVertices.length; i++) {
|
|
2076
|
-
const p = gVertices[i].getNextPoint();
|
|
2077
|
-
if (p.x > maxX) maxX = p.x;
|
|
2078
|
-
}
|
|
2079
|
-
const w = 2 * cfg.grid.offsetX + Math.max(maxX - 1, 0) * cfg.grid.x;
|
|
2080
|
-
const h = gVertices.length * cfg.grid.y + cfg.grid.offsetY - cfg.grid.y / 2 + (expandIdx > -1 ? cfg.grid.expandY : 0);
|
|
2081
|
-
|
|
2082
|
-
const gw = Math.max(w, GRAPH_MIN_W);
|
|
2083
|
-
svg.setAttribute('width', gw.toString());
|
|
2084
|
-
svg.setAttribute('height', h.toString());
|
|
2085
|
-
container.appendChild(svg);
|
|
2086
|
-
// The SVG is drawn at the width the lanes need; the column it shows through
|
|
2087
|
-
// is a different number entirely, and the panel decides that one.
|
|
2088
|
-
state.graphWidth = gw;
|
|
2089
|
-
applyGraphColWidth();
|
|
2090
|
-
}
|
|
2091
|
-
|
|
2092
|
-
/*
|
|
2093
|
-
* The widest the graph column may be right now: whatever is left of the panel
|
|
2094
|
-
* once the columns that cannot shrink have taken theirs and the message has its
|
|
2095
|
-
* floor. Measured from the header rather than from a table of constants, so
|
|
2096
|
-
* hiding a column — by the user's choice or by a width tier — gives its pixels
|
|
2097
|
-
* to the graph without anything here having to know which columns exist.
|
|
2098
|
-
*/
|
|
2099
|
-
function graphColCap() {
|
|
2100
|
-
const header = document.getElementById('graph-header');
|
|
2101
|
-
const area = document.getElementById('graph-container');
|
|
2102
|
-
if (!header || !area || !area.clientWidth) return MESSAGE_MIN_W;
|
|
2103
|
-
let fixed = 0;
|
|
2104
|
-
// offsetWidth is 0 for a hidden column, which is exactly the answer wanted.
|
|
2105
|
-
header.querySelectorAll('.col-refs, .col-changes, .col-author, .col-date, .col-hash')
|
|
2106
|
-
.forEach((cell) => { fixed += cell.offsetWidth; });
|
|
2107
|
-
const rowPadding = 12;
|
|
2108
|
-
return Math.max(GRAPH_MIN_W, area.clientWidth - fixed - rowPadding - MESSAGE_MIN_W);
|
|
2109
|
-
}
|
|
2110
|
-
|
|
2111
|
-
/**
|
|
2112
|
-
* Publish the graph column's width: the dragged one if there is one, else what
|
|
2113
|
-
* the lanes need, both capped to what the panel can spare.
|
|
2114
|
-
*/
|
|
2115
|
-
function applyGraphColWidth() {
|
|
2116
|
-
const cap = graphColCap();
|
|
2117
|
-
const want = state.graphColWidth === null ? state.graphWidth : state.graphColWidth;
|
|
2118
|
-
const width = Math.max(GRAPH_MIN_W, Math.min(want || GRAPH_MIN_W, cap));
|
|
2119
|
-
document.documentElement.style.setProperty('--graph-col-w', width + 'px');
|
|
2120
|
-
applyGraphPan();
|
|
2121
|
-
}
|
|
2122
|
-
|
|
2123
|
-
/** How far the graph can be moved: what is drawn, less what the column shows. */
|
|
2124
|
-
function graphPanMax() {
|
|
2125
|
-
const cell = document.querySelector('#graph-header .col-graph');
|
|
2126
|
-
return Math.max(0, state.graphWidth - (cell ? cell.offsetWidth : 0));
|
|
2127
|
-
}
|
|
2128
|
-
|
|
2129
|
-
/**
|
|
2130
|
-
* Move the overlay inside its clip box, and put the hint where the column now
|
|
2131
|
-
* is. The hint is not a scrollbar: it takes no room in the table and is only
|
|
2132
|
-
* legible while something is moving the graph.
|
|
2133
|
-
*/
|
|
2134
|
-
function applyGraphPan() {
|
|
2135
|
-
const cell = document.querySelector('#graph-header .col-graph');
|
|
2136
|
-
const shown = cell ? cell.offsetWidth : 0;
|
|
2137
|
-
const max = graphPanMax();
|
|
2138
|
-
state.graphPanX = Math.min(Math.max(0, state.graphPanX), max);
|
|
2139
|
-
document.documentElement.style.setProperty('--graph-pan-x', state.graphPanX + 'px');
|
|
2140
|
-
document.documentElement.classList.toggle('graph-can-pan', max > 0);
|
|
2141
|
-
|
|
2142
|
-
const bar = document.getElementById('graph-pan-bar');
|
|
2143
|
-
const thumb = document.getElementById('graph-pan-thumb');
|
|
2144
|
-
if (!bar || !thumb) return;
|
|
2145
|
-
bar.classList.toggle('hidden', max <= 0 || !state.graphWidth);
|
|
2146
|
-
if (max <= 0 || !state.graphWidth) return;
|
|
2147
|
-
const ratio = shown / state.graphWidth;
|
|
2148
|
-
thumb.style.width = (ratio * 100) + '%';
|
|
2149
|
-
thumb.style.left = ((state.graphPanX / state.graphWidth) * 100) + '%';
|
|
2150
|
-
}
|
|
2151
|
-
|
|
2152
|
-
/** Show the hint while something is moving the graph, then let it fade. */
|
|
2153
|
-
let panHintTimer = null;
|
|
2154
|
-
function showPanHint(sticky) {
|
|
2155
|
-
const bar = document.getElementById('graph-pan-bar');
|
|
2156
|
-
if (!bar || bar.classList.contains('hidden')) return;
|
|
2157
|
-
bar.classList.add('visible');
|
|
2158
|
-
if (panHintTimer) clearTimeout(panHintTimer);
|
|
2159
|
-
panHintTimer = sticky ? null : setTimeout(() => bar.classList.remove('visible'), 700);
|
|
2160
|
-
}
|
|
2161
|
-
|
|
2162
|
-
function panGraphBy(dx) {
|
|
2163
|
-
state.graphPanX += dx;
|
|
2164
|
-
applyGraphPan();
|
|
2165
|
-
showPanHint(false);
|
|
2166
|
-
}
|
|
2167
|
-
|
|
2168
|
-
function graphVertexOver(e) {
|
|
2169
|
-
if (!e.target || !e.target.dataset || !e.target.dataset.id) return;
|
|
2170
|
-
const id = parseInt(e.target.dataset.id);
|
|
2171
|
-
if (id >= 0 && id < gVertices.length) {
|
|
2172
|
-
const rows = document.querySelectorAll('.commit-row:not(.header-row)');
|
|
2173
|
-
if (rows[id]) rows[id].classList.add('graph-hover');
|
|
2174
|
-
e.target.setAttribute('r', (Number(e.target.dataset.r || 4.5) + 1.5).toString());
|
|
2175
|
-
}
|
|
2176
|
-
}
|
|
2177
|
-
function graphVertexOut(e) {
|
|
2178
|
-
if (!e.target || !e.target.dataset || !e.target.dataset.id) return;
|
|
2179
|
-
const id = parseInt(e.target.dataset.id);
|
|
2180
|
-
if (id >= 0) {
|
|
2181
|
-
const rows = document.querySelectorAll('.commit-row:not(.header-row)');
|
|
2182
|
-
if (rows[id]) rows[id].classList.remove('graph-hover');
|
|
2183
|
-
e.target.setAttribute('r', (e.target.dataset.r || '4.5'));
|
|
2184
|
-
}
|
|
2185
|
-
}
|
|
2186
|
-
|
|
2187
|
-
// --- Commit list ---
|
|
2188
|
-
function getDisplayCommits() {
|
|
2189
|
-
let commits = state.commits;
|
|
2190
|
-
|
|
2191
|
-
// Inject uncommitted changes virtual commit
|
|
2192
|
-
const u = state.uncommitted;
|
|
2193
|
-
const totalFiles = u ? (u.staged.length + u.unstaged.length + (u.conflicted ? u.conflicted.length : 0)) : 0;
|
|
2194
|
-
if (u && totalFiles > 0) {
|
|
2195
|
-
commits = [{
|
|
2196
|
-
hash: 'uncommitted',
|
|
2197
|
-
parents: state.head ? [state.head] : [],
|
|
2198
|
-
author: '', authorEmail: '',
|
|
2199
|
-
authorDate: Math.floor(Date.now() / 1000),
|
|
2200
|
-
committer: '', committerEmail: '',
|
|
2201
|
-
commitDate: Math.floor(Date.now() / 1000),
|
|
2202
|
-
refs: [],
|
|
2203
|
-
message: 'Uncommitted Changes (' + totalFiles + ' files)',
|
|
2204
|
-
}, ...commits];
|
|
2205
|
-
}
|
|
2206
|
-
|
|
2207
|
-
// Inject stash virtual commits as branch spurs from their parent
|
|
2208
|
-
if (state.settings.showStashes && state.stashes.length > 0) {
|
|
2209
|
-
const parentIndexes = {};
|
|
2210
|
-
const commitHashSet = new Set(commits.map(c => c.hash));
|
|
2211
|
-
for (const s of state.stashes) {
|
|
2212
|
-
if (!s.parentHash || !commitHashSet.has(s.parentHash)) continue;
|
|
2213
|
-
if (!parentIndexes[s.parentHash]) parentIndexes[s.parentHash] = [];
|
|
2214
|
-
parentIndexes[s.parentHash].push(s);
|
|
2215
|
-
}
|
|
2216
|
-
if (Object.keys(parentIndexes).length > 0) {
|
|
2217
|
-
const result = [];
|
|
2218
|
-
for (const c of commits) {
|
|
2219
|
-
// Stash virtual commits must come BEFORE their parent in the array
|
|
2220
|
-
// (graph algorithm scans forward to find parents — same pattern as uncommitted)
|
|
2221
|
-
const stashesForCommit = parentIndexes[c.hash];
|
|
2222
|
-
if (stashesForCommit) {
|
|
2223
|
-
for (const s of stashesForCommit) {
|
|
2224
|
-
result.push({
|
|
2225
|
-
hash: s.hash,
|
|
2226
|
-
parents: [s.parentHash],
|
|
2227
|
-
author: '', authorEmail: '',
|
|
2228
|
-
authorDate: 0, committer: '', committerEmail: '', commitDate: 0,
|
|
2229
|
-
refs: [{ type: 'stash', name: 'stash@{' + s.index + '}' }],
|
|
2230
|
-
message: s.message,
|
|
2231
|
-
_isStash: true,
|
|
2232
|
-
});
|
|
2233
|
-
}
|
|
2234
|
-
}
|
|
2235
|
-
result.push(c);
|
|
2236
|
-
}
|
|
2237
|
-
commits = result;
|
|
2238
|
-
}
|
|
2239
|
-
}
|
|
2240
|
-
|
|
2241
|
-
return commits;
|
|
2242
|
-
}
|
|
2243
|
-
|
|
2244
|
-
/*
|
|
2245
|
-
* Below this width the row carries the graph and the message only, with the
|
|
2246
|
-
* author, date and hash on a second line under the subject: six columns of
|
|
2247
|
-
* fragments on a phone is not a list of commits, and PPM's layout rules ask for
|
|
2248
|
-
* one column there. The value matches the max-width:640px block in the CSS —
|
|
2249
|
-
* both have to agree, because the JS decides where the ref badges are put and
|
|
2250
|
-
* the CSS decides which columns exist.
|
|
2251
|
-
*/
|
|
2252
|
-
function isNarrowLayout() {
|
|
2253
|
-
return typeof window.matchMedia === 'function' && window.matchMedia('(max-width: 640px)').matches;
|
|
2254
|
-
}
|
|
2255
|
-
|
|
2256
|
-
function renderCommitList() {
|
|
2257
|
-
const container = document.getElementById('commit-list');
|
|
2258
|
-
container.innerHTML = '';
|
|
2259
|
-
|
|
2260
|
-
const displayCommits = getDisplayCommits();
|
|
2261
|
-
graphLoadCommits(displayCommits);
|
|
2262
|
-
|
|
2263
|
-
// Mark uncommitted vertex for dashed lines
|
|
2264
|
-
if (displayCommits.length > 0 && displayCommits[0].hash === 'uncommitted') {
|
|
2265
|
-
if (gVertices.length > 0) gVertices[0].setNotCommitted();
|
|
2266
|
-
}
|
|
2267
|
-
|
|
2268
|
-
displayCommits.forEach((commit, idx) => {
|
|
2269
|
-
const isVirtual = commit.hash === 'uncommitted';
|
|
2270
|
-
const isStash = !!commit._isStash;
|
|
2271
|
-
const row = document.createElement('div');
|
|
2272
|
-
row.className = 'commit-row' + (isVirtual ? ' virtual' : '') + (isStash ? ' stash-row' : '');
|
|
2273
|
-
row.dataset.hash = commit.hash;
|
|
2274
|
-
|
|
2275
|
-
// Branch / tag column. Below 640px there is no room for it, so the badges
|
|
2276
|
-
// go inline ahead of the subject instead — one home or the other, never
|
|
2277
|
-
// both, or the second copy's context menu would act on a hidden badge.
|
|
2278
|
-
const narrow = isNarrowLayout();
|
|
2279
|
-
const refsCol = document.createElement('div');
|
|
2280
|
-
refsCol.className = 'col-refs';
|
|
2281
|
-
|
|
2282
|
-
// Graph spacer column (SVG overlays this area)
|
|
2283
|
-
const graphCol = document.createElement('div');
|
|
2284
|
-
graphCol.className = 'col-graph';
|
|
2285
|
-
|
|
2286
|
-
const msgCol = document.createElement('div');
|
|
2287
|
-
msgCol.className = 'col-message';
|
|
2288
|
-
let badges = '';
|
|
2289
|
-
if (commit.refs) {
|
|
2290
|
-
// Known remote prefixes from repo info (e.g. "origin/", "upstream/")
|
|
2291
|
-
const remotePrefixes = state.remotes.map(r => r.name + '/');
|
|
2292
|
-
// Re-classify refs using known remotes (parser may misclassify local branches with "/" as remote)
|
|
2293
|
-
const classified = commit.refs.map(ref => {
|
|
2294
|
-
if (ref.type === 'head' || ref.type === 'tag' || ref.type === 'stash') return ref;
|
|
2295
|
-
const isActualRemote = remotePrefixes.some(p => ref.name.startsWith(p));
|
|
2296
|
-
return { ...ref, type: isActualRemote ? 'remote' : 'local' };
|
|
2297
|
-
});
|
|
2298
|
-
// Merge remote+local: if origin/X and X both exist, show one synced badge
|
|
2299
|
-
const localNames = new Set(classified.filter(r => r.type === 'head' || r.type === 'local').map(r => r.name));
|
|
2300
|
-
const mergedRemotes = new Set();
|
|
2301
|
-
classified.forEach(ref => {
|
|
2302
|
-
if (ref.type === 'remote') {
|
|
2303
|
-
const prefix = remotePrefixes.find(p => ref.name.startsWith(p));
|
|
2304
|
-
const branchName = prefix ? ref.name.slice(prefix.length) : ref.name;
|
|
2305
|
-
if (localNames.has(branchName)) {
|
|
2306
|
-
mergedRemotes.add(ref.name);
|
|
2307
|
-
}
|
|
2308
|
-
}
|
|
2309
|
-
});
|
|
2310
|
-
classified.forEach(ref => {
|
|
2311
|
-
if (ref.type === 'tag' && !state.settings.showTags) return;
|
|
2312
|
-
if (ref.type === 'remote' && !state.settings.showRemoteBranches) return;
|
|
2313
|
-
if (mergedRemotes.has(ref.name)) return;
|
|
2314
|
-
const isSynced = (ref.type === 'head' || ref.type === 'local') &&
|
|
2315
|
-
classified.some(r => r.type === 'remote' && remotePrefixes.some(p => r.name === p + ref.name));
|
|
2316
|
-
const syncIcon = isSynced ? '<svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:-1px"><path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z"/></svg> ' : '';
|
|
2317
|
-
badges += '<span class="ref-badge ref-' + ref.type + '" data-ref="' + escHtml(ref.name) + '">' + syncIcon + escHtml(ref.name) + '</span>';
|
|
2318
|
-
});
|
|
2319
|
-
}
|
|
2320
|
-
if (!narrow) refsCol.innerHTML = badges;
|
|
2321
|
-
const meta = isVirtual || isStash ? ''
|
|
2322
|
-
: '<span class="msg-meta">' + escHtml(commit.author) + ' \u00b7 '
|
|
2323
|
-
+ escHtml(formatDate(commit.commitDate)) + ' \u00b7 ' + escHtml(commit.hash.substring(0, 7))
|
|
2324
|
-
+ '</span>';
|
|
2325
|
-
msgCol.innerHTML = '<span class="msg-subject">' + (narrow ? badges : '')
|
|
2326
|
-
+ formatCommitMessage(commit.message) + '</span>' + meta;
|
|
2327
|
-
|
|
2328
|
-
// The lane's colour, for the tick at the start of the message.
|
|
2329
|
-
const vertex = gVertices[idx];
|
|
2330
|
-
if (vertex && !isVirtual && !isStash) {
|
|
2331
|
-
row.style.setProperty('--lane', GRAPH_COLORS[vertex.getColour() % GRAPH_COLORS.length]);
|
|
2332
|
-
}
|
|
2333
|
-
|
|
2334
|
-
// Attach context menu and double-click to ref badges
|
|
2335
|
-
row.appendChild(refsCol);
|
|
2336
|
-
row.querySelectorAll('.ref-badge').forEach(badge => {
|
|
2337
|
-
const refName = badge.dataset.ref || badge.textContent.trim();
|
|
2338
|
-
const refType = badge.className.includes('ref-head') ? 'head'
|
|
2339
|
-
: badge.className.includes('ref-remote') ? 'remote'
|
|
2340
|
-
: badge.className.includes('ref-tag') ? 'tag'
|
|
2341
|
-
: badge.className.includes('ref-stash') ? 'stash' : 'local';
|
|
2342
|
-
badge.style.cursor = 'pointer';
|
|
2343
|
-
makeRefDraggable(badge, refName, refType);
|
|
2344
|
-
if (refType === 'stash') {
|
|
2345
|
-
badge.addEventListener('contextmenu', (e) => {
|
|
2346
|
-
e.preventDefault();
|
|
2347
|
-
e.stopPropagation();
|
|
2348
|
-
showStashBadgeMenu(e.clientX, e.clientY, refName);
|
|
2349
|
-
});
|
|
2350
|
-
} else {
|
|
2351
|
-
badge.addEventListener('dblclick', (e) => {
|
|
2352
|
-
e.stopPropagation();
|
|
2353
|
-
gitAction('checkout', { target: refName });
|
|
2354
|
-
});
|
|
2355
|
-
badge.addEventListener('contextmenu', (e) => {
|
|
2356
|
-
e.preventDefault();
|
|
2357
|
-
e.stopPropagation();
|
|
2358
|
-
showBranchContextMenu(e.clientX, e.clientY, refName, refType, commit);
|
|
2359
|
-
});
|
|
2360
|
-
}
|
|
2361
|
-
});
|
|
2362
|
-
|
|
2363
|
-
const changesCol = document.createElement('div');
|
|
2364
|
-
changesCol.className = 'col-changes';
|
|
2365
|
-
if (!isVirtual && !isStash) fillChangesCell(changesCol, state.stats[commit.hash]);
|
|
2366
|
-
|
|
2367
|
-
const authorCol = document.createElement('div');
|
|
2368
|
-
authorCol.className = 'col-author';
|
|
2369
|
-
if (isVirtual || isStash) {
|
|
2370
|
-
authorCol.textContent = '';
|
|
2371
|
-
} else {
|
|
2372
|
-
// No avatar here any more — it is the graph node now, and twice on one
|
|
2373
|
-
// row was noise.
|
|
2374
|
-
authorCol.textContent = commit.author;
|
|
2375
|
-
authorCol.addEventListener('mouseenter', () => showAuthorCard(authorCol, commit));
|
|
2376
|
-
authorCol.addEventListener('mouseleave', hideAuthorCard);
|
|
2377
|
-
}
|
|
2378
|
-
|
|
2379
|
-
const dateCol = document.createElement('div');
|
|
2380
|
-
dateCol.className = 'col-date';
|
|
2381
|
-
dateCol.textContent = isVirtual ? 'now' : isStash ? '' : formatDate(commit.commitDate);
|
|
2382
|
-
// The column is relative by default, so the exact moment goes in the title
|
|
2383
|
-
// rather than in a wider column.
|
|
2384
|
-
if (!isVirtual && !isStash) dateCol.title = new Date(commit.commitDate * 1000).toLocaleString();
|
|
2385
|
-
|
|
2386
|
-
const hashCol = document.createElement('div');
|
|
2387
|
-
hashCol.className = 'col-hash';
|
|
2388
|
-
hashCol.textContent = isVirtual ? '...' : isStash ? '' : commit.hash.substring(0, 7);
|
|
2389
|
-
|
|
2390
|
-
row.appendChild(graphCol);
|
|
2391
|
-
row.appendChild(msgCol);
|
|
2392
|
-
row.appendChild(changesCol);
|
|
2393
|
-
row.appendChild(authorCol);
|
|
2394
|
-
row.appendChild(dateCol);
|
|
2395
|
-
row.appendChild(hashCol);
|
|
2396
|
-
|
|
2397
|
-
makeRowDropTarget(row, commit);
|
|
2398
|
-
row.addEventListener('click', () => selectCommit(commit.hash));
|
|
2399
|
-
if (isVirtual) {
|
|
2400
|
-
row.addEventListener('contextmenu', (e) => {
|
|
2401
|
-
e.preventDefault();
|
|
2402
|
-
showUncommittedContextMenu(e.clientX, e.clientY);
|
|
2403
|
-
});
|
|
2404
|
-
setupLongPress(row, (x, y) => showUncommittedContextMenu(x, y));
|
|
2405
|
-
} else if (isStash) {
|
|
2406
|
-
const stashRef = (commit.refs && commit.refs[0]) ? commit.refs[0].name : '';
|
|
2407
|
-
row.addEventListener('contextmenu', (e) => {
|
|
2408
|
-
e.preventDefault();
|
|
2409
|
-
if (stashRef) showStashBadgeMenu(e.clientX, e.clientY, stashRef);
|
|
2410
|
-
});
|
|
2411
|
-
setupLongPress(row, (x, y) => { if (stashRef) showStashBadgeMenu(x, y, stashRef); });
|
|
2412
|
-
} else {
|
|
2413
|
-
row.addEventListener('contextmenu', (e) => {
|
|
2414
|
-
e.preventDefault();
|
|
2415
|
-
showCommitContextMenu(e.clientX, e.clientY, commit);
|
|
2416
|
-
});
|
|
2417
|
-
setupLongPress(row, (x, y) => showCommitContextMenu(x, y, commit));
|
|
2418
|
-
}
|
|
2419
|
-
|
|
2420
|
-
container.appendChild(row);
|
|
2421
|
-
});
|
|
2422
|
-
|
|
2423
|
-
graphRender(-1);
|
|
2424
|
-
renderScrollMarkers();
|
|
2425
|
-
}
|
|
2426
|
-
|
|
2427
|
-
/*
|
|
2428
|
-
* A merge commit has no diffstat — that is git's default, not a failure — so an
|
|
2429
|
-
* absent entry leaves the cell empty rather than claiming it changed nothing.
|
|
2430
|
-
*/
|
|
2431
|
-
function fillChangesCell(cell, stat) {
|
|
2432
|
-
cell.textContent = '';
|
|
2433
|
-
if (!stat) return;
|
|
2434
|
-
if (stat.insertions > 0) {
|
|
2435
|
-
const add = document.createElement('span');
|
|
2436
|
-
add.className = 'ch-add';
|
|
2437
|
-
add.textContent = '+' + stat.insertions;
|
|
2438
|
-
cell.appendChild(add);
|
|
2439
|
-
}
|
|
2440
|
-
if (stat.deletions > 0) {
|
|
2441
|
-
const del = document.createElement('span');
|
|
2442
|
-
del.className = 'ch-del';
|
|
2443
|
-
del.textContent = '-' + stat.deletions;
|
|
2444
|
-
cell.appendChild(del);
|
|
2445
|
-
}
|
|
2446
|
-
cell.title = stat.files + (stat.files === 1 ? ' file changed' : ' files changed');
|
|
2447
|
-
}
|
|
2448
|
-
|
|
2449
|
-
/** Fill the column in place: the rows are already drawn, and rebuilding them
|
|
2450
|
-
* would throw away the scroll position and the open detail panel. */
|
|
2451
|
-
function applyCommitStats() {
|
|
2452
|
-
document.querySelectorAll('#commit-list .commit-row').forEach((row) => {
|
|
2453
|
-
const cell = row.querySelector('.col-changes');
|
|
2454
|
-
const hash = row.dataset.hash;
|
|
2455
|
-
if (cell && hash && hash !== 'uncommitted') fillChangesCell(cell, state.stats[hash]);
|
|
2456
|
-
});
|
|
2457
|
-
}
|
|
2458
|
-
|
|
2459
|
-
/*
|
|
2460
|
-
* One tick per interesting row, positioned by its index in the whole loaded
|
|
2461
|
-
* history rather than by pixels — the rows are a uniform height, so the two
|
|
2462
|
-
* agree, and an index needs no measuring and survives a resize.
|
|
2463
|
-
*
|
|
2464
|
-
* Search matches are drawn first so that the checked-out and selected ticks sit
|
|
2465
|
-
* on top of them when they land on the same row.
|
|
2466
|
-
*/
|
|
2467
|
-
function renderScrollMarkers() {
|
|
2468
|
-
const host = document.getElementById('scroll-markers');
|
|
2469
|
-
if (!host) return;
|
|
2470
|
-
host.innerHTML = '';
|
|
2471
|
-
const commits = getDisplayCommits();
|
|
2472
|
-
if (commits.length === 0) return;
|
|
2473
|
-
|
|
2474
|
-
const mark = (idx, kind) => {
|
|
2475
|
-
const el = document.createElement('div');
|
|
2476
|
-
el.className = 'scroll-marker sm-' + kind;
|
|
2477
|
-
el.style.top = ((idx + 0.5) / commits.length * 100) + '%';
|
|
2478
|
-
host.appendChild(el);
|
|
2479
|
-
};
|
|
2480
|
-
|
|
2481
|
-
for (let i = 0; i < state.searchMatches.length; i++) mark(state.searchMatches[i], 'search');
|
|
2482
|
-
for (let i = 0; i < commits.length; i++) {
|
|
2483
|
-
if (commits[i].hash === state.head) mark(i, 'head');
|
|
2484
|
-
if (commits[i].hash === state.selectedCommit) mark(i, 'selected');
|
|
2485
|
-
}
|
|
2486
|
-
}
|
|
2487
|
-
|
|
2488
|
-
function selectCommit(hash) {
|
|
2489
|
-
// Deselect previous
|
|
2490
|
-
document.querySelectorAll('.commit-row.selected').forEach(el => el.classList.remove('selected'));
|
|
2491
|
-
|
|
2492
|
-
if (state.selectedCommit === hash) {
|
|
2493
|
-
state.selectedCommit = null;
|
|
2494
|
-
state.expandedCommit = null;
|
|
2495
|
-
document.getElementById('detail-panel').classList.add('hidden');
|
|
2496
|
-
renderScrollMarkers();
|
|
2497
|
-
return;
|
|
2498
|
-
}
|
|
2499
|
-
|
|
2500
|
-
state.selectedCommit = hash;
|
|
2501
|
-
state.expandedCommit = hash;
|
|
2502
|
-
const row = document.querySelector('[data-hash="' + CSS.escape(hash) + '"]');
|
|
2503
|
-
if (row) row.classList.add('selected');
|
|
2504
|
-
renderScrollMarkers();
|
|
2505
|
-
|
|
2506
|
-
if (hash === 'uncommitted') {
|
|
2507
|
-
renderUncommittedDetail();
|
|
2508
|
-
return;
|
|
2509
|
-
}
|
|
2510
|
-
vscode.postMessage({ command: 'requestCommitDetails', hash });
|
|
2511
|
-
}
|
|
2512
|
-
|
|
2513
|
-
/* One dismiss for the close button and for Escape. They have to leave exactly
|
|
2514
|
-
the same state behind: a row still marked selected, or a marker still in
|
|
2515
|
-
the scroll bar, outlives the panel that explained it. */
|
|
2516
|
-
function closeDetailPanel() {
|
|
2517
|
-
state.selectedCommit = null;
|
|
2518
|
-
state.expandedCommit = null;
|
|
2519
|
-
document.getElementById('detail-panel').classList.add('hidden');
|
|
2520
|
-
document.querySelectorAll('.commit-row.selected').forEach(el => el.classList.remove('selected'));
|
|
2521
|
-
renderScrollMarkers();
|
|
2522
|
-
}
|
|
2523
|
-
|
|
2524
|
-
// --- File tree helpers ---
|
|
2525
|
-
function buildFileTree(files) {
|
|
2526
|
-
const root = { name: '', children: {}, files: [] };
|
|
2527
|
-
for (const f of files) {
|
|
2528
|
-
const parts = f.path.split('/');
|
|
2529
|
-
let node = root;
|
|
2530
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
2531
|
-
if (!node.children[parts[i]]) node.children[parts[i]] = { name: parts[i], children: {}, files: [] };
|
|
2532
|
-
node = node.children[parts[i]];
|
|
2533
|
-
}
|
|
2534
|
-
node.files.push({ ...f, fileName: parts[parts.length - 1] });
|
|
2535
|
-
}
|
|
2536
|
-
return root;
|
|
2537
|
-
}
|
|
2538
|
-
|
|
2539
|
-
function countFiles(node) {
|
|
2540
|
-
let count = node.files.length;
|
|
2541
|
-
for (const child of Object.values(node.children)) count += countFiles(child);
|
|
2542
|
-
return count;
|
|
2543
|
-
}
|
|
2544
|
-
|
|
2545
|
-
function renderFileTree(node, depth, hash, parentHash, section) {
|
|
2546
|
-
let html = '';
|
|
2547
|
-
const dirs = Object.keys(node.children).sort();
|
|
2548
|
-
for (const dir of dirs) {
|
|
2549
|
-
const child = node.children[dir];
|
|
2550
|
-
html += '<div class="tree-dir" style="padding-left:' + (depth * 16) + 'px">';
|
|
2551
|
-
html += ICONS.folderOpen + ' <span class="tree-dir-name">' + escHtml(dir) + '/</span>';
|
|
2552
|
-
html += '<span class="tree-dir-count">(' + countFiles(child) + ')</span></div>';
|
|
2553
|
-
html += renderFileTree(child, depth + 1, hash, parentHash, section);
|
|
2554
|
-
}
|
|
2555
|
-
const sortedFiles = [...node.files].sort((a, b) => a.fileName.localeCompare(b.fileName));
|
|
2556
|
-
for (const f of sortedFiles) {
|
|
2557
|
-
html += '<div class="file-item file-clickable" style="padding-left:' + (depth * 16) + 'px" ';
|
|
2558
|
-
html += 'data-path="' + escHtml(f.path) + '" data-hash="' + escHtml(hash) + '" data-parent="' + escHtml(parentHash || '') + '">';
|
|
2559
|
-
html += '<span class="file-status file-status-' + escHtml(f.status) + '">' + escHtml(f.status) + '</span>';
|
|
2560
|
-
html += '<span class="file-name">' + escHtml(f.fileName) + '</span>';
|
|
2561
|
-
if (f.additions > 0 || f.deletions > 0) {
|
|
2562
|
-
html += '<span class="file-stat">';
|
|
2563
|
-
if (f.additions > 0) html += '<span class="add">+' + f.additions + '</span> ';
|
|
2564
|
-
if (f.deletions > 0) html += '<span class="del">-' + f.deletions + '</span>';
|
|
2565
|
-
html += '</span>';
|
|
2566
|
-
}
|
|
2567
|
-
if (section) html += renderFileActions(f, section);
|
|
2568
|
-
html += '</div>';
|
|
2569
|
-
}
|
|
2570
|
-
return html;
|
|
2571
|
-
}
|
|
2572
|
-
|
|
2573
|
-
/* Split so the file name can be shown before the directory it sits in: the
|
|
2574
|
-
list lives in a narrow column, and truncating from the end has to eat the
|
|
2575
|
-
path, not the name. */
|
|
2576
|
-
function basename(path) {
|
|
2577
|
-
const i = String(path).lastIndexOf('/');
|
|
2578
|
-
return i === -1 ? String(path) : String(path).slice(i + 1);
|
|
2579
|
-
}
|
|
2580
|
-
function dirname(path) {
|
|
2581
|
-
const i = String(path).lastIndexOf('/');
|
|
2582
|
-
return i === -1 ? '' : String(path).slice(0, i);
|
|
2583
|
-
}
|
|
2584
|
-
|
|
2585
|
-
function renderFileListHtml(files, hash, parentHash, section) {
|
|
2586
|
-
if (state.fileViewMode === 'tree') {
|
|
2587
|
-
return renderFileTree(buildFileTree(files), 0, hash, parentHash, section);
|
|
2588
|
-
}
|
|
2589
|
-
return files.map(f =>
|
|
2590
|
-
'<div class="file-item file-clickable" title="' + escHtml(f.path) + '" data-path="' + escHtml(f.path) + '" data-hash="' + escHtml(hash) + '" data-parent="' + escHtml(parentHash || '') + '">' +
|
|
2591
|
-
'<span class="file-status file-status-' + escHtml(f.status) + '">' + escHtml(f.status) + '</span>' +
|
|
2592
|
-
'<span class="file-name">' + escHtml(basename(f.path)) + '</span>' +
|
|
2593
|
-
(dirname(f.path) ? '<span class="file-dir">' + escHtml(dirname(f.path)) + '</span>' : '') +
|
|
2594
|
-
'<span class="file-stat">' +
|
|
2595
|
-
(f.additions > 0 ? '<span class="add">+' + f.additions + '</span> ' : '') +
|
|
2596
|
-
(f.deletions > 0 ? '<span class="del">-' + f.deletions + '</span>' : '') +
|
|
2597
|
-
'</span>' +
|
|
2598
|
-
(section ? renderFileActions(f, section) : '') +
|
|
2599
|
-
'</div>'
|
|
2600
|
-
).join('');
|
|
2601
|
-
}
|
|
2602
|
-
|
|
2603
|
-
/* A cap that does not say it capped states a wrong number as a fact: a commit
|
|
2604
|
-
touching ten thousand files rendered as "500 files changed", which is a
|
|
2605
|
-
sentence the panel has no evidence for. The message cap already spells its
|
|
2606
|
-
own truncation out, so this says it the same way. */
|
|
2607
|
-
function fileCountLabel(shown, omitted) {
|
|
2608
|
-
return shown + (shown === 1 ? ' file' : ' files') + ' changed'
|
|
2609
|
-
+ (omitted > 0 ? ' [… ' + omitted + ' more]' : '');
|
|
2610
|
-
}
|
|
2611
|
-
|
|
2612
|
-
function renderFileActions(file, section) {
|
|
2613
|
-
let html = '<span class="file-actions">';
|
|
2614
|
-
if (section === 'unstaged') {
|
|
2615
|
-
html += '<button class="file-action-btn" data-action="stage" data-file="' + escHtml(file.path) + '" title="Stage">' + ICONS.plus + '</button>';
|
|
2616
|
-
html += '<button class="file-action-btn" data-action="discard" data-file="' + escHtml(file.path) + '" title="Discard changes">' + ICONS.x + '</button>';
|
|
2617
|
-
} else if (section === 'staged') {
|
|
2618
|
-
html += '<button class="file-action-btn" data-action="unstage" data-file="' + escHtml(file.path) + '" title="Unstage">' + ICONS.minus + '</button>';
|
|
2619
|
-
}
|
|
2620
|
-
html += '<button class="file-action-btn" data-action="open" data-file="' + escHtml(file.path) + '" title="Open file">' + ICONS.fileOpen + '</button>';
|
|
2621
|
-
html += '</span>';
|
|
2622
|
-
return html;
|
|
2623
|
-
}
|
|
2624
|
-
|
|
2625
|
-
function fileViewToggleHtml() {
|
|
2626
|
-
return '<div class="file-view-toggle">' +
|
|
2627
|
-
'<button class="toggle-btn' + (state.fileViewMode === 'list' ? ' active' : '') + '" data-view="list" title="List view">' + ICONS.list + '</button>' +
|
|
2628
|
-
'<button class="toggle-btn' + (state.fileViewMode === 'tree' ? ' active' : '') + '" data-view="tree" title="Tree view">' + ICONS.tree + '</button>' +
|
|
2629
|
-
'</div>';
|
|
2630
|
-
}
|
|
2631
|
-
|
|
2632
|
-
function renderUncommittedDetail() {
|
|
2633
|
-
const panel = document.getElementById('detail-panel');
|
|
2634
|
-
panel.classList.remove('hidden');
|
|
2635
|
-
panel.classList.remove('split');
|
|
2636
|
-
const u = state.uncommitted;
|
|
2637
|
-
if (!u) { panel.classList.add('hidden'); return; }
|
|
2638
|
-
let html = '<div class="detail-pad"><h3>Uncommitted Changes</h3>';
|
|
2639
|
-
const hasFiles = u.staged.length > 0 || u.unstaged.length > 0 || (u.conflicted && u.conflicted.length > 0);
|
|
2640
|
-
if (hasFiles) {
|
|
2641
|
-
html += fileViewToggleHtml();
|
|
2642
|
-
}
|
|
2643
|
-
// Conflict section (above staged/unstaged)
|
|
2644
|
-
if (u.conflicted && u.conflicted.length > 0) {
|
|
2645
|
-
html += '<div class="file-list"><div class="conflict-header">⚠ Conflicts (' + u.conflicted.length + ')</div>';
|
|
2646
|
-
html += u.conflicted.map(f => {
|
|
2647
|
-
const fileName = f.path.split('/').pop() || f.path;
|
|
2648
|
-
return '<div class="file-item">'
|
|
2649
|
-
+ '<span class="file-status file-status-U">U</span>'
|
|
2650
|
-
+ '<span class="file-clickable" data-file="' + escHtml(f.path) + '" data-hash="uncommitted" data-parent="' + escHtml(state.head) + '">' + escHtml(f.path) + '</span>'
|
|
2651
|
-
+ '<div class="file-actions">'
|
|
2652
|
-
+ '<button class="file-action-btn" data-action="open-conflict" data-file="' + escHtml(f.path) + '" title="Open conflict file">' + ICONS.fileOpen + '</button>'
|
|
2653
|
-
+ '<button class="file-action-btn" data-action="stage" data-file="' + escHtml(f.path) + '" title="Mark resolved (stage)">' + ICONS.plus + '</button>'
|
|
2654
|
-
+ '</div></div>';
|
|
2655
|
-
}).join('');
|
|
2656
|
-
html += '</div>';
|
|
2657
|
-
}
|
|
2658
|
-
if (u.staged.length > 0) {
|
|
2659
|
-
html += '<div class="file-list"><div class="section-actions"><strong>Staged (' + u.staged.length + '):</strong>';
|
|
2660
|
-
html += '<button class="btn-sm section-action-btn" data-action="unstage-all">Unstage All</button></div>';
|
|
2661
|
-
html += renderFileListHtml(u.staged, 'staged', state.head, 'staged');
|
|
2662
|
-
html += '</div>';
|
|
2663
|
-
}
|
|
2664
|
-
if (u.unstaged.length > 0) {
|
|
2665
|
-
html += '<div class="file-list"><div class="section-actions"><strong>Unstaged (' + u.unstaged.length + '):</strong>';
|
|
2666
|
-
html += '<button class="btn-sm section-action-btn" data-action="stage-all">Stage All</button></div>';
|
|
2667
|
-
html += renderFileListHtml(u.unstaged, 'uncommitted', state.head, 'unstaged');
|
|
2668
|
-
html += '</div>';
|
|
2669
|
-
}
|
|
2670
|
-
if (u.staged.length === 0 && u.unstaged.length === 0 && (!u.conflicted || u.conflicted.length === 0)) {
|
|
2671
|
-
html += '<p>No uncommitted changes.</p>';
|
|
2672
|
-
}
|
|
2673
|
-
html += '<div class="commit-section">';
|
|
2674
|
-
html += '<textarea id="commit-message" placeholder="Commit message..." rows="3"></textarea>';
|
|
2675
|
-
html += '<div class="commit-actions"><button id="btn-commit" class="btn-sm btn-commit" disabled>Commit</button></div>';
|
|
2676
|
-
html += '</div></div>';
|
|
2677
|
-
panel.innerHTML = html;
|
|
2678
|
-
wireCommitControls();
|
|
2679
|
-
}
|
|
2680
|
-
|
|
2681
|
-
function wireCommitControls() {
|
|
2682
|
-
const textarea = document.getElementById('commit-message');
|
|
2683
|
-
const commitBtn = document.getElementById('btn-commit');
|
|
2684
|
-
if (!textarea || !commitBtn) return;
|
|
2685
|
-
const updateBtn = () => {
|
|
2686
|
-
const hasMsg = textarea.value.trim().length > 0;
|
|
2687
|
-
const hasStaged = state.uncommitted && state.uncommitted.staged.length > 0;
|
|
2688
|
-
commitBtn.disabled = !(hasMsg && hasStaged);
|
|
2689
|
-
};
|
|
2690
|
-
textarea.addEventListener('input', updateBtn);
|
|
2691
|
-
updateBtn();
|
|
2692
|
-
commitBtn.addEventListener('click', () => {
|
|
2693
|
-
const message = textarea.value.trim();
|
|
2694
|
-
if (!message) return;
|
|
2695
|
-
vscode.postMessage({ command: 'gitAction', action: 'commit', args: { message } });
|
|
2696
|
-
textarea.value = '';
|
|
2697
|
-
commitBtn.disabled = true;
|
|
2698
|
-
});
|
|
2699
|
-
}
|
|
2700
|
-
|
|
2701
|
-
// --- Detail panel ---
|
|
2702
|
-
|
|
2703
|
-
/* A value you can read in full and click to copy. Anything with a data-copy
|
|
2704
|
-
attribute is handled by the panel's one click delegate. */
|
|
2705
|
-
function copyable(inner, text, cls) {
|
|
2706
|
-
return '<span class="meta-value ' + cls + '" data-copy="' + escHtml(text)
|
|
2707
|
-
+ '" title="Click to copy">' + inner + '</span>';
|
|
2708
|
-
}
|
|
2709
|
-
|
|
2710
|
-
/* Forty hex characters in one run is not text anyone reads. The eight that
|
|
2711
|
-
identify the commit carry the contrast and the other thirty-two go quiet —
|
|
2712
|
-
the whole thing is still there, and still what a click copies. */
|
|
2713
|
-
function hashCell(hash) {
|
|
2714
|
-
const lead = String(hash).slice(0, 8);
|
|
2715
|
-
const tail = String(hash).slice(8);
|
|
2716
|
-
return copyable('<span class="hash-lead">' + escHtml(lead) + '</span>' + escHtml(tail), hash, 'mono');
|
|
2717
|
-
}
|
|
2718
|
-
|
|
2719
|
-
/* Name and email are two things, so they are told apart by weight rather than
|
|
2720
|
-
by angle brackets. What a click copies is still the canonical form, which is
|
|
2721
|
-
what git itself wants back. */
|
|
2722
|
-
function personCell(name, email) {
|
|
2723
|
-
return copyable(
|
|
2724
|
-
'<span class="meta-name">' + escHtml(name) + '</span><span class="meta-email">' + escHtml(email) + '</span>',
|
|
2725
|
-
name + ' <' + email + '>',
|
|
2726
|
-
'person',
|
|
2727
|
-
);
|
|
2728
|
-
}
|
|
2729
|
-
|
|
2730
|
-
/* The timezone is part of the answer: a commit stamped 09:13 means nothing
|
|
2731
|
-
without knowing whose morning that was. Spelled out component by component
|
|
2732
|
-
because dateStyle and timeStyle may not be combined with any other option —
|
|
2733
|
-
asking for those plus timeZoneName is a TypeError, and behind a catch it
|
|
2734
|
-
looks exactly like a locale that has no timezone name to give. */
|
|
2735
|
-
const WHEN_FORMAT = {
|
|
2736
|
-
year: 'numeric', month: 'short', day: 'numeric',
|
|
2737
|
-
hour: 'numeric', minute: '2-digit', second: '2-digit',
|
|
2738
|
-
timeZoneName: 'short',
|
|
2739
|
-
};
|
|
2740
|
-
function whenCell(ts) {
|
|
2741
|
-
const when = new Date(ts * 1000);
|
|
2742
|
-
return '<span class="meta-when">' + escHtml(when.toLocaleString(undefined, WHEN_FORMAT)) + '</span>';
|
|
2743
|
-
}
|
|
2744
|
-
|
|
2745
|
-
/* One label, one value, every row the same shape. The date used to ride along
|
|
2746
|
-
in a third column so that the two dates lined up — which put it a name's
|
|
2747
|
-
width away from the name it belonged to, and stranded it against the far edge
|
|
2748
|
-
of the pane on any row that had one. A date is a field like the others. */
|
|
2749
|
-
function metaRow(label, cells) {
|
|
2750
|
-
return '<div class="meta-label">' + escHtml(label) + '</div>'
|
|
2751
|
-
+ '<div class="meta-cells">' + cells.join('') + '</div>';
|
|
2752
|
-
}
|
|
2753
|
-
|
|
2754
|
-
function renderDetailPanel(detail) {
|
|
2755
|
-
state._lastDetail = detail;
|
|
2756
|
-
const panel = document.getElementById('detail-panel');
|
|
2757
|
-
panel.classList.remove('hidden');
|
|
2758
|
-
|
|
2759
|
-
// Who and when, then the way out: the glanceable half.
|
|
2760
|
-
let head = '<div class="detail-head">' + avatarHtml(detail.author, detail.authorEmail);
|
|
2761
|
-
head += '<div class="detail-who">';
|
|
2762
|
-
head += '<span class="detail-author" title="' + escHtml(detail.authorEmail) + '">' + escHtml(detail.author) + '</span>';
|
|
2763
|
-
head += '<span class="detail-when" title="' + escHtml(new Date(detail.authorDate * 1000).toLocaleString()) + '">committed ' + escHtml(formatDate(detail.authorDate)) + '</span>';
|
|
2764
|
-
if (detail.committer !== detail.author) {
|
|
2765
|
-
head += '<span class="detail-when" title="' + escHtml(detail.committerEmail) + '">via ' + escHtml(detail.committer) + '</span>';
|
|
2766
|
-
}
|
|
2767
|
-
head += '</div><div class="detail-head-actions">';
|
|
2768
|
-
head += '<button class="detail-close" title="Close (Esc)" aria-label="Close commit details">' + ICONS.x + '</button>';
|
|
2769
|
-
head += '</div></div>';
|
|
2770
|
-
|
|
2771
|
-
// Then the values themselves, which since the chips gave up the header is
|
|
2772
|
-
// where both hashes are. Every row is always here, in
|
|
2773
|
-
// the same order, even when the committer repeats the author: a field that
|
|
2774
|
-
// comes and goes cannot be found by muscle memory, and the two dates only
|
|
2775
|
-
// mean anything next to each other — which is what a rebase or an amend does
|
|
2776
|
-
// to them, and the reason both are separate fields rather than one date.
|
|
2777
|
-
let meta = '<div class="detail-meta">';
|
|
2778
|
-
meta += metaRow('Commit', [hashCell(detail.hash)]);
|
|
2779
|
-
if (detail.parents.length > 0) {
|
|
2780
|
-
meta += metaRow(detail.parents.length > 1 ? 'Parents' : 'Parent', detail.parents.map(hashCell));
|
|
2781
|
-
}
|
|
2782
|
-
meta += metaRow('Author', [personCell(detail.author, detail.authorEmail)]);
|
|
2783
|
-
meta += metaRow('Author date', [whenCell(detail.authorDate)]);
|
|
2784
|
-
meta += metaRow('Committer', [personCell(detail.committer, detail.committerEmail)]);
|
|
2785
|
-
meta += metaRow('Commit date', [whenCell(detail.commitDate)]);
|
|
2786
|
-
meta += '</div>';
|
|
2787
|
-
|
|
2788
|
-
// The subject carries the weight; the body keeps the author's own wrapping.
|
|
2789
|
-
const message = String(detail.message || '');
|
|
2790
|
-
const firstBreak = message.indexOf('\\n');
|
|
2791
|
-
const subject = firstBreak === -1 ? message : message.slice(0, firstBreak);
|
|
2792
|
-
const body = firstBreak === -1 ? '' : message.slice(firstBreak + 1).replace(/^\\n+/, '').replace(/\\s+$/, '');
|
|
2793
|
-
let left = '<div class="detail-msg">' + meta + '<div class="detail-subject">' + formatCommitMessage(subject) + '</div>';
|
|
2794
|
-
if (body) {
|
|
2795
|
-
// A paragraph the author wrapped at 72 columns is reflowed to the pane it
|
|
2796
|
-
// is actually in; a list or an aligned block keeps every break it had.
|
|
2797
|
-
let blocks = '';
|
|
2798
|
-
for (const block of splitCommitBody(body)) {
|
|
2799
|
-
blocks += block.kind === 'prose'
|
|
2800
|
-
? '<p class="msg-p">' + formatCommitMessage(block.text) + '</p>'
|
|
2801
|
-
: '<pre class="msg-pre">' + formatCommitMessage(block.text) + '</pre>';
|
|
2802
|
-
}
|
|
2803
|
-
left += '<div class="detail-text">' + blocks + '</div>';
|
|
2804
|
-
}
|
|
2805
|
-
left += '</div>';
|
|
2806
|
-
|
|
2807
|
-
let right = '';
|
|
2808
|
-
if (detail.fileChanges && detail.fileChanges.length > 0) {
|
|
2809
|
-
let added = 0, removed = 0;
|
|
2810
|
-
for (const f of detail.fileChanges) { added += f.additions || 0; removed += f.deletions || 0; }
|
|
2811
|
-
right = '<div class="detail-files"><div class="file-list"><div class="files-head">'
|
|
2812
|
-
+ '<span>' + fileCountLabel(detail.fileChanges.length, detail.filesOmitted || 0) + '</span>'
|
|
2813
|
-
+ '<span class="files-total">'
|
|
2814
|
-
+ (added > 0 ? '<span class="add">+' + added + '</span> ' : '')
|
|
2815
|
-
+ (removed > 0 ? '<span class="del">-' + removed + '</span>' : '')
|
|
2816
|
-
+ '</span>' + fileViewToggleHtml() + '</div>'
|
|
2817
|
-
+ renderFileListHtml(detail.fileChanges, detail.hash, detail.parents[0] || '')
|
|
2818
|
-
+ '</div></div>';
|
|
2819
|
-
}
|
|
2820
|
-
|
|
2821
|
-
// The split panes each own a scrollbar, which means the panel must stop
|
|
2822
|
-
// owning one — and must give it back for any other view written into it.
|
|
2823
|
-
panel.classList.toggle('split', !!right);
|
|
2824
|
-
panel.innerHTML = head + '<div class="detail-grid' + (right ? ' has-files' : '') + '">' + left + right + '</div>';
|
|
2825
|
-
}
|
|
2826
|
-
|
|
2827
|
-
// --- Context menu ---
|
|
2828
|
-
function showCommitContextMenu(x, y, commit) {
|
|
2829
|
-
const menu = document.getElementById('context-menu');
|
|
2830
|
-
const items = [
|
|
2831
|
-
{ label: 'Copy Commit Hash', action: () => copyText(commit.hash) },
|
|
2832
|
-
{ label: 'Copy Short Hash', action: () => copyText(commit.hash.substring(0, 7)) },
|
|
2833
|
-
{ separator: true },
|
|
2834
|
-
{ label: 'Checkout...', action: () => gitAction('checkout', { target: commit.hash }) },
|
|
2835
|
-
{ label: 'Create Branch Here...', action: () => promptAndAction('Branch name:', (name) => gitAction('createBranch', { name, startPoint: commit.hash })) },
|
|
2836
|
-
{ label: 'Create Tag Here...', action: () => promptAndAction('Tag name:', (name) => gitAction('createTag', { name, hash: commit.hash })) },
|
|
2837
|
-
{ label: 'Create Worktree Here...', action: () => showCreateWorktreeDialog(commit.hash) },
|
|
2838
|
-
{ separator: true },
|
|
2839
|
-
{ label: 'Rebase current branch onto this...', action: () => {
|
|
2840
|
-
showDialog({
|
|
2841
|
-
title: 'Rebase',
|
|
2842
|
-
message: 'Rebase current branch (' + escHtml(state.currentBranch) + ') onto commit ' + commit.hash.substring(0, 7) + '?',
|
|
2843
|
-
rawMessage: true,
|
|
2844
|
-
confirmLabel: 'Rebase',
|
|
2845
|
-
onConfirm: () => gitAction('rebase', { branch: commit.hash }),
|
|
2846
|
-
});
|
|
2847
|
-
}},
|
|
2848
|
-
];
|
|
2849
|
-
// Add "Create PR" if PR creation is configured and commit has a branch ref
|
|
2850
|
-
if (state.settings.prCreation && state.settings.prCreation.urlTemplate) {
|
|
2851
|
-
const branchRef = (commit.refs || []).find(r => r.type === 'local' || r.type === 'head');
|
|
2852
|
-
if (branchRef) {
|
|
2853
|
-
items.push({ separator: true });
|
|
2854
|
-
items.push({ label: 'Create Pull Request (' + branchRef.name + ')', action: () => openPrUrl(branchRef.name) });
|
|
2855
|
-
}
|
|
2856
|
-
}
|
|
2857
|
-
items.push(
|
|
2858
|
-
{ separator: true },
|
|
2859
|
-
{ label: 'Cherry-pick', action: () => gitAction('cherryPick', { hash: commit.hash }) },
|
|
2860
|
-
{ label: 'Revert', action: () => gitAction('revert', { hash: commit.hash }) },
|
|
2861
|
-
{ separator: true },
|
|
2862
|
-
{ label: 'Interactive rebase from here...', action: () => vscode.postMessage({ command: 'openInteractiveRebase', base: commit.hash }) },
|
|
2863
|
-
{ label: 'Compare with current branch...', action: () => vscode.postMessage({ command: 'openCompare', ref1: commit.hash, ref2: state.currentBranch || undefined }) },
|
|
2864
|
-
{ separator: true },
|
|
2865
|
-
{ label: 'Reset Current Branch to Here...', destructive: true, action: () => promptResetMode(commit.hash) },
|
|
2866
|
-
);
|
|
2867
|
-
|
|
2868
|
-
let html = '';
|
|
2869
|
-
items.forEach((item, idx) => {
|
|
2870
|
-
if (item.separator) {
|
|
2871
|
-
html += '<div class="ctx-separator"></div>';
|
|
2872
|
-
} else {
|
|
2873
|
-
html += '<div class="ctx-item' + (item.destructive ? ' destructive' : '') + '" data-idx="' + idx + '">' + escHtml(item.label) + '</div>';
|
|
2874
|
-
}
|
|
2875
|
-
});
|
|
2876
|
-
menu.innerHTML = html;
|
|
2877
|
-
|
|
2878
|
-
// Position (clamp to viewport)
|
|
2879
|
-
menu.style.left = Math.min(x, window.innerWidth - 200) + 'px';
|
|
2880
|
-
menu.style.top = Math.min(y, window.innerHeight - 300) + 'px';
|
|
2881
|
-
menu.classList.remove('hidden');
|
|
2882
|
-
|
|
2883
|
-
// Bind click handlers
|
|
2884
|
-
menu.querySelectorAll('.ctx-item').forEach(el => {
|
|
2885
|
-
const idx = parseInt(el.dataset.idx);
|
|
2886
|
-
const item = items[idx];
|
|
2887
|
-
if (item && item.action) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
|
|
2888
|
-
});
|
|
2889
|
-
|
|
2890
|
-
// Close on click outside
|
|
2891
|
-
setTimeout(() => document.addEventListener('click', hideContextMenu, { once: true }), 0);
|
|
2892
|
-
}
|
|
2893
|
-
|
|
2894
|
-
function showUncommittedContextMenu(x, y) {
|
|
2895
|
-
const menu = document.getElementById('context-menu');
|
|
2896
|
-
const items = [
|
|
2897
|
-
{ label: 'Stash Uncommitted Changes...', action: () => {
|
|
2898
|
-
showDialog({
|
|
2899
|
-
title: 'Stash Changes',
|
|
2900
|
-
input: { placeholder: 'Stash message (optional)' },
|
|
2901
|
-
confirmLabel: 'Stash',
|
|
2902
|
-
onConfirm: (message) => gitAction('stashSave', message ? { message } : {}),
|
|
2903
|
-
});
|
|
2904
|
-
}},
|
|
2905
|
-
{ label: 'Reset Uncommitted Changes...', destructive: true, action: () => {
|
|
2906
|
-
showDialog({
|
|
2907
|
-
title: 'Reset Changes',
|
|
2908
|
-
message: 'Reset all uncommitted changes. Staged changes will be unstaged.',
|
|
2909
|
-
select: { options: ['mixed', 'hard'], defaultValue: 'mixed', label: 'Reset mode:' },
|
|
2910
|
-
destructive: true,
|
|
2911
|
-
confirmLabel: 'Reset',
|
|
2912
|
-
onConfirm: (mode) => {
|
|
2913
|
-
if (mode === 'hard') {
|
|
2914
|
-
showDialog({
|
|
2915
|
-
title: 'Confirm Hard Reset',
|
|
2916
|
-
message: 'WARNING: --hard will permanently discard ALL uncommitted changes!',
|
|
2917
|
-
destructive: true,
|
|
2918
|
-
confirmLabel: 'Reset Hard',
|
|
2919
|
-
onConfirm: () => gitAction('reset', { mode: 'hard', hash: 'HEAD' }),
|
|
2920
|
-
});
|
|
2921
|
-
} else {
|
|
2922
|
-
gitAction('reset', { mode, hash: 'HEAD' });
|
|
2923
|
-
}
|
|
2924
|
-
},
|
|
2925
|
-
});
|
|
2926
|
-
}},
|
|
2927
|
-
{ label: 'Clean Untracked Files...', destructive: true, action: () => {
|
|
2928
|
-
showDialog({
|
|
2929
|
-
title: 'Clean Untracked Files',
|
|
2930
|
-
message: 'Permanently delete all untracked files and directories. This cannot be undone!',
|
|
2931
|
-
destructive: true,
|
|
2932
|
-
confirmLabel: 'Clean',
|
|
2933
|
-
onConfirm: () => gitAction('clean', {}),
|
|
2934
|
-
});
|
|
2935
|
-
}},
|
|
2936
|
-
{ separator: true },
|
|
2937
|
-
{ label: 'Open Source Control View', action: () => vscode.postMessage({ command: 'openSourceControl' }) },
|
|
2938
|
-
];
|
|
2939
|
-
|
|
2940
|
-
let html = '';
|
|
2941
|
-
items.forEach((item, idx) => {
|
|
2942
|
-
if (item.separator) {
|
|
2943
|
-
html += '<div class="ctx-separator"></div>';
|
|
2944
|
-
} else {
|
|
2945
|
-
html += '<div class="ctx-item' + (item.destructive ? ' destructive' : '') + '" data-idx="' + idx + '">' + escHtml(item.label) + '</div>';
|
|
2946
|
-
}
|
|
2947
|
-
});
|
|
2948
|
-
menu.innerHTML = html;
|
|
2949
|
-
menu.style.left = Math.min(x, window.innerWidth - 200) + 'px';
|
|
2950
|
-
menu.style.top = Math.min(y, window.innerHeight - 300) + 'px';
|
|
2951
|
-
menu.classList.remove('hidden');
|
|
2952
|
-
menu.querySelectorAll('.ctx-item').forEach(el => {
|
|
2953
|
-
const idx = parseInt(el.dataset.idx);
|
|
2954
|
-
const item = items[idx];
|
|
2955
|
-
if (item && item.action) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
|
|
2956
|
-
});
|
|
2957
|
-
setTimeout(() => document.addEventListener('click', hideContextMenu, { once: true }), 0);
|
|
2958
|
-
}
|
|
2959
|
-
|
|
2960
|
-
function showBranchContextMenu(x, y, branchName, refType, commit) {
|
|
2961
|
-
const menu = document.getElementById('context-menu');
|
|
2962
|
-
const items = [];
|
|
2963
|
-
|
|
2964
|
-
if (refType === 'head' || refType === 'local') {
|
|
2965
|
-
items.push(
|
|
2966
|
-
{ label: 'Checkout "' + branchName + '"', action: () => gitAction('checkout', { target: branchName }) },
|
|
2967
|
-
{ label: 'Merge into current branch', action: () => showDialog({
|
|
2968
|
-
title: 'Merge "' + branchName + '"',
|
|
2969
|
-
message: 'Merge "' + branchName + '" into the current branch?',
|
|
2970
|
-
confirmLabel: 'Merge',
|
|
2971
|
-
onConfirm: () => gitAction('merge', { branch: branchName }),
|
|
2972
|
-
})
|
|
2973
|
-
},
|
|
2974
|
-
{ label: 'Rebase onto "' + branchName + '"', action: () => showDialog({
|
|
2975
|
-
title: 'Rebase onto "' + branchName + '"',
|
|
2976
|
-
message: 'Rebase current branch onto "' + branchName + '"?',
|
|
2977
|
-
confirmLabel: 'Rebase',
|
|
2978
|
-
onConfirm: () => gitAction('rebase', { branch: branchName }),
|
|
2979
|
-
})
|
|
2980
|
-
},
|
|
2981
|
-
{ separator: true },
|
|
2982
|
-
{ label: 'Rename branch...', action: () => showDialog({
|
|
2983
|
-
title: 'Rename Branch',
|
|
2984
|
-
input: { placeholder: 'New branch name', defaultValue: branchName },
|
|
2985
|
-
confirmLabel: 'Rename',
|
|
2986
|
-
onConfirm: (newName) => { if (newName && newName !== branchName) gitAction('renameBranch', { oldName: branchName, newName }); },
|
|
2987
|
-
})
|
|
2988
|
-
},
|
|
2989
|
-
);
|
|
2990
|
-
if (refType !== 'head') {
|
|
2991
|
-
items.push(
|
|
2992
|
-
{ label: 'Delete branch...', destructive: true, action: () => showDialog({
|
|
2993
|
-
title: 'Delete Branch',
|
|
2994
|
-
message: 'Delete local branch "' + branchName + '"?',
|
|
2995
|
-
destructive: true,
|
|
2996
|
-
confirmLabel: 'Delete',
|
|
2997
|
-
onConfirm: () => gitAction('deleteBranch', { name: branchName, force: false }),
|
|
2998
|
-
})
|
|
2999
|
-
},
|
|
3000
|
-
);
|
|
3001
|
-
}
|
|
3002
|
-
if (state.settings.prCreation && state.settings.prCreation.urlTemplate) {
|
|
3003
|
-
items.push({ separator: true });
|
|
3004
|
-
items.push({ label: 'Create Pull Request', action: () => openPrUrl(branchName) });
|
|
3005
|
-
}
|
|
3006
|
-
} else if (refType === 'remote') {
|
|
3007
|
-
items.push(
|
|
3008
|
-
{ label: 'Checkout as local branch', action: () => gitAction('checkout', { target: branchName }) },
|
|
3009
|
-
{ separator: true },
|
|
3010
|
-
{ label: 'Delete remote branch...', destructive: true, action: () => showDialog({
|
|
3011
|
-
title: 'Delete Remote Branch',
|
|
3012
|
-
message: 'Delete remote branch "' + branchName + '"? This cannot be undone.',
|
|
3013
|
-
destructive: true,
|
|
3014
|
-
confirmLabel: 'Delete',
|
|
3015
|
-
onConfirm: () => {
|
|
3016
|
-
const parts = branchName.split('/');
|
|
3017
|
-
const remote = parts[0];
|
|
3018
|
-
const branch = parts.slice(1).join('/');
|
|
3019
|
-
gitAction('push', { remote, branch, force: false, delete: true });
|
|
3020
|
-
},
|
|
3021
|
-
})
|
|
3022
|
-
},
|
|
3023
|
-
);
|
|
3024
|
-
} else if (refType === 'tag') {
|
|
3025
|
-
items.push(
|
|
3026
|
-
{ label: 'Checkout tag "' + branchName + '"', action: () => gitAction('checkout', { target: branchName }) },
|
|
3027
|
-
{ separator: true },
|
|
3028
|
-
{ label: 'Delete tag...', destructive: true, action: () => showDialog({
|
|
3029
|
-
title: 'Delete Tag',
|
|
3030
|
-
message: 'Delete tag "' + branchName + '"?',
|
|
3031
|
-
destructive: true,
|
|
3032
|
-
confirmLabel: 'Delete',
|
|
3033
|
-
onConfirm: () => gitAction('deleteTag', { name: branchName }),
|
|
3034
|
-
})
|
|
3035
|
-
},
|
|
3036
|
-
);
|
|
3037
|
-
}
|
|
3038
|
-
|
|
3039
|
-
let html = '';
|
|
3040
|
-
items.forEach((item, idx) => {
|
|
3041
|
-
if (item.separator) {
|
|
3042
|
-
html += '<div class="ctx-separator"></div>';
|
|
3043
|
-
} else {
|
|
3044
|
-
html += '<div class="ctx-item' + (item.destructive ? ' destructive' : '') + '" data-idx="' + idx + '">' + escHtml(item.label) + '</div>';
|
|
3045
|
-
}
|
|
3046
|
-
});
|
|
3047
|
-
menu.innerHTML = html;
|
|
3048
|
-
menu.style.left = Math.min(x, window.innerWidth - 220) + 'px';
|
|
3049
|
-
menu.style.top = Math.min(y, window.innerHeight - 300) + 'px';
|
|
3050
|
-
menu.classList.remove('hidden');
|
|
3051
|
-
menu.querySelectorAll('.ctx-item').forEach(el => {
|
|
3052
|
-
const idx = parseInt(el.dataset.idx);
|
|
3053
|
-
const item = items[idx];
|
|
3054
|
-
if (item && item.action) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
|
|
3055
|
-
});
|
|
3056
|
-
setTimeout(() => document.addEventListener('click', hideContextMenu, { once: true }), 0);
|
|
3057
|
-
}
|
|
3058
|
-
|
|
3059
|
-
function showStashBadgeMenu(x, y, stashRef) {
|
|
3060
|
-
const menu = document.getElementById('context-menu');
|
|
3061
|
-
const items = [
|
|
3062
|
-
{ label: 'Apply (keep stash)', action: () => gitAction('stashApply', { stashRef }) },
|
|
3063
|
-
{ label: 'Pop (apply & remove)', action: () => gitAction('stashPop', { stashRef }) },
|
|
3064
|
-
{ separator: true },
|
|
3065
|
-
{ label: 'Drop stash...', destructive: true, action: () => showDialog({
|
|
3066
|
-
title: 'Drop Stash',
|
|
3067
|
-
message: 'Delete ' + stashRef + '? This cannot be undone.',
|
|
3068
|
-
destructive: true,
|
|
3069
|
-
confirmLabel: 'Drop',
|
|
3070
|
-
onConfirm: () => gitAction('stashDrop', { stashRef }),
|
|
3071
|
-
})
|
|
3072
|
-
},
|
|
3073
|
-
];
|
|
3074
|
-
let html = '';
|
|
3075
|
-
items.forEach((item, idx) => {
|
|
3076
|
-
if (item.separator) {
|
|
3077
|
-
html += '<div class="ctx-separator"></div>';
|
|
3078
|
-
} else {
|
|
3079
|
-
html += '<div class="ctx-item' + (item.destructive ? ' destructive' : '') + '" data-idx="' + idx + '">' + escHtml(item.label) + '</div>';
|
|
3080
|
-
}
|
|
3081
|
-
});
|
|
3082
|
-
menu.innerHTML = html;
|
|
3083
|
-
menu.style.left = Math.min(x, window.innerWidth - 200) + 'px';
|
|
3084
|
-
menu.style.top = Math.min(y, window.innerHeight - 200) + 'px';
|
|
3085
|
-
menu.classList.remove('hidden');
|
|
3086
|
-
menu.querySelectorAll('.ctx-item').forEach(el => {
|
|
3087
|
-
const idx = parseInt(el.dataset.idx);
|
|
3088
|
-
const item = items[idx];
|
|
3089
|
-
if (item && item.action) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
|
|
3090
|
-
});
|
|
3091
|
-
setTimeout(() => document.addEventListener('click', hideContextMenu, { once: true }), 0);
|
|
3092
|
-
}
|
|
3093
|
-
|
|
3094
|
-
function hideContextMenu() {
|
|
3095
|
-
document.getElementById('context-menu').classList.add('hidden');
|
|
3096
|
-
}
|
|
3097
|
-
|
|
3098
|
-
function gitAction(action, args) {
|
|
3099
|
-
vscode.postMessage({ command: 'gitAction', action, args });
|
|
3100
|
-
}
|
|
3101
|
-
|
|
3102
|
-
function promptAndAction(title, callback) {
|
|
3103
|
-
showDialog({ title, input: { placeholder: title }, onConfirm: (val) => { if (val) callback(val); } });
|
|
3104
|
-
}
|
|
3105
|
-
|
|
3106
|
-
function promptResetMode(hash) {
|
|
3107
|
-
showDialog({
|
|
3108
|
-
title: 'Reset Current Branch',
|
|
3109
|
-
select: { options: ['soft', 'mixed', 'hard'], defaultValue: 'mixed', label: 'Reset mode:' },
|
|
3110
|
-
onConfirm: (mode) => {
|
|
3111
|
-
if (mode === 'hard') {
|
|
3112
|
-
showDialog({
|
|
3113
|
-
title: 'Confirm Hard Reset',
|
|
3114
|
-
message: 'WARNING: --hard will discard ALL uncommitted changes. This cannot be undone!',
|
|
3115
|
-
destructive: true,
|
|
3116
|
-
confirmLabel: 'Reset Hard',
|
|
3117
|
-
onConfirm: () => gitAction('reset', { mode, hash }),
|
|
3118
|
-
});
|
|
3119
|
-
} else {
|
|
3120
|
-
gitAction('reset', { mode, hash });
|
|
3121
|
-
}
|
|
3122
|
-
},
|
|
3123
|
-
});
|
|
3124
|
-
}
|
|
3125
|
-
|
|
3126
|
-
/* A panel is mounted sandbox="allow-scripts" with no allow-same-origin, so it
|
|
3127
|
-
runs at an OPAQUE ORIGIN — and the default Permissions Policy allowlist for
|
|
3128
|
-
clipboard-write is "self", which an opaque origin never matches. Measured in
|
|
3129
|
-
Chromium with the iframe focused and a real click: writeText rejects with
|
|
3130
|
-
NotAllowedError ("blocked because of a permissions policy"), while a textarea
|
|
3131
|
-
plus execCommand('copy') returns true and the text really does land on the
|
|
3132
|
-
system clipboard (pasted it back out to check). So every click-to-copy value
|
|
3133
|
-
in every panel had been copying nothing, and saying that it had.
|
|
3134
|
-
|
|
3135
|
-
The modern call is still tried first, for the day the policy changes. The
|
|
3136
|
-
textarea has to stay RENDERED — display:none or visibility:hidden give an
|
|
3137
|
-
empty selection and execCommand then copies nothing while still returning
|
|
3138
|
-
true — and setSelectionRange is what actually selects on iOS. */
|
|
3139
|
-
async function copyText(text) {
|
|
3140
|
-
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
3141
|
-
try {
|
|
3142
|
-
await navigator.clipboard.writeText(text);
|
|
3143
|
-
return true;
|
|
3144
|
-
} catch (e) { /* fall through */ }
|
|
3145
|
-
}
|
|
3146
|
-
const ta = document.createElement('textarea');
|
|
3147
|
-
ta.value = String(text == null ? '' : text);
|
|
3148
|
-
ta.setAttribute('readonly', '');
|
|
3149
|
-
ta.style.cssText = 'position:fixed;top:0;left:0;width:1px;height:1px;padding:0;border:none;opacity:0;';
|
|
3150
|
-
document.body.appendChild(ta);
|
|
3151
|
-
const selection = document.getSelection();
|
|
3152
|
-
const previous = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : null;
|
|
3153
|
-
try {
|
|
3154
|
-
ta.focus();
|
|
3155
|
-
ta.select();
|
|
3156
|
-
ta.setSelectionRange(0, ta.value.length);
|
|
3157
|
-
return document.execCommand('copy');
|
|
3158
|
-
} catch (e) {
|
|
3159
|
-
return false;
|
|
3160
|
-
} finally {
|
|
3161
|
-
ta.remove();
|
|
3162
|
-
if (selection && previous) { selection.removeAllRanges(); selection.addRange(previous); }
|
|
3163
|
-
}
|
|
3164
|
-
}
|
|
3165
|
-
|
|
3166
|
-
// --- Dialog system ---
|
|
3167
|
-
function showDialog(opts) {
|
|
3168
|
-
const overlay = document.createElement('div');
|
|
3169
|
-
overlay.className = 'dialog-overlay';
|
|
3170
|
-
const dialog = document.createElement('div');
|
|
3171
|
-
dialog.className = 'dialog';
|
|
3172
|
-
dialog.innerHTML = '<h3>' + escHtml(opts.title || 'Dialog') + '</h3>';
|
|
3173
|
-
if (opts.message) {
|
|
3174
|
-
const msgHtml = opts.rawMessage ? opts.message : escHtml(opts.message);
|
|
3175
|
-
dialog.innerHTML += '<p' + (opts.destructive ? ' class="warning"' : '') + '>' + msgHtml + '</p>';
|
|
3176
|
-
}
|
|
3177
|
-
|
|
3178
|
-
let inputEl = null;
|
|
3179
|
-
if (opts.input) {
|
|
3180
|
-
inputEl = document.createElement('input');
|
|
3181
|
-
inputEl.type = 'text';
|
|
3182
|
-
inputEl.placeholder = opts.input.placeholder || '';
|
|
3183
|
-
if (opts.input.defaultValue) inputEl.value = opts.input.defaultValue;
|
|
3184
|
-
dialog.appendChild(inputEl);
|
|
3185
|
-
}
|
|
3186
|
-
if (opts.select) {
|
|
3187
|
-
if (opts.select.label) dialog.innerHTML += '<p>' + escHtml(opts.select.label) + '</p>';
|
|
3188
|
-
inputEl = document.createElement('select');
|
|
3189
|
-
opts.select.options.forEach(o => {
|
|
3190
|
-
const opt = document.createElement('option');
|
|
3191
|
-
opt.value = o; opt.textContent = o;
|
|
3192
|
-
if (o === opts.select.defaultValue) opt.selected = true;
|
|
3193
|
-
inputEl.appendChild(opt);
|
|
3194
|
-
});
|
|
3195
|
-
dialog.appendChild(inputEl);
|
|
3196
|
-
}
|
|
3197
|
-
|
|
3198
|
-
const actions = document.createElement('div');
|
|
3199
|
-
actions.className = 'dialog-actions';
|
|
3200
|
-
const cancelBtn = document.createElement('button');
|
|
3201
|
-
cancelBtn.textContent = opts.cancelLabel || 'Cancel';
|
|
3202
|
-
cancelBtn.className = 'secondary';
|
|
3203
|
-
cancelBtn.addEventListener('click', () => overlay.remove());
|
|
3204
|
-
const confirmBtn = document.createElement('button');
|
|
3205
|
-
confirmBtn.textContent = opts.confirmLabel || 'OK';
|
|
3206
|
-
confirmBtn.className = opts.destructive ? 'btn-danger' : 'btn-primary';
|
|
3207
|
-
confirmBtn.addEventListener('click', () => {
|
|
3208
|
-
overlay.remove();
|
|
3209
|
-
if (opts.onConfirm) opts.onConfirm(inputEl ? inputEl.value : undefined);
|
|
3210
|
-
});
|
|
3211
|
-
actions.appendChild(cancelBtn);
|
|
3212
|
-
actions.appendChild(confirmBtn);
|
|
3213
|
-
dialog.appendChild(actions);
|
|
3214
|
-
overlay.appendChild(dialog);
|
|
3215
|
-
document.body.appendChild(overlay);
|
|
3216
|
-
|
|
3217
|
-
// Focus input and handle Enter/Escape
|
|
3218
|
-
if (inputEl) setTimeout(() => inputEl.focus(), 50);
|
|
3219
|
-
overlay.addEventListener('keydown', (e) => {
|
|
3220
|
-
if (e.key === 'Escape') overlay.remove();
|
|
3221
|
-
if (e.key === 'Enter') confirmBtn.click();
|
|
3222
|
-
});
|
|
3223
|
-
}
|
|
3224
|
-
|
|
3225
|
-
// --- Mobile long-press ---
|
|
3226
|
-
function setupLongPress(el, callback) {
|
|
3227
|
-
let timer = null;
|
|
3228
|
-
let startX = 0, startY = 0;
|
|
3229
|
-
el.addEventListener('touchstart', (e) => {
|
|
3230
|
-
startX = e.touches[0].clientX;
|
|
3231
|
-
startY = e.touches[0].clientY;
|
|
3232
|
-
timer = setTimeout(() => { e.preventDefault(); callback(startX, startY); }, 500);
|
|
3233
|
-
}, { passive: false });
|
|
3234
|
-
el.addEventListener('touchmove', (e) => {
|
|
3235
|
-
if (timer && (Math.abs(e.touches[0].clientX - startX) > 10 || Math.abs(e.touches[0].clientY - startY) > 10)) {
|
|
3236
|
-
clearTimeout(timer); timer = null;
|
|
3237
|
-
}
|
|
3238
|
-
}, { passive: true });
|
|
3239
|
-
el.addEventListener('touchend', () => { if (timer) { clearTimeout(timer); timer = null; } });
|
|
3240
|
-
el.addEventListener('touchcancel', () => { if (timer) { clearTimeout(timer); timer = null; } });
|
|
3241
|
-
}
|
|
3242
|
-
|
|
3243
|
-
// --- Text formatter (URLs, issues, commit hashes) ---
|
|
3244
|
-
${COMMIT_MESSAGE_JS}
|
|
3245
|
-
|
|
3246
|
-
// --- Find widget ---
|
|
3247
|
-
const findBar = document.getElementById('find-bar');
|
|
3248
|
-
const findInput = document.getElementById('find-input');
|
|
3249
|
-
|
|
3250
|
-
document.getElementById('btn-reflog').addEventListener('click', () => vscode.postMessage({ command: 'openReflog' }));
|
|
3251
|
-
document.getElementById('btn-find').addEventListener('click', toggleFind);
|
|
3252
|
-
|
|
3253
|
-
function toggleFind() {
|
|
3254
|
-
findBar.classList.toggle('hidden');
|
|
3255
|
-
if (!findBar.classList.contains('hidden')) findInput.focus();
|
|
3256
|
-
else clearSearch();
|
|
3257
|
-
}
|
|
3258
|
-
|
|
3259
|
-
const findMode = document.getElementById('find-mode');
|
|
3260
|
-
const searchResultsEl = document.getElementById('search-results');
|
|
3261
|
-
|
|
3262
|
-
/*
|
|
3263
|
-
* "Loaded rows" keeps the original behaviour: highlight matches among the rows
|
|
3264
|
-
* already rendered. The other modes run in git over the whole history, because a
|
|
3265
|
-
* commit older than the current page is otherwise invisible to a search.
|
|
3266
|
-
*/
|
|
3267
|
-
findInput.addEventListener('input', () => {
|
|
3268
|
-
if (findMode.value === 'loaded') doSearch(findInput.value);
|
|
3269
|
-
});
|
|
3270
|
-
|
|
3271
|
-
findInput.addEventListener('keydown', (e) => {
|
|
3272
|
-
if (e.key !== 'Enter' || findMode.value === 'loaded') return;
|
|
3273
|
-
e.preventDefault();
|
|
3274
|
-
runHistorySearch();
|
|
3275
|
-
});
|
|
3276
|
-
|
|
3277
|
-
findMode.addEventListener('change', () => {
|
|
3278
|
-
clearSearchHighlights();
|
|
3279
|
-
hideSearchResults();
|
|
3280
|
-
document.getElementById('find-count').textContent = '';
|
|
3281
|
-
if (findMode.value === 'loaded') doSearch(findInput.value);
|
|
3282
|
-
else if (findInput.value.trim()) runHistorySearch();
|
|
3283
|
-
findInput.placeholder = findMode.value === 'loaded'
|
|
3284
|
-
? 'Search commits...'
|
|
3285
|
-
: findMode.value === 'file' ? 'Path, then Enter…' : 'Type, then Enter…';
|
|
3286
|
-
});
|
|
3287
|
-
|
|
3288
|
-
function runHistorySearch() {
|
|
3289
|
-
const text = findInput.value.trim();
|
|
3290
|
-
if (!text) { hideSearchResults(); return; }
|
|
3291
|
-
document.getElementById('find-count').textContent = 'searching…';
|
|
3292
|
-
vscode.postMessage({ command: 'searchCommits', mode: findMode.value, text });
|
|
3293
|
-
}
|
|
3294
|
-
|
|
3295
|
-
function hideSearchResults() {
|
|
3296
|
-
searchResultsEl.classList.add('hidden');
|
|
3297
|
-
searchResultsEl.innerHTML = '';
|
|
3298
|
-
}
|
|
3299
|
-
|
|
3300
|
-
function renderSearchResults(data) {
|
|
3301
|
-
const hits = data.hits || [];
|
|
3302
|
-
document.getElementById('find-count').textContent = hits.length + ' match(es)';
|
|
3303
|
-
if (!hits.length) {
|
|
3304
|
-
searchResultsEl.innerHTML = '<div class="sr-head">Nothing in this repository matches.</div>';
|
|
3305
|
-
searchResultsEl.classList.remove('hidden');
|
|
3306
|
-
return;
|
|
3307
|
-
}
|
|
3308
|
-
const loaded = new Set(getDisplayCommits().map(c => c.hash));
|
|
3309
|
-
searchResultsEl.innerHTML = '<div class="sr-head">' + hits.length + ' commit(s) across all history — click to open</div>'
|
|
3310
|
-
+ hits.map(h =>
|
|
3311
|
-
'<div class="sr-item" data-hash="' + escHtml(h.hash) + '">'
|
|
3312
|
-
+ '<div class="sr-subject">' + escHtml(h.subject) + '</div>'
|
|
3313
|
-
+ '<div class="sr-meta">' + avatarHtml(h.author, h.authorEmail)
|
|
3314
|
-
+ '<span>' + escHtml(h.author) + '</span>'
|
|
3315
|
-
+ '<span>' + escHtml(formatDate(h.authorDate)) + '</span>'
|
|
3316
|
-
+ '<span class="sr-hash">' + escHtml(h.hash.substring(0, 7)) + '</span>'
|
|
3317
|
-
+ (loaded.has(h.hash) ? '' : '<span>not in the loaded range</span>')
|
|
3318
|
-
+ '</div>'
|
|
3319
|
-
+ '</div>').join('');
|
|
3320
|
-
searchResultsEl.classList.remove('hidden');
|
|
3321
|
-
}
|
|
3322
|
-
|
|
3323
|
-
searchResultsEl.addEventListener('click', (e) => {
|
|
3324
|
-
const item = e.target.closest('.sr-item');
|
|
3325
|
-
if (!item) return;
|
|
3326
|
-
const hash = item.dataset.hash;
|
|
3327
|
-
hideSearchResults();
|
|
3328
|
-
// Scroll to the row when this commit is on screen; otherwise just open its
|
|
3329
|
-
// details, since loading the intervening history could be thousands of rows.
|
|
3330
|
-
const row = document.querySelector('.commit-row[data-hash="' + hash + '"]');
|
|
3331
|
-
if (row) { selectCommit(hash); row.scrollIntoView({ block: 'center' }); }
|
|
3332
|
-
else { selectCommit(hash); }
|
|
3333
|
-
});
|
|
3334
|
-
|
|
3335
|
-
document.getElementById('find-next').addEventListener('click', () => navigateSearch(1));
|
|
3336
|
-
document.getElementById('find-prev').addEventListener('click', () => navigateSearch(-1));
|
|
3337
|
-
document.getElementById('find-close').addEventListener('click', () => { findBar.classList.add('hidden'); clearSearch(); });
|
|
3338
|
-
|
|
3339
|
-
function doSearch(query) {
|
|
3340
|
-
clearSearchHighlights();
|
|
3341
|
-
state.searchMatches = [];
|
|
3342
|
-
state.searchIndex = -1;
|
|
3343
|
-
if (!query.trim()) { document.getElementById('find-count').textContent = ''; return; }
|
|
3344
|
-
const q = query.toLowerCase();
|
|
3345
|
-
const displayCommits = getDisplayCommits();
|
|
3346
|
-
document.querySelectorAll('.commit-row:not(.header-row)').forEach((row, idx) => {
|
|
3347
|
-
const commit = displayCommits[idx];
|
|
3348
|
-
if (!commit || commit.hash === 'uncommitted') return;
|
|
3349
|
-
const match = commit.message.toLowerCase().includes(q) ||
|
|
3350
|
-
commit.author.toLowerCase().includes(q) ||
|
|
3351
|
-
commit.hash.toLowerCase().startsWith(q);
|
|
3352
|
-
if (match) { state.searchMatches.push(idx); row.classList.add('search-match'); }
|
|
3353
|
-
});
|
|
3354
|
-
document.getElementById('find-count').textContent = state.searchMatches.length + ' match(es)';
|
|
3355
|
-
renderScrollMarkers();
|
|
3356
|
-
if (state.searchMatches.length > 0) navigateSearch(0);
|
|
3357
|
-
}
|
|
3358
|
-
|
|
3359
|
-
function navigateSearch(dir) {
|
|
3360
|
-
if (state.searchMatches.length === 0) return;
|
|
3361
|
-
if (dir === 0) state.searchIndex = 0;
|
|
3362
|
-
else state.searchIndex = (state.searchIndex + dir + state.searchMatches.length) % state.searchMatches.length;
|
|
3363
|
-
const idx = state.searchMatches[state.searchIndex];
|
|
3364
|
-
const rows = document.querySelectorAll('.commit-row:not(.header-row)');
|
|
3365
|
-
if (rows[idx]) rows[idx].scrollIntoView({ block: 'center' });
|
|
3366
|
-
document.getElementById('find-count').textContent = (state.searchIndex + 1) + ' of ' + state.searchMatches.length;
|
|
3367
|
-
}
|
|
3368
|
-
|
|
3369
|
-
function clearSearch() {
|
|
3370
|
-
clearSearchHighlights();
|
|
3371
|
-
hideSearchResults();
|
|
3372
|
-
state.searchMatches = [];
|
|
3373
|
-
state.searchIndex = -1;
|
|
3374
|
-
findInput.value = '';
|
|
3375
|
-
document.getElementById('find-count').textContent = '';
|
|
3376
|
-
renderScrollMarkers();
|
|
3377
|
-
}
|
|
3378
|
-
|
|
3379
|
-
function clearSearchHighlights() {
|
|
3380
|
-
document.querySelectorAll('.search-match').forEach(el => el.classList.remove('search-match'));
|
|
3381
|
-
}
|
|
3382
|
-
|
|
3383
|
-
// --- Keyboard shortcuts ---
|
|
3384
|
-
document.addEventListener('keydown', (e) => {
|
|
3385
|
-
if ((e.ctrlKey || e.metaKey) && e.key === 'f') { e.preventDefault(); toggleFind(); }
|
|
3386
|
-
if (e.key === 'Escape') {
|
|
3387
|
-
hideContextMenu();
|
|
3388
|
-
if (!findBar.classList.contains('hidden')) { findBar.classList.add('hidden'); clearSearch(); }
|
|
3389
|
-
else if (state.expandedCommit) closeDetailPanel();
|
|
3390
|
-
}
|
|
3391
|
-
});
|
|
3392
|
-
|
|
3393
|
-
// --- Scroll to load more ---
|
|
3394
|
-
document.getElementById('graph-container').addEventListener('scroll', (e) => {
|
|
3395
|
-
const container = e.target;
|
|
3396
|
-
if (container.scrollTop + container.clientHeight >= container.scrollHeight - 50) {
|
|
3397
|
-
if (!state.loading && state.commits.length >= state.maxCommits) {
|
|
3398
|
-
state.loading = true;
|
|
3399
|
-
document.getElementById('loading').classList.remove('hidden');
|
|
3400
|
-
vscode.postMessage({ command: 'requestCommits', maxCommits: state.maxCommits, skip: state.commits.length });
|
|
3401
|
-
}
|
|
3402
|
-
}
|
|
3403
|
-
});
|
|
3404
|
-
|
|
3405
|
-
// --- Utilities ---
|
|
3406
|
-
function escHtml(s) { return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/'/g,'''); }
|
|
3407
|
-
${AVATAR_JS}
|
|
3408
|
-
|
|
3409
|
-
/* --- Author hover card --- */
|
|
3410
|
-
let authorCardEl = null;
|
|
3411
|
-
function showAuthorCard(anchorEl, commit) {
|
|
3412
|
-
hideAuthorCard();
|
|
3413
|
-
const rect = anchorEl.getBoundingClientRect();
|
|
3414
|
-
const card = document.createElement('div');
|
|
3415
|
-
card.className = 'author-card';
|
|
3416
|
-
card.innerHTML = '<div class="ac-head">' + avatarHtml(commit.author, commit.authorEmail)
|
|
3417
|
-
+ escHtml(commit.author) + '</div>'
|
|
3418
|
-
+ '<div class="ac-row">' + escHtml(commit.authorEmail || '') + '</div>'
|
|
3419
|
-
+ '<div class="ac-row">authored ' + escHtml(formatDate(commit.authorDate)) + '</div>'
|
|
3420
|
-
+ (commit.committer && commit.committer !== commit.author
|
|
3421
|
-
? '<div class="ac-row">committed by ' + escHtml(commit.committer) + '</div>'
|
|
3422
|
-
: '')
|
|
3423
|
-
+ '<div class="ac-row">' + escHtml(commit.hash.substring(0, 10)) + '</div>';
|
|
3424
|
-
document.body.appendChild(card);
|
|
3425
|
-
// Flip above the row when the card would fall off the bottom.
|
|
3426
|
-
const cardRect = card.getBoundingClientRect();
|
|
3427
|
-
const top = rect.bottom + cardRect.height > window.innerHeight ? rect.top - cardRect.height - 4 : rect.bottom + 4;
|
|
3428
|
-
card.style.top = Math.max(4, top) + 'px';
|
|
3429
|
-
card.style.left = Math.max(4, Math.min(rect.left, window.innerWidth - cardRect.width - 4)) + 'px';
|
|
3430
|
-
authorCardEl = card;
|
|
3431
|
-
}
|
|
3432
|
-
function hideAuthorCard() {
|
|
3433
|
-
if (authorCardEl) { authorCardEl.remove(); authorCardEl = null; }
|
|
3434
|
-
}
|
|
3435
|
-
|
|
3436
|
-
/* --- Drag a ref badge onto a commit to merge or rebase onto it --- */
|
|
3437
|
-
let dragRef = null;
|
|
3438
|
-
|
|
3439
|
-
function makeRefDraggable(badge, refName, refType) {
|
|
3440
|
-
// Only branches can be merged or rebased; tags and stashes cannot.
|
|
3441
|
-
if (refType === 'tag' || refType === 'stash') return;
|
|
3442
|
-
badge.draggable = true;
|
|
3443
|
-
badge.addEventListener('dragstart', (e) => {
|
|
3444
|
-
dragRef = { name: refName, type: refType };
|
|
3445
|
-
badge.classList.add('dragging');
|
|
3446
|
-
e.dataTransfer.effectAllowed = 'move';
|
|
3447
|
-
e.dataTransfer.setData('text/plain', refName);
|
|
3448
|
-
e.stopPropagation();
|
|
3449
|
-
});
|
|
3450
|
-
badge.addEventListener('dragend', () => {
|
|
3451
|
-
dragRef = null;
|
|
3452
|
-
badge.classList.remove('dragging');
|
|
3453
|
-
document.querySelectorAll('.commit-row.drop-target').forEach(r => r.classList.remove('drop-target'));
|
|
3454
|
-
});
|
|
3455
|
-
}
|
|
3456
|
-
|
|
3457
|
-
function makeRowDropTarget(row, commit) {
|
|
3458
|
-
if (commit.hash === 'uncommitted' || commit._isStash) return;
|
|
3459
|
-
row.addEventListener('dragover', (e) => {
|
|
3460
|
-
if (!dragRef) return;
|
|
3461
|
-
e.preventDefault();
|
|
3462
|
-
e.dataTransfer.dropEffect = 'move';
|
|
3463
|
-
row.classList.add('drop-target');
|
|
3464
|
-
});
|
|
3465
|
-
row.addEventListener('dragleave', () => row.classList.remove('drop-target'));
|
|
3466
|
-
row.addEventListener('drop', (e) => {
|
|
3467
|
-
if (!dragRef) return;
|
|
3468
|
-
e.preventDefault();
|
|
3469
|
-
row.classList.remove('drop-target');
|
|
3470
|
-
showDropActionMenu(e.clientX, e.clientY, dragRef, commit);
|
|
3471
|
-
dragRef = null;
|
|
3472
|
-
});
|
|
3473
|
-
}
|
|
3474
|
-
|
|
3475
|
-
function showDropActionMenu(x, y, ref, commit) {
|
|
3476
|
-
const short = commit.hash.substring(0, 7);
|
|
3477
|
-
const onCurrent = ref.name === state.currentBranch;
|
|
3478
|
-
const items = [];
|
|
3479
|
-
if (onCurrent) {
|
|
3480
|
-
// Dragging the checked-out branch onto a commit = move this branch there.
|
|
3481
|
-
items.push({ label: 'Rebase ' + ref.name + ' onto ' + short, action: () => showDialog({
|
|
3482
|
-
title: 'Rebase',
|
|
3483
|
-
message: 'Rebase ' + escHtml(ref.name) + ' onto commit ' + short + '?',
|
|
3484
|
-
rawMessage: true,
|
|
3485
|
-
confirmLabel: 'Rebase',
|
|
3486
|
-
onConfirm: () => gitAction('rebase', { branch: commit.hash }),
|
|
3487
|
-
}) });
|
|
3488
|
-
} else {
|
|
3489
|
-
items.push({ label: 'Merge ' + ref.name + ' into ' + (state.currentBranch || 'HEAD'), action: () => showDialog({
|
|
3490
|
-
title: 'Merge',
|
|
3491
|
-
message: 'Merge ' + escHtml(ref.name) + ' into ' + escHtml(state.currentBranch || 'HEAD') + '?',
|
|
3492
|
-
rawMessage: true,
|
|
3493
|
-
confirmLabel: 'Merge',
|
|
3494
|
-
onConfirm: () => gitAction('merge', { branch: ref.name }),
|
|
3495
|
-
}) });
|
|
3496
|
-
items.push({ label: 'Rebase ' + (state.currentBranch || 'HEAD') + ' onto ' + ref.name, action: () => showDialog({
|
|
3497
|
-
title: 'Rebase',
|
|
3498
|
-
message: 'Rebase ' + escHtml(state.currentBranch || 'HEAD') + ' onto ' + escHtml(ref.name) + '?',
|
|
3499
|
-
rawMessage: true,
|
|
3500
|
-
confirmLabel: 'Rebase',
|
|
3501
|
-
onConfirm: () => gitAction('rebase', { branch: ref.name }),
|
|
3502
|
-
}) });
|
|
3503
|
-
}
|
|
3504
|
-
items.push({ separator: true });
|
|
3505
|
-
items.push({ label: 'Compare ' + ref.name + ' with ' + short, action: () => vscode.postMessage({ command: 'openCompare', ref1: ref.name, ref2: commit.hash }) });
|
|
3506
|
-
renderContextMenu(x, y, items);
|
|
3507
|
-
}
|
|
3508
|
-
|
|
3509
|
-
/**
|
|
3510
|
-
* Render a context menu from an item list. The older menu builders each inline
|
|
3511
|
-
* this same block; new menus go through here.
|
|
3512
|
-
*
|
|
3513
|
-
* An item may carry a checked flag, drawn as a tick in a column of its own so
|
|
3514
|
-
* that a list of toggles does not jump sideways as they are turned on and off,
|
|
3515
|
-
* and a disabled flag for one that is real but unavailable right now.
|
|
3516
|
-
*/
|
|
3517
|
-
function renderContextMenu(x, y, items) {
|
|
3518
|
-
const menu = document.getElementById('context-menu');
|
|
3519
|
-
let html = '';
|
|
3520
|
-
items.forEach((item, idx) => {
|
|
3521
|
-
if (item.separator) {
|
|
3522
|
-
html += '<div class="ctx-separator"></div>';
|
|
3523
|
-
} else {
|
|
3524
|
-
const cls = 'ctx-item' + (item.destructive ? ' destructive' : '') + (item.disabled ? ' disabled' : '');
|
|
3525
|
-
const tick = item.checked === undefined ? '' :
|
|
3526
|
-
'<span class="ctx-tick">' + (item.checked ? '\\u2713' : '') + '</span>';
|
|
3527
|
-
html += '<div class="' + cls + '" data-idx="' + idx + '">' + tick + escHtml(item.label) + '</div>';
|
|
3528
|
-
}
|
|
3529
|
-
});
|
|
3530
|
-
menu.innerHTML = html;
|
|
3531
|
-
menu.style.left = Math.min(x, window.innerWidth - 200) + 'px';
|
|
3532
|
-
menu.style.top = Math.min(y, window.innerHeight - 300) + 'px';
|
|
3533
|
-
menu.classList.remove('hidden');
|
|
3534
|
-
menu.querySelectorAll('.ctx-item').forEach(el => {
|
|
3535
|
-
const item = items[parseInt(el.dataset.idx)];
|
|
3536
|
-
if (item && item.action && !item.disabled) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
|
|
3537
|
-
});
|
|
3538
|
-
setTimeout(() => document.addEventListener('click', hideContextMenu, { once: true }), 0);
|
|
3539
|
-
}
|
|
3540
|
-
|
|
3541
|
-
|
|
3542
|
-
function formatDate(ts) {
|
|
3543
|
-
const fmt = state.settings.dateFormat;
|
|
3544
|
-
if (fmt === 'iso') return new Date(ts * 1000).toISOString().substring(0, 16).replace('T', ' ');
|
|
3545
|
-
if (fmt === 'absolute') return new Date(ts * 1000).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });
|
|
3546
|
-
const now = Date.now() / 1000;
|
|
3547
|
-
const diff = now - ts;
|
|
3548
|
-
if (diff < 60) return 'just now';
|
|
3549
|
-
if (diff < 3600) return Math.floor(diff / 60) + 'm ago';
|
|
3550
|
-
if (diff < 86400) return Math.floor(diff / 3600) + 'h ago';
|
|
3551
|
-
if (diff < 2592000) return Math.floor(diff / 86400) + 'd ago';
|
|
3552
|
-
if (diff < 31536000) return Math.floor(diff / 2592000) + 'mo ago';
|
|
3553
|
-
return Math.floor(diff / 31536000) + 'y ago';
|
|
3554
|
-
}
|
|
3555
|
-
|
|
3556
|
-
function updateStatus() {
|
|
3557
|
-
const parts = [];
|
|
3558
|
-
if (state.currentBranch) parts.push(state.currentBranch);
|
|
3559
|
-
parts.push(state.commits.length + ' commits');
|
|
3560
|
-
parts.push(state.branches.length + ' branches');
|
|
3561
|
-
parts.push(state.tags.length + ' tags');
|
|
3562
|
-
document.getElementById('status-text').textContent = parts.join(' | ');
|
|
3563
|
-
}
|
|
3564
|
-
|
|
3565
|
-
// --- Settings panel ---
|
|
3566
|
-
const settingsPanel = document.getElementById('settings-panel');
|
|
3567
|
-
|
|
3568
|
-
document.getElementById('btn-settings').addEventListener('click', () => {
|
|
3569
|
-
const isOpen = settingsPanel.classList.toggle('open');
|
|
3570
|
-
if (isOpen) {
|
|
3571
|
-
vscode.postMessage({ command: 'requestSettings' });
|
|
3572
|
-
vscode.postMessage({ command: 'requestUserDetails' });
|
|
3573
|
-
renderRemotesList();
|
|
3574
|
-
}
|
|
3575
|
-
});
|
|
3576
|
-
document.getElementById('settings-close').addEventListener('click', () => {
|
|
3577
|
-
settingsPanel.classList.remove('open');
|
|
3578
|
-
});
|
|
3579
|
-
|
|
3580
|
-
function applySettingsToUI() {
|
|
3581
|
-
const s = state.settings;
|
|
3582
|
-
document.getElementById('s-maxCommits').value = s.maxCommits;
|
|
3583
|
-
document.getElementById('s-showTags').checked = s.showTags;
|
|
3584
|
-
document.getElementById('s-showStashes').checked = s.showStashes;
|
|
3585
|
-
document.getElementById('s-showRemoteBranches').checked = s.showRemoteBranches;
|
|
3586
|
-
document.getElementById('s-graphStyle').value = s.graphStyle;
|
|
3587
|
-
document.getElementById('s-firstParentOnly').checked = s.firstParentOnly;
|
|
3588
|
-
document.getElementById('s-dateFormat').value = s.dateFormat;
|
|
3589
|
-
document.getElementById('s-commitOrdering').value = s.commitOrdering;
|
|
3590
|
-
document.getElementById('s-autoFetchInterval').value = s.autoFetchInterval || 0;
|
|
3591
|
-
OPTIONAL_COLUMNS.forEach((col) => {
|
|
3592
|
-
document.getElementById('s-' + col.key).checked = s[col.key] !== false;
|
|
3593
|
-
});
|
|
3594
|
-
applyColumnVisibility();
|
|
3595
|
-
graphConfig.style = s.graphStyle;
|
|
3596
|
-
startAutoFetch(s.autoFetchInterval);
|
|
3597
|
-
renderIssueRules();
|
|
3598
|
-
applyPrSettingsToUI();
|
|
3599
|
-
}
|
|
3600
|
-
|
|
3601
|
-
// The same five toggles as the header's context menu, through the same call.
|
|
3602
|
-
OPTIONAL_COLUMNS.forEach((col) => {
|
|
3603
|
-
document.getElementById('s-' + col.key).addEventListener('change', (e) => {
|
|
3604
|
-
setColumnVisible(col.key, e.target.checked);
|
|
3605
|
-
});
|
|
3606
|
-
});
|
|
3607
|
-
|
|
3608
|
-
// General setting change handlers
|
|
3609
|
-
['showTags', 'showStashes', 'showRemoteBranches', 'firstParentOnly'].forEach(key => {
|
|
3610
|
-
document.getElementById('s-' + key).addEventListener('change', (e) => {
|
|
3611
|
-
vscode.postMessage({ command: 'updateSetting', key, value: e.target.checked });
|
|
3612
|
-
state.settings[key] = e.target.checked;
|
|
3613
|
-
renderCommitList();
|
|
3614
|
-
});
|
|
3615
|
-
});
|
|
3616
|
-
['graphStyle', 'dateFormat', 'commitOrdering'].forEach(key => {
|
|
3617
|
-
document.getElementById('s-' + key).addEventListener('change', (e) => {
|
|
3618
|
-
vscode.postMessage({ command: 'updateSetting', key, value: e.target.value });
|
|
3619
|
-
state.settings[key] = e.target.value;
|
|
3620
|
-
if (key === 'graphStyle') graphConfig.style = e.target.value;
|
|
3621
|
-
if (key === 'dateFormat') renderCommitList();
|
|
3622
|
-
});
|
|
3623
|
-
});
|
|
3624
|
-
document.getElementById('s-maxCommits').addEventListener('change', (e) => {
|
|
3625
|
-
const n = parseInt(e.target.value, 10);
|
|
3626
|
-
if (n > 0 && n <= 10000) {
|
|
3627
|
-
state.maxCommits = n;
|
|
3628
|
-
state.settings.maxCommits = n;
|
|
3629
|
-
vscode.postMessage({ command: 'updateSetting', key: 'maxCommits', value: n });
|
|
3630
|
-
}
|
|
3631
|
-
});
|
|
3632
|
-
document.getElementById('s-autoFetchInterval').addEventListener('change', (e) => {
|
|
3633
|
-
const val = parseInt(e.target.value, 10);
|
|
3634
|
-
state.settings.autoFetchInterval = val;
|
|
3635
|
-
vscode.postMessage({ command: 'updateSetting', key: 'autoFetchInterval', value: val });
|
|
3636
|
-
startAutoFetch(val);
|
|
3637
|
-
});
|
|
3638
|
-
|
|
3639
|
-
// User details
|
|
3640
|
-
document.getElementById('s-saveUser').addEventListener('click', () => {
|
|
3641
|
-
const name = document.getElementById('s-userName').value.trim();
|
|
3642
|
-
const email = document.getElementById('s-userEmail').value.trim();
|
|
3643
|
-
vscode.postMessage({ command: 'updateUserDetails', name, email });
|
|
3644
|
-
});
|
|
3645
|
-
|
|
3646
|
-
// Remotes
|
|
3647
|
-
function renderRemotesList() {
|
|
3648
|
-
const container = document.getElementById('s-remotes-list');
|
|
3649
|
-
if (state.remotes.length === 0) {
|
|
3650
|
-
container.innerHTML = '<p style="font-size:12px;color:var(--subtext)">No remotes configured.</p>';
|
|
3651
|
-
return;
|
|
3652
|
-
}
|
|
3653
|
-
container.innerHTML = state.remotes.map(r =>
|
|
3654
|
-
'<div class="remote-item">' +
|
|
3655
|
-
'<div class="remote-name">' + escHtml(r.name) + '</div>' +
|
|
3656
|
-
'<div class="remote-url">' + escHtml(r.fetchUrl) + '</div>' +
|
|
3657
|
-
'<div class="remote-actions">' +
|
|
3658
|
-
'<button class="btn-sm" data-edit-remote="' + escHtml(r.name) + '">Edit URL</button>' +
|
|
3659
|
-
'<button class="btn-sm" style="color:var(--red)" data-rm-remote="' + escHtml(r.name) + '">Remove</button>' +
|
|
3660
|
-
'</div>' +
|
|
3661
|
-
'</div>'
|
|
3662
|
-
).join('');
|
|
3663
|
-
}
|
|
3664
|
-
|
|
3665
|
-
document.getElementById('s-remotes-list').addEventListener('click', (e) => {
|
|
3666
|
-
const editBtn = e.target.closest('[data-edit-remote]');
|
|
3667
|
-
if (editBtn) {
|
|
3668
|
-
const name = editBtn.dataset.editRemote;
|
|
3669
|
-
const remote = state.remotes.find(r => r.name === name);
|
|
3670
|
-
showDialog({
|
|
3671
|
-
title: 'Edit Remote URL: ' + name,
|
|
3672
|
-
input: { placeholder: 'New URL', defaultValue: remote ? remote.fetchUrl : '' },
|
|
3673
|
-
onConfirm: (url) => { if (url) vscode.postMessage({ command: 'editRemoteUrl', name, url }); },
|
|
3674
|
-
});
|
|
3675
|
-
return;
|
|
3676
|
-
}
|
|
3677
|
-
const rmBtn = e.target.closest('[data-rm-remote]');
|
|
3678
|
-
if (rmBtn) {
|
|
3679
|
-
const name = rmBtn.dataset.rmRemote;
|
|
3680
|
-
showDialog({
|
|
3681
|
-
title: 'Remove Remote',
|
|
3682
|
-
message: 'Remove remote "' + name + '"? This cannot be undone.',
|
|
3683
|
-
destructive: true,
|
|
3684
|
-
confirmLabel: 'Remove',
|
|
3685
|
-
onConfirm: () => vscode.postMessage({ command: 'removeRemote', name }),
|
|
3686
|
-
});
|
|
3687
|
-
}
|
|
3688
|
-
});
|
|
3689
|
-
|
|
3690
|
-
document.getElementById('s-addRemote').addEventListener('click', () => {
|
|
3691
|
-
const name = document.getElementById('s-newRemoteName').value.trim();
|
|
3692
|
-
const url = document.getElementById('s-newRemoteUrl').value.trim();
|
|
3693
|
-
if (name && url) {
|
|
3694
|
-
vscode.postMessage({ command: 'addRemote', name, url });
|
|
3695
|
-
document.getElementById('s-newRemoteName').value = '';
|
|
3696
|
-
document.getElementById('s-newRemoteUrl').value = '';
|
|
3697
|
-
}
|
|
3698
|
-
});
|
|
3699
|
-
|
|
3700
|
-
// --- Issue Linking ---
|
|
3701
|
-
function renderIssueRules() {
|
|
3702
|
-
const rules = state.settings.issueLinkingRules || [];
|
|
3703
|
-
const container = document.getElementById('issue-rules-list');
|
|
3704
|
-
container.innerHTML = rules.map((r, i) =>
|
|
3705
|
-
'<div class="issue-rule-row" data-idx="' + i + '">' +
|
|
3706
|
-
'<input type="text" class="rule-pattern" placeholder="Regex, e.g. #(\\d+)" value="' + escHtml(r.pattern) + '">' +
|
|
3707
|
-
'<input type="text" class="rule-url" placeholder="URL with $1, e.g. https://..." value="' + escHtml(r.url) + '">' +
|
|
3708
|
-
'<button class="rule-remove" title="Remove">×</button>' +
|
|
3709
|
-
'</div>'
|
|
3710
|
-
).join('');
|
|
3711
|
-
}
|
|
3712
|
-
|
|
3713
|
-
let issueRuleDebounce = null;
|
|
3714
|
-
document.getElementById('issue-rules-list').addEventListener('input', (e) => {
|
|
3715
|
-
const row = e.target.closest('.issue-rule-row');
|
|
3716
|
-
if (!row) return;
|
|
3717
|
-
const idx = parseInt(row.dataset.idx);
|
|
3718
|
-
const rules = [...(state.settings.issueLinkingRules || [])];
|
|
3719
|
-
if (!rules[idx]) return;
|
|
3720
|
-
if (e.target.classList.contains('rule-pattern')) {
|
|
3721
|
-
rules[idx] = { ...rules[idx], pattern: e.target.value };
|
|
3722
|
-
try { new RegExp(e.target.value); e.target.classList.remove('rule-error'); }
|
|
3723
|
-
catch { e.target.classList.add('rule-error'); return; }
|
|
3724
|
-
}
|
|
3725
|
-
if (e.target.classList.contains('rule-url')) {
|
|
3726
|
-
rules[idx] = { ...rules[idx], url: e.target.value };
|
|
3727
|
-
}
|
|
3728
|
-
state.settings.issueLinkingRules = rules;
|
|
3729
|
-
clearTimeout(issueRuleDebounce);
|
|
3730
|
-
issueRuleDebounce = setTimeout(() => {
|
|
3731
|
-
vscode.postMessage({ command: 'updateSetting', key: 'issueLinkingRules', value: rules });
|
|
3732
|
-
}, 500);
|
|
3733
|
-
});
|
|
3734
|
-
|
|
3735
|
-
document.getElementById('issue-rules-list').addEventListener('click', (e) => {
|
|
3736
|
-
if (!e.target.closest('.rule-remove')) return;
|
|
3737
|
-
const row = e.target.closest('.issue-rule-row');
|
|
3738
|
-
const idx = parseInt(row.dataset.idx);
|
|
3739
|
-
const rules = [...(state.settings.issueLinkingRules || [])];
|
|
3740
|
-
rules.splice(idx, 1);
|
|
3741
|
-
state.settings.issueLinkingRules = rules;
|
|
3742
|
-
vscode.postMessage({ command: 'updateSetting', key: 'issueLinkingRules', value: rules });
|
|
3743
|
-
renderIssueRules();
|
|
3744
|
-
});
|
|
3745
|
-
|
|
3746
|
-
document.getElementById('add-issue-rule').addEventListener('click', () => {
|
|
3747
|
-
const rules = [...(state.settings.issueLinkingRules || []), { pattern: '', url: '' }];
|
|
3748
|
-
state.settings.issueLinkingRules = rules;
|
|
3749
|
-
vscode.postMessage({ command: 'updateSetting', key: 'issueLinkingRules', value: rules });
|
|
3750
|
-
renderIssueRules();
|
|
3751
|
-
});
|
|
3752
|
-
|
|
3753
|
-
// --- PR Creation ---
|
|
3754
|
-
const PR_TEMPLATES = {
|
|
3755
|
-
github: 'https://github.com/\${owner}/\${repo}/compare/\${targetBranch}...\${sourceBranch}?expand=1',
|
|
3756
|
-
gitlab: 'https://gitlab.com/\${owner}/\${repo}/-/merge_requests/new?source_branch=\${sourceBranch}&target_branch=\${targetBranch}',
|
|
3757
|
-
bitbucket: 'https://bitbucket.org/\${owner}/\${repo}/pull-requests/new?source=\${sourceBranch}&dest=\${targetBranch}',
|
|
3758
|
-
custom: '',
|
|
3759
|
-
};
|
|
3760
|
-
|
|
3761
|
-
document.getElementById('pr-provider').addEventListener('change', (e) => {
|
|
3762
|
-
const provider = e.target.value;
|
|
3763
|
-
const prConfig = document.getElementById('pr-config');
|
|
3764
|
-
if (!provider) {
|
|
3765
|
-
prConfig.classList.add('hidden');
|
|
3766
|
-
state.settings.prCreation = null;
|
|
3767
|
-
vscode.postMessage({ command: 'updateSetting', key: 'prCreation', value: null });
|
|
3768
|
-
return;
|
|
3769
|
-
}
|
|
3770
|
-
prConfig.classList.remove('hidden');
|
|
3771
|
-
document.getElementById('pr-url-template').value = PR_TEMPLATES[provider] || '';
|
|
3772
|
-
document.getElementById('pr-target').value = 'main';
|
|
3773
|
-
vscode.postMessage({ command: 'requestOwnerRepo' });
|
|
3774
|
-
});
|
|
3775
|
-
|
|
3776
|
-
document.getElementById('pr-save').addEventListener('click', () => {
|
|
3777
|
-
const provider = document.getElementById('pr-provider').value;
|
|
3778
|
-
if (!provider) return;
|
|
3779
|
-
const config = {
|
|
3780
|
-
provider,
|
|
3781
|
-
urlTemplate: document.getElementById('pr-url-template').value.trim(),
|
|
3782
|
-
owner: document.getElementById('pr-owner').value.trim(),
|
|
3783
|
-
repo: document.getElementById('pr-repo').value.trim(),
|
|
3784
|
-
defaultTargetBranch: document.getElementById('pr-target').value.trim() || 'main',
|
|
3785
|
-
};
|
|
3786
|
-
state.settings.prCreation = config;
|
|
3787
|
-
vscode.postMessage({ command: 'updateSetting', key: 'prCreation', value: config });
|
|
3788
|
-
});
|
|
3789
|
-
|
|
3790
|
-
function applyPrSettingsToUI() {
|
|
3791
|
-
const pr = state.settings.prCreation;
|
|
3792
|
-
if (!pr) {
|
|
3793
|
-
document.getElementById('pr-provider').value = '';
|
|
3794
|
-
document.getElementById('pr-config').classList.add('hidden');
|
|
3795
|
-
return;
|
|
3796
|
-
}
|
|
3797
|
-
document.getElementById('pr-provider').value = pr.provider;
|
|
3798
|
-
document.getElementById('pr-config').classList.remove('hidden');
|
|
3799
|
-
document.getElementById('pr-owner').value = pr.owner || '';
|
|
3800
|
-
document.getElementById('pr-repo').value = pr.repo || '';
|
|
3801
|
-
document.getElementById('pr-target').value = pr.defaultTargetBranch || 'main';
|
|
3802
|
-
document.getElementById('pr-url-template').value = pr.urlTemplate || '';
|
|
3803
|
-
}
|
|
3804
|
-
|
|
3805
|
-
function openPrUrl(sourceBranch) {
|
|
3806
|
-
const pr = state.settings.prCreation;
|
|
3807
|
-
if (!pr || !pr.urlTemplate) return;
|
|
3808
|
-
const url = pr.urlTemplate
|
|
3809
|
-
.replace(/\\$\\{owner\\}/g, encodeURIComponent(pr.owner))
|
|
3810
|
-
.replace(/\\$\\{repo\\}/g, encodeURIComponent(pr.repo))
|
|
3811
|
-
.replace(/\\$\\{sourceBranch\\}/g, encodeURIComponent(sourceBranch))
|
|
3812
|
-
.replace(/\\$\\{targetBranch\\}/g, encodeURIComponent(pr.defaultTargetBranch || 'main'));
|
|
3813
|
-
window.open(url, '_blank');
|
|
3814
|
-
}
|
|
3815
|
-
`;
|
|
3816
|
-
}
|