zen-gitsync 2.2.2 → 2.2.4

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