@zhhoceanfly/protoview 0.0.0-stage → 0.1.3

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