{#if show}
{ if (e.key === 'Escape') handleModalClose(); if (e.key === 'Tab') trapFocus(e); }} role="dialog" aria-modal="true" tabindex="-1" aria-label={`${$t.git?.management || 'Управление Git'}: ${dashboardTitle}`}>

{$t.git?.management || 'Управление Git'}

{dashboardTitle} · slug: {dashboardId}

{#if model.gitError} {/if}
{#if model.checkingStatus}
{:else if !model.initialized} model.handleCreateRemoteRepo()} onInit={() => model.handleInit()} /> {:else}
{#if model.hasOriginConfigMismatch}
{$t.git?.git_server_mismatch_title || 'Git server mismatch detected'}
{($t.git?.git_server_mismatch_desc || 'Configured: {configured}, origin: {origin}.').replace('{configured}', model.configHost).replace('{origin}', model.originHost)}
{$t.git?.git_server_mismatch_hint || 'Push/Pull будут отправлять на настроенный сервер, а не на origin. Обновите конфигурацию в Настройках → Git, если это не intended.'}
{$t.git?.git_server_mismatch_fix || 'Настроить'}
{/if} {#if model.commitCompleted}
{$t.git?.commit_success_banner || '✅ Изменения закоммичены.'} {$t.git?.commit_next_step || 'Следующий шаг: вкладка «Релиз» для продвижения между ветками или «Серверные операции» для Pull/Push/Deploy.'}
{/if}
{$t.git?.working_branch || 'Working branch (current changes):'}
model.handleBranchChanged(event)} onmerge={handleOpenMergeDialog} />
model.handleBranchChanged(event)} onMerge={handleOpenMergeDialog} selectedA={model.selectedVersionA} selectedB={model.selectedVersionB} onSelectVersion={(hash, secondary) => model.selectVersion(hash, secondary)} onClearSelection={() => model.clearVersionSelection()} onRequestDiff={async () => { const res = await model.getSelectedVersionsDiff(); if (res?.diff) { model.workspaceDiff = res.diff; model.activeTab = 'workspace'; addToast($t.git?.viz_diff_ready || 'Dashboard changes loaded for comparison', 'success'); } }} />
{#if model.activeTab === 'workspace'} model.handleSync()} onGenerateMessage={() => model.handleGenerateMessage()} onCommit={() => model.handleCommit()} /> {:else if model.activeTab === 'release'} model.handlePromote()} onDeploy={() => model.openDeployModal()} onOpenHistory={() => (model.activeTab = 'workspace')} /> {:else} model.handlePull()} onPush={() => model.handlePush()} /> {/if}
{/if}
model.loadMergeRecoveryState()} onCopyCommands={() => model.handleCopyUnfinishedMergeCommands()} onOpenConflictResolver={() => model.handleOpenConflictResolver()} onAbortMerge={() => model.handleAbortUnfinishedMerge()} onContinueMerge={() => model.handleContinueUnfinishedMerge()} onClose={() => model.closeUnfinishedMergeDialog()} />
{/if} model.handleResolveConflicts(e)} /> {#if model.showDeployConfirm}
{ model.showDeployConfirm = false; }} onkeydown={(e) => { if (e.key === 'Escape') model.showDeployConfirm = false; }}>
e.stopPropagation()}>

{$t.git?.deploy || 'Deploy to Environment'}

{$t.git?.deploy_confirm_intro || 'Подтвердите деплой. Введите slug дашборда:'} {model.deployConfirmSlug}

{$t.git?.deploy_confirm_dashboard || 'Dashboard'}
{dashboardTitle || dashboardId}
{$t.git?.deploy_confirm_branch || 'Source branch'}
{model.currentBranch}
{$t.git?.deploy_confirm_stage || 'Lifecycle stage'}
{model.currentWorkflowStage}
{$t.git?.deploy_confirm_target || 'Target'}
{model.preferredDeployTargetStage || model.currentEnvStage || 'PROD'}
{$t.git?.deploy_confirm_changes || 'Changed files'}
{model.changedFilesCount}
{#if model.workspaceStatus?.last_commit_hash}
{$t.git?.deploy_confirm_last_commit || 'Last commit'}
{model.workspaceStatus.last_commit_hash.slice(0, 8)}
{/if} {#if model.workspaceStatus?.last_commit_author}
{$t.git?.deploy_confirm_author || 'Author'}
{model.workspaceStatus.last_commit_author}
{/if} {#if model.workspaceStatus?.last_commit_message}
{$t.git?.deploy_confirm_message || 'Commit message'}
{model.workspaceStatus.last_commit_message}
{/if}
{ if (e.key === 'Enter' && deployConfirmInput.trim()) model.confirmDeploy(deployConfirmInput); }} autofocus />
{/if} model.refreshBranches()} /> model.refreshBranches()} /> {#if model.showCreateRepoDialog}
{ if (e.target === e.currentTarget) model.showCreateRepoDialog = false; }} onkeydown={(e) => { if (e.key === 'Escape') model.showCreateRepoDialog = false; }} role="dialog" aria-modal="true" aria-label={$t.git?.create_repo_dialog?.title || 'Create repository'}>

{$t.git?.create_repo_dialog?.title || 'Create repository'}

{($t.git?.create_repo_dialog?.name_prompt || 'Repository name for {provider}:').replace('{provider}', model.createRepoProviderLabel)}

{ if (e.key === 'Enter' && model.pendingRepoName.trim()) model.confirmCreateRemoteRepo(); }} />
{/if}