larkway 0.3.6

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.
@@ -0,0 +1,4258 @@
1
+ /*
2
+ * src/web/public/style.css — Larkway 看板 · Atelier 改版
3
+ *
4
+ * 双角色配色系统(directionAtelier.jsx):
5
+ * • Indigo(BR)= 品牌 + 交互层(logo / 选中 bot / 添加新助手 / 主保存按钮 /
6
+ * 输入 focus 环 / 健康 hero 头像光环)。白字 on #4f46e5 对比 ~5.5:1 达 AA。
7
+ * • Green/status(LK_COLORS)= 仅状态语义(在线/掉线圆点、状态条、心跳线)。
8
+ * 中性 slate + Figtree / Noto Sans SC。图标全内联 SVG(无 emoji 当图标)。
9
+ */
10
+
11
+ @import url("https://fonts.googleapis.com/css2?family=Figtree:wght@400;500;600;700;800&family=Noto+Sans+SC:wght@400;500;600;700&display=swap");
12
+
13
+ :root {
14
+ /* ── 中性 ── */
15
+ --bg: #f6f7f9;
16
+ --surface: #ffffff;
17
+ --border: #e2e8f0;
18
+ --text: #1e293b;
19
+ --muted: #64748b;
20
+ --faint: #94a3b8;
21
+
22
+ /* ── indigo:品牌 + 交互 ── */
23
+ --br: #4f46e5;
24
+ --br-soft: #eef2ff;
25
+ --br-edge: #c7d2fe;
26
+ --br-text: #4338ca;
27
+ --br-hover: #e0e7ff;
28
+ --br-ring: rgba(79, 70, 229, 0.2);
29
+ --br-focus: #818cf8;
30
+ --br-disabled: #c7cdf5;
31
+
32
+ /* ── 危险(正式上传) ── */
33
+ --destructive: #ef4444;
34
+ --destructive-text: #b91c1c;
35
+ --destructive-strong: #dc2626;
36
+ --destructive-weak: #fef2f2;
37
+
38
+ --radius: 14px;
39
+ --radius-sm: 12px;
40
+ --shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.04);
41
+ --shadow-lg: 0 12px 40px rgba(15, 23, 42, 0.16);
42
+ /* 交互 focus 环走 indigo */
43
+ --ring: 0 0 0 3px var(--br-ring);
44
+
45
+ font-family:
46
+ "Figtree", "Noto Sans SC", -apple-system, BlinkMacSystemFont, "Segoe UI",
47
+ "PingFang SC", "Microsoft YaHei", Roboto, Helvetica, Arial, sans-serif;
48
+ }
49
+
50
+ * {
51
+ box-sizing: border-box;
52
+ }
53
+
54
+ /* hidden 必须真隐藏(否则被 .toast / .modal-backdrop 的 display 覆盖) */
55
+ [hidden] {
56
+ display: none !important;
57
+ }
58
+
59
+ html,
60
+ body {
61
+ margin: 0;
62
+ height: 100%;
63
+ }
64
+
65
+ body {
66
+ background: var(--bg);
67
+ color: var(--text);
68
+ font-size: 16px;
69
+ line-height: 1.5;
70
+ display: flex;
71
+ flex-direction: column;
72
+ -webkit-font-smoothing: antialiased;
73
+ }
74
+
75
+ .dim,
76
+ .muted {
77
+ color: var(--muted);
78
+ }
79
+
80
+ ::-webkit-scrollbar {
81
+ width: 10px;
82
+ height: 10px;
83
+ }
84
+ ::-webkit-scrollbar-thumb {
85
+ background: var(--border);
86
+ border-radius: 6px;
87
+ border: 3px solid transparent;
88
+ background-clip: padding-box;
89
+ }
90
+
91
+ /* 通用 svg 图标 */
92
+ .icon {
93
+ width: 18px;
94
+ height: 18px;
95
+ flex-shrink: 0;
96
+ stroke: currentColor;
97
+ stroke-width: 2;
98
+ fill: none;
99
+ stroke-linecap: round;
100
+ stroke-linejoin: round;
101
+ vertical-align: middle;
102
+ }
103
+ .icon-sm {
104
+ width: 15px;
105
+ height: 15px;
106
+ }
107
+
108
+ /* ===========================================================================
109
+ keyframes(复刻 shared.jsx)
110
+ =========================================================================== */
111
+ @keyframes spin {
112
+ to {
113
+ transform: rotate(360deg);
114
+ }
115
+ }
116
+ @keyframes lk-ecg {
117
+ to {
118
+ stroke-dashoffset: -64;
119
+ }
120
+ }
121
+ @keyframes lk-scan {
122
+ 0% {
123
+ top: 8%;
124
+ }
125
+ 50% {
126
+ top: 88%;
127
+ }
128
+ 100% {
129
+ top: 8%;
130
+ }
131
+ }
132
+ @keyframes lk-fade {
133
+ from {
134
+ opacity: 0;
135
+ }
136
+ to {
137
+ opacity: 1;
138
+ }
139
+ }
140
+ @keyframes lk-ping {
141
+ 0% {
142
+ transform: scale(0.62);
143
+ opacity: 0.55;
144
+ }
145
+ 70%,
146
+ 100% {
147
+ transform: scale(1.5);
148
+ opacity: 0;
149
+ }
150
+ }
151
+ @keyframes lk-pulse {
152
+ 0%,
153
+ 100% {
154
+ opacity: 1;
155
+ }
156
+ 50% {
157
+ opacity: 0.35;
158
+ }
159
+ }
160
+ @keyframes lk-toast {
161
+ from {
162
+ transform: translateX(-50%) translateY(12px);
163
+ opacity: 0;
164
+ }
165
+ }
166
+ @keyframes lk-rise {
167
+ from {
168
+ opacity: 0;
169
+ transform: translateY(6px);
170
+ }
171
+ }
172
+ @keyframes lk-saveflash {
173
+ 0% {
174
+ box-shadow: 0 0 0 0 rgba(79, 70, 229, 0);
175
+ }
176
+ 30% {
177
+ box-shadow: 0 0 0 4px rgba(79, 70, 229, 0.22);
178
+ }
179
+ 100% {
180
+ box-shadow: 0 0 0 0 rgba(79, 70, 229, 0);
181
+ }
182
+ }
183
+
184
+ /* ===========================================================================
185
+ topbar(HeaderCentered · 方案 B):60px,中间绝对居中分段控件
186
+ =========================================================================== */
187
+ .topbar {
188
+ position: relative;
189
+ display: flex;
190
+ align-items: center;
191
+ padding: 0 28px;
192
+ height: 60px;
193
+ background: var(--surface);
194
+ border-bottom: 1px solid var(--border);
195
+ flex-shrink: 0;
196
+ }
197
+
198
+ .brand {
199
+ display: inline-flex;
200
+ align-items: center;
201
+ gap: 9px;
202
+ white-space: nowrap;
203
+ }
204
+ .brand-mark {
205
+ display: inline-flex;
206
+ width: 30px;
207
+ height: 30px;
208
+ border-radius: 9px;
209
+ align-items: center;
210
+ justify-content: center;
211
+ background: rgba(79, 70, 229, 0.1);
212
+ border: 1px solid rgba(79, 70, 229, 0.3);
213
+ flex-shrink: 0;
214
+ }
215
+ .brand-mark svg {
216
+ display: block;
217
+ }
218
+ .brand-word {
219
+ font-weight: 800;
220
+ font-size: 18px;
221
+ letter-spacing: -0.025em;
222
+ color: var(--text);
223
+ line-height: 1;
224
+ }
225
+ .brand-sub {
226
+ font-size: 11px;
227
+ font-weight: 600;
228
+ letter-spacing: 0.14em;
229
+ text-transform: uppercase;
230
+ color: var(--faint);
231
+ margin-left: 1px;
232
+ }
233
+ .brand-ver {
234
+ font-size: 11px;
235
+ font-weight: 500;
236
+ font-family: ui-monospace, "Cascadia Code", "Fira Code", monospace;
237
+ color: var(--muted);
238
+ padding: 1px 7px;
239
+ margin-left: 2px;
240
+ border-radius: 999px;
241
+ border: 1px solid var(--border);
242
+ background: var(--bg);
243
+ line-height: 1.5;
244
+ white-space: nowrap;
245
+ }
246
+ .brand-ver:empty {
247
+ display: none;
248
+ }
249
+
250
+ /* 中间绝对居中分段控件(轨道 #f6f7f9 圆角9,active 白底+阴影 圆角7) */
251
+ .context-switch {
252
+ position: absolute;
253
+ left: 50%;
254
+ top: 50%;
255
+ transform: translate(-50%, -50%);
256
+ display: flex;
257
+ align-items: center;
258
+ gap: 2px;
259
+ background: var(--bg);
260
+ border: 1px solid var(--border);
261
+ border-radius: 9px;
262
+ padding: 3px;
263
+ }
264
+ .ctx-btn {
265
+ display: flex;
266
+ align-items: center;
267
+ gap: 5px;
268
+ padding: 6px 15px;
269
+ border: none;
270
+ background: transparent;
271
+ border-radius: 7px;
272
+ cursor: pointer;
273
+ color: var(--muted);
274
+ line-height: 1.3;
275
+ font-size: 13px;
276
+ font-weight: 500;
277
+ font-family: inherit;
278
+ white-space: nowrap;
279
+ transition:
280
+ background 0.15s ease,
281
+ color 0.15s ease,
282
+ box-shadow 0.15s ease;
283
+ }
284
+ .ctx-btn:focus-visible {
285
+ outline: none;
286
+ box-shadow: var(--ring);
287
+ }
288
+ .ctx-btn.is-active {
289
+ background: var(--surface);
290
+ color: var(--text);
291
+ font-weight: 600;
292
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08);
293
+ }
294
+ .ctx-btn:disabled {
295
+ opacity: 0.45;
296
+ cursor: not-allowed;
297
+ }
298
+ .ctx-hint {
299
+ font-size: 11px;
300
+ color: var(--faint);
301
+ font-weight: 400;
302
+ }
303
+
304
+ /* 状态芯片:右对齐 pill,主文案 + 副文案 */
305
+ .status-pill {
306
+ display: inline-flex;
307
+ align-items: center;
308
+ gap: 8px;
309
+ margin-left: auto;
310
+ padding: 6px 14px;
311
+ border-radius: 999px;
312
+ background: var(--bg);
313
+ border: 1px solid var(--border);
314
+ font-size: 13px;
315
+ color: var(--muted);
316
+ white-space: nowrap;
317
+ font-weight: 600;
318
+ }
319
+ .status-pill[data-state="ok"] {
320
+ border-color: #bbf7d0;
321
+ background: #f0fdf4;
322
+ color: #15803d;
323
+ }
324
+ .status-pill[data-state="warn"] {
325
+ border-color: #fde68a;
326
+ background: #fffbeb;
327
+ color: #b45309;
328
+ }
329
+ .status-pill[data-state="offline"] {
330
+ border-color: #fecaca;
331
+ background: var(--destructive-weak);
332
+ color: var(--destructive-text);
333
+ }
334
+ .status-pill[data-state="unknown"] {
335
+ border-color: var(--border);
336
+ background: var(--bg);
337
+ color: var(--muted);
338
+ }
339
+ .status-dot {
340
+ width: 8px;
341
+ height: 8px;
342
+ border-radius: 50%;
343
+ background: currentColor;
344
+ }
345
+ .status-pill[data-state="ok"] .status-dot {
346
+ animation: lk-pulse 2.2s ease-in-out infinite;
347
+ }
348
+ .status-sub {
349
+ color: var(--faint);
350
+ font-weight: 500;
351
+ }
352
+
353
+ /* ===========================================================================
354
+ bridge indicator (topbar)
355
+ =========================================================================== */
356
+ .bridge-indicator {
357
+ display: inline-flex;
358
+ align-items: center;
359
+ gap: 6px;
360
+ font-size: 12.5px;
361
+ font-weight: 500;
362
+ color: var(--muted);
363
+ white-space: nowrap;
364
+ margin-left: auto;
365
+ padding: 4px 10px;
366
+ }
367
+ .bridge-dot {
368
+ width: 8px;
369
+ height: 8px;
370
+ border-radius: 50%;
371
+ background: #94a3b8; /* default: unknown/gray */
372
+ flex-shrink: 0;
373
+ transition: background 0.3s ease;
374
+ }
375
+ .bridge-dot.is-running {
376
+ background: #16a34a;
377
+ animation: lk-pulse 2.2s ease-in-out infinite;
378
+ }
379
+ .bridge-dot.is-stopped {
380
+ background: #94a3b8;
381
+ }
382
+ .bridge-btn {
383
+ font-size: 12px;
384
+ padding: 4px 10px;
385
+ border-radius: 8px;
386
+ height: auto;
387
+ }
388
+
389
+ /* ===========================================================================
390
+ LkServiceIndicator — 顶栏服务指示器(Design Block B)
391
+ =========================================================================== */
392
+ .lk-svc-indicator {
393
+ display: inline-flex;
394
+ align-items: stretch;
395
+ border-radius: 10px;
396
+ overflow: hidden;
397
+ white-space: nowrap;
398
+ }
399
+ .lk-svc-indicator--offline {
400
+ border: 1px solid #fecaca;
401
+ background: #fef2f2;
402
+ }
403
+ .lk-svc-indicator--pending {
404
+ border: 1px solid #fde68a;
405
+ background: #fffbeb;
406
+ }
407
+ .lk-svc-indicator--ok {
408
+ display: inline-flex;
409
+ align-items: center;
410
+ gap: 6px;
411
+ padding: 7px 14px;
412
+ border-radius: 999px;
413
+ background: #f0fdf4;
414
+ border: 1px solid #bbf7d0;
415
+ color: #15803d;
416
+ font-size: 13px;
417
+ font-weight: 600;
418
+ }
419
+ .lk-svc-indicator--unknown {
420
+ display: inline-flex;
421
+ align-items: center;
422
+ gap: 6px;
423
+ padding: 7px 14px;
424
+ border-radius: 999px;
425
+ background: var(--bg);
426
+ border: 1px solid var(--border);
427
+ color: var(--muted);
428
+ font-size: 13px;
429
+ font-weight: 600;
430
+ }
431
+ .lk-svc-label {
432
+ display: inline-flex;
433
+ align-items: center;
434
+ gap: 6px;
435
+ padding: 0 12px 0 13px;
436
+ height: 36px;
437
+ font-size: 13px;
438
+ font-weight: 600;
439
+ color: #b91c1c;
440
+ }
441
+ .lk-svc-indicator--pending .lk-svc-label {
442
+ color: #b45309;
443
+ }
444
+ .lk-svc-sublabel {
445
+ font-size: 11.5px;
446
+ font-weight: 500;
447
+ color: #dc2626;
448
+ opacity: 0.8;
449
+ }
450
+ .lk-svc-action-btn {
451
+ transition: background 0.14s;
452
+ }
453
+ .lk-svc-action-btn:hover {
454
+ background: #4338ca !important;
455
+ }
456
+
457
+ /* LkAttentionPill — 名册行「需处理」克制角标 */
458
+ .lk-attention-pill {
459
+ flex-shrink: 0;
460
+ }
461
+ .lk-attention-pill .icon {
462
+ width: 10px;
463
+ height: 10px;
464
+ }
465
+
466
+ /* lk-fix-btn hover effects */
467
+ .lk-fix-btn-primary:not(:disabled):hover {
468
+ background: #4338ca !important;
469
+ border-color: #4338ca !important;
470
+ }
471
+ .lk-fix-btn-secondary:hover,
472
+ .lk-fix-btn-ghost:hover {
473
+ background: #eef2ff !important;
474
+ }
475
+
476
+ /* ===========================================================================
477
+ live status dot — 状态语义色(serving 绿 / degraded 橙 / offline 红 / unknown 灰)
478
+ =========================================================================== */
479
+ .live-dot {
480
+ display: inline-block;
481
+ width: 9px;
482
+ height: 9px;
483
+ border-radius: 50%;
484
+ flex-shrink: 0;
485
+ background: #94a3b8;
486
+ }
487
+ .live-dot.is-serving {
488
+ background: #16a34a;
489
+ animation: lk-pulse 2.2s ease-in-out infinite;
490
+ }
491
+ .live-dot.is-degraded {
492
+ background: #d97706;
493
+ }
494
+ .live-dot.is-offline {
495
+ background: #dc2626;
496
+ }
497
+ .live-dot.is-unknown {
498
+ background: #94a3b8;
499
+ }
500
+ /* BL-18: 第 5 态 transitioning(重启中 sky 慢呼吸) */
501
+ .live-dot.is-transitioning {
502
+ background: #0284c7;
503
+ animation: lk-breathe 2.6s ease-in-out infinite;
504
+ }
505
+
506
+ /* BL-18: 重启专属 keyframes(照 restartKit.jsx) */
507
+ @keyframes lk-breathe {
508
+ 0%, 100% { transform: scale(1); opacity: 1; }
509
+ 50% { transform: scale(.66); opacity: .5; }
510
+ }
511
+ @keyframes lk-sweepring {
512
+ 0% { transform: scale(.55); opacity: .5; }
513
+ 75%, 100% { transform: scale(1.85); opacity: 0; }
514
+ }
515
+ @keyframes lk-shimmer {
516
+ to { background-position: 200% 0; }
517
+ }
518
+ @media (prefers-reduced-motion: reduce) {
519
+ .lk-trans-dot,
520
+ .lk-trans-ring,
521
+ .lk-reconnect,
522
+ .live-dot.is-transitioning {
523
+ animation: none !important;
524
+ }
525
+ }
526
+
527
+ /* ===========================================================================
528
+ avatar(飞书 bot 头像 + 首字母彩色回退 + 右下角状态角标)
529
+ list=38 圆形 / hero=76 圆角方形 + 健康脉冲环
530
+ =========================================================================== */
531
+ .avatar {
532
+ position: relative;
533
+ display: inline-flex;
534
+ flex-shrink: 0;
535
+ border-radius: 50%;
536
+ }
537
+ .avatar-img,
538
+ .avatar-fallback {
539
+ width: 100%;
540
+ height: 100%;
541
+ border-radius: inherit;
542
+ object-fit: cover;
543
+ display: block;
544
+ }
545
+ .avatar-fallback {
546
+ display: flex;
547
+ align-items: center;
548
+ justify-content: center;
549
+ color: #fff;
550
+ font-weight: 600;
551
+ line-height: 1;
552
+ letter-spacing: 0.01em;
553
+ }
554
+ .avatar-list {
555
+ width: 38px;
556
+ height: 38px;
557
+ }
558
+ .avatar-list .avatar-fallback {
559
+ font-size: 16px;
560
+ }
561
+ .avatar-hero {
562
+ width: 76px;
563
+ height: 76px;
564
+ border-radius: 20px;
565
+ }
566
+ .avatar-hero .avatar-fallback {
567
+ font-size: 32px;
568
+ }
569
+ /* AC 面板里的 56px 圆角方(agentConfig.jsx LkAvatar size=56 radius=16) */
570
+ .avatar-ac {
571
+ width: 56px;
572
+ height: 56px;
573
+ border-radius: 16px;
574
+ }
575
+
576
+ .avatar-ac .avatar-fallback {
577
+ font-size: 22px;
578
+ }
579
+
580
+ /* 健康脉冲环(serving 才有,跟 LkAvatar ring 一致) */
581
+ .avatar-ring {
582
+ position: absolute;
583
+ inset: 0;
584
+ border-radius: inherit;
585
+ border: 2px solid #16a34a;
586
+ animation: lk-ping 2.4s ease-out infinite;
587
+ pointer-events: none;
588
+ }
589
+ /* 状态角标:叠在头像右下角,白描边圈出 */
590
+ .avatar-dot {
591
+ position: absolute;
592
+ right: -1px;
593
+ bottom: -1px;
594
+ width: 11px;
595
+ height: 11px;
596
+ border: 2px solid var(--surface);
597
+ }
598
+ .avatar-hero .avatar-dot {
599
+ right: 2px;
600
+ bottom: 2px;
601
+ width: 18px;
602
+ height: 18px;
603
+ border-width: 3px;
604
+ }
605
+
606
+ /* ===========================================================================
607
+ layout:300px 名册侧栏 + 1fr 详情
608
+ =========================================================================== */
609
+ .layout {
610
+ flex: 1;
611
+ display: grid;
612
+ grid-template-columns: 340px 1fr;
613
+ min-height: 0;
614
+ overflow: hidden;
615
+ }
616
+
617
+ /* ===========================================================================
618
+ sidebar — 助手名册
619
+ =========================================================================== */
620
+ .sidebar {
621
+ border-right: 1px solid var(--border);
622
+ background: var(--surface);
623
+ display: flex;
624
+ flex-direction: column;
625
+ min-height: 0;
626
+ }
627
+ .sidebar-head {
628
+ padding: 20px 22px 12px;
629
+ flex-shrink: 0;
630
+ }
631
+ .roster-eyebrow {
632
+ font-size: 11px;
633
+ font-weight: 700;
634
+ letter-spacing: 0.14em;
635
+ text-transform: uppercase;
636
+ color: var(--faint);
637
+ }
638
+ .roster-count {
639
+ display: flex;
640
+ align-items: center;
641
+ gap: 7px;
642
+ font-size: 13px;
643
+ color: var(--muted);
644
+ margin-top: 3px;
645
+ }
646
+ /* BL-18: 名册头部重启状态行 */
647
+ #roster-restart-status {
648
+ margin-top: 6px;
649
+ font-size: 12px;
650
+ font-weight: 600;
651
+ }
652
+ /* 刷新按钮:极弱化 ghost,接近隐形 */
653
+ .roster-refresh {
654
+ display: inline-flex;
655
+ align-items: center;
656
+ justify-content: center;
657
+ width: 22px;
658
+ height: 22px;
659
+ padding: 0;
660
+ border: 1px solid transparent;
661
+ background: transparent;
662
+ border-radius: 6px;
663
+ cursor: pointer;
664
+ color: var(--faint);
665
+ flex-shrink: 0;
666
+ transition:
667
+ background 0.15s ease,
668
+ color 0.15s ease,
669
+ border-color 0.15s ease;
670
+ }
671
+ .roster-refresh:hover {
672
+ background: var(--bg);
673
+ border-color: var(--border);
674
+ color: var(--text);
675
+ }
676
+ .roster-refresh:focus-visible {
677
+ outline: none;
678
+ box-shadow: var(--ring);
679
+ }
680
+ .roster-refresh .icon-sm {
681
+ width: 13px;
682
+ height: 13px;
683
+ }
684
+
685
+ /* 名册列表项:编号 + 38 头像 + 名字 + 状态;选中=indigo */
686
+ .bot-list {
687
+ list-style: none;
688
+ margin: 0;
689
+ padding: 0 12px;
690
+ overflow-y: auto;
691
+ flex: 1;
692
+ }
693
+ .bot-list li[data-bot-id] {
694
+ position: relative;
695
+ display: flex;
696
+ align-items: center;
697
+ gap: 12px;
698
+ padding: 13px 14px;
699
+ cursor: pointer;
700
+ background: transparent;
701
+ border: 1px solid transparent;
702
+ border-radius: 11px;
703
+ transition:
704
+ background 0.14s ease,
705
+ border-color 0.14s ease;
706
+ }
707
+ .bot-list li[data-bot-id] + li[data-bot-id] {
708
+ margin-top: 4px;
709
+ }
710
+ .bot-list li[data-bot-id]:hover:not(.is-selected) {
711
+ background: #f8fafc;
712
+ }
713
+ .bot-list li[data-bot-id]:focus-visible {
714
+ outline: none;
715
+ box-shadow: var(--ring);
716
+ }
717
+ /* 选中:indigo soft 底 + indigo edge + 左侧 3px indigo 竖条 */
718
+ .bot-list li.is-selected {
719
+ background: var(--br-soft);
720
+ border-color: var(--br-edge);
721
+ }
722
+ .bot-list li.is-selected::before {
723
+ content: "";
724
+ position: absolute;
725
+ left: -1px;
726
+ top: 12px;
727
+ bottom: 12px;
728
+ width: 3px;
729
+ border-radius: 3px;
730
+ background: var(--br);
731
+ }
732
+ .roster-num {
733
+ font-size: 12px;
734
+ font-family: ui-monospace, "Cascadia Code", monospace;
735
+ font-weight: 600;
736
+ color: var(--faint);
737
+ width: 18px;
738
+ text-align: right;
739
+ flex-shrink: 0;
740
+ }
741
+ .bot-list li.is-selected .roster-num {
742
+ color: var(--br-text);
743
+ }
744
+ .roster-meta {
745
+ min-width: 0;
746
+ flex: 1;
747
+ }
748
+ .bot-name {
749
+ font-size: 14.5px;
750
+ font-weight: 600;
751
+ color: var(--text);
752
+ white-space: nowrap;
753
+ overflow: hidden;
754
+ text-overflow: ellipsis;
755
+ }
756
+ .bot-list li.is-selected .bot-name {
757
+ color: var(--br-text);
758
+ }
759
+ .roster-state {
760
+ display: flex;
761
+ align-items: center;
762
+ gap: 5px;
763
+ margin-top: 2px;
764
+ }
765
+ .roster-state .live-dot {
766
+ width: 6px;
767
+ height: 6px;
768
+ }
769
+ .roster-state-label {
770
+ font-size: 11.5px;
771
+ font-weight: 500;
772
+ white-space: nowrap;
773
+ }
774
+ /* roster 行删除按钮(trash icon,28×28) */
775
+ .lk-del {
776
+ flex-shrink: 0;
777
+ width: 28px;
778
+ height: 28px;
779
+ border-radius: 8px;
780
+ border: none;
781
+ background: transparent;
782
+ color: var(--faint);
783
+ display: flex;
784
+ align-items: center;
785
+ justify-content: center;
786
+ cursor: pointer;
787
+ padding: 0;
788
+ opacity: 0;
789
+ transition: opacity 0.12s, background 0.12s, color 0.12s;
790
+ }
791
+ .lk-del .icon {
792
+ width: 15px;
793
+ height: 15px;
794
+ }
795
+ .bot-list li:hover .lk-del,
796
+ .bot-list li.is-selected .lk-del {
797
+ opacity: 1;
798
+ }
799
+ .lk-del:hover {
800
+ background: #fef2f2;
801
+ color: #dc2626;
802
+ }
803
+
804
+ .bot-list li.empty {
805
+ color: var(--muted);
806
+ cursor: default;
807
+ font-size: 14px;
808
+ padding: 0; /* 子内容(loading / 幽灵行)各自带 padding,避免双重缩进 */
809
+ }
810
+ .list-loading {
811
+ display: flex;
812
+ align-items: center;
813
+ gap: 8px;
814
+ color: var(--muted);
815
+ font-size: 14px;
816
+ padding: 13px 14px;
817
+ }
818
+
819
+ /* 空名册的幽灵占位行(复刻设计稿 PvEmptyScreen 侧栏)。
820
+ 行自身 padding 13/14 + .bot-list 的 12 = 26px,与正常 bot 行对齐。 */
821
+ .roster-ghosts {
822
+ padding: 0;
823
+ }
824
+ .roster-ghost {
825
+ display: flex;
826
+ align-items: center;
827
+ gap: 12px;
828
+ padding: 13px 14px;
829
+ border-radius: 11px;
830
+ }
831
+ .roster-ghost + .roster-ghost {
832
+ margin-top: 4px;
833
+ }
834
+ .roster-ghost-num {
835
+ width: 18px;
836
+ text-align: right;
837
+ font-size: 12px;
838
+ font-family: ui-monospace, monospace;
839
+ color: var(--faint);
840
+ flex-shrink: 0;
841
+ }
842
+ .roster-ghost-av {
843
+ width: 38px;
844
+ height: 38px;
845
+ border-radius: 50%;
846
+ border: 1.4px dashed var(--border);
847
+ flex-shrink: 0;
848
+ }
849
+ .roster-ghost-lines {
850
+ flex: 1;
851
+ display: flex;
852
+ flex-direction: column;
853
+ gap: 6px;
854
+ }
855
+ .rg-l1 {
856
+ height: 8px;
857
+ width: 62%;
858
+ border-radius: 4px;
859
+ background: #eef0f4;
860
+ }
861
+ .rg-l2 {
862
+ height: 6px;
863
+ width: 40%;
864
+ border-radius: 3px;
865
+ background: #f1f3f7;
866
+ }
867
+
868
+ /* 底部操作:添加新助手(indigo soft)+ 拉取(中性 ghost) */
869
+ .sidebar-actions {
870
+ padding: 12px 16px 16px;
871
+ border-top: 1px solid var(--border);
872
+ flex-shrink: 0;
873
+ display: flex;
874
+ flex-direction: column;
875
+ gap: 8px;
876
+ }
877
+ /* .btn.btn-add(0,2,0)压过基类 .btn(0,1,0)—— 否则源顺序里 .btn 在后会反盖 */
878
+ .btn.btn-add {
879
+ width: 100%;
880
+ justify-content: center;
881
+ padding: 10px 14px;
882
+ font-size: 13.5px;
883
+ font-weight: 600;
884
+ color: #fff;
885
+ background: var(--br);
886
+ border: none;
887
+ border-radius: 10px;
888
+ }
889
+ .btn.btn-add:hover:not(:disabled) {
890
+ background: #4338ca;
891
+ color: #fff;
892
+ }
893
+ .sidebar-actions .btn-block {
894
+ font-size: 13px;
895
+ font-weight: 500;
896
+ padding: 8px 14px;
897
+ color: var(--muted);
898
+ border-color: var(--border);
899
+ background: transparent;
900
+ }
901
+ .sidebar-actions .btn-block:hover:not(:disabled) {
902
+ background: var(--bg);
903
+ color: var(--text);
904
+ border-color: var(--border);
905
+ }
906
+
907
+ /* ===========================================================================
908
+ spinner
909
+ =========================================================================== */
910
+ .spinner {
911
+ display: inline-block;
912
+ width: 18px;
913
+ height: 18px;
914
+ border: 2.5px solid var(--border);
915
+ border-top-color: var(--br);
916
+ border-radius: 50%;
917
+ animation: spin 0.7s linear infinite;
918
+ flex-shrink: 0;
919
+ }
920
+ .spinner-lg {
921
+ width: 28px;
922
+ height: 28px;
923
+ border-width: 3px;
924
+ }
925
+ .loading-block {
926
+ display: flex;
927
+ flex-direction: column;
928
+ align-items: center;
929
+ justify-content: center;
930
+ gap: 12px;
931
+ padding: 64px 20px;
932
+ color: var(--muted);
933
+ font-size: 15px;
934
+ }
935
+
936
+ /* ===========================================================================
937
+ detail
938
+ =========================================================================== */
939
+ .detail {
940
+ overflow-y: auto;
941
+ min-height: 0;
942
+ }
943
+ /* placeholder 居中留白 */
944
+ /* 详情区空态挂载点:撑满详情区,内容(.lk-ed)自己居中。JS 按 mode 填充。 */
945
+ .detail-placeholder {
946
+ flex: 1;
947
+ min-height: 0;
948
+ display: flex;
949
+ }
950
+
951
+ /* ── 详情区「空态」(名册有助手但未选中)· Claude Design empty-detail 稿 ──
952
+ tokens 沿用全局 :root(--br/--bg/--surface/--border/--text/--muted/--faint…)。 */
953
+ .lk-ed,
954
+ .lk-ed * {
955
+ box-sizing: border-box;
956
+ }
957
+ .lk-ed {
958
+ position: relative;
959
+ width: 100%;
960
+ height: 100%;
961
+ min-height: 0;
962
+ display: flex;
963
+ align-items: center;
964
+ justify-content: center;
965
+ padding: 48px 40px;
966
+ overflow-y: auto;
967
+ color: var(--text);
968
+ -webkit-font-smoothing: antialiased;
969
+ /* 顶部一抹品牌微光,避免大白板 */
970
+ background:
971
+ radial-gradient(135% 90% at 50% -10%, color-mix(in oklab, var(--br) 6%, transparent) 0%, transparent 58%),
972
+ var(--surface);
973
+ }
974
+ .lk-ed--ro {
975
+ /* 只读:更克制,微光改成中性灰 */
976
+ background:
977
+ radial-gradient(135% 90% at 50% -10%, color-mix(in oklab, var(--faint) 9%, transparent) 0%, transparent 58%),
978
+ var(--surface);
979
+ }
980
+ .lk-ed__inner {
981
+ width: 100%;
982
+ max-width: 580px;
983
+ display: flex;
984
+ flex-direction: column;
985
+ align-items: center;
986
+ text-align: center;
987
+ }
988
+ .lk-ed__eyebrow {
989
+ display: inline-flex;
990
+ align-items: center;
991
+ gap: 7px;
992
+ padding: 5px 12px 5px 10px;
993
+ border-radius: 999px;
994
+ font-size: 12.5px;
995
+ font-weight: 600;
996
+ letter-spacing: 0.01em;
997
+ background: var(--br-soft);
998
+ border: 1px solid var(--br-edge);
999
+ color: var(--br-text);
1000
+ }
1001
+ .lk-ed--ro .lk-ed__eyebrow {
1002
+ background: var(--bg);
1003
+ border-color: var(--border);
1004
+ color: var(--muted);
1005
+ }
1006
+ .lk-ed__eyebrow svg {
1007
+ width: 14px;
1008
+ height: 14px;
1009
+ }
1010
+ .lk-ed__title {
1011
+ margin: 20px 0 0;
1012
+ font-size: 30px;
1013
+ font-weight: 800;
1014
+ line-height: 1.14;
1015
+ letter-spacing: -0.03em;
1016
+ color: var(--text);
1017
+ text-wrap: balance;
1018
+ }
1019
+ .lk-ed__body {
1020
+ margin: 13px 0 0;
1021
+ font-size: 16px;
1022
+ line-height: 1.64;
1023
+ color: var(--muted);
1024
+ max-width: 468px;
1025
+ text-wrap: pretty;
1026
+ }
1027
+ .lk-ed__body b {
1028
+ color: #334155;
1029
+ font-weight: 700;
1030
+ }
1031
+ .lk-ed__body .br {
1032
+ color: var(--br-text);
1033
+ }
1034
+ .lk-ed__actions {
1035
+ margin-top: 26px;
1036
+ display: flex;
1037
+ flex-wrap: wrap;
1038
+ gap: 12px;
1039
+ align-items: center;
1040
+ justify-content: center;
1041
+ }
1042
+ .lk-ed__btn {
1043
+ display: inline-flex;
1044
+ align-items: center;
1045
+ gap: 8px;
1046
+ font-family: inherit;
1047
+ cursor: pointer;
1048
+ white-space: nowrap;
1049
+ border-radius: 12px;
1050
+ transition: background 0.15s, box-shadow 0.18s, transform 0.18s, border-color 0.15s, color 0.15s;
1051
+ }
1052
+ .lk-ed__btn svg {
1053
+ flex-shrink: 0;
1054
+ }
1055
+ .lk-ed__btn--primary {
1056
+ padding: 13px 24px;
1057
+ font-size: 15.5px;
1058
+ font-weight: 700;
1059
+ color: #fff;
1060
+ background: var(--br);
1061
+ border: 1px solid transparent;
1062
+ box-shadow: 0 4px 14px color-mix(in oklab, var(--br) 26%, transparent);
1063
+ }
1064
+ .lk-ed__btn--primary:hover {
1065
+ background: var(--br-text);
1066
+ transform: translateY(-1px);
1067
+ box-shadow: 0 10px 26px color-mix(in oklab, var(--br) 38%, transparent);
1068
+ }
1069
+ .lk-ed__btn--ghost {
1070
+ padding: 12px 20px;
1071
+ font-size: 14.5px;
1072
+ font-weight: 600;
1073
+ color: var(--text);
1074
+ background: var(--surface);
1075
+ border: 1px solid var(--border);
1076
+ }
1077
+ .lk-ed__btn--ghost:hover {
1078
+ border-color: var(--faint);
1079
+ background: var(--bg);
1080
+ }
1081
+ .lk-ed__btn--soft {
1082
+ padding: 12px 22px;
1083
+ font-size: 14.5px;
1084
+ font-weight: 700;
1085
+ color: var(--br-text);
1086
+ background: var(--br-soft);
1087
+ border: 1px solid var(--br-edge);
1088
+ }
1089
+ .lk-ed__btn--soft:hover {
1090
+ background: var(--br-hover);
1091
+ }
1092
+ .lk-ed__rail {
1093
+ margin-top: 38px;
1094
+ padding-top: 28px;
1095
+ width: 100%;
1096
+ border-top: 1px solid var(--border);
1097
+ display: flex;
1098
+ align-items: flex-start;
1099
+ justify-content: center;
1100
+ gap: 4px;
1101
+ }
1102
+ .lk-ed__step {
1103
+ display: flex;
1104
+ flex-direction: column;
1105
+ align-items: center;
1106
+ gap: 9px;
1107
+ width: 124px;
1108
+ text-align: center;
1109
+ }
1110
+ .lk-ed__chip {
1111
+ position: relative;
1112
+ width: 44px;
1113
+ height: 44px;
1114
+ border-radius: 13px;
1115
+ display: inline-flex;
1116
+ align-items: center;
1117
+ justify-content: center;
1118
+ background: var(--br-soft);
1119
+ border: 1px solid var(--br-edge);
1120
+ color: var(--br);
1121
+ }
1122
+ .lk-ed--ro .lk-ed__chip {
1123
+ background: var(--bg);
1124
+ border-color: var(--border);
1125
+ color: var(--muted);
1126
+ }
1127
+ .lk-ed__chip svg {
1128
+ width: 21px;
1129
+ height: 21px;
1130
+ }
1131
+ .lk-ed__chip-no {
1132
+ position: absolute;
1133
+ top: -7px;
1134
+ right: -7px;
1135
+ width: 18px;
1136
+ height: 18px;
1137
+ border-radius: 50%;
1138
+ background: var(--br);
1139
+ color: #fff;
1140
+ font-size: 10.5px;
1141
+ font-weight: 800;
1142
+ font-family: ui-monospace, monospace;
1143
+ display: inline-flex;
1144
+ align-items: center;
1145
+ justify-content: center;
1146
+ }
1147
+ .lk-ed--ro .lk-ed__chip-no {
1148
+ background: var(--faint);
1149
+ }
1150
+ .lk-ed__step-t {
1151
+ font-size: 13.5px;
1152
+ font-weight: 700;
1153
+ color: var(--text);
1154
+ }
1155
+ .lk-ed__step-s {
1156
+ font-size: 12px;
1157
+ color: var(--faint);
1158
+ margin-top: 2px;
1159
+ line-height: 1.4;
1160
+ }
1161
+ .lk-ed__arrow {
1162
+ display: flex;
1163
+ align-items: center;
1164
+ height: 44px;
1165
+ color: var(--faint);
1166
+ flex-shrink: 0;
1167
+ }
1168
+ .lk-ed__foot {
1169
+ margin-top: 24px;
1170
+ display: inline-flex;
1171
+ align-items: center;
1172
+ gap: 7px;
1173
+ font-size: 12.5px;
1174
+ color: var(--faint);
1175
+ }
1176
+ .lk-ed__foot svg {
1177
+ width: 14px;
1178
+ height: 14px;
1179
+ }
1180
+ /* 中等屏(详情区 ≤880px)收一点 */
1181
+ @container lk-ed (max-width: 880px) {
1182
+ .lk-ed {
1183
+ padding: 36px 28px;
1184
+ }
1185
+ .lk-ed__title {
1186
+ font-size: 26px;
1187
+ }
1188
+ .lk-ed__body {
1189
+ font-size: 15px;
1190
+ }
1191
+ .lk-ed__rail {
1192
+ flex-wrap: wrap;
1193
+ gap: 18px 4px;
1194
+ }
1195
+ }
1196
+
1197
+ /* 切 bot 淡入(reduced-motion 下全局禁用) */
1198
+ .detail-panel.panel-enter {
1199
+ animation: lk-rise 0.18s ease both;
1200
+ }
1201
+
1202
+ /* ── 编辑式 hero band ── */
1203
+ .hero-band {
1204
+ padding: 36px 44px 30px;
1205
+ border-bottom: 1px solid var(--border);
1206
+ background: linear-gradient(180deg, var(--br-soft) 0%, var(--surface) 100%);
1207
+ }
1208
+ /* 异常时:状态色渐变(degraded 橙 / offline 红 / unknown 灰) */
1209
+ .hero-band[data-tint="degraded"] {
1210
+ background: linear-gradient(180deg, #fffbeb 0%, var(--surface) 100%);
1211
+ }
1212
+ .hero-band[data-tint="offline"] {
1213
+ background: linear-gradient(180deg, #fef2f2 0%, var(--surface) 100%);
1214
+ }
1215
+ .hero-band[data-tint="unknown"] {
1216
+ background: linear-gradient(180deg, #f8fafc 0%, var(--surface) 100%);
1217
+ }
1218
+ .hero-row {
1219
+ max-width: 820px;
1220
+ display: flex;
1221
+ align-items: flex-start;
1222
+ gap: 24px;
1223
+ }
1224
+ .hero-body {
1225
+ flex: 1;
1226
+ min-width: 0;
1227
+ padding-top: 2px;
1228
+ }
1229
+ .hero-eyebrow-row {
1230
+ display: flex;
1231
+ align-items: center;
1232
+ gap: 10px;
1233
+ margin-bottom: 8px;
1234
+ }
1235
+ .hero-eyebrow {
1236
+ font-size: 11px;
1237
+ font-weight: 700;
1238
+ letter-spacing: 0.12em;
1239
+ text-transform: uppercase;
1240
+ color: var(--faint);
1241
+ }
1242
+ .hero-badge {
1243
+ display: inline-flex;
1244
+ align-items: center;
1245
+ gap: 5px;
1246
+ padding: 2px 9px;
1247
+ border-radius: 999px;
1248
+ font-size: 11.5px;
1249
+ font-weight: 600;
1250
+ background: var(--surface);
1251
+ color: var(--muted);
1252
+ border: 1px solid var(--border);
1253
+ }
1254
+ .hero-badge .icon {
1255
+ width: 12px;
1256
+ height: 12px;
1257
+ }
1258
+ .hero-badge-ro {
1259
+ color: #b45309;
1260
+ background: #fffbeb;
1261
+ border-color: #fde68a;
1262
+ }
1263
+ .hero-title {
1264
+ margin: 0 0 8px;
1265
+ font-size: 34px;
1266
+ font-weight: 800;
1267
+ letter-spacing: -0.025em;
1268
+ line-height: 1.05;
1269
+ color: var(--text);
1270
+ }
1271
+ .hero-desc {
1272
+ margin: 0 0 18px;
1273
+ font-size: 15.5px;
1274
+ color: var(--muted);
1275
+ line-height: 1.55;
1276
+ max-width: 560px;
1277
+ }
1278
+ .hero-statusrow {
1279
+ display: flex;
1280
+ align-items: center;
1281
+ gap: 18px;
1282
+ flex-wrap: wrap;
1283
+ }
1284
+ .hero-status {
1285
+ display: inline-flex;
1286
+ align-items: center;
1287
+ gap: 8px;
1288
+ padding: 8px 15px;
1289
+ border-radius: 999px;
1290
+ font-size: 14px;
1291
+ font-weight: 700;
1292
+ background: var(--surface);
1293
+ border: 1.5px solid var(--border);
1294
+ }
1295
+ .hero-status .live-dot {
1296
+ width: 9px;
1297
+ height: 9px;
1298
+ }
1299
+ .hero-heart {
1300
+ display: inline-flex;
1301
+ align-items: center;
1302
+ gap: 8px;
1303
+ }
1304
+ .hero-heart-text {
1305
+ font-size: 13px;
1306
+ color: var(--muted);
1307
+ font-weight: 500;
1308
+ }
1309
+ .lk-heart {
1310
+ display: block;
1311
+ overflow: visible;
1312
+ }
1313
+
1314
+ /* meta strip:四列,顶部细线分隔 */
1315
+ .hero-meta {
1316
+ max-width: 820px;
1317
+ margin-top: 26px;
1318
+ padding-top: 20px;
1319
+ border-top: 1px solid var(--border);
1320
+ display: grid;
1321
+ grid-template-columns: repeat(4, 1fr);
1322
+ gap: 20px;
1323
+ }
1324
+ .meta-cell {
1325
+ display: flex;
1326
+ flex-direction: column;
1327
+ gap: 3px;
1328
+ min-width: 0;
1329
+ }
1330
+ .meta-label {
1331
+ font-size: 10.5px;
1332
+ font-weight: 600;
1333
+ letter-spacing: 0.08em;
1334
+ text-transform: uppercase;
1335
+ color: var(--faint);
1336
+ }
1337
+ .meta-value {
1338
+ font-size: 13.5px;
1339
+ font-weight: 600;
1340
+ color: var(--text);
1341
+ white-space: nowrap;
1342
+ overflow: hidden;
1343
+ text-overflow: ellipsis;
1344
+ }
1345
+ .meta-mono {
1346
+ font-family: ui-monospace, "Cascadia Code", monospace;
1347
+ font-weight: 500;
1348
+ }
1349
+
1350
+ /* ── 配置区 ── */
1351
+ .config-area {
1352
+ max-width: 820px;
1353
+ padding: 28px 44px 36px;
1354
+ }
1355
+
1356
+ /* 掉线提示条(红) */
1357
+ .offline-notice {
1358
+ display: flex;
1359
+ align-items: flex-start;
1360
+ gap: 10px;
1361
+ padding: 13px 16px;
1362
+ border-radius: 12px;
1363
+ background: var(--destructive-weak);
1364
+ border: 1px solid #fecaca;
1365
+ color: var(--destructive-text);
1366
+ font-size: 13.5px;
1367
+ line-height: 1.5;
1368
+ margin-bottom: 20px;
1369
+ }
1370
+ .offline-notice .icon {
1371
+ margin-top: 1px;
1372
+ }
1373
+ .offline-notice code {
1374
+ font-family: ui-monospace, "Cascadia Code", monospace;
1375
+ background: var(--surface);
1376
+ padding: 1px 6px;
1377
+ border-radius: 5px;
1378
+ border: 1px solid #fecaca;
1379
+ }
1380
+
1381
+ /* ===========================================================================
1382
+ detail status banner(配置区内的状态横幅:绿/黄/红/灰)
1383
+ =========================================================================== */
1384
+ .status-banner {
1385
+ display: flex;
1386
+ align-items: center;
1387
+ gap: 9px;
1388
+ padding: 10px 14px;
1389
+ border-radius: var(--radius-sm);
1390
+ font-size: 14px;
1391
+ font-weight: 600;
1392
+ margin-bottom: 16px;
1393
+ border: 1px solid var(--border);
1394
+ background: var(--bg);
1395
+ color: var(--muted);
1396
+ line-height: 1.4;
1397
+ }
1398
+ .status-banner .live-dot {
1399
+ width: 10px;
1400
+ height: 10px;
1401
+ }
1402
+ .status-banner[data-state="serving"] {
1403
+ background: #f0fdf4;
1404
+ border-color: #bbf7d0;
1405
+ color: #15803d;
1406
+ }
1407
+ .status-banner[data-state="degraded"] {
1408
+ background: #fffbeb;
1409
+ border-color: #fde68a;
1410
+ color: #b45309;
1411
+ }
1412
+ .status-banner[data-state="offline"] {
1413
+ background: var(--destructive-weak);
1414
+ border-color: #fecaca;
1415
+ color: var(--destructive-text);
1416
+ }
1417
+ .status-banner[data-state="unknown"] {
1418
+ background: var(--bg);
1419
+ border-color: var(--border);
1420
+ color: var(--muted);
1421
+ }
1422
+ .banner-heartbeat {
1423
+ font-weight: 500;
1424
+ opacity: 0.85;
1425
+ }
1426
+
1427
+ /* ===========================================================================
1428
+ notices
1429
+ =========================================================================== */
1430
+ .notice {
1431
+ display: flex;
1432
+ align-items: flex-start;
1433
+ gap: 10px;
1434
+ border-radius: var(--radius-sm);
1435
+ padding: 11px 14px;
1436
+ font-size: 14px;
1437
+ margin-bottom: 18px;
1438
+ line-height: 1.5;
1439
+ }
1440
+ .notice .icon {
1441
+ margin-top: 1px;
1442
+ }
1443
+ .notice-warn {
1444
+ background: #fffbeb;
1445
+ border: 1px solid #fde68a;
1446
+ color: #92400e;
1447
+ }
1448
+
1449
+ /* ===========================================================================
1450
+ recent events observability panel
1451
+ =========================================================================== */
1452
+ .event-panel {
1453
+ background: var(--surface);
1454
+ border: 1px solid var(--border);
1455
+ border-radius: 14px;
1456
+ padding: 22px 24px 18px;
1457
+ margin-bottom: 18px;
1458
+ box-shadow: var(--shadow-sm);
1459
+ }
1460
+ .event-panel-head {
1461
+ display: flex;
1462
+ align-items: flex-start;
1463
+ justify-content: space-between;
1464
+ gap: 16px;
1465
+ margin-bottom: 12px;
1466
+ }
1467
+ .event-title {
1468
+ margin: 0 0 4px;
1469
+ display: flex;
1470
+ align-items: center;
1471
+ gap: 8px;
1472
+ font-size: 16px;
1473
+ font-weight: 700;
1474
+ color: var(--text);
1475
+ }
1476
+ .event-title .icon {
1477
+ width: 17px;
1478
+ height: 17px;
1479
+ color: #475569;
1480
+ }
1481
+ .event-desc {
1482
+ margin: 0;
1483
+ color: var(--muted);
1484
+ font-size: 13px;
1485
+ line-height: 1.55;
1486
+ }
1487
+ .event-head-actions {
1488
+ display: flex;
1489
+ align-items: center;
1490
+ gap: 10px;
1491
+ flex-shrink: 0;
1492
+ }
1493
+ .event-last {
1494
+ display: inline-flex;
1495
+ align-items: center;
1496
+ gap: 5px;
1497
+ color: var(--faint);
1498
+ font-size: 12px;
1499
+ font-weight: 650;
1500
+ white-space: nowrap;
1501
+ }
1502
+ .event-last .icon {
1503
+ width: 14px;
1504
+ height: 14px;
1505
+ }
1506
+ .event-filters {
1507
+ display: flex;
1508
+ align-items: center;
1509
+ flex-wrap: wrap;
1510
+ gap: 8px;
1511
+ margin: 20px 0 12px;
1512
+ padding: 0;
1513
+ border: 0;
1514
+ background: transparent;
1515
+ }
1516
+ .event-filter {
1517
+ display: inline-flex;
1518
+ align-items: center;
1519
+ gap: 7px;
1520
+ border: 1px solid #dbe3ef;
1521
+ background: #fff;
1522
+ color: #475569;
1523
+ border-radius: 9px;
1524
+ padding: 8px 12px;
1525
+ font-size: 12px;
1526
+ font-weight: 650;
1527
+ cursor: pointer;
1528
+ line-height: 1.2;
1529
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.03);
1530
+ }
1531
+ .event-filter.has-count[data-event-filter="running"]::before {
1532
+ content: "";
1533
+ width: 5px;
1534
+ height: 5px;
1535
+ border-radius: 999px;
1536
+ background: #2563eb;
1537
+ flex-shrink: 0;
1538
+ }
1539
+ .event-filter:hover {
1540
+ color: #4f46e5;
1541
+ border-color: #c7d2fe;
1542
+ }
1543
+ .event-filter.is-active {
1544
+ background: #fff;
1545
+ color: #0f172a;
1546
+ border-color: #cbd5e1;
1547
+ box-shadow: 0 1px 4px rgba(15, 23, 42, 0.08);
1548
+ }
1549
+ .event-filter b {
1550
+ color: #2563eb;
1551
+ font-family: ui-monospace, "Cascadia Code", monospace;
1552
+ font-size: 12px;
1553
+ }
1554
+ .event-filter[data-event-filter="failed"] b {
1555
+ color: #dc2626;
1556
+ }
1557
+ .event-filter[data-event-filter="filtered"] b {
1558
+ color: #64748b;
1559
+ }
1560
+ .event-list {
1561
+ display: flex;
1562
+ flex-direction: column;
1563
+ }
1564
+ .event-loading,
1565
+ .event-empty {
1566
+ min-height: 76px;
1567
+ display: flex;
1568
+ align-items: center;
1569
+ justify-content: center;
1570
+ gap: 10px;
1571
+ color: var(--muted);
1572
+ border: 1px dashed #dbe3ef;
1573
+ border-radius: 11px;
1574
+ background: #fbfdff;
1575
+ font-size: 13.5px;
1576
+ }
1577
+ .event-empty {
1578
+ justify-content: flex-start;
1579
+ padding: 16px;
1580
+ }
1581
+ .event-empty .icon {
1582
+ color: #64748b;
1583
+ }
1584
+ .event-empty b,
1585
+ .event-empty span {
1586
+ display: block;
1587
+ }
1588
+ .event-empty span {
1589
+ margin-top: 4px;
1590
+ line-height: 1.5;
1591
+ }
1592
+ .event-row {
1593
+ position: relative;
1594
+ border: 0;
1595
+ border-radius: 0;
1596
+ background: transparent;
1597
+ padding-left: 30px;
1598
+ overflow: visible;
1599
+ }
1600
+ .event-row + .event-row {
1601
+ border-top: 1px solid #e2e8f0;
1602
+ }
1603
+ .event-row::before {
1604
+ content: "";
1605
+ position: absolute;
1606
+ left: 8px;
1607
+ top: 34px;
1608
+ bottom: -2px;
1609
+ width: 1px;
1610
+ background: #e2e8f0;
1611
+ }
1612
+ .event-row:last-child::before {
1613
+ display: none;
1614
+ }
1615
+ .event-row > summary {
1616
+ list-style: none;
1617
+ display: flex;
1618
+ align-items: flex-start;
1619
+ gap: 10px;
1620
+ padding: 13px 0 14px;
1621
+ cursor: pointer;
1622
+ }
1623
+ .event-row > summary::-webkit-details-marker {
1624
+ display: none;
1625
+ }
1626
+ .event-dot {
1627
+ position: absolute;
1628
+ left: 3px;
1629
+ top: 20px;
1630
+ width: 9px;
1631
+ height: 9px;
1632
+ border-radius: 999px;
1633
+ background: #64748b;
1634
+ border: 2px solid #fff;
1635
+ box-shadow: 0 0 0 1px #dbe3ef;
1636
+ }
1637
+ .event-row[data-status="received"] .event-dot { background: #3b82f6; }
1638
+ .event-row[data-status="running"] .event-dot {
1639
+ background: #4f46e5;
1640
+ box-shadow: 0 0 0 5px rgba(79, 70, 229, .12);
1641
+ }
1642
+ .event-row[data-status="completed"] .event-dot { background: #16a34a; }
1643
+ .event-row[data-status="filtered"] .event-dot { background: #94a3b8; }
1644
+ .event-row[data-status="failed"] .event-dot { background: #dc2626; }
1645
+ .event-main {
1646
+ min-width: 0;
1647
+ flex: 1;
1648
+ }
1649
+ .event-line,
1650
+ .event-preview {
1651
+ display: flex;
1652
+ align-items: center;
1653
+ gap: 8px;
1654
+ min-width: 0;
1655
+ }
1656
+ .event-line {
1657
+ color: #94a3b8;
1658
+ font-size: 12.5px;
1659
+ font-weight: 650;
1660
+ }
1661
+ .event-trigger-badge {
1662
+ display: inline-flex;
1663
+ align-items: center;
1664
+ height: 20px;
1665
+ padding: 0 7px;
1666
+ border-radius: 999px;
1667
+ border: 1px solid #dbe3ef;
1668
+ background: #f8fafc;
1669
+ color: #64748b;
1670
+ font-size: 11.5px;
1671
+ line-height: 1;
1672
+ flex-shrink: 0;
1673
+ }
1674
+ .event-source {
1675
+ color: #94a3b8;
1676
+ font-weight: 600;
1677
+ }
1678
+ .event-line span,
1679
+ .event-preview span {
1680
+ overflow: hidden;
1681
+ text-overflow: ellipsis;
1682
+ white-space: nowrap;
1683
+ }
1684
+ .event-preview {
1685
+ margin-top: 5px;
1686
+ color: #0f172a;
1687
+ font-size: 13.5px;
1688
+ font-weight: 650;
1689
+ }
1690
+ .event-preview b {
1691
+ flex-shrink: 0;
1692
+ font-weight: 750;
1693
+ color: #0f172a;
1694
+ }
1695
+ .event-mini {
1696
+ display: block;
1697
+ margin-top: 9px;
1698
+ color: #64748b;
1699
+ font-size: 12px;
1700
+ font-weight: 750;
1701
+ }
1702
+ .event-mini::before {
1703
+ content: "";
1704
+ display: inline-block;
1705
+ width: 5px;
1706
+ height: 5px;
1707
+ border-radius: 999px;
1708
+ margin-right: 7px;
1709
+ vertical-align: 2px;
1710
+ background: currentColor;
1711
+ }
1712
+ .event-mini--running,
1713
+ .event-mini--received {
1714
+ color: #2563eb;
1715
+ }
1716
+ .event-mini--completed {
1717
+ color: #16a34a;
1718
+ }
1719
+ .event-mini--failed {
1720
+ color: #dc2626;
1721
+ }
1722
+ .event-mini--filtered {
1723
+ color: #64748b;
1724
+ }
1725
+ .event-detail {
1726
+ margin: 0 4px 13px 0;
1727
+ border: 1px solid #dbe3ef;
1728
+ border-radius: 10px;
1729
+ padding: 13px 14px 14px;
1730
+ background: #f8fafc;
1731
+ }
1732
+ .event-detail-grid {
1733
+ display: grid;
1734
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1735
+ gap: 11px 18px;
1736
+ padding-bottom: 12px;
1737
+ border-bottom: 1px solid #e2e8f0;
1738
+ }
1739
+ .event-detail-grid span,
1740
+ .event-detail-grid b {
1741
+ display: block;
1742
+ }
1743
+ .event-detail-grid span {
1744
+ color: #94a3b8;
1745
+ font-size: 11.5px;
1746
+ font-weight: 650;
1747
+ }
1748
+ .event-detail-grid b {
1749
+ margin-top: 4px;
1750
+ color: #334155;
1751
+ font-size: 12px;
1752
+ font-family: ui-monospace, "Cascadia Code", monospace;
1753
+ font-weight: 700;
1754
+ overflow-wrap: anywhere;
1755
+ }
1756
+ .event-path {
1757
+ display: flex;
1758
+ align-items: center;
1759
+ flex-wrap: wrap;
1760
+ gap: 8px;
1761
+ margin-top: 13px;
1762
+ font-size: 13px;
1763
+ font-weight: 700;
1764
+ color: #334155;
1765
+ line-height: 1.5;
1766
+ }
1767
+ .event-path-chip {
1768
+ display: inline-flex;
1769
+ align-items: center;
1770
+ height: 26px;
1771
+ padding: 0 10px;
1772
+ border-radius: 7px;
1773
+ border: 1px solid #dbe3ef;
1774
+ background: #fff;
1775
+ color: #64748b;
1776
+ font-size: 12px;
1777
+ font-weight: 700;
1778
+ }
1779
+ .event-path-chip.is-current {
1780
+ color: #2563eb;
1781
+ border-color: #bfdbfe;
1782
+ background: #eff6ff;
1783
+ }
1784
+ .event-reason {
1785
+ margin-top: 5px;
1786
+ font-size: 12.5px;
1787
+ color: #64748b;
1788
+ line-height: 1.5;
1789
+ }
1790
+ .event-detail code {
1791
+ display: block;
1792
+ margin-top: 9px;
1793
+ color: #475569;
1794
+ background: #fff;
1795
+ border: 1px solid #e2e8f0;
1796
+ border-radius: 8px;
1797
+ padding: 8px 10px;
1798
+ font-size: 12px;
1799
+ line-height: 1.5;
1800
+ white-space: normal;
1801
+ word-break: break-all;
1802
+ }
1803
+ .event-actions {
1804
+ margin-top: 10px;
1805
+ display: flex;
1806
+ gap: 8px;
1807
+ flex-wrap: wrap;
1808
+ }
1809
+ .event-show-all {
1810
+ display: block;
1811
+ width: 100%;
1812
+ margin-top: 10px;
1813
+ padding: 11px 12px;
1814
+ border: 1px solid #e2e8f0;
1815
+ border-radius: 10px;
1816
+ background: #fff;
1817
+ color: #64748b;
1818
+ font-size: 13px;
1819
+ font-weight: 700;
1820
+ cursor: pointer;
1821
+ }
1822
+ .event-show-all:hover {
1823
+ color: #4f46e5;
1824
+ border-color: #c7d2fe;
1825
+ background: #f8fafc;
1826
+ }
1827
+
1828
+ /* ===========================================================================
1829
+ form sections(LkConfigForm 卡片)
1830
+ =========================================================================== */
1831
+ .form-section {
1832
+ background: var(--surface);
1833
+ border: 1px solid var(--border);
1834
+ border-radius: var(--radius);
1835
+ padding: 24px 26px;
1836
+ margin-bottom: 18px;
1837
+ box-shadow: var(--shadow-sm);
1838
+ }
1839
+ .form-section > .section-title {
1840
+ margin: 0 0 4px;
1841
+ font-size: 17px;
1842
+ font-weight: 700;
1843
+ color: var(--text);
1844
+ display: flex;
1845
+ align-items: center;
1846
+ gap: 8px;
1847
+ }
1848
+ .form-section > .section-title .icon {
1849
+ color: var(--br);
1850
+ }
1851
+ .form-section > .section-desc {
1852
+ margin: 0 0 18px;
1853
+ color: var(--muted);
1854
+ font-size: 13px;
1855
+ line-height: 1.55;
1856
+ }
1857
+
1858
+ /* 折叠高级设置 */
1859
+ details.adv-section {
1860
+ background: var(--surface);
1861
+ border: 1px solid var(--border);
1862
+ border-radius: var(--radius);
1863
+ margin-bottom: 18px;
1864
+ box-shadow: var(--shadow-sm);
1865
+ overflow: hidden;
1866
+ }
1867
+ details.adv-section > summary {
1868
+ list-style: none;
1869
+ cursor: pointer;
1870
+ padding: 15px 22px;
1871
+ font-size: 15px;
1872
+ font-weight: 600;
1873
+ color: var(--text);
1874
+ display: flex;
1875
+ align-items: center;
1876
+ gap: 9px;
1877
+ user-select: none;
1878
+ transition: background 0.15s ease;
1879
+ }
1880
+ details.adv-section > summary::-webkit-details-marker {
1881
+ display: none;
1882
+ }
1883
+ details.adv-section > summary:hover {
1884
+ background: var(--bg);
1885
+ }
1886
+ details.adv-section > summary:focus-visible {
1887
+ outline: none;
1888
+ box-shadow: var(--ring);
1889
+ }
1890
+ details.adv-section > summary .icon:first-of-type {
1891
+ color: var(--muted);
1892
+ }
1893
+ details.adv-section > summary .chevron {
1894
+ margin-left: auto;
1895
+ transition: transform 0.2s ease;
1896
+ color: var(--muted);
1897
+ }
1898
+ details.adv-section[open] > summary .chevron {
1899
+ transform: rotate(90deg);
1900
+ }
1901
+ details.adv-section > summary .summary-note {
1902
+ font-weight: 400;
1903
+ font-size: 13px;
1904
+ color: var(--muted);
1905
+ }
1906
+ .adv-body {
1907
+ padding: 4px 22px 20px;
1908
+ display: flex;
1909
+ flex-direction: column;
1910
+ gap: 15px;
1911
+ border-top: 1px solid var(--border);
1912
+ }
1913
+
1914
+ /* ===========================================================================
1915
+ form rows / fields
1916
+ =========================================================================== */
1917
+ .bot-form {
1918
+ display: block;
1919
+ margin-bottom: 6px;
1920
+ }
1921
+ .form-section .form-row + .form-row {
1922
+ margin-top: 18px;
1923
+ }
1924
+ .form-row {
1925
+ display: flex;
1926
+ flex-direction: column;
1927
+ gap: 6px;
1928
+ }
1929
+ .form-row label {
1930
+ font-size: 14.5px;
1931
+ font-weight: 600;
1932
+ color: var(--text);
1933
+ }
1934
+ .field-help {
1935
+ font-size: 12.5px;
1936
+ color: var(--muted);
1937
+ line-height: 1.5;
1938
+ margin: 0;
1939
+ }
1940
+ .form-err {
1941
+ display: flex;
1942
+ align-items: flex-start;
1943
+ gap: 8px;
1944
+ background: var(--destructive-weak);
1945
+ border: 1px solid #fecaca;
1946
+ border-radius: var(--radius-sm);
1947
+ padding: 10px 14px;
1948
+ font-size: 14px;
1949
+ color: var(--destructive-text);
1950
+ margin-bottom: 16px;
1951
+ }
1952
+
1953
+ .form-actions {
1954
+ display: flex;
1955
+ gap: 10px;
1956
+ margin-top: 14px;
1957
+ align-items: center;
1958
+ flex-wrap: wrap;
1959
+ }
1960
+ .dirty-hint {
1961
+ font-size: 13px;
1962
+ color: var(--muted);
1963
+ font-weight: 500;
1964
+ }
1965
+ .dirty-hint.is-dirty {
1966
+ color: var(--br-text);
1967
+ }
1968
+
1969
+ /* sticky 保存条(indigo 渐变兜底) */
1970
+ .form-actions-sticky {
1971
+ position: sticky;
1972
+ bottom: 0;
1973
+ z-index: 5;
1974
+ margin-top: 0;
1975
+ padding: 12px 0;
1976
+ margin-bottom: 6px;
1977
+ background: linear-gradient(to top, var(--bg) 72%, rgba(246, 247, 249, 0));
1978
+ }
1979
+
1980
+ /* 「当前生效」chip:open=indigo soft / 普通=中性 */
1981
+ .field-chip {
1982
+ display: inline-flex;
1983
+ align-items: center;
1984
+ align-self: flex-start;
1985
+ margin-top: 2px;
1986
+ padding: 2px 10px;
1987
+ border-radius: 999px;
1988
+ font-size: 12px;
1989
+ font-weight: 500;
1990
+ line-height: 1.6;
1991
+ white-space: nowrap;
1992
+ border: 1px solid var(--border);
1993
+ background: var(--bg);
1994
+ color: var(--muted);
1995
+ }
1996
+ .field-chip.chip-open {
1997
+ background: var(--br-soft);
1998
+ border-color: var(--br-edge);
1999
+ color: var(--br-text);
2000
+ }
2001
+ .field-chip.chip-neutral {
2002
+ background: var(--bg);
2003
+ border-color: var(--border);
2004
+ color: var(--muted);
2005
+ }
2006
+
2007
+ /* ===========================================================================
2008
+ inputs(focus 环走 indigo)
2009
+ =========================================================================== */
2010
+ .input {
2011
+ padding: 9px 12px;
2012
+ border: 1px solid var(--border);
2013
+ border-radius: 12px;
2014
+ font-size: 15px;
2015
+ font-family: inherit;
2016
+ color: var(--text);
2017
+ background: var(--surface);
2018
+ width: 100%;
2019
+ transition:
2020
+ border-color 0.15s ease,
2021
+ box-shadow 0.15s ease;
2022
+ resize: vertical;
2023
+ }
2024
+ .input::placeholder {
2025
+ color: var(--faint);
2026
+ }
2027
+ .input:focus {
2028
+ outline: none;
2029
+ border-color: var(--br-focus);
2030
+ box-shadow: var(--ring);
2031
+ }
2032
+ .input[readonly],
2033
+ .input:disabled {
2034
+ background: var(--bg);
2035
+ color: var(--muted);
2036
+ cursor: default;
2037
+ }
2038
+ .input-sm {
2039
+ width: 130px;
2040
+ }
2041
+ textarea.input {
2042
+ font-family: inherit;
2043
+ line-height: 1.55;
2044
+ }
2045
+
2046
+ /* memory 编辑器 mono */
2047
+ .memory-editor {
2048
+ font-family: ui-monospace, "Cascadia Code", "Fira Code", "Source Code Pro", monospace;
2049
+ font-size: 13.5px;
2050
+ line-height: 1.65;
2051
+ }
2052
+
2053
+ /* ===========================================================================
2054
+ promote section
2055
+ =========================================================================== */
2056
+ .promote-actions {
2057
+ display: flex;
2058
+ gap: 10px;
2059
+ margin-top: 14px;
2060
+ flex-wrap: wrap;
2061
+ }
2062
+ .promote-hint {
2063
+ margin-top: 12px;
2064
+ font-size: 12.5px;
2065
+ color: var(--muted);
2066
+ display: flex;
2067
+ align-items: flex-start;
2068
+ gap: 7px;
2069
+ line-height: 1.5;
2070
+ }
2071
+ .promote-hint .icon {
2072
+ color: var(--destructive-strong);
2073
+ flex-shrink: 0;
2074
+ margin-top: 1px;
2075
+ }
2076
+ /* 未连接引导条(LkPromoteCard 未连接态):indigo 提示 + 「去连接」按钮 */
2077
+ .promote-connect-hint {
2078
+ margin-top: 14px;
2079
+ display: flex;
2080
+ align-items: center;
2081
+ gap: 9px;
2082
+ padding: 11px 14px;
2083
+ border-radius: 10px;
2084
+ background: var(--br-soft);
2085
+ border: 1px solid var(--br-edge);
2086
+ font-size: 13px;
2087
+ color: #334155;
2088
+ line-height: 1.5;
2089
+ }
2090
+ .promote-connect-hint .icon {
2091
+ color: var(--br);
2092
+ flex-shrink: 0;
2093
+ }
2094
+ .promote-connect-hint > button {
2095
+ margin-left: auto;
2096
+ flex-shrink: 0;
2097
+ white-space: nowrap;
2098
+ }
2099
+ /* 晋升内联结果面板(成功 / 失败):包裹 badge + 正文 + 按钮 */
2100
+ .promote-result-panel {
2101
+ display: flex;
2102
+ gap: 13px;
2103
+ margin-top: 14px;
2104
+ padding: 15px 16px;
2105
+ border-radius: 12px;
2106
+ }
2107
+ .promote-result-panel .prp-badge {
2108
+ flex-shrink: 0;
2109
+ width: 34px;
2110
+ height: 34px;
2111
+ border-radius: 10px;
2112
+ background: #fff;
2113
+ display: inline-flex;
2114
+ align-items: center;
2115
+ justify-content: center;
2116
+ }
2117
+ .promote-result-panel .prp-body {
2118
+ min-width: 0;
2119
+ flex: 1;
2120
+ }
2121
+ .promote-result-panel .prp-title {
2122
+ font-size: 14.5px;
2123
+ font-weight: 700;
2124
+ line-height: 1.35;
2125
+ }
2126
+ .promote-result-panel .prp-desc {
2127
+ font-size: 13px;
2128
+ color: #334155;
2129
+ line-height: 1.55;
2130
+ margin: 3px 0 0;
2131
+ }
2132
+ .promote-result-panel .prp-meta {
2133
+ display: flex;
2134
+ align-items: center;
2135
+ gap: 8px;
2136
+ margin-top: 8px;
2137
+ font-size: 12px;
2138
+ color: var(--muted);
2139
+ flex-wrap: wrap;
2140
+ }
2141
+ .promote-result-panel .prp-actions {
2142
+ display: flex;
2143
+ gap: 9px;
2144
+ flex-wrap: wrap;
2145
+ margin-top: 12px;
2146
+ }
2147
+ /* 同步弹窗 header 升级:indigo 徽章 + 右侧 x 关闭按钮 */
2148
+ .modal-header-sync {
2149
+ padding: 22px 26px 0;
2150
+ }
2151
+ .modal-header-sync-row {
2152
+ display: flex;
2153
+ align-items: center;
2154
+ justify-content: space-between;
2155
+ }
2156
+ .modal-header-sync h3 {
2157
+ margin: 0;
2158
+ font-size: 18px;
2159
+ font-weight: 700;
2160
+ color: var(--text);
2161
+ display: flex;
2162
+ align-items: center;
2163
+ gap: 9px;
2164
+ }
2165
+ .modal-header-sync .sync-icon-badge {
2166
+ width: 30px;
2167
+ height: 30px;
2168
+ border-radius: 9px;
2169
+ background: var(--br-soft);
2170
+ border: 1px solid var(--br-edge);
2171
+ color: var(--br);
2172
+ display: inline-flex;
2173
+ align-items: center;
2174
+ justify-content: center;
2175
+ flex-shrink: 0;
2176
+ }
2177
+ .modal-header-sync .sync-close-btn {
2178
+ display: inline-flex;
2179
+ padding: 6px;
2180
+ border: none;
2181
+ border-radius: 8px;
2182
+ background: transparent;
2183
+ color: var(--muted);
2184
+ cursor: pointer;
2185
+ flex-shrink: 0;
2186
+ }
2187
+ .modal-header-sync .sync-close-btn:hover {
2188
+ background: var(--bg);
2189
+ color: var(--text);
2190
+ }
2191
+ .modal-header-sync p {
2192
+ margin: 8px 0 0;
2193
+ font-size: 13.5px;
2194
+ color: var(--muted);
2195
+ line-height: 1.55;
2196
+ }
2197
+ .btn-sm {
2198
+ padding: 7px 14px;
2199
+ font-size: 13px;
2200
+ border-radius: 9px;
2201
+ }
2202
+
2203
+ /* ===========================================================================
2204
+ sync group(modal)
2205
+ =========================================================================== */
2206
+ .sync-group {
2207
+ margin-bottom: 14px;
2208
+ }
2209
+ .sync-label {
2210
+ font-size: 13px;
2211
+ font-weight: 700;
2212
+ display: block;
2213
+ margin-bottom: 5px;
2214
+ }
2215
+ .sync-ok {
2216
+ color: #15803d;
2217
+ }
2218
+ .sync-warn {
2219
+ color: #b45309;
2220
+ }
2221
+ .sync-dim {
2222
+ color: var(--muted);
2223
+ }
2224
+ .sync-list {
2225
+ list-style: disc;
2226
+ padding-left: 22px;
2227
+ margin: 0;
2228
+ font-family: ui-monospace, "Cascadia Code", monospace;
2229
+ font-size: 13px;
2230
+ }
2231
+
2232
+ /* ===========================================================================
2233
+ buttons
2234
+ =========================================================================== */
2235
+ .btn {
2236
+ display: inline-flex;
2237
+ align-items: center;
2238
+ justify-content: center;
2239
+ gap: 7px;
2240
+ padding: 9px 16px;
2241
+ border: 1px solid var(--border);
2242
+ background: var(--surface);
2243
+ border-radius: 12px;
2244
+ cursor: pointer;
2245
+ color: var(--text);
2246
+ font-size: 14px;
2247
+ font-weight: 600;
2248
+ font-family: inherit;
2249
+ white-space: nowrap;
2250
+ transition:
2251
+ border-color 0.15s ease,
2252
+ color 0.15s ease,
2253
+ background 0.15s ease,
2254
+ box-shadow 0.15s ease;
2255
+ }
2256
+ .btn:hover:not(:disabled) {
2257
+ border-color: var(--br-edge);
2258
+ color: var(--br-text);
2259
+ background: var(--br-soft);
2260
+ }
2261
+ .btn:focus-visible {
2262
+ outline: none;
2263
+ box-shadow: var(--ring);
2264
+ }
2265
+ .btn:disabled,
2266
+ .btn.is-disabled {
2267
+ cursor: not-allowed;
2268
+ opacity: 0.45;
2269
+ box-shadow: none;
2270
+ }
2271
+ /* 主保存按钮:indigo 实底白字(AA ~5.5:1) */
2272
+ .btn-primary {
2273
+ background: var(--br);
2274
+ border-color: var(--br);
2275
+ color: #fff;
2276
+ }
2277
+ .btn-primary:hover:not(:disabled) {
2278
+ background: #4338ca;
2279
+ border-color: #4338ca;
2280
+ color: #fff;
2281
+ }
2282
+ .btn-primary:disabled {
2283
+ background: var(--br-disabled);
2284
+ border-color: var(--br-disabled);
2285
+ color: #fff;
2286
+ opacity: 0.7;
2287
+ }
2288
+ /* 保存成功闪一下 indigo 环 */
2289
+ .btn-primary.saveflash {
2290
+ animation: lk-saveflash 0.6s ease;
2291
+ }
2292
+ /* 危险:正式上传(描边红,hover 实底白字) */
2293
+ .btn-danger {
2294
+ border-color: var(--destructive);
2295
+ color: var(--destructive-text);
2296
+ background: var(--surface);
2297
+ }
2298
+ .btn-danger:hover:not(:disabled) {
2299
+ background: var(--destructive-strong);
2300
+ color: #fff;
2301
+ border-color: var(--destructive-strong);
2302
+ }
2303
+ /* 删除助手确认按钮(LkDeleteFlow):文字图标永远白色;
2304
+ 启用=红实底,禁用=粉实底+opacity .8。放在 .btn:disabled 之后以覆盖其 .45。 */
2305
+ .btn-del-confirm {
2306
+ background: var(--destructive-strong);
2307
+ border-color: var(--destructive-strong);
2308
+ color: #fff;
2309
+ }
2310
+ .btn-del-confirm:hover:not(:disabled) {
2311
+ background: #b91c1c;
2312
+ border-color: #b91c1c;
2313
+ color: #fff;
2314
+ }
2315
+ .btn-del-confirm:disabled {
2316
+ background: #f1a9a9;
2317
+ border-color: #f1a9a9;
2318
+ color: #fff;
2319
+ opacity: 0.8;
2320
+ cursor: not-allowed;
2321
+ box-shadow: none;
2322
+ }
2323
+ /* 正式上传按钮:实底红(不可逆外发,视觉必须醒目;不全局改 .btn-danger) */
2324
+ .btn-upload {
2325
+ background: #dc2626;
2326
+ border-color: #dc2626;
2327
+ color: #fff;
2328
+ }
2329
+ .btn-upload:hover:not(:disabled) {
2330
+ background: #b91c1c;
2331
+ border-color: #b91c1c;
2332
+ color: #fff;
2333
+ }
2334
+ .btn-upload:disabled {
2335
+ opacity: 0.65;
2336
+ cursor: not-allowed;
2337
+ }
2338
+ /* hero 区「删除」文字按钮 */
2339
+ .btn-hero-del {
2340
+ margin-left: auto;
2341
+ font-size: 12.5px;
2342
+ padding: 5px 11px;
2343
+ border-radius: 8px;
2344
+ color: var(--muted);
2345
+ background: var(--surface);
2346
+ border: 1px solid var(--border);
2347
+ display: inline-flex;
2348
+ align-items: center;
2349
+ gap: 5px;
2350
+ cursor: pointer;
2351
+ transition: color 0.12s, border-color 0.12s, background 0.12s;
2352
+ white-space: nowrap;
2353
+ }
2354
+ .btn-hero-del:hover {
2355
+ color: #dc2626;
2356
+ border-color: #fecaca;
2357
+ background: #fef2f2;
2358
+ }
2359
+ .btn .spinner {
2360
+ width: 15px;
2361
+ height: 15px;
2362
+ border-width: 2px;
2363
+ border-color: rgba(255, 255, 255, 0.4);
2364
+ border-top-color: #fff;
2365
+ }
2366
+ .btn:not(.btn-primary) .spinner {
2367
+ border-color: var(--border);
2368
+ border-top-color: var(--br);
2369
+ }
2370
+
2371
+ /* ===========================================================================
2372
+ error block
2373
+ =========================================================================== */
2374
+ .error-block {
2375
+ display: flex;
2376
+ align-items: flex-start;
2377
+ gap: 10px;
2378
+ color: var(--destructive-text);
2379
+ background: var(--destructive-weak);
2380
+ border: 1px solid #fecaca;
2381
+ border-radius: var(--radius-sm);
2382
+ padding: 14px 16px;
2383
+ font-size: 15px;
2384
+ }
2385
+
2386
+ /* ===========================================================================
2387
+ toast
2388
+ =========================================================================== */
2389
+ .toast {
2390
+ position: fixed;
2391
+ left: 50%;
2392
+ bottom: 28px;
2393
+ transform: translateX(-50%);
2394
+ display: flex;
2395
+ align-items: center;
2396
+ gap: 9px;
2397
+ padding: 11px 18px;
2398
+ border-radius: 10px;
2399
+ background: var(--text);
2400
+ color: #fff;
2401
+ box-shadow: var(--shadow-lg);
2402
+ max-width: 80vw;
2403
+ z-index: 1000;
2404
+ font-size: 14.5px;
2405
+ font-weight: 500;
2406
+ white-space: nowrap;
2407
+ animation: lk-toast 0.22s ease;
2408
+ }
2409
+ .toast[data-kind="error"] {
2410
+ background: var(--destructive-strong);
2411
+ }
2412
+ .toast[data-kind="warn"] {
2413
+ background: #b45309;
2414
+ }
2415
+ .toast[data-kind="ok"] {
2416
+ background: #15803d;
2417
+ }
2418
+ .toast .icon {
2419
+ width: 17px;
2420
+ height: 17px;
2421
+ }
2422
+
2423
+ /* ===========================================================================
2424
+ modal
2425
+ =========================================================================== */
2426
+ .modal-backdrop {
2427
+ position: fixed;
2428
+ inset: 0;
2429
+ background: rgba(15, 23, 42, 0.4);
2430
+ display: flex;
2431
+ align-items: center;
2432
+ justify-content: center;
2433
+ z-index: 900;
2434
+ animation: fade-in 0.18s ease;
2435
+ }
2436
+ @keyframes fade-in {
2437
+ from {
2438
+ opacity: 0;
2439
+ }
2440
+ }
2441
+ .modal-backdrop[hidden] {
2442
+ display: none;
2443
+ }
2444
+ .modal {
2445
+ background: var(--surface);
2446
+ border-radius: var(--radius);
2447
+ box-shadow: var(--shadow-lg);
2448
+ width: 500px;
2449
+ max-width: 94vw;
2450
+ max-height: 80vh;
2451
+ display: flex;
2452
+ flex-direction: column;
2453
+ overflow: hidden;
2454
+ }
2455
+ .modal-header {
2456
+ padding: 18px 22px;
2457
+ font-weight: 700;
2458
+ font-size: 16px;
2459
+ color: var(--text);
2460
+ border-bottom: 1px solid var(--border);
2461
+ flex-shrink: 0;
2462
+ display: flex;
2463
+ align-items: center;
2464
+ gap: 8px;
2465
+ }
2466
+ .modal-body {
2467
+ padding: 18px 22px;
2468
+ overflow-y: auto;
2469
+ flex: 1;
2470
+ font-size: 14.5px;
2471
+ }
2472
+ .modal-footer {
2473
+ padding: 14px 22px;
2474
+ border-top: 1px solid var(--border);
2475
+ flex-shrink: 0;
2476
+ display: flex;
2477
+ flex-direction: column;
2478
+ gap: 12px;
2479
+ }
2480
+ .prune-label {
2481
+ display: flex;
2482
+ align-items: center;
2483
+ gap: 7px;
2484
+ font-size: 14px;
2485
+ cursor: pointer;
2486
+ color: #b45309;
2487
+ }
2488
+ .modal-btns {
2489
+ display: flex;
2490
+ justify-content: flex-end;
2491
+ gap: 10px;
2492
+ }
2493
+
2494
+ /* ===========================================================================
2495
+ onboarding modal(添加新助手 · 页面内扫码)
2496
+ =========================================================================== */
2497
+ .onboard-modal {
2498
+ width: 520px;
2499
+ padding: 0;
2500
+ overflow: hidden;
2501
+ }
2502
+ .onboard-intro {
2503
+ margin: 0 0 16px;
2504
+ font-size: 13.5px;
2505
+ line-height: 1.6;
2506
+ color: var(--muted);
2507
+ }
2508
+ .onboard-modal .form-row + .form-row,
2509
+ .onboard-modal .form-row + .adv-section {
2510
+ margin-top: 16px;
2511
+ }
2512
+ .ob-req {
2513
+ color: var(--destructive-text);
2514
+ font-weight: 700;
2515
+ }
2516
+
2517
+ /* modal 内的高级折叠:去掉外层卡片阴影,贴合 modal 内边距 */
2518
+ .onboard-adv {
2519
+ margin-top: 16px;
2520
+ margin-bottom: 0;
2521
+ box-shadow: none;
2522
+ }
2523
+
2524
+ /* 扫码态:二维码居中 + 大留白 */
2525
+ .onboard-scan {
2526
+ display: flex;
2527
+ flex-direction: column;
2528
+ align-items: center;
2529
+ text-align: center;
2530
+ }
2531
+ .onboard-step {
2532
+ margin: 2px 0 18px;
2533
+ font-size: 14.5px;
2534
+ line-height: 1.6;
2535
+ color: var(--text);
2536
+ }
2537
+ .onboard-step b {
2538
+ color: var(--br-text);
2539
+ }
2540
+ /* 二维码容器:白底 indigo 细边,充足内边距 */
2541
+ .onboard-qr {
2542
+ display: flex;
2543
+ align-items: center;
2544
+ justify-content: center;
2545
+ width: 244px;
2546
+ height: 244px;
2547
+ padding: 12px;
2548
+ border-radius: var(--radius);
2549
+ background: #fff;
2550
+ border: 1px solid var(--br-edge);
2551
+ box-shadow: var(--shadow-sm);
2552
+ }
2553
+ .onboard-qr svg {
2554
+ width: 100%;
2555
+ height: 100%;
2556
+ display: block;
2557
+ }
2558
+ .onboard-qr-empty {
2559
+ flex-direction: column;
2560
+ gap: 12px;
2561
+ color: var(--muted);
2562
+ font-size: 13px;
2563
+ background: var(--bg);
2564
+ border-style: dashed;
2565
+ }
2566
+ .onboard-qr-hint {
2567
+ font-size: 13px;
2568
+ color: var(--muted);
2569
+ }
2570
+ .onboard-waiting {
2571
+ display: flex;
2572
+ align-items: center;
2573
+ gap: 9px;
2574
+ margin-top: 18px;
2575
+ font-size: 14px;
2576
+ font-weight: 600;
2577
+ color: var(--br-text);
2578
+ }
2579
+ .onboard-url {
2580
+ margin: 14px 0 0;
2581
+ font-size: 12.5px;
2582
+ color: var(--muted);
2583
+ }
2584
+ .onboard-url a {
2585
+ color: var(--br-text);
2586
+ font-weight: 600;
2587
+ }
2588
+ .onboard-tip {
2589
+ display: flex;
2590
+ align-items: flex-start;
2591
+ gap: 7px;
2592
+ margin: 18px 0 0;
2593
+ padding: 10px 13px;
2594
+ border-radius: 10px;
2595
+ background: var(--bg);
2596
+ border: 1px solid var(--border);
2597
+ font-size: 12.5px;
2598
+ line-height: 1.55;
2599
+ color: var(--muted);
2600
+ text-align: left;
2601
+ }
2602
+ .onboard-tip .icon {
2603
+ width: 15px;
2604
+ height: 15px;
2605
+ margin-top: 1px;
2606
+ flex-shrink: 0;
2607
+ color: var(--muted);
2608
+ }
2609
+
2610
+ /* 扫码成功后的常驻成功页(关键「下一步」不塞 toast,留在 modal 里) */
2611
+ .onboard-success {
2612
+ text-align: center;
2613
+ padding: 6px 4px 2px;
2614
+ }
2615
+ .onboard-success-icon {
2616
+ width: 46px;
2617
+ height: 46px;
2618
+ margin: 4px auto 14px;
2619
+ border-radius: 50%;
2620
+ background: #f0fdf4;
2621
+ border: 1px solid #bbf7d0;
2622
+ display: flex;
2623
+ align-items: center;
2624
+ justify-content: center;
2625
+ color: #15803d;
2626
+ }
2627
+ .onboard-success-icon .icon {
2628
+ width: 24px;
2629
+ height: 24px;
2630
+ }
2631
+ .onboard-success-title {
2632
+ margin: 0 0 6px;
2633
+ font-size: 17px;
2634
+ font-weight: 700;
2635
+ color: var(--text);
2636
+ }
2637
+ .onboard-success-sub {
2638
+ margin: 0 0 16px;
2639
+ font-size: 13.5px;
2640
+ color: var(--muted);
2641
+ line-height: 1.55;
2642
+ }
2643
+ .onboard-next {
2644
+ margin: 0;
2645
+ padding-left: 20px;
2646
+ text-align: left;
2647
+ display: flex;
2648
+ flex-direction: column;
2649
+ gap: 10px;
2650
+ font-size: 13.5px;
2651
+ line-height: 1.6;
2652
+ color: var(--text);
2653
+ }
2654
+ .onboard-next li::marker {
2655
+ color: var(--br);
2656
+ font-weight: 700;
2657
+ }
2658
+ .onboard-next code {
2659
+ font-family: ui-monospace, "Cascadia Code", monospace;
2660
+ font-size: 12.5px;
2661
+ background: var(--bg);
2662
+ border: 1px solid var(--border);
2663
+ border-radius: 5px;
2664
+ padding: 1px 6px;
2665
+ }
2666
+
2667
+ /* ===========================================================================
2668
+ onboarding modal v2 — 扫码优先 Block A
2669
+ =========================================================================== */
2670
+
2671
+ /* 弹窗内头(标题行 + 副标题) */
2672
+ .ob2-head {
2673
+ padding: 22px 26px 0;
2674
+ }
2675
+ .ob2-head-row {
2676
+ display: flex;
2677
+ align-items: center;
2678
+ justify-content: space-between;
2679
+ }
2680
+ .ob2-title {
2681
+ margin: 0;
2682
+ font-size: 18px;
2683
+ font-weight: 700;
2684
+ color: var(--text);
2685
+ }
2686
+ .ob2-subtitle {
2687
+ margin: 6px 0 0;
2688
+ font-size: 13.5px;
2689
+ color: var(--muted);
2690
+ line-height: 1.55;
2691
+ }
2692
+ .ob2-close-btn {
2693
+ display: inline-flex;
2694
+ padding: 6px;
2695
+ border: none;
2696
+ border-radius: 8px;
2697
+ background: transparent;
2698
+ color: var(--muted);
2699
+ cursor: pointer;
2700
+ flex-shrink: 0;
2701
+ }
2702
+ .ob2-close-btn:hover {
2703
+ background: var(--bg);
2704
+ }
2705
+
2706
+ /* 第 1 步 · 二维码卡 */
2707
+ .ob2-qr-section {
2708
+ padding: 22px 26px 6px;
2709
+ display: flex;
2710
+ flex-direction: column;
2711
+ align-items: center;
2712
+ }
2713
+ .ob2-qr-card {
2714
+ position: relative;
2715
+ width: 208px;
2716
+ height: 208px;
2717
+ border-radius: 18px;
2718
+ background: #fff;
2719
+ border: 1px solid var(--border);
2720
+ box-shadow: 0 8px 30px rgba(15, 23, 42, 0.08);
2721
+ display: flex;
2722
+ align-items: center;
2723
+ justify-content: center;
2724
+ overflow: hidden;
2725
+ }
2726
+ /* 扫描线:绝对定位在 QR 卡内,top 由 animation 驱动 */
2727
+ .ob2-scan-line {
2728
+ position: absolute;
2729
+ left: 6%;
2730
+ right: 6%;
2731
+ height: 2px;
2732
+ border-radius: 2px;
2733
+ background: var(--br);
2734
+ box-shadow: 0 0 12px var(--br);
2735
+ animation: lk-scan 2.4s ease-in-out infinite;
2736
+ pointer-events: none;
2737
+ }
2738
+ .ob2-qr-svg-btn {
2739
+ position: relative;
2740
+ border: none;
2741
+ background: transparent;
2742
+ padding: 0;
2743
+ cursor: pointer;
2744
+ transition: opacity 0.4s ease, transform 0.4s ease;
2745
+ }
2746
+ .ob2-qr-svg-btn.is-scanned {
2747
+ opacity: 0;
2748
+ transform: scale(0.96);
2749
+ pointer-events: none;
2750
+ }
2751
+ /* 已扫到过渡层 */
2752
+ .ob2-scanned-overlay {
2753
+ position: absolute;
2754
+ inset: 0;
2755
+ display: flex;
2756
+ flex-direction: column;
2757
+ align-items: center;
2758
+ justify-content: center;
2759
+ gap: 12px;
2760
+ animation: lk-fade 0.3s ease;
2761
+ }
2762
+ .ob2-scanned-text {
2763
+ font-size: 13.5px;
2764
+ font-weight: 600;
2765
+ color: var(--br-text);
2766
+ }
2767
+
2768
+ /* QR 卡下方状态行 */
2769
+ .ob2-status-pill {
2770
+ display: inline-flex;
2771
+ align-items: center;
2772
+ gap: 8px;
2773
+ margin-top: 18px;
2774
+ padding: 6px 13px;
2775
+ border-radius: 999px;
2776
+ background: var(--bg);
2777
+ border: 1px solid var(--border);
2778
+ font-size: 13px;
2779
+ color: var(--muted);
2780
+ }
2781
+ .ob2-status-dot {
2782
+ width: 7px;
2783
+ height: 7px;
2784
+ border-radius: 50%;
2785
+ background: var(--br);
2786
+ animation: lk-pulse 1.4s ease-in-out infinite;
2787
+ flex-shrink: 0;
2788
+ }
2789
+ .ob2-expire {
2790
+ margin-top: 10px;
2791
+ font-size: 12.5px;
2792
+ color: var(--faint);
2793
+ }
2794
+ .ob2-expire-mono {
2795
+ font-family: ui-monospace, monospace;
2796
+ color: var(--muted);
2797
+ font-weight: 600;
2798
+ }
2799
+
2800
+ /* 密钥本机提示条 */
2801
+ .ob2-secret-note {
2802
+ display: flex;
2803
+ align-items: center;
2804
+ gap: 8px;
2805
+ margin: 14px 26px 0;
2806
+ padding: 10px 13px;
2807
+ border-radius: 10px;
2808
+ background: var(--bg);
2809
+ border: 1px solid var(--border);
2810
+ font-size: 12.5px;
2811
+ color: var(--muted);
2812
+ }
2813
+ .ob2-secret-note code {
2814
+ font-family: ui-monospace, monospace;
2815
+ }
2816
+
2817
+ /* 单取消行 */
2818
+ .ob2-cancel-row {
2819
+ display: flex;
2820
+ justify-content: center;
2821
+ padding: 18px 26px 22px;
2822
+ }
2823
+
2824
+ /* 第 2 步 · 填资料 */
2825
+ .ob2-form-scroll {
2826
+ padding: 18px 26px 0;
2827
+ display: flex;
2828
+ flex-direction: column;
2829
+ gap: 16px;
2830
+ max-height: 54vh;
2831
+ overflow-y: auto;
2832
+ }
2833
+
2834
+ /* 「已自动获取」indigo 徽标 */
2835
+ .ob2-auto-badge {
2836
+ display: inline-flex;
2837
+ align-items: center;
2838
+ gap: 4px;
2839
+ padding: 1px 8px;
2840
+ border-radius: 999px;
2841
+ font-size: 11px;
2842
+ font-weight: 600;
2843
+ color: var(--br-text);
2844
+ background: var(--br-soft);
2845
+ border: 1px solid var(--br-edge);
2846
+ }
2847
+
2848
+ /* 标签行(标签 + 徽标并排) */
2849
+ .ob2-label-row {
2850
+ display: flex;
2851
+ align-items: center;
2852
+ gap: 8px;
2853
+ margin-bottom: 7px;
2854
+ }
2855
+ .ob2-label {
2856
+ font-size: 13.5px;
2857
+ font-weight: 600;
2858
+ color: var(--text);
2859
+ }
2860
+ .ob2-label-opt {
2861
+ font-weight: 400;
2862
+ color: var(--faint);
2863
+ }
2864
+
2865
+ /* 只读字段(appId / openId)*/
2866
+ .ob2-ro-input {
2867
+ width: 100%;
2868
+ padding: 10px 12px;
2869
+ border: 1px solid var(--border);
2870
+ border-radius: 9px;
2871
+ font-size: 13.5px;
2872
+ font-family: ui-monospace, "Cascadia Code", monospace;
2873
+ color: var(--muted);
2874
+ background: var(--bg);
2875
+ cursor: default;
2876
+ box-sizing: border-box;
2877
+ }
2878
+ .ob2-field-hint {
2879
+ font-size: 12px;
2880
+ color: var(--faint);
2881
+ margin-top: 4px;
2882
+ }
2883
+
2884
+ /* 机器人卡(头像 + open_id + 勾) */
2885
+ .ob2-bot-card {
2886
+ display: flex;
2887
+ align-items: center;
2888
+ gap: 12px;
2889
+ padding: 12px 14px;
2890
+ border-radius: 10px;
2891
+ background: var(--bg);
2892
+ border: 1px solid var(--border);
2893
+ }
2894
+ .ob2-bot-card-info {
2895
+ min-width: 0;
2896
+ flex: 1;
2897
+ }
2898
+ .ob2-bot-card-label {
2899
+ font-size: 13.5px;
2900
+ font-weight: 600;
2901
+ color: var(--text);
2902
+ }
2903
+ .ob2-bot-card-id {
2904
+ font-size: 12.5px;
2905
+ color: var(--muted);
2906
+ font-family: ui-monospace, monospace;
2907
+ margin-top: 1px;
2908
+ white-space: nowrap;
2909
+ overflow: hidden;
2910
+ text-overflow: ellipsis;
2911
+ }
2912
+
2913
+ /* 分隔线 */
2914
+ .ob2-divider {
2915
+ height: 1px;
2916
+ background: var(--border);
2917
+ margin: 2px 0;
2918
+ }
2919
+
2920
+ /* 可编辑输入(名字/介绍/群) */
2921
+ .ob2-input {
2922
+ width: 100%;
2923
+ padding: 10px 12px;
2924
+ border: 1px solid var(--border);
2925
+ border-radius: 9px;
2926
+ font-size: 14.5px;
2927
+ font-family: inherit;
2928
+ color: var(--text);
2929
+ background: #fff;
2930
+ outline: none;
2931
+ box-sizing: border-box;
2932
+ transition: border-color 0.15s, box-shadow 0.15s;
2933
+ resize: vertical;
2934
+ }
2935
+ .ob2-input:focus {
2936
+ border-color: var(--br-focus);
2937
+ box-shadow: 0 0 0 3px var(--br-ring);
2938
+ }
2939
+
2940
+ /* 高级折叠 */
2941
+ .ob2-adv-wrap {
2942
+ border: 1px solid var(--border);
2943
+ border-radius: 10px;
2944
+ overflow: hidden;
2945
+ }
2946
+ .ob2-adv-toggle {
2947
+ width: 100%;
2948
+ display: flex;
2949
+ align-items: center;
2950
+ gap: 9px;
2951
+ padding: 12px 14px;
2952
+ background: transparent;
2953
+ border: none;
2954
+ cursor: pointer;
2955
+ font-family: inherit;
2956
+ font-size: 13.5px;
2957
+ font-weight: 600;
2958
+ color: var(--text);
2959
+ }
2960
+ .ob2-adv-toggle .icon {
2961
+ color: var(--muted);
2962
+ }
2963
+ .ob2-adv-hint {
2964
+ font-weight: 400;
2965
+ font-size: 12.5px;
2966
+ color: var(--faint);
2967
+ }
2968
+ .ob2-adv-chevron {
2969
+ margin-left: auto;
2970
+ color: var(--muted);
2971
+ transition: transform 0.2s;
2972
+ flex-shrink: 0;
2973
+ }
2974
+ .ob2-adv-chevron.is-open {
2975
+ transform: rotate(90deg);
2976
+ }
2977
+ .ob2-adv-body {
2978
+ padding: 4px 14px 16px;
2979
+ border-top: 1px solid var(--border);
2980
+ display: flex;
2981
+ flex-direction: column;
2982
+ gap: 13px;
2983
+ }
2984
+ .ob2-adv-field {
2985
+ display: flex;
2986
+ flex-direction: column;
2987
+ gap: 6px;
2988
+ }
2989
+ .ob2-adv-label {
2990
+ font-size: 13px;
2991
+ font-weight: 600;
2992
+ color: var(--text);
2993
+ }
2994
+
2995
+ /* 第 2 步底部 footer */
2996
+ .ob2-form-footer {
2997
+ display: flex;
2998
+ justify-content: space-between;
2999
+ align-items: center;
3000
+ gap: 10px;
3001
+ padding: 18px 26px 22px;
3002
+ }
3003
+
3004
+ /* 头像占位(ob2 用,基于现有 avatar 机制的补充) */
3005
+ .ob2-avatar {
3006
+ width: 42px;
3007
+ height: 42px;
3008
+ border-radius: 12px;
3009
+ background: var(--br-soft);
3010
+ border: 1px solid var(--br-edge);
3011
+ display: flex;
3012
+ align-items: center;
3013
+ justify-content: center;
3014
+ font-size: 16px;
3015
+ font-weight: 700;
3016
+ color: var(--br-text);
3017
+ flex-shrink: 0;
3018
+ overflow: hidden;
3019
+ }
3020
+ .ob2-avatar img {
3021
+ width: 100%;
3022
+ height: 100%;
3023
+ object-fit: cover;
3024
+ }
3025
+
3026
+ /* spinner 小尺寸 (20px) */
3027
+ .ob2-spinner {
3028
+ display: inline-block;
3029
+ width: 20px;
3030
+ height: 20px;
3031
+ border: 2.5px solid rgba(79, 70, 229, 0.2);
3032
+ border-top-color: var(--br);
3033
+ border-radius: 50%;
3034
+ animation: spin 0.7s linear infinite;
3035
+ flex-shrink: 0;
3036
+ }
3037
+
3038
+ /* ===========================================================================
3039
+ 三层 Agent 配置面板 (.ac-*)
3040
+ 设计权威源:agentConfig.jsx LkAgentConfig。
3041
+ 配色铁律:indigo=交互/开关/添加;红=不可逆;状态色不上按钮。
3042
+ =========================================================================== */
3043
+
3044
+ .ac-panel-wrap {
3045
+ padding: 0;
3046
+ margin-top: 4px;
3047
+ }
3048
+
3049
+ /* 面板容器 */
3050
+ .ac-panel {
3051
+ display: flex;
3052
+ flex-direction: column;
3053
+ gap: 16px;
3054
+ }
3055
+
3056
+ /* ── 层壳(AcLayer) ── */
3057
+ .ac-layer {
3058
+ background: var(--surface);
3059
+ border: 1px solid var(--border);
3060
+ border-radius: 14px;
3061
+ box-shadow: var(--shadow-sm);
3062
+ overflow: hidden;
3063
+ }
3064
+
3065
+ .ac-layer-head {
3066
+ display: flex;
3067
+ align-items: flex-start;
3068
+ gap: 13px;
3069
+ padding: 18px 22px;
3070
+ }
3071
+
3072
+ .ac-layer-head-toggle {
3073
+ cursor: pointer;
3074
+ user-select: none;
3075
+ }
3076
+
3077
+ .ac-layer-head-toggle:hover .ac-layer-title {
3078
+ color: var(--br-text);
3079
+ }
3080
+
3081
+ /* 序号徽标 */
3082
+ .ac-index {
3083
+ flex-shrink: 0;
3084
+ width: 30px;
3085
+ height: 30px;
3086
+ border-radius: 9px;
3087
+ display: inline-flex;
3088
+ align-items: center;
3089
+ justify-content: center;
3090
+ font-size: 15px;
3091
+ font-weight: 800;
3092
+ font-family: ui-monospace, monospace;
3093
+ color: var(--br-text);
3094
+ background: var(--br-soft);
3095
+ border: 1px solid var(--br-edge);
3096
+ }
3097
+
3098
+ .ac-layer-meta {
3099
+ flex: 1;
3100
+ min-width: 0;
3101
+ }
3102
+
3103
+ .ac-layer-title-row {
3104
+ display: flex;
3105
+ align-items: center;
3106
+ gap: 9px;
3107
+ flex-wrap: wrap;
3108
+ }
3109
+
3110
+ .ac-layer-title {
3111
+ margin: 0;
3112
+ font-size: 16.5px;
3113
+ font-weight: 800;
3114
+ letter-spacing: -0.01em;
3115
+ color: var(--text);
3116
+ }
3117
+
3118
+ .ac-layer-role {
3119
+ margin: 4px 0 0;
3120
+ font-size: 13px;
3121
+ color: var(--muted);
3122
+ line-height: 1.5;
3123
+ }
3124
+
3125
+ /* 可选 badge */
3126
+ .ac-optional-badge {
3127
+ padding: 1px 9px;
3128
+ border-radius: 999px;
3129
+ font-size: 11.5px;
3130
+ font-weight: 700;
3131
+ color: var(--muted);
3132
+ background: var(--bg);
3133
+ border: 1px solid var(--border);
3134
+ }
3135
+
3136
+ /* 已开 badge (层二 codeAccess=true) */
3137
+ .ac-open-badge {
3138
+ display: inline-flex;
3139
+ align-items: center;
3140
+ gap: 5px;
3141
+ padding: 1px 9px;
3142
+ border-radius: 999px;
3143
+ font-size: 11.5px;
3144
+ font-weight: 700;
3145
+ color: var(--br-text);
3146
+ background: var(--br-soft);
3147
+ border: 1px solid var(--br-edge);
3148
+ }
3149
+
3150
+ /* 层壳展开/收起 chevron */
3151
+ .ac-chevron {
3152
+ flex-shrink: 0;
3153
+ margin-top: 4px;
3154
+ color: var(--faint);
3155
+ transition: transform 0.2s;
3156
+ }
3157
+
3158
+ /* 层体 */
3159
+ .ac-layer-body {
3160
+ padding: 4px 22px 22px;
3161
+ border-top: 1px solid var(--border);
3162
+ display: flex;
3163
+ flex-direction: column;
3164
+ gap: 18px;
3165
+ }
3166
+
3167
+ /* ── 层一:身份行 ── */
3168
+ .ac-identity-row {
3169
+ display: flex;
3170
+ align-items: flex-start;
3171
+ gap: 16px;
3172
+ }
3173
+
3174
+ .ac-avatar-wrap {
3175
+ flex-shrink: 0;
3176
+ }
3177
+
3178
+ .ac-identity-fields {
3179
+ flex: 1;
3180
+ min-width: 0;
3181
+ display: flex;
3182
+ flex-direction: column;
3183
+ gap: 10px;
3184
+ }
3185
+
3186
+ /* 绑定机器人只读行 */
3187
+ .ac-binding-row {
3188
+ display: flex;
3189
+ align-items: center;
3190
+ gap: 10px;
3191
+ padding: 9px 13px;
3192
+ border-radius: 10px;
3193
+ background: var(--bg);
3194
+ border: 1px solid var(--border);
3195
+ flex-wrap: nowrap;
3196
+ overflow: hidden;
3197
+ }
3198
+
3199
+ .ac-binding-label {
3200
+ font-size: 12.5px;
3201
+ font-weight: 600;
3202
+ color: var(--muted);
3203
+ flex-shrink: 0;
3204
+ }
3205
+
3206
+ .ac-binding-code {
3207
+ font-size: 12px;
3208
+ font-family: ui-monospace, monospace;
3209
+ color: var(--text);
3210
+ overflow: hidden;
3211
+ text-overflow: ellipsis;
3212
+ white-space: nowrap;
3213
+ }
3214
+
3215
+ .ac-binding-muted {
3216
+ color: var(--muted);
3217
+ }
3218
+
3219
+ .ac-binding-dot {
3220
+ color: var(--faint);
3221
+ flex-shrink: 0;
3222
+ }
3223
+
3224
+ .ac-binding-badge {
3225
+ margin-left: auto;
3226
+ flex-shrink: 0;
3227
+ display: inline-flex;
3228
+ align-items: center;
3229
+ gap: 5px;
3230
+ font-size: 11.5px;
3231
+ font-weight: 700;
3232
+ color: var(--br-text);
3233
+ }
3234
+
3235
+ .ac-binding-badge-ro {
3236
+ margin-left: auto;
3237
+ flex-shrink: 0;
3238
+ font-size: 11.5px;
3239
+ color: var(--faint);
3240
+ }
3241
+
3242
+ .ac-binding-badge-new {
3243
+ color: var(--br-text);
3244
+ }
3245
+
3246
+ /* ── 字段 / 输入 ── */
3247
+ .ac-field {
3248
+ display: flex;
3249
+ flex-direction: column;
3250
+ gap: 6px;
3251
+ }
3252
+
3253
+ .ac-label {
3254
+ font-size: 13.5px;
3255
+ font-weight: 600;
3256
+ color: var(--text);
3257
+ }
3258
+
3259
+ .ac-optional {
3260
+ font-size: 12px;
3261
+ font-weight: 500;
3262
+ color: var(--muted);
3263
+ margin-left: 4px;
3264
+ }
3265
+
3266
+ .ac-hint {
3267
+ margin: 0;
3268
+ font-size: 12.5px;
3269
+ color: var(--muted);
3270
+ line-height: 1.55;
3271
+ }
3272
+
3273
+ .ac-input {
3274
+ width: 100%;
3275
+ padding: 9px 12px;
3276
+ border: 1px solid var(--border);
3277
+ border-radius: 9px;
3278
+ font-size: 14px;
3279
+ font-family: inherit;
3280
+ color: var(--text);
3281
+ background: #fff;
3282
+ outline: none;
3283
+ transition: border-color 0.15s, box-shadow 0.15s;
3284
+ box-sizing: border-box;
3285
+ resize: vertical;
3286
+ }
3287
+
3288
+ .ac-input:focus {
3289
+ border-color: var(--br-focus);
3290
+ box-shadow: var(--ring);
3291
+ }
3292
+
3293
+ .ac-name-input {
3294
+ font-size: 15px;
3295
+ font-weight: 600;
3296
+ }
3297
+
3298
+ .ac-mono {
3299
+ font-family: ui-monospace, "Cascadia Code", monospace;
3300
+ font-size: 13px !important;
3301
+ }
3302
+
3303
+ .ac-memory-editor {
3304
+ line-height: 1.7;
3305
+ }
3306
+
3307
+ /* memory hint */
3308
+ .ac-memory-hint {
3309
+ display: flex;
3310
+ align-items: center;
3311
+ gap: 7px;
3312
+ margin-top: 2px;
3313
+ font-size: 12px;
3314
+ color: var(--faint);
3315
+ }
3316
+
3317
+ /* ── 层二:权限开关行 ── */
3318
+ .ac-access-toggle-row {
3319
+ display: flex;
3320
+ align-items: flex-start;
3321
+ gap: 14px;
3322
+ padding: 15px 16px;
3323
+ border-radius: 12px;
3324
+ background: var(--bg);
3325
+ border: 1px solid var(--border);
3326
+ transition: background 0.18s, border-color 0.18s;
3327
+ }
3328
+
3329
+ .ac-access-toggle-row.is-on {
3330
+ background: var(--br-soft);
3331
+ border-color: var(--br-edge);
3332
+ }
3333
+
3334
+ .ac-access-info {
3335
+ flex: 1;
3336
+ min-width: 0;
3337
+ }
3338
+
3339
+ .ac-access-title {
3340
+ font-size: 14.5px;
3341
+ font-weight: 700;
3342
+ color: var(--text);
3343
+ }
3344
+
3345
+ .ac-access-desc {
3346
+ margin: 4px 0 0;
3347
+ font-size: 12.5px;
3348
+ color: var(--muted);
3349
+ line-height: 1.55;
3350
+ }
3351
+
3352
+ /* indigo 拨杆开关(AcToggle) */
3353
+ .ac-toggle {
3354
+ position: relative;
3355
+ width: 46px;
3356
+ height: 26px;
3357
+ flex-shrink: 0;
3358
+ border-radius: 999px;
3359
+ border: none;
3360
+ cursor: pointer;
3361
+ padding: 0;
3362
+ background: #cbd5e1;
3363
+ transition: background 0.18s;
3364
+ }
3365
+
3366
+ .ac-toggle.is-on {
3367
+ background: var(--br);
3368
+ }
3369
+
3370
+ .ac-toggle-thumb {
3371
+ position: absolute;
3372
+ top: 3px;
3373
+ left: 3px;
3374
+ width: 20px;
3375
+ height: 20px;
3376
+ border-radius: 50%;
3377
+ background: #fff;
3378
+ box-shadow: 0 1px 3px rgba(15, 23, 42, 0.3);
3379
+ transition: left 0.18s;
3380
+ }
3381
+
3382
+ .ac-toggle.is-on .ac-toggle-thumb {
3383
+ left: 23px;
3384
+ }
3385
+
3386
+ /* 关闭态提示 */
3387
+ .ac-no-access-hint {
3388
+ display: flex;
3389
+ align-items: center;
3390
+ gap: 9px;
3391
+ padding: 11px 14px;
3392
+ font-size: 12.5px;
3393
+ color: var(--muted);
3394
+ }
3395
+
3396
+ /* ── Secret 输入(锁图标 + mono) ── */
3397
+ .ac-secret-wrap {
3398
+ position: relative;
3399
+ }
3400
+
3401
+ .ac-secret-icon {
3402
+ position: absolute;
3403
+ left: 12px;
3404
+ top: 50%;
3405
+ transform: translateY(-50%);
3406
+ color: var(--faint);
3407
+ pointer-events: none;
3408
+ }
3409
+
3410
+ .ac-secret-input {
3411
+ padding-left: 34px;
3412
+ }
3413
+
3414
+ /* ── 仓库区 ── */
3415
+ .ac-repos-section {
3416
+ padding-left: 14px;
3417
+ border-left: 2px solid var(--br-edge);
3418
+ display: flex;
3419
+ flex-direction: column;
3420
+ gap: 0;
3421
+ }
3422
+
3423
+ .ac-repos-header {
3424
+ display: flex;
3425
+ align-items: baseline;
3426
+ gap: 8px;
3427
+ flex-wrap: wrap;
3428
+ margin-bottom: 4px;
3429
+ }
3430
+
3431
+ .ac-repos-title {
3432
+ font-size: 13.5px;
3433
+ font-weight: 700;
3434
+ color: var(--text);
3435
+ }
3436
+
3437
+ .ac-repos-list {
3438
+ display: flex;
3439
+ flex-direction: column;
3440
+ gap: 10px;
3441
+ margin-bottom: 0;
3442
+ }
3443
+
3444
+ .ac-repos-empty {
3445
+ display: flex;
3446
+ align-items: center;
3447
+ gap: 9px;
3448
+ padding: 13px 15px;
3449
+ border-radius: 10px;
3450
+ border: 1px dashed var(--border);
3451
+ background: var(--bg);
3452
+ font-size: 12.5px;
3453
+ color: var(--muted);
3454
+ margin-top: 8px;
3455
+ }
3456
+
3457
+ /* 仓库行 */
3458
+ .ac-repo-row {
3459
+ position: relative;
3460
+ padding: 13px 14px;
3461
+ border-radius: 11px;
3462
+ border: 1px solid var(--border);
3463
+ background: #fff;
3464
+ }
3465
+
3466
+ .ac-repo-grid {
3467
+ display: grid;
3468
+ grid-template-columns: 1fr 120px;
3469
+ gap: 10px;
3470
+ margin-bottom: 10px;
3471
+ }
3472
+
3473
+ .ac-repo-del {
3474
+ position: absolute;
3475
+ top: 11px;
3476
+ right: 11px;
3477
+ width: 28px;
3478
+ height: 28px;
3479
+ display: inline-flex;
3480
+ align-items: center;
3481
+ justify-content: center;
3482
+ border-radius: 8px;
3483
+ border: 1px solid var(--border);
3484
+ background: #fff;
3485
+ color: var(--faint);
3486
+ cursor: pointer;
3487
+ transition: color 0.14s, border-color 0.14s, background 0.14s;
3488
+ }
3489
+
3490
+ .ac-repo-del:hover {
3491
+ color: #b91c1c;
3492
+ border-color: #fecaca;
3493
+ background: #fef2f2;
3494
+ }
3495
+
3496
+ /* 添加仓库按钮 */
3497
+ .ac-add-repo-btn {
3498
+ margin-top: 11px;
3499
+ display: inline-flex;
3500
+ align-items: center;
3501
+ gap: 7px;
3502
+ padding: 8px 15px;
3503
+ border-radius: 9px;
3504
+ border: 1px solid var(--br-edge);
3505
+ background: var(--br-soft);
3506
+ color: var(--br-text);
3507
+ font-size: 13.5px;
3508
+ font-weight: 700;
3509
+ cursor: pointer;
3510
+ font-family: inherit;
3511
+ transition: background 0.15s;
3512
+ }
3513
+
3514
+ .ac-add-repo-btn:hover {
3515
+ background: var(--br-hover);
3516
+ }
3517
+
3518
+ /* ── 收起态摘要药丸 ── */
3519
+ .ac-perm-summary,
3520
+ .ac-adv-summary {
3521
+ margin-top: 10px;
3522
+ display: flex;
3523
+ gap: 8px;
3524
+ flex-wrap: wrap;
3525
+ }
3526
+
3527
+ .ac-pill {
3528
+ display: inline-flex;
3529
+ align-items: center;
3530
+ gap: 6px;
3531
+ padding: 4px 11px;
3532
+ border-radius: 999px;
3533
+ font-size: 12.5px;
3534
+ font-weight: 600;
3535
+ color: var(--muted);
3536
+ background: var(--bg);
3537
+ border: 1px solid var(--border);
3538
+ }
3539
+
3540
+ .ac-pill-brand {
3541
+ color: var(--br-text);
3542
+ background: var(--br-soft);
3543
+ border-color: var(--br-edge);
3544
+ }
3545
+
3546
+ /* ── 层三:约束字段布局 ── */
3547
+ .ac-access-fields {
3548
+ display: flex;
3549
+ flex-direction: column;
3550
+ gap: 16px;
3551
+ }
3552
+
3553
+ /* ── 保存栏(edit 模式 sticky,复用 .form-actions-sticky 的 sticky + gradient) ── */
3554
+ .ac-save-bar {
3555
+ display: flex;
3556
+ align-items: center;
3557
+ gap: 12px;
3558
+ }
3559
+
3560
+ /* ── create 态底部 footer ── */
3561
+ .ac-create-footer {
3562
+ display: flex;
3563
+ align-items: center;
3564
+ justify-content: space-between;
3565
+ gap: 12px;
3566
+ padding-top: 4px;
3567
+ }
3568
+
3569
+ .ac-create-hint {
3570
+ font-size: 12.5px;
3571
+ color: var(--muted);
3572
+ }
3573
+
3574
+ .ac-create-btn {
3575
+ display: inline-flex;
3576
+ align-items: center;
3577
+ gap: 8px;
3578
+ padding: 11px 22px;
3579
+ border-radius: 10px;
3580
+ border: none;
3581
+ background: var(--br);
3582
+ color: #fff;
3583
+ font-size: 14.5px;
3584
+ font-weight: 700;
3585
+ cursor: pointer;
3586
+ font-family: inherit;
3587
+ box-shadow: 0 4px 14px rgba(79, 70, 229, 0.26);
3588
+ transition: background 0.15s;
3589
+ }
3590
+
3591
+ .ac-create-btn:hover {
3592
+ background: #4338ca;
3593
+ }
3594
+
3595
+ /* ob2 modal 里的 AC 面板滚动区 */
3596
+ .ob2-ac-scroll {
3597
+ padding: 0 26px 6px;
3598
+ overflow-y: auto;
3599
+ max-height: calc(80vh - 120px);
3600
+ }
3601
+
3602
+ /* ===========================================================================
3603
+ responsive
3604
+ =========================================================================== */
3605
+ @media (max-width: 1024px) {
3606
+ .layout {
3607
+ grid-template-columns: 260px 1fr;
3608
+ }
3609
+ .hero-band {
3610
+ padding: 28px 28px 24px;
3611
+ }
3612
+ .config-area {
3613
+ padding: 24px 28px 32px;
3614
+ }
3615
+ }
3616
+ @media (max-width: 768px) {
3617
+ .layout {
3618
+ grid-template-columns: 1fr;
3619
+ grid-template-rows: auto 1fr;
3620
+ overflow: auto;
3621
+ }
3622
+ .sidebar {
3623
+ border-right: none;
3624
+ border-bottom: 1px solid var(--border);
3625
+ max-height: 40vh;
3626
+ }
3627
+ .topbar {
3628
+ flex-wrap: wrap;
3629
+ height: auto;
3630
+ padding: 10px 16px;
3631
+ gap: 10px;
3632
+ }
3633
+ /* 窄屏下分段控件不再绝对居中,回流到行内 */
3634
+ .context-switch {
3635
+ position: static;
3636
+ transform: none;
3637
+ order: 3;
3638
+ width: 100%;
3639
+ justify-content: center;
3640
+ }
3641
+ .status-pill {
3642
+ margin-left: auto;
3643
+ }
3644
+ .hero-meta {
3645
+ grid-template-columns: repeat(2, 1fr);
3646
+ }
3647
+ }
3648
+ @media (max-width: 480px) {
3649
+ body {
3650
+ font-size: 15px;
3651
+ }
3652
+ .hero-band {
3653
+ padding: 22px 16px 20px;
3654
+ }
3655
+ .hero-row {
3656
+ gap: 16px;
3657
+ }
3658
+ .hero-title {
3659
+ font-size: 27px;
3660
+ }
3661
+ .config-area {
3662
+ padding: 20px 16px 28px;
3663
+ }
3664
+ .form-section {
3665
+ padding-left: 18px;
3666
+ padding-right: 18px;
3667
+ }
3668
+ .adv-body {
3669
+ padding-left: 18px;
3670
+ padding-right: 18px;
3671
+ }
3672
+ .ctx-hint {
3673
+ display: none;
3674
+ }
3675
+ }
3676
+
3677
+ /* ===========================================================================
3678
+ reduced motion
3679
+ =========================================================================== */
3680
+ @media (prefers-reduced-motion: reduce) {
3681
+ *,
3682
+ *::before,
3683
+ *::after {
3684
+ animation-duration: 0.001ms !important;
3685
+ animation-iteration-count: 1 !important;
3686
+ transition-duration: 0.001ms !important;
3687
+ }
3688
+ .spinner {
3689
+ animation: spin 0.7s linear infinite !important;
3690
+ }
3691
+ .lk-ecgline {
3692
+ animation: none !important;
3693
+ }
3694
+ }
3695
+
3696
+ /* ===========================================================================
3697
+ 空态(LkEmptyState):零助手时右侧详情区全屏欢迎页
3698
+ =========================================================================== */
3699
+
3700
+ /* 空态容器占满 detail 区 */
3701
+ .es-panel {
3702
+ flex: 1;
3703
+ min-height: 0;
3704
+ display: flex;
3705
+ flex-direction: column;
3706
+ height: 100%;
3707
+ }
3708
+
3709
+ /* 空态根:占满 + 垂直居中 + radial 背景(inline style 带渐变,这里保底) */
3710
+ .es-root {
3711
+ font-family:
3712
+ "Figtree", "Noto Sans SC", -apple-system, BlinkMacSystemFont, "Segoe UI",
3713
+ "PingFang SC", "Microsoft YaHei", Roboto, Helvetica, Arial, sans-serif;
3714
+ -webkit-font-smoothing: antialiased;
3715
+ }
3716
+
3717
+ /* 空态 CTA 按钮 hover:inline style 做主 transition,这里只加辅助重置 */
3718
+ .es-cta-btn {
3719
+ outline: none;
3720
+ text-decoration: none;
3721
+ }
3722
+ .es-cta-btn:focus-visible {
3723
+ outline: 3px solid rgba(79, 70, 229, 0.4);
3724
+ outline-offset: 2px;
3725
+ }
3726
+
3727
+ /* detail 区需要 flex 布局才能让 es-panel height:100% 生效 */
3728
+ .detail {
3729
+ display: flex;
3730
+ flex-direction: column;
3731
+ }
3732
+
3733
+ /* ===========================================================================
3734
+ 公司中心库 tab(centralConnect / centralTab / centralSync 复刻)
3735
+ 配色铁律:连接 / 同步 = indigo(--br);移除告警 = amber;不可逆外发 = 红。
3736
+ 中心库存「配置」不是「进程」→ 不显在线 / 心跳,只显「谁晋升的 · 多久前更新」。
3737
+ =========================================================================== */
3738
+
3739
+ /* ── 来源条(LkSyncBar):来自 <仓库>@<分支> · 最近同步 N 分钟前 + 同步入口 ── */
3740
+ .central-source-bar {
3741
+ display: flex;
3742
+ align-items: center;
3743
+ gap: 14px;
3744
+ flex-wrap: wrap;
3745
+ padding: 12px 24px;
3746
+ background: var(--surface);
3747
+ border-bottom: 1px solid var(--border);
3748
+ flex-shrink: 0;
3749
+ }
3750
+ .central-source-bar[hidden] {
3751
+ display: none;
3752
+ }
3753
+ .csb-from {
3754
+ display: inline-flex;
3755
+ align-items: center;
3756
+ gap: 8px;
3757
+ min-width: 0;
3758
+ font-size: 13px;
3759
+ color: var(--muted);
3760
+ }
3761
+ .csb-from .icon {
3762
+ color: var(--faint);
3763
+ flex-shrink: 0;
3764
+ }
3765
+ .csb-repo {
3766
+ color: var(--text);
3767
+ font-family: ui-monospace, "Cascadia Code", monospace;
3768
+ font-weight: 600;
3769
+ }
3770
+ .csb-branch {
3771
+ display: inline-flex;
3772
+ align-items: center;
3773
+ gap: 3px;
3774
+ color: var(--faint);
3775
+ }
3776
+ .csb-sep {
3777
+ color: var(--faint);
3778
+ }
3779
+ .csb-synced {
3780
+ color: var(--faint);
3781
+ white-space: nowrap;
3782
+ }
3783
+ .csb-right {
3784
+ margin-left: auto;
3785
+ display: inline-flex;
3786
+ align-items: center;
3787
+ gap: 12px;
3788
+ }
3789
+ /* 「N 项可更新」indigo pill */
3790
+ .csb-updates {
3791
+ display: inline-flex;
3792
+ align-items: center;
3793
+ gap: 6px;
3794
+ font-size: 12.5px;
3795
+ font-weight: 600;
3796
+ color: var(--br-text);
3797
+ padding: 4px 11px;
3798
+ border-radius: 999px;
3799
+ background: var(--br-soft);
3800
+ border: 1px solid var(--br-edge);
3801
+ }
3802
+ .csb-updates::before {
3803
+ content: "";
3804
+ width: 7px;
3805
+ height: 7px;
3806
+ border-radius: 50%;
3807
+ background: var(--br);
3808
+ }
3809
+ /* 「已是最新」绿色平静态 */
3810
+ .csb-fresh {
3811
+ display: inline-flex;
3812
+ align-items: center;
3813
+ gap: 6px;
3814
+ font-size: 12.5px;
3815
+ color: #15803d;
3816
+ }
3817
+ /* 同步按钮:有更新 = indigo 实底;否则描边「检查更新」 */
3818
+ .csb-sync-btn {
3819
+ display: inline-flex;
3820
+ align-items: center;
3821
+ gap: 7px;
3822
+ padding: 8px 15px;
3823
+ border-radius: 9px;
3824
+ border: 1px solid var(--border);
3825
+ background: var(--surface);
3826
+ color: var(--text);
3827
+ font-size: 13px;
3828
+ font-weight: 600;
3829
+ font-family: inherit;
3830
+ white-space: nowrap;
3831
+ cursor: pointer;
3832
+ transition: background 0.14s, border-color 0.14s, color 0.14s;
3833
+ }
3834
+ .csb-sync-btn:hover:not(:disabled) {
3835
+ background: var(--bg);
3836
+ }
3837
+ .csb-sync-btn.has-updates {
3838
+ border: none;
3839
+ background: var(--br);
3840
+ color: #fff;
3841
+ }
3842
+ .csb-sync-btn.has-updates:hover:not(:disabled) {
3843
+ background: #4338ca;
3844
+ }
3845
+ .csb-sync-btn:disabled {
3846
+ cursor: wait;
3847
+ }
3848
+
3849
+ /* ── 中心库只读名册行:头像 + 名字 + 「<by> 晋升 · <updated>」(无在线/心跳)── */
3850
+ .bot-list li.cc-roster-item .roster-state {
3851
+ /* 复用 .roster-meta 容器,但替换底部行内容(by/updated)。 */
3852
+ }
3853
+ .cc-roster-by {
3854
+ display: inline-flex;
3855
+ align-items: center;
3856
+ gap: 5px;
3857
+ font-size: 11.5px;
3858
+ color: var(--faint);
3859
+ }
3860
+ .cc-roster-by .icon {
3861
+ width: 11px;
3862
+ height: 11px;
3863
+ flex-shrink: 0;
3864
+ }
3865
+
3866
+ /* ── 「想改?回本机」只读横幅(中心库详情顶部)── */
3867
+ .cc-readonly-banner {
3868
+ display: flex;
3869
+ align-items: center;
3870
+ gap: 12px;
3871
+ padding: 14px 16px;
3872
+ border-radius: var(--radius-sm);
3873
+ background: var(--br-soft);
3874
+ border: 1px solid var(--br-edge);
3875
+ margin-bottom: 20px;
3876
+ }
3877
+ .cc-readonly-banner .icon {
3878
+ color: var(--br);
3879
+ flex-shrink: 0;
3880
+ width: 18px;
3881
+ height: 18px;
3882
+ }
3883
+ .cc-readonly-banner-title {
3884
+ font-size: 13.5px;
3885
+ font-weight: 700;
3886
+ color: var(--br-text);
3887
+ }
3888
+ .cc-readonly-banner-sub {
3889
+ font-size: 12.5px;
3890
+ color: #334155;
3891
+ line-height: 1.5;
3892
+ margin-top: 1px;
3893
+ }
3894
+ .cc-go-local-btn {
3895
+ display: inline-flex;
3896
+ align-items: center;
3897
+ gap: 6px;
3898
+ padding: 8px 14px;
3899
+ border-radius: 9px;
3900
+ border: none;
3901
+ background: var(--br);
3902
+ color: #fff;
3903
+ font-size: 13px;
3904
+ font-weight: 600;
3905
+ font-family: inherit;
3906
+ cursor: pointer;
3907
+ white-space: nowrap;
3908
+ flex-shrink: 0;
3909
+ margin-left: auto;
3910
+ transition: background 0.14s;
3911
+ }
3912
+ .cc-go-local-btn:hover {
3913
+ background: #4338ca;
3914
+ }
3915
+
3916
+ /* ── 中心库侧栏底部「去本机添加/晋升」(只读 = 无添加按钮)── */
3917
+ .sidebar-actions .cc-go-local-block {
3918
+ width: 100%;
3919
+ display: flex;
3920
+ align-items: center;
3921
+ justify-content: center;
3922
+ gap: 7px;
3923
+ padding: 10px 14px;
3924
+ font-size: 13px;
3925
+ font-weight: 600;
3926
+ color: var(--br-text);
3927
+ background: var(--br-soft);
3928
+ border: 1px solid var(--br-edge);
3929
+ border-radius: 10px;
3930
+ cursor: pointer;
3931
+ font-family: inherit;
3932
+ }
3933
+ .sidebar-actions .cc-go-local-block:hover {
3934
+ background: var(--br-hover);
3935
+ }
3936
+
3937
+ /* 同步预览弹窗:设计稿 520px / 圆角 16px(加 .modal--sync class 时生效,关闭后清掉) */
3938
+ .modal--sync {
3939
+ width: 520px;
3940
+ border-radius: 16px;
3941
+ }
3942
+ /* ── 连接弹窗:整张卡内容由 JS 注入,这里只放容器尺寸 ── */
3943
+ .connect-modal {
3944
+ width: 520px;
3945
+ padding: 0;
3946
+ overflow-y: auto;
3947
+ }
3948
+ .connect-modal .modal-body,
3949
+ .connect-modal .modal-footer,
3950
+ .connect-modal .modal-header {
3951
+ /* 各 phase 自带内边距,容器不重复加。 */
3952
+ }
3953
+
3954
+ /* 连接表单输入(沿用 LkConfigForm 视觉:mono + focus 环) */
3955
+ .cc-input {
3956
+ width: 100%;
3957
+ padding: 10px 12px;
3958
+ border: 1px solid var(--border);
3959
+ border-radius: 9px;
3960
+ font-size: 13.5px;
3961
+ font-family: ui-monospace, "Cascadia Code", monospace;
3962
+ color: var(--text);
3963
+ background: var(--surface);
3964
+ outline: none;
3965
+ box-sizing: border-box;
3966
+ transition: border-color 0.15s, box-shadow 0.15s;
3967
+ }
3968
+ .cc-input:focus {
3969
+ border-color: var(--br-focus);
3970
+ box-shadow: var(--ring);
3971
+ }
3972
+
3973
+ /* 同步预览变更行(LkSyncPreview · CcChangeRow):新增=绿 / 更新=indigo / 移除=amber */
3974
+ .cc-change-row {
3975
+ display: flex;
3976
+ align-items: flex-start;
3977
+ gap: 11px;
3978
+ padding: 11px 13px;
3979
+ border-radius: 10px;
3980
+ background: var(--bg);
3981
+ border: 1px solid var(--border);
3982
+ }
3983
+ .cc-change-row.is-removed {
3984
+ background: #fffbeb;
3985
+ border-color: #fde68a;
3986
+ }
3987
+ .cc-change-badge {
3988
+ flex-shrink: 0;
3989
+ width: 26px;
3990
+ height: 26px;
3991
+ border-radius: 8px;
3992
+ background: var(--surface);
3993
+ display: inline-flex;
3994
+ align-items: center;
3995
+ justify-content: center;
3996
+ }
3997
+ .cc-change-tag {
3998
+ font-size: 10.5px;
3999
+ font-weight: 700;
4000
+ padding: 1px 7px;
4001
+ border-radius: 999px;
4002
+ }
4003
+
4004
+ /* 中心库只读详情:大头像(68px 圆角方,对齐 CcReadonlyDetail LkAvatar size=68 radius=19) */
4005
+ .avatar-list.cc-detail-avatar {
4006
+ width: 68px;
4007
+ height: 68px;
4008
+ border-radius: 19px;
4009
+ }
4010
+ .avatar-list.cc-detail-avatar .avatar-fallback {
4011
+ font-size: 28px;
4012
+ border-radius: inherit;
4013
+ }
4014
+
4015
+ /* 断开按钮:hover 走危险红(不可逆外发以外的破坏性操作,与 LkConnectedBlock 一致) */
4016
+ .csb-disconnect-btn:hover:not(:disabled) {
4017
+ color: var(--destructive-text);
4018
+ border-color: #fecaca;
4019
+ background: var(--destructive-weak);
4020
+ }
4021
+
4022
+ /* ── Backend 身份层组件(backendKit.jsx 复刻)── */
4023
+ /*
4024
+ * 三轴分离颜色铁律:
4025
+ * 交互层 = indigo (--br*) — 选中/按钮/focus
4026
+ * 活性层 = 绿橙红 (LIVE_COLOR*) — 在线状态/心跳
4027
+ * 身份层 = 中性 slate ·静 — backend chip(本节)
4028
+ * chip 形状:方角 radius 6(vs 状态胶囊 radius 999)—— 形状本身把「身份」和「活性」分开。
4029
+ */
4030
+
4031
+ /* LkBackendMono: 字标小方 tile */
4032
+ .lk-bk-mono {
4033
+ display: inline-flex;
4034
+ align-items: center;
4035
+ justify-content: center;
4036
+ flex-shrink: 0;
4037
+ background: #fff;
4038
+ border: 1px solid #e2e8f0;
4039
+ color: #475569;
4040
+ font-family: ui-monospace, "Cascadia Code", monospace;
4041
+ font-weight: 800;
4042
+ letter-spacing: -0.04em;
4043
+ line-height: 1;
4044
+ vertical-align: middle;
4045
+ }
4046
+ .lk-bk-mono--sm { width: 14px; height: 14px; border-radius: 4px; font-size: 6.5px; }
4047
+ .lk-bk-mono--md { width: 16px; height: 16px; border-radius: 4px; font-size: 7.5px; }
4048
+ .lk-bk-mono--lg { width: 30px; height: 30px; border-radius: 8px; font-size: 14px; }
4049
+ .lk-bk-mono--xl { width: 34px; height: 34px; border-radius: 9px; font-size: 15.5px; }
4050
+
4051
+ /* LkBackendChip: 方角 chip(身份层·中性·静态) */
4052
+ .lk-bk-chip {
4053
+ display: inline-flex;
4054
+ align-items: center;
4055
+ border-radius: 6px;
4056
+ background: #f1f5f9;
4057
+ border: 1px solid #e2e8f0;
4058
+ white-space: nowrap;
4059
+ vertical-align: middle;
4060
+ max-width: 100%;
4061
+ }
4062
+ .lk-bk-chip--sm { gap: 0; padding: 2px 7px; }
4063
+ .lk-bk-chip--sm.has-mono { gap: 5px; padding: 2px 7px 2px 3px; }
4064
+ .lk-bk-chip--md { gap: 0; padding: 3px 9px; }
4065
+ .lk-bk-chip--md.has-mono { gap: 6px; padding: 3px 9px 3px 4px; }
4066
+ .lk-bk-chip-inner { display: inline-flex; align-items: baseline; gap: 6px; min-width: 0; }
4067
+ .lk-bk-chip-name { font-weight: 700; letter-spacing: .01em; color: #475569; }
4068
+ .lk-bk-chip--sm .lk-bk-chip-name { font-size: 11px; }
4069
+ .lk-bk-chip--md .lk-bk-chip-name { font-size: 11.5px; }
4070
+ .lk-bk-chip-vendor {
4071
+ font-weight: 500; color: #64748b;
4072
+ overflow: hidden; text-overflow: ellipsis;
4073
+ }
4074
+ .lk-bk-chip--sm .lk-bk-chip-vendor { font-size: 10.5px; }
4075
+ .lk-bk-chip--md .lk-bk-chip-vendor { font-size: 11px; }
4076
+
4077
+ /* LkBackendSelect: N 可扩展单选列表 */
4078
+ .lk-bk-select {
4079
+ display: flex;
4080
+ flex-direction: column;
4081
+ gap: 9px;
4082
+ }
4083
+ .lk-bk-select-group {
4084
+ display: flex;
4085
+ flex-direction: column;
4086
+ gap: 9px;
4087
+ }
4088
+ .lk-bk-select-btn {
4089
+ display: flex;
4090
+ align-items: center;
4091
+ gap: 13px;
4092
+ text-align: left;
4093
+ width: 100%;
4094
+ padding: 13px 15px;
4095
+ border-radius: 12px;
4096
+ cursor: pointer;
4097
+ font-family: inherit;
4098
+ background: #fff;
4099
+ border: 1px solid #e2e8f0;
4100
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.03);
4101
+ transition: background 0.14s, border-color 0.14s, box-shadow 0.14s;
4102
+ }
4103
+ .lk-bk-select-btn:hover:not(.is-sel) { background: #f8fafc; }
4104
+ .lk-bk-select-btn.is-sel {
4105
+ background: var(--br-soft);
4106
+ border-color: var(--br-edge);
4107
+ box-shadow: 0 0 0 1px var(--br-edge);
4108
+ }
4109
+ .lk-bk-radio {
4110
+ flex-shrink: 0;
4111
+ width: 18px;
4112
+ height: 18px;
4113
+ border-radius: 50%;
4114
+ border: 2px solid #cbd5e1;
4115
+ display: inline-flex;
4116
+ align-items: center;
4117
+ justify-content: center;
4118
+ transition: border-color 0.14s;
4119
+ }
4120
+ .lk-bk-select-btn.is-sel .lk-bk-radio { border-color: var(--br); }
4121
+ .lk-bk-radio-dot {
4122
+ width: 8px;
4123
+ height: 8px;
4124
+ border-radius: 50%;
4125
+ background: var(--br);
4126
+ }
4127
+ .lk-bk-item-name {
4128
+ display: flex;
4129
+ align-items: center;
4130
+ gap: 8px;
4131
+ flex-wrap: wrap;
4132
+ font-size: 14.5px;
4133
+ font-weight: 700;
4134
+ color: #1e293b;
4135
+ }
4136
+ .lk-bk-item-vendor {
4137
+ font-size: 12.5px;
4138
+ color: #64748b;
4139
+ margin-top: 2px;
4140
+ }
4141
+ .lk-bk-default-badge {
4142
+ font-size: 10.5px;
4143
+ font-weight: 700;
4144
+ letter-spacing: .06em;
4145
+ color: #94a3b8;
4146
+ padding: 1px 7px;
4147
+ border-radius: 999px;
4148
+ background: #f8fafc;
4149
+ border: 1px solid #e2e8f0;
4150
+ }
4151
+ .lk-bk-not-ready-hint {
4152
+ display: flex;
4153
+ align-items: center;
4154
+ gap: 6px;
4155
+ margin-top: 7px;
4156
+ font-size: 12px;
4157
+ color: #64748b;
4158
+ }
4159
+ .lk-bk-not-ready-hint code {
4160
+ font-family: ui-monospace, monospace;
4161
+ background: #f8fafc;
4162
+ border: 1px solid #e2e8f0;
4163
+ border-radius: 5px;
4164
+ padding: 1px 6px;
4165
+ color: #1e293b;
4166
+ }
4167
+ .lk-bk-ready-badge {
4168
+ flex-shrink: 0;
4169
+ display: inline-flex;
4170
+ align-items: center;
4171
+ gap: 5px;
4172
+ font-size: 11.5px;
4173
+ font-weight: 600;
4174
+ color: #64748b;
4175
+ }
4176
+ .lk-bk-unready-badge {
4177
+ flex-shrink: 0;
4178
+ padding: 2px 9px;
4179
+ border-radius: 999px;
4180
+ background: #f8fafc;
4181
+ border: 1px solid #e2e8f0;
4182
+ font-size: 11.5px;
4183
+ font-weight: 600;
4184
+ color: #94a3b8;
4185
+ }
4186
+ .lk-bk-more-hint {
4187
+ display: flex;
4188
+ align-items: center;
4189
+ gap: 9px;
4190
+ padding: 11px 15px;
4191
+ border-radius: 12px;
4192
+ border: 1px dashed #e2e8f0;
4193
+ color: #94a3b8;
4194
+ font-size: 12.5px;
4195
+ }
4196
+
4197
+ /* readonly 展示(中心库) */
4198
+ .lk-bk-readonly {
4199
+ display: flex;
4200
+ align-items: center;
4201
+ gap: 12px;
4202
+ padding: 13px 15px;
4203
+ border-radius: 11px;
4204
+ background: #f8fafc;
4205
+ border: 1px solid #e2e8f0;
4206
+ }
4207
+ .lk-bk-readonly-name { font-size: 14px; font-weight: 700; color: #1e293b; }
4208
+ .lk-bk-readonly-vendor { font-size: 12.5px; color: #64748b; margin-top: 1px; }
4209
+ .lk-bk-readonly-lock {
4210
+ display: inline-flex;
4211
+ align-items: center;
4212
+ gap: 5px;
4213
+ font-size: 12px;
4214
+ font-weight: 600;
4215
+ color: #94a3b8;
4216
+ margin-left: auto;
4217
+ flex-shrink: 0;
4218
+ }
4219
+
4220
+ /* meta strip 5 列(原 4 列扩展;响应自动折行) */
4221
+ .hero-meta.hero-meta-5 {
4222
+ grid-template-columns: repeat(5, 1fr);
4223
+ }
4224
+ @media (max-width: 860px) {
4225
+ .hero-meta.hero-meta-5 {
4226
+ grid-template-columns: repeat(3, 1fr);
4227
+ }
4228
+ }
4229
+ @media (max-width: 600px) {
4230
+ .hero-meta.hero-meta-5 {
4231
+ grid-template-columns: repeat(2, 1fr);
4232
+ }
4233
+ }
4234
+
4235
+ /* backend 选择卡(编辑表单顶部) */
4236
+ .lk-bk-card {
4237
+ background: var(--surface);
4238
+ border: 1px solid var(--border);
4239
+ border-radius: 14px;
4240
+ padding: 24px 26px;
4241
+ margin-bottom: 18px;
4242
+ box-shadow: var(--shadow-sm);
4243
+ }
4244
+ .lk-bk-card-title {
4245
+ margin: 0 0 4px;
4246
+ font-size: 17px;
4247
+ font-weight: 700;
4248
+ color: var(--text);
4249
+ display: flex;
4250
+ align-items: center;
4251
+ gap: 8px;
4252
+ }
4253
+ .lk-bk-card-desc {
4254
+ margin: 0 0 16px;
4255
+ color: var(--muted);
4256
+ font-size: 13px;
4257
+ line-height: 1.55;
4258
+ }