@zhhoceanfly/protoview 0.0.0-stage → 0.1.4

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,1568 @@
1
+ :root, [data-theme="dark"] {
2
+ color-scheme: dark;
3
+ --bg: #0e1116;
4
+ --panel: #151a21;
5
+ --panel-2: #1b222c;
6
+ --border: #2c3542;
7
+ --text: #e8eef7;
8
+ --muted: #8b98a8;
9
+ --accent: #3b82f6;
10
+ --accent-2: #22d3ee;
11
+ --hover: color-mix(in srgb, var(--accent) 14%, transparent);
12
+ --active: color-mix(in srgb, var(--accent) 24%, transparent);
13
+ --ok: #34d399;
14
+ --danger: #f87171;
15
+ --warn: #fbbf24;
16
+ --table-head: #1a2230;
17
+ --input: #0f141b;
18
+ --shadow: 0 10px 30px rgba(0,0,0,.35);
19
+ --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
20
+ --sans: "Segoe UI", system-ui, sans-serif;
21
+ }
22
+
23
+ [data-theme="light"] {
24
+ color-scheme: light;
25
+ --bg: #f4f6f9;
26
+ --panel: #ffffff;
27
+ --panel-2: #f8fafc;
28
+ --border: #d7dee8;
29
+ --text: #1f2937;
30
+ --muted: #6b7280;
31
+ --accent: #2563eb;
32
+ --accent-2: #ea580c;
33
+ --hover: color-mix(in srgb, var(--accent) 8%, transparent);
34
+ --active: color-mix(in srgb, var(--accent) 12%, transparent);
35
+ --ok: #059669;
36
+ --danger: #dc2626;
37
+ --warn: #d97706;
38
+ --table-head: #f1f5f9;
39
+ --input: #ffffff;
40
+ --shadow: 0 10px 28px rgba(15,23,42,.08);
41
+ }
42
+
43
+ * { box-sizing: border-box; }
44
+ html, body {
45
+ margin: 0;
46
+ height: 100%;
47
+ background: var(--bg);
48
+ color: var(--text);
49
+ font: 13px/1.45 var(--sans);
50
+ }
51
+ button, input, select, textarea { font: inherit; color: inherit; }
52
+ button { cursor: pointer; }
53
+ button:disabled { opacity: .45; cursor: not-allowed; }
54
+
55
+ #app {
56
+ --sidebar-w: 260px;
57
+ --rail-w: 22px;
58
+ display: grid;
59
+ grid-template-columns: var(--sidebar-w) var(--rail-w) minmax(0, 1fr);
60
+ grid-template-rows: minmax(0, 1fr);
61
+ height: 100%;
62
+ min-height: 0;
63
+ min-width: 0;
64
+ overflow: hidden;
65
+ }
66
+ #app > .sidebar {
67
+ grid-column: 1;
68
+ grid-row: 1;
69
+ min-height: 0;
70
+ min-width: 0;
71
+ overflow: hidden;
72
+ }
73
+ #app > .sidebar-rail {
74
+ grid-column: 2;
75
+ grid-row: 1;
76
+ }
77
+ #app > .main {
78
+ grid-column: 3;
79
+ grid-row: 1;
80
+ min-height: 0;
81
+ min-width: 0;
82
+ overflow: hidden;
83
+ }
84
+
85
+ /* 收起:侧栏宽度归零,轨道按钮始终占一列,右侧自适应 */
86
+ #app.sidebar-collapsed {
87
+ --sidebar-w: 0px;
88
+ }
89
+ #app.sidebar-collapsed .sidebar {
90
+ visibility: hidden;
91
+ pointer-events: none;
92
+ border-right: 0;
93
+ }
94
+
95
+ .sidebar {
96
+ border-right: 1px solid var(--border);
97
+ background: var(--panel);
98
+ display: flex;
99
+ flex-direction: column;
100
+ min-height: 0;
101
+ }
102
+ .sidebar-rail {
103
+ z-index: 2;
104
+ width: 100%;
105
+ height: 100%;
106
+ margin: 0;
107
+ padding: 0;
108
+ border: 0;
109
+ border-right: 1px solid var(--border);
110
+ border-left: 1px solid var(--border);
111
+ border-radius: 0;
112
+ background: var(--panel-2);
113
+ color: var(--muted);
114
+ font-size: 12px;
115
+ line-height: 1;
116
+ display: inline-flex;
117
+ align-items: center;
118
+ justify-content: center;
119
+ cursor: pointer;
120
+ }
121
+ .sidebar-rail:hover {
122
+ color: var(--text);
123
+ background: var(--hover);
124
+ border-color: var(--accent);
125
+ }
126
+ .side-head {
127
+ padding: 12px 12px 8px;
128
+ border-bottom: 1px solid var(--border);
129
+ display: grid;
130
+ gap: 8px;
131
+ }
132
+ .brand-row {
133
+ display: flex;
134
+ align-items: center;
135
+ justify-content: space-between;
136
+ gap: 8px;
137
+ min-width: 0;
138
+ }
139
+ .brand {
140
+ font-weight: 700;
141
+ font-size: 14px;
142
+ letter-spacing: .02em;
143
+ min-width: 0;
144
+ overflow: hidden;
145
+ text-overflow: ellipsis;
146
+ white-space: nowrap;
147
+ }
148
+ .brand span { color: var(--accent-2); }
149
+ .icon-btn {
150
+ width: 30px; height: 30px;
151
+ border-radius: 8px;
152
+ border: 1px solid var(--border);
153
+ background: var(--panel-2);
154
+ display: inline-flex;
155
+ align-items: center;
156
+ justify-content: center;
157
+ }
158
+ .icon-btn:hover { border-color: var(--accent); }
159
+ .side-meta-row {
160
+ display: flex;
161
+ align-items: center;
162
+ justify-content: space-between;
163
+ gap: 8px;
164
+ }
165
+ .side-meta-group {
166
+ display: flex;
167
+ align-items: center;
168
+ gap: 6px;
169
+ min-width: 0;
170
+ flex: 1;
171
+ }
172
+ .side-meta { color: var(--muted); font-size: 11px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
173
+ .side-source-btn,
174
+ .side-flow-btn {
175
+ flex: 0 0 auto;
176
+ display: inline-flex;
177
+ align-items: center;
178
+ justify-content: center;
179
+ line-height: 1;
180
+ box-sizing: border-box;
181
+ font-size: 11px;
182
+ }
183
+ .side-source-btn {
184
+ height: 22px;
185
+ padding: 0 8px;
186
+ border-radius: 6px;
187
+ }
188
+ .side-flow-btn {
189
+ height: 26px;
190
+ padding: 0 10px;
191
+ }
192
+ .source-mode-row {
193
+ display: grid;
194
+ gap: 8px;
195
+ margin: 10px 0 12px;
196
+ }
197
+ .source-mode-opt {
198
+ display: flex;
199
+ align-items: center;
200
+ gap: 8px;
201
+ padding: 8px 10px;
202
+ border: 1px solid var(--border);
203
+ border-radius: 8px;
204
+ background: var(--panel-2);
205
+ cursor: pointer;
206
+ }
207
+ .source-mode-opt:has(input:checked) {
208
+ border-color: var(--accent);
209
+ }
210
+ .source-git-fields {
211
+ display: grid;
212
+ gap: 10px;
213
+ }
214
+ .source-dir-row {
215
+ display: flex;
216
+ gap: 8px;
217
+ align-items: center;
218
+ }
219
+ .source-dir-row input { flex: 1; min-width: 0; }
220
+ .source-dir-row .btn {
221
+ flex: 0 0 auto;
222
+ height: 32px;
223
+ display: inline-flex;
224
+ align-items: center;
225
+ justify-content: center;
226
+ padding: 0 12px;
227
+ }
228
+ .side-flow-btn.primary {
229
+ background: linear-gradient(120deg, #2563eb, #0891b2);
230
+ border-color: transparent;
231
+ color: #fff;
232
+ font-weight: 650;
233
+ box-shadow: 0 0 0 0 rgba(37, 99, 235, 0.45);
234
+ animation: sideFlowPulse 2.4s ease-in-out infinite;
235
+ }
236
+ [data-theme="light"] .side-flow-btn.primary {
237
+ background: linear-gradient(120deg, #2563eb, #ea580c);
238
+ box-shadow: 0 0 0 0 rgba(234, 88, 12, 0.4);
239
+ }
240
+ @keyframes sideFlowPulse {
241
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(37, 99, 235, 0.4); transform: translateY(0); }
242
+ 50% { box-shadow: 0 0 10px 2px rgba(37, 99, 235, 0.28); transform: translateY(-0.5px); }
243
+ }
244
+ .hidden { display: none !important; }
245
+ .main.hidden, .flow-main.hidden { display: none !important; }
246
+ .flow-topbar {
247
+ display: flex;
248
+ align-items: center;
249
+ gap: 10px;
250
+ padding: 10px 12px;
251
+ border-bottom: 1px solid var(--border);
252
+ background: var(--panel);
253
+ flex: 0 0 auto;
254
+ flex-wrap: wrap;
255
+ }
256
+ .flow-hint { color: var(--muted); font-size: 12px; min-width: 0; }
257
+ .http-path { flex: 0 1 180px; min-width: 120px; font-family: var(--mono); }
258
+ .flow-node-transport {
259
+ display: flex;
260
+ flex-wrap: wrap;
261
+ gap: 10px;
262
+ align-items: end;
263
+ }
264
+ .flow-node-transport label {
265
+ display: grid;
266
+ gap: 4px;
267
+ font-size: 11px;
268
+ color: var(--muted);
269
+ min-width: 110px;
270
+ }
271
+ .flow-node-transport select,
272
+ .flow-node-transport input {
273
+ border: 1px solid var(--border);
274
+ background: var(--input);
275
+ border-radius: 8px;
276
+ padding: 7px 10px;
277
+ color: var(--text);
278
+ }
279
+ .flow-drawer-mask {
280
+ position: absolute;
281
+ inset: 0;
282
+ z-index: 30;
283
+ display: none;
284
+ justify-content: flex-end;
285
+ background: rgba(15, 23, 42, 0.28);
286
+ }
287
+ .flow-drawer-mask.show { display: flex; }
288
+ .flow-drawer {
289
+ width: min(360px, 92%);
290
+ height: 100%;
291
+ background: var(--panel);
292
+ border-left: 1px solid var(--border);
293
+ box-shadow: -12px 0 32px rgba(15, 23, 42, 0.18);
294
+ display: flex;
295
+ flex-direction: column;
296
+ transform: translateX(100%);
297
+ animation: flowDrawerIn 0.22s ease forwards;
298
+ }
299
+ @keyframes flowDrawerIn {
300
+ from { transform: translateX(100%); }
301
+ to { transform: translateX(0); }
302
+ }
303
+ .flow-drawer-head {
304
+ display: flex;
305
+ align-items: center;
306
+ justify-content: space-between;
307
+ padding: 12px 14px;
308
+ border-bottom: 1px solid var(--border);
309
+ flex: 0 0 auto;
310
+ }
311
+ .flow-drawer-body {
312
+ flex: 1 1 auto;
313
+ min-height: 0;
314
+ overflow: auto;
315
+ padding: 14px;
316
+ display: grid;
317
+ gap: 12px;
318
+ align-content: start;
319
+ }
320
+ .flow-drawer-actions {
321
+ display: flex;
322
+ gap: 8px;
323
+ flex-wrap: wrap;
324
+ }
325
+ .flow-stage {
326
+ position: relative;
327
+ flex: 1 1 auto;
328
+ min-height: 0;
329
+ overflow: hidden;
330
+ background:
331
+ radial-gradient(circle at 1px 1px, color-mix(in srgb, var(--muted) 35%, transparent) 1px, transparent 0) 0 0 / 22px 22px,
332
+ var(--bg);
333
+ cursor: grab;
334
+ }
335
+ .flow-empty {
336
+ position: absolute;
337
+ inset: 0;
338
+ display: flex;
339
+ align-items: center;
340
+ justify-content: center;
341
+ z-index: 0;
342
+ pointer-events: none;
343
+ color: var(--muted);
344
+ font-size: 14px;
345
+ letter-spacing: 0.02em;
346
+ }
347
+ .flow-empty.hidden { display: none !important; }
348
+ .flow-world, .flow-edges {
349
+ position: absolute;
350
+ left: 0;
351
+ top: 0;
352
+ width: 4000px;
353
+ height: 3000px;
354
+ transform-origin: 0 0;
355
+ pointer-events: none;
356
+ }
357
+ .flow-edges { z-index: 1; }
358
+ .flow-world { z-index: 2; pointer-events: none; }
359
+ .flow-stage.drop-target {
360
+ outline: 2px dashed var(--accent);
361
+ outline-offset: -4px;
362
+ background:
363
+ radial-gradient(circle at 1px 1px, color-mix(in srgb, var(--accent) 55%, transparent) 1px, transparent 0) 0 0 / 22px 22px,
364
+ color-mix(in srgb, var(--accent) 6%, var(--bg));
365
+ }
366
+ .flow-drag-ghost {
367
+ position: fixed;
368
+ z-index: 80;
369
+ pointer-events: none;
370
+ display: flex;
371
+ align-items: center;
372
+ gap: 8px;
373
+ padding: 8px 12px;
374
+ border-radius: 10px;
375
+ border: 1px solid var(--accent);
376
+ background: var(--panel);
377
+ color: var(--text);
378
+ font-size: 12px;
379
+ box-shadow: var(--shadow);
380
+ opacity: 0.95;
381
+ }
382
+ .flow-drag-ghost .flow-node-icon {
383
+ width: 26px;
384
+ height: 26px;
385
+ border-radius: 8px;
386
+ display: flex;
387
+ align-items: center;
388
+ justify-content: center;
389
+ background: color-mix(in srgb, var(--accent) 18%, var(--panel-2));
390
+ color: var(--accent);
391
+ }
392
+ .flow-node {
393
+ position: absolute;
394
+ width: 200px;
395
+ border: 1px solid var(--border);
396
+ border-radius: 12px;
397
+ background: var(--panel);
398
+ box-shadow: var(--shadow);
399
+ pointer-events: auto;
400
+ user-select: none;
401
+ }
402
+ .flow-node.ok { border-color: var(--ok); }
403
+ .flow-node.fail { border-color: var(--danger); }
404
+ .flow-node-head {
405
+ display: flex;
406
+ align-items: flex-start;
407
+ gap: 8px;
408
+ padding: 10px 10px 4px;
409
+ cursor: move;
410
+ }
411
+ .flow-node-icon {
412
+ width: 28px;
413
+ height: 28px;
414
+ border-radius: 8px;
415
+ display: flex;
416
+ align-items: center;
417
+ justify-content: center;
418
+ background: color-mix(in srgb, var(--accent) 18%, var(--panel-2));
419
+ color: var(--accent);
420
+ font-size: 14px;
421
+ flex: 0 0 auto;
422
+ }
423
+ .flow-node-text { min-width: 0; }
424
+ .flow-node-text strong {
425
+ display: block;
426
+ font-size: 13px;
427
+ line-height: 1.3;
428
+ word-break: break-all;
429
+ }
430
+ .flow-node-text span {
431
+ display: block;
432
+ color: var(--muted);
433
+ font-size: 10px;
434
+ font-family: var(--mono);
435
+ margin-top: 2px;
436
+ word-break: break-all;
437
+ }
438
+ .flow-node-result {
439
+ margin: 0 10px 10px;
440
+ padding: 4px 6px;
441
+ border-radius: 6px;
442
+ font-size: 10px;
443
+ font-family: var(--mono);
444
+ background: var(--panel-2);
445
+ color: var(--muted);
446
+ }
447
+ .flow-node-result.ok { color: var(--ok); }
448
+ .flow-node-result.fail { color: var(--danger); }
449
+ .flow-port {
450
+ position: absolute;
451
+ width: 12px;
452
+ height: 12px;
453
+ border-radius: 50%;
454
+ background: var(--accent);
455
+ border: 2px solid var(--panel);
456
+ top: 30px;
457
+ cursor: crosshair;
458
+ pointer-events: auto;
459
+ }
460
+ .flow-port.in { left: -7px; }
461
+ .flow-port.out { right: -7px; }
462
+ .flow-edges { overflow: visible; }
463
+ .flow-edge {
464
+ fill: none;
465
+ stroke: color-mix(in srgb, var(--muted) 70%, transparent);
466
+ stroke-width: 2.5;
467
+ pointer-events: stroke;
468
+ }
469
+ .flow-edge.ok { stroke: var(--ok); }
470
+ .flow-edge.fail { stroke: var(--danger); }
471
+ .flow-menu {
472
+ position: fixed;
473
+ z-index: 40;
474
+ min-width: 120px;
475
+ border: 1px solid var(--border);
476
+ border-radius: 8px;
477
+ background: var(--panel);
478
+ box-shadow: var(--shadow);
479
+ padding: 4px;
480
+ }
481
+ .flow-menu.hidden { display: none !important; }
482
+ .flow-menu button {
483
+ display: block;
484
+ width: 100%;
485
+ text-align: left;
486
+ border: 0;
487
+ background: transparent;
488
+ padding: 8px 10px;
489
+ border-radius: 6px;
490
+ }
491
+ .flow-menu button:hover { background: var(--hover); }
492
+ .modal.flow-edit-modal {
493
+ width: min(720px, 94vw);
494
+ max-height: 86vh;
495
+ display: flex;
496
+ flex-direction: column;
497
+ overflow: hidden;
498
+ }
499
+ .modal.flow-edit-modal .modal-head,
500
+ .modal.flow-edit-modal .modal-foot {
501
+ flex: 0 0 auto;
502
+ }
503
+ .modal.flow-edit-modal .modal-body {
504
+ flex: 1 1 auto;
505
+ min-height: 0;
506
+ overflow-y: auto;
507
+ overscroll-behavior: contain;
508
+ -webkit-overflow-scrolling: touch;
509
+ }
510
+ .flow-edit-h { margin: 14px 0 8px; font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: .06em; }
511
+ .flow-edit-h-sub {
512
+ text-transform: none;
513
+ letter-spacing: 0;
514
+ font-weight: 400;
515
+ margin-left: 6px;
516
+ opacity: .85;
517
+ }
518
+ .flow-edit-table { margin-bottom: 8px; }
519
+ .flow-extract-tree {
520
+ display: grid;
521
+ gap: 6px;
522
+ padding: 10px;
523
+ border: 1px solid var(--border);
524
+ border-radius: 10px;
525
+ background: var(--panel-2);
526
+ }
527
+ .flow-extract-row {
528
+ display: grid;
529
+ grid-template-columns: minmax(120px, 1.2fr) minmax(140px, 1fr);
530
+ gap: 8px;
531
+ align-items: center;
532
+ padding: 6px 8px;
533
+ border-radius: 8px;
534
+ background: var(--panel);
535
+ border: 1px solid var(--border);
536
+ }
537
+ .flow-extract-row .flow-extract-path {
538
+ font-family: var(--mono);
539
+ font-size: 11px;
540
+ word-break: break-all;
541
+ }
542
+ .flow-extract-row .flow-extract-type {
543
+ display: block;
544
+ color: var(--muted);
545
+ font-size: 10px;
546
+ margin-top: 2px;
547
+ }
548
+ .flow-extract-row input {
549
+ width: 100%;
550
+ border: 1px solid var(--border);
551
+ background: var(--input);
552
+ border-radius: 8px;
553
+ padding: 6px 8px;
554
+ font-family: var(--mono);
555
+ font-size: 12px;
556
+ }
557
+ .flow-extract-msg {
558
+ display: grid;
559
+ gap: 6px;
560
+ padding: 8px 10px;
561
+ border: 1px solid var(--border);
562
+ border-radius: 8px;
563
+ background: var(--panel);
564
+ }
565
+ .flow-extract-msg-head {
566
+ display: flex;
567
+ gap: 8px;
568
+ align-items: baseline;
569
+ flex-wrap: wrap;
570
+ }
571
+ .flow-extract-msg-head strong { font-size: 12px; }
572
+ .flow-extract-msg-head span {
573
+ font-family: var(--mono);
574
+ font-size: 10px;
575
+ color: var(--accent);
576
+ }
577
+ .flow-extract-children {
578
+ display: grid;
579
+ gap: 6px;
580
+ margin-left: 10px;
581
+ padding-left: 10px;
582
+ border-left: 2px solid color-mix(in srgb, var(--accent) 35%, var(--border));
583
+ }
584
+ .flow-history-modal {
585
+ width: min(880px, 96vw);
586
+ max-height: 86vh;
587
+ display: flex;
588
+ flex-direction: column;
589
+ overflow: hidden;
590
+ }
591
+ .flow-history-modal .modal-body {
592
+ flex: 1 1 auto;
593
+ min-height: 0;
594
+ overflow: hidden;
595
+ }
596
+ .flow-history-layout {
597
+ display: grid !important;
598
+ grid-template-columns: minmax(200px, 260px) 1fr;
599
+ gap: 12px;
600
+ height: min(60vh, 520px);
601
+ padding: 12px 14px !important;
602
+ }
603
+ .flow-history-list {
604
+ overflow: auto;
605
+ border: 1px solid var(--border);
606
+ border-radius: 8px;
607
+ background: var(--panel-2);
608
+ }
609
+ .flow-history-item {
610
+ display: grid;
611
+ gap: 2px;
612
+ width: 100%;
613
+ text-align: left;
614
+ border: 0;
615
+ border-bottom: 1px solid var(--border);
616
+ border-radius: 0;
617
+ background: transparent;
618
+ padding: 10px 12px;
619
+ cursor: pointer;
620
+ }
621
+ .flow-history-item:hover { background: var(--hover); }
622
+ .flow-history-item.active { background: color-mix(in srgb, var(--accent) 12%, var(--panel)); }
623
+ .flow-history-item .h-top {
624
+ display: flex;
625
+ justify-content: space-between;
626
+ gap: 8px;
627
+ font-size: 12px;
628
+ font-weight: 600;
629
+ }
630
+ .flow-history-item .h-top.ok { color: var(--ok); }
631
+ .flow-history-item .h-top.fail { color: var(--danger); }
632
+ .flow-history-item .h-meta {
633
+ color: var(--muted);
634
+ font-size: 10px;
635
+ font-family: var(--mono);
636
+ }
637
+ .flow-history-detail {
638
+ margin: 0;
639
+ overflow: auto;
640
+ border: 1px solid var(--border);
641
+ border-radius: 8px;
642
+ background: var(--panel-2);
643
+ padding: 12px;
644
+ font-family: var(--mono);
645
+ font-size: 12px;
646
+ white-space: pre-wrap;
647
+ word-break: break-word;
648
+ }
649
+ .flow-msg-tree {
650
+ display: grid;
651
+ gap: 8px;
652
+ padding: 10px;
653
+ border: 1px solid var(--border);
654
+ border-radius: 10px;
655
+ background: var(--panel-2);
656
+ }
657
+ .flow-msg-empty { color: var(--muted); padding: 8px 0; }
658
+ .flow-msg-field {
659
+ display: grid;
660
+ gap: 6px;
661
+ padding: 8px 10px;
662
+ border: 1px solid var(--border);
663
+ border-radius: 8px;
664
+ background: var(--panel);
665
+ }
666
+ .flow-msg-head {
667
+ display: flex;
668
+ align-items: baseline;
669
+ gap: 8px;
670
+ flex-wrap: wrap;
671
+ }
672
+ .flow-msg-name { font-weight: 600; font-size: 12px; }
673
+ .flow-msg-type {
674
+ font-family: var(--mono);
675
+ font-size: 10px;
676
+ color: var(--accent);
677
+ }
678
+ .flow-msg-type.rep { color: var(--warn, #d97706); }
679
+ .flow-msg-comment { color: var(--muted); font-size: 11px; margin-left: auto; }
680
+ .flow-msg-row {
681
+ display: grid;
682
+ grid-template-columns: 1fr;
683
+ gap: 6px;
684
+ }
685
+ .flow-msg-row input,
686
+ .flow-msg-row textarea,
687
+ .flow-msg-row select {
688
+ width: 100%;
689
+ border: 1px solid var(--border);
690
+ background: var(--input);
691
+ border-radius: 8px;
692
+ padding: 7px 10px;
693
+ font-family: var(--mono);
694
+ font-size: 12px;
695
+ }
696
+ .flow-msg-row textarea { min-height: 64px; resize: vertical; }
697
+ .flow-msg-children {
698
+ display: grid;
699
+ gap: 8px;
700
+ margin-left: 10px;
701
+ padding-left: 10px;
702
+ border-left: 2px solid color-mix(in srgb, var(--accent) 35%, var(--border));
703
+ }
704
+ .flow-msg-rep-item {
705
+ display: grid;
706
+ gap: 8px;
707
+ padding: 8px;
708
+ border: 1px dashed var(--border);
709
+ border-radius: 8px;
710
+ background: color-mix(in srgb, var(--panel-2) 70%, var(--panel));
711
+ }
712
+ .flow-msg-rep-bar {
713
+ display: flex;
714
+ align-items: center;
715
+ gap: 8px;
716
+ }
717
+ .flow-msg-rep-bar strong { font-size: 12px; }
718
+ .flow-msg-actions { display: flex; gap: 8px; flex-wrap: wrap; }
719
+ .flow-confirm-mask { z-index: 60; }
720
+ .flow-confirm-modal { width: min(360px, 92vw); }
721
+ .stress-path { flex: 1 1 100%; }
722
+ .stress-path .source-dir-row { max-width: min(560px, 100%); }
723
+ .stress-path .source-dir-row input { width: 100%; flex: 1; }
724
+ .side-tools {
725
+ display: flex;
726
+ gap: 6px;
727
+ align-items: center;
728
+ flex-wrap: nowrap;
729
+ flex-shrink: 0;
730
+ }
731
+ .side-search {
732
+ width: 100%;
733
+ padding: 7px 10px;
734
+ border-radius: 8px;
735
+ border: 1px solid var(--border);
736
+ background: var(--input);
737
+ outline: none;
738
+ }
739
+ .side-search:focus { border-color: var(--accent); }
740
+
741
+ .tree {
742
+ overflow: auto;
743
+ padding: 8px;
744
+ min-height: 0;
745
+ flex: 1;
746
+ }
747
+ .node {
748
+ user-select: none;
749
+ }
750
+ .node-row {
751
+ width: 100%;
752
+ display: flex;
753
+ align-items: center;
754
+ gap: 6px;
755
+ border: 0;
756
+ background: transparent;
757
+ text-align: left;
758
+ border-radius: 8px;
759
+ padding: 5px 8px;
760
+ color: var(--text);
761
+ }
762
+ .node-row:hover { background: var(--hover); }
763
+ .node-row.active {
764
+ background: var(--active);
765
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent);
766
+ }
767
+ .caret {
768
+ width: 14px;
769
+ color: var(--muted);
770
+ flex: 0 0 14px;
771
+ font-size: 10px;
772
+ }
773
+ .kind {
774
+ width: 16px;
775
+ text-align: center;
776
+ color: var(--muted);
777
+ font-size: 11px;
778
+ flex: 0 0 16px;
779
+ }
780
+ .label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
781
+ .count { color: var(--muted); font-size: 11px; }
782
+ .children { margin-left: 12px; border-left: 1px dashed color-mix(in srgb, var(--border) 80%, transparent); padding-left: 4px; }
783
+ .children.collapsed { display: none; }
784
+ .rpc-desc {
785
+ margin: 0 0 4px 36px;
786
+ color: var(--muted);
787
+ font-size: 11px;
788
+ white-space: nowrap;
789
+ overflow: hidden;
790
+ text-overflow: ellipsis;
791
+ }
792
+ .empty-side { padding: 18px 10px; color: var(--muted); }
793
+
794
+ .main {
795
+ display: grid;
796
+ grid-template-rows: auto auto auto minmax(0, 1fr);
797
+ min-width: 0;
798
+ min-height: 0;
799
+ background: var(--bg);
800
+ }
801
+ /* Must override .main — otherwise 4-row grid collapses the canvas to 0 height */
802
+ .main.flow-main {
803
+ position: relative;
804
+ display: flex;
805
+ flex-direction: column;
806
+ grid-template-rows: none;
807
+ min-width: 0;
808
+ min-height: 0;
809
+ height: 100%;
810
+ overflow: hidden;
811
+ background: var(--bg);
812
+ }
813
+ .main.flow-main.hidden {
814
+ display: none !important;
815
+ }
816
+ .topbar {
817
+ display: flex;
818
+ gap: 8px;
819
+ align-items: center;
820
+ padding: 10px 12px;
821
+ border-bottom: 1px solid var(--border);
822
+ background: var(--panel);
823
+ flex-wrap: wrap;
824
+ }
825
+ .pill {
826
+ border: 1px solid var(--border);
827
+ background: var(--input);
828
+ border-radius: 8px;
829
+ padding: 7px 10px;
830
+ }
831
+ .addr { flex: 1 1 140px; font-family: var(--mono); min-width: 100px; }
832
+ .method {
833
+ flex: 1 1 140px;
834
+ font-family: var(--mono);
835
+ color: var(--muted);
836
+ overflow: hidden;
837
+ text-overflow: ellipsis;
838
+ white-space: nowrap;
839
+ min-width: 96px;
840
+ }
841
+ .btn {
842
+ border: 1px solid var(--border);
843
+ background: var(--panel-2);
844
+ border-radius: 8px;
845
+ padding: 7px 12px;
846
+ }
847
+ .btn:hover { border-color: var(--accent); }
848
+ .btn.primary {
849
+ background: linear-gradient(120deg, #2563eb, #0891b2);
850
+ border-color: transparent;
851
+ color: #fff;
852
+ font-weight: 600;
853
+ }
854
+ [data-theme="light"] .btn.primary {
855
+ background: linear-gradient(120deg, #2563eb, #ea580c);
856
+ }
857
+
858
+ .tabs {
859
+ display: flex;
860
+ gap: 2px;
861
+ padding: 0 10px;
862
+ border-bottom: 1px solid var(--border);
863
+ background: var(--panel);
864
+ }
865
+ .tab {
866
+ border: 0;
867
+ background: transparent;
868
+ padding: 10px 12px;
869
+ color: var(--muted);
870
+ border-bottom: 2px solid transparent;
871
+ }
872
+ .tab.active {
873
+ color: var(--text);
874
+ border-bottom-color: var(--accent-2);
875
+ font-weight: 600;
876
+ }
877
+ .tab .dirty { color: var(--accent-2); }
878
+
879
+ .toolbar {
880
+ display: flex;
881
+ gap: 8px;
882
+ align-items: center;
883
+ padding: 8px 12px;
884
+ border-bottom: 1px solid var(--border);
885
+ background: var(--panel-2);
886
+ min-height: 42px;
887
+ }
888
+ .toolbar .spacer { flex: 1; }
889
+ .toolbar .hint { color: var(--muted); font-size: 12px; }
890
+
891
+ .workspace {
892
+ display: grid;
893
+ grid-template-rows: minmax(80px, var(--req-size)) 18px minmax(72px, 1fr);
894
+ min-height: 0;
895
+ --req-size: 62%;
896
+ }
897
+ .workspace.req-collapsed {
898
+ grid-template-rows: 0 18px minmax(0, 1fr);
899
+ }
900
+ .workspace.resp-collapsed {
901
+ grid-template-rows: minmax(0, 1fr) 18px 0;
902
+ }
903
+ .workspace.req-collapsed > .request-pane {
904
+ overflow: hidden;
905
+ visibility: hidden;
906
+ }
907
+ .workspace.req-collapsed > .request-pane .pane-body { display: none; }
908
+ .workspace.resp-collapsed > .response-pane {
909
+ overflow: hidden;
910
+ visibility: hidden;
911
+ }
912
+ .workspace.resp-collapsed > .response-pane .toolbar,
913
+ .workspace.resp-collapsed > .response-pane .response { display: none; }
914
+ .split-bar {
915
+ display: flex;
916
+ align-items: center;
917
+ justify-content: center;
918
+ gap: 8px;
919
+ border-top: 1px solid var(--border);
920
+ border-bottom: 1px solid var(--border);
921
+ background: var(--panel-2);
922
+ user-select: none;
923
+ z-index: 2;
924
+ }
925
+ .split-grip {
926
+ width: 48px;
927
+ height: 4px;
928
+ border-radius: 999px;
929
+ background: color-mix(in srgb, var(--muted) 55%, transparent);
930
+ cursor: row-resize;
931
+ }
932
+ .split-bar:hover .split-grip,
933
+ .workspace.splitting .split-grip {
934
+ background: var(--accent);
935
+ }
936
+ .workspace.splitting { cursor: row-resize; }
937
+ .workspace.splitting * { cursor: row-resize !important; }
938
+ .split-btn {
939
+ width: 22px;
940
+ height: 18px;
941
+ border: 0;
942
+ border-radius: 4px;
943
+ background: transparent;
944
+ color: var(--muted);
945
+ font-size: 10px;
946
+ line-height: 1;
947
+ padding: 0;
948
+ }
949
+ .split-btn:hover { color: var(--text); background: var(--hover); }
950
+ .workspace.req-collapsed #collapseReqBtn { transform: rotate(180deg); }
951
+ .workspace.resp-collapsed #collapseRespBtn { transform: rotate(180deg); }
952
+ .pane {
953
+ min-height: 0;
954
+ display: flex;
955
+ flex-direction: column;
956
+ background: var(--bg);
957
+ position: relative;
958
+ }
959
+ .request-pane { border-bottom: 0; }
960
+ .response-pane { border-top: 0; }
961
+ .pane-body {
962
+ flex: 1;
963
+ min-height: 0;
964
+ position: relative;
965
+ overflow: hidden;
966
+ }
967
+ .view {
968
+ position: absolute;
969
+ inset: 0;
970
+ display: none;
971
+ overflow: auto;
972
+ }
973
+ .view.active { display: flex; flex-direction: column; }
974
+
975
+ .message-layout {
976
+ display: grid;
977
+ grid-template-columns: minmax(220px, 34%) minmax(0, 1fr);
978
+ height: 100%;
979
+ min-height: 0;
980
+ }
981
+ .rpc-info {
982
+ border-right: 1px solid var(--border);
983
+ background: var(--panel);
984
+ overflow: auto;
985
+ padding: 12px 12px 16px;
986
+ min-height: 0;
987
+ }
988
+ .rpc-info-empty { color: var(--muted); font-size: 12px; }
989
+ .rpc-info-title {
990
+ margin: 0 0 4px;
991
+ font-size: 16px;
992
+ letter-spacing: -0.02em;
993
+ }
994
+ .rpc-info-lead { margin: 0 0 8px; color: var(--muted); font-size: 12px; line-height: 1.5; }
995
+ .rpc-info-meta {
996
+ margin: 0 0 10px;
997
+ color: var(--muted);
998
+ font-family: var(--mono);
999
+ font-size: 11px;
1000
+ word-break: break-all;
1001
+ }
1002
+ .rpc-info-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px; }
1003
+ .rpc-info-chip {
1004
+ border: 1px solid var(--border);
1005
+ border-radius: 999px;
1006
+ padding: 2px 8px;
1007
+ font-size: 11px;
1008
+ color: var(--muted);
1009
+ background: var(--panel-2);
1010
+ }
1011
+ .rpc-info-chip.warn {
1012
+ color: var(--warn);
1013
+ border-color: color-mix(in srgb, var(--warn) 45%, var(--border));
1014
+ }
1015
+ .rpc-info-row {
1016
+ display: grid;
1017
+ grid-template-columns: 52px 1fr;
1018
+ gap: 6px;
1019
+ margin: 4px 0;
1020
+ font-size: 12px;
1021
+ }
1022
+ .rpc-info-row span { color: var(--muted); }
1023
+ .rpc-info-row code { font-family: var(--mono); word-break: break-all; }
1024
+ .rpc-info-def {
1025
+ margin-top: 10px;
1026
+ border: 1px solid var(--border);
1027
+ border-radius: 10px;
1028
+ background: var(--input);
1029
+ overflow: hidden;
1030
+ }
1031
+ .rpc-info-def summary {
1032
+ cursor: pointer;
1033
+ padding: 8px 10px;
1034
+ font-size: 12px;
1035
+ color: var(--muted);
1036
+ user-select: none;
1037
+ }
1038
+ .rpc-info-def pre {
1039
+ margin: 0;
1040
+ padding: 0 10px 10px;
1041
+ max-height: 220px;
1042
+ overflow: auto;
1043
+ font-family: var(--mono);
1044
+ font-size: 11px;
1045
+ line-height: 1.45;
1046
+ white-space: pre-wrap;
1047
+ }
1048
+ textarea.editor {
1049
+ flex: 1;
1050
+ width: 100%;
1051
+ border: 0;
1052
+ resize: none;
1053
+ padding: 12px 14px;
1054
+ background: var(--bg);
1055
+ font-family: var(--mono);
1056
+ font-size: 12px;
1057
+ outline: none;
1058
+ min-height: 120px;
1059
+ line-height: 1.55;
1060
+ }
1061
+ .message-layout .editor { height: 100%; min-height: 0; }
1062
+ .stress-panel {
1063
+ display: flex;
1064
+ flex-direction: column;
1065
+ gap: 12px;
1066
+ height: 100%;
1067
+ min-height: 0;
1068
+ padding: 12px 14px 16px;
1069
+ overflow: auto;
1070
+ }
1071
+ .stress-head { display: grid; gap: 8px; }
1072
+ .stress-modes { display: flex; gap: 8px; }
1073
+ .stress-mode.active {
1074
+ border-color: var(--accent);
1075
+ color: var(--text);
1076
+ background: var(--active);
1077
+ }
1078
+ .stress-note { margin: 0; color: var(--muted); font-size: 12px; line-height: 1.5; }
1079
+ .stress-note code { font-family: var(--mono); }
1080
+ .stress-form {
1081
+ display: flex;
1082
+ flex-wrap: wrap;
1083
+ gap: 10px;
1084
+ align-items: end;
1085
+ }
1086
+ .stress-form label {
1087
+ display: grid;
1088
+ gap: 4px;
1089
+ font-size: 12px;
1090
+ color: var(--muted);
1091
+ }
1092
+ .stress-form input {
1093
+ width: 96px;
1094
+ border: 1px solid var(--border);
1095
+ background: var(--input);
1096
+ border-radius: 8px;
1097
+ padding: 7px 8px;
1098
+ }
1099
+ .stress-progress-wrap { display: grid; gap: 6px; }
1100
+ .stress-progress-bar {
1101
+ height: 8px;
1102
+ border-radius: 999px;
1103
+ background: var(--panel-2);
1104
+ border: 1px solid var(--border);
1105
+ overflow: hidden;
1106
+ }
1107
+ .stress-progress-bar i {
1108
+ display: block;
1109
+ height: 100%;
1110
+ width: 0;
1111
+ background: linear-gradient(90deg, #2563eb, #22d3ee);
1112
+ }
1113
+ .stress-progress-text { font-size: 12px; color: var(--muted); font-family: var(--mono); }
1114
+ .stress-cmd {
1115
+ width: 100%;
1116
+ border: 1px solid var(--border);
1117
+ border-radius: 10px;
1118
+ background: var(--input);
1119
+ padding: 10px 12px;
1120
+ font-family: var(--mono);
1121
+ font-size: 12px;
1122
+ resize: vertical;
1123
+ }
1124
+ .stress-result {
1125
+ border: 1px solid var(--border);
1126
+ border-radius: 12px;
1127
+ background: var(--panel);
1128
+ padding: 12px;
1129
+ min-height: 140px;
1130
+ }
1131
+ .stress-empty { color: var(--muted); font-size: 12px; }
1132
+ .stress-stats {
1133
+ display: grid;
1134
+ grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
1135
+ gap: 8px;
1136
+ margin-bottom: 10px;
1137
+ }
1138
+ .stress-stat {
1139
+ border: 1px solid var(--border);
1140
+ border-radius: 10px;
1141
+ padding: 8px 10px;
1142
+ background: var(--panel-2);
1143
+ }
1144
+ .stress-stat b { display: block; font-size: 16px; font-family: var(--mono); }
1145
+ .stress-stat span { color: var(--muted); font-size: 11px; }
1146
+ .stress-samples {
1147
+ width: 100%;
1148
+ border-collapse: collapse;
1149
+ font-size: 12px;
1150
+ font-family: var(--mono);
1151
+ }
1152
+ .stress-samples th, .stress-samples td {
1153
+ border-top: 1px solid var(--border);
1154
+ padding: 6px 8px;
1155
+ text-align: left;
1156
+ }
1157
+ .stress-samples th { color: var(--muted); font-size: 11px; border-top: 0; }
1158
+ .stress-ok { color: var(--ok); }
1159
+ .stress-fail { color: var(--danger); }
1160
+ .stress-ghz.hidden, .stress-light.hidden { display: none; }
1161
+ .stress-log {
1162
+ margin: 0;
1163
+ max-height: 240px;
1164
+ overflow: auto;
1165
+ white-space: pre-wrap;
1166
+ font-family: var(--mono);
1167
+ font-size: 11px;
1168
+ line-height: 1.45;
1169
+ }
1170
+ @media (max-width: 960px) {
1171
+ .message-layout { grid-template-columns: 1fr; }
1172
+ .rpc-info { border-right: 0; border-bottom: 1px solid var(--border); max-height: 180px; }
1173
+ }
1174
+
1175
+ .meta-wrap { display: flex; flex-direction: column; height: 100%; min-height: 0; }
1176
+ .meta-table {
1177
+ width: 100%;
1178
+ border-collapse: collapse;
1179
+ table-layout: fixed;
1180
+ }
1181
+ .meta-table th, .meta-table td {
1182
+ border-bottom: 1px solid var(--border);
1183
+ padding: 0;
1184
+ vertical-align: middle;
1185
+ }
1186
+ .meta-table th {
1187
+ position: sticky;
1188
+ top: 0;
1189
+ z-index: 1;
1190
+ background: var(--table-head);
1191
+ color: var(--muted);
1192
+ font-size: 11px;
1193
+ letter-spacing: .05em;
1194
+ text-transform: uppercase;
1195
+ text-align: left;
1196
+ padding: 8px 10px;
1197
+ font-weight: 600;
1198
+ }
1199
+ .meta-table td input {
1200
+ width: 100%;
1201
+ border: 0;
1202
+ background: transparent;
1203
+ padding: 9px 10px;
1204
+ outline: none;
1205
+ }
1206
+ .meta-table tr:hover td { background: var(--hover); }
1207
+ .meta-table .col-name { width: 22%; }
1208
+ .meta-table .col-value { width: 38%; }
1209
+ .meta-table .col-desc { width: 32%; }
1210
+ .meta-table .col-act { width: 8%; text-align: center; }
1211
+ .meta-foot {
1212
+ display: flex;
1213
+ justify-content: space-between;
1214
+ align-items: center;
1215
+ padding: 8px 12px;
1216
+ border-top: 1px solid var(--border);
1217
+ background: var(--panel);
1218
+ }
1219
+ .link {
1220
+ border: 0;
1221
+ background: transparent;
1222
+ color: var(--accent);
1223
+ padding: 0;
1224
+ }
1225
+ .link.danger { color: var(--danger); }
1226
+
1227
+ .history {
1228
+ padding: 14px;
1229
+ font-family: var(--mono);
1230
+ font-size: 12px;
1231
+ white-space: pre-wrap;
1232
+ color: var(--muted);
1233
+ }
1234
+ .auth-panel {
1235
+ display: flex;
1236
+ flex-direction: column;
1237
+ gap: 12px;
1238
+ height: 100%;
1239
+ min-height: 0;
1240
+ padding: 14px 16px 18px;
1241
+ overflow: auto;
1242
+ }
1243
+ .auth-head {
1244
+ display: flex;
1245
+ justify-content: space-between;
1246
+ align-items: flex-start;
1247
+ gap: 12px;
1248
+ }
1249
+ .auth-title {
1250
+ font-size: 12px;
1251
+ letter-spacing: .06em;
1252
+ text-transform: uppercase;
1253
+ color: var(--muted);
1254
+ font-weight: 700;
1255
+ }
1256
+ .auth-note {
1257
+ margin: 4px 0 0;
1258
+ color: var(--muted);
1259
+ font-size: 12px;
1260
+ line-height: 1.5;
1261
+ max-width: 520px;
1262
+ }
1263
+ .auth-type { min-width: 150px; }
1264
+ .auth-body {
1265
+ display: grid;
1266
+ gap: 10px;
1267
+ max-width: 520px;
1268
+ }
1269
+ .auth-field {
1270
+ display: grid;
1271
+ gap: 4px;
1272
+ font-size: 12px;
1273
+ color: var(--muted);
1274
+ }
1275
+ .auth-field input {
1276
+ border: 1px solid var(--border);
1277
+ background: var(--input);
1278
+ border-radius: 8px;
1279
+ padding: 8px 10px;
1280
+ color: var(--text);
1281
+ font-family: var(--mono);
1282
+ }
1283
+ .auth-field input:focus {
1284
+ outline: none;
1285
+ border-color: var(--accent);
1286
+ }
1287
+ .auth-hint {
1288
+ margin: 0;
1289
+ color: var(--muted);
1290
+ font-size: 12px;
1291
+ line-height: 1.55;
1292
+ }
1293
+ .auth-preview {
1294
+ margin-top: auto;
1295
+ padding: 8px 10px;
1296
+ border-radius: 8px;
1297
+ border: 1px dashed var(--border);
1298
+ background: var(--panel-2);
1299
+ color: var(--muted);
1300
+ font-family: var(--mono);
1301
+ font-size: 11px;
1302
+ word-break: break-all;
1303
+ }
1304
+ .response-pane { min-height: 0; }
1305
+ .resp-title {
1306
+ font-size: 12px;
1307
+ letter-spacing: .06em;
1308
+ text-transform: uppercase;
1309
+ color: var(--muted);
1310
+ }
1311
+ .tls-toggle {
1312
+ display: inline-flex;
1313
+ align-items: center;
1314
+ gap: 4px;
1315
+ color: var(--muted);
1316
+ font-size: 12px;
1317
+ user-select: none;
1318
+ }
1319
+ .response {
1320
+ flex: 1;
1321
+ min-height: 0;
1322
+ overflow: auto;
1323
+ margin: 0;
1324
+ padding: 0;
1325
+ color: var(--text);
1326
+ background: var(--bg);
1327
+ }
1328
+ .resp-empty { padding: 12px 14px; color: var(--muted); }
1329
+ .resp-block { padding: 10px 12px 14px; display: flex; flex-direction: column; gap: 8px; }
1330
+ .resp-line { font-family: var(--mono); font-size: 12px; color: var(--muted); }
1331
+ .resp-error {
1332
+ margin: 0;
1333
+ padding: 8px 10px;
1334
+ border-radius: 8px;
1335
+ background: color-mix(in srgb, var(--danger) 12%, transparent);
1336
+ color: var(--danger);
1337
+ white-space: pre-wrap;
1338
+ font-family: var(--mono);
1339
+ font-size: 12px;
1340
+ }
1341
+ .resp-json {
1342
+ margin: 0;
1343
+ padding: 10px 12px;
1344
+ border-radius: 10px;
1345
+ border: 1px solid var(--border);
1346
+ background: var(--input);
1347
+ font-family: var(--mono);
1348
+ font-size: 12px;
1349
+ line-height: 1.5;
1350
+ white-space: pre;
1351
+ overflow: auto;
1352
+ }
1353
+ .resp-json .k { color: #7dd3fc; }
1354
+ .resp-json .s { color: #86efac; }
1355
+ .resp-json .n { color: #fdba74; }
1356
+ .resp-json .b { color: #c4b5fd; }
1357
+ [data-theme="light"] .resp-json .k { color: #0369a1; }
1358
+ [data-theme="light"] .resp-json .s { color: #047857; }
1359
+ [data-theme="light"] .resp-json .n { color: #c2410c; }
1360
+ [data-theme="light"] .resp-json .b { color: #6d28d9; }
1361
+ .resp-badge {
1362
+ font-family: var(--mono);
1363
+ font-size: 11px;
1364
+ color: var(--muted);
1365
+ }
1366
+ .resp-badge.ok { color: var(--ok); }
1367
+ .resp-badge.err { color: var(--danger); }
1368
+ .resp-badge.wait { color: var(--warn); }
1369
+ .docs { padding: 0; font-family: var(--sans); white-space: normal; color: var(--text); }
1370
+ .doc-page { padding: 18px 20px 28px; max-width: 980px; }
1371
+ .doc-crumbs { color: var(--muted); font-size: 12px; display: flex; gap: 6px; flex-wrap: wrap; }
1372
+ .doc-title { margin: 6px 0 4px; font-size: 26px; letter-spacing: -0.03em; }
1373
+ .doc-lead { margin: 0 0 8px; color: var(--muted); }
1374
+ .doc-file { margin: 0 0 16px; color: var(--muted); font-size: 12px; font-family: var(--mono); }
1375
+ .doc-pair { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
1376
+ .doc-card {
1377
+ border: 1px solid var(--border);
1378
+ border-radius: 14px;
1379
+ overflow: hidden;
1380
+ background: color-mix(in srgb, var(--panel) 88%, var(--bg));
1381
+ }
1382
+ .doc-card h3 { margin: 0; padding: 12px 14px 4px; font-size: 14px; font-family: var(--mono); }
1383
+ .doc-kicker {
1384
+ padding: 12px 14px 0;
1385
+ font-size: 11px;
1386
+ letter-spacing: .08em;
1387
+ text-transform: uppercase;
1388
+ color: var(--muted);
1389
+ }
1390
+ .doc-card table { width: 100%; border-collapse: collapse; }
1391
+ .doc-card th, .doc-card td { padding: 8px 12px; text-align: left; vertical-align: top; border-top: 1px solid var(--border); font-size: 12px; }
1392
+ .doc-card th { color: var(--muted); font-size: 11px; letter-spacing: .06em; text-transform: uppercase; border-top: 0; }
1393
+ .doc-num { color: var(--muted); font-family: var(--mono); width: 36px; }
1394
+ .doc-type, .doc-name { font-family: var(--mono); }
1395
+ .doc-comment { color: var(--muted); }
1396
+ .doc-empty { padding: 18px; color: var(--muted); }
1397
+ .doc-toolbar { margin-bottom: 10px; display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
1398
+ .doc-link {
1399
+ border: 0;
1400
+ background: transparent;
1401
+ color: var(--accent);
1402
+ font: inherit;
1403
+ font-family: var(--mono);
1404
+ padding: 0;
1405
+ cursor: pointer;
1406
+ text-decoration: underline;
1407
+ text-underline-offset: 2px;
1408
+ }
1409
+ .doc-link:hover { color: var(--text); }
1410
+ .doc-chip {
1411
+ display: inline-block;
1412
+ margin-right: 6px;
1413
+ padding: 1px 6px;
1414
+ border-radius: 999px;
1415
+ border: 1px solid var(--border);
1416
+ color: var(--muted);
1417
+ font-size: 11px;
1418
+ }
1419
+ .doc-nested { margin-top: 14px; display: flex; flex-direction: column; gap: 6px; }
1420
+ .doc-row {
1421
+ display: flex;
1422
+ justify-content: space-between;
1423
+ gap: 12px;
1424
+ text-align: left;
1425
+ border: 1px solid var(--border);
1426
+ background: transparent;
1427
+ color: inherit;
1428
+ border-radius: 10px;
1429
+ padding: 8px 12px;
1430
+ cursor: pointer;
1431
+ }
1432
+ .doc-row:hover { border-color: var(--accent); }
1433
+ .ai-btn {
1434
+ height: 28px;
1435
+ padding: 0 8px;
1436
+ border-radius: 8px;
1437
+ border: 1px solid color-mix(in srgb, #7dd3fc 45%, transparent);
1438
+ background: linear-gradient(120deg, #0f172a, #1d4ed8 45%, #0891b2);
1439
+ color: #f8fafc;
1440
+ animation: aiPulse 2.4s ease-in-out infinite;
1441
+ display: inline-flex;
1442
+ align-items: center;
1443
+ white-space: nowrap;
1444
+ flex-shrink: 0;
1445
+ }
1446
+ .ai-spark {
1447
+ display: inline-block;
1448
+ margin-right: 4px;
1449
+ flex-shrink: 0;
1450
+ animation: aiSpin 3.2s linear infinite;
1451
+ }
1452
+ @keyframes aiPulse {
1453
+ 0%, 100% { box-shadow: 0 0 0 0 transparent; }
1454
+ 50% { box-shadow: 0 0 14px 1px color-mix(in srgb, #38bdf8 45%, transparent); }
1455
+ }
1456
+ @keyframes aiSpin { to { transform: rotate(360deg); } }
1457
+ .ai-overlay {
1458
+ display: none;
1459
+ position: fixed;
1460
+ inset: 0;
1461
+ z-index: 30;
1462
+ background: color-mix(in srgb, var(--bg) 92%, #000);
1463
+ overflow: auto;
1464
+ }
1465
+ .ai-overlay.show { display: block; }
1466
+ .ai-page { max-width: 920px; margin: 0 auto; padding: 28px 22px 48px; }
1467
+ .ai-top, .ai-actions, .ai-stage { display: flex; gap: 12px; }
1468
+ .ai-top { justify-content: space-between; align-items: flex-start; }
1469
+ .ai-stage { margin-top: 18px; align-items: flex-start; }
1470
+ .ai-game, .ai-reward {
1471
+ flex: 1;
1472
+ border: 1px solid var(--border);
1473
+ border-radius: 16px;
1474
+ padding: 16px;
1475
+ background: var(--panel);
1476
+ }
1477
+ .ai-poem { margin: 8px 0 0; line-height: 1.8; color: var(--muted); }
1478
+ .ai-heart { color: #fb7185; margin-left: 6px; }
1479
+ .ai-heart.burst { font-size: 42px; text-align: center; animation: heartBeat 1.1s ease-in-out infinite; }
1480
+ .ai-board { display: grid; grid-template-columns: repeat(4, minmax(64px, 1fr)); gap: 10px; margin: 14px 0; }
1481
+ .ai-tile {
1482
+ aspect-ratio: 1;
1483
+ border-radius: 14px;
1484
+ border: 1px solid color-mix(in srgb, #38bdf8 35%, var(--border));
1485
+ background: var(--bg);
1486
+ color: inherit;
1487
+ font-size: 22px;
1488
+ font-weight: 650;
1489
+ cursor: pointer;
1490
+ }
1491
+ .ai-tile.selected { border-color: #f472b6; box-shadow: 0 0 0 2px color-mix(in srgb, #f472b6 45%, transparent); }
1492
+ .ai-tile.done { border-color: #34d399; }
1493
+ .ai-reward { text-align: center; }
1494
+ .ai-reward.hidden, .ai-game.hidden { display: none; }
1495
+ .ai-qr { width: min(260px, 100%); border-radius: 14px; margin: 12px auto; display: block; }
1496
+ @keyframes heartBeat { 50% { transform: scale(1.12); } }
1497
+ @media (max-width: 860px) { .ai-stage { flex-direction: column; } }
1498
+ @media (max-width: 960px) { .doc-pair { grid-template-columns: 1fr; } }
1499
+
1500
+ .modal-mask {
1501
+ position: fixed;
1502
+ inset: 0;
1503
+ background: rgba(0,0,0,.45);
1504
+ display: none;
1505
+ align-items: center;
1506
+ justify-content: center;
1507
+ z-index: 50;
1508
+ padding: 20px;
1509
+ }
1510
+ .modal-mask.show { display: flex; }
1511
+ .modal {
1512
+ width: min(560px, 100%);
1513
+ background: var(--panel);
1514
+ border: 1px solid var(--border);
1515
+ border-radius: 14px;
1516
+ box-shadow: var(--shadow);
1517
+ overflow: hidden;
1518
+ }
1519
+ .modal-head {
1520
+ display: flex;
1521
+ justify-content: space-between;
1522
+ align-items: center;
1523
+ padding: 12px 14px;
1524
+ border-bottom: 1px solid var(--border);
1525
+ font-weight: 650;
1526
+ }
1527
+ .modal-body { padding: 14px; display: grid; gap: 10px; }
1528
+ .modal-body label { display: grid; gap: 4px; color: var(--muted); font-size: 12px; }
1529
+ .modal-body input, .modal-body textarea {
1530
+ border: 1px solid var(--border);
1531
+ background: var(--input);
1532
+ border-radius: 8px;
1533
+ padding: 8px 10px;
1534
+ }
1535
+ .modal-foot {
1536
+ display: flex;
1537
+ justify-content: flex-end;
1538
+ gap: 8px;
1539
+ padding: 12px 14px;
1540
+ border-top: 1px solid var(--border);
1541
+ }
1542
+ .env-list { display: grid; gap: 8px; }
1543
+ .env-item {
1544
+ display: grid;
1545
+ grid-template-columns: 1fr auto;
1546
+ gap: 8px;
1547
+ align-items: center;
1548
+ padding: 10px;
1549
+ border: 1px solid var(--border);
1550
+ border-radius: 10px;
1551
+ background: var(--panel-2);
1552
+ }
1553
+ .env-item strong { display: block; }
1554
+ .env-item span { color: var(--muted); font-size: 12px; font-family: var(--mono); }
1555
+
1556
+ /* 窄宽不再上下堆叠侧栏;由 JS 自动收起,右侧自适应 */
1557
+ @media (max-width: 900px) {
1558
+ #app { --sidebar-w: 220px; }
1559
+ .side-meta-row { flex-wrap: wrap; }
1560
+ .topbar { gap: 6px; padding: 8px; }
1561
+ .pill { padding: 6px 8px; }
1562
+ .tabs { overflow-x: auto; flex-wrap: nowrap; }
1563
+ .tab { padding: 8px 10px; white-space: nowrap; }
1564
+ }
1565
+ @media (max-width: 560px), (max-height: 420px) {
1566
+ .brand { font-size: 12px; }
1567
+ .toolbar .hint { display: none; }
1568
+ }