@siact/sime-x-vue 0.0.2

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/style.css ADDED
@@ -0,0 +1,797 @@
1
+ @charset "UTF-8";/* --- Design Tokens --- */
2
+ /* --- Main Container --- */
3
+ .voice-status-wrapper[data-v-c9fa6caf] {
4
+ display: flex;
5
+ align-items: flex-start;
6
+ gap: 20px;
7
+ padding: 24px;
8
+ background: rgba(15, 23, 42, 0.85);
9
+ backdrop-filter: blur(16px);
10
+ -webkit-backdrop-filter: blur(16px);
11
+ border: 1px solid rgba(255, 255, 255, 0.1);
12
+ border-radius: 24px;
13
+ box-shadow: 0 10px 40px -10px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.1);
14
+ transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
15
+ max-width: 480px;
16
+ width: 100%;
17
+ }
18
+
19
+ /* --- Indicator Section --- */
20
+ .indicator-container[data-v-c9fa6caf] {
21
+ position: relative;
22
+ width: 64px;
23
+ height: 64px;
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: center;
27
+ flex-shrink: 0;
28
+ }
29
+ .ambient-glow[data-v-c9fa6caf] {
30
+ position: absolute;
31
+ inset: -20px;
32
+ border-radius: 50%;
33
+ opacity: 0;
34
+ filter: blur(20px);
35
+ transition: all 0.5s ease;
36
+ }
37
+ .icon-core[data-v-c9fa6caf] {
38
+ position: relative;
39
+ width: 52px;
40
+ height: 52px;
41
+ border-radius: 50%;
42
+ background: rgba(255, 255, 255, 0.05);
43
+ display: flex;
44
+ align-items: center;
45
+ justify-content: center;
46
+ border: 1px solid rgba(255, 255, 255, 0.1);
47
+ z-index: 10;
48
+ transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
49
+ overflow: hidden;
50
+ }
51
+ .icon-core .mic-icon[data-v-c9fa6caf] {
52
+ width: 24px;
53
+ height: 24px;
54
+ color: rgba(255, 255, 255, 0.9);
55
+ transition: all 0.3s ease;
56
+ }
57
+ .icon-core .mic-icon .mic-capsule[data-v-c9fa6caf] {
58
+ transition: transform 0.2s ease;
59
+ transform-origin: center center;
60
+ }
61
+
62
+ /* --- Ripple Effects --- */
63
+ .ripple-layer[data-v-c9fa6caf] {
64
+ position: absolute;
65
+ inset: 0;
66
+ pointer-events: none;
67
+ }
68
+ .ripple[data-v-c9fa6caf] {
69
+ position: absolute;
70
+ inset: 0;
71
+ border-radius: 50%;
72
+ border: 2px solid transparent;
73
+ opacity: 0;
74
+ }
75
+
76
+ /* --- Content Section --- */
77
+ .content-container[data-v-c9fa6caf] {
78
+ flex: 1;
79
+ display: flex;
80
+ flex-direction: column;
81
+ min-width: 0; /* Prevent flex text overflow */
82
+ padding-top: 4px;
83
+ }
84
+ .status-header[data-v-c9fa6caf] {
85
+ display: flex;
86
+ align-items: center;
87
+ gap: 8px;
88
+ margin-bottom: 8px;
89
+ }
90
+ .status-dot[data-v-c9fa6caf] {
91
+ width: 6px;
92
+ height: 6px;
93
+ border-radius: 50%;
94
+ background: currentColor;
95
+ box-shadow: 0 0 8px currentColor;
96
+ transition: color 0.3s ease;
97
+ }
98
+ .status-text[data-v-c9fa6caf] {
99
+ font-size: 13px;
100
+ font-weight: 600;
101
+ text-transform: uppercase;
102
+ letter-spacing: 0.05em;
103
+ color: rgba(255, 255, 255, 0.6);
104
+ }
105
+ .text-window[data-v-c9fa6caf] {
106
+ min-height: 24px;
107
+ position: relative;
108
+ }
109
+ .transcription-content[data-v-c9fa6caf] {
110
+ font-size: 16px;
111
+ line-height: 1.5;
112
+ color: #fff;
113
+ font-weight: 500;
114
+ margin: 0;
115
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
116
+ }
117
+ .placeholder-text[data-v-c9fa6caf] {
118
+ font-size: 16px;
119
+ color: rgba(255, 255, 255, 0.3);
120
+ font-style: italic;
121
+ margin: 0;
122
+ }
123
+
124
+ /* --- State: Wake --- */
125
+ .mode-wake[data-v-c9fa6caf] {
126
+ border-color: rgba(16, 185, 129, 0.3);
127
+ }
128
+ .mode-wake .ambient-glow[data-v-c9fa6caf] {
129
+ background: #10b981;
130
+ opacity: 0.2;
131
+ }
132
+ .mode-wake .icon-core[data-v-c9fa6caf] {
133
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.2), rgba(16, 185, 129, 0.1));
134
+ border-color: rgba(16, 185, 129, 0.4);
135
+ box-shadow: 0 0 15px rgba(16, 185, 129, 0.2);
136
+ }
137
+ .mode-wake .icon-core .mic-icon[data-v-c9fa6caf] {
138
+ color: rgb(20.0597014925, 231.9402985075, 161.7313432836);
139
+ }
140
+ .mode-wake .status-dot[data-v-c9fa6caf] {
141
+ color: #10b981;
142
+ animation: pulse-dot-c9fa6caf 2s infinite;
143
+ }
144
+ .mode-wake .ripple[data-v-c9fa6caf] {
145
+ border-color: #10b981;
146
+ animation: ripple-out-c9fa6caf 3s infinite;
147
+ }
148
+ .mode-wake .ripple.delay-1[data-v-c9fa6caf] {
149
+ animation-delay: 0s;
150
+ }
151
+ .mode-wake .ripple.delay-2[data-v-c9fa6caf] {
152
+ animation-delay: 1s;
153
+ }
154
+ .mode-wake .ripple.delay-3[data-v-c9fa6caf] {
155
+ animation-delay: 2s;
156
+ }
157
+
158
+ /* --- State: Transcribing --- */
159
+ .mode-transcribing[data-v-c9fa6caf] {
160
+ border-color: rgba(59, 130, 246, 0.3);
161
+ }
162
+ .mode-transcribing .ambient-glow[data-v-c9fa6caf] {
163
+ background: #3b82f6;
164
+ opacity: 0.3;
165
+ animation: glow-breathe-c9fa6caf 1.5s ease-in-out infinite alternate;
166
+ }
167
+ .mode-transcribing .icon-core[data-v-c9fa6caf] {
168
+ background: linear-gradient(135deg, rgba(59, 130, 246, 0.3), rgba(59, 130, 246, 0.1));
169
+ border-color: rgba(59, 130, 246, 0.5);
170
+ box-shadow: 0 0 20px rgba(59, 130, 246, 0.3);
171
+ transform: scale(1.1);
172
+ }
173
+ .mode-transcribing .icon-core .mic-icon[data-v-c9fa6caf] {
174
+ color: #fff;
175
+ }
176
+ .mode-transcribing .icon-core .mic-icon .mic-capsule[data-v-c9fa6caf] {
177
+ animation: mic-bounce-c9fa6caf 0.6s ease-in-out infinite alternate;
178
+ }
179
+ .mode-transcribing .status-dot[data-v-c9fa6caf] {
180
+ color: #3b82f6;
181
+ }
182
+ .mode-transcribing .ripple[data-v-c9fa6caf] {
183
+ border-color: #3b82f6;
184
+ animation: ripple-rapid-c9fa6caf 1.5s infinite;
185
+ }
186
+ .mode-transcribing .ripple.delay-1[data-v-c9fa6caf] {
187
+ animation-delay: 0s;
188
+ }
189
+ .mode-transcribing .ripple.delay-2[data-v-c9fa6caf] {
190
+ animation-delay: 0.3s;
191
+ }
192
+ .mode-transcribing .ripple.delay-3[data-v-c9fa6caf] {
193
+ animation-delay: 0.6s;
194
+ }
195
+
196
+ /* --- Animations --- */
197
+ @keyframes ripple-out-c9fa6caf {
198
+ 0% {
199
+ transform: scale(0.8);
200
+ opacity: 0;
201
+ border-width: 2px;
202
+ }
203
+ 20% {
204
+ opacity: 0.5;
205
+ }
206
+ 100% {
207
+ transform: scale(2.2);
208
+ opacity: 0;
209
+ border-width: 0px;
210
+ }
211
+ }
212
+ @keyframes ripple-rapid-c9fa6caf {
213
+ 0% {
214
+ transform: scale(0.9);
215
+ opacity: 0;
216
+ }
217
+ 50% {
218
+ opacity: 0.4;
219
+ }
220
+ 100% {
221
+ transform: scale(1.6);
222
+ opacity: 0;
223
+ }
224
+ }
225
+ @keyframes pulse-dot-c9fa6caf {
226
+ 0%, 100% {
227
+ opacity: 1;
228
+ transform: scale(1);
229
+ }
230
+ 50% {
231
+ opacity: 0.5;
232
+ transform: scale(0.8);
233
+ }
234
+ }
235
+ @keyframes glow-breathe-c9fa6caf {
236
+ 0% {
237
+ opacity: 0.2;
238
+ transform: scale(0.9);
239
+ }
240
+ 100% {
241
+ opacity: 0.4;
242
+ transform: scale(1.1);
243
+ }
244
+ }
245
+ @keyframes mic-bounce-c9fa6caf {
246
+ 0% {
247
+ transform: scaleY(1);
248
+ }
249
+ 100% {
250
+ transform: scaleY(0.7);
251
+ }
252
+ }
253
+ /* --- Vue Transitions --- */
254
+ .voice-panel-enter-active[data-v-c9fa6caf],
255
+ .voice-panel-leave-active[data-v-c9fa6caf] {
256
+ transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
257
+ }
258
+ .voice-panel-enter-from[data-v-c9fa6caf],
259
+ .voice-panel-leave-to[data-v-c9fa6caf] {
260
+ opacity: 0;
261
+ transform: translateY(20px) scale(0.95);
262
+ }
263
+ .fade-slide-enter-active[data-v-c9fa6caf],
264
+ .fade-slide-leave-active[data-v-c9fa6caf] {
265
+ transition: all 0.3s ease;
266
+ }
267
+ .fade-slide-enter-from[data-v-c9fa6caf] {
268
+ opacity: 0;
269
+ transform: translateY(10px);
270
+ }
271
+ .fade-slide-leave-to[data-v-c9fa6caf] {
272
+ opacity: 0;
273
+ transform: translateY(-10px);
274
+ }
275
+ .execution-bubble[data-v-8244ff0d] {
276
+ display: flex;
277
+ align-items: center;
278
+ justify-content: center;
279
+ padding: 12px 20px;
280
+ background: rgba(15, 23, 42, 0.9);
281
+ backdrop-filter: blur(16px);
282
+ -webkit-backdrop-filter: blur(16px);
283
+ border: 1px solid rgba(168, 85, 247, 0.35);
284
+ border-radius: 20px;
285
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3), 0 0 20px -5px rgba(168, 85, 247, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.08);
286
+ }
287
+
288
+ /* 文本样式 */
289
+ .exec-text[data-v-8244ff0d] {
290
+ font-size: 14px;
291
+ font-weight: 500;
292
+ color: rgba(255, 255, 255, 0.9);
293
+ white-space: nowrap;
294
+ overflow: hidden;
295
+ text-overflow: ellipsis;
296
+ max-width: 300px;
297
+ }
298
+
299
+ /* 三点加载动画 */
300
+ .loading-dots[data-v-8244ff0d] {
301
+ display: flex;
302
+ align-items: center;
303
+ gap: 5px;
304
+ margin-left: 10px;
305
+ }
306
+ .dot[data-v-8244ff0d] {
307
+ width: 6px;
308
+ height: 6px;
309
+ border-radius: 50%;
310
+ background: #c084fc;
311
+ animation: dot-bounce-8244ff0d 1.4s ease-in-out infinite;
312
+ }
313
+ .dot[data-v-8244ff0d]:nth-child(1) {
314
+ animation-delay: 0s;
315
+ }
316
+ .dot[data-v-8244ff0d]:nth-child(2) {
317
+ animation-delay: 0.2s;
318
+ }
319
+ .dot[data-v-8244ff0d]:nth-child(3) {
320
+ animation-delay: 0.4s;
321
+ }
322
+ @keyframes dot-bounce-8244ff0d {
323
+ 0%, 80%, 100% {
324
+ transform: scale(0.6);
325
+ opacity: 0.4;
326
+ }
327
+ 40% {
328
+ transform: scale(1);
329
+ opacity: 1;
330
+ box-shadow: 0 0 8px rgba(192, 132, 252, 0.6);
331
+ }
332
+ }
333
+ /* Vue 过渡动画 */
334
+ .exec-bubble-enter-active[data-v-8244ff0d] {
335
+ transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
336
+ }
337
+ .exec-bubble-leave-active[data-v-8244ff0d] {
338
+ transition: all 0.2s cubic-bezier(0.25, 0.8, 0.25, 1);
339
+ }
340
+ .exec-bubble-enter-from[data-v-8244ff0d] {
341
+ opacity: 0;
342
+ transform: scale(0.8);
343
+ }
344
+ .exec-bubble-leave-to[data-v-8244ff0d] {
345
+ opacity: 0;
346
+ transform: scale(0.8);
347
+ }
348
+ .sime-x[data-v-d8f992b0] {
349
+ --bg-primary: #ffffff;
350
+ --bg-secondary: #f8fafc;
351
+ --bg-header: #0f172a;
352
+ --text-primary: #0f172a;
353
+ --text-secondary: #64748b;
354
+ --text-header: #ffffff;
355
+ --border-color: #e2e8f0;
356
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);
357
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.1);
358
+ --shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.15);
359
+ --accent-color: #3b82f6;
360
+ --hover-bg: rgba(0, 0, 0, 0.05);
361
+ }
362
+ .sime-x[data-theme=dark][data-v-d8f992b0] {
363
+ --bg-primary: #1e293b;
364
+ --bg-secondary: #0f172a;
365
+ --bg-header: #0f172a;
366
+ --text-primary: #f1f5f9;
367
+ --text-secondary: #94a3b8;
368
+ --text-header: #f1f5f9;
369
+ --border-color: #334155;
370
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3);
371
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);
372
+ --shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.5);
373
+ --accent-color: #60a5fa;
374
+ --hover-bg: rgba(255, 255, 255, 0.1);
375
+ }
376
+ .is-hidden[data-v-d8f992b0] {
377
+ height: 0;
378
+ opacity: 0 !important;
379
+ pointer-events: none !important;
380
+ visibility: hidden !important;
381
+ }
382
+ .assistant-fab[data-v-d8f992b0] {
383
+ position: relative;
384
+ cursor: pointer;
385
+ overflow: visible;
386
+ filter: drop-shadow(var(--shadow-md));
387
+ opacity: 1;
388
+ pointer-events: auto;
389
+ transition: all 0.3s ease;
390
+ }
391
+ .assistant-fab[data-v-d8f992b0]:hover {
392
+ transform: scale(1.05);
393
+ }
394
+ .assistant-fab[data-v-d8f992b0]:active {
395
+ transform: scale(0.95);
396
+ }
397
+ .assistant-fab .voice-status[data-v-d8f992b0] {
398
+ position: absolute;
399
+ right: 100%;
400
+ margin-right: 20px;
401
+ }
402
+ .assistant-fab img[data-v-d8f992b0] {
403
+ display: block;
404
+ position: relative;
405
+ object-fit: contain;
406
+ }
407
+ .assistant-fab .fab-pulse[data-v-d8f992b0] {
408
+ position: absolute;
409
+ inset: -4px;
410
+ border-radius: 50%;
411
+ border: 2px solid var(--accent-color);
412
+ opacity: 0;
413
+ }
414
+ @keyframes pulse-d8f992b0 {
415
+ 0%, 100% {
416
+ opacity: 0;
417
+ transform: scale(1);
418
+ }
419
+ 50% {
420
+ opacity: 0.5;
421
+ transform: scale(1.1);
422
+ }
423
+ }
424
+ .x-dialog-container[data-v-d8f992b0] {
425
+ position: fixed;
426
+ top: 0;
427
+ left: 0;
428
+ transform: translate(var(--dialog-x), var(--dialog-y));
429
+ border-radius: 16px;
430
+ display: flex;
431
+ flex-direction: column;
432
+ cursor: grab;
433
+ overflow: hidden;
434
+ z-index: 1100;
435
+ opacity: 0;
436
+ pointer-events: none;
437
+ }
438
+ .x-dialog-container.position-ready[data-v-d8f992b0] {
439
+ opacity: 1;
440
+ pointer-events: auto;
441
+ }
442
+ .x-dialog-container[data-v-d8f992b0]:active {
443
+ cursor: grabbing;
444
+ }
445
+ .x-dialog-container.collapsed .x-dialog-header[data-v-d8f992b0] {
446
+ border-radius: 16px;
447
+ }
448
+ .x-dialog-container .x-dialog-header[data-v-d8f992b0] {
449
+ position: relative;
450
+ display: flex;
451
+ justify-content: space-between;
452
+ align-items: center;
453
+ background: var(--bg-header);
454
+ padding: 12px 16px;
455
+ cursor: move;
456
+ user-select: none;
457
+ border-bottom: 1px solid var(--border-color);
458
+ }
459
+ .x-dialog-container .x-dialog-header .header-left[data-v-d8f992b0] {
460
+ display: flex;
461
+ align-items: center;
462
+ gap: 10px;
463
+ }
464
+ .x-dialog-container .x-dialog-header .header-left .logo-icon[data-v-d8f992b0] {
465
+ display: flex;
466
+ align-items: center;
467
+ justify-content: center;
468
+ width: 36px;
469
+ height: 36px;
470
+ transition: transform 0.2s ease;
471
+ }
472
+ .x-dialog-container .x-dialog-header .header-left .logo-icon .logo[data-v-d8f992b0] {
473
+ width: 100%;
474
+ height: 100%;
475
+ object-fit: contain;
476
+ }
477
+ .x-dialog-container .x-dialog-header .header-left .title[data-v-d8f992b0] {
478
+ font-weight: 600;
479
+ font-size: 15px;
480
+ color: var(--text-header);
481
+ letter-spacing: -0.01em;
482
+ }
483
+ .x-dialog-container .x-dialog-header .actions[data-v-d8f992b0] {
484
+ display: flex;
485
+ align-items: center;
486
+ gap: 4px;
487
+ }
488
+ .x-dialog-container .x-dialog-header .actions .action-btn[data-v-d8f992b0] {
489
+ display: flex;
490
+ align-items: center;
491
+ justify-content: center;
492
+ width: 32px;
493
+ height: 32px;
494
+ border: none;
495
+ background: transparent;
496
+ cursor: pointer;
497
+ color: var(--text-secondary);
498
+ transition: all 0.2s ease;
499
+ border-radius: 8px;
500
+ }
501
+ .x-dialog-container .x-dialog-header .actions .action-btn[data-v-d8f992b0]:hover {
502
+ color: var(--text-header);
503
+ background: var(--hover-bg);
504
+ transform: translateY(-1px);
505
+ }
506
+ .x-dialog-container .x-dialog-header .actions .action-btn[data-v-d8f992b0]:active {
507
+ transform: translateY(0);
508
+ }
509
+ .x-dialog-container .x-dialog-header .actions .action-btn svg[data-v-d8f992b0] {
510
+ transition: transform 0.2s ease;
511
+ }
512
+ .x-dialog-container .x-dialog-header .actions .action-btn.collapse-btn:hover svg[data-v-d8f992b0] {
513
+ transform: scale(1.1);
514
+ }
515
+ .x-dialog-container .voice-container[data-v-d8f992b0] {
516
+ width: 100%;
517
+ opacity: 1;
518
+ pointer-events: auto;
519
+ }
520
+ .x-dialog-container .x-dialog-content[data-v-d8f992b0] {
521
+ flex: 1;
522
+ display: flex;
523
+ overflow: hidden;
524
+ background: var(--bg-secondary);
525
+ opacity: 1;
526
+ pointer-events: auto;
527
+ }
528
+ .x-dialog-container .x-iframe[data-v-d8f992b0] {
529
+ flex: 1;
530
+ width: 100%;
531
+ height: 100%;
532
+ border: none;
533
+ }
534
+ .x-dialog-container .resize-handle[data-v-d8f992b0] {
535
+ position: absolute;
536
+ bottom: 0;
537
+ right: 0;
538
+ width: 40px;
539
+ height: 40px;
540
+ cursor: nwse-resize;
541
+ display: flex;
542
+ align-items: center;
543
+ justify-content: center;
544
+ color: var(--text-secondary);
545
+ transition: all 0.2s ease;
546
+ background: linear-gradient(135deg, transparent 50%, var(--bg-primary) 50%);
547
+ border-bottom-right-radius: 16px;
548
+ z-index: 10;
549
+ }
550
+ .x-dialog-container .resize-handle[data-v-d8f992b0]:hover {
551
+ color: var(--accent-color);
552
+ background: linear-gradient(135deg, transparent 50%, var(--hover-bg) 50%);
553
+ }
554
+ .x-dialog-container .resize-handle svg[data-v-d8f992b0] {
555
+ width: 16px;
556
+ height: 16px;
557
+ transform: rotate(0deg);
558
+ transition: transform 0.2s ease;
559
+ }
560
+ .x-dialog-container .resize-handle:hover svg[data-v-d8f992b0] {
561
+ transform: scale(1.2);
562
+ }
563
+
564
+ /* 语音按钮状态样式 */
565
+ .action-btn.theme-btn[data-v-d8f992b0] {
566
+ position: relative;
567
+ transition: all 0.3s ease;
568
+ }
569
+ .action-btn.theme-btn.active[data-v-d8f992b0] {
570
+ background: rgba(59, 130, 246, 0.1);
571
+ color: #3b82f6;
572
+ }
573
+ .action-btn.theme-btn.listening[data-v-d8f992b0] {
574
+ animation: pulse-listening-d8f992b0 2s ease-in-out infinite;
575
+ }
576
+ .action-btn.theme-btn.woke[data-v-d8f992b0] {
577
+ background: rgba(34, 197, 94, 0.2);
578
+ color: #22c55e;
579
+ animation: pulse-wake-d8f992b0 0.6s ease-in-out;
580
+ }
581
+ @keyframes pulse-listening-d8f992b0 {
582
+ 0%, 100% {
583
+ box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.4);
584
+ }
585
+ 50% {
586
+ box-shadow: 0 0 0 8px rgba(59, 130, 246, 0);
587
+ }
588
+ }
589
+ @keyframes pulse-wake-d8f992b0 {
590
+ 0%, 100% {
591
+ transform: scale(1);
592
+ }
593
+ 50% {
594
+ transform: scale(1.1);
595
+ }
596
+ }
597
+ /* 语音指示器 */
598
+ .voice-indicator[data-v-d8f992b0] {
599
+ position: absolute;
600
+ top: 4px;
601
+ right: 4px;
602
+ width: 6px;
603
+ height: 6px;
604
+ border-radius: 50%;
605
+ background: #3b82f6;
606
+ }
607
+ .action-btn.theme-btn.listening .voice-indicator[data-v-d8f992b0] {
608
+ animation: blink-d8f992b0 1.5s ease-in-out infinite;
609
+ }
610
+ .action-btn.theme-btn.woke .voice-indicator[data-v-d8f992b0] {
611
+ background: #22c55e;
612
+ animation: none;
613
+ }
614
+ @keyframes blink-d8f992b0 {
615
+ 0%, 100% {
616
+ opacity: 1;
617
+ }
618
+ 50% {
619
+ opacity: 0.3;
620
+ }
621
+ }
622
+ /* FAB 头像容器 */
623
+ .fab-avatar-wrapper[data-v-d8f992b0] {
624
+ position: relative;
625
+ display: flex; /* 改用 flex 可以消除图片底部的行高间隙 */
626
+ align-items: center;
627
+ justify-content: center;
628
+ width: fit-content; /* 宽度随内容自适应 */
629
+ margin: 0 auto;
630
+ }
631
+
632
+ /* 2. 修正图片样式 */
633
+ .fab-avatar-wrapper img[data-v-d8f992b0] {
634
+ display: block;
635
+ max-width: 100%;
636
+ height: auto;
637
+ /* 移除原本 style 里的 width/height 可能造成的拉伸,保持比例 */
638
+ }
639
+
640
+ /* 3. 优化徽章定位 */
641
+ .listening-badge[data-v-d8f992b0] {
642
+ position: absolute;
643
+ /* 强制定位到容器边缘 */
644
+ top: 0;
645
+ right: 0;
646
+ /* 使用 transform 偏移,让徽章中心点落在图片的右上角顶点上 */
647
+ transform: translate(30%, -30%);
648
+ width: 32px;
649
+ height: 32px;
650
+ border-radius: 50%;
651
+ background-color: rgba(0, 0, 0, 0.75); /* 稍微加深一点 */
652
+ display: flex;
653
+ align-items: center;
654
+ justify-content: center;
655
+ z-index: 10;
656
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
657
+ /* 继承你原有的动画 */
658
+ animation: badge-float-d8f992b0 5s ease-in-out infinite;
659
+ pointer-events: none; /* 防止遮挡头像点击 */
660
+ }
661
+
662
+ /* 4. 调整声波扩散的基准 */
663
+ .wave[data-v-d8f992b0] {
664
+ position: absolute;
665
+ /* 确保声波从徽章中心扩散,而不是从容器左上角 */
666
+ inset: -2px;
667
+ border-radius: 50%;
668
+ border: 2px solid rgba(59, 130, 246, 0.6); /* 声波颜色建议跟主题色一致 */
669
+ animation: wave-expand-d8f992b0 3s ease-out infinite;
670
+ }
671
+
672
+ /* 优化后的监听状态徽章 */
673
+ .listening-badge[data-v-d8f992b0] {
674
+ position: absolute;
675
+ top: -8px;
676
+ right: -8px;
677
+ width: 32px;
678
+ height: 32px;
679
+ border-radius: 50%;
680
+ background-color: rgba(0, 0, 0, 0.651);
681
+ display: flex;
682
+ align-items: center;
683
+ justify-content: center;
684
+ z-index: 10;
685
+ animation: badge-float-d8f992b0 5s ease-in-out infinite;
686
+ }
687
+
688
+ /* 徽章浮动动画 */
689
+ @keyframes badge-float-d8f992b0 {
690
+ 0%, 100% {
691
+ transform: translateY(0) scale(1);
692
+ }
693
+ 50% {
694
+ transform: translateY(-2px) scale(1.05);
695
+ }
696
+ }
697
+ /* 声波容器 */
698
+ .listening-waves[data-v-d8f992b0] {
699
+ position: absolute;
700
+ inset: 0;
701
+ display: flex;
702
+ align-items: center;
703
+ justify-content: center;
704
+ }
705
+
706
+ /* 声波动画 */
707
+ .wave[data-v-d8f992b0] {
708
+ position: absolute;
709
+ width: 100%;
710
+ height: 100%;
711
+ border-radius: 50%;
712
+ border: 2px solid rgba(255, 255, 255, 0.6);
713
+ animation: wave-expand-d8f992b0 3s ease-out infinite;
714
+ }
715
+ .wave-1[data-v-d8f992b0] {
716
+ animation-delay: 0s;
717
+ }
718
+ .wave-2[data-v-d8f992b0] {
719
+ animation-delay: 0.6s;
720
+ }
721
+ .wave-3[data-v-d8f992b0] {
722
+ animation-delay: 1.2s;
723
+ }
724
+ @keyframes wave-expand-d8f992b0 {
725
+ 0% {
726
+ transform: scale(0.8);
727
+ opacity: 0.8;
728
+ }
729
+ 100% {
730
+ transform: scale(2.2);
731
+ opacity: 0;
732
+ }
733
+ }
734
+ /* 麦克风图标 */
735
+ .listening-icon[data-v-d8f992b0] {
736
+ position: relative;
737
+ width: 24px;
738
+ height: 24px;
739
+ display: flex;
740
+ align-items: center;
741
+ justify-content: center;
742
+ color: #ffffff;
743
+ z-index: 1;
744
+ animation: icon-pulse-d8f992b0 2.5s ease-in-out infinite;
745
+ }
746
+ @keyframes icon-pulse-d8f992b0 {
747
+ 0%, 100% {
748
+ transform: scale(1);
749
+ }
750
+ 50% {
751
+ transform: scale(1.1);
752
+ }
753
+ }
754
+ /* 徽章淡入淡出动画 */
755
+ .indicator-fade-enter-active[data-v-d8f992b0] {
756
+ transition: all 1s cubic-bezier(0.34, 1.56, 0.64, 1);
757
+ }
758
+ .indicator-fade-leave-active[data-v-d8f992b0] {
759
+ transition: all 1s ease;
760
+ }
761
+ .indicator-fade-enter-from[data-v-d8f992b0] {
762
+ opacity: 0;
763
+ transform: scale(0.3) rotate(-180deg);
764
+ }
765
+ .indicator-fade-leave-to[data-v-d8f992b0] {
766
+ opacity: 0;
767
+ transform: scale(0.5) rotate(180deg);
768
+ }
769
+
770
+ /* FAB 脉冲效果 */
771
+ .fab-pulse[data-v-d8f992b0] {
772
+ position: absolute;
773
+ top: 0;
774
+ left: 0;
775
+ right: 0;
776
+ bottom: 0;
777
+ border-radius: 50%;
778
+ pointer-events: none;
779
+ }
780
+ .fab-pulse.active[data-v-d8f992b0] {
781
+ animation: fab-pulse-d8f992b0 2s ease-in-out infinite;
782
+ }
783
+ @keyframes fab-pulse-d8f992b0 {
784
+ 0%, 100% {
785
+ box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.4);
786
+ }
787
+ 50% {
788
+ box-shadow: 0 0 0 20px rgba(59, 130, 246, 0);
789
+ }
790
+ }
791
+ /* 深色模式适配 */
792
+ [data-theme=dark] .action-btn.theme-btn.active[data-v-d8f992b0] {
793
+ background: rgba(59, 130, 246, 0.2);
794
+ }
795
+ [data-theme=dark] .action-btn.theme-btn.woke[data-v-d8f992b0] {
796
+ background: rgba(34, 197, 94, 0.3);
797
+ }