sqlseed-web 0.2.4__py3-none-any.whl

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.
Files changed (87) hide show
  1. sqlseed_web/AGENTS.md +106 -0
  2. sqlseed_web/__init__.py +24 -0
  3. sqlseed_web/__main__.py +8 -0
  4. sqlseed_web/_application.py +205 -0
  5. sqlseed_web/ai_settings.py +290 -0
  6. sqlseed_web/api.py +1102 -0
  7. sqlseed_web/app.py +26 -0
  8. sqlseed_web/managed_worker.py +184 -0
  9. sqlseed_web/operation_errors.py +42 -0
  10. sqlseed_web/plugin_environment.py +231 -0
  11. sqlseed_web/plugin_management.py +322 -0
  12. sqlseed_web/plugin_process.py +131 -0
  13. sqlseed_web/runtime_lifecycle.py +130 -0
  14. sqlseed_web/runtime_session.py +97 -0
  15. sqlseed_web/settings_environment.py +368 -0
  16. sqlseed_web/sqlite_target.py +86 -0
  17. sqlseed_web/state.py +348 -0
  18. sqlseed_web/static/AGENTS.md +180 -0
  19. sqlseed_web/static/ai.css +57 -0
  20. sqlseed_web/static/configs.css +50 -0
  21. sqlseed_web/static/date-picker.css +230 -0
  22. sqlseed_web/static/disclosure.css +149 -0
  23. sqlseed_web/static/graph-clarity.css +103 -0
  24. sqlseed_web/static/index.html +29 -0
  25. sqlseed_web/static/js/api.js +228 -0
  26. sqlseed_web/static/js/app.js +97 -0
  27. sqlseed_web/static/js/dropdown.js +432 -0
  28. sqlseed_web/static/js/filepicker.js +203 -0
  29. sqlseed_web/static/js/genform.js +1066 -0
  30. sqlseed_web/static/js/labels.js +195 -0
  31. sqlseed_web/static/js/pages/browse.js +209 -0
  32. sqlseed_web/static/js/pages/configs.js +424 -0
  33. sqlseed_web/static/js/pages/connect.js +332 -0
  34. sqlseed_web/static/js/pages/heal.js +395 -0
  35. sqlseed_web/static/js/pages/meta.js +110 -0
  36. sqlseed_web/static/js/pages/runs.js +293 -0
  37. sqlseed_web/static/js/pages/settings.js +942 -0
  38. sqlseed_web/static/js/pages/wizard.js +751 -0
  39. sqlseed_web/static/js/pages/workbench.js +3123 -0
  40. sqlseed_web/static/js/tree.js +126 -0
  41. sqlseed_web/static/js/workbench/ai-eligibility.js +33 -0
  42. sqlseed_web/static/js/workbench/ai-handoff.js +31 -0
  43. sqlseed_web/static/js/workbench/ai-stream.js +116 -0
  44. sqlseed_web/static/js/workbench/ai.js +888 -0
  45. sqlseed_web/static/js/workbench/connection.js +508 -0
  46. sqlseed_web/static/js/workbench/date-picker.js +445 -0
  47. sqlseed_web/static/js/workbench/dependency-view.js +119 -0
  48. sqlseed_web/static/js/workbench/editor.js +1236 -0
  49. sqlseed_web/static/js/workbench/focus.js +11 -0
  50. sqlseed_web/static/js/workbench/graph-layout.js +332 -0
  51. sqlseed_web/static/js/workbench/graph.js +970 -0
  52. sqlseed_web/static/js/workbench/guidance.js +29 -0
  53. sqlseed_web/static/js/workbench/model.js +124 -0
  54. sqlseed_web/static/js/workbench/plugin-management.js +512 -0
  55. sqlseed_web/static/js/workbench/preview-scroll-layout.js +94 -0
  56. sqlseed_web/static/js/workbench/preview.js +572 -0
  57. sqlseed_web/static/js/workbench/provider-guide.js +33 -0
  58. sqlseed_web/static/js/workbench/recovery.js +28 -0
  59. sqlseed_web/static/js/workbench/scroll-lock.js +26 -0
  60. sqlseed_web/static/js/workbench/session.js +174 -0
  61. sqlseed_web/static/js/workbench/table-data.js +186 -0
  62. sqlseed_web/static/js/workbench/ui.js +262 -0
  63. sqlseed_web/static/navigation.css +92 -0
  64. sqlseed_web/static/preview.css +29 -0
  65. sqlseed_web/static/runs.css +53 -0
  66. sqlseed_web/static/scrollbars.css +42 -0
  67. sqlseed_web/static/settings.css +108 -0
  68. sqlseed_web/static/style.css +3382 -0
  69. sqlseed_web/static/table-data.css +27 -0
  70. sqlseed_web/static/workbench.css +509 -0
  71. sqlseed_web/supervised_plugins.py +173 -0
  72. sqlseed_web/supervisor.py +238 -0
  73. sqlseed_web/workbench.py +381 -0
  74. sqlseed_web/workbench_ai.py +887 -0
  75. sqlseed_web/workbench_ai_relations.py +285 -0
  76. sqlseed_web/workbench_ai_stream.py +172 -0
  77. sqlseed_web/workbench_data.py +163 -0
  78. sqlseed_web/workbench_execution.py +199 -0
  79. sqlseed_web/workbench_runtime.py +1218 -0
  80. sqlseed_web/workbench_schema.py +277 -0
  81. sqlseed_web/workbench_store.py +458 -0
  82. sqlseed_web/worker_control.py +192 -0
  83. sqlseed_web-0.2.4.dist-info/METADATA +105 -0
  84. sqlseed_web-0.2.4.dist-info/RECORD +87 -0
  85. sqlseed_web-0.2.4.dist-info/WHEEL +4 -0
  86. sqlseed_web-0.2.4.dist-info/entry_points.txt +2 -0
  87. sqlseed_web-0.2.4.dist-info/licenses/LICENSE +679 -0
@@ -0,0 +1,3382 @@
1
+ @import url("./ai.css");
2
+ @import url("./configs.css");
3
+ @import url("./date-picker.css");
4
+ @import url("./workbench.css");
5
+ @import url("./settings.css");
6
+ @import url("./preview.css");
7
+ @import url("./graph-clarity.css");
8
+ @import url("./table-data.css");
9
+ @import url("./navigation.css");
10
+ @import url("./disclosure.css");
11
+ @import url("./runs.css");
12
+ @import url("./scrollbars.css");
13
+
14
+ /* Approved workbench v8 visual baseline. Product extensions follow below. */
15
+ :root {
16
+ color-scheme: light;
17
+ --canvas: #eef3f5;
18
+ --paper: #fff;
19
+ --wash: #f7f9fa;
20
+ --ink: #193441;
21
+ --muted: #617682;
22
+ --line: #dce5e9;
23
+ --navy: #234e61;
24
+ --teal: #167765;
25
+ --soft: #eaf5ef;
26
+ --violet: #6958a4;
27
+ --radius: 9px;
28
+ --mono: ui-monospace,SFMono-Regular,Consolas,monospace;
29
+ }
30
+ * {
31
+ box-sizing: border-box;
32
+ }
33
+ body {
34
+ margin: 0;
35
+ background: var(--canvas);
36
+ color: var(--ink);
37
+ font: 14px/1.55 "PingFang SC","Microsoft YaHei",sans-serif;
38
+ }
39
+ button,input {
40
+ font: inherit;
41
+ }
42
+ button {
43
+ cursor: pointer;
44
+ color: inherit;
45
+ border: 0;
46
+ background: none;
47
+ }
48
+ button:disabled {
49
+ cursor: default;
50
+ }
51
+ button:focus-visible,input:focus-visible {
52
+ outline: 3px solid #74b7c9;
53
+ outline-offset: 3px;
54
+ }
55
+ svg {
56
+ display: block;
57
+ }
58
+ button svg {
59
+ flex-shrink: 0;
60
+ }
61
+ a {
62
+ color: var(--teal);
63
+ }
64
+ .mono {
65
+ font-family: var(--mono);
66
+ }
67
+ .muted {
68
+ color: var(--muted);
69
+ }
70
+ .icon {
71
+ width: 18px;
72
+ height: 18px;
73
+ stroke: currentColor;
74
+ stroke-width: 1.6;
75
+ fill: none;
76
+ stroke-linecap: round;
77
+ stroke-linejoin: round;
78
+ }
79
+ .top {
80
+ height: 67px;
81
+ padding: 0 30px;
82
+ display: flex;
83
+ align-items: center;
84
+ gap: 52px;
85
+ background: var(--paper);
86
+ border-bottom: 1px solid var(--line);
87
+ }
88
+ .brand {
89
+ display: flex;
90
+ align-items: center;
91
+ gap: 10px;
92
+ font-size: 23px;
93
+ font-weight: 720;
94
+ letter-spacing: -1px;
95
+ }
96
+ .brand-mark {
97
+ width: 27px;
98
+ height: 27px;
99
+ color: var(--teal);
100
+ }
101
+ .nav {
102
+ height: 100%;
103
+ display: flex;
104
+ align-items: stretch;
105
+ gap: 30px;
106
+ }
107
+ .nav button {
108
+ font-size: 13px;
109
+ padding: 0 2px;
110
+ color: var(--muted);
111
+ border-bottom: 2px solid transparent;
112
+ }
113
+ .nav button.active {
114
+ color: var(--ink);
115
+ font-weight: 600;
116
+ border-color: var(--teal);
117
+ }
118
+ .top-end {
119
+ margin-left: auto;
120
+ display: flex;
121
+ align-items: center;
122
+ gap: 11px;
123
+ font-size: 12px;
124
+ color: var(--muted);
125
+ }
126
+ .prototype-tag {
127
+ border: 1px solid #c7d7de;
128
+ padding: 3px 8px;
129
+ border-radius: 5px;
130
+ color: #456370;
131
+ }
132
+ .avatar {
133
+ height: 28px;
134
+ width: 28px;
135
+ background: #e4efeb;
136
+ color: var(--teal);
137
+ border-radius: 50%;
138
+ display: grid;
139
+ place-items: center;
140
+ font-size: 11px;
141
+ font-weight: 650;
142
+ }
143
+ .page {
144
+ max-width: 1500px;
145
+ margin: auto;
146
+ padding: 27px 30px 25px;
147
+ }
148
+ .heading {
149
+ display: flex;
150
+ align-items: flex-start;
151
+ justify-content: space-between;
152
+ gap: 24px;
153
+ margin-bottom: 25px;
154
+ }
155
+ .crumb {
156
+ font-size: 12px;
157
+ color: var(--muted);
158
+ margin-bottom: 7px;
159
+ }
160
+ .crumb span {
161
+ color: #a3b3bc;
162
+ margin: 0 9px;
163
+ }
164
+ .title-line {
165
+ display: flex;
166
+ align-items: center;
167
+ gap: 14px;
168
+ }
169
+ h1 {
170
+ font-size: 27px;
171
+ line-height: 1.35;
172
+ font-weight: 650;
173
+ letter-spacing: -.6px;
174
+ margin: 0;
175
+ }
176
+ .draft-tag {
177
+ font-size: 11px;
178
+ color: var(--teal);
179
+ background: #e0eee7;
180
+ padding: 3px 8px;
181
+ border-radius: 4px;
182
+ }
183
+ .subtitle {
184
+ font-size: 13px;
185
+ color: var(--muted);
186
+ margin: 8px 0 0;
187
+ }
188
+ .heading-actions {
189
+ padding-top: 20px;
190
+ display: flex;
191
+ align-items: center;
192
+ gap: 10px;
193
+ flex-wrap: wrap;
194
+ justify-content: flex-end;
195
+ }
196
+ .btn {
197
+ min-height: 35px;
198
+ display: inline-flex;
199
+ align-items: center;
200
+ justify-content: center;
201
+ gap: 7px;
202
+ padding: 7px 13px;
203
+ border: 1px solid #cbd9df;
204
+ border-radius: 7px;
205
+ background: var(--paper);
206
+ font-size: 12px;
207
+ font-weight: 550;
208
+ white-space: nowrap;
209
+ }
210
+ .btn:hover {
211
+ background: #f3f7f8;
212
+ }
213
+ .btn.primary {
214
+ background: var(--teal);
215
+ border-color: var(--teal);
216
+ color: #fff;
217
+ }
218
+ .btn.primary:hover {
219
+ background: #0d6858;
220
+ }
221
+ .btn.text {
222
+ background: transparent;
223
+ border-color: transparent;
224
+ color: var(--muted);
225
+ }
226
+ .btn.small {
227
+ min-height: 29px;
228
+ padding: 4px 9px;
229
+ font-size: 12px;
230
+ }
231
+ .workspace {
232
+ display: grid;
233
+ grid-template-columns: 211px minmax(0,1fr);
234
+ background: var(--paper);
235
+ border: 1px solid #d5e0e6;
236
+ border-radius: 12px;
237
+ overflow: hidden;
238
+ min-height: 642px;
239
+ }
240
+ .sidebar {
241
+ background: #f6f9fa;
242
+ border-right: 1px solid var(--line);
243
+ padding: 19px 13px;
244
+ display: flex;
245
+ flex-direction: column;
246
+ }
247
+ .source {
248
+ padding: 0 9px 19px;
249
+ border-bottom: 1px solid var(--line);
250
+ }
251
+ .source-head {
252
+ display: flex;
253
+ align-items: center;
254
+ gap: 9px;
255
+ font-size: 13px;
256
+ font-weight: 600;
257
+ padding: 0;
258
+ text-align: left;
259
+ width: 100%;
260
+ min-height: 30px;
261
+ }
262
+ .source-head svg {
263
+ color: var(--navy);
264
+ }
265
+ .source-note {
266
+ font-size: 11px;
267
+ color: var(--muted);
268
+ margin: 5px 0 0 27px;
269
+ display: flex;
270
+ align-items: center;
271
+ gap: 5px;
272
+ }
273
+ .sidebar-label {
274
+ display: flex;
275
+ justify-content: space-between;
276
+ margin: 22px 10px 10px;
277
+ font-size: 11px;
278
+ color: var(--muted);
279
+ }
280
+ .table-button {
281
+ display: flex;
282
+ align-items: center;
283
+ width: 100%;
284
+ padding: 11px 10px;
285
+ gap: 9px;
286
+ border-radius: 7px;
287
+ text-align: left;
288
+ margin: 3px 0;
289
+ color: #5a707c;
290
+ }
291
+ .table-button .count {
292
+ margin-left: auto;
293
+ font-size: 11px;
294
+ color: #607580;
295
+ font-variant-numeric: tabular-nums;
296
+ }
297
+ .table-button.active {
298
+ background: #e1eee9;
299
+ color: #1a6555;
300
+ }
301
+ .table-button.active .count {
302
+ color: #438571;
303
+ }
304
+ .table-button:hover {
305
+ background: #ebf1f3;
306
+ }
307
+ .table-button.active:hover {
308
+ background: #dcece4;
309
+ }
310
+ .table-button .table-name {
311
+ font-family: var(--mono);
312
+ font-size: 12px;
313
+ }
314
+ .table-button .icon {
315
+ width: 16px;
316
+ height: 16px;
317
+ }
318
+ .side-spacer {
319
+ flex: 1;
320
+ min-height: 45px;
321
+ }
322
+ .side-note {
323
+ margin: 15px 9px 0;
324
+ padding-top: 15px;
325
+ border-top: 1px solid var(--line);
326
+ font-size: 11px;
327
+ line-height: 1.9;
328
+ color: var(--muted);
329
+ }
330
+ .side-note strong {
331
+ font-weight: 500;
332
+ color: #365968;
333
+ display: block;
334
+ }
335
+ .side-tools {
336
+ display: flex;
337
+ flex-direction: column;
338
+ gap: 3px;
339
+ }
340
+ .side-tools button {
341
+ display: flex;
342
+ align-items: center;
343
+ gap: 9px;
344
+ text-align: left;
345
+ padding: 9px 10px;
346
+ font-size: 12px;
347
+ color: var(--muted);
348
+ }
349
+ .side-tools button:hover {
350
+ color: var(--teal);
351
+ }
352
+ .main {
353
+ min-width: 0;
354
+ }
355
+ .table-heading {
356
+ display: flex;
357
+ align-items: center;
358
+ justify-content: space-between;
359
+ gap: 16px;
360
+ padding: 24px 27px 20px;
361
+ }
362
+ .table-title {
363
+ display: flex;
364
+ align-items: center;
365
+ gap: 9px;
366
+ }
367
+ .table-title h2 {
368
+ font-size: 19px;
369
+ font-weight: 600;
370
+ line-height: 1.3;
371
+ margin: 0;
372
+ font-family: var(--mono);
373
+ letter-spacing: -.3px;
374
+ overflow-wrap: anywhere;
375
+ }
376
+ .table-title .desc {
377
+ font-size: 12px;
378
+ color: var(--muted);
379
+ padding-left: 7px;
380
+ border-left: 1px solid var(--line);
381
+ margin-left: 3px;
382
+ }
383
+ .count-setting {
384
+ display: flex;
385
+ align-items: center;
386
+ gap: 8px;
387
+ font-size: 12px;
388
+ color: var(--muted);
389
+ }
390
+ .count-setting input {
391
+ width: 72px;
392
+ height: 31px;
393
+ border: 1px solid var(--line);
394
+ border-radius: 5px;
395
+ color: var(--ink);
396
+ background: #fafcfc;
397
+ text-align: right;
398
+ padding: 4px 9px;
399
+ font-family: var(--mono);
400
+ font-size: 12px;
401
+ }
402
+ .count-setting span:last-child {
403
+ color: #617682;
404
+ }
405
+ .viewbar {
406
+ display: flex;
407
+ align-items: center;
408
+ justify-content: space-between;
409
+ padding: 0 27px;
410
+ border-bottom: 1px solid var(--line);
411
+ gap: 12px;
412
+ }
413
+ .tabs {
414
+ display: flex;
415
+ align-items: stretch;
416
+ gap: 24px;
417
+ height: 40px;
418
+ }
419
+ .tabs button {
420
+ font-size: 12px;
421
+ color: var(--muted);
422
+ padding: 0;
423
+ border-bottom: 2px solid transparent;
424
+ }
425
+ .tabs button.active {
426
+ color: var(--ink);
427
+ font-weight: 600;
428
+ border-color: var(--teal);
429
+ }
430
+ .search {
431
+ display: flex;
432
+ align-items: center;
433
+ gap: 6px;
434
+ font-size: 11px;
435
+ color: #617682;
436
+ padding: 4px 8px;
437
+ border: 1px solid #cedbe1;
438
+ border-radius: 8px;
439
+ background: #fff;
440
+ min-height: 30px;
441
+ margin-bottom: 4px;
442
+ transition: border-color .15s,box-shadow .15s;
443
+ }
444
+ .search .icon {
445
+ width: 14px;
446
+ height: 14px;
447
+ }
448
+ .search input {
449
+ width: 112px;
450
+ border: 0;
451
+ background: transparent;
452
+ font-size: 11px;
453
+ outline-offset: 0;
454
+ color: var(--ink);
455
+ min-width: 0;
456
+ padding: 0;
457
+ border-radius: 5px;
458
+ }
459
+ .sample-guide {
460
+ display: flex;
461
+ align-items: center;
462
+ justify-content: space-between;
463
+ padding: 15px 27px 11px;
464
+ font-size: 11px;
465
+ color: var(--muted);
466
+ }
467
+ .sample-guide .guide-right {
468
+ display: flex;
469
+ align-items: center;
470
+ gap: 6px;
471
+ color: #617682;
472
+ }
473
+ .sample-guide .guide-right .icon {
474
+ width: 13px;
475
+ height: 13px;
476
+ }
477
+ .field-table {
478
+ width: 100%;
479
+ border-collapse: collapse;
480
+ table-layout: fixed;
481
+ }
482
+ .field-table col.col-field {
483
+ width: 22%;
484
+ }
485
+ .field-table col.col-rule {
486
+ width: 30%;
487
+ }
488
+ .field-table col.col-sample {
489
+ width: 16%;
490
+ }
491
+ .field-table thead {
492
+ background: #f7f9fa;
493
+ color: #59737f;
494
+ font-size: 11px;
495
+ text-align: left;
496
+ }
497
+ .field-table th {
498
+ height: 30px;
499
+ font-weight: 500;
500
+ padding: 0 10px;
501
+ }
502
+ .field-table th:first-child {
503
+ padding-left: 27px;
504
+ }
505
+ .field-table td {
506
+ border-bottom: 1px solid #edf1f3;
507
+ padding: 12px 10px;
508
+ vertical-align: middle;
509
+ height: 61px;
510
+ }
511
+ .field-table td:first-child {
512
+ padding-left: 27px;
513
+ }
514
+ .field-table tbody tr {
515
+ cursor: pointer;
516
+ }
517
+ .field-table tbody tr:hover {
518
+ background: #f8fbfc;
519
+ }
520
+ .field-table tbody tr.selected {
521
+ background: #f0f8f4;
522
+ }
523
+ .field-table tbody tr.selected td:first-child {
524
+ box-shadow: inset 3px 0 var(--teal);
525
+ }
526
+ .field-name {
527
+ display: block;
528
+ font-family: var(--mono);
529
+ font-size: 12px;
530
+ color: var(--ink);
531
+ background: transparent;
532
+ padding: 0;
533
+ text-align: left;
534
+ max-width: 100%;
535
+ }
536
+ .field-name:hover {
537
+ text-decoration: underline;
538
+ text-underline-offset: 4px;
539
+ }
540
+ .field-type {
541
+ font-size: 11px;
542
+ color: #59737f;
543
+ margin-top: 2px;
544
+ display: block;
545
+ }
546
+ .rule-line {
547
+ display: flex;
548
+ align-items: center;
549
+ gap: 6px;
550
+ font-size: 12px;
551
+ color: #36535f;
552
+ white-space: normal;
553
+ }
554
+ .rule-line .icon {
555
+ width: 14px;
556
+ height: 14px;
557
+ color: #699987;
558
+ }
559
+ .rule-meta {
560
+ display: block;
561
+ color: #59737f;
562
+ font-size: 11px;
563
+ margin-top: 2px;
564
+ }
565
+ .sample {
566
+ display: block;
567
+ max-width: 100%;
568
+ font-family: var(--mono);
569
+ font-size: 12px;
570
+ line-height: 1.4;
571
+ white-space: nowrap;
572
+ overflow: hidden;
573
+ text-overflow: ellipsis;
574
+ }
575
+ .sample.placeholder {
576
+ font-family: inherit;
577
+ color: #647986;
578
+ font-size: 11px;
579
+ }
580
+ .sample.state {
581
+ display: inline-flex;
582
+ align-items: center;
583
+ gap: 5px;
584
+ font-family: inherit;
585
+ font-size: 11px;
586
+ }
587
+ .sample.state:before {
588
+ content: "";
589
+ width: 4px;
590
+ height: 4px;
591
+ background: currentColor;
592
+ border-radius: 50%;
593
+ }
594
+ .sample.state.paid {
595
+ color: #157260;
596
+ }
597
+ .sample.state.pending {
598
+ color: #8b6519;
599
+ }
600
+ .sample.state.shipped {
601
+ color: #4869a4;
602
+ }
603
+ .sample.state.cancelled {
604
+ color: #8e7884;
605
+ }
606
+ .sample.date {
607
+ font-size: 11px;
608
+ letter-spacing: -.3px;
609
+ }
610
+ .sample.null {
611
+ font-size: 10px;
612
+ color: #647986;
613
+ }
614
+ .sample-flash {
615
+ animation: sample-flash .65s ease-out;
616
+ }
617
+ @keyframes sample-flash {
618
+ from {
619
+ background: #d0e8db;
620
+ }
621
+ to {
622
+ background: transparent;
623
+ }
624
+ }
625
+ .detail {
626
+ margin: 19px 27px 21px;
627
+ border-top: 1px solid #dce7e3;
628
+ padding-top: 15px;
629
+ }
630
+ .detail-title {
631
+ display: flex;
632
+ align-items: center;
633
+ justify-content: space-between;
634
+ gap: 12px;
635
+ margin-bottom: 13px;
636
+ }
637
+ .detail-title-left {
638
+ display: flex;
639
+ align-items: center;
640
+ gap: 7px;
641
+ font-size: 12px;
642
+ font-weight: 550;
643
+ }
644
+ .detail-title-left svg {
645
+ width: 15px;
646
+ height: 15px;
647
+ color: var(--teal);
648
+ }
649
+ .detail-title-left .muted {
650
+ font-size: 11px;
651
+ font-weight: 400;
652
+ margin-left: 5px;
653
+ }
654
+ .relation {
655
+ display: grid;
656
+ grid-template-columns: 1fr auto 1fr;
657
+ gap: 14px;
658
+ align-items: center;
659
+ }
660
+ .relation-node {
661
+ padding: 11px 13px;
662
+ border: 1px solid #dfe8e5;
663
+ background: #f9fcfa;
664
+ border-radius: 6px;
665
+ min-width: 0;
666
+ }
667
+ .relation-node .node-name {
668
+ font-family: var(--mono);
669
+ font-size: 11px;
670
+ color: #386356;
671
+ }
672
+ .relation-node .node-label {
673
+ font-size: 10px;
674
+ color: #5d7568;
675
+ margin-left: 8px;
676
+ }
677
+ .relation-values {
678
+ display: flex;
679
+ justify-content: space-between;
680
+ gap: 10px;
681
+ margin-top: 8px;
682
+ font-family: var(--mono);
683
+ font-size: 12px;
684
+ }
685
+ .relation-values span {
686
+ color: #31564b;
687
+ }
688
+ .relation-values small {
689
+ font-size: 11px;
690
+ font-family: "PingFang SC",sans-serif;
691
+ color: #779087;
692
+ margin-left: 5px;
693
+ }
694
+ .relation-arrow {
695
+ display: flex;
696
+ align-items: center;
697
+ gap: 5px;
698
+ font-size: 10px;
699
+ color: #5d7568;
700
+ }
701
+ .relation-arrow svg {
702
+ width: 28px;
703
+ }
704
+ .detail-note {
705
+ font-size: 11px;
706
+ color: #5d7568;
707
+ margin-top: 10px;
708
+ line-height: 1.65;
709
+ }
710
+ .detail-generic {
711
+ display: flex;
712
+ align-items: center;
713
+ gap: 18px;
714
+ }
715
+ .detail-generic .description {
716
+ font-size: 12px;
717
+ color: var(--muted);
718
+ flex: 1;
719
+ }
720
+ .detail-generic .example {
721
+ font-family: var(--mono);
722
+ color: var(--teal);
723
+ font-size: 14px;
724
+ }
725
+ .statusbar {
726
+ display: flex;
727
+ justify-content: space-between;
728
+ gap: 16px;
729
+ padding: 12px 27px;
730
+ border-top: 1px solid var(--line);
731
+ font-size: 10px;
732
+ color: #617682;
733
+ background: #fbfcfd;
734
+ }
735
+ .statusbar span {
736
+ display: flex;
737
+ align-items: center;
738
+ gap: 6px;
739
+ }
740
+ .status-dot {
741
+ height: 5px;
742
+ width: 5px;
743
+ background: #649886;
744
+ border-radius: 50%;
745
+ }
746
+ .page-note {
747
+ display: flex;
748
+ justify-content: space-between;
749
+ gap: 16px;
750
+ color: #617682;
751
+ font-size: 11px;
752
+ margin: 15px 2px 0;
753
+ }
754
+ .page-note span:first-child {
755
+ max-width: 74%;
756
+ }
757
+ .panel-content {
758
+ padding: 24px 27px;
759
+ min-height: 424px;
760
+ }
761
+ .panel-content h3 {
762
+ margin: 0 0 8px;
763
+ font-size: 16px;
764
+ }
765
+ .panel-content p {
766
+ color: var(--muted);
767
+ font-size: 12px;
768
+ }
769
+ .json {
770
+ background: #f5f9fa;
771
+ border: 1px solid var(--line);
772
+ border-radius: 7px;
773
+ padding: 18px;
774
+ font: 12px/1.8 var(--mono);
775
+ overflow: auto;
776
+ max-height: 450px;
777
+ white-space: pre;
778
+ }
779
+ .relationship-list {
780
+ display: grid;
781
+ gap: 18px;
782
+ margin-top: 25px;
783
+ }
784
+ .relationship-line {
785
+ display: flex;
786
+ gap: 20px;
787
+ align-items: center;
788
+ padding: 16px 0;
789
+ border-bottom: 1px solid var(--line);
790
+ font: 12px var(--mono);
791
+ }
792
+ .relationship-line .icon {
793
+ color: var(--teal);
794
+ }
795
+ .relationship-line small {
796
+ font: 11px "PingFang SC",sans-serif;
797
+ color: var(--muted);
798
+ margin-left: auto;
799
+ }
800
+ .overlay {
801
+ position: fixed;
802
+ inset: 0;
803
+ background: rgba(25,52,65,.2);
804
+ display: none;
805
+ z-index: 20;
806
+ }
807
+ .overlay.open {
808
+ display: block;
809
+ }
810
+ .drawer {
811
+ position: absolute;
812
+ right: 0;
813
+ top: 0;
814
+ bottom: 0;
815
+ width: min(390px,100%);
816
+ background: #fff;
817
+ box-shadow: -15px 0 60px #19344114;
818
+ padding: 29px;
819
+ display: flex;
820
+ flex-direction: column;
821
+ animation: drawer-in .2s ease-out;
822
+ }
823
+ .drawer-head {
824
+ display: flex;
825
+ justify-content: space-between;
826
+ align-items: center;
827
+ margin-bottom: 8px;
828
+ }
829
+ .drawer-head h2 {
830
+ font: 600 17px var(--mono);
831
+ margin: 0;
832
+ overflow-wrap: anywhere;
833
+ }
834
+ .close {
835
+ font-size: 21px;
836
+ color: var(--muted);
837
+ width: 32px;
838
+ height: 32px;
839
+ }
840
+ .drawer-subtitle {
841
+ font-size: 12px;
842
+ color: var(--muted);
843
+ margin-bottom: 18px;
844
+ }
845
+ .control {
846
+ display: block;
847
+ font-size: 12px;
848
+ margin: 20px 0;
849
+ color: var(--muted);
850
+ }
851
+ .control input {
852
+ display: block;
853
+ width: 100%;
854
+ padding: 10px 11px;
855
+ border: 1px solid #cddbe1;
856
+ border-radius: 6px;
857
+ margin-top: 8px;
858
+ color: var(--ink);
859
+ }
860
+ .input-pair {
861
+ display: grid;
862
+ grid-template-columns: 1fr 1fr;
863
+ gap: 12px;
864
+ }
865
+ .segmented {
866
+ display: flex;
867
+ padding: 3px;
868
+ background: #f0f5f6;
869
+ border-radius: 7px;
870
+ gap: 3px;
871
+ margin-top: 8px;
872
+ }
873
+ .segmented button {
874
+ font-size: 12px;
875
+ flex: 1;
876
+ padding: 8px 4px;
877
+ border-radius: 5px;
878
+ color: var(--muted);
879
+ }
880
+ .segmented button.active {
881
+ background: #fff;
882
+ color: var(--ink);
883
+ box-shadow: 0 1px 3px #19344115;
884
+ }
885
+ .drawer-help {
886
+ font-size: 12px;
887
+ color: var(--muted);
888
+ line-height: 1.9;
889
+ background: #f5f9f7;
890
+ padding: 13px;
891
+ border-radius: 6px;
892
+ }
893
+ .drawer-footer {
894
+ margin-top: auto;
895
+ display: flex;
896
+ gap: 8px;
897
+ padding-top: 24px;
898
+ flex-shrink: 0;
899
+ }
900
+ .drawer-footer .btn {
901
+ flex: 1;
902
+ }
903
+ .modal {
904
+ position: absolute;
905
+ top: 50%;
906
+ left: 50%;
907
+ transform: translate(-50%,-50%);
908
+ width: min(520px,calc(100% - 36px));
909
+ padding: 28px;
910
+ background: #fff;
911
+ border-radius: 13px;
912
+ box-shadow: 0 25px 100px #19344124;
913
+ }
914
+ .modal-head {
915
+ display: flex;
916
+ align-items: center;
917
+ justify-content: space-between;
918
+ }
919
+ .modal h2 {
920
+ font-size: 20px;
921
+ margin: 0;
922
+ }
923
+ .modal p {
924
+ font-size: 13px;
925
+ color: var(--muted);
926
+ }
927
+ .summary-table {
928
+ width: 100%;
929
+ border-collapse: collapse;
930
+ margin: 18px 0;
931
+ font-size: 13px;
932
+ }
933
+ .summary-table td {
934
+ padding: 11px 0;
935
+ border-bottom: 1px solid var(--line);
936
+ }
937
+ .summary-table td:last-child {
938
+ text-align: right;
939
+ font-family: var(--mono);
940
+ }
941
+ .modal-note {
942
+ padding: 12px 14px;
943
+ background: #eef5f7;
944
+ color: #52717f;
945
+ font-size: 12px;
946
+ border-radius: 6px;
947
+ }
948
+ .modal-footer {
949
+ display: flex;
950
+ justify-content: flex-end;
951
+ margin-top: 20px;
952
+ }
953
+ .toast {
954
+ position: fixed;
955
+ bottom: 24px;
956
+ left: 50%;
957
+ transform: translateX(-50%) translateY(12px);
958
+ background: var(--ink);
959
+ color: #fff;
960
+ padding: 11px 18px;
961
+ font-size: 12px;
962
+ border-radius: 8px;
963
+ opacity: 0;
964
+ pointer-events: none;
965
+ transition: opacity .18s,transform .18s;
966
+ z-index: 40;
967
+ box-shadow: 0 5px 20px #19344124;
968
+ }
969
+ .toast.visible {
970
+ opacity: 1;
971
+ transform: translateX(-50%) translateY(0);
972
+ }
973
+ .empty {
974
+ padding: 50px;
975
+ text-align: center;
976
+ color: var(--muted);
977
+ font-size: 13px;
978
+ }
979
+ .inline-count {
980
+ font-family: var(--mono);
981
+ font-size: 11px;
982
+ color: var(--teal);
983
+ }
984
+ @keyframes drawer-in {
985
+ from {
986
+ transform: translateX(100%);
987
+ }
988
+ to {
989
+ transform: translateX(0);
990
+ }
991
+ }
992
+ @media(min-width:1380px) {
993
+ .page {
994
+ padding-top: 35px;
995
+ }
996
+ .workspace {
997
+ grid-template-columns: 231px minmax(0,1fr);
998
+ }
999
+ .field-table td {
1000
+ height: 67px;
1001
+ }
1002
+ .sample {
1003
+ font-size: 13px;
1004
+ }
1005
+ .field-name {
1006
+ font-size: 13px;
1007
+ }
1008
+ .sample.date {
1009
+ font-size: 11px;
1010
+ }
1011
+ .detail {
1012
+ margin-top: 23px;
1013
+ margin-bottom: 25px;
1014
+ }
1015
+ .table-heading {
1016
+ padding-top: 27px;
1017
+ padding-bottom: 24px;
1018
+ }
1019
+ }
1020
+ @media(max-width:1000px) {
1021
+ .top {
1022
+ gap: 30px;
1023
+ padding: 0 20px;
1024
+ }
1025
+ .nav {
1026
+ gap: 22px;
1027
+ }
1028
+ .page {
1029
+ padding: 22px 20px;
1030
+ }
1031
+ .workspace {
1032
+ grid-template-columns: 172px minmax(0,1fr);
1033
+ }
1034
+ .sidebar {
1035
+ padding-left: 9px;
1036
+ padding-right: 9px;
1037
+ }
1038
+ .table-heading,.sample-guide,.panel-content {
1039
+ padding-left: 20px;
1040
+ padding-right: 20px;
1041
+ }
1042
+ .viewbar {
1043
+ padding: 0 20px;
1044
+ }
1045
+ .field-table th:first-child,.field-table td:first-child {
1046
+ padding-left: 20px;
1047
+ }
1048
+ .field-table .sample-third {
1049
+ display: none;
1050
+ }
1051
+ .field-table col.col-field {
1052
+ width: 26%;
1053
+ }
1054
+ .field-table col.col-rule {
1055
+ width: 34%;
1056
+ }
1057
+ .field-table col.col-sample {
1058
+ width: 20%;
1059
+ }
1060
+ .field-table col.col-third {
1061
+ width: 0;
1062
+ }
1063
+ .detail {
1064
+ margin-left: 20px;
1065
+ margin-right: 20px;
1066
+ }
1067
+ .relation-values {
1068
+ gap: 10px;
1069
+ }
1070
+ .relation-values small {
1071
+ display: block;
1072
+ margin: 3px 0 0;
1073
+ }
1074
+ .heading-actions {
1075
+ gap: 6px;
1076
+ }
1077
+ .top-end .mode-note {
1078
+ display: none;
1079
+ }
1080
+ .search input {
1081
+ width: 86px;
1082
+ }
1083
+ }
1084
+ @media(max-width:760px) {
1085
+ .top {
1086
+ height: 58px;
1087
+ gap: 22px;
1088
+ padding: 0 15px;
1089
+ }
1090
+ .brand {
1091
+ font-size: 21px;
1092
+ }
1093
+ .nav {
1094
+ gap: 15px;
1095
+ }
1096
+ .nav button {
1097
+ font-size: 12px;
1098
+ }
1099
+ .top-end {
1100
+ gap: 0;
1101
+ }
1102
+ .avatar,.mode-note {
1103
+ display: none;
1104
+ }
1105
+ .prototype-tag {
1106
+ font-size: 10px;
1107
+ }
1108
+ .page {
1109
+ padding: 20px 12px;
1110
+ }
1111
+ .heading {
1112
+ display: block;
1113
+ margin-bottom: 18px;
1114
+ }
1115
+ .heading-actions {
1116
+ padding-top: 16px;
1117
+ }
1118
+ .heading-actions .btn {
1119
+ flex: 1;
1120
+ }
1121
+ .subtitle {
1122
+ font-size: 12px;
1123
+ }
1124
+ h1 {
1125
+ font-size: 24px;
1126
+ }
1127
+ .workspace {
1128
+ display: block;
1129
+ }
1130
+ .sidebar {
1131
+ display: block;
1132
+ border-right: 0;
1133
+ border-bottom: 1px solid var(--line);
1134
+ padding: 10px 12px;
1135
+ }
1136
+ .source {
1137
+ display: none;
1138
+ }
1139
+ .sidebar-label,.side-spacer,.side-tools,.side-note {
1140
+ display: none;
1141
+ }
1142
+ .tables {
1143
+ display: flex;
1144
+ gap: 7px;
1145
+ }
1146
+ .table-button {
1147
+ padding: 8px 10px;
1148
+ flex: 1;
1149
+ width: auto;
1150
+ }
1151
+ .table-button .count {
1152
+ display: none;
1153
+ }
1154
+ .table-heading {
1155
+ padding: 19px 15px 12px;
1156
+ }
1157
+ .viewbar {
1158
+ padding: 0 15px;
1159
+ }
1160
+ .table-title .desc {
1161
+ display: none;
1162
+ }
1163
+ .sample-guide {
1164
+ padding: 13px 15px 10px;
1165
+ }
1166
+ .guide-right {
1167
+ display: none!important;
1168
+ }
1169
+ .field-table th:first-child,.field-table td:first-child {
1170
+ padding-left: 15px;
1171
+ }
1172
+ .field-table .sample-second {
1173
+ display: none;
1174
+ }
1175
+ .field-table col.col-field {
1176
+ width: 31%;
1177
+ }
1178
+ .field-table col.col-rule {
1179
+ width: 39%;
1180
+ }
1181
+ .field-table col.col-sample {
1182
+ width: 30%;
1183
+ }
1184
+ .field-table col.col-third,.field-table col.col-second {
1185
+ width: 0;
1186
+ }
1187
+ .field-table td {
1188
+ padding: 12px 8px;
1189
+ }
1190
+ .field-name {
1191
+ font-size: 11px;
1192
+ }
1193
+ .rule-line {
1194
+ font-size: 11px;
1195
+ white-space: normal;
1196
+ }
1197
+ .sample {
1198
+ font-size: 11px;
1199
+ }
1200
+ .sample.date {
1201
+ font-size: 10px;
1202
+ }
1203
+ .detail {
1204
+ margin: 15px;
1205
+ }
1206
+ .detail-title-left .muted {
1207
+ display: none;
1208
+ }
1209
+ .relation {
1210
+ gap: 8px;
1211
+ }
1212
+ .relation-node {
1213
+ padding: 9px;
1214
+ }
1215
+ .relation-node .node-label {
1216
+ display: none;
1217
+ }
1218
+ .relation-values {
1219
+ gap: 8px;
1220
+ font-size: 11px;
1221
+ }
1222
+ .relation-values span:nth-child(n+2) {
1223
+ display: none;
1224
+ }
1225
+ .relation-arrow {
1226
+ font-size: 0;
1227
+ }
1228
+ .statusbar {
1229
+ padding: 11px 15px;
1230
+ }
1231
+ .statusbar>span:last-child {
1232
+ display: none;
1233
+ }
1234
+ .page-note {
1235
+ font-size: 10px;
1236
+ }
1237
+ .page-note span:last-child {
1238
+ display: none;
1239
+ }
1240
+ .page-note span:first-child {
1241
+ max-width: 100%;
1242
+ }
1243
+ .search {
1244
+ display: none;
1245
+ }
1246
+ .panel-content {
1247
+ padding: 18px 15px;
1248
+ }
1249
+ .relationship-line {
1250
+ font-size: 10px;
1251
+ gap: 8px;
1252
+ }
1253
+ .relationship-line small {
1254
+ display: none;
1255
+ }
1256
+ }
1257
+ @media(min-width:761px) and (max-width:1379px) {
1258
+ .top {
1259
+ height: 58px;
1260
+ }
1261
+ .page {
1262
+ padding-top: 20px;
1263
+ }
1264
+ .crumb {
1265
+ display: none;
1266
+ }
1267
+ .heading {
1268
+ margin-bottom: 18px;
1269
+ }
1270
+ .heading-actions {
1271
+ padding-top: 5px;
1272
+ }
1273
+ h1 {
1274
+ font-size: 25px;
1275
+ }
1276
+ .subtitle {
1277
+ margin-top: 6px;
1278
+ }
1279
+ .workspace {
1280
+ min-height: 0;
1281
+ }
1282
+ .table-heading {
1283
+ padding-top: 14px;
1284
+ padding-bottom: 14px;
1285
+ }
1286
+ .tabs {
1287
+ height: 35px;
1288
+ }
1289
+ .sample-guide {
1290
+ padding-top: 9px;
1291
+ padding-bottom: 7px;
1292
+ }
1293
+ .field-table th {
1294
+ height: 26px;
1295
+ }
1296
+ .field-table td {
1297
+ height: 47px;
1298
+ padding-top: 6px;
1299
+ padding-bottom: 6px;
1300
+ line-height: 1.3;
1301
+ }
1302
+ .detail {
1303
+ margin-top: 13px;
1304
+ margin-bottom: 12px;
1305
+ padding-top: 12px;
1306
+ }
1307
+ .detail-title {
1308
+ margin-bottom: 9px;
1309
+ }
1310
+ .relation-node {
1311
+ padding-top: 9px;
1312
+ padding-bottom: 9px;
1313
+ }
1314
+ .relation-values {
1315
+ margin-top: 6px;
1316
+ }
1317
+ .detail-note {
1318
+ margin-top: 8px;
1319
+ }
1320
+ .statusbar {
1321
+ padding-top: 8px;
1322
+ padding-bottom: 8px;
1323
+ }
1324
+ .page-note {
1325
+ margin-top: 11px;
1326
+ }
1327
+ }
1328
+ @media(max-width:480px) {
1329
+ .heading-actions .icon {
1330
+ display: none;
1331
+ }
1332
+ .heading-actions .btn {
1333
+ padding-left: 8px;
1334
+ padding-right: 8px;
1335
+ font-size: 11px;
1336
+ }
1337
+ }
1338
+ @media(max-width:600px) {
1339
+ .top { display:grid; grid-template-columns:minmax(0,1fr) auto; height:auto; gap:0 12px; padding:0 15px; }
1340
+ .top .brand,.top .top-end { min-height:54px; }
1341
+ .top .brand { grid-column:1; grid-row:1; }
1342
+ .top .top-end { grid-column:2; grid-row:1; }
1343
+ .top .nav { display:flex; grid-column:1 / -1; grid-row:2; height:42px; gap:0; border-top:1px solid var(--line); }
1344
+ .top .nav button { flex:1; padding:8px; white-space:nowrap; }
1345
+ }
1346
+ @media(prefers-reduced-motion:reduce) {
1347
+ *,*:before,*:after {
1348
+ animation: none!important;
1349
+ transition: none!important;
1350
+ scroll-behavior: auto!important;
1351
+ }
1352
+ }
1353
+ [hidden] {
1354
+ display: none !important;
1355
+ }
1356
+ .title-button {
1357
+ display: flex;
1358
+ align-items: center;
1359
+ gap: 10px;
1360
+ font: inherit;
1361
+ letter-spacing: inherit;
1362
+ padding: 0;
1363
+ text-align: left;
1364
+ }
1365
+ .title-button .icon {
1366
+ width: 15px;
1367
+ height: 15px;
1368
+ color: var(--muted);
1369
+ }
1370
+ .title-button:hover {
1371
+ color: var(--teal);
1372
+ }
1373
+ .source-head:hover {
1374
+ color: var(--teal);
1375
+ }
1376
+ .source-head span {
1377
+ overflow: hidden;
1378
+ text-overflow: ellipsis;
1379
+ white-space: nowrap;
1380
+ max-width: 135px;
1381
+ }
1382
+ .selection-actions {
1383
+ display: flex;
1384
+ gap: 12px;
1385
+ padding: 0 10px 5px;
1386
+ }
1387
+ .selection-actions button {
1388
+ padding: 0;
1389
+ font-size: 11px;
1390
+ color: var(--muted);
1391
+ min-height: 26px;
1392
+ }
1393
+ .selection-actions button:hover {
1394
+ text-decoration: underline;
1395
+ }
1396
+ .table-entry {
1397
+ display: flex;
1398
+ align-items: center;
1399
+ margin: 4px 0;
1400
+ padding-left: 9px;
1401
+ gap: 4px;
1402
+ border-radius: 7px;
1403
+ }
1404
+ .table-entry.active {
1405
+ background: #e1eee9;
1406
+ }
1407
+ .table-entry input {
1408
+ accent-color: var(--teal);
1409
+ width: 14px;
1410
+ height: 14px;
1411
+ flex-shrink: 0;
1412
+ cursor: pointer;
1413
+ margin: 0;
1414
+ }
1415
+ .table-entry .table-button {
1416
+ margin: 0;
1417
+ gap: 5px;
1418
+ min-width: 0;
1419
+ padding: 10px 8px;
1420
+ background: none;
1421
+ flex: 1;
1422
+ }
1423
+ .table-entry.active .table-button {
1424
+ color: var(--teal);
1425
+ }
1426
+ .table-entry:hover {
1427
+ background: #ebf1f3;
1428
+ }
1429
+ .table-entry.active:hover {
1430
+ background: #dcece4;
1431
+ }
1432
+ .table-entry .table-name {
1433
+ font-size: 11px;
1434
+ }
1435
+ .table-entry .count {
1436
+ font-size: 10px;
1437
+ white-space: nowrap;
1438
+ }
1439
+ .scope-summary {
1440
+ margin: 15px 9px;
1441
+ padding: 12px 0;
1442
+ border-top: 1px solid var(--line);
1443
+ font-size: 10px;
1444
+ line-height: 1.9;
1445
+ color: var(--muted);
1446
+ }
1447
+ .scope-summary strong {
1448
+ display: block;
1449
+ font-weight: 500;
1450
+ }
1451
+ .dependency-ok {
1452
+ color: #1b705d;
1453
+ }
1454
+ .needs-attention {
1455
+ color: #9b5a18;
1456
+ }
1457
+ .table-actions {
1458
+ display: flex;
1459
+ align-items: center;
1460
+ gap: 10px;
1461
+ }
1462
+ .view-only-note {
1463
+ margin: 12px 27px 0;
1464
+ padding: 8px 11px;
1465
+ border-radius: 5px;
1466
+ font-size: 11px;
1467
+ color: #536e7b;
1468
+ background: #f0f5f7;
1469
+ }
1470
+ .panel-heading {
1471
+ display: flex;
1472
+ align-items: flex-start;
1473
+ justify-content: space-between;
1474
+ gap: 15px;
1475
+ }
1476
+ .panel-heading p {
1477
+ margin: 6px 0 0;
1478
+ }
1479
+ .panel-content h4,.modal h4 {
1480
+ font-size: 12px;
1481
+ font-weight: 600;
1482
+ margin: 23px 0 9px;
1483
+ }
1484
+ .dependency-line {
1485
+ display: flex;
1486
+ align-items: center;
1487
+ justify-content: space-between;
1488
+ gap: 12px;
1489
+ border-bottom: 1px solid var(--line);
1490
+ padding: 13px 0;
1491
+ }
1492
+ .dependency-path {
1493
+ display: flex;
1494
+ align-items: center;
1495
+ gap: 13px;
1496
+ font-size: 12px;
1497
+ min-width: 0;
1498
+ flex-wrap: wrap;
1499
+ }
1500
+ .dependency-path .icon {
1501
+ width: 21px;
1502
+ color: var(--teal);
1503
+ }
1504
+ .path-node {
1505
+ padding: 5px 8px;
1506
+ border-radius: 4px;
1507
+ background: #f1f6f4;
1508
+ font: 12px var(--mono);
1509
+ color: #285d4e;
1510
+ }
1511
+ .path-node:hover {
1512
+ background: #dfede5;
1513
+ }
1514
+ .relation-note {
1515
+ font-size: 11px;
1516
+ white-space: nowrap;
1517
+ color: var(--muted);
1518
+ }
1519
+ .relation-note.needs-attention {
1520
+ color: #9b5a18;
1521
+ }
1522
+ .relation-empty {
1523
+ font-size: 12px;
1524
+ padding: 4px 0;
1525
+ color: var(--muted);
1526
+ }
1527
+ .ai-explanation {
1528
+ margin-top: 25px;
1529
+ padding: 12px 14px;
1530
+ background: #f4f7fa;
1531
+ border-radius: 6px;
1532
+ font-size: 12px;
1533
+ }
1534
+ .ai-explanation summary {
1535
+ cursor: pointer;
1536
+ color: #435f70;
1537
+ }
1538
+ .ai-explanation p {
1539
+ line-height: 1.9;
1540
+ }
1541
+ .scenario-control {
1542
+ display: flex;
1543
+ align-items: center;
1544
+ gap: 10px;
1545
+ font-size: 11px;
1546
+ color: var(--muted);
1547
+ }
1548
+ select {
1549
+ font: inherit;
1550
+ color: var(--ink);
1551
+ background: #fff;
1552
+ border: 1px solid #cbd9df;
1553
+ padding: 7px 9px;
1554
+ border-radius: 5px;
1555
+ }
1556
+ select:focus-visible {
1557
+ outline: 3px solid #74b7c9;
1558
+ outline-offset: 3px;
1559
+ }
1560
+ .schema-graph {
1561
+ display: block;
1562
+ width: 100%;
1563
+ height: auto;
1564
+ margin-top: 8px;
1565
+ }
1566
+ .graph-legend {
1567
+ display: flex;
1568
+ gap: 20px;
1569
+ margin-top: 19px;
1570
+ font-size: 11px;
1571
+ color: var(--muted);
1572
+ }
1573
+ .graph-legend span {
1574
+ display: flex;
1575
+ align-items: center;
1576
+ gap: 7px;
1577
+ }
1578
+ .legend-dot {
1579
+ width: 8px;
1580
+ height: 8px;
1581
+ border-radius: 2px;
1582
+ }
1583
+ .legend-dot.chosen {
1584
+ background: #85b79e;
1585
+ }
1586
+ .legend-dot.referenced {
1587
+ background: #aec1d4;
1588
+ }
1589
+ .legend-dot.unused {
1590
+ background: #dde5e8;
1591
+ }
1592
+ .graph-edges path {
1593
+ fill: none;
1594
+ stroke: #66897e;
1595
+ stroke-width: 1.6;
1596
+ marker-end: url(#graph-arrow);
1597
+ }
1598
+ .graph-edges text {
1599
+ font: 11px var(--mono);
1600
+ fill: #526e63;
1601
+ }
1602
+ .graph-node {
1603
+ cursor: pointer;
1604
+ outline: none;
1605
+ }
1606
+ .graph-node rect {
1607
+ fill: #f8fafb;
1608
+ stroke: #d3dee4;
1609
+ stroke-width: 1.4;
1610
+ }
1611
+ .graph-node.chosen rect {
1612
+ fill: #edf7f1;
1613
+ stroke: #75a48b;
1614
+ }
1615
+ .graph-node.referenced rect {
1616
+ fill: #f1f6fb;
1617
+ stroke: #8faabb;
1618
+ stroke-dasharray: 5 3;
1619
+ }
1620
+ .graph-node.blocked rect {
1621
+ fill: #fdf7ec;
1622
+ stroke: #bb8e56;
1623
+ }
1624
+ .graph-node:hover rect,.graph-node:focus-visible rect {
1625
+ stroke: #167765;
1626
+ stroke-width: 3;
1627
+ }
1628
+ .graph-table-name {
1629
+ font: 14px var(--mono);
1630
+ fill: #234739;
1631
+ }
1632
+ .graph-table-state {
1633
+ font: 12px 'PingFang SC',sans-serif;
1634
+ fill: #4e6a60;
1635
+ }
1636
+ .graph-footer {
1637
+ display: flex;
1638
+ justify-content: space-between;
1639
+ gap: 16px;
1640
+ border: 0;
1641
+ font-size: 10px;
1642
+ align-items: flex-start;
1643
+ line-height: 1.8;
1644
+ padding-top: 9px;
1645
+ }
1646
+ .execution-layers {
1647
+ display: flex;
1648
+ align-items: center;
1649
+ flex-wrap: wrap;
1650
+ gap: 12px;
1651
+ margin: 13px 0 8px;
1652
+ }
1653
+ .execution-layers>.icon {
1654
+ color: #6d8c81;
1655
+ width: 20px;
1656
+ }
1657
+ .execution-layer {
1658
+ display: flex;
1659
+ flex-direction: column;
1660
+ gap: 5px;
1661
+ min-width: 95px;
1662
+ padding: 9px 12px;
1663
+ background: #f1f6f4;
1664
+ border-radius: 6px;
1665
+ font-size: 11px;
1666
+ }
1667
+ .execution-layer small {
1668
+ font-size: 10px;
1669
+ color: var(--muted);
1670
+ margin-bottom: 3px;
1671
+ }
1672
+ .fine-print {
1673
+ font-size: 11px!important;
1674
+ line-height: 1.8!important;
1675
+ }
1676
+ .summary-modal {
1677
+ max-height: calc(100vh - 38px);
1678
+ display: flex;
1679
+ flex-direction: column;
1680
+ width: min(760px,calc(100% - 36px));
1681
+ }
1682
+ .summary-modal #summary-content {
1683
+ overflow: auto;
1684
+ padding-right: 5px;
1685
+ }
1686
+ .summary-modal .modal-head,.summary-modal .modal-footer {
1687
+ flex-shrink: 0;
1688
+ }
1689
+ .summary-scope {
1690
+ display: flex;
1691
+ gap: 22px;
1692
+ margin-top: 20px;
1693
+ font-size: 12px;
1694
+ color: var(--muted);
1695
+ }
1696
+ .summary-scope strong {
1697
+ color: var(--ink);
1698
+ font-family: var(--mono);
1699
+ font-size: 16px;
1700
+ margin: 0 5px;
1701
+ }
1702
+ .dependency-issues {
1703
+ display: grid;
1704
+ gap: 10px;
1705
+ }
1706
+ .dependency-issue {
1707
+ border: 1px solid #e4d4b8;
1708
+ background: #fcf8ef;
1709
+ border-radius: 6px;
1710
+ padding: 12px;
1711
+ font-size: 11px;
1712
+ }
1713
+ .dependency-issue strong {
1714
+ font: 12px var(--mono);
1715
+ }
1716
+ .dependency-issue p {
1717
+ font-size: 11px;
1718
+ line-height: 1.8;
1719
+ margin: 6px 0 9px;
1720
+ }
1721
+ .dependency-issue .btn {
1722
+ background: #fff;
1723
+ }
1724
+ .source-state {
1725
+ font-family: 'PingFang SC',sans-serif;
1726
+ font-size: 11px;
1727
+ }
1728
+ .database-info-list {
1729
+ display: grid;
1730
+ grid-template-columns: 100px 1fr;
1731
+ gap: 11px;
1732
+ font-size: 13px;
1733
+ margin: 20px 0;
1734
+ }
1735
+ .database-info-list dt {
1736
+ color: var(--muted);
1737
+ }
1738
+ .database-info-list dd {
1739
+ margin: 0;
1740
+ }
1741
+ .modal input {
1742
+ max-width: 100%;
1743
+ }
1744
+ .count-setting input:disabled {
1745
+ color: #84939b;
1746
+ background: #f0f3f4;
1747
+ }
1748
+ @media(max-width:1000px) {
1749
+ .table-entry .table-button {
1750
+ padding-left: 5px;
1751
+ padding-right: 5px;
1752
+ }
1753
+ .table-entry .table-name {
1754
+ font-size: 10px;
1755
+ }
1756
+ .table-entry .count {
1757
+ font-size: 9px;
1758
+ }
1759
+ .table-entry {
1760
+ padding-left: 5px;
1761
+ gap: 2px;
1762
+ }
1763
+ .scope-summary {
1764
+ font-size: 10px;
1765
+ }
1766
+ .dependency-line {
1767
+ align-items: flex-start;
1768
+ flex-direction: column;
1769
+ gap: 7px;
1770
+ }
1771
+ .graph-footer {
1772
+ flex-direction: column;
1773
+ }
1774
+ .panel-heading {
1775
+ flex-wrap: wrap;
1776
+ }
1777
+ }
1778
+ @media(max-width:760px) {
1779
+ .selection-actions {
1780
+ padding: 0 0 5px;
1781
+ }
1782
+ .tables {
1783
+ flex-wrap: wrap;
1784
+ }
1785
+ .table-entry {
1786
+ flex: 1 1 calc(50% - 10px);
1787
+ margin: 0;
1788
+ }
1789
+ .table-entry .table-name {
1790
+ font-size: 11px;
1791
+ }
1792
+ .table-entry .count {
1793
+ display: inline;
1794
+ margin-left: auto;
1795
+ }
1796
+ .scope-summary {
1797
+ display: flex;
1798
+ flex-wrap: wrap;
1799
+ justify-content: space-between;
1800
+ gap: 6px;
1801
+ margin: 6px 0 0;
1802
+ padding: 5px 0 0;
1803
+ }
1804
+ .scope-summary strong {
1805
+ display: inline;
1806
+ }
1807
+ .table-actions {
1808
+ gap: 6px;
1809
+ }
1810
+ .table-actions .btn {
1811
+ font-size: 10px;
1812
+ padding: 4px 6px;
1813
+ }
1814
+ .count-setting {
1815
+ font-size: 10px;
1816
+ gap: 4px;
1817
+ }
1818
+ .count-setting input {
1819
+ width: 57px;
1820
+ }
1821
+ .table-title h2 {
1822
+ font-size: 16px;
1823
+ }
1824
+ .source {
1825
+ display: block;
1826
+ border: 0;
1827
+ padding: 0 0 8px;
1828
+ }
1829
+ .source-note {
1830
+ font-size: 10px;
1831
+ }
1832
+ .side-tools {
1833
+ display: block;
1834
+ }
1835
+ .side-tools button {
1836
+ padding: 8px 0;
1837
+ }
1838
+ .view-only-note {
1839
+ margin-left: 15px;
1840
+ margin-right: 15px;
1841
+ }
1842
+ .dependency-path {
1843
+ gap: 6px;
1844
+ font-size: 10px;
1845
+ }
1846
+ .path-node {
1847
+ font-size: 10px;
1848
+ padding: 5px;
1849
+ }
1850
+ .scenario-control {
1851
+ flex-wrap: wrap;
1852
+ }
1853
+ .summary-modal {
1854
+ padding: 20px;
1855
+ }
1856
+ .graph-legend {
1857
+ gap: 12px;
1858
+ font-size: 10px;
1859
+ }
1860
+ .graph-table-state {
1861
+ font-size: 13px;
1862
+ }
1863
+ .source-state {
1864
+ font-size: 10px;
1865
+ }
1866
+ .relation-values {
1867
+ flex-wrap: wrap;
1868
+ }
1869
+ }
1870
+ .include-control {
1871
+ display: grid;
1872
+ place-items: center;
1873
+ min-width: 26px;
1874
+ height: 32px;
1875
+ cursor: pointer;
1876
+ }
1877
+ .side-tools button.active {
1878
+ color: var(--teal);
1879
+ background: #e1eee9;
1880
+ border-radius: 5px;
1881
+ }
1882
+ .search input:focus-visible {
1883
+ outline: none;
1884
+ }
1885
+ .search:focus-within,.graph-search:focus-within {
1886
+ border-color: #5e9d8c;
1887
+ box-shadow: 0 0 0 3px #1677651a;
1888
+ }
1889
+ .heading-actions .btn.active {
1890
+ border-color: #91baa9;
1891
+ background: #eaf5ef;
1892
+ color: var(--teal);
1893
+ }
1894
+ .prototype-tools {
1895
+ margin-top: 16px;
1896
+ padding: 12px 15px;
1897
+ border: 1px dashed #cbd9df;
1898
+ border-radius: 8px;
1899
+ color: var(--muted);
1900
+ font-size: 12px;
1901
+ }
1902
+ .prototype-tools>summary {
1903
+ cursor: pointer;
1904
+ width: max-content;
1905
+ }
1906
+ .prototype-tools>p {
1907
+ font-size: 11px;
1908
+ }
1909
+ .prototype-tool-row {
1910
+ display: flex;
1911
+ align-items: center;
1912
+ gap: 18px;
1913
+ margin: 13px 0;
1914
+ }
1915
+ .prototype-tool-row>span {
1916
+ width: 85px;
1917
+ }
1918
+ .demo-choice-group {
1919
+ display: flex;
1920
+ gap: 3px;
1921
+ padding: 3px;
1922
+ background: #e4ecef;
1923
+ border-radius: 8px;
1924
+ }
1925
+ .demo-choice-group button {
1926
+ padding: 8px 12px;
1927
+ font-size: 12px;
1928
+ border-radius: 6px;
1929
+ color: #506873;
1930
+ }
1931
+ .demo-choice-group button[aria-pressed=true] {
1932
+ background: #fff;
1933
+ color: var(--teal);
1934
+ box-shadow: 0 1px 4px #19344115;
1935
+ }
1936
+ .dependency-jump {
1937
+ display: flex;
1938
+ align-items: center;
1939
+ gap: 4px;
1940
+ color: #955315;
1941
+ padding: 2px 0;
1942
+ font-size: 11px;
1943
+ text-align: left;
1944
+ min-height: 28px;
1945
+ }
1946
+ .dependency-jump:hover {
1947
+ text-decoration: underline;
1948
+ text-underline-offset: 4px;
1949
+ }
1950
+ .dependency-jump .icon {
1951
+ width: 14px;
1952
+ height: 14px;
1953
+ }
1954
+ .reference-source {
1955
+ display: block;
1956
+ margin: 7px 0;
1957
+ font-size: 12px;
1958
+ }
1959
+ .dependency-issue>.btn {
1960
+ margin-right: 6px;
1961
+ margin-top: 3px;
1962
+ }
1963
+ .database-graph {
1964
+ padding-top: 0;
1965
+ }
1966
+ .graph-toolbar {
1967
+ display: flex;
1968
+ align-items: center;
1969
+ justify-content: space-between;
1970
+ gap: 12px;
1971
+ flex-wrap: wrap;
1972
+ margin: 17px 0 12px;
1973
+ }
1974
+ .graph-filters {
1975
+ display: flex;
1976
+ gap: 4px;
1977
+ padding: 3px;
1978
+ border-radius: 7px;
1979
+ background: #edf2f4;
1980
+ }
1981
+ .graph-filters button {
1982
+ font-size: 11px;
1983
+ padding: 6px 10px;
1984
+ border-radius: 5px;
1985
+ color: #506873;
1986
+ min-height: 29px;
1987
+ }
1988
+ .graph-filters button[aria-pressed=true] {
1989
+ background: #fff;
1990
+ color: var(--teal);
1991
+ box-shadow: 0 1px 3px #19344112;
1992
+ }
1993
+ .graph-filters button:disabled {
1994
+ opacity: .5;
1995
+ }
1996
+ .graph-search {
1997
+ display: flex;
1998
+ align-items: center;
1999
+ gap: 7px;
2000
+ padding: 5px 8px;
2001
+ border: 1px solid #cedbe1;
2002
+ border-radius: 8px;
2003
+ background: #fff;
2004
+ }
2005
+ .graph-search .icon {
2006
+ width: 14px;
2007
+ height: 14px;
2008
+ color: var(--muted);
2009
+ }
2010
+ .graph-search input {
2011
+ width: 150px;
2012
+ min-width: 0;
2013
+ font-size: 11px;
2014
+ border: 0;
2015
+ background: transparent;
2016
+ color: var(--ink);
2017
+ padding: 2px;
2018
+ }
2019
+ .graph-search input:focus-visible {
2020
+ outline: none;
2021
+ }
2022
+ .graph-meta {
2023
+ display: flex;
2024
+ align-items: center;
2025
+ justify-content: space-between;
2026
+ gap: 10px;
2027
+ flex-wrap: wrap;
2028
+ font-size: 10px;
2029
+ color: var(--muted);
2030
+ margin: 10px 0;
2031
+ }
2032
+ .graph-tools {
2033
+ display: flex;
2034
+ align-items: center;
2035
+ gap: 4px;
2036
+ flex-wrap: wrap;
2037
+ }
2038
+ .graph-tools button {
2039
+ font-size: 11px;
2040
+ min-width: 27px;
2041
+ min-height: 27px;
2042
+ border-radius: 5px;
2043
+ padding: 3px 7px;
2044
+ border: 1px solid #d4dfe4;
2045
+ background: #fff;
2046
+ }
2047
+ .graph-tools button:hover {
2048
+ background: #edf5f0;
2049
+ }
2050
+ .graph-tools #graph-zoom-label {
2051
+ min-width: 38px;
2052
+ text-align: center;
2053
+ font: 10px var(--mono);
2054
+ cursor: help;
2055
+ }
2056
+ .graph-tools .graph-scale-note {
2057
+ font: 9px sans-serif;
2058
+ margin-right: 6px;
2059
+ }
2060
+ .graph-tools button[aria-pressed=true] {
2061
+ color: var(--teal);
2062
+ border-color: #8fb5a7;
2063
+ background: #edf7f1;
2064
+ }
2065
+ .graph-canvas {
2066
+ height: 390px;
2067
+ width: 100%;
2068
+ overflow: auto;
2069
+ position: relative;
2070
+ border: 1px solid #dbe5e9;
2071
+ border-radius: 9px;
2072
+ background-color: #fafcfc;
2073
+ background-image: radial-gradient(#dfe8e8 1px,transparent 1px);
2074
+ background-size: 18px 18px;
2075
+ cursor: grab;
2076
+ overscroll-behavior: contain;
2077
+ }
2078
+ .graph-canvas.expanded {
2079
+ height: min(680px,75vh);
2080
+ }
2081
+ .graph-canvas.dragging {
2082
+ cursor: grabbing;
2083
+ user-select: none;
2084
+ }
2085
+ .graph-stage {
2086
+ position: relative;
2087
+ min-width: 100%;
2088
+ min-height: 100%;
2089
+ }
2090
+ .graph-stage>.schema-graph {
2091
+ position: absolute;
2092
+ max-width: none;
2093
+ margin: 0;
2094
+ display: block;
2095
+ }
2096
+ .graph-canvas .graph-node rect {
2097
+ stroke-width: 1.3;
2098
+ }
2099
+ .graph-node.focused rect,.graph-node:focus-visible rect {
2100
+ stroke: #2573a4!important;
2101
+ stroke-width: 2.8!important;
2102
+ }
2103
+ .graph-edge {
2104
+ cursor: pointer;
2105
+ outline: none;
2106
+ }
2107
+ .graph-edge .edge-line {
2108
+ fill: none;
2109
+ stroke: #71978a;
2110
+ stroke-width: 1.6;
2111
+ }
2112
+ .graph-edge .edge-hit {
2113
+ fill: none;
2114
+ stroke: transparent;
2115
+ stroke-width: 16;
2116
+ pointer-events: stroke;
2117
+ }
2118
+ .graph-edge.problem .edge-line {
2119
+ stroke: #ad641c;
2120
+ stroke-width: 2.5;
2121
+ }
2122
+ .graph-edge.focused .edge-line,.graph-edge:focus-visible .edge-line {
2123
+ stroke: #2573a4;
2124
+ stroke-width: 3.2;
2125
+ }
2126
+ .graph-edge.cycle .edge-line {
2127
+ stroke-dasharray: 5 3;
2128
+ }
2129
+ .graph-edge text {
2130
+ font: 10px var(--mono);
2131
+ fill: #516f64;
2132
+ paint-order: stroke;
2133
+ stroke: #fafcfc;
2134
+ stroke-width: 4px;
2135
+ stroke-linejoin: round;
2136
+ }
2137
+ .graph-footer>span {
2138
+ max-width: 75%;
2139
+ }
2140
+ .graph-footer label {
2141
+ display: flex;
2142
+ gap: 4px;
2143
+ align-items: center;
2144
+ white-space: nowrap;
2145
+ }
2146
+ .graph-footer input {
2147
+ accent-color: var(--teal);
2148
+ }
2149
+ .graph-hint {
2150
+ font-size: 11px!important;
2151
+ margin-top: 14px;
2152
+ }
2153
+ .graph-inspector {
2154
+ margin-top: 15px;
2155
+ padding: 13px 15px;
2156
+ background: #f3f7f8;
2157
+ border-radius: 7px;
2158
+ font-size: 12px;
2159
+ }
2160
+ .graph-inspector>.dependency-path {
2161
+ margin-top: 11px;
2162
+ overflow-wrap: anywhere;
2163
+ }
2164
+ .graph-inspector p {
2165
+ font-size: 11px;
2166
+ line-height: 1.8;
2167
+ margin: 8px 0 0;
2168
+ }
2169
+ .inspector-relations {
2170
+ display: flex;
2171
+ flex-direction: column;
2172
+ gap: 6px;
2173
+ margin-top: 9px;
2174
+ }
2175
+ .inspector-relations button {
2176
+ text-align: left;
2177
+ font: 11px/1.7 var(--mono);
2178
+ padding: 6px 8px;
2179
+ background: #fff;
2180
+ border-radius: 4px;
2181
+ overflow-wrap: anywhere;
2182
+ }
2183
+ .inspector-relations button:hover {
2184
+ color: var(--teal);
2185
+ text-decoration: underline;
2186
+ }
2187
+ .graph-issue-list {
2188
+ display: grid;
2189
+ gap: 7px;
2190
+ padding: 10px 12px;
2191
+ border: 1px solid #e4d4b8;
2192
+ background: #fcf8ef;
2193
+ border-radius: 7px;
2194
+ }
2195
+ .graph-issue-list>div {
2196
+ display: flex;
2197
+ align-items: center;
2198
+ justify-content: space-between;
2199
+ gap: 10px;
2200
+ }
2201
+ .graph-issue-list>div>button:first-child {
2202
+ font-size: 11px;
2203
+ color: #915217;
2204
+ text-align: left;
2205
+ padding: 4px 0;
2206
+ line-height: 1.7;
2207
+ }
2208
+ .graph-issue-list .btn {
2209
+ font-size: 10px;
2210
+ padding: 5px 7px;
2211
+ }
2212
+ .graph-panel-note {
2213
+ font-size: 10px;
2214
+ color: var(--muted);
2215
+ }
2216
+ @media(max-width:1000px) {
2217
+ .graph-canvas {
2218
+ height: 360px;
2219
+ }
2220
+ .graph-footer {
2221
+ flex-direction: row;
2222
+ }
2223
+ .graph-footer>span {
2224
+ max-width: 70%;
2225
+ }
2226
+ .graph-meta {
2227
+ gap: 7px;
2228
+ }
2229
+ .graph-issue-list>div {
2230
+ flex-wrap: wrap;
2231
+ }
2232
+ .graph-search input {
2233
+ width: 125px;
2234
+ }
2235
+ }
2236
+ @media(max-width:760px) {
2237
+ .search {
2238
+ display: none;
2239
+ }
2240
+ .prototype-tool-row {
2241
+ align-items: flex-start;
2242
+ flex-direction: column;
2243
+ gap: 7px;
2244
+ }
2245
+ .demo-choice-group {
2246
+ max-width: 100%;
2247
+ flex-wrap: wrap;
2248
+ }
2249
+ .demo-choice-group button {
2250
+ font-size: 11px;
2251
+ padding: 7px;
2252
+ }
2253
+ .graph-canvas {
2254
+ height: 320px;
2255
+ }
2256
+ .graph-toolbar {
2257
+ gap: 8px;
2258
+ }
2259
+ .graph-search {
2260
+ flex: 1;
2261
+ }
2262
+ .graph-search input {
2263
+ width: 100%;
2264
+ }
2265
+ .graph-filters button {
2266
+ padding: 6px 8px;
2267
+ }
2268
+ .graph-footer {
2269
+ flex-direction: column;
2270
+ }
2271
+ .graph-footer>span {
2272
+ max-width: 100%;
2273
+ }
2274
+ .graph-issue-list {
2275
+ padding: 9px;
2276
+ }
2277
+ .database-graph {
2278
+ padding-left: 12px;
2279
+ padding-right: 12px;
2280
+ }
2281
+ .graph-tools {
2282
+ gap: 3px;
2283
+ }
2284
+ .graph-tools button {
2285
+ padding: 4px 6px;
2286
+ }
2287
+ .graph-table-state {
2288
+ font-size: 11px;
2289
+ }
2290
+ .graph-inspector>.dependency-path {
2291
+ font-size: 11px;
2292
+ }
2293
+ .prototype-tools {
2294
+ margin-top: 12px;
2295
+ }
2296
+ }
2297
+ .graph-label {
2298
+ cursor: pointer;
2299
+ }
2300
+ .graph-label rect {
2301
+ fill: #fff;
2302
+ stroke: #cddfd7;
2303
+ stroke-width: 1;
2304
+ }
2305
+ .graph-label text {
2306
+ font: 11px var(--mono);
2307
+ fill: #315649;
2308
+ }
2309
+ .graph-label.problem rect {
2310
+ fill: #fffaf1;
2311
+ stroke: #d4ac77;
2312
+ }
2313
+ .graph-label.problem text {
2314
+ fill: #93551b;
2315
+ }
2316
+ .graph-label.focused rect,.graph-label:hover rect {
2317
+ stroke: #2573a4;
2318
+ stroke-width: 1.8;
2319
+ }
2320
+ .graph-label.focused text {
2321
+ fill: #245f85;
2322
+ }
2323
+ .graph-label-leaders {
2324
+ pointer-events: none;
2325
+ }
2326
+ .graph-label-leaders path {
2327
+ fill: none;
2328
+ stroke: #9bb4a9;
2329
+ stroke-width: 1;
2330
+ stroke-dasharray: 2 2;
2331
+ }
2332
+ /* The relation canvas and its inspector share one workbench context. */
2333
+ .source-info {
2334
+ padding: 0 3px;
2335
+ min-width: 24px;
2336
+ min-height: 24px;
2337
+ color: var(--muted);
2338
+ }
2339
+ .graph-workspace {
2340
+ display: grid;
2341
+ grid-template-columns: minmax(0,1fr) 248px;
2342
+ gap: 16px;
2343
+ align-items: start;
2344
+ }
2345
+ .graph-workspace.expanded {
2346
+ grid-template-columns: minmax(0,1fr);
2347
+ }
2348
+ .graph-visual {
2349
+ min-width: 0;
2350
+ }
2351
+ .graph-workspace .graph-inspector {
2352
+ margin: 0;
2353
+ padding: 0;
2354
+ border: 1px solid var(--line);
2355
+ background: #fff;
2356
+ min-width: 0;
2357
+ overflow: hidden;
2358
+ }
2359
+ .inspector-tabs {
2360
+ display: flex;
2361
+ padding: 0 12px;
2362
+ border-bottom: 1px solid var(--line);
2363
+ gap: 16px;
2364
+ background: #f8fafb;
2365
+ }
2366
+ .inspector-tabs button {
2367
+ padding: 11px 0;
2368
+ font-size: 12px;
2369
+ border-bottom: 2px solid transparent;
2370
+ color: var(--muted);
2371
+ }
2372
+ .inspector-tabs button[aria-pressed=true] {
2373
+ color: var(--teal);
2374
+ border-color: var(--teal);
2375
+ font-weight: 600;
2376
+ }
2377
+ .inspector-body {
2378
+ padding: 14px;
2379
+ overflow: auto;
2380
+ max-height: 390px;
2381
+ }
2382
+ .inspector-body .graph-inspector {
2383
+ border: 0;
2384
+ padding: 0 0 10px;
2385
+ background: none;
2386
+ }
2387
+ .inspector-heading {
2388
+ display: flex;
2389
+ gap: 10px;
2390
+ align-items: center;
2391
+ justify-content: space-between;
2392
+ overflow-wrap: anywhere;
2393
+ }
2394
+ .inspector-heading>span {
2395
+ font-size: 10px;
2396
+ color: var(--muted);
2397
+ white-space: nowrap;
2398
+ }
2399
+ .graph-field-list {
2400
+ display: grid;
2401
+ margin: 12px -5px;
2402
+ gap: 4px;
2403
+ }
2404
+ .graph-field {
2405
+ display: flex;
2406
+ flex-direction: column;
2407
+ gap: 4px;
2408
+ padding: 10px;
2409
+ text-align: left;
2410
+ border: 1px solid #e2ebe7;
2411
+ border-radius: 6px;
2412
+ font-size: 11px;
2413
+ min-width: 0;
2414
+ }
2415
+ .graph-field:hover {
2416
+ background: #f0f8f4;
2417
+ border-color: #99b8aa;
2418
+ }
2419
+ .graph-field:disabled {
2420
+ background: #f7f9fa;
2421
+ color: #708088;
2422
+ }
2423
+ .graph-field-title {
2424
+ display: flex;
2425
+ align-items: baseline;
2426
+ justify-content: space-between;
2427
+ gap: 6px;
2428
+ width: 100%;
2429
+ }
2430
+ .graph-field-title strong {
2431
+ font-size: 11px;
2432
+ overflow-wrap: anywhere;
2433
+ }
2434
+ .graph-field-title small {
2435
+ white-space: nowrap;
2436
+ font-size: 9px;
2437
+ color: var(--muted);
2438
+ }
2439
+ .field-sample {
2440
+ font: 10px var(--mono);
2441
+ max-width: 100%;
2442
+ overflow: hidden;
2443
+ text-overflow: ellipsis;
2444
+ white-space: nowrap;
2445
+ color: #688278;
2446
+ }
2447
+ .dependency-card {
2448
+ background: #fffaf1;
2449
+ border: 1px solid #e5d1b0;
2450
+ border-radius: 6px;
2451
+ padding: 10px;
2452
+ margin: 0 0 10px;
2453
+ font-size: 11px;
2454
+ overflow-wrap: anywhere;
2455
+ }
2456
+ .dependency-card .btn {
2457
+ font-size: 10px;
2458
+ margin: 7px 4px 0 0;
2459
+ padding: 4px 6px;
2460
+ white-space: normal;
2461
+ text-align: left;
2462
+ }
2463
+ .dependency-card strong {
2464
+ font-size: 11px;
2465
+ }
2466
+ .summary-check {
2467
+ display: flex;
2468
+ justify-content: space-between;
2469
+ align-items: center;
2470
+ gap: 12px;
2471
+ padding: 12px 0;
2472
+ font-size: 12px;
2473
+ }
2474
+ .graph-workspace .graph-meta {
2475
+ margin-top: 0;
2476
+ }
2477
+ .graph-workspace .graph-tools {
2478
+ gap: 3px;
2479
+ }
2480
+ .graph-workspace.expanded .inspector-body {
2481
+ max-height: 340px;
2482
+ }
2483
+ .graph-workspace.expanded .graph-field-list {
2484
+ grid-template-columns: repeat(auto-fit,minmax(190px,1fr));
2485
+ }
2486
+ .drawer #editor-body {
2487
+ overflow: auto;
2488
+ min-height: 0;
2489
+ padding: 0 3px 8px;
2490
+ }
2491
+ .generator-heading {
2492
+ display: flex;
2493
+ align-items: center;
2494
+ justify-content: space-between;
2495
+ gap: 12px;
2496
+ font-size: 12px;
2497
+ }
2498
+ .generator-heading small {
2499
+ color: var(--muted);
2500
+ font-size: 10px;
2501
+ }
2502
+ .generator-picker {
2503
+ margin-top: 12px;
2504
+ border: 1px solid var(--line);
2505
+ border-radius: 7px;
2506
+ padding: 9px;
2507
+ background: #f8fbfa;
2508
+ }
2509
+ .generator-picker>input {
2510
+ width: 100%;
2511
+ font-size: 12px;
2512
+ border: 1px solid #cbdcd3;
2513
+ border-radius: 5px;
2514
+ padding: 8px;
2515
+ }
2516
+ .generator-options {
2517
+ display: grid;
2518
+ grid-template-columns: 1fr 1fr;
2519
+ gap: 5px;
2520
+ margin-top: 8px;
2521
+ max-height: 185px;
2522
+ overflow: auto;
2523
+ }
2524
+ .generator-options button {
2525
+ display: flex;
2526
+ flex-direction: column;
2527
+ align-items: flex-start;
2528
+ padding: 7px 8px;
2529
+ gap: 3px;
2530
+ border: 1px solid transparent;
2531
+ border-radius: 5px;
2532
+ background: #fff;
2533
+ font-size: 11px;
2534
+ }
2535
+ .generator-options button:hover,.generator-options button[aria-pressed=true] {
2536
+ border-color: #83b09b;
2537
+ background: #edf7f1;
2538
+ }
2539
+ .generator-options small {
2540
+ font: 9px var(--mono);
2541
+ color: var(--muted);
2542
+ }
2543
+ .control textarea {
2544
+ font: 12px/1.7 var(--mono);
2545
+ display: block;
2546
+ width: 100%;
2547
+ margin-top: 8px;
2548
+ padding: 8px 10px;
2549
+ border: 1px solid #cddbe1;
2550
+ border-radius: 6px;
2551
+ resize: vertical;
2552
+ color: var(--ink);
2553
+ }
2554
+ .column-constraints {
2555
+ font-size: 11px;
2556
+ color: var(--muted);
2557
+ line-height: 1.8;
2558
+ }
2559
+ .column-constraints summary {
2560
+ cursor: pointer;
2561
+ }
2562
+ .column-constraints code {
2563
+ display: block;
2564
+ font: 10px/1.8 var(--mono);
2565
+ overflow-wrap: anywhere;
2566
+ margin: 5px 0;
2567
+ }
2568
+ .editor-note {
2569
+ font-size: 11px;
2570
+ line-height: 1.8;
2571
+ color: var(--muted);
2572
+ }
2573
+ @media(min-width:1380px) {
2574
+ .graph-workspace {
2575
+ grid-template-columns: minmax(0,1fr) 278px;
2576
+ }
2577
+ }
2578
+ @media(max-width:1000px) {
2579
+ .graph-workspace {
2580
+ grid-template-columns: minmax(0,1fr);
2581
+ }
2582
+ .graph-field-list {
2583
+ grid-template-columns: repeat(auto-fit,minmax(175px,1fr));
2584
+ }
2585
+ .graph-workspace .graph-canvas {
2586
+ height: 350px;
2587
+ }
2588
+ }
2589
+ @media(max-width:760px) {
2590
+ .heading-actions {
2591
+ justify-content: flex-start;
2592
+ }
2593
+ .heading-actions .btn {
2594
+ flex: 0 1 auto;
2595
+ }
2596
+ .source {
2597
+ display: block;
2598
+ }
2599
+ .graph-field-list {
2600
+ grid-template-columns: 1fr 1fr;
2601
+ }
2602
+ .graph-workspace .graph-canvas {
2603
+ height: 320px;
2604
+ }
2605
+ .source-note {
2606
+ justify-content: flex-start;
2607
+ }
2608
+ .summary-check {
2609
+ align-items: flex-start;
2610
+ flex-direction: column;
2611
+ }
2612
+ }
2613
+ .prototype-scene {
2614
+ display: flex;
2615
+ align-items: center;
2616
+ gap: 14px;
2617
+ margin: -7px 0 16px;
2618
+ font-size: 11px;
2619
+ color: var(--muted);
2620
+ flex-wrap: wrap;
2621
+ }
2622
+ .prototype-scene .demo-choice-group {
2623
+ margin: 0;
2624
+ }
2625
+ .table-graph-shortcut {
2626
+ flex: 0 0 28px;
2627
+ width: 26px;
2628
+ padding: 5px;
2629
+ color: #648078;
2630
+ border-radius: 5px;
2631
+ height: 32px;
2632
+ }
2633
+ .table-graph-shortcut .icon {
2634
+ width: 17px;
2635
+ height: 17px;
2636
+ }
2637
+ .table-graph-shortcut:hover {
2638
+ background: #d3e7df;
2639
+ color: var(--teal);
2640
+ }
2641
+ .inspector-actions {
2642
+ padding: 12px 14px;
2643
+ border-bottom: 1px solid var(--line);
2644
+ background: #fff;
2645
+ display: grid;
2646
+ gap: 10px;
2647
+ }
2648
+ .inspector-actions .btn {
2649
+ width: 100%;
2650
+ }
2651
+ .inspector-section-title {
2652
+ display: flex;
2653
+ align-items: center;
2654
+ justify-content: space-between;
2655
+ gap: 8px;
2656
+ margin-top: 22px;
2657
+ }
2658
+ .inspector-section-title h4 {
2659
+ margin: 0;
2660
+ }
2661
+ .inline-action {
2662
+ font-size: 10px;
2663
+ color: var(--teal);
2664
+ padding: 5px 0;
2665
+ white-space: nowrap;
2666
+ }
2667
+ .execution-sequence {
2668
+ list-style: none;
2669
+ padding: 0;
2670
+ margin: 13px 0;
2671
+ display: grid;
2672
+ gap: 0;
2673
+ }
2674
+ .execution-sequence li {
2675
+ display: flex;
2676
+ align-items: stretch;
2677
+ gap: 10px;
2678
+ position: relative;
2679
+ padding-bottom: 14px;
2680
+ min-width: 0;
2681
+ }
2682
+ .execution-sequence li:not(:last-child):before {
2683
+ content: "";
2684
+ position: absolute;
2685
+ left: 11px;
2686
+ top: 24px;
2687
+ bottom: 0;
2688
+ width: 1px;
2689
+ background: #bdd7cd;
2690
+ }
2691
+ .execution-step {
2692
+ width: 23px;
2693
+ height: 23px;
2694
+ flex: 0 0 23px;
2695
+ border: 1px solid #bdd7cd;
2696
+ border-radius: 50%;
2697
+ display: grid;
2698
+ place-items: center;
2699
+ color: var(--teal);
2700
+ font: 11px var(--mono);
2701
+ background: #f1f8f4;
2702
+ }
2703
+ .execution-group {
2704
+ min-width: 0;
2705
+ flex: 1;
2706
+ }
2707
+ .execution-group>small {
2708
+ font-size: 10px;
2709
+ color: var(--muted);
2710
+ }
2711
+ .execution-tables {
2712
+ display: flex;
2713
+ flex-wrap: wrap;
2714
+ gap: 5px;
2715
+ margin-top: 5px;
2716
+ }
2717
+ .execution-tables button {
2718
+ padding: 4px 7px;
2719
+ background: #f1f6f4;
2720
+ border-radius: 4px;
2721
+ font-size: 11px;
2722
+ overflow-wrap: anywhere;
2723
+ max-width: 100%;
2724
+ border: 1px solid transparent;
2725
+ text-align: left;
2726
+ cursor: pointer;
2727
+ }
2728
+ .dependency-card.informational {
2729
+ background: #f4f9f7;
2730
+ border-color: #d3e4dc;
2731
+ }
2732
+ .reference-steps {
2733
+ padding-left: 18px;
2734
+ color: #45665a;
2735
+ line-height: 1.9;
2736
+ }
2737
+ .reference-steps li {
2738
+ margin: 5px 0;
2739
+ }
2740
+ .complex-presets {
2741
+ display: flex;
2742
+ gap: 6px;
2743
+ align-items: center;
2744
+ flex-wrap: wrap;
2745
+ margin: 0 0 15px;
2746
+ font-size: 11px;
2747
+ color: var(--muted);
2748
+ }
2749
+ .complex-presets>span {
2750
+ margin-right: 5px;
2751
+ }
2752
+ .complex-presets button,.path-modes button {
2753
+ font-size: 11px;
2754
+ padding: 5px 8px;
2755
+ border-radius: 5px;
2756
+ border: 1px solid var(--line);
2757
+ background: #fff;
2758
+ }
2759
+ .complex-presets button[aria-pressed=true],.path-modes button[aria-pressed=true] {
2760
+ color: var(--teal);
2761
+ border-color: #8cb9a6;
2762
+ background: #edf7f2;
2763
+ }
2764
+ .path-scope {
2765
+ background: #f5f9f7;
2766
+ padding: 10px 12px;
2767
+ border-radius: 6px;
2768
+ margin-bottom: 15px;
2769
+ }
2770
+ .path-scope-heading {
2771
+ display: flex;
2772
+ align-items: center;
2773
+ gap: 12px;
2774
+ justify-content: space-between;
2775
+ flex-wrap: wrap;
2776
+ }
2777
+ .path-scope-heading strong {
2778
+ font-size: 12px;
2779
+ overflow-wrap: anywhere;
2780
+ }
2781
+ .path-modes {
2782
+ display: flex;
2783
+ gap: 5px;
2784
+ flex-wrap: wrap;
2785
+ }
2786
+ .path-scope p {
2787
+ font-size: 11px;
2788
+ margin: 7px 0 0;
2789
+ }
2790
+ .graph-workspace.expanded .inspector-actions {
2791
+ display: flex;
2792
+ align-items: center;
2793
+ justify-content: space-between;
2794
+ }
2795
+ .graph-workspace.expanded .inspector-actions .btn {
2796
+ width: auto;
2797
+ }
2798
+ @media(max-width:760px) {
2799
+ .prototype-scene {
2800
+ margin-top: 0;
2801
+ }
2802
+ .tables {
2803
+ overflow-x: auto;
2804
+ }
2805
+ .table-entry {
2806
+ flex: 0 0 auto;
2807
+ }
2808
+ .table-graph-shortcut {
2809
+ display: none;
2810
+ }
2811
+ .prototype-scene .demo-choice-group {
2812
+ flex-wrap: wrap;
2813
+ }
2814
+ .path-scope-heading {
2815
+ gap: 8px;
2816
+ }
2817
+ .inspector-body {
2818
+ max-height: 330px;
2819
+ }
2820
+ }
2821
+ .table-graph-shortcut[aria-pressed=true] {
2822
+ color: var(--teal);
2823
+ background: #cde4d9;
2824
+ }
2825
+ .table-entry .table-button:focus-visible {
2826
+ outline-offset: 0;
2827
+ }
2828
+ .sample.timestamp {
2829
+ display: grid;
2830
+ gap: 2px;
2831
+ font-size: 11px;
2832
+ white-space: normal;
2833
+ overflow: visible;
2834
+ }
2835
+ .sample-time {
2836
+ color: #59737f;
2837
+ font-size: 10px;
2838
+ }
2839
+ .structure-actions {
2840
+ display: flex;
2841
+ gap: 7px;
2842
+ flex-wrap: wrap;
2843
+ }
2844
+ .structure-modal {
2845
+ width: min(660px,calc(100% - 36px));
2846
+ max-height: calc(100vh - 38px);
2847
+ display: flex;
2848
+ flex-direction: column;
2849
+ }
2850
+ .structure-modal .modal-head {
2851
+ flex-shrink: 0;
2852
+ }
2853
+ .structure-modal #structure-content {
2854
+ overflow: auto;
2855
+ padding-right: 5px;
2856
+ }
2857
+ .structure-import-actions {
2858
+ display: flex;
2859
+ gap: 9px;
2860
+ flex-wrap: wrap;
2861
+ margin: 18px 0;
2862
+ }
2863
+ .structure-format {
2864
+ font-size: 12px;
2865
+ color: var(--muted);
2866
+ margin: 18px 0;
2867
+ }
2868
+ .structure-format summary {
2869
+ cursor: pointer;
2870
+ color: var(--ink);
2871
+ }
2872
+ .structure-format dl {
2873
+ display: grid;
2874
+ grid-template-columns: 1fr;
2875
+ gap: 4px;
2876
+ margin: 14px 0;
2877
+ }
2878
+ .structure-format dt {
2879
+ font: 11px var(--mono);
2880
+ color: var(--ink);
2881
+ margin-top: 5px;
2882
+ }
2883
+ .structure-format dd {
2884
+ margin: 0;
2885
+ font-size: 11px;
2886
+ }
2887
+ .structure-format .json {
2888
+ font-size: 11px;
2889
+ max-height: 230px;
2890
+ }
2891
+ .structure-error {
2892
+ color: #98561a!important;
2893
+ border-left: 3px solid #bf8542;
2894
+ padding-left: 10px;
2895
+ }
2896
+ .nav button:disabled {
2897
+ opacity: .48;
2898
+ cursor: default;
2899
+ }
2900
+ .action-context {
2901
+ font-size: 10px;
2902
+ color: var(--muted);
2903
+ }
2904
+ .graph-tools button:disabled {
2905
+ opacity: .45;
2906
+ cursor: default;
2907
+ }
2908
+ .graph-tools button:disabled:hover {
2909
+ background: #fff;
2910
+ }
2911
+ @media(max-width:760px) {
2912
+ .table-graph-shortcut {
2913
+ display: block;
2914
+ }
2915
+ .structure-actions .btn {
2916
+ font-size: 10px;
2917
+ }
2918
+ .sample.timestamp {
2919
+ font-size: 10px;
2920
+ }
2921
+ }
2922
+ .database-toolbar {
2923
+ display: flex;
2924
+ align-items: center;
2925
+ justify-content: space-between;
2926
+ gap: 12px;
2927
+ flex-wrap: wrap;
2928
+ padding: 15px 27px;
2929
+ border-bottom: 1px solid var(--line);
2930
+ background: #f8fbfa;
2931
+ }
2932
+ .database-toolbar-title {
2933
+ display: flex;
2934
+ align-items: center;
2935
+ gap: 9px;
2936
+ min-width: 0;
2937
+ }
2938
+ .database-toolbar-title>.icon {
2939
+ color: var(--teal);
2940
+ flex-shrink: 0;
2941
+ }
2942
+ .database-toolbar-title>div {
2943
+ display: grid;
2944
+ gap: 2px;
2945
+ min-width: 0;
2946
+ }
2947
+ .database-toolbar-title strong {
2948
+ font-size: 12px;
2949
+ overflow-wrap: anywhere;
2950
+ }
2951
+ .database-toolbar-title span {
2952
+ font-size: 10px;
2953
+ color: var(--muted);
2954
+ }
2955
+ .structure-scope-note {
2956
+ flex-basis: 100%;
2957
+ font-size: 10px;
2958
+ color: var(--muted);
2959
+ margin: 0;
2960
+ }
2961
+ .execution-tables button:hover {
2962
+ border-color: #a8cabb;
2963
+ background: #e4f1e9;
2964
+ }
2965
+ .execution-tables button[aria-pressed=true] {
2966
+ border-color: #8bb3a0;
2967
+ background: #e4f1e9;
2968
+ color: var(--teal);
2969
+ }
2970
+ .execution-tables button:focus-visible {
2971
+ outline-offset: 1px;
2972
+ }
2973
+ @media(max-width:760px) {
2974
+ .database-toolbar {
2975
+ padding: 12px 15px;
2976
+ }
2977
+ .database-toolbar .structure-actions {
2978
+ width: 100%;
2979
+ }
2980
+ .database-toolbar .structure-actions .btn {
2981
+ flex: 1;
2982
+ }
2983
+ }
2984
+
2985
+ /* Product shell and shared controls. One visual system; no route theme toggle. */
2986
+ textarea {
2987
+ font: inherit;
2988
+ color: inherit;
2989
+ }
2990
+ a.btn {
2991
+ text-decoration: none;
2992
+ }
2993
+ .btn:disabled {
2994
+ opacity: .5;
2995
+ }
2996
+ #connection-label {
2997
+ max-width: 210px;
2998
+ overflow: hidden;
2999
+ text-overflow: ellipsis;
3000
+ white-space: nowrap;
3001
+ }
3002
+ .connection-overlay {
3003
+ z-index: 70;
3004
+ }
3005
+ .connection-modal {
3006
+ width: min(590px, calc(100% - 32px));
3007
+ max-height: calc(100vh - 40px);
3008
+ overflow: auto;
3009
+ }
3010
+ .connection-modal > .muted {
3011
+ margin: 10px 0 20px;
3012
+ }
3013
+ .connection-existing:empty {
3014
+ display: none;
3015
+ }
3016
+ .connection-existing {
3017
+ margin-bottom: 20px;
3018
+ }
3019
+ .connection-label {
3020
+ font-size: 11px;
3021
+ color: var(--muted);
3022
+ }
3023
+ .connection-card {
3024
+ display: flex;
3025
+ align-items: center;
3026
+ justify-content: space-between;
3027
+ gap: 12px;
3028
+ width: 100%;
3029
+ padding: 10px 12px;
3030
+ margin-bottom: 6px;
3031
+ border: 1px solid var(--line);
3032
+ border-radius: 6px;
3033
+ text-align: left;
3034
+ }
3035
+ .connection-card:hover {
3036
+ background: var(--soft);
3037
+ border-color: #a6c6b9;
3038
+ }
3039
+ .connection-card span {
3040
+ overflow-wrap: anywhere;
3041
+ }
3042
+ .connection-card small {
3043
+ flex-shrink: 0;
3044
+ font-size: 10px;
3045
+ color: var(--teal);
3046
+ }
3047
+ .connection-fields {
3048
+ display: grid;
3049
+ gap: 14px;
3050
+ margin: 20px 0;
3051
+ }
3052
+ .connection-field {
3053
+ display: grid;
3054
+ gap: 7px;
3055
+ min-width: 0;
3056
+ font-size: 12px;
3057
+ color: var(--muted);
3058
+ }
3059
+ .connection-field input,
3060
+ .connection-file-path input {
3061
+ width: 100%;
3062
+ min-width: 0;
3063
+ height: 38px;
3064
+ padding: 8px 10px;
3065
+ border: 1px solid #cddbe1;
3066
+ border-radius: 6px;
3067
+ color: var(--ink);
3068
+ background: var(--paper);
3069
+ }
3070
+ .connection-pair {
3071
+ display: grid;
3072
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
3073
+ gap: 14px;
3074
+ }
3075
+ .connection-footer {
3076
+ gap: 8px;
3077
+ }
3078
+ .connection-error,
3079
+ .run-error {
3080
+ color: #a34c22;
3081
+ overflow-wrap: anywhere;
3082
+ font-size: 12px;
3083
+ }
3084
+ .connection-error:empty,
3085
+ .run-notice:empty {
3086
+ display: none;
3087
+ }
3088
+ .connection-browser {
3089
+ padding: 12px;
3090
+ margin: 12px 0;
3091
+ background: #f6f9fa;
3092
+ border: 1px solid var(--line);
3093
+ border-radius: 7px;
3094
+ }
3095
+ .connection-file-path {
3096
+ display: flex;
3097
+ gap: 6px;
3098
+ }
3099
+ .connection-file-path input {
3100
+ font: 11px var(--mono);
3101
+ }
3102
+ .connection-file-list {
3103
+ display: grid;
3104
+ max-height: 220px;
3105
+ overflow: auto;
3106
+ margin-top: 10px;
3107
+ }
3108
+ .connection-file {
3109
+ text-align: left;
3110
+ padding: 9px 7px;
3111
+ border-bottom: 1px solid var(--line);
3112
+ font: 11px var(--mono);
3113
+ overflow-wrap: anywhere;
3114
+ }
3115
+ .connection-file:hover {
3116
+ background: var(--soft);
3117
+ }
3118
+ .connection-file.directory:after {
3119
+ content: " /";
3120
+ color: var(--muted);
3121
+ }
3122
+ .dropdown {
3123
+ position: relative;
3124
+ min-width: 0;
3125
+ }
3126
+ .dropdown-btn {
3127
+ width: 100%;
3128
+ display: flex;
3129
+ align-items: center;
3130
+ justify-content: space-between;
3131
+ gap: 10px;
3132
+ min-height: 36px;
3133
+ padding: 8px 10px;
3134
+ border: 1px solid #cddbe1;
3135
+ border-radius: 6px;
3136
+ background: var(--paper);
3137
+ font-size: 12px;
3138
+ text-align: left;
3139
+ }
3140
+ .dropdown-btn:after {
3141
+ content: "⌄";
3142
+ color: var(--muted);
3143
+ }
3144
+ .dropdown-btn-label {
3145
+ overflow-wrap: anywhere;
3146
+ }
3147
+ .dropdown-panel {
3148
+ position: absolute;
3149
+ z-index: 80;
3150
+ display: none;
3151
+ left: 0;
3152
+ right: 0;
3153
+ top: calc(100% + 5px);
3154
+ max-height: 260px;
3155
+ overflow: auto;
3156
+ padding: 5px;
3157
+ border: 1px solid var(--line);
3158
+ border-radius: 7px;
3159
+ background: var(--paper);
3160
+ box-shadow: 0 10px 30px #1934411f;
3161
+ }
3162
+ .dropdown.open .dropdown-panel {
3163
+ display: block;
3164
+ }
3165
+ .dropdown-panel.dropdown-floating {
3166
+ display: block;
3167
+ z-index: 1500;
3168
+ box-sizing: border-box;
3169
+ }
3170
+ .dropdown-item {
3171
+ display: block;
3172
+ width: 100%;
3173
+ padding: 8px;
3174
+ border-radius: 4px;
3175
+ text-align: left;
3176
+ font-size: 12px;
3177
+ }
3178
+ .dropdown-item:hover,
3179
+ .dropdown-item.selected {
3180
+ background: var(--soft);
3181
+ color: var(--teal);
3182
+ }
3183
+ .dropdown-item.disabled {
3184
+ color: var(--muted);
3185
+ opacity: .55;
3186
+ }
3187
+ .dropdown-group,
3188
+ .dropdown-empty {
3189
+ padding: 8px;
3190
+ font-size: 11px;
3191
+ color: var(--muted);
3192
+ }
3193
+
3194
+ /* Durable run records use the same page rhythm as the workbench. */
3195
+ .runs-workspace {
3196
+ display: grid;
3197
+ grid-template-columns: 270px minmax(0, 1fr);
3198
+ gap: 20px;
3199
+ align-items: start;
3200
+ }
3201
+ .run-empty {
3202
+ grid-column: 1 / -1;
3203
+ padding: 54px 24px;
3204
+ border: 1px solid var(--line);
3205
+ border-radius: 12px;
3206
+ background: var(--paper);
3207
+ text-align: center;
3208
+ }
3209
+ .run-empty h2 {
3210
+ margin: 0 0 10px;
3211
+ font-size: 20px;
3212
+ font-weight: 600;
3213
+ }
3214
+ .run-empty p {
3215
+ margin: 0 0 24px;
3216
+ color: var(--muted);
3217
+ font-size: 13px;
3218
+ }
3219
+ .run-list {
3220
+ max-height: 74vh;
3221
+ overflow: auto;
3222
+ }
3223
+ .run-card {
3224
+ display: grid;
3225
+ grid-template-columns: minmax(0, 1fr) auto;
3226
+ gap: 6px 10px;
3227
+ width: 100%;
3228
+ margin-bottom: 9px;
3229
+ padding: 15px;
3230
+ background: var(--paper);
3231
+ border: 1px solid var(--line);
3232
+ border-radius: 8px;
3233
+ text-align: left;
3234
+ }
3235
+ .run-card:hover,
3236
+ .run-card.active {
3237
+ border-color: #92bcae;
3238
+ background: #f2f8f5;
3239
+ }
3240
+ .run-card strong {
3241
+ font-size: 12px;
3242
+ overflow-wrap: anywhere;
3243
+ }
3244
+ .run-card small {
3245
+ grid-column: 1 / -1;
3246
+ color: var(--muted);
3247
+ font-size: 10px;
3248
+ overflow-wrap: anywhere;
3249
+ }
3250
+ .run-detail {
3251
+ min-height: 450px;
3252
+ min-width: 0;
3253
+ padding: 26px;
3254
+ border: 1px solid var(--line);
3255
+ border-radius: 12px;
3256
+ background: var(--paper);
3257
+ }
3258
+ .run-heading {
3259
+ display: flex;
3260
+ align-items: center;
3261
+ justify-content: space-between;
3262
+ gap: 12px;
3263
+ }
3264
+ .run-heading h2 {
3265
+ margin: 0;
3266
+ font-size: 20px;
3267
+ font-weight: 600;
3268
+ overflow-wrap: anywhere;
3269
+ }
3270
+ .run-status {
3271
+ display: inline-flex;
3272
+ align-items: center;
3273
+ align-self: center;
3274
+ flex-shrink: 0;
3275
+ padding: 3px 7px;
3276
+ border-radius: 4px;
3277
+ font-size: 10px;
3278
+ line-height: 1.4;
3279
+ color: #496676;
3280
+ background: #edf2f5;
3281
+ white-space: nowrap;
3282
+ }
3283
+ .run-status.done {
3284
+ background: #e4f1e9;
3285
+ color: var(--teal);
3286
+ }
3287
+ .run-status.error,
3288
+ .run-status.interrupted {
3289
+ background: #fcf0df;
3290
+ color: #985718;
3291
+ }
3292
+ .run-target,
3293
+ .run-identity {
3294
+ font-size: 11px;
3295
+ overflow-wrap: anywhere;
3296
+ }
3297
+ .run-total {
3298
+ display: flex;
3299
+ align-items: baseline;
3300
+ gap: 8px;
3301
+ padding: 18px 0;
3302
+ color: var(--muted);
3303
+ font-size: 12px;
3304
+ }
3305
+ .run-total strong {
3306
+ font-size: 38px;
3307
+ font-weight: 550;
3308
+ line-height: 1.2;
3309
+ color: var(--ink);
3310
+ }
3311
+ .run-warning {
3312
+ padding: 12px;
3313
+ font-size: 12px;
3314
+ border: 1px solid #e5d1b0;
3315
+ border-radius: 6px;
3316
+ background: #fffaf1;
3317
+ color: #915217;
3318
+ }
3319
+ .run-table-scroll {
3320
+ overflow: auto;
3321
+ }
3322
+ .run-table {
3323
+ width: 100%;
3324
+ border-collapse: collapse;
3325
+ font-size: 12px;
3326
+ text-align: left;
3327
+ }
3328
+ .run-table th {
3329
+ background: #f7f9fa;
3330
+ color: var(--muted);
3331
+ font-size: 11px;
3332
+ font-weight: 500;
3333
+ }
3334
+ .run-table th,
3335
+ .run-table td {
3336
+ padding: 11px 9px;
3337
+ border-bottom: 1px solid var(--line);
3338
+ overflow-wrap: anywhere;
3339
+ }
3340
+ .run-snapshot {
3341
+ padding: 20px 0;
3342
+ font-size: 12px;
3343
+ }
3344
+ .run-snapshot summary {
3345
+ cursor: pointer;
3346
+ color: var(--teal);
3347
+ }
3348
+ .run-snapshot pre {
3349
+ max-height: 320px;
3350
+ overflow: auto;
3351
+ padding: 16px;
3352
+ background: #f5f9fa;
3353
+ border: 1px solid var(--line);
3354
+ border-radius: 7px;
3355
+ font: 11px/1.8 var(--mono);
3356
+ }
3357
+ .run-actions {
3358
+ display: flex;
3359
+ gap: 8px;
3360
+ flex-wrap: wrap;
3361
+ }
3362
+ .run-notice {
3363
+ color: #985718;
3364
+ font-size: 12px;
3365
+ }
3366
+ @media (max-width: 760px) {
3367
+ #connection-label {
3368
+ max-width: 115px;
3369
+ }
3370
+ .runs-workspace {
3371
+ grid-template-columns: 1fr;
3372
+ }
3373
+ .run-list {
3374
+ max-height: 240px;
3375
+ }
3376
+ .run-detail {
3377
+ padding: 18px;
3378
+ }
3379
+ .connection-modal {
3380
+ padding: 20px;
3381
+ }
3382
+ }