diff --git a/src/views/Dashboard.vue b/src/views/Dashboard.vue index 75758a3..8933c14 100644 --- a/src/views/Dashboard.vue +++ b/src/views/Dashboard.vue @@ -98,26 +98,6 @@
{{ $t('dashboard.empty.noIdeas') }}
- - -
-
-

{{ $t('dashboard.recentDecisions') }}

-
-
- {{ $t('dashboard.empty.noData') }} -
-
- - -
-
-

{{ $t('dashboard.openAnnotations') }}

-
-
- {{ $t('dashboard.empty.noData') }} -
-
@@ -146,12 +126,14 @@ const stats = computed(() => [ ]) function getProjectStage(status: string): { stage: string; stageLabelKey: string; progress: number } { + // stage(颜色档)与 stageLabelKey(文案)语义必须一致: + // planning/cancelled 不再借用 coding/testing 颜色(否则颜色撒谎),改用专属颜色档。 switch (status) { - case 'planning': return { stage: 'coding', stageLabelKey: 'planning', progress: 20 } + case 'planning': return { stage: 'planning', stageLabelKey: 'planning', progress: 20 } case 'in_progress': return { stage: 'coding', stageLabelKey: 'coding', progress: 55 } case 'paused': return { stage: 'testing', stageLabelKey: 'paused', progress: 40 } case 'completed': return { stage: 'release', stageLabelKey: 'done', progress: 100 } - case 'cancelled': return { stage: 'testing', stageLabelKey: 'cancelled', progress: 0 } + case 'cancelled': return { stage: 'cancelled', stageLabelKey: 'cancelled', progress: 0 } default: return { stage: 'coding', stageLabelKey: 'coding', progress: 30 } } } @@ -200,7 +182,11 @@ function ideaStatusLabel(status: string): string { } async function refresh() { - await Promise.all([store.loadProjects(), store.loadTasks(), store.loadIdeas()]) + try { + await Promise.all([store.loadProjects(), store.loadTasks(), store.loadIdeas()]) + } catch (e) { + console.error('Dashboard refresh failed:', e) + } } function quickCapture() { @@ -400,9 +386,11 @@ onMounted(async () => { .project-dot { width: 6px; height: 6px; border-radius: 50%; } -.dot-coding { background: var(--df-accent); } -.dot-testing { background: var(--df-warning); } -.dot-release { background: var(--df-success); } +.dot-coding { background: var(--df-accent); } +.dot-testing { background: var(--df-warning); } +.dot-release { background: var(--df-success); } +.dot-planning { background: var(--df-info); } +.dot-cancelled { background: var(--df-text-dim); } .project-name { font-size: 12px; @@ -422,6 +410,8 @@ onMounted(async () => { .chip-coding { background: rgba(123,111,240,0.12); color: var(--df-accent); } .chip-testing { background: rgba(240,199,94,0.12); color: var(--df-warning); } .chip-release { background: rgba(61,219,160,0.12); color: var(--df-success); } +.chip-planning { background: rgba(94,175,240,0.12); color: var(--df-info); } +.chip-cancelled { background: rgba(255,255,255,0.06); color: var(--df-text-dim); } .project-bar-wrap { display: flex; align-items: center; gap: 8px; margin-bottom: 5px; } .project-bar { @@ -439,6 +429,8 @@ onMounted(async () => { .fill-coding { background: var(--df-accent); } .fill-testing { background: var(--df-warning); } .fill-release { background: var(--df-success); } +.fill-planning { background: var(--df-info); } +.fill-cancelled { background: var(--df-text-dim); } .project-pct { font-family: var(--df-font-mono); @@ -501,76 +493,6 @@ onMounted(async () => { .idea-name { font-size: 12px; font-weight: 500; color: var(--df-text); display: block; } .idea-status { font-size: 10px; color: var(--df-text-dim); margin-top: 1px; display: block; } -/* ═══ Decision Rows ═══ */ -.decision-rows { display: flex; flex-direction: column; } -.decision-row { - display: flex; - gap: 10px; - padding: 7px 0; - border-bottom: 0.5px solid var(--df-border); -} -.decision-row:last-child { border-bottom: none; } - -.decision-marker { - width: 20px; height: 20px; - display: flex; align-items: center; justify-content: center; - font-size: 9px; - flex-shrink: 0; - border-radius: var(--df-radius-sm); -} -.marker-ai { background: rgba(94,175,240,0.12); color: var(--df-info); } -.marker-human { background: rgba(123,111,240,0.12); color: var(--df-accent); } - -.decision-q { font-size: 11px; color: var(--df-text-secondary); display: block; margin-bottom: 2px; } -.decision-a { - font-size: 11px; - font-weight: 500; - color: var(--df-accent); - display: block; - line-height: 1.3; -} -.decision-time { - font-family: var(--df-font-mono); - font-size: 9px; - color: var(--df-text-dim); - margin-top: 3px; - display: block; -} - -/* ═══ Annotation Rows ═══ */ -.anno-rows { display: flex; flex-direction: column; } -.anno-row { - display: flex; - align-items: center; - gap: 8px; - padding: 5px 0; - border-bottom: 0.5px solid var(--df-border); -} -.anno-row:last-child { border-bottom: none; } - -.anno-tag { - font-family: var(--df-font-mono); - font-size: 9px; - font-weight: 500; - padding: 2px 7px; - border-radius: var(--df-radius-sm); - min-width: 54px; - text-align: center; - letter-spacing: 0.5px; - flex-shrink: 0; -} -.tag-fixme { background: rgba(240,101,101,0.14); color: var(--df-danger); } -.tag-todo { background: rgba(94,175,240,0.12); color: var(--df-info); } -.tag-risk { background: rgba(240,199,94,0.12); color: #f0a830; } -.tag-question { background: rgba(94,175,240,0.10); color: var(--df-info); } - -.anno-text { - font-family: var(--df-font-mono); - font-size: 10px; - color: var(--df-text-secondary); - line-height: 1.3; -} - /* ═══ Responsive ═══ */ /* 窄窗口:单栏 */