From 9d8477b7283a8653e1f43647cf2fc4d189b48838 Mon Sep 17 00:00:00 2001 From: mesalogo Date: Fri, 2 Oct 2026 22:22:03 +0800 Subject: [PATCH] fix: fit the story graph to the window and scroll each column on its own --- .../conversation-supervision/ui-design.md | 2 ++ src/renderer/src/SupervisorWorkspace.tsx | 5 ++- src/renderer/src/supervisor-workspace.css | 35 ++++++++++++++++++ src/renderer/src/use-fill-height.ts | 36 +++++++++++++++++++ tests/support/supervisor-layout-driver.mjs | 32 +++++++++++++++++ 5 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 src/renderer/src/use-fill-height.ts diff --git a/docs/features/conversation-supervision/ui-design.md b/docs/features/conversation-supervision/ui-design.md index dbc8ed0c..c06e3386 100644 --- a/docs/features/conversation-supervision/ui-design.md +++ b/docs/features/conversation-supervision/ui-design.md @@ -103,6 +103,8 @@ Modal 按[共享表单 Modal 规则](../../../UI-DESIGN.md#615-表单-modal)复 使用 `supervisor` 页面壳层,最大内容宽度为 `1440px`。当前生产图谱左侧为紧凑的事件、实体和关系列表,中间为 SVG 画布,右侧为详情与来源。桌面列宽为 `216px minmax(0, 1fr) 280px`,画布获得主要空间。外圈事件按发生时间排序后等距逆时针排列,不表示实际时间间隔;起止之间保留缺口和方向箭头。内部显示真实实体名称,实线仅连接实际事件与实体,虚线仅连接实际实体关系。 +高度:容器宽度不小于 861px 时,图谱这一行的高度等于窗口可见高度减去图谱顶部位置,并在底部保留约 24px 边距(不小于页面底部内边距),最低 420px。三栏时整页不再出现纵向滚动;左侧列表、中间画布、右侧详情各自在这一行内独立滚动,滚动只影响自身,不带动页面。两栏(861~1190px)时第一行按同样方式填满,详情换到下一行,保持自然高度并随页面滚动。单栏保持原有页面滚动和列表 320px 上限。窗口大小或图谱上方内容(提示、工具栏)变化时重新计算。 + 实体及其影响连线复用现有 `--graph-node-*-border` 令牌;颜色用于辅助辨认实体,不代表故事分类或确认状态。选中项加粗并突出连线,其余节点降低图形强调度但保留可读文字。详情分为名称与说明、图谱关联、确认操作和来源,来源正文按需读取。图例常显,读图说明可展开。 画布每批最多显示 8 个事件、6 个实体;同时间事件分开排布。列表保留全部返回记录和完整名称,选择实体会定位到真实关联事件所在批次,选择关系会优先显示两端实体。滑块明确命名“事件浏览”,只切换当前事件,不还原实体历史状态,也不宣称完整历史回放。当前接口返回单条故事线,不复制 Demo 中的三条模拟故事。后续视图规划见[图谱设计](../story-graph/prd.md)。 diff --git a/src/renderer/src/SupervisorWorkspace.tsx b/src/renderer/src/SupervisorWorkspace.tsx index fa65df72..7dbe97d1 100644 --- a/src/renderer/src/SupervisorWorkspace.tsx +++ b/src/renderer/src/SupervisorWorkspace.tsx @@ -6,6 +6,7 @@ import type { SupervisionReviewExecution } from '../../shared/supervision-review import { EmptyState, PageTabs } from './WorkspacePrimitives' import { SupervisionDiscussion } from './SupervisionDiscussion' import { SupervisionStoryDigest } from './SupervisionStoryDigest' +import { useFillHeight } from './use-fill-height' import { SupervisionEventStory, SupervisionExperienceDetail, SupervisionExperienceList, SupervisionStoryDetail, SupervisionStoryList, useSupervisionStories } from './SupervisionStories' import type { AssistantProject } from '../../shared/assistant-contracts' import { heartbeatScopeSchema } from '../../shared/assistant-contracts' @@ -478,6 +479,8 @@ export function SupervisorWorkspace({ ? (JSON.parse(graph.storyLine.scope_json) as SupervisionRunRequest['scope']) : undefined const storyState = useSupervisionStories(graphScope, tab === 'graph', graph) + const graphLayoutRef = useRef(null) + useFillHeight(graphLayoutRef, tab === 'graph' && graph.events.length > 0) // The work review reads the selected result's own scope, so it matches the period shown. const recapStories = useSupervisionStories(latest?.scope, tab === 'overview', latest?.id) const selectedStory = selection?.kind === 'story' ? storyState.view.stories.find((story) => story.id === selection.id) : undefined @@ -718,7 +721,7 @@ export function SupervisorWorkspace({ /> )} {graph.events.length > 0 && ( -
+