zen-gitsync 2.1.26 → 2.1.29

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