diff --git a/src/components/ConfirmDialog.vue b/src/components/ConfirmDialog.vue index 52a4ea6..eeeafec 100644 --- a/src/components/ConfirmDialog.vue +++ b/src/components/ConfirmDialog.vue @@ -84,6 +84,8 @@ watch(() => props.visible, () => {}) color: var(--df-text, #333); line-height: 1.5; margin-bottom: 16px; + /* anywhere:长 Windows 路径等无空格长串可断行,不撑破 360px 弹窗 */ + overflow-wrap: anywhere; } .confirm-actions { display: flex; diff --git a/src/components/project/FilePreview.vue b/src/components/project/FilePreview.vue index 00126f9..6aca8db 100644 --- a/src/components/project/FilePreview.vue +++ b/src/components/project/FilePreview.vue @@ -641,7 +641,7 @@ onUnmounted(() => { } .preview-size { color: var(--df-text-dim); flex-shrink: 0; } -.preview-truncated { color: #f0a020; flex-shrink: 0; } +.preview-truncated { color: var(--df-git-modified); flex-shrink: 0; } .git-badge { flex-shrink: 0; @@ -655,7 +655,7 @@ onUnmounted(() => { .git-modified { background: color-mix(in srgb, var(--df-git-modified) 18%, transparent); color: var(--df-git-modified); } .git-added { background: color-mix(in srgb, var(--df-git-added) 18%, transparent); color: var(--df-git-added); } -.git-untracked { background: rgba(150, 150, 150, 0.18); color: #999; } +.git-untracked { background: rgba(150, 150, 150, 0.18); color: var(--df-git-untracked); } .git-deleted { background: color-mix(in srgb, var(--df-git-deleted) 18%, transparent); color: var(--df-git-deleted); } .git-other { background: color-mix(in srgb, var(--df-git-untracked) 18%, transparent); color: var(--df-git-untracked); } @@ -737,7 +737,7 @@ onUnmounted(() => { font-size: 13px; } -.preview-error { color: #e05050; } +.preview-error { color: var(--df-danger); } .binary-icon { font-size: 32px; opacity: 0.5; } .preview-image { @@ -1062,7 +1062,9 @@ onUnmounted(() => { .diff-line-text { flex: 1; - white-space: pre; + /* pre-wrap + break-all:diff 长行折行显示,替代旧 pre+hidden 的静默裁剪(内容不可达) */ + white-space: pre-wrap; + word-break: break-all; overflow: hidden; } diff --git a/src/components/project/ProjectCard.vue b/src/components/project/ProjectCard.vue index e0418cf..5f53f40 100644 --- a/src/components/project/ProjectCard.vue +++ b/src/components/project/ProjectCard.vue @@ -137,7 +137,7 @@ watch(() => props.view, () => nextTick(measureDesc)) .stage-testing { background: rgba(255,217,61,0.15); color: var(--df-warning); } .stage-release { background: rgba(100,255,218,0.15); color: var(--df-success); } /* WK-1:暂停/取消置灰(PROJECT_STATUS_BADGE_CLASS 映射) */ -.stage-dim { background: rgba(158,158,158,0.15); color: #9e9e9e; } +.stage-dim { background: rgba(158,158,158,0.15); color: var(--df-text-dim); } .card-desc-wrap { position: relative; diff --git a/src/components/task/TaskBatchBar.vue b/src/components/task/TaskBatchBar.vue index 3c4fbb1..19b26c3 100644 --- a/src/components/task/TaskBatchBar.vue +++ b/src/components/task/TaskBatchBar.vue @@ -269,8 +269,8 @@ function confirmDelete() { box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3); max-width: 80vw; } -.tbb-toast--success { border-color: rgba(82, 196, 26, 0.5); color: #67c23a; } -.tbb-toast--warning { border-color: rgba(230, 162, 60, 0.5); color: #e6a23c; } +.tbb-toast--success { border-color: color-mix(in srgb, var(--df-success) 50%, transparent); color: var(--df-success); } +.tbb-toast--warning { border-color: color-mix(in srgb, var(--df-warning) 50%, transparent); color: var(--df-warning); } .tbb-toast--error { border-color: rgba(240, 101, 101, 0.5); color: var(--df-danger); } .toast-enter-active, .toast-leave-active { transition: opacity 0.2s; } .toast-enter-from, .toast-leave-to { opacity: 0; } diff --git a/src/components/task/TaskOutputCard.vue b/src/components/task/TaskOutputCard.vue index b786d1f..edce7ab 100644 --- a/src/components/task/TaskOutputCard.vue +++ b/src/components/task/TaskOutputCard.vue @@ -94,6 +94,7 @@ const reviewSuggestions = computed(() => { display: flex; flex-direction: column; gap: 10px; + overflow-x: auto; } /* 自审结论卡:verdict 红绿标(pass 绿 / fail 红 / unknown 灰),复用全局 --df-success/danger token */ .review-card { diff --git a/src/i18n/en/tasks.ts b/src/i18n/en/tasks.ts index df8f12d..9f0fdff 100644 --- a/src/i18n/en/tasks.ts +++ b/src/i18n/en/tasks.ts @@ -127,6 +127,7 @@ export default { createFailed: 'Failed to create task', deleteFailed: 'Failed to delete task', updateFailed: 'Failed to update task', + selectProject: 'Please select a project', }, }, } diff --git a/src/i18n/zh-CN/tasks.ts b/src/i18n/zh-CN/tasks.ts index ea137e6..050cb48 100644 --- a/src/i18n/zh-CN/tasks.ts +++ b/src/i18n/zh-CN/tasks.ts @@ -127,6 +127,7 @@ export default { createFailed: '创建任务失败', deleteFailed: '删除任务失败', updateFailed: '更新任务失败', + selectProject: '请选择项目', }, }, } diff --git a/src/router/index.ts b/src/router/index.ts index 9941946..9b13430 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -65,12 +65,15 @@ const routes = [ component: () => import('../views/AuditLog.vue'), meta: { title: '审批历史' }, }, - { - path: '/dev/x6', - name: 'X6Demo', - component: () => import('../components/dev/X6Demo.vue'), - meta: { title: 'X6 v3 验证' }, - }, + // X6 v3 验证 demo:仅开发环境注册,生产构建不含该路由 + ...(import.meta.env.DEV + ? [{ + path: '/dev/x6', + name: 'X6Demo', + component: () => import('../components/dev/X6Demo.vue'), + meta: { title: 'X6 v3 验证' }, + }] + : []), { path: '/settings', name: 'Settings', diff --git a/src/styles/global.css b/src/styles/global.css index 14ac998..43f7e02 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -49,6 +49,10 @@ --df-border: rgba(255,255,255,0.06); --df-border-strong: rgba(255,255,255,0.10); + /* — Scrollbar: 滚动条 thumb(默认深色值,浅色主题在 [data-theme="light"] 覆写)— */ + --df-scrollbar: rgba(255,255,255,0.08); + --df-scrollbar-hover: rgba(255,255,255,0.14); + /* — Radius: 2/4/6/8/10 渐进(全站统一走 token)— */ --df-radius-xs: 2px; --df-radius-sm: 4px; @@ -107,6 +111,9 @@ --df-border: rgba(0,0,0,0.08); --df-border-strong: rgba(0,0,0,0.14); + + --df-scrollbar: rgba(0,0,0,0.2); + --df-scrollbar-hover: rgba(0,0,0,0.3); } * { margin: 0; padding: 0; box-sizing: border-box; } @@ -129,8 +136,8 @@ html, body, #app { /* — Scrollbar — */ ::-webkit-scrollbar { width: 5px; height: 5px; } ::-webkit-scrollbar-track { background: transparent; } -::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.08); border-radius: var(--df-radius-xs); } -::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,0.14); } +::-webkit-scrollbar-thumb { background: var(--df-scrollbar); border-radius: var(--df-radius-xs); } +::-webkit-scrollbar-thumb:hover { background: var(--df-scrollbar-hover); } /* — Selection — */ /* 选中态用 accent 实色 + 白字:保证紫底气泡(accent)选中也高对比可读, diff --git a/src/views/FileExplorerDetached.vue b/src/views/FileExplorerDetached.vue index 6068f35..467539c 100644 --- a/src/views/FileExplorerDetached.vue +++ b/src/views/FileExplorerDetached.vue @@ -1,10 +1,11 @@ @@ -29,27 +30,19 @@ const projectId = computed(() => (route.query.projectId as string) || '') background: var(--df-bg); } -.fe-detached-loading { +.fe-detached-error { display: flex; + flex-direction: column; justify-content: center; align-items: center; + gap: 12px; height: 100%; color: var(--df-text-dim); font-size: 14px; } -.spinner { - width: 20px; - height: 20px; - border: 2px solid var(--df-border, #444); - border-top-color: var(--df-accent, #3a8); - border-radius: 50%; - animation: df-spin 0.8s linear infinite; - display: inline-block; - margin-right: 8px; -} - -@keyframes df-spin { - to { transform: rotate(360deg); } +.fe-detached-error-icon { + font-size: 40px; + opacity: 0.6; } diff --git a/src/views/ProjectDetail.vue b/src/views/ProjectDetail.vue index 54effd1..7a95e73 100644 --- a/src/views/ProjectDetail.vue +++ b/src/views/ProjectDetail.vue @@ -1427,13 +1427,14 @@ onUnmounted(() => { border-radius: var(--df-radius-lg); font-weight: 500; } -.stage-planning { background: rgba(100,181,246,0.15); color: #64b5f6; } +/* 阶段色全走语义 token(对齐全站约定:releasing/completed=success,见 ActiveProjectsPanel dot-release) */ +.stage-planning { background: var(--df-info-bg); color: var(--df-info); } .stage-in_progress { background: var(--df-accent-soft); color: var(--df-accent); } -.stage-testing { background: rgba(255,193,7,0.15); color: #ffc107; } -.stage-releasing { background: rgba(156,39,176,0.15); color: #ce93d8; } -.stage-completed { background: rgba(100,200,100,0.15); color: #64c864; } -.stage-paused { background: rgba(158,158,158,0.15); color: #9e9e9e; } -.stage-cancelled { background: rgba(244,67,54,0.15); color: #f44336; } +.stage-testing { background: var(--df-warning-bg); color: var(--df-warning); } +.stage-releasing { background: var(--df-success-bg); color: var(--df-success); } +.stage-completed { background: var(--df-success-bg); color: var(--df-success); } +.stage-paused { background: rgba(158,158,158,0.15); color: var(--df-text-dim); } +.stage-cancelled { background: var(--df-danger-bg); color: var(--df-danger); } /* .header-actions 已提取到 styles/global.css 全局 */ diff --git a/src/views/TaskDetail.vue b/src/views/TaskDetail.vue index 82027b6..dfa1874 100644 --- a/src/views/TaskDetail.vue +++ b/src/views/TaskDetail.vue @@ -874,7 +874,7 @@ onBeforeUnmount(() => { border-radius: var(--df-radius-xs); } .priority-critical { background: rgba(255,107,107,0.2); color: var(--df-danger); } -.priority-high { background: rgba(255,152,0,0.2); color: #ff9800; } +.priority-high { background: rgba(255,152,0,0.2); color: var(--df-warning); } .priority-medium { background: rgba(100,181,246,0.2); color: var(--df-info); } .priority-low { background: rgba(90,99,128,0.2); color: var(--df-text-dim); } @@ -916,6 +916,7 @@ onBeforeUnmount(() => { .description-wrap { position: relative; overflow: hidden; + overflow-x: auto; transition: max-height 0.25s var(--df-ease); } .desc-toggle { diff --git a/src/views/Tasks.vue b/src/views/Tasks.vue index 4cd79b6..c0eccae 100644 --- a/src/views/Tasks.vue +++ b/src/views/Tasks.vue @@ -825,7 +825,7 @@ function openCreateModal(parent?: TaskRecord) { } async function confirmCreate() { - if (!newTaskProjectId.value) { alert('请选择项目'); return } + if (!newTaskProjectId.value) { showToast(t('tasks.err.selectProject'), 'error'); return } if (!newTaskTitle.value.trim()) return submitting.value = true try { @@ -1244,7 +1244,7 @@ onUnmounted(() => { flex-shrink: 0; } .priority-critical { background: rgba(255,107,107,0.2); color: var(--df-danger); } -.priority-high { background: rgba(255,152,0,0.2); color: #ff9800; } +.priority-high { background: rgba(255,152,0,0.2); color: var(--df-warning); } .priority-medium { background: rgba(100,181,246,0.2); color: var(--df-info); } .priority-low { background: rgba(90,99,128,0.2); color: var(--df-text-dim); }