zen-gitsync 2.1.30 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +148 -147
- package/package.json +6 -1
- package/src/ui/public/assets/index-BPoaF8NL.js +44 -0
- package/src/ui/public/assets/index-C06RP6-q.css +1 -0
- package/src/ui/public/assets/vendor-CKXtUB8u.js +45 -0
- package/src/ui/public/index.html +3 -3
- package/src/ui/server/index.js +50 -19
- package/src/ui/public/assets/index-Dc7Szjov.js +0 -44
- package/src/ui/public/assets/index-DqW5X3i8.css +0 -1
- package/src/ui/public/assets/vendor-NGG1cSHQ.js +0 -45
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import{d as fs,r as d,o as ht,a as ps,E as i,l as Ws,c as ze,b as St,w as Ze,e as _,f,F as we,g as e,h as t,i as He,j as q,k as A,m as qt,u as o,n as a,p as vs,q as Wt,s as ms,t as je,v as gs,x as ys,y as dt,z as Tt,A as lt,B as qs,C as Yt,D as xt,G as y,H as hs,I as L,J as mt,K as ge,L as Be,M as _s,N as Vt,O as Ys,P as is,Q as rs,R as Xs,S as Rt,T as We,U as gt,V as Xt,W as Ie,X as Ks,Y as cs,Z as Kt,_ as Zs,$ as $t,a0 as Ht,a1 as It,a2 as jt,a3 as Ut,a4 as Zt,a5 as Dt,a6 as ws,a7 as Qs,a8 as ea,a9 as Qt,aa as ks,ab as ta,ac as $s,ad as bs,ae as sa,af as aa,ag as la,ah as Cs,ai as bt,aj as ut,ak as oa,al as na,am as ia,an as ra,ao as ca,ap as ua,aq as da,ar as fa,as as pa,at as va,au as ma,av as Ct,aw as ga,ax as ya,ay as ha,az as us,aA as ds,aB as _a,aC as Fe,aD as wa,aE as ka}from"./vendor-CKXtUB8u.js";(function(){const c=document.createElement("link").relList;if(c&&c.supports&&c.supports("modulepreload"))return;for(const g of document.querySelectorAll('link[rel="modulepreload"]'))v(g);new MutationObserver(g=>{for(const E of g)if(E.type==="childList")for(const G of E.addedNodes)G.tagName==="LINK"&&G.rel==="modulepreload"&&v(G)}).observe(document,{childList:!0,subtree:!0});function C(g){const E={};return g.integrity&&(E.integrity=g.integrity),g.referrerPolicy&&(E.referrerPolicy=g.referrerPolicy),g.crossOrigin==="use-credentials"?E.credentials="include":g.crossOrigin==="anonymous"?E.credentials="omit":E.credentials="same-origin",E}function v(g){if(g.ep)return;g.ep=!0;const E=C(g);fetch(g.href,E)}})();const Nt=800;function $a(){const ve="3002";return console.log(`从环境变量读取后端端口: ${ve}`),parseInt(ve,10)}const ba=$a(),yt=fs("git",()=>{const ve=d(""),c=d([]),C=d(""),v=d(""),g=d(!1),E=d(!1),G=d(!1),M=d(0),H=d(""),pe=d(!1),D=d(!1),Q=d(!1),ee=d(!1),oe=d(!1),W=d(0),me=d(0),Y=d(!1),S=d(""),x=d(0),F=d(0),X=d(!0),B=d(null),U=d([]),te=d({staged:[],unstaged:[],untracked:[]}),ce=d([]),$=d(!1),T=d(!1),N=d(!1),ie=d(!1),I=d(!1),se=d([]),ue=d(!1),V=d(!1),p=d(!1),P=d(!1);function j(){ve.value="",c.value=[],C.value="",v.value="",g.value=!1,E.value=!1,G.value=!1,M.value=0,W.value=0,me.value=0,Y.value=!1,S.value="",x.value=0,F.value=0,D.value=!1,Q.value=!1,ee.value=!1,oe.value=!1,H.value="",pe.value=!1,U.value=[],te.value={staged:[],unstaged:[],untracked:[]},ce.value=[],$.value=!1,T.value=!1,N.value=!1,ie.value=!1,I.value=!1}async function O(n=!1,l=!1){if(!G.value)return;const m=Date.now();if(!n&&!l&&m-x.value<3e4){console.log("使用缓存的分支状态");return}try{console.log("获取分支状态...");let h="/api/branch-status";const le=[];n&&le.push("force=true"),l&&le.push("countOnly=true"),le.length>0&&(h+="?"+le.join("&"));const he=await(await fetch(h)).json();he&&(W.value=he.ahead||0,me.value=he.behind||0,Y.value=he.hasUpstream||!1,S.value=he.upstreamBranch||"",x.value=m,console.log(`分支状态更新:领先 ${W.value} 个提交,落后 ${me.value} 个提交,上游分支:${Y.value?S.value:"无"}`))}catch(h){console.error("获取分支状态失败:",h),W.value=0,me.value=0,Y.value=!1,S.value=""}}async function ae(){const n=Date.now();if(n-M.value<1e3)return console.log("使用缓存的Git仓库状态:",G.value?"是":"不是"),G.value;try{const m=await(await fetch("/api/current_directory")).json();return G.value=m.isGitRepo===!0,M.value=n,console.log(`当前目录${G.value?"是":"不是"}Git仓库`),G.value}catch(l){return console.error("检查Git仓库状态失败:",l),G.value=!1,M.value=n,!1}}async function ke(n=!1){try{const h=await(await fetch(n?"/api/branch?force=true":"/api/branch")).json();h.branch&&(ve.value=h.branch,console.log(`当前分支更新为: ${h.branch}${n?" (强制刷新)":""}`))}catch(l){console.error("获取分支信息失败:",l)}}async function xe(){if(G.value)try{console.log("获取所有分支...");const l=await(await fetch("/api/branches")).json();l.branches&&Array.isArray(l.branches)&&(c.value=l.branches,F.value=Date.now(),console.log(`获取到${l.branches.length}个分支`))}catch(n){console.error("获取所有分支信息失败:",n)}}async function Ae(n){console.log("切换到分支:",n);try{g.value=!0;const m=await(await fetch("/api/checkout",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:n})})).json();return m.success?(i({message:`已切换到分支: ${n}`,type:"success"}),await ke(!0),await O(!0),!0):(i({message:`切换分支失败: ${m.error}`,type:"error"}),!1)}catch(l){return i({message:`切换分支失败: ${l.message}`,type:"error"}),!1}finally{g.value=!1}}async function Ee(){try{const l=await(await fetch("/api/user-info")).json();l.name&&l.email&&(C.value=l.name,v.value=l.email)}catch(n){console.error("获取用户信息失败:",n)}}async function w(n,l){if(!n.trim())return i({message:"分支名称不能为空",type:"warning"}),!1;try{E.value=!0;const h=await(await fetch("/api/create-branch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({newBranchName:n,baseBranch:l||ve.value})})).json();return h.success?(i({message:`已创建并切换到分支: ${n}`,type:"success"}),await ke(!0),await O(!0),await xe(),!0):(i({message:`创建分支失败: ${h.error}`,type:"error"}),!1)}catch(m){return i({message:`创建分支失败: ${m.message}`,type:"error"}),!1}finally{E.value=!1}}async function re(){try{const l=await(await fetch("/api/clear-user-config",{method:"POST"})).json();return l.success?(C.value="",v.value="",i({message:"已清除Git用户配置",type:"success"}),!0):(i({message:`清除配置失败: ${l.error}`,type:"error"}),!1)}catch(n){return i({message:`清除配置失败: ${n.message}`,type:"error"}),!1}}async function Ye(n,l){try{const h=await(await fetch("/api/restore-user-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:n,email:l})})).json();return h.success?(C.value=n,v.value=l,i({message:"已恢复Git用户配置",type:"success"}),!0):(i({message:`恢复配置失败: ${h.error}`,type:"error"}),!1)}catch(m){return i({message:`恢复配置失败: ${m.message}`,type:"error"}),!1}}async function _e(){if(!G.value)return i({message:"当前目录不是Git仓库",type:"warning"}),!1;try{Q.value=!0;const l=await(await fetch("/api/pull",{method:"POST"})).json();return l.success?(i({message:"拉取成功",type:"success"}),await O(),!0):(l.needsMerge?i({message:`需要合并更改: ${l.pullOutput||"存在冲突需要手动解决"}`,type:"warning",duration:5e3}):i({message:`拉取失败: ${l.error}`,type:"error"}),!1)}catch(n){return i({message:`拉取失败: ${n.message}`,type:"error"}),!1}finally{Q.value=!1}}async function Ue(){if(!G.value)return i({message:"当前目录不是Git仓库",type:"warning"}),!1;try{ee.value=!0;const l=await(await fetch("/api/fetch-all",{method:"POST"})).json();return l.success?(i({message:"获取所有远程分支信息成功",type:"success"}),await O(),!0):(i({message:`获取远程分支信息失败: ${l.error}`,type:"error"}),!1)}catch(n){return i({message:`获取远程分支信息失败: ${n.message}`,type:"error"}),!1}finally{ee.value=!1}}function Me(){B.value&&B.value.disconnect();try{const n=`http://localhost:${ba}`;if(console.log("尝试连接Socket.IO服务器:",n),B.value=Ws(n,{reconnectionDelayMax:1e4,reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1e3,timeout:2e4,autoConnect:!0,forceNew:!0,transports:["websocket","polling"]}),!B.value){console.error("Socket.IO初始化失败: socket为null");return}console.log("Socket.IO初始化成功,socket ID:",B.value.id||"未连接"),B.value.on("connect",()=>{console.log("成功连接到Socket.IO服务器"),X.value&&B.value&&B.value.emit("start_monitoring")}),B.value.on("disconnect",l=>{console.log("与Socket.IO服务器断开连接:",l)}),B.value.on("git_status_update",l=>{X.value&&(console.log("收到Git状态更新通知:",new Date().toLocaleTimeString()),l.porcelain!==void 0&&de(l.porcelain))}),B.value.on("monitoring_status",l=>{console.log("文件监控状态:",l.active?"已启动":"已停止")}),B.value.on("connect_error",l=>{console.error("Socket连接错误:",l.message)}),B.value.on("connect_timeout",()=>{console.error("Socket连接超时")}),B.value.on("reconnect",l=>{var m;console.log(`Socket重连成功,尝试次数: ${l}`),X.value&&(console.log("重连后重新发送start_monitoring请求"),(m=B.value)==null||m.emit("start_monitoring"))}),B.value.on("reconnect_attempt",l=>{console.log(`Socket尝试重连,第 ${l} 次尝试`)}),B.value.on("reconnect_error",l=>{console.error("Socket重连错误:",l.message)}),B.value.on("reconnect_failed",()=>{console.error("Socket重连失败,已达到最大重试次数")}),B.value&&!B.value.connected&&(console.log("Socket未连接,尝试手动连接..."),B.value.connect())}catch(n){console.error("Socket.IO连接初始化失败:",n)}}function Re(){if(console.log("toggleAutoUpdate调用,当前值:",X.value),!B.value){console.error("无法切换自动更新状态: socket连接不存在"),i.error("无法连接到服务器,自动更新可能不会生效"),console.log("尝试重新建立socket连接..."),Me(),localStorage.setItem("zen-gitsync-auto-update",X.value.toString());return}try{X.value?(console.log("发送start_monitoring命令..."),B.value.emit("start_monitoring"),i.success("自动更新已启用")):(console.log("发送stop_monitoring命令..."),B.value.emit("stop_monitoring"),i.info("自动更新已禁用")),localStorage.setItem("zen-gitsync-auto-update",X.value.toString()),console.log("已保存自动更新设置到本地存储:",X.value)}catch(n){console.error("切换自动更新状态时出错:",n),i.error(`切换自动更新失败: ${n.message}`)}}function de(n){if(n===void 0||n===""){ce.value=[];return}const l=n.split(`
|
|
2
|
+
`),m=[];for(const h of l){const le=h.match(/^([ MADRCU\?]{2})\s+(.+)$/);if(le){let ne="";const he=le[1],R=he.charAt(0),Ge=he.charAt(1);R==="A"||R==="M"||R==="D"||R==="R"?ne="added":R===" "&&Ge==="M"?ne="modified":R===" "&&Ge==="D"?ne="deleted":he==="??"?ne="untracked":ne="other",m.push({path:le[2],type:ne})}}ce.value=m}async function Ne(n=!0){if(!G.value){console.log("当前目录不是Git仓库,跳过加载提交历史");return}try{$.value=!0,console.log("开始加载提交历史...");const l=new Date().getTime(),h=await(await fetch(`/api/log?page=1&_t=${l}`)).json();h&&h.data&&Array.isArray(h.data)?(U.value=[...h.data],console.log(`提交历史加载完成,共 ${U.value.length} 条记录`)):(console.warn("API返回的提交历史格式不正确:",h),U.value=[])}catch(l){console.error("获取提交历史失败:",l),n&&i({message:`获取提交历史失败: ${l.message}`,type:"error"})}finally{$.value=!1}}async function k(){if(!G.value){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{T.value=!0,await r()}catch(n){console.error("获取Git状态失败:",n),i({message:`获取Git状态失败: ${n.message}`,type:"error"})}finally{T.value=!1}}async function r(){if(console.log("开始获取Git状态(porcelain格式)..."),!G.value){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{const l=await(await fetch("/api/status_porcelain")).json();l.status!==void 0?de(l.status):ce.value=[]}catch(n){console.error("获取Git状态(porcelain)失败:",n),i({message:`获取Git状态(porcelain)失败: ${n.message}`,type:"error"}),ce.value=[]}}async function K(){if(!G.value)return i.warning("当前目录不是Git仓库"),!1;try{N.value=!0;const l=await(await fetch("/api/add",{method:"POST"})).json();return l.success?(i({message:"文件已添加到暂存区",type:"success"}),!0):(i({message:`添加文件失败: ${l.error}`,type:"error"}),!1)}catch(n){return i({message:`添加文件失败: ${n.message}`,type:"error"}),!1}finally{N.value=!1}}async function J(n){if(!G.value)return i.warning("当前目录不是Git仓库"),!1;try{N.value=!0;const m=await(await fetch("/api/add-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:n})})).json();return m.success?(i({message:"文件已暂存",type:"success"}),k(),!0):(i({message:`暂存文件失败: ${m.error}`,type:"error"}),!1)}catch(l){return i({message:`暂存文件失败: ${l.message}`,type:"error"}),!1}finally{N.value=!1}}async function be(n){if(!G.value)return i.warning("当前目录不是Git仓库"),!1;try{I.value=!0;const m=await(await fetch("/api/unstage-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:n})})).json();return m.success?(i({message:"已取消暂存文件",type:"success"}),k(),!0):(i({message:`取消暂存失败: ${m.error}`,type:"error"}),!1)}catch(l){return i({message:`取消暂存失败: ${l.message}`,type:"error"}),!1}finally{I.value=!1}}function Ve(n){return new Promise(l=>setTimeout(l,n))}async function fe(n,l=!1){if(!G.value)return i.warning("当前目录不是Git仓库"),!1;try{ie.value=!0;const h=await(await fetch("/api/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:n,hasNewlines:n.includes(`
|
|
3
|
+
`),noVerify:l})})).json();return h.success?(i({message:"提交成功",type:"success"}),!0):(i({message:`commitChanges 提交失败: ${h.error}`,type:"error"}),!1)}catch(m){return i({message:`提交失败: ${m.message}`,type:"error"}),!1}finally{ie.value=!1}}async function ye(){if(!G.value)return i.warning("当前目录不是Git仓库"),!1;try{D.value=!0;const l=await(await fetch("/api/push",{method:"POST"})).json();return l.success?(i({message:"推送成功",type:"success"}),W.value=0,me.value=0,await Promise.all([k(),Ne()]),console.log("推送成功,分支状态已设置为同步 (ahead=0, behind=0)"),!0):(i({message:`推送失败: ${l.error}`,type:"error"}),!1)}catch(n){return i({message:`推送失败: ${n.message}`,type:"error"}),!1}finally{D.value=!1}}async function De(n,l={}){if(!G.value)return i({message:"当前目录不是Git仓库",type:"warning"}),!1;if(!n)return i({message:"请选择要合并的分支",type:"warning"}),!1;if(n===ve.value)return i({message:"不能合并当前分支到自身",type:"warning"}),!1;try{oe.value=!0;const m=await fetch("/api/merge",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:n,...l})}),h=await m.json();return m.status===409?(i({message:"合并分支时发生冲突,请手动解决",type:"warning",duration:5e3}),!1):h.success?(i({message:`成功合并分支 ${n} 到 ${ve.value}`,type:"success"}),await k(),await O(),!0):(i({message:`合并分支失败: ${h.error}`,type:"error"}),!1)}catch(m){return i({message:`合并分支失败: ${m.message}`,type:"error"}),!1}finally{oe.value=!1}}async function Ce(n,l=!1){if(console.log("开始暂存并提交操作..."),!await K())return!1;console.log("暂存完成,等待Git操作完成..."),await Ve(Nt),console.log("开始提交更改...");const h=await fe(n,l);return console.log("暂存并提交操作完成"),h}async function $e(n,l=!1){try{if(console.log("开始暂存文件..."),!await K()||(console.log("暂存完成,等待Git操作完成..."),await Ve(Nt),console.log("开始提交更改..."),!await fe(n,l)))return!1;console.log("提交完成,等待Git操作完成..."),await Ve(Nt),console.log("开始推送到远程...");const le=await ye();return console.log("一键推送操作完成,状态已统一刷新"),le}catch(m){console.error("一键推送操作失败:",m);try{(await(await fetch("/api/remove-lock",{method:"POST"})).json()).success&&i({message:"检测到Git锁定文件冲突,已自动清理,请重试操作",type:"warning"})}catch(h){console.error("清理锁定文件失败:",h)}i({message:`操作失败: ${m.message}`,type:"error"});try{await Promise.all([k(),Ne(),O()])}catch(h){console.error("刷新状态失败:",h)}return!1}}async function ot(){if(!G.value)return i.warning("当前目录不是Git仓库"),!1;try{I.value=!0;const l=await(await fetch("/api/reset-head",{method:"POST"})).json();return l.success?(i({message:"已重置暂存区",type:"success"}),k(),!0):(i({message:`重置暂存区失败: ${l.error}`,type:"error"}),!1)}catch(n){return i({message:`重置暂存区失败: ${n.message}`,type:"error"}),!1}finally{I.value=!1}}async function Qe(n){if(!G.value)return i.warning("当前目录不是Git仓库"),!1;try{I.value=!0;const m=await(await fetch("/api/reset-to-remote",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:n})})).json();return m.success?(i({message:`已重置分支 ${n} 到远程状态`,type:"success"}),k(),Ne(),!0):(i({message:`重置分支失败: ${m.error}`,type:"error"}),!1)}catch(l){return i({message:`重置分支失败: ${l.message}`,type:"error"}),!1}finally{I.value=!1}}async function Z(){if(G.value)try{pe.value=!0,console.log("获取远程仓库地址...");const l=await(await fetch("/api/remote-url")).json();l.success?(H.value=l.url||"",console.log(`获取到远程仓库地址: ${H.value}`)):(console.warn("获取远程仓库地址失败:",l.error),H.value="")}catch(n){console.error("获取远程仓库地址失败:",n),H.value=""}finally{pe.value=!1}}async function nt(){if(!H.value)return i({message:"没有可复制的远程仓库地址",type:"warning"}),!1;try{return await navigator.clipboard.writeText(H.value),i({message:"已复制远程仓库地址",type:"success"}),!0}catch(n){return console.error("复制远程仓库地址失败:",n),i({message:`复制失败: ${n.message}`,type:"error"}),!1}}ht(()=>{const n=localStorage.getItem("zen-gitsync-auto-update");n!==null&&(X.value=n==="true"),Me()});function Xe(){B.value&&(B.value.disconnect(),B.value=null)}ps(()=>{Xe()});async function qe(){if(!G.value)return i.warning("当前目录不是Git仓库"),[];try{ue.value=!0;const l=await(await fetch("/api/stash-list")).json();return l.success?(se.value=l.stashes,l.stashes):(i.error(`获取stash列表失败: ${l.error}`),[])}catch(n){return console.error("获取stash列表失败:",n),i.error(`获取stash列表失败: ${n.message}`),[]}finally{ue.value=!1}}async function et(n,l=!1,m=!0){if(!G.value)return i.warning("当前目录不是Git仓库"),!1;try{P.value=!0;const le=await(await fetch("/api/stash-save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:n,includeUntracked:l,excludeLocked:m})})).json();return le.success?(i.success(le.message),await qe(),await k(),!0):(i.warning(le.message),!1)}catch(h){return console.error("保存stash失败:",h),i.error(`保存stash失败: ${h.message}`),!1}finally{P.value=!1}}async function Ke(n,l=!1){if(!G.value)return i.warning("当前目录不是Git仓库"),!1;try{V.value=!0;const m=await fetch("/api/stash-apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({stashId:n,pop:l})}),h=await m.json();return m.status===409?(i.warning("应用stash时发生冲突,请手动解决"),!1):h.success?(i.success(h.message),await qe(),await k(),!0):(i.error(`应用stash失败: ${h.error}`),!1)}catch(m){return console.error("应用stash失败:",m),i.error(`应用stash失败: ${m.message}`),!1}finally{V.value=!1}}async function Pe(n){if(!G.value)return i.warning("当前目录不是Git仓库"),!1;try{p.value=!0;const m=await(await fetch("/api/stash-drop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({stashId:n})})).json();return m.success?(i.success(m.message),await qe(),!0):(i.error(`删除stash失败: ${m.error}`),!1)}catch(l){return console.error("删除stash失败:",l),i.error(`删除stash失败: ${l.message}`),!1}finally{p.value=!1}}async function _t(){if(!G.value)return i.warning("当前目录不是Git仓库"),!1;try{p.value=!0;const l=await(await fetch("/api/stash-clear",{method:"POST"})).json();return l.success?(i.success(l.message),se.value=[],!0):(i.error(`清空stash失败: ${l.error}`),!1)}catch(n){return console.error("清空stash失败:",n),i.error(`清空stash失败: ${n.message}`),!1}finally{p.value=!1}}return{currentBranch:ve,allBranches:c,userName:C,userEmail:v,isChangingBranch:g,isCreatingBranch:E,isGitRepo:G,lastCheckedTime:M,branchAhead:W,branchBehind:me,hasUpstream:Y,upstreamBranch:S,lastBranchStatusTime:x,lastBranchesTime:F,remoteUrl:H,isLoadingRemoteUrl:pe,stashes:se,isLoadingStashes:ue,isApplyingStash:V,isDroppingStash:p,isSavingStash:P,log:U,status:te,fileList:ce,isLoadingLog:$,isLoadingStatus:T,isAddingFiles:N,isCommiting:ie,isResetting:I,autoUpdateEnabled:X,isPushing:D,isGitPulling:Q,isGitFetching:ee,isGitMerging:oe,$reset:j,checkGitRepo:ae,getCurrentBranch:ke,getAllBranches:xe,changeBranch:Ae,getUserInfo:Ee,createBranch:w,clearUserConfig:re,restoreUserConfig:Ye,getBranchStatus:O,gitPull:_e,gitFetchAll:Ue,initSocketConnection:Me,toggleAutoUpdate:Re,parseStatusPorcelain:de,fetchLog:Ne,fetchStatus:k,fetchStatusPorcelain:r,addToStage:K,addFileToStage:J,unstageFile:be,commitChanges:fe,pushToRemote:ye,addAndCommit:Ce,addCommitAndPush:$e,resetHead:ot,resetToRemote:Qe,getRemoteUrl:Z,copyRemoteUrl:nt,mergeBranch:De,getStashList:qe,saveStash:et,applyStash:Ke,dropStash:Pe,clearAllStashes:_t,socket:B,disconnectSocket:Xe}}),es=fs("config",()=>{const ve=d(""),c=d([]),C=d([]),v=d([]),g=d([]),E=d(!1),G=d(!1),M=ze(()=>({defaultCommitMessage:ve.value,descriptionTemplates:c.value,scopeTemplates:C.value,messageTemplates:v.value,lockedFiles:g.value}));async function H(){if(G.value&&!E.value)return console.log("使用缓存的配置信息"),M.value;try{E.value=!0,console.log("加载配置信息...");const x=await(await fetch("/api/config/getConfig")).json();return ve.value=x.defaultCommitMessage||"",c.value=x.descriptionTemplates||[],C.value=x.scopeTemplates||[],v.value=x.messageTemplates||[],g.value=x.lockedFiles||[],G.value=!0,console.log("配置信息加载完成"),M.value}catch(S){return console.error("加载配置失败:",S),i.error(`加载配置失败: ${S.message}`),null}finally{E.value=!1}}async function pe(S){try{const F=await(await fetch("/api/config/saveDefaultMessage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({defaultCommitMessage:S})})).json();return F.success?(ve.value=S,i.success("默认提交信息已保存"),!0):(i.error(`保存失败: ${F.error}`),!1)}catch(x){return i.error(`保存失败: ${x.message}`),!1}}async function D(S,x){try{const X=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:S,type:x})})).json();return X.success?(x==="description"?c.value.includes(S)||c.value.push(S):x==="scope"?C.value.includes(S)||C.value.push(S):x==="message"&&(v.value.includes(S)||v.value.push(S)),i.success("模板已保存"),!0):(i.error(`保存模板失败: ${X.error}`),!1)}catch(F){return i.error(`保存模板失败: ${F.message}`),!1}}async function Q(S,x){try{const X=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:S,type:x})})).json();return X.success?(x==="description"?c.value=c.value.filter(B=>B!==S):x==="scope"?C.value=C.value.filter(B=>B!==S):x==="message"&&(v.value=v.value.filter(B=>B!==S)),i.success("模板已删除"),!0):(i.error(`删除模板失败: ${X.error}`),!1)}catch(F){return i.error(`删除模板失败: ${F.message}`),!1}}async function ee(S,x,F){try{const B=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:S,newTemplate:x,type:F})})).json();if(B.success){if(F==="description"){const U=c.value.indexOf(S);U!==-1&&(c.value[U]=x)}else if(F==="scope"){const U=C.value.indexOf(S);U!==-1&&(C.value[U]=x)}else if(F==="message"){const U=v.value.indexOf(S);U!==-1&&(v.value[U]=x)}return i.success("模板已更新"),!0}else return i.error(`更新模板失败: ${B.error}`),!1}catch(X){return i.error(`更新模板失败: ${X.message}`),!1}}async function oe(){try{const x=await(await fetch("/api/locked-files")).json();return x.success?(g.value=x.lockedFiles||[],x.lockedFiles):(i.error(`加载锁定文件列表失败: ${x.error}`),[])}catch(S){return console.error("加载锁定文件列表失败:",S),i.error(`加载锁定文件列表失败: ${S.message}`),[]}}async function W(S){try{const F=await(await fetch("/api/lock-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:S})})).json();return F.success?(await oe(),i.success(`文件已锁定: ${S}`),!0):(i.error(`锁定文件失败: ${F.error}`),!1)}catch(x){return console.error("锁定文件失败:",x),i.error(`锁定文件失败: ${x.message}`),!1}}async function me(S){try{const F=await(await fetch("/api/unlock-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:S})})).json();return F.success?(await oe(),i.success(`文件已解锁: ${S}`),!0):(i.error(`解锁文件失败: ${F.error}`),!1)}catch(x){return console.error("解锁文件失败:",x),i.error(`解锁文件失败: ${x.message}`),!1}}async function Y(S){try{const F=await(await fetch("/api/check-file-lock",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:S})})).json();return F.success?F.isLocked:(console.error("检查文件锁定状态失败:",F.error),!1)}catch(x){return console.error("检查文件锁定状态失败:",x),!1}}return{defaultCommitMessage:ve,descriptionTemplates:c,scopeTemplates:C,messageTemplates:v,lockedFiles:g,isLoading:E,isLoaded:G,config:M,loadConfig:H,saveDefaultMessage:pe,saveTemplate:D,deleteTemplate:Q,updateTemplate:ee,loadLockedFiles:oe,lockFile:W,unlockFile:me,isFileLocked:Y}}),Ca={class:"card"},Sa={class:"status-header"},Ta={class:"header-actions"},xa=["element-loading-text"],Va={key:0,class:"status-box"},La={key:1,class:"status-box-wrap"},za={key:0,class:"branch-status-info"},Ba={class:"branch-sync-status"},Ga={class:"sync-status-content"},Ra={class:"status-badges"},Da={class:"badge-content"},Fa={class:"badge-content"},ja={key:1,class:"file-list-container"},Ua={key:0,class:"file-group"},Ma={class:"file-list"},Oa=["onClick"],Aa={class:"file-info"},Ea={class:"file-name-section"},Pa=["title"],Ha={class:"file-directory"},Ia={class:"file-actions"},Na={key:1,class:"file-group"},Ja={class:"file-list"},Wa=["onClick"],qa={class:"file-info"},Ya={class:"file-name-section"},Xa=["title"],Ka={class:"file-directory"},Za={class:"file-actions"},Qa={key:2,class:"file-group"},el={class:"file-list"},tl=["onClick"],sl={class:"file-info"},al={class:"file-name-section"},ll=["title"],ol={class:"file-directory"},nl={class:"file-actions"},il={key:2,class:"empty-status"},rl={class:"empty-icon"},cl={class:"diff-content"},ul=["innerHTML"],dl={key:1,class:"no-diff"},fl={class:"file-navigation"},pl={class:"file-counter"},vl={class:"lock-feature-description"},ml={class:"description-header"},gl={key:0,class:"empty-locked-files"},yl={class:"empty-icon"},hl={key:1,class:"locked-files-list"},_l={class:"locked-files-header"},wl={class:"locked-file-items"},kl={class:"file-info"},$l={class:"file-path-container"},bl={class:"file-name"},Cl={class:"file-directory"},Sl={class:"file-actions"},Tl={class:"dialog-footer"},xl=St({__name:"GitStatus",props:{initialDirectory:{type:String,default:""}},setup(ve,{expose:c}){const C=ve,v=yt(),g=es(),E=ze(()=>v.isLoadingStatus),G=d(""),M=d(""),H=d(!1),pe=d(!1),D=d(-1),Q=d(!1),ee=d({staged:!1,unstaged:!1,untracked:!1}),oe=d(C.initialDirectory||"");async function W(){try{if(!oe.value){const p=await(await fetch("/api/current_directory")).json();oe.value=p.directory||"未知目录"}if(!v.isGitRepo)return;await v.fetchStatus(),await v.getBranchStatus(),i({message:"Git 状态已刷新",type:"success"})}catch(V){i({message:"刷新失败: "+V.message,type:"error"})}}function me(V){if(!V)return"";const p=V.split(`
|
|
4
|
+
`);function P(j){return j.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}return p.map(j=>{const O=P(j);return j.startsWith("diff --git")?`<div class="diff-header">${O}</div>`:j.startsWith("---")?`<div class="diff-old-file">${O}</div>`:j.startsWith("+++")?`<div class="diff-new-file">${O}</div>`:j.startsWith("@@")?`<div class="diff-hunk-header">${O}</div>`:j.startsWith("+")?`<div class="diff-added">${O}</div>`:j.startsWith("-")?`<div class="diff-removed">${O}</div>`:`<div class="diff-context">${O}</div>`}).join("")}async function Y(V){try{pe.value=!0,G.value=V,D.value=v.fileList.findIndex(P=>P.path===V);const p=v.fileList[D.value];if(p&&p.type==="untracked"){try{const j=await(await fetch(`/api/file-content?file=${encodeURIComponent(V)}`)).json();j.success&&j.content?M.value=`diff --git a/${V} b/${V}
|
|
5
|
+
新文件: ${V}
|
|
6
|
+
--- /dev/null
|
|
7
|
+
+++ b/${V}
|
|
8
|
+
@@ -0,0 +1,${j.content.split(`
|
|
9
|
+
`).length} @@
|
|
10
|
+
`+j.content.split(`
|
|
11
|
+
`).map(O=>`+${O}`).join(`
|
|
12
|
+
`):M.value=`这是一个新文件,尚未被Git跟踪。
|
|
13
|
+
添加到暂存区后可以提交该文件。`}catch(P){console.error("获取未跟踪文件内容失败:",P),M.value=`这是一个新文件,尚未被Git跟踪。
|
|
14
|
+
添加到暂存区后可以提交该文件。`}H.value=!0}else if(p&&p.type==="added"){const j=await(await fetch(`/api/diff-cached?file=${encodeURIComponent(V)}`)).json();M.value=j.diff||"没有变更",H.value=!0}else{const j=await(await fetch(`/api/diff?file=${encodeURIComponent(V)}`)).json();M.value=j.diff||"没有变更",H.value=!0}}catch(p){i({message:"获取文件差异失败: "+p.message,type:"error"}),M.value="获取差异失败: "+p.message}finally{pe.value=!1}}async function S(){if(v.fileList.length===0||D.value<=0)return;const V=D.value-1,p=v.fileList[V];await Y(p.path)}async function x(){if(v.fileList.length===0||D.value>=v.fileList.length-1)return;const V=D.value+1,p=v.fileList[V];await Y(p.path)}function F(V){Y(V.path)}async function X(V){await v.addFileToStage(V)}async function B(V){await v.unstageFile(V)}async function U(){await te()}async function te(){try{if(!v.isGitRepo)return;await v.fetchStatus(),i({message:"Git 文件状态已刷新",type:"success"})}catch(V){i({message:"刷新失败: "+V.message,type:"error"})}}async function ce(){try{await v.gitPull(),await W()}catch(V){console.error("拉取操作发生错误:",V)}}async function $(){try{await v.gitFetchAll(),await W()}catch(V){console.error("获取远程分支信息操作发生错误:",V)}}async function T(V){try{await Ie.confirm(`确定要撤回文件 "${V}" 的所有修改吗?此操作无法撤销。`,"撤回修改",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const P=await(await fetch("/api/revert_file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:V})})).json();P.success?(i.success("已撤回文件修改"),await W()):i.error(P.error?`撤回失败: ${P.error}`:"撤回文件修改失败,请重试")}catch(p){if(p==="cancel"||p.message==="cancel")return;const P=p.message||"未知错误";P!=="undefined"?i.error(`撤回文件修改失败: ${P}`):i.error("撤回文件修改失败,请重试")}}function N(V){const p=V.split("/");return p[p.length-1]}function ie(V){const p=V.split("/");return p.length<=1?"":p.slice(0,-1).join("/")}function I(V){const p=V.replace(/\\/g,"/"),P=g.lockedFiles.some(j=>{const O=j.replace(/\\/g,"/");return p===O});return(V==="test/2.txt"||V==="2.txt")&&console.log("检查文件锁定状态:",{filePath:V,normalizedPath:p,lockedFiles:g.lockedFiles,normalizedLockedFiles:g.lockedFiles.map(j=>j.replace(/\\/g,"/")),isLocked:P}),P}function se(V){I(V)?g.unlockFile(V):g.lockFile(V)}function ue(V){ee.value[V]=!ee.value[V]}return ht(()=>{W(),g.loadConfig(),g.loadLockedFiles()}),Ze(()=>v.autoUpdateEnabled,(V,p)=>{console.log(`自动更新状态变更: ${p} -> ${V}`),v.toggleAutoUpdate()},{immediate:!1}),c({refreshStatus:U}),(V,p)=>{const P=vs,j=qt,O=je,ae=Tt,ke=xt,xe=Vt,Ae=Xs,Ee=Yt;return f(),_(we,null,[e("div",Ca,[e("div",Sa,[p[8]||(p[8]=e("h2",null,"Git 状态",-1)),e("div",Ta,[t(j,{content:o(v).autoUpdateEnabled?"禁用自动更新文件状态":"启用自动更新文件状态",placement:"top","hide-after":1e3},{default:a(()=>[t(P,{modelValue:o(v).autoUpdateEnabled,"onUpdate:modelValue":p[0]||(p[0]=w=>o(v).autoUpdateEnabled=w),style:{"--el-switch-on-color":"#67C23A","--el-switch-off-color":"#909399","margin-right":"10px"},"inline-prompt":"","active-icon":o(ms),"inactive-icon":o(Wt),class:"auto-update-switch"},null,8,["modelValue","active-icon","inactive-icon"])]),_:1},8,["content"]),t(j,{content:"Git Pull (拉取远程更新)",placement:"top","hide-after":1e3},{default:a(()=>[t(O,{type:"primary",icon:o(gs),circle:"",size:"small",onClick:ce,loading:o(v).isGitPulling,disabled:!o(v).hasUpstream},null,8,["icon","loading","disabled"])]),_:1}),t(j,{content:"Git Fetch All (获取所有远程分支)",placement:"top","hide-after":1e3},{default:a(()=>[He(t(O,{type:"primary",icon:o(ys),circle:"",size:"small",onClick:$,loading:o(v).isGitFetching},null,8,["icon","loading"]),[[dt,!1]])]),_:1}),o(g).lockedFiles.length>0?(f(),q(j,{key:0,content:"管理锁定文件",placement:"top","hide-after":1e3},{default:a(()=>[t(O,{type:"warning",circle:"",size:"small",onClick:p[1]||(p[1]=w=>Q.value=!0)},{default:a(()=>[t(ae,null,{default:a(()=>[t(o(lt))]),_:1})]),_:1})]),_:1})):A("",!0),t(j,{content:"刷新状态",placement:"top","hide-after":1e3},{default:a(()=>[t(O,{type:"primary",icon:o(qs),circle:"",size:"small",onClick:U,loading:E.value},null,8,["icon","loading"])]),_:1})])]),He((f(),_("div",{class:"card-content","element-loading-text":o(v).isGitPulling?"正在拉取代码...":"正在获取远程分支信息..."},[o(v).isGitRepo?(f(),_("div",La,[o(v).hasUpstream&&(o(v).branchAhead>0||o(v).branchBehind>0)?(f(),_("div",za,[e("div",Ba,[e("div",Ga,[t(j,{content:"本地分支与远程分支的状态对比",placement:"top"},{default:a(()=>[e("div",Ra,[o(v).branchAhead>0?(f(),q(ke,{key:0,size:"small",type:"warning",class:"status-badge"},{default:a(()=>[e("span",Da,[t(ae,null,{default:a(()=>[t(o(hs))]),_:1}),y(" 你的分支领先 'origin/"+L(o(v).currentBranch)+"' "+L(o(v).branchAhead)+" 个提交 ",1)])]),_:1})):A("",!0),o(v).branchBehind>0?(f(),q(ke,{key:1,size:"small",type:"info",class:"status-badge"},{default:a(()=>[e("span",Fa,[t(ae,null,{default:a(()=>[t(o(mt))]),_:1}),y(" 你的分支落后 'origin/"+L(o(v).currentBranch)+"' "+L(o(v).branchBehind)+" 个提交 ",1)])]),_:1})):A("",!0)])]),_:1})])])])):A("",!0),o(v).fileList.length?(f(),_("div",ja,[o(v).fileList.some(w=>w.type==="added")?(f(),_("div",Ua,[e("div",{class:"file-group-header",onClick:p[2]||(p[2]=w=>ue("staged"))},[t(ae,{class:ge(["collapse-icon",{collapsed:ee.value.staged}])},{default:a(()=>[t(o(mt))]),_:1},8,["class"]),p[10]||(p[10]=e("span",null,"已暂存的更改",-1))]),He(e("div",Ma,[(f(!0),_(we,null,Be(o(v).fileList.filter(w=>w.type==="added"),w=>(f(),_("div",{key:w.path,class:"file-item",onClick:re=>F(w)},[e("div",Aa,[e("div",{class:ge(["file-status-indicator",["added",{locked:I(w.path)}]])},null,2),e("div",Ea,[e("span",{class:ge(["file-name",{"locked-file-name":I(w.path)}])},[y(L(N(w.path))+" ",1),I(w.path)?(f(),q(ae,{key:0,class:"lock-indicator"},{default:a(()=>[t(o(lt))]),_:1})):A("",!0)],2)]),e("div",{class:"file-path-section",title:ie(w.path)},[e("span",Ha,L(ie(w.path)),1)],8,Pa)]),e("div",Ia,[t(j,{content:I(w.path)?"解锁文件":"锁定文件",placement:"top","hide-after":1e3},{default:a(()=>[t(O,{type:I(w.path)?"danger":"info",size:"small",circle:"",onClick:We(re=>se(w.path),["stop"]),class:"file-action-btn"},{default:a(()=>[t(ae,{size:"12"},{default:a(()=>[(f(),q(gt(I(w.path)?o(lt):o(Rt))))]),_:2},1024)]),_:2},1032,["type","onClick"])]),_:2},1032,["content"]),t(j,{content:"取消暂存",placement:"top","hide-after":1e3},{default:a(()=>[t(O,{type:"warning",size:"small",circle:"",onClick:We(re=>B(w.path),["stop"]),class:"file-action-btn"},{default:a(()=>p[11]||(p[11]=[y("-")])),_:2},1032,["onClick"])]),_:2},1024)])],8,Oa))),128))],512),[[dt,!ee.value.staged]])])):A("",!0),o(v).fileList.some(w=>w.type==="modified"||w.type==="deleted")?(f(),_("div",Na,[e("div",{class:"file-group-header",onClick:p[3]||(p[3]=w=>ue("unstaged"))},[t(ae,{class:ge(["collapse-icon",{collapsed:ee.value.unstaged}])},{default:a(()=>[t(o(mt))]),_:1},8,["class"]),p[12]||(p[12]=e("span",null,"未暂存的更改",-1))]),He(e("div",Ja,[(f(!0),_(we,null,Be(o(v).fileList.filter(w=>w.type==="modified"||w.type==="deleted"),w=>(f(),_("div",{key:w.path,class:"file-item",onClick:re=>F(w)},[e("div",qa,[e("div",{class:ge(["file-status-indicator",[w.type,{locked:I(w.path)}]])},null,2),e("div",Ya,[e("span",{class:ge(["file-name",{"locked-file-name":I(w.path)}])},[y(L(N(w.path))+" ",1),I(w.path)?(f(),q(ae,{key:0,class:"lock-indicator"},{default:a(()=>[t(o(lt))]),_:1})):A("",!0)],2)]),e("div",{class:"file-path-section",title:ie(w.path)},[e("span",Ka,L(ie(w.path)),1)],8,Xa)]),e("div",Za,[t(j,{content:I(w.path)?"解锁文件":"锁定文件",placement:"top","hide-after":1e3},{default:a(()=>[t(O,{type:I(w.path)?"danger":"info",size:"small",circle:"",onClick:We(re=>se(w.path),["stop"]),class:"file-action-btn"},{default:a(()=>[t(ae,{size:"12"},{default:a(()=>[(f(),q(gt(I(w.path)?o(lt):o(Rt))))]),_:2},1024)]),_:2},1032,["type","onClick"])]),_:2},1032,["content"]),t(j,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:a(()=>[t(O,{type:"success",size:"small",circle:"",onClick:We(re=>X(w.path),["stop"]),class:"file-action-btn"},{default:a(()=>p[13]||(p[13]=[y("+")])),_:2},1032,["onClick"])]),_:2},1024),t(j,{content:"撤回修改",placement:"top","hide-after":1e3},{default:a(()=>[t(O,{type:"danger",size:"small",icon:o(Xt),circle:"",onClick:We(re=>T(w.path),["stop"]),class:"file-action-btn"},null,8,["icon","onClick"])]),_:2},1024)])],8,Wa))),128))],512),[[dt,!ee.value.unstaged]])])):A("",!0),o(v).fileList.some(w=>w.type==="untracked")?(f(),_("div",Qa,[e("div",{class:"file-group-header",onClick:p[4]||(p[4]=w=>ue("untracked"))},[t(ae,{class:ge(["collapse-icon",{collapsed:ee.value.untracked}])},{default:a(()=>[t(o(mt))]),_:1},8,["class"]),p[14]||(p[14]=e("span",null,"未跟踪的文件",-1))]),He(e("div",el,[(f(!0),_(we,null,Be(o(v).fileList.filter(w=>w.type==="untracked"),w=>(f(),_("div",{key:w.path,class:"file-item",onClick:re=>F(w)},[e("div",sl,[e("div",{class:ge(["file-status-indicator",["untracked",{locked:I(w.path)}]])},null,2),e("div",al,[e("span",{class:ge(["file-name",{"locked-file-name":I(w.path)}])},[y(L(N(w.path))+" ",1),I(w.path)?(f(),q(ae,{key:0,class:"lock-indicator"},{default:a(()=>[t(o(lt))]),_:1})):A("",!0)],2)]),e("div",{class:"file-path-section",title:ie(w.path)},[e("span",ol,L(ie(w.path)),1)],8,ll)]),e("div",nl,[t(j,{content:I(w.path)?"解锁文件":"锁定文件",placement:"top","hide-after":1e3},{default:a(()=>[t(O,{type:I(w.path)?"danger":"info",size:"small",circle:"",onClick:We(re=>se(w.path),["stop"]),class:"file-action-btn"},{default:a(()=>[t(ae,{size:"12"},{default:a(()=>[(f(),q(gt(I(w.path)?o(lt):o(Rt))))]),_:2},1024)]),_:2},1032,["type","onClick"])]),_:2},1032,["content"]),t(j,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:a(()=>[t(O,{type:"success",size:"small",circle:"",onClick:We(re=>X(w.path),["stop"]),class:"file-action-btn"},{default:a(()=>p[15]||(p[15]=[y("+")])),_:2},1032,["onClick"])]),_:2},1024),t(j,{content:"删除文件",placement:"top","hide-after":1e3},{default:a(()=>[t(O,{type:"danger",size:"small",icon:o(Wt),circle:"",onClick:We(re=>T(w.path),["stop"]),class:"file-action-btn"},null,8,["icon","onClick"])]),_:2},1024)])],8,tl))),128))],512),[[dt,!ee.value.untracked]])])):A("",!0)])):o(v).isGitRepo?(f(),_("div",il,[e("div",rl,[t(ae,null,{default:a(()=>[t(o(_s))]),_:1})]),p[16]||(p[16]=e("div",{class:"empty-text"},"没有检测到任何更改",-1)),p[17]||(p[17]=e("div",{class:"empty-subtext"},"工作区是干净的",-1))])):A("",!0)])):(f(),_("div",Va,p[9]||(p[9]=[e("div",{class:"empty-status"},[e("p",null,"当前目录不是Git仓库")],-1)])))],8,xa)),[[Ee,o(v).isGitPulling||o(v).isGitFetching]])]),t(xe,{modelValue:H.value,"onUpdate:modelValue":p[5]||(p[5]=w=>H.value=w),title:`文件差异: ${G.value}`,width:"80%","destroy-on-close":"",class:"diff-dialog"},{footer:a(()=>[e("div",fl,[t(O,{type:"primary",icon:o(Ys),onClick:S,disabled:D.value<=0||o(v).fileList.length===0,plain:"",class:"nav-button"},{default:a(()=>p[18]||(p[18]=[y(" 上一个文件 ")])),_:1},8,["icon","disabled"]),e("div",pl,[t(ke,{type:"info",effect:"plain",class:"counter-tag"},{default:a(()=>[y(L(D.value+1)+" / "+L(o(v).fileList.length),1)]),_:1})]),t(O,{type:"primary",icon:o(is),onClick:x,disabled:D.value>=o(v).fileList.length-1||o(v).fileList.length===0,plain:"",class:"nav-button"},{icon:a(()=>[t(ae,{class:"el-icon--right"},{default:a(()=>[t(o(is))]),_:1})]),default:a(()=>[p[19]||(p[19]=y(" 下一个文件 "))]),_:1},8,["icon","disabled"])])]),default:a(()=>[He((f(),_("div",cl,[M.value?(f(),_("div",{key:0,innerHTML:me(M.value),class:"diff-formatted"},null,8,ul)):(f(),_("div",dl,"该文件没有差异或是新文件"))])),[[Ee,pe.value]])]),_:1},8,["modelValue","title"]),t(xe,{modelValue:Q.value,"onUpdate:modelValue":p[7]||(p[7]=w=>Q.value=w),title:"锁定文件管理",width:"700px","destroy-on-close":""},{footer:a(()=>[e("span",Tl,[t(O,{onClick:p[6]||(p[6]=w=>Q.value=!1)},{default:a(()=>p[25]||(p[25]=[y("关闭")])),_:1})])]),default:a(()=>[e("div",vl,[e("div",ml,[t(ae,{class:"description-icon"},{default:a(()=>[t(o(rs))]),_:1}),p[20]||(p[20]=e("span",{class:"description-title"},"文件锁定功能说明",-1))]),p[21]||(p[21]=e("div",{class:"description-content"},[e("p",null,[e("strong",null,"🔒 锁定文件的作用:")]),e("ul",null,[e("li",null,"锁定的文件在执行 Git 提交时会被自动跳过,不会被添加到暂存区"),e("li",null,"适用于临时文件、配置文件、或不想提交的开发中文件"),e("li",null,"锁定状态会持久保存,直到手动解锁")]),e("p",null,[e("strong",null,"💡 使用场景:")]),e("ul",null,[e("li",null,"开发过程中的临时测试文件"),e("li",null,"本地配置文件(如数据库连接、API密钥等)"),e("li",null,"正在开发但还不想提交的功能文件")])],-1))]),t(Ae),o(g).lockedFiles.length===0?(f(),_("div",gl,[e("div",yl,[t(ae,null,{default:a(()=>[t(o(lt))]),_:1})]),p[22]||(p[22]=e("p",null,"当前没有锁定的文件",-1)),p[23]||(p[23]=e("p",{class:"empty-tip"},"您可以在文件列表中点击锁定按钮来锁定文件",-1))])):(f(),_("div",hl,[e("div",_l,[e("span",null,"🔒 已锁定 "+L(o(g).lockedFiles.length)+" 个文件",1),t(j,{content:"这些文件在提交时会被自动跳过",placement:"top"},{default:a(()=>[t(ae,{class:"info-icon"},{default:a(()=>[t(o(rs))]),_:1})]),_:1})]),e("div",wl,[(f(!0),_(we,null,Be(o(g).lockedFiles,w=>(f(),_("div",{key:w,class:"locked-file-item"},[e("div",kl,[p[24]||(p[24]=e("div",{class:"file-status-indicator locked"},null,-1)),e("div",$l,[e("span",bl,L(N(w)),1),e("span",Cl,L(ie(w)),1)])]),e("div",Sl,[t(j,{content:"解锁文件",placement:"top","hide-after":1e3},{default:a(()=>[t(O,{type:"danger",size:"small",circle:"",onClick:re=>o(g).unlockFile(w)},{default:a(()=>[t(ae,null,{default:a(()=>[t(o(Rt))]),_:1})]),_:2},1032,["onClick"])]),_:2},1024)])]))),128))])]))]),_:1},8,["modelValue"])],64)}}}),Lt=(ve,c)=>{const C=ve.__vccOpts||ve;for(const[v,g]of c)C[v]=g;return C},Vl=Lt(xl,[["__scopeId","data-v-15b61579"]]),Ll={class:"card-header"},zl={key:0,class:"pushing-indicator"},Bl={class:"pushing-text"},Gl={key:0,class:"push-success-indicator"},Rl={class:"card-content"},Dl={class:"layout-container"},Fl={key:0,class:"git-config-warning"},jl={key:1,class:"commit-section"},Ul={class:"commit-options"},Ml={class:"options-row"},Ol={class:"commit-mode-toggle"},Al={class:"no-verify-toggle"},El={key:0,class:"commit-form"},Pl={class:"description-container"},Hl={class:"preview-section"},Il={class:"preview-content code-command"},Nl={class:"form-bottom-actions"},Jl={class:"actions-flex-container"},Wl={class:"left-actions"},ql={class:"button-grid"},Yl={key:0},Xl={key:0},Kl={key:0},Zl={class:"right-actions"},Ql={class:"one-push-content"},eo={key:1,class:"standard-commit-form"},to={class:"standard-commit-header"},so={class:"type-scope-container"},ao={class:"scope-wrapper"},lo={class:"description-container"},oo={class:"advanced-fields"},no={class:"preview-section"},io={class:"preview-content code-command"},ro={class:"form-bottom-actions"},co={class:"actions-flex-container"},uo={class:"left-actions"},fo={class:"button-grid"},po={key:0},vo={key:0},mo={key:0},go={class:"right-actions"},yo={class:"one-push-content"},ho={class:"actions-section"},_o={class:"action-groups"},wo={class:"operations-wrapper"},ko={class:"action-group"},$o={class:"group-buttons"},bo={key:0},Co={key:0},So={key:0},To={key:0},xo={class:"action-group"},Vo={class:"group-buttons"},Lo={class:"action-group reset-group"},zo={class:"group-buttons"},Bo={key:0},Go={class:"action-group branch-group"},Ro={class:"group-buttons"},Do={class:"action-group"},Fo={class:"group-buttons"},jo={class:"template-container"},Uo={class:"template-form"},Mo={class:"template-form-buttons"},Oo={class:"template-list"},Ao={class:"template-content"},Eo={class:"template-actions"},Po={class:"template-container"},Ho={class:"template-form"},Io={class:"template-form-buttons"},No={class:"template-list"},Jo={class:"template-content"},Wo={class:"template-actions"},qo={class:"template-container message-template-container"},Yo={class:"template-form"},Xo={class:"template-form-buttons"},Ko={class:"templates-container"},Zo={class:"message-templates-list"},Qo={class:"templates-scroll-area"},en={class:"template-content"},tn={class:"template-actions"},sn={class:"current-default-message"},an={class:"default-message-content"},ln={class:"message-help-text"},on={class:"merge-dialog-content"},nn={class:"merge-intro"},rn={class:"merge-options"},cn={class:"dialog-footer"},un={class:"stash-list-content"},dn={key:0,class:"stash-list-actions"},fn={class:"stash-dialog-content"},pn={class:"dialog-footer"},vn=St({__name:"CommitForm",setup(ve){const c=yt(),C=es(),v=d(""),g=d(!1),E=d(!1),G=d("输入提交信息..."),M=d(""),H=d(!1),pe=d("feat"),D=d(""),Q=d(""),ee=d(""),oe=d(""),W=d([]),me=d(!1),Y=d(""),S=d(!1),x=d(""),F=d(-1),X=d(!1),B=d(""),U=d({noFf:!1,squash:!1,noCommit:!1,message:""}),te=d([]),ce=d(!1),$=d(""),T=d(!1),N=d(""),ie=d(-1),I=d(!1),se=d(""),ue=d(!1),V=d(!1),p=[{value:"feat",label:"feat: 新功能"},{value:"fix",label:"fix: 修复bug"},{value:"docs",label:"docs: 文档修改"},{value:"style",label:"style: 样式修改"},{value:"refactor",label:"refactor: 代码重构"},{value:"test",label:"test: 测试代码"},{value:"chore",label:"chore: 构建/工具修改"}],P=d(!1),j=d(!1),O=d(""),ae=d(!1),ke=d(!0);function xe(){O.value="",ae.value=!1,ke.value=!0,P.value=!0}function Ae(){c.getStashList(),j.value=!0}async function Ee(){try{await c.saveStash(O.value,ae.value,ke.value),P.value=!1}catch(u){console.error("储藏失败:",u)}}async function w(u,s=!1){try{await c.applyStash(u,s),s&&await c.getStashList()}catch(z){console.error("应用储藏失败:",z)}}async function re(u){Ie.confirm("确定要删除此储藏吗?此操作不可恢复。","删除储藏",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(async()=>{await c.dropStash(u),await c.getStashList()}).catch(()=>{})}async function Ye(){Ie.confirm("确定要清空所有储藏吗?此操作不可恢复。","清空所有储藏",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(async()=>{await c.clearAllStashes(),await c.getStashList()}).catch(()=>{})}const _e=d([]),Ue=d(!1),Me=d(""),Re=d(-1);Ze(H,u=>{localStorage.setItem("zen-gitsync-standard-commit",u.toString())}),Ze(ue,u=>{localStorage.setItem("zen-gitsync-skip-hooks",u.toString())});const de=ze(()=>{if(!H.value)return v.value||M.value;let u=`${pe.value||""}`;return D.value&&(u+=`(${D.value})`),u+=`: ${Q.value}`,ee.value&&(u+=`
|
|
15
|
+
|
|
16
|
+
${ee.value}`),oe.value&&(u+=`
|
|
17
|
+
|
|
18
|
+
${oe.value}`),u}),Ne=ze(()=>{let u=`git commit -m "${de.value}"`;return ue.value&&(u+=" --no-verify"),u});function k(){const u=C.config;u&&(G.value=`输入提交信息 (默认: ${u.defaultCommitMessage})`,M.value=u.defaultCommitMessage||"",u.descriptionTemplates&&Array.isArray(u.descriptionTemplates)&&(W.value=u.descriptionTemplates),u.scopeTemplates&&Array.isArray(u.scopeTemplates)&&(te.value=u.scopeTemplates),u.messageTemplates&&Array.isArray(u.messageTemplates)&&(_e.value=u.messageTemplates))}async function r(){if(!Y.value.trim()){i({message:"请输入模板内容",type:"warning"});return}try{if(S.value)await K();else{if(W.value.includes(Y.value)){i({message:"该模板已存在",type:"warning"});return}await C.saveTemplate(Y.value,"description")&&(W.value.includes(Y.value)||W.value.push(Y.value),W.value=[...W.value],Y.value="")}}catch(u){i({message:`保存模板失败: ${u.message}`,type:"error"})}}async function K(){if(!Y.value.trim()){i({message:"请输入模板内容",type:"warning"});return}try{if(await C.updateTemplate(x.value,Y.value,"description")){const s=W.value.indexOf(x.value);s!==-1&&(W.value[s]=Y.value),W.value=[...W.value],S.value=!1,x.value="",F.value=-1,Y.value=""}}catch(u){i({message:`更新模板失败: ${u.message}`,type:"error"})}}function J(u,s){S.value=!0,x.value=u,F.value=s,Y.value=u}function be(){S.value=!1,x.value="",F.value=-1,Y.value=""}async function Ve(){if(!$.value.trim()){i({message:"请输入模板内容",type:"warning"});return}try{if(T.value)await fe();else{if(te.value.includes($.value)){i({message:"该模板已存在",type:"warning"});return}await C.saveTemplate($.value,"scope")&&(te.value.includes($.value)||te.value.push($.value),te.value=[...te.value],$.value="")}}catch(u){i({message:`保存模板失败: ${u.message}`,type:"error"})}}async function fe(){if(!$.value.trim()){i({message:"请输入模板内容",type:"warning"});return}try{if(await C.updateTemplate(N.value,$.value,"scope")){const s=te.value.indexOf(N.value);s!==-1&&(te.value[s]=$.value),te.value=[...te.value],T.value=!1,N.value="",ie.value=-1,$.value=""}}catch(u){i({message:`更新模板失败: ${u.message}`,type:"error"})}}function ye(u,s){T.value=!0,N.value=u,ie.value=s,$.value=u}function De(){T.value=!1,N.value="",ie.value=-1,$.value=""}async function Ce(u){try{if(await Ie.confirm(`确定要删除描述模板 "${u}" 吗?`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await C.deleteTemplate(u,"description")){const z=W.value.indexOf(u);z!==-1&&W.value.splice(z,1),W.value=[...W.value]}}catch(s){if(s==="cancel")return;i({message:`删除模板失败: ${s.message}`,type:"error"})}}async function $e(u){try{if(await Ie.confirm(`确定要删除作用域模板 "${u}" 吗?`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await C.deleteTemplate(u,"scope")){const z=te.value.indexOf(u);z!==-1&&te.value.splice(z,1),te.value=[...te.value]}}catch(s){if(s==="cancel")return;i({message:`删除模板失败: ${s.message}`,type:"error"})}}function ot(u){Q.value=u,me.value=!1}function Qe(u){D.value=u,ce.value=!1}function Z(){me.value=!0}function nt(){ce.value=!0}async function Xe(){try{await c.addToStage()&&c.fetchStatus()}catch(u){i({message:`添加文件失败: ${u.message}`,type:"error"})}}async function qe(){if(!de.value.trim()){i({message:"提交信息不能为空",type:"warning"});return}try{await c.commitChanges(de.value,ue.value)&&(h(),c.fetchStatus(),c.fetchLog(),c.getBranchStatus(!0))}catch(u){i({message:`提交失败: ${u.message}`,type:"error"})}}function et(){g.value=!0,setTimeout(()=>{g.value=!1},2e3)}async function Ke(){try{await c.pushToRemote(),E.value=!0;try{await new Promise(u=>setTimeout(u,200)),et()}catch(u){console.error("推送后处理失败:",u),et()}finally{E.value=!1}}catch(u){E.value=!1,i({message:`推送失败: ${u.message}`,type:"error"})}}async function Pe(){try{await c.gitPull(),await c.fetchStatus(),await c.fetchLog(!1)}catch(u){console.error("拉取操作发生错误:",u)}}async function _t(){try{await c.gitFetchAll(),await c.fetchStatus(),await c.fetchLog(!1)}catch(u){console.error("获取远程分支信息操作发生错误:",u)}}async function n(){if(!de.value.trim()){i({message:"提交信息不能为空",type:"warning"});return}try{await c.addAndCommit(de.value,ue.value),h(),c.fetchStatus(),c.fetchLog()}catch(u){i({message:`暂存并提交失败: ${u.message}`,type:"error"})}}async function l(){if(!de.value.trim()){i({message:"提交信息不能为空",type:"warning"});return}try{if(await c.addCommitAndPush(de.value,ue.value)){h(),E.value=!0;try{await new Promise(s=>setTimeout(s,1e3)),console.log("一键推送完成,状态已在pushToRemote中刷新"),et()}catch(s){console.error("一键推送后处理失败:",s),et()}finally{E.value=!1}}}catch(u){i({message:`暂存、提交并推送失败: ${u.message}`,type:"error"})}}async function m(){try{await Ie.confirm(`确定要重置当前分支 "${c.currentBranch}" 到远程状态吗?这将丢失所有未推送的提交和本地更改。`,"重置到远程分支",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await c.resetToRemote(c.currentBranch)&&(c.fetchStatus(),c.fetchLog())}catch(u){u!=="cancel"&&i({message:`重置到远程分支失败: ${u.message}`,type:"error"})}}function h(){v.value="",Q.value="",ee.value="",oe.value=""}function le(){se.value=M.value,I.value=!0}async function ne(){if(!se.value.trim()){i({message:"请输入默认提交信息",type:"warning"});return}try{await C.saveDefaultMessage(se.value)&&(M.value=se.value,G.value=`输入提交信息 (默认: ${se.value})`,I.value=!1)}catch(u){i({message:`保存默认提交信息失败: ${u.message}`,type:"error"})}}function he(u){const s=u.replace(/\\/g,"/");return C.lockedFiles.some(z=>{const Le=z.replace(/\\/g,"/");return s===Le})}const R=ze(()=>c.fileList.some(u=>["modified","deleted","untracked"].includes(u.type)&&!he(u.path))),Ge=ze(()=>c.fileList.filter(u=>["modified","deleted","untracked"].includes(u.type)&&!he(u.path)).length),Oe=ze(()=>c.fileList.filter(u=>u.type==="added"&&!he(u.path)).length),ft=ze(()=>Oe.value>0),it=ze(()=>c.fileList.some(u=>!he(u.path))),tt=ze(()=>c.branchAhead>0),Mt=ze(()=>c.branchBehind>0),st=ze(()=>c.hasUpstream&&tt.value&&!ft.value),ts=ze(()=>ft.value),Ts=ze(()=>c.hasUpstream&&(tt.value||Mt.value||it.value));async function xs(){if(!se.value.trim()){i({message:"请输入模板内容",type:"warning"});return}try{if(Ue.value)await Vs();else{if(_e.value.includes(se.value)){i({message:"该模板已存在",type:"warning"});return}_e.value.push(se.value);const s=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:se.value,type:"message"})})).json();s.success?(i({message:"提交信息模板保存成功!",type:"success"}),se.value=""):i({message:"模板保存失败: "+s.error,type:"error"})}}catch(u){i({message:"模板保存失败: "+u.message,type:"error"})}}async function Vs(){try{if(Re.value>=0){const u=Me.value,s=se.value;_e.value[Re.value]=s;const Le=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:u,newTemplate:s,type:"message"})})).json();Le.success?(i({message:"提交信息模板更新成功!",type:"success"}),Ue.value=!1,Me.value="",Re.value=-1,se.value=""):i({message:"模板更新失败: "+Le.error,type:"error"})}}catch(u){i({message:"模板更新失败: "+u.message,type:"error"})}}function Ls(u,s){Ue.value=!0,Me.value=u,Re.value=s,se.value=u}function zs(){Ue.value=!1,Me.value="",Re.value=-1,se.value=""}async function Bs(u){try{const s=_e.value.indexOf(u);s!==-1&&_e.value.splice(s,1);const Le=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:u,type:"message"})})).json();Le.success?i({message:"提交信息模板删除成功!",type:"success"}):i({message:"模板删除失败: "+Le.error,type:"error"})}catch(s){i({message:"模板删除失败: "+s.message,type:"error"})}}function Gs(u){v.value=u,se.value=u}ht(async()=>{const u=localStorage.getItem("zen-gitsync-standard-commit");u!==null&&(H.value=u==="true");const s=localStorage.getItem("zen-gitsync-skip-hooks");s!==null&&(ue.value=s==="true"),Ze(()=>C.config,k,{immediate:!0}),C.config||await C.loadConfig()});function Rs(){B.value="",U.value={noFf:!1,squash:!1,noCommit:!1,message:""},pt.value="all",X.value=!0,c.allBranches.length===0&&c.getAllBranches()}const pt=d("all"),Ds=ze(()=>{const u=c.allBranches.filter(s=>s!==c.currentBranch);if(console.log("筛选分支列表:",{allBranches:c.allBranches,currentBranch:c.currentBranch,branchTypeFilter:pt.value,filteredBranches:u}),pt.value==="local"){const s=u.filter(z=>!z.includes("origin/"));return console.log("本地分支:",s),s}else if(pt.value==="remote"){const s=u.filter(z=>z.includes("origin/"));return console.log("远程分支:",s),s}else return console.log("所有分支:",u),u});async function Fs(){if(!B.value){i({message:"请选择要合并的分支",type:"warning"});return}try{await c.mergeBranch(B.value,U.value)&&(X.value=!1,await c.fetchStatus(),await c.fetchLog(!1))}catch(u){console.error("合并分支操作发生错误:",u)}}const zt=d(!1);function js(){zt.value=!zt.value}function Us(u,s){const Le=[...u?W.value.filter(Se=>Se.toLowerCase().includes(u.toLowerCase())).map(Se=>({value:Se})):W.value.map(Se=>({value:Se})),{value:"⚙️ 管理模板...",isSettings:!0}];s(Le)}function Ms(u,s){const Le=[...u?te.value.filter(Se=>Se.toLowerCase().includes(u.toLowerCase())).map(Se=>({value:Se})):te.value.map(Se=>({value:Se})),{value:"⚙️ 管理模板...",isSettings:!0}];s(Le)}function Os(u){u.isSettings?(Z(),Q.value=""):Q.value=u.value}function As(u){u.isSettings?(nt(),D.value=""):D.value=u.value}function Es(u,s){const Le=[...u?_e.value.filter(Se=>Se.toLowerCase().includes(u.toLowerCase())).map(Se=>({value:Se})):_e.value.map(Se=>({value:Se})),{value:"⚙️ 管理模板...",isSettings:!0}];s(Le)}function Ps(u){u.isSettings?(le(),v.value=""):v.value=u.value}return(u,s)=>{const z=je,Le=Tt,Se=Kt,ss=vs,Ot=Zs,Te=qt,as=jt,ls=Ut,rt=Zt,Hs=ea,Bt=Qt,At=ta,Gt=ks,vt=Vt,os=xt,Et=aa,Is=sa,ct=bs,wt=la,ns=$s,Pt=bt,Ns=Cs,Js=Yt;return f(),_("div",{class:ge(["card",{"is-pushing":o(c).isPushing}])},[e("div",Ll,[s[30]||(s[30]=e("h2",null,"提交更改",-1)),t(z,{type:"primary",icon:o(Ks),size:"small",circle:"",onClick:js,class:"git-tools-button"},null,8,["icon"])]),t(cs,{name:"el-fade-in-linear"},{default:a(()=>[o(c).isPushing||E.value?(f(),_("div",zl,[s[31]||(s[31]=e("div",{class:"pushing-spinner"},[e("svg",{viewBox:"0 0 50 50",class:"circular"},[e("circle",{class:"path",cx:"25",cy:"25",r:"20",fill:"none"})])],-1)),e("div",Bl,L(o(c).isPushing?"正在推送...":"更新状态中..."),1)])):A("",!0)]),_:1}),t(cs,{name:"el-fade-in-linear"},{default:a(()=>[g.value?(f(),_("div",Gl,[t(Le,{class:"push-success-icon"},{default:a(()=>[t(o(ms))]),_:1}),s[32]||(s[32]=e("div",{class:"push-success-text"},"已完成!",-1))])):A("",!0)]),_:1}),e("div",Rl,[e("div",Dl,[o(c).userName===""||o(c).userEmail===""?(f(),_("div",Fl,[t(Se,{title:"Git用户信息未配置",type:"warning",closable:!1,"show-icon":""},{default:a(()=>s[33]||(s[33]=[e("p",null,"您需要配置Git用户名和邮箱才能提交代码。请使用以下命令配置:",-1),e("pre",{class:"config-command"},`git config --global user.name "Your Name"
|
|
19
|
+
git config --global user.email "your.email@example.com"`,-1)])),_:1})])):(f(),_("div",jl,[e("div",Ul,[e("div",Ml,[e("div",Ol,[t(ss,{modelValue:H.value,"onUpdate:modelValue":s[0]||(s[0]=b=>H.value=b),"active-text":"标准化提交","inactive-text":"普通提交"},null,8,["modelValue"])]),e("div",Al,[t(ss,{modelValue:ue.value,"onUpdate:modelValue":s[1]||(s[1]=b=>ue.value=b),"active-text":"跳过 Git 钩子检查 (--no-verify)"},null,8,["modelValue"])])])]),H.value?(f(),_("div",eo,[e("div",to,[e("div",so,[t(ls,{modelValue:pe.value,"onUpdate:modelValue":s[3]||(s[3]=b=>pe.value=b),placeholder:"提交类型",class:"type-select",clearable:""},{default:a(()=>[(f(),_(we,null,Be(p,b=>t(as,{key:b.value,label:b.label,value:b.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),e("div",ao,[t(Ot,{modelValue:D.value,"onUpdate:modelValue":s[4]||(s[4]=b=>D.value=b),"fetch-suggestions":Ms,placeholder:"作用域(可选)",class:"scope-input",clearable:"",onSelect:As},null,8,["modelValue"])])]),e("div",lo,[t(Ot,{modelValue:Q.value,"onUpdate:modelValue":s[5]||(s[5]=b=>Q.value=b),"fetch-suggestions":Us,placeholder:"简短描述(必填)",class:"description-input",clearable:"",onSelect:Os},null,8,["modelValue"])])]),e("div",{class:"advanced-options-toggle",onClick:s[6]||(s[6]=b=>V.value=!V.value)},[e("span",null,L(V.value?"收起":"正文及页脚"),1),t(Le,{class:ge(["toggle-icon",{"is-active":V.value}])},{default:a(()=>[t(o(mt))]),_:1},8,["class"])]),He(e("div",oo,[t(rt,{modelValue:ee.value,"onUpdate:modelValue":s[7]||(s[7]=b=>ee.value=b),type:"textarea",rows:4,placeholder:"正文(可选):详细描述本次提交的内容和原因",class:"body-input",clearable:""},null,8,["modelValue"]),t(rt,{modelValue:oe.value,"onUpdate:modelValue":s[8]||(s[8]=b=>oe.value=b),placeholder:"页脚(可选):如 Closes #123",class:"footer-input",clearable:""},null,8,["modelValue"])],512),[[dt,V.value]]),e("div",no,[s[39]||(s[39]=e("div",{class:"preview-title"},"Git提交命令预览:",-1)),e("pre",io,L(Ne.value),1)]),e("div",ro,[e("div",co,[e("div",uo,[e("div",fo,[t(z,{type:"primary",onClick:Xe,loading:o(c).isAddingFiles,disabled:!R.value,class:"stage-button"},{default:a(()=>[s[40]||(s[40]=y(" 暂存更改 ")),Ge.value>0?(f(),_("span",po,"("+L(Ge.value)+")",1)):A("",!0)]),_:1},8,["loading","disabled"]),t(z,{type:"primary",onClick:qe,loading:o(c).isLoadingStatus,disabled:!ft.value||!de.value.trim()},{default:a(()=>[s[41]||(s[41]=y(" 提交 ")),Oe.value>0?(f(),_("span",vo,"("+L(Oe.value)+")",1)):A("",!0)]),_:1},8,["loading","disabled"]),t(Te,{content:st.value?"推送已提交的更改到远程仓库":o(c).hasUpstream?tt.value?"有未提交的暂存更改,请先提交":"没有需要推送的提交":"当前分支没有上游分支",placement:"top"},{default:a(()=>[t(z,{type:"primary",icon:o(Ht),onClick:Ke,loading:o(c).isPushing,disabled:!st.value,style:$t(st.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{})},{default:a(()=>[s[42]||(s[42]=y(" 推送 ")),tt.value?(f(),_("span",mo,"("+L(o(c).branchAhead)+")",1)):A("",!0)]),_:1},8,["icon","loading","disabled","style"])]),_:1},8,["content"])])]),e("div",go,[t(Te,{content:it.value?de.value.trim()?o(c).hasUpstream?"一键完成:暂存所有更改 → 提交 → 推送到远程仓库":"当前分支没有上游分支":"请输入提交信息":"没有需要提交的更改",placement:"top"},{default:a(()=>[t(z,{type:"success",onClick:l,loading:o(c).isAddingFiles||o(c).isCommiting||o(c).isPushing,disabled:!it.value||!de.value.trim()||!o(c).hasUpstream,class:"one-push-button"},{default:a(()=>[e("div",yo,[t(Le,{class:"one-push-icon"},{default:a(()=>[t(o(It))]),_:1}),s[43]||(s[43]=e("div",{class:"one-push-text"},[e("span",{class:"one-push-title"},"一键推送所有"),e("span",{class:"one-push-desc"},"暂存 + 提交 + 推送")],-1))])]),_:1},8,["loading","disabled"])]),_:1},8,["content"])])])])])):(f(),_("div",El,[e("div",Pl,[t(Ot,{modelValue:v.value,"onUpdate:modelValue":s[2]||(s[2]=b=>v.value=b),"fetch-suggestions":Es,placeholder:G.value,type:"textarea",rows:6,resize:"none",class:"commit-message-input",onSelect:Ps},null,8,["modelValue","placeholder"])]),e("div",Hl,[s[34]||(s[34]=e("div",{class:"preview-title"},"Git提交命令预览:",-1)),e("pre",Il,'git commit -m "'+L(de.value||"<提交信息>")+'"'+L(ue.value?" --no-verify":""),1)]),e("div",Nl,[e("div",Jl,[e("div",Wl,[e("div",ql,[t(z,{type:"primary",onClick:Xe,loading:o(c).isAddingFiles,disabled:!R.value,class:"stage-button"},{default:a(()=>[s[35]||(s[35]=y(" 暂存更改 ")),Ge.value>0?(f(),_("span",Yl,"("+L(Ge.value)+")",1)):A("",!0)]),_:1},8,["loading","disabled"]),t(z,{type:"primary",onClick:qe,loading:o(c).isLoadingStatus,disabled:!ft.value||!de.value.trim()},{default:a(()=>[s[36]||(s[36]=y(" 提交 ")),Oe.value>0?(f(),_("span",Xl,"("+L(Oe.value)+")",1)):A("",!0)]),_:1},8,["loading","disabled"]),t(Te,{content:st.value?"推送已提交的更改到远程仓库":o(c).hasUpstream?tt.value?"有未提交的暂存更改,请先提交":"没有需要推送的提交":"当前分支没有上游分支",placement:"top"},{default:a(()=>[t(z,{type:"primary",icon:o(Ht),onClick:Ke,loading:o(c).isPushing,disabled:!st.value,style:$t(st.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{})},{default:a(()=>[s[37]||(s[37]=y(" 推送 ")),tt.value?(f(),_("span",Kl,"("+L(o(c).branchAhead)+")",1)):A("",!0)]),_:1},8,["icon","loading","disabled","style"])]),_:1},8,["content"])])]),e("div",Zl,[t(Te,{content:it.value?de.value.trim()?o(c).hasUpstream?"一键完成:暂存所有更改 → 提交 → 推送到远程仓库":"当前分支没有上游分支":"请输入提交信息":"没有需要提交的更改",placement:"top"},{default:a(()=>[t(z,{type:"success",onClick:l,loading:o(c).isAddingFiles||o(c).isCommiting||o(c).isPushing,disabled:!it.value||!de.value.trim()||!o(c).hasUpstream,class:"one-push-button"},{default:a(()=>[e("div",Ql,[t(Le,{class:"one-push-icon"},{default:a(()=>[t(o(It))]),_:1}),s[38]||(s[38]=e("div",{class:"one-push-text"},[e("span",{class:"one-push-title"},"一键推送所有"),e("span",{class:"one-push-desc"},"暂存 + 提交 + 推送")],-1))])]),_:1},8,["loading","disabled"])]),_:1},8,["content"])])])])]))]))]),t(Hs,{modelValue:zt.value,"onUpdate:modelValue":s[9]||(s[9]=b=>zt.value=b),title:"Git 操作",direction:"rtl",size:"340px","with-header":!0,"show-close":!0,"destroy-on-close":!1,class:"git-operations-drawer"},{default:a(()=>[e("div",ho,[e("div",_o,[e("div",wo,[e("div",ko,[s[49]||(s[49]=e("div",{class:"group-title"},"基础操作",-1)),e("div",$o,[t(Te,{content:R.value?`暂存${Ge.value}个待更改文件`:"git add .",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[t(z,{type:"primary",onClick:Xe,loading:o(c).isAddingFiles,disabled:!R.value,class:"action-button"},{default:a(()=>[s[44]||(s[44]=y(" 暂存更改 ")),Ge.value>0?(f(),_("span",bo,"("+L(Ge.value)+")",1)):A("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),t(Te,{content:ft.value?`提交${Oe.value}个已暂存文件`:"git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[t(z,{type:"primary",onClick:qe,loading:o(c).isLoadingStatus,disabled:!ft.value||!de.value.trim(),class:"action-button"},{default:a(()=>[s[45]||(s[45]=y(" 提交 ")),Oe.value>0?(f(),_("span",Co,"("+L(Oe.value)+")",1)):A("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),t(Te,{content:tt.value?`推送${o(c).branchAhead}个本地提交`:"git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[t(z,{type:"primary",icon:o(Ht),onClick:Ke,loading:o(c).isPushing,disabled:!st.value,class:ge(["action-button","push-button",{"is-loading":o(c).isPushing}]),style:$t(st.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{})},{default:a(()=>[s[46]||(s[46]=y(" 推送 ")),tt.value?(f(),_("span",So,"("+L(o(c).branchAhead)+")",1)):A("",!0)]),_:1},8,["icon","loading","disabled","class","style"])]),_:1},8,["content"]),t(Te,{content:Mt.value?`拉取${o(c).branchBehind}个远程提交`:"git pull",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[t(z,{type:"primary",icon:o(gs),onClick:Pe,loading:o(c).isGitPulling,disabled:!o(c).hasUpstream,class:"action-button",style:$t(o(c).hasUpstream?{color:"white",backgroundColor:"#1e90ff",borderColor:"#1e90ff"}:{})},{default:a(()=>[s[47]||(s[47]=y(" 拉取 ")),Mt.value?(f(),_("span",To,"("+L(o(c).branchBehind)+")",1)):A("",!0)]),_:1},8,["icon","loading","disabled","style"])]),_:1},8,["content"]),t(Te,{content:"git fetch --all",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[t(z,{type:"info",icon:o(ys),onClick:_t,loading:o(c).isGitFetching,class:"action-button",style:{color:"white","background-color":"#1e90ff","border-color":"#1e90ff"}},{default:a(()=>s[48]||(s[48]=[y(" 获取所有远程分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",xo,[s[52]||(s[52]=e("div",{class:"group-title"},"组合操作",-1)),e("div",Vo,[t(Te,{content:"git add + git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[t(z,{type:"primary",icon:o(Dt),onClick:n,loading:o(c).isAddingFiles||o(c).isCommiting,disabled:!R.value||!de.value.trim(),class:"action-button"},{default:a(()=>s[50]||(s[50]=[y(" 暂存并提交 ")])),_:1},8,["icon","loading","disabled"])]),_:1}),t(Te,{content:"git add + git commit + git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[t(z,{type:"success",icon:o(It),onClick:l,loading:o(c).isAddingFiles||o(c).isCommiting||o(c).isPushing,disabled:!it.value||!de.value.trim()||!o(c).hasUpstream,class:ge(["action-button","one-click-push",{"is-loading":o(c).isAddingFiles||o(c).isCommiting||o(c).isPushing}])},{default:a(()=>s[51]||(s[51]=[y(" 一键推送所有 ")])),_:1},8,["icon","loading","disabled","class"])]),_:1})])])]),e("div",Lo,[s[55]||(s[55]=e("div",{class:"group-title"},"重置操作",-1)),e("div",zo,[t(Te,{content:ts.value?`撤销${Oe.value}个已暂存文件`:"git reset HEAD",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[t(z,{type:"warning",icon:o(Xt),onClick:o(c).resetHead,loading:o(c).isResetting,disabled:!ts.value,class:"action-button reset-button"},{default:a(()=>[s[53]||(s[53]=y(" 重置暂存区 ")),Oe.value>0?(f(),_("span",Bo,"("+L(Oe.value)+")",1)):A("",!0)]),_:1},8,["icon","onClick","loading","disabled"])]),_:1},8,["content"]),t(Te,{content:"git reset --hard origin/branch",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[t(z,{type:"danger",icon:o(ws),onClick:m,loading:o(c).isResetting,disabled:!Ts.value,class:"action-button danger-button"},{default:a(()=>s[54]||(s[54]=[y(" 重置到远程 ")])),_:1},8,["icon","loading","disabled"])]),_:1})])]),e("div",Go,[s[57]||(s[57]=e("div",{class:"group-title"},"分支操作",-1)),e("div",Ro,[t(Te,{content:"合并其他分支到当前分支",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[t(z,{type:"primary",icon:o(Qs),onClick:Rs,loading:o(c).isGitMerging,class:"action-button merge-button"},{default:a(()=>s[56]||(s[56]=[y(" 合并分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",Do,[s[60]||(s[60]=e("div",{class:"group-title"},"储藏操作",-1)),e("div",Fo,[t(Te,{content:"将工作区更改储藏起来",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[t(z,{type:"warning",onClick:xe,loading:o(c).isSavingStash,disabled:!it.value,class:"action-button"},{default:a(()=>s[58]||(s[58]=[y(" 储藏更改 ")])),_:1},8,["loading","disabled"])]),_:1}),t(Te,{content:"查看和管理所有储藏记录",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:a(()=>[t(z,{type:"info",onClick:Ae,class:"action-button"},{default:a(()=>s[59]||(s[59]=[y(" 储藏列表 ")])),_:1})]),_:1})])])])])]),_:1},8,["modelValue"]),t(vt,{title:"简短描述模板设置",modelValue:me.value,"onUpdate:modelValue":s[11]||(s[11]=b=>me.value=b),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:a(()=>[e("div",jo,[e("div",Uo,[t(rt,{modelValue:Y.value,"onUpdate:modelValue":s[10]||(s[10]=b=>Y.value=b),placeholder:S.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",Mo,[S.value?(f(),q(z,{key:0,onClick:be},{default:a(()=>s[61]||(s[61]=[y("取消")])),_:1})):A("",!0),t(z,{type:"primary",onClick:r,disabled:!Y.value.trim()},{default:a(()=>[y(L(S.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",Oo,[s[65]||(s[65]=e("h3",null,"已保存模板",-1)),W.value.length===0?(f(),q(Bt,{key:0,description:"暂无保存的模板"})):A("",!0),(f(!0),_(we,null,Be(W.value,(b,Je)=>(f(),q(Gt,{key:Je,class:"template-item"},{default:a(()=>[t(At,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:a(()=>[e("div",Ao,L(b),1),e("div",Eo,[t(z,{type:"primary",size:"small",onClick:at=>ot(b)},{default:a(()=>s[62]||(s[62]=[y("使用")])),_:2},1032,["onClick"]),t(z,{type:"warning",size:"small",icon:o(Dt),onClick:at=>J(b,Je)},{default:a(()=>s[63]||(s[63]=[y("编辑")])),_:2},1032,["icon","onClick"]),t(z,{type:"danger",size:"small",onClick:at=>Ce(b)},{default:a(()=>s[64]||(s[64]=[y("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),t(vt,{title:"作用域模板设置",modelValue:ce.value,"onUpdate:modelValue":s[13]||(s[13]=b=>ce.value=b),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:a(()=>[e("div",Po,[e("div",Ho,[t(rt,{modelValue:$.value,"onUpdate:modelValue":s[12]||(s[12]=b=>$.value=b),placeholder:T.value?"编辑作用域模板内容":"输入新作用域模板",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",Io,[T.value?(f(),q(z,{key:0,onClick:De},{default:a(()=>s[66]||(s[66]=[y("取消")])),_:1})):A("",!0),t(z,{type:"primary",onClick:Ve,disabled:!$.value.trim()},{default:a(()=>[y(L(T.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",No,[s[70]||(s[70]=e("h3",null,"已保存作用域",-1)),te.value.length===0?(f(),q(Bt,{key:0,description:"暂无保存的作用域"})):A("",!0),(f(!0),_(we,null,Be(te.value,(b,Je)=>(f(),q(Gt,{key:Je,class:"template-item"},{default:a(()=>[t(At,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:a(()=>[e("div",Jo,L(b),1),e("div",Wo,[t(z,{type:"primary",size:"small",onClick:at=>Qe(b)},{default:a(()=>s[67]||(s[67]=[y("使用")])),_:2},1032,["onClick"]),t(z,{type:"warning",size:"small",icon:o(Dt),onClick:at=>ye(b,Je)},{default:a(()=>s[68]||(s[68]=[y("编辑")])),_:2},1032,["icon","onClick"]),t(z,{type:"danger",size:"small",onClick:at=>$e(b)},{default:a(()=>s[69]||(s[69]=[y("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),t(vt,{title:"默认提交信息设置",modelValue:I.value,"onUpdate:modelValue":s[15]||(s[15]=b=>I.value=b),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"message-template-dialog"},{default:a(()=>[e("div",qo,[e("div",Yo,[t(rt,{modelValue:se.value,"onUpdate:modelValue":s[14]||(s[14]=b=>se.value=b),placeholder:Ue.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",Xo,[Ue.value?(f(),q(z,{key:0,onClick:zs},{default:a(()=>s[71]||(s[71]=[y("取消")])),_:1})):A("",!0),t(z,{type:"primary",onClick:xs,disabled:!se.value.trim()},{default:a(()=>[y(L(Ue.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"]),t(z,{type:"success",onClick:ne,disabled:!se.value.trim()},{default:a(()=>s[72]||(s[72]=[y(" 设为默认提交信息 ")])),_:1},8,["disabled"])])]),e("div",Ko,[e("div",Zo,[s[76]||(s[76]=e("h3",null,"已保存模板",-1)),e("div",Qo,[_e.value.length===0?(f(),q(Bt,{key:0,description:"暂无保存的模板"})):A("",!0),(f(!0),_(we,null,Be(_e.value,(b,Je)=>(f(),q(Gt,{key:Je,class:"template-item"},{default:a(()=>[t(At,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:a(()=>[e("div",en,L(b),1),e("div",tn,[t(z,{type:"primary",size:"small",onClick:at=>Gs(b)},{default:a(()=>s[73]||(s[73]=[y("使用")])),_:2},1032,["onClick"]),t(z,{type:"warning",size:"small",icon:o(Dt),onClick:at=>Ls(b,Je)},{default:a(()=>s[74]||(s[74]=[y("编辑")])),_:2},1032,["icon","onClick"]),t(z,{type:"danger",size:"small",onClick:at=>Bs(b)},{default:a(()=>s[75]||(s[75]=[y("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])]),e("div",sn,[s[84]||(s[84]=e("h3",null,"当前默认提交信息",-1)),M.value?(f(),q(Gt,{key:0,class:"default-message-card"},{default:a(()=>[e("div",an,L(M.value),1)]),_:1})):(f(),q(Bt,{key:1,description:"尚未设置默认提交信息","image-size":100})),e("div",ln,[s[82]||(s[82]=e("h4",null,"关于默认提交信息",-1)),s[83]||(s[83]=e("p",null,"默认提交信息将在未输入提交信息时自动使用。",-1)),e("p",null,[s[79]||(s[79]=y("你可以通过点击左侧模板的")),t(os,{size:"small",type:"primary"},{default:a(()=>s[77]||(s[77]=[y("使用")])),_:1}),s[80]||(s[80]=y("按钮先选择喜欢的模板,然后点击上方")),t(os,{size:"small",type:"success"},{default:a(()=>s[78]||(s[78]=[y("设为默认提交信息")])),_:1}),s[81]||(s[81]=y("按钮保存。"))])])])])])]),_:1},8,["modelValue"]),t(vt,{title:"合并分支",modelValue:X.value,"onUpdate:modelValue":s[23]||(s[23]=b=>X.value=b),width:"500px","close-on-click-modal":!1,class:"merge-dialog"},{footer:a(()=>[e("div",cn,[t(z,{onClick:s[22]||(s[22]=b=>X.value=!1)},{default:a(()=>s[91]||(s[91]=[y("取消")])),_:1}),t(z,{type:"primary",onClick:Fs,loading:o(c).isGitMerging,disabled:!B.value,class:"merge-confirm-btn"},{default:a(()=>s[92]||(s[92]=[y(" 合并 ")])),_:1},8,["loading","disabled"])])]),default:a(()=>[e("div",on,[e("p",nn,"选择要合并到当前分支 ("+L(o(c).currentBranch)+") 的分支:",1),t(ns,{"label-position":"top"},{default:a(()=>[t(ct,{label:"分支类型"},{default:a(()=>[t(Is,{modelValue:pt.value,"onUpdate:modelValue":s[16]||(s[16]=b=>pt.value=b),size:"small"},{default:a(()=>[t(Et,{label:"all"},{default:a(()=>s[85]||(s[85]=[y("所有分支")])),_:1}),t(Et,{label:"local"},{default:a(()=>s[86]||(s[86]=[y("本地分支")])),_:1}),t(Et,{label:"remote"},{default:a(()=>s[87]||(s[87]=[y("远程分支")])),_:1})]),_:1},8,["modelValue"])]),_:1}),t(ct,{label:"选择分支"},{default:a(()=>[t(ls,{modelValue:B.value,"onUpdate:modelValue":s[17]||(s[17]=b=>B.value=b),placeholder:"选择要合并的分支",style:{width:"100%"},filterable:""},{default:a(()=>[(f(!0),_(we,null,Be(Ds.value,b=>(f(),q(as,{key:b,label:b,value:b},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(ct,{label:"合并选项"},{default:a(()=>[e("div",rn,[t(wt,{modelValue:U.value.noFf,"onUpdate:modelValue":s[18]||(s[18]=b=>U.value.noFf=b)},{default:a(()=>[t(Te,{content:"创建合并提交,即使可以使用快进合并",placement:"top"},{default:a(()=>s[88]||(s[88]=[e("span",null,"禁用快进合并 (--no-ff)",-1)])),_:1})]),_:1},8,["modelValue"]),t(wt,{modelValue:U.value.squash,"onUpdate:modelValue":s[19]||(s[19]=b=>U.value.squash=b)},{default:a(()=>[t(Te,{content:"将多个提交压缩为一个提交",placement:"top"},{default:a(()=>s[89]||(s[89]=[e("span",null,"压缩提交 (--squash)",-1)])),_:1})]),_:1},8,["modelValue"]),t(wt,{modelValue:U.value.noCommit,"onUpdate:modelValue":s[20]||(s[20]=b=>U.value.noCommit=b)},{default:a(()=>[t(Te,{content:"执行合并但不自动创建提交",placement:"top"},{default:a(()=>s[90]||(s[90]=[e("span",null,"不自动提交 (--no-commit)",-1)])),_:1})]),_:1},8,["modelValue"])])]),_:1}),U.value.noFf&&!U.value.noCommit?(f(),q(ct,{key:0,label:"合并提交信息 (可选)"},{default:a(()=>[t(rt,{modelValue:U.value.message,"onUpdate:modelValue":s[21]||(s[21]=b=>U.value.message=b),type:"textarea",rows:3,placeholder:"输入自定义合并提交信息"},null,8,["modelValue"])]),_:1})):A("",!0)]),_:1})])]),_:1},8,["modelValue"]),t(vt,{title:"储藏列表 (Git Stash)",modelValue:j.value,"onUpdate:modelValue":s[24]||(s[24]=b=>j.value=b),width:"600px","close-on-click-modal":!1},{default:a(()=>[e("div",un,[He((f(),q(Ns,{data:o(c).stashes,stripe:"",style:{width:"100%"},"empty-text":"暂无储藏记录"},{default:a(()=>[t(Pt,{prop:"id",label:"ID",width:"100"}),t(Pt,{prop:"description",label:"描述"}),t(Pt,{label:"操作",width:"220"},{default:a(b=>[t(z,{size:"small",onClick:Je=>w(b.row.id,!1),loading:o(c).isApplyingStash},{default:a(()=>s[93]||(s[93]=[y(" 应用 ")])),_:2},1032,["onClick","loading"]),t(z,{size:"small",type:"primary",onClick:Je=>w(b.row.id,!0),loading:o(c).isApplyingStash},{default:a(()=>s[94]||(s[94]=[y(" 应用并删除 ")])),_:2},1032,["onClick","loading"]),t(z,{size:"small",type:"danger",onClick:Je=>re(b.row.id),loading:o(c).isDroppingStash},{default:a(()=>s[95]||(s[95]=[y(" 删除 ")])),_:2},1032,["onClick","loading"])]),_:1})]),_:1},8,["data"])),[[Js,o(c).isLoadingStashes]]),o(c).stashes.length>0?(f(),_("div",dn,[t(z,{type:"danger",onClick:Ye,loading:o(c).isDroppingStash},{default:a(()=>s[96]||(s[96]=[y(" 清空所有储藏 ")])),_:1},8,["loading"])])):A("",!0)])]),_:1},8,["modelValue"]),t(vt,{title:"储藏更改 (Git Stash)",modelValue:P.value,"onUpdate:modelValue":s[29]||(s[29]=b=>P.value=b),width:"500px","close-on-click-modal":!1},{footer:a(()=>[e("div",pn,[t(z,{onClick:s[28]||(s[28]=b=>P.value=!1)},{default:a(()=>s[100]||(s[100]=[y("取消")])),_:1}),t(z,{type:"primary",onClick:Ee,loading:o(c).isSavingStash},{default:a(()=>s[101]||(s[101]=[y(" 储藏 ")])),_:1},8,["loading"])])]),default:a(()=>[e("div",fn,[s[99]||(s[99]=e("p",null,"将当前工作区的更改储藏起来,稍后可以再次应用。",-1)),t(ns,{"label-position":"top"},{default:a(()=>[t(ct,{label:"储藏说明 (可选)"},{default:a(()=>[t(rt,{modelValue:O.value,"onUpdate:modelValue":s[25]||(s[25]=b=>O.value=b),placeholder:"输入储藏说明(可选)",clearable:""},null,8,["modelValue"])]),_:1}),t(ct,null,{default:a(()=>[t(wt,{modelValue:ae.value,"onUpdate:modelValue":s[26]||(s[26]=b=>ae.value=b)},{default:a(()=>s[97]||(s[97]=[y(" 包含未跟踪文件 (--include-untracked) ")])),_:1},8,["modelValue"])]),_:1}),t(ct,null,{default:a(()=>[t(wt,{modelValue:ke.value,"onUpdate:modelValue":s[27]||(s[27]=b=>ke.value=b)},{default:a(()=>s[98]||(s[98]=[y(" 排除锁定文件 ")])),_:1},8,["modelValue"])]),_:1})]),_:1})])]),_:1},8,["modelValue"])])],2)}}}),mn=Lt(vn,[["__scopeId","data-v-b7f77384"]]),gn={class:"log-header"},yn={class:"log-actions"},hn={key:0,class:"filter-panel-header"},_n={class:"filter-form"},wn={class:"filter-item"},kn={class:"filter-item"},$n={class:"filter-item"},bn={class:"filter-item"},Cn={class:"filter-actions"},Sn={key:0},Tn={key:1,class:"content-area-content"},xn={key:0,class:"graph-view"},Vn={key:0,class:"commit-count"},Ln={class:"graph-controls"},zn={class:"zoom-controls"},Bn={class:"scale-info"},Gn={key:1,class:"table-view-container"},Rn=["onClick"],Dn={class:"commit-message-cell"},Fn={class:"message-content"},jn={key:0,class:"branch-container"},Un={class:"message-text"},Mn={class:"author-name"};const On={class:"commit-detail-container"},An={key:0,class:"commit-info"},En={class:"commit-info-header"},Pn={class:"info-item"},Hn={class:"item-value"},In={class:"info-item"},Nn={class:"item-value"},Jn={class:"info-item"},Wn={class:"item-value"},qn={class:"commit-message-container"},Yn=["innerHTML"],Xn={class:"commit-files-diff"},Kn={class:"files-list"},Zn={key:1},Qn=["onClick"],ei={class:"file-diff"},ti={key:0},si={key:1},ai=["innerHTML"],kt=.5,Ft=1.5,Jt=.1,li=St({__name:"LogList",setup(ve,{expose:c}){const C=yt();let v=[];const g=d(v),E=d(""),G=d(!1),M=ze(()=>C.isLoadingLog||G.value),H=d(!1),pe=d(0),D=d(!1),Q=d(null),ee=d(1),oe=d(!0),W=d(!1),me=d(null),Y=d(!1),S=d(null),x=d([]),F=d(""),X=d(!1),B=d(""),U=d(1),te=d(!1),ce=d(!1),$=d([]),T=d(""),N=d(null),ie=d([]),I=d([]),se=d([]),ue=d(!1),V=d(0),p=d(0),P=d(null),j=ze(()=>g.value);async function O(n=!1,l=1){if(!yt().isGitRepo){E.value="当前目录不是Git仓库";return}try{l>1?W.value=!0:G.value=!0;const h=new URLSearchParams;h.append("page",l.toString()),h.append("all",n.toString()),h.append("with_parents","true"),$.value.length>0&&h.append("author",$.value.join(",")),I.value.length>0&&h.append("branch",I.value.join(",")),T.value&&h.append("message",T.value),N.value&&Array.isArray(N.value)&&N.value.length===2&&(h.append("dateFrom",N.value[0]),h.append("dateTo",N.value[1])),h.append("_t",Date.now().toString());const ne=await(await fetch(`/api/log?${h.toString()}`)).json();if(!ne||!ne.data||!Array.isArray(ne.data)){E.value="加载提交历史失败: 服务器返回数据格式不正确";return}const he=l>1;he?ne.data.forEach(R=>v.push(R)):(v.length=0,ne.data.forEach(R=>v.push(R))),g.value=[...v],ee.value=l,pe.value=ne.total||v.length,oe.value=ne.hasMore===!0,he||(te.value=!0,setTimeout(()=>{te.value=!1},2e3)),!he&&D.value?setTimeout(ae,0):!he&&!D.value&&!n&&ut(()=>{_e(),setTimeout(Ke,200)}),E.value=""}catch(h){E.value="加载提交历史失败: "+(h instanceof Error?h.message:String(h)),l>1&&(oe.value=!1)}finally{l>1?W.value=!1:G.value=!1}}async function ae(){if(Q.value&&v.length!==0)try{Q.value.innerHTML="";const n=ga(Q.value,{orientation:"vertical-reverse",template:"metro",author:"提交者 <committer@example.com>"}),l={},m=n.branch(C.currentBranch||"main");l[C.currentBranch||"main"]=m,v.forEach(h=>{let le=m;if(h.branch){const ne=Ae(h.branch.split(",")[0]);l[ne]||(l[ne]=n.branch(ne)),le=l[ne]}le.commit({hash:h.hash,subject:h.message,author:`${h.author} <${h.email}>`})}),setTimeout(()=>{r()},100)}catch(n){E.value="渲染图表失败: "+(n instanceof Error?n.message:String(n))}}function ke(){D.value=!D.value,D.value&&v.length>0&&setTimeout(ae,0)}function xe(){H.value=!H.value,H.value||(oe.value=!0),ee.value=1,O(H.value),ut(()=>{setTimeout(()=>{!D.value&&!H.value&&(_e(),Ke())},300)})}function Ae(n){return n.includes("HEAD -> ")?n.replace("HEAD -> ",""):n.includes("origin/")?n:n.trim()}function Ee(n){return n.includes("HEAD")?"success":n.includes("origin/")?"warning":"info"}const w=d(null),re=d(null);function Ye(n){if(D.value||!oe.value||W.value||M.value)return;const l=n.target,{scrollTop:m,scrollHeight:h,clientHeight:le}=l;h-m-le<=20&&De()}function _e(){if(!w.value)return;const n=w.value.$el.querySelector(".el-table__body-wrapper");n&&(re.value=n,re.value&&(re.value.removeEventListener("scroll",Ye,!0),re.value.addEventListener("scroll",Ye,!0)))}function Ue(){re.value&&(re.value.removeEventListener("scroll",Ye,!0),re.value=null)}function Me(n){n.key==="Escape"&&Pe.value&&(Pe.value=!1)}ht(()=>{C.isGitRepo?(C.log.length>0?(v.length=0,C.log.forEach(n=>v.push(n)),pe.value=C.log.length,D.value&&setTimeout(()=>{ae()},100)):O(),ot()):E.value="当前目录不是Git仓库",ut(()=>{setTimeout(()=>{_e()},500)}),Ze(()=>w.value,n=>{n&&!D.value&&!H.value&&ut(()=>{_e()})}),window.addEventListener("keydown",Me)}),Ze(()=>C.allBranches,n=>{n&&n.length>0?se.value=[...n].sort():se.value=[]},{immediate:!0}),oa(()=>{Ue(),me.value!==null&&(window.clearInterval(me.value),me.value=null),window.removeEventListener("keydown",Me)});async function Re(){await C.fetchLog(!0),v.length=0,C.log.forEach(n=>v.push(n)),g.value=[...v],pe.value=C.log.length,ee.value=1,oe.value=!1,te.value=!0,setTimeout(()=>{te.value=!1},2e3),D.value&&(await ut(),ae())}Ze(()=>C.log,n=>{try{v.length=0,Array.isArray(n)&&n.forEach(l=>l&&v.push(l)),pe.value=v.length,ee.value=1,g.value=[...v],te.value=!0,setTimeout(()=>{te.value=!1},2e3),D.value&&v.length>0&&setTimeout(ae,0)}catch{}},{immediate:!0}),c({refreshLog:Re});function de(){U.value<Ft&&(U.value=Math.min(Ft,U.value+Jt),k())}function Ne(){U.value>kt&&(U.value=Math.max(kt,U.value-Jt),k())}function k(){if(!Q.value)return;const n=Q.value.querySelector("svg");n&&(n.style.transform=`scale(${U.value})`,n.style.transformOrigin="top left")}function r(){if(!Q.value)return;const n=Q.value.querySelector("svg");if(!n)return;const l=n.getBoundingClientRect().width/U.value,m=Q.value.clientWidth;l>m?U.value=Math.max(kt,m/l):U.value=1,k()}async function K(n){if(n){S.value=n,Y.value=!0,X.value=!0,x.value=[],F.value="",B.value="";try{if(!n.hash||n.hash.length<7){F.value="无效的提交哈希值",X.value=!1;return}const m=await(await fetch(`/api/commit-files?hash=${n.hash}`)).json();m.success&&Array.isArray(m.files)?(x.value=m.files,x.value.length>0?await J(n.hash,x.value[0]):F.value="该提交没有变更文件"):F.value=`获取文件列表失败: ${m.error||"未知错误"}`}catch(l){F.value=`获取提交详情失败: ${l.message}`}finally{X.value=!1}}}async function J(n,l){X.value=!0,B.value=l;try{const h=await(await fetch(`/api/commit-file-diff?hash=${n}&file=${encodeURIComponent(l)}`)).json();h.success?F.value=h.diff||"没有变更内容":F.value=`获取差异失败: ${h.error||"未知错误"}`}catch(m){F.value=`获取差异失败: ${m.message}`}finally{X.value=!1}}function be(n){if(!n)return"";const l=n.split(`
|
|
20
|
+
`);function m(h){return h.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}return l.map(h=>{const le=m(h);return h.startsWith("diff --git")?`<div class="diff-header">${le}</div>`:h.startsWith("---")?`<div class="diff-old-file">${le}</div>`:h.startsWith("+++")?`<div class="diff-new-file">${le}</div>`:h.startsWith("@@")?`<div class="diff-hunk-header">${le}</div>`:h.startsWith("+")?`<div class="diff-added">${le}</div>`:h.startsWith("-")?`<div class="diff-removed">${le}</div>`:`<div class="diff-context">${le}</div>`}).join("")}function Ve(n){return n?n.trim():"(无提交信息)"}function fe(n){if(!n)return"";const l=/^(feat|fix|docs|style|refactor|perf|test|chore|build|ci|revert)(\([^)]+\))?\s*:\s*(.+)$/s,m=n.match(l);return m?m[3].trim():n.trim()}async function ye(n){try{const l=fe(n);await navigator.clipboard.writeText(l),i.success("提交信息已复制到剪贴板")}catch{i.error("复制失败")}}function De(){!oe.value||W.value||M.value||O(H.value,ee.value+1)}function Ce(){$.value=[],I.value=[],T.value="",N.value=null,ee.value=1,O(H.value,1)}function $e(){ee.value=1,O(H.value,1)}async function ot(){try{const l=await(await fetch("/api/authors")).json();l.success&&Array.isArray(l.authors)?ie.value=l.authors.sort():Qe()}catch{Qe()}}function Qe(){const n=new Set;g.value.forEach(l=>{l.author&&n.add(l.author)}),ie.value=Array.from(n).sort()}Ze(()=>g.value,()=>{},{deep:!0});function Z(n,l,m){m.preventDefault(),V.value=m.clientY,p.value=m.clientX,P.value=n,ue.value=!0;const h=()=>{ue.value=!1,document.removeEventListener("click",h)};setTimeout(()=>{document.addEventListener("click",h)},0)}async function nt(n){if(n)try{await Ie.confirm(`确定要撤销提交 ${n.hash.substring(0,7)} 吗?这将创建一个新的提交来撤销这次提交的更改。`,"撤销提交确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const m=await(await fetch("/api/revert-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:n.hash})})).json();m.success?(i.success(m.message||"已成功撤销提交"),Re(),C.fetchStatus(),C.getBranchStatus()):i.error(m.error||"撤销提交失败")}catch(l){l!=="cancel"&&i.error("撤销提交失败: "+(l.message||l))}}async function Xe(n){if(n)try{await Ie.confirm(`确定要将提交 ${n.hash.substring(0,7)} Cherry-Pick 到当前分支吗?`,"Cherry-Pick确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const m=await(await fetch("/api/cherry-pick-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:n.hash})})).json();m.success?(i.success(m.message||"已成功Cherry-Pick提交"),Re(),C.fetchStatus(),C.getBranchStatus()):i.error(m.error||"Cherry-Pick提交失败")}catch(l){l!=="cancel"&&i.error("Cherry-Pick提交失败: "+(l.message||l))}}async function qe(n){if(n)try{await navigator.clipboard.writeText(n.hash),i.success(`已复制提交哈希: ${n.hash.substring(0,7)}`)}catch(l){i.error(`复制提交哈希失败: ${l.message}`)}}async function et(n){if(n)try{await Ie.confirm(`确定要将当前分支重置(hard)到提交 ${n.hash.substring(0,7)} 吗?
|
|
21
|
+
|
|
22
|
+
警告:这将丢失该提交之后的所有更改!`,"重置确认",{confirmButtonText:"确认重置",cancelButtonText:"取消",type:"warning",dangerouslyUseHTMLString:!0});const m=await(await fetch("/api/reset-to-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:n.hash})})).json();m.success?(i.success(m.message||"已成功重置到指定提交"),Re(),C.fetchStatus(),C.getBranchStatus()):i.error(m.error||"重置到指定提交失败")}catch(l){l!=="cancel"&&i.error("重置到指定提交失败: "+(l.message||l))}}function Ke(){if(D.value||!oe.value||W.value||M.value||H.value)return;if(!re.value){_e();return}const{scrollTop:n,scrollHeight:l,clientHeight:m}=re.value;l-n-m<=50&&De()}Ze(()=>D.value,n=>{!n&&!H.value&&ut(()=>{_e(),setTimeout(Ke,200)})});const Pe=d(!1);function _t(){Pe.value=!Pe.value,ut(()=>{D.value&&Q.value&&ae()})}return(n,l)=>{var he;const m=Tt,h=qt,le=Qt,ne=Yt;return f(),_(we,null,[e("div",{class:ge(["card",{"fullscreen-mode":Pe.value}])},[e("div",gn,[l[13]||(l[13]=e("div",{class:"header-left"},[e("h2",null,"提交历史")],-1)),e("div",yn,[D.value?A("",!0):(f(),q(o(je),{key:0,type:ce.value?"primary":"default",size:"small",onClick:l[0]||(l[0]=R=>ce.value=!ce.value),class:ge(["action-button filter-button icon-only-button",{"active-filter":ce.value}])},{icon:a(()=>[t(m,null,{default:a(()=>[t(o(na))]),_:1})]),_:1},8,["type","class"])),t(o(je),{type:"primary",size:"small",onClick:ke,class:ge(["action-button view-mode-button icon-only-button",{"active-view":D.value}])},{icon:a(()=>[t(m,null,{default:a(()=>[(f(),q(gt(D.value?o(_s):o(ia))))]),_:1})]),_:1},8,["class"]),He(t(o(je),{type:"success",size:"small",onClick:xe,loading:M.value,class:ge(["action-button commit-display-button",{"active-commits":H.value}])},{icon:a(()=>[t(m,null,{default:a(()=>[(f(),q(gt(H.value?o(ra):o(ca))))]),_:1})]),default:a(()=>[y(" "+L(H.value?"显示分页加载":"显示所有提交"),1)]),_:1},8,["loading","class"]),[[dt,!1]]),t(o(je),{type:"info",size:"small",onClick:_t,class:ge(["action-button fullscreen-button icon-only-button",{"active-fullscreen":Pe.value}])},{icon:a(()=>[t(m,null,{default:a(()=>[(f(),q(gt(Pe.value?o(Wt):o(ua))))]),_:1})]),_:1},8,["class"]),t(o(je),{circle:"",size:"small",onClick:l[1]||(l[1]=R=>Re()),class:ge([{"refresh-button-animated":te.value},"action-button refresh-button"])},{default:a(()=>[M.value?(f(),q(m,{key:1},{default:a(()=>[t(o(da))]),_:1})):(f(),q(m,{key:0},{default:a(()=>[t(o(Xt))]),_:1}))]),_:1},8,["class"])])]),ce.value&&!D.value?(f(),_("div",hn,[e("div",_n,[e("div",wn,[t(o(Ut),{modelValue:$.value,"onUpdate:modelValue":l[2]||(l[2]=R=>$.value=R),placeholder:"选择作者",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:a(()=>l[14]||(l[14]=[e("span",{class:"compact-label"},"作者",-1)])),default:a(()=>[(f(!0),_(we,null,Be(ie.value,R=>(f(),q(o(jt),{key:R,label:R,value:R},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",kn,[t(o(Ut),{modelValue:I.value,"onUpdate:modelValue":l[3]||(l[3]=R=>I.value=R),placeholder:"选择分支",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:a(()=>l[15]||(l[15]=[e("span",{class:"compact-label"},"分支",-1)])),default:a(()=>[(f(!0),_(we,null,Be(se.value,R=>(f(),q(o(jt),{key:R,label:R,value:R},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",$n,[t(o(Zt),{modelValue:T.value,"onUpdate:modelValue":l[4]||(l[4]=R=>T.value=R),placeholder:"提交信息关键词",clearable:"",class:"filter-input",size:"small"},{prefix:a(()=>l[16]||(l[16]=[e("span",{class:"compact-label"},"信息",-1)])),_:1},8,["modelValue"])]),e("div",bn,[t(o(fa),{modelValue:N.value,"onUpdate:modelValue":l[5]||(l[5]=R=>N.value=R),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",format:"YYYY-MM-DD","value-format":"YYYY-MM-DD",class:"filter-input date-range",size:"small"},{prefix:a(()=>l[17]||(l[17]=[e("span",{class:"compact-label"},"日期",-1)])),_:1},8,["modelValue"])]),e("div",Cn,[t(o(je),{type:"primary",size:"small",onClick:$e,class:"filter-action-button"},{default:a(()=>l[18]||(l[18]=[y("应用")])),_:1}),t(o(je),{type:"info",size:"small",onClick:Ce,class:"filter-action-button"},{default:a(()=>l[19]||(l[19]=[y("重置")])),_:1})])])])):A("",!0),e("div",{class:ge(["content-area",{"with-filter":ce.value&&!D.value}])},[E.value?(f(),_("div",Sn,L(E.value),1)):(f(),_("div",Tn,[D.value?(f(),_("div",xn,[o(v).length>0?(f(),_("div",Vn," 显示 "+L(o(v).length)+" 条提交记录 "+L(H.value?"(全部)":"(分页加载,每页20条)"),1)):A("",!0),e("div",Ln,[e("div",zn,[t(o(je),{type:"primary",circle:"",size:"small",onClick:Ne,disabled:U.value<=kt},{default:a(()=>[t(m,null,{default:a(()=>[t(o(pa))]),_:1})]),_:1},8,["disabled"]),t(o(va),{modelValue:U.value,"onUpdate:modelValue":l[6]||(l[6]=R=>U.value=R),min:kt,max:Ft,step:Jt,onChange:k,class:"zoom-slider"},null,8,["modelValue"]),t(o(je),{type:"primary",circle:"",size:"small",onClick:de,disabled:U.value>=Ft},{default:a(()=>[t(m,null,{default:a(()=>[t(o(ma))]),_:1})]),_:1},8,["disabled"]),t(o(je),{type:"primary",size:"small",onClick:r},{default:a(()=>l[20]||(l[20]=[y(" 自适应大小 ")])),_:1})]),e("div",Bn," 缩放: "+L(Math.round(U.value*100))+"% ",1)]),e("div",{ref_key:"graphContainer",ref:Q,class:"graph-container"},null,512)])):(f(),_("div",Gn,[He((f(),q(o(Cs),{ref_key:"tableRef",ref:w,data:j.value,stripe:"",border:"",class:"log-table","empty-text":M.value?"加载中...":"没有匹配的提交记录",height:"450",onRowContextmenu:Z},{default:a(()=>[t(o(bt),{label:"哈希",width:"80",resizable:""},{default:a(R=>[e("span",{class:"commit-hash",onClick:Ge=>K(R.row)},L(R.row.hash.substring(0,6)),9,Rn)]),_:1}),t(o(bt),{label:"提交信息","min-width":"300"},{default:a(R=>[e("div",Dn,[e("div",Fn,[R.row.branch?(f(),_("div",jn,[(f(!0),_(we,null,Be(R.row.branch.split(","),(Ge,Oe)=>(f(),q(o(xt),{key:Oe,size:"small",type:Ee(Ge),class:"branch-tag"},{default:a(()=>[y(L(Ae(Ge)),1)]),_:2},1032,["type"]))),128))])):A("",!0),e("span",Un,L(R.row.message),1),t(o(je),{type:"text",icon:o(Ct),size:"small",onClick:We(Ge=>ye(R.row.message),["stop"]),class:"copy-message-btn",title:"复制纯净提交信息(不含类型前缀)"},null,8,["icon","onClick"])])])]),_:1}),t(o(bt),{prop:"date",label:"日期",width:"150",resizable:""}),t(o(bt),{label:"作者",width:"100",resizable:""},{default:a(R=>[t(h,{content:R.row.email,placement:"top","hide-after":1e3},{default:a(()=>[e("span",Mn,L(R.row.author),1)]),_:2},1032,["content"])]),_:1})]),_:1},8,["data","empty-text"])),[[ne,M.value]]),(H.value,A("",!0))]))]))],2),t(o(Vt),{modelValue:Y.value,"onUpdate:modelValue":l[7]||(l[7]=R=>Y.value=R),title:`提交详情: ${(he=S.value)!=null&&he.hash?S.value.hash.substring(0,7):"未知"}`,width:"80%","destroy-on-close":"",class:"commit-detail-dialog"},{default:a(()=>[He((f(),_("div",On,[S.value?(f(),_("div",An,[e("div",En,[e("div",Pn,[l[24]||(l[24]=e("span",{class:"item-label"},"哈希:",-1)),e("span",Hn,L(S.value.hash),1)]),e("div",In,[l[25]||(l[25]=e("span",{class:"item-label"},"作者:",-1)),e("span",Nn,L(S.value.author)+" <"+L(S.value.email)+">",1)]),e("div",Jn,[l[26]||(l[26]=e("span",{class:"item-label"},"日期:",-1)),e("span",Wn,L(S.value.date),1)])]),e("div",qn,[l[27]||(l[27]=e("div",{class:"message-label"},"提交信息:",-1)),e("div",{class:"message-content",innerHTML:Ve(S.value.message).replace(/\n/g,"<br>")},null,8,Yn)])])):A("",!0),e("div",Xn,[e("div",Kn,[l[28]||(l[28]=e("h3",null,"变更文件",-1)),x.value.length===0?(f(),q(le,{key:0,description:"没有找到变更文件"})):(f(),_("ul",Zn,[(f(!0),_(we,null,Be(x.value,R=>(f(),_("li",{key:R,class:ge({"active-file":R===B.value}),onClick:Ge=>J(S.value.hash,R)},L(R),11,Qn))),128))]))]),e("div",ei,[B.value?(f(),_("h3",ti," 文件差异: "+L(B.value),1)):(f(),_("h3",si,"文件差异")),!F.value&&!X.value?(f(),q(le,{key:2,description:"选择文件查看差异"})):F.value?(f(),_("div",{key:3,innerHTML:be(F.value),class:"diff-content"},null,8,ai)):A("",!0)])])])),[[ne,X.value]])]),_:1},8,["modelValue","title"])],2),He(e("div",{class:ge(["context-menu",{"fullscreen-context-menu":Pe.value}]),style:$t({top:V.value+"px",left:p.value+"px"})},[e("div",{class:"context-menu-item",onClick:l[8]||(l[8]=R=>K(P.value))},l[29]||(l[29]=[e("i",{class:"el-icon-view"},null,-1),y(" 查看详情 ")])),e("div",{class:"context-menu-item",onClick:l[9]||(l[9]=R=>qe(P.value))},l[30]||(l[30]=[e("i",{class:"el-icon-document-copy"},null,-1),y(" 复制提交哈希 ")])),e("div",{class:"context-menu-item",onClick:l[10]||(l[10]=R=>et(P.value))},l[31]||(l[31]=[e("i",{class:"el-icon-refresh-right"},null,-1),y(" 重置到该提交(hard) ")])),e("div",{class:"context-menu-item",onClick:l[11]||(l[11]=R=>nt(P.value))},l[32]||(l[32]=[e("i",{class:"el-icon-delete"},null,-1),y(" 撤销提交 (Revert) ")])),e("div",{class:"context-menu-item",onClick:l[12]||(l[12]=R=>Xe(P.value))},l[33]||(l[33]=[e("i",{class:"el-icon-edit"},null,-1),y(" Cherry-Pick 到当前分支 ")]))],6),[[dt,ue.value]])],64)}}}),oi=Lt(li,[["__scopeId","data-v-081ce552"]]),ni={class:"dialog-header"},ii={class:"header-actions"},ri={class:"dialog-content"},ci={key:0,class:"loading-state"},ui={key:2,class:"history-list"},di=["onClick"],fi={class:"command-info"},pi={class:"command-text"},vi={class:"command-meta"},mi={class:"timestamp"},gi={class:"duration"},yi={class:"item-actions"},hi={key:0,class:"item-details"},_i={key:0,class:"output-section"},wi={class:"output-header"},ki={class:"output-content"},$i={key:0,class:"truncation-notice"},bi={class:"output-header"},Ci={class:"output-content"},Si={key:0,class:"truncation-notice"},Ti={key:2,class:"output-section error"},xi={class:"output-content"},Vi=St({__name:"CommandHistory",setup(ve){const c=yt(),C=d([]),v=d(!1),g=d(!1),E=d(!1),G=d(!1),M=d(new Set),H=d(!1),pe=d(!1);function D(){pe.value=!0,C.value.length===0&&Q()}async function Q(){try{if(v.value=!0,c.socket&&c.socket.connected)c.socket.emit("request_full_history");else{const T=await(await fetch("/api/command-history")).json();T.success?C.value=T.history:i.error(`加载命令历史失败: ${T.error}`)}}catch($){i.error(`加载命令历史失败: ${$.message}`)}finally{v.value=!1}}async function ee(){if(C.value.length===0){i.warning("没有可复制的命令历史");return}try{E.value=!0;const $=C.value.map(T=>{let N=`# ${me(T.timestamp)} (耗时: ${Y(T.executionTime)}) - ${T.success?"成功":"失败"}
|
|
23
|
+
`;if(N+=`${T.command}
|
|
24
|
+
`,T.stdout&&(N+=`
|
|
25
|
+
# 输出:
|
|
26
|
+
${T.stdout}
|
|
27
|
+
`),T.stderr){const ie=B(T.command)?"输出信息":"错误输出";N+=`
|
|
28
|
+
# ${ie}:
|
|
29
|
+
${T.stderr}
|
|
30
|
+
`}return T.error&&(N+=`
|
|
31
|
+
# 错误信息:
|
|
32
|
+
${T.error}
|
|
33
|
+
`),N}).join(`
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
`);await navigator.clipboard.writeText($),i.success("命令历史已复制到剪贴板")}catch($){i.error(`复制失败: ${$.message}`)}finally{E.value=!1}}async function oe(){if(C.value.length===0){i.warning("没有可复制的命令");return}try{H.value=!0;const $=C.value.map(T=>T.command).join(`
|
|
37
|
+
`);await navigator.clipboard.writeText($),i.success("命令列表已复制到剪贴板")}catch($){i.error(`复制失败: ${$.message}`)}finally{H.value=!1}}async function W(){try{if(await Ie.confirm("确定要清空所有命令历史记录吗?此操作不可恢复。","清空命令历史",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),g.value=!0,c.socket&&c.socket.connected)c.socket.emit("clear_command_history");else{const T=await(await fetch("/api/clear-command-history",{method:"POST",headers:{"Content-Type":"application/json"}})).json();T.success?(C.value=[],i.success("命令历史已清空")):i.error(`清空命令历史失败: ${T.error}`)}}catch($){$!=="cancel"&&$.toString()!=="Error: cancel"&&i.error(`清空命令历史失败: ${$.message}`)}finally{g.value=!1}}function me($){return new Date($).toLocaleString()}function Y($){return $<1e3?`${$}ms`:`${($/1e3).toFixed(2)}s`}function S($){M.value.has($)?M.value.delete($):M.value.add($)}function x($){return M.value.has($)}async function F($){try{await navigator.clipboard.writeText($),i.success("命令已复制到剪贴板")}catch(T){i.error(`复制失败: ${T.message}`)}}function X($){return $.includes("git push")||$.includes("git-push")}function B($){return!!X($)}async function U($){try{let T="";if($.stdout&&(T+=`标准输出:
|
|
38
|
+
${$.stdout}
|
|
39
|
+
|
|
40
|
+
`),$.stderr){const N=B($.command)?"输出信息":"错误输出";T+=`${N}:
|
|
41
|
+
${$.stderr}
|
|
42
|
+
|
|
43
|
+
`}$.error&&(T+=`错误信息:
|
|
44
|
+
${$.error}`),await navigator.clipboard.writeText(T.trim()),i.success("输出已复制到剪贴板")}catch(T){i.error(`复制失败: ${T.message}`)}}function te(){if(!c.socket){console.error("Socket实例不可用");return}c.socket.on("initial_command_history",$=>{C.value=$.history,G.value=!0}),c.socket.on("command_history_update",$=>{C.value.unshift($.newCommand),C.value.length>100&&C.value.pop(),G.value=!0}),c.socket.on("full_command_history",$=>{C.value=$.history,v.value=!1,G.value=!0}),c.socket.on("command_history_cleared",$=>{$.success&&(C.value=[],i.success("命令历史已清空")),g.value=!1}),c.socket.on("connect",()=>{G.value=!0,i.success("已连接到实时命令历史")}),c.socket.on("disconnect",()=>{G.value=!1,i.warning("实时命令历史连接已断开")})}function ce(){c.socket&&(c.socket.off("initial_command_history"),c.socket.off("command_history_update"),c.socket.off("full_command_history"),c.socket.off("command_history_cleared"))}return ht(()=>{te(),c.socket||(console.log("尝试初始化Socket连接"),c.initSocketConnection())}),ps(()=>{ce()}),($,T)=>{const N=je,ie=xt,I=Tt,se=Qt,ue=Kt,V=Vt;return f(),_(we,null,[t(N,{type:"primary",icon:o(ya),onClick:D,class:"command-history-button",title:"查看Git命令历史"},{default:a(()=>T[1]||(T[1]=[y(" 命令历史 ")])),_:1},8,["icon"]),(f(),q(ha,{to:"body"},[t(V,{modelValue:pe.value,"onUpdate:modelValue":T[0]||(T[0]=p=>pe.value=p),title:"Git 命令历史",width:"80%",top:"5vh","destroy-on-close":"",class:"command-history-dialog","z-index":99999,"append-to-body":"",modal:""},{header:a(()=>[e("div",ni,[T[2]||(T[2]=e("h2",null,"Git 命令历史",-1)),e("div",ii,[t(ie,{type:G.value?"success":"danger",size:"small",effect:"dark",class:"socket-status"},{default:a(()=>[y(L(G.value?"实时更新":"未连接"),1)]),_:1},8,["type"]),t(N,{type:"success",icon:o(Ct),circle:"",size:"small",onClick:oe,loading:H.value,class:"copy-commands-button",title:"只复制命令列表(不含输出)",disabled:C.value.length===0},null,8,["icon","loading","disabled"]),t(N,{type:"primary",icon:o(Ct),circle:"",size:"small",onClick:ee,loading:E.value,class:"copy-all-button",title:"复制完整命令历史(含输出)",disabled:C.value.length===0},null,8,["icon","loading","disabled"]),t(N,{type:"danger",icon:o(ws),circle:"",size:"small",onClick:W,loading:g.value,class:"clear-button",title:"清空命令历史",disabled:C.value.length===0},null,8,["icon","loading","disabled"])])])]),default:a(()=>[e("div",ri,[v.value&&C.value.length===0?(f(),_("div",ci,[t(I,{class:"loading-icon is-loading"},{default:a(()=>T[3]||(T[3]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32zM195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0zm-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z"})],-1)])),_:1}),T[4]||(T[4]=e("div",{class:"loading-text"},"加载命令历史...",-1))])):C.value.length===0?(f(),q(se,{key:1,description:"暂无命令历史"})):(f(),_("div",ui,[(f(!0),_(we,null,Be(C.value,(p,P)=>(f(),_("div",{key:P,class:ge(["history-item",{"is-error":!p.success}])},[e("div",{class:"item-header",onClick:j=>S(P)},[e("div",fi,[e("div",pi,[t(ie,{size:"small",type:p.success?"success":"danger",effect:"dark",class:"status-tag"},{default:a(()=>[y(L(p.success?"成功":"失败"),1)]),_:2},1032,["type"]),e("code",null,L(p.command),1)]),e("div",vi,[e("span",mi,L(me(p.timestamp)),1),e("span",gi,"耗时: "+L(Y(p.executionTime)),1)])]),e("div",yi,[t(N,{type:"primary",icon:o(Ct),circle:"",size:"small",onClick:We(j=>F(p.command),["stop"]),title:"复制命令"},null,8,["icon","onClick"]),t(N,{type:x(P)?"primary":"default",icon:x(P)?o(hs):o(mt),circle:"",size:"small",onClick:We(j=>S(P),["stop"]),title:"展开/收起"},null,8,["type","icon","onClick"])])],8,di),x(P)?(f(),_("div",hi,[p.stdout?(f(),_("div",_i,[e("div",wi,[T[5]||(T[5]=e("h4",null,"标准输出",-1)),t(N,{type:"primary",icon:o(Ct),circle:"",size:"small",onClick:j=>U(p),title:"复制输出"},null,8,["icon","onClick"])]),e("pre",ki,L(p.stdout),1),p.isStdoutTruncated?(f(),_("div",$i,[t(ue,{type:"info",closable:!1,"show-icon":""},{default:a(()=>T[6]||(T[6]=[y(" 输出内容过长已被截断,请直接执行命令查看完整输出 ")])),_:1})])):A("",!0)])):A("",!0),p.stderr?(f(),_("div",{key:1,class:ge(["output-section",B(p.command)?"":"error"])},[e("div",bi,[e("h4",null,L(B(p.command)?"输出信息":"错误输出"),1)]),e("pre",Ci,L(p.stderr),1),p.isStderrTruncated?(f(),_("div",Si,[t(ue,{type:"info",closable:!1,"show-icon":""},{default:a(()=>[y(L(B(p.command)?"输出信息":"错误输出")+"内容过长已被截断,请直接执行命令查看完整输出 ",1)]),_:2},1024)])):A("",!0)],2)):A("",!0),p.error?(f(),_("div",Ti,[T[7]||(T[7]=e("div",{class:"output-header"},[e("h4",null,"错误信息")],-1)),e("pre",xi,L(p.error),1)])):A("",!0)])):A("",!0)],2))),128))]))])]),_:1},8,["modelValue"])]))],64)}}}),Li=Lt(Vi,[["__scopeId","data-v-3e9f6472"]]),zi="data:image/svg+xml,%3csvg%20width='200'%20height='200'%20viewBox='0%200%20200%20200'%20xmlns='http://www.w3.org/2000/svg'%3e%3c!--%20主分支%20--%3e%3cline%20x1='40'%20y1='40'%20x2='40'%20y2='160'%20stroke='%2334495e'%20stroke-width='8'%20stroke-linecap='round'%20/%3e%3c!--%20特性分支%20--%3e%3cpath%20d='M40,70%20C60,70%2080,90%2080,110%20L80,130'%20stroke='%233498db'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20开发分支%20--%3e%3cpath%20d='M40,100%20C60,100%20100,110%20100,130%20L100,160'%20stroke='%232ecc71'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20修复分支%20--%3e%3cpath%20d='M40,130%20C60,130%20120,140%20120,160'%20stroke='%23e74c3c'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20合并点%20--%3e%3cpath%20d='M80,130%20C80,145%2060,145%2040,145'%20stroke='%233498db'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20节点%20--%3e%3ccircle%20cx='40'%20cy='40'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='70'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='100'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='130'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='145'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='160'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='80'%20cy='130'%20r='10'%20fill='%233498db'%20/%3e%3ccircle%20cx='100'%20cy='160'%20r='10'%20fill='%232ecc71'%20/%3e%3ccircle%20cx='120'%20cy='160'%20r='10'%20fill='%23e74c3c'%20/%3e%3c/svg%3e",Bi={class:"main-header"},Gi={class:"header-left"},Ri=["src"],Di={class:"header-info"},Fi={key:0,id:"user-info"},ji={class:"user-name"},Ui={class:"user-email"},Mi={key:1,id:"user-info"},Oi={class:"directory-selector"},Ai={class:"directory-display"},Ei={class:"directory-icon"},Pi=["title"],Hi={class:"directory-actions"},Ii={key:2,class:"command-history-section"},Ni={class:"main-container"},Ji={key:0,class:"loading-container"},Wi={class:"loading-spinner"},qi={key:1,class:"grid-layout"},Yi={class:"git-status-panel"},Xi={key:0,class:"commit-form-panel"},Ki={key:0,class:"card"},Zi={class:"tips"},Qi={key:1,class:"commit-form-panel"},er={key:2,class:"log-list-panel"},tr={class:"dialog-footer"},sr={class:"main-footer"},ar={key:0,class:"branch-info"},lr={class:"branch-wrapper"},or={key:1,class:"footer-right"},nr={class:"repo-url"},ir={class:"dialog-footer"},rr={class:"directory-input-group"},cr={class:"recent-directories"},ur={class:"dialog-footer"},dr=St({__name:"App",setup(ve){const c=d(""),C=d(null),v=d(null),g=yt(),E=es(),G=d(!1),M=d("");function H(){E.config&&(c.value=`默认提交信息: ${E.config.defaultCommitMessage}`)}async function pe(){try{const r=await(await fetch("/api/current_directory")).json();return M.value=r.directory||"未知目录",r}catch(k){return console.error("获取当前目录失败:",k),{directory:"未知目录",isGitRepo:!1}}}ht(async()=>{console.log("---------- 页面初始化开始 ----------");try{const k=await pe();E.isLoaded||await E.loadConfig(),H(),g.isGitRepo=k.isGitRepo===!0,g.lastCheckedTime=Date.now(),g.isGitRepo?await Promise.all([g.getCurrentBranch(!0),g.getAllBranches(),g.getUserInfo(),g.getRemoteUrl(),g.getBranchStatus(!0)]):i.warning("当前目录不是Git仓库,部分功能将不可用")}catch(k){console.error("初始化失败:",k)}finally{G.value=!0,console.log("---------- 页面初始化完成 ----------"),setTimeout(()=>{ue()},100)}});const D=d(!1),Q=d(""),ee=d("");async function oe(){await g.createBranch(Q.value,ee.value)&&(D.value=!1,Q.value="",v.value&&v.value.refreshStatus(),C.value&&C.value.refreshLog())}function W(){ee.value=g.currentBranch,D.value=!0}async function me(k){await g.changeBranch(k)&&(v.value&&v.value.refreshStatus(),C.value&&C.value.refreshLog())}const Y=d(!1),S=d(""),x=d("");function F(){S.value=g.userName,x.value=g.userEmail,Y.value=!0}async function X(){if(!S.value||!x.value){i.warning("用户名和邮箱不能为空");return}await g.restoreUserConfig(S.value,x.value)&&(Y.value=!1)}async function B(){await g.clearUserConfig()&&(S.value="",x.value="")}let U=!1,te=!1,ce=!1,$=0,T=0,N="",ie="",I=null;function se(){const k=document.querySelector(".grid-layout");if(!k)return;const r=getComputedStyle(k).gridTemplateColumns.split(" "),K=getComputedStyle(k).gridTemplateRows.split(" ");if(r.length>=3&&K.length>=3){const J=parseFloat(r[0]),be=parseFloat(r[2]),Ve=J+be,fe=J/Ve,ye=parseFloat(K[0]),De=parseFloat(K[2]),Ce=ye+De,$e=ye/Ce;localStorage.setItem("zen-gitsync-layout-left-ratio",fe.toString()),localStorage.setItem("zen-gitsync-layout-top-ratio",$e.toString()),console.log(`布局比例已保存 - 左侧: ${(fe*100).toFixed(0)}%, 上方: ${($e*100).toFixed(0)}%`),localStorage.setItem("zen-gitsync-layout-bottom-left-ratio",fe.toString()),console.log(`底部布局比例已保存 - 左侧: ${(fe*100).toFixed(0)}%`)}}function ue(){const k=document.querySelector(".grid-layout");if(!k)return;const r=localStorage.getItem("zen-gitsync-layout-left-ratio"),K=localStorage.getItem("zen-gitsync-layout-top-ratio");if(r){const J=parseFloat(r),be=1-J;k.style.gridTemplateColumns=`${J}fr 8px ${be}fr`,console.log(`已恢复左侧比例: ${(J*100).toFixed(0)}%`)}else k.style.gridTemplateColumns="1fr 8px 3fr";if(K){const J=parseFloat(K),be=1-J;k.style.gridTemplateRows=`${J}fr 8px ${be}fr`,console.log(`已恢复上方比例: ${(J*100).toFixed(0)}%`)}}function V(k){var J;const r=k.currentTarget;if(!r||!r.id)return;I=r.id,I==="v-resizer"?U=!0:I==="v-resizer-bottom"&&(te=!0),$=k.clientX;const K=document.querySelector(".grid-layout");N=getComputedStyle(K).gridTemplateColumns,(J=document.getElementById(I))==null||J.classList.add("active"),document.addEventListener("mousemove",p),document.addEventListener("mouseup",P),k.preventDefault()}function p(k){if(!U&&!te)return;const r=document.querySelector(".grid-layout"),K=k.clientX-$,J=N.split(" ");if(J.length>=3){const be=parseFloat(J[0]),Ve=parseFloat(J[2]),fe=be+Ve,ye=(be+K/r.clientWidth*fe)/fe,De=1-ye,Ce=.1,$e=.5;ye<Ce?r.style.gridTemplateColumns=`${Ce}fr 8px ${1-Ce}fr`:ye>$e?r.style.gridTemplateColumns=`${$e}fr 8px ${1-$e}fr`:r.style.gridTemplateColumns=`${ye}fr 8px ${De}fr`}}function P(){var k,r;U=!1,te=!1,(k=document.getElementById("v-resizer"))==null||k.classList.remove("active"),(r=document.getElementById("v-resizer-bottom"))==null||r.classList.remove("active"),document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",P),se()}function j(k){var K;ce=!0,T=k.clientY;const r=document.querySelector(".grid-layout");ie=getComputedStyle(r).gridTemplateRows,(K=document.getElementById("h-resizer"))==null||K.classList.add("active"),document.addEventListener("mousemove",O),document.addEventListener("mouseup",ae),k.preventDefault()}function O(k){if(!ce)return;const r=document.querySelector(".grid-layout"),K=k.clientY-T,J=ie.split(" ");if(J.length>=3){const be=parseFloat(J[0]),Ve=parseFloat(J[2]),fe=be+Ve,ye=(be+K/r.clientHeight*fe)/fe,De=1-ye,Ce=.2,$e=.8;ye<Ce?r.style.gridTemplateRows=`${Ce}fr 8px ${1-Ce}fr`:ye>$e?r.style.gridTemplateRows=`${$e}fr 8px ${1-$e}fr`:r.style.gridTemplateRows=`${ye}fr 8px ${De}fr`}}function ae(){var k;ce=!1,(k=document.getElementById("h-resizer"))==null||k.classList.remove("active"),document.removeEventListener("mousemove",O),document.removeEventListener("mouseup",ae),se()}const ke=d(!1),xe=d(""),Ae=d(!1),Ee=d([]);async function w(){if(!M.value){i.warning("当前目录路径为空");return}try{await navigator.clipboard.writeText(M.value),i.success("已复制目录路径")}catch(k){console.error("复制目录路径失败:",k),i.error(`复制失败: ${k.message}`)}}function re(){xe.value=M.value,ke.value=!0,Ye()}async function Ye(){try{const r=await(await fetch("/api/recent_directories")).json();r.success&&Array.isArray(r.directories)&&(Ee.value=r.directories)}catch(k){console.error("获取最近目录失败:",k)}}async function _e(){if(!xe.value){i.warning("目录路径不能为空");return}try{Ae.value=!0;const r=await(await fetch("/api/change_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:xe.value})})).json();r.success?(i.success("已切换工作目录"),M.value=r.directory,ke.value=!1,await Ue(r.directory),g.isGitRepo=r.isGitRepo,r.isGitRepo?(await Promise.all([g.getCurrentBranch(),g.getAllBranches(),g.getUserInfo(),g.getRemoteUrl()]),v.value&&v.value.refreshStatus(),C.value&&C.value.refreshLog()):(i.warning("当前目录不是Git仓库,部分功能将不可用"),g.$reset())):i.error(r.error||"切换目录失败")}catch(k){i.error(`切换目录失败: ${k.message}`)}finally{Ae.value=!1}}async function Ue(k){try{await fetch("/api/save_recent_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:k})})}catch(r){console.error("保存最近目录失败:",r)}}async function Me(){try{if(!M.value){i.warning("当前目录路径为空");return}const r=await(await fetch("/api/open_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:M.value})})).json();r.success?i.success("已在文件管理器中打开目录"):r.error&&i.error(r.error)}catch(k){console.error("打开目录失败:",k),i.error(`打开目录失败: ${k.message}`)}}async function Re(){try{const r=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:xe.value||M.value})})).json();r.success?de(r):r.error&&i.error(r.error)}catch(k){console.error("浏览目录失败:",k),i.error(`浏览目录失败: ${k.message}`)}}function de(k){!k||!k.items||Ie.alert(Fe("div",{class:"directory-browser"},[Fe("div",{class:"current-path"},[Fe("span",{class:"path-label"},"当前路径: "),Fe("span",{class:"path-value"},k.path)]),Fe("div",{class:"directory-list"},[k.parentPath?Fe("div",{class:"directory-item parent-dir",onClick:()=>{Ne(k.parentPath)}},[Fe("span",{class:"dir-icon"},Fe("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#E6A23C"}},[Fe("path",{d:"M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"})])),Fe("span",{class:"dir-name"},"返回上级目录")]):null,...k.items.map(r=>Fe("div",{class:"directory-item",onClick:()=>{Ne(r.path)}},[Fe("span",{class:"dir-icon"},Fe("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#409EFF"}},[Fe("path",{d:"M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"})])),Fe("span",{class:"dir-name"},r.name)]))])]),"浏览并选择目录",{confirmButtonText:"使用当前目录",customClass:"directory-browser-dialog",callback:r=>{r==="confirm"&&(xe.value=k.path)}})}async function Ne(k){try{Ie.close(),setTimeout(async()=>{try{const K=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:k})})).json();K.success?de(K):K.error&&i.error(K.error)}catch(r){console.error("浏览目录失败:",r),i.error(`浏览目录失败: ${r.message}`)}},100)}catch(r){console.error("处理目录选择时出错:",r),i.error(`处理目录选择时出错: ${r.message}`)}}return(k,r)=>{const K=Tt,J=je,be=ks,Ve=Zt,fe=bs,ye=jt,De=Ut,Ce=$s,$e=Vt,ot=Kt,Qe=xt;return f(),_(we,null,[e("header",Bi,[e("div",Gi,[e("img",{src:o(zi),alt:"Zen GitSync Logo",class:"logo"},null,8,Ri),r[14]||(r[14]=e("h1",null,"Zen GitSync UI",-1))]),e("div",Di,[o(g).userName&&o(g).userEmail?(f(),_("div",Fi,[r[15]||(r[15]=e("span",{class:"user-label"},"用户:",-1)),e("span",ji,L(o(g).userName),1),e("span",Ui,"<"+L(o(g).userEmail)+">",1),t(J,{type:"primary",size:"small",onClick:F,class:"user-settings-btn",circle:""},{default:a(()=>[t(K,null,{default:a(()=>[t(o(us))]),_:1})]),_:1})])):(f(),_("div",Mi,[r[16]||(r[16]=e("span",{class:"user-label"},"用户: ",-1)),r[17]||(r[17]=e("span",{class:"user-warning"},"未配置",-1)),t(J,{type:"primary",size:"small",onClick:F,class:"user-settings-btn",circle:""},{default:a(()=>[t(K,null,{default:a(()=>[t(o(us))]),_:1})]),_:1})])),e("div",Oi,[e("div",Ai,[e("div",Ei,[t(K,null,{default:a(()=>[t(o(ds))]),_:1})]),e("div",{class:"directory-path",title:M.value},L(M.value),9,Pi)]),e("div",Hi,[t(J,{type:"primary",size:"small",onClick:re,class:"dir-button",circle:"",title:"切换目录"},{default:a(()=>[t(K,null,{default:a(()=>r[18]||(r[18]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M128 192v640h768V320H485.76L357.504 192H128zm-32-64h287.872l128.384 128H928a32 32 0 0 1 32 32v576a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32z"})],-1)])),_:1})]),_:1}),t(J,{type:"success",size:"small",onClick:Me,class:"dir-button",circle:"",title:"在资源管理器中打开"},{default:a(()=>[t(K,null,{default:a(()=>r[19]||(r[19]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M928 444H820V330.4c0-17.7-14.3-32-32-32H473L355.7 186.2a8.15 8.15 0 0 0-5.5-2.2H96c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h698c13 0 24.8-7.9 29.7-20l134-332c1.5-3.8 2.3-7.9 2.3-12 0-17.7-14.3-32-32-32zM136 256h188.5l119.6 114.4H748V444H238c-13 0-24.8 7.9-29.7 20L136 643.2V256zm635.3 512H159l103.3-256h612.4L771.3 768z"})],-1)])),_:1})]),_:1}),t(J,{type:"info",size:"small",onClick:w,class:"dir-button",circle:"",title:"复制路径"},{default:a(()=>[t(K,null,{default:a(()=>r[20]||(r[20]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64h64z"}),e("path",{fill:"currentColor",d:"M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64H384zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64z"})],-1)])),_:1})]),_:1})])]),o(g).isGitRepo?(f(),_("div",Ii,[t(Li)])):A("",!0)])]),e("main",Ni,[G.value?(f(),_("div",qi,[e("div",Yi,[t(Vl,{ref_key:"gitStatusRef",ref:v,"initial-directory":M.value},null,8,["initial-directory"])]),e("div",{class:"vertical-resizer",id:"v-resizer",onMousedown:V},null,32),o(g).isGitRepo?(f(),_("div",Xi,[!o(g).userName||!o(g).userEmail?(f(),_("div",Ki,[r[26]||(r[26]=e("h2",null,"Git用户未配置",-1)),r[27]||(r[27]=e("p",null,"请先配置Git用户信息才能进行提交操作。",-1)),e("div",Zi,[r[24]||(r[24]=e("h3",null,"您可以通过以下方式配置:",-1)),r[25]||(r[25]=e("ol",null,[e("li",null,"点击右上角的设置按钮,配置用户名和邮箱"),e("li",null,"或者使用命令行配置:"),e("div",{class:"code-block"},[y(' git config --global user.name "您的用户名"'),e("br"),y(' git config --global user.email "您的邮箱" ')])],-1)),t(J,{type:"primary",onClick:F},{default:a(()=>r[23]||(r[23]=[y(" 立即配置 ")])),_:1})])])):(f(),q(mn,{key:1}))])):(f(),_("div",Qi,r[28]||(r[28]=[e("div",{class:"card",style:{padding:"20px"}},[e("h2",null,"Git仓库初始化"),e("p",null,"当前目录不是Git仓库,请先初始化Git仓库或切换到Git仓库目录。"),e("div",{class:"tips"},[e("h3",null,"可以使用以下命令初始化仓库:"),e("div",{class:"code-block"},"git init")])],-1)]))),e("div",{class:"horizontal-resizer",id:"h-resizer",onMousedown:j},null,32),o(g).isGitRepo?(f(),_("div",er,[t(oi,{ref_key:"logListRef",ref:C},null,512)])):A("",!0),t($e,{modelValue:D.value,"onUpdate:modelValue":r[3]||(r[3]=Z=>D.value=Z),title:"创建新分支",width:"30%","destroy-on-close":""},{footer:a(()=>[e("span",tr,[t(J,{onClick:r[2]||(r[2]=Z=>D.value=!1)},{default:a(()=>r[29]||(r[29]=[y("取消")])),_:1}),t(J,{type:"primary",onClick:oe,loading:o(g).isCreatingBranch},{default:a(()=>r[30]||(r[30]=[y(" 创建 ")])),_:1},8,["loading"])])]),default:a(()=>[t(Ce,{model:{newBranchName:Q.value,selectedBaseBranch:ee.value}},{default:a(()=>[t(fe,{label:"新分支名称"},{default:a(()=>[t(Ve,{modelValue:Q.value,"onUpdate:modelValue":r[0]||(r[0]=Z=>Q.value=Z),placeholder:"请输入新分支名称"},null,8,["modelValue"])]),_:1}),t(fe,{label:"基于分支"},{default:a(()=>[t(De,{modelValue:ee.value,"onUpdate:modelValue":r[1]||(r[1]=Z=>ee.value=Z),placeholder:"选择基础分支",style:{width:"100%"}},{default:a(()=>[(f(!0),_(we,null,Be(o(g).allBranches,Z=>(f(),q(ye,{key:Z,label:Z,value:Z},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])])):(f(),_("div",Ji,[t(be,{class:"loading-card"},{default:a(()=>[e("div",Wi,[t(K,{class:"is-loading"},{default:a(()=>r[21]||(r[21]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32zM195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0zm-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z"})],-1)])),_:1})]),r[22]||(r[22]=e("div",{class:"loading-text"},"加载中...",-1))]),_:1})]))]),e("footer",sr,[o(g).currentBranch?(f(),_("div",ar,[e("div",lr,[r[32]||(r[32]=e("span",{class:"branch-label"},"当前分支:",-1)),t(De,{modelValue:o(g).currentBranch,"onUpdate:modelValue":r[4]||(r[4]=Z=>o(g).currentBranch=Z),size:"small",onChange:me,loading:o(g).isChangingBranch,class:"branch-select"},{default:a(()=>[(f(!0),_(we,null,Be(o(g).allBranches,Z=>(f(),q(ye,{key:Z,label:Z,value:Z},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"]),t(J,{type:"primary",size:"small",onClick:W,class:"create-branch-btn"},{default:a(()=>[t(K,null,{default:a(()=>[t(o(_a))]),_:1}),r[31]||(r[31]=y(" 新建分支 "))]),_:1})])])):A("",!0),o(g).remoteUrl?(f(),_("div",or,[r[34]||(r[34]=e("span",{class:"repo-url-label"},"远程仓库:",-1)),e("span",nr,L(o(g).remoteUrl),1),t(J,{type:"primary",circle:"",size:"small",onClick:r[5]||(r[5]=Z=>o(g).copyRemoteUrl()),class:"copy-url-btn",title:"复制仓库地址"},{default:a(()=>[t(K,null,{default:a(()=>r[33]||(r[33]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64h64z"}),e("path",{fill:"currentColor",d:"M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64H384zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64z"})],-1)])),_:1})]),_:1})])):A("",!0)]),t($e,{modelValue:Y.value,"onUpdate:modelValue":r[9]||(r[9]=Z=>Y.value=Z),title:"Git用户设置",width:"30%","destroy-on-close":""},{footer:a(()=>[e("span",ir,[t(J,{type:"danger",onClick:B},{default:a(()=>r[36]||(r[36]=[y(" 清除配置 ")])),_:1}),t(J,{onClick:r[8]||(r[8]=Z=>Y.value=!1)},{default:a(()=>r[37]||(r[37]=[y("取消")])),_:1}),t(J,{type:"primary",onClick:X},{default:a(()=>r[38]||(r[38]=[y(" 保存 ")])),_:1})])]),default:a(()=>[t(Ce,null,{default:a(()=>[t(fe,{label:"用户名"},{default:a(()=>[t(Ve,{modelValue:S.value,"onUpdate:modelValue":r[6]||(r[6]=Z=>S.value=Z),placeholder:"请输入Git用户名"},null,8,["modelValue"])]),_:1}),t(fe,{label:"邮箱"},{default:a(()=>[t(Ve,{modelValue:x.value,"onUpdate:modelValue":r[7]||(r[7]=Z=>x.value=Z),placeholder:"请输入Git邮箱"},null,8,["modelValue"])]),_:1}),t(fe,null,{default:a(()=>[t(ot,{type:"info",closable:!1,"show-icon":""},{default:a(()=>r[35]||(r[35]=[y(" 这些设置将影响全局Git配置,对所有Git仓库生效。 ")])),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]),t($e,{modelValue:ke.value,"onUpdate:modelValue":r[13]||(r[13]=Z=>ke.value=Z),title:"切换工作目录",width:"50%","destroy-on-close":""},{footer:a(()=>[e("span",ur,[t(J,{onClick:r[11]||(r[11]=Z=>ke.value=!1)},{default:a(()=>r[40]||(r[40]=[y("取消")])),_:1}),t(J,{type:"primary",onClick:r[12]||(r[12]=Z=>_e()),loading:Ae.value},{default:a(()=>r[41]||(r[41]=[y(" 切换 ")])),_:1},8,["loading"])])]),default:a(()=>[t(Ce,null,{default:a(()=>[t(fe,{label:"目录路径"},{default:a(()=>[e("div",rr,[t(Ve,{modelValue:xe.value,"onUpdate:modelValue":r[10]||(r[10]=Z=>xe.value=Z),placeholder:"请输入目录路径"},null,8,["modelValue"]),t(J,{type:"primary",onClick:Re},{default:a(()=>[t(K,null,{default:a(()=>[t(o(ds))]),_:1}),r[39]||(r[39]=y(" 浏览 "))]),_:1})])]),_:1}),Ee.value.length>0?(f(),q(fe,{key:0,label:"常用目录"},{default:a(()=>[e("div",cr,[(f(!0),_(we,null,Be(Ee.value,(Z,nt)=>(f(),q(Qe,{key:nt,class:"recent-dir-tag",onClick:Xe=>xe.value=Z,effect:"plain"},{default:a(()=>[y(L(Z),1)]),_:2},1032,["onClick"]))),128))])]),_:1})):A("",!0)]),_:1})]),_:1},8,["modelValue"])],64)}}}),fr=Lt(dr,[["__scopeId","data-v-1e84e10d"]]),Ss=wa(fr);Ss.use(ka());Ss.mount("#app");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.card[data-v-15b61579]{background-color:#fff;border-radius:12px;box-shadow:0 2px 12px #0000000a;border:1px solid rgba(0,0,0,.03);height:100%;width:100%;display:flex;flex-direction:column;overflow:hidden;transition:all .3s ease;position:relative}.status-header[data-v-15b61579]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #f0f0f0}.status-header h2[data-v-15b61579]{margin:0;font-size:16px;font-weight:500;color:#303133}.header-actions[data-v-15b61579]{display:flex;align-items:center;gap:8px}.card-content[data-v-15b61579]{padding:8px;overflow-y:auto;overflow-x:hidden;flex:1;display:flex;flex-direction:column}.status-box[data-v-15b61579]{white-space:pre-wrap;font-family:monospace;background-color:#f8f9fa;padding:16px;border-radius:8px;margin-bottom:20px;max-height:200px;overflow-y:auto;overflow-x:hidden;border:1px solid #f0f0f0;font-size:14px;line-height:1.5;width:100%;box-sizing:border-box}.file-list-container[data-v-15b61579]{overflow-y:auto;flex:1;width:100%;box-sizing:border-box;scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.3) transparent}.file-group[data-v-15b61579]{background-color:#f8f9fa;border-radius:8px;overflow:hidden;border:1px solid #ebeef5;margin-bottom:4px;display:flex;flex-direction:column;transition:box-shadow .3s ease}.file-group[data-v-15b61579]:hover{box-shadow:0 4px 12px #0000000d}.file-group[data-v-15b61579]:last-child{margin-bottom:0;flex:1 1 auto}.file-group-header[data-v-15b61579]{font-size:12px;font-weight:600;padding:6px 12px;background-color:#f0f2f5;color:#606266;border-bottom:1px solid #ebeef5;flex-shrink:0;cursor:pointer;display:flex;align-items:center;gap:6px;transition:background-color .2s ease;-webkit-user-select:none;user-select:none;min-height:28px}.file-group-header[data-v-15b61579]:hover{background-color:#e9ecef}.collapse-icon[data-v-15b61579]{transition:transform .2s ease;font-size:14px;color:#6c757d}.collapse-icon.collapsed[data-v-15b61579]{transform:rotate(-90deg)}.file-list[data-v-15b61579]{overflow-y:visible;min-height:30px;max-height:none;flex-grow:1;padding:0;margin:0}.file-list-container[data-v-15b61579]::-webkit-scrollbar{width:6px;height:6px}.file-list-container[data-v-15b61579]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.file-list-container[data-v-15b61579]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.file-list-container[data-v-15b61579]::-webkit-scrollbar-track{background-color:transparent}.file-list[data-v-15b61579]:empty{display:none}.empty-file-container[data-v-15b61579]{overflow-y:hidden!important;display:flex;flex-direction:column;align-items:stretch;flex:1}.empty-file-group[data-v-15b61579]{padding:16px;text-align:center;color:#909399;font-size:13px;font-style:italic;display:flex;align-items:center;justify-content:center;min-height:50px;background-color:#f8f9fa;border-radius:4px;margin:8px}.file-item[data-v-15b61579]{padding:6px 12px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #ebeef5;cursor:pointer;transition:all .2s ease;min-height:32px}.file-item[data-v-15b61579]:last-child{border-bottom:none}.file-item[data-v-15b61579]:hover{background-color:#ecf5ff}.file-info[data-v-15b61579]{display:flex;align-items:center;flex-grow:1;overflow:hidden;gap:8px}.file-status-indicator[data-v-15b61579]{width:8px;height:8px;border-radius:50%;background-color:#409eff;flex-shrink:0}.file-status-indicator.added[data-v-15b61579]{background-color:#67c23a}.file-status-indicator.modified[data-v-15b61579]{background-color:#409eff}.file-status-indicator.deleted[data-v-15b61579]{background-color:#f56c6c}.file-status-indicator.untracked[data-v-15b61579]{background-color:#e6a23c}.file-name-section[data-v-15b61579]{display:flex;align-items:center;min-width:0;gap:8px}.file-path-section[data-v-15b61579]{display:flex;align-items:center;flex-shrink:0;max-width:200px}.file-name[data-v-15b61579]{font-weight:500;color:#303133;flex-shrink:0;line-height:1.3;font-size:13px}.file-directory[data-v-15b61579]{font-size:11px;color:#909399;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0}.file-actions[data-v-15b61579]{display:flex;opacity:0;transition:opacity .2s ease}.file-item:hover .file-actions[data-v-15b61579]{opacity:1}.file-action-btn[data-v-15b61579]{width:20px!important;height:20px!important;min-width:20px!important;padding:0!important;font-size:11px!important}.empty-status[data-v-15b61579]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;text-align:center;background-color:#f9f9f9;border-radius:8px;flex-grow:1}.empty-icon[data-v-15b61579]{width:64px;height:64px;display:flex;align-items:center;justify-content:center;background-color:#f0f2f5;border-radius:50%;margin-bottom:16px;font-size:28px;color:#909399;animation:pulse-15b61579 2s infinite ease-in-out}@keyframes pulse-15b61579{0%{transform:scale(1);opacity:.7}50%{transform:scale(1.05);opacity:1}to{transform:scale(1);opacity:.7}}.empty-text[data-v-15b61579]{font-size:18px;font-weight:500;color:#606266;margin-bottom:8px}.empty-subtext[data-v-15b61579]{font-size:14px;color:#909399;margin-bottom:20px}.status-box-wrap[data-v-15b61579]{height:100%;display:flex;flex-direction:column;gap:16px}.branch-status-info[data-v-15b61579]{margin-bottom:0;background-color:#f8f9fa;border-radius:8px;overflow:hidden;border:1px solid #ebeef5;transition:all .3s ease}.branch-status-info[data-v-15b61579]:hover{box-shadow:0 4px 12px #0000000d}.branch-sync-status[data-v-15b61579]{display:flex;align-items:center;padding:12px 16px;border-left:3px solid #e6a23c;margin-bottom:0;background-color:#fdf6ec}.sync-status-content[data-v-15b61579]{display:flex;align-items:center;flex-wrap:wrap;gap:10px;width:100%}.status-badges[data-v-15b61579]{display:flex;flex-direction:column;gap:8px;width:100%}.status-badge[data-v-15b61579]{display:flex;align-items:center;width:100%;border-radius:4px;padding:8px 12px;transition:all .3s ease}.status-badge.el-tag--warning[data-v-15b61579]{background-color:#fdf6ec;border-color:#faecd8}.status-badge.el-tag--info[data-v-15b61579]{background-color:#f4f4f5;border-color:#e9e9eb}.status-badge[data-v-15b61579]:hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000000d}.badge-content[data-v-15b61579]{display:flex;align-items:center;gap:8px;font-size:13px}.diff-dialog[data-v-15b61579]{height:calc(100vh - 150px)}[data-v-15b61579] .el-dialog__body{height:calc(100vh - 320px);overflow:auto;padding:0}.diff-content[data-v-15b61579]{flex:1;overflow-y:auto;padding:16px 20px;background-color:#fafafa;height:100%}.diff-formatted[data-v-15b61579]{font-family:JetBrains Mono,Fira Code,Consolas,Courier New,monospace;font-size:14px;line-height:1.6;white-space:pre-wrap;padding-bottom:20px}.no-diff[data-v-15b61579]{display:flex;align-items:center;justify-content:center;height:100%;color:#909399;font-size:14px}.file-navigation[data-v-15b61579]{display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-top:1px solid #ebeef5;background-color:#f9f9fb}.counter-tag[data-v-15b61579]{font-family:monospace;font-size:14px;padding:6px 12px;min-width:80px;text-align:center}.nav-button[data-v-15b61579]{min-width:120px;transition:all .3s ease}.nav-button[data-v-15b61579]:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.diff-formatted[data-v-15b61579]::-webkit-scrollbar,.diff-content[data-v-15b61579]::-webkit-scrollbar{width:6px;height:6px}.diff-formatted[data-v-15b61579]::-webkit-scrollbar-thumb,.diff-content[data-v-15b61579]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.diff-formatted[data-v-15b61579]::-webkit-scrollbar-thumb:hover,.diff-content[data-v-15b61579]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.diff-formatted[data-v-15b61579]::-webkit-scrollbar-track,.diff-content[data-v-15b61579]::-webkit-scrollbar-track{background-color:transparent}.diff-formatted[data-v-15b61579],.diff-content[data-v-15b61579]{scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.3) transparent}.auto-update-switch[data-v-15b61579] .el-switch__core{transition:all .3s ease-in-out;box-shadow:0 2px 5px #0000001a}.auto-update-switch[data-v-15b61579] .el-switch__core:hover{box-shadow:0 2px 8px #0003}.auto-update-switch.is-checked[data-v-15b61579] .el-switch__core{box-shadow:0 2px 5px #67c23a4d}.auto-update-switch.is-checked[data-v-15b61579] .el-switch__core:hover{box-shadow:0 2px 8px #67c23a80}.el-button[data-v-15b61579]{transition:all .3s ease}.el-button[data-v-15b61579]:not(:disabled):hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.card-content[data-v-15b61579] .el-loading-mask{background-color:#fffc;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);z-index:10}.card-content[data-v-15b61579] .el-loading-spinner{transform:scale(1.2)}.card-content[data-v-15b61579] .el-loading-text{font-size:16px;color:#409eff;font-weight:700;margin-top:10px}.diff-header{font-weight:700;background-color:#e6f1fc;padding:8px 12px;margin:10px 0;border-radius:6px;color:#0366d6;border-bottom:1px solid #c8e1ff}.diff-old-file,.diff-new-file{color:#586069;padding:4px 8px;font-family:monospace}.diff-hunk-header{color:#6f42c1;background-color:#f1f8ff;padding:4px 8px;margin:8px 0;border-radius:4px;font-family:monospace}.diff-added{background-color:#e6ffed;color:#22863a;padding:2px 8px;border-left:4px solid #22863a;font-family:monospace;display:block;margin:2px 0}.diff-removed{background-color:#ffeef0;color:#cb2431;padding:2px 8px;border-left:4px solid #cb2431;font-family:monospace;display:block;margin:2px 0}.diff-context{color:#444;padding:2px 8px;font-family:monospace;display:block;margin:2px 0;background-color:#fafbfc}.locked-files-group{background-color:#fff7e6;border:1px solid #ffd591}.locked-files-group .file-group-header{background-color:#fff2e8;color:#d46b08;display:flex;align-items:center;gap:8px}.locked-files-group .info-icon{color:#d46b08;cursor:help}.locked-file-item{background-color:#fffbf0;border-left:3px solid #ffa940}.locked-file-item:hover{background-color:#fff7e6}.file-status-indicator.locked{background-color:#ffa940;border-radius:50%;position:relative}.file-status-indicator.locked:before{content:"🔒";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:8px}.locked-file-name{color:#d46b08!important;font-weight:500;display:flex;align-items:center;gap:4px}.lock-indicator{color:#d46b08;font-size:12px;opacity:.8}.file-status-indicator.modified.locked{background:linear-gradient(45deg,#1890ff 50%,#ffa940 50%)}.file-status-indicator.untracked.locked,.file-status-indicator.added.locked{background:linear-gradient(45deg,#52c41a 50%,#ffa940 50%)}.file-status-indicator.deleted.locked{background:linear-gradient(45deg,#ff4d4f 50%,#ffa940 50%)}.empty-locked-files{text-align:center;padding:40px 20px;color:#666}.empty-locked-files .empty-icon{font-size:48px;color:#d9d9d9;margin-bottom:16px}.empty-locked-files p{margin:8px 0}.empty-tip{font-size:12px;color:#999}.locked-files-list{max-height:400px;overflow-y:auto}.locked-files-header{display:flex;align-items:center;gap:8px;padding:12px 16px;background-color:#fff7e6;border:1px solid #ffd591;border-radius:6px;margin-bottom:16px;color:#d46b08;font-weight:500}.locked-files-header .info-icon{color:#d46b08;cursor:help}.lock-feature-description{background-color:#f6f8fa;border:1px solid #e1e4e8;border-radius:8px;padding:16px;margin-bottom:16px}.description-header{display:flex;align-items:center;gap:8px;margin-bottom:12px}.description-icon{color:#1890ff;font-size:16px}.description-title{font-weight:600;color:#262626;font-size:14px}.description-content{font-size:13px;line-height:1.6;color:#595959}.description-content p{margin:8px 0}.description-content ul{margin:4px 0 12px;padding-left:20px}.description-content li{margin:4px 0}.locked-file-items{display:flex;flex-direction:column;gap:8px}.locked-file-item{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background-color:#fffbf0;border:1px solid #ffd591;border-radius:6px;transition:all .2s ease}.locked-file-item:hover{background-color:#fff7e6;border-color:#ffa940}@keyframes snakeBorder-b7f77384{0%,to{border-top:2px solid #409EFF;border-right:2px solid transparent;border-bottom:2px solid transparent;border-left:2px solid transparent}25%{border-top:2px solid #409EFF;border-right:2px solid #67C23A;border-bottom:2px solid transparent;border-left:2px solid transparent}50%{border-top:2px solid transparent;border-right:2px solid #67C23A;border-bottom:2px solid #409EFF;border-left:2px solid transparent}75%{border-top:2px solid transparent;border-right:2px solid transparent;border-bottom:2px solid #409EFF;border-left:2px solid #67C23A}}@keyframes glowPulse-b7f77384{0%,to{box-shadow:0 0 8px #409eff66}50%{box-shadow:0 0 12px #67c23a80}}.card[data-v-b7f77384]{background-color:#fff;border-radius:8px;box-shadow:0 2px 10px #00000008;border:1px solid rgba(0,0,0,.03);height:100%;width:100%;display:flex;flex-direction:column;overflow:hidden;position:relative}.card-header h2[data-v-b7f77384]{margin:0;font-size:16px;font-weight:500;color:#303133}.card-content[data-v-b7f77384]{padding:8px;overflow-y:auto;flex:1}.actions-section h3[data-v-b7f77384]{margin-top:0;margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid #dcdfe6;font-size:16px;color:#303133;font-weight:500}.operations-wrapper[data-v-b7f77384]{display:flex;gap:10px}.action-groups[data-v-b7f77384]{display:flex;flex-direction:column;gap:12px}.action-group[data-v-b7f77384]{background-color:#f9f9f9;border-radius:6px;padding:12px 14px;box-shadow:0 2px 8px #00000014;transition:all .3s ease;flex:1}.action-group[data-v-b7f77384]:hover{box-shadow:0 4px 12px #0000001f}.group-title[data-v-b7f77384]{font-size:13px;font-weight:700;margin-bottom:8px;color:#606266;text-align:left;display:block;position:relative;padding-left:6px;border-bottom:1px solid rgba(0,0,0,.06);padding-bottom:6px}.group-buttons[data-v-b7f77384]{display:flex;flex-direction:row;flex-wrap:wrap;gap:8px;padding:0}.action-button[data-v-b7f77384]{font-size:14px;font-weight:500;flex:1;min-width:100px;border-radius:4px;height:36px;padding:0 10px}.action-button[data-v-b7f77384]:hover{transform:translateY(-1px);box-shadow:0 2px 5px #00000026}.action-button[data-v-b7f77384]:active{transform:translateY(0)}.command-text[data-v-b7f77384],.command-text-long[data-v-b7f77384]{display:none}.standard-commit-form[data-v-b7f77384]{display:flex;flex-direction:column;gap:8px;margin-bottom:15px}.standard-commit-header[data-v-b7f77384]{display:flex;flex-direction:column;gap:4px;width:100%}.type-scope-container[data-v-b7f77384]{display:flex;gap:10px;width:100%;margin-bottom:10px}.type-select[data-v-b7f77384]{width:35%}.scope-wrapper[data-v-b7f77384]{display:flex;align-items:center;gap:5px;width:65%}.commit-form[data-v-b7f77384]{display:flex;flex-direction:column;gap:8px}.description-container[data-v-b7f77384]{display:flex;align-items:center;gap:5px;width:100%}.scope-input[data-v-b7f77384],.description-input[data-v-b7f77384]{flex-grow:1}.settings-button[data-v-b7f77384]{flex-shrink:0}.preview-section[data-v-b7f77384]{background-color:#f5f7fa;padding:10px;border-radius:4px}.preview-title[data-v-b7f77384]{font-weight:700;margin-bottom:5px}.preview-content[data-v-b7f77384]{white-space:pre-wrap;font-family:monospace;margin:0;padding:10px;background-color:#ebeef5;border-radius:4px}.template-container[data-v-b7f77384]{display:flex;flex-direction:column;height:calc(85vh - 100px);overflow-y:auto;padding:5px}.template-form[data-v-b7f77384]{margin-bottom:20px;background-color:#f8f9fa;padding:15px;border-radius:6px;border:1px solid #ebeef5}.template-form-buttons[data-v-b7f77384]{display:flex;gap:10px;margin-top:12px;justify-content:flex-end}.template-input[data-v-b7f77384]{flex-grow:1}.template-list[data-v-b7f77384]{overflow-y:auto;height:100%}.template-list h3[data-v-b7f77384]{margin-top:0;margin-bottom:15px;font-size:16px;font-weight:500;color:#303133;padding-bottom:8px;border-bottom:1px solid #ebeef5}.template-item[data-v-b7f77384]{margin-bottom:10px;transition:all .2s ease;border:1px solid #ebeef5}.template-item[data-v-b7f77384]:hover{background-color:#f5f7fa;transform:translateY(-2px);box-shadow:0 2px 12px #0000001a}.template-content[data-v-b7f77384]{flex-grow:1;margin-right:10px;word-break:break-all;padding:5px 0;color:#303133;font-weight:500}.template-actions[data-v-b7f77384]{display:flex;gap:8px;justify-content:flex-end;min-width:180px;flex-shrink:0}.options-row[data-v-b7f77384]{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.code-command[data-v-b7f77384]{background-color:#2d2d2d;color:#f8f8f2;font-family:Courier New,Courier,monospace;padding:10px;border-radius:4px;overflow-x:auto;white-space:pre;font-size:14px}@media (min-width: 768px){.layout-container[data-v-b7f77384]{flex-direction:row}.commit-section[data-v-b7f77384]{flex:3}.actions-section[data-v-b7f77384]{width:320px}.operations-wrapper[data-v-b7f77384]{flex-direction:column}}.git-config-warning[data-v-b7f77384]{width:100%}.config-command[data-v-b7f77384]{background-color:#2d2d2d;color:#f8f8f2;font-family:Courier New,Courier,monospace;padding:10px;border-radius:4px;margin-top:10px;white-space:pre}@keyframes pushing-pulse-b7f77384{0%{box-shadow:0 0 #67c23a66}70%{box-shadow:0 0 0 15px #67c23a00}to{box-shadow:0 0 #67c23a00}}@keyframes pushing-border-b7f77384{0%{border-color:#67c23a}50%{border-color:#85ce61}to{border-color:#67c23a}}.card.is-pushing[data-v-b7f77384]{animation:pushing-border-b7f77384 1.5s infinite ease-in-out;box-shadow:0 4px 12px #0000001a;transition:all .3s ease}.push-button[data-v-b7f77384]{background-color:#67c23a;border-color:#67c23a}.push-button[data-v-b7f77384]:hover{background-color:#85ce61;border-color:#85ce61}.push-button.is-loading[data-v-b7f77384],.push-button.is-loading[data-v-b7f77384]:hover,.push-button.is-loading[data-v-b7f77384]:focus{animation:pushing-pulse-b7f77384 1.5s infinite;background-color:#67c23a!important;border-color:#67c23a!important}.el-button.push-button.is-loading .el-loading-spinner[data-v-b7f77384]{color:#fff!important}@keyframes one-click-push-glow-b7f77384{0%{box-shadow:0 0 5px #67c23a80}50%{box-shadow:0 0 20px #67c23acc}to{box-shadow:0 0 5px #67c23a80}}.action-button.one-click-push[data-v-b7f77384]{position:relative;overflow:hidden}.action-button.one-click-push.is-loading[data-v-b7f77384],.action-button.one-click-push.is-loading[data-v-b7f77384]:hover{animation:one-click-push-glow-b7f77384 1.5s infinite;background-color:#67c23a!important;border-color:#67c23a!important}@keyframes push-success-b7f77384{0%{transform:scale(1)}50%{transform:scale(1.1)}to{transform:scale(1)}}.push-success-indicator[data-v-b7f77384]{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;background-color:#fff;border-radius:12px;padding:20px 30px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;align-items:center;justify-content:center;animation:push-success-b7f77384 .5s ease-out;z-index:9999;width:200px;height:200px}.push-success-icon[data-v-b7f77384]{font-size:64px;color:#67c23a;margin-bottom:16px;animation:bounce-b7f77384 .8s ease-in-out}@keyframes bounce-b7f77384{0%,20%,50%,80%,to{transform:translateY(0)}40%{transform:translateY(-20px)}60%{transform:translateY(-10px)}}.push-success-text[data-v-b7f77384]{font-size:20px;font-weight:700;color:#303133;text-align:center}.reset-button[data-v-b7f77384]{background-color:#909399;border-color:#909399}.reset-button[data-v-b7f77384]:hover{background-color:#a6a9ad;border-color:#a6a9ad}.el-button+.el-button[data-v-b7f77384]{margin-left:0}.pushing-indicator[data-v-b7f77384]{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;background-color:#409eff;border-radius:12px;padding:20px 30px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:9999;width:200px;height:200px;color:#fff}.form-bottom-actions[data-v-b7f77384]{display:block;padding:8px;background-color:#f5f7fa;border-radius:6px;box-shadow:0 2px 8px #00000014;transition:all .3s ease}.form-bottom-actions[data-v-b7f77384]:hover{box-shadow:0 4px 12px #0000001f}.actions-flex-container[data-v-b7f77384]{display:flex;justify-content:space-between;gap:10px;width:100%}.left-actions[data-v-b7f77384]{flex:3;display:flex;align-items:center}.right-actions[data-v-b7f77384]{flex:2;display:flex;align-items:center;justify-content:center}.button-grid[data-v-b7f77384]{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:6px;width:100%;height:100%}.button-grid .el-button[data-v-b7f77384]{margin:0;height:100%;min-height:36px;display:flex;align-items:center;justify-content:center;padding:8px 15px}.button-grid .el-button[data-v-b7f77384]:first-child{grid-column:1 / 2;grid-row:1 / 2}.button-grid .el-button[data-v-b7f77384]:nth-child(2){grid-column:2 / 3;grid-row:1 / 2}.button-grid .el-button[data-v-b7f77384]:last-child{grid-column:1 / 3;grid-row:2 / 3}.one-push-button[data-v-b7f77384]{height:100%;width:100%;padding:10px 15px;background:linear-gradient(135deg,#4169e1,#5e81f4);border:none;border-radius:8px;box-shadow:0 4px 10px #4169e140;transition:all .3s ease}.one-push-content[data-v-b7f77384]{display:flex;align-items:center;justify-content:center;height:100%}.one-push-icon[data-v-b7f77384]{font-size:24px;margin-right:10px}.one-push-desc[data-v-b7f77384]{font-size:12px;opacity:.8;margin-top:4px}.pushing-text[data-v-b7f77384]{font-size:20px;font-weight:700;text-align:center}.pushing-spinner[data-v-b7f77384]{margin-bottom:16px}.circular[data-v-b7f77384]{height:64px;width:64px;animation:pushing-rotate-b7f77384 2s linear infinite}.path[data-v-b7f77384]{stroke:#fff;stroke-width:4;stroke-linecap:round;stroke-dasharray:90,150;stroke-dashoffset:0;animation:pushing-dash-b7f77384 1.5s ease-in-out infinite}@keyframes pushing-rotate-b7f77384{to{transform:rotate(360deg)}}@keyframes pushing-dash-b7f77384{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}.message-template-container[data-v-b7f77384]{display:flex;flex-direction:column;height:calc(100vh - 278px);overflow:hidden}.templates-container[data-v-b7f77384]{display:flex;gap:20px;margin-top:15px;flex:1;overflow:hidden}.message-templates-list[data-v-b7f77384]{flex:3;display:flex;flex-direction:column;border-right:1px solid #ebeef5;padding-right:15px;height:calc(100vh - 432px)}.message-templates-list h3[data-v-b7f77384]{margin-top:0;margin-bottom:15px;font-size:16px;font-weight:500;color:#303133;padding-bottom:8px;border-bottom:1px solid #ebeef5}.current-default-message[data-v-b7f77384]{flex:2;display:flex;flex-direction:column;gap:15px;padding-left:15px}.current-default-message h3[data-v-b7f77384]{margin-top:0;margin-bottom:15px;font-size:16px;font-weight:500;color:#303133;padding-bottom:8px;border-bottom:1px solid #ebeef5}.templates-scroll-area[data-v-b7f77384]{overflow-y:auto;padding-right:5px;flex:1}.default-message-card[data-v-b7f77384]{margin-bottom:15px;box-shadow:0 2px 8px #00000014;border-radius:4px;transition:all .3s ease}.default-message-card[data-v-b7f77384]:hover{box-shadow:0 4px 12px #0000001f}.default-message-content[data-v-b7f77384]{padding:12px 15px;background-color:#f0f9eb;border-left:3px solid #67c23a;font-weight:500;word-break:break-all;min-height:60px;display:flex;align-items:center;border-radius:0 4px 4px 0;color:#303133}.message-help-text[data-v-b7f77384]{background-color:#f8f9fa;border-radius:4px;padding:15px;font-size:14px;color:#606266;border-left:3px solid #909399;margin-top:auto;box-shadow:0 2px 8px #0000000d}.message-help-text h4[data-v-b7f77384]{margin-top:0;margin-bottom:10px;color:#303133;font-size:15px}.message-help-text p[data-v-b7f77384]{margin:8px 0;line-height:1.5}.advanced-options-toggle[data-v-b7f77384]{display:flex;align-items:center;justify-content:center;padding:8px 0;background-color:#f5f7fa;border-radius:4px;cursor:pointer;transition:all .3s ease;-webkit-user-select:none;user-select:none}.advanced-options-toggle[data-v-b7f77384]:hover{background-color:#ebeef5;color:#409eff}.toggle-icon[data-v-b7f77384]{margin-left:8px;transition:transform .3s ease}.toggle-icon.is-active[data-v-b7f77384]{transform:rotate(180deg)}.advanced-fields[data-v-b7f77384]{margin-top:10px;display:flex;flex-direction:column;gap:15px;animation:fade-in-b7f77384 .3s ease-in-out}@keyframes fade-in-b7f77384{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.merge-dialog-content[data-v-b7f77384]{padding:0 10px}.merge-intro[data-v-b7f77384]{margin-bottom:20px;color:#606266}.merge-options[data-v-b7f77384]{display:flex;flex-direction:column;gap:10px}.dialog-footer[data-v-b7f77384]{display:flex;justify-content:flex-end;gap:10px}.merge-confirm-btn[data-v-b7f77384]{margin-left:10px}.merge-button[data-v-b7f77384]{background-color:#409eff;border-color:#409eff}.branch-group[data-v-b7f77384]{border-top:none}.branch-group .group-title[data-v-b7f77384]{color:#606266;font-weight:500;margin-bottom:12px}[data-v-b7f77384] .el-checkbox__label{white-space:normal;line-height:1.4}.stash-list-content[data-v-b7f77384]{padding:20px 0}.stash-list-actions[data-v-b7f77384]{margin-top:20px;display:flex;justify-content:flex-end}.stash-dialog-content p[data-v-b7f77384]{margin-bottom:20px;color:#606266}.reset-group[data-v-b7f77384]{border-top:none}.card-header[data-v-b7f77384]{padding:8px 16px;border-bottom:1px solid #f0f0f0;display:flex;justify-content:space-between;align-items:center}.git-tools-button[data-v-b7f77384]{transition:transform .3s}.git-tools-button[data-v-b7f77384]:hover{transform:rotate(90deg)}.layout-container[data-v-b7f77384]{display:flex;flex-direction:column;gap:15px;height:100%}.commit-section[data-v-b7f77384]{flex:1;width:100%;min-width:0}[data-v-b7f77384] .git-operations-drawer .el-drawer__header{margin-bottom:10px;padding:12px 16px;border-bottom:1px solid #f0f0f0;font-size:16px;font-weight:500}[data-v-b7f77384] .git-operations-drawer .el-drawer__body{padding:10px;overflow-y:auto}.actions-section[data-v-b7f77384]{padding:0}.center-button-container[data-v-b7f77384]{display:flex;justify-content:space-between;align-items:center;margin-top:10px;position:relative}.button-divider[data-v-b7f77384]{height:1px;background:linear-gradient(to right,#dcdfe600,#dcdfe6,#dcdfe600);flex:1;margin:0 15px}.one-push-button[data-v-b7f77384]{padding:0 25px;min-width:160px;height:40px;font-weight:500;border-radius:20px;box-shadow:0 2px 6px #4169e14d;transition:all .3s;position:relative;z-index:2}.one-push-button[data-v-b7f77384]:hover{transform:translateY(-1px);box-shadow:0 4px 8px #4169e166}.action-separator[data-v-b7f77384]{position:relative;text-align:center;margin:12px 0;height:20px}.separator-text[data-v-b7f77384]{background-color:#f5f7fa;padding:0 10px;font-size:12px;color:#909399;position:relative;z-index:1}.action-separator[data-v-b7f77384]:before{content:"";position:absolute;top:50%;left:0;right:0;height:1px;background-color:#e4e7ed;z-index:0}.one-push-container[data-v-b7f77384]{display:flex;justify-content:center}.one-push-button[data-v-b7f77384]{width:100%;max-width:300px;height:auto;padding:10px 20px;background:linear-gradient(135deg,#4169e1,#5e81f4);border:none;border-radius:8px;box-shadow:0 4px 10px #4169e140;transition:all .3s ease}.one-push-button[data-v-b7f77384]:hover{transform:translateY(-2px);box-shadow:0 6px 12px #4169e159;background:linear-gradient(135deg,#3a5ecc,#4b6edf)}.one-push-button[data-v-b7f77384]:active{transform:translateY(0);box-shadow:0 2px 6px #4169e133}.one-push-content[data-v-b7f77384]{display:flex;align-items:center;justify-content:center}.one-push-icon[data-v-b7f77384]{font-size:20px;margin-right:10px}.one-push-text[data-v-b7f77384]{display:flex;flex-direction:column;align-items:flex-start;text-align:left}.one-push-title[data-v-b7f77384]{font-size:16px;font-weight:500;line-height:1.2}.one-push-desc[data-v-b7f77384]{font-size:12px;opacity:.8;margin-top:2px}.button-row[data-v-b7f77384]{display:flex;justify-content:space-between;gap:10px;width:100%}.button-row .el-button[data-v-b7f77384]{flex:1;min-width:100px}.center-button-container[data-v-b7f77384],.button-divider[data-v-b7f77384]{display:none}.git-cmd-tooltip{font-family:Consolas,Courier New,monospace!important;font-size:13px!important;font-weight:500!important;color:#303133!important;background-color:#f5f7fa!important;border:1px solid #dcdfe6!important;border-radius:4px!important;padding:8px 12px!important;box-shadow:0 2px 12px #0000001a!important}.template-dialog .el-dialog__header,.message-template-dialog .el-dialog__header,.merge-dialog .el-dialog__header{padding:15px 20px;margin-right:0;border-bottom:1px solid #ebeef5;background-color:#f8f9fa}.template-dialog .el-dialog__title,.message-template-dialog .el-dialog__title,.merge-dialog .el-dialog__title{font-size:16px;font-weight:600;color:#303133}.template-dialog .el-dialog__body,.message-template-dialog .el-dialog__body,.merge-dialog .el-dialog__body{padding:20px}.merge-dialog .el-dialog__footer{padding:15px 20px;border-top:1px solid #f0f0f0}.template-dialog .el-dialog__headerbtn,.message-template-dialog .el-dialog__headerbtn,.merge-dialog .el-dialog__headerbtn{top:15px;right:20px}.template-dialog .el-input__inner,.message-template-dialog .el-input__inner,.merge-dialog .el-input__inner{height:40px;line-height:40px}.template-dialog .el-button,.message-template-dialog .el-button{border-radius:4px;font-weight:500}.template-dialog .el-card,.message-template-dialog .el-card{border-radius:4px;overflow:hidden}.template-dialog .el-card__body,.message-template-dialog .el-card__body{padding:12px 15px}.template-dialog .el-empty__image,.message-template-dialog .el-empty__image{width:80px;height:80px}.card[data-v-081ce552]{background-color:#fff;border-radius:8px;box-shadow:0 2px 12px #0000001a;margin-bottom:20px;display:flex;flex-direction:column;height:100%;overflow:hidden;position:relative}.log-header[data-v-081ce552]{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-bottom:1px solid #ebeef5;position:sticky;top:0;background-color:#fff;z-index:100}.fullscreen-mode .log-header[data-v-081ce552]{margin-bottom:10px;box-shadow:0 2px 8px #0000000d}.header-left[data-v-081ce552]{display:flex;align-items:center;gap:16px}.header-left h2[data-v-081ce552]{margin:0;font-size:16px;font-weight:600;color:#303133}.log-actions[data-v-081ce552]{display:flex;align-items:center;gap:12px}.action-button[data-v-081ce552]{transition:all .3s ease;border-radius:8px;border:1px solid transparent;box-shadow:0 2px 4px #0000001a;font-weight:500;padding:8px 16px;display:flex;align-items:center;justify-content:center;gap:8px}.action-button[data-v-081ce552]:hover{transform:translateY(-2px);box-shadow:0 4px 8px #00000026}.filter-button[data-v-081ce552]{background:linear-gradient(135deg,#e6a23c,#f0c78a);color:#fff;min-width:90px}.filter-button.active-filter[data-v-081ce552]{background:linear-gradient(135deg,#d48806,#e6a23c)}.filter-button .filter-badge[data-v-081ce552] .el-badge__content{background-color:#f56c6c;color:#fff;border:2px solid white;box-shadow:0 0 0 1px #e6a23c}.view-mode-button[data-v-081ce552]{background:linear-gradient(135deg,#409eff,#53a8ff);color:#fff}.view-mode-button.active-view[data-v-081ce552]{background:linear-gradient(135deg,#1890ff,#096dd9)}.commit-display-button[data-v-081ce552]{background:linear-gradient(135deg,#67c23a,#85ce61);color:#fff}.commit-display-button.active-commits[data-v-081ce552]{background:linear-gradient(135deg,#52c41a,#389e0d)}.refresh-button[data-v-081ce552]{background:linear-gradient(135deg,#909399,#c0c4cc);color:#fff;min-width:unset;padding:8px;border-radius:50%;width:36px;height:36px}.refresh-button[data-v-081ce552]:hover{background:linear-gradient(135deg,#606266,#909399)}.refresh-button-animated[data-v-081ce552]{animation:spin-081ce552 1s linear}@keyframes spin-081ce552{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.content-area[data-v-081ce552]{padding:10px 16px;flex:1;min-height:100px;height:calc(100% - 52px);display:flex;flex-direction:column;overflow:auto}.content-area-content[data-v-081ce552]{height:100%;display:flex;flex-direction:column}.content-area.with-filter[data-v-081ce552]{height:calc(100% - 112px);padding-top:0}.content-area>div[data-v-081ce552]{flex:1;display:flex;flex-direction:column}.el-table[data-v-081ce552]{--el-table-border-color: #f0f0f0;--el-table-header-bg-color: #f8f9fa;border-radius:8px;overflow:hidden}[data-v-081ce552] .el-table__header-wrapper{background-color:#f8f9fa}[data-v-081ce552] .el-table__header th{background-color:#f8f9fa;color:#606266;font-weight:600;height:36px;font-size:13px}[data-v-081ce552] .el-table__row{transition:all .2s ease}[data-v-081ce552] .el-table__row:hover{background-color:#ecf5ff!important}[data-v-081ce552] .el-table--striped .el-table__row--striped{background-color:#fafafa}[data-v-081ce552] .el-table__cell{padding:4px 0;font-size:13px}.branch-container[data-v-081ce552]{display:flex;flex-wrap:wrap;gap:4px;margin-right:8px;flex-shrink:0}.branch-tag[data-v-081ce552]{margin-right:0;border-radius:3px;transition:all .2s ease;font-size:10px;padding:1px 4px;height:16px;line-height:14px}.branch-tag[data-v-081ce552]:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.commit-count[data-v-081ce552]{margin-bottom:12px;font-size:14px;color:#606266;text-align:right}.graph-view[data-v-081ce552]{width:100%;flex:1;display:flex;flex-direction:column;overflow-y:auto;padding:0 8px}.graph-container[data-v-081ce552]{width:100%;flex:1;min-height:500px;border:1px solid #ebeef5;border-radius:8px;padding:16px;background-color:#fff;position:relative;box-shadow:0 2px 8px #00000008}.graph-container svg[data-v-081ce552]{transform-origin:top left;transition:transform .2s ease}.graph-controls[data-v-081ce552]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;background-color:#f8f9fa;padding:12px;border-radius:8px;border:1px solid #ebeef5}.zoom-controls[data-v-081ce552]{display:flex;gap:12px;align-items:center}.zoom-slider[data-v-081ce552]{width:200px}.scale-info[data-v-081ce552]{font-size:14px;color:#606266;background-color:#fff;padding:4px 10px;border-radius:4px;border:1px solid #ebeef5}.refresh-notification[data-v-081ce552]{background-color:#f0f9eb;color:#67c23a;padding:10px 15px;border-radius:8px;font-size:14px;border-left:4px solid #67c23a;animation:fadeOut-081ce552 2s forwards;position:fixed;top:20px;right:20px;z-index:9999;box-shadow:0 4px 12px #0000001a;max-width:300px;text-align:center}@keyframes fadeOut-081ce552{0%{opacity:0;transform:translateY(-20px)}20%{opacity:1;transform:translateY(0)}80%{opacity:1}to{opacity:0}}.author-name[data-v-081ce552]{cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;max-width:100%;font-weight:500;font-size:12px}.commit-hash[data-v-081ce552]{cursor:pointer;color:#409eff;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-weight:500;border-radius:3px;padding:1px 3px;background-color:#ecf5ff;transition:all .2s ease;font-size:11px}.commit-hash[data-v-081ce552]:hover{text-decoration:none;background-color:#d9ecff;box-shadow:0 2px 4px #0000000d}.commit-detail-container[data-v-081ce552]{display:flex;flex-direction:column;gap:20px}.commit-info[data-v-081ce552]{padding:16px;background-color:#f5f7fa;border-radius:8px;font-size:14px;display:flex;flex-direction:column;gap:16px}.commit-info-header[data-v-081ce552]{display:flex;flex-wrap:wrap;gap:16px;align-items:center;background-color:#fff;padding:16px;border-radius:8px;border:1px solid #e4e7ed}.info-item[data-v-081ce552]{display:flex;align-items:center;gap:8px}.item-label[data-v-081ce552]{font-weight:700;color:#606266;white-space:nowrap}.item-value[data-v-081ce552]{color:#333;word-break:break-all}.commit-message-container[data-v-081ce552]{display:flex;flex-direction:column;gap:8px}.message-label[data-v-081ce552]{font-weight:700;color:#606266}.commit-files-diff[data-v-081ce552]{margin-top:8px;display:flex;gap:20px;height:60vh}.files-list[data-v-081ce552]{width:25%;overflow-y:auto;background-color:#f5f7fa;border-radius:8px;padding:16px}.files-list h3[data-v-081ce552]{margin-top:0;padding-bottom:12px;border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:500}.files-list ul[data-v-081ce552]{list-style:none;padding:0;margin:0}.files-list li[data-v-081ce552]{padding:10px 12px;cursor:pointer;border-radius:4px;margin-bottom:6px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px;transition:all .2s ease;border:1px solid transparent}.files-list li[data-v-081ce552]:hover{background-color:#ecf5ff;border-color:#d9ecff}.files-list li.active-file[data-v-081ce552]{background-color:#409eff;color:#fff;box-shadow:0 2px 6px #409eff4d}.file-diff[data-v-081ce552]{flex:1;display:flex;flex-direction:column;background-color:#f5f7fa;border-radius:8px;padding:16px;overflow:hidden}.file-diff h3[data-v-081ce552]{margin-top:0;padding-bottom:12px;border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:500}.diff-content[data-v-081ce552]{flex:1;overflow-y:auto;background-color:#fff;padding:16px;border-radius:8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:13px;line-height:1.6;border:1px solid #ebeef5}.diff-content[data-v-081ce552]::-webkit-scrollbar,.files-list[data-v-081ce552]::-webkit-scrollbar{width:6px;height:6px}.diff-content[data-v-081ce552]::-webkit-scrollbar-thumb,.files-list[data-v-081ce552]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.diff-content[data-v-081ce552]::-webkit-scrollbar-thumb:hover,.files-list[data-v-081ce552]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.diff-content[data-v-081ce552]::-webkit-scrollbar-track,.files-list[data-v-081ce552]::-webkit-scrollbar-track{background-color:transparent}.diff-content[data-v-081ce552],.files-list[data-v-081ce552]{scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.3) transparent}[data-v-081ce552] .commit-detail-dialog{--el-dialog-margin-top: 7vh}[data-v-081ce552] .commit-detail-dialog .el-dialog__body{padding:16px}.filter-panel-header[data-v-081ce552]{background-color:#f5f7fa;padding:16px;margin-bottom:16px;border-radius:8px;box-shadow:0 2px 12px #0000000d;transition:all .3s ease;width:100%;position:sticky;top:36px;z-index:99}.fullscreen-mode .filter-panel-header[data-v-081ce552]{position:sticky;top:60px;z-index:9;background-color:#fff;width:100%;border-radius:0;border-bottom:1px solid #ebeef5;box-shadow:0 2px 8px #0000000d}.filter-form[data-v-081ce552]{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between}.filter-item[data-v-081ce552]{flex:1;min-width:200px}.filter-actions[data-v-081ce552]{display:flex;align-items:center;gap:10px;white-space:nowrap;flex-shrink:0}.filter-input[data-v-081ce552]{width:100%}.filter-input.date-range[data-v-081ce552]{width:100%;max-width:280px}.compact-label[data-v-081ce552]{color:#909399;font-size:12px;margin-right:6px;white-space:nowrap;font-weight:700;border-right:1px solid #dcdfe6;padding-right:8px}.filter-action-button[data-v-081ce552]{padding:8px 16px;border-radius:6px;transition:all .3s;min-width:70px;font-weight:500}.filter-action-button[data-v-081ce552]:hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.table-view-container[data-v-081ce552]{height:100%;display:flex;flex-direction:column;flex:1}.log-table[data-v-081ce552]{flex:1;width:100%}.commit-message-cell[data-v-081ce552]{display:flex;align-items:center;min-height:32px}.message-content[data-v-081ce552]{display:flex;align-items:center;gap:8px;width:100%}.message-text[data-v-081ce552]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:1.3}.copy-message-btn[data-v-081ce552]{opacity:0;transition:opacity .2s ease;padding:4px;min-width:auto;height:auto}.commit-message-cell:hover .copy-message-btn[data-v-081ce552]{opacity:1}.copy-message-btn[data-v-081ce552]:hover{color:#409eff}.fullscreen-mode .table-view-container[data-v-081ce552]{height:calc(100vh - 160px)}.fullscreen-mode .log-table[data-v-081ce552]{height:100%}.load-more-container[data-v-081ce552]{display:flex;flex-direction:column;align-items:center;padding:8px 0;border-top:1px dashed #ebeef5;gap:8px}.pagination-info[data-v-081ce552]{font-size:13px;color:#909399;margin-bottom:4px}.loading-more[data-v-081ce552]{display:flex;align-items:center;color:#909399;font-size:13px;gap:8px}.loading-spinner[data-v-081ce552]{width:16px;height:16px;border:2px solid #dcdfe6;border-top-color:#409eff;border-radius:50%;animation:spinner-081ce552 1s linear infinite}@keyframes spinner-081ce552{to{transform:rotate(360deg)}}.load-more-button[data-v-081ce552]{cursor:pointer;color:#409eff;font-size:13px;padding:6px 16px;border:1px solid #d9ecff;background-color:#ecf5ff;border-radius:4px;transition:all .3s;font-weight:500}.no-more-data[data-v-081ce552]{color:#909399;font-size:13px;font-style:italic;display:flex;flex-direction:column;align-items:center}.total-loaded[data-v-081ce552]{font-size:12px;margin-top:4px;color:#c0c4cc}@keyframes fadeIn-081ce552{0%{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}.context-menu-item[data-v-081ce552]{padding:10px 16px;cursor:pointer;font-size:14px;display:flex;align-items:center;transition:all .2s ease;color:#606266}.context-menu-item[data-v-081ce552]:hover{background-color:#f5f7fa;color:#409eff}.context-menu-item i[data-v-081ce552]{margin-right:10px;font-size:16px}[data-v-081ce552] .el-table--border .el-table__inner-wrapper tr{border:none!important}[data-v-081ce552] .el-table--border .el-table__inner-wrapper td{border-right:none!important;border-bottom:none!important}[data-v-081ce552] .el-table--border .el-table__inner-wrapper th{border-right:none!important}[data-v-081ce552] .el-table--border,[data-v-081ce552] .el-table--border .el-table__inner-wrapper{border:none!important}[data-v-081ce552] .el-table--border:after,[data-v-081ce552] .el-table--border:before,[data-v-081ce552] .el-table__inner-wrapper:after,[data-v-081ce552] .el-table__inner-wrapper:before{display:none!important}[data-v-081ce552] .el-table tr{background-color:transparent!important}[data-v-081ce552] .el-table--striped .el-table__body tr.el-table__row--striped td{background-color:#00000005!important}.fullscreen-mode[data-v-081ce552]{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:9999;margin:0;border-radius:0;border:none;box-shadow:none;background-color:#fff;display:flex;flex-direction:column;overflow:auto}.fullscreen-mode .log-header[data-v-081ce552]{position:sticky;top:0;z-index:10;background-color:#fff;padding:16px;margin-bottom:10px;width:100%}.fullscreen-mode .filter-panel-header[data-v-081ce552]{position:sticky;top:60px;z-index:9;background-color:#fff;width:100%}.fullscreen-mode .content-area[data-v-081ce552]{height:100vh;max-height:none;flex:1;overflow:auto}.fullscreen-mode .el-table[data-v-081ce552]{height:calc(100vh - 60px)}.fullscreen-mode .graph-view[data-v-081ce552]{height:calc(100vh - 140px)}.fullscreen-button[data-v-081ce552]{background:linear-gradient(135deg,#909399,#c0c4cc);color:#fff}.fullscreen-button.active-fullscreen[data-v-081ce552]{background:linear-gradient(135deg,#606266,#909399)}.context-menu[data-v-081ce552]{position:fixed;background:#fff;border:1px solid #dcdfe6;border-radius:8px;box-shadow:0 4px 16px #0000001a;padding:6px 0;z-index:3000;min-width:200px;animation:fadeIn-081ce552 .15s ease-out}.fullscreen-context-menu[data-v-081ce552]{z-index:999999}.icon-only-button[data-v-081ce552]{min-width:unset;width:36px;height:36px;padding:8px;border-radius:8px;display:flex;align-items:center;justify-content:center}.icon-only-button .el-icon[data-v-081ce552]{margin-right:0}.el-table .el-table__cell .cell{word-break:break-all}.diff-header{font-weight:700;background-color:#e6f1fc;padding:10px 16px;margin:12px 0;border-radius:6px;color:#0366d6;border-bottom:1px solid #c8e1ff}.diff-old-file,.diff-new-file{color:#586069;padding:4px 8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace}.diff-old-file{color:#cb2431}.diff-new-file{color:#22863a}.diff-hunk-header{color:#6f42c1;background-color:#f1f8ff;padding:4px 8px;margin:8px 0;border-radius:4px;font-family:JetBrains Mono,Fira Code,Consolas,monospace}.diff-added{background-color:#e6ffed;color:#22863a;padding:2px 8px;border-left:4px solid #22863a;font-family:JetBrains Mono,Fira Code,Consolas,monospace;display:block;margin:2px 0}.diff-removed{background-color:#ffeef0;color:#cb2431;padding:2px 8px;border-left:4px solid #cb2431;font-family:JetBrains Mono,Fira Code,Consolas,monospace;display:block;margin:2px 0}.diff-context{color:#444;padding:2px 8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;display:block;margin:2px 0;background-color:#fafbfc}.load-more-button:hover{background-color:#d9ecff;box-shadow:0 2px 6px #409eff26;transform:translateY(-1px)}.command-history-button[data-v-3e9f6472]{transition:all .3s ease}.command-history-button[data-v-3e9f6472]:hover{transform:translateY(-2px);box-shadow:0 4px 12px #409eff4d}.command-history-dialog[data-v-3e9f6472]{border-radius:8px;z-index:9999!important}[data-v-3e9f6472] .command-history-dialog .el-dialog__header{padding:0;margin-right:0;border-bottom:1px solid #ebeef5}[data-v-3e9f6472] .command-history-dialog .el-overlay{z-index:9998!important}[data-v-3e9f6472] .command-history-dialog .el-dialog{z-index:9999!important}.dialog-header[data-v-3e9f6472]{padding:16px 20px;display:flex;justify-content:space-between;align-items:center;background-color:#f8f9fa}.dialog-header h2[data-v-3e9f6472]{margin:0;font-size:18px;font-weight:500;color:#303133}.header-actions[data-v-3e9f6472]{display:flex;align-items:center;gap:8px}.socket-status[data-v-3e9f6472]{font-size:12px}.clear-button[data-v-3e9f6472]{transition:all .3s}.clear-button[data-v-3e9f6472]:hover{transform:rotate(12deg);background-color:#ff4d4f;border-color:#ff4d4f}.copy-all-button[data-v-3e9f6472]{transition:all .3s;position:relative}.copy-all-button[data-v-3e9f6472]:hover{transform:translateY(-2px);background-color:#409eff;border-color:#409eff;box-shadow:0 2px 6px #409eff4d}.copy-commands-button[data-v-3e9f6472]{transition:all .3s;position:relative}.copy-commands-button[data-v-3e9f6472]:hover{transform:translateY(-2px);background-color:#67c23a;border-color:#67c23a;box-shadow:0 2px 6px #67c23a4d}.copy-commands-button[data-v-3e9f6472]:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background-color:#ffffff4d;opacity:0;transition:opacity .3s}.copy-all-button[data-v-3e9f6472]:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background-color:#ffffff4d;opacity:0;transition:opacity .3s}.copy-commands-button[data-v-3e9f6472]:active:after,.copy-all-button[data-v-3e9f6472]:active:after{opacity:1;animation:ripple-3e9f6472 .6s ease-out}@keyframes ripple-3e9f6472{0%{width:0;height:0;opacity:.5}to{width:30px;height:30px;opacity:0}}.dialog-content[data-v-3e9f6472]{padding:20px;overflow-y:auto;max-height:calc(80vh - 120px)}.loading-state[data-v-3e9f6472]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:100px}.loading-icon[data-v-3e9f6472]{font-size:36px;color:#409eff;margin-bottom:10px}.loading-text[data-v-3e9f6472]{font-size:14px;color:#606266}.history-list[data-v-3e9f6472]{display:flex;flex-direction:column;gap:8px}.history-item[data-v-3e9f6472]{border:1px solid #ebeef5;border-radius:4px;transition:all .2s;background-color:#f8f9fa;overflow:hidden}.history-item[data-v-3e9f6472]:hover{box-shadow:0 2px 12px #0000001a}.history-item.is-error[data-v-3e9f6472]{border-left:3px solid #f56c6c}.item-header[data-v-3e9f6472]{padding:10px 12px;display:flex;justify-content:space-between;align-items:center;cursor:pointer;transition:background-color .2s}.item-header[data-v-3e9f6472]:hover{background-color:#f0f2f5}.command-info[data-v-3e9f6472]{flex:1;min-width:0;overflow:hidden}.command-text[data-v-3e9f6472]{display:flex;align-items:center;gap:8px;margin-bottom:4px}.command-text code[data-v-3e9f6472]{font-family:Consolas,Courier New,monospace;font-size:13px;color:#303133;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.command-meta[data-v-3e9f6472]{display:flex;align-items:center;gap:16px;font-size:12px;color:#909399}.timestamp[data-v-3e9f6472],.duration[data-v-3e9f6472]{white-space:nowrap}.item-actions[data-v-3e9f6472]{display:flex;align-items:center;gap:6px;margin-left:8px}.item-details[data-v-3e9f6472]{padding:10px 12px;border-top:1px solid #ebeef5;background-color:#fff;display:flex;flex-direction:column;gap:12px}.output-section[data-v-3e9f6472]{display:flex;flex-direction:column;gap:6px}.output-section.error[data-v-3e9f6472]{border-left:3px solid #f56c6c;padding-left:8px}.output-section[data-v-3e9f6472]:not(.error){border-left:3px solid #67c23a;padding-left:8px}.output-header[data-v-3e9f6472]{display:flex;justify-content:space-between;align-items:center}.output-header h4[data-v-3e9f6472]{margin:0;font-size:14px;font-weight:500;color:#606266}.output-content[data-v-3e9f6472]{background-color:#f8f9fa;padding:10px;border-radius:4px;font-family:Consolas,Courier New,monospace;font-size:12px;white-space:pre-wrap;word-break:break-all;margin:0;max-height:300px;overflow-y:auto;border:1px solid #ebeef5}.status-tag[data-v-3e9f6472]{flex-shrink:0}.truncation-notice[data-v-3e9f6472]{margin-top:6px}.output-content[data-v-3e9f6472]::-webkit-scrollbar{width:6px;height:6px}.output-content[data-v-3e9f6472]::-webkit-scrollbar-thumb{background-color:#c0c4cc;border-radius:3px}.output-content[data-v-3e9f6472]::-webkit-scrollbar-track{background-color:#f5f7fa}.command-history-dialog{z-index:99999!important}.el-overlay{z-index:99998!important}.el-dialog{z-index:99999!important}.el-overlay.is-message-box{z-index:99998!important}.el-dialog.command-history-dialog{z-index:99999!important}body{font-family:Arial,sans-serif;margin:0;padding:0;background-color:#f5f5f5;overflow:hidden;height:100vh}.main-container{position:fixed;top:60px;bottom:60px;left:0;right:0;padding:10px;overflow:hidden;z-index:1001}.grid-layout{display:grid;grid-template-columns:2fr 4px 3fr;grid-template-rows:1fr 4px 1fr;grid-template-areas:"git-status v-resizer commit-form" "h-resizer h-resizer h-resizer" "log-list log-list log-list";gap:6px;height:100%}.git-status-panel{grid-area:git-status;overflow:hidden;max-height:100%;padding:0}.commit-form-panel{grid-area:commit-form;overflow:hidden;max-height:100%;padding:0}.log-list-panel{grid-area:log-list;overflow:hidden;max-height:100%;padding:0}.card{background-color:#fff;border-radius:8px;box-shadow:0 4px 12px #0000000d;border:1px solid rgba(0,0,0,.03);height:100%;overflow:hidden;display:flex;flex-direction:column}.main-header{background-color:#24292e;color:#fff;padding:0 20px;display:flex;justify-content:space-between;align-items:center;position:fixed;top:0;left:0;right:0;z-index:1000;box-shadow:0 2px 10px #0003;height:60px;box-sizing:border-box}.header-left{display:flex;align-items:center;gap:10px;min-width:220px;flex:1}.logo{height:32px;width:auto}h1{margin:0;font-size:24px}.header-info{display:flex;align-items:center;gap:10px;justify-content:flex-end}#user-info{display:flex;align-items:center;background-color:#282c34b3;padding:6px 10px;border-radius:4px;border:1px solid rgba(255,255,255,.15);margin-right:10px;flex-shrink:0}.directory-selector{display:flex;flex-direction:row;justify-content:space-between;align-items:center;background-color:#282c34b3;border-radius:4px;padding:6px 10px;border:1px solid rgba(255,255,255,.15);box-shadow:0 2px 8px #00000026;flex-shrink:0}.command-history-section{display:flex;align-items:center;margin-left:12px}.directory-display{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.directory-path{font-family:monospace;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;font-weight:500;background-color:#0003;padding:4px 8px;border-radius:3px;border-left:3px solid #409EFF;flex:1;min-width:0;max-width:500px}.branch-label,.user-label,.user-name{font-weight:700;margin-right:5px}.user-email{color:#e0e0e0}.branch-name{font-family:monospace}.status-box{background-color:#f6f8fa;border:1px solid #e1e4e8;border-radius:3px;padding:15px;white-space:pre-wrap;font-family:monospace;overflow-y:auto}.tips{margin-top:20px;padding:15px;background-color:#f5f7fa;border-radius:5px;border-left:4px solid #409eff}.tips h3{margin-top:0;font-size:16px;margin-bottom:10px}.code-block{background-color:#2d2d2d;color:#f8f8f2;font-family:monospace;padding:10px 15px;border-radius:4px;margin-bottom:10px}.loading-container{display:flex;justify-content:center;align-items:center;height:100%}.loading-card{width:300px;text-align:center;padding:30px}.loading-spinner{font-size:48px;margin-bottom:20px;color:#409eff}.loading-text{font-size:18px;color:#606266}.user-settings-btn{margin-left:10px}.user-warning{color:#e6a23c;font-weight:700}.main-footer{background-color:#24292e;color:#fff;padding:10px 20px;display:flex;justify-content:space-between;align-items:center;position:fixed;bottom:0;left:0;right:0;z-index:100;box-shadow:0 -2px 10px #0000001a;height:60px;box-sizing:border-box}@media (max-width: 768px){.grid-layout{grid-template-columns:1fr;grid-template-rows:auto auto auto auto auto;grid-template-areas:"git-status" "v-resizer" "commit-form" "h-resizer" "log-list";gap:10px}.vertical-resizer{height:10px;cursor:row-resize}.vertical-resizer:after{width:30px;height:4px}.git-status-panel,.commit-form-panel,.log-list-panel{padding:0;max-height:none}.git-status-panel,.commit-form-panel{max-height:30vh}.log-list-panel{max-height:40vh}}.logo[data-v-1e84e10d]{will-change:filter;transition:filter .3s}.logo[data-v-1e84e10d]:hover{filter:drop-shadow(0 0 2em #42b883aa)}.branch-info[data-v-1e84e10d]{display:flex;align-items:center;gap:10px}.branch-wrapper[data-v-1e84e10d]{display:flex;align-items:center;background-color:#ffffff26;border-radius:4px;padding:8px 12px;box-shadow:0 2px 4px #0003;transition:all .3s}.branch-wrapper[data-v-1e84e10d]:hover{background-color:#fff3}.branch-label[data-v-1e84e10d]{font-weight:700;margin-right:10px;color:#fff}.branch-select[data-v-1e84e10d]{width:200px;margin-right:10px}.create-branch-btn[data-v-1e84e10d]{background-color:#2ea44f;border-color:#2ea44f;transition:all .3s;box-shadow:0 2px 4px #0003}.create-branch-btn[data-v-1e84e10d]:hover{background-color:#3bbc63;border-color:#3bbc63;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.footer-right[data-v-1e84e10d]{display:flex;align-items:center;gap:10px;color:#ffffffe6;font-size:13px;background-color:#ffffff1a;padding:8px 12px;border-radius:4px;box-shadow:0 2px 4px #0003}.repo-url-label[data-v-1e84e10d]{font-weight:700;margin-right:8px;color:#fff}.repo-url[data-v-1e84e10d]{color:#e6f7ff;font-family:monospace;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.copy-url-btn[data-v-1e84e10d]{transition:all .3s;background-color:#1890ff;border-color:#1890ff;box-shadow:0 2px 4px #0003}.copy-url-btn[data-v-1e84e10d]:hover{background-color:#40a9ff;border-color:#40a9ff;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.vertical-resizer[data-v-1e84e10d]{grid-area:v-resizer;background-color:#e8e8e8;cursor:col-resize;transition:background-color .2s,box-shadow .2s;position:relative;z-index:10;border-radius:4px;box-shadow:0 0 2px #0000001a}.vertical-resizer[data-v-1e84e10d]:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:2px;height:40px;background-color:#a0a0a0;border-radius:2px;transition:background-color .2s,width .2s,box-shadow .2s}.vertical-resizer[data-v-1e84e10d]:hover,.vertical-resizer.active[data-v-1e84e10d]{background-color:#d0d0d0;box-shadow:0 0 4px #0003}.vertical-resizer[data-v-1e84e10d]:hover:after,.vertical-resizer.active[data-v-1e84e10d]:after{background-color:#409eff;width:3px;box-shadow:0 0 6px #409eff99}.horizontal-resizer[data-v-1e84e10d]{grid-area:h-resizer;background-color:#e8e8e8;cursor:row-resize;transition:background-color .2s,box-shadow .2s;position:relative;z-index:10;border-radius:4px;box-shadow:0 0 2px #0000001a}.horizontal-resizer[data-v-1e84e10d]:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:2px;background-color:#a0a0a0;border-radius:2px;transition:background-color .2s,height .2s,box-shadow .2s}.horizontal-resizer[data-v-1e84e10d]:hover,.horizontal-resizer.active[data-v-1e84e10d]{background-color:#d0d0d0;box-shadow:0 0 4px #0003}.horizontal-resizer[data-v-1e84e10d]:hover:after,.horizontal-resizer.active[data-v-1e84e10d]:after{background-color:#409eff;height:3px;box-shadow:0 0 6px #409eff99}.vertical-resizer-bottom[data-v-1e84e10d]{grid-area:v-resizer-bottom;background-color:#e8e8e8;cursor:col-resize;transition:background-color .2s,box-shadow .2s;position:relative;z-index:10;border-radius:4px;box-shadow:0 0 2px #0000001a}.vertical-resizer-bottom[data-v-1e84e10d]:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:2px;height:40px;background-color:#a0a0a0;border-radius:2px;transition:background-color .2s,width .2s,box-shadow .2s}.vertical-resizer-bottom[data-v-1e84e10d]:hover,.vertical-resizer-bottom.active[data-v-1e84e10d]{background-color:#d0d0d0;box-shadow:0 0 4px #0003}.vertical-resizer-bottom[data-v-1e84e10d]:hover:after,.vertical-resizer-bottom.active[data-v-1e84e10d]:after{background-color:#409eff;width:3px;box-shadow:0 0 6px #409eff99}.directory-selector[data-v-1e84e10d]{display:flex;flex-direction:row;justify-content:space-between;align-items:center;background-color:#282c34b3;border-radius:4px;padding:8px 12px;margin-bottom:8px;border:1px solid rgba(255,255,255,.2);box-shadow:0 2px 8px #0003}.directory-display[data-v-1e84e10d]{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.directory-path[data-v-1e84e10d]{font-family:monospace;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;font-weight:500;background-color:#0003;padding:4px 8px;border-radius:3px;border-left:3px solid #409EFF;flex:1;min-width:0;max-width:350px}.directory-actions[data-v-1e84e10d]{display:flex;gap:4px;margin-left:8px}.dir-button[data-v-1e84e10d]{padding:4px;height:24px;width:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#409eff,#53a8ff);color:#fff;border:none;box-shadow:0 2px 4px #0003;transition:all .3s}.dir-button[data-v-1e84e10d]:hover{transform:translateY(-1px);box-shadow:0 3px 6px #0000004d;background:linear-gradient(135deg,#53a8ff,#66b1ff)}.dir-button.el-button--info[data-v-1e84e10d]{background:linear-gradient(135deg,#909399,#a6a9ad)}.dir-button.el-button--info[data-v-1e84e10d]:hover{background:linear-gradient(135deg,#a6a9ad,#c0c4cc)}.directory-icon[data-v-1e84e10d]{display:flex;justify-content:center;align-items:center;width:24px;height:24px;border-radius:3px;background-color:#409eff1a;color:#409eff;margin-right:2px}.directory-input-group[data-v-1e84e10d]{display:flex;align-items:center;gap:8px;width:100%}.recent-directories[data-v-1e84e10d]{display:flex;flex-wrap:wrap;gap:4px}.recent-dir-tag[data-v-1e84e10d]{cursor:pointer;background-color:#e6f7ff;border:1px solid #91d5ff;padding:4px 8px;border-radius:4px}.directory-browser[data-v-1e84e10d]{width:100%;height:400px;overflow:auto}.current-path[data-v-1e84e10d]{padding:10px;background-color:#f5f7fa;border-radius:4px;margin-bottom:10px;border:1px solid #e4e7ed;display:flex;align-items:center;width:100%;box-sizing:border-box}.path-label[data-v-1e84e10d]{font-weight:700;margin-right:5px;white-space:nowrap;flex-shrink:0}.path-value[data-v-1e84e10d]{font-family:monospace;word-break:break-all;flex:1;min-width:0;background-color:#fff;padding:5px 8px;border-radius:3px;border:1px solid #dcdfe6;box-shadow:inset 0 1px 2px #0000000d;width:100%}.directory-list[data-v-1e84e10d]{list-style:none!important;padding:0;margin:0;border:1px solid #e4e7ed;border-radius:4px;max-height:300px;overflow-y:auto;background-color:#fff;display:flex;flex-direction:column;width:100%;box-sizing:border-box}.directory-item[data-v-1e84e10d]{padding:10px 12px;border-bottom:1px solid #ebeef5;cursor:pointer;display:flex;align-items:center;transition:all .2s ease;position:relative;width:100%;box-sizing:border-box;list-style:none!important}.directory-item[data-v-1e84e10d]:hover{background-color:#ecf5ff}.directory-item[data-v-1e84e10d]:last-child{border-bottom:none}.parent-dir[data-v-1e84e10d]{background-color:#f5f7fa;font-weight:500}.dir-icon[data-v-1e84e10d]{margin-right:12px;display:flex;align-items:center;justify-content:center;width:24px;height:24px;flex-shrink:0}.dir-name[data-v-1e84e10d]{display:flex;align-items:center;font-size:14px;line-height:1.4}.folder-icon[data-v-1e84e10d]{filter:drop-shadow(0 1px 2px rgba(0,0,0,.1));transition:all .2s ease}.directory-item:hover .folder-icon[data-v-1e84e10d]{transform:scale(1.1)}[data-v-1e84e10d] .directory-browser-dialog{border-radius:8px;overflow:hidden}[data-v-1e84e10d] .directory-browser-dialog .el-message-box__header{background-color:#f5f7fa;padding:15px 20px;border-bottom:1px solid #e4e7ed;position:relative}[data-v-1e84e10d] .directory-browser-dialog .el-message-box__title{color:#409eff;font-weight:500;font-size:18px}[data-v-1e84e10d] .directory-browser-dialog .el-message-box__headerbtn{position:absolute;top:15px;right:15px;width:24px;height:24px;border-radius:50%;background-color:#0000000d;transition:all .3s;display:flex;align-items:center;justify-content:center}[data-v-1e84e10d] .directory-browser-dialog .el-message-box__headerbtn:hover{background-color:#0000001a;transform:rotate(90deg)}[data-v-1e84e10d] .directory-browser-dialog .el-message-box__headerbtn .el-message-box__close{color:#606266;font-weight:700;font-size:16px}[data-v-1e84e10d] .directory-browser-dialog .el-message-box__headerbtn:hover .el-message-box__close{color:#409eff}[data-v-1e84e10d] .directory-browser-dialog .el-message-box__content{padding:20px}.el-message-box__message{width:100%}.directory-browser-dialog{border-radius:8px;overflow:hidden}.directory-browser-dialog .el-message-box__header{background-color:#f5f7fa;padding:15px 20px;border-bottom:1px solid #e4e7ed;position:relative}.directory-browser-dialog .el-message-box__title{color:#409eff;font-weight:500;font-size:18px}.directory-browser-dialog .el-message-box__headerbtn{position:absolute;top:15px;right:15px;width:24px;height:24px;border-radius:50%;background-color:#0000000d;transition:all .3s;display:flex;align-items:center;justify-content:center}.directory-browser-dialog .el-message-box__headerbtn:hover{background-color:#0000001a;transform:rotate(90deg)}.directory-browser-dialog .el-message-box__headerbtn .el-message-box__close{color:#606266;font-weight:700;font-size:16px}.directory-browser-dialog .el-message-box__headerbtn:hover .el-message-box__close{color:#409eff}.directory-browser-dialog .el-message-box__content{padding:20px}.directory-browser-dialog .el-message-box__btns{padding:10px 20px 15px;border-top:1px solid #e4e7ed}.directory-browser{width:100%;height:400px;overflow:auto}.current-path{padding:10px;background-color:#f5f7fa;border-radius:4px;margin-bottom:10px;border:1px solid #e4e7ed;display:flex;align-items:center;width:100%;box-sizing:border-box}.path-label{font-weight:700;margin-right:5px;white-space:nowrap;flex-shrink:0}.path-value{font-family:monospace;word-break:break-all;flex:1;min-width:0;background-color:#fff;padding:5px 8px;border-radius:3px;border:1px solid #dcdfe6;box-shadow:inset 0 1px 2px #0000000d;width:100%}.directory-list{list-style:none!important;padding:0;margin:0;border:1px solid #e4e7ed;border-radius:4px;max-height:300px;overflow-y:auto;background-color:#fff;display:flex;flex-direction:column;width:100%;box-sizing:border-box}.directory-item{padding:10px 12px;border-bottom:1px solid #ebeef5;cursor:pointer;display:flex;align-items:center;transition:all .2s ease;position:relative;width:100%;box-sizing:border-box;list-style:none!important}.directory-item:hover{background-color:#ecf5ff}.directory-item:last-child{border-bottom:none}.parent-dir{background-color:#f5f7fa;font-weight:500}.dir-icon{margin-right:12px;display:flex;align-items:center;justify-content:center;width:24px;height:24px;flex-shrink:0}.dir-name{display:flex;align-items:center;font-size:14px;line-height:1.4}.folder-icon{filter:drop-shadow(0 1px 2px rgba(0,0,0,.1));transition:all .2s ease}.directory-item:hover .folder-icon{transform:scale(1.1)}*{margin:0;padding:0}div{box-sizing:border-box}
|