From 170b5484c9d5b23f99ac59942dcaf5e880432ff6 Mon Sep 17 00:00:00 2001 From: MT-Mint <798521692@qq.com> Date: Mon, 20 Apr 2026 10:34:57 +0800 Subject: [PATCH] style: lint prettier --- .../app/workspace/chats/[thread_id]/page.tsx | 39 ++-- .../src/components/ai-elements/message.tsx | 2 +- .../components/ai-elements/prompt-input.tsx | 26 +-- .../src/components/ai-elements/reasoning.tsx | 2 +- frontend/src/components/ui/context-menu.tsx | 84 ++++---- .../src/components/ui/dropdown-selector.tsx | 5 +- frontend/src/components/ui/slider.tsx | 24 +-- .../artifacts/artifact-file-detail.tsx | 60 ++++-- .../components/workspace/chats/chat-box.tsx | 4 +- .../src/components/workspace/input-box.tsx | 191 ++++++++++-------- .../workspace/messages/markdown-content.tsx | 20 +- .../workspace/messages/message-group.tsx | 9 +- .../workspace/messages/message-list-item.tsx | 34 ++-- frontend/src/core/i18n/locales/zh-CN.ts | 3 +- frontend/src/core/models/api.ts | 6 +- frontend/src/core/threads/hooks.ts | 5 +- frontend/src/hooks/use-iframe-skill.ts | 31 ++- .../src/hooks/use-selected-skill-listener.ts | 5 +- frontend/src/lib/utils.ts | 1 + frontend/src/styles/globals.css | 104 +++++++--- frontend/tests/e2e/support/chat-helpers.ts | 2 +- .../e2e/thinking-and-secret-leak.spec.ts | 37 ++-- 22 files changed, 406 insertions(+), 288 deletions(-) diff --git a/frontend/src/app/workspace/chats/[thread_id]/page.tsx b/frontend/src/app/workspace/chats/[thread_id]/page.tsx index aa7fc0e0..f9298822 100644 --- a/frontend/src/app/workspace/chats/[thread_id]/page.tsx +++ b/frontend/src/app/workspace/chats/[thread_id]/page.tsx @@ -1,5 +1,6 @@ "use client"; +import { Ticker } from "@tombcato/smart-ticker"; import { FilesIcon, ListTodoIcon, XIcon } from "lucide-react"; import { useRouter } from "next/navigation"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; @@ -22,6 +23,7 @@ import { } from "@/components/workspace/artifacts"; import { useThreadChat } from "@/components/workspace/chats"; // import { DevTodoList } from "@/components/workspace/dev-todo-list"; +import { IframeTestPanel } from "@/components/workspace/iframe-test-panel"; import { InputBox } from "@/components/workspace/input-box"; import { MessageList } from "@/components/workspace/messages"; import { ThreadContext } from "@/components/workspace/messages/context"; @@ -39,8 +41,7 @@ import { textOfMessage } from "@/core/threads/utils"; import { env } from "@/env"; import { useSelectedSkillListener } from "@/hooks/use-selected-skill-listener"; import { cn } from "@/lib/utils"; -import { IframeTestPanel } from "@/components/workspace/iframe-test-panel"; -import { Ticker } from "@tombcato/smart-ticker"; + import "@tombcato/smart-ticker/style.css"; import motivationSlogans from "./motivation-slogans.json"; @@ -141,7 +142,7 @@ export default function ChatPage() { if (initializedThreadRef.current === safeThreadId) return; initializedThreadRef.current = safeThreadId; void apiClient.threads - // TODO: 先注释先删除再创建的逻辑 + // TODO: 先注释先删除再创建的逻辑 // .delete(safeThreadId) // .catch(() => undefined) // .then(() => @@ -489,9 +490,7 @@ export default function ChatPage() { /> ) : (
-
- -
+
{thread.values.artifacts?.length === 0 ? ( } @@ -500,20 +499,20 @@ export default function ChatPage() { /> ) : (
-
-

+
+

{t.common.artifacts}

- +
- ⚠️ {selectedSkillError?.title ?? t.chatPage.selectedSkillLoadFailed} + ⚠️{" "} + {selectedSkillError?.title ?? + t.chatPage.selectedSkillLoadFailed}

diff --git a/frontend/src/components/ai-elements/message.tsx b/frontend/src/components/ai-elements/message.tsx index c45dcfdf..d36d400e 100644 --- a/frontend/src/components/ai-elements/message.tsx +++ b/frontend/src/components/ai-elements/message.tsx @@ -36,7 +36,7 @@ export const Message = ({ "group flex w-full flex-col gap-2", from === "user" ? cn("is-user ml-auto justify-end", !isFirstInSession && "mt-6") - : "is-assistant bg-white rounded-[10px] p-4", + : "is-assistant rounded-[10px] bg-white p-4", className, )} {...props} diff --git a/frontend/src/components/ai-elements/prompt-input.tsx b/frontend/src/components/ai-elements/prompt-input.tsx index 01556369..197d0073 100644 --- a/frontend/src/components/ai-elements/prompt-input.tsx +++ b/frontend/src/components/ai-elements/prompt-input.tsx @@ -350,19 +350,19 @@ export function PromptInputAttachment({ /> {/* 删除按钮 - 右上角 */} - - +

{ZOOM_LEVELS[0]}% - {value}% + + {value}% +
-

{t.common.artifacts}

+

+ {t.common.artifacts} +

{ @@ -381,24 +388,27 @@ export function InputBox({ form?.requestSubmit(); }, []); - const addMentionReference = useCallback((reference: PromptInputReference) => { - setReferences((prev) => { - const exists = prev.some( - (item) => - item.ref_source === reference.ref_source && - item.path === reference.path && - item.filename === reference.filename, - ); - if (exists) { - return prev; - } - if (prev.length >= MAX_REFERENCES_PER_MESSAGE) { - toast.error(t.inputBox.maxReferencesReached); - return prev; - } - return prev.concat(reference); - }); - }, [t.inputBox.maxReferencesReached]); + const addMentionReference = useCallback( + (reference: PromptInputReference) => { + setReferences((prev) => { + const exists = prev.some( + (item) => + item.ref_source === reference.ref_source && + item.path === reference.path && + item.filename === reference.filename, + ); + if (exists) { + return prev; + } + if (prev.length >= MAX_REFERENCES_PER_MESSAGE) { + toast.error(t.inputBox.maxReferencesReached); + return prev; + } + return prev.concat(reference); + }); + }, + [t.inputBox.maxReferencesReached], + ); const selectMentionCandidate = useCallback( (candidate: MentionCandidate) => { @@ -433,7 +443,7 @@ export function InputBox({ useEffect(() => { const onMentionReference = (event: Event) => { const detail = (event as CustomEvent).detail; - if (!detail || detail.threadId !== threadIdFromProps) { + if (detail?.threadId !== threadIdFromProps) { return; } addMentionReference({ @@ -493,14 +503,15 @@ export function InputBox({ } if (event.key === "ArrowDown") { event.preventDefault(); - setActiveMentionIndex((prev) => - (prev + 1) % filteredMentionCandidates.length, + setActiveMentionIndex( + (prev) => (prev + 1) % filteredMentionCandidates.length, ); } else if (event.key === "ArrowUp") { event.preventDefault(); - setActiveMentionIndex((prev) => - (prev - 1 + filteredMentionCandidates.length) % - filteredMentionCandidates.length, + setActiveMentionIndex( + (prev) => + (prev - 1 + filteredMentionCandidates.length) % + filteredMentionCandidates.length, ); } else if (event.key === "Enter") { event.preventDefault(); @@ -693,7 +704,7 @@ export function InputBox({ align="start" side="top" sideOffset={8} - className="w-[min(32rem,var(--radix-dropdown-menu-trigger-width)+28rem)] max-h-[400px] overflow-y-hidden p-[20px]" + className="max-h-[400px] w-[min(32rem,var(--radix-dropdown-menu-trigger-width)+28rem)] overflow-y-hidden p-[20px]" data-testid="mention-candidate-panel" onCloseAutoFocus={(event) => { event.preventDefault(); @@ -704,52 +715,54 @@ export function InputBox({ {t.inputBox.addReference} - + - {filteredMentionCandidates.map((candidate, index) => { - const detail = [candidate.typeLabel, candidate.pathTail] - .filter(Boolean) - .join(" · "); - return ( - setActiveMentionIndex(index)} - onMouseDown={(event) => event.preventDefault()} - onSelect={(event) => { - event.preventDefault(); - selectMentionCandidate(candidate); - }} - > - {candidate.isImage && candidate.previewUrl ? ( - {candidate.filename} - ) : ( -
- {fileExtensionLabel(candidate.filename)} -
- )} -
- - {candidate.filename} - - - {detail} - -
-
- ); - })} + {filteredMentionCandidates.map((candidate, index) => { + const detail = [candidate.typeLabel, candidate.pathTail] + .filter(Boolean) + .join(" · "); + return ( + setActiveMentionIndex(index)} + onMouseDown={(event) => event.preventDefault()} + onSelect={(event) => { + event.preventDefault(); + selectMentionCandidate(candidate); + }} + > + {candidate.isImage && candidate.previewUrl ? ( + {candidate.filename} + ) : ( +
+ {fileExtensionLabel(candidate.filename)} +
+ )} +
+ + {candidate.filename} + + + {detail} + +
+
+ ); + })}
@@ -768,7 +781,7 @@ export function InputBox({ className={cn( "flex transition-all duration-300 ease-out", !effectiveIsFocused && - "pointer-events-none invisible h-[0px] translate-y-2 p-[0px] opacity-0", + "pointer-events-none invisible h-[0px] translate-y-2 p-[0px] opacity-0", )} > @@ -781,11 +794,13 @@ export function InputBox({ /> */} - {showWelcomeStyle && } + {showWelcomeStyle && ( + + )} - ); @@ -1205,7 +1219,10 @@ function AttachmentPreviewBar({ )} {hasReferences && ( -
+
{references.map((reference) => { const referenceUrl = threadId && reference.path @@ -1215,7 +1232,7 @@ function AttachmentPreviewBar({ }) : null; const filename = reference.filename ?? "reference"; - const imageMatch = filename.match(/\.(png|jpe?g|gif|webp|bmp|svg)$/i); + const imageMatch = /\.(png|jpe?g|gif|webp|bmp|svg)$/i.exec(filename); const extension = imageMatch?.[1]?.toLowerCase(); const mediaType = extension ? extension === "jpg" diff --git a/frontend/src/components/workspace/messages/markdown-content.tsx b/frontend/src/components/workspace/messages/markdown-content.tsx index 5f970bcb..2a184df1 100644 --- a/frontend/src/components/workspace/messages/markdown-content.tsx +++ b/frontend/src/components/workspace/messages/markdown-content.tsx @@ -41,8 +41,8 @@ function parseTableData(table: HTMLTableElement): TableData { (cell.textContent ?? "").trim(), ); const rows = Array.from(table.querySelectorAll("tbody tr")).map((row) => - Array.from(row.querySelectorAll("td")).map( - (cell) => (cell.textContent ?? "").trim(), + Array.from(row.querySelectorAll("td")).map((cell) => + (cell.textContent ?? "").trim(), ), ); return { headers, rows }; @@ -70,7 +70,9 @@ function MarkdownTable({ const handleCopy = useCallback( async (event: MouseEvent) => { - const wrapper = event.currentTarget.closest('[data-streamdown="table-wrapper"]'); + const wrapper = event.currentTarget.closest( + '[data-streamdown="table-wrapper"]', + ); const table = wrapper?.querySelector("table"); if (!(table instanceof HTMLTableElement)) return; @@ -89,10 +91,13 @@ function MarkdownTable({ ); return ( -
+