@szjy/ai-coms 0.1.16 → 0.1.17
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/dist/images/sikao.svg +20 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +2418 -1235
- package/dist/index.umd.js +7 -3
- package/dist/packages/common/voice/EqualizerBars.vue.d.ts +17 -0
- package/dist/packages/common/voice/VoiceCaptionBar.vue.d.ts +2 -0
- package/dist/packages/common/voice/VoiceMicButton.vue.d.ts +2 -0
- package/dist/packages/common/voice/VoiceOverlay.vue.d.ts +29 -0
- package/dist/packages/common/voice/aec.d.ts +52 -0
- package/dist/packages/common/voice/aec.test.d.ts +1 -0
- package/dist/packages/common/voice/api.d.ts +31 -0
- package/dist/packages/common/voice/api.test.d.ts +1 -0
- package/dist/packages/common/voice/asr.d.ts +20 -0
- package/dist/packages/common/voice/asr.test.d.ts +1 -0
- package/dist/packages/common/voice/constants.d.ts +37 -0
- package/dist/packages/common/voice/index.d.ts +11 -0
- package/dist/packages/common/voice/playback.d.ts +14 -0
- package/dist/packages/common/voice/types.d.ts +86 -0
- package/dist/packages/common/voice/useVoice.d.ts +29 -0
- package/dist/packages/common/voice/useVoice.test.d.ts +1 -0
- package/dist/packages/components/AiChat/src/index.vue.d.ts +37 -0
- package/dist/packages/components/AiChatPlain/src/index.vue.d.ts +37 -0
- package/dist/style.css +2 -2
- package/package.json +6 -2
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AsrConfig, AsrEngine, EchoReferenceProvider } from './types';
|
|
2
|
+
|
|
3
|
+
export interface AsrEngineDeps {
|
|
4
|
+
asrUrl: string;
|
|
5
|
+
getHeaders?: () => Record<string, string>;
|
|
6
|
+
/**
|
|
7
|
+
* Optional accessor for the page's TTS playback as an audio node. When
|
|
8
|
+
* provided, the recorder runs an explicit NLMS echo canceller using TTS
|
|
9
|
+
* output as the reference, so loud assistant speech does not trip the
|
|
10
|
+
* barge-in VAD through the loudspeaker->mic path.
|
|
11
|
+
*/
|
|
12
|
+
getEchoReference?: EchoReferenceProvider;
|
|
13
|
+
}
|
|
14
|
+
export declare function createAsrEngine(config: AsrConfig, deps: AsrEngineDeps): AsrEngine;
|
|
15
|
+
/**
|
|
16
|
+
* Turn a getUserMedia rejection into something actionable.
|
|
17
|
+
* Browsers report permission problems through DOMException names, and the raw
|
|
18
|
+
* message ("Permission denied") does not tell the user where to fix it.
|
|
19
|
+
*/
|
|
20
|
+
export declare function micErrorMessage(err: unknown): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 全双工语音常量(PRD 第 5 节,必须原样使用)。
|
|
3
|
+
* 见 docs/PRD-前端-全双工语音.md
|
|
4
|
+
*/
|
|
5
|
+
export declare const SAMPLE_RATE = 16000;
|
|
6
|
+
export declare const ENERGY_THRESHOLD = 0.015;
|
|
7
|
+
/** RMS that maps to a full-height waveform bar (speech peaks ~0.2-0.3). */
|
|
8
|
+
export declare const LEVEL_CEILING = 0.25;
|
|
9
|
+
export declare const SILENCE_TIMEOUT_MS = 2000;
|
|
10
|
+
export declare const MAX_SEGMENT_MS = 30000;
|
|
11
|
+
export declare const PRE_PAD_MS = 250;
|
|
12
|
+
export declare const POST_PAD_MS = 350;
|
|
13
|
+
/** Shortest press-to-talk capture worth sending to the recognizer. */
|
|
14
|
+
export declare const MIN_HOLD_SEGMENT_S = 0.25;
|
|
15
|
+
/** How often press-to-talk asks the host for an interim transcript. */
|
|
16
|
+
export declare const PARTIAL_INTERVAL_MS = 900;
|
|
17
|
+
/** Below this length SenseVoice mostly returns noise — not worth previewing. */
|
|
18
|
+
export declare const PARTIAL_MIN_S = 0.5;
|
|
19
|
+
/** Stop previewing past this length: interim passes re-decode the whole buffer. */
|
|
20
|
+
export declare const PARTIAL_MAX_S = 12;
|
|
21
|
+
export declare const BUFFER_SIZE = 1024;
|
|
22
|
+
/** Hold the mic this long (ms) before press-to-talk takes over from tap. */
|
|
23
|
+
export declare const HOLD_THRESHOLD_MS = 260;
|
|
24
|
+
/** Keyboard holds need a longer threshold: Ctrl+C must not open the recorder. */
|
|
25
|
+
export declare const KEY_HOLD_THRESHOLD_MS = 600;
|
|
26
|
+
/** Drag the pointer this far up (px) to arm cancel-on-release. */
|
|
27
|
+
export declare const CANCEL_DRAG_PX = 80;
|
|
28
|
+
/** How many bars the press-to-talk waveform keeps in its rolling window. */
|
|
29
|
+
export declare const WAVE_BARS = 28;
|
|
30
|
+
export declare const DEFAULT_BASE_PATH = "/api/voice";
|
|
31
|
+
/** AEC 默认参数(PRD 第 5 节)。 */
|
|
32
|
+
export declare const AEC_DEFAULTS: {
|
|
33
|
+
readonly filterLength: 256;
|
|
34
|
+
readonly delay: 64;
|
|
35
|
+
readonly step: 0.1;
|
|
36
|
+
readonly epsilon: 0.000001;
|
|
37
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './constants';
|
|
2
|
+
export * from './types';
|
|
3
|
+
export { NlmsAec, type AecOptions } from './aec';
|
|
4
|
+
export * from './api';
|
|
5
|
+
export { createAsrEngine, micErrorMessage, type AsrEngineDeps } from './asr';
|
|
6
|
+
export { createPlaybackEngine, type PlaybackEngine, type PlaybackDeps } from './playback';
|
|
7
|
+
export { useVoice, useVoiceContext, VOICE_CONTEXT_KEY, type VoiceContext } from './useVoice';
|
|
8
|
+
export { default as VoiceMicButton } from './VoiceMicButton.vue';
|
|
9
|
+
export { default as VoiceOverlay } from './VoiceOverlay.vue';
|
|
10
|
+
export { default as VoiceCaptionBar } from './VoiceCaptionBar.vue';
|
|
11
|
+
export { default as EqualizerBars } from './EqualizerBars.vue';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AudioState, EchoReference } from './types';
|
|
2
|
+
|
|
3
|
+
export interface PlaybackEngine {
|
|
4
|
+
connect(): void;
|
|
5
|
+
skip(): void;
|
|
6
|
+
subscribe(fn: (s: AudioState) => void): () => void;
|
|
7
|
+
getEchoReference(): EchoReference | null;
|
|
8
|
+
}
|
|
9
|
+
export interface PlaybackDeps {
|
|
10
|
+
streamUrl: string;
|
|
11
|
+
getHeaders?: () => Record<string, string>;
|
|
12
|
+
getSessionId: () => string;
|
|
13
|
+
}
|
|
14
|
+
export declare function createPlaybackEngine(deps: PlaybackDeps): PlaybackEngine;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { MaybeRefOrGetter } from 'vue';
|
|
2
|
+
|
|
3
|
+
export type AsrState = 'idle' | 'recording' | 'speech' | 'transcribing' | 'loading-model';
|
|
4
|
+
export interface AsrConfig {
|
|
5
|
+
/** Interaction mode: toggle (tap to start/stop, auto-segments) or hold. */
|
|
6
|
+
mode: 'toggle' | 'hold';
|
|
7
|
+
/** Auto-submit the draft after a transcript lands. */
|
|
8
|
+
autoSend: boolean;
|
|
9
|
+
/** Keyboard press-to-talk key (KeyboardEvent.key); '' disables it. */
|
|
10
|
+
hotkey?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface EchoReference {
|
|
13
|
+
/** MediaElementAudioSourceNode wired from the page's TTS <audio>. */
|
|
14
|
+
readonly node: AudioNode;
|
|
15
|
+
}
|
|
16
|
+
export type EchoReferenceProvider = () => EchoReference | null | undefined;
|
|
17
|
+
export interface AsrEngine {
|
|
18
|
+
readonly state: AsrState;
|
|
19
|
+
/**
|
|
20
|
+
* Begin recording. `hold: true` selects press-to-talk capture: everything
|
|
21
|
+
* between press and release is kept, with no VAD-driven segmentation.
|
|
22
|
+
*/
|
|
23
|
+
start(options?: {
|
|
24
|
+
hold?: boolean;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
stop(): Promise<void>;
|
|
27
|
+
/** Stop recording and discard the pending segment (slide-up-to-cancel). */
|
|
28
|
+
cancel(): Promise<void>;
|
|
29
|
+
/** Fire on segment (start/stop is handled by the recorder). */
|
|
30
|
+
readonly onSegment: (fn: (text: string) => void) => () => void;
|
|
31
|
+
readonly onState: (fn: (s: AsrState) => void) => () => void;
|
|
32
|
+
/** Fire at the leading edge of detected speech (the barge-in trigger). */
|
|
33
|
+
readonly onSpeechStart: (fn: () => void) => () => void;
|
|
34
|
+
/** Normalized mic level (0..1) per audio tick — drives the waveform UI. */
|
|
35
|
+
readonly onLevel: (fn: (level: number) => void) => () => void;
|
|
36
|
+
/**
|
|
37
|
+
* Interim transcript of the press-to-talk capture so far (live caption).
|
|
38
|
+
* Only emitted while at least one listener is attached.
|
|
39
|
+
*/
|
|
40
|
+
readonly onPartial: (fn: (text: string) => void) => () => void;
|
|
41
|
+
}
|
|
42
|
+
/** SSE `event: audio` 帧。 */
|
|
43
|
+
export interface VoiceFrame {
|
|
44
|
+
sessionId: string;
|
|
45
|
+
seq: number;
|
|
46
|
+
text: string;
|
|
47
|
+
/** base64 MPEG audio */
|
|
48
|
+
audio: string;
|
|
49
|
+
}
|
|
50
|
+
export interface AudioState {
|
|
51
|
+
connected: boolean;
|
|
52
|
+
playing: boolean;
|
|
53
|
+
caption: string | null;
|
|
54
|
+
}
|
|
55
|
+
export interface ReadyResponse {
|
|
56
|
+
ok: boolean;
|
|
57
|
+
/** 协议版本;dsh 测试后端不返回该字段(缺省视为兼容) */
|
|
58
|
+
protocolVersion?: number;
|
|
59
|
+
modelReady?: boolean;
|
|
60
|
+
ttsReady?: boolean;
|
|
61
|
+
enabled: boolean;
|
|
62
|
+
}
|
|
63
|
+
export interface VoiceConfig {
|
|
64
|
+
protocolVersion?: number;
|
|
65
|
+
basePath: string;
|
|
66
|
+
asr: AsrConfig & {
|
|
67
|
+
language?: string;
|
|
68
|
+
useItn?: boolean;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** useVoice 宿主接入合同(PRD 第 6 节)。 */
|
|
72
|
+
export interface UseVoiceOptions {
|
|
73
|
+
/** 当前对话 id,识别预览、TTS 过滤、cancel 都用它(响应式) */
|
|
74
|
+
sessionId: MaybeRefOrGetter<string>;
|
|
75
|
+
/** 本轮模型是否正在生成。决定抢话时要不要 onCancelTurn(响应式) */
|
|
76
|
+
running: MaybeRefOrGetter<boolean>;
|
|
77
|
+
/** 覆盖默认 /api/voice;仍会再被 /config 返回值纠正 */
|
|
78
|
+
apiBase?: string;
|
|
79
|
+
getAuthHeaders?: () => Record<string, string>;
|
|
80
|
+
/** 正式识别文本。模块已处理「空草稿直接写入 / 非空则尾部加空格再拼接」 */
|
|
81
|
+
onTranscript: (text: string) => void;
|
|
82
|
+
/** 长按松开后的自动发送;点按模式仅当 config.asr.autoSend 为 true */
|
|
83
|
+
onSubmit: () => void;
|
|
84
|
+
/** 取消聊天生成。抢话且 running 时调用一次 */
|
|
85
|
+
onCancelTurn: () => void;
|
|
86
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Ref } from 'vue';
|
|
2
|
+
import { PlaybackEngine } from './playback';
|
|
3
|
+
import { AsrConfig, AsrEngine, AsrState, UseVoiceOptions } from './types';
|
|
4
|
+
|
|
5
|
+
export declare const VOICE_CONTEXT_KEY: symbol;
|
|
6
|
+
export interface VoiceContext {
|
|
7
|
+
engine: Ref<AsrEngine | null>;
|
|
8
|
+
playback: Ref<PlaybackEngine | null>;
|
|
9
|
+
config: Ref<AsrConfig | null>;
|
|
10
|
+
asrState: Ref<AsrState>;
|
|
11
|
+
/** 协议/后端错误(config 拉取失败、modelReady=false 等),UI 必须优先展示 */
|
|
12
|
+
error: Ref<string | null>;
|
|
13
|
+
/** 长按松开后下一段正式识别结果自动 submit(hold 语义) */
|
|
14
|
+
requestSubmitOnNextSegment: () => void;
|
|
15
|
+
/** skip 播放并通知后端丢队列(CaptionBar 的 skip 按钮用) */
|
|
16
|
+
skipPlayback: () => void;
|
|
17
|
+
/**
|
|
18
|
+
* 喂入助手文本驱动 TTS 朗读(POST {base}/speak,fire-and-forget)。
|
|
19
|
+
* 增量调用:分段喂入,isFinal=true 时冲刷分句尾巴(PRD 第 6.6 节)。
|
|
20
|
+
*/
|
|
21
|
+
speak: (text: string, isFinal?: boolean) => void;
|
|
22
|
+
}
|
|
23
|
+
export declare function useVoiceContext(): VoiceContext;
|
|
24
|
+
export declare function useVoice(options: UseVoiceOptions): {
|
|
25
|
+
asrState: Ref<AsrState>;
|
|
26
|
+
error: Ref<string | null>;
|
|
27
|
+
dispose: () => void;
|
|
28
|
+
speak: (text: string, isFinal?: boolean) => void;
|
|
29
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -66,6 +66,23 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
|
|
|
66
66
|
/**
|
|
67
67
|
* 是否显示上传音频/视频识别入口,默认关闭
|
|
68
68
|
*/
|
|
69
|
+
/**
|
|
70
|
+
* 全双工语音(gateway-openai /api/voice):识别填入输入框,助手回复朗读。
|
|
71
|
+
* 默认关闭以向后兼容;voiceApiBase 留空用默认 /api/voice。
|
|
72
|
+
*/
|
|
73
|
+
enableDuplexVoice: {
|
|
74
|
+
type: BooleanConstructor;
|
|
75
|
+
default: boolean;
|
|
76
|
+
};
|
|
77
|
+
voiceApiBase: {
|
|
78
|
+
type: StringConstructor;
|
|
79
|
+
default: string;
|
|
80
|
+
};
|
|
81
|
+
/** 朗读助手回复(TTS),默认关闭;运行时切换即时生效 */
|
|
82
|
+
enableVoiceTts: {
|
|
83
|
+
type: BooleanConstructor;
|
|
84
|
+
default: boolean;
|
|
85
|
+
};
|
|
69
86
|
enableVoiceUpload: {
|
|
70
87
|
type: BooleanConstructor;
|
|
71
88
|
default: boolean;
|
|
@@ -163,6 +180,23 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
|
|
|
163
180
|
/**
|
|
164
181
|
* 是否显示上传音频/视频识别入口,默认关闭
|
|
165
182
|
*/
|
|
183
|
+
/**
|
|
184
|
+
* 全双工语音(gateway-openai /api/voice):识别填入输入框,助手回复朗读。
|
|
185
|
+
* 默认关闭以向后兼容;voiceApiBase 留空用默认 /api/voice。
|
|
186
|
+
*/
|
|
187
|
+
enableDuplexVoice: {
|
|
188
|
+
type: BooleanConstructor;
|
|
189
|
+
default: boolean;
|
|
190
|
+
};
|
|
191
|
+
voiceApiBase: {
|
|
192
|
+
type: StringConstructor;
|
|
193
|
+
default: string;
|
|
194
|
+
};
|
|
195
|
+
/** 朗读助手回复(TTS),默认关闭;运行时切换即时生效 */
|
|
196
|
+
enableVoiceTts: {
|
|
197
|
+
type: BooleanConstructor;
|
|
198
|
+
default: boolean;
|
|
199
|
+
};
|
|
166
200
|
enableVoiceUpload: {
|
|
167
201
|
type: BooleanConstructor;
|
|
168
202
|
default: boolean;
|
|
@@ -203,6 +237,9 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
|
|
|
203
237
|
soundBaseUrl: string;
|
|
204
238
|
workerUrl: string;
|
|
205
239
|
enableVoiceInput: boolean;
|
|
240
|
+
enableDuplexVoice: boolean;
|
|
241
|
+
voiceApiBase: string;
|
|
242
|
+
enableVoiceTts: boolean;
|
|
206
243
|
enableVoiceUpload: boolean;
|
|
207
244
|
customUi: Record<string, any>;
|
|
208
245
|
uiActionHandler: Function;
|
|
@@ -66,6 +66,23 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
|
|
|
66
66
|
/**
|
|
67
67
|
* 是否显示上传音频/视频识别入口,默认关闭
|
|
68
68
|
*/
|
|
69
|
+
/**
|
|
70
|
+
* 全双工语音(gateway-openai /api/voice):识别填入输入框,助手回复朗读。
|
|
71
|
+
* 默认关闭以向后兼容;voiceApiBase 留空用默认 /api/voice。
|
|
72
|
+
*/
|
|
73
|
+
enableDuplexVoice: {
|
|
74
|
+
type: BooleanConstructor;
|
|
75
|
+
default: boolean;
|
|
76
|
+
};
|
|
77
|
+
voiceApiBase: {
|
|
78
|
+
type: StringConstructor;
|
|
79
|
+
default: string;
|
|
80
|
+
};
|
|
81
|
+
/** 朗读助手回复(TTS),默认关闭;运行时切换即时生效 */
|
|
82
|
+
enableVoiceTts: {
|
|
83
|
+
type: BooleanConstructor;
|
|
84
|
+
default: boolean;
|
|
85
|
+
};
|
|
69
86
|
enableVoiceUpload: {
|
|
70
87
|
type: BooleanConstructor;
|
|
71
88
|
default: boolean;
|
|
@@ -164,6 +181,23 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
|
|
|
164
181
|
/**
|
|
165
182
|
* 是否显示上传音频/视频识别入口,默认关闭
|
|
166
183
|
*/
|
|
184
|
+
/**
|
|
185
|
+
* 全双工语音(gateway-openai /api/voice):识别填入输入框,助手回复朗读。
|
|
186
|
+
* 默认关闭以向后兼容;voiceApiBase 留空用默认 /api/voice。
|
|
187
|
+
*/
|
|
188
|
+
enableDuplexVoice: {
|
|
189
|
+
type: BooleanConstructor;
|
|
190
|
+
default: boolean;
|
|
191
|
+
};
|
|
192
|
+
voiceApiBase: {
|
|
193
|
+
type: StringConstructor;
|
|
194
|
+
default: string;
|
|
195
|
+
};
|
|
196
|
+
/** 朗读助手回复(TTS),默认关闭;运行时切换即时生效 */
|
|
197
|
+
enableVoiceTts: {
|
|
198
|
+
type: BooleanConstructor;
|
|
199
|
+
default: boolean;
|
|
200
|
+
};
|
|
167
201
|
enableVoiceUpload: {
|
|
168
202
|
type: BooleanConstructor;
|
|
169
203
|
default: boolean;
|
|
@@ -205,6 +239,9 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
|
|
|
205
239
|
soundBaseUrl: string;
|
|
206
240
|
workerUrl: string;
|
|
207
241
|
enableVoiceInput: boolean;
|
|
242
|
+
enableDuplexVoice: boolean;
|
|
243
|
+
voiceApiBase: string;
|
|
244
|
+
enableVoiceTts: boolean;
|
|
208
245
|
enableVoiceUpload: boolean;
|
|
209
246
|
customUi: Record<string, any>;
|
|
210
247
|
uiActionHandler: Function;
|
package/dist/style.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
@charset "UTF-8";.svg-icon-wrapper[data-v-490b11c1]{position:relative;overflow:hidden;vertical-align:middle}.svg-icon[data-v-490b11c1]{width:1em;height:1em;fill:currentColor;vertical-align:middle;display:inline-block}.ai-copy-btn-wrapper{cursor:pointer;width:74px;height:24px;border-radius:12px;box-sizing:border-box;padding:10px 14px;border:1px solid #D9D9D9;display:flex;align-items:center;justify-content:center;font-size:12px;color:#666;line-height:20px;text-align:justify;margin-top:6px}.ai-copy-btn-wrapper .copy-text{margin-left:4px}.ai-thinking-block{margin-bottom:10px;border:1px solid #E8E8E8;border-radius:6px;background:#fafafa;overflow:hidden}.ai-thinking-block .thinking-header{display:flex;align-items:center;gap:6px;padding:7px 10px;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:12px;color:#666;transition:background-color .2s ease}.ai-thinking-block .thinking-header:hover{background-color:#f0f7ff;color:#1677ff}.ai-thinking-block .thinking-header:hover .thinking-toggle-hint{color:#1677ff}.ai-thinking-block .thinking-header .thinking-arrow{flex-shrink:0;transition:transform .2s ease}.ai-thinking-block .thinking-header .thinking-title{flex:1;text-align:left;font-weight:500;line-height:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ai-thinking-block .thinking-header .thinking-toggle-hint{flex-shrink:0;color:#999}.ai-thinking-block.is-expanded .thinking-arrow{transform:rotate(90deg)}.ai-thinking-block.is-streaming{border-color:#bae0ff;background:linear-gradient(135deg,#f0f7ff,#e6f4ff)}.ai-thinking-block.is-streaming .thinking-header .thinking-title{color:#1677ff;animation:thinking-breathe 1.2s ease-in-out infinite}.ai-thinking-block .thinking-body{max-height:280px;overflow-y:auto;padding:8px 12px 10px;border-top:1px dashed #E8E8E8;font-size:13px;color:#8c8c8c;line-height:1.6;word-break:break-word}.ai-thinking-block .thinking-body p{margin:0 0 4px}.ai-thinking-block .thinking-body p:last-child{margin-bottom:0}@keyframes thinking-breathe{0%,to{opacity:1}50%{opacity:.55}}.markdown-wrapper{font-size:14px;line-height:1.75;color:#333;word-break:break-word}.markdown-wrapper p{margin:0 0 10px}.markdown-wrapper p:last-child{margin-bottom:0}.markdown-wrapper h1,.markdown-wrapper h2,.markdown-wrapper h3,.markdown-wrapper h4,.markdown-wrapper h5,.markdown-wrapper h6{margin:14px 0 10px;font-weight:600;line-height:1.4}.markdown-wrapper h1:first-child,.markdown-wrapper h2:first-child,.markdown-wrapper h3:first-child,.markdown-wrapper h4:first-child,.markdown-wrapper h5:first-child,.markdown-wrapper h6:first-child{margin-top:0}.markdown-wrapper h1{font-size:18px}.markdown-wrapper h2{font-size:17px}.markdown-wrapper h3{font-size:16px}.markdown-wrapper h4,.markdown-wrapper h5,.markdown-wrapper h6{font-size:15px}.markdown-wrapper ul,.markdown-wrapper ol{margin:0 0 10px;padding-left:1.5em}.markdown-wrapper ul:last-child,.markdown-wrapper ol:last-child{margin-bottom:0}.markdown-wrapper li{margin:4px 0;line-height:1.7}.markdown-wrapper li>p{margin:0;line-height:1.7}.markdown-wrapper hr{margin:14px 0;border:none;border-top:1px solid #e8e8e8}.markdown-wrapper a{color:#536fec;font-weight:bolder;text-decoration:underline;padding:0 3px}.markdown-wrapper strong{font-weight:600}.markdown-wrapper code{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace}.markdown-wrapper p>code,.markdown-wrapper li>code,.markdown-wrapper td>code{background:#536fec14;color:#4761c6;padding:2px 6px;border-radius:4px;font-size:12.5px;white-space:pre-wrap}.markdown-wrapper pre.md-code-block{margin:0 0 10px;padding:12px 14px;background:#f6f8fa;border:1px solid #e8ecf2;border-radius:8px;overflow:auto;max-height:380px;font-size:12.5px;line-height:1.6}.markdown-wrapper pre.md-code-block:last-child{margin-bottom:0}.markdown-wrapper pre.md-code-block code{display:block;padding:0;background:transparent;color:#333;white-space:pre;font-size:inherit;line-height:inherit}.markdown-wrapper blockquote{padding:10px 14px;margin:10px 0;border-left:4px solid #c9d4f0;background-color:#f7f9fd;border-radius:0 6px 6px 0;color:#555}.markdown-wrapper blockquote>p{margin:0}.markdown-wrapper table{width:100%;margin:10px 0;border-collapse:collapse;font-size:13px}.markdown-wrapper table th,.markdown-wrapper table td{border:1px solid #e0e6ef;padding:6px 10px;text-align:left}.markdown-wrapper table th{background:#f2f5fa;font-weight:600}.markdown-wrapper table tr:nth-child(2n) td{background:#fafbfd}.markdown-wrapper img{display:inline-block;max-width:100%}.szjy-ui{margin:10px 0;font-size:14px}.szjy-ui:last-child{margin-bottom:0}.szjy-ui-list__title{font-weight:600;font-size:13.5px;color:#333;margin-bottom:8px;line-height:20px}.szjy-ui-list__items{display:flex;flex-direction:column;align-items:stretch}.szjy-ui-list__item{display:block}.szjy-ui-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;box-sizing:border-box;width:100%;padding:7px 14px;border-radius:6px;border:1px solid #dcdfe6;background:#fff;color:#606266;font-size:13.5px;line-height:20px;font-family:inherit;cursor:pointer;transition:border-color .15s ease,background-color .15s ease,color .15s ease,opacity .15s ease}.szjy-ui-btn:hover:not(:disabled),.szjy-ui-btn:focus-visible:not(:disabled){border-color:#536fec;color:#536fec;outline:none}.szjy-ui-btn:disabled{cursor:not-allowed;opacity:.55}.szjy-ui-btn--small{padding:4px 10px;font-size:12.5px}.szjy-ui-btn--large{padding:10px 16px;font-size:14.5px}.szjy-ui-btn--primary{background:#409eff;border-color:#409eff;color:#fff}.szjy-ui-btn--primary:hover:not(:disabled),.szjy-ui-btn--primary:focus-visible:not(:disabled){background:#66b1ff;border-color:#66b1ff;color:#fff}.szjy-ui-btn--success{background:#67c23a;border-color:#67c23a;color:#fff}.szjy-ui-btn--success:hover:not(:disabled){background:#85ce61;border-color:#85ce61;color:#fff}.szjy-ui-btn--warning{background:#e6a23c;border-color:#e6a23c;color:#fff}.szjy-ui-btn--warning:hover:not(:disabled){background:#ebb563;border-color:#ebb563;color:#fff}.szjy-ui-btn--danger{background:#f56c6c;border-color:#f56c6c;color:#fff}.szjy-ui-btn--danger:hover:not(:disabled){background:#f78989;border-color:#f78989;color:#fff}.szjy-ui-btn--info{background:#909399;border-color:#909399;color:#fff}.szjy-ui-btn--info:hover:not(:disabled){background:#a6a9ad;border-color:#a6a9ad;color:#fff}.szjy-ui-btn--text{border-color:transparent;background:transparent;color:#536fec;padding-left:6px;padding-right:6px}.szjy-ui-btn--text:hover:not(:disabled){color:#7a8cf5;background:#536fec0f}.szjy-ui-btn__status{font-size:12px;line-height:18px;color:inherit;opacity:.85;text-align:left;word-break:break-all}.szjy-ui-btn__status:empty{display:none}.szjy-ui-btn.is-loading .szjy-ui-btn__status{opacity:.65}.szjy-ui-btn.is-success{border-color:#b3e19d}.szjy-ui-btn.is-success .szjy-ui-btn__status{color:#5daf34;opacity:1}.szjy-ui-btn.is-success.szjy-ui-btn--primary .szjy-ui-btn__status,.szjy-ui-btn.is-success.szjy-ui-btn--success .szjy-ui-btn__status,.szjy-ui-btn.is-success.szjy-ui-btn--warning .szjy-ui-btn__status,.szjy-ui-btn.is-success.szjy-ui-btn--danger .szjy-ui-btn__status,.szjy-ui-btn.is-success.szjy-ui-btn--info .szjy-ui-btn__status{color:#f3f9ee}.szjy-ui-btn.is-error{border-color:#fbc4c4}.szjy-ui-btn.is-error .szjy-ui-btn__status{color:#f56c6c;opacity:1}.szjy-ui-btn.is-error.szjy-ui-btn--primary .szjy-ui-btn__status,.szjy-ui-btn.is-error.szjy-ui-btn--success .szjy-ui-btn__status,.szjy-ui-btn.is-error.szjy-ui-btn--warning .szjy-ui-btn__status,.szjy-ui-btn.is-error.szjy-ui-btn--danger .szjy-ui-btn__status,.szjy-ui-btn.is-error.szjy-ui-btn--info .szjy-ui-btn__status{color:#fde2e2}.szjy-ui-btn.is-retrying .szjy-ui-btn__status{color:#b88230;opacity:1}/*!
|
|
1
|
+
@charset "UTF-8";.svg-icon-wrapper[data-v-490b11c1]{position:relative;overflow:hidden;vertical-align:middle}.svg-icon[data-v-490b11c1]{width:1em;height:1em;fill:currentColor;vertical-align:middle;display:inline-block}.ai-copy-btn-wrapper{cursor:pointer;display:inline-flex;align-items:center;white-space:nowrap;height:24px;padding:0 12px;border-radius:12px;box-sizing:border-box;border:1px solid #D9D9D9;font-size:12px;color:#666;line-height:1;margin-top:6px}.ai-copy-btn-wrapper .copy-text{margin-left:4px}.ai-thinking-block{margin-bottom:10px;border:1px solid #E8E8E8;border-radius:6px;background:#fafafa;overflow:hidden}.ai-thinking-block .thinking-header{display:flex;align-items:center;gap:6px;padding:7px 10px;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:12px;color:#666;transition:background-color .2s ease}.ai-thinking-block .thinking-header:hover{background-color:#f0f7ff;color:#1677ff}.ai-thinking-block .thinking-header:hover .thinking-toggle-hint{color:#1677ff}.ai-thinking-block .thinking-header .thinking-arrow{flex-shrink:0;transition:transform .2s ease}.ai-thinking-block .thinking-header .thinking-title{flex:1;text-align:left;font-weight:500;line-height:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ai-thinking-block .thinking-header .thinking-toggle-hint{flex-shrink:0;color:#999}.ai-thinking-block.is-expanded .thinking-arrow{transform:rotate(90deg)}.ai-thinking-block.is-streaming{border-color:#bae0ff;background:linear-gradient(135deg,#f0f7ff,#e6f4ff)}.ai-thinking-block.is-streaming .thinking-header .thinking-title{color:#1677ff;animation:thinking-breathe 1.2s ease-in-out infinite}.ai-thinking-block .thinking-body{max-height:280px;overflow-y:auto;padding:8px 12px 10px;border-top:1px dashed #E8E8E8;font-size:13px;color:#8c8c8c;line-height:1.6;word-break:break-word}.ai-thinking-block .thinking-body p{margin:0 0 4px}.ai-thinking-block .thinking-body p:last-child{margin-bottom:0}@keyframes thinking-breathe{0%,to{opacity:1}50%{opacity:.55}}.markdown-wrapper{font-size:14px;line-height:1.75;color:#333;word-break:break-word}.markdown-wrapper p{margin:0 0 10px}.markdown-wrapper p:last-child{margin-bottom:0}.markdown-wrapper h1,.markdown-wrapper h2,.markdown-wrapper h3,.markdown-wrapper h4,.markdown-wrapper h5,.markdown-wrapper h6{margin:14px 0 10px;font-weight:600;line-height:1.4}.markdown-wrapper h1:first-child,.markdown-wrapper h2:first-child,.markdown-wrapper h3:first-child,.markdown-wrapper h4:first-child,.markdown-wrapper h5:first-child,.markdown-wrapper h6:first-child{margin-top:0}.markdown-wrapper h1{font-size:18px}.markdown-wrapper h2{font-size:17px}.markdown-wrapper h3{font-size:16px}.markdown-wrapper h4,.markdown-wrapper h5,.markdown-wrapper h6{font-size:15px}.markdown-wrapper ul,.markdown-wrapper ol{margin:0 0 10px;padding-left:1.5em}.markdown-wrapper ul:last-child,.markdown-wrapper ol:last-child{margin-bottom:0}.markdown-wrapper li{margin:4px 0;line-height:1.7}.markdown-wrapper li>p{margin:0;line-height:1.7}.markdown-wrapper hr{margin:14px 0;border:none;border-top:1px solid #e8e8e8}.markdown-wrapper a{color:#536fec;font-weight:bolder;text-decoration:underline;padding:0 3px}.markdown-wrapper strong{font-weight:600}.markdown-wrapper code{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace}.markdown-wrapper p>code,.markdown-wrapper li>code,.markdown-wrapper td>code{background:#536fec14;color:#4761c6;padding:2px 6px;border-radius:4px;font-size:12.5px;white-space:pre-wrap}.markdown-wrapper pre.md-code-block{margin:0 0 10px;padding:12px 14px;background:#f6f8fa;border:1px solid #e8ecf2;border-radius:8px;overflow:auto;max-height:380px;font-size:12.5px;line-height:1.6}.markdown-wrapper pre.md-code-block:last-child{margin-bottom:0}.markdown-wrapper pre.md-code-block code{display:block;padding:0;background:transparent;color:#333;white-space:pre;font-size:inherit;line-height:inherit}.markdown-wrapper blockquote{padding:10px 14px;margin:10px 0;border-left:4px solid #c9d4f0;background-color:#f7f9fd;border-radius:0 6px 6px 0;color:#555}.markdown-wrapper blockquote>p{margin:0}.markdown-wrapper table{width:100%;margin:10px 0;border-collapse:collapse;font-size:13px}.markdown-wrapper table th,.markdown-wrapper table td{border:1px solid #e0e6ef;padding:6px 10px;text-align:left}.markdown-wrapper table th{background:#f2f5fa;font-weight:600}.markdown-wrapper table tr:nth-child(2n) td{background:#fafbfd}.markdown-wrapper img{display:inline-block;max-width:100%}.szjy-ui{margin:10px 0;font-size:14px}.szjy-ui:last-child{margin-bottom:0}.szjy-ui-list__title{font-weight:600;font-size:13.5px;color:#333;margin-bottom:8px;line-height:20px}.szjy-ui-list__items{display:flex;flex-direction:column;align-items:stretch}.szjy-ui-list__item{display:block}.szjy-ui-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;box-sizing:border-box;width:100%;padding:7px 14px;border-radius:6px;border:1px solid #dcdfe6;background:#fff;color:#606266;font-size:13.5px;line-height:20px;font-family:inherit;cursor:pointer;transition:border-color .15s ease,background-color .15s ease,color .15s ease,opacity .15s ease}.szjy-ui-btn:hover:not(:disabled),.szjy-ui-btn:focus-visible:not(:disabled){border-color:#536fec;color:#536fec;outline:none}.szjy-ui-btn:disabled{cursor:not-allowed;opacity:.55}.szjy-ui-btn--small{padding:4px 10px;font-size:12.5px}.szjy-ui-btn--large{padding:10px 16px;font-size:14.5px}.szjy-ui-btn--primary{background:#409eff;border-color:#409eff;color:#fff}.szjy-ui-btn--primary:hover:not(:disabled),.szjy-ui-btn--primary:focus-visible:not(:disabled){background:#66b1ff;border-color:#66b1ff;color:#fff}.szjy-ui-btn--success{background:#67c23a;border-color:#67c23a;color:#fff}.szjy-ui-btn--success:hover:not(:disabled){background:#85ce61;border-color:#85ce61;color:#fff}.szjy-ui-btn--warning{background:#e6a23c;border-color:#e6a23c;color:#fff}.szjy-ui-btn--warning:hover:not(:disabled){background:#ebb563;border-color:#ebb563;color:#fff}.szjy-ui-btn--danger{background:#f56c6c;border-color:#f56c6c;color:#fff}.szjy-ui-btn--danger:hover:not(:disabled){background:#f78989;border-color:#f78989;color:#fff}.szjy-ui-btn--info{background:#909399;border-color:#909399;color:#fff}.szjy-ui-btn--info:hover:not(:disabled){background:#a6a9ad;border-color:#a6a9ad;color:#fff}.szjy-ui-btn--text{border-color:transparent;background:transparent;color:#536fec;padding-left:6px;padding-right:6px}.szjy-ui-btn--text:hover:not(:disabled){color:#7a8cf5;background:#536fec0f}.szjy-ui-btn__status{font-size:12px;line-height:18px;color:inherit;opacity:.85;text-align:left;word-break:break-all}.szjy-ui-btn__status:empty{display:none}.szjy-ui-btn.is-loading .szjy-ui-btn__status{opacity:.65}.szjy-ui-btn.is-success{border-color:#b3e19d}.szjy-ui-btn.is-success .szjy-ui-btn__status{color:#5daf34;opacity:1}.szjy-ui-btn.is-success.szjy-ui-btn--primary .szjy-ui-btn__status,.szjy-ui-btn.is-success.szjy-ui-btn--success .szjy-ui-btn__status,.szjy-ui-btn.is-success.szjy-ui-btn--warning .szjy-ui-btn__status,.szjy-ui-btn.is-success.szjy-ui-btn--danger .szjy-ui-btn__status,.szjy-ui-btn.is-success.szjy-ui-btn--info .szjy-ui-btn__status{color:#f3f9ee}.szjy-ui-btn.is-error{border-color:#fbc4c4}.szjy-ui-btn.is-error .szjy-ui-btn__status{color:#f56c6c;opacity:1}.szjy-ui-btn.is-error.szjy-ui-btn--primary .szjy-ui-btn__status,.szjy-ui-btn.is-error.szjy-ui-btn--success .szjy-ui-btn__status,.szjy-ui-btn.is-error.szjy-ui-btn--warning .szjy-ui-btn__status,.szjy-ui-btn.is-error.szjy-ui-btn--danger .szjy-ui-btn__status,.szjy-ui-btn.is-error.szjy-ui-btn--info .szjy-ui-btn__status{color:#fde2e2}.szjy-ui-btn.is-retrying .szjy-ui-btn__status{color:#b88230;opacity:1}@keyframes szjyv-fadein{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}@keyframes szjyv-eq{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes szjyv-spin{to{transform:rotate(360deg)}}@keyframes szjyv-pulse{0%{box-shadow:0 0 #f8514973}70%{box-shadow:0 0 0 6px transparent}to{box-shadow:0 0 0 0 transparent}}@keyframes szjyv-ptt-in{0%{opacity:0;transform:translateY(10px) scale(.96)}to{opacity:1;transform:none}}@keyframes szjyv-blink{50%{opacity:0}}.szjyv-spin{display:inline-block;width:10px;height:10px;margin-right:6px;vertical-align:-1px;border-radius:999px;border:2px solid rgba(88,166,255,.25);border-top-color:#58a6ff;animation:szjyv-spin .7s linear infinite;flex-shrink:0}.szjyv-eq{display:inline-flex;align-items:flex-end;gap:2px;flex-shrink:0}.szjyv-eq span{width:3px;height:100%;border-radius:99px;transform-origin:bottom;animation:szjyv-eq .85s ease-in-out infinite}.szjyv-mic{touch-action:none;border:none;background:transparent;cursor:pointer;padding:4px 8px;border-radius:8px;display:flex;align-items:center;gap:6px;font-size:11px;font-family:system-ui,sans-serif;color:#8b949e;transition:background .15s ease,color .2s ease}.szjyv-mic:hover{background:#8b949e24}.szjyv-mic-dot{width:10px;height:10px;border-radius:999px;display:inline-block;flex-shrink:0;transition:background .2s ease}.szjyv-mic-dot.pulse{animation:szjyv-pulse 1.2s ease-out infinite}.szjyv-ptt-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:9999;display:flex;align-items:flex-end;justify-content:center;padding-bottom:96px;pointer-events:none;background:linear-gradient(to top,rgba(1,4,9,.55),transparent 45%)}.szjyv-ptt-card{display:flex;flex-direction:column;align-items:center;gap:12px;padding:18px 26px 14px;border-radius:18px;background:#161b22eb;backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid rgba(63,185,80,.35);box-shadow:0 12px 40px #00000080;animation:szjyv-ptt-in .18s cubic-bezier(.16,1,.3,1);transition:border-color .2s ease}.szjyv-ptt-card.cancel{border-color:#f8514980}.szjyv-ptt-wave{display:flex;align-items:center;gap:3px;height:40px}.szjyv-ptt-wave.frozen .szjyv-ptt-bar{opacity:.22!important}.szjyv-ptt-bar{width:3px;border-radius:99px;transition:height .08s linear,background .2s ease,opacity .08s linear}.szjyv-ptt-hint{font-size:12px;font-weight:500;letter-spacing:.02em;font-family:-apple-system,system-ui,sans-serif;transition:color .2s ease}.szjyv-ptt-live{max-width:340px;font-size:13.5px;line-height:1.5;text-align:center;word-break:break-word;color:#e6edf3;font-family:-apple-system,system-ui,sans-serif;animation:szjyv-fadein .18s ease}.szjyv-ptt-live.stale{color:#8b949e}.szjyv-ptt-caret{display:inline-block;width:2px;height:1em;margin-left:3px;vertical-align:-.15em;background:#3fb950;animation:szjyv-blink 1s steps(1) infinite}.szjyv-kbd{display:inline-block;margin:0 2px;padding:0 5px;border-radius:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;color:#c9d1d9;background:#ffffff17;border:1px solid rgba(255,255,255,.16)}.szjyv-toast{position:fixed;left:50%;bottom:104px;z-index:10001;transform:translate(-50%);max-width:460px;padding:9px 16px;border-radius:10px;font-family:-apple-system,system-ui,sans-serif;font-size:12px;line-height:1.5;color:#ffdcd7;background:#2d1111f0;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid rgba(248,81,73,.45);box-shadow:0 8px 26px #00000073;animation:szjyv-ptt-in .2s cubic-bezier(.16,1,.3,1);pointer-events:none}.szjyv-captionbar{position:fixed;right:16px;bottom:16px;z-index:9999;display:flex;align-items:center;gap:10px;padding:8px 14px;border-radius:999px;font-size:12px;font-family:system-ui,sans-serif;pointer-events:auto;background:#16181cd9;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid rgba(255,255,255,.08);box-shadow:0 8px 28px #0006;color:#e6e8eb;max-width:480px;animation:szjyv-fadein .25s ease}.szjyv-caption-dot{width:8px;height:8px;border-radius:999px;flex-shrink:0;transition:background .2s ease}.szjyv-caption-dot.offline{animation:szjyv-pulse 1.6s ease-out infinite}.szjyv-caption-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;animation:szjyv-fadein .2s ease}.szjyv-skip{border:none;background:#ffffff24;color:#fff;border-radius:999px;padding:3px 12px;font-size:11px;cursor:pointer;flex-shrink:0;transition:background .15s ease}.szjyv-skip:hover{background:#ffffff42}/*!
|
|
2
2
|
Theme: Default
|
|
3
3
|
Description: Original highlight.js style
|
|
4
4
|
Author: (c) Ivan Sagalaev <maniac@softwaremaniacs.org>
|
|
@@ -6,4 +6,4 @@
|
|
|
6
6
|
Website: https://highlightjs.org/
|
|
7
7
|
License: see project LICENSE
|
|
8
8
|
Touched: 2021
|
|
9
|
-
*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#f3f3f3;color:#444}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.slide-enter-active,.slide-leave-active{transition:transform .3s ease}.slide-enter-from,.slide-leave-to{transform:translate(30px)}.ai-panel{margin-right:20px;width:400px;height:804px;background:#fff;border-radius:8px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;overflow:hidden;background-image:url(/images/ai-panel-bg.png);background-size:100% auto;background-position:top;background-repeat:no-repeat;position:relative;transition:all .3s ease}.ai-panel .el-input,.ai-panel .el-textarea{--el-input-text-color: #333333;--el-input-placeholder-color: #a8abb2;--el-input-bg-color: #ffffff}.ai-panel .el-input__inner,.ai-panel .el-textarea__inner{color:#333}.ai-panel .el-input__inner::placeholder,.ai-panel .el-textarea__inner::placeholder{color:#a8abb2}.ai-panel :deep(.el-input-group__append){box-sizing:border-box}.ai-panel.drawer-mode{position:fixed;right:0;top:0;bottom:0;height:100vh;margin:0;border-radius:0;z-index:2000}.ai-panel.embedded-mode{width:100%;height:100%;margin:0;box-shadow:none;border-radius:0}.ai-panel .panel-header{padding:20px;background:transparent}.ai-panel .panel-header .header-actions{display:flex;justify-content:space-between;gap:12px;align-items:center}.ai-panel .panel-header .header-actions .header-title{font-family:PingFangSC,PingFang SC;font-weight:700;font-size:16px;color:#333;line-height:24px;text-align:left;font-style:normal}.ai-panel .panel-header .header-actions .action-icons{display:flex;gap:12px}.ai-panel .panel-header .header-actions .action-icon{font-size:20px;color:#666;cursor:pointer}.ai-panel .panel-header .header-actions .action-icon:hover{color:#333}.ai-panel .body-content{flex:1;overflow:hidden;padding:20px;display:flex;flex-direction:column}.ai-panel .body-content .welcome-content .title{display:flex;flex-direction:column;align-items:center;margin-bottom:8px}.ai-panel .body-content .welcome-content .title .panel-icon{width:64px;height:64px;margin-bottom:16px}.ai-panel .body-content .welcome-content .title .title-text{margin:0;font-size:24px;color:#333;font-weight:500}.ai-panel .body-content .welcome-content .subtitle{text-align:center;font-size:28px;color:#333;line-height:36px;letter-spacing:2px;margin-bottom:20px}.ai-panel .body-content .welcome-content .subtitle .highlight{margin-left:2px;background:linear-gradient(270deg,#e236ffcc,#0a84ff);-webkit-background-clip:text;color:transparent;font-weight:bolder}.ai-panel .body-content .quick-questions .question-item{padding:12px 16px;background:#f5f7fa;border-radius:8px;margin-bottom:12px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:all .3s}.ai-panel .body-content .quick-questions .question-item:hover{background:#e8f4ff;transform:translate(4px)}.ai-panel .body-content .quick-questions .question-item span{font-size:14px;color:#333}.ai-panel .body-content .quick-questions .question-item .el-icon{color:#666}.ai-panel .body-content .chat-messages{flex:1;overflow-y:auto;overflow-x:hidden;height:100%;display:flex;flex-direction:column}.ai-panel .body-content .chat-messages::-webkit-scrollbar{width:0;background:transparent}.ai-panel .body-content .chat-messages{scrollbar-width:none;-ms-overflow-style:none}.ai-panel .body-content .chat-messages .message-item{display:flex;align-items:flex-start;margin-bottom:20px;gap:12px}.ai-panel .body-content .chat-messages .message-item .message-avatar{width:40px;height:40px;border-radius:20px;flex-shrink:0}.ai-panel .body-content .chat-messages .message-item .user-avatar{background:#0a84ff;color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px}.ai-panel .body-content .chat-messages .message-item .message-content{padding:12px 16px;border-radius:2px;max-width:70%;word-break:break-word}.ai-panel .body-content .chat-messages .message-item.ai-message .message-content{background:#f5f7fa;font-size:14px}.ai-panel .body-content .chat-messages .message-item.user-message{flex-direction:row-reverse}.ai-panel .body-content .chat-messages .message-item.user-message .message-content{background:#f1f2f3;border-radius:4px 4px 0;color:#333;font-size:14px}.ai-panel .panel-footer{padding:24px;background:#fff;position:relative}.ai-panel .panel-footer .loading-icon{position:absolute;top:-13px}.ai-panel .panel-footer .voice-progress-banner{margin-bottom:12px;padding:10px 14px;background:linear-gradient(135deg,#f0f7ff,#e6f4ff);border:1px solid #bae0ff;border-radius:8px;display:flex;flex-direction:column;gap:6px}.ai-panel .panel-footer .voice-progress-banner .progress-info{display:flex;align-items:center;gap:8px;font-size:13px;color:#0958d9}.ai-panel .panel-footer .voice-progress-banner .progress-info .progress-icon{font-size:14px}.ai-panel .panel-footer .voice-progress-banner .progress-info .progress-text{flex:1;font-weight:500}.ai-panel .panel-footer .voice-progress-banner .progress-info .progress-percent{font-weight:700;font-family:monospace}.ai-panel .panel-footer .voice-progress-banner .progress-track{height:6px;background:#d9d9d9;border-radius:3px;overflow:hidden}.ai-panel .panel-footer .voice-progress-banner .progress-track .progress-bar{height:100%;background:linear-gradient(90deg,#1677ff,#4096ff);border-radius:3px;transition:width .2s ease}.ai-panel .panel-footer .voice-recording-panel{min-height:44px;padding:8px 14px;background:linear-gradient(135deg,#f6ffed,#e6f7ff);border:1px solid #91caff;border-radius:6px;display:flex;flex-direction:column;gap:8px;box-shadow:0 2px 8px #1677ff14}.ai-panel .panel-footer .voice-recording-panel .recording-main{display:flex;align-items:center;justify-content:space-between;width:100%;min-height:28px}.ai-panel .panel-footer .voice-recording-panel .live-transcript{width:100%;max-height:72px;overflow-y:auto;padding:6px 8px;background:#ffffffc7;border-radius:4px;font-size:13px;line-height:1.55;color:#1677ff;word-break:break-all}.ai-panel .panel-footer .voice-recording-panel .live-transcript.empty{color:#8c8c8c}.ai-panel .panel-footer .voice-recording-panel .live-transcript .caret{display:inline-block;margin-left:1px;font-weight:400;color:#1677ff;animation:caret-blink 1s step-end infinite}.ai-panel .panel-footer .voice-recording-panel .recording-status{display:flex;align-items:center;gap:8px}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-pulse{width:10px;height:10px;border-radius:50%;background:#ff4d4f;box-shadow:0 0 #ff4d4f66;animation:pulse 1.5s infinite}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-pulse.transcribing{background:#1890ff;box-shadow:0 0 #1890ff66}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-time{font-family:monospace;font-weight:700;font-size:13px;color:#ff4d4f}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-hint{font-size:13px;color:#333}.ai-panel .panel-footer .voice-recording-panel .recording-status .volume-waves{display:flex;align-items:center;gap:3px;height:30px;margin-left:4px}.ai-panel .panel-footer .voice-recording-panel .recording-status .volume-waves .wave{width:3px;background:#1890ff;border-radius:2px;transition:height .08s ease}.ai-panel .panel-footer .voice-recording-panel .recording-actions{display:flex;align-items:center;gap:8px}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-btn{color:#8c8c8c;border-color:#d9d9d9}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-btn:hover{color:#ff4d4f;border-color:#ff4d4f;background:#fff1f0}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-finish-btn{background:#1677ff;border-color:#1677ff;padding:6px 14px;font-weight:500}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-transcribe-btn{color:#666;border-color:#d9d9d9;background:#fff;font-size:12px;padding:4px 10px;height:28px;transition:all .2s}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-transcribe-btn:hover{color:#ff4d4f;border-color:#ff4d4f;background:#fff1f0}.ai-panel .panel-footer .voice-playback-bar{margin-bottom:8px;height:36px;padding:0 12px;background:#f0f7ff;border:1px solid #bae0ff;border-radius:6px;display:flex;align-items:center;justify-content:space-between;transition:all .2s ease}.ai-panel .panel-footer .voice-playback-bar .playback-main{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-play-icon{width:22px;height:22px;border-radius:50%;background:#1677ff;color:#fff;display:flex;align-items:center;justify-content:center;transition:transform .15s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-play-icon:hover{transform:scale(1.1)}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-title{font-size:13px;color:#1677ff;font-weight:500}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-time{font-size:12px;color:#8c8c8c;font-family:monospace}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves{display:flex;align-items:flex-end;gap:2px;height:14px;margin-left:4px}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar{width:2px;background:#1677ff;border-radius:1px;animation:soundWave .8s ease-in-out infinite alternate}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(1){height:6px;animation-delay:0s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(2){height:12px;animation-delay:.2s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(3){height:8px;animation-delay:.4s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(4){height:14px;animation-delay:.1s}.ai-panel .panel-footer .voice-playback-bar .playback-close{cursor:pointer;color:#8c8c8c;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .2s}.ai-panel .panel-footer .voice-playback-bar .playback-close:hover{color:#ff4d4f;background:#fff1f0}.ai-panel .panel-footer .input-box .el-input-group{height:40px;border-radius:4px}.ai-panel .panel-footer .input-box :deep(.el-input__wrapper){box-shadow:none}.ai-panel .panel-footer .input-box :deep(.el-input-group__append){box-shadow:none;background:transparent;padding:8px 12px}.ai-panel .panel-footer .input-box .input-actions-box{display:flex;align-items:center;gap:12px}.ai-panel .panel-footer .input-box .input-actions-box .voice-upload-btn{display:flex;align-items:center;justify-content:center;cursor:pointer;color:#666;transition:all .2s;padding:4px;border-radius:4px}.ai-panel .panel-footer .input-box .input-actions-box .voice-upload-btn:hover{color:#1677ff;background:#f0f7ff;transform:scale(1.08)}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn{display:flex;align-items:center;justify-content:center;cursor:pointer;color:#666;transition:all .2s;padding:4px;border-radius:4px}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn:hover{color:#1677ff;background:#f0f7ff;transform:scale(1.08)}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn.loading-anim{color:#1677ff}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn.loading-anim svg{animation:mic-breathe 1.2s ease-in-out infinite;transform-origin:center}.ai-panel .panel-footer .input-box .input-actions-box .send-icon-box{display:flex;align-items:center;justify-content:center;cursor:pointer}.ai-panel .panel-footer .input-box .el-input-group__append{background-color:transparent}@keyframes soundWave{0%{height:3px}to{height:14px}}@keyframes pulse{0%{box-shadow:0 0 #ff4d4fb3}70%{box-shadow:0 0 0 8px #ff4d4f00}to{box-shadow:0 0 #ff4d4f00}}@keyframes caret-blink{0%,to{opacity:1}50%{opacity:0}}@keyframes mic-breathe{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.22);opacity:.72}}.ai-assistant{box-sizing:border-box;position:fixed;right:20px;bottom:40px;z-index:1000;display:flex;align-items:flex-end}.ai-assistant div{box-sizing:border-box}.ai-assistant .ai-icon{box-sizing:border-box;display:flex;flex-direction:column;align-items:center;cursor:pointer;width:44px;padding:6px;transition:all .3s;height:114px;background-color:#fff;box-shadow:0 4px 16px 4px #00000008,0 2px 8px #0000000d,0 0 4px -2px #00000014;border-radius:22px;border:1px solid transparent;background-image:linear-gradient(#fff,#fff),linear-gradient(180deg,#60fffc,#0a84ff);background-origin:border-box;background-clip:padding-box,border-box}.ai-assistant .ai-icon:hover{transform:translateY(-2px);box-shadow:0 4px 16px #00000026}.ai-assistant .ai-icon img{width:32px;height:32px;margin-bottom:6px}.ai-assistant .ai-icon .ai-icon-text{display:inline-block;width:20px;font-size:16px;line-height:18px;font-weight:700;color:#333}.ai-assistant .ai-icon:hover .close-icon{display:flex}.ai-assistant .ai-icon .close-icon{display:none;position:absolute;top:-6px;right:-6px;width:16px;height:16px;background:#fff;border-radius:50%;align-items:center;justify-content:center;box-shadow:0 2px 4px #0000001a;color:#666;cursor:pointer;z-index:1}.ai-assistant .ai-icon .close-icon:hover{color:#333;background:#f5f5f5}.ai-chat-plain{box-sizing:border-box;position:relative;width:100%;height:100%}.ai-chat-plain div{box-sizing:border-box}
|
|
9
|
+
*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#f3f3f3;color:#444}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.slide-enter-active,.slide-leave-active{transition:transform .3s ease}.slide-enter-from,.slide-leave-to{transform:translate(30px)}.ai-panel{margin-right:20px;width:400px;height:804px;background:#fff;border-radius:8px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;overflow:hidden;background-image:url(/images/ai-panel-bg.png);background-size:100% auto;background-position:top;background-repeat:no-repeat;position:relative;transition:all .3s ease}.ai-panel .el-input,.ai-panel .el-textarea{--el-input-text-color: #333333;--el-input-placeholder-color: #a8abb2;--el-input-bg-color: #ffffff}.ai-panel .el-input__inner,.ai-panel .el-textarea__inner{color:#333}.ai-panel .el-input__inner::placeholder,.ai-panel .el-textarea__inner::placeholder{color:#a8abb2}.ai-panel :deep(.el-input-group__append){box-sizing:border-box}.ai-panel.drawer-mode{position:fixed;right:0;top:0;bottom:0;height:100vh;margin:0;border-radius:0;z-index:2000}.ai-panel.embedded-mode{width:100%;height:100%;margin:0;box-shadow:none;border-radius:0}.ai-panel .panel-header{padding:20px;background:transparent}.ai-panel .panel-header .header-actions{display:flex;justify-content:space-between;gap:12px;align-items:center}.ai-panel .panel-header .header-actions .header-title{font-family:PingFangSC,PingFang SC;font-weight:700;font-size:16px;color:#333;line-height:24px;text-align:left;font-style:normal}.ai-panel .panel-header .header-actions .action-icons{display:flex;gap:12px}.ai-panel .panel-header .header-actions .action-icon{font-size:20px;color:#666;cursor:pointer}.ai-panel .panel-header .header-actions .action-icon:hover{color:#333}.ai-panel .body-content{flex:1;overflow:hidden;padding:20px;display:flex;flex-direction:column}.ai-panel .body-content .welcome-content .title{display:flex;flex-direction:column;align-items:center;margin-bottom:8px}.ai-panel .body-content .welcome-content .title .panel-icon{width:64px;height:64px;margin-bottom:16px}.ai-panel .body-content .welcome-content .title .title-text{margin:0;font-size:24px;color:#333;font-weight:500}.ai-panel .body-content .welcome-content .subtitle{text-align:center;font-size:28px;color:#333;line-height:36px;letter-spacing:2px;margin-bottom:20px}.ai-panel .body-content .welcome-content .subtitle .highlight{margin-left:2px;background:linear-gradient(270deg,#e236ffcc,#0a84ff);-webkit-background-clip:text;color:transparent;font-weight:bolder}.ai-panel .body-content .quick-questions .question-item{padding:12px 16px;background:#f5f7fa;border-radius:8px;margin-bottom:12px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:all .3s}.ai-panel .body-content .quick-questions .question-item:hover{background:#e8f4ff;transform:translate(4px)}.ai-panel .body-content .quick-questions .question-item span{font-size:14px;color:#333}.ai-panel .body-content .quick-questions .question-item .el-icon{color:#666}.ai-panel .body-content .chat-messages{flex:1;overflow-y:auto;overflow-x:hidden;height:100%;display:flex;flex-direction:column}.ai-panel .body-content .chat-messages::-webkit-scrollbar{width:0;background:transparent}.ai-panel .body-content .chat-messages{scrollbar-width:none;-ms-overflow-style:none}.ai-panel .body-content .chat-messages .message-item{display:flex;align-items:flex-start;margin-bottom:20px;gap:12px}.ai-panel .body-content .chat-messages .message-item .message-avatar{width:40px;height:40px;border-radius:20px;flex-shrink:0}.ai-panel .body-content .chat-messages .message-item .user-avatar{background:#0a84ff;color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px}.ai-panel .body-content .chat-messages .message-item .message-content{padding:12px 16px;border-radius:2px;max-width:70%;word-break:break-word}.ai-panel .body-content .chat-messages .message-item.ai-message .message-content{background:#f5f7fa;font-size:14px}.ai-panel .body-content .chat-messages .message-item.user-message{flex-direction:row-reverse}.ai-panel .body-content .chat-messages .message-item.user-message .message-content{background:#f1f2f3;border-radius:4px 4px 0;color:#333;font-size:14px}.ai-panel .body-content .chat-messages .ai-thinking-indicator{flex:1 0 auto;min-height:140px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;pointer-events:none}.ai-panel .body-content .chat-messages .ai-thinking-indicator .thinking-icon{width:48px;height:48px;margin-bottom:4px}.ai-panel .body-content .chat-messages .ai-thinking-indicator .thinking-loading-icon{width:36px;height:36px}.ai-panel .body-content .chat-messages .ai-thinking-indicator .thinking-text{font-size:14px;color:#999;line-height:20px}.ai-panel .body-content .chat-messages .ai-failed-tip{flex:1 0 auto;min-height:120px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px}.ai-panel .body-content .chat-messages .ai-failed-tip .failed-text{font-size:14px;color:#999;line-height:20px}.ai-panel .body-content .chat-messages .ai-failed-tip .retry-btn{padding:5px 28px;font-size:14px;line-height:22px;color:#0a84ff;background:#fff;border:1px solid #0A84FF;border-radius:16px;cursor:pointer;transition:all .2s}.ai-panel .body-content .chat-messages .ai-failed-tip .retry-btn:hover{background:#0a84ff;color:#fff}.ai-panel .body-content .chat-messages .ai-failed-tip .retry-btn:active{transform:scale(.96)}.ai-panel .panel-footer{padding:24px;background:#fff;position:relative}.ai-panel .panel-footer .voice-progress-banner{margin-bottom:12px;padding:10px 14px;background:linear-gradient(135deg,#f0f7ff,#e6f4ff);border:1px solid #bae0ff;border-radius:8px;display:flex;flex-direction:column;gap:6px}.ai-panel .panel-footer .voice-progress-banner .progress-info{display:flex;align-items:center;gap:8px;font-size:13px;color:#0958d9}.ai-panel .panel-footer .voice-progress-banner .progress-info .progress-icon{font-size:14px}.ai-panel .panel-footer .voice-progress-banner .progress-info .progress-text{flex:1;font-weight:500}.ai-panel .panel-footer .voice-progress-banner .progress-info .progress-percent{font-weight:700;font-family:monospace}.ai-panel .panel-footer .voice-progress-banner .progress-track{height:6px;background:#d9d9d9;border-radius:3px;overflow:hidden}.ai-panel .panel-footer .voice-progress-banner .progress-track .progress-bar{height:100%;background:linear-gradient(90deg,#1677ff,#4096ff);border-radius:3px;transition:width .2s ease}.ai-panel .panel-footer .voice-recording-panel{min-height:44px;padding:8px 14px;background:linear-gradient(135deg,#f6ffed,#e6f7ff);border:1px solid #91caff;border-radius:6px;display:flex;flex-direction:column;gap:8px;box-shadow:0 2px 8px #1677ff14}.ai-panel .panel-footer .voice-recording-panel .recording-main{display:flex;align-items:center;justify-content:space-between;width:100%;min-height:28px}.ai-panel .panel-footer .voice-recording-panel .live-transcript{width:100%;max-height:72px;overflow-y:auto;padding:6px 8px;background:#ffffffc7;border-radius:4px;font-size:13px;line-height:1.55;color:#1677ff;word-break:break-all}.ai-panel .panel-footer .voice-recording-panel .live-transcript.empty{color:#8c8c8c}.ai-panel .panel-footer .voice-recording-panel .live-transcript .caret{display:inline-block;margin-left:1px;font-weight:400;color:#1677ff;animation:caret-blink 1s step-end infinite}.ai-panel .panel-footer .voice-recording-panel .recording-status{display:flex;align-items:center;gap:8px}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-pulse{width:10px;height:10px;border-radius:50%;background:#ff4d4f;box-shadow:0 0 #ff4d4f66;animation:pulse 1.5s infinite}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-pulse.transcribing{background:#1890ff;box-shadow:0 0 #1890ff66}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-time{font-family:monospace;font-weight:700;font-size:13px;color:#ff4d4f}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-hint{font-size:13px;color:#333}.ai-panel .panel-footer .voice-recording-panel .recording-status .volume-waves{display:flex;align-items:center;gap:3px;height:30px;margin-left:4px}.ai-panel .panel-footer .voice-recording-panel .recording-status .volume-waves .wave{width:3px;background:#1890ff;border-radius:2px;transition:height .08s ease}.ai-panel .panel-footer .voice-recording-panel .recording-actions{display:flex;align-items:center;gap:8px}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-btn{color:#8c8c8c;border-color:#d9d9d9}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-btn:hover{color:#ff4d4f;border-color:#ff4d4f;background:#fff1f0}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-finish-btn{background:#1677ff;border-color:#1677ff;padding:6px 14px;font-weight:500}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-transcribe-btn{color:#666;border-color:#d9d9d9;background:#fff;font-size:12px;padding:4px 10px;height:28px;transition:all .2s}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-transcribe-btn:hover{color:#ff4d4f;border-color:#ff4d4f;background:#fff1f0}.ai-panel .panel-footer .voice-playback-bar{margin-bottom:8px;height:36px;padding:0 12px;background:#f0f7ff;border:1px solid #bae0ff;border-radius:6px;display:flex;align-items:center;justify-content:space-between;transition:all .2s ease}.ai-panel .panel-footer .voice-playback-bar .playback-main{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-play-icon{width:22px;height:22px;border-radius:50%;background:#1677ff;color:#fff;display:flex;align-items:center;justify-content:center;transition:transform .15s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-play-icon:hover{transform:scale(1.1)}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-title{font-size:13px;color:#1677ff;font-weight:500}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-time{font-size:12px;color:#8c8c8c;font-family:monospace}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves{display:flex;align-items:flex-end;gap:2px;height:14px;margin-left:4px}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar{width:2px;background:#1677ff;border-radius:1px;animation:soundWave .8s ease-in-out infinite alternate}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(1){height:6px;animation-delay:0s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(2){height:12px;animation-delay:.2s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(3){height:8px;animation-delay:.4s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(4){height:14px;animation-delay:.1s}.ai-panel .panel-footer .voice-playback-bar .playback-close{cursor:pointer;color:#8c8c8c;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .2s}.ai-panel .panel-footer .voice-playback-bar .playback-close:hover{color:#ff4d4f;background:#fff1f0}.ai-panel .panel-footer .input-box .el-input-group{height:40px;border-radius:4px}.ai-panel .panel-footer .input-box :deep(.el-input__wrapper){box-shadow:none}.ai-panel .panel-footer .input-box :deep(.el-input-group__append){box-shadow:none;background:transparent;padding:8px 12px}.ai-panel .panel-footer .input-box .input-actions-box{display:flex;align-items:center;gap:12px}.ai-panel .panel-footer .input-box .input-actions-box .voice-upload-btn{display:flex;align-items:center;justify-content:center;cursor:pointer;color:#666;transition:all .2s;padding:4px;border-radius:4px}.ai-panel .panel-footer .input-box .input-actions-box .voice-upload-btn:hover{color:#1677ff;background:#f0f7ff;transform:scale(1.08)}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn{display:flex;align-items:center;justify-content:center;cursor:pointer;color:#666;transition:all .2s;padding:4px;border-radius:4px}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn:hover{color:#1677ff;background:#f0f7ff;transform:scale(1.08)}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn.loading-anim{color:#1677ff}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn.loading-anim svg{animation:mic-breathe 1.2s ease-in-out infinite;transform-origin:center}.ai-panel .panel-footer .input-box .input-actions-box .send-icon-box{display:flex;align-items:center;justify-content:center;cursor:pointer}.ai-panel .panel-footer .input-box .el-input-group__append{background-color:transparent}@keyframes soundWave{0%{height:3px}to{height:14px}}@keyframes pulse{0%{box-shadow:0 0 #ff4d4fb3}70%{box-shadow:0 0 0 8px #ff4d4f00}to{box-shadow:0 0 #ff4d4f00}}@keyframes caret-blink{0%,to{opacity:1}50%{opacity:0}}@keyframes mic-breathe{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.22);opacity:.72}}.ai-status-fade-enter-active,.ai-status-fade-leave-active{transition:opacity .25s ease}.ai-status-fade-enter-from,.ai-status-fade-leave-to{opacity:0}.ai-assistant{box-sizing:border-box;position:fixed;right:20px;bottom:40px;z-index:1000;display:flex;align-items:flex-end}.ai-assistant div{box-sizing:border-box}.ai-assistant .ai-icon{box-sizing:border-box;display:flex;flex-direction:column;align-items:center;cursor:pointer;width:44px;padding:6px;transition:all .3s;height:114px;background-color:#fff;box-shadow:0 4px 16px 4px #00000008,0 2px 8px #0000000d,0 0 4px -2px #00000014;border-radius:22px;border:1px solid transparent;background-image:linear-gradient(#fff,#fff),linear-gradient(180deg,#60fffc,#0a84ff);background-origin:border-box;background-clip:padding-box,border-box}.ai-assistant .ai-icon:hover{transform:translateY(-2px);box-shadow:0 4px 16px #00000026}.ai-assistant .ai-icon img{width:32px;height:32px;margin-bottom:6px}.ai-assistant .ai-icon .ai-icon-text{display:inline-block;width:20px;font-size:16px;line-height:18px;font-weight:700;color:#333}.ai-assistant .ai-icon:hover .close-icon{display:flex}.ai-assistant .ai-icon .close-icon{display:none;position:absolute;top:-6px;right:-6px;width:16px;height:16px;background:#fff;border-radius:50%;align-items:center;justify-content:center;box-shadow:0 2px 4px #0000001a;color:#666;cursor:pointer;z-index:1}.ai-assistant .ai-icon .close-icon:hover{color:#333;background:#f5f5f5}.ai-chat-plain{box-sizing:border-box;position:relative;width:100%;height:100%}.ai-chat-plain div{box-sizing:border-box}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@szjy/ai-coms",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.17",
|
|
4
4
|
"description": "vue3 ai component",
|
|
5
5
|
"main": "dist/index.umd.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
],
|
|
21
21
|
"scripts": {
|
|
22
22
|
"dev": "vite",
|
|
23
|
+
"test": "vitest run",
|
|
23
24
|
"build": "vite build",
|
|
24
25
|
"build:dev": "vue-tsc --noEmit && vite build --mode dev",
|
|
25
26
|
"build:voice": "node scripts/build-voice-assets.mjs",
|
|
@@ -34,19 +35,22 @@
|
|
|
34
35
|
"vue": "^3.4.21"
|
|
35
36
|
},
|
|
36
37
|
"devDependencies": {
|
|
38
|
+
"@iconify-json/mdi": "^1.2.3",
|
|
37
39
|
"@types/file-saver": "^2.0.7",
|
|
38
40
|
"@types/node": "^20.11.30",
|
|
39
41
|
"@vitejs/plugin-vue": "^5.0.4",
|
|
40
42
|
"@vitejs/plugin-vue-jsx": "^3.1.0",
|
|
43
|
+
"@vue/test-utils": "^2.5.0",
|
|
44
|
+
"jsdom": "^30.0.1",
|
|
41
45
|
"less": "^4.2.0",
|
|
42
46
|
"sass": "^1.79.3",
|
|
43
47
|
"typescript": "^5.2.2",
|
|
44
48
|
"unplugin-icons": "^22.1.0",
|
|
45
|
-
"@iconify-json/mdi": "^1.2.3",
|
|
46
49
|
"unplugin-vue-components": "^0.26.0",
|
|
47
50
|
"vite": "^5.1.6",
|
|
48
51
|
"vite-plugin-dts": "^3.7.3",
|
|
49
52
|
"vite-plugin-svg-icons": "^2.0.1",
|
|
53
|
+
"vitest": "^2.1.9",
|
|
50
54
|
"vue-tsc": "^2.0.14"
|
|
51
55
|
}
|
|
52
56
|
}
|