viba-cli 0.39.0 → 0.41.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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/fallback-build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error/page.js +1 -1
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +2 -2
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/component-source/resolve/route.js +1 -1
- package/.next/server/app/api/component-source/resolve/route.js.nft.json +1 -1
- package/.next/server/app/api/credentials/github/repos/route.js +1 -1
- package/.next/server/app/api/credentials/github/repos/route.js.nft.json +1 -1
- package/.next/server/app/api/credentials/route.js +1 -1
- package/.next/server/app/api/credentials/route.js.nft.json +1 -1
- package/.next/server/app/api/custom-scripts/route.js +2 -2
- package/.next/server/app/api/custom-scripts/route.js.nft.json +1 -1
- package/.next/server/app/api/git/action/route.js +3 -3
- package/.next/server/app/api/git/action/route.js.nft.json +1 -1
- package/.next/server/app/api/git/branches/route.js +3 -3
- package/.next/server/app/api/git/branches/route.js.nft.json +1 -1
- package/.next/server/app/api/git/diff/route.js +2 -2
- package/.next/server/app/api/git/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/git/log/route.js +2 -2
- package/.next/server/app/api/git/log/route.js.nft.json +1 -1
- package/.next/server/app/api/git/status/route.js +3 -3
- package/.next/server/app/api/git/status/route.js.nft.json +1 -1
- package/.next/server/app/api/preview-proxy/start/route.js +1 -1
- package/.next/server/app/api/preview-proxy/start/route.js.nft.json +1 -1
- package/.next/server/app/api/repos/clone/route.js +2 -2
- package/.next/server/app/api/repos/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repos/route.js +2 -2
- package/.next/server/app/api/repos/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/route.js +1 -1
- package/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/.next/server/app/credentials/page/server-reference-manifest.json +7 -7
- package/.next/server/app/credentials/page.js +1 -1
- package/.next/server/app/credentials/page.js.nft.json +1 -1
- package/.next/server/app/credentials/page_client-reference-manifest.js +1 -1
- package/.next/server/app/credentials.html +2 -2
- package/.next/server/app/credentials.rsc +4 -4
- package/.next/server/app/credentials.segments/_full.segment.rsc +4 -4
- package/.next/server/app/credentials.segments/_head.segment.rsc +1 -1
- package/.next/server/app/credentials.segments/_index.segment.rsc +2 -2
- package/.next/server/app/credentials.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/credentials.segments/credentials/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/credentials.segments/credentials.segment.rsc +1 -1
- package/.next/server/app/git/changes/page.js +1 -1
- package/.next/server/app/git/changes/page.js.nft.json +1 -1
- package/.next/server/app/git/changes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/git/changes.html +2 -2
- package/.next/server/app/git/changes.rsc +4 -4
- package/.next/server/app/git/changes.segments/_full.segment.rsc +4 -4
- package/.next/server/app/git/changes.segments/_head.segment.rsc +1 -1
- package/.next/server/app/git/changes.segments/_index.segment.rsc +2 -2
- package/.next/server/app/git/changes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/git/changes.segments/git/changes/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/git/changes.segments/git/changes.segment.rsc +1 -1
- package/.next/server/app/git/changes.segments/git.segment.rsc +1 -1
- package/.next/server/app/git/custom-scripts/page.js +1 -1
- package/.next/server/app/git/custom-scripts/page.js.nft.json +1 -1
- package/.next/server/app/git/custom-scripts/page_client-reference-manifest.js +1 -1
- package/.next/server/app/git/custom-scripts.html +2 -2
- package/.next/server/app/git/custom-scripts.rsc +2 -2
- package/.next/server/app/git/custom-scripts.segments/_full.segment.rsc +2 -2
- package/.next/server/app/git/custom-scripts.segments/_head.segment.rsc +1 -1
- package/.next/server/app/git/custom-scripts.segments/_index.segment.rsc +2 -2
- package/.next/server/app/git/custom-scripts.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/git/custom-scripts.segments/git/custom-scripts/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/git/custom-scripts.segments/git/custom-scripts.segment.rsc +1 -1
- package/.next/server/app/git/custom-scripts.segments/git.segment.rsc +1 -1
- package/.next/server/app/git/history/page/server-reference-manifest.json +17 -1
- package/.next/server/app/git/history/page.js +3 -2
- package/.next/server/app/git/history/page.js.nft.json +1 -1
- package/.next/server/app/git/history/page_client-reference-manifest.js +1 -1
- package/.next/server/app/git/history.html +2 -2
- package/.next/server/app/git/history.rsc +4 -4
- package/.next/server/app/git/history.segments/_full.segment.rsc +4 -4
- package/.next/server/app/git/history.segments/_head.segment.rsc +1 -1
- package/.next/server/app/git/history.segments/_index.segment.rsc +2 -2
- package/.next/server/app/git/history.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/git/history.segments/git/history/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/git/history.segments/git/history.segment.rsc +1 -1
- package/.next/server/app/git/history.segments/git.segment.rsc +1 -1
- package/.next/server/app/git/page/server-reference-manifest.json +17 -1
- package/.next/server/app/git/page.js +3 -2
- package/.next/server/app/git/page.js.nft.json +1 -1
- package/.next/server/app/git/page_client-reference-manifest.js +1 -1
- package/.next/server/app/git/stashes/page.js +1 -1
- package/.next/server/app/git/stashes/page.js.nft.json +1 -1
- package/.next/server/app/git/stashes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/git/stashes.html +2 -2
- package/.next/server/app/git/stashes.rsc +2 -2
- package/.next/server/app/git/stashes.segments/_full.segment.rsc +2 -2
- package/.next/server/app/git/stashes.segments/_head.segment.rsc +1 -1
- package/.next/server/app/git/stashes.segments/_index.segment.rsc +2 -2
- package/.next/server/app/git/stashes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/git/stashes.segments/git/stashes/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/git/stashes.segments/git/stashes.segment.rsc +1 -1
- package/.next/server/app/git/stashes.segments/git.segment.rsc +1 -1
- package/.next/server/app/git.html +2 -2
- package/.next/server/app/git.rsc +4 -4
- package/.next/server/app/git.segments/_full.segment.rsc +4 -4
- package/.next/server/app/git.segments/_head.segment.rsc +1 -1
- package/.next/server/app/git.segments/_index.segment.rsc +2 -2
- package/.next/server/app/git.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/git.segments/git/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/git.segments/git.segment.rsc +1 -1
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +4 -4
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/new/page/server-reference-manifest.json +29 -29
- package/.next/server/app/new/page.js +4 -4
- package/.next/server/app/new/page.js.nft.json +1 -1
- package/.next/server/app/new/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page/server-reference-manifest.json +29 -29
- package/.next/server/app/page.js +3 -3
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/session/[sessionId]/page/server-reference-manifest.json +34 -19
- package/.next/server/app/session/[sessionId]/page.js +2 -2
- package/.next/server/app/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/server/app/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/server/chunks/[externals]__4610b07e._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__093d29e3._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__7f2f8f49._.js.map → [root-of-the-server]__093d29e3._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__2bdd2171._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__8de57231._.js.map → [root-of-the-server]__2bdd2171._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__2ea0148f._.js +7 -0
- package/.next/server/chunks/{[root-of-the-server]__b17e6c62._.js.map → [root-of-the-server]__2ea0148f._.js.map} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__ceda8fbc._.js → [root-of-the-server]__34da758c._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__52f9b7e2._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__2dcb1454._.js.map → [root-of-the-server]__52f9b7e2._.js.map} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__9af2c9bf._.js → [root-of-the-server]__5ebd9b2a._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__3ffc9919._.js → [root-of-the-server]__6a2576a8._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__7147e7f8._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__7324fe0b._.js.map → [root-of-the-server]__7147e7f8._.js.map} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__1bf60374._.js → [root-of-the-server]__93d494cc._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__952874bc._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__187f37c1._.js.map → [root-of-the-server]__952874bc._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__05e6fb4c._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__2f5cb477._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__79a7a15d._.js.map → [root-of-the-server]__2f5cb477._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__32cb19cb._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__05b3451a._.js.map → [root-of-the-server]__32cb19cb._.js.map} +1 -1
- package/.next/server/chunks/ssr/{[root-of-the-server]__5be652da._.js → [root-of-the-server]__35dc6469._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__46af1502._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__46af1502._.js.map +1 -1
- package/.next/server/chunks/ssr/{_476e86d1._.js → [root-of-the-server]__4928d640._.js} +3 -3
- package/.next/server/chunks/ssr/{_476e86d1._.js.map → [root-of-the-server]__4928d640._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__6e6c1134._.js +4 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__6e6c1134._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__e86a1b81._.js → [root-of-the-server]__79ab29ee._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__8d19726f._.js +4 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8d19726f._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__96a8b4aa._.js → [root-of-the-server]__905c5090._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__2798aa4d._.js → [root-of-the-server]__afccdb61._.js} +3 -3
- package/.next/server/chunks/ssr/{[root-of-the-server]__2798aa4d._.js.map → [root-of-the-server]__afccdb61._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__d52659cf._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__d52659cf._.js.map +1 -0
- package/.next/server/chunks/ssr/_1232faca._.js +3 -0
- package/.next/server/chunks/ssr/_1232faca._.js.map +1 -0
- package/.next/server/chunks/ssr/_21376a5e._.js +3 -0
- package/.next/server/chunks/ssr/_21376a5e._.js.map +1 -0
- package/.next/server/chunks/ssr/_25f614f9._.js +3 -0
- package/.next/server/chunks/ssr/_25f614f9._.js.map +1 -0
- package/.next/server/chunks/ssr/{_5147763c._.js → _4e480580._.js} +2 -2
- package/.next/server/chunks/ssr/_4e480580._.js.map +1 -0
- package/.next/server/chunks/ssr/_707e5fab._.js +1 -1
- package/.next/server/chunks/ssr/_707e5fab._.js.map +1 -1
- package/.next/server/chunks/ssr/_7e1d1983._.js +3 -0
- package/.next/server/chunks/ssr/_7e1d1983._.js.map +1 -0
- package/.next/server/chunks/ssr/_9493de08._.js +1 -1
- package/.next/server/chunks/ssr/_9493de08._.js.map +1 -1
- package/.next/server/chunks/ssr/{_9a7bd3c8._.js → _979edf0c._.js} +2 -2
- package/.next/server/chunks/ssr/_979edf0c._.js.map +1 -0
- package/.next/server/chunks/ssr/_9db6d532._.js +3 -0
- package/.next/server/chunks/ssr/_9db6d532._.js.map +1 -0
- package/.next/server/chunks/ssr/{_439918bb._.js → _a30f8faf._.js} +2 -2
- package/.next/server/chunks/ssr/_a30f8faf._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_bf7b09f8._.js → node_modules_3aaf320c._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_3aaf320c._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_50fa454f._.js → node_modules_f0d9388d._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_f0d9388d._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_3e692bb2._.js → node_modules_fae6b458._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_fae6b458._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_35575f97._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_35575f97._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_b34e0340._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_b34e0340._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js +1 -1
- package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_git_changes_page_tsx_f6dc28dc._.js +1 -1
- package/.next/server/chunks/ssr/src_app_git_changes_page_tsx_f6dc28dc._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js +1 -1
- package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js.map +1 -1
- package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js +3 -3
- package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js.map +1 -1
- package/.next/server/chunks/ssr/src_components_git_history-view_tsx_fd62126a._.js +6 -6
- package/.next/server/chunks/ssr/src_components_git_history-view_tsx_fd62126a._.js.map +1 -1
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/500.html +2 -2
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +77 -48
- package/.next/static/chunks/15bbad1a4cefc870.js +3 -0
- package/.next/static/chunks/1f428267926cd032.js +3 -0
- package/.next/static/chunks/{d09578ecf3b80b9d.js → 2ca45fcc772c4ea0.js} +2 -2
- package/.next/static/chunks/3df671a7fdd91e3e.js +1 -0
- package/.next/static/chunks/53f66f12a3d0dc7f.js +3 -0
- package/.next/static/chunks/6242d36c3f387ddb.js +1 -0
- package/.next/static/chunks/697655e0e9336655.js +1 -0
- package/.next/static/chunks/c08840e14b1e627c.css +1 -0
- package/.next/static/chunks/d6c7a0b35251160d.js +8 -0
- package/.next/static/chunks/dcba19c95b8bc155.js +1 -0
- package/.next/static/chunks/e45cecb04475a86a.js +9 -0
- package/.next/static/chunks/f31a3f4a435e3f86.js +3 -0
- package/README.md +4 -0
- package/bin/viba.mjs +124 -4
- package/package.json +1 -1
- package/.next/server/chunks/[externals]__7ece43c5._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__187f37c1._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__2dcb1454._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__7324fe0b._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__7f2f8f49._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__8de57231._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__afea2116._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__afea2116._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__b17e6c62._.js +0 -7
- package/.next/server/chunks/ssr/[root-of-the-server]__05b3451a._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__30652385._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__30652385._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__79a7a15d._.js +0 -3
- package/.next/server/chunks/ssr/_439918bb._.js.map +0 -1
- package/.next/server/chunks/ssr/_4a66db4a._.js +0 -3
- package/.next/server/chunks/ssr/_4a66db4a._.js.map +0 -1
- package/.next/server/chunks/ssr/_5147763c._.js.map +0 -1
- package/.next/server/chunks/ssr/_8d41d1fd._.js +0 -3
- package/.next/server/chunks/ssr/_8d41d1fd._.js.map +0 -1
- package/.next/server/chunks/ssr/_9a7bd3c8._.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_git_history_page_actions_9e9b26bc.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_git_history_page_actions_9e9b26bc.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_git_page_actions_511f286b.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_git_page_actions_511f286b.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_3e692bb2._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_50fa454f._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_8e38eac2._.js +0 -5
- package/.next/server/chunks/ssr/node_modules_8e38eac2._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_bf7b09f8._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_0ff44e32._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_0ff44e32._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_f6fd30d1._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_f6fd30d1._.js.map +0 -1
- package/.next/server/chunks/ssr/src_408d74ba._.js +0 -3
- package/.next/server/chunks/ssr/src_408d74ba._.js.map +0 -1
- package/.next/server/chunks/ssr/src_49325427._.js +0 -3
- package/.next/server/chunks/ssr/src_49325427._.js.map +0 -1
- package/.next/static/chunks/0ce2e7006253186a.js +0 -9
- package/.next/static/chunks/0f9834bd2f6f4c6e.js +0 -3
- package/.next/static/chunks/1958a10518af04a4.js +0 -1
- package/.next/static/chunks/3205a3bbc11c3146.css +0 -1
- package/.next/static/chunks/369aa92811a706db.js +0 -3
- package/.next/static/chunks/4aab1f3ea2ed1aef.js +0 -1
- package/.next/static/chunks/5e0dada5236f9065.js +0 -8
- package/.next/static/chunks/977137e155012c13.js +0 -1
- package/.next/static/chunks/b18cc1247b979318.js +0 -1
- package/.next/static/chunks/b926978a88c43bac.js +0 -3
- package/.next/static/chunks/f7914ab5db08b8dd.js +0 -3
- /package/.next/server/chunks/{[externals]__7ece43c5._.js.map → [externals]__4610b07e._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__ceda8fbc._.js.map → [root-of-the-server]__34da758c._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__9af2c9bf._.js.map → [root-of-the-server]__5ebd9b2a._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__3ffc9919._.js.map → [root-of-the-server]__6a2576a8._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1bf60374._.js.map → [root-of-the-server]__93d494cc._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{[root-of-the-server]__5be652da._.js.map → [root-of-the-server]__35dc6469._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{[root-of-the-server]__e86a1b81._.js.map → [root-of-the-server]__79ab29ee._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{[root-of-the-server]__96a8b4aa._.js.map → [root-of-the-server]__905c5090._.js.map} +0 -0
- /package/.next/static/{gMV0bFe8zKqVaStUpkI04 → f6hBCO8U8SWC5F77QTqGY}/_buildManifest.js +0 -0
- /package/.next/static/{gMV0bFe8zKqVaStUpkI04 → f6hBCO8U8SWC5F77QTqGY}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{gMV0bFe8zKqVaStUpkI04 → f6hBCO8U8SWC5F77QTqGY}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/git/history-view.tsx","../../../../src/components/git/git-graph.tsx","../../../../src/lib/branch-colors.ts","../../../../src/lib/graph-utils.ts","../../../../src/components/context-menu.tsx","../../../../src/components/git/branch-tree-utils.ts","../../../../src/components/git/visibility-toggle.tsx","../../../../src/components/git/group-header.tsx","../../../../src/components/git/branch-context-menu.tsx","../../../../src/components/git/branch-tree-item.tsx"],"sourcesContent":["'use client';\n\nimport { useGitLog, useGitBranches, useGitStatus, useGitAction, useCommitDiff, useCommitFileDiff, CommitFile, useRepository, useUpdateRepository, useSettings, useUpdateSettings } from '@/hooks/use-git';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { Repository, RepositoryCustomScript, BranchTrackingInfo } from '@/lib/types';\nimport { GitGraph, GitGraphHandle } from './git-graph';\nimport { useState, useMemo, useEffect, useCallback, useRef } from 'react';\nimport { useTheme } from 'next-themes';\nimport { cn, sanitizeBranchName, isFileBinary, isImageFile, getChangedLineCountFromDiff } from '@/lib/utils';\nimport { ContextMenu, ContextMenuItem } from '@/components/context-menu';\nimport { GroupedDiffViewer } from './grouped-diff-viewer';\nimport { ImageDiffView } from './image-diff-view';\nimport { useEscapeDismiss } from '@/hooks/use-escape-dismiss';\nimport { toast } from '@/hooks/use-toast';\nimport { CommitChangesView } from './commit-changes-view';\nimport { BranchTreeNode, VisibilityMap, buildBranchTree, buildRemoteBranchTree, getEffectiveVisibility, collectAllBranchRefs, collectVisibleBranchRefs } from './branch-tree-utils';\nimport { GroupHeader } from './group-header';\nimport { BranchMenuOptions, BranchOperation, buildBranchContextMenuItems } from './branch-context-menu';\nimport { BranchRowSelectModifiers, BranchTreeItem } from './branch-tree-item';\nimport { CommitRowSelectModifiers } from './commit-row-select-modifiers';\nimport { useRouter, useSearchParams } from 'next/navigation';\n\n\nconst MIN_HISTORY_PANEL_HEIGHT = 100;\nconst MAX_HISTORY_PANEL_HEIGHT = 900;\nconst MIN_COMMIT_DETAILS_MESSAGE_RATIO = 0.15;\nconst MAX_COMMIT_DETAILS_MESSAGE_RATIO = 0.75;\nconst DEFAULT_COMMIT_DETAILS_MESSAGE_RATIO = 0.28;\ntype MergeConflictStatus = 'checking' | 'no-conflict' | 'has-conflicts';\n\ntype ScriptExecutionStatus = 'idle' | 'starting' | 'running' | 'completed' | 'failed' | 'canceled';\ntype ScriptExecutionState = {\n isOpen: boolean;\n executionId: string | null;\n scriptName: string;\n branchRef: string;\n output: string;\n status: ScriptExecutionStatus;\n error: string | null;\n};\n\nfunction clampHistoryPanelHeight(height: number): number {\n return Math.min(Math.max(height, MIN_HISTORY_PANEL_HEIGHT), MAX_HISTORY_PANEL_HEIGHT);\n}\n\nfunction clampCommitDetailsMessageRatio(ratio: number): number {\n return Math.min(Math.max(ratio, MIN_COMMIT_DETAILS_MESSAGE_RATIO), MAX_COMMIT_DETAILS_MESSAGE_RATIO);\n}\n\nfunction buildCommitMessage(subject: string, body: string): string {\n const trimmedSubject = subject.trim();\n const normalizedBody = body.replace(/\\r\\n/g, '\\n');\n return normalizedBody.trim() ? `${trimmedSubject}\\n\\n${normalizedBody}` : trimmedSubject;\n}\n\nfunction formatCommitMessageForDisplay(message: string): string {\n return message\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\\\r\\\\n/g, '\\n')\n .replace(/\\\\n/g, '\\n');\n}\n\nfunction parseTrackingUpstream(upstream: string): { remote: string; branch: string } | null {\n const slashIndex = upstream.indexOf('/');\n if (slashIndex <= 0 || slashIndex >= upstream.length - 1) return null;\n return {\n remote: upstream.slice(0, slashIndex),\n branch: upstream.slice(slashIndex + 1),\n };\n}\n\nasync function copyText(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n const textArea = document.createElement('textarea');\n textArea.value = text;\n textArea.style.position = 'fixed';\n textArea.style.left = '-9999px';\n document.body.appendChild(textArea);\n textArea.select();\n\n try {\n document.execCommand('copy');\n return true;\n } catch {\n return false;\n } finally {\n document.body.removeChild(textArea);\n }\n }\n}\n\nconst DEFAULT_SCRIPT_EXECUTION: ScriptExecutionState = {\n isOpen: false,\n executionId: null,\n scriptName: '',\n branchRef: '',\n output: '',\n status: 'idle',\n error: null,\n};\n\n\n// File status icon component\nfunction FileStatusIcon({ status }: { status: string }) {\n switch (status) {\n case 'A':\n return <i className=\"iconoir-plus-circle text-[16px] text-success\" aria-hidden=\"true\" />;\n case 'D':\n return <i className=\"iconoir-minus-circle text-[16px] text-error\" aria-hidden=\"true\" />;\n case 'M':\n return <i className=\"iconoir-edit-pencil text-[16px] text-warning\" aria-hidden=\"true\" />;\n default:\n return <i className=\"iconoir-page text-[16px] opacity-50\" aria-hidden=\"true\" />;\n }\n}\n\n\n\nexport function HistoryView({ repoPath }: { repoPath: string }) {\n const queryClient = useQueryClient();\n const { data: settings } = useSettings();\n const updateSettings = useUpdateSettings();\n const router = useRouter();\n const searchParams = useSearchParams();\n const requestedBranchFromQuery = (searchParams.get('branch') ?? '').trim();\n const initialBranchCheckoutAttemptKeyRef = useRef<string | null>(null);\n const initialBranchHeadSelectionAttemptKeyRef = useRef<string | null>(null);\n\n const [limit, setLimit] = useState(100);\n const { data: log, isLoading, isError, error, refetch: refetchLog, isFetching } = useGitLog(repoPath, limit);\n const { data: branchData, isLoading: isBranchesLoading, refetch: refetchBranches } = useGitBranches(repoPath);\n const activeBranchFromData = branchData?.current?.trim() ?? '';\n const { data: statusData } = useGitStatus(repoPath);\n const [selectedHash, setSelectedHash] = useState<string | null>(null);\n const [selectedCommitHashes, setSelectedCommitHashes] = useState<string[]>([]);\n const [selectionAnchorHash, setSelectionAnchorHash] = useState<string | null>(null);\n const lastVisibilityRefreshAtRef = useRef(0);\n\n const refreshBranchesAndHistory = useCallback(() => {\n const now = Date.now();\n if (now - lastVisibilityRefreshAtRef.current < 500) return;\n lastVisibilityRefreshAtRef.current = now;\n void Promise.all([refetchBranches(), refetchLog()]);\n }, [refetchBranches, refetchLog]);\n\n useEffect(() => {\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'visible') {\n refreshBranchesAndHistory();\n }\n };\n\n const handleWindowFocus = () => {\n if (document.visibilityState === 'visible') {\n refreshBranchesAndHistory();\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n window.addEventListener('focus', handleWindowFocus);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n window.removeEventListener('focus', handleWindowFocus);\n };\n }, [refreshBranchesAndHistory]);\n\n const selectSingleCommit = useCallback((hash: string | null) => {\n setSelectedHash(hash);\n setSelectedCommitHashes(hash ? [hash] : []);\n setSelectionAnchorHash(hash);\n }, []);\n\n // Clear selected commit and close commit details panel when repository changes\n useEffect(() => {\n selectSingleCommit(null);\n setSelectedBranchRefs([]);\n setBranchSelectionAnchor(null);\n }, [repoPath, selectSingleCommit]);\n\n const { mutateAsync: runGitAction } = useGitAction();\n\n const handleCheckConflicts = () => {\n console.warn(\"Conflicts tab has been removed.\");\n };\n\n const isMergeOrRebaseConflictError = useCallback((error: unknown) => {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n return (\n message.includes('conflict') ||\n message.includes('could not apply') ||\n message.includes('fix conflicts') ||\n message.includes('resolve all conflicts') ||\n message.includes('merge --continue') ||\n message.includes('rebase --continue')\n );\n }, []);\n\n useEffect(() => {\n initialBranchCheckoutAttemptKeyRef.current = null;\n initialBranchHeadSelectionAttemptKeyRef.current = null;\n }, [repoPath]);\n\n useEffect(() => {\n if (!requestedBranchFromQuery || !branchData) return;\n\n const requestKey = `${repoPath}:${requestedBranchFromQuery}`;\n if (initialBranchCheckoutAttemptKeyRef.current === requestKey) return;\n\n if (branchData.current === requestedBranchFromQuery) {\n initialBranchCheckoutAttemptKeyRef.current = requestKey;\n return;\n }\n\n if (!branchData.branches.includes(requestedBranchFromQuery)) {\n initialBranchCheckoutAttemptKeyRef.current = requestKey;\n toast({\n type: 'error',\n title: 'Branch Not Found',\n description: `Branch \"${requestedBranchFromQuery}\" does not exist in this repository.`,\n });\n return;\n }\n\n initialBranchCheckoutAttemptKeyRef.current = requestKey;\n\n void (async () => {\n try {\n await runGitAction({\n repoPath,\n action: 'checkout',\n data: { branch: requestedBranchFromQuery },\n });\n } catch (e) {\n console.error(e);\n }\n })();\n }, [branchData, repoPath, requestedBranchFromQuery, runGitAction]);\n\n const [iscreateBranchOpen, setIsCreateBranchOpen] = useState(false);\n const [newBranchName, setNewBranchName] = useState('');\n const [createBranchFromRef, setCreateBranchFromRef] = useState<string | null>(null);\n const [isCreating, setIsCreating] = useState(false);\n const [isCreateTagOpen, setIsCreateTagOpen] = useState(false);\n const [createTagCommitHash, setCreateTagCommitHash] = useState<string | null>(null);\n const [newTagName, setNewTagName] = useState('');\n const [pushTagToRemote, setPushTagToRemote] = useState(false);\n const [isCreatingTag, setIsCreatingTag] = useState(false);\n\n const [isDeleteOpen, setIsDeleteOpen] = useState(false);\n const [branchesToDelete, setBranchesToDelete] = useState<string[]>([]);\n const [deleteRemoteBranch, setDeleteRemoteBranch] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n const [isDeleteWorktreeOpen, setIsDeleteWorktreeOpen] = useState(false);\n const [worktreeToDelete, setWorktreeToDelete] = useState<string | null>(null);\n const [isDeletingWorktree, setIsDeletingWorktree] = useState(false);\n const [isDeleteTagOpen, setIsDeleteTagOpen] = useState(false);\n const [tagToDelete, setTagToDelete] = useState<string | null>(null);\n const [deleteRemoteTag, setDeleteRemoteTag] = useState(false);\n const [isDeletingTag, setIsDeletingTag] = useState(false);\n\n const [isCherryPickOpen, setIsCherryPickOpen] = useState(false);\n const [commitsToCherryPick, setCommitsToCherryPick] = useState<{ hash: string; message: string }[]>([]);\n const [isCherryPicking, setIsCherryPicking] = useState(false);\n const [isAbortCherryPickOpen, setIsAbortCherryPickOpen] = useState(false);\n const [isAbortingCherryPick, setIsAbortingCherryPick] = useState(false);\n\n const [isRenameOpen, setIsRenameOpen] = useState(false);\n const [branchToRename, setBranchToRename] = useState<string | null>(null);\n const [remoteBranchToRename, setRemoteBranchToRename] = useState<{ remote: string; branch: string } | null>(null);\n const [newBranchNameForRename, setNewBranchNameForRename] = useState('');\n const [renameTrackingRemoteBranch, setRenameTrackingRemoteBranch] = useState(false);\n const [isRenaming, setIsRenaming] = useState(false);\n const [isRenameRemoteOpen, setIsRenameRemoteOpen] = useState(false);\n const [remoteToRename, setRemoteToRename] = useState<string | null>(null);\n const [newRemoteNameForRename, setNewRemoteNameForRename] = useState('');\n const [isRenamingRemote, setIsRenamingRemote] = useState(false);\n const [isDeleteRemoteOpen, setIsDeleteRemoteOpen] = useState(false);\n const [remoteToDelete, setRemoteToDelete] = useState<string | null>(null);\n const [isDeletingRemote, setIsDeletingRemote] = useState(false);\n const [isAddRemoteOpen, setIsAddRemoteOpen] = useState(false);\n const [newRemoteName, setNewRemoteName] = useState('origin');\n const [newRemoteUrl, setNewRemoteUrl] = useState('');\n const [isAddingRemote, setIsAddingRemote] = useState(false);\n\n const [isRebaseOpen, setIsRebaseOpen] = useState(false);\n const [rebaseSourceBranch, setRebaseSourceBranch] = useState<string | null>(null);\n const [rebaseTargetBranch, setRebaseTargetBranch] = useState<string | null>(null);\n const [rebaseStashChanges, setRebaseStashChanges] = useState(true);\n const [isRebasing, setIsRebasing] = useState(false);\n const [rebaseConflictStatus, setRebaseConflictStatus] = useState<MergeConflictStatus>('checking');\n\n const closeRebaseDialog = useCallback(() => {\n setIsRebaseOpen(false);\n setRebaseSourceBranch(null);\n setRebaseTargetBranch(null);\n setRebaseConflictStatus('checking');\n }, []);\n\n const [isMergeOpen, setIsMergeOpen] = useState(false);\n const [mergeTargetBranch, setMergeTargetBranch] = useState<string | null>(null);\n const [mergeSourceBranch, setMergeSourceBranch] = useState<string | null>(null);\n const [mergeRebaseBeforeMerge, setMergeRebaseBeforeMerge] = useState(false);\n const [mergeSquash, setMergeSquash] = useState(false);\n const [mergeFastForward, setMergeFastForward] = useState(false);\n const [mergeSquashMessage, setMergeSquashMessage] = useState('');\n const [isMerging, setIsMerging] = useState(false);\n const [mergeConflictStatus, setMergeConflictStatus] = useState<MergeConflictStatus>('checking');\n\n const closeMergeDialog = useCallback(() => {\n setIsMergeOpen(false);\n setMergeTargetBranch(null);\n setMergeSourceBranch(null);\n setMergeConflictStatus('checking');\n }, []);\n\n // Push to remote dialog state\n const [isPushOpen, setIsPushOpen] = useState(false);\n const [pushBranch, setPushBranch] = useState<string | null>(null);\n const [pushRemotes, setPushRemotes] = useState<string[]>([]);\n const [pushSelectedRemote, setPushSelectedRemote] = useState<string>('');\n const [pushRemoteBranches, setPushRemoteBranches] = useState<string[]>([]);\n const [pushSelectedRemoteBranch, setPushSelectedRemoteBranch] = useState<string>('');\n const [pushTrackingBranch, setPushTrackingBranch] = useState<{ remote: string; branch: string } | null>(null);\n const [pushRebaseFirst, setPushRebaseFirst] = useState(false);\n const [pushForcePush, setPushForcePush] = useState(false);\n const [pushLocalOnlyTags, setPushLocalOnlyTags] = useState(true);\n const [pushSquash, setPushSquash] = useState(false);\n const [pushSquashMessage, setPushSquashMessage] = useState('');\n const [isPushing, setIsPushing] = useState(false);\n const [pushError, setPushError] = useState<string | null>(null);\n const [pushLoadingRemotes, setPushLoadingRemotes] = useState(false);\n const [pushLoadingBranches, setPushLoadingBranches] = useState(false);\n\n // Pull from remote dialog state\n const [isPullOpen, setIsPullOpen] = useState(false);\n const [pullBranch, setPullBranch] = useState<string | null>(null);\n const [pullRemotes, setPullRemotes] = useState<string[]>([]);\n const [pullSelectedRemote, setPullSelectedRemote] = useState<string>('');\n const [pullRemoteBranches, setPullRemoteBranches] = useState<string[]>([]);\n const [pullSelectedRemoteBranch, setPullSelectedRemoteBranch] = useState<string>('');\n const [pullTrackingBranch, setPullTrackingBranch] = useState<{ remote: string; branch: string } | null>(null);\n const [pullRebase, setPullRebase] = useState(true);\n const [isPulling, setIsPulling] = useState(false);\n const [isPullingAllBranches, setIsPullingAllBranches] = useState(false);\n const [pullError, setPullError] = useState<string | null>(null);\n const [pullLoadingRemotes, setPullLoadingRemotes] = useState(false);\n const [pullLoadingBranches, setPullLoadingBranches] = useState(false);\n const [isFetchingAllRemotes, setIsFetchingAllRemotes] = useState(false);\n const [isOpeningRepoFolder, setIsOpeningRepoFolder] = useState(false);\n const [isOpeningRepoTerminal, setIsOpeningRepoTerminal] = useState(false);\n\n // Checkout to local dialog state\n const [isCheckoutToLocalOpen, setIsCheckoutToLocalOpen] = useState(false);\n const [checkoutRemoteBranch, setCheckoutRemoteBranch] = useState<string | null>(null);\n const [checkoutLocalBranchName, setCheckoutLocalBranchName] = useState('');\n const [isCheckingOutToLocal, setIsCheckingOutToLocal] = useState(false);\n\n // Reset to commit dialog state\n const [isResetOpen, setIsResetOpen] = useState(false);\n const [resetCommitHash, setResetCommitHash] = useState<string | null>(null);\n const [isResetting, setIsResetting] = useState(false);\n const [isRevertOpen, setIsRevertOpen] = useState(false);\n const [commitToRevert, setCommitToRevert] = useState<{ hash: string; message: string } | null>(null);\n const [isReverting, setIsReverting] = useState(false);\n\n const [isRewordOpen, setIsRewordOpen] = useState(false);\n const [commitToReword, setCommitToReword] = useState<{ hash: string; subject: string; body: string; branch: string } | null>(null);\n const [newMessageSubject, setNewMessageSubject] = useState('');\n const [newMessageBody, setNewMessageBody] = useState('');\n const [isRewording, setIsRewording] = useState(false);\n\n // Ref for GitGraph to scroll to commits\n const gitGraphRef = useRef<GitGraphHandle>(null);\n\n // State for pending scroll to branch commit\n const [pendingScrollCommit, setPendingScrollCommit] = useState<string | null>(null);\n const [selectedBranchRefs, setSelectedBranchRefs] = useState<string[]>([]);\n const [branchSelectionAnchor, setBranchSelectionAnchor] = useState<string | null>(null);\n const [isBranchPopoverOpen, setIsBranchPopoverOpen] = useState(false);\n const branchPopoverRef = useRef<HTMLDivElement>(null);\n const [scriptExecution, setScriptExecution] = useState<ScriptExecutionState>(DEFAULT_SCRIPT_EXECUTION);\n const [isCancelingScriptExecution, setIsCancelingScriptExecution] = useState(false);\n const [isCopyingScriptOutput, setIsCopyingScriptOutput] = useState(false);\n const [didCopyScriptOutput, setDidCopyScriptOutput] = useState(false);\n const isScriptExecutionRunning = scriptExecution.status === 'starting' || scriptExecution.status === 'running';\n const isScriptExecutionFinished = scriptExecution.status === 'completed' || scriptExecution.status === 'failed' || scriptExecution.status === 'canceled';\n\n useEffect(() => {\n if (isScriptExecutionFinished && scriptExecution.executionId) {\n queryClient.invalidateQueries({ queryKey: ['git', repoPath] });\n }\n }, [isScriptExecutionFinished, scriptExecution.executionId, queryClient, repoPath]);\n\n const closeRenameBranchDialog = useCallback(() => {\n setIsRenameOpen(false);\n setBranchToRename(null);\n setRemoteBranchToRename(null);\n setNewBranchNameForRename('');\n setRenameTrackingRemoteBranch(false);\n }, []);\n\n const closeRenameRemoteDialog = useCallback(() => {\n setIsRenameRemoteOpen(false);\n setRemoteToRename(null);\n setNewRemoteNameForRename('');\n }, []);\n\n const closeDeleteRemoteDialog = useCallback(() => {\n setIsDeleteRemoteOpen(false);\n setRemoteToDelete(null);\n }, []);\n\n const closeAddRemoteDialog = useCallback(() => {\n setIsAddRemoteOpen(false);\n setNewRemoteName('origin');\n setNewRemoteUrl('');\n }, []);\n\n const closeRewordDialog = useCallback(() => {\n setIsRewordOpen(false);\n setCommitToReword(null);\n setNewMessageSubject('');\n setNewMessageBody('');\n }, []);\n\n const closeScriptExecutionDialog = useCallback(() => {\n setScriptExecution(DEFAULT_SCRIPT_EXECUTION);\n setDidCopyScriptOutput(false);\n setIsCancelingScriptExecution(false);\n }, []);\n\n const closeTopPopup = useCallback(() => {\n if (isAbortCherryPickOpen) {\n setIsAbortCherryPickOpen(false);\n setCommitsToCherryPick([]);\n return;\n }\n if (isCheckoutToLocalOpen) {\n setIsCheckoutToLocalOpen(false);\n return;\n }\n if (iscreateBranchOpen) {\n setIsCreateBranchOpen(false);\n setCreateBranchFromRef(null);\n return;\n }\n if (isCreateTagOpen) {\n setIsCreateTagOpen(false);\n setCreateTagCommitHash(null);\n setNewTagName('');\n setPushTagToRemote(false);\n return;\n }\n if (isPullOpen) {\n setIsPullOpen(false);\n return;\n }\n if (isPushOpen) {\n setIsPushOpen(false);\n return;\n }\n if (isMergeOpen) {\n closeMergeDialog();\n return;\n }\n if (isRebaseOpen) {\n closeRebaseDialog();\n return;\n }\n if (isRenameOpen) {\n closeRenameBranchDialog();\n return;\n }\n if (isRenameRemoteOpen) {\n closeRenameRemoteDialog();\n return;\n }\n if (isDeleteRemoteOpen) {\n closeDeleteRemoteDialog();\n return;\n }\n if (isAddRemoteOpen) {\n closeAddRemoteDialog();\n return;\n }\n if (isCherryPickOpen) {\n setIsCherryPickOpen(false);\n setCommitsToCherryPick([]);\n return;\n }\n if (isDeleteOpen) {\n setIsDeleteOpen(false);\n setBranchesToDelete([]);\n setDeleteRemoteBranch(false);\n return;\n }\n if (isDeleteWorktreeOpen) {\n setIsDeleteWorktreeOpen(false);\n setWorktreeToDelete(null);\n return;\n }\n if (isDeleteTagOpen) {\n setIsDeleteTagOpen(false);\n setTagToDelete(null);\n setDeleteRemoteTag(false);\n return;\n }\n if (isRewordOpen) {\n closeRewordDialog();\n return;\n }\n if (isResetOpen) {\n setIsResetOpen(false);\n return;\n }\n if (isRevertOpen) {\n setIsRevertOpen(false);\n setCommitToRevert(null);\n return;\n }\n if (isBranchPopoverOpen) {\n setIsBranchPopoverOpen(false);\n return;\n }\n if (scriptExecution.isOpen && isScriptExecutionFinished) {\n closeScriptExecutionDialog();\n }\n }, [\n isAbortCherryPickOpen,\n isCheckoutToLocalOpen,\n iscreateBranchOpen,\n isCreateTagOpen,\n isPullOpen,\n isPushOpen,\n closeMergeDialog,\n isMergeOpen,\n closeRebaseDialog,\n isRebaseOpen,\n isRenameOpen,\n closeRenameBranchDialog,\n isRenameRemoteOpen,\n closeRenameRemoteDialog,\n isDeleteRemoteOpen,\n closeDeleteRemoteDialog,\n isAddRemoteOpen,\n closeAddRemoteDialog,\n isCherryPickOpen,\n isDeleteOpen,\n isDeleteWorktreeOpen,\n isDeleteTagOpen,\n isRewordOpen,\n closeRewordDialog,\n isResetOpen,\n isRevertOpen,\n isBranchPopoverOpen,\n scriptExecution.isOpen,\n isScriptExecutionFinished,\n closeScriptExecutionDialog,\n ]);\n\n const confirmTopPopup = () => {\n if (isAbortCherryPickOpen) {\n if (!isAbortingCherryPick) {\n void handleAbortCherryPick();\n }\n return;\n }\n if (isCheckoutToLocalOpen) {\n if (checkoutLocalBranchName && !isCheckingOutToLocal) {\n void handleCheckoutToLocal();\n }\n return;\n }\n if (iscreateBranchOpen) {\n if (newBranchName && !isCreating) {\n void handleCreateBranch();\n }\n return;\n }\n if (isCreateTagOpen) {\n if (newTagName.trim() && !isCreatingTag) {\n void handleCreateTag();\n }\n return;\n }\n if (isPullOpen) {\n if (!isPulling && pullRemotes.length > 0 && pullSelectedRemote && pullSelectedRemoteBranch) {\n void handlePullFromRemote();\n }\n return;\n }\n if (isPushOpen) {\n if (!isPushing && pushRemotes.length > 0 && pushSelectedRemote && pushSelectedRemoteBranch) {\n void handlePushToRemote();\n }\n return;\n }\n if (isMergeOpen) {\n if (!isMerging) {\n void handleMerge();\n }\n return;\n }\n if (isRebaseOpen) {\n if (!isRebasing) {\n void handleRebase();\n }\n return;\n }\n if (isRenameOpen) {\n const isSameName = remoteBranchToRename\n ? newBranchNameForRename === remoteBranchToRename.branch\n : newBranchNameForRename === branchToRename;\n if (newBranchNameForRename && !isSameName && !isRenaming) {\n void handleRenameBranch();\n }\n return;\n }\n if (isRenameRemoteOpen) {\n const trimmedNewName = newRemoteNameForRename.trim();\n if (\n trimmedNewName &&\n trimmedNewName !== (remoteToRename ?? '').trim() &&\n !isRenamingRemote\n ) {\n void handleRenameRemote();\n }\n return;\n }\n if (isDeleteRemoteOpen) {\n if (remoteToDelete && !isDeletingRemote) {\n void handleDeleteRemote();\n }\n return;\n }\n if (isAddRemoteOpen) {\n if (newRemoteName.trim() && newRemoteUrl.trim() && !isAddingRemote) {\n void handleAddRemote();\n }\n return;\n }\n if (isCherryPickOpen) {\n if (!isCherryPicking) {\n void handleCherryPickCommit();\n }\n return;\n }\n if (isDeleteOpen) {\n if (!isDeleting) {\n void handleDeleteBranch();\n }\n return;\n }\n if (isDeleteWorktreeOpen) {\n if (worktreeToDelete && !isDeletingWorktree) {\n void handleDeleteWorktree();\n }\n return;\n }\n if (isDeleteTagOpen) {\n if (tagToDelete && !isDeletingTag) {\n void handleDeleteTag();\n }\n return;\n }\n if (isRewordOpen) {\n if (newMessageSubject.trim() && !isRewording) {\n void handleReword();\n }\n return;\n }\n if (isResetOpen) {\n if (!isResetting) {\n void handleConfirmReset();\n }\n return;\n }\n if (isRevertOpen) {\n if (!isReverting) {\n void handleConfirmRevert();\n }\n return;\n }\n if (scriptExecution.isOpen && isScriptExecutionFinished) {\n closeScriptExecutionDialog();\n }\n };\n\n const isAnyPopupOpen =\n isResetOpen ||\n isRevertOpen ||\n isRewordOpen ||\n isDeleteOpen ||\n isDeleteWorktreeOpen ||\n isDeleteTagOpen ||\n isAbortCherryPickOpen ||\n isCherryPickOpen ||\n isRenameOpen ||\n isRenameRemoteOpen ||\n isDeleteRemoteOpen ||\n isAddRemoteOpen ||\n isRebaseOpen ||\n isMergeOpen ||\n isPushOpen ||\n isPullOpen ||\n iscreateBranchOpen ||\n isCreateTagOpen ||\n isCheckoutToLocalOpen ||\n isBranchPopoverOpen ||\n scriptExecution.isOpen;\n\n useEscapeDismiss(isAnyPopupOpen, closeTopPopup, confirmTopPopup);\n\n // Resizable bottom panel state - load from global settings or fallback to localStorage\n const panelHeightStorageKey = 'git-web:history-panel-height';\n const commitDetailsMessageRatioStorageKey = 'git-web:history-commit-details-message-ratio';\n const [panelHeight, setPanelHeight] = useState(300);\n const [isResizing, setIsResizing] = useState(false);\n const resizeRef = useRef<{ startY: number; startHeight: number } | null>(null);\n const [commitDetailsMessageRatio, setCommitDetailsMessageRatio] = useState(DEFAULT_COMMIT_DETAILS_MESSAGE_RATIO);\n const [isCommitDetailsRatioResizing, setIsCommitDetailsRatioResizing] = useState(false);\n const commitDetailsContentRef = useRef<HTMLDivElement | null>(null);\n\n // Track if user has manually resized the panel to avoid sync loops\n const userHasResized = useRef(false);\n\n // Load panel height from settings or localStorage\n useEffect(() => {\n if (settings?.historyPanelHeight) {\n setPanelHeight(clampHistoryPanelHeight(settings.historyPanelHeight));\n } else {\n try {\n const stored = localStorage.getItem(panelHeightStorageKey);\n if (stored) {\n const parsed = parseInt(stored, 10);\n if (!isNaN(parsed) && parsed >= MIN_HISTORY_PANEL_HEIGHT && parsed <= MAX_HISTORY_PANEL_HEIGHT) {\n setPanelHeight(parsed);\n }\n }\n } catch (e) {\n console.error('Failed to load panel height from localStorage:', e);\n }\n }\n }, [settings?.historyPanelHeight]);\n\n // Save panel height to localStorage for immediate persistence\n useEffect(() => {\n try {\n localStorage.setItem(panelHeightStorageKey, String(panelHeight));\n } catch (e) {\n console.error('Failed to save panel height to localStorage:', e);\n }\n }, [panelHeight]);\n\n // Load commit details message/diff ratio from localStorage\n useEffect(() => {\n try {\n const stored = localStorage.getItem(commitDetailsMessageRatioStorageKey);\n if (!stored) return;\n const parsed = parseFloat(stored);\n if (!Number.isNaN(parsed)) {\n setCommitDetailsMessageRatio(clampCommitDetailsMessageRatio(parsed));\n }\n } catch (e) {\n console.error('Failed to load commit details ratio from localStorage:', e);\n }\n }, []);\n\n // Persist commit details message/diff ratio in localStorage\n useEffect(() => {\n try {\n localStorage.setItem(commitDetailsMessageRatioStorageKey, String(commitDetailsMessageRatio));\n } catch (e) {\n console.error('Failed to save commit details ratio to localStorage:', e);\n }\n }, [commitDetailsMessageRatio]);\n\n // Sync to global settings when resizing stops\n useEffect(() => {\n if (!isResizing && userHasResized.current) {\n updateSettings.mutate({ historyPanelHeight: panelHeight });\n userHasResized.current = false;\n }\n }, [isResizing, panelHeight, updateSettings]);\n\n // Handle resize drag\n const handleResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setIsResizing(true);\n resizeRef.current = { startY: e.clientY, startHeight: panelHeight };\n }, [panelHeight]);\n\n useEffect(() => {\n if (!isResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizeRef.current) return;\n const delta = resizeRef.current.startY - e.clientY;\n const newHeight = clampHistoryPanelHeight(resizeRef.current.startHeight + delta);\n setPanelHeight(newHeight);\n userHasResized.current = true;\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n resizeRef.current = null;\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isResizing]);\n\n const handleCommitDetailsRatioResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setIsCommitDetailsRatioResizing(true);\n }, []);\n\n useEffect(() => {\n if (!isCommitDetailsRatioResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const container = commitDetailsContentRef.current;\n if (!container) return;\n const rect = container.getBoundingClientRect();\n if (rect.height <= 0) return;\n\n const nextRatio = clampCommitDetailsMessageRatio((e.clientY - rect.top) / rect.height);\n setCommitDetailsMessageRatio(nextRatio);\n };\n\n const handleMouseUp = () => {\n setIsCommitDetailsRatioResizing(false);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = 'ns-resize';\n document.body.style.userSelect = 'none';\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n }, [isCommitDetailsRatioResizing]);\n\n useEffect(() => {\n if (!isBranchPopoverOpen) return;\n\n const handleMouseDown = (event: MouseEvent) => {\n if (branchPopoverRef.current && !branchPopoverRef.current.contains(event.target as Node)) {\n setIsBranchPopoverOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n\n return () => {\n document.removeEventListener('mousedown', handleMouseDown);\n };\n }, [isBranchPopoverOpen]);\n\n // Build branch trees for local and remote branches\n const localBranchTree = useMemo(() => {\n if (!branchData?.branches) return null;\n return buildBranchTree(branchData.branches);\n }, [branchData?.branches]);\n\n const remoteBranchTrees = useMemo(() => {\n if (!branchData?.remotes) return null;\n return buildRemoteBranchTree(branchData.remotes);\n }, [branchData?.remotes]);\n\n const allBranchRefs = useMemo(() => {\n const refs = new Set<string>();\n for (const branch of branchData?.branches ?? []) {\n refs.add(branch);\n }\n for (const [remoteName, branches] of Object.entries(branchData?.remotes ?? {})) {\n for (const branch of branches) {\n refs.add(`remotes/${remoteName}/${branch}`);\n }\n }\n return refs;\n }, [branchData?.branches, branchData?.remotes]);\n\n const selectedBranchSet = useMemo(() => new Set(selectedBranchRefs), [selectedBranchRefs]);\n\n const repository = useRepository(repoPath);\n const updateRepository = useUpdateRepository();\n const customBranchScripts = useMemo(() => {\n const scripts = repository?.customScripts ?? [];\n return scripts.filter((script) => (\n script.target === 'branch' &&\n script.action === 'run-bash-script' &&\n script.name.trim().length > 0 &&\n script.content.trim().length > 0\n ));\n }, [repository?.customScripts]);\n\n // Group expanded state (for \"Branches\", \"Remotes\", and \"Worktrees\" group headers)\n const [localGroupExpanded, setLocalGroupExpanded] = useState(true);\n const [remotesGroupExpanded, setRemotesGroupExpanded] = useState(true);\n const [worktreesGroupExpanded, setWorktreesGroupExpanded] = useState(true);\n\n // Visibility state for branches/folders\n const [visibilityMap, setVisibilityMap] = useState<VisibilityMap>({});\n const [expandedFolders, setExpandedFolders] = useState<Set<string>>(new Set());\n\n const orderedVisibleBranchRefs = useMemo(() => {\n const ordered: string[] = [];\n if (localGroupExpanded && localBranchTree) {\n ordered.push(...collectVisibleBranchRefs(localBranchTree, expandedFolders));\n }\n if (remotesGroupExpanded && remoteBranchTrees) {\n for (const [remoteName, tree] of Array.from(remoteBranchTrees.entries())) {\n const remoteGroupPath = `__remotes__/${remoteName}`;\n if (!expandedFolders.has(remoteGroupPath)) continue;\n ordered.push(...collectVisibleBranchRefs(tree, expandedFolders, `remotes/${remoteName}`));\n }\n }\n return ordered;\n }, [expandedFolders, localBranchTree, localGroupExpanded, remoteBranchTrees, remotesGroupExpanded]);\n\n useEffect(() => {\n if (selectedBranchRefs.length === 0) return;\n const nextSelected = selectedBranchRefs.filter((branch) => allBranchRefs.has(branch));\n if (nextSelected.length !== selectedBranchRefs.length) {\n setSelectedBranchRefs(nextSelected);\n }\n if (branchSelectionAnchor && !allBranchRefs.has(branchSelectionAnchor)) {\n setBranchSelectionAnchor(nextSelected.length > 0 ? nextSelected[nextSelected.length - 1] : null);\n }\n }, [allBranchRefs, branchSelectionAnchor, selectedBranchRefs]);\n\n // Load settings from repository data when it's available\n const lastInitializedRepo = useRef<string | null>(null);\n useEffect(() => {\n if (repository && repository.path !== lastInitializedRepo.current) {\n lastInitializedRepo.current = repository.path;\n if (repository.localGroupExpanded !== undefined) setLocalGroupExpanded(repository.localGroupExpanded);\n if (repository.remotesGroupExpanded !== undefined) setRemotesGroupExpanded(repository.remotesGroupExpanded);\n if (repository.worktreesGroupExpanded !== undefined) setWorktreesGroupExpanded(repository.worktreesGroupExpanded);\n if (repository.expandedFolders) setExpandedFolders(new Set(repository.expandedFolders));\n if (repository.visibilityMap) setVisibilityMap(repository.visibilityMap as VisibilityMap);\n }\n }, [repository]);\n\n // Helper to save settings to the backend\n const saveSettings = useCallback((updates: Partial<Repository>) => {\n updateRepository.mutate({\n path: repoPath,\n updates\n });\n }, [repoPath, updateRepository]);\n\n const handleToggleLocalGroup = useCallback(() => {\n const newValue = !localGroupExpanded;\n setLocalGroupExpanded(newValue);\n saveSettings({ localGroupExpanded: newValue });\n }, [localGroupExpanded, saveSettings]);\n\n const handleToggleRemotesGroup = useCallback(() => {\n const newValue = !remotesGroupExpanded;\n setRemotesGroupExpanded(newValue);\n saveSettings({ remotesGroupExpanded: newValue });\n }, [remotesGroupExpanded, saveSettings]);\n\n const handleToggleWorktreesGroup = useCallback(() => {\n const newValue = !worktreesGroupExpanded;\n setWorktreesGroupExpanded(newValue);\n saveSettings({ worktreesGroupExpanded: newValue });\n }, [saveSettings, worktreesGroupExpanded]);\n\n // Toggle folder expansion\n const toggleFolder = useCallback((path: string) => {\n setExpandedFolders(prev => {\n const next = new Set(prev);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n saveSettings({ expandedFolders: Array.from(next) });\n return next;\n });\n }, [saveSettings]);\n\n // Toggle visibility for a path\n const handleToggleVisibility = useCallback((path: string, type: 'visible' | 'hidden') => {\n setVisibilityMap(prev => {\n const next = { ...prev };\n // If currently set to this type, remove it (toggle off)\n if (next[path] === type) {\n delete next[path];\n } else {\n // Set to this type (auto-removes the other one since we're replacing)\n next[path] = type;\n }\n const persistedVisibilityMap: Record<string, 'visible' | 'hidden'> = {};\n Object.entries(next).forEach(([key, value]) => {\n if (value === 'visible' || value === 'hidden') {\n persistedVisibilityMap[key] = value;\n }\n });\n saveSettings({ visibilityMap: persistedVisibilityMap });\n return next;\n });\n }, [saveSettings]);\n\n // Clear all visibility filters\n const handleClearAllFilters = useCallback(() => {\n setVisibilityMap({});\n saveSettings({ visibilityMap: {} });\n }, [saveSettings]);\n\n // Helper to get effective visibility for a branch considering group paths\n const getBranchEffectiveVisibility = useCallback((branch: string, isRemoteBranch: boolean) => {\n // First check the branch itself\n const directVis = getEffectiveVisibility(branch, visibilityMap);\n if (directVis) return directVis;\n\n // Check group-level visibility\n if (isRemoteBranch) {\n // Remote branch format: remotes/origin/branch-name\n const parts = branch.split('/');\n if (parts.length >= 2 && parts[0] === 'remotes') {\n const remoteName = parts[1];\n // Check remote-specific group\n const remoteGroupVis = visibilityMap[`__remotes__/${remoteName}`];\n if (remoteGroupVis) return remoteGroupVis;\n // Check all remotes group\n const remotesVis = visibilityMap['__remotes__'];\n if (remotesVis) return remotesVis;\n }\n } else {\n // Local branch - check __local__ group\n const localVis = visibilityMap['__local__'];\n if (localVis) return localVis;\n }\n\n return null;\n }, [visibilityMap]);\n\n // Compute which branches should be visible based on visibility map\n const filteredCommits = useMemo(() => {\n if (!log?.all || !branchData?.branches || !branchData?.branchCommits) return log?.all || [];\n\n const hasVisibleMarkers = Object.values(visibilityMap).some(v => v === 'visible');\n const hasHiddenMarkers = Object.values(visibilityMap).some(v => v === 'hidden');\n\n // If no visibility markers are set, show all commits\n if (!hasVisibleMarkers && !hasHiddenMarkers) {\n return log.all;\n }\n\n // Get all branches (local + remote)\n const allBranches: { branch: string; isRemote: boolean }[] = [\n ...branchData.branches.map(b => ({ branch: b, isRemote: false })),\n ];\n\n // Add remote branches\n if (branchData.remotes) {\n for (const [remoteName, branches] of Object.entries(branchData.remotes)) {\n for (const branch of branches) {\n allBranches.push({ branch: `remotes/${remoteName}/${branch}`, isRemote: true });\n }\n }\n }\n\n // Calculate effective visibility for each branch\n const visibleBranches = new Set<string>();\n const hiddenBranchesSet = new Set<string>();\n const nonHiddenBranches = new Set<string>(); // Branches that are not hidden (for hidden-only mode)\n\n for (const { branch, isRemote } of allBranches) {\n const effectiveVis = getBranchEffectiveVisibility(branch, isRemote);\n if (effectiveVis === 'visible') {\n visibleBranches.add(branch);\n } else if (effectiveVis === 'hidden') {\n hiddenBranchesSet.add(branch);\n } else {\n // No visibility set - this branch is \"neutral\" (non-hidden)\n nonHiddenBranches.add(branch);\n }\n }\n\n // Build a map from commit hash to commit for quick lookup\n const commitMap = new Map(log.all.map(c => [c.hash, c]));\n\n // Helper to mark all ancestors as reachable\n const markReachable = (startHash: string, reachableSet: Set<string>) => {\n const stack = [startHash];\n while (stack.length > 0) {\n const hash = stack.pop()!;\n if (reachableSet.has(hash)) continue;\n\n const commit = commitMap.get(hash);\n if (!commit) continue;\n\n reachableSet.add(hash);\n\n // Add parents to process\n for (const parentHash of commit.parents || []) {\n if (!reachableSet.has(parentHash)) {\n stack.push(parentHash);\n }\n }\n }\n };\n\n // Find commits reachable from visible branches\n const reachableFromVisible = new Set<string>();\n for (const branch of visibleBranches) {\n const headHash = branchData.branchCommits[branch];\n if (headHash) {\n markReachable(headHash, reachableFromVisible);\n }\n }\n\n // If there are visible markers, only show commits reachable from visible branches\n if (hasVisibleMarkers) {\n return log.all.filter(commit => reachableFromVisible.has(commit.hash));\n }\n\n // If only hidden markers exist, show commits reachable from any non-hidden branch\n // A commit should only be hidden if it's EXCLUSIVELY reachable from hidden branches\n if (hasHiddenMarkers) {\n const reachableFromNonHidden = new Set<string>();\n for (const branch of nonHiddenBranches) {\n const headHash = branchData.branchCommits[branch];\n if (headHash) {\n markReachable(headHash, reachableFromNonHidden);\n }\n }\n\n return log.all.filter(commit => reachableFromNonHidden.has(commit.hash));\n }\n\n return log.all;\n }, [log?.all, branchData?.branches, branchData?.branchCommits, branchData?.remotes, visibilityMap, getBranchEffectiveVisibility]);\n\n const selectedCommitHashSet = useMemo(() => new Set(selectedCommitHashes), [selectedCommitHashes]);\n const filteredCommitHashes = useMemo(() => filteredCommits.map((commit) => commit.hash), [filteredCommits]);\n const selectedCommit = useMemo(\n () => (selectedHash ? log?.all.find((commit) => commit.hash === selectedHash) : null),\n [log?.all, selectedHash]\n );\n const selectedCommitRange = useMemo(() => {\n if (!log?.all || selectedCommitHashes.length < 2) return null;\n\n const commitMap = new Map(log.all.map((commit) => [commit.hash, commit]));\n const filteredOrderMap = new Map(filteredCommitHashes.map((hash, index) => [hash, index]));\n const orderedSelection = Array.from(new Set(selectedCommitHashes))\n .filter((hash) => filteredOrderMap.has(hash))\n .sort((a, b) => (filteredOrderMap.get(a) ?? Number.MAX_SAFE_INTEGER) - (filteredOrderMap.get(b) ?? Number.MAX_SAFE_INTEGER));\n\n if (orderedSelection.length < 2) return null;\n\n const latestHash = orderedSelection[0];\n const oldestHash = orderedSelection[orderedSelection.length - 1];\n const latestCommit = commitMap.get(latestHash);\n const oldestCommit = commitMap.get(oldestHash);\n\n if (!latestCommit || !oldestCommit) return null;\n\n return { latestHash, oldestHash, latestCommit, oldestCommit };\n }, [filteredCommitHashes, log?.all, selectedCommitHashes]);\n const isCommitRangeSelection = !!selectedCommitRange;\n\n useEffect(() => {\n if (filteredCommitHashes.length === 0) {\n if (selectedHash || selectedCommitHashes.length > 0 || selectionAnchorHash) {\n selectSingleCommit(null);\n }\n return;\n }\n\n const filteredHashSet = new Set(filteredCommitHashes);\n const nextSelected = selectedCommitHashes.filter((hash) => filteredHashSet.has(hash));\n\n if (nextSelected.length !== selectedCommitHashes.length) {\n setSelectedCommitHashes(nextSelected);\n }\n\n if (selectedHash && !filteredHashSet.has(selectedHash)) {\n setSelectedHash(nextSelected.length > 0 ? nextSelected[nextSelected.length - 1] : null);\n }\n\n if (selectionAnchorHash && !filteredHashSet.has(selectionAnchorHash)) {\n setSelectionAnchorHash(nextSelected.length > 0 ? nextSelected[nextSelected.length - 1] : null);\n }\n }, [filteredCommitHashes, selectedHash, selectedCommitHashes, selectionAnchorHash, selectSingleCommit]);\n\n const handleSelectCommit = useCallback((hash: string, modifiers?: CommitRowSelectModifiers) => {\n const isRangeSelect = modifiers?.isRangeSelect ?? false;\n const isMultiSelect = modifiers?.isMultiSelect ?? false;\n\n if (isRangeSelect) {\n const anchor = selectionAnchorHash ?? selectedHash ?? hash;\n const anchorIndex = filteredCommitHashes.indexOf(anchor);\n const targetIndex = filteredCommitHashes.indexOf(hash);\n\n if (anchorIndex !== -1 && targetIndex !== -1) {\n const [start, end] = anchorIndex < targetIndex ? [anchorIndex, targetIndex] : [targetIndex, anchorIndex];\n const rangeSelection = filteredCommitHashes.slice(start, end + 1);\n setSelectedCommitHashes(rangeSelection);\n setSelectedHash(hash);\n setSelectionAnchorHash(anchor);\n return;\n }\n }\n\n if (isMultiSelect) {\n if (selectedCommitHashSet.has(hash)) {\n const nextSelected = selectedCommitHashes.filter((selected) => selected !== hash);\n setSelectedCommitHashes(nextSelected);\n setSelectedHash((prev) => {\n if (prev !== hash) return prev;\n return nextSelected.length > 0 ? nextSelected[nextSelected.length - 1] : null;\n });\n if (selectionAnchorHash === hash) {\n setSelectionAnchorHash(nextSelected.length > 0 ? nextSelected[nextSelected.length - 1] : null);\n }\n } else {\n setSelectedCommitHashes([...selectedCommitHashes, hash]);\n setSelectedHash(hash);\n setSelectionAnchorHash(hash);\n }\n return;\n }\n\n selectSingleCommit(hash);\n }, [filteredCommitHashes, selectedCommitHashSet, selectedCommitHashes, selectedHash, selectionAnchorHash, selectSingleCommit]);\n\n const selectedCommitsForCherryPick = useMemo(\n () => filteredCommits.filter((commit) => selectedCommitHashSet.has(commit.hash)).reverse(),\n [filteredCommits, selectedCommitHashSet]\n );\n\n // Check if visibility filters are active\n const hasVisibilityFilters = useMemo(() => {\n return Object.values(visibilityMap).some(v => v === 'visible' || v === 'hidden');\n }, [visibilityMap]);\n\n // Compute hidden branches set for filtering branch tags in git graph\n const hiddenBranches = useMemo(() => {\n const hidden = new Set<string>();\n\n // Check local branches\n if (branchData?.branches) {\n for (const branch of branchData.branches) {\n const effectiveVis = getBranchEffectiveVisibility(branch, false);\n if (effectiveVis === 'hidden') {\n hidden.add(branch);\n }\n }\n }\n\n // Check remote branches\n if (branchData?.remotes) {\n for (const [remoteName, branches] of Object.entries(branchData.remotes)) {\n for (const branch of branches) {\n const fullRef = `remotes/${remoteName}/${branch}`;\n const effectiveVis = getBranchEffectiveVisibility(fullRef, true);\n if (effectiveVis === 'hidden') {\n hidden.add(fullRef);\n }\n }\n }\n }\n\n return hidden;\n }, [branchData?.branches, branchData?.remotes, getBranchEffectiveVisibility]);\n\n // Auto-fetch more commits when filtered results are too few\n const MIN_FILTERED_COMMITS = 50;\n const MAX_AUTO_FETCH_LIMIT = 5000;\n\n useEffect(() => {\n if (\n hasVisibilityFilters &&\n filteredCommits.length < MIN_FILTERED_COMMITS &&\n !isFetching &&\n limit < MAX_AUTO_FETCH_LIMIT &&\n log?.all && log.all.length >= limit\n ) {\n // Fetch more commits - increase limit by 100\n setLimit(l => Math.min(l + 100, MAX_AUTO_FETCH_LIMIT));\n }\n }, [hasVisibilityFilters, filteredCommits.length, isFetching, limit, log?.all]);\n\n // Handle scrolling to branch commit when it's loaded\n useEffect(() => {\n if (!pendingScrollCommit || !log?.all || isFetching) return;\n\n // Check if commit exists in current loaded commits\n const commitExists = log.all.some(c => c.hash === pendingScrollCommit);\n\n if (commitExists) {\n // Use requestAnimationFrame to ensure DOM is updated\n requestAnimationFrame(() => {\n const scrolled = gitGraphRef.current?.scrollToCommit(pendingScrollCommit);\n if (scrolled) {\n selectSingleCommit(pendingScrollCommit);\n setPendingScrollCommit(null);\n }\n });\n } else {\n // Need to load more commits - increase limit\n // Set a reasonable max limit to avoid infinite loading\n if (limit < 5000) {\n setLimit(l => l + 100);\n } else {\n // Give up after 5000 commits\n console.warn('Could not find commit after loading 5000 commits');\n setPendingScrollCommit(null);\n }\n }\n }, [pendingScrollCommit, log?.all, isFetching, limit, selectSingleCommit]);\n\n const scrollToBranchHeadCommit = useCallback((branch: string) => {\n if (!branchData?.branchCommits) return;\n\n const commitHash = branchData.branchCommits[branch];\n if (!commitHash) return;\n\n const commitExists = log?.all?.some(c => c.hash === commitHash);\n if (commitExists && gitGraphRef.current) {\n const scrolled = gitGraphRef.current.scrollToCommit(commitHash);\n if (scrolled) {\n selectSingleCommit(commitHash);\n return;\n }\n }\n\n setPendingScrollCommit(commitHash);\n selectSingleCommit(commitHash);\n }, [branchData?.branchCommits, log?.all, selectSingleCommit]);\n\n useEffect(() => {\n if (!requestedBranchFromQuery || !branchData?.branchCommits) return;\n if (activeBranchFromData !== requestedBranchFromQuery) return;\n\n const requestKey = `${repoPath}:${requestedBranchFromQuery}`;\n if (initialBranchHeadSelectionAttemptKeyRef.current === requestKey) return;\n\n initialBranchHeadSelectionAttemptKeyRef.current = requestKey;\n scrollToBranchHeadCommit(requestedBranchFromQuery);\n }, [activeBranchFromData, branchData?.branchCommits, repoPath, requestedBranchFromQuery, scrollToBranchHeadCommit]);\n\n const handleBranchClick = useCallback((branch: string, modifiers?: BranchRowSelectModifiers) => {\n const isRangeSelect = modifiers?.isRangeSelect ?? false;\n const isMultiSelect = modifiers?.isMultiSelect ?? false;\n\n if (isRangeSelect) {\n const anchor = branchSelectionAnchor ?? branch;\n const anchorIndex = orderedVisibleBranchRefs.indexOf(anchor);\n const targetIndex = orderedVisibleBranchRefs.indexOf(branch);\n if (anchorIndex !== -1 && targetIndex !== -1) {\n const [start, end] = anchorIndex < targetIndex ? [anchorIndex, targetIndex] : [targetIndex, anchorIndex];\n const rangeSelection = orderedVisibleBranchRefs.slice(start, end + 1);\n const shouldUnselect = selectedBranchSet.has(branch);\n if (shouldUnselect) {\n setSelectedBranchRefs(selectedBranchRefs.filter((selected) => !rangeSelection.includes(selected)));\n } else {\n setSelectedBranchRefs(Array.from(new Set([...selectedBranchRefs, ...rangeSelection])));\n }\n setBranchSelectionAnchor(anchor);\n } else {\n setSelectedBranchRefs([branch]);\n setBranchSelectionAnchor(branch);\n }\n return;\n }\n\n if (isMultiSelect) {\n if (selectedBranchSet.has(branch)) {\n const nextSelected = selectedBranchRefs.filter((selected) => selected !== branch);\n setSelectedBranchRefs(nextSelected);\n } else {\n setSelectedBranchRefs([...selectedBranchRefs, branch]);\n }\n setBranchSelectionAnchor(branch);\n return;\n }\n\n setSelectedBranchRefs([branch]);\n setBranchSelectionAnchor(branch);\n scrollToBranchHeadCommit(branch);\n }, [branchSelectionAnchor, orderedVisibleBranchRefs, scrollToBranchHeadCommit, selectedBranchRefs, selectedBranchSet]);\n\n const handleBranchContextMenu = useCallback((branch: string) => {\n if (selectedBranchSet.has(branch)) return;\n setSelectedBranchRefs([branch]);\n setBranchSelectionAnchor(branch);\n }, [selectedBranchSet]);\n\n const handleRunCustomScript = useCallback(async (script: RepositoryCustomScript, branchRef: string) => {\n setDidCopyScriptOutput(false);\n setIsCancelingScriptExecution(false);\n setScriptExecution({\n isOpen: true,\n executionId: null,\n scriptName: script.name,\n branchRef,\n output: '',\n status: 'starting',\n error: null,\n });\n\n try {\n const response = await fetch('/api/custom-scripts', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n command: 'start',\n repoPath,\n branchRef,\n scriptContent: script.content,\n }),\n });\n\n const result = await response.json();\n if (!response.ok) {\n throw new Error(result.error || 'Failed to start script execution');\n }\n\n const prelude: string[] = [];\n if (result.previousBranch && result.checkedOutBranch && result.previousBranch !== result.checkedOutBranch) {\n prelude.push(`[info] Checked out ${result.checkedOutBranch} (from ${result.previousBranch})`);\n }\n\n setScriptExecution((prev) => ({\n ...prev,\n executionId: result.executionId,\n output: [prelude.join('\\n'), result.output].filter(Boolean).join('\\n'),\n status: result.status as ScriptExecutionStatus,\n error: null,\n }));\n } catch (error) {\n setScriptExecution((prev) => ({\n ...prev,\n status: 'failed',\n error: (error as Error).message,\n output: prev.output\n ? `${prev.output}\\n[error] ${(error as Error).message}`\n : `[error] ${(error as Error).message}`,\n }));\n }\n }, [repoPath]);\n\n const handleCancelCustomScriptExecution = useCallback(async () => {\n if (!scriptExecution.executionId || !isScriptExecutionRunning) return;\n\n setIsCancelingScriptExecution(true);\n try {\n const response = await fetch('/api/custom-scripts', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n command: 'cancel',\n executionId: scriptExecution.executionId,\n }),\n });\n const result = await response.json();\n if (!response.ok) {\n throw new Error(result.error || 'Failed to cancel script execution');\n }\n\n setScriptExecution((prev) => ({\n ...prev,\n output: result.output,\n status: result.status as ScriptExecutionStatus,\n }));\n\n if (result.status !== 'running' && result.status !== 'starting') {\n setIsCancelingScriptExecution(false);\n }\n } catch (error) {\n setScriptExecution((prev) => ({\n ...prev,\n output: `${prev.output}\\n[error] ${(error as Error).message}`,\n }));\n setIsCancelingScriptExecution(false);\n }\n }, [scriptExecution.executionId, isScriptExecutionRunning]);\n\n const handleCopyCustomScriptOutput = useCallback(async () => {\n if (isCopyingScriptOutput) return;\n\n setIsCopyingScriptOutput(true);\n const copied = await copyText(scriptExecution.output);\n setIsCopyingScriptOutput(false);\n setDidCopyScriptOutput(copied);\n if (copied) {\n setTimeout(() => setDidCopyScriptOutput(false), 1500);\n }\n }, [isCopyingScriptOutput, scriptExecution.output]);\n\n useEffect(() => {\n if (!scriptExecution.executionId || !isScriptExecutionRunning) return;\n\n let disposed = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n\n const poll = async () => {\n try {\n const response = await fetch('/api/custom-scripts', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n command: 'status',\n executionId: scriptExecution.executionId,\n }),\n });\n const result = await response.json();\n\n if (!response.ok) {\n throw new Error(result.error || 'Failed to fetch script execution output');\n }\n\n if (disposed) return;\n\n const nextStatus = result.status as ScriptExecutionStatus;\n setScriptExecution((prev) => {\n if (prev.executionId !== result.executionId) return prev;\n return {\n ...prev,\n output: result.output,\n status: nextStatus,\n error: null,\n };\n });\n\n if (nextStatus === 'running') {\n pollTimer = setTimeout(poll, 450);\n } else {\n setIsCancelingScriptExecution(false);\n }\n } catch (error) {\n if (disposed) return;\n setIsCancelingScriptExecution(false);\n setScriptExecution((prev) => ({\n ...prev,\n status: 'failed',\n error: (error as Error).message,\n output: prev.output\n ? `${prev.output}\\n[error] ${(error as Error).message}`\n : `[error] ${(error as Error).message}`,\n }));\n }\n };\n\n void poll();\n\n return () => {\n disposed = true;\n if (pollTimer) {\n clearTimeout(pollTimer);\n }\n };\n }, [scriptExecution.executionId, isScriptExecutionRunning]);\n\n const confirmDeleteBranches = (branches: string[]) => {\n const deletableBranches = branches.filter((branch) => branch !== currentBranch);\n if (deletableBranches.length === 0) return;\n setBranchesToDelete(deletableBranches);\n setDeleteRemoteBranch(false);\n setIsDeleteOpen(true);\n };\n\n const confirmDeleteBranch = (branch: string) => {\n confirmDeleteBranches([branch]);\n };\n\n const confirmDeleteWorktree = useCallback((path: string) => {\n const targetPath = path.trim();\n if (!targetPath) return;\n setWorktreeToDelete(targetPath);\n setIsDeleteWorktreeOpen(true);\n }, []);\n\n const closeDeleteTagDialog = useCallback(() => {\n setIsDeleteTagOpen(false);\n setTagToDelete(null);\n setDeleteRemoteTag(false);\n }, []);\n\n const confirmDeleteTag = useCallback((tagName: string) => {\n if (!tagName) return;\n setTagToDelete(tagName);\n setDeleteRemoteTag(false);\n setIsDeleteTagOpen(true);\n }, []);\n\n const handleDeleteBranch = async () => {\n if (branchesToDelete.length === 0) return;\n setIsDeleting(true);\n try {\n const deleteRequests = new Map<string, { branchRef: string; run: () => Promise<unknown> }>();\n const addDeleteRequest = (key: string, branchRef: string, run: () => Promise<unknown>) => {\n if (deleteRequests.has(key)) return;\n deleteRequests.set(key, { branchRef, run });\n };\n\n const trackingRemotesToDelete = new Set<string>();\n if (deleteRemoteBranch) {\n for (const branchRef of branchesToDelete) {\n if (branchRef.startsWith('remotes/')) continue;\n const tracking = branchData?.trackingInfo?.[branchRef];\n if (tracking?.upstream) {\n trackingRemotesToDelete.add(tracking.upstream);\n }\n }\n }\n\n for (const upstream of trackingRemotesToDelete) {\n const [remote, ...branchParts] = upstream.split('/');\n const branch = branchParts.join('/');\n if (remote && branch) {\n const branchRef = `${remote}/${branch}`;\n addDeleteRequest(`remote:${branchRef}`, branchRef, () =>\n runGitAction({\n repoPath,\n action: 'delete-remote-branch',\n data: { remote, branch },\n suppressErrorToast: true,\n })\n );\n }\n }\n\n for (const branchRef of branchesToDelete) {\n if (branchRef.startsWith('remotes/')) {\n const parts = branchRef.split('/');\n if (parts.length >= 3) {\n const remote = parts[1];\n const branch = parts.slice(2).join('/');\n const remoteBranchRef = `${remote}/${branch}`;\n addDeleteRequest(`remote:${remoteBranchRef}`, remoteBranchRef, () =>\n runGitAction({\n repoPath,\n action: 'delete-remote-branch',\n data: { remote, branch },\n suppressErrorToast: true,\n })\n );\n }\n continue;\n }\n\n addDeleteRequest(`local:${branchRef}`, branchRef, () =>\n runGitAction({\n repoPath,\n action: 'delete-branch',\n data: { branch: branchRef },\n suppressErrorToast: true,\n })\n );\n }\n\n const requests = Array.from(deleteRequests.values());\n const results = await Promise.allSettled(requests.map((request) => request.run()));\n const failedBranches = results.flatMap((result, index) => {\n if (result.status === 'fulfilled') return [];\n const failedBranch = requests[index].branchRef;\n console.error(`Failed to delete branch \"${failedBranch}\":`, result.reason);\n return [failedBranch];\n });\n\n if (failedBranches.length > 0) {\n toast({\n type: 'error',\n title: failedBranches.length === 1\n ? 'Failed to Delete 1 Branch'\n : `Failed to Delete ${failedBranches.length} Branches`,\n description: (\n <div>\n <div>The following branches could not be deleted:</div>\n <ul className=\"mt-1 max-h-40 overflow-y-auto list-disc pl-5\">\n {failedBranches.map((branch) => (\n <li key={branch} className=\"break-all\">{branch}</li>\n ))}\n </ul>\n </div>\n ),\n duration: 10000,\n });\n }\n\n setIsDeleteOpen(false);\n setBranchesToDelete([]);\n setDeleteRemoteBranch(false);\n setSelectedBranchRefs([]);\n setBranchSelectionAnchor(null);\n } catch (e) {\n console.error(e);\n } finally {\n setIsDeleting(false);\n }\n };\n\n const handleDeleteTag = async () => {\n if (!tagToDelete) return;\n setIsDeletingTag(true);\n try {\n await runGitAction({\n repoPath,\n action: 'delete-tag',\n data: { tag: tagToDelete },\n });\n\n if (deleteRemoteTag && remoteNameForTagDelete) {\n try {\n await runGitAction({\n repoPath,\n action: 'delete-remote-tag',\n data: { remote: remoteNameForTagDelete, tag: tagToDelete },\n });\n } catch (error) {\n console.error('Failed to delete remote tag:', error);\n }\n }\n\n closeDeleteTagDialog();\n } catch (e) {\n console.error(e);\n } finally {\n setIsDeletingTag(false);\n }\n };\n\n const handleDeleteWorktree = async () => {\n if (!worktreeToDelete) return;\n\n setIsDeletingWorktree(true);\n try {\n await runGitAction({\n repoPath,\n action: 'delete-worktree',\n data: { path: worktreeToDelete },\n });\n setIsDeleteWorktreeOpen(false);\n setWorktreeToDelete(null);\n } catch (e) {\n console.error(e);\n } finally {\n setIsDeletingWorktree(false);\n }\n };\n\n const confirmRenameBranch = (branch: string) => {\n setBranchToRename(branch);\n setRemoteBranchToRename(null);\n // Pre-fill with current branch name\n setNewBranchNameForRename(branch);\n setRenameTrackingRemoteBranch(false);\n setIsRenameOpen(true);\n }\n\n const confirmRenameRemoteBranch = (fullRemoteBranch: string) => {\n const parts = fullRemoteBranch.split('/');\n if (parts.length < 3 || parts[0] !== 'remotes') return;\n\n const remote = parts[1];\n const branch = parts.slice(2).join('/');\n if (!remote || !branch) return;\n\n setBranchToRename(fullRemoteBranch);\n setRemoteBranchToRename({ remote, branch });\n setNewBranchNameForRename(branch);\n setRenameTrackingRemoteBranch(false);\n setIsRenameOpen(true);\n }\n\n const confirmRenameRemote = (remote: string) => {\n setRemoteToRename(remote);\n setNewRemoteNameForRename(remote);\n setIsRenameRemoteOpen(true);\n }\n\n const confirmDeleteRemote = (remote: string) => {\n if (!remote) return;\n setRemoteToDelete(remote);\n setIsDeleteRemoteOpen(true);\n }\n\n const confirmAddRemote = () => {\n setNewRemoteName('origin');\n setNewRemoteUrl('');\n setIsAddRemoteOpen(true);\n }\n\n const handleRenameBranch = async () => {\n if (!branchToRename || !newBranchNameForRename) return;\n const isSameName = remoteBranchToRename\n ? remoteBranchToRename.branch === newBranchNameForRename\n : branchToRename === newBranchNameForRename;\n\n if (isSameName) {\n closeRenameBranchDialog();\n return;\n }\n setIsRenaming(true);\n try {\n if (remoteBranchToRename) {\n await runGitAction({\n repoPath,\n action: 'rename-remote-branch',\n data: {\n remote: remoteBranchToRename.remote,\n oldName: remoteBranchToRename.branch,\n newName: newBranchNameForRename,\n }\n });\n } else {\n await runGitAction({\n repoPath,\n action: 'rename-branch',\n data: {\n oldName: branchToRename,\n newName: newBranchNameForRename,\n renameTrackingRemote: renameTrackingRemoteBranch,\n }\n });\n }\n closeRenameBranchDialog();\n } catch (e) {\n console.error(e);\n } finally {\n setIsRenaming(false);\n }\n }\n\n const handleRenameRemote = async () => {\n if (!remoteToRename) return;\n const trimmedOldName = remoteToRename.trim();\n const trimmedNewName = newRemoteNameForRename.trim();\n if (!trimmedOldName || !trimmedNewName) return;\n\n if (trimmedOldName === trimmedNewName) {\n closeRenameRemoteDialog();\n return;\n }\n\n setIsRenamingRemote(true);\n try {\n await runGitAction({\n repoPath,\n action: 'rename-remote',\n data: {\n oldName: trimmedOldName,\n newName: trimmedNewName,\n },\n });\n closeRenameRemoteDialog();\n } catch (e) {\n console.error(e);\n } finally {\n setIsRenamingRemote(false);\n }\n }\n\n const handleDeleteRemote = async () => {\n if (!remoteToDelete) return;\n const trimmedRemoteName = remoteToDelete.trim();\n if (!trimmedRemoteName) return;\n\n setIsDeletingRemote(true);\n try {\n await runGitAction({\n repoPath,\n action: 'delete-remote',\n data: {\n name: trimmedRemoteName,\n },\n });\n closeDeleteRemoteDialog();\n } catch (e) {\n console.error(e);\n } finally {\n setIsDeletingRemote(false);\n }\n }\n\n const handleAddRemote = async () => {\n const trimmedName = newRemoteName.trim();\n const trimmedUrl = newRemoteUrl.trim();\n if (!trimmedName || !trimmedUrl) return;\n\n setIsAddingRemote(true);\n try {\n await runGitAction({\n repoPath,\n action: 'add-remote',\n data: {\n name: trimmedName,\n url: trimmedUrl,\n },\n });\n closeAddRemoteDialog();\n } catch (e) {\n console.error(e);\n } finally {\n setIsAddingRemote(false);\n }\n }\n\n const confirmRebase = ({ sourceBranch, targetBranch }: BranchOperation) => {\n setRebaseSourceBranch(sourceBranch);\n setRebaseTargetBranch(targetBranch);\n setRebaseStashChanges(true);\n setRebaseConflictStatus('checking');\n setIsRebaseOpen(true);\n }\n\n const handleRebase = async () => {\n if (!rebaseSourceBranch || !rebaseTargetBranch) return;\n setIsRebasing(true);\n try {\n await runGitAction({\n repoPath,\n action: 'checkout',\n data: { branch: rebaseSourceBranch }\n });\n\n await runGitAction({\n repoPath,\n action: 'rebase',\n data: { ontoBranch: rebaseTargetBranch, stashChanges: rebaseStashChanges }\n });\n closeRebaseDialog();\n } catch (e) {\n if (isMergeOrRebaseConflictError(e)) {\n closeRebaseDialog();\n toast({\n type: 'warning',\n title: 'Rebase Conflict Detected',\n description: 'Rebase conflict detected in the background. Please resolve via CLI since the conflicts tab has been removed.',\n duration: 12000,\n });\n }\n console.error(e);\n } finally {\n setIsRebasing(false);\n }\n }\n\n useEffect(() => {\n const sourceBranch = rebaseSourceBranch;\n const ontoBranch = rebaseTargetBranch;\n\n if (!isRebaseOpen || !sourceBranch || !ontoBranch) {\n return;\n }\n\n let cancelled = false;\n setRebaseConflictStatus('checking');\n\n const checkRebaseConflicts = async () => {\n try {\n const result = await runGitAction({\n repoPath,\n action: 'check-rebase-conflicts',\n data: {\n sourceBranch,\n ontoBranch,\n },\n });\n\n if (!cancelled) {\n setRebaseConflictStatus(result.hasConflicts ? 'has-conflicts' : 'no-conflict');\n }\n } catch (e) {\n console.error(e);\n if (!cancelled) {\n // Be conservative when the check cannot be completed.\n setRebaseConflictStatus('has-conflicts');\n }\n }\n };\n\n void checkRebaseConflicts();\n\n return () => {\n cancelled = true;\n };\n }, [isRebaseOpen, rebaseSourceBranch, rebaseTargetBranch, repoPath, runGitAction]);\n\n const confirmMerge = ({ sourceBranch, targetBranch }: BranchOperation) => {\n setMergeTargetBranch(targetBranch);\n setMergeSourceBranch(sourceBranch);\n setMergeRebaseBeforeMerge(false);\n setMergeSquash(false);\n setMergeFastForward(false);\n setMergeSquashMessage('');\n setMergeConflictStatus('checking');\n setIsMergeOpen(true);\n }\n\n const handleMergeSquashToggle = useCallback((enabled: boolean) => {\n setMergeSquash(enabled);\n\n if (!enabled) {\n return;\n }\n\n if (!mergeSourceBranch) {\n setMergeSquashMessage('');\n return;\n }\n\n void (async () => {\n try {\n const result = await runGitAction({\n repoPath,\n action: 'get-latest-commit-message',\n data: { branch: mergeSourceBranch },\n });\n setMergeSquashMessage(typeof result?.message === 'string' ? result.message : '');\n } catch (e) {\n console.error(e);\n setMergeSquashMessage('');\n }\n })();\n }, [mergeSourceBranch, repoPath, runGitAction]);\n\n const handleMerge = async () => {\n if (!mergeTargetBranch || !mergeSourceBranch) return;\n setIsMerging(true);\n try {\n await runGitAction({\n repoPath,\n action: 'checkout',\n data: { branch: mergeTargetBranch }\n });\n\n await runGitAction({\n repoPath,\n action: 'merge',\n data: {\n targetBranch: mergeSourceBranch,\n rebaseBeforeMerge: mergeRebaseBeforeMerge,\n squash: mergeSquash,\n fastForward: mergeFastForward,\n squashMessage: mergeSquash ? mergeSquashMessage : undefined,\n }\n });\n closeMergeDialog();\n } catch (e) {\n if (isMergeOrRebaseConflictError(e)) {\n closeMergeDialog();\n toast({\n type: 'warning',\n title: 'Merge Conflict Detected',\n description: 'Merge conflict detected in the background. Please resolve via CLI since the conflicts tab has been removed.',\n duration: 12000,\n });\n }\n console.error(e);\n } finally {\n setIsMerging(false);\n }\n }\n\n useEffect(() => {\n const sourceBranch = mergeSourceBranch;\n const targetBranch = mergeTargetBranch;\n\n if (!isMergeOpen || !sourceBranch || !targetBranch) {\n return;\n }\n\n let cancelled = false;\n setMergeConflictStatus('checking');\n\n const checkMergeConflicts = async () => {\n try {\n const result = await runGitAction({\n repoPath,\n action: 'check-merge-conflicts',\n data: {\n sourceBranch,\n targetBranch,\n },\n });\n\n if (!cancelled) {\n setMergeConflictStatus(result.hasConflicts ? 'has-conflicts' : 'no-conflict');\n }\n } catch (e) {\n console.error(e);\n if (!cancelled) {\n // Be conservative when the check cannot be completed.\n setMergeConflictStatus('has-conflicts');\n }\n }\n };\n\n void checkMergeConflicts();\n\n return () => {\n cancelled = true;\n };\n }, [isMergeOpen, mergeSourceBranch, mergeTargetBranch, repoPath, runGitAction]);\n\n const confirmPushToRemote = async (branch: string) => {\n setPushBranch(branch);\n setPushError(null);\n setPushRemotes([]);\n setPushRemoteBranches([]);\n setPushSelectedRemote('');\n setPushSelectedRemoteBranch('');\n setPushTrackingBranch(null);\n setPushRebaseFirst(false);\n setPushForcePush(false);\n setPushLocalOnlyTags(true);\n setPushSquash(false);\n setPushSquashMessage('');\n setIsPushOpen(true);\n\n // Load remotes\n setPushLoadingRemotes(true);\n try {\n const result = await runGitAction({\n repoPath,\n action: 'get-remotes',\n data: {}\n });\n\n if (!result.remotes || result.remotes.length === 0) {\n setPushError('No remote repository configured. Please add a remote first.');\n setPushLoadingRemotes(false);\n return;\n }\n\n setPushRemotes(result.remotes);\n\n // Get tracking branch info\n const trackingResult = await runGitAction({\n repoPath,\n action: 'get-tracking-branch',\n data: { branch }\n });\n\n setPushTrackingBranch(trackingResult.tracking);\n\n // Set default remote - use tracking remote if available and exists in remotes list, otherwise first remote\n const trackingRemote = trackingResult.tracking?.remote;\n const defaultRemote = (trackingRemote && result.remotes.includes(trackingRemote))\n ? trackingRemote\n : result.remotes[0];\n setPushSelectedRemote(defaultRemote);\n\n // Load branches for the default remote\n setPushLoadingBranches(true);\n const branchesResult = await runGitAction({\n repoPath,\n action: 'get-remote-branches',\n data: { remote: defaultRemote }\n });\n\n setPushRemoteBranches(branchesResult.branches || []);\n\n // Set default remote branch - use tracking branch if on same remote, otherwise use branch name\n if (trackingResult.tracking?.remote === defaultRemote && trackingResult.tracking?.branch) {\n setPushSelectedRemoteBranch(trackingResult.tracking.branch);\n } else {\n // Default to same name as local branch, or first branch if local branch name doesn't exist\n const localBranchName = branch;\n if (branchesResult.branches?.includes(localBranchName)) {\n setPushSelectedRemoteBranch(localBranchName);\n } else {\n // Will create new branch with local branch name\n setPushSelectedRemoteBranch(localBranchName);\n }\n }\n } catch (e) {\n console.error(e);\n setPushError((e as Error).message || 'Failed to load remote information');\n } finally {\n setPushLoadingRemotes(false);\n setPushLoadingBranches(false);\n }\n }\n\n const handlePushRemoteChange = async (remote: string) => {\n setPushSelectedRemote(remote);\n setPushLoadingBranches(true);\n setPushRemoteBranches([]);\n\n try {\n const branchesResult = await runGitAction({\n repoPath,\n action: 'get-remote-branches',\n data: { remote }\n });\n\n setPushRemoteBranches(branchesResult.branches || []);\n\n // Set default branch - tracking branch if on this remote, otherwise local branch name\n if (pushTrackingBranch?.remote === remote && pushTrackingBranch?.branch) {\n setPushSelectedRemoteBranch(pushTrackingBranch.branch);\n } else {\n setPushSelectedRemoteBranch(pushBranch || '');\n }\n } catch (e) {\n console.error(e);\n setPushError((e as Error).message || 'Failed to load remote branches');\n } finally {\n setPushLoadingBranches(false);\n }\n }\n\n const handlePushSquashToggle = useCallback((enabled: boolean) => {\n setPushSquash(enabled);\n\n if (!enabled) {\n return;\n }\n\n if (!pushBranch) {\n setPushSquashMessage('');\n return;\n }\n\n void (async () => {\n try {\n const result = await runGitAction({\n repoPath,\n action: 'get-latest-commit-message',\n data: { branch: pushBranch },\n });\n setPushSquashMessage(typeof result?.message === 'string' ? result.message : '');\n } catch (e) {\n console.error(e);\n setPushSquashMessage('');\n }\n })();\n }, [pushBranch, repoPath, runGitAction]);\n\n const handlePushToRemote = async () => {\n if (!pushBranch || !pushSelectedRemote || !pushSelectedRemoteBranch) return;\n\n setIsPushing(true);\n setPushError(null);\n\n try {\n // Determine if we need to set upstream\n const isNewBranch = !pushRemoteBranches.includes(pushSelectedRemoteBranch);\n const needsSetUpstream = isNewBranch ||\n pushTrackingBranch?.remote !== pushSelectedRemote ||\n pushTrackingBranch?.branch !== pushSelectedRemoteBranch;\n\n await runGitAction({\n repoPath,\n action: 'push-to-remote',\n data: {\n localBranch: pushBranch,\n remote: pushSelectedRemote,\n remoteBranch: pushSelectedRemoteBranch,\n rebaseFirst: pushForcePush ? false : pushRebaseFirst,\n forcePush: pushForcePush,\n pushLocalOnlyTags,\n setUpstream: needsSetUpstream,\n squash: pushSquash,\n squashMessage: pushSquashMessage,\n }\n });\n\n // Fetch from the remote we just pushed to\n await runGitAction({\n repoPath,\n action: 'fetch',\n data: { remote: pushSelectedRemote }\n });\n\n setIsPushOpen(false);\n setPushBranch(null);\n } catch (e) {\n console.error(e);\n setPushError((e as Error).message || 'Failed to push to remote');\n } finally {\n setIsPushing(false);\n }\n }\n\n const confirmPullFromRemote = async (branch: string) => {\n setPullBranch(branch);\n setPullError(null);\n setPullRemotes([]);\n setPullRemoteBranches([]);\n setPullSelectedRemote('');\n setPullSelectedRemoteBranch('');\n setPullTrackingBranch(null);\n setPullRebase(true);\n setIsPullOpen(true);\n\n // Load remotes\n setPullLoadingRemotes(true);\n try {\n const result = await runGitAction({\n repoPath,\n action: 'get-remotes',\n data: {}\n });\n\n if (!result.remotes || result.remotes.length === 0) {\n setPullError('No remote repository configured. Please add a remote first.');\n setPullLoadingRemotes(false);\n return;\n }\n\n setPullRemotes(result.remotes);\n\n // Get tracking branch info\n const trackingResult = await runGitAction({\n repoPath,\n action: 'get-tracking-branch',\n data: { branch }\n });\n\n setPullTrackingBranch(trackingResult.tracking);\n\n // Set default remote - use tracking remote if available and exists in remotes list, otherwise first remote\n const trackingRemote = trackingResult.tracking?.remote;\n const defaultRemote = (trackingRemote && result.remotes.includes(trackingRemote))\n ? trackingRemote\n : result.remotes[0];\n setPullSelectedRemote(defaultRemote);\n\n // Load branches for the default remote\n setPullLoadingBranches(true);\n const branchesResult = await runGitAction({\n repoPath,\n action: 'get-remote-branches',\n data: { remote: defaultRemote }\n });\n\n setPullRemoteBranches(branchesResult.branches || []);\n\n // Set default remote branch - use tracking branch if on same remote\n if (trackingResult.tracking?.remote === defaultRemote && trackingResult.tracking?.branch) {\n setPullSelectedRemoteBranch(trackingResult.tracking.branch);\n } else {\n // No tracking branch on this remote - leave empty to show error\n setPullSelectedRemoteBranch('');\n }\n } catch (e) {\n console.error(e);\n setPullError((e as Error).message || 'Failed to load remote information');\n } finally {\n setPullLoadingRemotes(false);\n setPullLoadingBranches(false);\n }\n }\n\n const handlePullRemoteChange = async (remote: string) => {\n setPullSelectedRemote(remote);\n setPullLoadingBranches(true);\n setPullRemoteBranches([]);\n setPullSelectedRemoteBranch('');\n\n try {\n const branchesResult = await runGitAction({\n repoPath,\n action: 'get-remote-branches',\n data: { remote }\n });\n\n setPullRemoteBranches(branchesResult.branches || []);\n\n // Set default branch - tracking branch if on this remote\n if (pullTrackingBranch?.remote === remote && pullTrackingBranch?.branch) {\n setPullSelectedRemoteBranch(pullTrackingBranch.branch);\n } else {\n // No tracking branch on this remote - leave empty\n setPullSelectedRemoteBranch('');\n }\n } catch (e) {\n console.error(e);\n setPullError((e as Error).message || 'Failed to load remote branches');\n } finally {\n setPullLoadingBranches(false);\n }\n }\n\n const handlePullFromRemote = async () => {\n if (!pullBranch || !pullSelectedRemote || !pullSelectedRemoteBranch) return;\n\n setIsPulling(true);\n setPullError(null);\n\n try {\n await runGitAction({\n repoPath,\n action: 'pull-from-remote',\n data: {\n localBranch: pullBranch,\n remote: pullSelectedRemote,\n remoteBranch: pullSelectedRemoteBranch,\n rebase: pullRebase,\n }\n });\n\n setIsPullOpen(false);\n setPullBranch(null);\n } catch (e) {\n console.error(e);\n setPullError((e as Error).message || 'Failed to pull from remote');\n } finally {\n setIsPulling(false);\n }\n }\n\n const confirmCheckoutToLocal = (remoteBranch: string) => {\n setCheckoutRemoteBranch(remoteBranch);\n // Extract the branch name from remotes/origin/branch-name\n const parts = remoteBranch.split('/');\n // Skip 'remotes' and remote name (e.g., 'origin'), take the rest as branch name\n const branchName = parts.slice(2).join('/');\n setCheckoutLocalBranchName(branchName);\n setIsCheckoutToLocalOpen(true);\n }\n\n const handleCheckoutToLocal = async () => {\n if (!checkoutRemoteBranch || !checkoutLocalBranchName) return;\n setIsCheckingOutToLocal(true);\n try {\n await runGitAction({\n repoPath,\n action: 'checkout-to-local',\n data: { remoteBranch: checkoutRemoteBranch, localBranch: checkoutLocalBranchName }\n });\n setIsCheckoutToLocalOpen(false);\n setCheckoutRemoteBranch(null);\n setCheckoutLocalBranchName('');\n } catch (e) {\n console.error(e);\n } finally {\n setIsCheckingOutToLocal(false);\n }\n }\n\n const handleFetchFromAllRemotes = async () => {\n setIsFetchingAllRemotes(true);\n try {\n await runGitAction({\n repoPath,\n action: 'fetch',\n data: { allRemotes: true }\n });\n } catch (e) {\n console.error(e);\n } finally {\n setIsFetchingAllRemotes(false);\n }\n }\n\n const handleOpenRepoFolder = useCallback(async () => {\n if (isOpeningRepoFolder) return;\n\n setIsOpeningRepoFolder(true);\n try {\n const response = await fetch('/api/fs/open', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: repoPath }),\n });\n const result = await response.json().catch(() => ({}));\n\n if (!response.ok) {\n throw new Error(result.error || 'Failed to open repository folder');\n }\n } catch (error) {\n toast({\n type: 'error',\n title: 'Failed to Open Repo Folder',\n description: error instanceof Error ? error.message : 'Unknown error',\n });\n } finally {\n setIsOpeningRepoFolder(false);\n }\n }, [isOpeningRepoFolder, repoPath]);\n\n const handleOpenRepoTerminal = useCallback(async () => {\n if (isOpeningRepoTerminal) return;\n\n setIsOpeningRepoTerminal(true);\n try {\n const response = await fetch('/api/fs/open-terminal', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: repoPath }),\n });\n const result = await response.json().catch(() => ({}));\n\n if (!response.ok) {\n throw new Error(result.error || 'Failed to open terminal');\n }\n } catch (error) {\n toast({\n type: 'error',\n title: 'Failed to Open Terminal',\n description: error instanceof Error ? error.message : 'Unknown error',\n });\n } finally {\n setIsOpeningRepoTerminal(false);\n }\n }, [isOpeningRepoTerminal, repoPath]);\n\n const handleOpenWorktreeInNewTab = useCallback((worktreePath: string, isCurrentWorktree: boolean) => {\n if (isCurrentWorktree) return;\n\n let origin = window.location.origin;\n try {\n if (window.top?.location?.origin) {\n origin = window.top.location.origin;\n }\n } catch {\n // Ignore cross-origin access errors and keep current window origin.\n }\n\n const targetUrl = `${origin}/git?path=${encodeURIComponent(worktreePath)}`;\n window.open(targetUrl, '_blank', 'noopener,noreferrer');\n }, []);\n\n const handleFetchFromRemote = async (remote: string) => {\n try {\n await runGitAction({\n repoPath,\n action: 'fetch',\n data: { remote }\n });\n } catch (e) {\n console.error(e);\n }\n }\n\n const handleCheckout = async (branchName: string) => {\n\n try {\n await runGitAction({\n repoPath,\n action: 'checkout',\n data: { branch: branchName }\n });\n } catch (e) {\n console.error(e);\n }\n };\n\n const handleResetToCommit = async (commitHash: string) => {\n setResetCommitHash(commitHash);\n setIsResetOpen(true);\n };\n\n const handleConfirmReset = async () => {\n if (!resetCommitHash) return;\n setIsResetting(true);\n try {\n await runGitAction({\n repoPath,\n action: 'reset',\n data: { commitHash: resetCommitHash, mode: 'hard' }\n });\n setIsResetOpen(false);\n setResetCommitHash(null);\n } catch (e) {\n console.error(e);\n } finally {\n setIsResetting(false);\n }\n };\n\n const confirmRevertCommit = (commitHash: string, commitMessage: string) => {\n setCommitToRevert({ hash: commitHash, message: commitMessage });\n setIsRevertOpen(true);\n };\n\n const handleConfirmRevert = async () => {\n if (!commitToRevert) return;\n setIsReverting(true);\n try {\n await runGitAction({\n repoPath,\n action: 'revert',\n data: { commitHash: commitToRevert.hash }\n });\n setIsRevertOpen(false);\n setCommitToRevert(null);\n } catch (e) {\n console.error(e);\n } finally {\n setIsReverting(false);\n }\n };\n\n const confirmRewordCommit = (hash: string, subject: string, body: string, branch: string) => {\n setCommitToReword({ hash, subject, body, branch });\n setNewMessageSubject(subject);\n setNewMessageBody(body);\n setIsRewordOpen(true);\n };\n\n const handleReword = async () => {\n if (!commitToReword || !newMessageSubject.trim()) return;\n setIsRewording(true);\n try {\n await runGitAction({\n repoPath,\n action: 'reword',\n data: {\n commitHash: commitToReword.hash,\n message: buildCommitMessage(newMessageSubject, newMessageBody),\n branch: commitToReword.branch,\n }\n });\n closeRewordDialog();\n } catch (e) {\n console.error(e);\n } finally {\n setIsRewording(false);\n }\n };\n\n const confirmCherryPickCommit = (commitHash: string, commitMessage: string) => {\n setCommitsToCherryPick([{ hash: commitHash, message: commitMessage }]);\n setIsCherryPickOpen(true);\n };\n\n const confirmCherryPickSelectedCommits = () => {\n if (selectedCommitsForCherryPick.length < 2) return;\n setCommitsToCherryPick(selectedCommitsForCherryPick.map((commit) => ({\n hash: commit.hash,\n message: commit.message,\n })));\n setIsCherryPickOpen(true);\n };\n\n const isCherryPickAlreadyInProgressError = (error: unknown) => {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n return message.includes('cherry-pick') && message.includes('already in progress');\n };\n\n const isCherryPickConflictError = (error: unknown) => {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n return (\n message.includes('could not apply') ||\n message.includes('conflict') ||\n message.includes('cherry-pick --continue')\n );\n };\n\n const runCherryPickByHashes = useCallback(async (commitHashes: string[]) => {\n if (commitHashes.length === 1) {\n await runGitAction({\n repoPath,\n action: 'cherry-pick',\n data: { commitHash: commitHashes[0] }\n });\n return;\n }\n\n await runGitAction({\n repoPath,\n action: 'cherry-pick-multiple',\n data: { commitHashes }\n });\n }, [repoPath, runGitAction]);\n\n const abortCherryPickAndResetUi = useCallback(async () => {\n try {\n await runGitAction({\n repoPath,\n action: 'cherry-pick-abort',\n });\n } catch (abortError) {\n console.error(abortError);\n } finally {\n setIsCherryPickOpen(false);\n setIsAbortCherryPickOpen(false);\n setCommitsToCherryPick([]);\n }\n }, [repoPath, runGitAction]);\n\n const handleCherryPickCommit = async () => {\n if (commitsToCherryPick.length === 0) return;\n setIsCherryPicking(true);\n try {\n const commitHashes = commitsToCherryPick.map((commit) => commit.hash);\n await runCherryPickByHashes(commitHashes);\n setIsCherryPickOpen(false);\n setCommitsToCherryPick([]);\n } catch (e) {\n if (isCherryPickAlreadyInProgressError(e)) {\n setIsCherryPickOpen(false);\n setIsAbortCherryPickOpen(true);\n } else if (isCherryPickConflictError(e)) {\n await abortCherryPickAndResetUi();\n }\n console.error(e);\n } finally {\n setIsCherryPicking(false);\n }\n };\n\n const handleAbortCherryPick = async () => {\n if (commitsToCherryPick.length === 0) {\n setIsAbortCherryPickOpen(false);\n return;\n }\n\n setIsAbortingCherryPick(true);\n try {\n await runGitAction({\n repoPath,\n action: 'cherry-pick-abort',\n });\n\n const commitHashes = commitsToCherryPick.map((commit) => commit.hash);\n await runCherryPickByHashes(commitHashes);\n\n setIsAbortCherryPickOpen(false);\n setCommitsToCherryPick([]);\n } catch (e) {\n if (isCherryPickAlreadyInProgressError(e)) {\n setIsAbortCherryPickOpen(true);\n } else if (isCherryPickConflictError(e)) {\n await abortCherryPickAndResetUi();\n }\n console.error(e);\n } finally {\n setIsAbortingCherryPick(false);\n }\n };\n\n const handleCreateBranch = async () => {\n if (!newBranchName) return;\n setIsCreating(true);\n try {\n await runGitAction({\n repoPath,\n action: 'branch',\n data: { branch: newBranchName, fromRef: createBranchFromRef || undefined }\n });\n setIsCreateBranchOpen(false);\n setNewBranchName('');\n setCreateBranchFromRef(null);\n } catch (e) {\n console.error(e);\n // alert or toast error\n } finally {\n setIsCreating(false);\n }\n };\n\n const confirmCreateBranch = (sourceBranch?: string) => {\n setCreateBranchFromRef(sourceBranch || null);\n setIsCreateBranchOpen(true);\n };\n\n const confirmCreateTag = (commitHash: string) => {\n setCreateTagCommitHash(commitHash);\n setNewTagName('');\n setPushTagToRemote(false);\n setIsCreateTagOpen(true);\n };\n\n const handleCreateTag = async () => {\n if (!createTagCommitHash || !newTagName.trim()) return;\n setIsCreatingTag(true);\n try {\n await runGitAction({\n repoPath,\n action: 'create-tag',\n data: {\n tagName: newTagName.trim(),\n commitHash: createTagCommitHash,\n pushToRemote: pushTagToRemote,\n }\n });\n setIsCreateTagOpen(false);\n setCreateTagCommitHash(null);\n setNewTagName('');\n setPushTagToRemote(false);\n } catch (e) {\n console.error(e);\n } finally {\n setIsCreatingTag(false);\n }\n };\n\n const currentBranch = branchData?.current;\n const trackingInfoByBranch = branchData?.trackingInfo;\n const remoteNames = useMemo(() => {\n const names = Object.keys(branchData?.remoteUrls ?? {});\n return names.sort((a, b) => {\n if (a === 'origin') return -1;\n if (b === 'origin') return 1;\n return a.localeCompare(b);\n });\n }, [branchData?.remoteUrls]);\n const remoteNameForTagDelete = remoteNames[0] || null;\n const selectedTrackingUpstreams = useMemo(() => {\n const upstreams: string[] = [];\n for (const branchRef of branchesToDelete) {\n if (branchRef.startsWith('remotes/')) continue;\n const upstream = trackingInfoByBranch?.[branchRef]?.upstream;\n if (upstream) upstreams.push(upstream);\n }\n return Array.from(new Set(upstreams));\n }, [branchesToDelete, trackingInfoByBranch]);\n const trackingInfoForRename = useMemo(() => {\n if (!branchToRename || remoteBranchToRename) return null;\n return trackingInfoByBranch?.[branchToRename] ?? null;\n }, [branchToRename, remoteBranchToRename, trackingInfoByBranch]);\n const localChangesCount = statusData?.files?.length;\n const currentBranchName = currentBranch || (isBranchesLoading ? 'Loading branches...' : 'Detached HEAD');\n const currentBranchLabel = currentBranch && typeof localChangesCount === 'number' && localChangesCount > 0\n ? `${currentBranch} (${localChangesCount})`\n : currentBranchName;\n const currentTrackingBranch = useMemo(() => {\n if (!currentBranch) return null;\n const tracking = trackingInfoByBranch?.[currentBranch];\n if (!tracking?.upstream) return null;\n const parsed = parseTrackingUpstream(tracking.upstream);\n if (!parsed) return null;\n\n return { upstream: tracking.upstream, ...parsed };\n }, [currentBranch, trackingInfoByBranch]);\n const pullAllTargets = useMemo(() => {\n const targets: Array<{ localBranch: string; remote: string; remoteBranch: string }> = [];\n for (const localBranch of branchData?.branches ?? []) {\n const upstream = trackingInfoByBranch?.[localBranch]?.upstream;\n if (!upstream) continue;\n const parsed = parseTrackingUpstream(upstream);\n if (!parsed) continue;\n targets.push({\n localBranch,\n remote: parsed.remote,\n remoteBranch: parsed.branch,\n });\n }\n return targets;\n }, [branchData?.branches, trackingInfoByBranch]);\n const pullActionDisabledReason = useMemo(() => {\n if (isBranchesLoading) return 'Loading branches...';\n if (!currentBranch) return 'Not on a local branch';\n if (!currentTrackingBranch) return `Branch \"${currentBranch}\" has no tracking remote branch`;\n return null;\n }, [currentBranch, currentTrackingBranch, isBranchesLoading]);\n const pullAllActionDisabledReason = useMemo(() => {\n if (isBranchesLoading) return 'Loading branches...';\n if (pullAllTargets.length === 0) return 'No local branches with tracking remote branches';\n return null;\n }, [isBranchesLoading, pullAllTargets.length]);\n const pushActionDisabledReason = useMemo(() => {\n if (isBranchesLoading) return 'Loading branches...';\n if (!currentBranch) return 'Not on a local branch';\n return null;\n }, [currentBranch, isBranchesLoading]);\n\n const confirmPullCurrentBranch = () => {\n if (!currentBranch || pullActionDisabledReason) return;\n void confirmPullFromRemote(currentBranch);\n };\n\n const confirmPushCurrentBranch = () => {\n if (!currentBranch || pushActionDisabledReason) return;\n void confirmPushToRemote(currentBranch);\n };\n\n const handlePullAllBranches = async () => {\n if (isPullingAllBranches || pullAllTargets.length === 0) return;\n\n setIsPullingAllBranches(true);\n const pulledBranches: string[] = [];\n\n try {\n for (const target of pullAllTargets) {\n try {\n await runGitAction({\n repoPath,\n action: 'pull-from-remote',\n data: {\n localBranch: target.localBranch,\n remote: target.remote,\n remoteBranch: target.remoteBranch,\n rebase: true,\n },\n suppressErrorToast: true,\n });\n pulledBranches.push(target.localBranch);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n const pulledSummary = pulledBranches.length > 0\n ? `Pulled ${pulledBranches.length} branch${pulledBranches.length === 1 ? '' : 'es'} before failure.`\n : 'No branches were updated.';\n\n toast({\n type: 'error',\n title: `Pull All Failed on \"${target.localBranch}\"`,\n description: `${errorMessage} ${pulledSummary}`,\n duration: 12000,\n });\n return;\n }\n }\n\n toast({\n type: 'success',\n title: pulledBranches.length === 1 ? 'Pulled 1 Branch' : `Pulled ${pulledBranches.length} Branches`,\n description: 'Updated all local branches that have tracking remote branches.',\n });\n } finally {\n setIsPullingAllBranches(false);\n }\n };\n\n const getBranchContextMenuItems = (options: BranchMenuOptions): ContextMenuItem[] => {\n const menuItems = buildBranchContextMenuItems(options, {\n onCheckout: handleCheckout,\n onCheckoutToLocal: confirmCheckoutToLocal,\n onCreateBranch: confirmCreateBranch,\n onDeleteBranch: confirmDeleteBranch,\n onDeleteBranches: confirmDeleteBranches,\n onRenameBranch: confirmRenameBranch,\n onRenameRemoteBranch: confirmRenameRemoteBranch,\n onRebase: confirmRebase,\n onMerge: confirmMerge,\n onPushToRemote: confirmPushToRemote,\n onPullFromRemote: confirmPullFromRemote,\n });\n\n if (customBranchScripts.length > 0) {\n menuItems.push({\n label: 'Custom scripts',\n icon: <i className=\"iconoir-terminal text-[14px]\" aria-hidden=\"true\" />,\n children: customBranchScripts.map((script) => ({\n label: script.name,\n icon: <i className=\"iconoir-play text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => {\n void handleRunCustomScript(script, options.branchRef);\n },\n })),\n });\n }\n\n return menuItems;\n };\n\n const localBranchSet = useMemo(() => {\n return new Set(branchData?.branches ?? []);\n }, [branchData?.branches]);\n\n const remoteBranchMap = useMemo(() => {\n const map = new Map<string, string>();\n if (!branchData?.remotes) return map;\n\n for (const [remoteName, branches] of Object.entries(branchData.remotes)) {\n for (const branch of branches) {\n map.set(`${remoteName}/${branch}`, `remotes/${remoteName}/${branch}`);\n }\n }\n\n return map;\n }, [branchData?.remotes]);\n\n const getBranchTagContextMenuItems = (displayRef: string): ContextMenuItem[] | null => {\n if (displayRef.startsWith('tag:')) {\n const tagName = displayRef.replace(/^tag:\\s*/, '').trim();\n if (!tagName) return null;\n return [\n {\n label: 'Delete Tag',\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => confirmDeleteTag(tagName),\n danger: true,\n },\n ];\n }\n\n if (localBranchSet.has(displayRef)) {\n return getBranchContextMenuItems({\n branchRef: displayRef,\n branchLeafName: displayRef.split('/').pop() || displayRef,\n currentBranch,\n isRemote: false,\n });\n }\n\n const remoteBranchRef = remoteBranchMap.get(displayRef);\n if (!remoteBranchRef) return null;\n\n return getBranchContextMenuItems({\n branchRef: remoteBranchRef,\n branchLeafName: remoteBranchRef.split('/').pop() || displayRef,\n currentBranch,\n isRemote: true,\n });\n };\n const localGroupBranchRefs = useMemo(() => {\n if (!localBranchTree) return [];\n return collectAllBranchRefs(localBranchTree).filter((branchRef) => branchRef !== currentBranch);\n }, [localBranchTree, currentBranch]);\n const worktrees = branchData?.worktrees ?? [];\n\n const branchTreePopoverContent = (\n <div className=\"w-[22rem] max-w-[calc(100vw-2rem)] flex flex-col border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 rounded-box shadow-xl overflow-hidden\">\n <div className=\"px-4 border-b border-gray-200 dark:border-gray-800 flex items-center justify-between bg-white dark:bg-gray-900 h-[57px] shrink-0\">\n <h3 className=\"font-semibold flex items-center gap-2\">Branches</h3>\n <div className=\"flex items-center gap-1\">\n {hasVisibilityFilters && (\n <div className=\"tooltip tooltip-left z-20\" data-tip=\"Clear filters\">\n <button\n className=\"btn btn-ghost btn-xs btn-square\"\n onClick={handleClearAllFilters}\n >\n <i className=\"iconoir-filter text-[16px]\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n <div className=\"tooltip tooltip-left z-20\" data-tip=\"Create Branch\">\n <button className=\"btn btn-ghost btn-xs btn-square\" onClick={() => confirmCreateBranch()}>\n <i className=\"iconoir-plus-circle text-[16px]\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n </div>\n <div className=\"max-h-[70vh] overflow-auto\">\n <div className=\"p-2 space-y-0.5\">\n {localBranchTree && (\n <>\n <ContextMenu\n items={[\n {\n label: 'Delete',\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => confirmDeleteBranches(localGroupBranchRefs),\n danger: true,\n disabled: localGroupBranchRefs.length === 0,\n },\n ]}\n >\n <GroupHeader\n name=\"Branches\"\n groupPath=\"__local__\"\n icon={<i className=\"iconoir-git-branch text-[14px]\" aria-hidden=\"true\" />}\n isExpanded={localGroupExpanded}\n onToggle={handleToggleLocalGroup}\n visibilityMap={visibilityMap}\n onToggleVisibility={handleToggleVisibility}\n />\n </ContextMenu>\n {localGroupExpanded && (\n <BranchTreeItem\n node={localBranchTree}\n currentBranch={branchData?.current}\n expandedFolders={expandedFolders}\n onToggleFolder={toggleFolder}\n onCheckout={handleCheckout}\n onCheckoutToLocal={confirmCheckoutToLocal}\n onCreateBranch={() => confirmCreateBranch()}\n onDeleteBranch={confirmDeleteBranch}\n onRenameBranch={confirmRenameBranch}\n onRenameRemoteBranch={confirmRenameRemoteBranch}\n onRebase={confirmRebase}\n onMerge={confirmMerge}\n onPushToRemote={confirmPushToRemote}\n onPullFromRemote={confirmPullFromRemote}\n getBranchContextMenuItems={getBranchContextMenuItems}\n onBranchClick={handleBranchClick}\n onBranchContextMenu={handleBranchContextMenu}\n onDeleteBranchGroup={confirmDeleteBranches}\n selectedBranches={selectedBranchSet}\n visibilityMap={visibilityMap}\n onToggleVisibility={handleToggleVisibility}\n depth={1}\n groupPath=\"__local__\"\n trackingInfo={branchData?.trackingInfo}\n />\n )}\n </>\n )}\n\n <>\n <ContextMenu\n items={[\n {\n label: 'Fetch from all remotes',\n icon: <i className=\"iconoir-refresh-circle text-[14px]\" aria-hidden=\"true\" />,\n onClick: handleFetchFromAllRemotes,\n },\n {\n label: 'Add remote',\n icon: <i className=\"iconoir-plus-circle text-[14px]\" aria-hidden=\"true\" />,\n onClick: confirmAddRemote,\n },\n ]}\n >\n <GroupHeader\n name=\"Remotes\"\n groupPath=\"__remotes__\"\n icon={<i className=\"iconoir-globe text-[14px]\" aria-hidden=\"true\" />}\n isExpanded={remotesGroupExpanded}\n onToggle={handleToggleRemotesGroup}\n visibilityMap={visibilityMap}\n onToggleVisibility={handleToggleVisibility}\n />\n </ContextMenu>\n {remotesGroupExpanded && isBranchesLoading && !remoteBranchTrees && (\n <div className=\"flex items-center gap-2 px-2 py-2 text-sm opacity-70\" style={{ paddingLeft: '20px' }}>\n <span className=\"loading loading-spinner loading-xs\"></span>\n <span>Loading remotes...</span>\n </div>\n )}\n {remotesGroupExpanded && remoteBranchTrees && Array.from(remoteBranchTrees.entries()).map(([remoteName, tree]) => {\n const remoteGroupPath = `__remotes__/${remoteName}`;\n const isRemoteExpanded = expandedFolders.has(remoteGroupPath);\n\n return (\n <div key={remoteName}>\n <ContextMenu\n items={[\n {\n label: `Fetch from ${remoteName}`,\n icon: <i className=\"iconoir-refresh-circle text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => handleFetchFromRemote(remoteName),\n },\n {\n label: 'Rename',\n icon: <i className=\"iconoir-edit-pencil text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => confirmRenameRemote(remoteName),\n },\n {\n label: 'Delete',\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => confirmDeleteRemote(remoteName),\n danger: true,\n },\n ]}\n >\n <GroupHeader\n name={remoteName}\n groupPath={remoteGroupPath}\n icon={<i className=\"iconoir-globe text-[14px] opacity-50\" aria-hidden=\"true\" />}\n isExpanded={isRemoteExpanded}\n onToggle={() => toggleFolder(remoteGroupPath)}\n visibilityMap={visibilityMap}\n onToggleVisibility={handleToggleVisibility}\n depth={1}\n />\n </ContextMenu>\n {isRemoteExpanded && (\n <BranchTreeItem\n node={tree}\n currentBranch={branchData?.current}\n expandedFolders={expandedFolders}\n onToggleFolder={toggleFolder}\n onCheckout={handleCheckout}\n onCheckoutToLocal={confirmCheckoutToLocal}\n onCreateBranch={() => confirmCreateBranch()}\n onDeleteBranch={confirmDeleteBranch}\n onRenameBranch={confirmRenameBranch}\n onRenameRemoteBranch={confirmRenameRemoteBranch}\n onRebase={confirmRebase}\n onMerge={confirmMerge}\n onPushToRemote={confirmPushToRemote}\n onPullFromRemote={confirmPullFromRemote}\n getBranchContextMenuItems={getBranchContextMenuItems}\n onBranchClick={handleBranchClick}\n onBranchContextMenu={handleBranchContextMenu}\n onDeleteBranchGroup={confirmDeleteBranches}\n selectedBranches={selectedBranchSet}\n visibilityMap={visibilityMap}\n onToggleVisibility={handleToggleVisibility}\n depth={2}\n groupPath={remoteGroupPath}\n isRemote={true}\n trackingInfo={branchData?.trackingInfo}\n />\n )}\n </div>\n );\n })}\n </>\n\n <>\n <div\n className=\"group flex items-center gap-1 px-2 py-1.5 text-sm rounded-md cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors font-medium\"\n onClick={handleToggleWorktreesGroup}\n >\n <div className=\"flex items-center gap-1.5 flex-1 min-w-0\">\n <span className=\"text-xs opacity-70\">{worktreesGroupExpanded ? '▼' : '▶'}</span>\n <i className=\"iconoir-folder text-[14px]\" aria-hidden=\"true\" />\n <span className=\"truncate min-w-0 flex-1\">Worktrees</span>\n </div>\n <span className=\"text-xs opacity-60\">{worktrees.length}</span>\n </div>\n {worktreesGroupExpanded && isBranchesLoading && worktrees.length === 0 && (\n <div className=\"flex items-center gap-2 px-2 py-2 text-sm opacity-70\" style={{ paddingLeft: '20px' }}>\n <span className=\"loading loading-spinner loading-xs\"></span>\n <span>Loading worktrees...</span>\n </div>\n )}\n {worktreesGroupExpanded && !isBranchesLoading && worktrees.length === 0 && (\n <div className=\"px-2 py-2 text-sm opacity-70\" style={{ paddingLeft: '20px' }}>\n No worktrees found\n </div>\n )}\n {worktreesGroupExpanded && worktrees.map((worktree) => {\n const row = (\n <button\n type=\"button\"\n className={cn(\n \"group flex w-full items-center gap-2 px-2 py-1.5 text-sm rounded-md transition-colors text-left\",\n worktree.isCurrent ? \"cursor-default opacity-85\" : \"cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800\"\n )}\n style={{ paddingLeft: '20px' }}\n onClick={() => handleOpenWorktreeInNewTab(worktree.path, worktree.isCurrent)}\n title={worktree.path}\n disabled={worktree.isCurrent}\n >\n <i className={`iconoir-folder text-[14px] shrink-0 ${worktree.isCurrent ? 'text-primary' : 'opacity-60'}`} aria-hidden=\"true\" />\n <span className=\"truncate min-w-0 flex-1\">{worktree.path}</span>\n {worktree.branch && (\n <span className=\"shrink-0 text-xs opacity-60\">\n {worktree.branch}\n </span>\n )}\n {worktree.isCurrent && (\n <span className=\"shrink-0 text-xs text-primary font-medium\">\n current\n </span>\n )}\n </button>\n );\n\n if (worktree.isCurrent) {\n return <div key={worktree.path}>{row}</div>;\n }\n\n return (\n <ContextMenu\n key={worktree.path}\n items={[{\n label: 'Delete worktree',\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => confirmDeleteWorktree(worktree.path),\n danger: true,\n }]}\n >\n {row}\n </ContextMenu>\n );\n })}\n </>\n </div>\n </div>\n </div>\n );\n\n if (isLoading && limit === 100) {\n return <div className=\"flex items-center justify-center p-8 h-full\"><span className=\"loading loading-spinner text-base-content/50\"></span></div>;\n }\n\n if (isError) {\n return (\n <div className=\"flex items-center justify-center p-8 h-full flex-col gap-4\">\n <p className=\"text-error font-medium\">Error Loading History</p>\n <p className=\"text-sm opacity-70\">{(error as Error)?.message || 'An unknown error occurred'}</p>\n <button onClick={() => void refetchLog()} className=\"btn btn-outline btn-sm\">\n <i className=\"iconoir-refresh-circle text-[16px] mr-1\" aria-hidden=\"true\" />\n Try Again\n </button>\n </div>\n );\n }\n\n if (!log) return <div className=\"flex items-center justify-center p-8 h-full opacity-70\">No history data available</div>;\n\n const headerActionButtonClass =\n \"flex h-8 items-center gap-1.5 rounded-md border border-slate-200 bg-white px-3 text-sm font-medium text-slate-600 transition-colors hover:bg-slate-50 hover:text-slate-900 disabled:cursor-not-allowed disabled:opacity-50 max-[1199px]:w-8 max-[1199px]:justify-center max-[1199px]:px-0 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-300 dark:hover:bg-slate-800 dark:hover:text-slate-100\";\n const headerActionLabelClass = \"max-[1199px]:hidden\";\n const branchSelectButtonClass =\n \"flex h-8 max-w-[24rem] items-center gap-2 rounded-md border border-slate-200 bg-white px-3 text-sm font-mono font-medium text-slate-700 transition-colors hover:bg-slate-50 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-200 dark:hover:bg-slate-800\";\n\n return (\n <div className=\"flex h-full overflow-hidden\">\n {isResetOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Reset to Commit</h3>\n <p className=\"py-4 break-words\">\n Are you sure you want to hard reset branch <span className=\"font-bold break-all\">{branchData?.current || 'Detached HEAD'}</span> to commit <span className=\"font-mono bg-base-200 px-1 rounded\">{resetCommitHash?.substring(0, 7)}</span>?\n <br />\n <span className=\"text-error font-bold\">Warning: This will discard all local changes and commits after this point. This action cannot be undone.</span>\n </p>\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={() => setIsResetOpen(false)} disabled={isResetting}>Cancel</button>\n <button className=\"btn btn-error\" onClick={handleConfirmReset} disabled={isResetting}>\n {isResetting && <span className=\"loading loading-spinner loading-xs\"></span>}\n Reset\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={() => setIsResetOpen(false)}>close</button>\n </form>\n </dialog>\n )}\n\n {isRevertOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Revert Commit</h3>\n <p className=\"py-4 break-words\">\n Are you sure you want to revert commit <span className=\"font-mono bg-base-200 px-1 rounded\">{commitToRevert?.hash.substring(0, 7)}</span> on <span className=\"font-bold break-all\">{branchData?.current || 'current'}</span>?\n </p>\n {commitToRevert?.message && (\n <div className=\"rounded border border-base-300 bg-base-200/40 px-3 py-2 text-xs break-words\">\n {commitToRevert.message}\n </div>\n )}\n <div className=\"modal-action\">\n <button\n className=\"flex h-8 items-center gap-1.5 px-3 rounded-md text-sm font-medium text-gray-600 hover:bg-gray-100 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-100 transition-colors\"\n onClick={() => {\n setIsRevertOpen(false);\n setCommitToRevert(null);\n }}\n disabled={isReverting}\n >\n Cancel\n </button>\n <button className=\"btn btn-primary\" onClick={handleConfirmRevert} disabled={isReverting}>\n {isReverting && <span className=\"loading loading-spinner loading-xs\"></span>}\n Revert\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={() => {\n setIsRevertOpen(false);\n setCommitToRevert(null);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isRewordOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Reword Commit</h3>\n <p className=\"py-4 break-words\">\n Reword commit <span className=\"font-mono bg-base-200 px-1 rounded\">{commitToReword?.hash.substring(0, 7)}</span> on branch <span className=\"font-bold\">{commitToReword?.branch}</span>.\n </p>\n <input\n type=\"text\"\n className=\"input input-bordered w-full font-mono text-sm mb-3\"\n value={newMessageSubject}\n onChange={e => setNewMessageSubject(e.target.value)}\n autoFocus\n onKeyDown={e => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter' && newMessageSubject.trim() && !isRewording) {\n e.preventDefault();\n handleReword();\n }\n }}\n placeholder=\"Commit subject\"\n disabled={isRewording}\n />\n <textarea\n className=\"textarea textarea-bordered w-full h-32 font-mono text-sm\"\n value={newMessageBody}\n onChange={e => setNewMessageBody(e.target.value)}\n onKeyDown={e => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter' && newMessageSubject.trim() && !isRewording) {\n e.preventDefault();\n handleReword();\n }\n }}\n placeholder=\"Commit message body (optional)\"\n disabled={isRewording}\n />\n {commitToReword?.branch !== branchData?.current && (\n <div className=\"alert alert-warning text-xs mt-2 py-2\">\n <span>This will briefly checkout <b>{commitToReword?.branch}</b> to amend the commit.</span>\n </div>\n )}\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={closeRewordDialog} disabled={isRewording}>Cancel</button>\n <button className=\"btn btn-primary\" onClick={handleReword} disabled={!newMessageSubject.trim() || isRewording}>\n {isRewording && <span className=\"loading loading-spinner loading-xs\"></span>}\n Reword\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeRewordDialog}>close</button>\n </form>\n </dialog>\n )}\n\n {isDeleteOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">{branchesToDelete.length > 1 ? 'Delete Branches' : 'Delete Branch'}</h3>\n {branchesToDelete.length > 1 ? (\n <div className=\"py-4 space-y-3\">\n <p className=\"break-words\">\n Are you sure you want to delete <span className=\"font-bold\">{branchesToDelete.length} selected branches</span>?\n This action cannot be undone.\n </p>\n <div className=\"max-h-44 overflow-auto rounded border border-base-300 bg-base-200/40 p-2 space-y-1\">\n {branchesToDelete.map((branch) => (\n <div key={branch} className=\"text-xs min-w-0 break-all\">\n {branch.startsWith('remotes/') ? branch.slice('remotes/'.length) : branch}\n </div>\n ))}\n </div>\n </div>\n ) : (\n <p className=\"py-4 break-words\">\n Are you sure you want to delete the branch <span className=\"font-bold break-all\">{branchesToDelete[0]?.startsWith('remotes/') ? branchesToDelete[0].slice('remotes/'.length) : branchesToDelete[0]}</span>?\n This action cannot be undone.\n </p>\n )}\n {selectedTrackingUpstreams.length > 0 && (\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start items-start gap-2 min-w-0\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={deleteRemoteBranch} onChange={(e) => setDeleteRemoteBranch(e.target.checked)} disabled={isDeleting} />\n <span className=\"label-text break-words whitespace-normal\">\n {selectedTrackingUpstreams.length === 1 ? (\n <>\n Delete tracking remote branch <span className=\"font-mono opacity-70 break-all\">{selectedTrackingUpstreams[0]}</span>\n </>\n ) : (\n <>Delete {selectedTrackingUpstreams.length} tracking remote branches</>\n )}\n </span>\n </label>\n </div>\n )}\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={() => { setIsDeleteOpen(false); setBranchesToDelete([]); setDeleteRemoteBranch(false); }} disabled={isDeleting}>Cancel</button>\n <button className=\"btn btn-error\" onClick={handleDeleteBranch} disabled={isDeleting}>\n {isDeleting && <span className=\"loading loading-spinner loading-xs\"></span>}\n Delete\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={() => { setIsDeleteOpen(false); setBranchesToDelete([]); setDeleteRemoteBranch(false); }}>close</button>\n </form>\n </dialog>\n )}\n\n {isDeleteWorktreeOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Delete Worktree</h3>\n <p className=\"py-4 break-words\">\n Are you sure you want to delete the worktree <span className=\"font-bold break-all\">{worktreeToDelete}</span>?\n </p>\n <p className=\"text-sm text-error break-words\">\n This will remove the worktree from git and remove its working directory.\n </p>\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={() => {\n setIsDeleteWorktreeOpen(false);\n setWorktreeToDelete(null);\n }}\n disabled={isDeletingWorktree}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-error\"\n onClick={() => void handleDeleteWorktree()}\n disabled={isDeletingWorktree || !worktreeToDelete}\n >\n {isDeletingWorktree && <span className=\"loading loading-spinner loading-xs\"></span>}\n Delete\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={() => {\n setIsDeleteWorktreeOpen(false);\n setWorktreeToDelete(null);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isDeleteTagOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Delete Tag</h3>\n <p className=\"py-4 break-words\">\n Are you sure you want to delete the tag <span className=\"font-bold break-all\">{tagToDelete}</span>?\n This action cannot be undone.\n </p>\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start items-start gap-2 min-w-0\">\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-sm\"\n checked={deleteRemoteTag}\n onChange={(e) => setDeleteRemoteTag(e.target.checked)}\n disabled={isDeletingTag || !remoteNameForTagDelete}\n />\n <span className=\"label-text break-words whitespace-normal\">\n {remoteNameForTagDelete ? (\n <>\n Also delete from remote <span className=\"font-mono opacity-70\">{remoteNameForTagDelete}</span>\n </>\n ) : (\n 'No remote configured'\n )}\n </span>\n </label>\n </div>\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={closeDeleteTagDialog} disabled={isDeletingTag}>Cancel</button>\n <button className=\"btn btn-error\" onClick={handleDeleteTag} disabled={isDeletingTag || !tagToDelete}>\n {isDeletingTag && <span className=\"loading loading-spinner loading-xs\"></span>}\n Delete\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeDeleteTagDialog}>close</button>\n </form>\n </dialog>\n )}\n\n {isCherryPickOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Cherry Pick</h3>\n <p className=\"text-sm opacity-70 mt-1\">\n {commitsToCherryPick.length > 1\n ? 'Apply selected commits from oldest to newest'\n : 'Apply changes from the selected commit'}\n </p>\n {commitsToCherryPick.length === 1 ? (\n <p className=\"py-4 break-words\">\n Are you sure to apply <span className=\"font-bold font-mono break-all\">{commitsToCherryPick[0]?.hash}</span> <span className=\"font-bold break-words\">{commitsToCherryPick[0]?.message}</span> to <span className=\"font-bold break-all\">{branchData?.current || 'current'}</span> branch?\n </p>\n ) : (\n <div className=\"py-4 space-y-3\">\n <p className=\"break-words\">\n Are you sure to apply <span className=\"font-bold\">{commitsToCherryPick.length} selected commits</span> to <span className=\"font-bold break-all\">{branchData?.current || 'current'}</span> branch?\n </p>\n <div className=\"max-h-44 overflow-auto rounded border border-base-300 bg-base-200/40 p-2 space-y-1\">\n {commitsToCherryPick.map((commit) => (\n <div key={commit.hash} className=\"text-xs min-w-0\">\n <span className=\"font-mono opacity-70\">{commit.hash.slice(0, 7)}</span>{' '}\n <span className=\"break-words\">{commit.message}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={() => {\n setIsCherryPickOpen(false);\n setCommitsToCherryPick([]);\n }}\n disabled={isCherryPicking}\n >\n Cancel\n </button>\n <button className=\"btn btn-primary\" onClick={handleCherryPickCommit} disabled={isCherryPicking}>\n {isCherryPicking && <span className=\"loading loading-spinner loading-xs\"></span>}\n Confirm\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={() => {\n setIsCherryPickOpen(false);\n setCommitsToCherryPick([]);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isAbortCherryPickOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Cherry Pick In Progress</h3>\n <p className=\"text-sm opacity-70 mt-1\">Another cherry-pick operation is currently in progress.</p>\n <p className=\"py-4 break-words\">\n Abort the in-progress cherry-pick and continue with {commitsToCherryPick.length > 1 ? 'the selected commits' : 'this commit'}?\n </p>\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={() => {\n setIsAbortCherryPickOpen(false);\n setCommitsToCherryPick([]);\n }}\n disabled={isAbortingCherryPick}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-warning\"\n onClick={() => void handleAbortCherryPick()}\n disabled={isAbortingCherryPick}\n >\n {isAbortingCherryPick && <span className=\"loading loading-spinner loading-xs\"></span>}\n Abort and Continue\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={() => {\n setIsAbortCherryPickOpen(false);\n setCommitsToCherryPick([]);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isRenameOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">{remoteBranchToRename ? 'Rename Remote Branch' : 'Rename Branch'}</h3>\n <p className=\"py-4 break-words\">\n Enter a new name for the branch <span className=\"font-bold break-all\">{branchToRename}</span>. Press <kbd className=\"kbd kbd-sm\">Enter</kbd> to confirm.\n </p>\n <input\n type=\"text\"\n className=\"input input-bordered w-full\"\n value={newBranchNameForRename}\n onChange={e => setNewBranchNameForRename(sanitizeBranchName(e.target.value))}\n placeholder=\"New branch name\"\n disabled={isRenaming}\n autoFocus\n onKeyDown={e => {\n const shortcutPressed = e.key === 'Enter' && (e.metaKey || e.ctrlKey);\n const sameName = remoteBranchToRename\n ? newBranchNameForRename === remoteBranchToRename.branch\n : newBranchNameForRename === branchToRename;\n if (shortcutPressed && newBranchNameForRename && !sameName && !isRenaming) {\n handleRenameBranch();\n }\n }}\n />\n {!remoteBranchToRename && trackingInfoForRename?.upstream && (\n <div className=\"form-control mt-2\">\n <label className=\"label cursor-pointer justify-start items-start gap-2 min-w-0\">\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-sm\"\n checked={renameTrackingRemoteBranch}\n onChange={(e) => setRenameTrackingRemoteBranch(e.target.checked)}\n disabled={isRenaming}\n />\n <span className=\"label-text break-words whitespace-normal\">\n Also rename tracking remote branch <span className=\"font-mono opacity-70 break-all\">{trackingInfoForRename.upstream}</span>\n </span>\n </label>\n </div>\n )}\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={closeRenameBranchDialog}\n disabled={isRenaming}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n onClick={handleRenameBranch}\n disabled={\n !newBranchNameForRename ||\n (remoteBranchToRename\n ? newBranchNameForRename === remoteBranchToRename.branch\n : newBranchNameForRename === branchToRename) ||\n isRenaming\n }\n >\n {isRenaming && <span className=\"loading loading-spinner loading-xs\"></span>}\n Rename\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeRenameBranchDialog}>\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isRenameRemoteOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Rename Remote</h3>\n <p className=\"py-4 break-words\">\n Enter a new name for remote <span className=\"font-bold break-all\">{remoteToRename}</span>. Press <kbd className=\"kbd kbd-sm\">Enter</kbd> to confirm.\n </p>\n <input\n type=\"text\"\n className=\"input input-bordered w-full\"\n value={newRemoteNameForRename}\n onChange={(e) => setNewRemoteNameForRename(e.target.value)}\n placeholder=\"New remote name\"\n disabled={isRenamingRemote}\n autoFocus\n onKeyDown={(e) => {\n const shortcutPressed = e.key === 'Enter' && (e.metaKey || e.ctrlKey);\n const trimmedNewName = newRemoteNameForRename.trim();\n const sameName = trimmedNewName === (remoteToRename ?? '').trim();\n if (shortcutPressed && trimmedNewName && !sameName && !isRenamingRemote) {\n handleRenameRemote();\n }\n }}\n />\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={closeRenameRemoteDialog}\n disabled={isRenamingRemote}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n onClick={handleRenameRemote}\n disabled={\n !newRemoteNameForRename.trim() ||\n newRemoteNameForRename.trim() === (remoteToRename ?? '').trim() ||\n isRenamingRemote\n }\n >\n {isRenamingRemote && <span className=\"loading loading-spinner loading-xs\"></span>}\n Rename\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeRenameRemoteDialog}>\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isDeleteRemoteOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Delete Remote</h3>\n <p className=\"py-4 break-words\">\n Are you sure you want to delete remote <span className=\"font-bold break-all\">{remoteToDelete}</span>?\n This removes all tracking branches for that remote.\n </p>\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={closeDeleteRemoteDialog}\n disabled={isDeletingRemote}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-error\"\n onClick={handleDeleteRemote}\n disabled={!remoteToDelete || isDeletingRemote}\n >\n {isDeletingRemote && <span className=\"loading loading-spinner loading-xs\"></span>}\n Delete\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeDeleteRemoteDialog}>\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isAddRemoteOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Add Remote</h3>\n <p className=\"py-4 break-words\">\n Add a new remote by providing a name and URL. Press <kbd className=\"kbd kbd-sm\">Enter</kbd> to confirm.\n </p>\n <div className=\"space-y-3\">\n <div>\n <label className=\"label pt-0\">\n <span className=\"label-text\">Remote name</span>\n </label>\n <input\n type=\"text\"\n className=\"input input-bordered w-full\"\n value={newRemoteName}\n onChange={(e) => setNewRemoteName(e.target.value)}\n placeholder=\"origin\"\n disabled={isAddingRemote}\n autoFocus\n />\n </div>\n <div>\n <label className=\"label pt-0\">\n <span className=\"label-text\">Remote URL</span>\n </label>\n <input\n type=\"text\"\n className=\"input input-bordered w-full\"\n value={newRemoteUrl}\n onChange={(e) => setNewRemoteUrl(e.target.value)}\n placeholder=\"https://github.com/owner/repo.git\"\n disabled={isAddingRemote}\n onKeyDown={(e) => {\n const shortcutPressed = e.key === 'Enter' && (e.metaKey || e.ctrlKey);\n if (shortcutPressed && newRemoteName.trim() && newRemoteUrl.trim() && !isAddingRemote) {\n handleAddRemote();\n }\n }}\n />\n </div>\n </div>\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={closeAddRemoteDialog}\n disabled={isAddingRemote}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n onClick={handleAddRemote}\n disabled={!newRemoteName.trim() || !newRemoteUrl.trim() || isAddingRemote}\n >\n {isAddingRemote && <span className=\"loading loading-spinner loading-xs\"></span>}\n Add\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeAddRemoteDialog}>\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isRebaseOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Rebase</h3>\n <p className=\"py-4 break-words\">\n Copy commits from one branch to another.<br />\n Are you sure to rebase <span className=\"font-bold break-all\">{rebaseSourceBranch}</span> onto <span className=\"font-bold break-all\">{rebaseTargetBranch}</span>?\n </p>\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={rebaseStashChanges} onChange={(e) => setRebaseStashChanges(e.target.checked)} disabled={isRebasing} />\n <span className=\"label-text\">Stash and reapply local changes</span>\n </label>\n </div>\n {!rebaseStashChanges && (\n <p className=\"text-xs text-warning mt-2 ml-6\">\n Warning: All local changes will be discarded.\n </p>\n )}\n {rebaseConflictStatus === 'checking' ? (\n <div className=\"alert alert-info text-sm mt-4 py-2\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n <span>Checking conflicts for rebasing <span className=\"font-bold break-all\">{rebaseSourceBranch}</span> onto <span className=\"font-bold break-all\">{rebaseTargetBranch}</span>...</span>\n </div>\n ) : rebaseConflictStatus === 'no-conflict' ? (\n <div className=\"alert alert-success text-sm mt-4 py-2\">\n <i className=\"iconoir-check-circle-solid text-[18px]\" aria-hidden=\"true\" />\n <span>No conflict: rebasing <span className=\"font-bold break-all\">{rebaseSourceBranch}</span> onto <span className=\"font-bold break-all\">{rebaseTargetBranch}</span> will not cause conflicts.</span>\n </div>\n ) : (\n <div className=\"alert alert-warning text-sm mt-4 py-2\">\n <i className=\"iconoir-warning-circle-solid text-[18px]\" aria-hidden=\"true\" />\n <span>Conflicts detected: rebasing <span className=\"font-bold break-all\">{rebaseSourceBranch}</span> onto <span className=\"font-bold break-all\">{rebaseTargetBranch}</span> will cause conflicts.</span>\n </div>\n )}\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={closeRebaseDialog} disabled={isRebasing}>Cancel</button>\n <button className=\"btn btn-primary\" onClick={handleRebase} disabled={isRebasing}>\n {isRebasing && <span className=\"loading loading-spinner loading-xs\"></span>}\n Confirm\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeRebaseDialog}>close</button>\n </form>\n </dialog>\n )}\n\n {isMergeOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Merge</h3>\n <p className=\"py-4 break-words\">\n Merge branch into another one.<br />\n Are you sure to merge <span className=\"font-bold break-all\">{mergeSourceBranch}</span> into <span className=\"font-bold break-all\">{mergeTargetBranch}</span>?\n </p>\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={mergeRebaseBeforeMerge} onChange={(e) => setMergeRebaseBeforeMerge(e.target.checked)} disabled={isMerging} />\n <span className=\"label-text\">Rebase before merge</span>\n </label>\n </div>\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={mergeSquash} onChange={(e) => handleMergeSquashToggle(e.target.checked)} disabled={isMerging} />\n <span className=\"label-text\">Squash before merge</span>\n </label>\n </div>\n {mergeSquash && (\n <textarea\n className=\"textarea textarea-bordered w-full mt-2\"\n placeholder=\"Commit message for squash merge\"\n value={mergeSquashMessage}\n onChange={(e) => setMergeSquashMessage(e.target.value)}\n disabled={isMerging}\n autoFocus\n />\n )}\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={mergeFastForward} onChange={(e) => setMergeFastForward(e.target.checked)} disabled={isMerging} />\n <span className=\"label-text\">Fast forward merge</span>\n </label>\n </div>\n {mergeConflictStatus === 'checking' ? (\n <div className=\"alert alert-info text-sm mt-4 py-2\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n <span>Checking conflicts for merging <span className=\"font-bold break-all\">{mergeSourceBranch}</span> into <span className=\"font-bold break-all\">{mergeTargetBranch}</span>...</span>\n </div>\n ) : mergeConflictStatus === 'no-conflict' ? (\n <div className=\"alert alert-success text-sm mt-4 py-2\">\n <i className=\"iconoir-check-circle-solid text-[18px]\" aria-hidden=\"true\" />\n <span>No conflict: merging <span className=\"font-bold break-all\">{mergeSourceBranch}</span> into <span className=\"font-bold break-all\">{mergeTargetBranch}</span> will not cause conflicts.</span>\n </div>\n ) : (\n <div className=\"alert alert-warning text-sm mt-4 py-2\">\n <i className=\"iconoir-warning-circle-solid text-[18px]\" aria-hidden=\"true\" />\n <span>Conflicts detected: merging <span className=\"font-bold break-all\">{mergeSourceBranch}</span> into <span className=\"font-bold break-all\">{mergeTargetBranch}</span> will cause conflicts.</span>\n </div>\n )}\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={closeMergeDialog} disabled={isMerging}>Cancel</button>\n <button className=\"btn btn-primary\" onClick={handleMerge} disabled={isMerging}>\n {isMerging && <span className=\"loading loading-spinner loading-xs\"></span>}\n Confirm\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeMergeDialog}>close</button>\n </form>\n </dialog>\n )}\n\n {isPushOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Push to Remote</h3>\n <p className=\"py-4 break-words\">Push <span className=\"font-bold break-all\">{pushBranch}</span> to a remote repository.</p>\n\n {pushError && pushRemotes.length === 0 ? (\n <div className=\"alert alert-error\">\n <span className=\"text-xl\">⚠️</span>\n <span>{pushError}</span>\n </div>\n ) : pushLoadingRemotes ? (\n <div className=\"flex justify-center py-8\">\n <span className=\"loading loading-spinner loading-lg\"></span>\n </div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n <div className=\"form-control w-full flex flex-row items-center justify-between gap-4\">\n <label className=\"label flex-shrink-0\"><span className=\"label-text\">Remote Repository</span></label>\n <select className=\"select select-bordered w-64\" value={pushSelectedRemote} onChange={(e) => handlePushRemoteChange(e.target.value)} disabled={isPushing}>\n {pushRemotes.map((remote) => <option key={remote} value={remote}>{remote}</option>)}\n </select>\n </div>\n\n <div className=\"form-control w-full flex flex-row items-center justify-between gap-4\">\n <label className=\"label flex-shrink-0\"><span className=\"label-text\">Remote Branch</span></label>\n <div className=\"flex flex-col items-end gap-1 w-64\">\n {pushLoadingBranches ? (\n <div className=\"flex items-center gap-2 p-3 border rounded-lg bg-base-200 opacity-70 w-full\">\n <span className=\"loading loading-spinner loading-xs\"></span> Loading branches...\n </div>\n ) : (\n <select className=\"select select-bordered w-full\" value={pushSelectedRemoteBranch} onChange={(e) => setPushSelectedRemoteBranch(e.target.value)} disabled={isPushing}>\n {pushBranch && !pushRemoteBranches.includes(pushBranch) && <option value={pushBranch}>{pushBranch} (new)</option>}\n {pushRemoteBranches.map((branch) => <option key={branch} value={branch}>{branch}{pushTrackingBranch?.remote === pushSelectedRemote && pushTrackingBranch?.branch === branch ? ' (tracking)' : ''}</option>)}\n </select>\n )}\n {pushSelectedRemoteBranch && !pushRemoteBranches.includes(pushSelectedRemoteBranch) && (\n <div className=\"label\"><span className=\"label-text-alt text-warning\">New branch will be created</span></div>\n )}\n </div>\n </div>\n\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={pushRebaseFirst} onChange={(e) => setPushRebaseFirst(e.target.checked)} disabled={isPushing || pushForcePush} />\n <span className=\"label-text\">Rebase onto remote branch before pushing</span>\n </label>\n </div>\n\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm checkbox-error\" checked={pushForcePush} onChange={(e) => setPushForcePush(e.target.checked)} disabled={isPushing} />\n <span className=\"label-text text-error\">Force push</span>\n </label>\n </div>\n\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={pushLocalOnlyTags} onChange={(e) => setPushLocalOnlyTags(e.target.checked)} disabled={isPushing} />\n <span className=\"label-text\">Push all tags</span>\n </label>\n </div>\n\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={pushSquash} onChange={(e) => handlePushSquashToggle(e.target.checked)} disabled={isPushing} />\n <span className=\"label-text\">Squash local commits before push</span>\n </label>\n </div>\n {pushSquash && (\n <textarea className=\"textarea textarea-bordered w-full\" placeholder=\"Commit message for squash\" value={pushSquashMessage} onChange={(e) => setPushSquashMessage(e.target.value)} disabled={isPushing} autoFocus />\n )}\n\n {pushError && (\n <div className=\"alert alert-error text-sm\">\n <span>{pushError}</span>\n </div>\n )}\n </div>\n )}\n\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={() => setIsPushOpen(false)} disabled={isPushing}>Cancel</button>\n {pushRemotes.length > 0 && (\n <button className=\"btn btn-primary\" onClick={handlePushToRemote} disabled={isPushing || !pushSelectedRemote || !pushSelectedRemoteBranch}>\n {isPushing && <span className=\"loading loading-spinner loading-xs\"></span>} Push\n </button>\n )}\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={() => setIsPushOpen(false)}>close</button>\n </form>\n </dialog>\n )}\n\n {isPullOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Pull from Remote</h3>\n <p className=\"py-4 break-words\">Pull changes from a remote branch into <span className=\"font-bold break-all\">{pullBranch}</span>.</p>\n\n {pullError && pullRemotes.length === 0 ? (\n <div className=\"alert alert-error\"><span>{pullError}</span></div>\n ) : pullLoadingRemotes ? (\n <div className=\"flex justify-center py-8\"><span className=\"loading loading-spinner loading-lg\"></span></div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n <div className=\"form-control w-full flex flex-row items-center justify-between gap-4\">\n <label className=\"label flex-shrink-0\"><span className=\"label-text\">Remote Repository</span></label>\n <select className=\"select select-bordered w-64\" value={pullSelectedRemote} onChange={(e) => handlePullRemoteChange(e.target.value)} disabled={isPulling}>\n {pullRemotes.map((remote) => <option key={remote} value={remote}>{remote}</option>)}\n </select>\n </div>\n\n <div className=\"form-control w-full flex flex-row items-center justify-between gap-4\">\n <label className=\"label flex-shrink-0\"><span className=\"label-text\">Remote Branch</span></label>\n {pullLoadingBranches ? (\n <div className=\"flex items-center gap-2 p-3 border rounded-lg bg-base-200 opacity-70 w-64\">\n <span className=\"loading loading-spinner loading-xs\"></span> Loading branches...\n </div>\n ) : (\n <select className=\"select select-bordered w-64\" value={pullSelectedRemoteBranch} onChange={(e) => setPullSelectedRemoteBranch(e.target.value)} disabled={isPulling}>\n {pullRemoteBranches.map((branch) => <option key={branch} value={branch}>{branch}{pullTrackingBranch?.remote === pullSelectedRemote && pullTrackingBranch?.branch === branch ? ' (tracking)' : ''}</option>)}\n </select>\n )}\n </div>\n\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={pullRebase} onChange={(e) => setPullRebase(e.target.checked)} disabled={isPulling} />\n <span className=\"label-text\">Rebase onto remote branch</span>\n </label>\n </div>\n\n {pullError && <div className=\"alert alert-error text-sm\"><span>{pullError}</span></div>}\n </div>\n )}\n\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={() => setIsPullOpen(false)} disabled={isPulling}>Cancel</button>\n {pullRemotes.length > 0 && (\n <button className=\"btn btn-primary\" onClick={handlePullFromRemote} disabled={isPulling || !pullSelectedRemote || !pullSelectedRemoteBranch}>\n {isPulling && <span className=\"loading loading-spinner loading-xs\"></span>} Pull\n </button>\n )}\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={() => setIsPullOpen(false)}>close</button>\n </form>\n </dialog>\n )}\n\n {isCreateTagOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Create Tag</h3>\n <p className=\"py-4 break-words\">\n Create a new tag at commit <span className=\"font-mono bg-base-200 px-1 rounded\">{createTagCommitHash?.substring(0, 7)}</span>.\n </p>\n <input\n type=\"text\"\n className=\"input input-bordered w-full font-mono\"\n value={newTagName}\n onChange={(e) => setNewTagName(e.target.value)}\n placeholder=\"Tag name\"\n disabled={isCreatingTag}\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter' && newTagName.trim() && !isCreatingTag) {\n e.preventDefault();\n handleCreateTag();\n }\n }}\n />\n <div className=\"form-control mt-3\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-sm\"\n checked={pushTagToRemote}\n onChange={(e) => setPushTagToRemote(e.target.checked)}\n disabled={isCreatingTag}\n />\n <span className=\"label-text\">Push tag to remote after creation</span>\n </label>\n </div>\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={() => {\n setIsCreateTagOpen(false);\n setCreateTagCommitHash(null);\n setNewTagName('');\n setPushTagToRemote(false);\n }}\n disabled={isCreatingTag}\n >\n Cancel\n </button>\n <button className=\"btn btn-primary\" onClick={handleCreateTag} disabled={!newTagName.trim() || isCreatingTag}>\n {isCreatingTag && <span className=\"loading loading-spinner loading-xs\"></span>}\n Create\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={() => {\n setIsCreateTagOpen(false);\n setCreateTagCommitHash(null);\n setNewTagName('');\n setPushTagToRemote(false);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {iscreateBranchOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Create New Branch</h3>\n <p className=\"py-4 break-words\">\n Create a new branch from{' '}\n <span className=\"font-bold break-all\">\n {createBranchFromRef ? createBranchFromRef.replace(/^remotes\\//, '') : 'current HEAD'}\n </span>.\n </p>\n <input\n type=\"text\"\n className=\"input input-bordered w-full\"\n value={newBranchName}\n onChange={e => setNewBranchName(sanitizeBranchName(e.target.value))}\n placeholder=\"Branch name\"\n disabled={isCreating}\n autoFocus\n onKeyDown={e => {\n if (e.key === 'Enter' && newBranchName && !isCreating) {\n e.preventDefault();\n handleCreateBranch();\n }\n }}\n />\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={() => {\n setIsCreateBranchOpen(false);\n setCreateBranchFromRef(null);\n }}\n disabled={isCreating}\n >\n Cancel\n </button>\n <button className=\"btn btn-primary\" onClick={handleCreateBranch} disabled={!newBranchName || isCreating}>\n {isCreating && <span className=\"loading loading-spinner loading-xs\"></span>} Create & Checkout\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={() => {\n setIsCreateBranchOpen(false);\n setCreateBranchFromRef(null);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isCheckoutToLocalOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Checkout to Local Branch</h3>\n <p className=\"py-4 break-words\">Create a local branch from <span className=\"font-bold break-all\">{checkoutRemoteBranch?.replace(/^remotes\\//, '')}</span> and set up tracking.</p>\n <div className=\"form-control w-full\">\n <label className=\"label\"><span className=\"label-text\">Local Branch Name</span></label>\n <input\n type=\"text\"\n className=\"input input-bordered w-full\"\n value={checkoutLocalBranchName}\n onChange={e => setCheckoutLocalBranchName(sanitizeBranchName(e.target.value))}\n placeholder=\"Local branch name\"\n disabled={isCheckingOutToLocal}\n autoFocus\n onKeyDown={e => {\n if (e.key === 'Enter' && checkoutLocalBranchName && !isCheckingOutToLocal) {\n e.preventDefault();\n handleCheckoutToLocal();\n }\n }}\n />\n </div>\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={() => setIsCheckoutToLocalOpen(false)} disabled={isCheckingOutToLocal}>Cancel</button>\n <button className=\"btn btn-primary\" onClick={handleCheckoutToLocal} disabled={!checkoutLocalBranchName || isCheckingOutToLocal}>\n {isCheckingOutToLocal && <span className=\"loading loading-spinner loading-xs\"></span>} Checkout\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={() => setIsCheckoutToLocalOpen(false)}>close</button>\n </form>\n </dialog>\n )}\n\n {scriptExecution.isOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box max-w-4xl\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <h3 className=\"font-bold text-lg truncate\">Custom Script: {scriptExecution.scriptName}</h3>\n <p className=\"text-xs opacity-70 mt-1 break-all\">\n Branch: {scriptExecution.branchRef}\n </p>\n </div>\n <span\n className={cn(\n \"badge badge-sm shrink-0\",\n scriptExecution.status === 'running' || scriptExecution.status === 'starting'\n ? 'badge-info'\n : scriptExecution.status === 'completed'\n ? 'badge-success'\n : scriptExecution.status === 'failed'\n ? 'badge-error'\n : scriptExecution.status === 'canceled'\n ? 'badge-warning'\n : 'badge-ghost'\n )}\n >\n {scriptExecution.status}\n </span>\n </div>\n\n <div className=\"mt-4 border border-base-300 rounded bg-base-200/40\">\n <pre className=\"p-3 font-mono text-xs overflow-auto max-h-[50vh] whitespace-pre-wrap break-words\">{scriptExecution.output || 'Waiting for output...'}</pre>\n </div>\n\n {scriptExecution.error && (\n <div className=\"alert alert-error py-2 mt-3\">\n <span>{scriptExecution.error}</span>\n </div>\n )}\n\n <div className=\"modal-action\">\n <button\n className=\"btn btn-warning\"\n onClick={() => void handleCancelCustomScriptExecution()}\n disabled={!isScriptExecutionRunning || isCancelingScriptExecution}\n >\n {isCancelingScriptExecution && <span className=\"loading loading-spinner loading-xs\"></span>}\n Cancel\n </button>\n <button\n className=\"btn btn-outline\"\n onClick={() => void handleCopyCustomScriptOutput()}\n disabled={isCopyingScriptOutput}\n >\n {isCopyingScriptOutput && <span className=\"loading loading-spinner loading-xs\"></span>}\n {didCopyScriptOutput ? 'Copied' : 'Copy'}\n </button>\n <button\n className=\"btn btn-primary\"\n onClick={() => {\n setScriptExecution(DEFAULT_SCRIPT_EXECUTION);\n setDidCopyScriptOutput(false);\n setIsCancelingScriptExecution(false);\n }}\n disabled={!isScriptExecutionFinished}\n >\n Done\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={(e) => {\n if (!isScriptExecutionFinished) {\n e.preventDefault();\n return;\n }\n setScriptExecution(DEFAULT_SCRIPT_EXECUTION);\n setDidCopyScriptOutput(false);\n setIsCancelingScriptExecution(false);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {/* Main Content */}\n <div className=\"flex-1 flex min-w-0 flex-col gap-2 overflow-hidden\">\n <div className=\"flex min-h-[57px] shrink-0 flex-wrap items-center justify-between gap-2 rounded-xl border border-slate-200 bg-white px-4 py-2 dark:border-slate-800 dark:bg-slate-900\">\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-2\">\n <h1 className=\"font-bold text-lg text-slate-900 dark:text-slate-100\">History</h1>\n <div className=\"relative\" ref={branchPopoverRef}>\n <button\n className={branchSelectButtonClass}\n onClick={() => setIsBranchPopoverOpen(prev => !prev)}\n title={currentBranchLabel}\n >\n <span className=\"truncate\">{currentBranchLabel}</span>\n <i className={cn(\"iconoir-nav-arrow-down text-[16px] shrink-0 transition-transform opacity-60\", isBranchPopoverOpen && \"rotate-180\")} aria-hidden=\"true\" />\n </button>\n {isBranchPopoverOpen && (\n <div className=\"absolute left-0 top-full mt-2 z-50\">\n {branchTreePopoverContent}\n </div>\n )}\n </div>\n <div className=\"flex flex-wrap items-center gap-2 shrink-0\">\n <button\n className={headerActionButtonClass}\n onClick={() => void handleFetchFromAllRemotes()}\n disabled={isFetchingAllRemotes || isPullingAllBranches || isPullOpen || isPushOpen}\n title=\"Fetch latest changes from all remotes\"\n >\n {isFetchingAllRemotes ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <i className=\"iconoir-refresh text-[16px]\" aria-hidden=\"true\" />\n )}\n <span className={headerActionLabelClass}>Fetch</span>\n </button>\n <button\n className={headerActionButtonClass}\n onClick={confirmPullCurrentBranch}\n disabled={!!pullActionDisabledReason || isPullingAllBranches || isPullOpen || isPushOpen}\n title={pullActionDisabledReason || `Pull from ${currentTrackingBranch?.upstream}`}\n >\n {pullLoadingRemotes ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <i className=\"iconoir-arrow-down text-[16px]\" aria-hidden=\"true\" />\n )}\n <span className={headerActionLabelClass}>Pull</span>\n </button>\n <button\n className={headerActionButtonClass}\n onClick={() => void handlePullAllBranches()}\n disabled={!!pullAllActionDisabledReason || isPullOpen || isPushOpen || isPullingAllBranches}\n title={pullAllActionDisabledReason || 'Pull all local branches from tracking remote branches'}\n >\n {isPullingAllBranches ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <i className=\"iconoir-arrow-down text-[16px]\" aria-hidden=\"true\" />\n )}\n <span className={headerActionLabelClass}>Pull All</span>\n </button>\n <button\n className={headerActionButtonClass}\n onClick={confirmPushCurrentBranch}\n disabled={!!pushActionDisabledReason || isPullingAllBranches || isPullOpen || isPushOpen}\n title={pushActionDisabledReason || (currentTrackingBranch ? `Push to ${currentTrackingBranch.upstream}` : 'Push current branch to remote')}\n >\n {pushLoadingRemotes ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <i className=\"iconoir-arrow-up text-[16px]\" aria-hidden=\"true\" />\n )}\n <span className={headerActionLabelClass}>Push</span>\n </button>\n </div>\n </div>\n <div className=\"shrink-0 flex flex-wrap items-center gap-2\">\n <button\n className={headerActionButtonClass}\n onClick={() => void handleOpenRepoTerminal()}\n disabled={isOpeningRepoTerminal}\n title=\"Open terminal in repository folder\"\n >\n {isOpeningRepoTerminal ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <i className=\"iconoir-terminal text-[16px]\" aria-hidden=\"true\" />\n )}\n <span className={headerActionLabelClass}>Open Terminal</span>\n </button>\n <button\n className={headerActionButtonClass}\n onClick={() => void handleOpenRepoFolder()}\n disabled={isOpeningRepoFolder}\n title=\"Open repository folder in Finder\"\n >\n {isOpeningRepoFolder ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <i className=\"iconoir-folder text-[16px]\" aria-hidden=\"true\" />\n )}\n <span className={headerActionLabelClass}>Open Repo Folder</span>\n </button>\n </div>\n </div>\n\n <div className=\"relative flex-1 overflow-hidden rounded-xl border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-900\">\n {/* Show loading spinner while branches are loading if visibility filters are set */}\n {hasVisibilityFilters && isBranchesLoading ? (\n <div className=\"flex items-center justify-center h-full\">\n <span className=\"loading loading-spinner loading-lg opacity-50\"></span>\n </div>\n ) : (\n <GitGraph\n ref={gitGraphRef}\n commits={filteredCommits}\n selectedHash={selectedHash || undefined}\n selectedHashes={selectedCommitHashSet}\n onSelectCommit={handleSelectCommit}\n onResetToCommit={handleResetToCommit}\n onRevertCommit={confirmRevertCommit}\n onCreateTag={confirmCreateTag}\n onCherryPickCommit={confirmCherryPickCommit}\n onCherryPickSelectedCommits={confirmCherryPickSelectedCommits}\n onRewordCommit={confirmRewordCommit}\n localBranches={branchData?.branches || []}\n trackingInfo={branchData?.trackingInfo}\n onEndReached={() => {\n if (!isFetching && log.all.length >= limit) {\n setLimit(l => l + 50);\n }\n }}\n isLoadingMore={isFetching && limit > 100}\n currentBranch={branchData?.current}\n hiddenBranches={hiddenBranches}\n getBranchTagContextMenuItems={getBranchTagContextMenuItems}\n />\n )}\n </div>\n\n {selectedHash && (\n <div\n className=\"flex flex-col overflow-hidden rounded-xl border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-900\"\n style={{ height: panelHeight }}\n >\n {/* Resize handle */}\n <div\n className={cn(\n \"h-1.5 cursor-ns-resize flex items-center justify-center hover:bg-slate-100 transition-colors group shrink-0 dark:hover:bg-slate-800/60\",\n isResizing && \"bg-slate-100 dark:bg-slate-800/60\"\n )}\n onMouseDown={handleResizeStart}\n >\n <div className=\"w-8 h-1 rounded-full bg-base-300 group-hover:bg-base-content/20 transition-colors\" />\n </div>\n\n {/* Header with commit info */}\n <div className=\"flex flex-row items-center py-2 px-4 border-b border-slate-200 dark:border-slate-800 bg-slate-50/70 dark:bg-slate-900 shrink-0 justify-between gap-4\">\n <div className=\"flex items-center gap-4 flex-1 min-w-0\">\n {isCommitRangeSelection && selectedCommitRange ? (\n <>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-bold truncate\">\n {selectedCommitRange.latestHash.substring(0, 7)}: {selectedCommitRange.latestCommit.message}\n </div>\n <div className=\"text-sm font-bold truncate opacity-75\">\n {selectedCommitRange.oldestHash.substring(0, 7)}: {selectedCommitRange.oldestCommit.message}\n </div>\n </div>\n </>\n ) : (\n <>\n <span className=\"text-sm font-bold truncate\">\n {selectedCommit?.message}\n </span>\n <span className=\"text-xs font-mono opacity-50 shrink-0\">\n {selectedHash.substring(0, 7)}\n </span>\n </>\n )}\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <button\n className=\"ml-2 flex items-center justify-center h-8 w-8 rounded-md hover:bg-slate-100 dark:hover:bg-slate-800 text-slate-600 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100\"\n onClick={() => selectSingleCommit(null)}\n title=\"Close\"\n >\n ✕\n </button>\n </div>\n </div>\n\n {isCommitRangeSelection && selectedCommitRange ? (\n <div className=\"flex-1 overflow-hidden min-h-0 flex flex-col bg-white dark:bg-slate-900\">\n <div className=\"px-4 pt-2 pb-1 text-[10px] uppercase tracking-wider font-bold opacity-60 border-b border-slate-200 dark:border-slate-800 bg-slate-50/70 dark:bg-slate-900 shrink-0\">\n Changes\n </div>\n <div className=\"flex-1 min-h-0\">\n <CommitChangesView\n repoPath={repoPath}\n fromCommitHash={selectedCommitRange.oldestHash}\n toCommitHash={selectedCommitRange.latestHash}\n />\n </div>\n </div>\n ) : (\n /* Combined commit message and changes content */\n <div\n ref={commitDetailsContentRef}\n className=\"flex-1 overflow-hidden bg-white dark:bg-slate-900 grid\"\n style={{\n gridTemplateRows: `${commitDetailsMessageRatio}fr 6px ${1 - commitDetailsMessageRatio}fr`,\n }}\n >\n <div className=\"border-b border-slate-200 dark:border-slate-800 bg-white dark:bg-slate-900 min-h-0 flex flex-col\">\n <div className=\"px-4 pt-3 pb-1 text-[10px] uppercase tracking-wider font-bold opacity-60\">\n Message\n </div>\n <div className=\"px-4 pb-3 overflow-auto flex-1 min-h-0\">\n <div className=\"text-xs opacity-70 whitespace-pre-wrap font-mono\">\n {selectedCommit\n ? formatCommitMessageForDisplay(\n selectedCommit.body?.trim()\n ? `${selectedCommit.message}\\n\\n${selectedCommit.body}`\n : selectedCommit.message\n )\n : 'No additional message'}\n </div>\n </div>\n </div>\n <div\n className={cn(\n 'cursor-ns-resize flex items-center justify-center hover:bg-slate-100 dark:hover:bg-slate-800/60 transition-colors',\n isCommitDetailsRatioResizing && 'bg-slate-100 dark:bg-slate-800/60'\n )}\n onMouseDown={handleCommitDetailsRatioResizeStart}\n >\n <div className=\"w-8 h-1 rounded-full bg-base-300\" />\n </div>\n <div className=\"flex-1 overflow-hidden min-h-0 flex flex-col\">\n <div className=\"px-4 pt-2 pb-1 text-[10px] uppercase tracking-wider font-bold opacity-60 border-b border-slate-200 dark:border-slate-800 bg-slate-50/70 dark:bg-slate-900 shrink-0\">\n Changes\n </div>\n <div className=\"flex-1 min-h-0\">\n <CommitChangesView repoPath={repoPath} commitHash={selectedHash} />\n </div>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useMemo, useRef, useState, useImperativeHandle, forwardRef, useEffect, useCallback } from 'react';\nimport { Commit, BranchTrackingInfo } from '@/lib/types';\nimport { generateGraphData } from '@/lib/graph-utils';\nimport { cn } from '@/lib/utils';\nimport { ContextMenu, ContextMenuItem } from '@/components/context-menu';\nimport { getBranchTagColors } from '@/lib/branch-colors';\n\n\nconst ROW_HEIGHT = 24; // Compact rows like Fork\nconst LANE_WIDTH = 12;\nconst DOT_SIZE = 3;\nconst STROKE_WIDTH = 2;\n\n// Helper function to highlight matching text\nfunction HighlightedText({ text, searchQuery }: { text: string; searchQuery: string }) {\n if (!searchQuery || !text) return <>{text}</>;\n \n const query = searchQuery.toLowerCase();\n const lowerText = text.toLowerCase();\n const parts: { text: string; highlighted: boolean }[] = [];\n \n let lastIndex = 0;\n let index = lowerText.indexOf(query);\n \n while (index !== -1) {\n // Add non-matching part\n if (index > lastIndex) {\n parts.push({ text: text.slice(lastIndex, index), highlighted: false });\n }\n // Add matching part (preserve original case)\n parts.push({ text: text.slice(index, index + query.length), highlighted: true });\n lastIndex = index + query.length;\n index = lowerText.indexOf(query, lastIndex);\n }\n \n // Add remaining non-matching part\n if (lastIndex < text.length) {\n parts.push({ text: text.slice(lastIndex), highlighted: false });\n }\n \n if (parts.length === 0) return <>{text}</>;\n \n return (\n <>\n {parts.map((part, i) => \n part.highlighted ? (\n <mark key={i} className=\"bg-warning text-warning-content rounded-sm px-0.5\">{part.text}</mark>\n ) : (\n <span key={i}>{part.text}</span>\n )\n )}\n </>\n );\n}\n\nexport interface GitGraphHandle {\n scrollToCommit: (hash: string) => boolean;\n}\n\nexport const GitGraph = forwardRef<GitGraphHandle, {\n commits: Commit[],\n onSelectCommit?: (hash: string, modifiers?: { isMultiSelect: boolean; isRangeSelect: boolean }) => void,\n onResetToCommit?: (hash: string) => void,\n onRevertCommit?: (hash: string, message: string) => void,\n onCreateTag?: (hash: string) => void,\n onCherryPickCommit?: (hash: string, message: string) => void,\n onCherryPickSelectedCommits?: () => void,\n onRewordCommit?: (hash: string, subject: string, body: string, branch: string) => void,\n selectedHash?: string,\n selectedHashes?: Set<string>,\n onEndReached?: () => void,\n isLoadingMore?: boolean,\n currentBranch?: string,\n hiddenBranches?: Set<string>,\n localBranches?: string[],\n trackingInfo?: Record<string, BranchTrackingInfo>,\n getBranchTagContextMenuItems?: (displayRef: string) => ContextMenuItem[] | null\n}>(function GitGraph({\n commits,\n onSelectCommit,\n onResetToCommit,\n onRevertCommit,\n onCreateTag,\n onCherryPickCommit,\n onCherryPickSelectedCommits,\n onRewordCommit,\n selectedHash,\n selectedHashes,\n onEndReached,\n isLoadingMore,\n currentBranch,\n hiddenBranches,\n localBranches = [],\n trackingInfo,\n getBranchTagContextMenuItems\n}, ref) {\n const normalizeDecoratedRef = useCallback((ref: string) => {\n if (ref.startsWith('refs/heads/')) return ref.slice('refs/heads/'.length);\n if (ref.startsWith('refs/remotes/')) return ref.slice('refs/remotes/'.length);\n if (ref.startsWith('remotes/')) return ref.slice('remotes/'.length);\n return ref;\n }, []);\n const getRefDisplayName = useCallback((ref: string) => {\n if (ref.startsWith('tag:')) return ref.replace(/^tag:\\s*/, '').trim();\n return ref;\n }, []);\n\n const nodes = useMemo(\n () => generateGraphData(commits, { localBranches }),\n [commits, localBranches]\n );\n const scrollRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n \n // Search state\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n \n // Handle Cmd+F to open search\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Cmd+F (Mac) or Ctrl+F (Windows/Linux)\n if ((e.metaKey || e.ctrlKey) && e.key === 'f') {\n e.preventDefault();\n setIsSearchOpen(true);\n // Focus input after render\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }\n // Escape to close search\n if (e.key === 'Escape' && isSearchOpen) {\n setIsSearchOpen(false);\n setSearchQuery('');\n }\n };\n \n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isSearchOpen]);\n \n const handleCloseSearch = useCallback(() => {\n setIsSearchOpen(false);\n setSearchQuery('');\n }, []);\n\n // Expose scrollToCommit function via ref\n useImperativeHandle(ref, () => ({\n scrollToCommit: (hash: string) => {\n if (!nodes || nodes.length === 0) return false;\n \n const index = nodes.findIndex(n => n.hash === hash);\n if (index === -1) return false;\n \n // Scroll to the commit row\n if (scrollRef.current) {\n const scrollTop = index * ROW_HEIGHT - (scrollRef.current.clientHeight / 2) + ROW_HEIGHT / 2;\n scrollRef.current.scrollTop = Math.max(0, scrollTop);\n }\n return true;\n }\n }), [nodes]);\n\n if (!nodes || nodes.length === 0) return null;\n\n // Calculate SVG dimensions\n const maxLane = Math.max(...nodes.map(n => n.x), 0);\n const width = (maxLane + 1) * LANE_WIDTH + 20;\n const height = nodes.length * ROW_HEIGHT;\n\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, clientHeight, scrollHeight } = e.currentTarget;\n if (scrollHeight - scrollTop - clientHeight < 100) {\n onEndReached?.();\n }\n };\n\n return (\n <div className=\"flex flex-col h-full overflow-hidden bg-white dark:bg-slate-900 font-mono text-sm select-none\">\n {/* Search Input - Sticky on top */}\n {isSearchOpen && (\n <div className=\"sticky top-0 z-30 bg-white dark:bg-slate-900 border-b border-base-300 px-2 py-2 flex items-center gap-2\">\n <span className=\"opacity-50\">🔍</span>\n <input\n ref={searchInputRef}\n type=\"text\"\n placeholder=\"Search in commits...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"input input-bordered input-sm flex-1 text-sm\"\n autoFocus\n />\n <div className=\"tooltip tooltip-left z-50\" data-tip=\"Close search (Esc)\">\n <button\n onClick={handleCloseSearch}\n className=\"btn btn-ghost btn-sm btn-square\"\n >\n ✖️\n </button>\n </div>\n </div>\n )}\n \n <div className=\"flex-1 overflow-auto h-full max-w-full px-2\" onScroll={handleScroll} ref={scrollRef}>\n <div className=\"relative min-w-full\" style={{ height }}>\n {/* SVG Graph Layout */}\n <svg width={width} height={height} className=\"absolute top-0 left-0 pointer-events-none z-10\">\n {nodes.map((node) => (\n <g key={node.hash}>\n {/* Draw paths */}\n {node.paths.map((path, i) => {\n const x1 = path.x1 * LANE_WIDTH + LANE_WIDTH / 2;\n const y1 = path.y1 * ROW_HEIGHT + ROW_HEIGHT / 2;\n const x2 = path.x2 * LANE_WIDTH + LANE_WIDTH / 2;\n const y2 = path.y2 * ROW_HEIGHT + ROW_HEIGHT / 2;\n\n let d = '';\n if (path.type === 'straight') {\n d = `M ${x1} ${y1} L ${x2} ${y2}`;\n } else {\n // Fork/Merge styled Bezier\n // Standard cubic bezier: ctrl points at mid-y\n const cy1 = y1 + ROW_HEIGHT * 0.5;\n const cy2 = y2 - ROW_HEIGHT * 0.5;\n d = `M ${x1} ${y1} C ${x1} ${cy1}, ${x2} ${cy2}, ${x2} ${y2}`;\n }\n\n return (\n <path\n key={i}\n d={d}\n stroke={path.color}\n strokeWidth={STROKE_WIDTH}\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n )\n })}\n </g>\n ))}\n\n {/* Draw Nodes on top of all paths to avoid overlap ugliness */}\n {nodes.map((node) => (\n <circle\n key={`dot-${node.hash}`}\n cx={node.x * LANE_WIDTH + LANE_WIDTH / 2}\n cy={node.y * ROW_HEIGHT + ROW_HEIGHT / 2}\n r={DOT_SIZE}\n fill={node.color}\n stroke={node.color}\n strokeWidth={STROKE_WIDTH}\n />\n ))}\n </svg>\n\n {/* List Rows */}\n <div style={{ width: '100%' }}>\n {nodes.map((node) => {\n const isSelected = selectedHashes ? selectedHashes.has(node.hash) : selectedHash === node.hash;\n const selectedCount = selectedHashes?.size ?? (selectedHash ? 1 : 0);\n const menuItems: ContextMenuItem[] = [\n {\n label: \"Reset to here\",\n icon: <i className=\"iconoir-refresh-circle text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => onResetToCommit?.(node.hash),\n },\n ];\n if (onRevertCommit) {\n menuItems.push({\n label: \"Revert commit\",\n icon: <i className=\"iconoir-u-turn-arrow-left text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => onRevertCommit(node.hash, node.message),\n });\n }\n if (onCreateTag) {\n menuItems.push({\n label: \"Create tag\",\n icon: <i className=\"iconoir-bookmark text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => onCreateTag(node.hash),\n });\n }\n if (onCherryPickCommit) {\n menuItems.push({\n label: \"Cherry-pick commit\",\n icon: <i className=\"iconoir-git-fork text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => onCherryPickCommit(node.hash, node.message),\n });\n }\n if (onCherryPickSelectedCommits && selectedCount > 1 && isSelected) {\n menuItems.push({\n label: `Cherry-pick ${selectedCount} selected commits`,\n icon: <i className=\"iconoir-git-fork text-[14px]\" aria-hidden=\"true\" />,\n onClick: onCherryPickSelectedCommits,\n });\n }\n\n if (onRewordCommit && localBranches && localBranches.length > 0) {\n // Clean up refs: remove parentheses and split\n const refs = node.refs ? node.refs.replace(/[()]/g, '').split(',').map(r => r.trim()) : [];\n let targetBranch: string | null = null;\n\n for (const ref of refs) {\n // Handle \"HEAD -> branch\" format\n const cleanRef = ref.replace(/^HEAD\\s*->\\s*/, '');\n\n // Check if it is in localBranches\n if (localBranches.includes(cleanRef)) {\n targetBranch = cleanRef;\n // Prioritize current branch if found\n if (currentBranch && cleanRef === currentBranch) {\n break;\n }\n }\n }\n\n if (targetBranch) {\n menuItems.push({\n label: \"Reword commit\",\n icon: <i className=\"iconoir-edit-pencil text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => onRewordCommit(node.hash, node.message, node.body ?? '', targetBranch!),\n });\n }\n }\n\n\n // Process refs to combine local and tracking remote branches\n const processRefs = () => {\n if (!node.refs) return [];\n\n const rawRefs = node.refs.replace(/^\\s*\\((.*)\\)\\s*$/, '$1').split(',').map(r => {\n const isHead = r.startsWith('HEAD -> ');\n const name = normalizeDecoratedRef(r.replace(/^HEAD\\s*->\\s*/, '').trim());\n return { raw: r, name, isHead };\n });\n\n const result: {\n displayName: string;\n primaryRef: string;\n secondaryRef?: string;\n isHead: boolean\n }[] = [];\n\n const processedIndices = new Set<number>();\n const isHidden = (name: string) => hiddenBranches && (hiddenBranches.has(name) || hiddenBranches.has(`remotes/${name}`));\n\n // First pass: find local branches and their tracking remotes\n rawRefs.forEach((ref, idx) => {\n if (processedIndices.has(idx)) return;\n\n // Only attempt to combine if local branch is visible\n if (localBranches.includes(ref.name) && !isHidden(ref.name)) {\n const tracking = trackingInfo?.[ref.name];\n if (tracking && tracking.upstream) {\n const normalizedUpstream = normalizeDecoratedRef(tracking.upstream.trim());\n const upstreamCandidates = new Set([\n normalizedUpstream,\n normalizeDecoratedRef(`remotes/${normalizedUpstream}`),\n normalizeDecoratedRef(`refs/remotes/${normalizedUpstream}`),\n ]);\n const upstreamIdx = rawRefs.findIndex(\n (r, i) => i !== idx && !processedIndices.has(i) && upstreamCandidates.has(r.name)\n );\n\n if (upstreamIdx !== -1) {\n const upstreamRef = rawRefs[upstreamIdx];\n const parts = normalizedUpstream.split('/');\n const remoteName = parts[0];\n\n result.push({\n displayName: `${ref.name} (${remoteName})`,\n primaryRef: ref.name,\n secondaryRef: upstreamRef.name,\n isHead: ref.isHead\n });\n\n processedIndices.add(idx);\n processedIndices.add(upstreamIdx);\n return;\n }\n }\n }\n });\n\n // Second pass: add remaining refs\n rawRefs.forEach((ref, idx) => {\n if (!processedIndices.has(idx)) {\n // Skip hidden branches\n if (isHidden(ref.name)) return;\n\n result.push({\n displayName: getRefDisplayName(ref.name),\n primaryRef: ref.name,\n isHead: ref.isHead\n });\n }\n });\n\n return result;\n };\n\n const processedTags = processRefs();\n\n return (\n <ContextMenu key={node.hash} items={menuItems}>\n <div\n className={cn(\n \"flex items-center hover:bg-base-200 border-b border-base-200 last:border-0 cursor-pointer transition-colors text-xs\",\n isSelected && \"bg-primary/10\"\n )}\n style={{ height: ROW_HEIGHT }}\n onClick={(e) => onSelectCommit?.(node.hash, {\n isMultiSelect: e.metaKey || e.ctrlKey,\n isRangeSelect: e.shiftKey,\n })}\n >\n {/* Spacing for Graph */}\n <div style={{ width: width, flexShrink: 0 }} />\n\n {/* Content */}\n <div className=\"flex flex-1 gap-4 overflow-hidden pr-4 items-center\">\n <div className=\"flex-1 truncate flex items-center gap-2\">\n {/* Refs Pills */}\n {processedTags.map((tag, idx) => {\n const isCurrent = currentBranch && (\n tag.primaryRef === currentBranch ||\n tag.isHead && tag.primaryRef === currentBranch\n );\n const isGitTag = tag.primaryRef.startsWith('tag:');\n const tagColors = isGitTag\n ? { textColor: '#374151', backgroundColor: '#e5e7eb' }\n : getBranchTagColors(tag.primaryRef);\n\n const tagElement = (\n <span\n className={cn(\n \"text-[10px] px-1.5 rounded-full whitespace-nowrap shrink-0\",\n isCurrent && \"font-bold\"\n )}\n style={{\n color: tagColors.textColor,\n backgroundColor: tagColors.backgroundColor\n }}\n title={tag.displayName}\n >\n <HighlightedText text={tag.displayName} searchQuery={searchQuery} />\n </span>\n );\n\n const branchMenuItems = getBranchTagContextMenuItems?.(tag.primaryRef) || [];\n\n if (branchMenuItems.length === 0) {\n return <span key={idx} className=\"shrink-0\">{tagElement}</span>;\n }\n\n return (\n <ContextMenu\n key={idx}\n items={branchMenuItems}\n containerClassName=\"inline-flex shrink-0\"\n >\n {tagElement}\n </ContextMenu>\n );\n })}\n <span className={cn(\"truncate min-w-0 max-w-[600px]\", isSelected ? \"font-semibold\" : \"\")} title={node.message}>\n <HighlightedText text={node.message} searchQuery={searchQuery} />\n </span>\n </div>\n <div className=\"w-32 truncate opacity-70 text-right\">\n <HighlightedText text={node.author_name} searchQuery={searchQuery} />\n </div>\n <div className=\"w-20 truncate opacity-50 font-mono text-right\">\n <HighlightedText text={node.hash.substring(0, 7)} searchQuery={searchQuery} />\n </div>\n <div className=\"w-32 truncate opacity-70 text-right\">\n {new Date(node.date).toLocaleString(undefined, {\n month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit'\n })}\n </div>\n </div>\n </div>\n </ContextMenu>\n );\n })}\n \n {/* Loading More Indicator */}\n {isLoadingMore && (\n <div className=\"flex items-center justify-center py-8 border-b border-base-300\">\n <span className=\"loading loading-spinner text-base-content/50\"></span>\n <span className=\"ml-2 text-sm opacity-70\">Loading more commits...</span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n});\n","export interface BranchTagColors {\n backgroundColor: string;\n textColor: string;\n}\n\nfunction hashString(input: string): number {\n let hash = 2166136261;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\nexport function getBranchColorSeed(branchName: string): number {\n return hashString(branchName);\n}\n\nfunction hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n const sat = s / 100;\n const light = l / 100;\n const c = (1 - Math.abs(2 * light - 1)) * sat;\n const hh = h / 60;\n const x = c * (1 - Math.abs((hh % 2) - 1));\n\n let r1 = 0;\n let g1 = 0;\n let b1 = 0;\n\n if (hh >= 0 && hh < 1) {\n r1 = c;\n g1 = x;\n } else if (hh >= 1 && hh < 2) {\n r1 = x;\n g1 = c;\n } else if (hh >= 2 && hh < 3) {\n g1 = c;\n b1 = x;\n } else if (hh >= 3 && hh < 4) {\n g1 = x;\n b1 = c;\n } else if (hh >= 4 && hh < 5) {\n r1 = x;\n b1 = c;\n } else {\n r1 = c;\n b1 = x;\n }\n\n const m = light - c / 2;\n return {\n r: Math.round((r1 + m) * 255),\n g: Math.round((g1 + m) * 255),\n b: Math.round((b1 + m) * 255),\n };\n}\n\nfunction relativeLuminance({ r, g, b }: { r: number; g: number; b: number }): number {\n const toLinear = (channel: number) => {\n const value = channel / 255;\n return value <= 0.03928 ? value / 12.92 : Math.pow((value + 0.055) / 1.055, 2.4);\n };\n\n const rLin = toLinear(r);\n const gLin = toLinear(g);\n const bLin = toLinear(b);\n return 0.2126 * rLin + 0.7152 * gLin + 0.0722 * bLin;\n}\n\nfunction getReadableTextColor(rgb: { r: number; g: number; b: number }): string {\n const backgroundLum = relativeLuminance(rgb);\n const whiteContrast = (1.05) / (backgroundLum + 0.05);\n const blackContrast = (backgroundLum + 0.05) / 0.05;\n return whiteContrast >= blackContrast ? '#ffffff' : '#111827';\n}\n\nexport function getBranchTagColors(branchName: string): BranchTagColors {\n const hash = getBranchColorSeed(branchName);\n\n const hue = hash % 360;\n const saturation = 72 + ((hash >>> 9) % 20); // 72-91\n const lightness = 84 + ((hash >>> 17) % 8); // 84-91\n\n const rgb = hslToRgb(hue, saturation, lightness);\n const textColor = getReadableTextColor(rgb);\n const backgroundColor = `hsl(${hue} ${saturation}% ${lightness}%)`;\n\n return {\n backgroundColor,\n textColor,\n };\n}\n\nexport function getBranchGraphColor(branchName: string): string {\n const hash = getBranchColorSeed(branchName);\n const hue = hash % 360;\n return `hsl(${hue} 82% 52%)`;\n}\n","\nimport { Commit } from './types';\nimport { getBranchGraphColor } from './branch-colors';\n\nexport interface GraphNode extends Commit {\n x: number; // Lane index (0, 1, 2...)\n y: number; // Row index\n color: string;\n paths: GraphPath[];\n isMerge: boolean; // Helper to draw different dot\n}\n\nexport interface GraphPath {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n color: string;\n type: 'straight' | 'merge' | 'fork';\n}\n\nfunction getLaneFallbackColor(lane: number): string {\n const hue = (lane * 47) % 360;\n return `hsl(${hue} 78% 56%)`;\n}\n\nfunction parseBranchRefs(refs?: string): string[] {\n if (!refs) return [];\n\n const normalizeDecoratedRef = (ref: string): string => {\n if (ref.startsWith('refs/heads/')) {\n return ref.slice('refs/heads/'.length);\n }\n if (ref.startsWith('refs/remotes/')) {\n return ref.slice('refs/remotes/'.length);\n }\n if (ref.startsWith('remotes/')) {\n return ref.slice('remotes/'.length);\n }\n return ref;\n };\n\n return refs\n .replace(/^\\s*\\((.*)\\)\\s*$/, '$1')\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean)\n .map((ref) => ref.replace(/^HEAD\\s*->\\s*/, '').trim())\n .map(normalizeDecoratedRef)\n .filter((ref) => !ref.startsWith('tag:'))\n .filter((ref) => ref !== 'HEAD')\n .filter((ref) => !/\\/HEAD$/.test(ref));\n}\n\nfunction getRemoteShortName(ref: string): string | null {\n const withoutPrefix = ref.startsWith('remotes/') ? ref.slice('remotes/'.length) : ref;\n const slashIndex = withoutPrefix.indexOf('/');\n if (slashIndex === -1) return null;\n return withoutPrefix.slice(slashIndex + 1);\n}\n\nfunction normalizeRefForColor(ref: string, localBranches: Set<string>): string {\n if (localBranches.has(ref)) return ref;\n const shortName = getRemoteShortName(ref);\n if (shortName && localBranches.has(shortName)) {\n return shortName;\n }\n return ref;\n}\n\nfunction isLocalRef(ref: string, localBranches: Set<string>): boolean {\n return localBranches.has(ref);\n}\n\nfunction choosePreferredRef(refs: string[], localBranches: Set<string>): string | null {\n if (refs.length === 0) return null;\n const localRef = refs.find((ref) => isLocalRef(ref, localBranches));\n if (localRef) return localRef;\n return refs[0];\n}\n\nfunction shouldReplaceLaneRef(nextRef: string, currentRef: string | null, localBranches: Set<string>): boolean {\n if (!currentRef) return true;\n return isLocalRef(nextRef, localBranches) && !isLocalRef(currentRef, localBranches);\n}\n\ninterface GenerateGraphOptions {\n localBranches?: string[];\n}\n\nexport function generateGraphData(commits: Commit[], options: GenerateGraphOptions = {}): GraphNode[] {\n const nodes: GraphNode[] = [];\n const localBranches = new Set(options.localBranches ?? []);\n \n // Mapping of which commit hash is currently \"expected\" at the bottom of a lane.\n // lanes[i] = \"hash123\" means lane i is drawing a line downwards towards hash123.\n const lanes: (string | null)[] = []; \n \n // Mapping of generic colors to lanes to keep consistency if possible\n const laneColors: (string | undefined)[] = [];\n const laneBranchRefs: (string | null)[] = [];\n \n function getNextFreeLane(): number {\n for (let i = 0; i < lanes.length; i++) {\n if (lanes[i] === null) return i;\n }\n return lanes.length;\n }\n\n function getColor(lane: number): string {\n const laneRef = laneBranchRefs[lane];\n const preferredColor = laneRef ? getBranchGraphColor(laneRef) : (laneColors[lane] ?? getLaneFallbackColor(lane));\n laneColors[lane] = preferredColor;\n return preferredColor;\n }\n\n commits.forEach((commit, index) => {\n const matchingLanes: number[] = [];\n for (let i = 0; i < lanes.length; i++) {\n if (lanes[i] === commit.hash) matchingLanes.push(i);\n }\n\n // 1. Identify which lane this commit belongs to.\n // It belongs to a lane if that lane is currently \"looking for\" this commit hash.\n let lane = matchingLanes.length > 0 ? matchingLanes[0] : -1;\n \n // If no lane is looking for me, I am a new tip (e.g. a branch head).\n if (lane === -1) {\n lane = getNextFreeLane();\n }\n \n // Ensure lanes array is large enough\n while (lanes.length <= lane) {\n lanes.push(null);\n laneBranchRefs.push(null);\n laneColors.push(undefined);\n }\n\n const preferredRef = choosePreferredRef(parseBranchRefs(commit.refs), localBranches);\n if (preferredRef) {\n const normalizedRef = normalizeRefForColor(preferredRef, localBranches);\n if (shouldReplaceLaneRef(normalizedRef, laneBranchRefs[lane], localBranches)) {\n laneBranchRefs[lane] = normalizedRef;\n }\n }\n \n // Update color for this lane if needed (though getNextFreeLane usually finds one)\n const color = getColor(lane);\n\n // 2. Prepare the Node\n const node: GraphNode = {\n ...commit,\n x: lane,\n y: index,\n color,\n paths: [],\n isMerge: commit.parents.length > 1\n };\n const duplicateMatchingLanes = matchingLanes.filter((i) => i !== lane);\n const duplicateLaneSet = new Set(duplicateMatchingLanes);\n\n // 3. Draw Vertical \"Rails\" for ALL other active lanes\n // These are connections from (lane, index) to (lane, index+1) \n // for branches that just \"pass through\" this row.\n for (let i = 0; i < lanes.length; i++) {\n if (i !== lane && lanes[i] !== null && !duplicateLaneSet.has(i)) {\n node.paths.push({\n x1: i, y1: index,\n x2: i, y2: index + 1,\n color: getColor(i),\n type: 'straight'\n });\n }\n }\n\n // 4. Process Parents & Update Lanes for next row\n // We are consuming 'lane' (it was pointing to us). \n // Now we need lanes to point to our parents.\n \n // Clear current lane (we reached the node)\n lanes[lane] = null;\n\n // If multiple lanes were targeting the same commit hash, keep them parallel\n // until this branch-out point and collapse them here.\n for (const duplicateLane of duplicateMatchingLanes) {\n // Replace the previous-row straight segment with a direct merge edge\n // into this commit, so we avoid a vertical+horizontal \"hook\" shape.\n if (index > 0) {\n const previousNode = nodes[nodes.length - 1];\n if (previousNode) {\n previousNode.paths = previousNode.paths.filter((path) => !(\n path.type === 'straight' &&\n path.x1 === duplicateLane &&\n path.y1 === index - 1 &&\n path.x2 === duplicateLane &&\n path.y2 === index\n ));\n }\n }\n\n node.paths.push({\n x1: duplicateLane,\n y1: index - 1,\n x2: lane,\n y2: index,\n color: getColor(duplicateLane),\n type: 'merge'\n });\n lanes[duplicateLane] = null;\n laneBranchRefs[duplicateLane] = null;\n laneColors[duplicateLane] = undefined;\n }\n \n const parents = commit.parents;\n \n if (parents.length > 0) {\n // Parent 0 takes the current lane (usually)\n const p0 = parents[0];\n\n // Always continue parent 0 in-place so sibling branches remain parallel\n // until the actual branch-out commit row.\n lanes[lane] = p0;\n node.paths.push({\n x1: lane, y1: index,\n x2: lane, y2: index + 1,\n color: color, \n type: 'straight'\n });\n \n // Other Parents (Merge Heads)\n // Other Parents (Merge Heads)\n for (let i = 1; i < parents.length; i++) {\n const p = parents[i];\n const existingPLane = lanes.indexOf(p);\n \n if (existingPLane !== -1) {\n // Merge to existing\n node.paths.push({\n x1: lane, y1: index,\n x2: existingPLane, y2: index + 1,\n color: getColor(existingPLane), \n type: 'fork'\n });\n } else {\n // New lane for this parent\n const newLane = getNextFreeLane();\n while (lanes.length <= newLane) {\n lanes.push(null);\n laneBranchRefs.push(null);\n laneColors.push(undefined);\n }\n \n lanes[newLane] = p;\n \n // Draw connection\n node.paths.push({\n x1: lane, y1: index,\n x2: newLane, y2: index + 1,\n color: getColor(newLane), \n type: 'fork'\n });\n }\n }\n \n }\n\n if (lanes[lane] === null) {\n laneBranchRefs[lane] = null;\n laneColors[lane] = undefined;\n }\n \n nodes.push(node);\n });\n \n return nodes;\n}\n","'use client';\n\nimport { useState, useEffect, useRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface ContextMenuItem {\n label: string;\n labelNode?: React.ReactNode;\n icon?: React.ReactNode;\n onClick?: () => void;\n danger?: boolean;\n children?: ContextMenuItem[];\n disabled?: boolean;\n}\n\nexport function ContextMenu({\n children,\n items,\n containerClassName = 'w-full',\n}: {\n children: React.ReactNode,\n items: ContextMenuItem[],\n containerClassName?: string\n}) {\n const [isOpen, setIsOpen] = useState(false);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const menuRef = useRef<HTMLUListElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handleContextMenu = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n \n // Calculate position relative to viewport\n const x = e.clientX;\n const y = e.clientY;\n \n setPosition({ x, y });\n setIsOpen(true);\n };\n\n // Close menu when clicking outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node) &&\n containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n // Use setTimeout to avoid immediate closure\n setTimeout(() => {\n document.addEventListener('click', handleClickOutside);\n document.addEventListener('contextmenu', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n }, 0);\n\n return () => {\n document.removeEventListener('click', handleClickOutside);\n document.removeEventListener('contextmenu', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [isOpen]);\n\n // Calculate menu width based on content and adjust position if menu would go off-screen\n useEffect(() => {\n if (!isOpen || !menuRef.current) return;\n\n const menu = menuRef.current;\n \n // Use requestAnimationFrame to ensure styles are applied\n requestAnimationFrame(() => {\n // Calculate optimal width based on content\n // Create a temporary element to measure text width\n const tempElement = document.createElement('div');\n tempElement.style.position = 'absolute';\n tempElement.style.visibility = 'hidden';\n tempElement.style.whiteSpace = 'nowrap';\n tempElement.style.pointerEvents = 'none';\n \n // Copy font styles from menu\n const menuStyles = window.getComputedStyle(menu);\n tempElement.style.fontSize = menuStyles.fontSize;\n tempElement.style.fontFamily = menuStyles.fontFamily;\n tempElement.style.fontWeight = menuStyles.fontWeight;\n tempElement.style.padding = '0.5rem 0.75rem'; // Match menu item padding\n tempElement.style.boxSizing = 'border-box';\n \n document.body.appendChild(tempElement);\n\n let maxWidth = 0;\n items.forEach(item => {\n tempElement.textContent = item.label;\n const width = tempElement.getBoundingClientRect().width;\n const iconWidth = item.icon ? 20 : 0;\n const submenuArrowWidth = item.children?.length ? 16 : 0;\n const totalWidth = width + iconWidth + submenuArrowWidth;\n if (totalWidth > maxWidth) {\n maxWidth = totalWidth;\n }\n });\n\n document.body.removeChild(tempElement);\n\n // Set menu width (add padding: 1rem on each side = 2rem total = 32px)\n const menuWidth = Math.max(maxWidth + 32, 280); // Minimum 280px, or content width + padding\n menu.style.width = `${menuWidth}px`;\n menu.style.minWidth = `${menuWidth}px`;\n\n // Now adjust position if menu would go off-screen\n const rect = menu.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let adjustedX = position.x;\n let adjustedY = position.y;\n\n // Adjust horizontal position if menu goes off right edge\n if (rect.right > viewportWidth) {\n adjustedX = viewportWidth - rect.width - 10;\n }\n // Adjust horizontal position if menu goes off left edge\n if (adjustedX < 10) {\n adjustedX = 10;\n }\n\n // Adjust vertical position if menu goes off bottom edge\n if (rect.bottom > viewportHeight) {\n adjustedY = viewportHeight - rect.height - 10;\n }\n // Adjust vertical position if menu goes off top edge\n if (adjustedY < 10) {\n adjustedY = 10;\n }\n\n if (adjustedX !== position.x || adjustedY !== position.y) {\n menu.style.left = `${adjustedX}px`;\n menu.style.top = `${adjustedY}px`;\n }\n });\n }, [isOpen, position, items]);\n\n const renderMenuItem = (item: ContextMenuItem, key: string) => {\n const hasChildren = !!item.children?.length;\n\n return (\n <li key={key} className={cn(hasChildren && \"relative group/submenu\")}>\n <a\n onClick={(e) => {\n e.stopPropagation();\n if (item.disabled || hasChildren) {\n return;\n }\n item.onClick?.();\n setIsOpen(false);\n }}\n className={cn(\n \"flex items-center gap-2\",\n \"whitespace-nowrap\",\n item.danger && \"text-error\",\n item.disabled && \"opacity-40 pointer-events-none\",\n hasChildren && \"flex items-center justify-between gap-3\"\n )}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n {item.icon && <span className=\"inline-flex shrink-0 opacity-80\">{item.icon}</span>}\n <span>{item.labelNode ?? item.label}</span>\n </span>\n {hasChildren && <i className=\"iconoir-nav-arrow-right text-[12px]\" aria-hidden=\"true\" />}\n </a>\n {hasChildren && (\n <>\n <span className=\"hidden group-hover/submenu:block absolute left-full top-0 h-full w-3\" />\n <ul className=\"hidden group-hover/submenu:block absolute left-[calc(100%-1px)] top-0 menu !m-0 p-2 shadow-lg bg-base-100 rounded-box border border-base-200 min-w-[220px] z-[10000] [&:before]:hidden\">\n {item.children!.map((child, idx) => renderMenuItem(child, `${key}-${idx}`))}\n </ul>\n </>\n )}\n </li>\n );\n };\n\n return (\n <div ref={containerRef} className={containerClassName} onContextMenu={handleContextMenu}>\n {children}\n {isOpen && (\n <ul\n ref={menuRef}\n className=\"fixed z-[9999] menu p-2 shadow-lg bg-base-100 rounded-box border border-base-200\"\n style={{\n left: `${position.x}px`,\n top: `${position.y}px`,\n }}\n >\n {items.map((item, idx) => renderMenuItem(item, `menu-${idx}`))}\n </ul>\n )}\n </div>\n );\n}\n","// Visibility state for branches/folders\nexport type VisibilityState = 'visible' | 'hidden' | null;\n\n// Map of path -> visibility state\nexport type VisibilityMap = Record<string, VisibilityState>;\n\n// Tree node type for branch hierarchy\nexport interface BranchTreeNode {\n name: string;\n fullPath?: string; // Only set for leaf nodes (actual branches)\n children: Map<string, BranchTreeNode>;\n}\n\n// Build tree structure from flat branch list\nexport function buildBranchTree(branches: string[], pathPrefix: string = ''): BranchTreeNode {\n const root: BranchTreeNode = { name: '', children: new Map() };\n\n for (const branch of branches) {\n const parts = branch.split('/');\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (!current.children.has(part)) {\n current.children.set(part, {\n name: part,\n children: new Map(),\n });\n }\n current = current.children.get(part)!;\n\n // If this is the last part, mark it as a leaf with full path\n if (i === parts.length - 1) {\n // Use the full path with prefix for remote branches\n current.fullPath = pathPrefix ? `${pathPrefix}/${branch}` : branch;\n }\n }\n }\n\n return root;\n}\n\n// Build tree structure for remote branches, grouped by remote name\nexport function buildRemoteBranchTree(remotes: Record<string, string[]>): Map<string, BranchTreeNode> {\n const result = new Map<string, BranchTreeNode>();\n \n for (const [remoteName, branches] of Object.entries(remotes)) {\n // Build tree for this remote's branches, with full ref path prefix\n result.set(remoteName, buildBranchTree(branches, `remotes/${remoteName}`));\n }\n \n return result;\n}\n\n// Get the effective visibility for a path (considering parent inheritance)\n// groupPath is used for checking group-level visibility (e.g., \"__local__\" or \"__remotes__\" or \"__remotes__/origin\")\nexport function getEffectiveVisibility(\n path: string,\n visibilityMap: VisibilityMap,\n groupPath?: string\n): VisibilityState {\n // Check if this path has explicit visibility\n if (visibilityMap[path]) {\n return visibilityMap[path];\n }\n\n // Check parent paths for inherited visibility\n const parts = path.split('/');\n for (let i = parts.length - 1; i > 0; i--) {\n const parentPath = parts.slice(0, i).join('/');\n if (visibilityMap[parentPath]) {\n return visibilityMap[parentPath];\n }\n }\n \n // Check group-level visibility\n if (groupPath) {\n // Check if any parent group has visibility set\n const groupParts = groupPath.split('/');\n for (let i = groupParts.length; i > 0; i--) {\n const parentGroupPath = groupParts.slice(0, i).join('/');\n if (visibilityMap[parentGroupPath]) {\n return visibilityMap[parentGroupPath];\n }\n }\n }\n\n return null;\n}\n\nexport function sortBranchTreeChildren(node: BranchTreeNode): BranchTreeNode[] {\n return Array.from(node.children.values()).sort((a, b) => {\n const aIsFolder = a.children.size > 0 && !a.fullPath;\n const bIsFolder = b.children.size > 0 && !b.fullPath;\n if (aIsFolder && !bIsFolder) return -1;\n if (!aIsFolder && bIsFolder) return 1;\n return a.name.localeCompare(b.name);\n });\n}\n\nexport function collectVisibleBranchRefs(\n node: BranchTreeNode,\n expandedFolders: Set<string>,\n parentPath = ''\n): string[] {\n const refs: string[] = [];\n const sortedChildren = sortBranchTreeChildren(node);\n\n for (const child of sortedChildren) {\n const isLeaf = child.fullPath !== undefined;\n if (isLeaf) {\n refs.push(child.fullPath!);\n continue;\n }\n\n const itemPath = parentPath ? `${parentPath}/${child.name}` : child.name;\n if (expandedFolders.has(itemPath)) {\n refs.push(...collectVisibleBranchRefs(child, expandedFolders, itemPath));\n }\n }\n\n return refs;\n}\n\nexport function collectAllBranchRefs(node: BranchTreeNode): string[] {\n const refs: string[] = [];\n const sortedChildren = sortBranchTreeChildren(node);\n\n for (const child of sortedChildren) {\n if (child.fullPath) {\n refs.push(child.fullPath);\n continue;\n }\n\n refs.push(...collectAllBranchRefs(child));\n }\n\n return refs;\n}\n","import { cn } from '@/lib/utils';\nimport React from 'react';\n\n// Visibility toggle button component\nexport function VisibilityToggle({\n type,\n isActive,\n isInherited,\n onClick,\n showOnHover,\n}: {\n type: 'visible' | 'hidden';\n isActive: boolean;\n isInherited: boolean;\n onClick: (e: React.MouseEvent) => void;\n showOnHover: boolean;\n}) {\n const title = type === 'visible' \n ? (isActive ? 'Remove visible filter' : 'Show only this branch')\n : (isActive ? 'Remove hide filter' : 'Hide this branch');\n\n return (\n <button\n className={cn(\n \"p-0.5 rounded hover:bg-base-300 transition-colors shrink-0 cursor-pointer text-xs\",\n isActive && \"bg-primary/10\",\n isInherited && \"opacity-50\",\n !isActive && !showOnHover && \"opacity-0 group-hover:opacity-100\"\n )}\n onClick={onClick}\n title={title}\n >\n {type === 'visible' ? <i className=\"iconoir-eye text-[14px]\" aria-hidden=\"true\" /> : <i className=\"iconoir-eye-closed text-[14px]\" aria-hidden=\"true\" />}\n </button>\n );\n}\n","import { cn } from '@/lib/utils';\nimport { VisibilityMap } from './branch-tree-utils';\nimport { VisibilityToggle } from './visibility-toggle';\n\nexport function GroupHeader({\n name,\n groupPath,\n icon,\n isExpanded,\n onToggle,\n visibilityMap,\n onToggleVisibility,\n depth = 0,\n}: {\n name: string;\n groupPath: string;\n icon: React.ReactNode;\n isExpanded: boolean;\n onToggle: () => void;\n visibilityMap: VisibilityMap;\n onToggleVisibility: (path: string, type: 'visible' | 'hidden') => void;\n depth?: number;\n}) {\n const directVisibility = visibilityMap[groupPath];\n // Check parent group visibility for inheritance\n const parentGroupPath = groupPath.includes('/') \n ? groupPath.split('/').slice(0, -1).join('/') \n : undefined;\n const parentVisibility = parentGroupPath ? visibilityMap[parentGroupPath] : null;\n const effectiveVisibility = directVisibility || parentVisibility;\n const isInherited = !directVisibility && parentVisibility !== null;\n \n return (\n <div\n className={cn(\n \"group flex items-center gap-1 px-2 py-1.5 text-sm rounded-md cursor-pointer hover:bg-base-200 transition-colors font-medium\",\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n >\n <div className=\"flex items-center gap-1.5 flex-1 min-w-0\" onClick={onToggle}>\n <span className=\"text-xs opacity-70\">{isExpanded ? '▼' : '▶'}</span>\n <span className=\"shrink-0\">{icon}</span>\n <span className=\"truncate min-w-0 flex-1\">{name}</span>\n </div>\n <div className=\"flex items-center gap-0.5 ml-auto\">\n <VisibilityToggle\n type=\"visible\"\n isActive={directVisibility === 'visible' || (isInherited && effectiveVisibility === 'visible')}\n isInherited={isInherited && effectiveVisibility === 'visible'}\n onClick={(e) => { e.stopPropagation(); onToggleVisibility(groupPath, 'visible'); }}\n showOnHover={directVisibility === 'visible' || (isInherited && effectiveVisibility === 'visible')}\n />\n <VisibilityToggle\n type=\"hidden\"\n isActive={directVisibility === 'hidden' || (isInherited && effectiveVisibility === 'hidden')}\n isInherited={isInherited && effectiveVisibility === 'hidden'}\n onClick={(e) => { e.stopPropagation(); onToggleVisibility(groupPath, 'hidden'); }}\n showOnHover={directVisibility === 'hidden' || (isInherited && effectiveVisibility === 'hidden')}\n />\n </div>\n </div>\n );\n}\n","import { ContextMenuItem } from '@/components/context-menu';\n\nexport type BranchOperation = { sourceBranch: string; targetBranch: string };\n\nexport interface BranchMenuCallbacks {\n onCheckout: (branch: string) => void;\n onCheckoutToLocal: (remoteBranch: string) => void;\n onCreateBranch: (sourceBranch: string) => void;\n onDeleteBranch: (branch: string) => void;\n onDeleteBranches: (branches: string[]) => void;\n onRenameBranch: (branch: string) => void;\n onRenameRemoteBranch: (branch: string) => void;\n onRebase: (operation: BranchOperation) => void;\n onMerge: (operation: BranchOperation) => void;\n onPushToRemote: (branch: string) => void;\n onPullFromRemote: (branch: string) => void;\n}\n\nexport interface BranchMenuOptions {\n branchRef: string;\n branchLeafName: string;\n currentBranch?: string;\n isRemote: boolean;\n selectedBranchRefs?: string[];\n}\n\nexport function buildBranchContextMenuItems(\n options: BranchMenuOptions,\n callbacks: BranchMenuCallbacks\n): ContextMenuItem[] {\n const { branchRef, branchLeafName, currentBranch, isRemote, selectedBranchRefs } = options;\n const isCurrent = !isRemote && branchRef === currentBranch;\n const selectedRefs = selectedBranchRefs && selectedBranchRefs.length > 0 ? selectedBranchRefs : [branchRef];\n const hasMultiSelection = selectedRefs.length > 1;\n const menuItems: ContextMenuItem[] = [];\n\n if (!isCurrent && !isRemote) {\n menuItems.push({\n label: 'Checkout',\n icon: <i className=\"iconoir-arrow-right text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onCheckout(branchRef),\n });\n }\n if (isRemote) {\n menuItems.push({\n label: 'Checkout to local',\n icon: <i className=\"iconoir-arrow-down text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onCheckoutToLocal(branchRef),\n });\n }\n menuItems.push({\n label: 'Create Branch',\n icon: <i className=\"iconoir-plus-circle text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onCreateBranch(branchRef),\n });\n if (!isRemote) {\n menuItems.push({\n label: 'Rename Branch',\n icon: <i className=\"iconoir-edit-pencil text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onRenameBranch(branchRef),\n });\n }\n if (isRemote) {\n menuItems.push({\n label: 'Rename branch',\n icon: <i className=\"iconoir-edit-pencil text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onRenameRemoteBranch(branchRef),\n });\n }\n if (!isRemote) {\n menuItems.push({\n label: 'Push to Remote',\n icon: <i className=\"iconoir-arrow-up text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onPushToRemote(branchRef),\n });\n }\n if (!isRemote) {\n menuItems.push({\n label: 'Pull from Remote',\n icon: <i className=\"iconoir-arrow-down text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onPullFromRemote(branchRef),\n });\n }\n if (!isCurrent && currentBranch) {\n menuItems.push({\n label: `Rebase ${currentBranch} onto ${branchLeafName}`,\n labelNode: <>Rebase <span className=\"font-bold\">{currentBranch}</span> onto {branchLeafName}</>,\n icon: <i className=\"iconoir-git-fork text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onRebase({ sourceBranch: currentBranch, targetBranch: branchRef }),\n });\n menuItems.push({\n label: `Rebase ${branchLeafName} onto ${currentBranch}`,\n labelNode: <>Rebase {branchLeafName} onto <span className=\"font-bold\">{currentBranch}</span></>,\n icon: <i className=\"iconoir-git-fork text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onRebase({ sourceBranch: branchRef, targetBranch: currentBranch }),\n });\n menuItems.push({\n label: `Merge ${currentBranch} into ${branchLeafName}`,\n labelNode: <>Merge <span className=\"font-bold\">{currentBranch}</span> into {branchLeafName}</>,\n icon: <i className=\"iconoir-git-fork text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onMerge({ sourceBranch: currentBranch, targetBranch: branchRef }),\n });\n menuItems.push({\n label: `Merge ${branchLeafName} into ${currentBranch}`,\n labelNode: <>Merge {branchLeafName} into <span className=\"font-bold\">{currentBranch}</span></>,\n icon: <i className=\"iconoir-git-fork text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onMerge({ sourceBranch: branchRef, targetBranch: currentBranch }),\n });\n }\n if (!isCurrent) {\n if (hasMultiSelection) {\n menuItems.push({\n label: `Delete Selected Branches (${selectedRefs.length})`,\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onDeleteBranches(selectedRefs),\n danger: true,\n });\n } else {\n menuItems.push({\n label: 'Delete Branch',\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onDeleteBranch(branchRef),\n danger: true,\n });\n }\n }\n\n return menuItems;\n}\n","import { cn } from '@/lib/utils';\nimport { ContextMenu, ContextMenuItem } from '@/components/context-menu';\nimport { BranchTreeNode, VisibilityMap, getEffectiveVisibility, collectAllBranchRefs } from './branch-tree-utils';\nimport { BranchOperation, BranchMenuOptions } from './branch-context-menu';\nimport { BranchTrackingInfo } from '@/lib/types';\nimport { VisibilityToggle } from './visibility-toggle';\n\nexport type BranchRowSelectModifiers = { isMultiSelect: boolean; isRangeSelect: boolean };\n\n// Recursive component to render branch tree\nexport function BranchTreeItem({\n node,\n currentBranch,\n expandedFolders,\n onToggleFolder,\n onCheckout,\n onCheckoutToLocal,\n onCreateBranch,\n onDeleteBranch,\n onRenameBranch,\n onRenameRemoteBranch,\n onRebase,\n onMerge,\n onPushToRemote,\n onPullFromRemote,\n getBranchContextMenuItems,\n onBranchClick,\n onBranchContextMenu,\n onDeleteBranchGroup,\n selectedBranches,\n visibilityMap,\n onToggleVisibility,\n parentPath = '',\n depth = 0,\n groupPath,\n isRemote = false,\n trackingInfo,\n}: {\n node: BranchTreeNode;\n currentBranch?: string;\n expandedFolders: Set<string>;\n onToggleFolder: (path: string) => void;\n onCheckout: (branch: string) => void;\n onCheckoutToLocal: (remoteBranch: string) => void;\n onCreateBranch: () => void;\n onDeleteBranch: (branch: string) => void;\n onRenameBranch: (branch: string) => void;\n onRenameRemoteBranch: (branch: string) => void;\n onRebase: (operation: BranchOperation) => void;\n onMerge: (operation: BranchOperation) => void;\n onPushToRemote: (branch: string) => void;\n onPullFromRemote: (branch: string) => void;\n getBranchContextMenuItems: (options: BranchMenuOptions) => ContextMenuItem[];\n onBranchClick?: (branch: string, modifiers?: BranchRowSelectModifiers) => void;\n onBranchContextMenu?: (branch: string) => void;\n onDeleteBranchGroup: (branches: string[]) => void;\n selectedBranches: Set<string>;\n visibilityMap: VisibilityMap;\n onToggleVisibility: (path: string, type: 'visible' | 'hidden') => void;\n parentPath?: string;\n depth?: number;\n groupPath?: string;\n isRemote?: boolean;\n trackingInfo?: Record<string, BranchTrackingInfo>;\n}) {\n const children = Array.from(node.children.values());\n const sortedChildren = children.sort((a, b) => {\n // Folders (non-leaf) come first, then alphabetical\n const aIsFolder = a.children.size > 0 && !a.fullPath;\n const bIsFolder = b.children.size > 0 && !b.fullPath;\n if (aIsFolder && !bIsFolder) return -1;\n if (!aIsFolder && bIsFolder) return 1;\n return a.name.localeCompare(b.name);\n });\n\n return (\n <>\n {sortedChildren.map((child) => {\n const isLeaf = child.fullPath !== undefined;\n const isFolder = child.children.size > 0 && !isLeaf;\n const itemPath = child.fullPath || (parentPath ? `${parentPath}/${child.name}` : child.name);\n const isExpanded = expandedFolders.has(itemPath);\n const isCurrent = isLeaf && child.fullPath === currentBranch;\n\n // Get visibility state for this item\n const directVisibility = visibilityMap[itemPath];\n const effectiveVisibility = getEffectiveVisibility(itemPath, visibilityMap, groupPath);\n const isInherited = !directVisibility && effectiveVisibility !== null;\n\n if (isFolder) {\n const childBranchRefs = collectAllBranchRefs(child);\n const deletableChildBranchRefs = childBranchRefs.filter((branchRef) => branchRef !== currentBranch);\n\n // Render folder\n return (\n <div key={itemPath}>\n <ContextMenu\n items={[\n {\n label: 'Delete',\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => onDeleteBranchGroup(deletableChildBranchRefs),\n danger: true,\n disabled: deletableChildBranchRefs.length === 0,\n },\n ]}\n >\n <div\n className={cn(\n \"group flex items-center gap-1 px-2 py-1.5 text-sm rounded-md cursor-pointer hover:bg-base-200 transition-colors opacity-70 select-none\",\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n >\n <div className=\"flex items-center gap-1 flex-1 min-w-0\" onClick={() => onToggleFolder(itemPath)}>\n <span className=\"text-xs opacity-70\">{isExpanded ? '▼' : '▶'}</span>\n <i className=\"iconoir-folder text-[16px] shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate min-w-0 flex-1\">{child.name}</span>\n </div>\n <div className=\"flex items-center gap-0.5 ml-auto\">\n <VisibilityToggle\n type=\"visible\"\n isActive={directVisibility === 'visible' || (isInherited && effectiveVisibility === 'visible')}\n isInherited={isInherited && effectiveVisibility === 'visible'}\n onClick={(e) => { e.stopPropagation(); onToggleVisibility(itemPath, 'visible'); }}\n showOnHover={directVisibility === 'visible' || (isInherited && effectiveVisibility === 'visible')}\n />\n <VisibilityToggle\n type=\"hidden\"\n isActive={directVisibility === 'hidden' || (isInherited && effectiveVisibility === 'hidden')}\n isInherited={isInherited && effectiveVisibility === 'hidden'}\n onClick={(e) => { e.stopPropagation(); onToggleVisibility(itemPath, 'hidden'); }}\n showOnHover={directVisibility === 'hidden' || (isInherited && effectiveVisibility === 'hidden')}\n />\n </div>\n </div>\n </ContextMenu>\n {isExpanded && (\n <BranchTreeItem\n node={child}\n currentBranch={currentBranch}\n expandedFolders={expandedFolders}\n onToggleFolder={onToggleFolder}\n onCheckout={onCheckout}\n onCheckoutToLocal={onCheckoutToLocal}\n onCreateBranch={onCreateBranch}\n onDeleteBranch={onDeleteBranch}\n onRenameBranch={onRenameBranch}\n onRenameRemoteBranch={onRenameRemoteBranch}\n onRebase={onRebase}\n onMerge={onMerge}\n onPushToRemote={onPushToRemote}\n onPullFromRemote={onPullFromRemote}\n getBranchContextMenuItems={getBranchContextMenuItems}\n onBranchClick={onBranchClick}\n onBranchContextMenu={onBranchContextMenu}\n onDeleteBranchGroup={onDeleteBranchGroup}\n selectedBranches={selectedBranches}\n visibilityMap={visibilityMap}\n onToggleVisibility={onToggleVisibility}\n parentPath={itemPath}\n depth={depth + 1}\n groupPath={groupPath}\n isRemote={isRemote}\n trackingInfo={trackingInfo}\n />\n )}\n </div>\n );\n }\n\n // Render leaf (actual branch)\n const branchTracking = !isRemote && child.fullPath ? trackingInfo?.[child.fullPath] : undefined;\n const hasDivergence = branchTracking && (branchTracking.ahead > 0 || branchTracking.behind > 0);\n\n const menuItems = getBranchContextMenuItems({\n branchRef: child.fullPath!,\n branchLeafName: child.name,\n currentBranch,\n isRemote,\n selectedBranchRefs: selectedBranches.has(child.fullPath!) ? Array.from(selectedBranches) : [child.fullPath!],\n });\n const isSelected = selectedBranches.has(child.fullPath!);\n\n\n return (\n <ContextMenu key={child.fullPath} items={menuItems}>\n <div\n className={cn(\n \"group flex items-center gap-2 px-2 py-1.5 text-sm rounded-md cursor-pointer transition-colors select-none\",\n !isSelected && \"hover:bg-base-200\",\n isSelected && \"bg-primary/10 hover:bg-primary/20\",\n isCurrent && \"bg-base-200 font-medium text-primary\"\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onContextMenu={() => onBranchContextMenu?.(child.fullPath!)}\n >\n <div \n className=\"flex items-center gap-2 flex-1 min-w-0\" \n onClick={(e) => onBranchClick?.(child.fullPath!, { isMultiSelect: e.metaKey || e.ctrlKey, isRangeSelect: e.shiftKey })}\n onDoubleClick={() => !isCurrent && onCheckout(child.fullPath!)}\n >\n {isCurrent ? (\n <span className=\"w-3 h-3 flex items-center justify-center shrink-0\">\n <span className=\"w-2 h-2 rounded-full bg-primary\" />\n </span>\n ) : isRemote ? (\n <i className=\"iconoir-globe text-[14px] opacity-50 shrink-0\" aria-hidden=\"true\" />\n ) : (\n <i className=\"iconoir-git-branch text-[14px] opacity-50 shrink-0\" aria-hidden=\"true\" />\n )}\n <span className=\"truncate min-w-0 flex-1\" title={child.fullPath}>{child.name}</span>\n {hasDivergence && (\n <span \n className=\"flex items-center gap-1 text-xs opacity-70 shrink-0\"\n title={`${branchTracking.ahead} ahead, ${branchTracking.behind} behind ${branchTracking.upstream}`}\n >\n {branchTracking.ahead > 0 && (\n <span className=\"flex items-center gap-0.5 text-xs\">\n <i className=\"iconoir-arrow-up text-[12px]\" aria-hidden=\"true\" />\n <span>{branchTracking.ahead}</span>\n </span>\n )}\n {branchTracking.behind > 0 && (\n <span className=\"flex items-center gap-0.5 text-xs\">\n <i className=\"iconoir-arrow-down text-[12px]\" aria-hidden=\"true\" />\n <span>{branchTracking.behind}</span>\n </span>\n )}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-0.5 ml-auto\">\n <VisibilityToggle\n type=\"visible\"\n isActive={directVisibility === 'visible' || (isInherited && effectiveVisibility === 'visible')}\n isInherited={isInherited && effectiveVisibility === 'visible'}\n onClick={(e) => { e.stopPropagation(); onToggleVisibility(itemPath, 'visible'); }}\n showOnHover={directVisibility === 'visible' || (isInherited && effectiveVisibility === 'visible')}\n />\n <VisibilityToggle\n type=\"hidden\"\n isActive={directVisibility === 'hidden' || (isInherited && effectiveVisibility === 'hidden')}\n isInherited={isInherited && effectiveVisibility === 'hidden'}\n onClick={(e) => { e.stopPropagation(); onToggleVisibility(itemPath, 'hidden'); }}\n showOnHover={directVisibility === 'hidden' || (isInherited && effectiveVisibility === 'hidden')}\n />\n </div>\n </div>\n </ContextMenu>\n );\n })}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/git/history-view.tsx","../../../../src/components/git/git-graph.tsx","../../../../src/lib/branch-colors.ts","../../../../src/lib/graph-utils.ts","../../../../src/components/context-menu.tsx","../../../../src/components/git/branch-tree-utils.ts","../../../../src/components/git/visibility-toggle.tsx","../../../../src/components/git/group-header.tsx","../../../../src/components/git/branch-context-menu.tsx","../../../../src/components/git/branch-tree-item.tsx"],"sourcesContent":["'use client';\n\nimport { useGitLog, useGitBranches, useGitStatus, useGitAction, useCommitDiff, useCommitFileDiff, CommitFile, useRepository, useUpdateRepository, useSettings, useUpdateSettings } from '@/hooks/use-git';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { Repository, RepositoryCustomScript, BranchTrackingInfo } from '@/lib/types';\nimport { GitGraph, GitGraphHandle } from './git-graph';\nimport { useState, useMemo, useEffect, useCallback, useRef } from 'react';\nimport { useTheme } from 'next-themes';\nimport { cn, sanitizeBranchName, isFileBinary, isImageFile, getChangedLineCountFromDiff } from '@/lib/utils';\nimport { ContextMenu, ContextMenuItem } from '@/components/context-menu';\nimport { GroupedDiffViewer } from './grouped-diff-viewer';\nimport { ImageDiffView } from './image-diff-view';\nimport { useEscapeDismiss } from '@/hooks/use-escape-dismiss';\nimport { toast } from '@/hooks/use-toast';\nimport { CommitChangesView } from './commit-changes-view';\nimport { BranchTreeNode, VisibilityMap, buildBranchTree, buildRemoteBranchTree, getEffectiveVisibility, collectAllBranchRefs, collectVisibleBranchRefs } from './branch-tree-utils';\nimport { GroupHeader } from './group-header';\nimport { BranchMenuOptions, BranchOperation, buildBranchContextMenuItems } from './branch-context-menu';\nimport { BranchRowSelectModifiers, BranchTreeItem } from './branch-tree-item';\nimport { CommitRowSelectModifiers } from './commit-row-select-modifiers';\nimport { useRouter, useSearchParams } from 'next/navigation';\nimport { listSessions, SessionMetadata } from '@/app/actions/session';\nimport { SESSIONS_UPDATED_EVENT, SESSIONS_UPDATED_STORAGE_KEY } from '@/lib/session-updates';\n\n\nconst MIN_HISTORY_PANEL_HEIGHT = 100;\nconst MAX_HISTORY_PANEL_HEIGHT = 900;\nconst MIN_COMMIT_DETAILS_MESSAGE_RATIO = 0.15;\nconst MAX_COMMIT_DETAILS_MESSAGE_RATIO = 0.75;\nconst DEFAULT_COMMIT_DETAILS_MESSAGE_RATIO = 0.28;\ntype MergeConflictStatus = 'checking' | 'no-conflict' | 'has-conflicts';\n\ntype ScriptExecutionStatus = 'idle' | 'starting' | 'running' | 'completed' | 'failed' | 'canceled';\ntype ScriptExecutionState = {\n isOpen: boolean;\n executionId: string | null;\n scriptName: string;\n branchRef: string;\n output: string;\n status: ScriptExecutionStatus;\n error: string | null;\n};\n\nfunction clampHistoryPanelHeight(height: number): number {\n return Math.min(Math.max(height, MIN_HISTORY_PANEL_HEIGHT), MAX_HISTORY_PANEL_HEIGHT);\n}\n\nfunction clampCommitDetailsMessageRatio(ratio: number): number {\n return Math.min(Math.max(ratio, MIN_COMMIT_DETAILS_MESSAGE_RATIO), MAX_COMMIT_DETAILS_MESSAGE_RATIO);\n}\n\nfunction buildCommitMessage(subject: string, body: string): string {\n const trimmedSubject = subject.trim();\n const normalizedBody = body.replace(/\\r\\n/g, '\\n');\n return normalizedBody.trim() ? `${trimmedSubject}\\n\\n${normalizedBody}` : trimmedSubject;\n}\n\nfunction formatCommitMessageForDisplay(message: string): string {\n return message\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\\\r\\\\n/g, '\\n')\n .replace(/\\\\n/g, '\\n');\n}\n\nfunction parseTrackingUpstream(upstream: string): { remote: string; branch: string } | null {\n const slashIndex = upstream.indexOf('/');\n if (slashIndex <= 0 || slashIndex >= upstream.length - 1) return null;\n return {\n remote: upstream.slice(0, slashIndex),\n branch: upstream.slice(slashIndex + 1),\n };\n}\n\nasync function copyText(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n const textArea = document.createElement('textarea');\n textArea.value = text;\n textArea.style.position = 'fixed';\n textArea.style.left = '-9999px';\n document.body.appendChild(textArea);\n textArea.select();\n\n try {\n document.execCommand('copy');\n return true;\n } catch {\n return false;\n } finally {\n document.body.removeChild(textArea);\n }\n }\n}\n\nconst DEFAULT_SCRIPT_EXECUTION: ScriptExecutionState = {\n isOpen: false,\n executionId: null,\n scriptName: '',\n branchRef: '',\n output: '',\n status: 'idle',\n error: null,\n};\n\n\n// File status icon component\nfunction FileStatusIcon({ status }: { status: string }) {\n switch (status) {\n case 'A':\n return <i className=\"iconoir-plus-circle text-[16px] text-success\" aria-hidden=\"true\" />;\n case 'D':\n return <i className=\"iconoir-minus-circle text-[16px] text-error\" aria-hidden=\"true\" />;\n case 'M':\n return <i className=\"iconoir-edit-pencil text-[16px] text-warning\" aria-hidden=\"true\" />;\n default:\n return <i className=\"iconoir-page text-[16px] opacity-50\" aria-hidden=\"true\" />;\n }\n}\n\n\n\nexport function HistoryView({ repoPath }: { repoPath: string }) {\n const queryClient = useQueryClient();\n const { data: settings } = useSettings();\n const updateSettings = useUpdateSettings();\n const router = useRouter();\n const searchParams = useSearchParams();\n const requestedBranchFromQuery = (searchParams.get('branch') ?? '').trim();\n const initialBranchCheckoutAttemptKeyRef = useRef<string | null>(null);\n const initialBranchHeadSelectionAttemptKeyRef = useRef<string | null>(null);\n\n const [limit, setLimit] = useState(100);\n const { data: log, isLoading, isError, error, refetch: refetchLog, isFetching } = useGitLog(repoPath, limit);\n const { data: branchData, isLoading: isBranchesLoading, refetch: refetchBranches } = useGitBranches(repoPath);\n const activeBranchFromData = branchData?.current?.trim() ?? '';\n const { data: statusData } = useGitStatus(repoPath);\n const [selectedHash, setSelectedHash] = useState<string | null>(null);\n const [selectedCommitHashes, setSelectedCommitHashes] = useState<string[]>([]);\n const [selectionAnchorHash, setSelectionAnchorHash] = useState<string | null>(null);\n const lastVisibilityRefreshAtRef = useRef(0);\n\n const refreshBranchesAndHistory = useCallback(() => {\n const now = Date.now();\n if (now - lastVisibilityRefreshAtRef.current < 500) return;\n lastVisibilityRefreshAtRef.current = now;\n void Promise.all([refetchBranches(), refetchLog()]);\n }, [refetchBranches, refetchLog]);\n\n useEffect(() => {\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'visible') {\n refreshBranchesAndHistory();\n }\n };\n\n const handleWindowFocus = () => {\n if (document.visibilityState === 'visible') {\n refreshBranchesAndHistory();\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n window.addEventListener('focus', handleWindowFocus);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n window.removeEventListener('focus', handleWindowFocus);\n };\n }, [refreshBranchesAndHistory]);\n\n const selectSingleCommit = useCallback((hash: string | null) => {\n setSelectedHash(hash);\n setSelectedCommitHashes(hash ? [hash] : []);\n setSelectionAnchorHash(hash);\n }, []);\n\n // Clear selected commit and close commit details panel when repository changes\n useEffect(() => {\n selectSingleCommit(null);\n setSelectedBranchRefs([]);\n setBranchSelectionAnchor(null);\n }, [repoPath, selectSingleCommit]);\n\n const { mutateAsync: runGitAction } = useGitAction();\n\n const handleCheckConflicts = () => {\n console.warn(\"Conflicts tab has been removed.\");\n };\n\n const isMergeOrRebaseConflictError = useCallback((error: unknown) => {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n return (\n message.includes('conflict') ||\n message.includes('could not apply') ||\n message.includes('fix conflicts') ||\n message.includes('resolve all conflicts') ||\n message.includes('merge --continue') ||\n message.includes('rebase --continue')\n );\n }, []);\n\n useEffect(() => {\n initialBranchCheckoutAttemptKeyRef.current = null;\n initialBranchHeadSelectionAttemptKeyRef.current = null;\n }, [repoPath]);\n\n useEffect(() => {\n if (!requestedBranchFromQuery || !branchData) return;\n\n const requestKey = `${repoPath}:${requestedBranchFromQuery}`;\n if (initialBranchCheckoutAttemptKeyRef.current === requestKey) return;\n\n if (branchData.current === requestedBranchFromQuery) {\n initialBranchCheckoutAttemptKeyRef.current = requestKey;\n return;\n }\n\n if (!branchData.branches.includes(requestedBranchFromQuery)) {\n initialBranchCheckoutAttemptKeyRef.current = requestKey;\n toast({\n type: 'error',\n title: 'Branch Not Found',\n description: `Branch \"${requestedBranchFromQuery}\" does not exist in this repository.`,\n });\n return;\n }\n\n initialBranchCheckoutAttemptKeyRef.current = requestKey;\n\n void (async () => {\n try {\n await runGitAction({\n repoPath,\n action: 'checkout',\n data: { branch: requestedBranchFromQuery },\n });\n } catch (e) {\n console.error(e);\n }\n })();\n }, [branchData, repoPath, requestedBranchFromQuery, runGitAction]);\n\n const [iscreateBranchOpen, setIsCreateBranchOpen] = useState(false);\n const [newBranchName, setNewBranchName] = useState('');\n const [createBranchFromRef, setCreateBranchFromRef] = useState<string | null>(null);\n const [isCreating, setIsCreating] = useState(false);\n const [isCreateTagOpen, setIsCreateTagOpen] = useState(false);\n const [createTagCommitHash, setCreateTagCommitHash] = useState<string | null>(null);\n const [newTagName, setNewTagName] = useState('');\n const [pushTagToRemote, setPushTagToRemote] = useState(false);\n const [isCreatingTag, setIsCreatingTag] = useState(false);\n\n const [isDeleteOpen, setIsDeleteOpen] = useState(false);\n const [branchesToDelete, setBranchesToDelete] = useState<string[]>([]);\n const [deleteRemoteBranch, setDeleteRemoteBranch] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n const [isDeleteWorktreeOpen, setIsDeleteWorktreeOpen] = useState(false);\n const [worktreeToDelete, setWorktreeToDelete] = useState<string | null>(null);\n const [isDeletingWorktree, setIsDeletingWorktree] = useState(false);\n const [isDeleteTagOpen, setIsDeleteTagOpen] = useState(false);\n const [tagToDelete, setTagToDelete] = useState<string | null>(null);\n const [deleteRemoteTag, setDeleteRemoteTag] = useState(false);\n const [isDeletingTag, setIsDeletingTag] = useState(false);\n\n const [isCherryPickOpen, setIsCherryPickOpen] = useState(false);\n const [commitsToCherryPick, setCommitsToCherryPick] = useState<{ hash: string; message: string }[]>([]);\n const [isCherryPicking, setIsCherryPicking] = useState(false);\n const [isAbortCherryPickOpen, setIsAbortCherryPickOpen] = useState(false);\n const [isAbortingCherryPick, setIsAbortingCherryPick] = useState(false);\n\n const [isRenameOpen, setIsRenameOpen] = useState(false);\n const [branchToRename, setBranchToRename] = useState<string | null>(null);\n const [remoteBranchToRename, setRemoteBranchToRename] = useState<{ remote: string; branch: string } | null>(null);\n const [newBranchNameForRename, setNewBranchNameForRename] = useState('');\n const [renameTrackingRemoteBranch, setRenameTrackingRemoteBranch] = useState(false);\n const [isRenaming, setIsRenaming] = useState(false);\n const [isRenameRemoteOpen, setIsRenameRemoteOpen] = useState(false);\n const [remoteToRename, setRemoteToRename] = useState<string | null>(null);\n const [newRemoteNameForRename, setNewRemoteNameForRename] = useState('');\n const [isRenamingRemote, setIsRenamingRemote] = useState(false);\n const [isDeleteRemoteOpen, setIsDeleteRemoteOpen] = useState(false);\n const [remoteToDelete, setRemoteToDelete] = useState<string | null>(null);\n const [isDeletingRemote, setIsDeletingRemote] = useState(false);\n const [isAddRemoteOpen, setIsAddRemoteOpen] = useState(false);\n const [newRemoteName, setNewRemoteName] = useState('origin');\n const [newRemoteUrl, setNewRemoteUrl] = useState('');\n const [isAddingRemote, setIsAddingRemote] = useState(false);\n\n const [isRebaseOpen, setIsRebaseOpen] = useState(false);\n const [rebaseSourceBranch, setRebaseSourceBranch] = useState<string | null>(null);\n const [rebaseTargetBranch, setRebaseTargetBranch] = useState<string | null>(null);\n const [rebaseStashChanges, setRebaseStashChanges] = useState(true);\n const [isRebasing, setIsRebasing] = useState(false);\n const [rebaseConflictStatus, setRebaseConflictStatus] = useState<MergeConflictStatus>('checking');\n\n const closeRebaseDialog = useCallback(() => {\n setIsRebaseOpen(false);\n setRebaseSourceBranch(null);\n setRebaseTargetBranch(null);\n setRebaseConflictStatus('checking');\n }, []);\n\n const [isMergeOpen, setIsMergeOpen] = useState(false);\n const [mergeTargetBranch, setMergeTargetBranch] = useState<string | null>(null);\n const [mergeSourceBranch, setMergeSourceBranch] = useState<string | null>(null);\n const [mergeRebaseBeforeMerge, setMergeRebaseBeforeMerge] = useState(false);\n const [mergeSquash, setMergeSquash] = useState(false);\n const [mergeFastForward, setMergeFastForward] = useState(false);\n const [mergeSquashMessage, setMergeSquashMessage] = useState('');\n const [isMerging, setIsMerging] = useState(false);\n const [mergeConflictStatus, setMergeConflictStatus] = useState<MergeConflictStatus>('checking');\n\n const closeMergeDialog = useCallback(() => {\n setIsMergeOpen(false);\n setMergeTargetBranch(null);\n setMergeSourceBranch(null);\n setMergeConflictStatus('checking');\n }, []);\n\n // Push to remote dialog state\n const [isPushOpen, setIsPushOpen] = useState(false);\n const [pushBranch, setPushBranch] = useState<string | null>(null);\n const [pushRemotes, setPushRemotes] = useState<string[]>([]);\n const [pushSelectedRemote, setPushSelectedRemote] = useState<string>('');\n const [pushRemoteBranches, setPushRemoteBranches] = useState<string[]>([]);\n const [pushSelectedRemoteBranch, setPushSelectedRemoteBranch] = useState<string>('');\n const [pushTrackingBranch, setPushTrackingBranch] = useState<{ remote: string; branch: string } | null>(null);\n const [pushRebaseFirst, setPushRebaseFirst] = useState(false);\n const [pushForcePush, setPushForcePush] = useState(false);\n const [pushLocalOnlyTags, setPushLocalOnlyTags] = useState(true);\n const [pushSquash, setPushSquash] = useState(false);\n const [pushSquashMessage, setPushSquashMessage] = useState('');\n const [isPushing, setIsPushing] = useState(false);\n const [pushError, setPushError] = useState<string | null>(null);\n const [pushLoadingRemotes, setPushLoadingRemotes] = useState(false);\n const [pushLoadingBranches, setPushLoadingBranches] = useState(false);\n\n // Pull from remote dialog state\n const [isPullOpen, setIsPullOpen] = useState(false);\n const [pullBranch, setPullBranch] = useState<string | null>(null);\n const [pullRemotes, setPullRemotes] = useState<string[]>([]);\n const [pullSelectedRemote, setPullSelectedRemote] = useState<string>('');\n const [pullRemoteBranches, setPullRemoteBranches] = useState<string[]>([]);\n const [pullSelectedRemoteBranch, setPullSelectedRemoteBranch] = useState<string>('');\n const [pullTrackingBranch, setPullTrackingBranch] = useState<{ remote: string; branch: string } | null>(null);\n const [pullRebase, setPullRebase] = useState(true);\n const [isPulling, setIsPulling] = useState(false);\n const [isPullingAllBranches, setIsPullingAllBranches] = useState(false);\n const [pullError, setPullError] = useState<string | null>(null);\n const [pullLoadingRemotes, setPullLoadingRemotes] = useState(false);\n const [pullLoadingBranches, setPullLoadingBranches] = useState(false);\n const [isFetchingAllRemotes, setIsFetchingAllRemotes] = useState(false);\n const [isOpeningRepoFolder, setIsOpeningRepoFolder] = useState(false);\n const [isOpeningRepoTerminal, setIsOpeningRepoTerminal] = useState(false);\n\n // Checkout to local dialog state\n const [isCheckoutToLocalOpen, setIsCheckoutToLocalOpen] = useState(false);\n const [checkoutRemoteBranch, setCheckoutRemoteBranch] = useState<string | null>(null);\n const [checkoutLocalBranchName, setCheckoutLocalBranchName] = useState('');\n const [isCheckingOutToLocal, setIsCheckingOutToLocal] = useState(false);\n\n // Reset to commit dialog state\n const [isResetOpen, setIsResetOpen] = useState(false);\n const [resetCommitHash, setResetCommitHash] = useState<string | null>(null);\n const [isResetting, setIsResetting] = useState(false);\n const [isRevertOpen, setIsRevertOpen] = useState(false);\n const [commitToRevert, setCommitToRevert] = useState<{ hash: string; message: string } | null>(null);\n const [isReverting, setIsReverting] = useState(false);\n\n const [isRewordOpen, setIsRewordOpen] = useState(false);\n const [commitToReword, setCommitToReword] = useState<{ hash: string; subject: string; body: string; branch: string } | null>(null);\n const [newMessageSubject, setNewMessageSubject] = useState('');\n const [newMessageBody, setNewMessageBody] = useState('');\n const [isRewording, setIsRewording] = useState(false);\n\n // Ref for GitGraph to scroll to commits\n const gitGraphRef = useRef<GitGraphHandle>(null);\n\n // State for pending scroll to branch commit\n const [pendingScrollCommit, setPendingScrollCommit] = useState<string | null>(null);\n const [selectedBranchRefs, setSelectedBranchRefs] = useState<string[]>([]);\n const [branchSelectionAnchor, setBranchSelectionAnchor] = useState<string | null>(null);\n const [sessionsForRepo, setSessionsForRepo] = useState<SessionMetadata[]>([]);\n const [isBranchPopoverOpen, setIsBranchPopoverOpen] = useState(false);\n const branchPopoverRef = useRef<HTMLDivElement>(null);\n const [scriptExecution, setScriptExecution] = useState<ScriptExecutionState>(DEFAULT_SCRIPT_EXECUTION);\n const [isCancelingScriptExecution, setIsCancelingScriptExecution] = useState(false);\n const [isCopyingScriptOutput, setIsCopyingScriptOutput] = useState(false);\n const [didCopyScriptOutput, setDidCopyScriptOutput] = useState(false);\n const isScriptExecutionRunning = scriptExecution.status === 'starting' || scriptExecution.status === 'running';\n const isScriptExecutionFinished = scriptExecution.status === 'completed' || scriptExecution.status === 'failed' || scriptExecution.status === 'canceled';\n\n useEffect(() => {\n if (isScriptExecutionFinished && scriptExecution.executionId) {\n queryClient.invalidateQueries({ queryKey: ['git', repoPath] });\n }\n }, [isScriptExecutionFinished, scriptExecution.executionId, queryClient, repoPath]);\n\n const closeRenameBranchDialog = useCallback(() => {\n setIsRenameOpen(false);\n setBranchToRename(null);\n setRemoteBranchToRename(null);\n setNewBranchNameForRename('');\n setRenameTrackingRemoteBranch(false);\n }, []);\n\n const closeRenameRemoteDialog = useCallback(() => {\n setIsRenameRemoteOpen(false);\n setRemoteToRename(null);\n setNewRemoteNameForRename('');\n }, []);\n\n const closeDeleteRemoteDialog = useCallback(() => {\n setIsDeleteRemoteOpen(false);\n setRemoteToDelete(null);\n }, []);\n\n const closeAddRemoteDialog = useCallback(() => {\n setIsAddRemoteOpen(false);\n setNewRemoteName('origin');\n setNewRemoteUrl('');\n }, []);\n\n const closeRewordDialog = useCallback(() => {\n setIsRewordOpen(false);\n setCommitToReword(null);\n setNewMessageSubject('');\n setNewMessageBody('');\n }, []);\n\n const closeScriptExecutionDialog = useCallback(() => {\n setScriptExecution(DEFAULT_SCRIPT_EXECUTION);\n setDidCopyScriptOutput(false);\n setIsCancelingScriptExecution(false);\n }, []);\n\n const closeTopPopup = useCallback(() => {\n if (isAbortCherryPickOpen) {\n setIsAbortCherryPickOpen(false);\n setCommitsToCherryPick([]);\n return;\n }\n if (isCheckoutToLocalOpen) {\n setIsCheckoutToLocalOpen(false);\n return;\n }\n if (iscreateBranchOpen) {\n setIsCreateBranchOpen(false);\n setCreateBranchFromRef(null);\n return;\n }\n if (isCreateTagOpen) {\n setIsCreateTagOpen(false);\n setCreateTagCommitHash(null);\n setNewTagName('');\n setPushTagToRemote(false);\n return;\n }\n if (isPullOpen) {\n setIsPullOpen(false);\n return;\n }\n if (isPushOpen) {\n setIsPushOpen(false);\n return;\n }\n if (isMergeOpen) {\n closeMergeDialog();\n return;\n }\n if (isRebaseOpen) {\n closeRebaseDialog();\n return;\n }\n if (isRenameOpen) {\n closeRenameBranchDialog();\n return;\n }\n if (isRenameRemoteOpen) {\n closeRenameRemoteDialog();\n return;\n }\n if (isDeleteRemoteOpen) {\n closeDeleteRemoteDialog();\n return;\n }\n if (isAddRemoteOpen) {\n closeAddRemoteDialog();\n return;\n }\n if (isCherryPickOpen) {\n setIsCherryPickOpen(false);\n setCommitsToCherryPick([]);\n return;\n }\n if (isDeleteOpen) {\n setIsDeleteOpen(false);\n setBranchesToDelete([]);\n setDeleteRemoteBranch(false);\n return;\n }\n if (isDeleteWorktreeOpen) {\n setIsDeleteWorktreeOpen(false);\n setWorktreeToDelete(null);\n return;\n }\n if (isDeleteTagOpen) {\n setIsDeleteTagOpen(false);\n setTagToDelete(null);\n setDeleteRemoteTag(false);\n return;\n }\n if (isRewordOpen) {\n closeRewordDialog();\n return;\n }\n if (isResetOpen) {\n setIsResetOpen(false);\n return;\n }\n if (isRevertOpen) {\n setIsRevertOpen(false);\n setCommitToRevert(null);\n return;\n }\n if (isBranchPopoverOpen) {\n setIsBranchPopoverOpen(false);\n return;\n }\n if (scriptExecution.isOpen && isScriptExecutionFinished) {\n closeScriptExecutionDialog();\n }\n }, [\n isAbortCherryPickOpen,\n isCheckoutToLocalOpen,\n iscreateBranchOpen,\n isCreateTagOpen,\n isPullOpen,\n isPushOpen,\n closeMergeDialog,\n isMergeOpen,\n closeRebaseDialog,\n isRebaseOpen,\n isRenameOpen,\n closeRenameBranchDialog,\n isRenameRemoteOpen,\n closeRenameRemoteDialog,\n isDeleteRemoteOpen,\n closeDeleteRemoteDialog,\n isAddRemoteOpen,\n closeAddRemoteDialog,\n isCherryPickOpen,\n isDeleteOpen,\n isDeleteWorktreeOpen,\n isDeleteTagOpen,\n isRewordOpen,\n closeRewordDialog,\n isResetOpen,\n isRevertOpen,\n isBranchPopoverOpen,\n scriptExecution.isOpen,\n isScriptExecutionFinished,\n closeScriptExecutionDialog,\n ]);\n\n const confirmTopPopup = () => {\n if (isAbortCherryPickOpen) {\n if (!isAbortingCherryPick) {\n void handleAbortCherryPick();\n }\n return;\n }\n if (isCheckoutToLocalOpen) {\n if (checkoutLocalBranchName && !isCheckingOutToLocal) {\n void handleCheckoutToLocal();\n }\n return;\n }\n if (iscreateBranchOpen) {\n if (newBranchName && !isCreating) {\n void handleCreateBranch();\n }\n return;\n }\n if (isCreateTagOpen) {\n if (newTagName.trim() && !isCreatingTag) {\n void handleCreateTag();\n }\n return;\n }\n if (isPullOpen) {\n if (!isPulling && pullRemotes.length > 0 && pullSelectedRemote && pullSelectedRemoteBranch) {\n void handlePullFromRemote();\n }\n return;\n }\n if (isPushOpen) {\n if (!isPushing && pushRemotes.length > 0 && pushSelectedRemote && pushSelectedRemoteBranch) {\n void handlePushToRemote();\n }\n return;\n }\n if (isMergeOpen) {\n if (!isMerging) {\n void handleMerge();\n }\n return;\n }\n if (isRebaseOpen) {\n if (!isRebasing) {\n void handleRebase();\n }\n return;\n }\n if (isRenameOpen) {\n const isSameName = remoteBranchToRename\n ? newBranchNameForRename === remoteBranchToRename.branch\n : newBranchNameForRename === branchToRename;\n if (newBranchNameForRename && !isSameName && !isRenaming) {\n void handleRenameBranch();\n }\n return;\n }\n if (isRenameRemoteOpen) {\n const trimmedNewName = newRemoteNameForRename.trim();\n if (\n trimmedNewName &&\n trimmedNewName !== (remoteToRename ?? '').trim() &&\n !isRenamingRemote\n ) {\n void handleRenameRemote();\n }\n return;\n }\n if (isDeleteRemoteOpen) {\n if (remoteToDelete && !isDeletingRemote) {\n void handleDeleteRemote();\n }\n return;\n }\n if (isAddRemoteOpen) {\n if (newRemoteName.trim() && newRemoteUrl.trim() && !isAddingRemote) {\n void handleAddRemote();\n }\n return;\n }\n if (isCherryPickOpen) {\n if (!isCherryPicking) {\n void handleCherryPickCommit();\n }\n return;\n }\n if (isDeleteOpen) {\n if (!isDeleting) {\n void handleDeleteBranch();\n }\n return;\n }\n if (isDeleteWorktreeOpen) {\n if (worktreeToDelete && !isDeletingWorktree) {\n void handleDeleteWorktree();\n }\n return;\n }\n if (isDeleteTagOpen) {\n if (tagToDelete && !isDeletingTag) {\n void handleDeleteTag();\n }\n return;\n }\n if (isRewordOpen) {\n if (newMessageSubject.trim() && !isRewording) {\n void handleReword();\n }\n return;\n }\n if (isResetOpen) {\n if (!isResetting) {\n void handleConfirmReset();\n }\n return;\n }\n if (isRevertOpen) {\n if (!isReverting) {\n void handleConfirmRevert();\n }\n return;\n }\n if (scriptExecution.isOpen && isScriptExecutionFinished) {\n closeScriptExecutionDialog();\n }\n };\n\n const isAnyPopupOpen =\n isResetOpen ||\n isRevertOpen ||\n isRewordOpen ||\n isDeleteOpen ||\n isDeleteWorktreeOpen ||\n isDeleteTagOpen ||\n isAbortCherryPickOpen ||\n isCherryPickOpen ||\n isRenameOpen ||\n isRenameRemoteOpen ||\n isDeleteRemoteOpen ||\n isAddRemoteOpen ||\n isRebaseOpen ||\n isMergeOpen ||\n isPushOpen ||\n isPullOpen ||\n iscreateBranchOpen ||\n isCreateTagOpen ||\n isCheckoutToLocalOpen ||\n isBranchPopoverOpen ||\n scriptExecution.isOpen;\n\n useEscapeDismiss(isAnyPopupOpen, closeTopPopup, confirmTopPopup);\n\n // Resizable bottom panel state - load from global settings or fallback to localStorage\n const panelHeightStorageKey = 'git-web:history-panel-height';\n const commitDetailsMessageRatioStorageKey = 'git-web:history-commit-details-message-ratio';\n const [panelHeight, setPanelHeight] = useState(300);\n const [isResizing, setIsResizing] = useState(false);\n const resizeRef = useRef<{ startY: number; startHeight: number } | null>(null);\n const [commitDetailsMessageRatio, setCommitDetailsMessageRatio] = useState(DEFAULT_COMMIT_DETAILS_MESSAGE_RATIO);\n const [isCommitDetailsRatioResizing, setIsCommitDetailsRatioResizing] = useState(false);\n const commitDetailsContentRef = useRef<HTMLDivElement | null>(null);\n\n // Track if user has manually resized the panel to avoid sync loops\n const userHasResized = useRef(false);\n\n // Load panel height from settings or localStorage\n useEffect(() => {\n if (settings?.historyPanelHeight) {\n setPanelHeight(clampHistoryPanelHeight(settings.historyPanelHeight));\n } else {\n try {\n const stored = localStorage.getItem(panelHeightStorageKey);\n if (stored) {\n const parsed = parseInt(stored, 10);\n if (!isNaN(parsed) && parsed >= MIN_HISTORY_PANEL_HEIGHT && parsed <= MAX_HISTORY_PANEL_HEIGHT) {\n setPanelHeight(parsed);\n }\n }\n } catch (e) {\n console.error('Failed to load panel height from localStorage:', e);\n }\n }\n }, [settings?.historyPanelHeight]);\n\n // Save panel height to localStorage for immediate persistence\n useEffect(() => {\n try {\n localStorage.setItem(panelHeightStorageKey, String(panelHeight));\n } catch (e) {\n console.error('Failed to save panel height to localStorage:', e);\n }\n }, [panelHeight]);\n\n // Load commit details message/diff ratio from localStorage\n useEffect(() => {\n try {\n const stored = localStorage.getItem(commitDetailsMessageRatioStorageKey);\n if (!stored) return;\n const parsed = parseFloat(stored);\n if (!Number.isNaN(parsed)) {\n setCommitDetailsMessageRatio(clampCommitDetailsMessageRatio(parsed));\n }\n } catch (e) {\n console.error('Failed to load commit details ratio from localStorage:', e);\n }\n }, []);\n\n // Persist commit details message/diff ratio in localStorage\n useEffect(() => {\n try {\n localStorage.setItem(commitDetailsMessageRatioStorageKey, String(commitDetailsMessageRatio));\n } catch (e) {\n console.error('Failed to save commit details ratio to localStorage:', e);\n }\n }, [commitDetailsMessageRatio]);\n\n // Sync to global settings when resizing stops\n useEffect(() => {\n if (!isResizing && userHasResized.current) {\n updateSettings.mutate({ historyPanelHeight: panelHeight });\n userHasResized.current = false;\n }\n }, [isResizing, panelHeight, updateSettings]);\n\n // Handle resize drag\n const handleResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setIsResizing(true);\n resizeRef.current = { startY: e.clientY, startHeight: panelHeight };\n }, [panelHeight]);\n\n useEffect(() => {\n if (!isResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizeRef.current) return;\n const delta = resizeRef.current.startY - e.clientY;\n const newHeight = clampHistoryPanelHeight(resizeRef.current.startHeight + delta);\n setPanelHeight(newHeight);\n userHasResized.current = true;\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n resizeRef.current = null;\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isResizing]);\n\n const handleCommitDetailsRatioResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setIsCommitDetailsRatioResizing(true);\n }, []);\n\n useEffect(() => {\n if (!isCommitDetailsRatioResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const container = commitDetailsContentRef.current;\n if (!container) return;\n const rect = container.getBoundingClientRect();\n if (rect.height <= 0) return;\n\n const nextRatio = clampCommitDetailsMessageRatio((e.clientY - rect.top) / rect.height);\n setCommitDetailsMessageRatio(nextRatio);\n };\n\n const handleMouseUp = () => {\n setIsCommitDetailsRatioResizing(false);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = 'ns-resize';\n document.body.style.userSelect = 'none';\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n }, [isCommitDetailsRatioResizing]);\n\n useEffect(() => {\n if (!isBranchPopoverOpen) return;\n\n const handleMouseDown = (event: MouseEvent) => {\n if (branchPopoverRef.current && !branchPopoverRef.current.contains(event.target as Node)) {\n setIsBranchPopoverOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n\n return () => {\n document.removeEventListener('mousedown', handleMouseDown);\n };\n }, [isBranchPopoverOpen]);\n\n // Build branch trees for local and remote branches\n const localBranchTree = useMemo(() => {\n if (!branchData?.branches) return null;\n return buildBranchTree(branchData.branches);\n }, [branchData?.branches]);\n\n const remoteBranchTrees = useMemo(() => {\n if (!branchData?.remotes) return null;\n return buildRemoteBranchTree(branchData.remotes);\n }, [branchData?.remotes]);\n\n const allBranchRefs = useMemo(() => {\n const refs = new Set<string>();\n for (const branch of branchData?.branches ?? []) {\n refs.add(branch);\n }\n for (const [remoteName, branches] of Object.entries(branchData?.remotes ?? {})) {\n for (const branch of branches) {\n refs.add(`remotes/${remoteName}/${branch}`);\n }\n }\n return refs;\n }, [branchData?.branches, branchData?.remotes]);\n\n const selectedBranchSet = useMemo(() => new Set(selectedBranchRefs), [selectedBranchRefs]);\n const sessionByBranchName = useMemo(() => {\n const map = new Map<string, SessionMetadata>();\n for (const session of sessionsForRepo) {\n const branchName = session.branchName.trim();\n // listSessions() is sorted by timestamp desc, so keep the first match.\n if (!branchName || map.has(branchName)) continue;\n map.set(branchName, session);\n }\n return map;\n }, [sessionsForRepo]);\n\n const repository = useRepository(repoPath);\n const updateRepository = useUpdateRepository();\n const customBranchScripts = useMemo(() => {\n const scripts = repository?.customScripts ?? [];\n return scripts.filter((script) => (\n script.target === 'branch' &&\n script.action === 'run-bash-script' &&\n script.name.trim().length > 0 &&\n script.content.trim().length > 0\n ));\n }, [repository?.customScripts]);\n\n // Group expanded state (for \"Branches\", \"Remotes\", and \"Worktrees\" group headers)\n const [localGroupExpanded, setLocalGroupExpanded] = useState(true);\n const [remotesGroupExpanded, setRemotesGroupExpanded] = useState(true);\n const [worktreesGroupExpanded, setWorktreesGroupExpanded] = useState(true);\n\n // Visibility state for branches/folders\n const [visibilityMap, setVisibilityMap] = useState<VisibilityMap>({});\n const [expandedFolders, setExpandedFolders] = useState<Set<string>>(new Set());\n\n const orderedVisibleBranchRefs = useMemo(() => {\n const ordered: string[] = [];\n if (localGroupExpanded && localBranchTree) {\n ordered.push(...collectVisibleBranchRefs(localBranchTree, expandedFolders));\n }\n if (remotesGroupExpanded && remoteBranchTrees) {\n for (const [remoteName, tree] of Array.from(remoteBranchTrees.entries())) {\n const remoteGroupPath = `__remotes__/${remoteName}`;\n if (!expandedFolders.has(remoteGroupPath)) continue;\n ordered.push(...collectVisibleBranchRefs(tree, expandedFolders, `remotes/${remoteName}`));\n }\n }\n return ordered;\n }, [expandedFolders, localBranchTree, localGroupExpanded, remoteBranchTrees, remotesGroupExpanded]);\n\n useEffect(() => {\n if (selectedBranchRefs.length === 0) return;\n const nextSelected = selectedBranchRefs.filter((branch) => allBranchRefs.has(branch));\n if (nextSelected.length !== selectedBranchRefs.length) {\n setSelectedBranchRefs(nextSelected);\n }\n if (branchSelectionAnchor && !allBranchRefs.has(branchSelectionAnchor)) {\n setBranchSelectionAnchor(nextSelected.length > 0 ? nextSelected[nextSelected.length - 1] : null);\n }\n }, [allBranchRefs, branchSelectionAnchor, selectedBranchRefs]);\n\n // Load settings from repository data when it's available\n const lastInitializedRepo = useRef<string | null>(null);\n useEffect(() => {\n if (repository && repository.path !== lastInitializedRepo.current) {\n lastInitializedRepo.current = repository.path;\n if (repository.localGroupExpanded !== undefined) setLocalGroupExpanded(repository.localGroupExpanded);\n if (repository.remotesGroupExpanded !== undefined) setRemotesGroupExpanded(repository.remotesGroupExpanded);\n if (repository.worktreesGroupExpanded !== undefined) setWorktreesGroupExpanded(repository.worktreesGroupExpanded);\n if (repository.expandedFolders) setExpandedFolders(new Set(repository.expandedFolders));\n if (repository.visibilityMap) setVisibilityMap(repository.visibilityMap as VisibilityMap);\n }\n }, [repository]);\n\n useEffect(() => {\n let isDisposed = false;\n\n const loadSessionsForRepo = async () => {\n try {\n const sessions = await listSessions();\n if (isDisposed) return;\n\n setSessionsForRepo(\n sessions.filter((session) => (\n session.repoPath === repoPath || session.worktreePath === repoPath\n )),\n );\n } catch (error) {\n console.error('Failed to load sessions for branch menu:', error);\n if (!isDisposed) {\n setSessionsForRepo([]);\n }\n }\n };\n\n const handleSessionsUpdated = () => {\n void loadSessionsForRepo();\n };\n\n const handleStorage = (event: StorageEvent) => {\n if (event.key === SESSIONS_UPDATED_STORAGE_KEY) {\n void loadSessionsForRepo();\n }\n };\n\n void loadSessionsForRepo();\n\n window.addEventListener(SESSIONS_UPDATED_EVENT, handleSessionsUpdated);\n window.addEventListener('storage', handleStorage);\n\n return () => {\n isDisposed = true;\n window.removeEventListener(SESSIONS_UPDATED_EVENT, handleSessionsUpdated);\n window.removeEventListener('storage', handleStorage);\n };\n }, [repoPath]);\n\n // Helper to save settings to the backend\n const saveSettings = useCallback((updates: Partial<Repository>) => {\n updateRepository.mutate({\n path: repoPath,\n updates\n });\n }, [repoPath, updateRepository]);\n\n const handleToggleLocalGroup = useCallback(() => {\n const newValue = !localGroupExpanded;\n setLocalGroupExpanded(newValue);\n saveSettings({ localGroupExpanded: newValue });\n }, [localGroupExpanded, saveSettings]);\n\n const handleToggleRemotesGroup = useCallback(() => {\n const newValue = !remotesGroupExpanded;\n setRemotesGroupExpanded(newValue);\n saveSettings({ remotesGroupExpanded: newValue });\n }, [remotesGroupExpanded, saveSettings]);\n\n const handleToggleWorktreesGroup = useCallback(() => {\n const newValue = !worktreesGroupExpanded;\n setWorktreesGroupExpanded(newValue);\n saveSettings({ worktreesGroupExpanded: newValue });\n }, [saveSettings, worktreesGroupExpanded]);\n\n // Toggle folder expansion\n const toggleFolder = useCallback((path: string) => {\n setExpandedFolders(prev => {\n const next = new Set(prev);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n saveSettings({ expandedFolders: Array.from(next) });\n return next;\n });\n }, [saveSettings]);\n\n // Toggle visibility for a path\n const handleToggleVisibility = useCallback((path: string, type: 'visible' | 'hidden') => {\n setVisibilityMap(prev => {\n const next = { ...prev };\n // If currently set to this type, remove it (toggle off)\n if (next[path] === type) {\n delete next[path];\n } else {\n // Set to this type (auto-removes the other one since we're replacing)\n next[path] = type;\n }\n const persistedVisibilityMap: Record<string, 'visible' | 'hidden'> = {};\n Object.entries(next).forEach(([key, value]) => {\n if (value === 'visible' || value === 'hidden') {\n persistedVisibilityMap[key] = value;\n }\n });\n saveSettings({ visibilityMap: persistedVisibilityMap });\n return next;\n });\n }, [saveSettings]);\n\n // Clear all visibility filters\n const handleClearAllFilters = useCallback(() => {\n setVisibilityMap({});\n saveSettings({ visibilityMap: {} });\n }, [saveSettings]);\n\n // Helper to get effective visibility for a branch considering group paths\n const getBranchEffectiveVisibility = useCallback((branch: string, isRemoteBranch: boolean) => {\n // First check the branch itself\n const directVis = getEffectiveVisibility(branch, visibilityMap);\n if (directVis) return directVis;\n\n // Check group-level visibility\n if (isRemoteBranch) {\n // Remote branch format: remotes/origin/branch-name\n const parts = branch.split('/');\n if (parts.length >= 2 && parts[0] === 'remotes') {\n const remoteName = parts[1];\n // Check remote-specific group\n const remoteGroupVis = visibilityMap[`__remotes__/${remoteName}`];\n if (remoteGroupVis) return remoteGroupVis;\n // Check all remotes group\n const remotesVis = visibilityMap['__remotes__'];\n if (remotesVis) return remotesVis;\n }\n } else {\n // Local branch - check __local__ group\n const localVis = visibilityMap['__local__'];\n if (localVis) return localVis;\n }\n\n return null;\n }, [visibilityMap]);\n\n // Compute which branches should be visible based on visibility map\n const filteredCommits = useMemo(() => {\n if (!log?.all || !branchData?.branches || !branchData?.branchCommits) return log?.all || [];\n\n const hasVisibleMarkers = Object.values(visibilityMap).some(v => v === 'visible');\n const hasHiddenMarkers = Object.values(visibilityMap).some(v => v === 'hidden');\n\n // If no visibility markers are set, show all commits\n if (!hasVisibleMarkers && !hasHiddenMarkers) {\n return log.all;\n }\n\n // Get all branches (local + remote)\n const allBranches: { branch: string; isRemote: boolean }[] = [\n ...branchData.branches.map(b => ({ branch: b, isRemote: false })),\n ];\n\n // Add remote branches\n if (branchData.remotes) {\n for (const [remoteName, branches] of Object.entries(branchData.remotes)) {\n for (const branch of branches) {\n allBranches.push({ branch: `remotes/${remoteName}/${branch}`, isRemote: true });\n }\n }\n }\n\n // Calculate effective visibility for each branch\n const visibleBranches = new Set<string>();\n const hiddenBranchesSet = new Set<string>();\n const nonHiddenBranches = new Set<string>(); // Branches that are not hidden (for hidden-only mode)\n\n for (const { branch, isRemote } of allBranches) {\n const effectiveVis = getBranchEffectiveVisibility(branch, isRemote);\n if (effectiveVis === 'visible') {\n visibleBranches.add(branch);\n } else if (effectiveVis === 'hidden') {\n hiddenBranchesSet.add(branch);\n } else {\n // No visibility set - this branch is \"neutral\" (non-hidden)\n nonHiddenBranches.add(branch);\n }\n }\n\n // Build a map from commit hash to commit for quick lookup\n const commitMap = new Map(log.all.map(c => [c.hash, c]));\n\n // Helper to mark all ancestors as reachable\n const markReachable = (startHash: string, reachableSet: Set<string>) => {\n const stack = [startHash];\n while (stack.length > 0) {\n const hash = stack.pop()!;\n if (reachableSet.has(hash)) continue;\n\n const commit = commitMap.get(hash);\n if (!commit) continue;\n\n reachableSet.add(hash);\n\n // Add parents to process\n for (const parentHash of commit.parents || []) {\n if (!reachableSet.has(parentHash)) {\n stack.push(parentHash);\n }\n }\n }\n };\n\n // Find commits reachable from visible branches\n const reachableFromVisible = new Set<string>();\n for (const branch of visibleBranches) {\n const headHash = branchData.branchCommits[branch];\n if (headHash) {\n markReachable(headHash, reachableFromVisible);\n }\n }\n\n // If there are visible markers, only show commits reachable from visible branches\n if (hasVisibleMarkers) {\n return log.all.filter(commit => reachableFromVisible.has(commit.hash));\n }\n\n // If only hidden markers exist, show commits reachable from any non-hidden branch\n // A commit should only be hidden if it's EXCLUSIVELY reachable from hidden branches\n if (hasHiddenMarkers) {\n const reachableFromNonHidden = new Set<string>();\n for (const branch of nonHiddenBranches) {\n const headHash = branchData.branchCommits[branch];\n if (headHash) {\n markReachable(headHash, reachableFromNonHidden);\n }\n }\n\n return log.all.filter(commit => reachableFromNonHidden.has(commit.hash));\n }\n\n return log.all;\n }, [log?.all, branchData?.branches, branchData?.branchCommits, branchData?.remotes, visibilityMap, getBranchEffectiveVisibility]);\n\n const selectedCommitHashSet = useMemo(() => new Set(selectedCommitHashes), [selectedCommitHashes]);\n const filteredCommitHashes = useMemo(() => filteredCommits.map((commit) => commit.hash), [filteredCommits]);\n const selectedCommit = useMemo(\n () => (selectedHash ? log?.all.find((commit) => commit.hash === selectedHash) : null),\n [log?.all, selectedHash]\n );\n const selectedCommitRange = useMemo(() => {\n if (!log?.all || selectedCommitHashes.length < 2) return null;\n\n const commitMap = new Map(log.all.map((commit) => [commit.hash, commit]));\n const filteredOrderMap = new Map(filteredCommitHashes.map((hash, index) => [hash, index]));\n const orderedSelection = Array.from(new Set(selectedCommitHashes))\n .filter((hash) => filteredOrderMap.has(hash))\n .sort((a, b) => (filteredOrderMap.get(a) ?? Number.MAX_SAFE_INTEGER) - (filteredOrderMap.get(b) ?? Number.MAX_SAFE_INTEGER));\n\n if (orderedSelection.length < 2) return null;\n\n const latestHash = orderedSelection[0];\n const oldestHash = orderedSelection[orderedSelection.length - 1];\n const latestCommit = commitMap.get(latestHash);\n const oldestCommit = commitMap.get(oldestHash);\n\n if (!latestCommit || !oldestCommit) return null;\n\n return { latestHash, oldestHash, latestCommit, oldestCommit };\n }, [filteredCommitHashes, log?.all, selectedCommitHashes]);\n const isCommitRangeSelection = !!selectedCommitRange;\n\n useEffect(() => {\n if (filteredCommitHashes.length === 0) {\n if (selectedHash || selectedCommitHashes.length > 0 || selectionAnchorHash) {\n selectSingleCommit(null);\n }\n return;\n }\n\n const filteredHashSet = new Set(filteredCommitHashes);\n const nextSelected = selectedCommitHashes.filter((hash) => filteredHashSet.has(hash));\n\n if (nextSelected.length !== selectedCommitHashes.length) {\n setSelectedCommitHashes(nextSelected);\n }\n\n if (selectedHash && !filteredHashSet.has(selectedHash)) {\n setSelectedHash(nextSelected.length > 0 ? nextSelected[nextSelected.length - 1] : null);\n }\n\n if (selectionAnchorHash && !filteredHashSet.has(selectionAnchorHash)) {\n setSelectionAnchorHash(nextSelected.length > 0 ? nextSelected[nextSelected.length - 1] : null);\n }\n }, [filteredCommitHashes, selectedHash, selectedCommitHashes, selectionAnchorHash, selectSingleCommit]);\n\n const handleSelectCommit = useCallback((hash: string, modifiers?: CommitRowSelectModifiers) => {\n const isRangeSelect = modifiers?.isRangeSelect ?? false;\n const isMultiSelect = modifiers?.isMultiSelect ?? false;\n\n if (isRangeSelect) {\n const anchor = selectionAnchorHash ?? selectedHash ?? hash;\n const anchorIndex = filteredCommitHashes.indexOf(anchor);\n const targetIndex = filteredCommitHashes.indexOf(hash);\n\n if (anchorIndex !== -1 && targetIndex !== -1) {\n const [start, end] = anchorIndex < targetIndex ? [anchorIndex, targetIndex] : [targetIndex, anchorIndex];\n const rangeSelection = filteredCommitHashes.slice(start, end + 1);\n setSelectedCommitHashes(rangeSelection);\n setSelectedHash(hash);\n setSelectionAnchorHash(anchor);\n return;\n }\n }\n\n if (isMultiSelect) {\n if (selectedCommitHashSet.has(hash)) {\n const nextSelected = selectedCommitHashes.filter((selected) => selected !== hash);\n setSelectedCommitHashes(nextSelected);\n setSelectedHash((prev) => {\n if (prev !== hash) return prev;\n return nextSelected.length > 0 ? nextSelected[nextSelected.length - 1] : null;\n });\n if (selectionAnchorHash === hash) {\n setSelectionAnchorHash(nextSelected.length > 0 ? nextSelected[nextSelected.length - 1] : null);\n }\n } else {\n setSelectedCommitHashes([...selectedCommitHashes, hash]);\n setSelectedHash(hash);\n setSelectionAnchorHash(hash);\n }\n return;\n }\n\n selectSingleCommit(hash);\n }, [filteredCommitHashes, selectedCommitHashSet, selectedCommitHashes, selectedHash, selectionAnchorHash, selectSingleCommit]);\n\n const selectedCommitsForCherryPick = useMemo(\n () => filteredCommits.filter((commit) => selectedCommitHashSet.has(commit.hash)).reverse(),\n [filteredCommits, selectedCommitHashSet]\n );\n\n // Check if visibility filters are active\n const hasVisibilityFilters = useMemo(() => {\n return Object.values(visibilityMap).some(v => v === 'visible' || v === 'hidden');\n }, [visibilityMap]);\n\n // Compute hidden branches set for filtering branch tags in git graph\n const hiddenBranches = useMemo(() => {\n const hidden = new Set<string>();\n\n // Check local branches\n if (branchData?.branches) {\n for (const branch of branchData.branches) {\n const effectiveVis = getBranchEffectiveVisibility(branch, false);\n if (effectiveVis === 'hidden') {\n hidden.add(branch);\n }\n }\n }\n\n // Check remote branches\n if (branchData?.remotes) {\n for (const [remoteName, branches] of Object.entries(branchData.remotes)) {\n for (const branch of branches) {\n const fullRef = `remotes/${remoteName}/${branch}`;\n const effectiveVis = getBranchEffectiveVisibility(fullRef, true);\n if (effectiveVis === 'hidden') {\n hidden.add(fullRef);\n }\n }\n }\n }\n\n return hidden;\n }, [branchData?.branches, branchData?.remotes, getBranchEffectiveVisibility]);\n\n // Auto-fetch more commits when filtered results are too few\n const MIN_FILTERED_COMMITS = 50;\n const MAX_AUTO_FETCH_LIMIT = 5000;\n\n useEffect(() => {\n if (\n hasVisibilityFilters &&\n filteredCommits.length < MIN_FILTERED_COMMITS &&\n !isFetching &&\n limit < MAX_AUTO_FETCH_LIMIT &&\n log?.all && log.all.length >= limit\n ) {\n // Fetch more commits - increase limit by 100\n setLimit(l => Math.min(l + 100, MAX_AUTO_FETCH_LIMIT));\n }\n }, [hasVisibilityFilters, filteredCommits.length, isFetching, limit, log?.all]);\n\n // Handle scrolling to branch commit when it's loaded\n useEffect(() => {\n if (!pendingScrollCommit || !log?.all || isFetching) return;\n\n // Check if commit exists in current loaded commits\n const commitExists = log.all.some(c => c.hash === pendingScrollCommit);\n\n if (commitExists) {\n // Use requestAnimationFrame to ensure DOM is updated\n requestAnimationFrame(() => {\n const scrolled = gitGraphRef.current?.scrollToCommit(pendingScrollCommit);\n if (scrolled) {\n selectSingleCommit(pendingScrollCommit);\n setPendingScrollCommit(null);\n }\n });\n } else {\n // Need to load more commits - increase limit\n // Set a reasonable max limit to avoid infinite loading\n if (limit < 5000) {\n setLimit(l => l + 100);\n } else {\n // Give up after 5000 commits\n console.warn('Could not find commit after loading 5000 commits');\n setPendingScrollCommit(null);\n }\n }\n }, [pendingScrollCommit, log?.all, isFetching, limit, selectSingleCommit]);\n\n const scrollToBranchHeadCommit = useCallback((branch: string) => {\n if (!branchData?.branchCommits) return;\n\n const commitHash = branchData.branchCommits[branch];\n if (!commitHash) return;\n\n const commitExists = log?.all?.some(c => c.hash === commitHash);\n if (commitExists && gitGraphRef.current) {\n const scrolled = gitGraphRef.current.scrollToCommit(commitHash);\n if (scrolled) {\n selectSingleCommit(commitHash);\n return;\n }\n }\n\n setPendingScrollCommit(commitHash);\n selectSingleCommit(commitHash);\n }, [branchData?.branchCommits, log?.all, selectSingleCommit]);\n\n useEffect(() => {\n if (!requestedBranchFromQuery || !branchData?.branchCommits) return;\n if (activeBranchFromData !== requestedBranchFromQuery) return;\n\n const requestKey = `${repoPath}:${requestedBranchFromQuery}`;\n if (initialBranchHeadSelectionAttemptKeyRef.current === requestKey) return;\n\n initialBranchHeadSelectionAttemptKeyRef.current = requestKey;\n scrollToBranchHeadCommit(requestedBranchFromQuery);\n }, [activeBranchFromData, branchData?.branchCommits, repoPath, requestedBranchFromQuery, scrollToBranchHeadCommit]);\n\n const handleBranchClick = useCallback((branch: string, modifiers?: BranchRowSelectModifiers) => {\n const isRangeSelect = modifiers?.isRangeSelect ?? false;\n const isMultiSelect = modifiers?.isMultiSelect ?? false;\n\n if (isRangeSelect) {\n const anchor = branchSelectionAnchor ?? branch;\n const anchorIndex = orderedVisibleBranchRefs.indexOf(anchor);\n const targetIndex = orderedVisibleBranchRefs.indexOf(branch);\n if (anchorIndex !== -1 && targetIndex !== -1) {\n const [start, end] = anchorIndex < targetIndex ? [anchorIndex, targetIndex] : [targetIndex, anchorIndex];\n const rangeSelection = orderedVisibleBranchRefs.slice(start, end + 1);\n const shouldUnselect = selectedBranchSet.has(branch);\n if (shouldUnselect) {\n setSelectedBranchRefs(selectedBranchRefs.filter((selected) => !rangeSelection.includes(selected)));\n } else {\n setSelectedBranchRefs(Array.from(new Set([...selectedBranchRefs, ...rangeSelection])));\n }\n setBranchSelectionAnchor(anchor);\n } else {\n setSelectedBranchRefs([branch]);\n setBranchSelectionAnchor(branch);\n }\n return;\n }\n\n if (isMultiSelect) {\n if (selectedBranchSet.has(branch)) {\n const nextSelected = selectedBranchRefs.filter((selected) => selected !== branch);\n setSelectedBranchRefs(nextSelected);\n } else {\n setSelectedBranchRefs([...selectedBranchRefs, branch]);\n }\n setBranchSelectionAnchor(branch);\n return;\n }\n\n setSelectedBranchRefs([branch]);\n setBranchSelectionAnchor(branch);\n scrollToBranchHeadCommit(branch);\n }, [branchSelectionAnchor, orderedVisibleBranchRefs, scrollToBranchHeadCommit, selectedBranchRefs, selectedBranchSet]);\n\n const handleBranchContextMenu = useCallback((branch: string) => {\n if (selectedBranchSet.has(branch)) return;\n setSelectedBranchRefs([branch]);\n setBranchSelectionAnchor(branch);\n }, [selectedBranchSet]);\n\n const handleRunCustomScript = useCallback(async (script: RepositoryCustomScript, branchRef: string) => {\n setDidCopyScriptOutput(false);\n setIsCancelingScriptExecution(false);\n setScriptExecution({\n isOpen: true,\n executionId: null,\n scriptName: script.name,\n branchRef,\n output: '',\n status: 'starting',\n error: null,\n });\n\n try {\n const response = await fetch('/api/custom-scripts', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n command: 'start',\n repoPath,\n branchRef,\n scriptContent: script.content,\n }),\n });\n\n const result = await response.json();\n if (!response.ok) {\n throw new Error(result.error || 'Failed to start script execution');\n }\n\n const prelude: string[] = [];\n if (result.previousBranch && result.checkedOutBranch && result.previousBranch !== result.checkedOutBranch) {\n prelude.push(`[info] Checked out ${result.checkedOutBranch} (from ${result.previousBranch})`);\n }\n\n setScriptExecution((prev) => ({\n ...prev,\n executionId: result.executionId,\n output: [prelude.join('\\n'), result.output].filter(Boolean).join('\\n'),\n status: result.status as ScriptExecutionStatus,\n error: null,\n }));\n } catch (error) {\n setScriptExecution((prev) => ({\n ...prev,\n status: 'failed',\n error: (error as Error).message,\n output: prev.output\n ? `${prev.output}\\n[error] ${(error as Error).message}`\n : `[error] ${(error as Error).message}`,\n }));\n }\n }, [repoPath]);\n\n const handleCancelCustomScriptExecution = useCallback(async () => {\n if (!scriptExecution.executionId || !isScriptExecutionRunning) return;\n\n setIsCancelingScriptExecution(true);\n try {\n const response = await fetch('/api/custom-scripts', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n command: 'cancel',\n executionId: scriptExecution.executionId,\n }),\n });\n const result = await response.json();\n if (!response.ok) {\n throw new Error(result.error || 'Failed to cancel script execution');\n }\n\n setScriptExecution((prev) => ({\n ...prev,\n output: result.output,\n status: result.status as ScriptExecutionStatus,\n }));\n\n if (result.status !== 'running' && result.status !== 'starting') {\n setIsCancelingScriptExecution(false);\n }\n } catch (error) {\n setScriptExecution((prev) => ({\n ...prev,\n output: `${prev.output}\\n[error] ${(error as Error).message}`,\n }));\n setIsCancelingScriptExecution(false);\n }\n }, [scriptExecution.executionId, isScriptExecutionRunning]);\n\n const handleCopyCustomScriptOutput = useCallback(async () => {\n if (isCopyingScriptOutput) return;\n\n setIsCopyingScriptOutput(true);\n const copied = await copyText(scriptExecution.output);\n setIsCopyingScriptOutput(false);\n setDidCopyScriptOutput(copied);\n if (copied) {\n setTimeout(() => setDidCopyScriptOutput(false), 1500);\n }\n }, [isCopyingScriptOutput, scriptExecution.output]);\n\n useEffect(() => {\n if (!scriptExecution.executionId || !isScriptExecutionRunning) return;\n\n let disposed = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n\n const poll = async () => {\n try {\n const response = await fetch('/api/custom-scripts', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n command: 'status',\n executionId: scriptExecution.executionId,\n }),\n });\n const result = await response.json();\n\n if (!response.ok) {\n throw new Error(result.error || 'Failed to fetch script execution output');\n }\n\n if (disposed) return;\n\n const nextStatus = result.status as ScriptExecutionStatus;\n setScriptExecution((prev) => {\n if (prev.executionId !== result.executionId) return prev;\n return {\n ...prev,\n output: result.output,\n status: nextStatus,\n error: null,\n };\n });\n\n if (nextStatus === 'running') {\n pollTimer = setTimeout(poll, 450);\n } else {\n setIsCancelingScriptExecution(false);\n }\n } catch (error) {\n if (disposed) return;\n setIsCancelingScriptExecution(false);\n setScriptExecution((prev) => ({\n ...prev,\n status: 'failed',\n error: (error as Error).message,\n output: prev.output\n ? `${prev.output}\\n[error] ${(error as Error).message}`\n : `[error] ${(error as Error).message}`,\n }));\n }\n };\n\n void poll();\n\n return () => {\n disposed = true;\n if (pollTimer) {\n clearTimeout(pollTimer);\n }\n };\n }, [scriptExecution.executionId, isScriptExecutionRunning]);\n\n const confirmDeleteBranches = (branches: string[]) => {\n const deletableBranches = branches.filter((branch) => branch !== currentBranch);\n if (deletableBranches.length === 0) return;\n setBranchesToDelete(deletableBranches);\n setDeleteRemoteBranch(false);\n setIsDeleteOpen(true);\n };\n\n const confirmDeleteBranch = (branch: string) => {\n confirmDeleteBranches([branch]);\n };\n\n const confirmDeleteWorktree = useCallback((path: string) => {\n const targetPath = path.trim();\n if (!targetPath) return;\n setWorktreeToDelete(targetPath);\n setIsDeleteWorktreeOpen(true);\n }, []);\n\n const closeDeleteTagDialog = useCallback(() => {\n setIsDeleteTagOpen(false);\n setTagToDelete(null);\n setDeleteRemoteTag(false);\n }, []);\n\n const confirmDeleteTag = useCallback((tagName: string) => {\n if (!tagName) return;\n setTagToDelete(tagName);\n setDeleteRemoteTag(false);\n setIsDeleteTagOpen(true);\n }, []);\n\n const handleDeleteBranch = async () => {\n if (branchesToDelete.length === 0) return;\n setIsDeleting(true);\n try {\n const deleteRequests = new Map<string, { branchRef: string; run: () => Promise<unknown> }>();\n const addDeleteRequest = (key: string, branchRef: string, run: () => Promise<unknown>) => {\n if (deleteRequests.has(key)) return;\n deleteRequests.set(key, { branchRef, run });\n };\n\n const trackingRemotesToDelete = new Set<string>();\n if (deleteRemoteBranch) {\n for (const branchRef of branchesToDelete) {\n if (branchRef.startsWith('remotes/')) continue;\n const tracking = branchData?.trackingInfo?.[branchRef];\n if (tracking?.upstream) {\n trackingRemotesToDelete.add(tracking.upstream);\n }\n }\n }\n\n for (const upstream of trackingRemotesToDelete) {\n const [remote, ...branchParts] = upstream.split('/');\n const branch = branchParts.join('/');\n if (remote && branch) {\n const branchRef = `${remote}/${branch}`;\n addDeleteRequest(`remote:${branchRef}`, branchRef, () =>\n runGitAction({\n repoPath,\n action: 'delete-remote-branch',\n data: { remote, branch },\n suppressErrorToast: true,\n })\n );\n }\n }\n\n for (const branchRef of branchesToDelete) {\n if (branchRef.startsWith('remotes/')) {\n const parts = branchRef.split('/');\n if (parts.length >= 3) {\n const remote = parts[1];\n const branch = parts.slice(2).join('/');\n const remoteBranchRef = `${remote}/${branch}`;\n addDeleteRequest(`remote:${remoteBranchRef}`, remoteBranchRef, () =>\n runGitAction({\n repoPath,\n action: 'delete-remote-branch',\n data: { remote, branch },\n suppressErrorToast: true,\n })\n );\n }\n continue;\n }\n\n addDeleteRequest(`local:${branchRef}`, branchRef, () =>\n runGitAction({\n repoPath,\n action: 'delete-branch',\n data: { branch: branchRef },\n suppressErrorToast: true,\n })\n );\n }\n\n const requests = Array.from(deleteRequests.values());\n const results = await Promise.allSettled(requests.map((request) => request.run()));\n const failedBranches = results.flatMap((result, index) => {\n if (result.status === 'fulfilled') return [];\n const failedBranch = requests[index].branchRef;\n console.error(`Failed to delete branch \"${failedBranch}\":`, result.reason);\n return [failedBranch];\n });\n\n if (failedBranches.length > 0) {\n toast({\n type: 'error',\n title: failedBranches.length === 1\n ? 'Failed to Delete 1 Branch'\n : `Failed to Delete ${failedBranches.length} Branches`,\n description: (\n <div>\n <div>The following branches could not be deleted:</div>\n <ul className=\"mt-1 max-h-40 overflow-y-auto list-disc pl-5\">\n {failedBranches.map((branch) => (\n <li key={branch} className=\"break-all\">{branch}</li>\n ))}\n </ul>\n </div>\n ),\n duration: 10000,\n });\n }\n\n setIsDeleteOpen(false);\n setBranchesToDelete([]);\n setDeleteRemoteBranch(false);\n setSelectedBranchRefs([]);\n setBranchSelectionAnchor(null);\n } catch (e) {\n console.error(e);\n } finally {\n setIsDeleting(false);\n }\n };\n\n const handleDeleteTag = async () => {\n if (!tagToDelete) return;\n setIsDeletingTag(true);\n try {\n await runGitAction({\n repoPath,\n action: 'delete-tag',\n data: { tag: tagToDelete },\n });\n\n if (deleteRemoteTag && remoteNameForTagDelete) {\n try {\n await runGitAction({\n repoPath,\n action: 'delete-remote-tag',\n data: { remote: remoteNameForTagDelete, tag: tagToDelete },\n });\n } catch (error) {\n console.error('Failed to delete remote tag:', error);\n }\n }\n\n closeDeleteTagDialog();\n } catch (e) {\n console.error(e);\n } finally {\n setIsDeletingTag(false);\n }\n };\n\n const handleDeleteWorktree = async () => {\n if (!worktreeToDelete) return;\n\n setIsDeletingWorktree(true);\n try {\n await runGitAction({\n repoPath,\n action: 'delete-worktree',\n data: { path: worktreeToDelete },\n });\n setIsDeleteWorktreeOpen(false);\n setWorktreeToDelete(null);\n } catch (e) {\n console.error(e);\n } finally {\n setIsDeletingWorktree(false);\n }\n };\n\n const confirmRenameBranch = (branch: string) => {\n setBranchToRename(branch);\n setRemoteBranchToRename(null);\n // Pre-fill with current branch name\n setNewBranchNameForRename(branch);\n setRenameTrackingRemoteBranch(false);\n setIsRenameOpen(true);\n }\n\n const confirmRenameRemoteBranch = (fullRemoteBranch: string) => {\n const parts = fullRemoteBranch.split('/');\n if (parts.length < 3 || parts[0] !== 'remotes') return;\n\n const remote = parts[1];\n const branch = parts.slice(2).join('/');\n if (!remote || !branch) return;\n\n setBranchToRename(fullRemoteBranch);\n setRemoteBranchToRename({ remote, branch });\n setNewBranchNameForRename(branch);\n setRenameTrackingRemoteBranch(false);\n setIsRenameOpen(true);\n }\n\n const confirmRenameRemote = (remote: string) => {\n setRemoteToRename(remote);\n setNewRemoteNameForRename(remote);\n setIsRenameRemoteOpen(true);\n }\n\n const confirmDeleteRemote = (remote: string) => {\n if (!remote) return;\n setRemoteToDelete(remote);\n setIsDeleteRemoteOpen(true);\n }\n\n const confirmAddRemote = () => {\n setNewRemoteName('origin');\n setNewRemoteUrl('');\n setIsAddRemoteOpen(true);\n }\n\n const handleRenameBranch = async () => {\n if (!branchToRename || !newBranchNameForRename) return;\n const isSameName = remoteBranchToRename\n ? remoteBranchToRename.branch === newBranchNameForRename\n : branchToRename === newBranchNameForRename;\n\n if (isSameName) {\n closeRenameBranchDialog();\n return;\n }\n setIsRenaming(true);\n try {\n if (remoteBranchToRename) {\n await runGitAction({\n repoPath,\n action: 'rename-remote-branch',\n data: {\n remote: remoteBranchToRename.remote,\n oldName: remoteBranchToRename.branch,\n newName: newBranchNameForRename,\n }\n });\n } else {\n await runGitAction({\n repoPath,\n action: 'rename-branch',\n data: {\n oldName: branchToRename,\n newName: newBranchNameForRename,\n renameTrackingRemote: renameTrackingRemoteBranch,\n }\n });\n }\n closeRenameBranchDialog();\n } catch (e) {\n console.error(e);\n } finally {\n setIsRenaming(false);\n }\n }\n\n const handleRenameRemote = async () => {\n if (!remoteToRename) return;\n const trimmedOldName = remoteToRename.trim();\n const trimmedNewName = newRemoteNameForRename.trim();\n if (!trimmedOldName || !trimmedNewName) return;\n\n if (trimmedOldName === trimmedNewName) {\n closeRenameRemoteDialog();\n return;\n }\n\n setIsRenamingRemote(true);\n try {\n await runGitAction({\n repoPath,\n action: 'rename-remote',\n data: {\n oldName: trimmedOldName,\n newName: trimmedNewName,\n },\n });\n closeRenameRemoteDialog();\n } catch (e) {\n console.error(e);\n } finally {\n setIsRenamingRemote(false);\n }\n }\n\n const handleDeleteRemote = async () => {\n if (!remoteToDelete) return;\n const trimmedRemoteName = remoteToDelete.trim();\n if (!trimmedRemoteName) return;\n\n setIsDeletingRemote(true);\n try {\n await runGitAction({\n repoPath,\n action: 'delete-remote',\n data: {\n name: trimmedRemoteName,\n },\n });\n closeDeleteRemoteDialog();\n } catch (e) {\n console.error(e);\n } finally {\n setIsDeletingRemote(false);\n }\n }\n\n const handleAddRemote = async () => {\n const trimmedName = newRemoteName.trim();\n const trimmedUrl = newRemoteUrl.trim();\n if (!trimmedName || !trimmedUrl) return;\n\n setIsAddingRemote(true);\n try {\n await runGitAction({\n repoPath,\n action: 'add-remote',\n data: {\n name: trimmedName,\n url: trimmedUrl,\n },\n });\n closeAddRemoteDialog();\n } catch (e) {\n console.error(e);\n } finally {\n setIsAddingRemote(false);\n }\n }\n\n const confirmRebase = ({ sourceBranch, targetBranch }: BranchOperation) => {\n setRebaseSourceBranch(sourceBranch);\n setRebaseTargetBranch(targetBranch);\n setRebaseStashChanges(true);\n setRebaseConflictStatus('checking');\n setIsRebaseOpen(true);\n }\n\n const handleRebase = async () => {\n if (!rebaseSourceBranch || !rebaseTargetBranch) return;\n setIsRebasing(true);\n try {\n await runGitAction({\n repoPath,\n action: 'checkout',\n data: { branch: rebaseSourceBranch }\n });\n\n await runGitAction({\n repoPath,\n action: 'rebase',\n data: { ontoBranch: rebaseTargetBranch, stashChanges: rebaseStashChanges }\n });\n closeRebaseDialog();\n } catch (e) {\n if (isMergeOrRebaseConflictError(e)) {\n closeRebaseDialog();\n toast({\n type: 'warning',\n title: 'Rebase Conflict Detected',\n description: 'Rebase conflict detected in the background. Please resolve via CLI since the conflicts tab has been removed.',\n duration: 12000,\n });\n }\n console.error(e);\n } finally {\n setIsRebasing(false);\n }\n }\n\n useEffect(() => {\n const sourceBranch = rebaseSourceBranch;\n const ontoBranch = rebaseTargetBranch;\n\n if (!isRebaseOpen || !sourceBranch || !ontoBranch) {\n return;\n }\n\n let cancelled = false;\n setRebaseConflictStatus('checking');\n\n const checkRebaseConflicts = async () => {\n try {\n const result = await runGitAction({\n repoPath,\n action: 'check-rebase-conflicts',\n data: {\n sourceBranch,\n ontoBranch,\n },\n });\n\n if (!cancelled) {\n setRebaseConflictStatus(result.hasConflicts ? 'has-conflicts' : 'no-conflict');\n }\n } catch (e) {\n console.error(e);\n if (!cancelled) {\n // Be conservative when the check cannot be completed.\n setRebaseConflictStatus('has-conflicts');\n }\n }\n };\n\n void checkRebaseConflicts();\n\n return () => {\n cancelled = true;\n };\n }, [isRebaseOpen, rebaseSourceBranch, rebaseTargetBranch, repoPath, runGitAction]);\n\n const confirmMerge = ({ sourceBranch, targetBranch }: BranchOperation) => {\n setMergeTargetBranch(targetBranch);\n setMergeSourceBranch(sourceBranch);\n setMergeRebaseBeforeMerge(false);\n setMergeSquash(false);\n setMergeFastForward(false);\n setMergeSquashMessage('');\n setMergeConflictStatus('checking');\n setIsMergeOpen(true);\n }\n\n const handleMergeSquashToggle = useCallback((enabled: boolean) => {\n setMergeSquash(enabled);\n\n if (!enabled) {\n return;\n }\n\n if (!mergeSourceBranch) {\n setMergeSquashMessage('');\n return;\n }\n\n void (async () => {\n try {\n const result = await runGitAction({\n repoPath,\n action: 'get-latest-commit-message',\n data: { branch: mergeSourceBranch },\n });\n setMergeSquashMessage(typeof result?.message === 'string' ? result.message : '');\n } catch (e) {\n console.error(e);\n setMergeSquashMessage('');\n }\n })();\n }, [mergeSourceBranch, repoPath, runGitAction]);\n\n const handleMerge = async () => {\n if (!mergeTargetBranch || !mergeSourceBranch) return;\n setIsMerging(true);\n try {\n await runGitAction({\n repoPath,\n action: 'checkout',\n data: { branch: mergeTargetBranch }\n });\n\n await runGitAction({\n repoPath,\n action: 'merge',\n data: {\n targetBranch: mergeSourceBranch,\n rebaseBeforeMerge: mergeRebaseBeforeMerge,\n squash: mergeSquash,\n fastForward: mergeFastForward,\n squashMessage: mergeSquash ? mergeSquashMessage : undefined,\n }\n });\n closeMergeDialog();\n } catch (e) {\n if (isMergeOrRebaseConflictError(e)) {\n closeMergeDialog();\n toast({\n type: 'warning',\n title: 'Merge Conflict Detected',\n description: 'Merge conflict detected in the background. Please resolve via CLI since the conflicts tab has been removed.',\n duration: 12000,\n });\n }\n console.error(e);\n } finally {\n setIsMerging(false);\n }\n }\n\n useEffect(() => {\n const sourceBranch = mergeSourceBranch;\n const targetBranch = mergeTargetBranch;\n\n if (!isMergeOpen || !sourceBranch || !targetBranch) {\n return;\n }\n\n let cancelled = false;\n setMergeConflictStatus('checking');\n\n const checkMergeConflicts = async () => {\n try {\n const result = await runGitAction({\n repoPath,\n action: 'check-merge-conflicts',\n data: {\n sourceBranch,\n targetBranch,\n },\n });\n\n if (!cancelled) {\n setMergeConflictStatus(result.hasConflicts ? 'has-conflicts' : 'no-conflict');\n }\n } catch (e) {\n console.error(e);\n if (!cancelled) {\n // Be conservative when the check cannot be completed.\n setMergeConflictStatus('has-conflicts');\n }\n }\n };\n\n void checkMergeConflicts();\n\n return () => {\n cancelled = true;\n };\n }, [isMergeOpen, mergeSourceBranch, mergeTargetBranch, repoPath, runGitAction]);\n\n const confirmPushToRemote = async (branch: string) => {\n setPushBranch(branch);\n setPushError(null);\n setPushRemotes([]);\n setPushRemoteBranches([]);\n setPushSelectedRemote('');\n setPushSelectedRemoteBranch('');\n setPushTrackingBranch(null);\n setPushRebaseFirst(false);\n setPushForcePush(false);\n setPushLocalOnlyTags(true);\n setPushSquash(false);\n setPushSquashMessage('');\n setIsPushOpen(true);\n\n // Load remotes\n setPushLoadingRemotes(true);\n try {\n const result = await runGitAction({\n repoPath,\n action: 'get-remotes',\n data: {}\n });\n\n if (!result.remotes || result.remotes.length === 0) {\n setPushError('No remote repository configured. Please add a remote first.');\n setPushLoadingRemotes(false);\n return;\n }\n\n setPushRemotes(result.remotes);\n\n // Get tracking branch info\n const trackingResult = await runGitAction({\n repoPath,\n action: 'get-tracking-branch',\n data: { branch }\n });\n\n setPushTrackingBranch(trackingResult.tracking);\n\n // Set default remote - use tracking remote if available and exists in remotes list, otherwise first remote\n const trackingRemote = trackingResult.tracking?.remote;\n const defaultRemote = (trackingRemote && result.remotes.includes(trackingRemote))\n ? trackingRemote\n : result.remotes[0];\n setPushSelectedRemote(defaultRemote);\n\n // Load branches for the default remote\n setPushLoadingBranches(true);\n const branchesResult = await runGitAction({\n repoPath,\n action: 'get-remote-branches',\n data: { remote: defaultRemote }\n });\n\n setPushRemoteBranches(branchesResult.branches || []);\n\n // Set default remote branch - use tracking branch if on same remote, otherwise use branch name\n if (trackingResult.tracking?.remote === defaultRemote && trackingResult.tracking?.branch) {\n setPushSelectedRemoteBranch(trackingResult.tracking.branch);\n } else {\n // Default to same name as local branch, or first branch if local branch name doesn't exist\n const localBranchName = branch;\n if (branchesResult.branches?.includes(localBranchName)) {\n setPushSelectedRemoteBranch(localBranchName);\n } else {\n // Will create new branch with local branch name\n setPushSelectedRemoteBranch(localBranchName);\n }\n }\n } catch (e) {\n console.error(e);\n setPushError((e as Error).message || 'Failed to load remote information');\n } finally {\n setPushLoadingRemotes(false);\n setPushLoadingBranches(false);\n }\n }\n\n const handlePushRemoteChange = async (remote: string) => {\n setPushSelectedRemote(remote);\n setPushLoadingBranches(true);\n setPushRemoteBranches([]);\n\n try {\n const branchesResult = await runGitAction({\n repoPath,\n action: 'get-remote-branches',\n data: { remote }\n });\n\n setPushRemoteBranches(branchesResult.branches || []);\n\n // Set default branch - tracking branch if on this remote, otherwise local branch name\n if (pushTrackingBranch?.remote === remote && pushTrackingBranch?.branch) {\n setPushSelectedRemoteBranch(pushTrackingBranch.branch);\n } else {\n setPushSelectedRemoteBranch(pushBranch || '');\n }\n } catch (e) {\n console.error(e);\n setPushError((e as Error).message || 'Failed to load remote branches');\n } finally {\n setPushLoadingBranches(false);\n }\n }\n\n const handlePushSquashToggle = useCallback((enabled: boolean) => {\n setPushSquash(enabled);\n\n if (!enabled) {\n return;\n }\n\n if (!pushBranch) {\n setPushSquashMessage('');\n return;\n }\n\n void (async () => {\n try {\n const result = await runGitAction({\n repoPath,\n action: 'get-latest-commit-message',\n data: { branch: pushBranch },\n });\n setPushSquashMessage(typeof result?.message === 'string' ? result.message : '');\n } catch (e) {\n console.error(e);\n setPushSquashMessage('');\n }\n })();\n }, [pushBranch, repoPath, runGitAction]);\n\n const handlePushToRemote = async () => {\n if (!pushBranch || !pushSelectedRemote || !pushSelectedRemoteBranch) return;\n\n setIsPushing(true);\n setPushError(null);\n\n try {\n // Determine if we need to set upstream\n const isNewBranch = !pushRemoteBranches.includes(pushSelectedRemoteBranch);\n const needsSetUpstream = isNewBranch ||\n pushTrackingBranch?.remote !== pushSelectedRemote ||\n pushTrackingBranch?.branch !== pushSelectedRemoteBranch;\n\n await runGitAction({\n repoPath,\n action: 'push-to-remote',\n data: {\n localBranch: pushBranch,\n remote: pushSelectedRemote,\n remoteBranch: pushSelectedRemoteBranch,\n rebaseFirst: pushForcePush ? false : pushRebaseFirst,\n forcePush: pushForcePush,\n pushLocalOnlyTags,\n setUpstream: needsSetUpstream,\n squash: pushSquash,\n squashMessage: pushSquashMessage,\n }\n });\n\n // Fetch from the remote we just pushed to\n await runGitAction({\n repoPath,\n action: 'fetch',\n data: { remote: pushSelectedRemote }\n });\n\n setIsPushOpen(false);\n setPushBranch(null);\n } catch (e) {\n console.error(e);\n setPushError((e as Error).message || 'Failed to push to remote');\n } finally {\n setIsPushing(false);\n }\n }\n\n const confirmPullFromRemote = async (branch: string) => {\n setPullBranch(branch);\n setPullError(null);\n setPullRemotes([]);\n setPullRemoteBranches([]);\n setPullSelectedRemote('');\n setPullSelectedRemoteBranch('');\n setPullTrackingBranch(null);\n setPullRebase(true);\n setIsPullOpen(true);\n\n // Load remotes\n setPullLoadingRemotes(true);\n try {\n const result = await runGitAction({\n repoPath,\n action: 'get-remotes',\n data: {}\n });\n\n if (!result.remotes || result.remotes.length === 0) {\n setPullError('No remote repository configured. Please add a remote first.');\n setPullLoadingRemotes(false);\n return;\n }\n\n setPullRemotes(result.remotes);\n\n // Get tracking branch info\n const trackingResult = await runGitAction({\n repoPath,\n action: 'get-tracking-branch',\n data: { branch }\n });\n\n setPullTrackingBranch(trackingResult.tracking);\n\n // Set default remote - use tracking remote if available and exists in remotes list, otherwise first remote\n const trackingRemote = trackingResult.tracking?.remote;\n const defaultRemote = (trackingRemote && result.remotes.includes(trackingRemote))\n ? trackingRemote\n : result.remotes[0];\n setPullSelectedRemote(defaultRemote);\n\n // Load branches for the default remote\n setPullLoadingBranches(true);\n const branchesResult = await runGitAction({\n repoPath,\n action: 'get-remote-branches',\n data: { remote: defaultRemote }\n });\n\n setPullRemoteBranches(branchesResult.branches || []);\n\n // Set default remote branch - use tracking branch if on same remote\n if (trackingResult.tracking?.remote === defaultRemote && trackingResult.tracking?.branch) {\n setPullSelectedRemoteBranch(trackingResult.tracking.branch);\n } else {\n // No tracking branch on this remote - leave empty to show error\n setPullSelectedRemoteBranch('');\n }\n } catch (e) {\n console.error(e);\n setPullError((e as Error).message || 'Failed to load remote information');\n } finally {\n setPullLoadingRemotes(false);\n setPullLoadingBranches(false);\n }\n }\n\n const handlePullRemoteChange = async (remote: string) => {\n setPullSelectedRemote(remote);\n setPullLoadingBranches(true);\n setPullRemoteBranches([]);\n setPullSelectedRemoteBranch('');\n\n try {\n const branchesResult = await runGitAction({\n repoPath,\n action: 'get-remote-branches',\n data: { remote }\n });\n\n setPullRemoteBranches(branchesResult.branches || []);\n\n // Set default branch - tracking branch if on this remote\n if (pullTrackingBranch?.remote === remote && pullTrackingBranch?.branch) {\n setPullSelectedRemoteBranch(pullTrackingBranch.branch);\n } else {\n // No tracking branch on this remote - leave empty\n setPullSelectedRemoteBranch('');\n }\n } catch (e) {\n console.error(e);\n setPullError((e as Error).message || 'Failed to load remote branches');\n } finally {\n setPullLoadingBranches(false);\n }\n }\n\n const handlePullFromRemote = async () => {\n if (!pullBranch || !pullSelectedRemote || !pullSelectedRemoteBranch) return;\n\n setIsPulling(true);\n setPullError(null);\n\n try {\n await runGitAction({\n repoPath,\n action: 'pull-from-remote',\n data: {\n localBranch: pullBranch,\n remote: pullSelectedRemote,\n remoteBranch: pullSelectedRemoteBranch,\n rebase: pullRebase,\n }\n });\n\n setIsPullOpen(false);\n setPullBranch(null);\n } catch (e) {\n console.error(e);\n setPullError((e as Error).message || 'Failed to pull from remote');\n } finally {\n setIsPulling(false);\n }\n }\n\n const confirmCheckoutToLocal = (remoteBranch: string) => {\n setCheckoutRemoteBranch(remoteBranch);\n // Extract the branch name from remotes/origin/branch-name\n const parts = remoteBranch.split('/');\n // Skip 'remotes' and remote name (e.g., 'origin'), take the rest as branch name\n const branchName = parts.slice(2).join('/');\n setCheckoutLocalBranchName(branchName);\n setIsCheckoutToLocalOpen(true);\n }\n\n const handleCheckoutToLocal = async () => {\n if (!checkoutRemoteBranch || !checkoutLocalBranchName) return;\n setIsCheckingOutToLocal(true);\n try {\n await runGitAction({\n repoPath,\n action: 'checkout-to-local',\n data: { remoteBranch: checkoutRemoteBranch, localBranch: checkoutLocalBranchName }\n });\n setIsCheckoutToLocalOpen(false);\n setCheckoutRemoteBranch(null);\n setCheckoutLocalBranchName('');\n } catch (e) {\n console.error(e);\n } finally {\n setIsCheckingOutToLocal(false);\n }\n }\n\n const handleFetchFromAllRemotes = async () => {\n setIsFetchingAllRemotes(true);\n try {\n await runGitAction({\n repoPath,\n action: 'fetch',\n data: { allRemotes: true }\n });\n } catch (e) {\n console.error(e);\n } finally {\n setIsFetchingAllRemotes(false);\n }\n }\n\n const handleOpenRepoFolder = useCallback(async () => {\n if (isOpeningRepoFolder) return;\n\n setIsOpeningRepoFolder(true);\n try {\n const response = await fetch('/api/fs/open', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: repoPath }),\n });\n const result = await response.json().catch(() => ({}));\n\n if (!response.ok) {\n throw new Error(result.error || 'Failed to open repository folder');\n }\n } catch (error) {\n toast({\n type: 'error',\n title: 'Failed to Open Repo Folder',\n description: error instanceof Error ? error.message : 'Unknown error',\n });\n } finally {\n setIsOpeningRepoFolder(false);\n }\n }, [isOpeningRepoFolder, repoPath]);\n\n const handleOpenRepoTerminal = useCallback(async () => {\n if (isOpeningRepoTerminal) return;\n\n setIsOpeningRepoTerminal(true);\n try {\n const response = await fetch('/api/fs/open-terminal', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: repoPath }),\n });\n const result = await response.json().catch(() => ({}));\n\n if (!response.ok) {\n throw new Error(result.error || 'Failed to open terminal');\n }\n } catch (error) {\n toast({\n type: 'error',\n title: 'Failed to Open Terminal',\n description: error instanceof Error ? error.message : 'Unknown error',\n });\n } finally {\n setIsOpeningRepoTerminal(false);\n }\n }, [isOpeningRepoTerminal, repoPath]);\n\n const handleOpenWorktreeInNewTab = useCallback((worktreePath: string, isCurrentWorktree: boolean) => {\n if (isCurrentWorktree) return;\n\n let origin = window.location.origin;\n try {\n if (window.top?.location?.origin) {\n origin = window.top.location.origin;\n }\n } catch {\n // Ignore cross-origin access errors and keep current window origin.\n }\n\n const targetUrl = `${origin}/git?path=${encodeURIComponent(worktreePath)}`;\n window.open(targetUrl, '_blank', 'noopener,noreferrer');\n }, []);\n\n const handleOpenSession = useCallback((sessionName: string) => {\n router.push(`/session/${encodeURIComponent(sessionName)}`);\n }, [router]);\n\n const handleFetchFromRemote = async (remote: string) => {\n try {\n await runGitAction({\n repoPath,\n action: 'fetch',\n data: { remote }\n });\n } catch (e) {\n console.error(e);\n }\n }\n\n const handleCheckout = async (branchName: string) => {\n\n try {\n await runGitAction({\n repoPath,\n action: 'checkout',\n data: { branch: branchName }\n });\n } catch (e) {\n console.error(e);\n }\n };\n\n const handleResetToCommit = async (commitHash: string) => {\n setResetCommitHash(commitHash);\n setIsResetOpen(true);\n };\n\n const handleConfirmReset = async () => {\n if (!resetCommitHash) return;\n setIsResetting(true);\n try {\n await runGitAction({\n repoPath,\n action: 'reset',\n data: { commitHash: resetCommitHash, mode: 'hard' }\n });\n setIsResetOpen(false);\n setResetCommitHash(null);\n } catch (e) {\n console.error(e);\n } finally {\n setIsResetting(false);\n }\n };\n\n const confirmRevertCommit = (commitHash: string, commitMessage: string) => {\n setCommitToRevert({ hash: commitHash, message: commitMessage });\n setIsRevertOpen(true);\n };\n\n const handleConfirmRevert = async () => {\n if (!commitToRevert) return;\n setIsReverting(true);\n try {\n await runGitAction({\n repoPath,\n action: 'revert',\n data: { commitHash: commitToRevert.hash }\n });\n setIsRevertOpen(false);\n setCommitToRevert(null);\n } catch (e) {\n console.error(e);\n } finally {\n setIsReverting(false);\n }\n };\n\n const confirmRewordCommit = (hash: string, subject: string, body: string, branch: string) => {\n setCommitToReword({ hash, subject, body, branch });\n setNewMessageSubject(subject);\n setNewMessageBody(body);\n setIsRewordOpen(true);\n };\n\n const handleReword = async () => {\n if (!commitToReword || !newMessageSubject.trim()) return;\n setIsRewording(true);\n try {\n await runGitAction({\n repoPath,\n action: 'reword',\n data: {\n commitHash: commitToReword.hash,\n message: buildCommitMessage(newMessageSubject, newMessageBody),\n branch: commitToReword.branch,\n }\n });\n closeRewordDialog();\n } catch (e) {\n console.error(e);\n } finally {\n setIsRewording(false);\n }\n };\n\n const confirmCherryPickCommit = (commitHash: string, commitMessage: string) => {\n setCommitsToCherryPick([{ hash: commitHash, message: commitMessage }]);\n setIsCherryPickOpen(true);\n };\n\n const confirmCherryPickSelectedCommits = () => {\n if (selectedCommitsForCherryPick.length < 2) return;\n setCommitsToCherryPick(selectedCommitsForCherryPick.map((commit) => ({\n hash: commit.hash,\n message: commit.message,\n })));\n setIsCherryPickOpen(true);\n };\n\n const isCherryPickAlreadyInProgressError = (error: unknown) => {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n return message.includes('cherry-pick') && message.includes('already in progress');\n };\n\n const isCherryPickConflictError = (error: unknown) => {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n return (\n message.includes('could not apply') ||\n message.includes('conflict') ||\n message.includes('cherry-pick --continue')\n );\n };\n\n const runCherryPickByHashes = useCallback(async (commitHashes: string[]) => {\n if (commitHashes.length === 1) {\n await runGitAction({\n repoPath,\n action: 'cherry-pick',\n data: { commitHash: commitHashes[0] }\n });\n return;\n }\n\n await runGitAction({\n repoPath,\n action: 'cherry-pick-multiple',\n data: { commitHashes }\n });\n }, [repoPath, runGitAction]);\n\n const abortCherryPickAndResetUi = useCallback(async () => {\n try {\n await runGitAction({\n repoPath,\n action: 'cherry-pick-abort',\n });\n } catch (abortError) {\n console.error(abortError);\n } finally {\n setIsCherryPickOpen(false);\n setIsAbortCherryPickOpen(false);\n setCommitsToCherryPick([]);\n }\n }, [repoPath, runGitAction]);\n\n const handleCherryPickCommit = async () => {\n if (commitsToCherryPick.length === 0) return;\n setIsCherryPicking(true);\n try {\n const commitHashes = commitsToCherryPick.map((commit) => commit.hash);\n await runCherryPickByHashes(commitHashes);\n setIsCherryPickOpen(false);\n setCommitsToCherryPick([]);\n } catch (e) {\n if (isCherryPickAlreadyInProgressError(e)) {\n setIsCherryPickOpen(false);\n setIsAbortCherryPickOpen(true);\n } else if (isCherryPickConflictError(e)) {\n await abortCherryPickAndResetUi();\n }\n console.error(e);\n } finally {\n setIsCherryPicking(false);\n }\n };\n\n const handleAbortCherryPick = async () => {\n if (commitsToCherryPick.length === 0) {\n setIsAbortCherryPickOpen(false);\n return;\n }\n\n setIsAbortingCherryPick(true);\n try {\n await runGitAction({\n repoPath,\n action: 'cherry-pick-abort',\n });\n\n const commitHashes = commitsToCherryPick.map((commit) => commit.hash);\n await runCherryPickByHashes(commitHashes);\n\n setIsAbortCherryPickOpen(false);\n setCommitsToCherryPick([]);\n } catch (e) {\n if (isCherryPickAlreadyInProgressError(e)) {\n setIsAbortCherryPickOpen(true);\n } else if (isCherryPickConflictError(e)) {\n await abortCherryPickAndResetUi();\n }\n console.error(e);\n } finally {\n setIsAbortingCherryPick(false);\n }\n };\n\n const handleCreateBranch = async () => {\n if (!newBranchName) return;\n setIsCreating(true);\n try {\n await runGitAction({\n repoPath,\n action: 'branch',\n data: { branch: newBranchName, fromRef: createBranchFromRef || undefined }\n });\n setIsCreateBranchOpen(false);\n setNewBranchName('');\n setCreateBranchFromRef(null);\n } catch (e) {\n console.error(e);\n // alert or toast error\n } finally {\n setIsCreating(false);\n }\n };\n\n const confirmCreateBranch = (sourceBranch?: string) => {\n setCreateBranchFromRef(sourceBranch || null);\n setIsCreateBranchOpen(true);\n };\n\n const confirmCreateTag = (commitHash: string) => {\n setCreateTagCommitHash(commitHash);\n setNewTagName('');\n setPushTagToRemote(false);\n setIsCreateTagOpen(true);\n };\n\n const handleCreateTag = async () => {\n if (!createTagCommitHash || !newTagName.trim()) return;\n setIsCreatingTag(true);\n try {\n await runGitAction({\n repoPath,\n action: 'create-tag',\n data: {\n tagName: newTagName.trim(),\n commitHash: createTagCommitHash,\n pushToRemote: pushTagToRemote,\n }\n });\n setIsCreateTagOpen(false);\n setCreateTagCommitHash(null);\n setNewTagName('');\n setPushTagToRemote(false);\n } catch (e) {\n console.error(e);\n } finally {\n setIsCreatingTag(false);\n }\n };\n\n const currentBranch = branchData?.current;\n const trackingInfoByBranch = branchData?.trackingInfo;\n const remoteNames = useMemo(() => {\n const names = Object.keys(branchData?.remoteUrls ?? {});\n return names.sort((a, b) => {\n if (a === 'origin') return -1;\n if (b === 'origin') return 1;\n return a.localeCompare(b);\n });\n }, [branchData?.remoteUrls]);\n const remoteNameForTagDelete = remoteNames[0] || null;\n const selectedTrackingUpstreams = useMemo(() => {\n const upstreams: string[] = [];\n for (const branchRef of branchesToDelete) {\n if (branchRef.startsWith('remotes/')) continue;\n const upstream = trackingInfoByBranch?.[branchRef]?.upstream;\n if (upstream) upstreams.push(upstream);\n }\n return Array.from(new Set(upstreams));\n }, [branchesToDelete, trackingInfoByBranch]);\n const trackingInfoForRename = useMemo(() => {\n if (!branchToRename || remoteBranchToRename) return null;\n return trackingInfoByBranch?.[branchToRename] ?? null;\n }, [branchToRename, remoteBranchToRename, trackingInfoByBranch]);\n const localChangesCount = statusData?.files?.length;\n const currentBranchName = currentBranch || (isBranchesLoading ? 'Loading branches...' : 'Detached HEAD');\n const currentBranchLabel = currentBranch && typeof localChangesCount === 'number' && localChangesCount > 0\n ? `${currentBranch} (${localChangesCount})`\n : currentBranchName;\n const currentTrackingBranch = useMemo(() => {\n if (!currentBranch) return null;\n const tracking = trackingInfoByBranch?.[currentBranch];\n if (!tracking?.upstream) return null;\n const parsed = parseTrackingUpstream(tracking.upstream);\n if (!parsed) return null;\n\n return { upstream: tracking.upstream, ...parsed };\n }, [currentBranch, trackingInfoByBranch]);\n const pullAllTargets = useMemo(() => {\n const targets: Array<{ localBranch: string; remote: string; remoteBranch: string }> = [];\n for (const localBranch of branchData?.branches ?? []) {\n const upstream = trackingInfoByBranch?.[localBranch]?.upstream;\n if (!upstream) continue;\n const parsed = parseTrackingUpstream(upstream);\n if (!parsed) continue;\n targets.push({\n localBranch,\n remote: parsed.remote,\n remoteBranch: parsed.branch,\n });\n }\n return targets;\n }, [branchData?.branches, trackingInfoByBranch]);\n const pullActionDisabledReason = useMemo(() => {\n if (isBranchesLoading) return 'Loading branches...';\n if (!currentBranch) return 'Not on a local branch';\n if (!currentTrackingBranch) return `Branch \"${currentBranch}\" has no tracking remote branch`;\n return null;\n }, [currentBranch, currentTrackingBranch, isBranchesLoading]);\n const pullAllActionDisabledReason = useMemo(() => {\n if (isBranchesLoading) return 'Loading branches...';\n if (pullAllTargets.length === 0) return 'No local branches with tracking remote branches';\n return null;\n }, [isBranchesLoading, pullAllTargets.length]);\n const pushActionDisabledReason = useMemo(() => {\n if (isBranchesLoading) return 'Loading branches...';\n if (!currentBranch) return 'Not on a local branch';\n return null;\n }, [currentBranch, isBranchesLoading]);\n\n const confirmPullCurrentBranch = () => {\n if (!currentBranch || pullActionDisabledReason) return;\n void confirmPullFromRemote(currentBranch);\n };\n\n const confirmPushCurrentBranch = () => {\n if (!currentBranch || pushActionDisabledReason) return;\n void confirmPushToRemote(currentBranch);\n };\n\n const handlePullAllBranches = async () => {\n if (isPullingAllBranches || pullAllTargets.length === 0) return;\n\n setIsPullingAllBranches(true);\n const pulledBranches: string[] = [];\n\n try {\n for (const target of pullAllTargets) {\n try {\n await runGitAction({\n repoPath,\n action: 'pull-from-remote',\n data: {\n localBranch: target.localBranch,\n remote: target.remote,\n remoteBranch: target.remoteBranch,\n rebase: true,\n },\n suppressErrorToast: true,\n });\n pulledBranches.push(target.localBranch);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n const pulledSummary = pulledBranches.length > 0\n ? `Pulled ${pulledBranches.length} branch${pulledBranches.length === 1 ? '' : 'es'} before failure.`\n : 'No branches were updated.';\n\n toast({\n type: 'error',\n title: `Pull All Failed on \"${target.localBranch}\"`,\n description: `${errorMessage} ${pulledSummary}`,\n duration: 12000,\n });\n return;\n }\n }\n\n toast({\n type: 'success',\n title: pulledBranches.length === 1 ? 'Pulled 1 Branch' : `Pulled ${pulledBranches.length} Branches`,\n description: 'Updated all local branches that have tracking remote branches.',\n });\n } finally {\n setIsPullingAllBranches(false);\n }\n };\n\n const getBranchContextMenuItems = (options: BranchMenuOptions): ContextMenuItem[] => {\n const menuItems = buildBranchContextMenuItems(options, {\n onCheckout: handleCheckout,\n onCheckoutToLocal: confirmCheckoutToLocal,\n onCreateBranch: confirmCreateBranch,\n onDeleteBranch: confirmDeleteBranch,\n onDeleteBranches: confirmDeleteBranches,\n onRenameBranch: confirmRenameBranch,\n onRenameRemoteBranch: confirmRenameRemoteBranch,\n onRebase: confirmRebase,\n onMerge: confirmMerge,\n onPushToRemote: confirmPushToRemote,\n onPullFromRemote: confirmPullFromRemote,\n });\n const associatedSession = options.isRemote ? null : sessionByBranchName.get(options.branchRef) ?? null;\n\n if (associatedSession) {\n menuItems.push({\n label: 'Open Session',\n icon: <i className=\"iconoir-arrow-right text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => handleOpenSession(associatedSession.sessionName),\n });\n }\n\n if (customBranchScripts.length > 0) {\n menuItems.push({\n label: 'Custom scripts',\n icon: <i className=\"iconoir-terminal text-[14px]\" aria-hidden=\"true\" />,\n children: customBranchScripts.map((script) => ({\n label: script.name,\n icon: <i className=\"iconoir-play text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => {\n void handleRunCustomScript(script, options.branchRef);\n },\n })),\n });\n }\n\n return menuItems;\n };\n\n const localBranchSet = useMemo(() => {\n return new Set(branchData?.branches ?? []);\n }, [branchData?.branches]);\n\n const remoteBranchMap = useMemo(() => {\n const map = new Map<string, string>();\n if (!branchData?.remotes) return map;\n\n for (const [remoteName, branches] of Object.entries(branchData.remotes)) {\n for (const branch of branches) {\n map.set(`${remoteName}/${branch}`, `remotes/${remoteName}/${branch}`);\n }\n }\n\n return map;\n }, [branchData?.remotes]);\n\n const getBranchTagContextMenuItems = (displayRef: string): ContextMenuItem[] | null => {\n if (displayRef.startsWith('tag:')) {\n const tagName = displayRef.replace(/^tag:\\s*/, '').trim();\n if (!tagName) return null;\n return [\n {\n label: 'Delete Tag',\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => confirmDeleteTag(tagName),\n danger: true,\n },\n ];\n }\n\n if (localBranchSet.has(displayRef)) {\n return getBranchContextMenuItems({\n branchRef: displayRef,\n branchLeafName: displayRef.split('/').pop() || displayRef,\n currentBranch,\n isRemote: false,\n });\n }\n\n const remoteBranchRef = remoteBranchMap.get(displayRef);\n if (!remoteBranchRef) return null;\n\n return getBranchContextMenuItems({\n branchRef: remoteBranchRef,\n branchLeafName: remoteBranchRef.split('/').pop() || displayRef,\n currentBranch,\n isRemote: true,\n });\n };\n const localGroupBranchRefs = useMemo(() => {\n if (!localBranchTree) return [];\n return collectAllBranchRefs(localBranchTree).filter((branchRef) => branchRef !== currentBranch);\n }, [localBranchTree, currentBranch]);\n const worktrees = branchData?.worktrees ?? [];\n\n const branchTreePopoverContent = (\n <div className=\"w-[22rem] max-w-[calc(100vw-2rem)] flex flex-col border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 rounded-box shadow-xl overflow-hidden\">\n <div className=\"px-4 border-b border-gray-200 dark:border-gray-800 flex items-center justify-between bg-white dark:bg-gray-900 h-[57px] shrink-0\">\n <h3 className=\"font-semibold flex items-center gap-2\">Branches</h3>\n <div className=\"flex items-center gap-1\">\n {hasVisibilityFilters && (\n <div className=\"tooltip tooltip-left z-20\" data-tip=\"Clear filters\">\n <button\n className=\"btn btn-ghost btn-xs btn-square\"\n onClick={handleClearAllFilters}\n >\n <i className=\"iconoir-filter text-[16px]\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n <div className=\"tooltip tooltip-left z-20\" data-tip=\"Create Branch\">\n <button className=\"btn btn-ghost btn-xs btn-square\" onClick={() => confirmCreateBranch()}>\n <i className=\"iconoir-plus-circle text-[16px]\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n </div>\n <div className=\"max-h-[70vh] overflow-auto\">\n <div className=\"p-2 space-y-0.5\">\n {localBranchTree && (\n <>\n <ContextMenu\n items={[\n {\n label: 'Delete',\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => confirmDeleteBranches(localGroupBranchRefs),\n danger: true,\n disabled: localGroupBranchRefs.length === 0,\n },\n ]}\n >\n <GroupHeader\n name=\"Branches\"\n groupPath=\"__local__\"\n icon={<i className=\"iconoir-git-branch text-[14px]\" aria-hidden=\"true\" />}\n isExpanded={localGroupExpanded}\n onToggle={handleToggleLocalGroup}\n visibilityMap={visibilityMap}\n onToggleVisibility={handleToggleVisibility}\n />\n </ContextMenu>\n {localGroupExpanded && (\n <BranchTreeItem\n node={localBranchTree}\n currentBranch={branchData?.current}\n expandedFolders={expandedFolders}\n onToggleFolder={toggleFolder}\n onCheckout={handleCheckout}\n onCheckoutToLocal={confirmCheckoutToLocal}\n onCreateBranch={() => confirmCreateBranch()}\n onDeleteBranch={confirmDeleteBranch}\n onRenameBranch={confirmRenameBranch}\n onRenameRemoteBranch={confirmRenameRemoteBranch}\n onRebase={confirmRebase}\n onMerge={confirmMerge}\n onPushToRemote={confirmPushToRemote}\n onPullFromRemote={confirmPullFromRemote}\n getBranchContextMenuItems={getBranchContextMenuItems}\n onBranchClick={handleBranchClick}\n onBranchContextMenu={handleBranchContextMenu}\n onDeleteBranchGroup={confirmDeleteBranches}\n selectedBranches={selectedBranchSet}\n visibilityMap={visibilityMap}\n onToggleVisibility={handleToggleVisibility}\n depth={1}\n groupPath=\"__local__\"\n trackingInfo={branchData?.trackingInfo}\n />\n )}\n </>\n )}\n\n <>\n <ContextMenu\n items={[\n {\n label: 'Fetch from all remotes',\n icon: <i className=\"iconoir-refresh-circle text-[14px]\" aria-hidden=\"true\" />,\n onClick: handleFetchFromAllRemotes,\n },\n {\n label: 'Add remote',\n icon: <i className=\"iconoir-plus-circle text-[14px]\" aria-hidden=\"true\" />,\n onClick: confirmAddRemote,\n },\n ]}\n >\n <GroupHeader\n name=\"Remotes\"\n groupPath=\"__remotes__\"\n icon={<i className=\"iconoir-globe text-[14px]\" aria-hidden=\"true\" />}\n isExpanded={remotesGroupExpanded}\n onToggle={handleToggleRemotesGroup}\n visibilityMap={visibilityMap}\n onToggleVisibility={handleToggleVisibility}\n />\n </ContextMenu>\n {remotesGroupExpanded && isBranchesLoading && !remoteBranchTrees && (\n <div className=\"flex items-center gap-2 px-2 py-2 text-sm opacity-70\" style={{ paddingLeft: '20px' }}>\n <span className=\"loading loading-spinner loading-xs\"></span>\n <span>Loading remotes...</span>\n </div>\n )}\n {remotesGroupExpanded && remoteBranchTrees && Array.from(remoteBranchTrees.entries()).map(([remoteName, tree]) => {\n const remoteGroupPath = `__remotes__/${remoteName}`;\n const isRemoteExpanded = expandedFolders.has(remoteGroupPath);\n\n return (\n <div key={remoteName}>\n <ContextMenu\n items={[\n {\n label: `Fetch from ${remoteName}`,\n icon: <i className=\"iconoir-refresh-circle text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => handleFetchFromRemote(remoteName),\n },\n {\n label: 'Rename',\n icon: <i className=\"iconoir-edit-pencil text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => confirmRenameRemote(remoteName),\n },\n {\n label: 'Delete',\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => confirmDeleteRemote(remoteName),\n danger: true,\n },\n ]}\n >\n <GroupHeader\n name={remoteName}\n groupPath={remoteGroupPath}\n icon={<i className=\"iconoir-globe text-[14px] opacity-50\" aria-hidden=\"true\" />}\n isExpanded={isRemoteExpanded}\n onToggle={() => toggleFolder(remoteGroupPath)}\n visibilityMap={visibilityMap}\n onToggleVisibility={handleToggleVisibility}\n depth={1}\n />\n </ContextMenu>\n {isRemoteExpanded && (\n <BranchTreeItem\n node={tree}\n currentBranch={branchData?.current}\n expandedFolders={expandedFolders}\n onToggleFolder={toggleFolder}\n onCheckout={handleCheckout}\n onCheckoutToLocal={confirmCheckoutToLocal}\n onCreateBranch={() => confirmCreateBranch()}\n onDeleteBranch={confirmDeleteBranch}\n onRenameBranch={confirmRenameBranch}\n onRenameRemoteBranch={confirmRenameRemoteBranch}\n onRebase={confirmRebase}\n onMerge={confirmMerge}\n onPushToRemote={confirmPushToRemote}\n onPullFromRemote={confirmPullFromRemote}\n getBranchContextMenuItems={getBranchContextMenuItems}\n onBranchClick={handleBranchClick}\n onBranchContextMenu={handleBranchContextMenu}\n onDeleteBranchGroup={confirmDeleteBranches}\n selectedBranches={selectedBranchSet}\n visibilityMap={visibilityMap}\n onToggleVisibility={handleToggleVisibility}\n depth={2}\n groupPath={remoteGroupPath}\n isRemote={true}\n trackingInfo={branchData?.trackingInfo}\n />\n )}\n </div>\n );\n })}\n </>\n\n <>\n <div\n className=\"group flex items-center gap-1 px-2 py-1.5 text-sm rounded-md cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors font-medium\"\n onClick={handleToggleWorktreesGroup}\n >\n <div className=\"flex items-center gap-1.5 flex-1 min-w-0\">\n <span className=\"text-xs opacity-70\">{worktreesGroupExpanded ? '▼' : '▶'}</span>\n <i className=\"iconoir-folder text-[14px]\" aria-hidden=\"true\" />\n <span className=\"truncate min-w-0 flex-1\">Worktrees</span>\n </div>\n <span className=\"text-xs opacity-60\">{worktrees.length}</span>\n </div>\n {worktreesGroupExpanded && isBranchesLoading && worktrees.length === 0 && (\n <div className=\"flex items-center gap-2 px-2 py-2 text-sm opacity-70\" style={{ paddingLeft: '20px' }}>\n <span className=\"loading loading-spinner loading-xs\"></span>\n <span>Loading worktrees...</span>\n </div>\n )}\n {worktreesGroupExpanded && !isBranchesLoading && worktrees.length === 0 && (\n <div className=\"px-2 py-2 text-sm opacity-70\" style={{ paddingLeft: '20px' }}>\n No worktrees found\n </div>\n )}\n {worktreesGroupExpanded && worktrees.map((worktree) => {\n const row = (\n <button\n type=\"button\"\n className={cn(\n \"group flex w-full items-center gap-2 px-2 py-1.5 text-sm rounded-md transition-colors text-left\",\n worktree.isCurrent ? \"cursor-default opacity-85\" : \"cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800\"\n )}\n style={{ paddingLeft: '20px' }}\n onClick={() => handleOpenWorktreeInNewTab(worktree.path, worktree.isCurrent)}\n title={worktree.path}\n disabled={worktree.isCurrent}\n >\n <i className={`iconoir-folder text-[14px] shrink-0 ${worktree.isCurrent ? 'text-primary' : 'opacity-60'}`} aria-hidden=\"true\" />\n <span className=\"truncate min-w-0 flex-1\">{worktree.path}</span>\n {worktree.branch && (\n <span className=\"shrink-0 text-xs opacity-60\">\n {worktree.branch}\n </span>\n )}\n {worktree.isCurrent && (\n <span className=\"shrink-0 text-xs text-primary font-medium\">\n current\n </span>\n )}\n </button>\n );\n\n if (worktree.isCurrent) {\n return <div key={worktree.path}>{row}</div>;\n }\n\n return (\n <ContextMenu\n key={worktree.path}\n items={[{\n label: 'Delete worktree',\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => confirmDeleteWorktree(worktree.path),\n danger: true,\n }]}\n >\n {row}\n </ContextMenu>\n );\n })}\n </>\n </div>\n </div>\n </div>\n );\n\n if (isLoading && limit === 100) {\n return <div className=\"flex items-center justify-center p-8 h-full\"><span className=\"loading loading-spinner text-base-content/50\"></span></div>;\n }\n\n if (isError) {\n return (\n <div className=\"flex items-center justify-center p-8 h-full flex-col gap-4\">\n <p className=\"text-error font-medium\">Error Loading History</p>\n <p className=\"text-sm opacity-70\">{(error as Error)?.message || 'An unknown error occurred'}</p>\n <button onClick={() => void refetchLog()} className=\"btn btn-outline btn-sm\">\n <i className=\"iconoir-refresh-circle text-[16px] mr-1\" aria-hidden=\"true\" />\n Try Again\n </button>\n </div>\n );\n }\n\n if (!log) return <div className=\"flex items-center justify-center p-8 h-full opacity-70\">No history data available</div>;\n\n const headerActionButtonClass =\n \"flex h-8 items-center gap-1.5 rounded-md border border-slate-200 bg-white px-3 text-sm font-medium text-slate-600 transition-colors hover:bg-slate-50 hover:text-slate-900 disabled:cursor-not-allowed disabled:opacity-50 max-[1199px]:w-8 max-[1199px]:justify-center max-[1199px]:px-0 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-300 dark:hover:bg-slate-800 dark:hover:text-slate-100\";\n const headerActionLabelClass = \"max-[1199px]:hidden\";\n const branchSelectButtonClass =\n \"flex h-8 max-w-[24rem] items-center gap-2 rounded-md border border-slate-200 bg-white px-3 text-sm font-mono font-medium text-slate-700 transition-colors hover:bg-slate-50 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-200 dark:hover:bg-slate-800\";\n\n return (\n <div className=\"flex h-full overflow-hidden\">\n {isResetOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Reset to Commit</h3>\n <p className=\"py-4 break-words\">\n Are you sure you want to hard reset branch <span className=\"font-bold break-all\">{branchData?.current || 'Detached HEAD'}</span> to commit <span className=\"font-mono bg-base-200 px-1 rounded\">{resetCommitHash?.substring(0, 7)}</span>?\n <br />\n <span className=\"text-error font-bold\">Warning: This will discard all local changes and commits after this point. This action cannot be undone.</span>\n </p>\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={() => setIsResetOpen(false)} disabled={isResetting}>Cancel</button>\n <button className=\"btn btn-error\" onClick={handleConfirmReset} disabled={isResetting}>\n {isResetting && <span className=\"loading loading-spinner loading-xs\"></span>}\n Reset\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={() => setIsResetOpen(false)}>close</button>\n </form>\n </dialog>\n )}\n\n {isRevertOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Revert Commit</h3>\n <p className=\"py-4 break-words\">\n Are you sure you want to revert commit <span className=\"font-mono bg-base-200 px-1 rounded\">{commitToRevert?.hash.substring(0, 7)}</span> on <span className=\"font-bold break-all\">{branchData?.current || 'current'}</span>?\n </p>\n {commitToRevert?.message && (\n <div className=\"rounded border border-base-300 bg-base-200/40 px-3 py-2 text-xs break-words\">\n {commitToRevert.message}\n </div>\n )}\n <div className=\"modal-action\">\n <button\n className=\"flex h-8 items-center gap-1.5 px-3 rounded-md text-sm font-medium text-gray-600 hover:bg-gray-100 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-100 transition-colors\"\n onClick={() => {\n setIsRevertOpen(false);\n setCommitToRevert(null);\n }}\n disabled={isReverting}\n >\n Cancel\n </button>\n <button className=\"btn btn-primary\" onClick={handleConfirmRevert} disabled={isReverting}>\n {isReverting && <span className=\"loading loading-spinner loading-xs\"></span>}\n Revert\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={() => {\n setIsRevertOpen(false);\n setCommitToRevert(null);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isRewordOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Reword Commit</h3>\n <p className=\"py-4 break-words\">\n Reword commit <span className=\"font-mono bg-base-200 px-1 rounded\">{commitToReword?.hash.substring(0, 7)}</span> on branch <span className=\"font-bold\">{commitToReword?.branch}</span>.\n </p>\n <input\n type=\"text\"\n className=\"input input-bordered w-full font-mono text-sm mb-3\"\n value={newMessageSubject}\n onChange={e => setNewMessageSubject(e.target.value)}\n autoFocus\n onKeyDown={e => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter' && newMessageSubject.trim() && !isRewording) {\n e.preventDefault();\n handleReword();\n }\n }}\n placeholder=\"Commit subject\"\n disabled={isRewording}\n />\n <textarea\n className=\"textarea textarea-bordered w-full h-32 font-mono text-sm\"\n value={newMessageBody}\n onChange={e => setNewMessageBody(e.target.value)}\n onKeyDown={e => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter' && newMessageSubject.trim() && !isRewording) {\n e.preventDefault();\n handleReword();\n }\n }}\n placeholder=\"Commit message body (optional)\"\n disabled={isRewording}\n />\n {commitToReword?.branch !== branchData?.current && (\n <div className=\"alert alert-warning text-xs mt-2 py-2\">\n <span>This will briefly checkout <b>{commitToReword?.branch}</b> to amend the commit.</span>\n </div>\n )}\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={closeRewordDialog} disabled={isRewording}>Cancel</button>\n <button className=\"btn btn-primary\" onClick={handleReword} disabled={!newMessageSubject.trim() || isRewording}>\n {isRewording && <span className=\"loading loading-spinner loading-xs\"></span>}\n Reword\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeRewordDialog}>close</button>\n </form>\n </dialog>\n )}\n\n {isDeleteOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">{branchesToDelete.length > 1 ? 'Delete Branches' : 'Delete Branch'}</h3>\n {branchesToDelete.length > 1 ? (\n <div className=\"py-4 space-y-3\">\n <p className=\"break-words\">\n Are you sure you want to delete <span className=\"font-bold\">{branchesToDelete.length} selected branches</span>?\n This action cannot be undone.\n </p>\n <div className=\"max-h-44 overflow-auto rounded border border-base-300 bg-base-200/40 p-2 space-y-1\">\n {branchesToDelete.map((branch) => (\n <div key={branch} className=\"text-xs min-w-0 break-all\">\n {branch.startsWith('remotes/') ? branch.slice('remotes/'.length) : branch}\n </div>\n ))}\n </div>\n </div>\n ) : (\n <p className=\"py-4 break-words\">\n Are you sure you want to delete the branch <span className=\"font-bold break-all\">{branchesToDelete[0]?.startsWith('remotes/') ? branchesToDelete[0].slice('remotes/'.length) : branchesToDelete[0]}</span>?\n This action cannot be undone.\n </p>\n )}\n {selectedTrackingUpstreams.length > 0 && (\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start items-start gap-2 min-w-0\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={deleteRemoteBranch} onChange={(e) => setDeleteRemoteBranch(e.target.checked)} disabled={isDeleting} />\n <span className=\"label-text break-words whitespace-normal\">\n {selectedTrackingUpstreams.length === 1 ? (\n <>\n Delete tracking remote branch <span className=\"font-mono opacity-70 break-all\">{selectedTrackingUpstreams[0]}</span>\n </>\n ) : (\n <>Delete {selectedTrackingUpstreams.length} tracking remote branches</>\n )}\n </span>\n </label>\n </div>\n )}\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={() => { setIsDeleteOpen(false); setBranchesToDelete([]); setDeleteRemoteBranch(false); }} disabled={isDeleting}>Cancel</button>\n <button className=\"btn btn-error\" onClick={handleDeleteBranch} disabled={isDeleting}>\n {isDeleting && <span className=\"loading loading-spinner loading-xs\"></span>}\n Delete\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={() => { setIsDeleteOpen(false); setBranchesToDelete([]); setDeleteRemoteBranch(false); }}>close</button>\n </form>\n </dialog>\n )}\n\n {isDeleteWorktreeOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Delete Worktree</h3>\n <p className=\"py-4 break-words\">\n Are you sure you want to delete the worktree <span className=\"font-bold break-all\">{worktreeToDelete}</span>?\n </p>\n <p className=\"text-sm text-error break-words\">\n This will remove the worktree from git and remove its working directory.\n </p>\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={() => {\n setIsDeleteWorktreeOpen(false);\n setWorktreeToDelete(null);\n }}\n disabled={isDeletingWorktree}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-error\"\n onClick={() => void handleDeleteWorktree()}\n disabled={isDeletingWorktree || !worktreeToDelete}\n >\n {isDeletingWorktree && <span className=\"loading loading-spinner loading-xs\"></span>}\n Delete\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={() => {\n setIsDeleteWorktreeOpen(false);\n setWorktreeToDelete(null);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isDeleteTagOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Delete Tag</h3>\n <p className=\"py-4 break-words\">\n Are you sure you want to delete the tag <span className=\"font-bold break-all\">{tagToDelete}</span>?\n This action cannot be undone.\n </p>\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start items-start gap-2 min-w-0\">\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-sm\"\n checked={deleteRemoteTag}\n onChange={(e) => setDeleteRemoteTag(e.target.checked)}\n disabled={isDeletingTag || !remoteNameForTagDelete}\n />\n <span className=\"label-text break-words whitespace-normal\">\n {remoteNameForTagDelete ? (\n <>\n Also delete from remote <span className=\"font-mono opacity-70\">{remoteNameForTagDelete}</span>\n </>\n ) : (\n 'No remote configured'\n )}\n </span>\n </label>\n </div>\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={closeDeleteTagDialog} disabled={isDeletingTag}>Cancel</button>\n <button className=\"btn btn-error\" onClick={handleDeleteTag} disabled={isDeletingTag || !tagToDelete}>\n {isDeletingTag && <span className=\"loading loading-spinner loading-xs\"></span>}\n Delete\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeDeleteTagDialog}>close</button>\n </form>\n </dialog>\n )}\n\n {isCherryPickOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Cherry Pick</h3>\n <p className=\"text-sm opacity-70 mt-1\">\n {commitsToCherryPick.length > 1\n ? 'Apply selected commits from oldest to newest'\n : 'Apply changes from the selected commit'}\n </p>\n {commitsToCherryPick.length === 1 ? (\n <p className=\"py-4 break-words\">\n Are you sure to apply <span className=\"font-bold font-mono break-all\">{commitsToCherryPick[0]?.hash}</span> <span className=\"font-bold break-words\">{commitsToCherryPick[0]?.message}</span> to <span className=\"font-bold break-all\">{branchData?.current || 'current'}</span> branch?\n </p>\n ) : (\n <div className=\"py-4 space-y-3\">\n <p className=\"break-words\">\n Are you sure to apply <span className=\"font-bold\">{commitsToCherryPick.length} selected commits</span> to <span className=\"font-bold break-all\">{branchData?.current || 'current'}</span> branch?\n </p>\n <div className=\"max-h-44 overflow-auto rounded border border-base-300 bg-base-200/40 p-2 space-y-1\">\n {commitsToCherryPick.map((commit) => (\n <div key={commit.hash} className=\"text-xs min-w-0\">\n <span className=\"font-mono opacity-70\">{commit.hash.slice(0, 7)}</span>{' '}\n <span className=\"break-words\">{commit.message}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={() => {\n setIsCherryPickOpen(false);\n setCommitsToCherryPick([]);\n }}\n disabled={isCherryPicking}\n >\n Cancel\n </button>\n <button className=\"btn btn-primary\" onClick={handleCherryPickCommit} disabled={isCherryPicking}>\n {isCherryPicking && <span className=\"loading loading-spinner loading-xs\"></span>}\n Confirm\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={() => {\n setIsCherryPickOpen(false);\n setCommitsToCherryPick([]);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isAbortCherryPickOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Cherry Pick In Progress</h3>\n <p className=\"text-sm opacity-70 mt-1\">Another cherry-pick operation is currently in progress.</p>\n <p className=\"py-4 break-words\">\n Abort the in-progress cherry-pick and continue with {commitsToCherryPick.length > 1 ? 'the selected commits' : 'this commit'}?\n </p>\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={() => {\n setIsAbortCherryPickOpen(false);\n setCommitsToCherryPick([]);\n }}\n disabled={isAbortingCherryPick}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-warning\"\n onClick={() => void handleAbortCherryPick()}\n disabled={isAbortingCherryPick}\n >\n {isAbortingCherryPick && <span className=\"loading loading-spinner loading-xs\"></span>}\n Abort and Continue\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={() => {\n setIsAbortCherryPickOpen(false);\n setCommitsToCherryPick([]);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isRenameOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">{remoteBranchToRename ? 'Rename Remote Branch' : 'Rename Branch'}</h3>\n <p className=\"py-4 break-words\">\n Enter a new name for the branch <span className=\"font-bold break-all\">{branchToRename}</span>. Press <kbd className=\"kbd kbd-sm\">Enter</kbd> to confirm.\n </p>\n <input\n type=\"text\"\n className=\"input input-bordered w-full\"\n value={newBranchNameForRename}\n onChange={e => setNewBranchNameForRename(sanitizeBranchName(e.target.value))}\n placeholder=\"New branch name\"\n disabled={isRenaming}\n autoFocus\n onKeyDown={e => {\n const shortcutPressed = e.key === 'Enter' && (e.metaKey || e.ctrlKey);\n const sameName = remoteBranchToRename\n ? newBranchNameForRename === remoteBranchToRename.branch\n : newBranchNameForRename === branchToRename;\n if (shortcutPressed && newBranchNameForRename && !sameName && !isRenaming) {\n handleRenameBranch();\n }\n }}\n />\n {!remoteBranchToRename && trackingInfoForRename?.upstream && (\n <div className=\"form-control mt-2\">\n <label className=\"label cursor-pointer justify-start items-start gap-2 min-w-0\">\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-sm\"\n checked={renameTrackingRemoteBranch}\n onChange={(e) => setRenameTrackingRemoteBranch(e.target.checked)}\n disabled={isRenaming}\n />\n <span className=\"label-text break-words whitespace-normal\">\n Also rename tracking remote branch <span className=\"font-mono opacity-70 break-all\">{trackingInfoForRename.upstream}</span>\n </span>\n </label>\n </div>\n )}\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={closeRenameBranchDialog}\n disabled={isRenaming}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n onClick={handleRenameBranch}\n disabled={\n !newBranchNameForRename ||\n (remoteBranchToRename\n ? newBranchNameForRename === remoteBranchToRename.branch\n : newBranchNameForRename === branchToRename) ||\n isRenaming\n }\n >\n {isRenaming && <span className=\"loading loading-spinner loading-xs\"></span>}\n Rename\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeRenameBranchDialog}>\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isRenameRemoteOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Rename Remote</h3>\n <p className=\"py-4 break-words\">\n Enter a new name for remote <span className=\"font-bold break-all\">{remoteToRename}</span>. Press <kbd className=\"kbd kbd-sm\">Enter</kbd> to confirm.\n </p>\n <input\n type=\"text\"\n className=\"input input-bordered w-full\"\n value={newRemoteNameForRename}\n onChange={(e) => setNewRemoteNameForRename(e.target.value)}\n placeholder=\"New remote name\"\n disabled={isRenamingRemote}\n autoFocus\n onKeyDown={(e) => {\n const shortcutPressed = e.key === 'Enter' && (e.metaKey || e.ctrlKey);\n const trimmedNewName = newRemoteNameForRename.trim();\n const sameName = trimmedNewName === (remoteToRename ?? '').trim();\n if (shortcutPressed && trimmedNewName && !sameName && !isRenamingRemote) {\n handleRenameRemote();\n }\n }}\n />\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={closeRenameRemoteDialog}\n disabled={isRenamingRemote}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n onClick={handleRenameRemote}\n disabled={\n !newRemoteNameForRename.trim() ||\n newRemoteNameForRename.trim() === (remoteToRename ?? '').trim() ||\n isRenamingRemote\n }\n >\n {isRenamingRemote && <span className=\"loading loading-spinner loading-xs\"></span>}\n Rename\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeRenameRemoteDialog}>\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isDeleteRemoteOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Delete Remote</h3>\n <p className=\"py-4 break-words\">\n Are you sure you want to delete remote <span className=\"font-bold break-all\">{remoteToDelete}</span>?\n This removes all tracking branches for that remote.\n </p>\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={closeDeleteRemoteDialog}\n disabled={isDeletingRemote}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-error\"\n onClick={handleDeleteRemote}\n disabled={!remoteToDelete || isDeletingRemote}\n >\n {isDeletingRemote && <span className=\"loading loading-spinner loading-xs\"></span>}\n Delete\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeDeleteRemoteDialog}>\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isAddRemoteOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Add Remote</h3>\n <p className=\"py-4 break-words\">\n Add a new remote by providing a name and URL. Press <kbd className=\"kbd kbd-sm\">Enter</kbd> to confirm.\n </p>\n <div className=\"space-y-3\">\n <div>\n <label className=\"label pt-0\">\n <span className=\"label-text\">Remote name</span>\n </label>\n <input\n type=\"text\"\n className=\"input input-bordered w-full\"\n value={newRemoteName}\n onChange={(e) => setNewRemoteName(e.target.value)}\n placeholder=\"origin\"\n disabled={isAddingRemote}\n autoFocus\n />\n </div>\n <div>\n <label className=\"label pt-0\">\n <span className=\"label-text\">Remote URL</span>\n </label>\n <input\n type=\"text\"\n className=\"input input-bordered w-full\"\n value={newRemoteUrl}\n onChange={(e) => setNewRemoteUrl(e.target.value)}\n placeholder=\"https://github.com/owner/repo.git\"\n disabled={isAddingRemote}\n onKeyDown={(e) => {\n const shortcutPressed = e.key === 'Enter' && (e.metaKey || e.ctrlKey);\n if (shortcutPressed && newRemoteName.trim() && newRemoteUrl.trim() && !isAddingRemote) {\n handleAddRemote();\n }\n }}\n />\n </div>\n </div>\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={closeAddRemoteDialog}\n disabled={isAddingRemote}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n onClick={handleAddRemote}\n disabled={!newRemoteName.trim() || !newRemoteUrl.trim() || isAddingRemote}\n >\n {isAddingRemote && <span className=\"loading loading-spinner loading-xs\"></span>}\n Add\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeAddRemoteDialog}>\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isRebaseOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Rebase</h3>\n <p className=\"py-4 break-words\">\n Copy commits from one branch to another.<br />\n Are you sure to rebase <span className=\"font-bold break-all\">{rebaseSourceBranch}</span> onto <span className=\"font-bold break-all\">{rebaseTargetBranch}</span>?\n </p>\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={rebaseStashChanges} onChange={(e) => setRebaseStashChanges(e.target.checked)} disabled={isRebasing} />\n <span className=\"label-text\">Stash and reapply local changes</span>\n </label>\n </div>\n {!rebaseStashChanges && (\n <p className=\"text-xs text-warning mt-2 ml-6\">\n Warning: All local changes will be discarded.\n </p>\n )}\n {rebaseConflictStatus === 'checking' ? (\n <div className=\"alert alert-info text-sm mt-4 py-2\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n <span>Checking conflicts for rebasing <span className=\"font-bold break-all\">{rebaseSourceBranch}</span> onto <span className=\"font-bold break-all\">{rebaseTargetBranch}</span>...</span>\n </div>\n ) : rebaseConflictStatus === 'no-conflict' ? (\n <div className=\"alert alert-success text-sm mt-4 py-2\">\n <i className=\"iconoir-check-circle-solid text-[18px]\" aria-hidden=\"true\" />\n <span>No conflict: rebasing <span className=\"font-bold break-all\">{rebaseSourceBranch}</span> onto <span className=\"font-bold break-all\">{rebaseTargetBranch}</span> will not cause conflicts.</span>\n </div>\n ) : (\n <div className=\"alert alert-warning text-sm mt-4 py-2\">\n <i className=\"iconoir-warning-circle-solid text-[18px]\" aria-hidden=\"true\" />\n <span>Conflicts detected: rebasing <span className=\"font-bold break-all\">{rebaseSourceBranch}</span> onto <span className=\"font-bold break-all\">{rebaseTargetBranch}</span> will cause conflicts.</span>\n </div>\n )}\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={closeRebaseDialog} disabled={isRebasing}>Cancel</button>\n <button className=\"btn btn-primary\" onClick={handleRebase} disabled={isRebasing}>\n {isRebasing && <span className=\"loading loading-spinner loading-xs\"></span>}\n Confirm\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeRebaseDialog}>close</button>\n </form>\n </dialog>\n )}\n\n {isMergeOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Merge</h3>\n <p className=\"py-4 break-words\">\n Merge branch into another one.<br />\n Are you sure to merge <span className=\"font-bold break-all\">{mergeSourceBranch}</span> into <span className=\"font-bold break-all\">{mergeTargetBranch}</span>?\n </p>\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={mergeRebaseBeforeMerge} onChange={(e) => setMergeRebaseBeforeMerge(e.target.checked)} disabled={isMerging} />\n <span className=\"label-text\">Rebase before merge</span>\n </label>\n </div>\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={mergeSquash} onChange={(e) => handleMergeSquashToggle(e.target.checked)} disabled={isMerging} />\n <span className=\"label-text\">Squash before merge</span>\n </label>\n </div>\n {mergeSquash && (\n <textarea\n className=\"textarea textarea-bordered w-full mt-2\"\n placeholder=\"Commit message for squash merge\"\n value={mergeSquashMessage}\n onChange={(e) => setMergeSquashMessage(e.target.value)}\n disabled={isMerging}\n autoFocus\n />\n )}\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={mergeFastForward} onChange={(e) => setMergeFastForward(e.target.checked)} disabled={isMerging} />\n <span className=\"label-text\">Fast forward merge</span>\n </label>\n </div>\n {mergeConflictStatus === 'checking' ? (\n <div className=\"alert alert-info text-sm mt-4 py-2\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n <span>Checking conflicts for merging <span className=\"font-bold break-all\">{mergeSourceBranch}</span> into <span className=\"font-bold break-all\">{mergeTargetBranch}</span>...</span>\n </div>\n ) : mergeConflictStatus === 'no-conflict' ? (\n <div className=\"alert alert-success text-sm mt-4 py-2\">\n <i className=\"iconoir-check-circle-solid text-[18px]\" aria-hidden=\"true\" />\n <span>No conflict: merging <span className=\"font-bold break-all\">{mergeSourceBranch}</span> into <span className=\"font-bold break-all\">{mergeTargetBranch}</span> will not cause conflicts.</span>\n </div>\n ) : (\n <div className=\"alert alert-warning text-sm mt-4 py-2\">\n <i className=\"iconoir-warning-circle-solid text-[18px]\" aria-hidden=\"true\" />\n <span>Conflicts detected: merging <span className=\"font-bold break-all\">{mergeSourceBranch}</span> into <span className=\"font-bold break-all\">{mergeTargetBranch}</span> will cause conflicts.</span>\n </div>\n )}\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={closeMergeDialog} disabled={isMerging}>Cancel</button>\n <button className=\"btn btn-primary\" onClick={handleMerge} disabled={isMerging}>\n {isMerging && <span className=\"loading loading-spinner loading-xs\"></span>}\n Confirm\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={closeMergeDialog}>close</button>\n </form>\n </dialog>\n )}\n\n {isPushOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Push to Remote</h3>\n <p className=\"py-4 break-words\">Push <span className=\"font-bold break-all\">{pushBranch}</span> to a remote repository.</p>\n\n {pushError && pushRemotes.length === 0 ? (\n <div className=\"alert alert-error\">\n <span className=\"text-xl\">⚠️</span>\n <span>{pushError}</span>\n </div>\n ) : pushLoadingRemotes ? (\n <div className=\"flex justify-center py-8\">\n <span className=\"loading loading-spinner loading-lg\"></span>\n </div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n <div className=\"form-control w-full flex flex-row items-center justify-between gap-4\">\n <label className=\"label flex-shrink-0\"><span className=\"label-text\">Remote Repository</span></label>\n <select className=\"select select-bordered w-64\" value={pushSelectedRemote} onChange={(e) => handlePushRemoteChange(e.target.value)} disabled={isPushing}>\n {pushRemotes.map((remote) => <option key={remote} value={remote}>{remote}</option>)}\n </select>\n </div>\n\n <div className=\"form-control w-full flex flex-row items-center justify-between gap-4\">\n <label className=\"label flex-shrink-0\"><span className=\"label-text\">Remote Branch</span></label>\n <div className=\"flex flex-col items-end gap-1 w-64\">\n {pushLoadingBranches ? (\n <div className=\"flex items-center gap-2 p-3 border rounded-lg bg-base-200 opacity-70 w-full\">\n <span className=\"loading loading-spinner loading-xs\"></span> Loading branches...\n </div>\n ) : (\n <select className=\"select select-bordered w-full\" value={pushSelectedRemoteBranch} onChange={(e) => setPushSelectedRemoteBranch(e.target.value)} disabled={isPushing}>\n {pushBranch && !pushRemoteBranches.includes(pushBranch) && <option value={pushBranch}>{pushBranch} (new)</option>}\n {pushRemoteBranches.map((branch) => <option key={branch} value={branch}>{branch}{pushTrackingBranch?.remote === pushSelectedRemote && pushTrackingBranch?.branch === branch ? ' (tracking)' : ''}</option>)}\n </select>\n )}\n {pushSelectedRemoteBranch && !pushRemoteBranches.includes(pushSelectedRemoteBranch) && (\n <div className=\"label\"><span className=\"label-text-alt text-warning\">New branch will be created</span></div>\n )}\n </div>\n </div>\n\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={pushRebaseFirst} onChange={(e) => setPushRebaseFirst(e.target.checked)} disabled={isPushing || pushForcePush} />\n <span className=\"label-text\">Rebase onto remote branch before pushing</span>\n </label>\n </div>\n\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm checkbox-error\" checked={pushForcePush} onChange={(e) => setPushForcePush(e.target.checked)} disabled={isPushing} />\n <span className=\"label-text text-error\">Force push</span>\n </label>\n </div>\n\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={pushLocalOnlyTags} onChange={(e) => setPushLocalOnlyTags(e.target.checked)} disabled={isPushing} />\n <span className=\"label-text\">Push all tags</span>\n </label>\n </div>\n\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={pushSquash} onChange={(e) => handlePushSquashToggle(e.target.checked)} disabled={isPushing} />\n <span className=\"label-text\">Squash local commits before push</span>\n </label>\n </div>\n {pushSquash && (\n <textarea className=\"textarea textarea-bordered w-full\" placeholder=\"Commit message for squash\" value={pushSquashMessage} onChange={(e) => setPushSquashMessage(e.target.value)} disabled={isPushing} autoFocus />\n )}\n\n {pushError && (\n <div className=\"alert alert-error text-sm\">\n <span>{pushError}</span>\n </div>\n )}\n </div>\n )}\n\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={() => setIsPushOpen(false)} disabled={isPushing}>Cancel</button>\n {pushRemotes.length > 0 && (\n <button className=\"btn btn-primary\" onClick={handlePushToRemote} disabled={isPushing || !pushSelectedRemote || !pushSelectedRemoteBranch}>\n {isPushing && <span className=\"loading loading-spinner loading-xs\"></span>} Push\n </button>\n )}\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={() => setIsPushOpen(false)}>close</button>\n </form>\n </dialog>\n )}\n\n {isPullOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Pull from Remote</h3>\n <p className=\"py-4 break-words\">Pull changes from a remote branch into <span className=\"font-bold break-all\">{pullBranch}</span>.</p>\n\n {pullError && pullRemotes.length === 0 ? (\n <div className=\"alert alert-error\"><span>{pullError}</span></div>\n ) : pullLoadingRemotes ? (\n <div className=\"flex justify-center py-8\"><span className=\"loading loading-spinner loading-lg\"></span></div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n <div className=\"form-control w-full flex flex-row items-center justify-between gap-4\">\n <label className=\"label flex-shrink-0\"><span className=\"label-text\">Remote Repository</span></label>\n <select className=\"select select-bordered w-64\" value={pullSelectedRemote} onChange={(e) => handlePullRemoteChange(e.target.value)} disabled={isPulling}>\n {pullRemotes.map((remote) => <option key={remote} value={remote}>{remote}</option>)}\n </select>\n </div>\n\n <div className=\"form-control w-full flex flex-row items-center justify-between gap-4\">\n <label className=\"label flex-shrink-0\"><span className=\"label-text\">Remote Branch</span></label>\n {pullLoadingBranches ? (\n <div className=\"flex items-center gap-2 p-3 border rounded-lg bg-base-200 opacity-70 w-64\">\n <span className=\"loading loading-spinner loading-xs\"></span> Loading branches...\n </div>\n ) : (\n <select className=\"select select-bordered w-64\" value={pullSelectedRemoteBranch} onChange={(e) => setPullSelectedRemoteBranch(e.target.value)} disabled={isPulling}>\n {pullRemoteBranches.map((branch) => <option key={branch} value={branch}>{branch}{pullTrackingBranch?.remote === pullSelectedRemote && pullTrackingBranch?.branch === branch ? ' (tracking)' : ''}</option>)}\n </select>\n )}\n </div>\n\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input type=\"checkbox\" className=\"checkbox checkbox-sm\" checked={pullRebase} onChange={(e) => setPullRebase(e.target.checked)} disabled={isPulling} />\n <span className=\"label-text\">Rebase onto remote branch</span>\n </label>\n </div>\n\n {pullError && <div className=\"alert alert-error text-sm\"><span>{pullError}</span></div>}\n </div>\n )}\n\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={() => setIsPullOpen(false)} disabled={isPulling}>Cancel</button>\n {pullRemotes.length > 0 && (\n <button className=\"btn btn-primary\" onClick={handlePullFromRemote} disabled={isPulling || !pullSelectedRemote || !pullSelectedRemoteBranch}>\n {isPulling && <span className=\"loading loading-spinner loading-xs\"></span>} Pull\n </button>\n )}\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={() => setIsPullOpen(false)}>close</button>\n </form>\n </dialog>\n )}\n\n {isCreateTagOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Create Tag</h3>\n <p className=\"py-4 break-words\">\n Create a new tag at commit <span className=\"font-mono bg-base-200 px-1 rounded\">{createTagCommitHash?.substring(0, 7)}</span>.\n </p>\n <input\n type=\"text\"\n className=\"input input-bordered w-full font-mono\"\n value={newTagName}\n onChange={(e) => setNewTagName(e.target.value)}\n placeholder=\"Tag name\"\n disabled={isCreatingTag}\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter' && newTagName.trim() && !isCreatingTag) {\n e.preventDefault();\n handleCreateTag();\n }\n }}\n />\n <div className=\"form-control mt-3\">\n <label className=\"label cursor-pointer justify-start gap-2\">\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-sm\"\n checked={pushTagToRemote}\n onChange={(e) => setPushTagToRemote(e.target.checked)}\n disabled={isCreatingTag}\n />\n <span className=\"label-text\">Push tag to remote after creation</span>\n </label>\n </div>\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={() => {\n setIsCreateTagOpen(false);\n setCreateTagCommitHash(null);\n setNewTagName('');\n setPushTagToRemote(false);\n }}\n disabled={isCreatingTag}\n >\n Cancel\n </button>\n <button className=\"btn btn-primary\" onClick={handleCreateTag} disabled={!newTagName.trim() || isCreatingTag}>\n {isCreatingTag && <span className=\"loading loading-spinner loading-xs\"></span>}\n Create\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={() => {\n setIsCreateTagOpen(false);\n setCreateTagCommitHash(null);\n setNewTagName('');\n setPushTagToRemote(false);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {iscreateBranchOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Create New Branch</h3>\n <p className=\"py-4 break-words\">\n Create a new branch from{' '}\n <span className=\"font-bold break-all\">\n {createBranchFromRef ? createBranchFromRef.replace(/^remotes\\//, '') : 'current HEAD'}\n </span>.\n </p>\n <input\n type=\"text\"\n className=\"input input-bordered w-full\"\n value={newBranchName}\n onChange={e => setNewBranchName(sanitizeBranchName(e.target.value))}\n placeholder=\"Branch name\"\n disabled={isCreating}\n autoFocus\n onKeyDown={e => {\n if (e.key === 'Enter' && newBranchName && !isCreating) {\n e.preventDefault();\n handleCreateBranch();\n }\n }}\n />\n <div className=\"modal-action\">\n <button\n className=\"btn\"\n onClick={() => {\n setIsCreateBranchOpen(false);\n setCreateBranchFromRef(null);\n }}\n disabled={isCreating}\n >\n Cancel\n </button>\n <button className=\"btn btn-primary\" onClick={handleCreateBranch} disabled={!newBranchName || isCreating}>\n {isCreating && <span className=\"loading loading-spinner loading-xs\"></span>} Create & Checkout\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={() => {\n setIsCreateBranchOpen(false);\n setCreateBranchFromRef(null);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {isCheckoutToLocalOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box\">\n <h3 className=\"font-bold text-lg\">Checkout to Local Branch</h3>\n <p className=\"py-4 break-words\">Create a local branch from <span className=\"font-bold break-all\">{checkoutRemoteBranch?.replace(/^remotes\\//, '')}</span> and set up tracking.</p>\n <div className=\"form-control w-full\">\n <label className=\"label\"><span className=\"label-text\">Local Branch Name</span></label>\n <input\n type=\"text\"\n className=\"input input-bordered w-full\"\n value={checkoutLocalBranchName}\n onChange={e => setCheckoutLocalBranchName(sanitizeBranchName(e.target.value))}\n placeholder=\"Local branch name\"\n disabled={isCheckingOutToLocal}\n autoFocus\n onKeyDown={e => {\n if (e.key === 'Enter' && checkoutLocalBranchName && !isCheckingOutToLocal) {\n e.preventDefault();\n handleCheckoutToLocal();\n }\n }}\n />\n </div>\n <div className=\"modal-action\">\n <button className=\"btn\" onClick={() => setIsCheckoutToLocalOpen(false)} disabled={isCheckingOutToLocal}>Cancel</button>\n <button className=\"btn btn-primary\" onClick={handleCheckoutToLocal} disabled={!checkoutLocalBranchName || isCheckingOutToLocal}>\n {isCheckingOutToLocal && <span className=\"loading loading-spinner loading-xs\"></span>} Checkout\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button onClick={() => setIsCheckoutToLocalOpen(false)}>close</button>\n </form>\n </dialog>\n )}\n\n {scriptExecution.isOpen && (\n <dialog className=\"modal modal-open\">\n <div className=\"modal-box max-w-4xl\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <h3 className=\"font-bold text-lg truncate\">Custom Script: {scriptExecution.scriptName}</h3>\n <p className=\"text-xs opacity-70 mt-1 break-all\">\n Branch: {scriptExecution.branchRef}\n </p>\n </div>\n <span\n className={cn(\n \"badge badge-sm shrink-0\",\n scriptExecution.status === 'running' || scriptExecution.status === 'starting'\n ? 'badge-info'\n : scriptExecution.status === 'completed'\n ? 'badge-success'\n : scriptExecution.status === 'failed'\n ? 'badge-error'\n : scriptExecution.status === 'canceled'\n ? 'badge-warning'\n : 'badge-ghost'\n )}\n >\n {scriptExecution.status}\n </span>\n </div>\n\n <div className=\"mt-4 border border-base-300 rounded bg-base-200/40\">\n <pre className=\"p-3 font-mono text-xs overflow-auto max-h-[50vh] whitespace-pre-wrap break-words\">{scriptExecution.output || 'Waiting for output...'}</pre>\n </div>\n\n {scriptExecution.error && (\n <div className=\"alert alert-error py-2 mt-3\">\n <span>{scriptExecution.error}</span>\n </div>\n )}\n\n <div className=\"modal-action\">\n <button\n className=\"btn btn-warning\"\n onClick={() => void handleCancelCustomScriptExecution()}\n disabled={!isScriptExecutionRunning || isCancelingScriptExecution}\n >\n {isCancelingScriptExecution && <span className=\"loading loading-spinner loading-xs\"></span>}\n Cancel\n </button>\n <button\n className=\"btn btn-outline\"\n onClick={() => void handleCopyCustomScriptOutput()}\n disabled={isCopyingScriptOutput}\n >\n {isCopyingScriptOutput && <span className=\"loading loading-spinner loading-xs\"></span>}\n {didCopyScriptOutput ? 'Copied' : 'Copy'}\n </button>\n <button\n className=\"btn btn-primary\"\n onClick={() => {\n setScriptExecution(DEFAULT_SCRIPT_EXECUTION);\n setDidCopyScriptOutput(false);\n setIsCancelingScriptExecution(false);\n }}\n disabled={!isScriptExecutionFinished}\n >\n Done\n </button>\n </div>\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button\n onClick={(e) => {\n if (!isScriptExecutionFinished) {\n e.preventDefault();\n return;\n }\n setScriptExecution(DEFAULT_SCRIPT_EXECUTION);\n setDidCopyScriptOutput(false);\n setIsCancelingScriptExecution(false);\n }}\n >\n close\n </button>\n </form>\n </dialog>\n )}\n\n {/* Main Content */}\n <div className=\"flex-1 flex min-w-0 flex-col gap-2 overflow-hidden\">\n <div className=\"flex min-h-[57px] shrink-0 flex-wrap items-center justify-between gap-2 rounded-xl border border-slate-200 bg-white px-4 py-2 dark:border-slate-800 dark:bg-slate-900\">\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-2\">\n <h1 className=\"font-bold text-lg text-slate-900 dark:text-slate-100\">History</h1>\n <div className=\"relative\" ref={branchPopoverRef}>\n <button\n className={branchSelectButtonClass}\n onClick={() => setIsBranchPopoverOpen(prev => !prev)}\n title={currentBranchLabel}\n >\n <span className=\"truncate\">{currentBranchLabel}</span>\n <i className={cn(\"iconoir-nav-arrow-down text-[16px] shrink-0 transition-transform opacity-60\", isBranchPopoverOpen && \"rotate-180\")} aria-hidden=\"true\" />\n </button>\n {isBranchPopoverOpen && (\n <div className=\"absolute left-0 top-full mt-2 z-50\">\n {branchTreePopoverContent}\n </div>\n )}\n </div>\n <div className=\"flex flex-wrap items-center gap-2 shrink-0\">\n <button\n className={headerActionButtonClass}\n onClick={() => void handleFetchFromAllRemotes()}\n disabled={isFetchingAllRemotes || isPullingAllBranches || isPullOpen || isPushOpen}\n title=\"Fetch latest changes from all remotes\"\n >\n {isFetchingAllRemotes ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <i className=\"iconoir-refresh text-[16px]\" aria-hidden=\"true\" />\n )}\n <span className={headerActionLabelClass}>Fetch</span>\n </button>\n <button\n className={headerActionButtonClass}\n onClick={confirmPullCurrentBranch}\n disabled={!!pullActionDisabledReason || isPullingAllBranches || isPullOpen || isPushOpen}\n title={pullActionDisabledReason || `Pull from ${currentTrackingBranch?.upstream}`}\n >\n {pullLoadingRemotes ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <i className=\"iconoir-arrow-down text-[16px]\" aria-hidden=\"true\" />\n )}\n <span className={headerActionLabelClass}>Pull</span>\n </button>\n <button\n className={headerActionButtonClass}\n onClick={() => void handlePullAllBranches()}\n disabled={!!pullAllActionDisabledReason || isPullOpen || isPushOpen || isPullingAllBranches}\n title={pullAllActionDisabledReason || 'Pull all local branches from tracking remote branches'}\n >\n {isPullingAllBranches ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <i className=\"iconoir-arrow-down text-[16px]\" aria-hidden=\"true\" />\n )}\n <span className={headerActionLabelClass}>Pull All</span>\n </button>\n <button\n className={headerActionButtonClass}\n onClick={confirmPushCurrentBranch}\n disabled={!!pushActionDisabledReason || isPullingAllBranches || isPullOpen || isPushOpen}\n title={pushActionDisabledReason || (currentTrackingBranch ? `Push to ${currentTrackingBranch.upstream}` : 'Push current branch to remote')}\n >\n {pushLoadingRemotes ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <i className=\"iconoir-arrow-up text-[16px]\" aria-hidden=\"true\" />\n )}\n <span className={headerActionLabelClass}>Push</span>\n </button>\n </div>\n </div>\n <div className=\"shrink-0 flex flex-wrap items-center gap-2\">\n <button\n className={headerActionButtonClass}\n onClick={() => void handleOpenRepoTerminal()}\n disabled={isOpeningRepoTerminal}\n title=\"Open terminal in repository folder\"\n >\n {isOpeningRepoTerminal ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <i className=\"iconoir-terminal text-[16px]\" aria-hidden=\"true\" />\n )}\n <span className={headerActionLabelClass}>Open Terminal</span>\n </button>\n <button\n className={headerActionButtonClass}\n onClick={() => void handleOpenRepoFolder()}\n disabled={isOpeningRepoFolder}\n title=\"Open repository folder in Finder\"\n >\n {isOpeningRepoFolder ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <i className=\"iconoir-folder text-[16px]\" aria-hidden=\"true\" />\n )}\n <span className={headerActionLabelClass}>Open Repo Folder</span>\n </button>\n </div>\n </div>\n\n <div className=\"relative flex-1 overflow-hidden rounded-xl border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-900\">\n {/* Show loading spinner while branches are loading if visibility filters are set */}\n {hasVisibilityFilters && isBranchesLoading ? (\n <div className=\"flex items-center justify-center h-full\">\n <span className=\"loading loading-spinner loading-lg opacity-50\"></span>\n </div>\n ) : (\n <GitGraph\n ref={gitGraphRef}\n commits={filteredCommits}\n selectedHash={selectedHash || undefined}\n selectedHashes={selectedCommitHashSet}\n onSelectCommit={handleSelectCommit}\n onResetToCommit={handleResetToCommit}\n onRevertCommit={confirmRevertCommit}\n onCreateTag={confirmCreateTag}\n onCherryPickCommit={confirmCherryPickCommit}\n onCherryPickSelectedCommits={confirmCherryPickSelectedCommits}\n onRewordCommit={confirmRewordCommit}\n localBranches={branchData?.branches || []}\n trackingInfo={branchData?.trackingInfo}\n onEndReached={() => {\n if (!isFetching && log.all.length >= limit) {\n setLimit(l => l + 50);\n }\n }}\n isLoadingMore={isFetching && limit > 100}\n currentBranch={branchData?.current}\n hiddenBranches={hiddenBranches}\n getBranchTagContextMenuItems={getBranchTagContextMenuItems}\n />\n )}\n </div>\n\n {selectedHash && (\n <div\n className=\"flex flex-col overflow-hidden rounded-xl border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-900\"\n style={{ height: panelHeight }}\n >\n {/* Resize handle */}\n <div\n className={cn(\n \"h-1.5 cursor-ns-resize flex items-center justify-center hover:bg-slate-100 transition-colors group shrink-0 dark:hover:bg-slate-800/60\",\n isResizing && \"bg-slate-100 dark:bg-slate-800/60\"\n )}\n onMouseDown={handleResizeStart}\n >\n <div className=\"w-8 h-1 rounded-full bg-base-300 group-hover:bg-base-content/20 transition-colors\" />\n </div>\n\n {/* Header with commit info */}\n <div className=\"flex flex-row items-center py-2 px-4 border-b border-slate-200 dark:border-slate-800 bg-slate-50/70 dark:bg-slate-900 shrink-0 justify-between gap-4\">\n <div className=\"flex items-center gap-4 flex-1 min-w-0\">\n {isCommitRangeSelection && selectedCommitRange ? (\n <>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-bold truncate\">\n {selectedCommitRange.latestHash.substring(0, 7)}: {selectedCommitRange.latestCommit.message}\n </div>\n <div className=\"text-sm font-bold truncate opacity-75\">\n {selectedCommitRange.oldestHash.substring(0, 7)}: {selectedCommitRange.oldestCommit.message}\n </div>\n </div>\n </>\n ) : (\n <>\n <span className=\"text-sm font-bold truncate\">\n {selectedCommit?.message}\n </span>\n <span className=\"text-xs font-mono opacity-50 shrink-0\">\n {selectedHash.substring(0, 7)}\n </span>\n </>\n )}\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <button\n className=\"ml-2 flex items-center justify-center h-8 w-8 rounded-md hover:bg-slate-100 dark:hover:bg-slate-800 text-slate-600 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100\"\n onClick={() => selectSingleCommit(null)}\n title=\"Close\"\n >\n ✕\n </button>\n </div>\n </div>\n\n {isCommitRangeSelection && selectedCommitRange ? (\n <div className=\"flex-1 overflow-hidden min-h-0 flex flex-col bg-white dark:bg-slate-900\">\n <div className=\"px-4 pt-2 pb-1 text-[10px] uppercase tracking-wider font-bold opacity-60 border-b border-slate-200 dark:border-slate-800 bg-slate-50/70 dark:bg-slate-900 shrink-0\">\n Changes\n </div>\n <div className=\"flex-1 min-h-0\">\n <CommitChangesView\n repoPath={repoPath}\n fromCommitHash={selectedCommitRange.oldestHash}\n toCommitHash={selectedCommitRange.latestHash}\n />\n </div>\n </div>\n ) : (\n /* Combined commit message and changes content */\n <div\n ref={commitDetailsContentRef}\n className=\"flex-1 overflow-hidden bg-white dark:bg-slate-900 grid\"\n style={{\n gridTemplateRows: `${commitDetailsMessageRatio}fr 6px ${1 - commitDetailsMessageRatio}fr`,\n }}\n >\n <div className=\"border-b border-slate-200 dark:border-slate-800 bg-white dark:bg-slate-900 min-h-0 flex flex-col\">\n <div className=\"px-4 pt-3 pb-1 text-[10px] uppercase tracking-wider font-bold opacity-60\">\n Message\n </div>\n <div className=\"px-4 pb-3 overflow-auto flex-1 min-h-0\">\n <div className=\"text-xs opacity-70 whitespace-pre-wrap font-mono\">\n {selectedCommit\n ? formatCommitMessageForDisplay(\n selectedCommit.body?.trim()\n ? `${selectedCommit.message}\\n\\n${selectedCommit.body}`\n : selectedCommit.message\n )\n : 'No additional message'}\n </div>\n </div>\n </div>\n <div\n className={cn(\n 'cursor-ns-resize flex items-center justify-center hover:bg-slate-100 dark:hover:bg-slate-800/60 transition-colors',\n isCommitDetailsRatioResizing && 'bg-slate-100 dark:bg-slate-800/60'\n )}\n onMouseDown={handleCommitDetailsRatioResizeStart}\n >\n <div className=\"w-8 h-1 rounded-full bg-base-300\" />\n </div>\n <div className=\"flex-1 overflow-hidden min-h-0 flex flex-col\">\n <div className=\"px-4 pt-2 pb-1 text-[10px] uppercase tracking-wider font-bold opacity-60 border-b border-slate-200 dark:border-slate-800 bg-slate-50/70 dark:bg-slate-900 shrink-0\">\n Changes\n </div>\n <div className=\"flex-1 min-h-0\">\n <CommitChangesView repoPath={repoPath} commitHash={selectedHash} />\n </div>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useMemo, useRef, useState, useImperativeHandle, forwardRef, useEffect, useCallback } from 'react';\nimport { Commit, BranchTrackingInfo } from '@/lib/types';\nimport { generateGraphData } from '@/lib/graph-utils';\nimport { cn } from '@/lib/utils';\nimport { ContextMenu, ContextMenuItem } from '@/components/context-menu';\nimport { getBranchTagColors } from '@/lib/branch-colors';\n\n\nconst ROW_HEIGHT = 24; // Compact rows like Fork\nconst LANE_WIDTH = 12;\nconst DOT_SIZE = 3;\nconst STROKE_WIDTH = 2;\n\n// Helper function to highlight matching text\nfunction HighlightedText({ text, searchQuery }: { text: string; searchQuery: string }) {\n if (!searchQuery || !text) return <>{text}</>;\n \n const query = searchQuery.toLowerCase();\n const lowerText = text.toLowerCase();\n const parts: { text: string; highlighted: boolean }[] = [];\n \n let lastIndex = 0;\n let index = lowerText.indexOf(query);\n \n while (index !== -1) {\n // Add non-matching part\n if (index > lastIndex) {\n parts.push({ text: text.slice(lastIndex, index), highlighted: false });\n }\n // Add matching part (preserve original case)\n parts.push({ text: text.slice(index, index + query.length), highlighted: true });\n lastIndex = index + query.length;\n index = lowerText.indexOf(query, lastIndex);\n }\n \n // Add remaining non-matching part\n if (lastIndex < text.length) {\n parts.push({ text: text.slice(lastIndex), highlighted: false });\n }\n \n if (parts.length === 0) return <>{text}</>;\n \n return (\n <>\n {parts.map((part, i) => \n part.highlighted ? (\n <mark key={i} className=\"bg-warning text-warning-content rounded-sm px-0.5\">{part.text}</mark>\n ) : (\n <span key={i}>{part.text}</span>\n )\n )}\n </>\n );\n}\n\nexport interface GitGraphHandle {\n scrollToCommit: (hash: string) => boolean;\n}\n\nexport const GitGraph = forwardRef<GitGraphHandle, {\n commits: Commit[],\n onSelectCommit?: (hash: string, modifiers?: { isMultiSelect: boolean; isRangeSelect: boolean }) => void,\n onResetToCommit?: (hash: string) => void,\n onRevertCommit?: (hash: string, message: string) => void,\n onCreateTag?: (hash: string) => void,\n onCherryPickCommit?: (hash: string, message: string) => void,\n onCherryPickSelectedCommits?: () => void,\n onRewordCommit?: (hash: string, subject: string, body: string, branch: string) => void,\n selectedHash?: string,\n selectedHashes?: Set<string>,\n onEndReached?: () => void,\n isLoadingMore?: boolean,\n currentBranch?: string,\n hiddenBranches?: Set<string>,\n localBranches?: string[],\n trackingInfo?: Record<string, BranchTrackingInfo>,\n getBranchTagContextMenuItems?: (displayRef: string) => ContextMenuItem[] | null\n}>(function GitGraph({\n commits,\n onSelectCommit,\n onResetToCommit,\n onRevertCommit,\n onCreateTag,\n onCherryPickCommit,\n onCherryPickSelectedCommits,\n onRewordCommit,\n selectedHash,\n selectedHashes,\n onEndReached,\n isLoadingMore,\n currentBranch,\n hiddenBranches,\n localBranches = [],\n trackingInfo,\n getBranchTagContextMenuItems\n}, ref) {\n const normalizeDecoratedRef = useCallback((ref: string) => {\n if (ref.startsWith('refs/heads/')) return ref.slice('refs/heads/'.length);\n if (ref.startsWith('refs/remotes/')) return ref.slice('refs/remotes/'.length);\n if (ref.startsWith('remotes/')) return ref.slice('remotes/'.length);\n return ref;\n }, []);\n const getRefDisplayName = useCallback((ref: string) => {\n if (ref.startsWith('tag:')) return ref.replace(/^tag:\\s*/, '').trim();\n return ref;\n }, []);\n\n const nodes = useMemo(\n () => generateGraphData(commits, { localBranches }),\n [commits, localBranches]\n );\n const scrollRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n \n // Search state\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n \n // Handle Cmd+F to open search\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Cmd+F (Mac) or Ctrl+F (Windows/Linux)\n if ((e.metaKey || e.ctrlKey) && e.key === 'f') {\n e.preventDefault();\n setIsSearchOpen(true);\n // Focus input after render\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }\n // Escape to close search\n if (e.key === 'Escape' && isSearchOpen) {\n setIsSearchOpen(false);\n setSearchQuery('');\n }\n };\n \n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isSearchOpen]);\n \n const handleCloseSearch = useCallback(() => {\n setIsSearchOpen(false);\n setSearchQuery('');\n }, []);\n\n // Expose scrollToCommit function via ref\n useImperativeHandle(ref, () => ({\n scrollToCommit: (hash: string) => {\n if (!nodes || nodes.length === 0) return false;\n \n const index = nodes.findIndex(n => n.hash === hash);\n if (index === -1) return false;\n \n // Scroll to the commit row\n if (scrollRef.current) {\n const scrollTop = index * ROW_HEIGHT - (scrollRef.current.clientHeight / 2) + ROW_HEIGHT / 2;\n scrollRef.current.scrollTop = Math.max(0, scrollTop);\n }\n return true;\n }\n }), [nodes]);\n\n if (!nodes || nodes.length === 0) return null;\n\n // Calculate SVG dimensions\n const maxLane = Math.max(...nodes.map(n => n.x), 0);\n const width = (maxLane + 1) * LANE_WIDTH + 20;\n const height = nodes.length * ROW_HEIGHT;\n\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, clientHeight, scrollHeight } = e.currentTarget;\n if (scrollHeight - scrollTop - clientHeight < 100) {\n onEndReached?.();\n }\n };\n\n return (\n <div className=\"flex flex-col h-full overflow-hidden bg-white dark:bg-slate-900 font-mono text-sm select-none\">\n {/* Search Input - Sticky on top */}\n {isSearchOpen && (\n <div className=\"sticky top-0 z-30 bg-white dark:bg-slate-900 border-b border-base-300 px-2 py-2 flex items-center gap-2\">\n <span className=\"opacity-50\">🔍</span>\n <input\n ref={searchInputRef}\n type=\"text\"\n placeholder=\"Search in commits...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"input input-bordered input-sm flex-1 text-sm\"\n autoFocus\n />\n <div className=\"tooltip tooltip-left z-50\" data-tip=\"Close search (Esc)\">\n <button\n onClick={handleCloseSearch}\n className=\"btn btn-ghost btn-sm btn-square\"\n >\n ✖️\n </button>\n </div>\n </div>\n )}\n \n <div className=\"flex-1 overflow-auto h-full max-w-full px-2\" onScroll={handleScroll} ref={scrollRef}>\n <div className=\"relative min-w-full\" style={{ height }}>\n {/* SVG Graph Layout */}\n <svg width={width} height={height} className=\"absolute top-0 left-0 pointer-events-none z-10\">\n {nodes.map((node) => (\n <g key={node.hash}>\n {/* Draw paths */}\n {node.paths.map((path, i) => {\n const x1 = path.x1 * LANE_WIDTH + LANE_WIDTH / 2;\n const y1 = path.y1 * ROW_HEIGHT + ROW_HEIGHT / 2;\n const x2 = path.x2 * LANE_WIDTH + LANE_WIDTH / 2;\n const y2 = path.y2 * ROW_HEIGHT + ROW_HEIGHT / 2;\n\n let d = '';\n if (path.type === 'straight') {\n d = `M ${x1} ${y1} L ${x2} ${y2}`;\n } else {\n // Fork/Merge styled Bezier\n // Standard cubic bezier: ctrl points at mid-y\n const cy1 = y1 + ROW_HEIGHT * 0.5;\n const cy2 = y2 - ROW_HEIGHT * 0.5;\n d = `M ${x1} ${y1} C ${x1} ${cy1}, ${x2} ${cy2}, ${x2} ${y2}`;\n }\n\n return (\n <path\n key={i}\n d={d}\n stroke={path.color}\n strokeWidth={STROKE_WIDTH}\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n )\n })}\n </g>\n ))}\n\n {/* Draw Nodes on top of all paths to avoid overlap ugliness */}\n {nodes.map((node) => (\n <circle\n key={`dot-${node.hash}`}\n cx={node.x * LANE_WIDTH + LANE_WIDTH / 2}\n cy={node.y * ROW_HEIGHT + ROW_HEIGHT / 2}\n r={DOT_SIZE}\n fill={node.color}\n stroke={node.color}\n strokeWidth={STROKE_WIDTH}\n />\n ))}\n </svg>\n\n {/* List Rows */}\n <div style={{ width: '100%' }}>\n {nodes.map((node) => {\n const isSelected = selectedHashes ? selectedHashes.has(node.hash) : selectedHash === node.hash;\n const selectedCount = selectedHashes?.size ?? (selectedHash ? 1 : 0);\n const menuItems: ContextMenuItem[] = [\n {\n label: \"Reset to here\",\n icon: <i className=\"iconoir-refresh-circle text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => onResetToCommit?.(node.hash),\n },\n ];\n if (onRevertCommit) {\n menuItems.push({\n label: \"Revert commit\",\n icon: <i className=\"iconoir-u-turn-arrow-left text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => onRevertCommit(node.hash, node.message),\n });\n }\n if (onCreateTag) {\n menuItems.push({\n label: \"Create tag\",\n icon: <i className=\"iconoir-bookmark text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => onCreateTag(node.hash),\n });\n }\n if (onCherryPickCommit) {\n menuItems.push({\n label: \"Cherry-pick commit\",\n icon: <i className=\"iconoir-git-fork text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => onCherryPickCommit(node.hash, node.message),\n });\n }\n if (onCherryPickSelectedCommits && selectedCount > 1 && isSelected) {\n menuItems.push({\n label: `Cherry-pick ${selectedCount} selected commits`,\n icon: <i className=\"iconoir-git-fork text-[14px]\" aria-hidden=\"true\" />,\n onClick: onCherryPickSelectedCommits,\n });\n }\n\n if (onRewordCommit && localBranches && localBranches.length > 0) {\n // Clean up refs: remove parentheses and split\n const refs = node.refs ? node.refs.replace(/[()]/g, '').split(',').map(r => r.trim()) : [];\n let targetBranch: string | null = null;\n\n for (const ref of refs) {\n // Handle \"HEAD -> branch\" format\n const cleanRef = ref.replace(/^HEAD\\s*->\\s*/, '');\n\n // Check if it is in localBranches\n if (localBranches.includes(cleanRef)) {\n targetBranch = cleanRef;\n // Prioritize current branch if found\n if (currentBranch && cleanRef === currentBranch) {\n break;\n }\n }\n }\n\n if (targetBranch) {\n menuItems.push({\n label: \"Reword commit\",\n icon: <i className=\"iconoir-edit-pencil text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => onRewordCommit(node.hash, node.message, node.body ?? '', targetBranch!),\n });\n }\n }\n\n\n // Process refs to combine local and tracking remote branches\n const processRefs = () => {\n if (!node.refs) return [];\n\n const rawRefs = node.refs.replace(/^\\s*\\((.*)\\)\\s*$/, '$1').split(',').map(r => {\n const isHead = r.startsWith('HEAD -> ');\n const name = normalizeDecoratedRef(r.replace(/^HEAD\\s*->\\s*/, '').trim());\n return { raw: r, name, isHead };\n });\n\n const result: {\n displayName: string;\n primaryRef: string;\n secondaryRef?: string;\n isHead: boolean\n }[] = [];\n\n const processedIndices = new Set<number>();\n const isHidden = (name: string) => hiddenBranches && (hiddenBranches.has(name) || hiddenBranches.has(`remotes/${name}`));\n\n // First pass: find local branches and their tracking remotes\n rawRefs.forEach((ref, idx) => {\n if (processedIndices.has(idx)) return;\n\n // Only attempt to combine if local branch is visible\n if (localBranches.includes(ref.name) && !isHidden(ref.name)) {\n const tracking = trackingInfo?.[ref.name];\n if (tracking && tracking.upstream) {\n const normalizedUpstream = normalizeDecoratedRef(tracking.upstream.trim());\n const upstreamCandidates = new Set([\n normalizedUpstream,\n normalizeDecoratedRef(`remotes/${normalizedUpstream}`),\n normalizeDecoratedRef(`refs/remotes/${normalizedUpstream}`),\n ]);\n const upstreamIdx = rawRefs.findIndex(\n (r, i) => i !== idx && !processedIndices.has(i) && upstreamCandidates.has(r.name)\n );\n\n if (upstreamIdx !== -1) {\n const upstreamRef = rawRefs[upstreamIdx];\n const parts = normalizedUpstream.split('/');\n const remoteName = parts[0];\n\n result.push({\n displayName: `${ref.name} (${remoteName})`,\n primaryRef: ref.name,\n secondaryRef: upstreamRef.name,\n isHead: ref.isHead\n });\n\n processedIndices.add(idx);\n processedIndices.add(upstreamIdx);\n return;\n }\n }\n }\n });\n\n // Second pass: add remaining refs\n rawRefs.forEach((ref, idx) => {\n if (!processedIndices.has(idx)) {\n // Skip hidden branches\n if (isHidden(ref.name)) return;\n\n result.push({\n displayName: getRefDisplayName(ref.name),\n primaryRef: ref.name,\n isHead: ref.isHead\n });\n }\n });\n\n return result;\n };\n\n const processedTags = processRefs();\n\n return (\n <ContextMenu key={node.hash} items={menuItems}>\n <div\n className={cn(\n \"flex items-center hover:bg-base-200 border-b border-base-200 last:border-0 cursor-pointer transition-colors text-xs\",\n isSelected && \"bg-primary/10\"\n )}\n style={{ height: ROW_HEIGHT }}\n onClick={(e) => onSelectCommit?.(node.hash, {\n isMultiSelect: e.metaKey || e.ctrlKey,\n isRangeSelect: e.shiftKey,\n })}\n >\n {/* Spacing for Graph */}\n <div style={{ width: width, flexShrink: 0 }} />\n\n {/* Content */}\n <div className=\"flex flex-1 gap-4 overflow-hidden pr-4 items-center\">\n <div className=\"flex-1 truncate flex items-center gap-2\">\n {/* Refs Pills */}\n {processedTags.map((tag, idx) => {\n const isCurrent = currentBranch && (\n tag.primaryRef === currentBranch ||\n tag.isHead && tag.primaryRef === currentBranch\n );\n const isGitTag = tag.primaryRef.startsWith('tag:');\n const tagColors = isGitTag\n ? { textColor: '#374151', backgroundColor: '#e5e7eb' }\n : getBranchTagColors(tag.primaryRef);\n\n const tagElement = (\n <span\n className={cn(\n \"text-[10px] px-1.5 rounded-full whitespace-nowrap shrink-0\",\n isCurrent && \"font-bold\"\n )}\n style={{\n color: tagColors.textColor,\n backgroundColor: tagColors.backgroundColor\n }}\n title={tag.displayName}\n >\n <HighlightedText text={tag.displayName} searchQuery={searchQuery} />\n </span>\n );\n\n const branchMenuItems = getBranchTagContextMenuItems?.(tag.primaryRef) || [];\n\n if (branchMenuItems.length === 0) {\n return <span key={idx} className=\"shrink-0\">{tagElement}</span>;\n }\n\n return (\n <ContextMenu\n key={idx}\n items={branchMenuItems}\n containerClassName=\"inline-flex shrink-0\"\n >\n {tagElement}\n </ContextMenu>\n );\n })}\n <span className={cn(\"truncate min-w-0 max-w-[600px]\", isSelected ? \"font-semibold\" : \"\")} title={node.message}>\n <HighlightedText text={node.message} searchQuery={searchQuery} />\n </span>\n </div>\n <div className=\"w-32 truncate opacity-70 text-right\">\n <HighlightedText text={node.author_name} searchQuery={searchQuery} />\n </div>\n <div className=\"w-20 truncate opacity-50 font-mono text-right\">\n <HighlightedText text={node.hash.substring(0, 7)} searchQuery={searchQuery} />\n </div>\n <div className=\"w-32 truncate opacity-70 text-right\">\n {new Date(node.date).toLocaleString(undefined, {\n month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit'\n })}\n </div>\n </div>\n </div>\n </ContextMenu>\n );\n })}\n \n {/* Loading More Indicator */}\n {isLoadingMore && (\n <div className=\"flex items-center justify-center py-8 border-b border-base-300\">\n <span className=\"loading loading-spinner text-base-content/50\"></span>\n <span className=\"ml-2 text-sm opacity-70\">Loading more commits...</span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n});\n","export interface BranchTagColors {\n backgroundColor: string;\n textColor: string;\n}\n\nfunction hashString(input: string): number {\n let hash = 2166136261;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\nexport function getBranchColorSeed(branchName: string): number {\n return hashString(branchName);\n}\n\nfunction hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n const sat = s / 100;\n const light = l / 100;\n const c = (1 - Math.abs(2 * light - 1)) * sat;\n const hh = h / 60;\n const x = c * (1 - Math.abs((hh % 2) - 1));\n\n let r1 = 0;\n let g1 = 0;\n let b1 = 0;\n\n if (hh >= 0 && hh < 1) {\n r1 = c;\n g1 = x;\n } else if (hh >= 1 && hh < 2) {\n r1 = x;\n g1 = c;\n } else if (hh >= 2 && hh < 3) {\n g1 = c;\n b1 = x;\n } else if (hh >= 3 && hh < 4) {\n g1 = x;\n b1 = c;\n } else if (hh >= 4 && hh < 5) {\n r1 = x;\n b1 = c;\n } else {\n r1 = c;\n b1 = x;\n }\n\n const m = light - c / 2;\n return {\n r: Math.round((r1 + m) * 255),\n g: Math.round((g1 + m) * 255),\n b: Math.round((b1 + m) * 255),\n };\n}\n\nfunction relativeLuminance({ r, g, b }: { r: number; g: number; b: number }): number {\n const toLinear = (channel: number) => {\n const value = channel / 255;\n return value <= 0.03928 ? value / 12.92 : Math.pow((value + 0.055) / 1.055, 2.4);\n };\n\n const rLin = toLinear(r);\n const gLin = toLinear(g);\n const bLin = toLinear(b);\n return 0.2126 * rLin + 0.7152 * gLin + 0.0722 * bLin;\n}\n\nfunction getReadableTextColor(rgb: { r: number; g: number; b: number }): string {\n const backgroundLum = relativeLuminance(rgb);\n const whiteContrast = (1.05) / (backgroundLum + 0.05);\n const blackContrast = (backgroundLum + 0.05) / 0.05;\n return whiteContrast >= blackContrast ? '#ffffff' : '#111827';\n}\n\nexport function getBranchTagColors(branchName: string): BranchTagColors {\n const hash = getBranchColorSeed(branchName);\n\n const hue = hash % 360;\n const saturation = 72 + ((hash >>> 9) % 20); // 72-91\n const lightness = 84 + ((hash >>> 17) % 8); // 84-91\n\n const rgb = hslToRgb(hue, saturation, lightness);\n const textColor = getReadableTextColor(rgb);\n const backgroundColor = `hsl(${hue} ${saturation}% ${lightness}%)`;\n\n return {\n backgroundColor,\n textColor,\n };\n}\n\nexport function getBranchGraphColor(branchName: string): string {\n const hash = getBranchColorSeed(branchName);\n const hue = hash % 360;\n return `hsl(${hue} 82% 52%)`;\n}\n","\nimport { Commit } from './types';\nimport { getBranchGraphColor } from './branch-colors';\n\nexport interface GraphNode extends Commit {\n x: number; // Lane index (0, 1, 2...)\n y: number; // Row index\n color: string;\n paths: GraphPath[];\n isMerge: boolean; // Helper to draw different dot\n}\n\nexport interface GraphPath {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n color: string;\n type: 'straight' | 'merge' | 'fork';\n}\n\nfunction getLaneFallbackColor(lane: number): string {\n const hue = (lane * 47) % 360;\n return `hsl(${hue} 78% 56%)`;\n}\n\nfunction parseBranchRefs(refs?: string): string[] {\n if (!refs) return [];\n\n const normalizeDecoratedRef = (ref: string): string => {\n if (ref.startsWith('refs/heads/')) {\n return ref.slice('refs/heads/'.length);\n }\n if (ref.startsWith('refs/remotes/')) {\n return ref.slice('refs/remotes/'.length);\n }\n if (ref.startsWith('remotes/')) {\n return ref.slice('remotes/'.length);\n }\n return ref;\n };\n\n return refs\n .replace(/^\\s*\\((.*)\\)\\s*$/, '$1')\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean)\n .map((ref) => ref.replace(/^HEAD\\s*->\\s*/, '').trim())\n .map(normalizeDecoratedRef)\n .filter((ref) => !ref.startsWith('tag:'))\n .filter((ref) => ref !== 'HEAD')\n .filter((ref) => !/\\/HEAD$/.test(ref));\n}\n\nfunction getRemoteShortName(ref: string): string | null {\n const withoutPrefix = ref.startsWith('remotes/') ? ref.slice('remotes/'.length) : ref;\n const slashIndex = withoutPrefix.indexOf('/');\n if (slashIndex === -1) return null;\n return withoutPrefix.slice(slashIndex + 1);\n}\n\nfunction normalizeRefForColor(ref: string, localBranches: Set<string>): string {\n if (localBranches.has(ref)) return ref;\n const shortName = getRemoteShortName(ref);\n if (shortName && localBranches.has(shortName)) {\n return shortName;\n }\n return ref;\n}\n\nfunction isLocalRef(ref: string, localBranches: Set<string>): boolean {\n return localBranches.has(ref);\n}\n\nfunction choosePreferredRef(refs: string[], localBranches: Set<string>): string | null {\n if (refs.length === 0) return null;\n const localRef = refs.find((ref) => isLocalRef(ref, localBranches));\n if (localRef) return localRef;\n return refs[0];\n}\n\nfunction shouldReplaceLaneRef(nextRef: string, currentRef: string | null, localBranches: Set<string>): boolean {\n if (!currentRef) return true;\n return isLocalRef(nextRef, localBranches) && !isLocalRef(currentRef, localBranches);\n}\n\ninterface GenerateGraphOptions {\n localBranches?: string[];\n}\n\nexport function generateGraphData(commits: Commit[], options: GenerateGraphOptions = {}): GraphNode[] {\n const nodes: GraphNode[] = [];\n const localBranches = new Set(options.localBranches ?? []);\n \n // Mapping of which commit hash is currently \"expected\" at the bottom of a lane.\n // lanes[i] = \"hash123\" means lane i is drawing a line downwards towards hash123.\n const lanes: (string | null)[] = []; \n \n // Mapping of generic colors to lanes to keep consistency if possible\n const laneColors: (string | undefined)[] = [];\n const laneBranchRefs: (string | null)[] = [];\n \n function getNextFreeLane(): number {\n for (let i = 0; i < lanes.length; i++) {\n if (lanes[i] === null) return i;\n }\n return lanes.length;\n }\n\n function getColor(lane: number): string {\n const laneRef = laneBranchRefs[lane];\n const preferredColor = laneRef ? getBranchGraphColor(laneRef) : (laneColors[lane] ?? getLaneFallbackColor(lane));\n laneColors[lane] = preferredColor;\n return preferredColor;\n }\n\n commits.forEach((commit, index) => {\n const matchingLanes: number[] = [];\n for (let i = 0; i < lanes.length; i++) {\n if (lanes[i] === commit.hash) matchingLanes.push(i);\n }\n\n // 1. Identify which lane this commit belongs to.\n // It belongs to a lane if that lane is currently \"looking for\" this commit hash.\n let lane = matchingLanes.length > 0 ? matchingLanes[0] : -1;\n \n // If no lane is looking for me, I am a new tip (e.g. a branch head).\n if (lane === -1) {\n lane = getNextFreeLane();\n }\n \n // Ensure lanes array is large enough\n while (lanes.length <= lane) {\n lanes.push(null);\n laneBranchRefs.push(null);\n laneColors.push(undefined);\n }\n\n const preferredRef = choosePreferredRef(parseBranchRefs(commit.refs), localBranches);\n if (preferredRef) {\n const normalizedRef = normalizeRefForColor(preferredRef, localBranches);\n if (shouldReplaceLaneRef(normalizedRef, laneBranchRefs[lane], localBranches)) {\n laneBranchRefs[lane] = normalizedRef;\n }\n }\n \n // Update color for this lane if needed (though getNextFreeLane usually finds one)\n const color = getColor(lane);\n\n // 2. Prepare the Node\n const node: GraphNode = {\n ...commit,\n x: lane,\n y: index,\n color,\n paths: [],\n isMerge: commit.parents.length > 1\n };\n const duplicateMatchingLanes = matchingLanes.filter((i) => i !== lane);\n const duplicateLaneSet = new Set(duplicateMatchingLanes);\n\n // 3. Draw Vertical \"Rails\" for ALL other active lanes\n // These are connections from (lane, index) to (lane, index+1) \n // for branches that just \"pass through\" this row.\n for (let i = 0; i < lanes.length; i++) {\n if (i !== lane && lanes[i] !== null && !duplicateLaneSet.has(i)) {\n node.paths.push({\n x1: i, y1: index,\n x2: i, y2: index + 1,\n color: getColor(i),\n type: 'straight'\n });\n }\n }\n\n // 4. Process Parents & Update Lanes for next row\n // We are consuming 'lane' (it was pointing to us). \n // Now we need lanes to point to our parents.\n \n // Clear current lane (we reached the node)\n lanes[lane] = null;\n\n // If multiple lanes were targeting the same commit hash, keep them parallel\n // until this branch-out point and collapse them here.\n for (const duplicateLane of duplicateMatchingLanes) {\n // Replace the previous-row straight segment with a direct merge edge\n // into this commit, so we avoid a vertical+horizontal \"hook\" shape.\n if (index > 0) {\n const previousNode = nodes[nodes.length - 1];\n if (previousNode) {\n previousNode.paths = previousNode.paths.filter((path) => !(\n path.type === 'straight' &&\n path.x1 === duplicateLane &&\n path.y1 === index - 1 &&\n path.x2 === duplicateLane &&\n path.y2 === index\n ));\n }\n }\n\n node.paths.push({\n x1: duplicateLane,\n y1: index - 1,\n x2: lane,\n y2: index,\n color: getColor(duplicateLane),\n type: 'merge'\n });\n lanes[duplicateLane] = null;\n laneBranchRefs[duplicateLane] = null;\n laneColors[duplicateLane] = undefined;\n }\n \n const parents = commit.parents;\n \n if (parents.length > 0) {\n // Parent 0 takes the current lane (usually)\n const p0 = parents[0];\n\n // Always continue parent 0 in-place so sibling branches remain parallel\n // until the actual branch-out commit row.\n lanes[lane] = p0;\n node.paths.push({\n x1: lane, y1: index,\n x2: lane, y2: index + 1,\n color: color, \n type: 'straight'\n });\n \n // Other Parents (Merge Heads)\n // Other Parents (Merge Heads)\n for (let i = 1; i < parents.length; i++) {\n const p = parents[i];\n const existingPLane = lanes.indexOf(p);\n \n if (existingPLane !== -1) {\n // Merge to existing\n node.paths.push({\n x1: lane, y1: index,\n x2: existingPLane, y2: index + 1,\n color: getColor(existingPLane), \n type: 'fork'\n });\n } else {\n // New lane for this parent\n const newLane = getNextFreeLane();\n while (lanes.length <= newLane) {\n lanes.push(null);\n laneBranchRefs.push(null);\n laneColors.push(undefined);\n }\n \n lanes[newLane] = p;\n \n // Draw connection\n node.paths.push({\n x1: lane, y1: index,\n x2: newLane, y2: index + 1,\n color: getColor(newLane), \n type: 'fork'\n });\n }\n }\n \n }\n\n if (lanes[lane] === null) {\n laneBranchRefs[lane] = null;\n laneColors[lane] = undefined;\n }\n \n nodes.push(node);\n });\n \n return nodes;\n}\n","'use client';\n\nimport { useState, useEffect, useRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface ContextMenuItem {\n label: string;\n labelNode?: React.ReactNode;\n icon?: React.ReactNode;\n onClick?: () => void;\n danger?: boolean;\n children?: ContextMenuItem[];\n disabled?: boolean;\n}\n\nexport function ContextMenu({\n children,\n items,\n containerClassName = 'w-full',\n}: {\n children: React.ReactNode,\n items: ContextMenuItem[],\n containerClassName?: string\n}) {\n const [isOpen, setIsOpen] = useState(false);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const menuRef = useRef<HTMLUListElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handleContextMenu = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n \n // Calculate position relative to viewport\n const x = e.clientX;\n const y = e.clientY;\n \n setPosition({ x, y });\n setIsOpen(true);\n };\n\n // Close menu when clicking outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node) &&\n containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n // Use setTimeout to avoid immediate closure\n setTimeout(() => {\n document.addEventListener('click', handleClickOutside);\n document.addEventListener('contextmenu', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n }, 0);\n\n return () => {\n document.removeEventListener('click', handleClickOutside);\n document.removeEventListener('contextmenu', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [isOpen]);\n\n // Calculate menu width based on content and adjust position if menu would go off-screen\n useEffect(() => {\n if (!isOpen || !menuRef.current) return;\n\n const menu = menuRef.current;\n \n // Use requestAnimationFrame to ensure styles are applied\n requestAnimationFrame(() => {\n // Calculate optimal width based on content\n // Create a temporary element to measure text width\n const tempElement = document.createElement('div');\n tempElement.style.position = 'absolute';\n tempElement.style.visibility = 'hidden';\n tempElement.style.whiteSpace = 'nowrap';\n tempElement.style.pointerEvents = 'none';\n \n // Copy font styles from menu\n const menuStyles = window.getComputedStyle(menu);\n tempElement.style.fontSize = menuStyles.fontSize;\n tempElement.style.fontFamily = menuStyles.fontFamily;\n tempElement.style.fontWeight = menuStyles.fontWeight;\n tempElement.style.padding = '0.5rem 0.75rem'; // Match menu item padding\n tempElement.style.boxSizing = 'border-box';\n \n document.body.appendChild(tempElement);\n\n let maxWidth = 0;\n items.forEach(item => {\n tempElement.textContent = item.label;\n const width = tempElement.getBoundingClientRect().width;\n const iconWidth = item.icon ? 20 : 0;\n const submenuArrowWidth = item.children?.length ? 16 : 0;\n const totalWidth = width + iconWidth + submenuArrowWidth;\n if (totalWidth > maxWidth) {\n maxWidth = totalWidth;\n }\n });\n\n document.body.removeChild(tempElement);\n\n // Set menu width (add padding: 1rem on each side = 2rem total = 32px)\n const menuWidth = Math.max(maxWidth + 32, 280); // Minimum 280px, or content width + padding\n menu.style.width = `${menuWidth}px`;\n menu.style.minWidth = `${menuWidth}px`;\n\n // Now adjust position if menu would go off-screen\n const rect = menu.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let adjustedX = position.x;\n let adjustedY = position.y;\n\n // Adjust horizontal position if menu goes off right edge\n if (rect.right > viewportWidth) {\n adjustedX = viewportWidth - rect.width - 10;\n }\n // Adjust horizontal position if menu goes off left edge\n if (adjustedX < 10) {\n adjustedX = 10;\n }\n\n // Adjust vertical position if menu goes off bottom edge\n if (rect.bottom > viewportHeight) {\n adjustedY = viewportHeight - rect.height - 10;\n }\n // Adjust vertical position if menu goes off top edge\n if (adjustedY < 10) {\n adjustedY = 10;\n }\n\n if (adjustedX !== position.x || adjustedY !== position.y) {\n menu.style.left = `${adjustedX}px`;\n menu.style.top = `${adjustedY}px`;\n }\n });\n }, [isOpen, position, items]);\n\n const renderMenuItem = (item: ContextMenuItem, key: string) => {\n const hasChildren = !!item.children?.length;\n\n return (\n <li key={key} className={cn(hasChildren && \"relative group/submenu\")}>\n <a\n onClick={(e) => {\n e.stopPropagation();\n if (item.disabled || hasChildren) {\n return;\n }\n item.onClick?.();\n setIsOpen(false);\n }}\n className={cn(\n \"flex items-center gap-2\",\n \"whitespace-nowrap\",\n item.danger && \"text-error\",\n item.disabled && \"opacity-40 pointer-events-none\",\n hasChildren && \"flex items-center justify-between gap-3\"\n )}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n {item.icon && <span className=\"inline-flex shrink-0 opacity-80\">{item.icon}</span>}\n <span>{item.labelNode ?? item.label}</span>\n </span>\n {hasChildren && <i className=\"iconoir-nav-arrow-right text-[12px]\" aria-hidden=\"true\" />}\n </a>\n {hasChildren && (\n <>\n <span className=\"hidden group-hover/submenu:block absolute left-full top-0 h-full w-3\" />\n <ul className=\"hidden group-hover/submenu:block absolute left-[calc(100%-1px)] top-0 menu !m-0 p-2 shadow-lg bg-base-100 rounded-box border border-base-200 min-w-[220px] z-[10000] [&:before]:hidden\">\n {item.children!.map((child, idx) => renderMenuItem(child, `${key}-${idx}`))}\n </ul>\n </>\n )}\n </li>\n );\n };\n\n return (\n <div ref={containerRef} className={containerClassName} onContextMenu={handleContextMenu}>\n {children}\n {isOpen && (\n <ul\n ref={menuRef}\n className=\"fixed z-[9999] menu p-2 shadow-lg bg-base-100 rounded-box border border-base-200\"\n style={{\n left: `${position.x}px`,\n top: `${position.y}px`,\n }}\n >\n {items.map((item, idx) => renderMenuItem(item, `menu-${idx}`))}\n </ul>\n )}\n </div>\n );\n}\n","// Visibility state for branches/folders\nexport type VisibilityState = 'visible' | 'hidden' | null;\n\n// Map of path -> visibility state\nexport type VisibilityMap = Record<string, VisibilityState>;\n\n// Tree node type for branch hierarchy\nexport interface BranchTreeNode {\n name: string;\n fullPath?: string; // Only set for leaf nodes (actual branches)\n children: Map<string, BranchTreeNode>;\n}\n\n// Build tree structure from flat branch list\nexport function buildBranchTree(branches: string[], pathPrefix: string = ''): BranchTreeNode {\n const root: BranchTreeNode = { name: '', children: new Map() };\n\n for (const branch of branches) {\n const parts = branch.split('/');\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (!current.children.has(part)) {\n current.children.set(part, {\n name: part,\n children: new Map(),\n });\n }\n current = current.children.get(part)!;\n\n // If this is the last part, mark it as a leaf with full path\n if (i === parts.length - 1) {\n // Use the full path with prefix for remote branches\n current.fullPath = pathPrefix ? `${pathPrefix}/${branch}` : branch;\n }\n }\n }\n\n return root;\n}\n\n// Build tree structure for remote branches, grouped by remote name\nexport function buildRemoteBranchTree(remotes: Record<string, string[]>): Map<string, BranchTreeNode> {\n const result = new Map<string, BranchTreeNode>();\n \n for (const [remoteName, branches] of Object.entries(remotes)) {\n // Build tree for this remote's branches, with full ref path prefix\n result.set(remoteName, buildBranchTree(branches, `remotes/${remoteName}`));\n }\n \n return result;\n}\n\n// Get the effective visibility for a path (considering parent inheritance)\n// groupPath is used for checking group-level visibility (e.g., \"__local__\" or \"__remotes__\" or \"__remotes__/origin\")\nexport function getEffectiveVisibility(\n path: string,\n visibilityMap: VisibilityMap,\n groupPath?: string\n): VisibilityState {\n // Check if this path has explicit visibility\n if (visibilityMap[path]) {\n return visibilityMap[path];\n }\n\n // Check parent paths for inherited visibility\n const parts = path.split('/');\n for (let i = parts.length - 1; i > 0; i--) {\n const parentPath = parts.slice(0, i).join('/');\n if (visibilityMap[parentPath]) {\n return visibilityMap[parentPath];\n }\n }\n \n // Check group-level visibility\n if (groupPath) {\n // Check if any parent group has visibility set\n const groupParts = groupPath.split('/');\n for (let i = groupParts.length; i > 0; i--) {\n const parentGroupPath = groupParts.slice(0, i).join('/');\n if (visibilityMap[parentGroupPath]) {\n return visibilityMap[parentGroupPath];\n }\n }\n }\n\n return null;\n}\n\nexport function sortBranchTreeChildren(node: BranchTreeNode): BranchTreeNode[] {\n return Array.from(node.children.values()).sort((a, b) => {\n const aIsFolder = a.children.size > 0 && !a.fullPath;\n const bIsFolder = b.children.size > 0 && !b.fullPath;\n if (aIsFolder && !bIsFolder) return -1;\n if (!aIsFolder && bIsFolder) return 1;\n return a.name.localeCompare(b.name);\n });\n}\n\nexport function collectVisibleBranchRefs(\n node: BranchTreeNode,\n expandedFolders: Set<string>,\n parentPath = ''\n): string[] {\n const refs: string[] = [];\n const sortedChildren = sortBranchTreeChildren(node);\n\n for (const child of sortedChildren) {\n const isLeaf = child.fullPath !== undefined;\n if (isLeaf) {\n refs.push(child.fullPath!);\n continue;\n }\n\n const itemPath = parentPath ? `${parentPath}/${child.name}` : child.name;\n if (expandedFolders.has(itemPath)) {\n refs.push(...collectVisibleBranchRefs(child, expandedFolders, itemPath));\n }\n }\n\n return refs;\n}\n\nexport function collectAllBranchRefs(node: BranchTreeNode): string[] {\n const refs: string[] = [];\n const sortedChildren = sortBranchTreeChildren(node);\n\n for (const child of sortedChildren) {\n if (child.fullPath) {\n refs.push(child.fullPath);\n continue;\n }\n\n refs.push(...collectAllBranchRefs(child));\n }\n\n return refs;\n}\n","import { cn } from '@/lib/utils';\nimport React from 'react';\n\n// Visibility toggle button component\nexport function VisibilityToggle({\n type,\n isActive,\n isInherited,\n onClick,\n showOnHover,\n}: {\n type: 'visible' | 'hidden';\n isActive: boolean;\n isInherited: boolean;\n onClick: (e: React.MouseEvent) => void;\n showOnHover: boolean;\n}) {\n const title = type === 'visible' \n ? (isActive ? 'Remove visible filter' : 'Show only this branch')\n : (isActive ? 'Remove hide filter' : 'Hide this branch');\n\n return (\n <button\n className={cn(\n \"p-0.5 rounded hover:bg-base-300 transition-colors shrink-0 cursor-pointer text-xs\",\n isActive && \"bg-primary/10\",\n isInherited && \"opacity-50\",\n !isActive && !showOnHover && \"opacity-0 group-hover:opacity-100\"\n )}\n onClick={onClick}\n title={title}\n >\n {type === 'visible' ? <i className=\"iconoir-eye text-[14px]\" aria-hidden=\"true\" /> : <i className=\"iconoir-eye-closed text-[14px]\" aria-hidden=\"true\" />}\n </button>\n );\n}\n","import { cn } from '@/lib/utils';\nimport { VisibilityMap } from './branch-tree-utils';\nimport { VisibilityToggle } from './visibility-toggle';\n\nexport function GroupHeader({\n name,\n groupPath,\n icon,\n isExpanded,\n onToggle,\n visibilityMap,\n onToggleVisibility,\n depth = 0,\n}: {\n name: string;\n groupPath: string;\n icon: React.ReactNode;\n isExpanded: boolean;\n onToggle: () => void;\n visibilityMap: VisibilityMap;\n onToggleVisibility: (path: string, type: 'visible' | 'hidden') => void;\n depth?: number;\n}) {\n const directVisibility = visibilityMap[groupPath];\n // Check parent group visibility for inheritance\n const parentGroupPath = groupPath.includes('/') \n ? groupPath.split('/').slice(0, -1).join('/') \n : undefined;\n const parentVisibility = parentGroupPath ? visibilityMap[parentGroupPath] : null;\n const effectiveVisibility = directVisibility || parentVisibility;\n const isInherited = !directVisibility && parentVisibility !== null;\n \n return (\n <div\n className={cn(\n \"group flex items-center gap-1 px-2 py-1.5 text-sm rounded-md cursor-pointer hover:bg-base-200 transition-colors font-medium\",\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n >\n <div className=\"flex items-center gap-1.5 flex-1 min-w-0\" onClick={onToggle}>\n <span className=\"text-xs opacity-70\">{isExpanded ? '▼' : '▶'}</span>\n <span className=\"shrink-0\">{icon}</span>\n <span className=\"truncate min-w-0 flex-1\">{name}</span>\n </div>\n <div className=\"flex items-center gap-0.5 ml-auto\">\n <VisibilityToggle\n type=\"visible\"\n isActive={directVisibility === 'visible' || (isInherited && effectiveVisibility === 'visible')}\n isInherited={isInherited && effectiveVisibility === 'visible'}\n onClick={(e) => { e.stopPropagation(); onToggleVisibility(groupPath, 'visible'); }}\n showOnHover={directVisibility === 'visible' || (isInherited && effectiveVisibility === 'visible')}\n />\n <VisibilityToggle\n type=\"hidden\"\n isActive={directVisibility === 'hidden' || (isInherited && effectiveVisibility === 'hidden')}\n isInherited={isInherited && effectiveVisibility === 'hidden'}\n onClick={(e) => { e.stopPropagation(); onToggleVisibility(groupPath, 'hidden'); }}\n showOnHover={directVisibility === 'hidden' || (isInherited && effectiveVisibility === 'hidden')}\n />\n </div>\n </div>\n );\n}\n","import { ContextMenuItem } from '@/components/context-menu';\n\nexport type BranchOperation = { sourceBranch: string; targetBranch: string };\n\nexport interface BranchMenuCallbacks {\n onCheckout: (branch: string) => void;\n onCheckoutToLocal: (remoteBranch: string) => void;\n onCreateBranch: (sourceBranch: string) => void;\n onDeleteBranch: (branch: string) => void;\n onDeleteBranches: (branches: string[]) => void;\n onRenameBranch: (branch: string) => void;\n onRenameRemoteBranch: (branch: string) => void;\n onRebase: (operation: BranchOperation) => void;\n onMerge: (operation: BranchOperation) => void;\n onPushToRemote: (branch: string) => void;\n onPullFromRemote: (branch: string) => void;\n}\n\nexport interface BranchMenuOptions {\n branchRef: string;\n branchLeafName: string;\n currentBranch?: string;\n isRemote: boolean;\n selectedBranchRefs?: string[];\n}\n\nexport function buildBranchContextMenuItems(\n options: BranchMenuOptions,\n callbacks: BranchMenuCallbacks\n): ContextMenuItem[] {\n const { branchRef, branchLeafName, currentBranch, isRemote, selectedBranchRefs } = options;\n const isCurrent = !isRemote && branchRef === currentBranch;\n const selectedRefs = selectedBranchRefs && selectedBranchRefs.length > 0 ? selectedBranchRefs : [branchRef];\n const hasMultiSelection = selectedRefs.length > 1;\n const menuItems: ContextMenuItem[] = [];\n\n if (!isCurrent && !isRemote) {\n menuItems.push({\n label: 'Checkout',\n icon: <i className=\"iconoir-arrow-right text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onCheckout(branchRef),\n });\n }\n if (isRemote) {\n menuItems.push({\n label: 'Checkout to local',\n icon: <i className=\"iconoir-arrow-down text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onCheckoutToLocal(branchRef),\n });\n }\n menuItems.push({\n label: 'Create Branch',\n icon: <i className=\"iconoir-plus-circle text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onCreateBranch(branchRef),\n });\n if (!isRemote) {\n menuItems.push({\n label: 'Rename Branch',\n icon: <i className=\"iconoir-edit-pencil text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onRenameBranch(branchRef),\n });\n }\n if (isRemote) {\n menuItems.push({\n label: 'Rename branch',\n icon: <i className=\"iconoir-edit-pencil text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onRenameRemoteBranch(branchRef),\n });\n }\n if (!isRemote) {\n menuItems.push({\n label: 'Push to Remote',\n icon: <i className=\"iconoir-arrow-up text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onPushToRemote(branchRef),\n });\n }\n if (!isRemote) {\n menuItems.push({\n label: 'Pull from Remote',\n icon: <i className=\"iconoir-arrow-down text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onPullFromRemote(branchRef),\n });\n }\n if (!isCurrent && currentBranch) {\n menuItems.push({\n label: `Rebase ${currentBranch} onto ${branchLeafName}`,\n labelNode: <>Rebase <span className=\"font-bold\">{currentBranch}</span> onto {branchLeafName}</>,\n icon: <i className=\"iconoir-git-fork text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onRebase({ sourceBranch: currentBranch, targetBranch: branchRef }),\n });\n menuItems.push({\n label: `Rebase ${branchLeafName} onto ${currentBranch}`,\n labelNode: <>Rebase {branchLeafName} onto <span className=\"font-bold\">{currentBranch}</span></>,\n icon: <i className=\"iconoir-git-fork text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onRebase({ sourceBranch: branchRef, targetBranch: currentBranch }),\n });\n menuItems.push({\n label: `Merge ${currentBranch} into ${branchLeafName}`,\n labelNode: <>Merge <span className=\"font-bold\">{currentBranch}</span> into {branchLeafName}</>,\n icon: <i className=\"iconoir-git-fork text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onMerge({ sourceBranch: currentBranch, targetBranch: branchRef }),\n });\n menuItems.push({\n label: `Merge ${branchLeafName} into ${currentBranch}`,\n labelNode: <>Merge {branchLeafName} into <span className=\"font-bold\">{currentBranch}</span></>,\n icon: <i className=\"iconoir-git-fork text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onMerge({ sourceBranch: branchRef, targetBranch: currentBranch }),\n });\n }\n if (!isCurrent) {\n if (hasMultiSelection) {\n menuItems.push({\n label: `Delete Selected Branches (${selectedRefs.length})`,\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onDeleteBranches(selectedRefs),\n danger: true,\n });\n } else {\n menuItems.push({\n label: 'Delete Branch',\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => callbacks.onDeleteBranch(branchRef),\n danger: true,\n });\n }\n }\n\n return menuItems;\n}\n","import { cn } from '@/lib/utils';\nimport { ContextMenu, ContextMenuItem } from '@/components/context-menu';\nimport { BranchTreeNode, VisibilityMap, getEffectiveVisibility, collectAllBranchRefs } from './branch-tree-utils';\nimport { BranchOperation, BranchMenuOptions } from './branch-context-menu';\nimport { BranchTrackingInfo } from '@/lib/types';\nimport { VisibilityToggle } from './visibility-toggle';\n\nexport type BranchRowSelectModifiers = { isMultiSelect: boolean; isRangeSelect: boolean };\n\n// Recursive component to render branch tree\nexport function BranchTreeItem({\n node,\n currentBranch,\n expandedFolders,\n onToggleFolder,\n onCheckout,\n onCheckoutToLocal,\n onCreateBranch,\n onDeleteBranch,\n onRenameBranch,\n onRenameRemoteBranch,\n onRebase,\n onMerge,\n onPushToRemote,\n onPullFromRemote,\n getBranchContextMenuItems,\n onBranchClick,\n onBranchContextMenu,\n onDeleteBranchGroup,\n selectedBranches,\n visibilityMap,\n onToggleVisibility,\n parentPath = '',\n depth = 0,\n groupPath,\n isRemote = false,\n trackingInfo,\n}: {\n node: BranchTreeNode;\n currentBranch?: string;\n expandedFolders: Set<string>;\n onToggleFolder: (path: string) => void;\n onCheckout: (branch: string) => void;\n onCheckoutToLocal: (remoteBranch: string) => void;\n onCreateBranch: () => void;\n onDeleteBranch: (branch: string) => void;\n onRenameBranch: (branch: string) => void;\n onRenameRemoteBranch: (branch: string) => void;\n onRebase: (operation: BranchOperation) => void;\n onMerge: (operation: BranchOperation) => void;\n onPushToRemote: (branch: string) => void;\n onPullFromRemote: (branch: string) => void;\n getBranchContextMenuItems: (options: BranchMenuOptions) => ContextMenuItem[];\n onBranchClick?: (branch: string, modifiers?: BranchRowSelectModifiers) => void;\n onBranchContextMenu?: (branch: string) => void;\n onDeleteBranchGroup: (branches: string[]) => void;\n selectedBranches: Set<string>;\n visibilityMap: VisibilityMap;\n onToggleVisibility: (path: string, type: 'visible' | 'hidden') => void;\n parentPath?: string;\n depth?: number;\n groupPath?: string;\n isRemote?: boolean;\n trackingInfo?: Record<string, BranchTrackingInfo>;\n}) {\n const children = Array.from(node.children.values());\n const sortedChildren = children.sort((a, b) => {\n // Folders (non-leaf) come first, then alphabetical\n const aIsFolder = a.children.size > 0 && !a.fullPath;\n const bIsFolder = b.children.size > 0 && !b.fullPath;\n if (aIsFolder && !bIsFolder) return -1;\n if (!aIsFolder && bIsFolder) return 1;\n return a.name.localeCompare(b.name);\n });\n\n return (\n <>\n {sortedChildren.map((child) => {\n const isLeaf = child.fullPath !== undefined;\n const isFolder = child.children.size > 0 && !isLeaf;\n const itemPath = child.fullPath || (parentPath ? `${parentPath}/${child.name}` : child.name);\n const isExpanded = expandedFolders.has(itemPath);\n const isCurrent = isLeaf && child.fullPath === currentBranch;\n\n // Get visibility state for this item\n const directVisibility = visibilityMap[itemPath];\n const effectiveVisibility = getEffectiveVisibility(itemPath, visibilityMap, groupPath);\n const isInherited = !directVisibility && effectiveVisibility !== null;\n\n if (isFolder) {\n const childBranchRefs = collectAllBranchRefs(child);\n const deletableChildBranchRefs = childBranchRefs.filter((branchRef) => branchRef !== currentBranch);\n\n // Render folder\n return (\n <div key={itemPath}>\n <ContextMenu\n items={[\n {\n label: 'Delete',\n icon: <i className=\"iconoir-trash text-[14px]\" aria-hidden=\"true\" />,\n onClick: () => onDeleteBranchGroup(deletableChildBranchRefs),\n danger: true,\n disabled: deletableChildBranchRefs.length === 0,\n },\n ]}\n >\n <div\n className={cn(\n \"group flex items-center gap-1 px-2 py-1.5 text-sm rounded-md cursor-pointer hover:bg-base-200 transition-colors opacity-70 select-none\",\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n >\n <div className=\"flex items-center gap-1 flex-1 min-w-0\" onClick={() => onToggleFolder(itemPath)}>\n <span className=\"text-xs opacity-70\">{isExpanded ? '▼' : '▶'}</span>\n <i className=\"iconoir-folder text-[16px] shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate min-w-0 flex-1\">{child.name}</span>\n </div>\n <div className=\"flex items-center gap-0.5 ml-auto\">\n <VisibilityToggle\n type=\"visible\"\n isActive={directVisibility === 'visible' || (isInherited && effectiveVisibility === 'visible')}\n isInherited={isInherited && effectiveVisibility === 'visible'}\n onClick={(e) => { e.stopPropagation(); onToggleVisibility(itemPath, 'visible'); }}\n showOnHover={directVisibility === 'visible' || (isInherited && effectiveVisibility === 'visible')}\n />\n <VisibilityToggle\n type=\"hidden\"\n isActive={directVisibility === 'hidden' || (isInherited && effectiveVisibility === 'hidden')}\n isInherited={isInherited && effectiveVisibility === 'hidden'}\n onClick={(e) => { e.stopPropagation(); onToggleVisibility(itemPath, 'hidden'); }}\n showOnHover={directVisibility === 'hidden' || (isInherited && effectiveVisibility === 'hidden')}\n />\n </div>\n </div>\n </ContextMenu>\n {isExpanded && (\n <BranchTreeItem\n node={child}\n currentBranch={currentBranch}\n expandedFolders={expandedFolders}\n onToggleFolder={onToggleFolder}\n onCheckout={onCheckout}\n onCheckoutToLocal={onCheckoutToLocal}\n onCreateBranch={onCreateBranch}\n onDeleteBranch={onDeleteBranch}\n onRenameBranch={onRenameBranch}\n onRenameRemoteBranch={onRenameRemoteBranch}\n onRebase={onRebase}\n onMerge={onMerge}\n onPushToRemote={onPushToRemote}\n onPullFromRemote={onPullFromRemote}\n getBranchContextMenuItems={getBranchContextMenuItems}\n onBranchClick={onBranchClick}\n onBranchContextMenu={onBranchContextMenu}\n onDeleteBranchGroup={onDeleteBranchGroup}\n selectedBranches={selectedBranches}\n visibilityMap={visibilityMap}\n onToggleVisibility={onToggleVisibility}\n parentPath={itemPath}\n depth={depth + 1}\n groupPath={groupPath}\n isRemote={isRemote}\n trackingInfo={trackingInfo}\n />\n )}\n </div>\n );\n }\n\n // Render leaf (actual branch)\n const branchTracking = !isRemote && child.fullPath ? trackingInfo?.[child.fullPath] : undefined;\n const hasDivergence = branchTracking && (branchTracking.ahead > 0 || branchTracking.behind > 0);\n\n const menuItems = getBranchContextMenuItems({\n branchRef: child.fullPath!,\n branchLeafName: child.name,\n currentBranch,\n isRemote,\n selectedBranchRefs: selectedBranches.has(child.fullPath!) ? Array.from(selectedBranches) : [child.fullPath!],\n });\n const isSelected = selectedBranches.has(child.fullPath!);\n\n\n return (\n <ContextMenu key={child.fullPath} items={menuItems}>\n <div\n className={cn(\n \"group flex items-center gap-2 px-2 py-1.5 text-sm rounded-md cursor-pointer transition-colors select-none\",\n !isSelected && \"hover:bg-base-200\",\n isSelected && \"bg-primary/10 hover:bg-primary/20\",\n isCurrent && \"bg-base-200 font-medium text-primary\"\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onContextMenu={() => onBranchContextMenu?.(child.fullPath!)}\n >\n <div \n className=\"flex items-center gap-2 flex-1 min-w-0\" \n onClick={(e) => onBranchClick?.(child.fullPath!, { isMultiSelect: e.metaKey || e.ctrlKey, isRangeSelect: e.shiftKey })}\n onDoubleClick={() => !isCurrent && onCheckout(child.fullPath!)}\n >\n {isCurrent ? (\n <span className=\"w-3 h-3 flex items-center justify-center shrink-0\">\n <span className=\"w-2 h-2 rounded-full bg-primary\" />\n </span>\n ) : isRemote ? (\n <i className=\"iconoir-globe text-[14px] opacity-50 shrink-0\" aria-hidden=\"true\" />\n ) : (\n <i className=\"iconoir-git-branch text-[14px] opacity-50 shrink-0\" aria-hidden=\"true\" />\n )}\n <span className=\"truncate min-w-0 flex-1\" title={child.fullPath}>{child.name}</span>\n {hasDivergence && (\n <span \n className=\"flex items-center gap-1 text-xs opacity-70 shrink-0\"\n title={`${branchTracking.ahead} ahead, ${branchTracking.behind} behind ${branchTracking.upstream}`}\n >\n {branchTracking.ahead > 0 && (\n <span className=\"flex items-center gap-0.5 text-xs\">\n <i className=\"iconoir-arrow-up text-[12px]\" aria-hidden=\"true\" />\n <span>{branchTracking.ahead}</span>\n </span>\n )}\n {branchTracking.behind > 0 && (\n <span className=\"flex items-center gap-0.5 text-xs\">\n <i className=\"iconoir-arrow-down text-[12px]\" aria-hidden=\"true\" />\n <span>{branchTracking.behind}</span>\n </span>\n )}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-0.5 ml-auto\">\n <VisibilityToggle\n type=\"visible\"\n isActive={directVisibility === 'visible' || (isInherited && effectiveVisibility === 'visible')}\n isInherited={isInherited && effectiveVisibility === 'visible'}\n onClick={(e) => { e.stopPropagation(); onToggleVisibility(itemPath, 'visible'); }}\n showOnHover={directVisibility === 'visible' || (isInherited && effectiveVisibility === 'visible')}\n />\n <VisibilityToggle\n type=\"hidden\"\n isActive={directVisibility === 'hidden' || (isInherited && effectiveVisibility === 'hidden')}\n isInherited={isInherited && effectiveVisibility === 'hidden'}\n onClick={(e) => { e.stopPropagation(); onToggleVisibility(itemPath, 'hidden'); }}\n showOnHover={directVisibility === 'hidden' || (isInherited && effectiveVisibility === 'hidden')}\n />\n </div>\n </div>\n </ContextMenu>\n );\n })}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|