super-agent-sdk 1.0.21 → 1.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -10
- package/dist/index.cjs +4 -4
- package/dist/index.d.ts +24 -2
- package/dist/index.mjs +306 -285
- package/dist/{mammoth.browser-BWTaSUmQ.cjs → mammoth.browser-CKp13R4W.cjs} +63 -63
- package/dist/{mammoth.browser-DFPCY35d.js → mammoth.browser-_e1UoKEX.js} +3708 -3725
- package/dist/{nosUploader-DjJ7u2B1.js → nosUploader-2VXYPLap.js} +2 -1
- package/dist/{nosUploader-DLX7JsnR.cjs → nosUploader-Dk2GyRpT.cjs} +4 -4
- package/dist/{purify.es-CImoWRjX.js → purify.es-C-6FFqDW.js} +205 -214
- package/dist/purify.es-Dsdnkgrg.cjs +3 -0
- package/dist/widget.cjs +323 -29
- package/dist/widget.d.ts +56 -11
- package/dist/widget.mjs +27999 -5544
- package/package.json +3 -1
- package/dist/purify.es-BnmCBz16.cjs +0 -3
package/dist/widget.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export declare interface ActionBarProps {
|
|
|
11
11
|
message: UIMessage;
|
|
12
12
|
onCopy: () => void;
|
|
13
13
|
onRegenerate?: () => void;
|
|
14
|
-
onFeedback?: (
|
|
14
|
+
onFeedback?: (message: UIMessage | string, feedback: 'like' | 'dislike', options?: {
|
|
15
15
|
reason?: number;
|
|
16
16
|
remark?: string;
|
|
17
17
|
}) => void;
|
|
@@ -103,6 +103,7 @@ declare interface ChatEvent {
|
|
|
103
103
|
renderMode?: string;
|
|
104
104
|
html?: string;
|
|
105
105
|
markdown?: string;
|
|
106
|
+
defaultExpanded?: boolean;
|
|
106
107
|
roundId?: string;
|
|
107
108
|
event?: string;
|
|
108
109
|
id?: string;
|
|
@@ -154,7 +155,9 @@ export declare interface ChatState {
|
|
|
154
155
|
hasMore: boolean;
|
|
155
156
|
conversationsLoading: boolean;
|
|
156
157
|
messagesLoading: boolean;
|
|
157
|
-
|
|
158
|
+
/** 发送消息。content 为实发文本(技能命令 "/<code>" 在此组装);displayContent 为
|
|
159
|
+
* 气泡/标题展示文本(技能激活时 "/<技能名>",后端 SSE user 帧会再对齐一次)。 */
|
|
160
|
+
sendMessage: (content: string, attachments?: ChatAttachment[], displayContent?: string) => void;
|
|
158
161
|
/** 附件上传器(attachmentUploader 直传 or nosUpload 桥解析后的统一入口;null = 未启用) */
|
|
159
162
|
attachmentUploader: ((file: File) => Promise<ChatAttachment>) | null;
|
|
160
163
|
/** 内置直传配置(@netease-ehr/ui 桥;attachmentUploader 优先) */
|
|
@@ -175,11 +178,12 @@ export declare interface ChatState {
|
|
|
175
178
|
openPanel: (action: PanelAction) => void;
|
|
176
179
|
/** 关闭当前浮层 */
|
|
177
180
|
closePanel: () => void;
|
|
178
|
-
|
|
181
|
+
/** 消息反馈:传消息对象(内置 ActionBar)或其 messageId / 本地 id 字符串均可 */
|
|
182
|
+
feedback: (message: UIMessage | string, feedback: 'like' | 'dislike', options?: {
|
|
179
183
|
reason?: number;
|
|
180
184
|
remark?: string;
|
|
181
185
|
}) => void;
|
|
182
|
-
cancelFeedback: (
|
|
186
|
+
cancelFeedback: (message: UIMessage | string) => void;
|
|
183
187
|
respondToInterrupt: (interruptId: string, response: InterruptResponse) => void;
|
|
184
188
|
}
|
|
185
189
|
|
|
@@ -210,6 +214,24 @@ declare interface CollapseDisplayOptions {
|
|
|
210
214
|
* 底部输入区(样式对齐 hr-for-help inputArea):
|
|
211
215
|
* 渐变描边输入框(聚焦/有内容时渐变点亮)+ 附件按钮 + 发送/停止按钮 + 底部 AI 提示文案。
|
|
212
216
|
*
|
|
217
|
+
* 输入引擎为 Ant Design X 的 `Sender`,**视觉仍由本 SDK 的 `.sa-*` 样式定义**
|
|
218
|
+
* (Sender 自带的描边/圆角/阴影/内边距已在 tailwind.css 中中和),保证改造前后一致。
|
|
219
|
+
*
|
|
220
|
+
* 技能 chip 走 Sender 自带的 skill 机制(`skill` 属性),不自行渲染:
|
|
221
|
+
* 组件会把 chip 作为内联节点插进可编辑区,与用户文本同一行、同一条文本流。
|
|
222
|
+
* 代价是**输入区变为非受控**——`skill.value` 一旦有值,`Sender` 即切到 slot 模式
|
|
223
|
+
* (内部是 contenteditable),此时 `value`/`defaultValue` 失效:
|
|
224
|
+
* - 文本经 `onChange(value, …, skill)` 回读,本地只做镜像,不再回灌 `value`;
|
|
225
|
+
* - 清空一律用 `ref.clear()`;
|
|
226
|
+
* - 移除 chip(✕ 或光标处退格)由组件自己处理,`onChange` 会带 `skill=undefined` 回来。
|
|
227
|
+
* 注意 `onChange` 的 `value` **不含技能文本**,`skill.value` 即技能 code——
|
|
228
|
+
* 两者正是发送时组装 `/<code> <文本>` 所需的两个输入。
|
|
229
|
+
*
|
|
230
|
+
* 与 Sender 的三处接驳(均有实测依据,见 openspec design.md 与本文件注释):
|
|
231
|
+
* - 底部操作行 → `suffix`(整体替换组件内置动作按钮,沿用现有 DOM 与 class)
|
|
232
|
+
* - 快捷键 → `onKeyDown` 返回 false 跳过组件内置处理:Enter 保留原生换行,
|
|
233
|
+
* ⌘/Ctrl+Enter 由本组件自行发送(`submitType` 的两种取值都不匹配现状约定)
|
|
234
|
+
*
|
|
213
235
|
* 附件(两种启用方式,attachmentUploader 优先):
|
|
214
236
|
* 1. mount({ attachmentUploader }):完全自定义上传函数;
|
|
215
237
|
* 2. mount({ nosUpload: { baseURL } }):SDK 内置 NOS 直传(协议对齐 @netease-ehr/ui,
|
|
@@ -236,7 +258,7 @@ export declare const defaultTheme: Required<ThemeConfig>;
|
|
|
236
258
|
/**
|
|
237
259
|
* SVG symbol 雪碧图加载。
|
|
238
260
|
*
|
|
239
|
-
* `Icon` 用 `<use href="#icon-xxx">` 引用 symbol,symbol 由阿里 iconfont 的 symbol js
|
|
261
|
+
* `Icon` 用 `<use href="#icon-agent-xxx">` 引用 symbol,symbol 由阿里 iconfont 的 symbol js
|
|
240
262
|
* 注入到 `<body>` 下的雪碧图。此前要求宿主页自行 `<script src>`,漏引图标即全空;
|
|
241
263
|
* 现由 SDK 自己动态建 script 加载,宿主页零配置。
|
|
242
264
|
*/
|
|
@@ -313,7 +335,7 @@ export declare interface HeaderProps {
|
|
|
313
335
|
panelTitle?: string;
|
|
314
336
|
}
|
|
315
337
|
|
|
316
|
-
export declare function Icon({ name, size, color, className, style }: IconProps): JSX_2.Element;
|
|
338
|
+
export declare function Icon({ name, size, color, className, style, }: IconProps): JSX_2.Element;
|
|
317
339
|
|
|
318
340
|
declare interface IconProps {
|
|
319
341
|
name: string;
|
|
@@ -404,6 +426,14 @@ declare interface ListConversationsResult {
|
|
|
404
426
|
|
|
405
427
|
export declare function Message({ message, isStreaming, isLast, slots, avatar, artifactPreview, showTimestamp, collapse, }: InternalMessageProps): JSX_2.Element;
|
|
406
428
|
|
|
429
|
+
/** 消息反馈(赞/踩)。type 为 like/dislike;reason/remark 仅 dislike 有值。
|
|
430
|
+
* 历史加载时由消息列表的 feedback 字段还原,供赞/踩按钮回显已选态。 */
|
|
431
|
+
declare interface MessageFeedback {
|
|
432
|
+
type: "like" | "dislike";
|
|
433
|
+
reason?: number | null;
|
|
434
|
+
remark?: string | null;
|
|
435
|
+
}
|
|
436
|
+
|
|
407
437
|
declare type MessagePart = {
|
|
408
438
|
type: "text";
|
|
409
439
|
content: string;
|
|
@@ -425,6 +455,7 @@ declare type MessagePart = {
|
|
|
425
455
|
renderMode?: string;
|
|
426
456
|
html?: string;
|
|
427
457
|
markdown?: string;
|
|
458
|
+
defaultExpanded?: boolean;
|
|
428
459
|
} | {
|
|
429
460
|
type: "error";
|
|
430
461
|
content: string;
|
|
@@ -609,12 +640,14 @@ declare interface SuperAgentSDK {
|
|
|
609
640
|
/** 响应中断事件(返回 SSE 流,后端继续推送后续事件);signal 供调用方中断续流 */
|
|
610
641
|
respondInterrupt(interruptId: string, sessionId: string, response: InterruptResponse, onMessage?: (event: ChatEvent) => void, onError?: (error: Error) => void, signal?: AbortSignal): Promise<void>;
|
|
611
642
|
setToken(token: string): void;
|
|
612
|
-
/** 消息反馈(赞/踩),POST /chat/messages/{messageId}/feedback
|
|
643
|
+
/** 消息反馈(赞/踩),POST /chat/messages/{messageId}/feedback。
|
|
644
|
+
* messageId = 消息列表的 UIMessage.messageId(后端 conversation_messages.message_id,
|
|
645
|
+
* langchain uuid),不是渲染 key id;流式消息取自 done/stop 事件的 messageId。 */
|
|
613
646
|
feedback(messageId: string, type: "like" | "dislike", options?: {
|
|
614
647
|
reason?: number;
|
|
615
648
|
remark?: string;
|
|
616
649
|
}): Promise<void>;
|
|
617
|
-
/** 取消消息反馈,DELETE /chat/messages/{messageId}/feedback */
|
|
650
|
+
/** 取消消息反馈,DELETE /chat/messages/{messageId}/feedback(messageId 同上) */
|
|
618
651
|
cancelFeedback(messageId: string): Promise<void>;
|
|
619
652
|
/** 获取当前 bot 绑定的 skill 列表,GET /chat/bots/{botCode}/skills(含归属与可选性) */
|
|
620
653
|
listSkills(): Promise<SkillInfo[]>;
|
|
@@ -704,7 +737,7 @@ export declare interface ToolCallPartProps {
|
|
|
704
737
|
expandWhileStreaming?: boolean;
|
|
705
738
|
}
|
|
706
739
|
|
|
707
|
-
export declare function ToolResultPart({ toolName, content, renderMode, html }: ToolResultPartProps): default_2.JSX.Element;
|
|
740
|
+
export declare function ToolResultPart({ toolName, content, renderMode, html, defaultExpanded }: ToolResultPartProps): default_2.JSX.Element;
|
|
708
741
|
|
|
709
742
|
export declare interface ToolResultPartProps {
|
|
710
743
|
toolName: string;
|
|
@@ -713,6 +746,8 @@ export declare interface ToolResultPartProps {
|
|
|
713
746
|
artifacts?: Artifact[];
|
|
714
747
|
renderMode?: string;
|
|
715
748
|
html?: string;
|
|
749
|
+
/** 后端 config.default_expanded=true 或 render_mode=html:结果块默认展开(缺省收起) */
|
|
750
|
+
defaultExpanded?: boolean;
|
|
716
751
|
artifactPreview?: boolean;
|
|
717
752
|
}
|
|
718
753
|
|
|
@@ -737,8 +772,18 @@ declare interface UIMessage {
|
|
|
737
772
|
role: "user" | "assistant";
|
|
738
773
|
parts: MessagePart[];
|
|
739
774
|
timestamp: number;
|
|
775
|
+
/** 后端消息标识(conversation_messages.message_id,langchain 原始 message id uuid):
|
|
776
|
+
* feedback / cancelFeedback 按它定位消息(不是表主键 id)。来源二选一:
|
|
777
|
+
* 历史加载取消息列表的 messageId;流式消息取 done/stop 帧的 messageId。 */
|
|
778
|
+
messageId?: string;
|
|
779
|
+
/** 该消息已有的反馈(历史加载还原,无则 null/undefined):赞/踩按钮据此显示已选态。
|
|
780
|
+
* 流式消息不携带(新回复尚无反馈)。 */
|
|
781
|
+
feedback?: MessageFeedback | null;
|
|
740
782
|
roundId?: string;
|
|
741
783
|
artifacts?: Artifact[];
|
|
784
|
+
/** 用户消息原文(含技能 "/code" 前缀;parts 文本展示 "/技能名" 版本时两者不同)。
|
|
785
|
+
* regenerate 原样重发用;历史加载从后端 metadata.raw_message 还原。 */
|
|
786
|
+
rawContent?: string;
|
|
742
787
|
}
|
|
743
788
|
|
|
744
789
|
export declare function useAutoScroll(deps: any[]): {
|
|
@@ -765,7 +810,7 @@ declare interface UseChatReturn {
|
|
|
765
810
|
messages: UIMessage[];
|
|
766
811
|
status: ChatStatus;
|
|
767
812
|
error: Error | null;
|
|
768
|
-
sendMessage: (content: string, attachments?: ChatAttachment[]) => void;
|
|
813
|
+
sendMessage: (content: string, attachments?: ChatAttachment[], displayContent?: string) => void;
|
|
769
814
|
stop: () => void;
|
|
770
815
|
regenerate: () => void;
|
|
771
816
|
setMessages: (messages: UIMessage[]) => void;
|
|
@@ -828,6 +873,6 @@ export declare interface WidgetInstance {
|
|
|
828
873
|
|
|
829
874
|
export declare type WidgetMode = 'floating' | 'fullpage';
|
|
830
875
|
|
|
831
|
-
export declare const widgetStyles = "\n [data-super-agent-widget] {\n --sa-primary-dark: color-mix(in srgb, var(--sa-primary) 82%, #000);\n --sa-primary-light: color-mix(in srgb, var(--sa-primary) 10%, #fff);\n --sa-text: #1f2937;\n --sa-text-muted: #6b7280;\n --sa-text-light: #9ca3af;\n --sa-border: #e5e7eb;\n --sa-surface: #f9fafb;\n --sa-hover: #f3f4f6;\n\n font-family: var(--sa-font);\n color: var(--sa-text);\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n }\n\n [data-super-agent-widget] *,\n [data-super-agent-widget] *::before,\n [data-super-agent-widget] *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n /* \u5BBF\u4E3B\u53EF\u80FD\u672A\u542F\u7528 Tailwind preflight\uFF08\u6D4F\u89C8\u5668 UA \u9ED8\u8BA4\u7ED9 button \u52A0\u7070\u8FB9\u6846/\u5E95\u8272\uFF09\uFF0C\n \u6B64\u5904\u91CD\u7F6E\u3002:where() \u4F7F\u7279\u5F02\u6027\u5F52\u96F6\uFF0C\u4E0D\u4F1A\u538B\u8FC7\u4E0B\u65B9 .sa-* \u53CA\u5BBF\u4E3B\u6837\u5F0F */\n :where([data-super-agent-widget]) button {\n border: 0 solid;\n background: none;\n font-family: inherit;\n cursor: pointer;\n }\n\n /* \u2500\u2500 Trigger / Panel / Header\uFF08\u6D6E\u7A97\u6846\u67B6\u5DF2\u6539\u7528 Tailwind \u5B9E\u73B0\uFF0C\u89C1 tailwind.css\uFF09 \u2500\u2500 */\n\n /* \u2500\u2500 Thread / messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-thread {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 16px;\n overflow-y: auto;\n padding: 16px;\n background: var(--sa-surface);\n scroll-behavior: smooth;\n }\n\n .sa-thread::-webkit-scrollbar {\n width: 6px;\n }\n\n .sa-thread::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.14);\n border-radius: 3px;\n }\n\n .sa-thread::-webkit-scrollbar-thumb:hover {\n background: rgba(0, 0, 0, 0.24);\n }\n\n /* \u2500\u2500 Message\uFF1A\u6D6E\u7A97\u9ED8\u8BA4 hr-for-help \u98CE\u683C\uFF08AI \u5934\u50CF\u72EC\u5360\u4E00\u884C\uFF09\uFF1B\n fullpage \u6A21\u5F0F\u5728 .sa-fp-content-row \u4E0B\u6062\u590D\u539F\u6A2A\u6392\u5E03\u5C40\uFF0C\u4E92\u4E0D\u5F71\u54CD \u2500\u2500 */\n\n .sa-message {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n width: 100%;\n }\n\n .sa-message-user {\n justify-content: flex-end;\n }\n\n /* AI \u6D88\u606F\uFF1A\u5217\u5E03\u5C40\uFF0C\u5934\u50CF\u72EC\u5360\u4E00\u884C\uFF08\u4EC5\u6D6E\u7A97\uFF0C\u5BF9\u9F50 hr-for-help msgAi\uFF09 */\n .sa-message-assistant {\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n }\n\n .sa-message-content {\n max-width: 78%;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .sa-message-user .sa-message-content {\n max-width: 90%;\n }\n\n .sa-message-assistant .sa-message-content {\n max-width: 100%;\n min-width: 0;\n width: 100%;\n }\n\n .sa-message-body {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n /* \u6D6E\u7A97\u6C14\u6CE1\uFF1A\u7528\u6237\u6D45\u84DD\u3001AI \u767D\u5E95\u63CF\u8FB9\uFF08\u5BF9\u9F50 hr-for-help\uFF09 */\n .sa-message-user .sa-message-body {\n padding: 8px 12px;\n border-radius: 8px 8px 0 8px;\n background: #E8F1FE;\n color: #333333;\n font-size: 14px;\n line-height: 1.6;\n word-break: break-word;\n }\n\n .sa-message-assistant .sa-message-body {\n padding: 10px 12px;\n border-radius: 8px;\n background: #ffffff;\n border: 1px solid #E0E0E0;\n color: var(--sa-text);\n font-size: 14px;\n line-height: 1.5;\n word-break: break-word;\n }\n\n .sa-message-time {\n font-size: 11px;\n color: var(--sa-text-muted);\n opacity: 0.7;\n }\n\n .sa-message-time-right {\n text-align: right;\n }\n\n /* \u6D88\u606F\u5934\u50CF\uFF1A\u88F8\u5C55\u793A\uFF0C\u65E0\u80CC\u666F\u8272\uFF08\u5BF9\u9F50 hr-for-help msgAvatar\uFF09 */\n .sa-msg-avatar {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n object-fit: cover;\n flex-shrink: 0;\n display: block;\n }\n\n .sa-msg-avatar-text {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n font-weight: 400;\n }\n\n /* \u2500\u2500 fullpage \u8986\u76D6\uFF1A\u6062\u590D\u6A2A\u6392\u5934\u50CF + \u7ECF\u5178\u6C14\u6CE1\uFF08\u4E0D\u53D7\u6D6E\u7A97 hr-for-help \u6539\u7248\u5F71\u54CD\uFF09 \u2500\u2500 */\n\n .sa-fp-content-row .sa-message-assistant {\n flex-direction: row;\n gap: 10px;\n }\n\n .sa-fp-content-row .sa-message-assistant .sa-message-content {\n max-width: 88%;\n width: auto;\n }\n\n .sa-fp-content-row .sa-message-user .sa-message-content {\n max-width: 78%;\n }\n\n // .sa-fp-content-row .sa-message-user .sa-message-body {\n // padding: 10px 14px;\n // border-radius: 16px;\n // border-bottom-right-radius: 4px;\n // background: var(--sa-primary);\n // color: #ffffff;\n // font-size: 14px;\n // line-height: 1.55;\n // word-break: break-word;\n // }\n\n .sa-fp-content-row .sa-message-assistant .sa-message-body {\n padding: 10px 14px;\n border-radius: 16px;\n background: #ffffff;\n color: var(--sa-text);\n font-size: 14px;\n line-height: 1.55;\n word-break: break-word;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);\n }\n\n .sa-fp-content-row .sa-msg-avatar {\n width: 24px;\n height: 24px;\n }\n\n .sa-fp-content-row .sa-msg-avatar-text {\n background: linear-gradient(135deg, var(--sa-primary), var(--sa-primary-dark));\n color: #ffffff;\n font-size: 12px;\n font-weight: 600;\n }\n\n /* AI \u6D88\u606F Markdown \u6392\u7248\uFF08Claude \u98CE\u683C\uFF0C\u8272\u503C\u5BF9\u9F50 tokens.ts\uFF09 */\n\n .sa-text-part {\n font-size: 14px;\n line-height: 1.65;\n color: var(--sa-text);\n word-break: break-word;\n }\n\n .sa-text-part p {\n margin: 0 0 10px;\n }\n\n .sa-text-part > *:first-child {\n margin-top: 0;\n }\n\n .sa-text-part > *:last-child {\n margin-bottom: 0;\n }\n\n .sa-text-part strong {\n color: #141413; /* ink */\n font-weight: 600;\n }\n\n .sa-text-part em {\n font-style: italic;\n }\n\n .sa-text-part del {\n color: #b0aea5; /* mist */\n }\n\n .sa-text-part h1,\n .sa-text-part h2,\n .sa-text-part h3,\n .sa-text-part h4,\n .sa-text-part h5,\n .sa-text-part h6 {\n margin: 20px 0 8px;\n color: #141413; /* ink */\n font-weight: 600;\n line-height: 1.35;\n }\n\n .sa-text-part h1 {\n font-size: 1.4em;\n }\n\n .sa-text-part h2 {\n font-size: 1.25em;\n }\n\n .sa-text-part h3 {\n font-size: 1.1em;\n }\n\n .sa-text-part h4,\n .sa-text-part h5,\n .sa-text-part h6 {\n font-size: 1em;\n }\n\n .sa-text-part a {\n color: #d97757; /* clay */\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: 2px;\n }\n\n .sa-text-part a:hover {\n color: color-mix(in srgb, #d97757 82%, #000); /* clay \u6DF1\u4E00\u6B65 */\n }\n\n /* \u884C\u5185\u4EE3\u7801\uFF1Aparchment \u586B\u5145\u5E95\uFF0Cink \u6587\u5B57 */\n .sa-text-part code {\n padding: 2px 5px;\n border-radius: 4px;\n background: #e8e6dc; /* parchment */\n color: #141413; /* ink */\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 0.875em;\n }\n\n /* \u4EE3\u7801\u5757\uFF1Acard \u5E95 + hairline \u8FB9\u6846\uFF08\u6D45\u8272\u6696\u8C03\uFF0CClaude \u98CE\uFF09\uFF1B\u5185\u90E8 code \u590D\u4F4D\u884C\u5185\u6837\u5F0F */\n .sa-text-part pre {\n margin: 10px 0;\n padding: 12px 14px;\n border: 1px solid #e3e1d8; /* border */\n border-radius: 8px;\n background: #efede6; /* card */\n color: #141413; /* ink */\n overflow-x: auto;\n font-size: 13px;\n line-height: 1.6;\n }\n\n .sa-text-part pre code {\n padding: 0;\n background: none;\n color: inherit;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 1em;\n white-space: pre;\n }\n\n /* \u5217\u8868\uFF1Amarker \u67D4\u548C\u7070 */\n .sa-text-part ul,\n .sa-text-part ol {\n margin: 8px 0;\n padding-left: 22px;\n }\n\n .sa-text-part ul {\n list-style: disc;\n }\n\n .sa-text-part ol {\n list-style: decimal;\n }\n\n .sa-text-part li {\n margin: 4px 0;\n line-height: 1.6;\n }\n\n .sa-text-part li::marker {\n color: #666560; /* inkMuted */\n }\n\n .sa-text-part li > input[type='checkbox'] {\n margin-right: 6px;\n accent-color: #d97757; /* clay */\n }\n\n .sa-text-part ul:has(> li > input[type='checkbox']) {\n list-style: none;\n padding-left: 4px;\n }\n\n /* GFM \u8868\u683C\uFF1Ath parchment \u5E95 + hairline \u8FB9\u6846 */\n .sa-text-part table {\n margin: 10px 0;\n border-collapse: collapse;\n font-size: 0.95em;\n }\n\n .sa-text-part th,\n .sa-text-part td {\n padding: 6px 12px;\n border: 1px solid #e3e1d8; /* border */\n text-align: left;\n }\n\n .sa-text-part th {\n background: #e8e6dc; /* parchment */\n color: #141413; /* ink */\n font-weight: 600;\n }\n\n /* \u5F15\u7528\u5757\uFF1Aclay \u5DE6\u70B9\u7F00 + inkMuted \u6B63\u6587 */\n .sa-text-part blockquote {\n margin: 10px 0;\n padding: 2px 14px;\n border-left: 3px solid #d97757; /* clay */\n color: #666560; /* inkMuted */\n }\n\n .sa-text-part hr {\n margin: 16px 0;\n border: none;\n border-top: 1px solid #e3e1d8; /* border */\n }\n\n /* \u2500\u2500 Thinking part \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-thinking-part {\n margin: 6px 0;\n padding: 8px 12px;\n border-left: 3px solid var(--sa-primary);\n border-radius: 8px;\n background: var(--sa-primary-light);\n cursor: pointer;\n font-size: 13px;\n }\n\n .sa-thinking-header {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--sa-primary-dark);\n font-weight: 500;\n user-select: none;\n }\n\n .sa-thinking-icon {\n font-size: 14px;\n line-height: 1;\n }\n\n .sa-thinking-label {\n flex: 1;\n }\n\n /* DeepSeek \u5F0F\u6536\u8D77\u6761\u8017\u65F6\u540E\u7F00\uFF08\u5DF2\u6DF1\u5EA6\u601D\u8003 \u00B7 \u7528\u65F6 3.2s\uFF09 */\n .sa-thinking-duration {\n color: #9ca3af;\n font-weight: 400;\n }\n\n .sa-thinking-arrow {\n font-size: 12px;\n transition: transform 0.2s ease;\n }\n\n .sa-thinking-arrow.expanded {\n transform: rotate(90deg);\n }\n\n .sa-thinking-content {\n margin-top: 8px;\n color: #4b5563;\n white-space: pre-wrap;\n line-height: 1.55;\n }\n\n /* \u2500\u2500 Tool call / result \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-tool-call-part {\n margin: 6px 0;\n border: 1px solid var(--sa-border);\n border-radius: 10px;\n overflow: hidden;\n background: #ffffff;\n }\n\n .sa-tool-call-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n font-size: 13px;\n user-select: none;\n }\n\n .sa-tool-call-header:hover {\n background: var(--sa-surface);\n }\n\n .sa-tool-icon {\n font-size: 14px;\n line-height: 1;\n }\n\n .sa-tool-name {\n flex: 1;\n color: #374151;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .sa-tool-args {\n margin: 0;\n padding: 10px 12px;\n border-top: 1px solid var(--sa-border);\n background: var(--sa-surface);\n color: #374151;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n line-height: 1.5;\n white-space: pre;\n overflow-x: auto;\n }\n\n .sa-tool-result-part {\n margin: 6px 0;\n border: 1px solid var(--sa-border);\n border-radius: 10px;\n overflow: hidden;\n background: #ffffff;\n }\n\n .sa-tool-result-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--sa-border);\n background: var(--sa-surface);\n color: #374151;\n font-size: 13px;\n font-weight: 500;\n }\n\n .sa-tool-result-content {\n max-height: 256px;\n overflow: auto;\n margin: 8px 0 0;\n padding: 10px 12px;\n color: #4b5563;\n font-size: 13px;\n line-height: 1.55;\n white-space: pre-wrap;\n word-break: break-word;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: #f9fafb;\n border-radius: 8px;\n }\n\n .sa-tool-result-actions {\n display: flex;\n gap: 8px;\n margin: 4px 0;\n }\n\n /* \u2500\u2500 Error part \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-error-part {\n margin: 6px 0;\n padding: 10px 12px;\n border: 1px solid #fecaca;\n border-radius: 10px;\n background: #fef2f2;\n color: #b91c1c;\n }\n\n .sa-error-content {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n font-size: 13px;\n line-height: 1.5;\n }\n\n .sa-error-icon {\n font-size: 14px;\n line-height: 1.4;\n }\n\n .sa-error-retry {\n margin-top: 8px;\n padding: 6px 14px;\n border: none;\n border-radius: 8px;\n background: #ef4444;\n color: #ffffff;\n font-size: 13px;\n cursor: pointer;\n transition: background 0.2s ease;\n }\n\n .sa-error-retry:hover {\n background: #dc2626;\n }\n\n /* \u2500\u2500 Action bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-action-bar {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n position: relative;\n }\n\n .sa-action-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n flex: none;\n white-space: nowrap;\n line-height: 1;\n padding: 4px 10px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--sa-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: color 0.15s ease, background 0.15s ease;\n }\n\n .sa-action-btn svg {\n display: block;\n flex: none;\n }\n\n .sa-action-btn:hover {\n color: var(--sa-text);\n background: rgba(0, 0, 0, 0.05);\n }\n\n .sa-action-btn-active {\n color: var(--sa-primary) !important;\n background: var(--sa-primary-light) !important;\n }\n\n .sa-action-divider {\n width: 1px;\n height: 16px;\n background: var(--sa-border);\n margin: 0 2px;\n align-self: center;\n }\n\n /* \u2500\u2500 Dislike Panel \u2500\u2500 */\n .sa-dislike-panel {\n position: absolute; top: 100%; left: 0; right: 0;\n margin-top: 6px; padding: 12px;\n background: #fff; border: 1px solid var(--sa-border); border-radius: 10px;\n box-shadow: 0 4px 16px rgba(0,0,0,0.08);\n animation: sa-fade-in-up 0.2s cubic-bezier(0.16,1,0.3,1) both;\n z-index: 10;\n }\n .sa-dislike-panel-title { font-size: 13px; font-weight: 500; color: var(--sa-text); margin-bottom: 8px; }\n .sa-dislike-reasons { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px; }\n .sa-dislike-reason-btn {\n padding: 4px 10px; border: 1px solid var(--sa-border); border-radius: 6px;\n background: #fff; color: var(--sa-text); font-size: 12px; cursor: pointer;\n transition: border-color 0.15s, background 0.15s, color 0.15s;\n }\n .sa-dislike-reason-btn:hover { border-color: var(--sa-primary); color: var(--sa-primary); }\n .sa-dislike-reason-btn.active { background: var(--sa-primary); color: #fff; border-color: var(--sa-primary); }\n .sa-dislike-remark {\n width: 100%; padding: 8px 10px; border: 1px solid var(--sa-border); border-radius: 8px;\n font-size: 13px; color: var(--sa-text); resize: none; outline: none;\n transition: border-color 0.15s;\n }\n .sa-dislike-remark:focus { border-color: var(--sa-primary); }\n .sa-dislike-actions { display: flex; gap: 8px; margin-top: 10px; justify-content: flex-end; }\n .sa-dislike-submit {\n padding: 5px 14px; border: none; border-radius: 6px;\n background: var(--sa-primary); color: #fff; font-size: 13px; font-weight: 500; cursor: pointer;\n transition: opacity 0.15s;\n }\n .sa-dislike-submit:hover { opacity: 0.9; }\n .sa-dislike-cancel {\n padding: 5px 14px; border: 1px solid var(--sa-border); border-radius: 6px;\n background: #fff; color: var(--sa-text-muted); font-size: 13px; cursor: pointer;\n transition: background 0.15s;\n }\n .sa-dislike-cancel:hover { background: var(--sa-surface); }\n\n /* \u2500\u2500 Composer\uFF08\u8F93\u5165\u533A\u6539\u7528 Tailwind \u5B9E\u73B0\uFF0C\u89C1 tailwind.css \u7684 .sa-input-form/.sa-send-btn\uFF09 \u2500\u2500 */\n\n /* \u2500\u2500 Slash Menu \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /* \u9762\u677F\u5BBD\u5EA6\u4E0E\u8F93\u5165\u533A\uFF08.sa-input-form\uFF09\u5BF9\u9F50\uFF1A\u8F93\u5165\u533A\u5728 wrapper \u7684 px-[15px] \u5185\uFF0C\n \u6545\u6B64\u5904\u540C\u6837\u53D6 15px \u5DE6\u53F3\u5185\u7F29\u3002\u4E0D\u518D\u8BBE max-width\u2014\u2014\u6B64\u524D 400px \u4E0A\u9650\u4F1A\u8BA9\u9762\u677F\u6BD4\n \u8F93\u5165\u6846\u7A84\u4E00\u622A\u4E14\u5DE6\u5BF9\u9F50\uFF0C\u89C6\u89C9\u4E0A\"\u6CA1\u5BF9\u9F50\"\u3002 */\n .sa-slash-menu {\n position: absolute;\n bottom: 100%;\n left: 15px;\n right: 15px;\n display: flex;\n flex-direction: column;\n max-height: 280px;\n overflow: hidden; /* \u8BA9\u5706\u89D2\u88C1\u6389\u6EDA\u52A8\u5185\u5BB9 */\n background: var(--sa-surface);\n border: 1px solid var(--sa-border);\n border-radius: 8px;\n box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.1);\n margin-bottom: 4px;\n z-index: 10;\n }\n\n /* \u8BA1\u6570\u5934\uFF1A\u56FA\u5B9A\u5728\u9762\u677F\u9876\u90E8\uFF08\u5217\u8868\u4F53\u72EC\u7ACB\u6EDA\u52A8\uFF09\uFF0C\u6545 flex-shrink:0 */\n .sa-slash-menu-header {\n flex-shrink: 0;\n padding: 7px 12px;\n border-bottom: 1px solid var(--sa-border);\n background: var(--sa-surface);\n color: #9ca3af;\n font-size: 12px;\n line-height: 1.4;\n }\n\n /* \u5217\u8868\u4F53\uFF1A\u552F\u4E00\u7684\u6EDA\u52A8\u5BB9\u5668 */\n .sa-slash-menu-body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n .sa-slash-menu-empty {\n padding: 12px 14px;\n color: #9ca3af;\n font-size: 13px;\n text-align: center;\n }\n\n .sa-slash-menu-item {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .sa-slash-menu-item:hover,\n .sa-slash-menu-item--active {\n background: var(--sa-hover);\n }\n\n /* \u6280\u80FD\u56FE\u6807\uFF1A\u4E0E\u8F93\u5165\u533A chip \u540C\u4E00\u679A\uFF0C\u989C\u8272\u5F31\u5316\u8BA9\u540D\u79F0\u6210\u4E3A\u89C6\u89C9\u4E3B\u4F53 */\n .sa-slash-menu-item-icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n color: #9ca3af;\n }\n\n .sa-slash-menu-item-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--sa-text);\n white-space: nowrap;\n }\n\n .sa-slash-menu-item-desc {\n font-size: 12px;\n color: #9ca3af;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n min-width: 0;\n }\n\n /* Team \u4E2D\u5F52\u5C5E\u67D0\u4E2A\u6210\u5458\u7684\u6280\u80FD\uFF1A\u6210\u5458\u540D\u5FBD\u6807\uFF0C\u7528\u4E8E\u533A\u5206\u540C\u540D\u6280\u80FD */\n .sa-slash-menu-item-owner {\n flex-shrink: 0;\n padding: 1px 5px;\n border-radius: 3px;\n background: var(--sa-hover);\n color: var(--sa-text-muted);\n font-size: 11px;\n line-height: 1.4;\n }\n\n /* \u4E0D\u53EF\u70B9\u540D\u7684\u6280\u80FD\uFF08Pipeline \u6A21\u5F0F\u4E0B\u5F52\u5C5E\u6210\u5458\u7684\u6280\u80FD\uFF09\uFF1A\u5217\u51FA\u4F46\u7F6E\u7070\u3002\n hover \u4E0D\u7ED9\u53CD\u9988\uFF0C\u907F\u514D\u8BEF\u4EE5\u4E3A\u53EF\u70B9\u2014\u2014\u89C4\u5219\u89C1 design D5\u3002 */\n .sa-slash-menu-item--disabled {\n cursor: not-allowed;\n opacity: 0.55;\n }\n\n .sa-slash-menu-item--disabled:hover {\n background: transparent;\n }\n\n /* \u2500\u2500 Thread list\uFF08\u5185\u5D4C\u4FA7\u8FB9\u680F\u6539\u7528 Tailwind \u5B9E\u73B0\uFF0C\u89C1 FullpageLayout.tsx / ThreadList.tsx\uFF09 \u2500\u2500 */\n\n /* \u6D88\u606F\u533A\u52A0\u8F7D\u6001 */\n .sa-messages-loading {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n color: #9ca3af;\n font-size: 14px;\n }\n\n .sa-loading-spinner {\n width: 16px;\n height: 16px;\n border: 2px solid var(--sa-border, #e5e7eb);\n border-top-color: var(--sa-primary, #6366f1);\n border-radius: 50%;\n animation: sa-spin 0.8s linear infinite;\n flex-shrink: 0;\n }\n\n @keyframes sa-spin {\n to { transform: rotate(360deg); }\n }\n\n /* \u2500\u2500 Welcome\uFF08\u9996\u9875\u6539\u7528 Tailwind \u5B9E\u73B0\uFF0C\u89C1 tailwind.css\uFF09 \u2500\u2500 */\n\n .sa-thinking-indicator {\n color: #9ca3af;\n font-size: 14px;\n animation: sa-blink 1.2s ease-in-out infinite;\n }\n\n /* \u2500\u2500 Interrupt cards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-interrupt-card {\n margin: 8px 0;\n padding: 14px;\n border: 1px solid #e0e7ff;\n border-radius: 10px;\n background: #f8faff;\n }\n\n .sa-interrupt-content {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n font-size: 13px;\n line-height: 1.6;\n color: var(--sa-text);\n margin-bottom: 12px;\n }\n\n .sa-interrupt-actions {\n display: flex;\n gap: 8px;\n margin-top: 10px;\n }\n\n .sa-interrupt-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: none;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, opacity 0.15s;\n }\n\n .sa-interrupt-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .sa-interrupt-btn-primary {\n background: var(--sa-primary);\n color: #fff;\n }\n\n .sa-interrupt-btn-primary:hover:not(:disabled) {\n opacity: 0.9;\n }\n\n .sa-interrupt-btn-secondary {\n background: #f3f4f6;\n color: #374151;\n }\n\n .sa-interrupt-btn-secondary:hover:not(:disabled) {\n background: #e5e7eb;\n }\n\n .sa-interrupt-btn-danger {\n background: #fef2f2;\n color: #dc2626;\n }\n\n .sa-interrupt-btn-danger:hover:not(:disabled) {\n background: #fee2e2;\n }\n\n .sa-interrupt-options {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .sa-interrupt-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px solid var(--sa-border);\n border-radius: 8px;\n background: #fff;\n color: var(--sa-text);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.12s, background 0.12s;\n }\n\n .sa-interrupt-option:hover {\n border-color: var(--sa-primary);\n background: #f5f3ff;\n }\n\n .sa-interrupt-option-selected {\n border-color: var(--sa-primary);\n background: #ede9fe;\n color: var(--sa-primary);\n font-weight: 500;\n }\n\n .sa-interrupt-option-danger {\n color: #ef4444;\n }\n\n .sa-interrupt-option-danger:hover {\n border-color: #ef4444;\n background: #fef2f2;\n }\n\n .sa-interrupt-option-desc {\n font-size: 11px;\n color: var(--sa-text-muted);\n margin-left: auto;\n }\n\n .sa-interrupt-input-area {\n margin-top: 4px;\n }\n\n .sa-interrupt-input,\n .sa-interrupt-textarea,\n .sa-interrupt-select {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--sa-border);\n border-radius: 8px;\n background: #fff;\n color: var(--sa-text);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n transition: border-color 0.15s;\n }\n\n .sa-interrupt-input:focus,\n .sa-interrupt-textarea:focus,\n .sa-interrupt-select:focus {\n border-color: var(--sa-primary);\n }\n\n .sa-interrupt-textarea {\n resize: vertical;\n min-height: 60px;\n }\n\n .sa-interrupt-form {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: 4px;\n }\n\n .sa-interrupt-form-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .sa-interrupt-form-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--sa-text);\n }\n\n .sa-interrupt-form-required {\n color: #ef4444;\n margin-left: 2px;\n }\n\n .sa-interrupt-submitted {\n margin-top: 8px;\n font-size: 12px;\n color: #9ca3af;\n }\n\n /* \u5DF2\u63D0\u4EA4\u5361\u7247\u7684\u7B54\u6848\u515C\u5E95\u56DE\u663E\uFF08\u81EA\u7531\u6587\u672C\u4F5C\u7B54\u4E0D\u5339\u914D\u9009\u9879/\u6309\u94AE\u65F6\uFF09 */\n .sa-interrupt-answer {\n margin-top: 8px;\n display: flex;\n align-items: flex-start;\n gap: 4px;\n font-size: 12px;\n line-height: 1.5;\n color: #4b5563;\n background: #f3f4f6;\n border-radius: 4px;\n padding: 6px 8px;\n word-break: break-all;\n }\n\n .sa-interrupt-answer svg {\n flex-shrink: 0;\n margin-top: 1px;\n }\n\n .sa-interrupt-btn-answered {\n background: var(--sa-primary) !important;\n color: #fff !important;\n opacity: 0.7;\n }\n\n .sa-interrupt-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .sa-interrupt-option:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .sa-interrupt-input:disabled,\n .sa-interrupt-textarea:disabled,\n .sa-interrupt-select:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n background: #f9fafb;\n }\n\n .sa-interrupt-unknown {\n padding: 8px 12px;\n border-radius: 8px;\n background: #fef3c7;\n color: #92400e;\n font-size: 13px;\n margin: 6px 0;\n }\n\n /* \u2500\u2500 Animations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n @keyframes sa-blink {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n }\n }\n\n /* \u2500\u2500 Fullpage Layout (DeepSeek-style) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-fullpage {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n background: var(--sa-bg, #ffffff);\n }\n\n /* Sidebar\uFF08fullpage \u9ED8\u8BA4\u4FA7\u8FB9\u680F\u6539\u7528 Tailwind \u5B9E\u73B0\uFF0C\u5BF9\u9F50\u6D6E\u7A97\u5386\u53F2\u5BF9\u8BDD\u6837\u5F0F\uFF0C\u89C1 FullpageLayout.tsx\uFF09 */\n\n /* Sidebar wrapper (for custom ThreadList slot)\uFF1A\u5BBD\u5EA6\u4E0E\u9ED8\u8BA4\u4FA7\u8FB9\u680F 220px \u5BF9\u9F50 */\n .sa-fp-sidebar-wrapper {\n width: 220px;\n flex-shrink: 0;\n overflow: hidden;\n border-right: 1px solid #ECECEC;\n background: #FAFAFA;\n transition: width 0.2s cubic-bezier(0.16,1,0.3,1);\n }\n\n .sa-fp-sidebar-wrapper-collapsed {\n width: 0;\n border-right: none;\n }\n\n /* Main area */\n .sa-fp-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n background: #fff;\n }\n\n .sa-fp-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 16px;\n border-bottom: 1px solid #f0f0f0;\n background: #fff;\n flex-shrink: 0;\n min-height: 52px;\n }\n\n .sa-fp-header-title {\n flex: 1;\n font-size: 15px;\n font-weight: 500;\n color: #18181b;\n letter-spacing: -0.2px;\n }\n\n .sa-fp-header-actions {\n display: flex;\n gap: 4px;\n }\n\n .sa-fp-header-btn {\n min-width: 34px;\n height: 34px;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: #71717a;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.12s, color 0.12s;\n }\n\n .sa-fp-header-btn:hover {\n background: #f4f4f5;\n color: #18181b;\n }\n\n /* Fullpage thread/composer override */\n .sa-fp-main .sa-thread {\n margin: 0 auto;\n width: 100%;\n padding: 24px 24px;\n }\n\n /* \u2500\u2500 Artifact file cards (in ToolResultPart) \u2500\u2500 */\n .sa-artifact-file-list { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }\n .sa-artifact-file-card {\n display: flex; align-items: center; gap: 10px; padding: 8px 10px;\n border: 1px solid var(--sa-border); border-radius: 10px; background: var(--sa-surface);\n font-size: 13px; color: var(--sa-text);\n transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease, transform 0.15s ease;\n animation: sa-fade-in-up 0.3s cubic-bezier(0.16, 1, 0.3, 1) both;\n }\n .sa-artifact-file-card:hover { border-color: var(--sa-primary); background: #fff; box-shadow: 0 2px 8px rgba(99,102,241,0.1); transform: translateY(-1px); }\n .sa-artifact-file-card:active { transform: translateY(0) scale(0.99); }\n .sa-artifact-file-icon { flex-shrink: 0; }\n .sa-artifact-chip-type {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 36px; padding: 2px 6px; border-radius: 5px;\n background: var(--sa-primary); color: #fff;\n font-size: 10px; font-weight: 700; letter-spacing: 0.3px; line-height: 1.4;\n }\n .sa-artifact-file-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }\n .sa-artifact-file-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; }\n .sa-artifact-file-size { color: var(--sa-text-muted); font-size: 12px; }\n .sa-artifact-file-download {\n border: none; background: none; cursor: pointer; color: var(--sa-text-muted);\n padding: 6px; border-radius: 6px; display: inline-flex;\n transition: color 0.15s ease, background 0.15s ease, transform 0.1s ease;\n }\n .sa-artifact-file-download:hover { color: var(--sa-primary); background: rgba(99,102,241,0.08); }\n .sa-artifact-file-download:active { transform: scale(0.9); }\n\n /* \u2500\u2500 Inline HTML rendering (render_mode=html) \u2500\u2500 */\n /* HTML \u5DE5\u5177\u7ED3\u679C\uFF1A\u5916\u5C42\u6EDA\u52A8\u5BB9\u5668 + \u5185\u5C42\u5185\u5BB9\u5C42\uFF08\u4E0E Playground \u4E00\u81F4\uFF0C\u65E0 iframe\uFF09 */\n .sa-tool-result-html-scroll { margin-top: 8px; max-height: 60vh; overflow: auto; border: 1px solid var(--sa-border); border-radius: 8px; }\n .sa-tool-result-html { padding: 12px; background: #fff; min-width: 100%; }\n\n /* \u2500\u2500 Header artifact button \u2500\u2500 */\n /* \u8F7B\u91CF\u67D4\u548C\uFF1A\u6D45 primary tint \u5E95 + primary \u6587\u5B57/\u56FE\u6807\uFF0C\u65E0\u5B9E\u5FC3\u5757\u4E0E\u6295\u5F71 */\n .sa-header-btn-artifact {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 5px 11px; border-radius: 8px;\n background: rgba(99,102,241,0.08); color: var(--sa-primary);\n font-size: 12px; font-weight: 500;\n transition: background 0.15s ease, color 0.15s ease, transform 0.1s ease;\n }\n .sa-header-btn-artifact:hover { background: rgba(99,102,241,0.14); color: var(--sa-primary); }\n .sa-header-btn-artifact:active { transform: scale(0.97); }\n .sa-header-btn-artifact svg { stroke: var(--sa-primary); }\n .sa-header-btn-artifact.sa-artifact-pulse { animation: sa-artifact-pulse 2s ease-in-out 3; }\n\n /* \u2500\u2500 Artifact drawer (right side panel) \u2500\u2500 */\n .sa-artifact-drawer {\n display: flex; flex-direction: column; min-width: 240px; max-width: 70%;\n border-left: 1px solid var(--sa-border); background: #fff; flex-shrink: 0; overflow: hidden;\n animation: sa-slide-in-right 0.3s cubic-bezier(0.16, 1, 0.3, 1) both;\n position: relative;\n }\n .sa-artifact-drawer.sa-drawer-closing {\n animation: sa-slide-out-right 0.25s cubic-bezier(0.4, 0, 1, 1) both;\n }\n .sa-drawer-resize-handle {\n position: absolute; left: -3px; top: 0; bottom: 0; width: 6px;\n cursor: col-resize; z-index: 2;\n transition: background 0.15s ease;\n }\n .sa-drawer-resize-handle:hover, .sa-drawer-resize-handle:active {\n background: var(--sa-primary); opacity: 0.3; border-radius: 3px;\n }\n .sa-artifact-drawer-header {\n display: flex; align-items: center; gap: 8px; padding: 12px 14px;\n border-bottom: 1px solid var(--sa-border); font-weight: 600; font-size: 15px; color: var(--sa-text);\n background: var(--sa-surface);\n }\n .sa-artifact-drawer-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .sa-drawer-btn {\n border: none; background: none; cursor: pointer; color: var(--sa-text-muted);\n padding: 6px; border-radius: 6px; display: inline-flex; align-items: center;\n transition: background 0.15s ease, color 0.15s ease, transform 0.1s ease;\n }\n .sa-drawer-btn:hover { background: var(--sa-border); color: var(--sa-text); }\n .sa-drawer-btn:active { transform: scale(0.92); }\n .sa-drawer-btn-sm {\n border: 1px solid var(--sa-border); background: #fff; cursor: pointer; color: var(--sa-primary);\n padding: 6px 14px; border-radius: 8px; font-size: 13px; font-weight: 500;\n transition: background 0.15s ease, border-color 0.15s ease;\n }\n .sa-drawer-btn-sm:hover { background: var(--sa-surface); border-color: var(--sa-primary); }\n /* flex \u5217\u5BB9\u5668\uFF1A\u8BA9 .sa-drawer-view-enter\uFF08flex:1\uFF09\u4E0E\u5185\u5C42\u6EDA\u52A8/iframe \u6709\u771F\u5B9E\u9AD8\u5EA6\u94FE */\n .sa-artifact-drawer-body { display: flex; flex-direction: column; flex: 1; min-height: 0; overflow-y: auto; overflow-x: hidden; scroll-behavior: smooth; }\n .sa-drawer-empty { padding: 48px 24px; text-align: center; color: var(--sa-text-muted); font-size: 14px; }\n .sa-drawer-file-list { list-style: none; margin: 0; padding: 10px; display: flex; flex-direction: column; gap: 8px; }\n .sa-drawer-file-card {\n display: flex; align-items: center; gap: 10px; padding: 12px 14px;\n border: 1px solid var(--sa-border); border-radius: 10px; cursor: pointer; background: #fff;\n transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease, transform 0.15s ease;\n animation: sa-fade-in-up 0.3s cubic-bezier(0.16, 1, 0.3, 1) both;\n }\n .sa-drawer-file-card:nth-child(1) { animation-delay: 0s; }\n .sa-drawer-file-card:nth-child(2) { animation-delay: 0.04s; }\n .sa-drawer-file-card:nth-child(3) { animation-delay: 0.08s; }\n .sa-drawer-file-card:nth-child(4) { animation-delay: 0.12s; }\n .sa-drawer-file-card:nth-child(5) { animation-delay: 0.16s; }\n .sa-drawer-file-card:hover { border-color: var(--sa-primary); background: var(--sa-surface); box-shadow: 0 2px 8px rgba(99,102,241,0.08); transform: translateY(-1px); }\n .sa-drawer-file-card:active { transform: translateY(0) scale(0.98); }\n .sa-drawer-file-icon { flex-shrink: 0; }\n .sa-drawer-file-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }\n .sa-drawer-file-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; font-size: 14px; color: var(--sa-text); }\n .sa-drawer-file-size { color: var(--sa-text-muted); font-size: 12px; }\n\n /* \u2500\u2500 Drawer preview \u2500\u2500 */\n .sa-drawer-preview-iframe { width: 100%; height: 100%; border: none; background: #fff; animation: sa-fade-in 0.3s ease both; }\n /* html/docx \u5185\u8054\u9884\u89C8\uFF1A\u4E0E\u6D88\u606F\u6D41 ToolResultPart \u4E00\u81F4\uFF08\u65E0 iframe\uFF09 */\n .sa-drawer-preview-html-scroll { flex: 1; min-height: 0; overflow: auto; padding: 12px; background: #fff; animation: sa-fade-in 0.3s ease both; }\n .sa-drawer-preview-html { max-width: none; }\n .sa-drawer-preview-loading {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n height: 100%; gap: 12px; color: var(--sa-text-muted); font-size: 14px;\n }\n .sa-drawer-preview-loading::before {\n content: ''; width: 28px; height: 28px; border-radius: 50%;\n border: 3px solid var(--sa-border); border-top-color: var(--sa-primary);\n animation: sa-spinner 0.7s linear infinite;\n }\n .sa-drawer-preview-error {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 14px; height: 100%; color: var(--sa-text-muted); font-size: 14px;\n animation: sa-fade-in 0.2s ease both;\n }\n\n /* \u2500\u2500 Drawer view transition \u2500\u2500 */\n /* flex \u5217 + flex:1 \u6491\u6EE1 drawer body\uFF0C\u8BA9\u5185\u5C42 .sa-drawer-preview-html-scroll \u7684\n flex:1/min-height:0 \u4E0E pdf iframe \u7684 height:100% \u6709\u771F\u5B9E\u9AD8\u5EA6\u94FE */\n .sa-drawer-view-enter { display: flex; flex-direction: column; flex: 1; min-height: 0; animation: sa-drawer-view-in 0.25s cubic-bezier(0.16, 1, 0.3, 1) both; }\n\n /* \u2500\u2500 Layout helpers for drawer alongside thread \u2500\u2500 */\n .sa-panel-content { display: flex; flex: 1; min-height: 0; overflow: hidden; }\n .sa-panel-content .sa-thread { flex: 1; min-width: 120px; transition: flex 0.3s cubic-bezier(0.16, 1, 0.3, 1); }\n .sa-panel-content .sa-artifact-drawer { max-width: 60%; }\n .sa-fp-content-row { display: flex; flex: 1; min-height: 0; overflow: hidden; }\n .sa-fp-content-row .sa-thread { flex: 1; min-width: 0; transition: flex 0.3s cubic-bezier(0.16, 1, 0.3, 1); }\n\n /* \u2500\u2500 Page overlay\uFF08\u9762\u677F\u7EA7\u6574\u5C4F\u9875\u9762\uFF1A\u66FF\u6362\u5185\u5BB9\u533A + \u8F93\u5165\u533A\uFF0CHeader \u4FDD\u7559\uFF1B\u65E0\u8FD4\u56DE\u680F\uFF0C\u7EAF\u767D\u5E95\uFF09 \u2500\u2500 */\n .sa-page-overlay {\n display: flex; flex-direction: column; flex: 1; min-height: 0;\n position: relative; z-index: 2; background: #fff; overflow: hidden;\n animation: sa-page-in 0.24s cubic-bezier(0.16, 1, 0.3, 1) both;\n }\n /* \u5927\u7A97\u6001\u4E0E\u5185\u5BB9\u533A/\u8F93\u5165\u533A\u4E00\u81F4\u7684 800px \u5C45\u4E2D */\n .sa-page-overlay-centered { width: 100%; max-width: 800px; margin: 0 auto; }\n /* \u6EDA\u52A8\u5F52 SDK\uFF0C\u4E1A\u52A1\u9875\u4E0D\u5199\u6EDA\u52A8\u5BB9\u5668 */\n .sa-page-overlay-body { flex: 1; min-height: 0; overflow-y: auto; }\n /* \u2500\u2500 Artifact keyframes \u2500\u2500 */\n @keyframes sa-slide-in-right {\n from { opacity: 0; transform: translateX(100%); }\n to { opacity: 1; transform: translateX(0); }\n }\n @keyframes sa-slide-out-right {\n from { opacity: 1; transform: translateX(0); }\n to { opacity: 0; transform: translateX(100%); }\n }\n @keyframes sa-fade-in-up {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes sa-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes sa-spinner {\n to { transform: rotate(360deg); }\n }\n @keyframes sa-artifact-pulse {\n 0%, 100% { box-shadow: 0 1px 4px rgba(99,102,241,0.25); }\n 50% { box-shadow: 0 2px 12px rgba(99,102,241,0.5); }\n }\n @keyframes sa-drawer-view-in {\n from { opacity: 0; transform: translateX(12px); }\n to { opacity: 1; transform: translateX(0); }\n }\n @keyframes sa-page-in {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n }\n";
|
|
876
|
+
export declare const widgetStyles = "\n [data-super-agent-widget] {\n --sa-primary-dark: color-mix(in srgb, var(--sa-primary) 82%, #000);\n --sa-primary-light: color-mix(in srgb, var(--sa-primary) 10%, #fff);\n --sa-text: #1f2937;\n --sa-text-muted: #6b7280;\n --sa-text-light: #9ca3af;\n --sa-border: #e5e7eb;\n --sa-surface: #f9fafb;\n --sa-hover: #f3f4f6;\n\n font-family: var(--sa-font);\n color: var(--sa-text);\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n }\n\n [data-super-agent-widget] *,\n [data-super-agent-widget] *::before,\n [data-super-agent-widget] *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n /* \u5BBF\u4E3B\u53EF\u80FD\u672A\u542F\u7528 Tailwind preflight\uFF08\u6D4F\u89C8\u5668 UA \u9ED8\u8BA4\u7ED9 button \u52A0\u7070\u8FB9\u6846/\u5E95\u8272\uFF09\uFF0C\n \u6B64\u5904\u91CD\u7F6E\u3002:where() \u4F7F\u7279\u5F02\u6027\u5F52\u96F6\uFF0C\u4E0D\u4F1A\u538B\u8FC7\u4E0B\u65B9 .sa-* \u53CA\u5BBF\u4E3B\u6837\u5F0F */\n :where([data-super-agent-widget]) button {\n border: 0 solid;\n background: none;\n font-family: inherit;\n cursor: pointer;\n }\n\n /* \u2500\u2500 Trigger / Panel / Header\uFF08\u6D6E\u7A97\u6846\u67B6\u5DF2\u6539\u7528 Tailwind \u5B9E\u73B0\uFF0C\u89C1 tailwind.css\uFF09 \u2500\u2500 */\n\n /* \u2500\u2500 Thread / messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-thread {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 16px;\n overflow-y: auto;\n padding: 16px;\n background: var(--sa-surface);\n }\n\n .sa-thread::-webkit-scrollbar {\n width: 6px;\n }\n\n .sa-thread::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.14);\n border-radius: 3px;\n }\n\n .sa-thread::-webkit-scrollbar-thumb:hover {\n background: rgba(0, 0, 0, 0.24);\n }\n\n /* \u2500\u2500 Message\uFF1A\u6D6E\u7A97\u9ED8\u8BA4 hr-for-help \u98CE\u683C\uFF08AI \u5934\u50CF\u72EC\u5360\u4E00\u884C\uFF09\uFF1B\n fullpage \u6A21\u5F0F\u5728 .sa-fp-content-row \u4E0B\u6062\u590D\u539F\u6A2A\u6392\u5E03\u5C40\uFF0C\u4E92\u4E0D\u5F71\u54CD \u2500\u2500 */\n\n .sa-message {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n width: 100%;\n }\n\n .sa-message-user {\n justify-content: flex-end;\n }\n\n /* AI \u6D88\u606F\uFF1A\u5217\u5E03\u5C40\uFF0C\u5934\u50CF\u72EC\u5360\u4E00\u884C\uFF08\u4EC5\u6D6E\u7A97\uFF0C\u5BF9\u9F50 hr-for-help msgAi\uFF09 */\n .sa-message-assistant {\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n }\n\n .sa-message-content {\n max-width: 78%;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .sa-message-user .sa-message-content {\n max-width: 90%;\n }\n\n .sa-message-assistant .sa-message-content {\n max-width: 100%;\n min-width: 0;\n width: 100%;\n }\n\n .sa-message-body {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n /* \u6D6E\u7A97\u6C14\u6CE1\uFF1A\u7528\u6237\u6D45\u84DD\u3001AI \u767D\u5E95\u63CF\u8FB9\uFF08\u5BF9\u9F50 hr-for-help\uFF09 */\n .sa-message-user .sa-message-body {\n padding: 8px 12px;\n border-radius: 8px 8px 0 8px;\n background: #E8F1FE;\n color: #333333;\n font-size: 14px;\n line-height: 1.6;\n word-break: break-word;\n }\n\n .sa-message-assistant .sa-message-body {\n padding: 10px 12px;\n border-radius: 8px;\n background: #ffffff;\n border: 1px solid #E0E0E0;\n color: var(--sa-text);\n font-size: 14px;\n line-height: 1.5;\n word-break: break-word;\n }\n\n .sa-message-time {\n font-size: 11px;\n color: var(--sa-text-muted);\n opacity: 0.7;\n }\n\n .sa-message-time-right {\n text-align: right;\n }\n\n /* \u6D88\u606F\u5934\u50CF\uFF1A\u88F8\u5C55\u793A\uFF0C\u65E0\u80CC\u666F\u8272\uFF08\u5BF9\u9F50 hr-for-help msgAvatar\uFF09 */\n .sa-msg-avatar {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n object-fit: cover;\n flex-shrink: 0;\n display: block;\n }\n\n .sa-msg-avatar-text {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n font-weight: 400;\n }\n\n /* \u2500\u2500 fullpage \u8986\u76D6\uFF1A\u6062\u590D\u6A2A\u6392\u5934\u50CF + \u7ECF\u5178\u6C14\u6CE1\uFF08\u4E0D\u53D7\u6D6E\u7A97 hr-for-help \u6539\u7248\u5F71\u54CD\uFF09 \u2500\u2500 */\n\n .sa-fp-content-row .sa-message-assistant {\n flex-direction: row;\n gap: 10px;\n }\n\n .sa-fp-content-row .sa-message-assistant .sa-message-content {\n max-width: 88%;\n width: auto;\n }\n\n .sa-fp-content-row .sa-message-user .sa-message-content {\n max-width: 78%;\n }\n\n // .sa-fp-content-row .sa-message-user .sa-message-body {\n // padding: 10px 14px;\n // border-radius: 16px;\n // border-bottom-right-radius: 4px;\n // background: var(--sa-primary);\n // color: #ffffff;\n // font-size: 14px;\n // line-height: 1.55;\n // word-break: break-word;\n // }\n\n .sa-fp-content-row .sa-message-assistant .sa-message-body {\n padding: 10px 14px;\n border-radius: 16px;\n background: #ffffff;\n color: var(--sa-text);\n font-size: 14px;\n line-height: 1.55;\n word-break: break-word;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);\n }\n\n .sa-fp-content-row .sa-msg-avatar {\n width: 24px;\n height: 24px;\n }\n\n .sa-fp-content-row .sa-msg-avatar-text {\n background: linear-gradient(135deg, var(--sa-primary), var(--sa-primary-dark));\n color: #ffffff;\n font-size: 12px;\n font-weight: 600;\n }\n\n /* AI \u6D88\u606F Markdown \u6392\u7248\uFF08Claude \u98CE\u683C\uFF0C\u8272\u503C\u5BF9\u9F50 tokens.ts\uFF09 */\n\n .sa-text-part {\n font-size: 14px;\n line-height: 1.65;\n color: var(--sa-text);\n word-break: break-word;\n }\n\n .sa-text-part p {\n margin: 0 0 10px;\n }\n\n .sa-text-part > *:first-child {\n margin-top: 0;\n }\n\n .sa-text-part > *:last-child {\n margin-bottom: 0;\n }\n\n .sa-text-part strong {\n color: #141413; /* ink */\n font-weight: 600;\n }\n\n .sa-text-part em {\n font-style: italic;\n }\n\n .sa-text-part del {\n color: #b0aea5; /* mist */\n }\n\n .sa-text-part h1,\n .sa-text-part h2,\n .sa-text-part h3,\n .sa-text-part h4,\n .sa-text-part h5,\n .sa-text-part h6 {\n margin: 20px 0 8px;\n color: #141413; /* ink */\n font-weight: 600;\n line-height: 1.35;\n }\n\n .sa-text-part h1 {\n font-size: 1.4em;\n }\n\n .sa-text-part h2 {\n font-size: 1.25em;\n }\n\n .sa-text-part h3 {\n font-size: 1.1em;\n }\n\n .sa-text-part h4,\n .sa-text-part h5,\n .sa-text-part h6 {\n font-size: 1em;\n }\n\n .sa-text-part a {\n color: #d97757; /* clay */\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: 2px;\n }\n\n .sa-text-part a:hover {\n color: color-mix(in srgb, #d97757 82%, #000); /* clay \u6DF1\u4E00\u6B65 */\n }\n\n /* \u884C\u5185\u4EE3\u7801\uFF1Aparchment \u586B\u5145\u5E95\uFF0Cink \u6587\u5B57 */\n .sa-text-part code {\n padding: 2px 5px;\n border-radius: 4px;\n background: #e8e6dc; /* parchment */\n color: #141413; /* ink */\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 0.875em;\n }\n\n /* \u4EE3\u7801\u5757\uFF1Acard \u5E95 + hairline \u8FB9\u6846\uFF08\u6D45\u8272\u6696\u8C03\uFF0CClaude \u98CE\uFF09\uFF1B\u5185\u90E8 code \u590D\u4F4D\u884C\u5185\u6837\u5F0F */\n .sa-text-part pre {\n margin: 10px 0;\n padding: 12px 14px;\n border: 1px solid #e3e1d8; /* border */\n border-radius: 8px;\n background: #efede6; /* card */\n color: #141413; /* ink */\n overflow-x: auto;\n font-size: 13px;\n line-height: 1.6;\n }\n\n .sa-text-part pre code {\n padding: 0;\n background: none;\n color: inherit;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 1em;\n white-space: pre;\n }\n\n /* \u5217\u8868\uFF1Amarker \u67D4\u548C\u7070 */\n .sa-text-part ul,\n .sa-text-part ol {\n margin: 8px 0;\n padding-left: 22px;\n }\n\n .sa-text-part ul {\n list-style: disc;\n }\n\n .sa-text-part ol {\n list-style: decimal;\n }\n\n .sa-text-part li {\n margin: 4px 0;\n line-height: 1.6;\n }\n\n .sa-text-part li::marker {\n color: #666560; /* inkMuted */\n }\n\n .sa-text-part li > input[type='checkbox'] {\n margin-right: 6px;\n accent-color: #d97757; /* clay */\n }\n\n .sa-text-part ul:has(> li > input[type='checkbox']) {\n list-style: none;\n padding-left: 4px;\n }\n\n /* GFM \u8868\u683C\uFF1Ath parchment \u5E95 + hairline \u8FB9\u6846 */\n .sa-text-part table {\n margin: 10px 0;\n border-collapse: collapse;\n font-size: 0.95em;\n }\n\n .sa-text-part th,\n .sa-text-part td {\n padding: 6px 12px;\n border: 1px solid #e3e1d8; /* border */\n text-align: left;\n }\n\n .sa-text-part th {\n background: #e8e6dc; /* parchment */\n color: #141413; /* ink */\n font-weight: 600;\n }\n\n /* \u5F15\u7528\u5757\uFF1Aclay \u5DE6\u70B9\u7F00 + inkMuted \u6B63\u6587 */\n .sa-text-part blockquote {\n margin: 10px 0;\n padding: 2px 14px;\n border-left: 3px solid #d97757; /* clay */\n color: #666560; /* inkMuted */\n }\n\n .sa-text-part hr {\n margin: 16px 0;\n border: none;\n border-top: 1px solid #e3e1d8; /* border */\n }\n\n /* \u2500\u2500 Thinking part \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-thinking-part {\n margin: 6px 0;\n padding: 8px 12px;\n border-left: 3px solid var(--sa-primary);\n border-radius: 8px;\n background: var(--sa-primary-light);\n cursor: pointer;\n font-size: 13px;\n }\n\n .sa-thinking-header {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--sa-primary-dark);\n font-weight: 500;\n user-select: none;\n }\n\n .sa-thinking-icon {\n font-size: 14px;\n line-height: 1;\n }\n\n .sa-thinking-label {\n flex: 1;\n }\n\n /* DeepSeek \u5F0F\u6536\u8D77\u6761\u8017\u65F6\u540E\u7F00\uFF08\u5DF2\u6DF1\u5EA6\u601D\u8003 \u00B7 \u7528\u65F6 3.2s\uFF09 */\n .sa-thinking-duration {\n color: #9ca3af;\n font-weight: 400;\n }\n\n .sa-thinking-arrow {\n font-size: 12px;\n transition: transform 0.2s ease;\n }\n\n .sa-thinking-arrow.expanded {\n transform: rotate(90deg);\n }\n\n .sa-thinking-content {\n margin-top: 8px;\n color: #4b5563;\n white-space: pre-wrap;\n line-height: 1.55;\n }\n\n /* \u2500\u2500 Tool call / result \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-tool-call-part {\n margin: 6px 0;\n border: 1px solid var(--sa-border);\n border-radius: 10px;\n overflow: hidden;\n background: #ffffff;\n }\n\n .sa-tool-call-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n font-size: 13px;\n user-select: none;\n }\n\n .sa-tool-call-header:hover {\n background: var(--sa-surface);\n }\n\n .sa-tool-icon {\n font-size: 14px;\n line-height: 1;\n }\n\n .sa-tool-name {\n flex: 1;\n color: #374151;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .sa-tool-args {\n margin: 0;\n padding: 10px 12px;\n border-top: 1px solid var(--sa-border);\n background: var(--sa-surface);\n color: #374151;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n line-height: 1.5;\n white-space: pre;\n overflow-x: auto;\n }\n\n .sa-tool-result-part {\n margin: 6px 0;\n border: 1px solid var(--sa-border);\n border-radius: 10px;\n overflow: hidden;\n background: #ffffff;\n }\n\n .sa-tool-result-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--sa-border);\n background: var(--sa-surface);\n color: #374151;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n user-select: none;\n }\n\n .sa-tool-result-header:hover {\n background: #f0f0f1;\n }\n\n .sa-tool-result-label {\n flex: 1;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .sa-tool-result-content {\n max-height: 256px;\n overflow: auto;\n margin: 8px 0 0;\n padding: 10px 12px;\n color: #4b5563;\n font-size: 13px;\n line-height: 1.55;\n white-space: pre-wrap;\n word-break: break-word;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: #f9fafb;\n border-radius: 8px;\n }\n\n .sa-tool-result-actions {\n display: flex;\n gap: 8px;\n margin: 4px 0;\n }\n\n /* \u2500\u2500 Error part \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-error-part {\n margin: 6px 0;\n padding: 10px 12px;\n border: 1px solid #fecaca;\n border-radius: 10px;\n background: #fef2f2;\n color: #b91c1c;\n }\n\n .sa-error-content {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n font-size: 13px;\n line-height: 1.5;\n }\n\n .sa-error-icon {\n font-size: 14px;\n line-height: 1.4;\n }\n\n .sa-error-retry {\n margin-top: 8px;\n padding: 6px 14px;\n border: none;\n border-radius: 8px;\n background: #ef4444;\n color: #ffffff;\n font-size: 13px;\n cursor: pointer;\n transition: background 0.2s ease;\n }\n\n .sa-error-retry:hover {\n background: #dc2626;\n }\n\n /* \u2500\u2500 Action bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-action-bar {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n position: relative;\n }\n\n .sa-action-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n flex: none;\n white-space: nowrap;\n line-height: 1;\n padding: 4px 10px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--sa-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: color 0.15s ease, background 0.15s ease;\n }\n\n .sa-action-btn svg {\n display: block;\n flex: none;\n }\n\n .sa-action-btn:hover {\n color: var(--sa-text);\n background: rgba(0, 0, 0, 0.05);\n }\n\n .sa-action-btn-active {\n color: var(--sa-primary) !important;\n background: var(--sa-primary-light) !important;\n }\n\n .sa-action-divider {\n width: 1px;\n height: 16px;\n background: var(--sa-border);\n margin: 0 2px;\n align-self: center;\n }\n\n /* \u2500\u2500 Dislike Panel \u2500\u2500 */\n .sa-dislike-panel {\n position: absolute; top: 100%; left: 0; right: 0;\n margin-top: 6px; padding: 12px;\n background: #fff; border: 1px solid var(--sa-border); border-radius: 10px;\n box-shadow: 0 4px 16px rgba(0,0,0,0.08);\n animation: sa-fade-in-up 0.2s cubic-bezier(0.16,1,0.3,1) both;\n z-index: 10;\n }\n .sa-dislike-panel-title { font-size: 13px; font-weight: 500; color: var(--sa-text); margin-bottom: 8px; }\n .sa-dislike-reasons { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px; }\n .sa-dislike-reason-btn {\n padding: 4px 10px; border: 1px solid var(--sa-border); border-radius: 6px;\n background: #fff; color: var(--sa-text); font-size: 12px; cursor: pointer;\n transition: border-color 0.15s, background 0.15s, color 0.15s;\n }\n .sa-dislike-reason-btn:hover { border-color: var(--sa-primary); color: var(--sa-primary); }\n .sa-dislike-reason-btn.active { background: var(--sa-primary); color: #fff; border-color: var(--sa-primary); }\n .sa-dislike-remark {\n width: 100%; padding: 8px 10px; border: 1px solid var(--sa-border); border-radius: 8px;\n font-size: 13px; color: var(--sa-text); resize: none; outline: none;\n transition: border-color 0.15s;\n }\n .sa-dislike-remark:focus { border-color: var(--sa-primary); }\n .sa-dislike-actions { display: flex; gap: 8px; margin-top: 10px; justify-content: flex-end; }\n .sa-dislike-submit {\n padding: 5px 14px; border: none; border-radius: 6px;\n background: var(--sa-primary); color: #fff; font-size: 13px; font-weight: 500; cursor: pointer;\n transition: opacity 0.15s;\n }\n .sa-dislike-submit:hover { opacity: 0.9; }\n .sa-dislike-cancel {\n padding: 5px 14px; border: 1px solid var(--sa-border); border-radius: 6px;\n background: #fff; color: var(--sa-text-muted); font-size: 13px; cursor: pointer;\n transition: background 0.15s;\n }\n .sa-dislike-cancel:hover { background: var(--sa-surface); }\n\n /* \u2500\u2500 Composer\uFF08\u8F93\u5165\u533A\u6539\u7528 Tailwind \u5B9E\u73B0\uFF0C\u89C1 tailwind.css \u7684 .sa-input-form/.sa-send-btn\uFF09 \u2500\u2500 */\n\n /* \u2500\u2500 Slash Menu \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /* \u9762\u677F\u5BBD\u5EA6\u4E0E\u8F93\u5165\u533A\uFF08.sa-input-form\uFF09\u5BF9\u9F50\uFF1A\u8F93\u5165\u533A\u5728 wrapper \u7684 px-[15px] \u5185\uFF0C\n \u6545\u6B64\u5904\u540C\u6837\u53D6 15px \u5DE6\u53F3\u5185\u7F29\u3002\u4E0D\u518D\u8BBE max-width\u2014\u2014\u6B64\u524D 400px \u4E0A\u9650\u4F1A\u8BA9\u9762\u677F\u6BD4\n \u8F93\u5165\u6846\u7A84\u4E00\u622A\u4E14\u5DE6\u5BF9\u9F50\uFF0C\u89C6\u89C9\u4E0A\"\u6CA1\u5BF9\u9F50\"\u3002 */\n .sa-slash-menu {\n position: absolute;\n bottom: 100%;\n left: 15px;\n right: 15px;\n display: flex;\n flex-direction: column;\n max-height: 280px;\n overflow: hidden; /* \u8BA9\u5706\u89D2\u88C1\u6389\u6EDA\u52A8\u5185\u5BB9 */\n background: var(--sa-surface);\n border: 1px solid var(--sa-border);\n border-radius: 8px;\n box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.1);\n margin-bottom: 4px;\n z-index: 10;\n }\n\n /* \u8BA1\u6570\u5934\uFF1A\u56FA\u5B9A\u5728\u9762\u677F\u9876\u90E8\uFF08\u5217\u8868\u4F53\u72EC\u7ACB\u6EDA\u52A8\uFF09\uFF0C\u6545 flex-shrink:0 */\n .sa-slash-menu-header {\n flex-shrink: 0;\n padding: 7px 12px;\n border-bottom: 1px solid var(--sa-border);\n background: var(--sa-surface);\n color: #9ca3af;\n font-size: 12px;\n line-height: 1.4;\n }\n\n /* \u5217\u8868\u4F53\uFF1A\u552F\u4E00\u7684\u6EDA\u52A8\u5BB9\u5668 */\n .sa-slash-menu-body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n .sa-slash-menu-empty {\n padding: 12px 14px;\n color: #9ca3af;\n font-size: 13px;\n text-align: center;\n }\n\n .sa-slash-menu-item {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .sa-slash-menu-item:hover,\n .sa-slash-menu-item--active {\n background: var(--sa-hover);\n }\n\n /* \u6280\u80FD\u56FE\u6807\uFF1A\u4E0E\u8F93\u5165\u533A chip \u540C\u4E00\u679A\uFF0C\u989C\u8272\u5F31\u5316\u8BA9\u540D\u79F0\u6210\u4E3A\u89C6\u89C9\u4E3B\u4F53 */\n .sa-slash-menu-item-icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n color: #9ca3af;\n }\n\n .sa-slash-menu-item-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--sa-text);\n white-space: nowrap;\n }\n\n .sa-slash-menu-item-desc {\n font-size: 12px;\n color: #9ca3af;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n min-width: 0;\n }\n\n /* Team \u4E2D\u5F52\u5C5E\u67D0\u4E2A\u6210\u5458\u7684\u6280\u80FD\uFF1A\u6210\u5458\u540D\u5FBD\u6807\uFF0C\u7528\u4E8E\u533A\u5206\u540C\u540D\u6280\u80FD */\n .sa-slash-menu-item-owner {\n flex-shrink: 0;\n padding: 1px 5px;\n border-radius: 3px;\n background: var(--sa-hover);\n color: var(--sa-text-muted);\n font-size: 11px;\n line-height: 1.4;\n }\n\n /* \u4E0D\u53EF\u70B9\u540D\u7684\u6280\u80FD\uFF08Pipeline \u6A21\u5F0F\u4E0B\u5F52\u5C5E\u6210\u5458\u7684\u6280\u80FD\uFF09\uFF1A\u5217\u51FA\u4F46\u7F6E\u7070\u3002\n hover \u4E0D\u7ED9\u53CD\u9988\uFF0C\u907F\u514D\u8BEF\u4EE5\u4E3A\u53EF\u70B9\u2014\u2014\u89C4\u5219\u89C1 design D5\u3002 */\n .sa-slash-menu-item--disabled {\n cursor: not-allowed;\n opacity: 0.55;\n }\n\n .sa-slash-menu-item--disabled:hover {\n background: transparent;\n }\n\n /* \u2500\u2500 Thread list\uFF08\u5185\u5D4C\u4FA7\u8FB9\u680F\u6539\u7528 Tailwind \u5B9E\u73B0\uFF0C\u89C1 FullpageLayout.tsx / ThreadList.tsx\uFF09 \u2500\u2500 */\n\n /* \u6D88\u606F\u533A\u52A0\u8F7D\u6001 */\n .sa-messages-loading {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n color: #9ca3af;\n font-size: 14px;\n }\n\n .sa-loading-spinner {\n width: 16px;\n height: 16px;\n border: 2px solid var(--sa-border, #e5e7eb);\n border-top-color: var(--sa-primary, #6366f1);\n border-radius: 50%;\n animation: sa-spin 0.8s linear infinite;\n flex-shrink: 0;\n }\n\n @keyframes sa-spin {\n to { transform: rotate(360deg); }\n }\n\n /* \u2500\u2500 Welcome\uFF08\u9996\u9875\u6539\u7528 Tailwind \u5B9E\u73B0\uFF0C\u89C1 tailwind.css\uFF09 \u2500\u2500 */\n\n .sa-thinking-indicator {\n color: #9ca3af;\n font-size: 14px;\n animation: sa-blink 1.2s ease-in-out infinite;\n }\n\n /* \u2500\u2500 Interrupt cards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-interrupt-card {\n margin: 8px 0;\n padding: 14px;\n border: 1px solid #e0e7ff;\n border-radius: 10px;\n background: #f8faff;\n }\n\n .sa-interrupt-content {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n font-size: 13px;\n line-height: 1.6;\n color: var(--sa-text);\n margin-bottom: 12px;\n }\n\n .sa-interrupt-actions {\n display: flex;\n gap: 8px;\n margin-top: 10px;\n }\n\n .sa-interrupt-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: none;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, opacity 0.15s;\n }\n\n .sa-interrupt-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .sa-interrupt-btn-primary {\n background: var(--sa-primary);\n color: #fff;\n }\n\n .sa-interrupt-btn-primary:hover:not(:disabled) {\n opacity: 0.9;\n }\n\n .sa-interrupt-btn-secondary {\n background: #f3f4f6;\n color: #374151;\n }\n\n .sa-interrupt-btn-secondary:hover:not(:disabled) {\n background: #e5e7eb;\n }\n\n .sa-interrupt-btn-danger {\n background: #fef2f2;\n color: #dc2626;\n }\n\n .sa-interrupt-btn-danger:hover:not(:disabled) {\n background: #fee2e2;\n }\n\n .sa-interrupt-options {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .sa-interrupt-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px solid var(--sa-border);\n border-radius: 8px;\n background: #fff;\n color: var(--sa-text);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.12s, background 0.12s;\n }\n\n .sa-interrupt-option:hover {\n border-color: var(--sa-primary);\n background: #f5f3ff;\n }\n\n .sa-interrupt-option-selected {\n border-color: var(--sa-primary);\n background: #ede9fe;\n color: var(--sa-primary);\n font-weight: 500;\n }\n\n .sa-interrupt-option-danger {\n color: #ef4444;\n }\n\n .sa-interrupt-option-danger:hover {\n border-color: #ef4444;\n background: #fef2f2;\n }\n\n .sa-interrupt-option-desc {\n font-size: 11px;\n color: var(--sa-text-muted);\n margin-left: auto;\n }\n\n .sa-interrupt-input-area {\n margin-top: 4px;\n }\n\n .sa-interrupt-input,\n .sa-interrupt-textarea,\n .sa-interrupt-select {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--sa-border);\n border-radius: 8px;\n background: #fff;\n color: var(--sa-text);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n transition: border-color 0.15s;\n }\n\n .sa-interrupt-input:focus,\n .sa-interrupt-textarea:focus,\n .sa-interrupt-select:focus {\n border-color: var(--sa-primary);\n }\n\n .sa-interrupt-textarea {\n resize: vertical;\n min-height: 60px;\n }\n\n .sa-interrupt-form {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: 4px;\n }\n\n .sa-interrupt-form-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .sa-interrupt-form-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--sa-text);\n }\n\n .sa-interrupt-form-required {\n color: #ef4444;\n margin-left: 2px;\n }\n\n .sa-interrupt-submitted {\n margin-top: 8px;\n font-size: 12px;\n color: #9ca3af;\n }\n\n /* \u5DF2\u63D0\u4EA4\u5361\u7247\u7684\u7B54\u6848\u515C\u5E95\u56DE\u663E\uFF08\u81EA\u7531\u6587\u672C\u4F5C\u7B54\u4E0D\u5339\u914D\u9009\u9879/\u6309\u94AE\u65F6\uFF09 */\n .sa-interrupt-answer {\n margin-top: 8px;\n display: flex;\n align-items: flex-start;\n gap: 4px;\n font-size: 12px;\n line-height: 1.5;\n color: #4b5563;\n background: #f3f4f6;\n border-radius: 4px;\n padding: 6px 8px;\n word-break: break-all;\n }\n\n .sa-interrupt-answer svg {\n flex-shrink: 0;\n margin-top: 1px;\n }\n\n .sa-interrupt-btn-answered {\n background: var(--sa-primary) !important;\n color: #fff !important;\n opacity: 0.7;\n }\n\n .sa-interrupt-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .sa-interrupt-option:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .sa-interrupt-input:disabled,\n .sa-interrupt-textarea:disabled,\n .sa-interrupt-select:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n background: #f9fafb;\n }\n\n .sa-interrupt-unknown {\n padding: 8px 12px;\n border-radius: 8px;\n background: #fef3c7;\n color: #92400e;\n font-size: 13px;\n margin: 6px 0;\n }\n\n /* \u2500\u2500 Animations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n @keyframes sa-blink {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n }\n }\n\n /* \u2500\u2500 Fullpage Layout (DeepSeek-style) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n .sa-fullpage {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n background: var(--sa-bg, #ffffff);\n }\n\n /* Sidebar\uFF08fullpage \u9ED8\u8BA4\u4FA7\u8FB9\u680F\u6539\u7528 Tailwind \u5B9E\u73B0\uFF0C\u5BF9\u9F50\u6D6E\u7A97\u5386\u53F2\u5BF9\u8BDD\u6837\u5F0F\uFF0C\u89C1 FullpageLayout.tsx\uFF09 */\n\n /* Sidebar wrapper (for custom ThreadList slot)\uFF1A\u5BBD\u5EA6\u4E0E\u9ED8\u8BA4\u4FA7\u8FB9\u680F 220px \u5BF9\u9F50 */\n .sa-fp-sidebar-wrapper {\n width: 220px;\n flex-shrink: 0;\n overflow: hidden;\n border-right: 1px solid #ECECEC;\n background: #FAFAFA;\n transition: width 0.2s cubic-bezier(0.16,1,0.3,1);\n }\n\n .sa-fp-sidebar-wrapper-collapsed {\n width: 0;\n border-right: none;\n }\n\n /* Main area */\n .sa-fp-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n background: #fff;\n }\n\n .sa-fp-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 16px;\n border-bottom: 1px solid #f0f0f0;\n background: #fff;\n flex-shrink: 0;\n min-height: 52px;\n }\n\n .sa-fp-header-title {\n flex: 1;\n font-size: 15px;\n font-weight: 500;\n color: #18181b;\n letter-spacing: -0.2px;\n }\n\n .sa-fp-header-actions {\n display: flex;\n gap: 4px;\n }\n\n .sa-fp-header-btn {\n min-width: 34px;\n height: 34px;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: #71717a;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.12s, color 0.12s;\n }\n\n .sa-fp-header-btn:hover {\n background: #f4f4f5;\n color: #18181b;\n }\n\n /* Fullpage thread/composer override */\n .sa-fp-main .sa-thread {\n margin: 0 auto;\n width: 100%;\n padding: 24px 24px;\n }\n\n /* \u2500\u2500 Artifact file cards (in ToolResultPart) \u2500\u2500 */\n .sa-artifact-file-list { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }\n .sa-artifact-file-card {\n display: flex; align-items: center; gap: 10px; padding: 8px 10px;\n border: 1px solid var(--sa-border); border-radius: 10px; background: var(--sa-surface);\n font-size: 13px; color: var(--sa-text);\n transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease, transform 0.15s ease;\n animation: sa-fade-in-up 0.3s cubic-bezier(0.16, 1, 0.3, 1) both;\n }\n .sa-artifact-file-card:hover { border-color: var(--sa-primary); background: #fff; box-shadow: 0 2px 8px rgba(99,102,241,0.1); transform: translateY(-1px); }\n .sa-artifact-file-card:active { transform: translateY(0) scale(0.99); }\n .sa-artifact-file-icon { flex-shrink: 0; }\n .sa-artifact-chip-type {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 36px; padding: 2px 6px; border-radius: 5px;\n background: var(--sa-primary); color: #fff;\n font-size: 10px; font-weight: 700; letter-spacing: 0.3px; line-height: 1.4;\n }\n .sa-artifact-file-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }\n .sa-artifact-file-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; }\n .sa-artifact-file-size { color: var(--sa-text-muted); font-size: 12px; }\n .sa-artifact-file-download {\n border: none; background: none; cursor: pointer; color: var(--sa-text-muted);\n padding: 6px; border-radius: 6px; display: inline-flex;\n transition: color 0.15s ease, background 0.15s ease, transform 0.1s ease;\n }\n .sa-artifact-file-download:hover { color: var(--sa-primary); background: rgba(99,102,241,0.08); }\n .sa-artifact-file-download:active { transform: scale(0.9); }\n\n /* \u2500\u2500 Inline HTML rendering (render_mode=html) \u2500\u2500 */\n /* HTML \u5DE5\u5177\u7ED3\u679C\uFF1A\u5916\u5C42\u6EDA\u52A8\u5BB9\u5668 + \u5185\u5C42\u5185\u5BB9\u5C42\uFF08\u4E0E Playground \u4E00\u81F4\uFF0C\u65E0 iframe\uFF09 */\n .sa-tool-result-html-scroll { margin-top: 8px; max-height: 60vh; overflow: auto; border: 1px solid var(--sa-border); border-radius: 8px; }\n .sa-tool-result-html { padding: 12px; background: #fff; min-width: 100%; }\n\n /* \u2500\u2500 Header artifact button \u2500\u2500 */\n /* \u8F7B\u91CF\u67D4\u548C\uFF1A\u6D45 primary tint \u5E95 + primary \u6587\u5B57/\u56FE\u6807\uFF0C\u65E0\u5B9E\u5FC3\u5757\u4E0E\u6295\u5F71 */\n .sa-header-btn-artifact {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 5px 11px; border-radius: 8px;\n background: rgba(99,102,241,0.08); color: var(--sa-primary);\n font-size: 12px; font-weight: 500;\n transition: background 0.15s ease, color 0.15s ease, transform 0.1s ease;\n }\n .sa-header-btn-artifact:hover { background: rgba(99,102,241,0.14); color: var(--sa-primary); }\n .sa-header-btn-artifact:active { transform: scale(0.97); }\n .sa-header-btn-artifact svg { stroke: var(--sa-primary); }\n .sa-header-btn-artifact.sa-artifact-pulse { animation: sa-artifact-pulse 2s ease-in-out 3; }\n\n /* \u2500\u2500 Artifact drawer (right side panel) \u2500\u2500 */\n .sa-artifact-drawer {\n display: flex; flex-direction: column; min-width: 240px; max-width: 70%;\n border-left: 1px solid var(--sa-border); background: #fff; flex-shrink: 0; overflow: hidden;\n animation: sa-slide-in-right 0.3s cubic-bezier(0.16, 1, 0.3, 1) both;\n position: relative;\n }\n .sa-artifact-drawer.sa-drawer-closing {\n animation: sa-slide-out-right 0.25s cubic-bezier(0.4, 0, 1, 1) both;\n }\n .sa-drawer-resize-handle {\n position: absolute; left: -3px; top: 0; bottom: 0; width: 6px;\n cursor: col-resize; z-index: 2;\n transition: background 0.15s ease;\n }\n .sa-drawer-resize-handle:hover, .sa-drawer-resize-handle:active {\n background: var(--sa-primary); opacity: 0.3; border-radius: 3px;\n }\n .sa-artifact-drawer-header {\n display: flex; align-items: center; gap: 8px; padding: 12px 14px;\n border-bottom: 1px solid var(--sa-border); font-weight: 600; font-size: 15px; color: var(--sa-text);\n background: var(--sa-surface);\n }\n .sa-artifact-drawer-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .sa-drawer-btn {\n border: none; background: none; cursor: pointer; color: var(--sa-text-muted);\n padding: 6px; border-radius: 6px; display: inline-flex; align-items: center;\n transition: background 0.15s ease, color 0.15s ease, transform 0.1s ease;\n }\n .sa-drawer-btn:hover { background: var(--sa-border); color: var(--sa-text); }\n .sa-drawer-btn:active { transform: scale(0.92); }\n .sa-drawer-btn-sm {\n border: 1px solid var(--sa-border); background: #fff; cursor: pointer; color: var(--sa-primary);\n padding: 6px 14px; border-radius: 8px; font-size: 13px; font-weight: 500;\n transition: background 0.15s ease, border-color 0.15s ease;\n }\n .sa-drawer-btn-sm:hover { background: var(--sa-surface); border-color: var(--sa-primary); }\n /* flex \u5217\u5BB9\u5668\uFF1A\u8BA9 .sa-drawer-view-enter\uFF08flex:1\uFF09\u4E0E\u5185\u5C42\u6EDA\u52A8/iframe \u6709\u771F\u5B9E\u9AD8\u5EA6\u94FE */\n .sa-artifact-drawer-body { display: flex; flex-direction: column; flex: 1; min-height: 0; overflow-y: auto; overflow-x: hidden; scroll-behavior: smooth; }\n .sa-drawer-empty { padding: 48px 24px; text-align: center; color: var(--sa-text-muted); font-size: 14px; }\n .sa-drawer-file-list { list-style: none; margin: 0; padding: 10px; display: flex; flex-direction: column; gap: 8px; }\n .sa-drawer-file-card {\n display: flex; align-items: center; gap: 10px; padding: 12px 14px;\n border: 1px solid var(--sa-border); border-radius: 10px; cursor: pointer; background: #fff;\n transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease, transform 0.15s ease;\n animation: sa-fade-in-up 0.3s cubic-bezier(0.16, 1, 0.3, 1) both;\n }\n .sa-drawer-file-card:nth-child(1) { animation-delay: 0s; }\n .sa-drawer-file-card:nth-child(2) { animation-delay: 0.04s; }\n .sa-drawer-file-card:nth-child(3) { animation-delay: 0.08s; }\n .sa-drawer-file-card:nth-child(4) { animation-delay: 0.12s; }\n .sa-drawer-file-card:nth-child(5) { animation-delay: 0.16s; }\n .sa-drawer-file-card:hover { border-color: var(--sa-primary); background: var(--sa-surface); box-shadow: 0 2px 8px rgba(99,102,241,0.08); transform: translateY(-1px); }\n .sa-drawer-file-card:active { transform: translateY(0) scale(0.98); }\n .sa-drawer-file-icon { flex-shrink: 0; }\n .sa-drawer-file-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }\n .sa-drawer-file-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; font-size: 14px; color: var(--sa-text); }\n .sa-drawer-file-size { color: var(--sa-text-muted); font-size: 12px; }\n\n /* \u2500\u2500 Drawer preview \u2500\u2500 */\n .sa-drawer-preview-iframe { width: 100%; height: 100%; border: none; background: #fff; animation: sa-fade-in 0.3s ease both; }\n /* html/docx \u5185\u8054\u9884\u89C8\uFF1A\u4E0E\u6D88\u606F\u6D41 ToolResultPart \u4E00\u81F4\uFF08\u65E0 iframe\uFF09 */\n .sa-drawer-preview-html-scroll { flex: 1; min-height: 0; overflow: auto; padding: 12px; background: #fff; animation: sa-fade-in 0.3s ease both; }\n .sa-drawer-preview-html { max-width: none; }\n .sa-drawer-preview-loading {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n height: 100%; gap: 12px; color: var(--sa-text-muted); font-size: 14px;\n }\n .sa-drawer-preview-loading::before {\n content: ''; width: 28px; height: 28px; border-radius: 50%;\n border: 3px solid var(--sa-border); border-top-color: var(--sa-primary);\n animation: sa-spinner 0.7s linear infinite;\n }\n .sa-drawer-preview-error {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 14px; height: 100%; color: var(--sa-text-muted); font-size: 14px;\n animation: sa-fade-in 0.2s ease both;\n }\n\n /* \u2500\u2500 Drawer view transition \u2500\u2500 */\n /* flex \u5217 + flex:1 \u6491\u6EE1 drawer body\uFF0C\u8BA9\u5185\u5C42 .sa-drawer-preview-html-scroll \u7684\n flex:1/min-height:0 \u4E0E pdf iframe \u7684 height:100% \u6709\u771F\u5B9E\u9AD8\u5EA6\u94FE */\n .sa-drawer-view-enter { display: flex; flex-direction: column; flex: 1; min-height: 0; animation: sa-drawer-view-in 0.25s cubic-bezier(0.16, 1, 0.3, 1) both; }\n\n /* \u2500\u2500 Layout helpers for drawer alongside thread \u2500\u2500 */\n .sa-panel-content { display: flex; flex: 1; min-height: 0; overflow: hidden; }\n .sa-panel-content .sa-thread { flex: 1; min-width: 120px; transition: flex 0.3s cubic-bezier(0.16, 1, 0.3, 1); }\n .sa-panel-content .sa-artifact-drawer { max-width: 60%; }\n .sa-fp-content-row { display: flex; flex: 1; min-height: 0; overflow: hidden; }\n .sa-fp-content-row .sa-thread { flex: 1; min-width: 0; transition: flex 0.3s cubic-bezier(0.16, 1, 0.3, 1); }\n\n /* \u2500\u2500 Page overlay\uFF08\u9762\u677F\u7EA7\u6574\u5C4F\u9875\u9762\uFF1A\u66FF\u6362\u5185\u5BB9\u533A + \u8F93\u5165\u533A\uFF0CHeader \u4FDD\u7559\uFF1B\u65E0\u8FD4\u56DE\u680F\uFF0C\u7EAF\u767D\u5E95\uFF09 \u2500\u2500 */\n .sa-page-overlay {\n display: flex; flex-direction: column; flex: 1; min-height: 0;\n position: relative; z-index: 2; background: #fff; overflow: hidden;\n animation: sa-page-in 0.24s cubic-bezier(0.16, 1, 0.3, 1) both;\n }\n /* \u5927\u7A97\u6001\u4E0E\u5185\u5BB9\u533A/\u8F93\u5165\u533A\u4E00\u81F4\u7684 800px \u5C45\u4E2D */\n .sa-page-overlay-centered { width: 100%; max-width: 800px; margin: 0 auto; }\n /* \u6EDA\u52A8\u5F52 SDK\uFF0C\u4E1A\u52A1\u9875\u4E0D\u5199\u6EDA\u52A8\u5BB9\u5668 */\n .sa-page-overlay-body { flex: 1; min-height: 0; overflow-y: auto; }\n /* \u2500\u2500 Artifact keyframes \u2500\u2500 */\n @keyframes sa-slide-in-right {\n from { opacity: 0; transform: translateX(100%); }\n to { opacity: 1; transform: translateX(0); }\n }\n @keyframes sa-slide-out-right {\n from { opacity: 1; transform: translateX(0); }\n to { opacity: 0; transform: translateX(100%); }\n }\n @keyframes sa-fade-in-up {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes sa-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes sa-spinner {\n to { transform: rotate(360deg); }\n }\n @keyframes sa-artifact-pulse {\n 0%, 100% { box-shadow: 0 1px 4px rgba(99,102,241,0.25); }\n 50% { box-shadow: 0 2px 12px rgba(99,102,241,0.5); }\n }\n @keyframes sa-drawer-view-in {\n from { opacity: 0; transform: translateX(12px); }\n to { opacity: 1; transform: translateX(0); }\n }\n @keyframes sa-page-in {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n }\n";
|
|
832
877
|
|
|
833
878
|
export { }
|