@hienlh/ppm 0.9.84 → 0.9.86
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/260413-1354-new-file-editor-tab/reports/code-reviewer-260413-1420-new-file-tab-review.md +210 -0
- package/CHANGELOG.md +23 -0
- package/bun.lock +259 -9
- package/dist/web/assets/{_basePickBy-5PGDJbfF.js → _basePickBy-Bj0dI1ei.js} +1 -1
- package/dist/web/assets/{_baseUniq-BT4Ow4Kk.js → _baseUniq-CyzdZeQH.js} +1 -1
- package/dist/web/assets/ai-settings-section-Bo9lCaTd.js +1 -0
- package/dist/web/assets/{api-settings-Bn-bIxD1.js → api-settings-CUxg9RE5.js} +1 -1
- package/dist/web/assets/{arc-BAOivWpI.js → arc-CxgHJ7Z4.js} +1 -1
- package/dist/web/assets/architecture-PBZL5I3N-DDFO_NKq.js +1 -0
- package/dist/web/assets/{architectureDiagram-2XIMDMQ5-Z-4eN4za.js → architectureDiagram-2XIMDMQ5-D16OotsC.js} +1 -1
- package/dist/web/assets/arrow-up-I9-21gkR.js +1 -0
- package/dist/web/assets/{blockDiagram-WCTKOSBZ-BCLqzhuZ.js → blockDiagram-WCTKOSBZ-Ct57Wtfk.js} +1 -1
- package/dist/web/assets/{c4Diagram-IC4MRINW-0Vp0Jeas.js → c4Diagram-IC4MRINW-BIymcNsg.js} +1 -1
- package/dist/web/assets/channel-wumTB1if.js +1 -0
- package/dist/web/assets/chat-tab-BEEd-Km4.js +10 -0
- package/dist/web/assets/chevron-right-DY_wImxB.js +1 -0
- package/dist/web/assets/{chunk-4BX2VUAB-D4tOov49.js → chunk-4BX2VUAB-CENmY7Kw.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-DJ6BynZ4.js → chunk-55IACEB6-DhZGI1l3.js} +1 -1
- package/dist/web/assets/{chunk-7E7YKBS2-CiyUJxNI.js → chunk-7E7YKBS2-DZcnC7Ow.js} +1 -1
- package/dist/web/assets/{chunk-7R4GIKGN-Dv-4cAYn.js → chunk-7R4GIKGN-y8bfHEy-.js} +2 -2
- package/dist/web/assets/{chunk-C72U2L5F-D21mS_6G.js → chunk-C72U2L5F-BHPkfQj2.js} +1 -1
- package/dist/web/assets/{chunk-EGIJ26TM-DzqmU2Z7.js → chunk-EGIJ26TM-nant2LXl.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-DXncblvW.js → chunk-FMBD7UC4-Bog4cpN-.js} +1 -1
- package/dist/web/assets/{chunk-GEFDOKGD-D-pKjlVd.js → chunk-GEFDOKGD-86LFbsAC.js} +1 -1
- package/dist/web/assets/chunk-GLR3WWYH-Re-5eSlQ.js +2 -0
- package/dist/web/assets/chunk-HHEYEP7N-C45i5G_3.js +1 -0
- package/dist/web/assets/{chunk-JSJVCQXG-99JzIdPr.js → chunk-JSJVCQXG-23eG9mgt.js} +1 -1
- package/dist/web/assets/{chunk-KX2RTZJC-CRq1OBZv.js → chunk-KX2RTZJC-CHj8TnTB.js} +1 -1
- package/dist/web/assets/{chunk-KYZI473N-Bb0MCaIO.js → chunk-KYZI473N-gqRLpJ4w.js} +1 -1
- package/dist/web/assets/{chunk-L3YUKLVL-C7qGJrfV.js → chunk-L3YUKLVL-DnSMmNFC.js} +1 -1
- package/dist/web/assets/{chunk-MX3YWQON-BpS_PtKp.js → chunk-MX3YWQON-B6g1ZH9X.js} +1 -1
- package/dist/web/assets/{chunk-NQ4KR5QH-z_blpjxi.js → chunk-NQ4KR5QH-DX32345Y.js} +1 -1
- package/dist/web/assets/{chunk-O4XLMI2P-nDhi_cVu.js → chunk-O4XLMI2P-Vp_V4P-b.js} +1 -1
- package/dist/web/assets/{chunk-OZEHJAEY-BXhYx3nO.js → chunk-OZEHJAEY-lKq2SWjA.js} +1 -1
- package/dist/web/assets/{chunk-PQ6SQG4A-TF58UVMU.js → chunk-PQ6SQG4A-Bik13fTV.js} +1 -1
- package/dist/web/assets/{chunk-PU5JKC2W-ek7k4QVB.js → chunk-PU5JKC2W-DD95Rx35.js} +1 -1
- package/dist/web/assets/chunk-QZHKN3VN-N3VXx1VH.js +1 -0
- package/dist/web/assets/{chunk-R5LLSJPH-CFwSJijQ.js → chunk-R5LLSJPH-dRhXRnrb.js} +1 -1
- package/dist/web/assets/{chunk-WL4C6EOR-ByUrSRin.js → chunk-WL4C6EOR-B1iIvLOG.js} +1 -1
- package/dist/web/assets/{chunk-XIRO2GV7-Djlmrely.js → chunk-XIRO2GV7-DZBoNl1_.js} +1 -1
- package/dist/web/assets/{chunk-XPW4576I-BPQQBakK.js → chunk-XPW4576I-CgLyyW03.js} +1 -1
- package/dist/web/assets/{chunk-XZSTWKYB-DxAOx4hG.js → chunk-XZSTWKYB-DjV8xl5A.js} +1 -1
- package/dist/web/assets/{chunk-YBOYWFTD-rQG3QH5s.js → chunk-YBOYWFTD-D_ILLe6_.js} +1 -1
- package/dist/web/assets/classDiagram-VBA2DB6C-mr-Cb1me.js +1 -0
- package/dist/web/assets/classDiagram-v2-RAHNMMFH-BKe8_uda.js +1 -0
- package/dist/web/assets/clone--z5KLAuR.js +1 -0
- package/dist/web/assets/code-editor-Ij4p30cr.js +8 -0
- package/dist/web/assets/columns-2-IeETSfON.js +1 -0
- package/dist/web/assets/{cose-bilkent-S5V4N54A-B_AWZsOP.js → cose-bilkent-S5V4N54A-BGNPFv3x.js} +1 -1
- package/dist/web/assets/{csv-preview-D2pJJj3K.js → csv-preview-CwQnOa3E.js} +2 -2
- package/dist/web/assets/{dagre-DHq9bhnd.js → dagre-CkhlMHnx.js} +1 -1
- package/dist/web/assets/{dagre-KLK3FWXG-BdJr7Byp.js → dagre-KLK3FWXG-Cnp996VG.js} +1 -1
- package/dist/web/assets/database-CgTomMxt.js +1 -0
- package/dist/web/assets/{database-viewer-Camu01H4.js → database-viewer-C1UHSgft.js} +2 -2
- package/dist/web/assets/{diagram-E7M64L7V-_db4pBVA.js → diagram-E7M64L7V-BZF0tSOr.js} +1 -1
- package/dist/web/assets/{diagram-IFDJBPK2-xKoeuiJx.js → diagram-IFDJBPK2-nUcO8sN8.js} +1 -1
- package/dist/web/assets/{diagram-P4PSJMXO-C8tjJsev.js → diagram-P4PSJMXO-CW0eCkwC.js} +1 -1
- package/dist/web/assets/diff-viewer-CVx5naBA.js +4 -0
- package/dist/web/assets/dist-CM0oD8tQ.js +1 -0
- package/dist/web/assets/{erDiagram-INFDFZHY-BSh2z9Df.js → erDiagram-INFDFZHY-DSkriYZ9.js} +1 -1
- package/dist/web/assets/extension-webview-CHVVpV34.js +3 -0
- package/dist/web/assets/{flowDiagram-PKNHOUZH-oYaovqyp.js → flowDiagram-PKNHOUZH-CFYAfZBx.js} +1 -1
- package/dist/web/assets/{ganttDiagram-A5KZAMGK-DmL26q2P.js → ganttDiagram-A5KZAMGK-KSn4XAU4.js} +1 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-OkvBPi6H.js +1 -0
- package/dist/web/assets/{gitGraphDiagram-K3NZZRJ6-CMoukSrY.js → gitGraphDiagram-K3NZZRJ6-BMgjjVys.js} +1 -1
- package/dist/web/assets/{graphlib-BcsNnGcW.js → graphlib-BWe1iK_s.js} +1 -1
- package/dist/web/assets/index-OqgGFmh8.js +26 -0
- package/dist/web/assets/index-vA7juDri.css +2 -0
- package/dist/web/assets/info-3K5VOQVL-BDU2_bYD.js +1 -0
- package/dist/web/assets/infoDiagram-LFFYTUFH-Diq4Cyc3.js +2 -0
- package/dist/web/assets/input-BHj0veau.js +45 -0
- package/dist/web/assets/{isEmpty-bnrF3Qbc.js → isEmpty-BfLnxq-B.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-PHBUUO56-D05_LyL7.js → ishikawaDiagram-PHBUUO56-CiVEvp8o.js} +1 -1
- package/dist/web/assets/{journeyDiagram-4ABVD52K-B_L20qMe.js → journeyDiagram-4ABVD52K-CG_v5Aho.js} +1 -1
- package/dist/web/assets/jsx-runtime-BRW_vwa9.js +1 -0
- package/dist/web/assets/{kanban-definition-K7BYSVSG-CZ535BbZ.js → kanban-definition-K7BYSVSG-miB0-_Zq.js} +1 -1
- package/dist/web/assets/keybindings-store-BQxgPV5o.js +1 -0
- package/dist/web/assets/{line-CVvo3dRu.js → line-CSuSrJ9J.js} +1 -1
- package/dist/web/assets/{linear-DP4mkX3m.js → linear-DFN_MPsw.js} +1 -1
- package/dist/web/assets/markdown-renderer-CRy8xw2B.js +306 -0
- package/dist/web/assets/{mermaid-parser.core-C7UwoIh6.js → mermaid-parser.core-CFdP1Z5_.js} +2 -2
- package/dist/web/assets/{mindmap-definition-YRQLILUH-x0MTutJp.js → mindmap-definition-YRQLILUH-pYPWwASE.js} +1 -1
- package/dist/web/assets/{ordinal-_K3x1fkz.js → ordinal-DpFn432U.js} +1 -1
- package/dist/web/assets/packet-RMMSAZCW-BwpIpYB3.js +1 -0
- package/dist/web/assets/pie-UPGHQEXC-BPgAfmes.js +1 -0
- package/dist/web/assets/{pieDiagram-SKSYHLDU-C1Gjrtzy.js → pieDiagram-SKSYHLDU-Dovdlvhu.js} +1 -1
- package/dist/web/assets/plus-DQGIb4mQ.js +1 -0
- package/dist/web/assets/port-forwarding-tab-Biua8ov5.js +1 -0
- package/dist/web/assets/{postgres-viewer-BQdPMowm.js → postgres-viewer-BcVjCAl4.js} +3 -3
- package/dist/web/assets/{quadrantDiagram-337W2JSQ-C8bzJCjQ.js → quadrantDiagram-337W2JSQ-TXe6cU_F.js} +1 -1
- package/dist/web/assets/radar-KQ55EAFF-TqxBkWx-.js +1 -0
- package/dist/web/assets/refresh-cw-Clk8fdUD.js +1 -0
- package/dist/web/assets/{requirementDiagram-Z7DCOOCP-pQyah6WB.js → requirementDiagram-Z7DCOOCP-CuiiuGS9.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-WA2Y5GQK-T6RgG-N8.js → sankeyDiagram-WA2Y5GQK-BbRmhv0t.js} +1 -1
- package/dist/web/assets/scroll-area-BpXCNme3.js +1 -0
- package/dist/web/assets/{sequenceDiagram-2WXFIKYE-BQDJ4CVs.js → sequenceDiagram-2WXFIKYE-B2D8IQDb.js} +1 -1
- package/dist/web/assets/settings-tab-C9X-N8hE.js +1 -0
- package/dist/web/assets/{sql-query-editor-CY61vWBg.js → sql-query-editor-BFvRvJn0.js} +1 -1
- package/dist/web/assets/sqlite-viewer-CPfvwFl4.js +1 -0
- package/dist/web/assets/square-vBdqj0bF.js +1 -0
- package/dist/web/assets/{stateDiagram-RAJIS63D-66vhiIuk.js → stateDiagram-RAJIS63D-ylr4HxPu.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-FVOUBMTO-D6zvxf3M.js +1 -0
- package/dist/web/assets/table-Bi27fEaN.js +1 -0
- package/dist/web/assets/{terminal-tab-TIJmxHl6.js → terminal-tab-mWwk_weB.js} +2 -2
- package/dist/web/assets/text-wrap-D_OmSzhp.js +1 -0
- package/dist/web/assets/{timeline-definition-YZTLITO2-DwZqB3nn.js → timeline-definition-YZTLITO2-pMv1grvM.js} +1 -1
- package/dist/web/assets/trash-2-CNuB-htI.js +1 -0
- package/dist/web/assets/treemap-KZPCXAKY-Kck06FKU.js +1 -0
- package/dist/web/assets/{use-monaco-theme-BHn-LEm7.js → use-monaco-theme-CPaeSMAA.js} +1 -1
- package/dist/web/assets/{vennDiagram-LZ73GAT5-s9Z71fz-.js → vennDiagram-LZ73GAT5-C-rkIUbo.js} +1 -1
- package/dist/web/assets/x-Dw3TjeY_.js +1 -0
- package/dist/web/assets/{xychartDiagram-JWTSCODW-DRa_TH4B.js → xychartDiagram-JWTSCODW-CtpjAakO.js} +1 -1
- package/dist/web/index.html +18 -12
- package/dist/web/sw.js +1 -1
- package/docs/codebase-summary.md +134 -11
- package/docs/extension-development-guide.md +98 -1
- package/docs/journals/260414-1400-ext-git-graph-port-complete.md +147 -0
- package/docs/journals/260414-1452-git-graph-faithful-port.md +144 -0
- package/docs/journals/260414-1810-git-graph-ui-improvements-complete.md +261 -0
- package/docs/journals/260414-2001-bundled-extensions.md +219 -0
- package/docs/project-changelog.md +63 -22
- package/docs/project-roadmap.md +1 -0
- package/docs/system-architecture.md +33 -5
- package/package.json +9 -3
- package/packages/ext-git-graph/package.json +30 -0
- package/packages/ext-git-graph/src/extension-integration.test.ts +230 -0
- package/packages/ext-git-graph/src/extension-parsers.test.ts +193 -0
- package/packages/ext-git-graph/src/extension.ts +800 -0
- package/packages/ext-git-graph/src/git-log-parser.test.ts +271 -0
- package/packages/ext-git-graph/src/git-log-parser.ts +38 -0
- package/packages/ext-git-graph/src/types.ts +181 -0
- package/packages/ext-git-graph/src/webview-html.test.ts +142 -0
- package/packages/ext-git-graph/src/webview-html.ts +2199 -0
- package/packages/vscode-compat/src/index.ts +4 -0
- package/packages/vscode-compat/src/process.ts +25 -0
- package/packages/vscode-compat/src/window.ts +10 -0
- package/src/cli/commands/ext-cmd.ts +3 -1
- package/src/server/index.ts +1 -1
- package/src/server/ws/extensions.ts +6 -2
- package/src/services/contribution-registry.ts +14 -1
- package/src/services/extension-host-worker.ts +7 -3
- package/src/services/extension-manifest.ts +18 -1
- package/src/services/extension-rpc-handlers.ts +68 -2
- package/src/services/extension.service.ts +46 -6
- package/src/types/extension-messages.ts +2 -0
- package/src/types/extension.ts +8 -0
- package/src/web/components/editor/code-editor.tsx +83 -8
- package/src/web/components/editor/save-as-dialog.tsx +75 -0
- package/src/web/components/extensions/extension-webview.tsx +111 -12
- package/src/web/components/layout/command-palette.tsx +43 -17
- package/src/web/components/layout/draggable-tab.tsx +120 -67
- package/src/web/components/layout/editor-panel.tsx +15 -4
- package/src/web/components/layout/mobile-nav.tsx +74 -7
- package/src/web/components/layout/tab-bar.tsx +76 -4
- package/src/web/components/layout/tab-content.tsx +12 -5
- package/src/web/components/layout/upgrade-banner.tsx +3 -0
- package/src/web/components/settings/keyboard-shortcuts-section.tsx +46 -1
- package/src/web/components/shared/markdown-code-block.tsx +142 -0
- package/src/web/components/shared/markdown-context.ts +20 -0
- package/src/web/components/shared/markdown-renderer.tsx +113 -288
- package/src/web/hooks/use-extension-ws.ts +22 -4
- package/src/web/hooks/use-global-keybindings.ts +31 -2
- package/src/web/hooks/use-url-sync.ts +8 -3
- package/src/web/main.tsx +1 -0
- package/src/web/stores/keybindings-store.ts +3 -3
- package/src/web/stores/panel-store.ts +2 -2
- package/src/web/stores/panel-utils.ts +17 -2
- package/src/web/stores/tab-store.ts +17 -1
- package/src/web/styles/globals.css +6 -0
- package/.opencode/.env.example +0 -98
- package/.opencode/skills/ads-management/scripts/.env.example +0 -13
- package/.opencode/skills/ai-multimodal/.env.example +0 -230
- package/.opencode/skills/cip-design/.env.example +0 -6
- package/.opencode/skills/devops/.env.example +0 -76
- package/.opencode/skills/docs-seeker/.env.example +0 -15
- package/.opencode/skills/elevenlabs/.env.example +0 -3
- package/.opencode/skills/marketing-dashboard/.env.example +0 -15
- package/.opencode/skills/marketing-dashboard/app/.env.example +0 -2
- package/.opencode/skills/marketing-dashboard/server/.env.example +0 -2
- package/.opencode/skills/mcp-management/scripts/dist/analyze-tools.js +0 -70
- package/.opencode/skills/mcp-management/scripts/dist/cli.js +0 -160
- package/.opencode/skills/mcp-management/scripts/dist/mcp-client.js +0 -183
- package/.opencode/skills/payment-integration/scripts/.env.example +0 -20
- package/.opencode/skills/sequential-thinking/.env.example +0 -8
- package/dist/web/assets/architecture-PBZL5I3N-DEO2f3VD.js +0 -1
- package/dist/web/assets/arrow-up-BYhx9ckd.js +0 -1
- package/dist/web/assets/channel-By7bn0Yq.js +0 -1
- package/dist/web/assets/chat-tab-CT2XUgsc.js +0 -10
- package/dist/web/assets/chevron-right-4zq1jPv6.js +0 -1
- package/dist/web/assets/chunk-GLR3WWYH-DKikpoJM.js +0 -2
- package/dist/web/assets/chunk-HHEYEP7N-C7vxA5i9.js +0 -1
- package/dist/web/assets/chunk-QZHKN3VN-CYaTbeZf.js +0 -1
- package/dist/web/assets/classDiagram-VBA2DB6C-BA8Nj-_C.js +0 -1
- package/dist/web/assets/classDiagram-v2-RAHNMMFH-DjYu-6mn.js +0 -1
- package/dist/web/assets/clone-LRxlvnMj.js +0 -1
- package/dist/web/assets/code-editor-DQiPtcNd.js +0 -8
- package/dist/web/assets/columns-2-BoZAN-iw.js +0 -1
- package/dist/web/assets/createLucideIcon-PuMiQgHl.js +0 -1
- package/dist/web/assets/diff-viewer-CTwcVIP_.js +0 -4
- package/dist/web/assets/dist-DIV6WgAG.js +0 -41
- package/dist/web/assets/extension-webview-pU1xJyoc.js +0 -3
- package/dist/web/assets/git-graph-BnFbmpom.js +0 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-Bwna3and.js +0 -1
- package/dist/web/assets/index-CP9KnaGh.js +0 -30
- package/dist/web/assets/index-Cxz7oGXY.css +0 -2
- package/dist/web/assets/info-3K5VOQVL-_vRxVNUm.js +0 -1
- package/dist/web/assets/infoDiagram-LFFYTUFH-DWwumDkq.js +0 -2
- package/dist/web/assets/jsx-runtime-kMwlnEGE.js +0 -1
- package/dist/web/assets/keybindings-store-DdhEeehv.js +0 -1
- package/dist/web/assets/markdown-renderer-BjYurPV4.js +0 -326
- package/dist/web/assets/packet-RMMSAZCW-DY5PNnZU.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-BHncZutv.js +0 -1
- package/dist/web/assets/port-forwarding-tab-Bgr8dmsw.js +0 -1
- package/dist/web/assets/radar-KQ55EAFF-DH0AOkUy.js +0 -1
- package/dist/web/assets/settings-tab-BNoboN6E.js +0 -1
- package/dist/web/assets/sqlite-viewer-srSbGg1D.js +0 -1
- package/dist/web/assets/square-oPKIkJiw.js +0 -1
- package/dist/web/assets/stateDiagram-v2-FVOUBMTO-BGVqj_g9.js +0 -1
- package/dist/web/assets/table-DFevCOMd.js +0 -1
- package/dist/web/assets/tag-CXMT0QB6.js +0 -1
- package/dist/web/assets/text-wrap-BWNOVswA.js +0 -1
- package/dist/web/assets/treemap-KZPCXAKY-B2Xkyv-K.js +0 -1
- package/dist/web/assets/x-D2_KzIET.js +0 -1
- package/src/web/components/git/git-graph-branch-label.tsx +0 -124
- package/src/web/components/git/git-graph-constants.ts +0 -185
- package/src/web/components/git/git-graph-detail.tsx +0 -107
- package/src/web/components/git/git-graph-dialog.tsx +0 -72
- package/src/web/components/git/git-graph-row.tsx +0 -167
- package/src/web/components/git/git-graph-settings-dialog.tsx +0 -104
- package/src/web/components/git/git-graph-svg.tsx +0 -54
- package/src/web/components/git/git-graph-toolbar.tsx +0 -195
- package/src/web/components/git/git-graph.tsx +0 -193
- package/src/web/components/git/use-column-resize.ts +0 -33
- package/src/web/components/git/use-git-graph.ts +0 -201
- /package/dist/web/assets/{api-client-BfBM3I7n.js → api-client-BvxmRZUi.js} +0 -0
- /package/dist/web/assets/{array-B9UHiPd-.js → array-BFDiaBgf.js} +0 -0
- /package/dist/web/assets/{csv-parser-CNNw2RVA.js → csv-parser-i7fjqP2H.js} +0 -0
- /package/dist/web/assets/{cytoscape.esm-BW-DbntU.js → cytoscape.esm-C8i2jUzT.js} +0 -0
- /package/dist/web/assets/{defaultLocale-5eAKkKJC.js → defaultLocale-ZeknFqNe.js} +0 -0
- /package/dist/web/assets/{dist-CSJdAyA9.js → dist-DZmJeHOA.js} +0 -0
- /package/dist/web/assets/{init-DlZdxViB.js → init-0VJVrkRJ.js} +0 -0
- /package/dist/web/assets/{isArrayLikeObject-B_v2FtYn.js → isArrayLikeObject-ClzWCpcm.js} +0 -0
- /package/dist/web/assets/{katex-Bqvo_ZG0.js → katex-DR0kdMDv.js} +0 -0
- /package/dist/web/assets/{lib-DurwGtQO.js → lib-CeBVkQ-7.js} +0 -0
- /package/dist/web/assets/{math-069Z4SuC.js → math-CRc16Nj6.js} +0 -0
- /package/dist/web/assets/{path-6uRLdFF7.js → path-INs8XTPH.js} +0 -0
- /package/dist/web/assets/{preload-helper-Bf_JiD2A.js → preload-helper-mr3rCizq.js} +0 -0
- /package/dist/web/assets/{react-SKk5z-bm.js → react-0tkk-ztn.js} +0 -0
- /package/dist/web/assets/{rough.esm-JX0wREDd.js → rough.esm-eLccZ4OJ.js} +0 -0
- /package/dist/web/assets/{sql-completion-provider-DM9Qov6L.js → sql-completion-provider-B8uUWWej.js} +0 -0
- /package/dist/web/assets/{src-BqX54PbV.js → src-CqyWLlNZ.js} +0 -0
- /package/dist/web/assets/{utils-BNytJOb1.js → utils-DX8jb5qv.js} +0 -0
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
GitBranch as GitBranchIcon,
|
|
3
|
-
Tag,
|
|
4
|
-
Copy,
|
|
5
|
-
RotateCcw,
|
|
6
|
-
CherryIcon,
|
|
7
|
-
} from "lucide-react";
|
|
8
|
-
import {
|
|
9
|
-
ContextMenu,
|
|
10
|
-
ContextMenuContent,
|
|
11
|
-
ContextMenuItem,
|
|
12
|
-
ContextMenuSeparator,
|
|
13
|
-
ContextMenuTrigger,
|
|
14
|
-
} from "@/components/ui/context-menu";
|
|
15
|
-
import { BranchLabel } from "./git-graph-branch-label";
|
|
16
|
-
import { LANE_COLORS, ROW_HEIGHT, relativeDate } from "./git-graph-constants";
|
|
17
|
-
import type { GitCommit, GitBranch } from "../../../types/git";
|
|
18
|
-
|
|
19
|
-
interface CommitLabel {
|
|
20
|
-
name: string;
|
|
21
|
-
type: "branch" | "tag";
|
|
22
|
-
remotes: string[];
|
|
23
|
-
current: boolean;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
interface GitGraphRowProps {
|
|
27
|
-
commit: GitCommit;
|
|
28
|
-
lane: number;
|
|
29
|
-
isSelected: boolean;
|
|
30
|
-
isHead: boolean;
|
|
31
|
-
labels: CommitLabel[];
|
|
32
|
-
currentBranch: GitBranch | undefined;
|
|
33
|
-
onSelect: () => void;
|
|
34
|
-
onCheckout: (ref: string) => void;
|
|
35
|
-
onCherryPick: (hash: string) => void;
|
|
36
|
-
onRevert: (hash: string) => void;
|
|
37
|
-
onMerge: (source: string) => void;
|
|
38
|
-
onDeleteBranch: (name: string) => void;
|
|
39
|
-
onPushBranch: (branch: string) => void;
|
|
40
|
-
onCreatePr: (branch: string) => void;
|
|
41
|
-
onOpenCreateBranch: (hash: string) => void;
|
|
42
|
-
onOpenCreateTag: (hash: string) => void;
|
|
43
|
-
onOpenDiff: () => void;
|
|
44
|
-
onCopyHash: () => void;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function GitGraphRow({
|
|
48
|
-
commit,
|
|
49
|
-
lane,
|
|
50
|
-
isSelected,
|
|
51
|
-
isHead,
|
|
52
|
-
labels,
|
|
53
|
-
currentBranch,
|
|
54
|
-
onSelect,
|
|
55
|
-
onCheckout,
|
|
56
|
-
onCherryPick,
|
|
57
|
-
onRevert,
|
|
58
|
-
onMerge,
|
|
59
|
-
onDeleteBranch,
|
|
60
|
-
onPushBranch,
|
|
61
|
-
onCreatePr,
|
|
62
|
-
onOpenCreateBranch,
|
|
63
|
-
onOpenCreateTag,
|
|
64
|
-
onOpenDiff,
|
|
65
|
-
onCopyHash,
|
|
66
|
-
}: GitGraphRowProps) {
|
|
67
|
-
const color = LANE_COLORS[lane % LANE_COLORS.length]!;
|
|
68
|
-
const branchLabels = labels.filter((l) => l.type === "branch");
|
|
69
|
-
const tagLabels = labels.filter((l) => l.type === "tag");
|
|
70
|
-
|
|
71
|
-
return (
|
|
72
|
-
<ContextMenu>
|
|
73
|
-
<ContextMenuTrigger asChild>
|
|
74
|
-
<tr
|
|
75
|
-
className={`hover:bg-muted/50 cursor-pointer border-b border-border/20 ${
|
|
76
|
-
isSelected ? "bg-primary/10" : ""
|
|
77
|
-
} ${isHead ? "font-medium" : ""}`}
|
|
78
|
-
style={{ height: `${ROW_HEIGHT}px` }}
|
|
79
|
-
onClick={onSelect}
|
|
80
|
-
>
|
|
81
|
-
{/* Description column */}
|
|
82
|
-
<td className="px-2 truncate max-w-0">
|
|
83
|
-
<div className="flex items-center gap-1.5 min-w-0">
|
|
84
|
-
{branchLabels.map((label) => (
|
|
85
|
-
<BranchLabel
|
|
86
|
-
key={`branch-${label.name}`}
|
|
87
|
-
name={label.name}
|
|
88
|
-
type="branch"
|
|
89
|
-
remotes={label.remotes}
|
|
90
|
-
isCurrent={label.current}
|
|
91
|
-
color={color}
|
|
92
|
-
currentBranch={currentBranch}
|
|
93
|
-
onCheckout={onCheckout}
|
|
94
|
-
onMerge={onMerge}
|
|
95
|
-
onPush={onPushBranch}
|
|
96
|
-
onCreatePr={onCreatePr}
|
|
97
|
-
onDelete={onDeleteBranch}
|
|
98
|
-
/>
|
|
99
|
-
))}
|
|
100
|
-
{tagLabels.map((label) => (
|
|
101
|
-
<BranchLabel
|
|
102
|
-
key={`tag-${label.name}`}
|
|
103
|
-
name={label.name}
|
|
104
|
-
type="tag"
|
|
105
|
-
remotes={[]}
|
|
106
|
-
isCurrent={false}
|
|
107
|
-
color={color}
|
|
108
|
-
currentBranch={currentBranch}
|
|
109
|
-
onCheckout={onCheckout}
|
|
110
|
-
onMerge={onMerge}
|
|
111
|
-
onPush={onPushBranch}
|
|
112
|
-
onCreatePr={onCreatePr}
|
|
113
|
-
onDelete={onDeleteBranch}
|
|
114
|
-
/>
|
|
115
|
-
))}
|
|
116
|
-
<span className="truncate text-xs">{commit.subject}</span>
|
|
117
|
-
</div>
|
|
118
|
-
</td>
|
|
119
|
-
|
|
120
|
-
{/* Date column */}
|
|
121
|
-
<td className="px-2 text-xs text-muted-foreground whitespace-nowrap shrink-0">
|
|
122
|
-
{relativeDate(commit.authorDate)}
|
|
123
|
-
</td>
|
|
124
|
-
|
|
125
|
-
{/* Author column */}
|
|
126
|
-
<td className="px-2 text-xs text-muted-foreground truncate max-w-[120px]">
|
|
127
|
-
{commit.authorName}
|
|
128
|
-
</td>
|
|
129
|
-
|
|
130
|
-
{/* Commit hash column (last) */}
|
|
131
|
-
<td className="px-2 text-xs text-muted-foreground font-mono whitespace-nowrap">
|
|
132
|
-
{commit.abbreviatedHash}
|
|
133
|
-
</td>
|
|
134
|
-
</tr>
|
|
135
|
-
</ContextMenuTrigger>
|
|
136
|
-
|
|
137
|
-
<ContextMenuContent>
|
|
138
|
-
<ContextMenuItem onClick={() => onCheckout(commit.hash)}>
|
|
139
|
-
Checkout
|
|
140
|
-
</ContextMenuItem>
|
|
141
|
-
<ContextMenuItem onClick={() => onOpenCreateBranch(commit.hash)}>
|
|
142
|
-
<GitBranchIcon className="size-3" />
|
|
143
|
-
Create Branch...
|
|
144
|
-
</ContextMenuItem>
|
|
145
|
-
<ContextMenuSeparator />
|
|
146
|
-
<ContextMenuItem onClick={() => onCherryPick(commit.hash)}>
|
|
147
|
-
<CherryIcon className="size-3" />
|
|
148
|
-
Cherry Pick
|
|
149
|
-
</ContextMenuItem>
|
|
150
|
-
<ContextMenuItem onClick={() => onRevert(commit.hash)}>
|
|
151
|
-
<RotateCcw className="size-3" />
|
|
152
|
-
Revert
|
|
153
|
-
</ContextMenuItem>
|
|
154
|
-
<ContextMenuItem onClick={() => onOpenCreateTag(commit.hash)}>
|
|
155
|
-
<Tag className="size-3" />
|
|
156
|
-
Create Tag...
|
|
157
|
-
</ContextMenuItem>
|
|
158
|
-
<ContextMenuSeparator />
|
|
159
|
-
<ContextMenuItem onClick={onOpenDiff}>View Diff</ContextMenuItem>
|
|
160
|
-
<ContextMenuItem onClick={onCopyHash}>
|
|
161
|
-
<Copy className="size-3" />
|
|
162
|
-
Copy Hash
|
|
163
|
-
</ContextMenuItem>
|
|
164
|
-
</ContextMenuContent>
|
|
165
|
-
</ContextMenu>
|
|
166
|
-
);
|
|
167
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Dialog,
|
|
3
|
-
DialogContent,
|
|
4
|
-
DialogHeader,
|
|
5
|
-
DialogTitle,
|
|
6
|
-
} from "@/components/ui/dialog";
|
|
7
|
-
import type { GitBranch } from "../../../types/git";
|
|
8
|
-
|
|
9
|
-
interface GitGraphSettingsDialogProps {
|
|
10
|
-
open: boolean;
|
|
11
|
-
onClose: () => void;
|
|
12
|
-
projectName: string;
|
|
13
|
-
branches: GitBranch[];
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function GitGraphSettingsDialog({
|
|
17
|
-
open,
|
|
18
|
-
onClose,
|
|
19
|
-
projectName,
|
|
20
|
-
branches,
|
|
21
|
-
}: GitGraphSettingsDialogProps) {
|
|
22
|
-
const localBranches = branches.filter((b) => !b.remote);
|
|
23
|
-
const remoteBranches = branches.filter((b) => b.remote);
|
|
24
|
-
|
|
25
|
-
// Extract unique remotes from remote branch names
|
|
26
|
-
const remotes = new Map<string, string[]>();
|
|
27
|
-
for (const b of remoteBranches) {
|
|
28
|
-
const stripped = b.name.replace(/^remotes\//, "");
|
|
29
|
-
const slashIdx = stripped.indexOf("/");
|
|
30
|
-
if (slashIdx < 0) continue;
|
|
31
|
-
const remoteName = stripped.slice(0, slashIdx);
|
|
32
|
-
const branchName = stripped.slice(slashIdx + 1);
|
|
33
|
-
const arr = remotes.get(remoteName) ?? [];
|
|
34
|
-
arr.push(branchName);
|
|
35
|
-
remotes.set(remoteName, arr);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return (
|
|
39
|
-
<Dialog open={open} onOpenChange={(o) => { if (!o) onClose(); }}>
|
|
40
|
-
<DialogContent className="max-w-md">
|
|
41
|
-
<DialogHeader>
|
|
42
|
-
<DialogTitle>Repository Settings</DialogTitle>
|
|
43
|
-
</DialogHeader>
|
|
44
|
-
<div className="space-y-4 text-sm">
|
|
45
|
-
{/* General */}
|
|
46
|
-
<Section title="General">
|
|
47
|
-
<Row label="Name" value={projectName} />
|
|
48
|
-
<Row label="Branches" value={`${localBranches.length} local, ${remoteBranches.length} remote`} />
|
|
49
|
-
</Section>
|
|
50
|
-
|
|
51
|
-
{/* Local branches */}
|
|
52
|
-
<Section title="Local Branches">
|
|
53
|
-
{localBranches.map((b) => (
|
|
54
|
-
<div key={b.name} className="flex items-center gap-2 py-0.5">
|
|
55
|
-
<span className={`text-xs ${b.current ? "font-semibold text-primary" : "text-foreground"}`}>
|
|
56
|
-
{b.name}
|
|
57
|
-
</span>
|
|
58
|
-
{b.current && <span className="text-[10px] text-muted-foreground italic">HEAD</span>}
|
|
59
|
-
{b.remotes.length > 0 && (
|
|
60
|
-
<span className="text-[10px] text-muted-foreground">
|
|
61
|
-
({b.remotes.join(", ")})
|
|
62
|
-
</span>
|
|
63
|
-
)}
|
|
64
|
-
</div>
|
|
65
|
-
))}
|
|
66
|
-
</Section>
|
|
67
|
-
|
|
68
|
-
{/* Remotes */}
|
|
69
|
-
<Section title="Remotes">
|
|
70
|
-
{[...remotes.entries()].map(([name, rBranches]) => (
|
|
71
|
-
<div key={name} className="py-0.5">
|
|
72
|
-
<span className="text-xs font-medium">{name}</span>
|
|
73
|
-
<span className="text-[10px] text-muted-foreground ml-2">
|
|
74
|
-
{rBranches.length} branch{rBranches.length !== 1 ? "es" : ""}
|
|
75
|
-
</span>
|
|
76
|
-
</div>
|
|
77
|
-
))}
|
|
78
|
-
{remotes.size === 0 && (
|
|
79
|
-
<span className="text-xs text-muted-foreground">No remotes configured</span>
|
|
80
|
-
)}
|
|
81
|
-
</Section>
|
|
82
|
-
</div>
|
|
83
|
-
</DialogContent>
|
|
84
|
-
</Dialog>
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function Section({ title, children }: { title: string; children: React.ReactNode }) {
|
|
89
|
-
return (
|
|
90
|
-
<div>
|
|
91
|
-
<h4 className="text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-1.5">{title}</h4>
|
|
92
|
-
<div className="pl-1">{children}</div>
|
|
93
|
-
</div>
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function Row({ label, value }: { label: string; value: string }) {
|
|
98
|
-
return (
|
|
99
|
-
<div className="flex items-center gap-3 py-0.5">
|
|
100
|
-
<span className="text-xs text-muted-foreground w-16 shrink-0">{label}</span>
|
|
101
|
-
<span className="text-xs">{value}</span>
|
|
102
|
-
</div>
|
|
103
|
-
);
|
|
104
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { LANE_COLORS, LANE_WIDTH, ROW_HEIGHT, NODE_RADIUS } from "./git-graph-constants";
|
|
2
|
-
import type { GitCommit } from "../../../types/git";
|
|
3
|
-
|
|
4
|
-
interface GitGraphSvgProps {
|
|
5
|
-
commits: GitCommit[];
|
|
6
|
-
laneMap: Map<string, number>;
|
|
7
|
-
svgPaths: Array<{ d: string; color: string }>;
|
|
8
|
-
width: number;
|
|
9
|
-
height: number;
|
|
10
|
-
headHash: string;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function GitGraphSvg({
|
|
14
|
-
commits,
|
|
15
|
-
laneMap,
|
|
16
|
-
svgPaths,
|
|
17
|
-
width,
|
|
18
|
-
height,
|
|
19
|
-
headHash,
|
|
20
|
-
}: GitGraphSvgProps) {
|
|
21
|
-
return (
|
|
22
|
-
<svg width={width} height={height}>
|
|
23
|
-
{/* Connection lines */}
|
|
24
|
-
{svgPaths.map((p, i) => (
|
|
25
|
-
<path
|
|
26
|
-
key={i}
|
|
27
|
-
d={p.d}
|
|
28
|
-
stroke={p.color}
|
|
29
|
-
strokeWidth={2}
|
|
30
|
-
fill="none"
|
|
31
|
-
/>
|
|
32
|
-
))}
|
|
33
|
-
{/* Commit dots */}
|
|
34
|
-
{commits.map((c, ci) => {
|
|
35
|
-
const cLane = laneMap.get(c.hash) ?? 0;
|
|
36
|
-
const cx = cLane * LANE_WIDTH + LANE_WIDTH / 2;
|
|
37
|
-
const cy = ci * ROW_HEIGHT + ROW_HEIGHT / 2;
|
|
38
|
-
const cColor = LANE_COLORS[cLane % LANE_COLORS.length]!;
|
|
39
|
-
const isHead = c.hash === headHash;
|
|
40
|
-
return (
|
|
41
|
-
<circle
|
|
42
|
-
key={c.hash}
|
|
43
|
-
cx={cx}
|
|
44
|
-
cy={cy}
|
|
45
|
-
r={isHead ? NODE_RADIUS + 1 : NODE_RADIUS}
|
|
46
|
-
fill={cColor}
|
|
47
|
-
stroke={isHead ? "#000" : "none"}
|
|
48
|
-
strokeWidth={isHead ? 2 : 0}
|
|
49
|
-
/>
|
|
50
|
-
);
|
|
51
|
-
})}
|
|
52
|
-
</svg>
|
|
53
|
-
);
|
|
54
|
-
}
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import { useState, useRef, useEffect } from "react";
|
|
2
|
-
import {
|
|
3
|
-
RefreshCw,
|
|
4
|
-
Download,
|
|
5
|
-
Search,
|
|
6
|
-
Settings,
|
|
7
|
-
X,
|
|
8
|
-
ChevronDown,
|
|
9
|
-
Check,
|
|
10
|
-
} from "lucide-react";
|
|
11
|
-
import { Button } from "@/components/ui/button";
|
|
12
|
-
import { Input } from "@/components/ui/input";
|
|
13
|
-
import type { GitBranch } from "../../../types/git";
|
|
14
|
-
|
|
15
|
-
interface GitGraphToolbarProps {
|
|
16
|
-
branches: GitBranch[];
|
|
17
|
-
branchFilter: string;
|
|
18
|
-
onBranchFilterChange: (value: string) => void;
|
|
19
|
-
searchQuery: string;
|
|
20
|
-
onSearchQueryChange: (value: string) => void;
|
|
21
|
-
showSearch: boolean;
|
|
22
|
-
onToggleSearch: () => void;
|
|
23
|
-
onFetch: () => void;
|
|
24
|
-
onRefresh: () => void;
|
|
25
|
-
onOpenSettings?: () => void;
|
|
26
|
-
loading: boolean;
|
|
27
|
-
acting: boolean;
|
|
28
|
-
projectName?: string;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function GitGraphToolbar({
|
|
32
|
-
branches,
|
|
33
|
-
branchFilter,
|
|
34
|
-
onBranchFilterChange,
|
|
35
|
-
searchQuery,
|
|
36
|
-
onSearchQueryChange,
|
|
37
|
-
showSearch,
|
|
38
|
-
onToggleSearch,
|
|
39
|
-
onFetch,
|
|
40
|
-
onRefresh,
|
|
41
|
-
onOpenSettings,
|
|
42
|
-
loading,
|
|
43
|
-
acting,
|
|
44
|
-
projectName,
|
|
45
|
-
}: GitGraphToolbarProps) {
|
|
46
|
-
const localBranches = branches.filter((b) => !b.remote);
|
|
47
|
-
const [dropdownOpen, setDropdownOpen] = useState(false);
|
|
48
|
-
const [branchSearch, setBranchSearch] = useState("");
|
|
49
|
-
const dropdownRef = useRef<HTMLDivElement>(null);
|
|
50
|
-
|
|
51
|
-
// Close dropdown on outside click
|
|
52
|
-
useEffect(() => {
|
|
53
|
-
if (!dropdownOpen) return;
|
|
54
|
-
const handler = (e: MouseEvent) => {
|
|
55
|
-
if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {
|
|
56
|
-
setDropdownOpen(false);
|
|
57
|
-
setBranchSearch("");
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
document.addEventListener("mousedown", handler);
|
|
61
|
-
return () => document.removeEventListener("mousedown", handler);
|
|
62
|
-
}, [dropdownOpen]);
|
|
63
|
-
|
|
64
|
-
const filteredBranches = branchSearch
|
|
65
|
-
? localBranches.filter((b) =>
|
|
66
|
-
b.name.toLowerCase().includes(branchSearch.toLowerCase()),
|
|
67
|
-
)
|
|
68
|
-
: localBranches;
|
|
69
|
-
|
|
70
|
-
const selectedLabel =
|
|
71
|
-
branchFilter === "__all__"
|
|
72
|
-
? "Show All"
|
|
73
|
-
: localBranches.find((b) => b.name === branchFilter)?.name ?? "Show All";
|
|
74
|
-
|
|
75
|
-
return (
|
|
76
|
-
<div className="border-b bg-background">
|
|
77
|
-
<div className="flex items-center gap-1.5 px-2 py-1.5">
|
|
78
|
-
{/* Repo (single for now) */}
|
|
79
|
-
<div className="flex items-center gap-1 text-xs text-muted-foreground shrink-0">
|
|
80
|
-
<span className="font-semibold">Repo:</span>
|
|
81
|
-
<span className="font-medium text-foreground truncate max-w-[120px]">
|
|
82
|
-
{projectName ?? "—"}
|
|
83
|
-
</span>
|
|
84
|
-
</div>
|
|
85
|
-
|
|
86
|
-
<div className="w-px h-4 bg-border mx-1" />
|
|
87
|
-
|
|
88
|
-
{/* Branch filter — custom searchable dropdown */}
|
|
89
|
-
<div className="relative shrink-0" ref={dropdownRef}>
|
|
90
|
-
<button
|
|
91
|
-
type="button"
|
|
92
|
-
className="flex items-center gap-1 h-6 px-2 text-xs border rounded-md bg-transparent hover:bg-muted/50"
|
|
93
|
-
onClick={() => { setDropdownOpen((o) => !o); setBranchSearch(""); }}
|
|
94
|
-
>
|
|
95
|
-
<span className="font-semibold text-muted-foreground">Branches:</span>
|
|
96
|
-
<span className="max-w-[100px] truncate">{selectedLabel}</span>
|
|
97
|
-
<ChevronDown className="size-3 opacity-50" />
|
|
98
|
-
</button>
|
|
99
|
-
{dropdownOpen && (
|
|
100
|
-
<div className="absolute top-full left-0 mt-1 z-50 w-[220px] rounded-md border bg-popover shadow-md">
|
|
101
|
-
<div className="p-1.5">
|
|
102
|
-
<Input
|
|
103
|
-
className="h-6 text-xs px-2"
|
|
104
|
-
placeholder="Filter branches..."
|
|
105
|
-
value={branchSearch}
|
|
106
|
-
onChange={(e) => setBranchSearch(e.target.value)}
|
|
107
|
-
autoFocus
|
|
108
|
-
/>
|
|
109
|
-
</div>
|
|
110
|
-
<div className="max-h-[200px] overflow-y-auto p-1">
|
|
111
|
-
<BranchDropdownItem
|
|
112
|
-
label="Show All"
|
|
113
|
-
selected={branchFilter === "__all__"}
|
|
114
|
-
onClick={() => { onBranchFilterChange("__all__"); setDropdownOpen(false); }}
|
|
115
|
-
/>
|
|
116
|
-
{filteredBranches.map((b) => (
|
|
117
|
-
<BranchDropdownItem
|
|
118
|
-
key={b.name}
|
|
119
|
-
label={b.name}
|
|
120
|
-
current={b.current}
|
|
121
|
-
selected={branchFilter === b.name}
|
|
122
|
-
onClick={() => { onBranchFilterChange(b.name); setDropdownOpen(false); }}
|
|
123
|
-
/>
|
|
124
|
-
))}
|
|
125
|
-
{filteredBranches.length === 0 && branchSearch && (
|
|
126
|
-
<div className="px-2 py-1.5 text-xs text-muted-foreground">No branches found</div>
|
|
127
|
-
)}
|
|
128
|
-
</div>
|
|
129
|
-
</div>
|
|
130
|
-
)}
|
|
131
|
-
</div>
|
|
132
|
-
|
|
133
|
-
<div className="flex-1" />
|
|
134
|
-
|
|
135
|
-
{/* Search input (toggled) */}
|
|
136
|
-
{showSearch && (
|
|
137
|
-
<div className="flex items-center gap-1">
|
|
138
|
-
<Input
|
|
139
|
-
className="h-6 text-xs w-[160px] px-2"
|
|
140
|
-
placeholder="Search commits..."
|
|
141
|
-
value={searchQuery}
|
|
142
|
-
onChange={(e) => onSearchQueryChange(e.target.value)}
|
|
143
|
-
autoFocus
|
|
144
|
-
/>
|
|
145
|
-
<Button variant="ghost" size="icon-xs" onClick={onToggleSearch}>
|
|
146
|
-
<X className="size-3" />
|
|
147
|
-
</Button>
|
|
148
|
-
</div>
|
|
149
|
-
)}
|
|
150
|
-
|
|
151
|
-
{/* Action buttons */}
|
|
152
|
-
{!showSearch && (
|
|
153
|
-
<Button variant="ghost" size="icon-xs" onClick={onToggleSearch} title="Find">
|
|
154
|
-
<Search className="size-3.5" />
|
|
155
|
-
</Button>
|
|
156
|
-
)}
|
|
157
|
-
<Button variant="ghost" size="icon-xs" onClick={onOpenSettings} title="Settings">
|
|
158
|
-
<Settings className="size-3.5" />
|
|
159
|
-
</Button>
|
|
160
|
-
<Button variant="ghost" size="icon-xs" onClick={onFetch} disabled={acting} title="Fetch">
|
|
161
|
-
<Download className="size-3.5" />
|
|
162
|
-
</Button>
|
|
163
|
-
<Button variant="ghost" size="icon-xs" onClick={onRefresh} disabled={acting} title="Refresh">
|
|
164
|
-
<RefreshCw className={`size-3.5 ${loading ? "animate-spin" : ""}`} />
|
|
165
|
-
</Button>
|
|
166
|
-
</div>
|
|
167
|
-
</div>
|
|
168
|
-
);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
function BranchDropdownItem({
|
|
172
|
-
label,
|
|
173
|
-
selected,
|
|
174
|
-
current,
|
|
175
|
-
onClick,
|
|
176
|
-
}: {
|
|
177
|
-
label: string;
|
|
178
|
-
selected: boolean;
|
|
179
|
-
current?: boolean;
|
|
180
|
-
onClick: () => void;
|
|
181
|
-
}) {
|
|
182
|
-
return (
|
|
183
|
-
<button
|
|
184
|
-
type="button"
|
|
185
|
-
className="flex items-center gap-2 w-full px-2 py-1 text-xs rounded-sm hover:bg-accent hover:text-accent-foreground text-left"
|
|
186
|
-
onClick={onClick}
|
|
187
|
-
>
|
|
188
|
-
<Check className={`size-3 shrink-0 ${selected ? "opacity-100" : "opacity-0"}`} />
|
|
189
|
-
<span className="truncate flex-1">{label}</span>
|
|
190
|
-
{current && (
|
|
191
|
-
<span className="text-[10px] text-muted-foreground italic">current</span>
|
|
192
|
-
)}
|
|
193
|
-
</button>
|
|
194
|
-
);
|
|
195
|
-
}
|