@hienlh/ppm 0.21.0 → 0.22.1
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 +50 -0
- package/CLAUDE.md +29 -4
- package/THIRD-PARTY-NOTICES.md +1 -1
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/cli-reference.md +4 -4
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/bun.lock +16 -1
- package/dist/web/assets/accounts-settings-section-D3BylchP.js +1 -0
- package/dist/web/assets/{ai-resource-editor-F09pf8Hd.js → ai-resource-editor-BLPcnhTM.js} +1 -1
- package/dist/web/assets/ai-settings-section-BtR7rF-T.js +1 -0
- package/dist/web/assets/ai-settings-section-r9JctHNM.js +1 -0
- package/dist/web/assets/{angular-html-DkR4iCth.js → angular-html-G66FNlyn.js} +1 -1
- package/dist/web/assets/{angular-ts-DcyL4Chx.js → angular-ts-B-PnUMyt.js} +1 -1
- package/dist/web/assets/{api-client-bfB7cXRM.js → api-client-C1ZwRL4Y.js} +1 -1
- package/dist/web/assets/api-client-pQL53cDQ.js +1 -0
- package/dist/web/assets/{api-settings-BcNjZIvG.js → api-settings-_7Q-ULxp.js} +1 -1
- package/dist/web/assets/{api-themes-DBfyVUtX.js → api-themes-DRAERo4Q.js} +1 -1
- package/dist/web/assets/{apl-BVlrVtjt.js → apl-BmDqqwE8.js} +1 -1
- package/dist/web/assets/{appearance-settings-section-whgnq3ss.js → appearance-settings-section-CiMdk3sb.js} +1 -1
- package/dist/web/assets/architecture-PBZL5I3N-Dx6nBEKT.js +1 -0
- package/dist/web/assets/{astro-MjJlozLj.js → astro-BfwMNfxr.js} +1 -1
- package/dist/web/assets/{audio-preview-Bc54GCAV.js → audio-preview-DsYvgKqj.js} +1 -1
- package/dist/web/assets/{blade-DnJWi1fz.js → blade-BsFV4pnN.js} +1 -1
- package/dist/web/assets/branch-review-tab-B1pFjlKM.js +1 -0
- package/dist/web/assets/{bsl-DCmJxSIz.js → bsl-Cw9Outng.js} +1 -1
- package/dist/web/assets/{button-VW4QGKCn.js → button-B9CTrsEf.js} +1 -1
- package/dist/web/assets/{cairo-C8dDenub.js → cairo-DOK5Wqnd.js} +1 -1
- package/dist/web/assets/chat-tab-DZagX06m.js +15 -0
- package/dist/web/assets/{cobol-DPx_nifl.js → cobol-DRaRy4FK.js} +1 -1
- package/dist/web/assets/code-editor-BJhOEsnZ.js +7 -0
- package/dist/web/assets/{codex-daily-guard-CfybHv_c.js → codex-daily-guard-CaCQJ4r_.js} +1 -1
- package/dist/web/assets/{coffee-DvFzqhgN.js → coffee-DvXuBmEJ.js} +1 -1
- package/dist/web/assets/{conflict-editor-DenQUOT2.js → conflict-editor-B7u_p49h.js} +3 -3
- package/dist/web/assets/context-menu-C6pIsf83.js +1 -0
- package/dist/web/assets/{cpp-BLJN0umi.js → cpp-zCmm8rKA.js} +1 -1
- package/dist/web/assets/{crystal-BXR-9fGw.js → crystal-CdQx6lB6.js} +1 -1
- package/dist/web/assets/{csv-preview-CClrJOuR.js → csv-preview-CttjJU1e.js} +1 -1
- package/dist/web/assets/{data-grid-overlay-editor-D4fhcMfT.js → data-grid-overlay-editor-6xUCeLHh.js} +1 -1
- package/dist/web/assets/{database-viewer-DItjm8wB.js → database-viewer-Ca4HxIfx.js} +1 -1
- package/dist/web/assets/{dialog-DQTn55Mt.js → dialog-B84_DJQ8.js} +1 -1
- package/dist/web/assets/diff-viewer-9-XjLIwa.js +4 -0
- package/dist/web/assets/{docx-preview-DYBkiUaE.js → docx-preview-CXuk-emm.js} +1 -1
- package/dist/web/assets/{edge-rWOlCmXT.js → edge-E8QLt7oi.js} +1 -1
- package/dist/web/assets/{edit-diff-preview-COtmo54G.js → edit-diff-preview-BGGGecVw.js} +1 -1
- package/dist/web/assets/{editor-language-service-DxkZ51E5.js → editor-language-service-D0DuEOs_.js} +1 -1
- package/dist/web/assets/{elixir-E7Y82okW.js → elixir-DPb_-72P.js} +1 -1
- package/dist/web/assets/{elm-DTPGbc-w.js → elm-BMzJY5b0.js} +1 -1
- package/dist/web/assets/{erb-DHqLHrE6.js → erb-AABQNtMK.js} +1 -1
- package/dist/web/assets/{erlang-Byg0nNiV.js → erlang-CEIKOkfP.js} +1 -1
- package/dist/web/assets/{esm-D_DmOM7n.js → esm-B9RVMpwV.js} +1 -1
- package/dist/web/assets/explorer-body-VdCBqcZu.js +2 -0
- package/dist/web/assets/explorer-window-content-BIsbl7Th.js +1 -0
- package/dist/web/assets/extension-manager-section-HkY7geS5.js +1 -0
- package/dist/web/assets/{extension-webview-DI4VL2tJ.js → extension-webview-DZG8YHX9.js} +1 -1
- package/dist/web/assets/file-icons-BXdvggK2.js +1 -0
- package/dist/web/assets/file-icons.generated-BtBErEwb.css +1 -0
- package/dist/web/assets/file-store-ojgMXgAw.js +1 -0
- package/dist/web/assets/files-settings-section-qnRtkX05.js +1 -0
- package/dist/web/assets/{format-file-meta-DOpzJJhS.js → format-file-meta-C77h04cZ.js} +1 -1
- package/dist/web/assets/{fortran-fixed-form-CY1n0Xf6.js → fortran-fixed-form-CrXvLHyi.js} +1 -1
- package/dist/web/assets/{fsharp-_vEDSCJz.js → fsharp-DCI4qAz_.js} +1 -1
- package/dist/web/assets/{gdresource-B6XT0wAC.js → gdresource-Vb2kO1MG.js} +1 -1
- package/dist/web/assets/{general-settings-section-BcxwiZ0X.js → general-settings-section-BAFSZmCE.js} +1 -1
- package/dist/web/assets/{git-commit-Wk9ovq59.js → git-commit-BMI_OWn-.js} +1 -1
- package/dist/web/assets/git-log-panel-2sGpfEla.js +1 -0
- package/dist/web/assets/{git-rebase-DSarGPvK.js → git-rebase-D-d_2iqZ.js} +1 -1
- package/dist/web/assets/{git-repo-store-Dy69YCHN.js → git-repo-store-88Z8v-pF.js} +1 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-C6qRruHI.js +1 -0
- package/dist/web/assets/{glide-data-grid-BvgAqSUr.js → glide-data-grid-f0hyITiF.js} +7 -7
- package/dist/web/assets/{glimmer-js-CkYI35_P.js → glimmer-js-BmNNiR0Z.js} +1 -1
- package/dist/web/assets/{glimmer-ts-BqmIZcds.js → glimmer-ts-DQE2Ufha.js} +1 -1
- package/dist/web/assets/{glsl-Be-yBCF5.js → glsl-BcIDsxRJ.js} +1 -1
- package/dist/web/assets/{graphql-a5DrENHY.js → graphql-DGKSLmGH.js} +1 -1
- package/dist/web/assets/group-chat-tab-Ck6sk7yY.js +1 -0
- package/dist/web/assets/{hack-BLAg20aD.js → hack-YiC8bEIb.js} +1 -1
- package/dist/web/assets/{haml-Dj6bGOQH.js → haml-DjblxAsz.js} +1 -1
- package/dist/web/assets/{handlebars-dmEa36Oh.js → handlebars-BQepOXaU.js} +1 -1
- package/dist/web/assets/{html-yacZYzSE.js → html-Cayj_2GP.js} +1 -1
- package/dist/web/assets/{html-derivative-lLi3-RNT.js → html-derivative-Weq79bL6.js} +1 -1
- package/dist/web/assets/{http-1KaxcE4e.js → http-BeLfdGdz.js} +1 -1
- package/dist/web/assets/{hurl-ST-dEEZR.js → hurl-D9rypCLK.js} +1 -1
- package/dist/web/assets/{hxml-CpDtuq__.js → hxml-clG8mmSH.js} +1 -1
- package/dist/web/assets/{image-preview-CJVxL0uH.js → image-preview-CzCc4_Do.js} +1 -1
- package/dist/web/assets/image-preview-geometry-9lgeLYB3.js +1 -0
- package/dist/web/assets/index-BH99TIE0.css +1 -0
- package/dist/web/assets/index-CEZVxM4G.js +52 -0
- package/dist/web/assets/info-3K5VOQVL-BOSpdwlz.js +1 -0
- package/dist/web/assets/{jinja-Cjw-evAn.js → jinja-BShBWfs5.js} +1 -1
- package/dist/web/assets/{jira-watcher-section-DIC1yIV3.js → jira-watcher-section-CeLmhvu1.js} +1 -1
- package/dist/web/assets/{jison-DfATMYoY.js → jison-dN2Nf_Dr.js} +1 -1
- package/dist/web/assets/{julia-DDCaxiqT.js → julia-5U0vR-uJ.js} +1 -1
- package/dist/web/assets/{just-CJL529u6.js → just-BMppVRy6.js} +1 -1
- package/dist/web/assets/keybindings-store-C_3ChOEf.js +1 -0
- package/dist/web/assets/{keyboard-shortcuts-section-BW03P3AF.js → keyboard-shortcuts-section-PVz6kuh2.js} +1 -1
- package/dist/web/assets/{latex-Zc4EpLpW.js → latex-DSSOKjis.js} +1 -1
- package/dist/web/assets/{liquid-B_6KMNYS.js → liquid-C24dKoyI.js} +1 -1
- package/dist/web/assets/{lua-BtS2idK7.js → lua-DNOsnyhn.js} +1 -1
- package/dist/web/assets/{markdown-renderer-CvL1pWeK.js → markdown-renderer-C140Ijk0.js} +3 -3
- package/dist/web/assets/markdown-renderer-Dz7-DYUg.js +1 -0
- package/dist/web/assets/{marko-Wk6LBnck.js → marko-26MHO_Q9.js} +1 -1
- package/dist/web/assets/{mdc-cRaXBrzL.js → mdc-Dhw9mGrC.js} +1 -1
- package/dist/web/assets/{media-url-DL8OCGGg.js → media-url-yfqHpPz0.js} +1 -1
- package/dist/web/assets/{mobile-bottom-sheet-CoUauvLF.js → mobile-bottom-sheet-C3TniEP-.js} +1 -1
- package/dist/web/assets/mobile-explorer-sheet-CUG_owdf.js +1 -0
- package/dist/web/assets/{nextflow-Bos2wvDV.js → nextflow-xH4oJTex.js} +1 -1
- package/dist/web/assets/{nginx-DMlOwzdr.js → nginx-CMz4w0M8.js} +1 -1
- package/dist/web/assets/{nim-D2dZQA88.js → nim-D8FnIYsx.js} +1 -1
- package/dist/web/assets/notification-store-6vib1ISy.js +1 -0
- package/dist/web/assets/{notifications-settings-section-DPUROMw-.js → notifications-settings-section-DqlPDfNX.js} +1 -1
- package/dist/web/assets/{number-overlay-editor-DZ2i_Bnb.js → number-overlay-editor-CRGwULhR.js} +1 -1
- package/dist/web/assets/{overview-panel-R146OIom.js → overview-panel-Di-3aV9p.js} +1 -1
- package/dist/web/assets/packet-RMMSAZCW-BGIE1QdU.js +1 -0
- package/dist/web/assets/panel-store-CboGJAwh.js +1 -0
- package/dist/web/assets/{pdf-preview-BWUPGLp6.js → pdf-preview-CmBI6E7d.js} +1 -1
- package/dist/web/assets/{perl-C5-Z6fPn.js → perl-D9iNWYwb.js} +1 -1
- package/dist/web/assets/{php-BXNNhkMH.js → php-Bw3Qo0Zv.js} +1 -1
- package/dist/web/assets/pie-UPGHQEXC-Dg-QTbXX.js +1 -0
- package/dist/web/assets/{postgres-viewer-CjOvaruz.js → postgres-viewer-8ZAqEALv.js} +3 -3
- package/dist/web/assets/{ppmbot-settings-section-DrvWh8l8.js → ppmbot-settings-section-Cji-Mil-.js} +1 -1
- package/dist/web/assets/problems-panel-a6_hrWvl.js +1 -0
- package/dist/web/assets/{process-table-BRMS1MrX.js → process-table-CiIqlOIK.js} +1 -1
- package/dist/web/assets/project-framework-store-B70Q3dNM.js +1 -0
- package/dist/web/assets/project-store-B87hLRSk.js +1 -0
- package/dist/web/assets/{proxy-settings-section-Bv0Ny-Yy.js → proxy-settings-section-BjI4IFgp.js} +1 -1
- package/dist/web/assets/{pug-C1zf1yWy.js → pug-fT5JC6Vm.js} +1 -1
- package/dist/web/assets/{qml-OW58jGpD.js → qml-P_wEDB1w.js} +1 -1
- package/dist/web/assets/{query-audit-section-BcHJZcVC.js → query-audit-section-By6qyqdB.js} +1 -1
- package/dist/web/assets/radar-KQ55EAFF-DZ6IVu2s.js +1 -0
- package/dist/web/assets/{razor-DzjSaobM.js → razor-Drrt2_Ph.js} +1 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-eXYvwgx7.js +1 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-Doh-fci-.js +2 -0
- package/dist/web/assets/remote-desktop-mobile-view-Dt8Akc3p.js +1 -0
- package/dist/web/assets/{remote-desktop-readiness-gate-BTzss2wX.js → remote-desktop-readiness-gate-t83fqbID.js} +1 -1
- package/dist/web/assets/remote-desktop-window-content-CguhZMmx.js +1 -0
- package/dist/web/assets/{rst-RfuihOUW.js → rst-Dr2mW4-h.js} +1 -1
- package/dist/web/assets/{ruby-CNO3pli1.js → ruby-C6EpUsTY.js} +1 -1
- package/dist/web/assets/{run-in-terminal-Cb_hVU8x.js → run-in-terminal-CdefEe_R.js} +1 -1
- package/dist/web/assets/{sas-DZY5BtXx.js → sas-D8ZEeP6v.js} +1 -1
- package/dist/web/assets/{schedules-settings-section-DO8xAOVj.js → schedules-settings-section-BVkpW5ms.js} +1 -1
- package/dist/web/assets/{scroll-area-LtNV8g5o.js → scroll-area-BzeiOd-B.js} +1 -1
- package/dist/web/assets/{scss--4g-REcN.js → scss-ITL7jQ1f.js} +1 -1
- package/dist/web/assets/{send-to-chat-Cnpru1M0.js → send-to-chat-F207yH3u.js} +1 -1
- package/dist/web/assets/{separator-Cds1yxy8.js → separator-TRMsJUYe.js} +1 -1
- package/dist/web/assets/settings-body-CoIxYAh6.js +2 -0
- package/dist/web/assets/settings-store-krC6bc79.js +2 -0
- package/dist/web/assets/settings-tab-7DKVUTbM.js +1 -0
- package/dist/web/assets/settings-window-content-3_39TeX-.js +1 -0
- package/dist/web/assets/{shaderlab-Cu4sBiVn.js → shaderlab-mW-IIlhk.js} +1 -1
- package/dist/web/assets/{shellsession-DWzJfEv7.js → shellsession-DhNl5STt.js} +1 -1
- package/dist/web/assets/{soy-BnqE-5Ff.js → soy-SdY0Qjtr.js} +1 -1
- package/dist/web/assets/{sparql-Ctg__NhZ.js → sparql-ftqZo2i-.js} +1 -1
- package/dist/web/assets/{sql-query-editor-D9k19T_M.js → sql-query-editor-CQB7Yp7U.js} +1 -1
- package/dist/web/assets/{sqlite-viewer-DoV9hnWJ.js → sqlite-viewer-Bd7rjr1D.js} +1 -1
- package/dist/web/assets/{stata-Qk2h66XW.js → stata-Bj7Yjb4b.js} +1 -1
- package/dist/web/assets/{surrealql-8QEX7EfH.js → surrealql-CLhYGAfB.js} +1 -1
- package/dist/web/assets/{svelte-D_mubC5-.js → svelte-DTAlRHhK.js} +1 -1
- package/dist/web/assets/system-monitor-body-DsRXeMyU.js +2 -0
- package/dist/web/assets/system-monitor-tab-DdSZgux3.js +1 -0
- package/dist/web/assets/{system-monitor-window-content-qXLcicFM.js → system-monitor-window-content-ClPo4-El.js} +1 -1
- package/dist/web/assets/{tab-host-window-content-7fPZNEni.js → tab-host-window-content-d2TAD4PU.js} +1 -1
- package/dist/web/assets/{tab-store-DGJGnbwv.js → tab-store-OJa1GPCq.js} +1 -1
- package/dist/web/assets/team-member-sheet-7d2Qp-ie.js +2 -0
- package/dist/web/assets/{team-member-window-content-BgvJFypM.js → team-member-window-content-Bctg2gmg.js} +1 -1
- package/dist/web/assets/{templ-C1jV0fsO.js → templ-BMfhACxb.js} +1 -1
- package/dist/web/assets/{terminal-tab-Cs0sGljx.js → terminal-tab-0HQic25V.js} +3 -3
- package/dist/web/assets/{tex-D_StFXy_.js → tex-BcssM-QA.js} +1 -1
- package/dist/web/assets/tool-cards-CmLLRACd.js +9 -0
- package/dist/web/assets/treemap-KZPCXAKY-CE30wCXa.js +1 -0
- package/dist/web/assets/{ts-tags-B5m47rEm.js → ts-tags-CrR5IYI8.js} +1 -1
- package/dist/web/assets/{twig-C_br6GIl.js → twig-DchfUmyI.js} +1 -1
- package/dist/web/assets/{use-blob-url-C-SGi_Hb.js → use-blob-url-CPtCcY3i.js} +1 -1
- package/dist/web/assets/{use-inline-blame-B4trxGcR.js → use-inline-blame-sDMjcz1-.js} +3 -3
- package/dist/web/assets/{use-lsp-CV0vzILO.js → use-lsp-CBgID-EU.js} +1 -1
- package/dist/web/assets/{use-monaco-theme-DBqbWjWX.js → use-monaco-theme-gvhJ_jZh.js} +1 -1
- package/dist/web/assets/{use-open-team-member-DENsjp0s.js → use-open-team-member-C3mrUzIC.js} +1 -1
- package/dist/web/assets/{use-websocket-LgXiX1qN.js → use-websocket-C9wlRliB.js} +1 -1
- package/dist/web/assets/{vendor-mermaid-Cbig5zA6.js → vendor-mermaid-BitiXJlL.js} +1 -1
- package/dist/web/assets/{vendor-ui-BBdkypKW.js → vendor-ui-DmZ-Mb-H.js} +1 -1
- package/dist/web/assets/video-preview-CSDK5j6H.js +1 -0
- package/dist/web/assets/{vue-DQwCnLdr.js → vue-1EL6Pw1h.js} +1 -1
- package/dist/web/assets/{vue-html-T_EoGpPJ.js → vue-html-BPQNwPC6.js} +1 -1
- package/dist/web/assets/{vue-vine-DmxLqX50.js → vue-vine-Bb_dsWLt.js} +1 -1
- package/dist/web/assets/{window-pip-registry-3l4hoxuD.js → window-pip-registry-yD6esSju.js} +1 -1
- package/dist/web/assets/ws-auth-CEYVQ8NH.js +1 -0
- package/dist/web/assets/{xml-Bs6Bw8is.js → xml-dxkLNA0K.js} +1 -1
- package/dist/web/assets/{xsl-f5ZNhRCc.js → xsl-Bw2adwrl.js} +1 -1
- package/dist/web/index.html +27 -26
- package/dist/web/sw.js +1 -1
- package/docs/architecture/ai-chat-and-providers.md +9 -0
- package/docs/architecture/plugins-and-tracing.md +285 -0
- package/docs/lessons-learned.md +31 -0
- package/docs/system-architecture.md +1 -0
- package/package.json +2 -1
- package/packages/ext-git-graph/src/compare-diff-base.test.ts +173 -0
- package/packages/ext-git-graph/src/compare-view.ts +22 -3
- package/packages/ext-git-graph/src/extension.ts +6 -0
- package/packages/ext-git-graph/src/types.ts +19 -0
- package/packages/ext-git-graph/src/webview-html.test.ts +159 -1
- package/packages/ext-git-graph/src/webview-html.ts +344 -26
- package/scripts/gen-file-icons.ts +493 -242
- package/src/providers/claude-agent-sdk.ts +42 -1
- package/src/providers/codex-app-server/codex-history.ts +77 -23
- package/src/server/index.ts +42 -7
- package/src/server/routes/chat.ts +15 -11
- package/src/server/routes/git.ts +83 -3
- package/src/server/routes/remote-desktop.ts +7 -2
- package/src/server/ws/global.ts +1 -1
- package/src/server/ws/remote-desktop.ts +12 -5
- package/src/services/binary-content.ts +25 -0
- package/src/services/chat-search.service.ts +1 -1
- package/src/services/chat.service.ts +9 -0
- package/src/services/edge-forwarder.ts +191 -191
- package/src/services/event-loop-lag.ts +208 -0
- package/src/services/file-lines.ts +114 -0
- package/src/services/file-watcher/recreated-dir-poller.ts +108 -6
- package/src/services/file-watcher/watch-tree.ts +131 -10
- package/src/services/file-watcher.service.ts +73 -23
- package/src/services/git-branch-diff/branch-diff-parse.ts +151 -0
- package/src/services/git-branch-diff/branch-diff.service.ts +79 -0
- package/src/services/git-hunks/git-hunks.service.ts +26 -11
- package/src/services/git-hunks/unified-diff.ts +15 -1
- package/src/services/git.service.ts +74 -24
- package/src/services/jsonl-transcript-parser.ts +138 -6
- package/src/services/log-rotate.ts +142 -0
- package/src/services/media-transcode/ffmpeg-capabilities.ts +72 -2
- package/src/services/remote-desktop/remote-desktop-audio.ts +193 -0
- package/src/services/remote-desktop/remote-desktop-capture-input.ts +87 -14
- package/src/services/remote-desktop/remote-desktop-capture.ts +40 -7
- package/src/services/remote-desktop/remote-desktop-clipboard.ts +166 -0
- package/src/services/remote-desktop/remote-desktop-displays.ts +77 -1
- package/src/services/remote-desktop/remote-desktop-encoder-args.ts +25 -6
- package/src/services/remote-desktop/remote-desktop-evdev-key-map.ts +69 -0
- package/src/services/remote-desktop/remote-desktop-input-linux.ts +253 -0
- package/src/services/remote-desktop/remote-desktop-input-uinput.ts +242 -0
- package/src/services/remote-desktop/remote-desktop-input.ts +40 -8
- package/src/services/remote-desktop/remote-desktop-linux-session.ts +146 -0
- package/src/services/remote-desktop/remote-desktop-ogg-opus.ts +144 -0
- package/src/services/remote-desktop/remote-desktop-privacy.ts +163 -0
- package/src/services/remote-desktop/remote-desktop-quality.ts +138 -0
- package/src/services/remote-desktop/remote-desktop-requirements.ts +158 -5
- package/src/services/remote-desktop/remote-desktop-resolution.ts +302 -0
- package/src/services/remote-desktop/remote-desktop-session.ts +523 -21
- package/src/services/remote-desktop/remote-desktop-x11.ts +250 -0
- package/src/services/supervisor.ts +47 -4
- package/src/services/windows-process-tree.ts +351 -351
- package/src/shared/codex-daily-guard.ts +12 -5
- package/src/shared/remote-desktop-custom-quality.ts +117 -0
- package/src/shared/remote-desktop-quality.ts +127 -0
- package/src/types/chat.ts +4 -0
- package/src/types/git.ts +52 -0
- package/src/web/components/branch-review/branch-review-tab.tsx +360 -0
- package/src/web/components/branch-review/branch-review-tree-row.tsx +138 -0
- package/src/web/components/chat/attachment-chips.tsx +30 -6
- package/src/web/components/chat/chat-tab.tsx +12 -1
- package/src/web/components/chat/message-events.tsx +273 -0
- package/src/web/components/chat/message-list.tsx +107 -861
- package/src/web/components/chat/message-markdown.tsx +34 -0
- package/src/web/components/chat/message-media.tsx +174 -0
- package/src/web/components/chat/message-user-bubble.tsx +399 -0
- package/src/web/components/chat/provider-selector.tsx +30 -22
- package/src/web/components/chat/session-history-list.tsx +2 -2
- package/src/web/components/chat/session-list-panel.tsx +3 -2
- package/src/web/components/editor/binary-diff-view.tsx +212 -0
- package/src/web/components/editor/diff-viewer.tsx +76 -3
- package/src/web/components/explorer/file-tree.tsx +235 -134
- package/src/web/components/explorer/flatten-visible-tree.ts +35 -40
- package/src/web/components/explorer/tree-node.tsx +69 -69
- package/src/web/components/explorer/use-tree-row-dnd.ts +3 -4
- package/src/web/components/extensions/extension-tree-view.tsx +4 -11
- package/src/web/components/git/git-status-panel.tsx +25 -0
- package/src/web/components/layout/command-palette.tsx +2 -18
- package/src/web/components/layout/draggable-tab.tsx +4 -2
- package/src/web/components/layout/nav-section-rail.tsx +12 -3
- package/src/web/components/layout/status-bar.tsx +10 -6
- package/src/web/components/layout/tab-content.tsx +5 -0
- package/src/web/components/layout/tab-pool.tsx +1 -0
- package/src/web/components/layout/upgrade-button.tsx +5 -1
- package/src/web/components/remote-desktop/remote-desktop-clipboard-client.ts +67 -0
- package/src/web/components/remote-desktop/remote-desktop-clipboard-notice.tsx +127 -0
- package/src/web/components/remote-desktop/remote-desktop-codec-labels.ts +28 -0
- package/src/web/components/remote-desktop/remote-desktop-custom-quality-dialog.tsx +144 -0
- package/src/web/components/remote-desktop/remote-desktop-mobile-key-bar.tsx +13 -2
- package/src/web/components/remote-desktop/remote-desktop-mobile-settings.tsx +232 -0
- package/src/web/components/remote-desktop/remote-desktop-mobile-toolbar.tsx +21 -8
- package/src/web/components/remote-desktop/remote-desktop-mobile-view.tsx +82 -3
- package/src/web/components/remote-desktop/remote-desktop-recording.ts +76 -0
- package/src/web/components/remote-desktop/remote-desktop-resolution-list.ts +100 -0
- package/src/web/components/remote-desktop/remote-desktop-toolbar.tsx +497 -0
- package/src/web/components/remote-desktop/remote-desktop-view-style.ts +145 -0
- package/src/web/components/remote-desktop/remote-desktop-window-content.tsx +126 -35
- package/src/web/components/remote-desktop/use-h264-canvas-decoder.ts +11 -0
- package/src/web/components/remote-desktop/use-opus-audio-player.ts +148 -0
- package/src/web/components/remote-desktop/use-remote-desktop-connection.ts +284 -1
- package/src/web/components/remote-desktop/use-remote-desktop-readiness.ts +75 -1
- package/src/web/components/remote-desktop/use-remote-desktop-recorder.ts +103 -0
- package/src/web/components/remote-desktop/use-remote-desktop-virtual-keyboard.ts +19 -2
- package/src/web/components/remote-desktop/use-remote-input-capture.ts +39 -3
- package/src/web/components/settings/accounts/account-card.tsx +2 -2
- package/src/web/components/settings/accounts/codex-accounts-section.tsx +4 -4
- package/src/web/components/settings/extension-manager-section.tsx +8 -1
- package/src/web/components/settings/theme-picker.tsx +2 -1
- package/src/web/components/ui/tooltip.tsx +15 -2
- package/src/web/lib/branch-review-state.ts +175 -0
- package/src/web/lib/extension-icons.ts +70 -0
- package/src/web/lib/file-icon-name.ts +62 -0
- package/src/web/lib/file-icons.generated.ts +3287 -25
- package/src/web/lib/file-icons.tsx +71 -73
- package/src/web/lib/flatten-expansions.ts +18 -5
- package/src/web/lib/message-ordinals.ts +23 -0
- package/src/web/lib/provider-logos.tsx +143 -0
- package/src/web/lib/tab-type-icons.ts +25 -0
- package/src/web/stores/file-store.ts +73 -35
- package/src/web/stores/panel-utils.ts +5 -0
- package/src/web/stores/project-framework-store.ts +82 -0
- package/src/web/stores/project-store.ts +7 -1
- package/src/web/stores/settings-store.ts +128 -0
- package/src/web/stores/tab-store.ts +1 -0
- package/src/web/stores/window-panel-persistence.ts +1 -0
- package/src/web/styles/file-icons.generated.css +3282 -234
- package/src/web/styles/globals.css +26 -0
- package/dist/web/assets/accounts-settings-section-BuxD9zH3.js +0 -1
- package/dist/web/assets/ai-settings-section-Dd9tOUp0.js +0 -1
- package/dist/web/assets/ai-settings-section-FrU2X8Fu.js +0 -1
- package/dist/web/assets/api-client-BUCo1lms.js +0 -1
- package/dist/web/assets/architecture-PBZL5I3N-5K0wEkAn.js +0 -1
- package/dist/web/assets/chat-tab-Cr6_KSGO.js +0 -15
- package/dist/web/assets/code-editor-DfmlGamv.js +0 -7
- package/dist/web/assets/context-menu-DOODKZdF.js +0 -1
- package/dist/web/assets/diff-viewer-BpNj7pN9.js +0 -4
- package/dist/web/assets/explorer-body-D-5z464e.js +0 -2
- package/dist/web/assets/explorer-window-content-7-1wuRul.js +0 -1
- package/dist/web/assets/extension-manager-section-BhwB6nqr.js +0 -1
- package/dist/web/assets/file-icons-EzPL0q-k.js +0 -1
- package/dist/web/assets/file-icons.generated-CfaJuvZu.css +0 -1
- package/dist/web/assets/file-store-DMABxOkV.js +0 -1
- package/dist/web/assets/files-settings-section-CZzABuKz.js +0 -1
- package/dist/web/assets/git-log-panel-CRN4JVOx.js +0 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-DkVT2MAM.js +0 -1
- package/dist/web/assets/group-chat-tab-DFa5mAx5.js +0 -1
- package/dist/web/assets/index-D7DbXD3G.css +0 -1
- package/dist/web/assets/index-ZtfxZOyb.js +0 -52
- package/dist/web/assets/info-3K5VOQVL-BBsmKGzA.js +0 -1
- package/dist/web/assets/keybindings-store-tVfhPANS.js +0 -1
- package/dist/web/assets/markdown-renderer-sJNNVhlS.js +0 -1
- package/dist/web/assets/mobile-explorer-sheet-CZ0HZ2E_.js +0 -1
- package/dist/web/assets/notification-store-BZbsPnW0.js +0 -1
- package/dist/web/assets/packet-RMMSAZCW-DwmYPOlx.js +0 -1
- package/dist/web/assets/panel-store-BVLBRn6M.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-D0oogIFi.js +0 -1
- package/dist/web/assets/problems-panel-B7BWVhdy.js +0 -1
- package/dist/web/assets/project-store-BhMbVln3.js +0 -1
- package/dist/web/assets/radar-KQ55EAFF-CQIJOQGa.js +0 -1
- package/dist/web/assets/remote-desktop-mobile-sheet-ByjaeZKX.js +0 -2
- package/dist/web/assets/remote-desktop-mobile-view-D13mtr9F.js +0 -1
- package/dist/web/assets/remote-desktop-window-content-CbqTCaC6.js +0 -1
- package/dist/web/assets/settings-body-Rnu-FcX-.js +0 -2
- package/dist/web/assets/settings-store-DZPgPtEA.js +0 -2
- package/dist/web/assets/settings-tab-C6PHxs0Z.js +0 -1
- package/dist/web/assets/settings-window-content-CQ4gT2qj.js +0 -1
- package/dist/web/assets/system-monitor-body-2vQ1kMxE.js +0 -2
- package/dist/web/assets/system-monitor-tab-krAcvwF7.js +0 -1
- package/dist/web/assets/team-member-sheet-2FnRmk1a.js +0 -2
- package/dist/web/assets/tool-cards-DU_S2o51.js +0 -9
- package/dist/web/assets/treemap-KZPCXAKY-BhEtjljr.js +0 -1
- package/dist/web/assets/use-remote-desktop-display-choice-BK_f787P.js +0 -1
- package/dist/web/assets/video-preview-BDNwumbW.js +0 -1
- package/dist/web/assets/ws-auth-DEAJiGCR.js +0 -1
- package/packages/vscode-compat/node_modules/.bin/tsc.bunx +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsc.exe +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsserver.bunx +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsserver.exe +0 -0
- /package/dist/web/assets/{abap-tkptwpsK.js → abap-IN2yINdN.js} +0 -0
- /package/dist/web/assets/{actionscript-3-Di9TMGwg.js → actionscript-3-C_t772eR.js} +0 -0
- /package/dist/web/assets/{ada-CB9F079D.js → ada-DPme3emm.js} +0 -0
- /package/dist/web/assets/{andromeeda-Dcl8jpb7.js → andromeeda-DSV4i4mZ.js} +0 -0
- /package/dist/web/assets/{apache-D0Nk0qsH.js → apache-CWr8s8I8.js} +0 -0
- /package/dist/web/assets/{apex-mQIoWncD.js → apex-Z20JnDF5.js} +0 -0
- /package/dist/web/assets/{applescript-C6ljbcsI.js → applescript-BKNPu3ga.js} +0 -0
- /package/dist/web/assets/{apply-theme-BwIMNXyX.js → apply-theme-CbR31K6I.js} +0 -0
- /package/dist/web/assets/{ara-WFqRPGPe.js → ara-hWdY3O96.js} +0 -0
- /package/dist/web/assets/{asciidoc-bNd8w4nf.js → asciidoc-eynhq496.js} +0 -0
- /package/dist/web/assets/{asm-BQ1_F580.js → asm-Bu02Kq4P.js} +0 -0
- /package/dist/web/assets/{aurora-x-Ciqs_Dbu.js → aurora-x-BHBGXbIZ.js} +0 -0
- /package/dist/web/assets/{awk-GCR-6KZV.js → awk-B4ojezyv.js} +0 -0
- /package/dist/web/assets/{ayu-dark-DxJXuj99.js → ayu-dark-D0GQzFi9.js} +0 -0
- /package/dist/web/assets/{ayu-light-jvSyJWDV.js → ayu-light-BVYb5Yn8.js} +0 -0
- /package/dist/web/assets/{ayu-mirage-Cg3BPO6H.js → ayu-mirage-BGFW6oNb.js} +0 -0
- /package/dist/web/assets/{ballerina-BPz4CrX6.js → ballerina-B6Og3IKT.js} +0 -0
- /package/dist/web/assets/{bat-CSTs2hIG.js → bat-D8YFILfx.js} +0 -0
- /package/dist/web/assets/{beancount-DMateAZX.js → beancount-BjlbBBuX.js} +0 -0
- /package/dist/web/assets/{berry-9lXg0GRM.js → berry-Cz1ygeoj.js} +0 -0
- /package/dist/web/assets/{bibtex-DIbqmvFg.js → bibtex-CVkJceJh.js} +0 -0
- /package/dist/web/assets/{bicep-02WGsoJ8.js → bicep-DrhYI5GX.js} +0 -0
- /package/dist/web/assets/{bird2-BY0tbu3k.js → bird2-BV-KJtmc.js} +0 -0
- /package/dist/web/assets/{c-jMBX_9Je.js → c-CuLlvxbG.js} +0 -0
- /package/dist/web/assets/{c3-B8JVbNjW.js → c3-CI7-1CJ0.js} +0 -0
- /package/dist/web/assets/{cadence-DUIf1tvL.js → cadence-DjxhNP3Q.js} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-DGEc0s4P.js → can-open-in-ppm-cv5--yHX.js} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-FhUCVxex.js → catppuccin-frappe-CEozpJRh.js} +0 -0
- /package/dist/web/assets/{catppuccin-latte-CzfrtmgL.js → catppuccin-latte-C4sXQFMc.js} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-6xL0lOtj.js → catppuccin-macchiato-Ci-fDhXy.js} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-D39-xS3P.js → catppuccin-mocha-CH7YXw8d.js} +0 -0
- /package/dist/web/assets/{clarity-D8TeGvoT.js → clarity-BWrJ7UmT.js} +0 -0
- /package/dist/web/assets/{clojure-Dx_acSX7.js → clojure-C94fh2hb.js} +0 -0
- /package/dist/web/assets/{cmake-CyeYPq8o.js → cmake-CtvCkMsG.js} +0 -0
- /package/dist/web/assets/{codeowners-DrTI0lmI.js → codeowners-CJnubqzH.js} +0 -0
- /package/dist/web/assets/{codeql-CPkFxVW-.js → codeql-BOoP5HY2.js} +0 -0
- /package/dist/web/assets/{common-lisp-B0k-3LTj.js → common-lisp-B9nlMFJd.js} +0 -0
- /package/dist/web/assets/{coq-uygpo7to.js → coq-CgzIQiSH.js} +0 -0
- /package/dist/web/assets/{csharp-DKUYGfSp.js → csharp-4xAIx3jw.js} +0 -0
- /package/dist/web/assets/{css-DoOUp7v4.js → css-D4YoLYGn.js} +0 -0
- /package/dist/web/assets/{csv-B3YE13gi.js → csv-C2v-ZakW.js} +0 -0
- /package/dist/web/assets/{csv-parser-DXePqmXe.js → csv-parser-_oDBUkwQ.js} +0 -0
- /package/dist/web/assets/{cue-DViO2wvn.js → cue-Bbznh_an.js} +0 -0
- /package/dist/web/assets/{cypher-4BMCIW5N.js → cypher-BKhVEARF.js} +0 -0
- /package/dist/web/assets/{d-BT_sTHas.js → d-D6IhWopl.js} +0 -0
- /package/dist/web/assets/{dark-plus-DVVXu-1N.js → dark-plus-xAWu790O.js} +0 -0
- /package/dist/web/assets/{dart-DHz6f6_6.js → dart-Bj6S9O1j.js} +0 -0
- /package/dist/web/assets/{data-grid-types-OgUxMLdQ.js → data-grid-types-C5bthITf.js} +0 -0
- /package/dist/web/assets/{dax-ChYCjweK.js → dax-CF2zvaqq.js} +0 -0
- /package/dist/web/assets/{desktop-D6Lt4p04.js → desktop-CnmyxMKE.js} +0 -0
- /package/dist/web/assets/{diff-D8TDe4hP.js → diff-Qi8WuJsI.js} +0 -0
- /package/dist/web/assets/{dist-DOTlFQJA.js → dist-Bjseolz4.js} +0 -0
- /package/dist/web/assets/{dist-CrBOCtCW.js → dist-Czq7BUMy.js} +0 -0
- /package/dist/web/assets/{docker-Bsp0YbPx.js → docker-vLbbNP5d.js} +0 -0
- /package/dist/web/assets/{dotenv-B_7giSY_.js → dotenv-DJMvvNzn.js} +0 -0
- /package/dist/web/assets/{dracula-TrQL2iB5.js → dracula-CtAh2rhB.js} +0 -0
- /package/dist/web/assets/{dracula-soft-n2XOlgh-.js → dracula-soft-CXtuAAf6.js} +0 -0
- /package/dist/web/assets/{dream-maker-CdIEdhpT.js → dream-maker-D5YQyK49.js} +0 -0
- /package/dist/web/assets/{editor-font-BDrdiGf1.js → editor-font-ClTC9gaD.js} +0 -0
- /package/dist/web/assets/{emacs-lisp-CSbixs6u.js → emacs-lisp-CGTjbiqF.js} +0 -0
- /package/dist/web/assets/{everforest-dark-BuZahZYp.js → everforest-dark-D59p7vAQ.js} +0 -0
- /package/dist/web/assets/{everforest-light-DPH53z5H.js → everforest-light-B3Qtud3V.js} +0 -0
- /package/dist/web/assets/{fennel-B1-K_hlJ.js → fennel-BCyHNUwf.js} +0 -0
- /package/dist/web/assets/{fish-Cy12Dbua.js → fish-DDDlLV2G.js} +0 -0
- /package/dist/web/assets/{fluent-B_82ys8E.js → fluent-By54R9tl.js} +0 -0
- /package/dist/web/assets/{format-bytes-D5sBgIqU.js → format-bytes-D1AQyUCt.js} +0 -0
- /package/dist/web/assets/{fortran-free-form-BRQdNzZF.js → fortran-free-form-tP8mRym_.js} +0 -0
- /package/dist/web/assets/{gdscript-XBDmLUm9.js → gdscript-nHC2z6Te.js} +0 -0
- /package/dist/web/assets/{gdshader-DhVfB3u4.js → gdshader-K-cSmPlW.js} +0 -0
- /package/dist/web/assets/{genie-X3K29Y49.js → genie-BAcRhvEe.js} +0 -0
- /package/dist/web/assets/{gherkin-DKIx-6cX.js → gherkin-CcifxMLb.js} +0 -0
- /package/dist/web/assets/{github-dark-Bf7zdp5s.js → github-dark-67KKlMdB.js} +0 -0
- /package/dist/web/assets/{github-dark-default-DqsBBV11.js → github-dark-default-tja8pidR.js} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-X2gqRz6w.js → github-dark-dimmed-CtjhYQtx.js} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-Z7tvbGX4.js → github-dark-high-contrast-Bf-LPFgn.js} +0 -0
- /package/dist/web/assets/{github-light-BKxt-7zZ.js → github-light-CbJxE7n3.js} +0 -0
- /package/dist/web/assets/{github-light-default-B0liF4d4.js → github-light-default-DRQmdHxt.js} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-F4encJwr.js → github-light-high-contrast-CJkDgTeM.js} +0 -0
- /package/dist/web/assets/{gleam-Pz2bHgBB.js → gleam-D4LCl2ri.js} +0 -0
- /package/dist/web/assets/{gn-CgmdNsPU.js → gn-COY8zZmC.js} +0 -0
- /package/dist/web/assets/{gnuplot-qLNF5yZ9.js → gnuplot-ROk1VitR.js} +0 -0
- /package/dist/web/assets/{go-CSDUNhE7.js → go-H30c3p0C.js} +0 -0
- /package/dist/web/assets/{groovy-B3NEnOHF.js → groovy-DBLCaelV.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-DcoftiUX.js → gruvbox-dark-hard-DJy4irps.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-D1wVSuD8.js → gruvbox-dark-medium-Dhfw1QTO.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-DWpunymH.js → gruvbox-dark-soft-BncJU-8w.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-rHMvyUdS.js → gruvbox-light-hard-Cq12_YvM.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-3O2KiXO7.js → gruvbox-light-medium-DqVja5_v.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-lNlXJPwH.js → gruvbox-light-soft-IvwhveGF.js} +0 -0
- /package/dist/web/assets/{haskell-aaG3aC0h.js → haskell-DA1JV-MC.js} +0 -0
- /package/dist/web/assets/{haxe-CPcHhUDd.js → haxe-V9RTRc5E.js} +0 -0
- /package/dist/web/assets/{hcl-CMQNlR_4.js → hcl-hr1lyZ10.js} +0 -0
- /package/dist/web/assets/{hjson-DeuklPFj.js → hjson-D3vW3i7X.js} +0 -0
- /package/dist/web/assets/{hlsl-BI3hlsaM.js → hlsl-BB85gfJT.js} +0 -0
- /package/dist/web/assets/{horizon-C7-gOcjs.js → horizon-DU8OOnj8.js} +0 -0
- /package/dist/web/assets/{horizon-bright-Cxt9bRW7.js → horizon-bright-DNMUclW6.js} +0 -0
- /package/dist/web/assets/{houston-DbF2G7iD.js → houston-DAiZKf6T.js} +0 -0
- /package/dist/web/assets/{hy-DRG6Hs2I.js → hy-C6Zv0LMe.js} +0 -0
- /package/dist/web/assets/{image-gallery-CObzTisL.js → image-gallery-CGvlv8zR.js} +0 -0
- /package/dist/web/assets/{imba-CxKv_2TW.js → imba-Didnp6Y-.js} +0 -0
- /package/dist/web/assets/{ini-BiHsyCdO.js → ini-m0T7q4gQ.js} +0 -0
- /package/dist/web/assets/{input-D-dR8RI6.js → input-C7Q8FxeL.js} +0 -0
- /package/dist/web/assets/{java-D3RZzgDB.js → java-Buy07jGn.js} +0 -0
- /package/dist/web/assets/{javascript-4FmSqG-T.js → javascript-Cjq3CbRL.js} +0 -0
- /package/dist/web/assets/{json-CjB236_E.js → json-BSVu8IqD.js} +0 -0
- /package/dist/web/assets/{json5-bkfO-Rco.js → json5-NN_Vb7e6.js} +0 -0
- /package/dist/web/assets/{jsonc-BwaTeLyv.js → jsonc-BdyZhBUw.js} +0 -0
- /package/dist/web/assets/{jsonl-CfxNSwGd.js → jsonl-BsDSNvwi.js} +0 -0
- /package/dist/web/assets/{jsonnet-CQETCYrp.js → jsonnet-Gm963F-U.js} +0 -0
- /package/dist/web/assets/{jssm-D5o3Zzdz.js → jssm-Ds3bKWgJ.js} +0 -0
- /package/dist/web/assets/{jsx-BAMILPLo.js → jsx-BT5mW58X.js} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-BhGVxu3R.js → kanagawa-dragon-BvNvf7xd.js} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-FH4Y59ro.js → kanagawa-lotus-CuSiliSn.js} +0 -0
- /package/dist/web/assets/{kanagawa-wave-eilvP9MB.js → kanagawa-wave-C6g-d6jT.js} +0 -0
- /package/dist/web/assets/{kdl-BQ-yvXUK.js → kdl-Bx4kZef-.js} +0 -0
- /package/dist/web/assets/{kotlin-BuCx0-VT.js → kotlin-qvaVvCcm.js} +0 -0
- /package/dist/web/assets/{kusto-DAN_n_Cy.js → kusto-BPLyNCN6.js} +0 -0
- /package/dist/web/assets/{laserwave-Cq2BlxrT.js → laserwave-Sf8ZEhWP.js} +0 -0
- /package/dist/web/assets/{lean-Dhq7uXKw.js → lean-DGe6uqgk.js} +0 -0
- /package/dist/web/assets/{less-CxaMQb8j.js → less-CqM85x-9.js} +0 -0
- /package/dist/web/assets/{lib-BVwmtv2i.js → lib-CD6pOS4u.js} +0 -0
- /package/dist/web/assets/{libesm-DdtEjhIi.js → libesm-CPh1Av0r.js} +0 -0
- /package/dist/web/assets/{light-plus-B4sMAend.js → light-plus-DBtKwhFA.js} +0 -0
- /package/dist/web/assets/{llvm-DQ6-B_6Y.js → llvm-Dpbq3gky.js} +0 -0
- /package/dist/web/assets/{log-Bb_vqvu7.js → log-qKMcPm9S.js} +0 -0
- /package/dist/web/assets/{logo-BzfYv3A_.js → logo-DFo7i5KH.js} +0 -0
- /package/dist/web/assets/{luau-BnAeNR77.js → luau-DGlqWFyL.js} +0 -0
- /package/dist/web/assets/{make-B6IFuxpC.js → make-CixdvUQe.js} +0 -0
- /package/dist/web/assets/{markdown-Z0xi77Fn.js → markdown-CmRnbngE.js} +0 -0
- /package/dist/web/assets/{material-theme-1scy1SYn.js → material-theme-WDUbafB-.js} +0 -0
- /package/dist/web/assets/{material-theme-darker-G-JykXQP.js → material-theme-darker-u8y2xpOk.js} +0 -0
- /package/dist/web/assets/{material-theme-lighter-BtKkCMVq.js → material-theme-lighter-cyQZK3Tg.js} +0 -0
- /package/dist/web/assets/{material-theme-ocean-irrDC89L.js → material-theme-ocean-LBAVvw7k.js} +0 -0
- /package/dist/web/assets/{material-theme-palenight-Eq5_K4LM.js → material-theme-palenight-BJqhBxL0.js} +0 -0
- /package/dist/web/assets/{matlab-BE3oCXZC.js → matlab-B38sOJee.js} +0 -0
- /package/dist/web/assets/{mdx-DYiuFTGw.js → mdx-C8QrE_IW.js} +0 -0
- /package/dist/web/assets/{mermaid-DVlaEvtw.js → mermaid-BQ-eeU8A.js} +0 -0
- /package/dist/web/assets/{min-dark-DSkeTpQa.js → min-dark-D4gNa5tv.js} +0 -0
- /package/dist/web/assets/{min-light-CFv2Q0uF.js → min-light-Dfbhn_PL.js} +0 -0
- /package/dist/web/assets/{mipsasm-CiAFuZQ2.js → mipsasm-bLOhJkdm.js} +0 -0
- /package/dist/web/assets/{mojo-ARshcaSQ.js → mojo-B0BCOMQW.js} +0 -0
- /package/dist/web/assets/{monaco-dotenv-language-BDYnKcnr.js → monaco-dotenv-language-uB-wok6C.js} +0 -0
- /package/dist/web/assets/{monokai-CPTV-SOg.js → monokai-Bdw_07OM.js} +0 -0
- /package/dist/web/assets/{moonbit-D57B0dZr.js → moonbit-BFdGaeuk.js} +0 -0
- /package/dist/web/assets/{move-qgy3G_o9.js → move-CyXQFGPM.js} +0 -0
- /package/dist/web/assets/{narrat-CZ3rC-oc.js → narrat-9DvTD3_3.js} +0 -0
- /package/dist/web/assets/{nextflow-groovy-BxxIOcI4.js → nextflow-groovy-C4VY3kNY.js} +0 -0
- /package/dist/web/assets/{night-owl-B1ryGCda.js → night-owl-feYm66V0.js} +0 -0
- /package/dist/web/assets/{night-owl-light-BZvNnvMF.js → night-owl-light-DALqFjvx.js} +0 -0
- /package/dist/web/assets/{nix-BVBQi8yv.js → nix-C1kPA9Sw.js} +0 -0
- /package/dist/web/assets/{nord-3NXw613h.js → nord-1dvrj1Al.js} +0 -0
- /package/dist/web/assets/{nushell-BMOLRalb.js → nushell-DSQ_9Uqj.js} +0 -0
- /package/dist/web/assets/{objective-c-AxruEUgh.js → objective-c-Dhcn5ZK8.js} +0 -0
- /package/dist/web/assets/{objective-cpp-cFT0qRsD.js → objective-cpp-CGVYCSrp.js} +0 -0
- /package/dist/web/assets/{ocaml-_8JH6O8J.js → ocaml-rxXW21An.js} +0 -0
- /package/dist/web/assets/{odin-nwYvR0O6.js → odin-ClSJX2DE.js} +0 -0
- /package/dist/web/assets/{one-dark-pro-C1LaYJaH.js → one-dark-pro-3gbWDfFW.js} +0 -0
- /package/dist/web/assets/{one-light-B7rMc__c.js → one-light-C2q5ZZAw.js} +0 -0
- /package/dist/web/assets/{openscad-Cwes8bKO.js → openscad-eHXeafBl.js} +0 -0
- /package/dist/web/assets/{pascal-DMt-6tdZ.js → pascal-kKha3Txs.js} +0 -0
- /package/dist/web/assets/{pkl-QBTyYQmB.js → pkl-CTiPytg-.js} +0 -0
- /package/dist/web/assets/{plastic-BTSUp8Fk.js → plastic-D1Ygezi4.js} +0 -0
- /package/dist/web/assets/{plsql-DQv3IFXP.js → plsql-D_gbgZIr.js} +0 -0
- /package/dist/web/assets/{po-CNwZx4tW.js → po-BkhbDUnq.js} +0 -0
- /package/dist/web/assets/{poimandres-8Os7Qequ.js → poimandres-Do6NywrA.js} +0 -0
- /package/dist/web/assets/{polar-b4yK8oD8.js → polar-B3B23wca.js} +0 -0
- /package/dist/web/assets/{postcss-sFctwpxx.js → postcss-Dv_YBvWd.js} +0 -0
- /package/dist/web/assets/{powerquery-Cg_WrtuN.js → powerquery-fKJWI-Sh.js} +0 -0
- /package/dist/web/assets/{powershell-C7Ifz95h.js → powershell-B4Y7KIgx.js} +0 -0
- /package/dist/web/assets/{prisma-Z52HUJzQ.js → prisma-J--XdTXX.js} +0 -0
- /package/dist/web/assets/{prolog-DLqW-zR1.js → prolog-BBTg4Vb3.js} +0 -0
- /package/dist/web/assets/{proto-BOIzxCCJ.js → proto-DWlum3T8.js} +0 -0
- /package/dist/web/assets/{puppet-De7TjZIf.js → puppet-ZiUfc9JV.js} +0 -0
- /package/dist/web/assets/{purescript-R76ou1WT.js → purescript-CmT8SCHB.js} +0 -0
- /package/dist/web/assets/{python-Dprm0tNP.js → python-BURpj-fq.js} +0 -0
- /package/dist/web/assets/{qmldir-Clp_jpNw.js → qmldir-CpaiJywQ.js} +0 -0
- /package/dist/web/assets/{qss-eQPYYzSo.js → qss-C-zdz0i5.js} +0 -0
- /package/dist/web/assets/{r-CCcRHIf5.js → r-K56BeS-s.js} +0 -0
- /package/dist/web/assets/{racket-CzE472yp.js → racket-gkn6Z_Jw.js} +0 -0
- /package/dist/web/assets/{raku-DQwXrTSi.js → raku-C0ZBuKlx.js} +0 -0
- /package/dist/web/assets/{red-KCS6wyop.js → red-BWZ6x-3p.js} +0 -0
- /package/dist/web/assets/{reg-CcrAddUh.js → reg-Dt_EsyGR.js} +0 -0
- /package/dist/web/assets/{regexp-DDbud-Ri.js → regexp-CT6BLG2C.js} +0 -0
- /package/dist/web/assets/{rel-99GDgaHp.js → rel-MJ2LcyzJ.js} +0 -0
- /package/dist/web/assets/{resolve-theme-CW2niGV2.js → resolve-theme-B_ukrg_8.js} +0 -0
- /package/dist/web/assets/{riscv-Dm2eNv0R.js → riscv-BZYWzMAA.js} +0 -0
- /package/dist/web/assets/{ron-CzFt0ygH.js → ron-CLbwHWMn.js} +0 -0
- /package/dist/web/assets/{rose-pine-Ck6lCrCP.js → rose-pine-BPiI_daR.js} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-vtALRJNj.js → rose-pine-dawn-BjkJc7dW.js} +0 -0
- /package/dist/web/assets/{rose-pine-moon-DPto8qXw.js → rose-pine-moon-BQSxkt7g.js} +0 -0
- /package/dist/web/assets/{rosmsg-NtS6429H.js → rosmsg-yt4151pJ.js} +0 -0
- /package/dist/web/assets/{rust-BjIXvF9h.js → rust-1dAcengL.js} +0 -0
- /package/dist/web/assets/{sass-CQ23wf5E.js → sass-DUgtQJsg.js} +0 -0
- /package/dist/web/assets/{scala-LfKLM143.js → scala-CxoGYpS0.js} +0 -0
- /package/dist/web/assets/{scheme-D3SLBXlF.js → scheme-B2K3u9e3.js} +0 -0
- /package/dist/web/assets/{sdbl-ODRd2rGN.js → sdbl-C0Ygk0n6.js} +0 -0
- /package/dist/web/assets/{shellscript-3KB1G_oA.js → shellscript-C2CvhqMk.js} +0 -0
- /package/dist/web/assets/{slack-dark-DTtyWmIy.js → slack-dark-DYdgzRGj.js} +0 -0
- /package/dist/web/assets/{slack-ochin-Bu0PApk3.js → slack-ochin-X-WD0WCg.js} +0 -0
- /package/dist/web/assets/{smalltalk-haMT-Sbe.js → smalltalk-Dp7g_zb9.js} +0 -0
- /package/dist/web/assets/{snazzy-light-DXJzefE9.js → snazzy-light-DWHWr-a6.js} +0 -0
- /package/dist/web/assets/{solarized-dark-B6LyYa18.js → solarized-dark-CxdLsjvb.js} +0 -0
- /package/dist/web/assets/{solarized-light-QLADebkv.js → solarized-light-Cz9rAvG5.js} +0 -0
- /package/dist/web/assets/{solidity-mzfq1aDc.js → solidity-D33gHHdn.js} +0 -0
- /package/dist/web/assets/{splunk-CyH4RWBp.js → splunk-BFbOroYw.js} +0 -0
- /package/dist/web/assets/{sql-CWVlT5D3.js → sql-ChpxvmdY.js} +0 -0
- /package/dist/web/assets/{ssh-config-DNvQJ1Qx.js → ssh-config-CUuSQ6JG.js} +0 -0
- /package/dist/web/assets/{streaming-store-uDu3PoN1.js → streaming-store-BYukdB56.js} +0 -0
- /package/dist/web/assets/{stylus-ByQQdtmf.js → stylus-DDihP0_W.js} +0 -0
- /package/dist/web/assets/{swift-D1cpY4ow.js → swift-XoalUn4x.js} +0 -0
- /package/dist/web/assets/{synthwave-84-BDF_-QiW.js → synthwave-84-DjkG0Bff.js} +0 -0
- /package/dist/web/assets/{system-verilog-BYrkMydC.js → system-verilog-f_pLKMYd.js} +0 -0
- /package/dist/web/assets/{systemd-CQm3zyK0.js → systemd-DjDcLfxp.js} +0 -0
- /package/dist/web/assets/{talonscript-DMW5CzE1.js → talonscript-BpUzYcDl.js} +0 -0
- /package/dist/web/assets/{tasl-BhFzMCr2.js → tasl-DP-cUbg8.js} +0 -0
- /package/dist/web/assets/{tcl-D7VEAF-9.js → tcl-BHoy-dfE.js} +0 -0
- /package/dist/web/assets/{terraform-DdT5A0Vy.js → terraform-vCVxN25B.js} +0 -0
- /package/dist/web/assets/{tokyo-night-WGLMM6Q9.js → tokyo-night-D0u4xZba.js} +0 -0
- /package/dist/web/assets/{toml-CZ7ipXHZ.js → toml-BS8D0__A.js} +0 -0
- /package/dist/web/assets/{tsv-B1zVvoTr.js → tsv-DCb-NQh3.js} +0 -0
- /package/dist/web/assets/{tsx-D4HwRUBq.js → tsx-DF8YeRgG.js} +0 -0
- /package/dist/web/assets/{turtle-B4r8KEJH.js → turtle-Bhx1GlIy.js} +0 -0
- /package/dist/web/assets/{typescript-BnHhxMtp.js → typescript-CAVD2Wb6.js} +0 -0
- /package/dist/web/assets/{typespec-DP2q46GT.js → typespec-D7mchdY_.js} +0 -0
- /package/dist/web/assets/{typst-DFsD_yaD.js → typst-CeXzq6Yw.js} +0 -0
- /package/dist/web/assets/{use-is-mobile-BQ9Bv5Ga.js → use-is-mobile-TkcwP1Gx.js} +0 -0
- /package/dist/web/assets/{use-visual-viewport-CbwnktSG.js → use-visual-viewport-Lp878uzs.js} +0 -0
- /package/dist/web/assets/{v-Bji8hSVT.js → v-DhzO54je.js} +0 -0
- /package/dist/web/assets/{vala-D3TIgGmU.js → vala-Dw_RAk3E.js} +0 -0
- /package/dist/web/assets/{vb-DvcxFS2q.js → vb-CiXdNh2Y.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-BqPDsE9b.js → vendor-xterm-BHEY6Ctu.js} +0 -0
- /package/dist/web/assets/{verilog-Dy7cF35d.js → verilog-fITdxqwV.js} +0 -0
- /package/dist/web/assets/{vesper-BzjwUv9J.js → vesper-B1wm_At7.js} +0 -0
- /package/dist/web/assets/{vhdl-DuFnFNmW.js → vhdl-ebHjqKp9.js} +0 -0
- /package/dist/web/assets/{viml-yAPgKlbz.js → viml-Dgmnoxoo.js} +0 -0
- /package/dist/web/assets/{vitesse-black-oSSQdyIZ.js → vitesse-black-BZ5gMb7l.js} +0 -0
- /package/dist/web/assets/{vitesse-dark-BZxwPihB.js → vitesse-dark-Lij7kkOt.js} +0 -0
- /package/dist/web/assets/{vitesse-light-uIigycvt.js → vitesse-light-DW6Wq7VC.js} +0 -0
- /package/dist/web/assets/{vyper-CX3NAxm5.js → vyper-6FxDnVNg.js} +0 -0
- /package/dist/web/assets/{wasm-6mEOOvVa.js → wasm-BDxaNPCj.js} +0 -0
- /package/dist/web/assets/{wasm-D9td37qO.js → wasm-DKhAtzfe.js} +0 -0
- /package/dist/web/assets/{wenyan-lwNIHgk6.js → wenyan-C0k0DYG_.js} +0 -0
- /package/dist/web/assets/{wgsl-DQAzCfog.js → wgsl-Y2zagbdn.js} +0 -0
- /package/dist/web/assets/{wikitext-DTXmt5NE.js → wikitext-C4QGWzkY.js} +0 -0
- /package/dist/web/assets/{wit-Bdw_7WDH.js → wit-CQESzjHy.js} +0 -0
- /package/dist/web/assets/{wolfram-DqyHDZ07.js → wolfram-B-ia69Ia.js} +0 -0
- /package/dist/web/assets/{yaml-CPXhdByd.js → yaml-CEYYTQPm.js} +0 -0
- /package/dist/web/assets/{zenscript-6s_i5zek.js → zenscript-BggWXIeJ.js} +0 -0
- /package/dist/web/assets/{zig-B2htezJ_.js → zig-CbaUfBQe.js} +0 -0
|
@@ -5,6 +5,19 @@
|
|
|
5
5
|
import { AVATAR_JS, FONT_TOKENS } from "./webview-shell.ts";
|
|
6
6
|
import { COMMIT_MESSAGE_JS } from "./commit-message-html.ts";
|
|
7
7
|
|
|
8
|
+
/*
|
|
9
|
+
* The narrowest the message column may get, in px. The graph column is capped
|
|
10
|
+
* against this rather than the other way round: the message is what a list of
|
|
11
|
+
* commits is for, and it used to be the only column able to shrink at all — so
|
|
12
|
+
* in a repository with enough parallel branches the graph took the whole row
|
|
13
|
+
* and the messages were simply not there. Both the stylesheet and the script
|
|
14
|
+
* read it from here, because the script's cap and the CSS floor disagreeing is
|
|
15
|
+
* the same bug in a subtler form.
|
|
16
|
+
*/
|
|
17
|
+
const MESSAGE_MIN_W = 240;
|
|
18
|
+
/** The narrowest the graph column may get, automatically or by dragging. */
|
|
19
|
+
const GRAPH_MIN_W = 40;
|
|
20
|
+
|
|
8
21
|
export function getWebviewHtml(): string {
|
|
9
22
|
return `<!DOCTYPE html>
|
|
10
23
|
<html>
|
|
@@ -94,11 +107,12 @@ ${getStyles()}
|
|
|
94
107
|
<div class="col-hash">Hash</div>
|
|
95
108
|
</div>
|
|
96
109
|
<div id="commit-list-wrapper">
|
|
97
|
-
<div id="graph-svg-container"></div>
|
|
110
|
+
<div id="graph-clip"><div id="graph-svg-container"></div></div>
|
|
98
111
|
<div id="commit-list"></div>
|
|
99
112
|
</div>
|
|
100
113
|
<div id="loading" class="loading hidden">Loading...</div>
|
|
101
114
|
</div>
|
|
115
|
+
<div id="graph-pan-bar" class="hidden" aria-hidden="true"><div id="graph-pan-thumb"></div></div>
|
|
102
116
|
<div id="scroll-markers" aria-hidden="true"></div>
|
|
103
117
|
</div>
|
|
104
118
|
<div id="detail-panel" class="detail-panel hidden"></div>
|
|
@@ -120,6 +134,15 @@ ${getStyles()}
|
|
|
120
134
|
<div class="setting-row"><label>Commit Ordering</label><select id="s-commitOrdering"><option value="topo">Topological</option><option value="date">Date</option><option value="author-date">Author Date</option></select></div>
|
|
121
135
|
<div class="setting-row"><label>Auto Fetch Interval</label><select id="s-autoFetchInterval"><option value="0">Disabled</option><option value="10">10 seconds</option><option value="30">30 seconds</option><option value="60">1 minute</option><option value="120">2 minutes</option><option value="300">5 minutes</option></select></div>
|
|
122
136
|
</details>
|
|
137
|
+
<details class="settings-section" open>
|
|
138
|
+
<summary>Columns</summary>
|
|
139
|
+
<p style="font-size:11px;color:var(--subtext);margin-bottom:6px">Right-click the table header for the same list. A narrow panel drops the last few of its own accord, whatever is ticked here.</p>
|
|
140
|
+
<div class="setting-row"><label>Branch / Tag</label><input type="checkbox" id="s-colRefs"></div>
|
|
141
|
+
<div class="setting-row"><label>Changes</label><input type="checkbox" id="s-colChanges"></div>
|
|
142
|
+
<div class="setting-row"><label>Author</label><input type="checkbox" id="s-colAuthor"></div>
|
|
143
|
+
<div class="setting-row"><label>Date</label><input type="checkbox" id="s-colDate"></div>
|
|
144
|
+
<div class="setting-row"><label>Hash</label><input type="checkbox" id="s-colHash"></div>
|
|
145
|
+
</details>
|
|
123
146
|
<details class="settings-section" open>
|
|
124
147
|
<summary>User Details</summary>
|
|
125
148
|
<div class="setting-row"><label>Name</label><input type="text" id="s-userName" placeholder="user.name"></div>
|
|
@@ -352,7 +375,28 @@ button:active { background: var(--surface); }
|
|
|
352
375
|
.col-graph { width: var(--graph-col-w, 120px); min-width: var(--graph-col-w, 80px); overflow: hidden; flex-shrink: 0; position: relative; }
|
|
353
376
|
.graph-resize-handle { position: absolute; right: 0; top: 0; bottom: 0; width: 6px; cursor: col-resize; z-index: 3; background: transparent; }
|
|
354
377
|
.graph-resize-handle:hover, .graph-resize-handle.dragging { background: var(--blue); opacity: 0.5; }
|
|
355
|
-
|
|
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; }
|
|
356
400
|
/* The lane's colour, restated where the eye reads the message. The row centres
|
|
357
401
|
its cells, so this one has to stretch or the tick has nothing to span. */
|
|
358
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; }
|
|
@@ -389,6 +433,17 @@ button:active { background: var(--surface); }
|
|
|
389
433
|
.col-date { width: 80px; min-width: 80px; color: var(--subtext); font-size: 11px; }
|
|
390
434
|
.col-hash { width: 60px; min-width: 60px; font-family: var(--mono-font); font-size: 10px; color: var(--subtle); }
|
|
391
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
|
+
|
|
392
447
|
/* Ref badges — border + tinted bg + dark text */
|
|
393
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; }
|
|
394
449
|
.ref-head { border-color: var(--green); background: color-mix(in srgb, var(--green) 12%, transparent); }
|
|
@@ -401,9 +456,21 @@ button:active { background: var(--surface); }
|
|
|
401
456
|
:root:not([data-ppm-theme="light"]) .ref-badge { color: #e4e4e7; }
|
|
402
457
|
}
|
|
403
458
|
|
|
404
|
-
/* SVG graph — single SVG overlay
|
|
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. */
|
|
405
467
|
#commit-list-wrapper { position: relative; }
|
|
406
|
-
#graph-
|
|
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))); }
|
|
407
474
|
#graph-svg-container circle { pointer-events: auto; cursor: pointer; }
|
|
408
475
|
#graph-svg-container .line { stroke-width: 2; fill: none; }
|
|
409
476
|
/* The checked-out commit wears a thicker ring rather than a different shape,
|
|
@@ -559,6 +626,11 @@ button:active { background: var(--surface); }
|
|
|
559
626
|
.ctx-item { padding: 6px 12px; cursor: pointer; font-size: 12px; display: flex; align-items: center; gap: 8px; }
|
|
560
627
|
.ctx-item:hover { background: var(--surface-hover); }
|
|
561
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; }
|
|
562
634
|
.ctx-separator { border-top: 1px solid var(--border); margin: 4px 0; }
|
|
563
635
|
|
|
564
636
|
/* Loading */
|
|
@@ -632,26 +704,38 @@ button:active { background: var(--surface); }
|
|
|
632
704
|
#toolbar button { font-size: 10px; }
|
|
633
705
|
.branch-trigger { font-size: 10px !important; padding: 2px 6px !important; }
|
|
634
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. */
|
|
635
711
|
#graph-container { overflow-x: auto; overflow-y: auto; }
|
|
636
712
|
#find-bar { order: 0; }
|
|
637
713
|
#status-bar { order: 9; }
|
|
638
|
-
/* Enough for every column including the branch one, so a tablet scrolls the
|
|
639
|
-
table sideways rather than crushing it. */
|
|
640
|
-
#commit-list-wrapper { min-width: 880px; }
|
|
641
|
-
#graph-header { min-width: 880px; }
|
|
642
714
|
.commit-row.header-row { min-height: 20px; }
|
|
643
715
|
.detail-panel { order: 8; max-height: 35vh; }
|
|
644
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
|
+
}
|
|
645
730
|
/* Phone layout: the graph and the message, with author/date/hash under the
|
|
646
731
|
subject. Six columns of fragments is not a list of commits, and 44px is the
|
|
647
732
|
minimum touch target this row has to be anyway. isNarrowLayout() in the
|
|
648
733
|
script uses this same 640px, because it decides where the ref badges go. */
|
|
649
734
|
@media (max-width: 640px) {
|
|
650
735
|
:root { --refs-col-w: 0px; }
|
|
651
|
-
/* The
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
#commit-list-wrapper, #graph-header { min-width: 0; }
|
|
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; }
|
|
655
739
|
.commit-row { height: 44px; }
|
|
656
740
|
.commit-row.header-row { height: 24px; }
|
|
657
741
|
.col-refs, .col-changes, .col-author, .col-date, .col-hash { display: none; }
|
|
@@ -683,8 +767,20 @@ const DEFAULT_SETTINGS = {
|
|
|
683
767
|
graphStyle: 'rounded', firstParentOnly: false, dateFormat: 'relative', commitOrdering: 'topo',
|
|
684
768
|
issueLinkingRules: [{ pattern: '#(\\\\d+)', url: '' }], prCreation: null,
|
|
685
769
|
autoFetchInterval: 0,
|
|
770
|
+
colRefs: true, colChanges: true, colAuthor: true, colDate: true, colHash: true,
|
|
686
771
|
};
|
|
687
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
|
+
|
|
688
784
|
const state = {
|
|
689
785
|
repo: '',
|
|
690
786
|
commits: [],
|
|
@@ -705,7 +801,12 @@ const state = {
|
|
|
705
801
|
searchIndex: -1,
|
|
706
802
|
settings: { ...DEFAULT_SETTINGS },
|
|
707
803
|
userDetails: { name: '', email: '' },
|
|
804
|
+
/** Dragged width of the graph column, or null while it sizes itself. */
|
|
708
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,
|
|
709
810
|
fileViewMode: 'list',
|
|
710
811
|
worktrees: [],
|
|
711
812
|
submodules: [],
|
|
@@ -1524,23 +1625,143 @@ document.getElementById('stash-save').addEventListener('click', () => {
|
|
|
1524
1625
|
resizeHandle.classList.add('dragging');
|
|
1525
1626
|
resizeHandle.setPointerCapture(e.pointerId);
|
|
1526
1627
|
});
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
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); });
|
|
1532
1637
|
resizeHandle.addEventListener('pointerup', (e) => {
|
|
1533
1638
|
if (!resizing) return;
|
|
1534
1639
|
resizing = false;
|
|
1535
1640
|
resizeHandle.classList.remove('dragging');
|
|
1536
|
-
|
|
1537
|
-
state.graphColWidth = newW;
|
|
1538
|
-
document.documentElement.style.setProperty('--graph-col-w', newW + 'px');
|
|
1641
|
+
dragTo(e);
|
|
1539
1642
|
});
|
|
1540
1643
|
resizeHandle.addEventListener('dblclick', () => {
|
|
1541
1644
|
state.graphColWidth = null;
|
|
1542
|
-
|
|
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);
|
|
1543
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));
|
|
1544
1765
|
}
|
|
1545
1766
|
|
|
1546
1767
|
// --- Graph rendering (faithful port of vscode-git-graph graph.ts) ---
|
|
@@ -1830,7 +2051,7 @@ function graphGetAvailableColour(startAt) {
|
|
|
1830
2051
|
function graphRender(expandIdx) {
|
|
1831
2052
|
const container = document.getElementById('graph-svg-container');
|
|
1832
2053
|
container.innerHTML = '';
|
|
1833
|
-
if (gVertices.length === 0) {
|
|
2054
|
+
if (gVertices.length === 0) { state.graphWidth = GRAPH_MIN_W; applyGraphColWidth(); return; }
|
|
1834
2055
|
|
|
1835
2056
|
// Measure actual row height (may be fractional due to browser zoom)
|
|
1836
2057
|
// and use it for SVG grid to prevent cumulative sub-pixel drift
|
|
@@ -1858,11 +2079,90 @@ function graphRender(expandIdx) {
|
|
|
1858
2079
|
const w = 2 * cfg.grid.offsetX + Math.max(maxX - 1, 0) * cfg.grid.x;
|
|
1859
2080
|
const h = gVertices.length * cfg.grid.y + cfg.grid.offsetY - cfg.grid.y / 2 + (expandIdx > -1 ? cfg.grid.expandY : 0);
|
|
1860
2081
|
|
|
1861
|
-
const gw = Math.max(w,
|
|
2082
|
+
const gw = Math.max(w, GRAPH_MIN_W);
|
|
1862
2083
|
svg.setAttribute('width', gw.toString());
|
|
1863
2084
|
svg.setAttribute('height', h.toString());
|
|
1864
2085
|
container.appendChild(svg);
|
|
1865
|
-
|
|
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);
|
|
1866
2166
|
}
|
|
1867
2167
|
|
|
1868
2168
|
function graphVertexOver(e) {
|
|
@@ -3209,6 +3509,10 @@ function showDropActionMenu(x, y, ref, commit) {
|
|
|
3209
3509
|
/**
|
|
3210
3510
|
* Render a context menu from an item list. The older menu builders each inline
|
|
3211
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.
|
|
3212
3516
|
*/
|
|
3213
3517
|
function renderContextMenu(x, y, items) {
|
|
3214
3518
|
const menu = document.getElementById('context-menu');
|
|
@@ -3217,7 +3521,10 @@ function renderContextMenu(x, y, items) {
|
|
|
3217
3521
|
if (item.separator) {
|
|
3218
3522
|
html += '<div class="ctx-separator"></div>';
|
|
3219
3523
|
} else {
|
|
3220
|
-
|
|
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>';
|
|
3221
3528
|
}
|
|
3222
3529
|
});
|
|
3223
3530
|
menu.innerHTML = html;
|
|
@@ -3226,7 +3533,7 @@ function renderContextMenu(x, y, items) {
|
|
|
3226
3533
|
menu.classList.remove('hidden');
|
|
3227
3534
|
menu.querySelectorAll('.ctx-item').forEach(el => {
|
|
3228
3535
|
const item = items[parseInt(el.dataset.idx)];
|
|
3229
|
-
if (item && item.action) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
|
|
3536
|
+
if (item && item.action && !item.disabled) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
|
|
3230
3537
|
});
|
|
3231
3538
|
setTimeout(() => document.addEventListener('click', hideContextMenu, { once: true }), 0);
|
|
3232
3539
|
}
|
|
@@ -3281,12 +3588,23 @@ function applySettingsToUI() {
|
|
|
3281
3588
|
document.getElementById('s-dateFormat').value = s.dateFormat;
|
|
3282
3589
|
document.getElementById('s-commitOrdering').value = s.commitOrdering;
|
|
3283
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();
|
|
3284
3595
|
graphConfig.style = s.graphStyle;
|
|
3285
3596
|
startAutoFetch(s.autoFetchInterval);
|
|
3286
3597
|
renderIssueRules();
|
|
3287
3598
|
applyPrSettingsToUI();
|
|
3288
3599
|
}
|
|
3289
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
|
+
|
|
3290
3608
|
// General setting change handlers
|
|
3291
3609
|
['showTags', 'showStashes', 'showRemoteBranches', 'firstParentOnly'].forEach(key => {
|
|
3292
3610
|
document.getElementById('s-' + key).addEventListener('change', (e) => {
|