From f43b5ea73b6e898848dceff977027e2446aa387a Mon Sep 17 00:00:00 2001
From: JOJO <1498581755@qq.com>
Date: Wed, 17 Jun 2026 16:25:02 +0800
Subject: [PATCH] =?UTF-8?q?fix(chat):=20=E8=BF=90=E8=A1=8C=E6=9C=9F?=
=?UTF-8?q?=E9=97=B4=E6=81=A2=E5=A4=8D=E6=97=A7=E6=BB=9A=E5=8A=A8=E9=80=BB?=
=?UTF-8?q?=E8=BE=91=EF=BC=8C=E5=A0=86=E5=8F=A0=E5=9D=97=E6=9B=B4=E5=A4=9A?=
=?UTF-8?q?=E6=8C=89=E9=92=AE=E4=B9=9F=E6=8E=A5=E5=85=A5=E9=94=9A=E5=AE=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
static/src/components/chat/ChatArea.vue | 44 +++++++++++++-------
static/src/components/chat/StackedBlocks.vue | 14 +++++++
2 files changed, 42 insertions(+), 16 deletions(-)
diff --git a/static/src/components/chat/ChatArea.vue b/static/src/components/chat/ChatArea.vue
index ecb4077..d17a50d 100644
--- a/static/src/components/chat/ChatArea.vue
+++ b/static/src/components/chat/ChatArea.vue
@@ -131,6 +131,7 @@
:format-search-topic="formatSearchTopic"
:format-search-time="formatSearchTime"
:format-search-domains="formatSearchDomains"
+ @more-toggle="handleStackedMoreToggle"
/>
());
watch(
@@ -1102,6 +1097,10 @@ watch(
prevExpandedBlocks.value = new Set(newSet);
if (changed.size === 0) return;
+
+ // 保守策略:运行期间保持旧逻辑,由 stick-to-bottom 固定向下展开并向上滚动
+ if (props.streamingMessage) return;
+
const container = scrollRef.value;
if (!container) return;
@@ -1110,13 +1109,10 @@ watch(
`[data-block-id="${escapeBlockSelector(id)}"]`
) as HTMLElement | null;
if (el) {
- const isExpanding = newSet.has(id);
- const streaming = elementLooksStreaming(el);
anchorBlockElement(el, id, {
direction: 'auto',
- duration: streaming ? 5000 : 260,
- extendOnGrowth: streaming,
- phase: isExpanding ? 'expand' : 'collapse'
+ duration: 260,
+ phase: newSet.has(id) ? 'expand' : 'collapse'
});
}
}
@@ -1124,7 +1120,25 @@ watch(
{ flush: 'post' }
);
+function handleStackedMoreToggle(payload: {
+ element: HTMLElement;
+ expanded: boolean;
+ stackKey: string;
+}) {
+ // 保守策略:运行期间保持旧逻辑
+ if (props.streamingMessage) return;
+
+ anchorBlockElement(payload.element, `more-${payload.stackKey}`, {
+ direction: 'auto',
+ duration: 260,
+ phase: expanded ? 'expand' : 'collapse'
+ });
+}
+
function handleMinimalGroupToggle(payload: { groupId: string; expanded: boolean }) {
+ // 保守策略:运行期间保持旧逻辑
+ if (props.streamingMessage) return;
+
const { groupId, expanded } = payload;
const container = scrollRef.value;
if (!container) return;
@@ -1132,11 +1146,9 @@ function handleMinimalGroupToggle(payload: { groupId: string; expanded: boolean
`[data-group-id="${escapeBlockSelector(groupId)}"]`
) as HTMLElement | null;
if (el) {
- const streaming = elementLooksStreaming(el);
anchorBlockElement(el, groupId, {
direction: 'auto',
- duration: streaming ? 5000 : 300,
- extendOnGrowth: streaming,
+ duration: 300,
phase: expanded ? 'expand' : 'collapse'
});
}
diff --git a/static/src/components/chat/StackedBlocks.vue b/static/src/components/chat/StackedBlocks.vue
index 37bb04e..84d1cd2 100644
--- a/static/src/components/chat/StackedBlocks.vue
+++ b/static/src/components/chat/StackedBlocks.vue
@@ -177,6 +177,16 @@ const props = defineProps<{
formatSearchDomains: (filters: Record) => string;
}>();
+const emit = defineEmits<{
+ (
+ event: 'more-toggle',
+ payload: { element: HTMLElement; expanded: boolean; stackKey: string }
+ ): void;
+}>();
+
+let stackInstanceCounter = 0;
+const stackKey = `stacked-${++stackInstanceCounter}`;
+
// 初始化 personalization store
const personalizationStore = usePersonalizationStore();
@@ -253,6 +263,10 @@ const isToolCompleted = (action: any) => action?.tool?.status === 'completed';
const toggleMore = () => {
showAll.value = !showAll.value;
scheduleMeasure();
+ const el = moreBlock.value;
+ if (el instanceof HTMLElement) {
+ emit('more-toggle', { element: el, expanded: showAll.value, stackKey });
+ }
};
const toggleBlock = (blockId: string) => {