@pactor-app/chat 1.43.0 → 1.46.0

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/styles.css CHANGED
@@ -1,32 +1,902 @@
1
- /**
2
- * pactor-chat 皮肤样式表(单文件)。
3
- *
4
- * 技术选型参考 DeepTutor web:语义 CSS 变量 + 语义 class,无 antd。
5
- *
6
- * 换肤契约(与 @pactor-app/ui 一致):
7
- * 1. `--pactor-chat-*` 令牌默认值声明在 `:root`,颜色经 `var(--语义令牌, <chat 默认>)`
8
- * 桥接 pactor-ui 语义令牌(--background/--primary/…)——皮肤 CSS 覆盖
9
- * 语义令牌时 chat 结构件自动跟随;也可直接在皮肤里覆盖 `--pactor-chat-*` 精调
10
- * (令牌定义在 :root,皮肤声明恒优先于本文件默认值);
11
- * 2. 内置暗色:`<html data-pactor-theme="dark">`(或挂在任意祖先容器上);
12
- * 不设置时跟随系统 prefers-color-scheme(三态:light / dark / 跟随系统)。
13
- * 颜色令牌无需暗色覆盖块(语义令牌自动翻转),仅投影/遮罩有暗色覆盖;
14
- * 3. 结构覆盖仍可直接写 `.pactor-chat-*` class 规则。
15
- *
16
- * 使用:import 'pactor-chat/styles.css';
17
- */
18
-
19
- /* ============================================================
20
- * 1. 皮肤 token(light)
21
- * ============================================================ */
22
-
23
- /* 令牌默认值声明在 :root(而非 chat 容器类):容器级直接声明会压过一切
24
- 自 :root 继承的皮肤覆盖(继承恒输于直接声明);置于 :root 后,
25
- theme-studio 皮肤块 :root:not([data-pactor-theme='dark'])(0,2,0)
26
- 及同名 :root 规则(后加载胜出)均可覆盖 --pactor-chat-* 精调 */
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties;
3
+ @layer theme {
4
+ :root, :host {
5
+ --spacing: 0.25rem;
6
+ --container-xl: 36rem;
7
+ --text-xs: 0.75rem;
8
+ --text-xs--line-height: calc(1 / 0.75);
9
+ --text-sm: 0.875rem;
10
+ --text-sm--line-height: calc(1.25 / 0.875);
11
+ --text-xl: 1.25rem;
12
+ --text-xl--line-height: calc(1.75 / 1.25);
13
+ --font-weight-medium: 500;
14
+ --font-weight-semibold: 600;
15
+ --animate-spin: spin 1s linear infinite;
16
+ --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
17
+ --default-transition-duration: 150ms;
18
+ --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
19
+ }
20
+ }
21
+ @layer utilities {
22
+ .\@container {
23
+ container-type: inline-size;
24
+ }
25
+ .pointer-events-none {
26
+ pointer-events: none;
27
+ }
28
+ .visible {
29
+ visibility: visible;
30
+ }
31
+ .absolute {
32
+ position: absolute;
33
+ }
34
+ .fixed {
35
+ position: fixed;
36
+ }
37
+ .relative {
38
+ position: relative;
39
+ }
40
+ .static {
41
+ position: static;
42
+ }
43
+ .inset-0 {
44
+ inset: 0px;
45
+ }
46
+ .top-0 {
47
+ top: 0px;
48
+ }
49
+ .top-1\/2 {
50
+ top: calc(1 / 2 * 100%);
51
+ }
52
+ .top-3 {
53
+ top: calc(var(--spacing) * 3);
54
+ }
55
+ .right-0 {
56
+ right: 0px;
57
+ }
58
+ .right-full {
59
+ right: 100%;
60
+ }
61
+ .bottom-full {
62
+ bottom: 100%;
63
+ }
64
+ .left-0 {
65
+ left: 0px;
66
+ }
67
+ .left-2 {
68
+ left: calc(var(--spacing) * 2);
69
+ }
70
+ .left-4 {
71
+ left: calc(var(--spacing) * 4);
72
+ }
73
+ .left-auto {
74
+ left: auto;
75
+ }
76
+ .z-10 {
77
+ z-index: 10;
78
+ }
79
+ .z-40 {
80
+ z-index: 40;
81
+ }
82
+ .z-50 {
83
+ z-index: 50;
84
+ }
85
+ .container {
86
+ width: 100%;
87
+ @media (width >= 40rem) {
88
+ max-width: 40rem;
89
+ }
90
+ @media (width >= 48rem) {
91
+ max-width: 48rem;
92
+ }
93
+ @media (width >= 64rem) {
94
+ max-width: 64rem;
95
+ }
96
+ @media (width >= 80rem) {
97
+ max-width: 80rem;
98
+ }
99
+ @media (width >= 96rem) {
100
+ max-width: 96rem;
101
+ }
102
+ }
103
+ .mx-0\.5 {
104
+ margin-inline: calc(var(--spacing) * 0.5);
105
+ }
106
+ .mx-auto {
107
+ margin-inline: auto;
108
+ }
109
+ .mt-0\.5 {
110
+ margin-top: calc(var(--spacing) * 0.5);
111
+ }
112
+ .mt-1 {
113
+ margin-top: var(--spacing);
114
+ }
115
+ .mt-2 {
116
+ margin-top: calc(var(--spacing) * 2);
117
+ }
118
+ .mr-2 {
119
+ margin-right: calc(var(--spacing) * 2);
120
+ }
121
+ .mb-1 {
122
+ margin-bottom: var(--spacing);
123
+ }
124
+ .mb-2 {
125
+ margin-bottom: calc(var(--spacing) * 2);
126
+ }
127
+ .ml-0\.5 {
128
+ margin-left: calc(var(--spacing) * 0.5);
129
+ }
130
+ .ml-5 {
131
+ margin-left: calc(var(--spacing) * 5);
132
+ }
133
+ .line-clamp-3 {
134
+ overflow: hidden;
135
+ display: -webkit-box;
136
+ -webkit-box-orient: vertical;
137
+ -webkit-line-clamp: 3;
138
+ }
139
+ .block {
140
+ display: block;
141
+ }
142
+ .flex {
143
+ display: flex;
144
+ }
145
+ .grid {
146
+ display: grid;
147
+ }
148
+ .hidden {
149
+ display: none;
150
+ }
151
+ .inline {
152
+ display: inline;
153
+ }
154
+ .inline-block {
155
+ display: inline-block;
156
+ }
157
+ .inline-flex {
158
+ display: inline-flex;
159
+ }
160
+ .table {
161
+ display: table;
162
+ }
163
+ .scrollbar-subtle {
164
+ scrollbar-width: thin;
165
+ scrollbar-color: var(--muted-foreground) transparent;
166
+ @supports (color: color-mix(in lab, red, red)) {
167
+ scrollbar-color: color-mix(in oklch, var(--muted-foreground) 30%, transparent) transparent;
168
+ }
169
+ &::-webkit-scrollbar {
170
+ width: 6px;
171
+ height: 6px;
172
+ }
173
+ &::-webkit-scrollbar-track {
174
+ background: transparent;
175
+ }
176
+ &::-webkit-scrollbar-thumb {
177
+ background: var(--muted-foreground);
178
+ @supports (color: color-mix(in lab, red, red)) {
179
+ background: color-mix(in oklch, var(--muted-foreground) 25%, transparent);
180
+ }
181
+ border-radius: 999px;
182
+ }
183
+ &::-webkit-scrollbar-thumb:hover {
184
+ background: var(--muted-foreground);
185
+ @supports (color: color-mix(in lab, red, red)) {
186
+ background: color-mix(in oklch, var(--muted-foreground) 45%, transparent);
187
+ }
188
+ }
189
+ &::-webkit-scrollbar-corner {
190
+ background: transparent;
191
+ }
192
+ }
193
+ .size-1\.5 {
194
+ width: calc(var(--spacing) * 1.5);
195
+ height: calc(var(--spacing) * 1.5);
196
+ }
197
+ .size-7 {
198
+ width: calc(var(--spacing) * 7);
199
+ height: calc(var(--spacing) * 7);
200
+ }
201
+ .h-1 {
202
+ height: var(--spacing);
203
+ }
204
+ .h-5 {
205
+ height: calc(var(--spacing) * 5);
206
+ }
207
+ .h-8 {
208
+ height: calc(var(--spacing) * 8);
209
+ }
210
+ .h-full {
211
+ height: 100%;
212
+ }
213
+ .max-h-72 {
214
+ max-height: calc(var(--spacing) * 72);
215
+ }
216
+ .max-h-\[40\%\] {
217
+ max-height: 40%;
218
+ }
219
+ .min-h-0 {
220
+ min-height: 0px;
221
+ }
222
+ .min-h-\[60px\] {
223
+ min-height: 60px;
224
+ }
225
+ .w-\(--pactor-chat-rail-width\) {
226
+ width: var(--pactor-chat-rail-width);
227
+ }
228
+ .w-1 {
229
+ width: var(--spacing);
230
+ }
231
+ .w-4 {
232
+ width: calc(var(--spacing) * 4);
233
+ }
234
+ .w-48 {
235
+ width: calc(var(--spacing) * 48);
236
+ }
237
+ .w-56 {
238
+ width: calc(var(--spacing) * 56);
239
+ }
240
+ .w-64 {
241
+ width: calc(var(--spacing) * 64);
242
+ }
243
+ .w-72 {
244
+ width: calc(var(--spacing) * 72);
245
+ }
246
+ .w-\[52px\] {
247
+ width: 52px;
248
+ }
249
+ .w-\[61\.8cqw\] {
250
+ width: 61.8cqw;
251
+ }
252
+ .w-\[250px\] {
253
+ width: 250px;
254
+ }
255
+ .w-fit {
256
+ width: fit-content;
257
+ }
258
+ .w-full {
259
+ width: 100%;
260
+ }
261
+ .max-w-full {
262
+ max-width: 100%;
263
+ }
264
+ .max-w-xl {
265
+ max-width: var(--container-xl);
266
+ }
267
+ .min-w-0 {
268
+ min-width: 0px;
269
+ }
270
+ .flex-1 {
271
+ flex: 1;
272
+ }
273
+ .shrink-0 {
274
+ flex-shrink: 0;
275
+ }
276
+ .-translate-y-1\/2 {
277
+ --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
278
+ translate: var(--tw-translate-x) var(--tw-translate-y);
279
+ }
280
+ .animate-pulse {
281
+ animation: var(--animate-pulse);
282
+ }
283
+ .animate-spin {
284
+ animation: var(--animate-spin);
285
+ }
286
+ .cursor-col-resize {
287
+ cursor: col-resize;
288
+ }
289
+ .cursor-pointer {
290
+ cursor: pointer;
291
+ }
292
+ .touch-none {
293
+ touch-action: none;
294
+ }
295
+ .grid-cols-1 {
296
+ grid-template-columns: repeat(1, minmax(0, 1fr));
297
+ }
298
+ .flex-col {
299
+ flex-direction: column;
300
+ }
301
+ .flex-row-reverse {
302
+ flex-direction: row-reverse;
303
+ }
304
+ .flex-wrap {
305
+ flex-wrap: wrap;
306
+ }
307
+ .items-baseline {
308
+ align-items: baseline;
309
+ }
310
+ .items-center {
311
+ align-items: center;
312
+ }
313
+ .items-end {
314
+ align-items: flex-end;
315
+ }
316
+ .items-start {
317
+ align-items: flex-start;
318
+ }
319
+ .justify-between {
320
+ justify-content: space-between;
321
+ }
322
+ .justify-center {
323
+ justify-content: center;
324
+ }
325
+ .justify-end {
326
+ justify-content: flex-end;
327
+ }
328
+ .gap-0\.5 {
329
+ gap: calc(var(--spacing) * 0.5);
330
+ }
331
+ .gap-1 {
332
+ gap: var(--spacing);
333
+ }
334
+ .gap-1\.5 {
335
+ gap: calc(var(--spacing) * 1.5);
336
+ }
337
+ .gap-2 {
338
+ gap: calc(var(--spacing) * 2);
339
+ }
340
+ .gap-2\.5 {
341
+ gap: calc(var(--spacing) * 2.5);
342
+ }
343
+ .gap-3 {
344
+ gap: calc(var(--spacing) * 3);
345
+ }
346
+ .gap-4 {
347
+ gap: calc(var(--spacing) * 4);
348
+ }
349
+ .truncate {
350
+ overflow: hidden;
351
+ text-overflow: ellipsis;
352
+ white-space: nowrap;
353
+ }
354
+ .overflow-auto {
355
+ overflow: auto;
356
+ }
357
+ .overflow-hidden {
358
+ overflow: hidden;
359
+ }
360
+ .overflow-x-auto {
361
+ overflow-x: auto;
362
+ }
363
+ .overflow-y-auto {
364
+ overflow-y: auto;
365
+ }
366
+ .rounded-full {
367
+ border-radius: calc(infinity * 1px);
368
+ }
369
+ .rounded-lg {
370
+ border-radius: var(--radius);
371
+ }
372
+ .rounded-md {
373
+ border-radius: calc(var(--radius) * 0.8);
374
+ }
375
+ .rounded-sm {
376
+ border-radius: calc(var(--radius) * 0.6);
377
+ }
378
+ .rounded-xl {
379
+ border-radius: calc(var(--radius) * 1.4);
380
+ }
381
+ .border {
382
+ border-style: var(--tw-border-style);
383
+ border-width: 1px;
384
+ }
385
+ .border-t {
386
+ border-top-style: var(--tw-border-style);
387
+ border-top-width: 1px;
388
+ }
389
+ .border-r {
390
+ border-right-style: var(--tw-border-style);
391
+ border-right-width: 1px;
392
+ }
393
+ .border-b {
394
+ border-bottom-style: var(--tw-border-style);
395
+ border-bottom-width: 1px;
396
+ }
397
+ .border-l {
398
+ border-left-style: var(--tw-border-style);
399
+ border-left-width: 1px;
400
+ }
401
+ .border-dashed {
402
+ --tw-border-style: dashed;
403
+ border-style: dashed;
404
+ }
405
+ .border-border {
406
+ border-color: var(--border);
407
+ }
408
+ .bg-accent {
409
+ background-color: var(--accent);
410
+ }
411
+ .bg-background {
412
+ background-color: var(--background);
413
+ }
414
+ .bg-muted {
415
+ background-color: var(--muted);
416
+ }
417
+ .bg-muted-foreground\/50 {
418
+ background-color: var(--muted-foreground);
419
+ @supports (color: color-mix(in lab, red, red)) {
420
+ background-color: color-mix(in oklab, var(--muted-foreground) 50%, transparent);
421
+ }
422
+ }
423
+ .bg-popover {
424
+ background-color: var(--popover);
425
+ }
426
+ .bg-primary {
427
+ background-color: var(--primary);
428
+ }
429
+ .p-1 {
430
+ padding: var(--spacing);
431
+ }
432
+ .p-1\.5 {
433
+ padding: calc(var(--spacing) * 1.5);
434
+ }
435
+ .p-2 {
436
+ padding: calc(var(--spacing) * 2);
437
+ }
438
+ .p-3 {
439
+ padding: calc(var(--spacing) * 3);
440
+ }
441
+ .p-4 {
442
+ padding: calc(var(--spacing) * 4);
443
+ }
444
+ .px-1 {
445
+ padding-inline: var(--spacing);
446
+ }
447
+ .px-1\.5 {
448
+ padding-inline: calc(var(--spacing) * 1.5);
449
+ }
450
+ .px-2 {
451
+ padding-inline: calc(var(--spacing) * 2);
452
+ }
453
+ .px-3 {
454
+ padding-inline: calc(var(--spacing) * 3);
455
+ }
456
+ .px-3\.5 {
457
+ padding-inline: calc(var(--spacing) * 3.5);
458
+ }
459
+ .px-4 {
460
+ padding-inline: calc(var(--spacing) * 4);
461
+ }
462
+ .py-0\.5 {
463
+ padding-block: calc(var(--spacing) * 0.5);
464
+ }
465
+ .py-1 {
466
+ padding-block: var(--spacing);
467
+ }
468
+ .py-1\.5 {
469
+ padding-block: calc(var(--spacing) * 1.5);
470
+ }
471
+ .py-2 {
472
+ padding-block: calc(var(--spacing) * 2);
473
+ }
474
+ .py-2\.5 {
475
+ padding-block: calc(var(--spacing) * 2.5);
476
+ }
477
+ .py-3 {
478
+ padding-block: calc(var(--spacing) * 3);
479
+ }
480
+ .py-4 {
481
+ padding-block: calc(var(--spacing) * 4);
482
+ }
483
+ .py-10 {
484
+ padding-block: calc(var(--spacing) * 10);
485
+ }
486
+ .pt-2 {
487
+ padding-top: calc(var(--spacing) * 2);
488
+ }
489
+ .pt-3 {
490
+ padding-top: calc(var(--spacing) * 3);
491
+ }
492
+ .pr-2 {
493
+ padding-right: calc(var(--spacing) * 2);
494
+ }
495
+ .pb-1 {
496
+ padding-bottom: var(--spacing);
497
+ }
498
+ .pb-2 {
499
+ padding-bottom: calc(var(--spacing) * 2);
500
+ }
501
+ .pl-4 {
502
+ padding-left: calc(var(--spacing) * 4);
503
+ }
504
+ .pl-5 {
505
+ padding-left: calc(var(--spacing) * 5);
506
+ }
507
+ .pl-6 {
508
+ padding-left: calc(var(--spacing) * 6);
509
+ }
510
+ .pl-7 {
511
+ padding-left: calc(var(--spacing) * 7);
512
+ }
513
+ .text-center {
514
+ text-align: center;
515
+ }
516
+ .text-left {
517
+ text-align: left;
518
+ }
519
+ .align-middle {
520
+ vertical-align: middle;
521
+ }
522
+ .align-super {
523
+ vertical-align: super;
524
+ }
525
+ .text-sm {
526
+ font-size: var(--text-sm);
527
+ line-height: var(--tw-leading, var(--text-sm--line-height));
528
+ }
529
+ .text-xl {
530
+ font-size: var(--text-xl);
531
+ line-height: var(--tw-leading, var(--text-xl--line-height));
532
+ }
533
+ .text-xs {
534
+ font-size: var(--text-xs);
535
+ line-height: var(--tw-leading, var(--text-xs--line-height));
536
+ }
537
+ .text-\[13px\] {
538
+ font-size: 13px;
539
+ }
540
+ .leading-4 {
541
+ --tw-leading: calc(var(--spacing) * 4);
542
+ line-height: calc(var(--spacing) * 4);
543
+ }
544
+ .leading-5 {
545
+ --tw-leading: calc(var(--spacing) * 5);
546
+ line-height: calc(var(--spacing) * 5);
547
+ }
548
+ .leading-\[18px\] {
549
+ --tw-leading: 18px;
550
+ line-height: 18px;
551
+ }
552
+ .font-medium {
553
+ --tw-font-weight: var(--font-weight-medium);
554
+ font-weight: var(--font-weight-medium);
555
+ }
556
+ .font-semibold {
557
+ --tw-font-weight: var(--font-weight-semibold);
558
+ font-weight: var(--font-weight-semibold);
559
+ }
560
+ .break-words {
561
+ overflow-wrap: break-word;
562
+ }
563
+ .whitespace-pre-wrap {
564
+ white-space: pre-wrap;
565
+ }
566
+ .text-accent-foreground {
567
+ color: var(--accent-foreground);
568
+ }
569
+ .text-destructive {
570
+ color: var(--destructive);
571
+ }
572
+ .text-foreground {
573
+ color: var(--foreground);
574
+ }
575
+ .text-info {
576
+ color: var(--info);
577
+ }
578
+ .text-muted-foreground {
579
+ color: var(--muted-foreground);
580
+ }
581
+ .text-popover-foreground {
582
+ color: var(--popover-foreground);
583
+ }
584
+ .text-primary {
585
+ color: var(--primary);
586
+ }
587
+ .text-success {
588
+ color: var(--success);
589
+ }
590
+ .text-warning {
591
+ color: var(--warning);
592
+ }
593
+ .opacity-0 {
594
+ opacity: 0%;
595
+ }
596
+ .shadow-md {
597
+ --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
598
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
599
+ }
600
+ .ring-2 {
601
+ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
602
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
603
+ }
604
+ .ring-ring\/50 {
605
+ --tw-ring-color: var(--ring);
606
+ @supports (color: color-mix(in lab, red, red)) {
607
+ --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);
608
+ }
609
+ }
610
+ .outline {
611
+ outline-style: var(--tw-outline-style);
612
+ outline-width: 1px;
613
+ }
614
+ .blur {
615
+ --tw-blur: blur(8px);
616
+ filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
617
+ }
618
+ .transition-\[width\] {
619
+ transition-property: width;
620
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
621
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
622
+ }
623
+ .transition-colors {
624
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
625
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
626
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
627
+ }
628
+ .transition-transform {
629
+ transition-property: transform, translate, scale, rotate;
630
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
631
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
632
+ }
633
+ .outline-none {
634
+ --tw-outline-style: none;
635
+ outline-style: none;
636
+ }
637
+ @media (hover: hover) {
638
+ .group-hover\:opacity-100:is(:where(.group):hover *) {
639
+ opacity: 100%;
640
+ }
641
+ }
642
+ .not-last\:before\:absolute:not(:last-child)::before {
643
+ content: var(--tw-content);
644
+ position: absolute;
645
+ }
646
+ .not-last\:before\:top-7:not(:last-child)::before {
647
+ content: var(--tw-content);
648
+ top: calc(var(--spacing) * 7);
649
+ }
650
+ .not-last\:before\:-bottom-1:not(:last-child)::before {
651
+ content: var(--tw-content);
652
+ bottom: calc(var(--spacing) * -1);
653
+ }
654
+ .not-last\:before\:left-\[7\.5px\]:not(:last-child)::before {
655
+ content: var(--tw-content);
656
+ left: 7.5px;
657
+ }
658
+ .not-last\:before\:w-px:not(:last-child)::before {
659
+ content: var(--tw-content);
660
+ width: 1px;
661
+ }
662
+ .not-last\:before\:bg-border:not(:last-child)::before {
663
+ content: var(--tw-content);
664
+ background-color: var(--border);
665
+ }
666
+ .not-last\:before\:content-\[\"\"\]:not(:last-child)::before {
667
+ --tw-content: "";
668
+ content: var(--tw-content);
669
+ }
670
+ @media (hover: hover) {
671
+ .hover\:border-primary:hover {
672
+ border-color: var(--primary);
673
+ }
674
+ .hover\:bg-accent:hover {
675
+ background-color: var(--accent);
676
+ }
677
+ .hover\:text-destructive:hover {
678
+ color: var(--destructive);
679
+ }
680
+ .hover\:text-foreground:hover {
681
+ color: var(--foreground);
682
+ }
683
+ .hover\:underline:hover {
684
+ text-decoration-line: underline;
685
+ }
686
+ .hover\:opacity-80:hover {
687
+ opacity: 80%;
688
+ }
689
+ }
690
+ .focus-visible\:ring-\[3px\]:focus-visible {
691
+ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
692
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
693
+ }
694
+ .focus-visible\:ring-ring\/50:focus-visible {
695
+ --tw-ring-color: var(--ring);
696
+ @supports (color: color-mix(in lab, red, red)) {
697
+ --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);
698
+ }
699
+ }
700
+ .disabled\:pointer-events-none:disabled {
701
+ pointer-events: none;
702
+ }
703
+ .disabled\:opacity-50:disabled {
704
+ opacity: 50%;
705
+ }
706
+ .data-\[active\=true\]\:bg-accent[data-active="true"] {
707
+ background-color: var(--accent);
708
+ }
709
+ .data-\[open\=true\]\:rotate-90[data-open="true"] {
710
+ rotate: 90deg;
711
+ }
712
+ @media (prefers-reduced-motion: reduce) {
713
+ .motion-reduce\:animate-none {
714
+ animation: none;
715
+ }
716
+ }
717
+ @media (width >= 40rem) {
718
+ .sm\:grid-cols-2 {
719
+ grid-template-columns: repeat(2, minmax(0, 1fr));
720
+ }
721
+ }
722
+ }
723
+ .pactor-markdown {
724
+ --pactor-markdown-fg: var(--foreground, light-dark(#1f2328, #e6edf3));
725
+ --pactor-markdown-muted-fg: var(--muted-foreground, light-dark(#59636e, #9198a1));
726
+ --pactor-markdown-border: var(--border, light-dark(#d1d9e0, #3d444d));
727
+ --pactor-markdown-muted-bg: var(--muted, light-dark(#f6f8fa, #262c36));
728
+ --pactor-markdown-code-bg: var(--muted, light-dark(#eff1f3, #2a3139));
729
+ --pactor-markdown-link: var(--primary, light-dark(#0969da, #4493f8));
730
+ --pactor-markdown-quote-border: var(--border, light-dark(#d1d9e0, #3d444d));
731
+ --pactor-markdown-radius: var(--radius, 6px);
732
+ color: var(--pactor-markdown-fg);
733
+ line-height: 1.75;
734
+ overflow-wrap: break-word;
735
+ }
736
+ .pactor-markdown > :first-child {
737
+ margin-top: 0;
738
+ }
739
+ .pactor-markdown > :last-child {
740
+ margin-bottom: 0;
741
+ }
742
+ .pactor-markdown h1, .pactor-markdown h2, .pactor-markdown h3, .pactor-markdown h4, .pactor-markdown h5, .pactor-markdown h6 {
743
+ margin: 1.4em 0 0.6em;
744
+ font-weight: 600;
745
+ line-height: 1.35;
746
+ }
747
+ .pactor-markdown h1 {
748
+ font-size: 1.5em;
749
+ padding-bottom: 0.3em;
750
+ border-bottom: 1px solid var(--pactor-markdown-border);
751
+ }
752
+ .pactor-markdown h2 {
753
+ font-size: 1.3em;
754
+ padding-bottom: 0.25em;
755
+ border-bottom: 1px solid var(--pactor-markdown-border);
756
+ }
757
+ .pactor-markdown h3 {
758
+ font-size: 1.15em;
759
+ }
760
+ .pactor-markdown h4 {
761
+ font-size: 1.05em;
762
+ }
763
+ .pactor-markdown h5, .pactor-markdown h6 {
764
+ font-size: 1em;
765
+ }
766
+ .pactor-markdown h6 {
767
+ color: var(--pactor-markdown-muted-fg);
768
+ }
769
+ .pactor-markdown p {
770
+ margin: 0.75em 0;
771
+ }
772
+ .pactor-markdown ul, .pactor-markdown ol {
773
+ margin: 0.75em 0;
774
+ padding-left: 1.6em;
775
+ }
776
+ .pactor-markdown ul {
777
+ list-style: disc;
778
+ }
779
+ .pactor-markdown ul ul {
780
+ list-style: circle;
781
+ }
782
+ .pactor-markdown ul ul ul {
783
+ list-style: square;
784
+ }
785
+ .pactor-markdown ol {
786
+ list-style: decimal;
787
+ }
788
+ .pactor-markdown li::marker {
789
+ color: var(--pactor-markdown-muted-fg);
790
+ }
791
+ .pactor-markdown li + li {
792
+ margin-top: 0.3em;
793
+ }
794
+ .pactor-markdown li > ul, .pactor-markdown li > ol {
795
+ margin: 0.3em 0;
796
+ }
797
+ .pactor-markdown li input[type='checkbox'] {
798
+ margin: 0 0.45em 0 0;
799
+ vertical-align: -0.1em;
800
+ }
801
+ .pactor-markdown li:has(> input[type='checkbox']:first-child) {
802
+ list-style: none;
803
+ margin-left: -1.6em;
804
+ }
805
+ .pactor-markdown blockquote {
806
+ margin: 0.75em 0;
807
+ padding: 0.4em 1em;
808
+ border-left: 3px solid var(--pactor-markdown-quote-border);
809
+ border-radius: 0 var(--pactor-markdown-radius) var(--pactor-markdown-radius) 0;
810
+ background: var(--pactor-markdown-muted-bg);
811
+ color: var(--pactor-markdown-muted-fg);
812
+ }
813
+ .pactor-markdown blockquote > :first-child {
814
+ margin-top: 0;
815
+ }
816
+ .pactor-markdown blockquote > :last-child {
817
+ margin-bottom: 0;
818
+ }
819
+ .pactor-markdown hr {
820
+ margin: 1.5em 0;
821
+ border: 0;
822
+ border-top: 1px solid var(--pactor-markdown-border);
823
+ }
824
+ .pactor-markdown a {
825
+ color: var(--pactor-markdown-link);
826
+ text-decoration: none;
827
+ }
828
+ .pactor-markdown a:hover {
829
+ text-decoration: underline;
830
+ }
831
+ .pactor-markdown strong {
832
+ font-weight: 600;
833
+ }
834
+ .pactor-markdown mark {
835
+ padding: 0 0.2em;
836
+ border-radius: 3px;
837
+ }
838
+ .pactor-markdown code, .pactor-markdown pre {
839
+ font-family: ui-monospace, 'SF Mono', SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace;
840
+ }
841
+ .pactor-markdown :not(pre) > code {
842
+ padding: 0.15em 0.4em;
843
+ border-radius: 4px;
844
+ background: var(--pactor-markdown-code-bg);
845
+ font-size: 0.875em;
846
+ }
847
+ .pactor-markdown pre {
848
+ margin: 0.85em 0;
849
+ padding: 12px 14px;
850
+ border: 1px solid var(--pactor-markdown-border);
851
+ border-radius: var(--pactor-markdown-radius);
852
+ background: var(--pactor-markdown-muted-bg);
853
+ font-size: 0.875em;
854
+ line-height: 1.6;
855
+ overflow-x: auto;
856
+ }
857
+ .pactor-markdown pre > code {
858
+ padding: 0;
859
+ border: 0;
860
+ background: transparent;
861
+ font-size: inherit;
862
+ }
863
+ .pactor-markdown table {
864
+ display: block;
865
+ width: max-content;
866
+ max-width: 100%;
867
+ margin: 0.85em 0;
868
+ border-collapse: collapse;
869
+ overflow-x: auto;
870
+ font-size: 0.925em;
871
+ }
872
+ .pactor-markdown th, .pactor-markdown td {
873
+ padding: 6px 14px;
874
+ border: 1px solid var(--pactor-markdown-border);
875
+ }
876
+ .pactor-markdown th {
877
+ background: var(--pactor-markdown-muted-bg);
878
+ font-weight: 600;
879
+ }
880
+ .pactor-markdown tr:nth-child(even) td {
881
+ background: var(--pactor-markdown-muted-bg);
882
+ }
883
+ .pactor-markdown img {
884
+ max-width: 100%;
885
+ border-radius: var(--pactor-markdown-radius);
886
+ box-sizing: border-box;
887
+ }
888
+ .pactor-markdown .katex {
889
+ font-size: 1.05em;
890
+ }
891
+ .pactor-markdown .katex-display {
892
+ margin: 0.85em 0;
893
+ padding: 4px 0;
894
+ overflow-x: auto;
895
+ overflow-y: hidden;
896
+ }
27
897
  :root {
28
- /* 颜色令牌默认值桥接 pactor-ui 语义令牌(皮肤覆盖语义令牌时自动跟随),
29
- 逗号后为 pactor-ui 缺席时的 chat 品牌默认 */
898
+ --pactor-chat-rail-width: 40px;
899
+ --pactor-chat-rail-popover-width: 320px;
30
900
  --pactor-chat-bg: var(--background, #f7f6f4);
31
901
  --pactor-chat-sidebar-bg: var(--sidebar, #efedea);
32
902
  --pactor-chat-fg: var(--foreground, #1a1d26);
@@ -37,26 +907,32 @@
37
907
  --pactor-chat-primary: var(--primary, #3c47dd);
38
908
  --pactor-chat-primary-fg: var(--primary-foreground, #ffffff);
39
909
  --pactor-chat-danger: var(--destructive, #d4380d);
40
- --pactor-chat-danger-bg: color-mix(
910
+ --pactor-chat-danger-bg: var(--destructive, #d4380d);
911
+ @supports (color: color-mix(in lab, red, red)) {
912
+ --pactor-chat-danger-bg: color-mix(
41
913
  in oklab,
42
914
  var(--destructive, #d4380d) 8%,
43
915
  var(--background, #fff)
44
916
  );
917
+ }
45
918
  --pactor-chat-success: var(--success, #389e0d);
46
- --pactor-chat-user-bubble-bg: color-mix(
919
+ --pactor-chat-user-bubble-bg: var(--primary, #3c47dd);
920
+ @supports (color: color-mix(in lab, red, red)) {
921
+ --pactor-chat-user-bubble-bg: color-mix(
47
922
  in oklab,
48
923
  var(--primary, #3c47dd) 7%,
49
924
  var(--background, #fff)
50
925
  );
51
- --pactor-chat-user-bubble-border: color-mix(
926
+ }
927
+ --pactor-chat-user-bubble-border: var(--primary, #3c47dd);
928
+ @supports (color: color-mix(in lab, red, red)) {
929
+ --pactor-chat-user-bubble-border: color-mix(
52
930
  in oklab,
53
931
  var(--primary, #3c47dd) 35%,
54
932
  transparent
55
933
  );
934
+ }
56
935
  --pactor-chat-code-bg: var(--muted, #f6f7f9);
57
- /* 产出物卡片图标盒 tone 配色(表格 green / 数据 amber / 代码 blue /
58
- 图片 violet;文档与兜底走 --pactor-chat-muted(-fg) 不入列)。
59
- 暗色值见下方 [data-pactor-theme='dark'] 载体块 */
60
936
  --pactor-chat-artifact-tone-green-fg: #16a34a;
61
937
  --pactor-chat-artifact-tone-green-bg: #dcfce7;
62
938
  --pactor-chat-artifact-tone-blue-fg: #2563eb;
@@ -65,53 +941,34 @@
65
941
  --pactor-chat-artifact-tone-amber-bg: #fef3c7;
66
942
  --pactor-chat-artifact-tone-violet-fg: #7c3aed;
67
943
  --pactor-chat-artifact-tone-violet-bg: #ede9fe;
68
- /* 旧通用圆角令牌(保留兼容);新组件改用下方圆角阶梯 */
69
944
  --pactor-chat-radius: 12px;
70
- /* 圆角阶梯:sm 控件 / md 卡片 / lg 气泡 / xl composer */
71
945
  --pactor-chat-radius-sm: 6px;
72
946
  --pactor-chat-radius-md: 8px;
73
947
  --pactor-chat-radius-lg: 16px;
74
948
  --pactor-chat-radius-xl: 26px;
75
- /* 投影:sm 气泡/卡片轻投影;composer 柔和分层投影 */
76
949
  --pactor-chat-shadow-sm: 0 1px 2px rgb(0 0 0 / 4%);
77
- --pactor-chat-shadow-composer:
78
- 0 1px 2px rgb(0 0 0 / 3%),
950
+ --pactor-chat-shadow-composer: 0 1px 2px rgb(0 0 0 / 3%),
79
951
  0 10px 28px -10px rgb(0 0 0 / 8%);
80
- /* 衬线展示字体栈:空状态问候 / chat 布局标题 */
81
952
  --pactor-chat-font-display: 'Songti SC', 'Noto Serif SC', Georgia,
82
953
  'Times New Roman', serif;
83
- /* AppShell:移动端顶栏高度 / 抽屉遮罩色。
84
- 侧栏宽度不走 chat 私有令牌——统一由 ui 皮肤令牌驱动:
85
- --sidebar-width(展开,默认 16rem)/ --sidebar-width-icon(折叠 icon rail,
86
- 默认 3rem),theme-studio 生成的皮肤可直接覆盖两者 */
87
954
  --pactor-chat-shell-topbar-height: 44px;
88
955
  --pactor-chat-shell-scrim: rgb(0 0 0 / 40%);
89
- /* 产出物面板(spec: chat-artifact-panel):桌面固定宽右栏。
90
- 默认宽与对话列一致(--pactor-chat-content-width),
91
- 宽度夹取 [--pactor-chat-inspector-min-width,
92
- min(--pactor-chat-inspector-max-width, host 宽 2/3)];
93
- 背景略深于聊天区底色,视觉上与消息流区分 */
94
956
  --pactor-chat-inspector-width: var(--pactor-chat-content-width);
95
957
  --pactor-chat-inspector-min-width: 480px;
96
958
  --pactor-chat-inspector-max-width: 600px;
97
- --pactor-chat-inspector-bg: color-mix(
959
+ --pactor-chat-inspector-bg: var(--pactor-chat-bg);
960
+ @supports (color: color-mix(in lab, red, red)) {
961
+ --pactor-chat-inspector-bg: color-mix(
98
962
  in srgb,
99
963
  var(--pactor-chat-bg) 96%,
100
964
  black
101
965
  );
102
- /* 对话列限宽居中(spec: chat-app-shell 嵌入契约):置 none 关闭限宽 */
966
+ }
103
967
  --pactor-chat-content-width: 768px;
104
- /* 对话列左右最小内间距(spec: chat-artifact-panel / 拖拽调宽):
105
- 面板调宽挤压剩余空间时,对话列左右始终保留该间距 */
106
968
  --pactor-chat-content-gutter: 16px;
107
- /* 聊天区 header 与产物面板 header 的公共高度(min-height,border-box):
108
- 两边内容自然高度不同(面板侧 menu-trigger 更高),经统一 min-height
109
- 对齐,面板打开时两条分隔线同高;内容更高时自然撑开 */
110
969
  --pactor-chat-header-height: 48px;
111
970
  }
112
-
113
971
  .pactor-chat-view {
114
-
115
972
  display: flex;
116
973
  flex-direction: column;
117
974
  height: 100%;
@@ -120,19 +977,11 @@
120
977
  font-size: 14px;
121
978
  line-height: 1.6;
122
979
  }
123
-
124
- /* 暗色皮肤:data-pactor-theme="dark"(html 或任意祖先容器)。
125
- 颜色令牌经 var() 桥接 pactor-ui 语义令牌,暗色自动翻转,无需覆盖;
126
- 这里只保留投影与遮罩的暗色值(组件规则不区分主题)。
127
- 声明落在属性载体元素上(后代继承),与皮肤暗色块同优先级(0,1,0)、
128
- 皮肤后加载胜出——皮肤的暗色精调优先生效。 */
129
980
  [data-pactor-theme='dark'] {
130
981
  --pactor-chat-shadow-sm: 0 1px 2px rgb(0 0 0 / 35%);
131
- --pactor-chat-shadow-composer:
132
- 0 1px 2px rgb(0 0 0 / 4%),
982
+ --pactor-chat-shadow-composer: 0 1px 2px rgb(0 0 0 / 4%),
133
983
  0 12px 32px -10px rgb(0 0 0 / 55%);
134
984
  --pactor-chat-shell-scrim: rgb(0 0 0 / 55%);
135
- /* 产出物卡片图标盒 tone 配色(暗色) */
136
985
  --pactor-chat-artifact-tone-green-fg: #4ade80;
137
986
  --pactor-chat-artifact-tone-green-bg: #14532d;
138
987
  --pactor-chat-artifact-tone-blue-fg: #93c5fd;
@@ -142,18 +991,12 @@
142
991
  --pactor-chat-artifact-tone-violet-fg: #c4b5fd;
143
992
  --pactor-chat-artifact-tone-violet-bg: #2e1065;
144
993
  }
145
-
146
- /* 系统偏好暗色兜底:未显式设置 data-pactor-theme 时跟随系统
147
- (与上方 [data-pactor-theme='dark'] 块一致——仅投影与遮罩)。
148
- :where() 降优先级为 (0,1,0):皮肤亮色块(0,2,0)加载后不被压盖 */
149
994
  @media (prefers-color-scheme: dark) {
150
995
  :root:where(:not([data-pactor-theme='light']):not([data-pactor-theme='dark'])) {
151
996
  --pactor-chat-shadow-sm: 0 1px 2px rgb(0 0 0 / 35%);
152
- --pactor-chat-shadow-composer:
153
- 0 1px 2px rgb(0 0 0 / 4%),
997
+ --pactor-chat-shadow-composer: 0 1px 2px rgb(0 0 0 / 4%),
154
998
  0 12px 32px -10px rgb(0 0 0 / 55%);
155
999
  --pactor-chat-shell-scrim: rgb(0 0 0 / 55%);
156
- /* 产出物卡片图标盒 tone 配色(暗色) */
157
1000
  --pactor-chat-artifact-tone-green-fg: #4ade80;
158
1001
  --pactor-chat-artifact-tone-green-bg: #14532d;
159
1002
  --pactor-chat-artifact-tone-blue-fg: #93c5fd;
@@ -164,16 +1007,6 @@
164
1007
  --pactor-chat-artifact-tone-violet-bg: #2e1065;
165
1008
  }
166
1009
  }
167
-
168
- /* ------------------------------------------------------------
169
- * chrome DSL 渲染层(spec: chat-chrome-dsl / chrome 令牌映射):
170
- * DSL 渲染的 chrome 子树(宿主 @pactor-app/ui 组件消费 shadcn
171
- * 语义令牌)统一包在本容器内,把 --pactor-chat-* 映射为 shadcn
172
- * 语义令牌——--pactor-chat-* 仍为皮肤唯一配置入口,暗色经上方
173
- * [data-pactor-theme='dark'] 覆盖链自动生效。
174
- * display:contents 使容器不参与布局;自定义属性沿 DOM 树继承,
175
- * 不受 display:contents 影响。
176
- * ------------------------------------------------------------ */
177
1010
  .pactor-chat-chrome {
178
1011
  display: contents;
179
1012
  --background: var(--pactor-chat-bg);
@@ -195,11 +1028,6 @@
195
1028
  --input: var(--pactor-chat-border);
196
1029
  --ring: var(--pactor-chat-primary);
197
1030
  }
198
-
199
- /* ============================================================
200
- * 2. 布局(chat 布局 + 消息区)
201
- * ============================================================ */
202
-
203
1031
  .pactor-chat-layout {
204
1032
  display: flex;
205
1033
  flex-direction: column;
@@ -207,7 +1035,6 @@
207
1035
  background: var(--pactor-chat-bg);
208
1036
  color: var(--pactor-chat-fg);
209
1037
  }
210
-
211
1038
  .pactor-chat-layout__header {
212
1039
  padding: 12px 16px;
213
1040
  border-bottom: 1px solid var(--pactor-chat-border);
@@ -215,7 +1042,6 @@
215
1042
  font-size: 15px;
216
1043
  font-weight: 600;
217
1044
  }
218
-
219
1045
  .pactor-chat-layout__main {
220
1046
  flex: 1;
221
1047
  min-height: 0;
@@ -223,25 +1049,11 @@
223
1049
  display: flex;
224
1050
  flex-direction: column;
225
1051
  }
226
-
227
- /* ------------------------------------------------------------
228
- * ChatWorkspace(spec: chat-dsl-page):createChatWorkspace 工厂
229
- * 返回组件的外层容器 = 对话列(ChatView);工作区头部(header)
230
- * 收进面板 host 的 __main 左列——面板打开时随 __main 通栏(左贴
231
- * 宿主边缘、右贴面板分隔线,不覆盖面板上方),不随对话列限宽。
232
- * ------------------------------------------------------------ */
233
-
234
1052
  .pactor-chat-workspace {
235
1053
  display: flex;
236
1054
  flex-direction: column;
237
1055
  height: 100%;
238
1056
  min-height: 0;
239
- /* 对话列缺省限宽居中(spec: chat-app-shell 嵌入契约):
240
- * shell content / 面板 host / 独立块级容器三场景统一生效。
241
- * width 用 calc 预留 gutter——对话列包含块是 __main 左列(面板
242
- * 宽度不计入 100% 基准),产物栏调宽挤压、max-width 限宽失效
243
- * (剩余空间不足)后左右仍恒保留 --pactor-chat-content-gutter
244
- * 内间距,不会贴到容器边缘或面板分隔线 */
245
1057
  width: calc(100% - 2 * var(--pactor-chat-content-gutter));
246
1058
  max-width: var(--pactor-chat-content-width);
247
1059
  margin-inline: auto;
@@ -249,21 +1061,16 @@
249
1061
  font-size: 14px;
250
1062
  line-height: 1.6;
251
1063
  }
252
-
253
- /* header 承载容器(无产物面板路径):header 通栏 + 主区填满剩余高度 */
254
1064
  .pactor-chat-with-header {
255
1065
  display: flex;
256
1066
  flex-direction: column;
257
1067
  height: 100%;
258
1068
  min-height: 0;
259
1069
  }
260
-
261
- .pactor-chat-with-header > .pactor-chat-shell,
262
- .pactor-chat-with-header > .pactor-chat-workspace {
1070
+ .pactor-chat-with-header > .pactor-chat-shell, .pactor-chat-with-header > .pactor-chat-workspace {
263
1071
  flex: 1;
264
1072
  min-height: 0;
265
1073
  }
266
-
267
1074
  .pactor-chat-workspace__header {
268
1075
  display: flex;
269
1076
  align-items: center;
@@ -272,43 +1079,29 @@
272
1079
  padding: 10px 16px;
273
1080
  border-bottom: 1px solid var(--pactor-chat-border);
274
1081
  flex-shrink: 0;
275
- /* 与产物面板 header 等高(--pactor-chat-header-height) */
276
1082
  box-sizing: border-box;
277
1083
  min-height: var(--pactor-chat-header-height);
278
1084
  }
279
-
280
1085
  .pactor-chat-workspace__title {
281
1086
  font-family: var(--pactor-chat-font-display);
282
1087
  font-size: 15px;
283
1088
  font-weight: 600;
284
1089
  }
285
-
286
1090
  .pactor-chat-workspace__header-extra {
287
1091
  display: flex;
288
1092
  align-items: center;
289
1093
  gap: 8px;
290
1094
  }
291
-
292
1095
  .pactor-chat-workspace > .pactor-chat-view {
293
1096
  flex: 1;
294
1097
  min-height: 0;
295
1098
  }
296
-
297
- /* ------------------------------------------------------------
298
- * AppShell(spec: chat-app-shell / chat-on-ui-sidebar):外壳结构与
299
- * 交互由 ui Sidebar 承担(data-slot 结构),chat 侧仅做令牌映射与
300
- * 尺寸对齐——--pactor-chat-* 仍为皮肤唯一配置入口,暗色经覆盖链
301
- * 自动生效。高度填满父容器(AppShell 传入 h-full min-h-0)。
302
- * ------------------------------------------------------------ */
303
-
304
1099
  .pactor-chat-shell {
305
1100
  overflow: hidden;
306
1101
  background: var(--pactor-chat-bg);
307
1102
  color: var(--pactor-chat-fg);
308
1103
  font-size: 14px;
309
1104
  line-height: 1.6;
310
- /* ui Sidebar 消费的 sidebar 系列语义令牌 → chat 令牌(映射手法与
311
- .pactor-chat-chrome 一致) */
312
1105
  --sidebar: var(--pactor-chat-sidebar-bg);
313
1106
  --sidebar-foreground: var(--pactor-chat-fg);
314
1107
  --sidebar-border: var(--pactor-chat-border);
@@ -318,59 +1111,27 @@
318
1111
  --sidebar-primary-foreground: var(--pactor-chat-primary-fg);
319
1112
  --sidebar-ring: var(--pactor-chat-primary);
320
1113
  }
321
-
322
- /* 侧栏宽度由 ui 皮肤令牌驱动(--sidebar-width / --sidebar-width-icon,
323
- 经 ui Sidebar 的 gap / 固定容器工具类引用),chat 不再单独覆盖;
324
- 原 chat 私有侧栏宽度令牌与 [data-collapsed] 规则一并移除——
325
- 后者自 chat-on-ui-sidebar 重构后等的是不存在的属性,从未生效 */
326
-
327
- /* 移动端顶栏高度与遮罩色对齐令牌 */
328
1114
  .pactor-chat-shell [data-slot='sidebar-topbar'] {
329
1115
  height: var(--pactor-chat-shell-topbar-height);
330
1116
  }
331
-
332
1117
  .pactor-chat-shell [data-slot='sidebar-scrim'] {
333
1118
  background: var(--pactor-chat-shell-scrim);
334
1119
  }
335
-
336
- /* 桌面折叠(icon rail,决策 D3):fallback 手写菜单降级为仅图标
337
- * (DSL 路径的 ui Menu 经 useSidebarDrawer().collapsed 自感知,
338
- * data-collapsed 仅在桌面折叠时出现,无需媒体查询) */
339
1120
  .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu {
340
1121
  padding-inline: 8px;
341
1122
  }
342
-
343
1123
  .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__item {
344
1124
  justify-content: center;
345
1125
  padding-inline: 0;
346
1126
  }
347
-
348
- .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__label,
349
- .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__badge,
350
- .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__dot,
351
- .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__group {
1127
+ .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__label, .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__badge, .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__dot, .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__group {
352
1128
  display: none;
353
1129
  }
354
-
355
- /* 产出物面板打开(spec: chat-artifact-panel):面板贴容器右缘——
356
- * 内容区右/上/下 padding 归零,面板 border-left 作分隔线 */
357
1130
  .pactor-chat-shell [data-slot='sidebar-content']:has(> .pactor-chat-inspector-host) {
358
1131
  padding-top: 0;
359
1132
  padding-right: 0;
360
1133
  padding-bottom: 0;
361
1134
  }
362
-
363
- /* ------------------------------------------------------------
364
- * ArtifactPanel(spec: chat-artifact-panel,设计决策 D2):
365
- * 产出物预览面板。桌面(≥768px)为工作区右侧固定宽栏(flex 同行,
366
- * 宽度经 --pactor-chat-inspector-width 可调);移动端(<768px)
367
- * 退化为右侧覆盖抽屉(遮罩点击关闭),与 AppShell 同一断点。
368
- * 面板关闭 / 未配置时不渲染 DOM(组合层保证)。
369
- * ------------------------------------------------------------ */
370
-
371
- /* 面板打开时的容器:行内容器 __row 承载左右两列——__main 左列
372
- * (header + 对话区纵向堆叠;header 通栏、不覆盖面板上方)与面板
373
- * 右列(独占全高);host 在 shell content 内撑满剩余高度与宽度 */
374
1135
  .pactor-chat-inspector-host {
375
1136
  display: flex;
376
1137
  flex-direction: column;
@@ -380,20 +1141,12 @@
380
1141
  overflow: hidden;
381
1142
  background: var(--pactor-chat-bg);
382
1143
  }
383
-
384
- /* host 行内容器:__main 左列与面板的 flex 行。对话列 gutter 契约
385
- * 由对话列自身 calc 宽度保证(见 .pactor-chat-workspace)——容器侧
386
- * 不加 padding/margin,否则 __main 内的 header 会被内缩,两端无法
387
- * 贴到宿主边缘与面板分隔线 */
388
1144
  .pactor-chat-inspector-host__row {
389
1145
  display: flex;
390
1146
  flex: 1;
391
1147
  width: 100%;
392
1148
  min-height: 0;
393
1149
  }
394
-
395
- /* __main 左列:header + 主区(AppShell / workspace)纵向堆叠,
396
- * 宽度 = 行宽减去面板宽(header 通栏:左贴宿主边缘、右贴面板分隔线) */
397
1150
  .pactor-chat-inspector-host__main {
398
1151
  display: flex;
399
1152
  flex-direction: column;
@@ -401,27 +1154,16 @@
401
1154
  min-width: 0;
402
1155
  min-height: 0;
403
1156
  }
404
-
405
- .pactor-chat-inspector-host__main > .pactor-chat-shell,
406
- .pactor-chat-inspector-host__main > .pactor-chat-workspace {
1157
+ .pactor-chat-inspector-host__main > .pactor-chat-shell, .pactor-chat-inspector-host__main > .pactor-chat-workspace {
407
1158
  flex: 1;
408
1159
  min-height: 0;
409
1160
  min-width: 0;
410
1161
  }
411
-
412
1162
  .pactor-chat-inspector {
413
1163
  position: relative;
414
1164
  display: flex;
415
1165
  flex-direction: column;
416
- /* 默认宽对齐对话列;上限 min(max-width 令牌 600px, host 宽 2/3)(与拖拽夹取一致),
417
- * 下限 min-width 令牌。
418
- * max-width 是拖拽 inline 宽度的硬兜底:inline width 不能覆盖 max-width,
419
- * 拖拽夹取偏差 / 拖拽后窗口尺寸变化时面板也不会突破上限 */
420
- width: min(
421
- var(--pactor-chat-inspector-width),
422
- var(--pactor-chat-inspector-max-width),
423
- calc(100% * 2 / 3)
424
- );
1166
+ width: min( var(--pactor-chat-inspector-width), var(--pactor-chat-inspector-max-width), calc(100% * 2 / 3) );
425
1167
  max-width: min(var(--pactor-chat-inspector-max-width), calc(100% * 2 / 3));
426
1168
  min-width: var(--pactor-chat-inspector-min-width);
427
1169
  flex-shrink: 0;
@@ -432,20 +1174,6 @@
432
1174
  line-height: 1.6;
433
1175
  overflow: hidden;
434
1176
  }
435
-
436
- /* 拖拽调宽手柄(spec: chat-artifact-panel / 拖拽调宽):
437
- * 面板左缘内覆 8px 热区(overflow:hidden 会裁掉负偏移,故内覆而非外探) */
438
- .pactor-chat-inspector__resize {
439
- position: absolute;
440
- left: 0;
441
- top: 0;
442
- bottom: 0;
443
- width: 8px;
444
- cursor: col-resize;
445
- z-index: 1;
446
- touch-action: none;
447
- }
448
-
449
1177
  .pactor-chat-inspector__header {
450
1178
  display: flex;
451
1179
  align-items: center;
@@ -453,11 +1181,9 @@
453
1181
  padding: 10px 12px;
454
1182
  border-bottom: 1px solid var(--pactor-chat-border);
455
1183
  flex-shrink: 0;
456
- /* 与聊天区 header 等高(--pactor-chat-header-height) */
457
1184
  box-sizing: border-box;
458
1185
  min-height: var(--pactor-chat-header-height);
459
1186
  }
460
-
461
1187
  .pactor-chat-inspector__title {
462
1188
  flex: 1;
463
1189
  min-width: 0;
@@ -468,8 +1194,6 @@
468
1194
  font-size: 14px;
469
1195
  font-weight: 600;
470
1196
  }
471
-
472
- /* kind 角标 */
473
1197
  .pactor-chat-inspector__kind {
474
1198
  flex-shrink: 0;
475
1199
  padding: 0 6px;
@@ -479,156 +1203,34 @@
479
1203
  font-size: 11px;
480
1204
  line-height: 18px;
481
1205
  }
482
-
483
1206
  .pactor-chat-inspector__close {
484
1207
  flex-shrink: 0;
485
1208
  }
486
-
487
1209
  .pactor-chat-inspector__list-toggle {
488
1210
  flex-shrink: 0;
489
1211
  }
490
-
491
- /* 产物切换下拉(spec: chat-artifact-panel / 多产物切换):
492
- * header 文件名处触发器(图标 + 名称 + chevron),占用标题区剩余宽度 */
493
1212
  .pactor-chat-inspector__header .dropdown-menu-trigger-wrap {
494
1213
  flex: 1;
495
1214
  min-width: 0;
496
1215
  display: flex;
497
1216
  }
498
-
499
1217
  .pactor-chat-inspector__menu-trigger {
500
1218
  display: inline-flex;
501
1219
  align-items: center;
502
1220
  gap: 6px;
503
1221
  min-width: 0;
504
1222
  max-width: 100%;
505
- /* 纵向 padding 2px:自身 26.4px + header padding 20px + border 1px
506
- * ≤ --pactor-chat-header-height(48px),不撑破两侧 header 等高 */
507
1223
  padding: 2px 6px;
508
1224
  border-radius: var(--pactor-chat-radius-sm);
509
1225
  cursor: pointer;
510
1226
  color: var(--pactor-chat-fg);
511
1227
  }
512
-
513
1228
  .pactor-chat-inspector__menu-trigger:hover {
514
1229
  background: var(--pactor-chat-muted);
515
1230
  }
516
-
517
1231
  .pactor-chat-inspector__menu-trigger .pactor-chat-inspector__title {
518
1232
  min-width: 0;
519
1233
  }
520
-
521
- /* 产物目录列表视图(spec: chat-artifact-panel / 产物目录):
522
- * 目录(可折叠)+ 产物行(kind 图标 + 名称 + kind 角标) */
523
- .pactor-chat-inspector__list {
524
- list-style: none;
525
- margin: 0;
526
- padding: 0;
527
- }
528
-
529
- .pactor-chat-inspector__list-children {
530
- padding-left: 18px;
531
- }
532
-
533
- .pactor-chat-inspector__list-folder,
534
- .pactor-chat-inspector__list-item {
535
- display: flex;
536
- align-items: center;
537
- gap: 8px;
538
- width: 100%;
539
- padding: 7px 8px;
540
- border: none;
541
- border-radius: var(--pactor-chat-radius-sm);
542
- background: transparent;
543
- color: var(--pactor-chat-fg);
544
- font-size: 13px;
545
- text-align: left;
546
- cursor: pointer;
547
- }
548
-
549
- .pactor-chat-inspector__list-folder {
550
- color: var(--pactor-chat-muted-fg);
551
- }
552
-
553
- .pactor-chat-inspector__list-folder:hover,
554
- .pactor-chat-inspector__list-item:hover {
555
- background: var(--pactor-chat-muted);
556
- }
557
-
558
- .pactor-chat-inspector__list-item[data-active='true'] {
559
- background: var(--pactor-chat-muted);
560
- font-weight: 600;
561
- }
562
-
563
- .pactor-chat-inspector__list-folder[data-open='true'] .pactor-chat-trace__chevron {
564
- transform: rotate(90deg);
565
- }
566
-
567
- .pactor-chat-inspector__list-item-title {
568
- flex: 1;
569
- min-width: 0;
570
- overflow: hidden;
571
- text-overflow: ellipsis;
572
- white-space: nowrap;
573
- }
574
-
575
- .pactor-chat-inspector__body {
576
- flex: 1;
577
- min-height: 0;
578
- overflow-y: auto;
579
- padding: 12px;
580
- }
581
-
582
- /* code 产出物:只读代码块(language 右上角标,不引高亮依赖) */
583
- .pactor-chat-inspector__code {
584
- position: relative;
585
- }
586
-
587
- /* 图片类产出物(spec: chat-artifact-panel / 常见文件预览):
588
- * 居中自适应面板宽;svg 原始标记经 data URL 呈现 */
589
- .pactor-chat-inspector__image {
590
- display: flex;
591
- justify-content: center;
592
- align-items: flex-start;
593
- }
594
-
595
- .pactor-chat-inspector__image img {
596
- max-width: 100%;
597
- height: auto;
598
- border-radius: var(--pactor-chat-radius-sm);
599
- }
600
-
601
- .pactor-chat-inspector__code pre {
602
- margin: 0;
603
- padding: 10px 12px;
604
- border: 1px solid var(--pactor-chat-border);
605
- border-radius: var(--pactor-chat-radius-md);
606
- background: var(--pactor-chat-code-bg);
607
- overflow-x: auto;
608
- font-size: 12.5px;
609
- }
610
-
611
- .pactor-chat-inspector__code-lang {
612
- position: absolute;
613
- top: 6px;
614
- right: 8px;
615
- padding: 0 6px;
616
- border-radius: 999px;
617
- background: var(--pactor-chat-muted);
618
- color: var(--pactor-chat-muted-fg);
619
- font-size: 11px;
620
- line-height: 18px;
621
- }
622
-
623
- /* text 产出物:预格式文本 */
624
- .pactor-chat-inspector__text {
625
- margin: 0;
626
- white-space: pre-wrap;
627
- word-break: break-word;
628
- font-size: 13px;
629
- }
630
-
631
- /* 窄屏覆盖抽屉遮罩:仅面板打开时渲染;桌面隐藏(同 AppShell scrim 模式) */
632
1234
  .pactor-chat-inspector__scrim {
633
1235
  display: none;
634
1236
  position: fixed;
@@ -636,7 +1238,6 @@
636
1238
  z-index: 40;
637
1239
  background: var(--pactor-chat-shell-scrim);
638
1240
  }
639
-
640
1241
  @media (max-width: 767px) {
641
1242
  .pactor-chat-inspector {
642
1243
  position: fixed;
@@ -645,30 +1246,17 @@
645
1246
  right: 0;
646
1247
  z-index: 50;
647
1248
  box-shadow: var(--pactor-chat-shadow-composer);
648
- /* 抽屉形态:宽度不超出视口,下限令牌不适用;
649
- * max-width 兜底拖拽残留的 inline 宽度(桌面拖拽后切窄屏) */
650
1249
  width: min(var(--pactor-chat-inspector-width), 92vw);
651
1250
  max-width: 92vw;
652
1251
  min-width: 0;
653
1252
  }
654
-
655
- /* 窄屏覆盖抽屉形态:不显示拖拽手柄(spec scenario: 窄屏无拖拽手柄) */
656
- .pactor-chat-inspector__resize {
1253
+ .pactor-chat-inspector [data-slot='artifact-panel-resize'] {
657
1254
  display: none;
658
1255
  }
659
-
660
1256
  .pactor-chat-inspector__scrim {
661
1257
  display: block;
662
1258
  }
663
1259
  }
664
-
665
- /* ------------------------------------------------------------
666
- * 产出物卡片(spec: chat-artifact-panel / artifact 消息 part):
667
- * 消息流内 artifact part 的内联呈现——整卡可点击:着色图标盒
668
- * (按文件类型 tone 取色)+ 标题 + 元信息行(尺寸 · 类型)+
669
- * 右上箭头。结构与 ChatArtifactCard 内部组件一一对应。
670
- * ------------------------------------------------------------ */
671
-
672
1260
  .pactor-chat-artifact-card {
673
1261
  display: flex;
674
1262
  align-items: center;
@@ -687,12 +1275,9 @@
687
1275
  text-align: left;
688
1276
  transition: background-color 0.15s ease;
689
1277
  }
690
-
691
1278
  .pactor-chat-artifact-card:hover {
692
1279
  background: var(--pactor-chat-muted);
693
1280
  }
694
-
695
- /* 着色图标盒(36px 圆角盒;tone 着色,暗色值见下方覆盖块) */
696
1281
  .pactor-chat-artifact-card__icon {
697
1282
  display: inline-flex;
698
1283
  align-items: center;
@@ -704,30 +1289,22 @@
704
1289
  background: var(--pactor-chat-muted);
705
1290
  color: var(--pactor-chat-muted-fg);
706
1291
  }
707
-
708
- /* 按文件类型着色(tone 见 artifact.ts resolveArtifactIcon;色值走
709
- * --pactor-chat-artifact-tone-* 令牌,暗色经载体块覆盖、皮肤可精调):
710
- * 表格 green / 数据 amber / 代码 blue / 图片 violet / 文档与兜底 slate */
711
1292
  .pactor-chat-artifact-card--green .pactor-chat-artifact-card__icon {
712
1293
  color: var(--pactor-chat-artifact-tone-green-fg);
713
1294
  background: var(--pactor-chat-artifact-tone-green-bg);
714
1295
  }
715
-
716
1296
  .pactor-chat-artifact-card--blue .pactor-chat-artifact-card__icon {
717
1297
  color: var(--pactor-chat-artifact-tone-blue-fg);
718
1298
  background: var(--pactor-chat-artifact-tone-blue-bg);
719
1299
  }
720
-
721
1300
  .pactor-chat-artifact-card--amber .pactor-chat-artifact-card__icon {
722
1301
  color: var(--pactor-chat-artifact-tone-amber-fg);
723
1302
  background: var(--pactor-chat-artifact-tone-amber-bg);
724
1303
  }
725
-
726
1304
  .pactor-chat-artifact-card--violet .pactor-chat-artifact-card__icon {
727
1305
  color: var(--pactor-chat-artifact-tone-violet-fg);
728
1306
  background: var(--pactor-chat-artifact-tone-violet-bg);
729
1307
  }
730
-
731
1308
  .pactor-chat-artifact-card__text {
732
1309
  display: flex;
733
1310
  flex-direction: column;
@@ -735,7 +1312,6 @@
735
1312
  flex: 1 1 auto;
736
1313
  min-width: 0;
737
1314
  }
738
-
739
1315
  .pactor-chat-artifact-card__title {
740
1316
  min-width: 0;
741
1317
  overflow: hidden;
@@ -744,22 +1320,14 @@
744
1320
  font-weight: 600;
745
1321
  font-size: 13px;
746
1322
  }
747
-
748
- /* 元信息行(尺寸 · 类型标签) */
749
1323
  .pactor-chat-artifact-card__meta {
750
1324
  font-size: 11px;
751
1325
  color: var(--pactor-chat-muted-fg);
752
1326
  }
753
-
754
- /* 右上箭头(打开面板暗示) */
755
1327
  .pactor-chat-artifact-card__arrow {
756
1328
  flex: none;
757
1329
  color: var(--pactor-chat-muted-fg);
758
1330
  }
759
-
760
- /* 连续产物卡片组(spec: chat-artifact-panel / 卡片区收起):
761
- * 同一消息内连续 artifact part 合组;超 4 个收起,footer 右端
762
- * 「展开 / 收起」+「查看所有产物(n) ›」(打开面板产物目录视图) */
763
1331
  .pactor-chat-artifact-group__footer {
764
1332
  display: flex;
765
1333
  justify-content: flex-end;
@@ -767,9 +1335,7 @@
767
1335
  gap: 12px;
768
1336
  margin: -2px 0 8px;
769
1337
  }
770
-
771
- .pactor-chat-artifact-group__toggle,
772
- .pactor-chat-artifact-group__all {
1338
+ .pactor-chat-artifact-group__toggle, .pactor-chat-artifact-group__all {
773
1339
  display: inline-flex;
774
1340
  align-items: center;
775
1341
  gap: 3px;
@@ -781,19 +1347,9 @@
781
1347
  font-size: 12px;
782
1348
  cursor: pointer;
783
1349
  }
784
-
785
- .pactor-chat-artifact-group__toggle:hover,
786
- .pactor-chat-artifact-group__all:hover {
1350
+ .pactor-chat-artifact-group__toggle:hover, .pactor-chat-artifact-group__all:hover {
787
1351
  background: var(--pactor-chat-muted);
788
1352
  }
789
-
790
- /* ------------------------------------------------------------
791
- * Chat 组件内建侧栏菜单(spec: chat-dsl-component):
792
- * menu 数据驱动的导航项(图标 + 分组标题 + badge + disabled),
793
- * 承载于 AppShell 侧栏;颜色全部经 --pactor-chat-* 令牌,
794
- * 暗色由令牌覆盖自动生效。
795
- * ------------------------------------------------------------ */
796
-
797
1353
  .pactor-chat-menu {
798
1354
  display: flex;
799
1355
  flex-direction: column;
@@ -803,13 +1359,11 @@
803
1359
  overflow-y: auto;
804
1360
  box-sizing: border-box;
805
1361
  }
806
-
807
1362
  .pactor-chat-menu__group {
808
1363
  padding: 10px 10px 4px;
809
1364
  color: var(--pactor-chat-muted-fg);
810
1365
  font-size: 12px;
811
1366
  }
812
-
813
1367
  .pactor-chat-menu__item {
814
1368
  display: flex;
815
1369
  align-items: center;
@@ -826,31 +1380,24 @@
826
1380
  cursor: pointer;
827
1381
  transition: background 0.15s ease;
828
1382
  }
829
-
830
1383
  .pactor-chat-menu__item:hover {
831
1384
  background: var(--pactor-chat-muted);
832
1385
  }
833
-
834
- .pactor-chat-menu__item--active,
835
- .pactor-chat-menu__item--active:hover {
1386
+ .pactor-chat-menu__item--active, .pactor-chat-menu__item--active:hover {
836
1387
  background: var(--pactor-chat-user-bubble-bg);
837
1388
  color: var(--pactor-chat-primary);
838
1389
  }
839
-
840
- .pactor-chat-menu__item:disabled,
841
- .pactor-chat-menu__item:disabled:hover {
1390
+ .pactor-chat-menu__item:disabled, .pactor-chat-menu__item:disabled:hover {
842
1391
  background: transparent;
843
1392
  color: var(--pactor-chat-muted-fg);
844
1393
  opacity: 0.6;
845
1394
  cursor: not-allowed;
846
1395
  }
847
-
848
1396
  .pactor-chat-menu__icon {
849
1397
  display: inline-flex;
850
1398
  flex-shrink: 0;
851
1399
  align-items: center;
852
1400
  }
853
-
854
1401
  .pactor-chat-menu__label {
855
1402
  flex: 1;
856
1403
  min-width: 0;
@@ -858,7 +1405,6 @@
858
1405
  text-overflow: ellipsis;
859
1406
  white-space: nowrap;
860
1407
  }
861
-
862
1408
  .pactor-chat-menu__badge {
863
1409
  flex-shrink: 0;
864
1410
  padding: 0 6px;
@@ -868,14 +1414,10 @@
868
1414
  font-size: 12px;
869
1415
  line-height: 18px;
870
1416
  }
871
-
872
1417
  .pactor-chat-menu__item--active .pactor-chat-menu__badge {
873
1418
  background: var(--pactor-chat-user-bubble-bg);
874
1419
  color: var(--pactor-chat-primary);
875
1420
  }
876
-
877
- /* 菜单项状态圆点(spec: chat-dsl-component / 菜单项状态点,决策 D4):
878
- * label 右侧的 danger 系小圆点(参考图红点),与 badge 可共存 */
879
1421
  .pactor-chat-menu__dot {
880
1422
  flex-shrink: 0;
881
1423
  width: 6px;
@@ -883,8 +1425,6 @@
883
1425
  border-radius: 50%;
884
1426
  background: var(--pactor-chat-danger);
885
1427
  }
886
-
887
- /* Chat 服务缺失的受控提示块(未配置 ChatServicesProvider 时渲染) */
888
1428
  .pactor-chat-notice {
889
1429
  padding: 24px 16px;
890
1430
  border: 1px dashed var(--pactor-chat-border);
@@ -895,11 +1435,6 @@
895
1435
  line-height: 1.6;
896
1436
  text-align: center;
897
1437
  }
898
-
899
-
900
- /* 消息滚动区:overflow-anchor none 配合 useChatAutoScroll(防浏览器
901
- 滚动锚定与贴底跟随互相拉扯);上下 mask 渐隐 + 6px 细滚动条;
902
- 顶部留 24px 内边距(与 mask 渐隐带同宽,首条消息不贴顶) */
903
1438
  .pactor-chat-messages {
904
1439
  position: relative;
905
1440
  flex: 1;
@@ -912,47 +1447,27 @@
912
1447
  padding: 24px 2px;
913
1448
  scrollbar-width: thin;
914
1449
  scrollbar-color: var(--pactor-chat-border) transparent;
915
- -webkit-mask-image: linear-gradient(
916
- to bottom,
917
- transparent,
918
- #000 24px,
919
- #000 calc(100% - 24px),
920
- transparent
921
- );
922
- mask-image: linear-gradient(
923
- to bottom,
924
- transparent,
925
- #000 24px,
926
- #000 calc(100% - 24px),
927
- transparent
928
- );
1450
+ -webkit-mask-image: linear-gradient( to bottom, transparent, #000 24px, #000 calc(100% - 24px), transparent );
1451
+ mask-image: linear-gradient( to bottom, transparent, #000 24px, #000 calc(100% - 24px), transparent );
929
1452
  }
930
-
931
1453
  .pactor-chat-messages::-webkit-scrollbar {
932
1454
  width: 6px;
933
1455
  height: 6px;
934
1456
  }
935
-
936
1457
  .pactor-chat-messages::-webkit-scrollbar-track {
937
1458
  background: transparent;
938
1459
  }
939
-
940
1460
  .pactor-chat-messages::-webkit-scrollbar-thumb {
941
1461
  background: var(--pactor-chat-border);
942
1462
  border-radius: 3px;
943
1463
  }
944
-
945
1464
  .pactor-chat-messages::-webkit-scrollbar-thumb:hover {
946
1465
  background: var(--pactor-chat-muted-fg);
947
1466
  }
948
-
949
- /* Composer 承载坞(空态居中组与钉底位共用):padding-bottom 为钉底态
950
- * 与页面底部留出空白;composerBottom 槽(未提供不渲染)居中弱提示 */
951
1467
  .pactor-chat-view__composer-dock {
952
1468
  width: 100%;
953
1469
  padding-bottom: 12px;
954
1470
  }
955
-
956
1471
  .pactor-chat-view__composer-bottom {
957
1472
  margin-top: 8px;
958
1473
  text-align: center;
@@ -960,15 +1475,6 @@
960
1475
  font-size: 12px;
961
1476
  line-height: 1.5;
962
1477
  }
963
-
964
- /* ============================================================
965
- * 3. 空状态(spec: chat-empty-state)
966
- * ============================================================ */
967
-
968
- /* 空态居中组(决策 D1):EmptyState 与 Composer 同一垂直居中列。
969
- * margin auto 在消息区(flex 列容器)内双向居中;内容高于视口时
970
- * auto 边距归零,配合消息区 overflow-y auto 从顶部自然滚动
971
- * (极矮视口不裁切) */
972
1478
  .pactor-chat-view__empty-stack {
973
1479
  display: flex;
974
1480
  flex-direction: column;
@@ -978,11 +1484,9 @@
978
1484
  margin: auto;
979
1485
  padding: 16px 0;
980
1486
  }
981
-
982
1487
  .pactor-chat-view__empty-stack .pactor-chat-empty {
983
1488
  flex: none;
984
1489
  }
985
-
986
1490
  .pactor-chat-empty {
987
1491
  flex: 1;
988
1492
  display: flex;
@@ -993,19 +1497,16 @@
993
1497
  padding: 32px 16px;
994
1498
  text-align: center;
995
1499
  }
996
-
997
1500
  .pactor-chat-empty__greeting {
998
1501
  font-family: var(--pactor-chat-font-display);
999
1502
  font-size: 26px;
1000
1503
  font-weight: 500;
1001
1504
  line-height: 1.4;
1002
1505
  }
1003
-
1004
1506
  .pactor-chat-empty__subtitle {
1005
1507
  color: var(--pactor-chat-muted-fg);
1006
1508
  font-size: 13px;
1007
1509
  }
1008
-
1009
1510
  .pactor-chat-empty__suggestions {
1010
1511
  display: flex;
1011
1512
  flex-wrap: wrap;
@@ -1013,139 +1514,53 @@
1013
1514
  gap: 8px;
1014
1515
  margin-top: 8px;
1015
1516
  }
1016
-
1017
- .pactor-chat-empty__suggestion {
1018
- padding: 6px 14px;
1019
- border: 1px solid var(--pactor-chat-border);
1020
- border-radius: 999px;
1021
- background: var(--pactor-chat-card);
1022
- color: var(--pactor-chat-fg);
1023
- font-size: 13px;
1024
- cursor: pointer;
1025
- transition:
1026
- border-color 0.15s ease,
1027
- background 0.15s ease;
1028
- }
1029
-
1030
- .pactor-chat-empty__suggestion:hover {
1031
- border-color: var(--pactor-chat-primary);
1032
- background: var(--pactor-chat-muted);
1033
- }
1034
-
1035
- /* ============================================================
1036
- * 4. 消息气泡
1037
- * ============================================================ */
1038
-
1039
1517
  .pactor-chat-message {
1040
1518
  display: flex;
1041
1519
  flex-direction: column;
1042
1520
  gap: 4px;
1043
1521
  max-width: 100%;
1044
1522
  }
1045
-
1046
1523
  .pactor-chat-message__body {
1047
1524
  display: flex;
1048
1525
  flex-direction: column;
1049
1526
  gap: 8px;
1050
1527
  min-width: 0;
1051
1528
  }
1052
-
1053
- /* user:右侧圆角气泡(16px 圆角 + 轻投影) */
1054
1529
  .pactor-chat-message--user {
1055
1530
  align-items: flex-end;
1056
1531
  }
1057
-
1058
- .pactor-chat-message--user .pactor-chat-message__body {
1059
- max-width: 75%;
1060
- padding: 10px 16px;
1061
- border-radius: var(--pactor-chat-radius-lg);
1062
- border: 1px solid var(--pactor-chat-user-bubble-border);
1063
- background: var(--pactor-chat-user-bubble-bg);
1064
- box-shadow: var(--pactor-chat-shadow-sm);
1065
- }
1066
-
1067
- /* assistant:左侧通栏排版(无气泡底色) */
1068
1532
  .pactor-chat-message--assistant {
1069
1533
  align-items: stretch;
1070
1534
  }
1071
-
1072
- /* assistant 消息顶部 Agent 身份行:图标 + 加粗名称 */
1073
- .pactor-chat-message__agent {
1074
- display: flex;
1075
- align-items: center;
1076
- gap: 6px;
1077
- min-width: 0;
1078
- font-size: 13px;
1079
- line-height: 18px;
1080
- color: var(--pactor-chat-fg);
1081
- }
1082
-
1083
- .pactor-chat-message__agent-icon {
1084
- display: inline-flex;
1085
- align-items: center;
1086
- justify-content: center;
1087
- flex-shrink: 0;
1088
- width: 1.1em;
1089
- height: 1.1em;
1090
- color: var(--pactor-chat-muted-fg);
1091
- }
1092
-
1093
- img.pactor-chat-message__agent-icon {
1094
- border-radius: var(--pactor-chat-radius-sm, 4px);
1095
- object-fit: cover;
1096
- }
1097
-
1098
- .pactor-chat-message__agent-name {
1099
- font-size: 1.1em;
1100
- font-weight: 600;
1101
- overflow: hidden;
1102
- text-overflow: ellipsis;
1103
- white-space: nowrap;
1104
- }
1105
-
1106
- /* system:居中弱提示 */
1107
1535
  .pactor-chat-message--system {
1108
1536
  align-items: center;
1109
1537
  color: var(--pactor-chat-muted-fg);
1110
1538
  font-size: 12px;
1111
1539
  }
1112
-
1113
- /* 待响应占位 */
1114
1540
  .pactor-chat-message__pending {
1115
1541
  color: var(--pactor-chat-muted-fg);
1116
1542
  }
1117
-
1118
- /* hover 操作条(assistant) */
1119
1543
  .pactor-chat-message__actions {
1120
1544
  display: flex;
1121
1545
  gap: 4px;
1122
1546
  transition: opacity 0.15s ease;
1123
1547
  }
1124
-
1125
- .pactor-chat-message:hover .pactor-chat-message__actions,
1126
- .pactor-chat-message__actions:focus-within {
1548
+ .pactor-chat-message:hover .pactor-chat-message__actions, .pactor-chat-message__actions:focus-within {
1127
1549
  opacity: 1;
1128
1550
  }
1129
-
1130
- /* error 消息的重试入口常显(不依赖 hover) */
1131
1551
  .pactor-chat-message__actions--visible {
1132
1552
  opacity: 1;
1133
1553
  }
1134
-
1135
- /* assistant 终态消息底部行:操作条 + 常显时间戳 */
1136
1554
  .pactor-chat-message__footer {
1137
1555
  display: flex;
1138
1556
  align-items: center;
1139
1557
  gap: 8px;
1140
1558
  }
1141
-
1142
1559
  .pactor-chat-message__time {
1143
1560
  flex-shrink: 0;
1144
1561
  color: var(--pactor-chat-muted-fg);
1145
1562
  line-height: 18px;
1146
1563
  }
1147
-
1148
- /* user 消息内联编辑框(编辑重发) */
1149
1564
  .pactor-chat-message__edit {
1150
1565
  display: flex;
1151
1566
  flex-direction: column;
@@ -1157,7 +1572,6 @@ img.pactor-chat-message__agent-icon {
1157
1572
  border-radius: var(--pactor-chat-radius-lg);
1158
1573
  background: var(--pactor-chat-user-bubble-bg);
1159
1574
  }
1160
-
1161
1575
  .pactor-chat-message__edit-input {
1162
1576
  border: none;
1163
1577
  outline: none;
@@ -1167,13 +1581,11 @@ img.pactor-chat-message__agent-icon {
1167
1581
  font: inherit;
1168
1582
  line-height: 1.6;
1169
1583
  }
1170
-
1171
1584
  .pactor-chat-message__edit-actions {
1172
1585
  display: flex;
1173
1586
  justify-content: flex-end;
1174
1587
  gap: 8px;
1175
1588
  }
1176
-
1177
1589
  .pactor-chat-message__edit-button {
1178
1590
  padding: 4px 12px;
1179
1591
  border: 1px solid var(--pactor-chat-border);
@@ -1183,18 +1595,11 @@ img.pactor-chat-message__agent-icon {
1183
1595
  font-size: 12.5px;
1184
1596
  cursor: pointer;
1185
1597
  }
1186
-
1187
1598
  .pactor-chat-message__edit-button--confirm {
1188
1599
  border-color: var(--pactor-chat-primary);
1189
1600
  background: var(--pactor-chat-primary);
1190
1601
  color: var(--pactor-chat-primary-fg);
1191
1602
  }
1192
-
1193
- /* ============================================================
1194
- * 5. 图标按钮 / 浮动按钮
1195
- * ============================================================ */
1196
-
1197
- /* quiet 图标按钮:透明底,hover 增亮;图标统一 15px */
1198
1603
  .pactor-chat-icon-button {
1199
1604
  display: inline-flex;
1200
1605
  align-items: center;
@@ -1205,27 +1610,19 @@ img.pactor-chat-message__agent-icon {
1205
1610
  background: transparent;
1206
1611
  color: var(--pactor-chat-muted-fg);
1207
1612
  cursor: pointer;
1208
- transition:
1209
- background 0.15s ease,
1210
- color 0.15s ease,
1211
- transform 0.1s ease;
1613
+ transition: background 0.15s ease, color 0.15s ease, transform 0.1s ease;
1212
1614
  }
1213
-
1214
1615
  .pactor-chat-icon-button svg {
1215
1616
  width: 15px;
1216
1617
  height: 15px;
1217
1618
  }
1218
-
1219
1619
  .pactor-chat-icon-button:hover {
1220
1620
  background: var(--pactor-chat-muted);
1221
1621
  color: var(--pactor-chat-fg);
1222
1622
  }
1223
-
1224
1623
  .pactor-chat-icon-button:active {
1225
1624
  transform: scale(0.92);
1226
1625
  }
1227
-
1228
- /* "回到底部"浮动按钮(bottom 避开滚动区底部 mask 渐隐带) */
1229
1626
  .pactor-chat-scroll-bottom {
1230
1627
  position: sticky;
1231
1628
  bottom: 28px;
@@ -1242,26 +1639,16 @@ img.pactor-chat-message__agent-icon {
1242
1639
  cursor: pointer;
1243
1640
  box-shadow: var(--pactor-chat-shadow-composer);
1244
1641
  }
1245
-
1246
1642
  .pactor-chat-scroll-bottom:hover {
1247
1643
  color: var(--pactor-chat-fg);
1248
1644
  }
1249
-
1250
- /* ============================================================
1251
- * 6. 活动轨迹(spec: chat-activity-trace):状态头 + 轨迹条目 + thinking
1252
- * ============================================================ */
1253
-
1254
1645
  .pactor-chat-trace {
1255
1646
  display: flex;
1256
1647
  flex-direction: column;
1257
1648
  gap: 2px;
1258
1649
  font-size: 12.5px;
1259
1650
  }
1260
-
1261
- /* 状态头 / 条目头 / thinking 头共用的单行按钮形态 */
1262
- .pactor-chat-trace__header,
1263
- .pactor-chat-trace__entry-header,
1264
- .pactor-chat-thinking__header {
1651
+ .pactor-chat-trace__header, .pactor-chat-trace__entry-header, .pactor-chat-thinking__header {
1265
1652
  display: flex;
1266
1653
  align-items: center;
1267
1654
  gap: 6px;
@@ -1273,94 +1660,61 @@ img.pactor-chat-message__agent-icon {
1273
1660
  font-size: inherit;
1274
1661
  text-align: left;
1275
1662
  }
1276
-
1277
- button.pactor-chat-trace__header,
1278
- .pactor-chat-trace__entry-header,
1279
- .pactor-chat-thinking__header {
1663
+ button.pactor-chat-trace__header, .pactor-chat-trace__entry-header, .pactor-chat-thinking__header {
1280
1664
  cursor: pointer;
1281
1665
  }
1282
-
1283
- button.pactor-chat-trace__header:hover,
1284
- .pactor-chat-trace__entry-header:hover,
1285
- .pactor-chat-thinking__header:hover {
1666
+ button.pactor-chat-trace__header:hover, .pactor-chat-trace__entry-header:hover, .pactor-chat-thinking__header:hover {
1286
1667
  color: var(--pactor-chat-fg);
1287
1668
  }
1288
-
1289
- /* 头部内图标/文字统一 flex 对齐(svg 默认按基线对齐会下沉) */
1290
- .pactor-chat-trace__header > span,
1291
- .pactor-chat-trace__entry-header > span,
1292
- .pactor-chat-thinking__header > span {
1669
+ .pactor-chat-trace__header > span, .pactor-chat-trace__entry-header > span, .pactor-chat-thinking__header > span {
1293
1670
  display: inline-flex;
1294
1671
  align-items: center;
1295
1672
  line-height: 1;
1296
1673
  min-width: 0;
1297
1674
  }
1298
-
1299
- /* 状态文案:流式期间呼吸动画(纯 CSS) */
1300
1675
  .pactor-chat-trace__status-text--breathing {
1301
1676
  animation: pactor-chat-breathing 1.8s cubic-bezier(0.4, 0, 0.6, 1) infinite;
1302
1677
  }
1303
-
1304
1678
  @keyframes pactor-chat-breathing {
1305
- 0%,
1306
- 100% {
1679
+ 0%, 100% {
1307
1680
  opacity: 1;
1308
1681
  }
1309
1682
  50% {
1310
1683
  opacity: 0.45;
1311
1684
  }
1312
1685
  }
1313
-
1314
- /* 状态图标脉冲:流式期间(图标为 spinner 时)轻微缩放逐帧"呼吸",
1315
- 与文案呼吸不同周期,避免机械同步感 */
1316
- .pactor-chat-trace__status-icon:has(.pactor-chat-spin),
1317
- .pactor-chat-thinking[data-streaming='true'] .pactor-chat-thinking__icon {
1686
+ .pactor-chat-trace__status-icon:has(.pactor-chat-spin), .pactor-chat-thinking[data-streaming='true'] .pactor-chat-thinking__icon {
1318
1687
  animation: pactor-chat-mark-pulse 2.4s cubic-bezier(0.4, 0, 0.6, 1) infinite;
1319
1688
  transform-origin: center;
1320
1689
  }
1321
-
1322
1690
  @keyframes pactor-chat-mark-pulse {
1323
- 0%,
1324
- 100% {
1691
+ 0%, 100% {
1325
1692
  transform: scale(0.9);
1326
1693
  }
1327
1694
  50% {
1328
1695
  transform: scale(1.08);
1329
1696
  }
1330
1697
  }
1331
-
1332
1698
  .pactor-chat-trace__elapsed {
1333
1699
  color: var(--pactor-chat-muted-fg);
1334
1700
  font-variant-numeric: tabular-nums;
1335
1701
  }
1336
-
1337
- /* chevron 展开旋转(状态头 / 条目 / thinking 共用) */
1338
1702
  .pactor-chat-trace__chevron {
1339
1703
  display: inline-flex;
1340
1704
  flex-shrink: 0;
1341
1705
  transition: transform 0.15s ease;
1342
1706
  }
1343
-
1344
- .pactor-chat-trace[data-open='true'] > .pactor-chat-trace__header
1345
- .pactor-chat-trace__chevron,
1346
- .pactor-chat-trace__entry[data-open='true'] .pactor-chat-trace__chevron,
1347
- .pactor-chat-thinking[data-open='true'] .pactor-chat-trace__chevron {
1707
+ .pactor-chat-trace[data-open='true'] > .pactor-chat-trace__header .pactor-chat-trace__chevron, .pactor-chat-trace__entry[data-open='true'] .pactor-chat-trace__chevron, .pactor-chat-thinking[data-open='true'] .pactor-chat-trace__chevron {
1348
1708
  transform: rotate(90deg);
1349
1709
  }
1350
-
1351
- /* 轨迹条目列表:缩进对齐状态头文本 */
1352
1710
  .pactor-chat-trace__entries {
1353
1711
  display: flex;
1354
1712
  flex-direction: column;
1355
1713
  gap: 2px;
1356
- /* margin-left: 4px; */
1357
1714
  }
1358
-
1359
1715
  .pactor-chat-trace__entry-title {
1360
1716
  flex-shrink: 0;
1361
1717
  }
1362
-
1363
- /* 参数摘要:单行省略 */
1364
1718
  .pactor-chat-trace__entry-args {
1365
1719
  flex: 1;
1366
1720
  overflow: hidden;
@@ -1369,83 +1723,59 @@ button.pactor-chat-trace__header:hover,
1369
1723
  color: var(--pactor-chat-muted-fg);
1370
1724
  opacity: 0.8;
1371
1725
  }
1372
-
1373
- /* 条目状态色 */
1374
1726
  .pactor-chat-trace__entry[data-status='running'] .pactor-chat-trace__entry-icon {
1375
1727
  color: var(--pactor-chat-primary);
1376
1728
  }
1377
-
1378
1729
  .pactor-chat-trace__entry[data-status='success'] .pactor-chat-trace__entry-icon {
1379
1730
  color: var(--pactor-chat-success);
1380
1731
  }
1381
-
1382
1732
  .pactor-chat-trace__entry[data-status='failed'] .pactor-chat-trace__entry-icon {
1383
1733
  color: var(--pactor-chat-danger);
1384
1734
  }
1385
-
1386
- /* 展开详情:参数与结果/错误 */
1387
1735
  .pactor-chat-trace__entry-body {
1388
1736
  padding: 2px 0 6px 24px;
1389
1737
  color: var(--pactor-chat-muted-fg);
1390
1738
  }
1391
-
1392
1739
  .pactor-chat-trace__entry-detail {
1393
1740
  margin: 0;
1394
1741
  font-size: 12px;
1395
1742
  white-space: pre-wrap;
1396
1743
  word-break: break-word;
1397
1744
  }
1398
-
1399
- /* thinking 折叠卡:进行中指示(图标旋转沿用 .pactor-chat-spin) */
1400
1745
  .pactor-chat-thinking__icon {
1401
1746
  color: var(--pactor-chat-muted-fg);
1402
1747
  }
1403
-
1404
1748
  .pactor-chat-thinking[data-streaming='true'] .pactor-chat-thinking__icon {
1405
1749
  color: var(--pactor-chat-primary);
1406
1750
  }
1407
-
1408
1751
  .pactor-chat-thinking__body {
1409
1752
  padding: 2px 0 6px 24px;
1410
1753
  color: var(--pactor-chat-muted-fg);
1411
1754
  }
1412
-
1413
- /* 流式期间的纯文本正文(结束后回切 markdown 渲染) */
1414
1755
  .pactor-chat-thinking__text {
1415
1756
  white-space: pre-wrap;
1416
1757
  word-break: break-word;
1417
1758
  font-size: 13px;
1418
1759
  line-height: 1.6;
1419
1760
  }
1420
-
1421
1761
  .pactor-chat-thinking__body .pactor-markdown > :first-child {
1422
1762
  margin-top: 0;
1423
1763
  }
1424
-
1425
1764
  .pactor-chat-thinking__body .pactor-markdown > :last-child {
1426
1765
  margin-bottom: 0;
1427
1766
  }
1428
-
1429
- /* running 旋转 */
1430
1767
  .pactor-chat-spin {
1431
1768
  animation: pactor-chat-spin 1s linear infinite;
1432
1769
  }
1433
-
1434
1770
  @keyframes pactor-chat-spin {
1435
1771
  to {
1436
1772
  transform: rotate(360deg);
1437
1773
  }
1438
1774
  }
1439
-
1440
- /* ============================================================
1441
- * 7. 其他 part
1442
- * ============================================================ */
1443
-
1444
1775
  .pactor-chat-text {
1445
1776
  white-space: pre-wrap;
1446
1777
  word-break: break-word;
1447
1778
  }
1448
-
1449
1779
  .pactor-chat-error {
1450
1780
  display: flex;
1451
1781
  align-items: flex-start;
@@ -1457,24 +1787,19 @@ button.pactor-chat-trace__header:hover,
1457
1787
  color: var(--pactor-chat-danger);
1458
1788
  font-size: 12.5px;
1459
1789
  }
1460
-
1461
- /* 图标与首行文字对齐(svg 默认按基线对齐会下沉) */
1462
1790
  .pactor-chat-error > svg {
1463
1791
  flex-shrink: 0;
1464
1792
  margin-top: 3px;
1465
1793
  display: block;
1466
1794
  }
1467
-
1468
1795
  .pactor-chat-status {
1469
1796
  color: var(--pactor-chat-muted-fg);
1470
1797
  font-size: 12px;
1471
1798
  }
1472
-
1473
1799
  .pactor-chat-dsl-pending {
1474
1800
  color: var(--pactor-chat-muted-fg);
1475
1801
  font-size: 12px;
1476
1802
  }
1477
-
1478
1803
  .pactor-chat-denied {
1479
1804
  border: 1px dashed var(--pactor-chat-border);
1480
1805
  border-radius: var(--pactor-chat-radius-sm);
@@ -1482,19 +1807,12 @@ button.pactor-chat-trace__header:hover,
1482
1807
  color: var(--pactor-chat-muted-fg);
1483
1808
  font-size: 12px;
1484
1809
  }
1485
-
1486
- /* ============================================================
1487
- * 8. Markdown 排版(chat 作为 pactor-markdown 的宿主主题)
1488
- * ============================================================ */
1489
-
1490
1810
  .pactor-chat-view .pactor-markdown > :first-child {
1491
1811
  margin-top: 0;
1492
1812
  }
1493
-
1494
1813
  .pactor-chat-view .pactor-markdown > :last-child {
1495
1814
  margin-bottom: 0;
1496
1815
  }
1497
-
1498
1816
  .pactor-chat-view .pactor-markdown pre {
1499
1817
  margin: 8px 0;
1500
1818
  padding: 10px 12px;
@@ -1504,98 +1822,40 @@ button.pactor-chat-trace__header:hover,
1504
1822
  overflow-x: auto;
1505
1823
  font-size: 12.5px;
1506
1824
  }
1507
-
1508
1825
  .pactor-chat-view .pactor-markdown :not(pre) > code {
1509
1826
  padding: 2px 5px;
1510
1827
  border-radius: 4px;
1511
1828
  background: var(--pactor-chat-code-bg);
1512
1829
  font-size: 0.9em;
1513
1830
  }
1514
-
1515
1831
  .pactor-chat-view .pactor-markdown table {
1516
1832
  border-collapse: collapse;
1517
1833
  margin: 8px 0;
1518
1834
  }
1519
-
1520
- .pactor-chat-view .pactor-markdown th,
1521
- .pactor-chat-view .pactor-markdown td {
1835
+ .pactor-chat-view .pactor-markdown th, .pactor-chat-view .pactor-markdown td {
1522
1836
  padding: 6px 12px;
1523
1837
  border: 1px solid var(--pactor-chat-border);
1524
1838
  }
1525
-
1526
1839
  .pactor-chat-view .pactor-markdown th {
1527
1840
  background: var(--pactor-chat-muted);
1528
1841
  }
1529
-
1530
1842
  .pactor-chat-view .pactor-markdown a {
1531
1843
  color: var(--pactor-chat-primary);
1532
1844
  }
1533
-
1534
1845
  .pactor-chat-view .pactor-markdown blockquote {
1535
1846
  margin: 8px 0;
1536
1847
  padding: 2px 12px;
1537
1848
  border-left: 3px solid var(--pactor-chat-border);
1538
1849
  color: var(--pactor-chat-muted-fg);
1539
1850
  }
1540
-
1541
1851
  .pactor-chat-view .pactor-markdown img {
1542
1852
  max-width: 100%;
1543
1853
  }
1544
-
1545
- /* ============================================================
1546
- * 9. Composer
1547
- * ============================================================ */
1548
-
1549
1854
  .pactor-chat-composer {
1550
1855
  display: flex;
1551
1856
  flex-direction: column;
1552
1857
  gap: 8px;
1553
- padding: 12px 14px;
1554
- border: 1px solid var(--pactor-chat-border);
1555
- border-radius: var(--pactor-chat-radius-xl);
1556
- background: var(--pactor-chat-card);
1557
- box-shadow: var(--pactor-chat-shadow-composer);
1558
- transition: border-color 0.15s ease;
1559
- }
1560
-
1561
- .pactor-chat-composer:focus-within {
1562
- border-color: var(--pactor-chat-primary);
1563
- }
1564
-
1565
- /* 拖拽悬停视觉态(附件拖入时) */
1566
- .pactor-chat-composer--dragover {
1567
- border-color: var(--pactor-chat-primary);
1568
- background: var(--pactor-chat-muted);
1569
- }
1570
-
1571
- /* 输入行:textarea + 发送/停止按钮 */
1572
- .pactor-chat-composer__row {
1573
- display: flex;
1574
- gap: 8px;
1575
- align-items: flex-end;
1576
1858
  }
1577
-
1578
- .pactor-chat-composer__input {
1579
- flex: 1;
1580
- min-width: 0;
1581
- border: none;
1582
- outline: none;
1583
- resize: none;
1584
- background: transparent;
1585
- color: var(--pactor-chat-fg);
1586
- font: inherit;
1587
- line-height: 22px;
1588
- /* 单行时与 32px 发送按钮等高,文字(含 placeholder)垂直居中 */
1589
- min-height: 32px;
1590
- padding: 5px 0;
1591
- max-height: 200px;
1592
- }
1593
-
1594
- .pactor-chat-composer__input::placeholder {
1595
- color: var(--pactor-chat-muted-fg);
1596
- }
1597
-
1598
- /* 发送 / 停止按钮:圆形主按钮 */
1599
1859
  .pactor-chat-composer__button {
1600
1860
  position: relative;
1601
1861
  display: inline-flex;
@@ -1611,17 +1871,13 @@ button.pactor-chat-trace__header:hover,
1611
1871
  cursor: pointer;
1612
1872
  transition: opacity 0.15s ease;
1613
1873
  }
1614
-
1615
1874
  .pactor-chat-composer__button:disabled {
1616
1875
  opacity: 0.4;
1617
1876
  cursor: not-allowed;
1618
1877
  }
1619
-
1620
1878
  .pactor-chat-composer__button--stop {
1621
1879
  background: var(--pactor-chat-danger);
1622
1880
  }
1623
-
1624
- /* 停止态进行中光环(纯 CSS keyframes,随按钮圆形) */
1625
1881
  .pactor-chat-composer__button--stop::after {
1626
1882
  content: '';
1627
1883
  position: absolute;
@@ -1631,7 +1887,6 @@ button.pactor-chat-trace__header:hover,
1631
1887
  pointer-events: none;
1632
1888
  animation: pactor-chat-ring 1.4s ease-out infinite;
1633
1889
  }
1634
-
1635
1890
  @keyframes pactor-chat-ring {
1636
1891
  0% {
1637
1892
  transform: scale(0.92);
@@ -1642,14 +1897,11 @@ button.pactor-chat-trace__header:hover,
1642
1897
  opacity: 0;
1643
1898
  }
1644
1899
  }
1645
-
1646
- /* 附件卡片区 */
1647
1900
  .pactor-chat-composer__attachments {
1648
1901
  display: flex;
1649
1902
  flex-wrap: wrap;
1650
1903
  gap: 8px;
1651
1904
  }
1652
-
1653
1905
  .pactor-chat-composer__attachment {
1654
1906
  position: relative;
1655
1907
  display: inline-flex;
@@ -1659,7 +1911,6 @@ button.pactor-chat-trace__header:hover,
1659
1911
  background: var(--pactor-chat-muted);
1660
1912
  cursor: pointer;
1661
1913
  }
1662
-
1663
1914
  .pactor-chat-composer__attachment-thumb img {
1664
1915
  display: block;
1665
1916
  width: 40px;
@@ -1667,7 +1918,6 @@ button.pactor-chat-trace__header:hover,
1667
1918
  object-fit: cover;
1668
1919
  border-radius: 7px;
1669
1920
  }
1670
-
1671
1921
  .pactor-chat-composer__attachment-info {
1672
1922
  display: inline-flex;
1673
1923
  align-items: center;
@@ -1676,18 +1926,15 @@ button.pactor-chat-trace__header:hover,
1676
1926
  font-size: 12.5px;
1677
1927
  color: var(--pactor-chat-fg);
1678
1928
  }
1679
-
1680
1929
  .pactor-chat-composer__attachment-name {
1681
1930
  max-width: 160px;
1682
1931
  overflow: hidden;
1683
1932
  text-overflow: ellipsis;
1684
1933
  white-space: nowrap;
1685
1934
  }
1686
-
1687
1935
  .pactor-chat-composer__attachment-size {
1688
1936
  color: var(--pactor-chat-muted-fg);
1689
1937
  }
1690
-
1691
1938
  .pactor-chat-composer__attachment-remove {
1692
1939
  position: absolute;
1693
1940
  top: -6px;
@@ -1697,79 +1944,25 @@ button.pactor-chat-trace__header:hover,
1697
1944
  border-radius: 50%;
1698
1945
  background: var(--pactor-chat-card);
1699
1946
  }
1700
-
1701
- /* 移除按钮是微型圆形按钮,保持 12px 小图标 */
1702
1947
  .pactor-chat-composer__attachment-remove svg {
1703
1948
  width: 12px;
1704
1949
  height: 12px;
1705
1950
  }
1706
-
1707
- /* 工具栏:渲染槽 + "+" / 附件入口 */
1708
- .pactor-chat-composer__toolbar {
1709
- display: flex;
1710
- align-items: center;
1711
- flex-wrap: wrap;
1712
- gap: 6px;
1713
- }
1714
-
1715
- .pactor-chat-composer__toolbar-spacer {
1716
- flex: 1;
1717
- }
1718
-
1719
- /* Composer footer 槽(spec: chat-composer-slots / Composer footer 槽):
1720
- 工具栏下方的自定义区域,结构与 ChatInput footer 一致(border-t 分隔) */
1721
- .pactor-chat-composer__footer {
1722
- display: flex;
1723
- align-items: center;
1724
- flex-wrap: wrap;
1725
- gap: 6px;
1726
- margin: 0 -14px -12px;
1727
- padding: 8px 12px 0;
1728
- border-top: 1px solid var(--pactor-chat-border);
1729
- }
1730
-
1731
- /* ------------------------------------------------------------
1732
- * Composer DSL 呈现路径(spec: chat-composer-on-chatinput):
1733
- * 盒模型让位 ChatInput 容器(边框 / 圆角 / 阴影 / 内边距由
1734
- * ChatInput 承担,经 pactor-chat-chrome 令牌映射着色),本容器
1735
- * 只保留布局与拖放态;focus 高亮由 ChatInput 自身 focus-within
1736
- * ring 承担,避免双层描边。
1737
- * ------------------------------------------------------------ */
1738
1951
  .pactor-chat-composer--dsl {
1739
- padding: 0;
1740
- border-color: transparent;
1741
- background: transparent;
1742
- box-shadow: none;
1743
- }
1744
-
1745
- .pactor-chat-composer--dsl:focus-within {
1746
- border-color: transparent;
1952
+ border: 1px solid transparent;
1953
+ border-radius: var(--pactor-chat-radius-xl);
1747
1954
  }
1748
-
1749
1955
  .pactor-chat-composer--dsl.pactor-chat-composer--dragover {
1750
1956
  border-color: var(--pactor-chat-primary);
1751
- border-radius: var(--pactor-chat-radius-xl);
1957
+ background: var(--pactor-chat-muted);
1752
1958
  }
1753
-
1754
- /* 输入高度下限 / 上限(与 ChatInput textarea 的 min-h-[60px] 一致;
1755
- 自适应由 field-sizing-content 承担,超上限内部滚动) */
1756
1959
  .pactor-chat-composer--dsl [data-slot='chat-input'] textarea {
1757
1960
  min-height: 60px;
1758
1961
  max-height: 200px;
1759
1962
  }
1760
-
1761
- /* header 槽空态(无附件无 chips)时收起包装,避免多余上间距 */
1762
1963
  .pactor-chat-composer--dsl [data-slot='chat-input'] > .px-3.pt-3:empty {
1763
1964
  display: none;
1764
1965
  }
1765
-
1766
- /* ------------------------------------------------------------
1767
- * 内建锚定弹层 AnchoredPopover(chat-builtin-features 设计决策 D3):
1768
- * position: fixed,top/bottom/left 由 JS 按锚点计算(上方优先、
1769
- * 空间不足翻转为 --below);首帧 visibility:hidden 量高后显示。
1770
- * 浮于 chat 内其它浮层之上(侧栏抽屉 50 / 遮罩 40 之上)。
1771
- * ------------------------------------------------------------ */
1772
-
1773
1966
  .pactor-chat-popover {
1774
1967
  position: fixed;
1775
1968
  z-index: 60;
@@ -1786,14 +1979,6 @@ button.pactor-chat-trace__header:hover,
1786
1979
  scrollbar-width: thin;
1787
1980
  scrollbar-color: var(--pactor-chat-border) transparent;
1788
1981
  }
1789
-
1790
- /* ------------------------------------------------------------
1791
- * 内建特性(chat-builtin-features):模型 chip / 上下文 chips /
1792
- * 弹层候选列表 / header 操作组与可编辑标题。全部只用既有
1793
- * --pactor-chat-* 语义令牌,暗色经令牌覆盖自动生效。
1794
- * ------------------------------------------------------------ */
1795
-
1796
- /* 弹层候选行(模型列表 / 上下文候选共用) */
1797
1982
  .pactor-chat-popover__item {
1798
1983
  display: flex;
1799
1984
  align-items: center;
@@ -1810,11 +1995,9 @@ button.pactor-chat-trace__header:hover,
1810
1995
  cursor: pointer;
1811
1996
  transition: background 0.15s ease;
1812
1997
  }
1813
-
1814
1998
  .pactor-chat-popover__item:hover {
1815
1999
  background: var(--pactor-chat-muted);
1816
2000
  }
1817
-
1818
2001
  .pactor-chat-popover__item-label {
1819
2002
  flex: 1;
1820
2003
  min-width: 0;
@@ -1822,47 +2005,36 @@ button.pactor-chat-trace__header:hover,
1822
2005
  text-overflow: ellipsis;
1823
2006
  white-space: nowrap;
1824
2007
  }
1825
-
1826
- /* 选中项勾选标记 */
1827
2008
  .pactor-chat-popover__item-check {
1828
2009
  flex-shrink: 0;
1829
2010
  color: var(--pactor-chat-primary);
1830
2011
  }
1831
-
1832
- /* 上下文候选列表:分组头 / loading 与空态提示 / 内联错误 */
1833
2012
  .pactor-chat-source-list {
1834
2013
  display: flex;
1835
2014
  flex-direction: column;
1836
2015
  gap: 2px;
1837
2016
  min-width: 180px;
1838
2017
  }
1839
-
1840
2018
  .pactor-chat-source-list__group {
1841
2019
  display: flex;
1842
2020
  flex-direction: column;
1843
2021
  gap: 2px;
1844
2022
  }
1845
-
1846
2023
  .pactor-chat-source-list__group-label {
1847
2024
  padding: 6px 10px 2px;
1848
2025
  color: var(--pactor-chat-muted-fg);
1849
2026
  font-size: 12px;
1850
2027
  }
1851
-
1852
2028
  .pactor-chat-source-list__hint {
1853
2029
  padding: 6px 10px;
1854
2030
  color: var(--pactor-chat-muted-fg);
1855
2031
  font-size: 12.5px;
1856
2032
  }
1857
-
1858
2033
  .pactor-chat-source-list__error {
1859
2034
  padding: 6px 10px;
1860
2035
  color: var(--pactor-chat-danger);
1861
2036
  font-size: 12.5px;
1862
2037
  }
1863
-
1864
- /* 内建模型 chip(Composer 工具栏右端,toolbarEnd 槽内容之前):
1865
- 无边框 ghost 形态(边框在工具栏里显脏),hover 以浅底反馈 */
1866
2038
  .pactor-chat-model-chip {
1867
2039
  display: inline-flex;
1868
2040
  align-items: center;
@@ -1874,26 +2046,17 @@ button.pactor-chat-trace__header:hover,
1874
2046
  color: var(--pactor-chat-muted-fg);
1875
2047
  font-size: 12.5px;
1876
2048
  cursor: pointer;
1877
- transition:
1878
- background-color 0.15s ease,
1879
- color 0.15s ease;
2049
+ transition: background-color 0.15s ease, color 0.15s ease;
1880
2050
  }
1881
-
1882
2051
  .pactor-chat-model-chip:hover {
1883
2052
  background: var(--pactor-chat-muted);
1884
2053
  color: var(--pactor-chat-fg);
1885
2054
  }
1886
-
1887
- /* ModelSelect DSL 路径(spec: chat-on-ui-components):ui Select
1888
- 收敛到工具栏节奏(触发器尺寸与 chip 相当,颜色经 chrome 令牌映射);
1889
- 触发器同为无边框 ghost 形态(覆盖 shadcn Select 的表单边框/阴影),
1890
- 与 fallback chip 视觉一致 */
1891
2055
  .pactor-chat-model-select {
1892
2056
  width: auto;
1893
2057
  min-width: 112px;
1894
2058
  font-size: 12.5px;
1895
2059
  }
1896
-
1897
2060
  .pactor-chat-model-select [data-slot='select-trigger'] {
1898
2061
  height: auto;
1899
2062
  gap: 4px;
@@ -1903,42 +2066,29 @@ button.pactor-chat-trace__header:hover,
1903
2066
  box-shadow: none;
1904
2067
  color: var(--pactor-chat-muted-fg);
1905
2068
  font-size: 12.5px;
1906
- transition:
1907
- background-color 0.15s ease,
1908
- color 0.15s ease;
2069
+ transition: background-color 0.15s ease, color 0.15s ease;
1909
2070
  }
1910
-
1911
2071
  .pactor-chat-model-select [data-slot='select-trigger']:hover {
1912
2072
  background: var(--pactor-chat-muted);
1913
2073
  color: var(--pactor-chat-fg);
1914
2074
  }
1915
-
1916
- /* 实心图标(spec: chat-icon-convergence):停止钮方形等需 fill 的
1917
- 图标(ui Icon 走描边体系,fill 经 CSS 覆盖 lucide svg 的 fill=none) */
1918
2075
  .pactor-chat-icon-fill {
1919
2076
  fill: currentColor;
1920
2077
  }
1921
-
1922
- /* ArtifactPanel 标题栏 DSL 路径(spec: chat-on-ui-components):
1923
- chrome 容器 display:contents,DSL Flex 占满标题行 */
1924
2078
  .pactor-chat-inspector__header-dsl {
1925
2079
  width: 100%;
1926
2080
  }
1927
-
1928
2081
  .pactor-chat-model-chip__label {
1929
2082
  max-width: 160px;
1930
2083
  overflow: hidden;
1931
2084
  text-overflow: ellipsis;
1932
2085
  white-space: nowrap;
1933
2086
  }
1934
-
1935
- /* 上下文 chips 区(输入区上方) */
1936
2087
  .pactor-chat-composer__contexts {
1937
2088
  display: flex;
1938
2089
  flex-wrap: wrap;
1939
2090
  gap: 6px;
1940
2091
  }
1941
-
1942
2092
  .pactor-chat-context-chip {
1943
2093
  display: inline-flex;
1944
2094
  align-items: center;
@@ -1950,46 +2100,35 @@ button.pactor-chat-trace__header:hover,
1950
2100
  color: var(--pactor-chat-fg);
1951
2101
  font-size: 12.5px;
1952
2102
  }
1953
-
1954
2103
  .pactor-chat-context-chip__label {
1955
2104
  max-width: 180px;
1956
2105
  overflow: hidden;
1957
2106
  text-overflow: ellipsis;
1958
2107
  white-space: nowrap;
1959
2108
  }
1960
-
1961
2109
  .pactor-chat-context-chip__remove {
1962
2110
  padding: 2px;
1963
2111
  }
1964
-
1965
2112
  .pactor-chat-context-chip__remove svg {
1966
2113
  width: 12px;
1967
2114
  height: 12px;
1968
2115
  }
1969
-
1970
- /* 内建 header 操作组 + 可编辑标题(spec: chat-dsl-component / Header 配置) */
1971
- /* header 位模型 chip(spec: chat-model-selector,决策 D2):chip + title
1972
- * 组成左端组(chip 在 title 之前);未配置 headerStart 槽时不渲染本容器 */
1973
2116
  .pactor-chat-workspace__header-left {
1974
2117
  display: flex;
1975
2118
  align-items: center;
1976
2119
  gap: 10px;
1977
2120
  min-width: 0;
1978
2121
  }
1979
-
1980
2122
  .pactor-chat-workspace__header-right {
1981
2123
  display: flex;
1982
2124
  align-items: center;
1983
2125
  gap: 8px;
1984
2126
  }
1985
-
1986
2127
  .pactor-chat-workspace__header-actions {
1987
2128
  display: flex;
1988
2129
  align-items: center;
1989
2130
  gap: 4px;
1990
2131
  }
1991
-
1992
- /* 可编辑标题:按钮形态继承标题排版,hover 提示可点击 */
1993
2132
  .pactor-chat-workspace__title--editable {
1994
2133
  border: none;
1995
2134
  border-radius: var(--pactor-chat-radius-sm);
@@ -1998,11 +2137,9 @@ button.pactor-chat-trace__header:hover,
1998
2137
  cursor: pointer;
1999
2138
  padding: 2px 6px;
2000
2139
  }
2001
-
2002
2140
  .pactor-chat-workspace__title--editable:hover {
2003
2141
  background: var(--pactor-chat-muted);
2004
2142
  }
2005
-
2006
2143
  .pactor-chat-workspace__title-input {
2007
2144
  border: 1px solid var(--pactor-chat-border);
2008
2145
  border-radius: var(--pactor-chat-radius-sm);
@@ -2013,76 +2150,249 @@ button.pactor-chat-trace__header:hover,
2013
2150
  padding: 2px 8px;
2014
2151
  outline: none;
2015
2152
  }
2016
-
2017
2153
  .pactor-chat-workspace__title-input:focus {
2018
2154
  border-color: var(--pactor-chat-primary);
2019
2155
  }
2020
-
2021
- /* ============================================================
2022
- * 10. 动效降级(prefers-reduced-motion)
2023
- * ============================================================ */
2024
-
2025
- /* 遵循系统级减弱动效设置:过渡缩短到近乎即时;循环动画(呼吸文案、
2026
- 停止光环、状态图标脉冲、spinner 旋转)整体移除,保留静态色态指示 */
2027
2156
  @media (prefers-reduced-motion: reduce) {
2028
- .pactor-chat-view *,
2029
- .pactor-chat-view *::before,
2030
- .pactor-chat-view *::after,
2031
- .pactor-chat-layout *,
2032
- .pactor-chat-layout *::before,
2033
- .pactor-chat-layout *::after,
2034
- .pactor-chat-shell *,
2035
- .pactor-chat-shell *::before,
2036
- .pactor-chat-shell *::after {
2157
+ .pactor-chat-view *, .pactor-chat-view *::before, .pactor-chat-view *::after, .pactor-chat-layout *, .pactor-chat-layout *::before, .pactor-chat-layout *::after, .pactor-chat-shell *, .pactor-chat-shell *::before, .pactor-chat-shell *::after {
2037
2158
  animation-duration: 0.001ms !important;
2038
2159
  animation-iteration-count: 1 !important;
2039
2160
  transition-duration: 0.001ms !important;
2040
2161
  }
2041
-
2042
- .pactor-chat-trace__status-text--breathing,
2043
- .pactor-chat-trace__status-icon:has(.pactor-chat-spin),
2044
- .pactor-chat-thinking[data-streaming='true'] .pactor-chat-thinking__icon,
2045
- .pactor-chat-spin,
2046
- .pactor-chat-composer__button--stop::after {
2162
+ .pactor-chat-trace__status-text--breathing, .pactor-chat-trace__status-icon:has(.pactor-chat-spin), .pactor-chat-thinking[data-streaming='true'] .pactor-chat-thinking__icon, .pactor-chat-spin, .pactor-chat-composer__button--stop::after {
2047
2163
  animation: none !important;
2048
2164
  }
2049
2165
  }
2050
-
2051
2166
  .pactor-markdown {
2052
2167
  line-height: 2;
2053
2168
  }
2054
-
2055
2169
  .pactor-markdown hr {
2056
2170
  margin: 1em 0;
2057
2171
  }
2058
-
2059
2172
  .pactor-markdown h3 {
2060
2173
  font-size: 1.1em;
2061
2174
  }
2062
-
2063
2175
  .pactor-markdown h2 {
2064
2176
  font-size: 1.2em;
2065
2177
  }
2066
-
2067
2178
  .pactor-markdown h1 {
2068
2179
  font-size: 1.3rem;
2069
2180
  }
2070
-
2071
- .pactor-markdown h1,
2072
- .pactor-markdown h2,
2073
- .pactor-markdown h3,
2074
- .pactor-markdown h4,
2075
- .pactor-markdown h5,
2076
- .pactor-markdown h6 {
2181
+ .pactor-markdown h1, .pactor-markdown h2, .pactor-markdown h3, .pactor-markdown h4, .pactor-markdown h5, .pactor-markdown h6 {
2077
2182
  font-weight: 600;
2078
2183
  margin-top: .5em;
2079
2184
  margin-bottom: .5em;
2080
2185
  }
2081
-
2082
2186
  .pactor-chat-thinking {
2083
2187
  margin-top: 8px;
2084
2188
  }
2085
-
2086
2189
  .pactor-chat-thinking__body .pactor-markdown {
2087
2190
  line-height: 1.5;
2088
2191
  }
2192
+ @property --tw-translate-x {
2193
+ syntax: "*";
2194
+ inherits: false;
2195
+ initial-value: 0;
2196
+ }
2197
+ @property --tw-translate-y {
2198
+ syntax: "*";
2199
+ inherits: false;
2200
+ initial-value: 0;
2201
+ }
2202
+ @property --tw-translate-z {
2203
+ syntax: "*";
2204
+ inherits: false;
2205
+ initial-value: 0;
2206
+ }
2207
+ @property --tw-border-style {
2208
+ syntax: "*";
2209
+ inherits: false;
2210
+ initial-value: solid;
2211
+ }
2212
+ @property --tw-leading {
2213
+ syntax: "*";
2214
+ inherits: false;
2215
+ }
2216
+ @property --tw-font-weight {
2217
+ syntax: "*";
2218
+ inherits: false;
2219
+ }
2220
+ @property --tw-shadow {
2221
+ syntax: "*";
2222
+ inherits: false;
2223
+ initial-value: 0 0 #0000;
2224
+ }
2225
+ @property --tw-shadow-color {
2226
+ syntax: "*";
2227
+ inherits: false;
2228
+ }
2229
+ @property --tw-shadow-alpha {
2230
+ syntax: "<percentage>";
2231
+ inherits: false;
2232
+ initial-value: 100%;
2233
+ }
2234
+ @property --tw-inset-shadow {
2235
+ syntax: "*";
2236
+ inherits: false;
2237
+ initial-value: 0 0 #0000;
2238
+ }
2239
+ @property --tw-inset-shadow-color {
2240
+ syntax: "*";
2241
+ inherits: false;
2242
+ }
2243
+ @property --tw-inset-shadow-alpha {
2244
+ syntax: "<percentage>";
2245
+ inherits: false;
2246
+ initial-value: 100%;
2247
+ }
2248
+ @property --tw-ring-color {
2249
+ syntax: "*";
2250
+ inherits: false;
2251
+ }
2252
+ @property --tw-ring-shadow {
2253
+ syntax: "*";
2254
+ inherits: false;
2255
+ initial-value: 0 0 #0000;
2256
+ }
2257
+ @property --tw-inset-ring-color {
2258
+ syntax: "*";
2259
+ inherits: false;
2260
+ }
2261
+ @property --tw-inset-ring-shadow {
2262
+ syntax: "*";
2263
+ inherits: false;
2264
+ initial-value: 0 0 #0000;
2265
+ }
2266
+ @property --tw-ring-inset {
2267
+ syntax: "*";
2268
+ inherits: false;
2269
+ }
2270
+ @property --tw-ring-offset-width {
2271
+ syntax: "<length>";
2272
+ inherits: false;
2273
+ initial-value: 0px;
2274
+ }
2275
+ @property --tw-ring-offset-color {
2276
+ syntax: "*";
2277
+ inherits: false;
2278
+ initial-value: #fff;
2279
+ }
2280
+ @property --tw-ring-offset-shadow {
2281
+ syntax: "*";
2282
+ inherits: false;
2283
+ initial-value: 0 0 #0000;
2284
+ }
2285
+ @property --tw-outline-style {
2286
+ syntax: "*";
2287
+ inherits: false;
2288
+ initial-value: solid;
2289
+ }
2290
+ @property --tw-blur {
2291
+ syntax: "*";
2292
+ inherits: false;
2293
+ }
2294
+ @property --tw-brightness {
2295
+ syntax: "*";
2296
+ inherits: false;
2297
+ }
2298
+ @property --tw-contrast {
2299
+ syntax: "*";
2300
+ inherits: false;
2301
+ }
2302
+ @property --tw-grayscale {
2303
+ syntax: "*";
2304
+ inherits: false;
2305
+ }
2306
+ @property --tw-hue-rotate {
2307
+ syntax: "*";
2308
+ inherits: false;
2309
+ }
2310
+ @property --tw-invert {
2311
+ syntax: "*";
2312
+ inherits: false;
2313
+ }
2314
+ @property --tw-opacity {
2315
+ syntax: "*";
2316
+ inherits: false;
2317
+ }
2318
+ @property --tw-saturate {
2319
+ syntax: "*";
2320
+ inherits: false;
2321
+ }
2322
+ @property --tw-sepia {
2323
+ syntax: "*";
2324
+ inherits: false;
2325
+ }
2326
+ @property --tw-drop-shadow {
2327
+ syntax: "*";
2328
+ inherits: false;
2329
+ }
2330
+ @property --tw-drop-shadow-color {
2331
+ syntax: "*";
2332
+ inherits: false;
2333
+ }
2334
+ @property --tw-drop-shadow-alpha {
2335
+ syntax: "<percentage>";
2336
+ inherits: false;
2337
+ initial-value: 100%;
2338
+ }
2339
+ @property --tw-drop-shadow-size {
2340
+ syntax: "*";
2341
+ inherits: false;
2342
+ }
2343
+ @property --tw-content {
2344
+ syntax: "*";
2345
+ initial-value: "";
2346
+ inherits: false;
2347
+ }
2348
+ @keyframes spin {
2349
+ to {
2350
+ transform: rotate(360deg);
2351
+ }
2352
+ }
2353
+ @keyframes pulse {
2354
+ 50% {
2355
+ opacity: 0.5;
2356
+ }
2357
+ }
2358
+ @layer properties {
2359
+ @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
2360
+ *, ::before, ::after, ::backdrop {
2361
+ --tw-translate-x: 0;
2362
+ --tw-translate-y: 0;
2363
+ --tw-translate-z: 0;
2364
+ --tw-border-style: solid;
2365
+ --tw-leading: initial;
2366
+ --tw-font-weight: initial;
2367
+ --tw-shadow: 0 0 #0000;
2368
+ --tw-shadow-color: initial;
2369
+ --tw-shadow-alpha: 100%;
2370
+ --tw-inset-shadow: 0 0 #0000;
2371
+ --tw-inset-shadow-color: initial;
2372
+ --tw-inset-shadow-alpha: 100%;
2373
+ --tw-ring-color: initial;
2374
+ --tw-ring-shadow: 0 0 #0000;
2375
+ --tw-inset-ring-color: initial;
2376
+ --tw-inset-ring-shadow: 0 0 #0000;
2377
+ --tw-ring-inset: initial;
2378
+ --tw-ring-offset-width: 0px;
2379
+ --tw-ring-offset-color: #fff;
2380
+ --tw-ring-offset-shadow: 0 0 #0000;
2381
+ --tw-outline-style: solid;
2382
+ --tw-blur: initial;
2383
+ --tw-brightness: initial;
2384
+ --tw-contrast: initial;
2385
+ --tw-grayscale: initial;
2386
+ --tw-hue-rotate: initial;
2387
+ --tw-invert: initial;
2388
+ --tw-opacity: initial;
2389
+ --tw-saturate: initial;
2390
+ --tw-sepia: initial;
2391
+ --tw-drop-shadow: initial;
2392
+ --tw-drop-shadow-color: initial;
2393
+ --tw-drop-shadow-alpha: 100%;
2394
+ --tw-drop-shadow-size: initial;
2395
+ --tw-content: "";
2396
+ }
2397
+ }
2398
+ }