diff --git a/apps/presentation/dashboard/src/features/personal-workspace/goal-research-history.css b/apps/presentation/dashboard/src/features/personal-workspace/goal-research-history.css index 953cc4883d..28a01787ed 100644 --- a/apps/presentation/dashboard/src/features/personal-workspace/goal-research-history.css +++ b/apps/presentation/dashboard/src/features/personal-workspace/goal-research-history.css @@ -130,9 +130,11 @@ .research-history-controls .research-lens button[aria-pressed="true"] { background: var(--pw-text); color: var(--pw-bg); } .research-history-canvas.is-timeline { max-height: none; overflow: visible; background: var(--pw-bg); padding: 24px; } .research-timeline { display: grid; gap: 20px; min-width: 0; } -.research-timeline-guide { display: flex; align-items: center; gap: 4px; color: var(--pw-muted); font-size: var(--text-caption); } -.research-timeline-guide > .research-link { margin-inline-start: auto; } +.research-timeline-summary { display: grid; gap: 8px; min-width: 0; } +.research-timeline-key { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 8px; min-width: 0; } +.research-timeline-key > .research-link { margin-inline-start: auto; min-height: 44px; font-size: var(--text-body); } .research-phases { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; } +.research-phases.is-single { grid-template-columns: minmax(0, 1fr); } .research-history .research-phase { display: flex; flex-direction: column; align-items: stretch; gap: 10px; min-width: 0; min-height: 44px; padding: 12px; border: 1px solid var(--pw-line); border-radius: 8px; background: var(--pw-bg); color: var(--pw-text); font: inherit; text-align: left; cursor: pointer; transition: border-color var(--motion-fast) var(--ease-standard), background-color var(--motion-fast) var(--ease-standard); } .research-history .research-phase:hover { border-color: var(--pw-line-strong); background: var(--pw-hover); } .research-history .research-phase.is-active { outline: 2px solid var(--pw-text); outline-offset: -1px; } @@ -144,7 +146,7 @@ .research-phase-details dd { margin: 4px 0 0; } .research-phase-bar { display: flex; gap: 2px; height: 18px; border-radius: 4px; overflow: hidden; background: var(--pw-track); } .research-phase-bar span { display: flex; align-items: center; min-width: 4px; padding-inline: 6px; overflow: hidden; color: var(--pw-bg); font-size: var(--text-caption); font-weight: 600; white-space: nowrap; } -.research-phase-legend { display: flex; flex-wrap: wrap; gap: 4px 12px; font-size: var(--text-caption); color: var(--pw-text); } +.research-phase-legend { display: flex; flex: 1; flex-wrap: wrap; gap: 4px 12px; min-width: 0; font-size: var(--text-caption); color: var(--pw-text); } .research-phase-legend > span { display: inline-flex; align-items: center; gap: 4px; } .research-phase-legend i { display: inline-block; width: 8px; height: 8px; border-radius: 2px; background: var(--research-tone); } .research-trail-list em, .research-finding-sections dt { font-style: normal; font-weight: 600; color: var(--pw-text); margin-right: 6px; } @@ -166,7 +168,7 @@ .research-density span.is-gap, .research-gap-key { background: var(--pw-red-bg); } .research-density span.is-gap { border-top: 0; } .research-gap-key { display: inline-block; width: 10px; height: 10px; border: 1px solid var(--pw-red); border-radius: 2px; } -.research-bar-key { display: inline-block; width: 10px; height: 10px; background: var(--pw-blue-soft); border-top: 2px solid var(--pw-blue); border-radius: 2px 2px 0 0; } +.research-bar-key { display: inline-block; width: 10px; height: 10px; margin-inline-end: 4px; background: var(--pw-blue-soft); border-top: 2px solid var(--pw-blue); border-radius: 2px 2px 0 0; } .research-decision-ticks { position: relative; height: 12px; margin-top: 4px; } .research-decision-ticks span { position: absolute; top: 0; width: 3px; height: 10px; margin-left: -1px; border-radius: 1px; background: var(--pw-blue); } .research-decision-ticks span.is-replan, .research-tick-key.is-replan { background: var(--pw-orbit); } diff --git a/apps/presentation/dashboard/src/features/personal-workspace/goal-research-timeline.tsx b/apps/presentation/dashboard/src/features/personal-workspace/goal-research-timeline.tsx index fea0ae8c92..711c7d2bb4 100644 --- a/apps/presentation/dashboard/src/features/personal-workspace/goal-research-timeline.tsx +++ b/apps/presentation/dashboard/src/features/personal-workspace/goal-research-timeline.tsx @@ -91,6 +91,9 @@ export function GoalResearchTimeline({timeline, zh, selectedIds, selectedEventId const groupedIds = new Set(dayGroups.flatMap(group => group.nodes.map(node => node.id))); const swarm = timeline.singles.filter(id => !groupedIds.has(id)).map(id => timeline.nodes.get(id)!).filter(item => item.first !== null); const unknownTime = [...timeline.nodes.values()].filter(item => item.first === null).length; + const phaseNote = timeline.phases.length === 1 + ? (zh ? "全部记录归入同一阅读分组,仅为阅读组织,不是预声明的评估窗口。" : "All records share one reading group, for reading only; not a pre-declared evaluation window.") + : copy.phaseNote; const phaseName = (item: TimelinePhase) => timeline.phases.length === 1 ? copy.whole : [copy.early, copy.middle, copy.late][item.index]; const phaseDescription = (item: TimelinePhase) => { const counts = Object.entries(item.decisions); @@ -112,18 +115,22 @@ export function GoalResearchTimeline({timeline, zh, selectedIds, selectedEventId ; }; return
{timeline.phases.length === 1 ? (zh ? "全部记录归入同一阅读分组,仅为阅读组织,不是预声明的评估窗口。" : "All records share one reading group, for reading only; not a pre-declared evaluation window.") : copy.phaseNote}
{copy.densityHint}{zh ? "。" : ". "}{zh ? "无记录空档不代表研究停止。" : "A recording gap does not establish that research stopped."}
+{phaseNote}
{copy.densityHint}{zh ? "。" : ". "}{zh ? "无记录空档不代表研究停止。" : "A recording gap does not establish that research stopped."}
+{findingCopy.meaning}
{!timeline.structuredCount ?{copy.unstructuredHint}
: null}{copy.routeHint}{zh ? "。" : ". "}{zh ? "相邻点合拢,数字为研究项数,一次展开原始时间与依据。" : "Nearby points group; the number counts research items. Select once for original times and sources."}
{zh ? "未关联问题按首次记录 UTC 日期收纳,不推断路线或因果。决策轨迹按研究问题归组,组内保留各轮显式决策,最近记录在前;同名问题不会自动合并。" : "Unlinked questions group by first-record UTC date, without inferring a route or cause. Decision history groups explicit decisions by question, newest record first; matching titles do not merge questions."}
{findingCopy.meaning}