@hienlh/ppm 0.21.0 → 0.22.0
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 +41 -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/http-api.md +1 -1
- package/bun.lock +16 -1
- package/dist/web/assets/accounts-settings-section-BVr9-FZJ.js +1 -0
- package/dist/web/assets/{ai-resource-editor-F09pf8Hd.js → ai-resource-editor-CdDpOwjh.js} +1 -1
- package/dist/web/assets/ai-settings-section-B1hQyjAd.js +1 -0
- package/dist/web/assets/ai-settings-section-X2UOfSaS.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-DLoPK0LD.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-G84Ojzae.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-DQJfjm8E.js +15 -0
- package/dist/web/assets/{cobol-DPx_nifl.js → cobol-DRaRy4FK.js} +1 -1
- package/dist/web/assets/code-editor-D04iUPsZ.js +7 -0
- package/dist/web/assets/{codex-daily-guard-CfybHv_c.js → codex-daily-guard-BSccLRGT.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-C4ay676e.js} +2 -2
- 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-DbwEmG7o.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-S6LsALjX.js} +1 -1
- package/dist/web/assets/{dialog-DQTn55Mt.js → dialog-B84_DJQ8.js} +1 -1
- package/dist/web/assets/diff-viewer-3oBA7vgQ.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-DJmaKVY0.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-BQ0jyAGv.js +2 -0
- package/dist/web/assets/explorer-window-content-jdkWt34J.js +1 -0
- package/dist/web/assets/{extension-manager-section-BhwB6nqr.js → extension-manager-section-DG1guILi.js} +1 -1
- package/dist/web/assets/{extension-webview-DI4VL2tJ.js → extension-webview-BGSDUbdK.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-Gnyd7han.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-V6Khh15V.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-Bi513qjT.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-DnQwYSmQ.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-DpczdwyV.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-DU68xk06.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-f2HUbGDY.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-DCRsnKg5.js +1 -0
- package/dist/web/assets/{keyboard-shortcuts-section-BW03P3AF.js → keyboard-shortcuts-section-BpvVEw_Y.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-Bcaf9_bA.js +1 -0
- package/dist/web/assets/markdown-renderer-DGJp8HC3.js +3 -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-Bol3XAO1.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-BXt54VIn.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-DKJUA3Kq.js} +1 -1
- package/dist/web/assets/problems-panel-CFcoUx8h.js +1 -0
- package/dist/web/assets/{process-table-BRMS1MrX.js → process-table-EKr2dqG6.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-B7qRVl8w.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-0WDYsyCA.js +1 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-COYDg16H.js +2 -0
- package/dist/web/assets/remote-desktop-mobile-view-2DqSuS2U.js +1 -0
- package/dist/web/assets/{remote-desktop-readiness-gate-BTzss2wX.js → remote-desktop-readiness-gate-Dm_qMJMH.js} +1 -1
- package/dist/web/assets/remote-desktop-window-content-UodhsF7W.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-bG2lYfGv.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-C06bFarv.js +2 -0
- package/dist/web/assets/settings-store-krC6bc79.js +2 -0
- package/dist/web/assets/settings-tab-34RSaASd.js +1 -0
- package/dist/web/assets/settings-window-content-Dr_2lmHH.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-BgRH0cHD.js} +1 -1
- package/dist/web/assets/{sqlite-viewer-DoV9hnWJ.js → sqlite-viewer-DUxGslpa.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-IZuLn7Qh.js +2 -0
- package/dist/web/assets/system-monitor-tab-DiSA490Z.js +1 -0
- package/dist/web/assets/{system-monitor-window-content-qXLcicFM.js → system-monitor-window-content-CEaFISgj.js} +1 -1
- package/dist/web/assets/{tab-host-window-content-7fPZNEni.js → tab-host-window-content-D0TN8Wrq.js} +1 -1
- package/dist/web/assets/{tab-store-DGJGnbwv.js → tab-store-OJa1GPCq.js} +1 -1
- package/dist/web/assets/team-member-sheet-DDPNcCjd.js +2 -0
- package/dist/web/assets/{team-member-window-content-BgvJFypM.js → team-member-window-content-DCiW_1-E.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-4ypP0NDY.js} +3 -3
- package/dist/web/assets/{tex-D_StFXy_.js → tex-BcssM-QA.js} +1 -1
- package/dist/web/assets/tool-cards-Dd6E7Q3k.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-vrfFHuaR.js} +1 -1
- package/dist/web/assets/{use-lsp-CV0vzILO.js → use-lsp-CsuZu49X.js} +1 -1
- package/dist/web/assets/{use-monaco-theme-DBqbWjWX.js → use-monaco-theme-BIVYJBIn.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-BMbufhX7.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-Byj8P_jA.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/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 +134 -1
- package/packages/ext-git-graph/src/webview-html.ts +277 -27
- 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/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/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/git/git-status-panel.tsx +25 -0
- 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/theme-picker.tsx +2 -1
- package/src/web/components/ui/tooltip.tsx +15 -2
- package/src/web/hooks/use-delayed-flag.ts +35 -0
- package/src/web/lib/branch-review-state.ts +175 -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 +11 -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/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-CvL1pWeK.js +0 -3
- 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/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>
|
|
@@ -86,7 +99,7 @@ ${getStyles()}
|
|
|
86
99
|
<div id="graph-container">
|
|
87
100
|
<div id="graph-header" class="commit-row header-row">
|
|
88
101
|
<div class="col-refs">Branch / Tag</div>
|
|
89
|
-
<div class="col-graph">Graph<div class="graph-resize-handle" id="graph-resize-handle"></div></div>
|
|
102
|
+
<div class="col-graph">Graph<div class="graph-hscroll hidden" id="graph-hscroll"><div id="graph-hscroll-inner"></div></div><div class="graph-resize-handle" id="graph-resize-handle"></div></div>
|
|
90
103
|
<div class="col-message">Message</div>
|
|
91
104
|
<div class="col-changes">Changes</div>
|
|
92
105
|
<div class="col-author">Author</div>
|
|
@@ -94,7 +107,7 @@ ${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>
|
|
@@ -120,6 +133,15 @@ ${getStyles()}
|
|
|
120
133
|
<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
134
|
<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
135
|
</details>
|
|
136
|
+
<details class="settings-section" open>
|
|
137
|
+
<summary>Columns</summary>
|
|
138
|
+
<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>
|
|
139
|
+
<div class="setting-row"><label>Branch / Tag</label><input type="checkbox" id="s-colRefs"></div>
|
|
140
|
+
<div class="setting-row"><label>Changes</label><input type="checkbox" id="s-colChanges"></div>
|
|
141
|
+
<div class="setting-row"><label>Author</label><input type="checkbox" id="s-colAuthor"></div>
|
|
142
|
+
<div class="setting-row"><label>Date</label><input type="checkbox" id="s-colDate"></div>
|
|
143
|
+
<div class="setting-row"><label>Hash</label><input type="checkbox" id="s-colHash"></div>
|
|
144
|
+
</details>
|
|
123
145
|
<details class="settings-section" open>
|
|
124
146
|
<summary>User Details</summary>
|
|
125
147
|
<div class="setting-row"><label>Name</label><input type="text" id="s-userName" placeholder="user.name"></div>
|
|
@@ -352,7 +374,20 @@ button:active { background: var(--surface); }
|
|
|
352
374
|
.col-graph { width: var(--graph-col-w, 120px); min-width: var(--graph-col-w, 80px); overflow: hidden; flex-shrink: 0; position: relative; }
|
|
353
375
|
.graph-resize-handle { position: absolute; right: 0; top: 0; bottom: 0; width: 6px; cursor: col-resize; z-index: 3; background: transparent; }
|
|
354
376
|
.graph-resize-handle:hover, .graph-resize-handle.dragging { background: var(--blue); opacity: 0.5; }
|
|
355
|
-
|
|
377
|
+
/* The graph's own horizontal scrollbar, in the sticky header. It cannot sit on
|
|
378
|
+
the graph itself: that is one overlay as tall as the whole history, so a
|
|
379
|
+
scrollbar along its bottom edge would be thousands of pixels below the
|
|
380
|
+
viewport. This strip scrolls nothing — its scrollLeft is read and applied to
|
|
381
|
+
the overlay as a translation. */
|
|
382
|
+
.graph-hscroll { position: absolute; left: 0; right: 6px; bottom: 0; height: 7px; overflow-x: auto; overflow-y: hidden; }
|
|
383
|
+
.graph-hscroll-inner { height: 1px; }
|
|
384
|
+
.graph-hscroll::-webkit-scrollbar { height: 6px; }
|
|
385
|
+
.graph-hscroll::-webkit-scrollbar-thumb { background: var(--border2); border-radius: 3px; }
|
|
386
|
+
.graph-hscroll::-webkit-scrollbar-thumb:hover { background: var(--subtext); }
|
|
387
|
+
/* The message never shrinks past a readable measure. Every other column is
|
|
388
|
+
either fixed or hidden by the width tiers, so without a floor here this one
|
|
389
|
+
absorbs the whole shortfall and disappears. */
|
|
390
|
+
.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
391
|
/* The lane's colour, restated where the eye reads the message. The row centres
|
|
357
392
|
its cells, so this one has to stretch or the tick has nothing to span. */
|
|
358
393
|
.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 +424,17 @@ button:active { background: var(--surface); }
|
|
|
389
424
|
.col-date { width: 80px; min-width: 80px; color: var(--subtext); font-size: 11px; }
|
|
390
425
|
.col-hash { width: 60px; min-width: 60px; font-family: var(--mono-font); font-size: 10px; color: var(--subtle); }
|
|
391
426
|
|
|
427
|
+
/* Columns the reader turned off, from the header's context menu or from
|
|
428
|
+
Settings. Declared after :root so the refs variable — which is where the
|
|
429
|
+
graph overlay starts, not just how wide a cell is — loses to this one on
|
|
430
|
+
source order; the two have the same specificity. */
|
|
431
|
+
.cols-no-refs { --refs-col-w: 0px; }
|
|
432
|
+
.cols-no-refs .col-refs { display: none; }
|
|
433
|
+
.cols-no-changes .col-changes { display: none; }
|
|
434
|
+
.cols-no-author .col-author { display: none; }
|
|
435
|
+
.cols-no-date .col-date { display: none; }
|
|
436
|
+
.cols-no-hash .col-hash { display: none; }
|
|
437
|
+
|
|
392
438
|
/* Ref badges — border + tinted bg + dark text */
|
|
393
439
|
.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
440
|
.ref-head { border-color: var(--green); background: color-mix(in srgb, var(--green) 12%, transparent); }
|
|
@@ -401,9 +447,21 @@ button:active { background: var(--surface); }
|
|
|
401
447
|
:root:not([data-ppm-theme="light"]) .ref-badge { color: #e4e4e7; }
|
|
402
448
|
}
|
|
403
449
|
|
|
404
|
-
/* SVG graph — single SVG overlay
|
|
450
|
+
/* SVG graph — single SVG overlay.
|
|
451
|
+
The clip box is what keeps the overlay inside its column: the SVG is drawn at
|
|
452
|
+
whatever width the lanes need, which in a repository with enough parallel
|
|
453
|
+
branches is wider than the panel. Unclipped it paints over the message,
|
|
454
|
+
changes and author columns — it is positioned and they are not, so it wins
|
|
455
|
+
the paint order — and capping the column without clipping only trades a
|
|
456
|
+
missing message for one with branch lines drawn through it. What the clip
|
|
457
|
+
hides is reached by panning: --graph-pan-x, driven by the header's strip. */
|
|
405
458
|
#commit-list-wrapper { position: relative; }
|
|
406
|
-
#graph-
|
|
459
|
+
#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; }
|
|
460
|
+
/* The clip box starts where the graph cell starts — 6px being the row's own
|
|
461
|
+
padding — and the drawing keeps the 2px it always had inside it. Written the
|
|
462
|
+
other way round, as one offset of 8px on the box, the box ends 2px past its
|
|
463
|
+
column and the first pixels of the message have a branch line through them. */
|
|
464
|
+
#graph-svg-container { position: absolute; top: 0; left: 2px; transform: translateX(calc(-1 * var(--graph-pan-x, 0px))); }
|
|
407
465
|
#graph-svg-container circle { pointer-events: auto; cursor: pointer; }
|
|
408
466
|
#graph-svg-container .line { stroke-width: 2; fill: none; }
|
|
409
467
|
/* The checked-out commit wears a thicker ring rather than a different shape,
|
|
@@ -559,6 +617,11 @@ button:active { background: var(--surface); }
|
|
|
559
617
|
.ctx-item { padding: 6px 12px; cursor: pointer; font-size: 12px; display: flex; align-items: center; gap: 8px; }
|
|
560
618
|
.ctx-item:hover { background: var(--surface-hover); }
|
|
561
619
|
.ctx-item.destructive { color: var(--red); }
|
|
620
|
+
/* A column of its own for the tick, so a list of toggles does not shift
|
|
621
|
+
sideways as they are ticked and unticked. */
|
|
622
|
+
.ctx-tick { width: 12px; flex-shrink: 0; color: var(--blue); }
|
|
623
|
+
.ctx-item.disabled { opacity: 0.5; cursor: default; }
|
|
624
|
+
.ctx-item.disabled:hover { background: transparent; }
|
|
562
625
|
.ctx-separator { border-top: 1px solid var(--border); margin: 4px 0; }
|
|
563
626
|
|
|
564
627
|
/* Loading */
|
|
@@ -632,26 +695,42 @@ button:active { background: var(--surface); }
|
|
|
632
695
|
#toolbar button { font-size: 10px; }
|
|
633
696
|
.branch-trigger { font-size: 10px !important; padding: 2px 6px !important; }
|
|
634
697
|
#graph-area { order: 1; }
|
|
698
|
+
/* A safety net, not the layout: the width tiers below are what make the row
|
|
699
|
+
fit. This only means that a row which still does not fit — every optional
|
|
700
|
+
column switched back on in a small panel — can be reached by scrolling
|
|
701
|
+
rather than clipped away. */
|
|
635
702
|
#graph-container { overflow-x: auto; overflow-y: auto; }
|
|
636
703
|
#find-bar { order: 0; }
|
|
637
704
|
#status-bar { order: 9; }
|
|
638
|
-
/*
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
705
|
+
/* A 6px scrollbar is a mouse's target. This is the only way to pan the graph
|
|
706
|
+
without a wheel, so it gets a thumb a finger can land on. */
|
|
707
|
+
.graph-hscroll { height: 14px; }
|
|
708
|
+
.graph-hscroll::-webkit-scrollbar { height: 12px; }
|
|
642
709
|
.commit-row.header-row { min-height: 20px; }
|
|
643
710
|
.detail-panel { order: 8; max-height: 35vh; }
|
|
644
711
|
}
|
|
712
|
+
/* Width tiers. Columns leave in order of how little they carry, so that the
|
|
713
|
+
graph and the message keep their room instead of the message paying for
|
|
714
|
+
everything. They apply to every pointer type: a tablet held in portrait is
|
|
715
|
+
as narrow as the window a mouse drags to half the screen, and one layout for
|
|
716
|
+
a width is one thing to reason about. The user's own column choices (the
|
|
717
|
+
header's context menu) decide what is shown when there IS room; these decide
|
|
718
|
+
what there is room for. */
|
|
719
|
+
@media (max-width: 900px) {
|
|
720
|
+
.col-date, .col-hash { display: none; }
|
|
721
|
+
}
|
|
722
|
+
@media (max-width: 760px) {
|
|
723
|
+
.col-changes { display: none; }
|
|
724
|
+
}
|
|
645
725
|
/* Phone layout: the graph and the message, with author/date/hash under the
|
|
646
726
|
subject. Six columns of fragments is not a list of commits, and 44px is the
|
|
647
727
|
minimum touch target this row has to be anyway. isNarrowLayout() in the
|
|
648
728
|
script uses this same 640px, because it decides where the ref badges go. */
|
|
649
729
|
@media (max-width: 640px) {
|
|
650
730
|
:root { --refs-col-w: 0px; }
|
|
651
|
-
/* The
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
#commit-list-wrapper, #graph-header { min-width: 0; }
|
|
731
|
+
/* The floor the wide layout keeps for the message is the whole row here, and
|
|
732
|
+
a floor wider than the panel is what makes a row overflow its own box. */
|
|
733
|
+
.col-message { min-width: 0; }
|
|
655
734
|
.commit-row { height: 44px; }
|
|
656
735
|
.commit-row.header-row { height: 24px; }
|
|
657
736
|
.col-refs, .col-changes, .col-author, .col-date, .col-hash { display: none; }
|
|
@@ -683,8 +762,20 @@ const DEFAULT_SETTINGS = {
|
|
|
683
762
|
graphStyle: 'rounded', firstParentOnly: false, dateFormat: 'relative', commitOrdering: 'topo',
|
|
684
763
|
issueLinkingRules: [{ pattern: '#(\\\\d+)', url: '' }], prCreation: null,
|
|
685
764
|
autoFetchInterval: 0,
|
|
765
|
+
colRefs: true, colChanges: true, colAuthor: true, colDate: true, colHash: true,
|
|
686
766
|
};
|
|
687
767
|
|
|
768
|
+
/** Optional columns, in the order the header declares them. */
|
|
769
|
+
const OPTIONAL_COLUMNS = [
|
|
770
|
+
{ key: 'colRefs', cls: 'cols-no-refs', label: 'Branch / Tag' },
|
|
771
|
+
{ key: 'colChanges', cls: 'cols-no-changes', label: 'Changes' },
|
|
772
|
+
{ key: 'colAuthor', cls: 'cols-no-author', label: 'Author' },
|
|
773
|
+
{ key: 'colDate', cls: 'cols-no-date', label: 'Date' },
|
|
774
|
+
{ key: 'colHash', cls: 'cols-no-hash', label: 'Hash' },
|
|
775
|
+
];
|
|
776
|
+
const MESSAGE_MIN_W = ${MESSAGE_MIN_W};
|
|
777
|
+
const GRAPH_MIN_W = ${GRAPH_MIN_W};
|
|
778
|
+
|
|
688
779
|
const state = {
|
|
689
780
|
repo: '',
|
|
690
781
|
commits: [],
|
|
@@ -705,7 +796,12 @@ const state = {
|
|
|
705
796
|
searchIndex: -1,
|
|
706
797
|
settings: { ...DEFAULT_SETTINGS },
|
|
707
798
|
userDetails: { name: '', email: '' },
|
|
799
|
+
/** Dragged width of the graph column, or null while it sizes itself. */
|
|
708
800
|
graphColWidth: null,
|
|
801
|
+
/** Width the lanes actually need — what the column is capped against. */
|
|
802
|
+
graphWidth: 0,
|
|
803
|
+
/** How far the graph is panned inside its column. */
|
|
804
|
+
graphPanX: 0,
|
|
709
805
|
fileViewMode: 'list',
|
|
710
806
|
worktrees: [],
|
|
711
807
|
submodules: [],
|
|
@@ -1524,23 +1620,99 @@ document.getElementById('stash-save').addEventListener('click', () => {
|
|
|
1524
1620
|
resizeHandle.classList.add('dragging');
|
|
1525
1621
|
resizeHandle.setPointerCapture(e.pointerId);
|
|
1526
1622
|
});
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1623
|
+
// Both ends of the drag go through the same cap the automatic width uses: a
|
|
1624
|
+
// hand-dragged column wider than the panel is the bug this whole path is
|
|
1625
|
+
// about, and a ceiling of its own would also be a ceiling the automatic width
|
|
1626
|
+
// could exceed and the drag could then never restore.
|
|
1627
|
+
const dragTo = (e) => {
|
|
1628
|
+
state.graphColWidth = Math.max(GRAPH_MIN_W, startW + e.clientX - startX);
|
|
1629
|
+
applyGraphColWidth();
|
|
1630
|
+
};
|
|
1631
|
+
resizeHandle.addEventListener('pointermove', (e) => { if (resizing) dragTo(e); });
|
|
1532
1632
|
resizeHandle.addEventListener('pointerup', (e) => {
|
|
1533
1633
|
if (!resizing) return;
|
|
1534
1634
|
resizing = false;
|
|
1535
1635
|
resizeHandle.classList.remove('dragging');
|
|
1536
|
-
|
|
1537
|
-
state.graphColWidth = newW;
|
|
1538
|
-
document.documentElement.style.setProperty('--graph-col-w', newW + 'px');
|
|
1636
|
+
dragTo(e);
|
|
1539
1637
|
});
|
|
1540
1638
|
resizeHandle.addEventListener('dblclick', () => {
|
|
1541
1639
|
state.graphColWidth = null;
|
|
1542
|
-
|
|
1640
|
+
applyGraphColWidth();
|
|
1641
|
+
});
|
|
1642
|
+
}
|
|
1643
|
+
|
|
1644
|
+
// --- Panning the graph inside its column ---
|
|
1645
|
+
{
|
|
1646
|
+
const strip = document.getElementById('graph-hscroll');
|
|
1647
|
+
strip.addEventListener('scroll', () => {
|
|
1648
|
+
if (Math.abs(strip.scrollLeft - state.graphPanX) <= 1) return;
|
|
1649
|
+
state.graphPanX = strip.scrollLeft;
|
|
1650
|
+
applyGraphPan();
|
|
1651
|
+
});
|
|
1652
|
+
// A trackpad's sideways gesture and shift+wheel, over the list itself. The
|
|
1653
|
+
// overlay cannot take these: it is pointer-events: none so that a click lands
|
|
1654
|
+
// on the row underneath it.
|
|
1655
|
+
document.getElementById('graph-container').addEventListener('wheel', (e) => {
|
|
1656
|
+
const dx = e.shiftKey ? e.deltaY : e.deltaX;
|
|
1657
|
+
if (!dx || (!e.shiftKey && Math.abs(e.deltaX) <= Math.abs(e.deltaY))) return;
|
|
1658
|
+
const before = state.graphPanX;
|
|
1659
|
+
panGraphBy(dx);
|
|
1660
|
+
if (state.graphPanX !== before) e.preventDefault();
|
|
1661
|
+
}, { passive: false });
|
|
1662
|
+
// The cap is a share of the panel's width, so it is only right until the
|
|
1663
|
+
// panel changes size — and nothing re-renders the graph when a window is
|
|
1664
|
+
// dragged or a sibling panel opens.
|
|
1665
|
+
if (typeof ResizeObserver === 'function') {
|
|
1666
|
+
new ResizeObserver(() => applyGraphColWidth()).observe(document.getElementById('graph-container'));
|
|
1667
|
+
}
|
|
1668
|
+
}
|
|
1669
|
+
|
|
1670
|
+
// --- Columns the reader chose to see ---
|
|
1671
|
+
function applyColumnVisibility() {
|
|
1672
|
+
const root = document.documentElement;
|
|
1673
|
+
OPTIONAL_COLUMNS.forEach((col) => {
|
|
1674
|
+
root.classList.toggle(col.cls, state.settings[col.key] === false);
|
|
1675
|
+
});
|
|
1676
|
+
// Hiding a column hands its width to the graph, and no resize fires for it.
|
|
1677
|
+
applyGraphColWidth();
|
|
1678
|
+
}
|
|
1679
|
+
|
|
1680
|
+
/**
|
|
1681
|
+
* Whether a column is hidden by the panel's width whatever the setting says.
|
|
1682
|
+
* The menu marks those rather than hiding them, so that a tick doing nothing is
|
|
1683
|
+
* never the only explanation on offer.
|
|
1684
|
+
*/
|
|
1685
|
+
function columnBlockedByWidth(key) {
|
|
1686
|
+
if (typeof window.matchMedia !== 'function') return false;
|
|
1687
|
+
if (key === 'colDate' || key === 'colHash') return window.matchMedia('(max-width: 900px)').matches;
|
|
1688
|
+
if (key === 'colChanges') return window.matchMedia('(max-width: 760px)').matches;
|
|
1689
|
+
return false;
|
|
1690
|
+
}
|
|
1691
|
+
|
|
1692
|
+
function setColumnVisible(key, visible) {
|
|
1693
|
+
state.settings[key] = visible;
|
|
1694
|
+
vscode.postMessage({ command: 'updateSetting', key, value: visible });
|
|
1695
|
+
applyColumnVisibility();
|
|
1696
|
+
const box = document.getElementById('s-' + key);
|
|
1697
|
+
if (box) box.checked = visible;
|
|
1698
|
+
}
|
|
1699
|
+
|
|
1700
|
+
function showColumnMenu(x, y) {
|
|
1701
|
+
renderContextMenu(x, y, OPTIONAL_COLUMNS.map((col) => ({
|
|
1702
|
+
label: col.label + (columnBlockedByWidth(col.key) ? ' — needs a wider panel' : ''),
|
|
1703
|
+
checked: state.settings[col.key] !== false,
|
|
1704
|
+
disabled: columnBlockedByWidth(col.key),
|
|
1705
|
+
action: () => setColumnVisible(col.key, state.settings[col.key] === false),
|
|
1706
|
+
})));
|
|
1707
|
+
}
|
|
1708
|
+
|
|
1709
|
+
{
|
|
1710
|
+
const header = document.getElementById('graph-header');
|
|
1711
|
+
header.addEventListener('contextmenu', (e) => {
|
|
1712
|
+
e.preventDefault();
|
|
1713
|
+
showColumnMenu(e.clientX, e.clientY);
|
|
1543
1714
|
});
|
|
1715
|
+
setupLongPress(header, (x, y) => showColumnMenu(x, y));
|
|
1544
1716
|
}
|
|
1545
1717
|
|
|
1546
1718
|
// --- Graph rendering (faithful port of vscode-git-graph graph.ts) ---
|
|
@@ -1830,7 +2002,7 @@ function graphGetAvailableColour(startAt) {
|
|
|
1830
2002
|
function graphRender(expandIdx) {
|
|
1831
2003
|
const container = document.getElementById('graph-svg-container');
|
|
1832
2004
|
container.innerHTML = '';
|
|
1833
|
-
if (gVertices.length === 0) {
|
|
2005
|
+
if (gVertices.length === 0) { state.graphWidth = GRAPH_MIN_W; applyGraphColWidth(); return; }
|
|
1834
2006
|
|
|
1835
2007
|
// Measure actual row height (may be fractional due to browser zoom)
|
|
1836
2008
|
// and use it for SVG grid to prevent cumulative sub-pixel drift
|
|
@@ -1858,11 +2030,71 @@ function graphRender(expandIdx) {
|
|
|
1858
2030
|
const w = 2 * cfg.grid.offsetX + Math.max(maxX - 1, 0) * cfg.grid.x;
|
|
1859
2031
|
const h = gVertices.length * cfg.grid.y + cfg.grid.offsetY - cfg.grid.y / 2 + (expandIdx > -1 ? cfg.grid.expandY : 0);
|
|
1860
2032
|
|
|
1861
|
-
const gw = Math.max(w,
|
|
2033
|
+
const gw = Math.max(w, GRAPH_MIN_W);
|
|
1862
2034
|
svg.setAttribute('width', gw.toString());
|
|
1863
2035
|
svg.setAttribute('height', h.toString());
|
|
1864
2036
|
container.appendChild(svg);
|
|
1865
|
-
|
|
2037
|
+
// The SVG is drawn at the width the lanes need; the column it shows through
|
|
2038
|
+
// is a different number entirely, and the panel decides that one.
|
|
2039
|
+
state.graphWidth = gw;
|
|
2040
|
+
applyGraphColWidth();
|
|
2041
|
+
}
|
|
2042
|
+
|
|
2043
|
+
/*
|
|
2044
|
+
* The widest the graph column may be right now: whatever is left of the panel
|
|
2045
|
+
* once the columns that cannot shrink have taken theirs and the message has its
|
|
2046
|
+
* floor. Measured from the header rather than from a table of constants, so
|
|
2047
|
+
* hiding a column — by the user's choice or by a width tier — gives its pixels
|
|
2048
|
+
* to the graph without anything here having to know which columns exist.
|
|
2049
|
+
*/
|
|
2050
|
+
function graphColCap() {
|
|
2051
|
+
const header = document.getElementById('graph-header');
|
|
2052
|
+
const area = document.getElementById('graph-container');
|
|
2053
|
+
if (!header || !area || !area.clientWidth) return MESSAGE_MIN_W;
|
|
2054
|
+
let fixed = 0;
|
|
2055
|
+
// offsetWidth is 0 for a hidden column, which is exactly the answer wanted.
|
|
2056
|
+
header.querySelectorAll('.col-refs, .col-changes, .col-author, .col-date, .col-hash')
|
|
2057
|
+
.forEach((cell) => { fixed += cell.offsetWidth; });
|
|
2058
|
+
const rowPadding = 12;
|
|
2059
|
+
return Math.max(GRAPH_MIN_W, area.clientWidth - fixed - rowPadding - MESSAGE_MIN_W);
|
|
2060
|
+
}
|
|
2061
|
+
|
|
2062
|
+
/**
|
|
2063
|
+
* Publish the graph column's width: the dragged one if there is one, else what
|
|
2064
|
+
* the lanes need, both capped to what the panel can spare.
|
|
2065
|
+
*/
|
|
2066
|
+
function applyGraphColWidth() {
|
|
2067
|
+
const cap = graphColCap();
|
|
2068
|
+
const want = state.graphColWidth === null ? state.graphWidth : state.graphColWidth;
|
|
2069
|
+
const width = Math.max(GRAPH_MIN_W, Math.min(want || GRAPH_MIN_W, cap));
|
|
2070
|
+
document.documentElement.style.setProperty('--graph-col-w', width + 'px');
|
|
2071
|
+
applyGraphPan();
|
|
2072
|
+
}
|
|
2073
|
+
|
|
2074
|
+
/**
|
|
2075
|
+
* Move the overlay inside its clip box, and keep the header's scroll strip
|
|
2076
|
+
* saying the same thing. The strip scrolls nothing itself — it exists because
|
|
2077
|
+
* a scrollbar on the overlay would sit below the last commit in the history.
|
|
2078
|
+
*/
|
|
2079
|
+
function applyGraphPan() {
|
|
2080
|
+
const cell = document.querySelector('#graph-header .col-graph');
|
|
2081
|
+
const shown = cell ? cell.offsetWidth : 0;
|
|
2082
|
+
const max = Math.max(0, state.graphWidth - shown);
|
|
2083
|
+
state.graphPanX = Math.min(Math.max(0, state.graphPanX), max);
|
|
2084
|
+
document.documentElement.style.setProperty('--graph-pan-x', state.graphPanX + 'px');
|
|
2085
|
+
|
|
2086
|
+
const strip = document.getElementById('graph-hscroll');
|
|
2087
|
+
const inner = document.getElementById('graph-hscroll-inner');
|
|
2088
|
+
if (!strip || !inner) return;
|
|
2089
|
+
inner.style.width = state.graphWidth + 'px';
|
|
2090
|
+
strip.classList.toggle('hidden', max <= 0);
|
|
2091
|
+
// Guarded, or writing scrollLeft here re-enters through the scroll handler.
|
|
2092
|
+
if (Math.abs(strip.scrollLeft - state.graphPanX) > 1) strip.scrollLeft = state.graphPanX;
|
|
2093
|
+
}
|
|
2094
|
+
|
|
2095
|
+
function panGraphBy(dx) {
|
|
2096
|
+
state.graphPanX += dx;
|
|
2097
|
+
applyGraphPan();
|
|
1866
2098
|
}
|
|
1867
2099
|
|
|
1868
2100
|
function graphVertexOver(e) {
|
|
@@ -3209,6 +3441,10 @@ function showDropActionMenu(x, y, ref, commit) {
|
|
|
3209
3441
|
/**
|
|
3210
3442
|
* Render a context menu from an item list. The older menu builders each inline
|
|
3211
3443
|
* this same block; new menus go through here.
|
|
3444
|
+
*
|
|
3445
|
+
* An item may carry a checked flag, drawn as a tick in a column of its own so
|
|
3446
|
+
* that a list of toggles does not jump sideways as they are turned on and off,
|
|
3447
|
+
* and a disabled flag for one that is real but unavailable right now.
|
|
3212
3448
|
*/
|
|
3213
3449
|
function renderContextMenu(x, y, items) {
|
|
3214
3450
|
const menu = document.getElementById('context-menu');
|
|
@@ -3217,7 +3453,10 @@ function renderContextMenu(x, y, items) {
|
|
|
3217
3453
|
if (item.separator) {
|
|
3218
3454
|
html += '<div class="ctx-separator"></div>';
|
|
3219
3455
|
} else {
|
|
3220
|
-
|
|
3456
|
+
const cls = 'ctx-item' + (item.destructive ? ' destructive' : '') + (item.disabled ? ' disabled' : '');
|
|
3457
|
+
const tick = item.checked === undefined ? '' :
|
|
3458
|
+
'<span class="ctx-tick">' + (item.checked ? '\\u2713' : '') + '</span>';
|
|
3459
|
+
html += '<div class="' + cls + '" data-idx="' + idx + '">' + tick + escHtml(item.label) + '</div>';
|
|
3221
3460
|
}
|
|
3222
3461
|
});
|
|
3223
3462
|
menu.innerHTML = html;
|
|
@@ -3226,7 +3465,7 @@ function renderContextMenu(x, y, items) {
|
|
|
3226
3465
|
menu.classList.remove('hidden');
|
|
3227
3466
|
menu.querySelectorAll('.ctx-item').forEach(el => {
|
|
3228
3467
|
const item = items[parseInt(el.dataset.idx)];
|
|
3229
|
-
if (item && item.action) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
|
|
3468
|
+
if (item && item.action && !item.disabled) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
|
|
3230
3469
|
});
|
|
3231
3470
|
setTimeout(() => document.addEventListener('click', hideContextMenu, { once: true }), 0);
|
|
3232
3471
|
}
|
|
@@ -3281,12 +3520,23 @@ function applySettingsToUI() {
|
|
|
3281
3520
|
document.getElementById('s-dateFormat').value = s.dateFormat;
|
|
3282
3521
|
document.getElementById('s-commitOrdering').value = s.commitOrdering;
|
|
3283
3522
|
document.getElementById('s-autoFetchInterval').value = s.autoFetchInterval || 0;
|
|
3523
|
+
OPTIONAL_COLUMNS.forEach((col) => {
|
|
3524
|
+
document.getElementById('s-' + col.key).checked = s[col.key] !== false;
|
|
3525
|
+
});
|
|
3526
|
+
applyColumnVisibility();
|
|
3284
3527
|
graphConfig.style = s.graphStyle;
|
|
3285
3528
|
startAutoFetch(s.autoFetchInterval);
|
|
3286
3529
|
renderIssueRules();
|
|
3287
3530
|
applyPrSettingsToUI();
|
|
3288
3531
|
}
|
|
3289
3532
|
|
|
3533
|
+
// The same five toggles as the header's context menu, through the same call.
|
|
3534
|
+
OPTIONAL_COLUMNS.forEach((col) => {
|
|
3535
|
+
document.getElementById('s-' + col.key).addEventListener('change', (e) => {
|
|
3536
|
+
setColumnVisible(col.key, e.target.checked);
|
|
3537
|
+
});
|
|
3538
|
+
});
|
|
3539
|
+
|
|
3290
3540
|
// General setting change handlers
|
|
3291
3541
|
['showTags', 'showStashes', 'showRemoteBranches', 'firstParentOnly'].forEach(key => {
|
|
3292
3542
|
document.getElementById('s-' + key).addEventListener('change', (e) => {
|