From 3c2cbf58a76da053ace37ab07198e8a7db9e7d3d Mon Sep 17 00:00:00 2001 From: jingrow Date: Sun, 24 May 2026 21:00:36 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84ai=20chat=E8=81=8A=E5=A4=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/core/pagetype/default.vue | 38 ++- .../src/core/pagetype/default_toolbar.vue | 17 + frontend/src/shared/composables/useChat.ts | 99 ++++++ .../src/views/pagetype/ai_chat/ChatPanel.vue | 273 ++++++++++++++++ .../src/views/pagetype/ai_chat/ai_chat.vue | 308 +++++------------- .../views/pagetype/ai_chat/ai_chat_list.vue | 266 +++------------ 6 files changed, 556 insertions(+), 445 deletions(-) create mode 100644 frontend/src/shared/composables/useChat.ts create mode 100644 frontend/src/views/pagetype/ai_chat/ChatPanel.vue diff --git a/frontend/src/core/pagetype/default.vue b/frontend/src/core/pagetype/default.vue index bcdafafa4..9a9094bcf 100644 --- a/frontend/src/core/pagetype/default.vue +++ b/frontend/src/core/pagetype/default.vue @@ -74,6 +74,7 @@ @cancel-pg="handleCancelPg" @rename="handleRename" @duplicate="handleDuplicate" + @toggle-chat="handleToggleChat" /> @@ -335,13 +336,20 @@ + + + + + + + diff --git a/frontend/src/views/pagetype/ai_chat/ai_chat.vue b/frontend/src/views/pagetype/ai_chat/ai_chat.vue index b108a841e..79217cd19 100644 --- a/frontend/src/views/pagetype/ai_chat/ai_chat.vue +++ b/frontend/src/views/pagetype/ai_chat/ai_chat.vue @@ -1,13 +1,10 @@ @@ -216,97 +98,57 @@ watch(() => route.params.id, () => { background: var(--n-color, #fff); } -.chat-messages { +.welcome-page { flex: 1; - overflow-y: auto; - padding: 24px 0; -} - -.chat-loading, -.chat-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; - height: 100%; color: var(--n-text-color-3, #999); } -.empty-icon { +.welcome-icon { margin-bottom: 12px; opacity: 0.4; } -.empty-text { +.welcome-text { font-size: 14px; + margin: 0; } -.messages-list { - max-width: 780px; +.welcome-input-area { + flex-shrink: 0; + padding: 0 24px 24px; + max-width: 680px; margin: 0 auto; - padding: 0 24px; + width: 100%; } -.message-bubble.typing { - display: inline-block; - padding: 12px 18px; - margin: 8px 0 8px 44px; - background: var(--n-color-embedded, #f5f5f5); - border-radius: 12px; -} - -.typing-dots { - display: flex; - gap: 4px; - align-items: center; -} - -.typing-dots span { - width: 6px; - height: 6px; - border-radius: 50%; - background: var(--n-text-color-3, #999); - animation: typing-bounce 1.2s infinite; -} - -.typing-dots span:nth-child(2) { animation-delay: 0.2s; } -.typing-dots span:nth-child(3) { animation-delay: 0.4s; } - -@keyframes typing-bounce { - 0%, 60%, 100% { transform: translateY(0); opacity: 0.4; } - 30% { transform: translateY(-4px); opacity: 1; } -} - -.chat-input-area { - border-top: 1px solid var(--n-border-color, #e0e0e0); - padding: 16px 24px; - background: var(--n-color, #fff); -} - -.input-wrapper { +.pill-input { display: flex; align-items: flex-end; - gap: 8px; - max-width: 780px; - margin: 0 auto; + gap: 6px; + width: 100%; background: var(--n-color-embedded, #f5f5f5); - border-radius: 12px; + border: 1px solid var(--n-border-color, rgba(0,0,0,0.08)); + border-radius: 24px; padding: 8px 12px; - border: 1px solid var(--n-border-color, #e0e0e0); - transition: border-color 0.2s; + transition: border-color 0.2s, box-shadow 0.2s; } -.input-wrapper:focus-within { +.pill-input:focus-within { border-color: var(--n-primary-color, #6366f1); + box-shadow: 0 0 0 2px rgba(99,102,241,0.12); } -.chat-input { +.pill-textarea { flex: 1; border: none; outline: none; resize: none; - font-size: 14px; - line-height: 1.6; + font-size: 15px; + line-height: 1.5; background: transparent; color: var(--n-text-color, #333); max-height: 120px; @@ -314,11 +156,31 @@ watch(() => route.params.id, () => { font-family: inherit; } -.chat-input::placeholder { +.pill-textarea::placeholder { color: var(--n-text-color-3, #999); } -.send-btn { +.pill-send { + display: flex; + align-items: center; + justify-content: center; + width: 34px; + height: 34px; + border-radius: 50%; + border: none; + background: var(--n-text-color, #1a1a1a); + color: #fff; + cursor: pointer; flex-shrink: 0; + transition: opacity 0.15s; +} + +.pill-send:disabled { + opacity: 0.25; + cursor: not-allowed; +} + +.pill-send:not(:disabled):hover { + opacity: 0.85; } diff --git a/frontend/src/views/pagetype/ai_chat/ai_chat_list.vue b/frontend/src/views/pagetype/ai_chat/ai_chat_list.vue index 80c70e8fe..3625e3a8b 100644 --- a/frontend/src/views/pagetype/ai_chat/ai_chat_list.vue +++ b/frontend/src/views/pagetype/ai_chat/ai_chat_list.vue @@ -1,21 +1,28 @@