pg_reports 0.8.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,17 +1,40 @@
1
1
  <style>
2
+ /* Field labels. Six near-identical rules had drifted apart (0.65–0.8rem,
3
+ three different letter-spacings, two colours); one definition now covers
4
+ every "small caps label above a value" in the report UI. */
5
+ .explain-label,
6
+ .explain-stat-label,
7
+ .row-detail-label,
8
+ .problem-field-label,
9
+ .saved-record-field-name,
10
+ .saved-record-detail-label {
11
+ display: block;
12
+ font-size: 0.6875rem;
13
+ font-weight: 600;
14
+ line-height: 1.4;
15
+ color: var(--text-muted);
16
+ text-transform: uppercase;
17
+ letter-spacing: 0.06em;
18
+ }
19
+
20
+ .explain-label,
21
+ .problem-field-label {
22
+ margin-bottom: 0.4rem;
23
+ }
24
+
2
25
  /* Documentation Section */
3
26
  .documentation-section {
4
27
  background: var(--bg-card);
5
28
  border: 1px solid var(--border-color);
6
- border-radius: 6px;
29
+ border-radius: var(--radius);
7
30
  overflow: hidden;
8
31
  }
9
32
 
10
33
  .documentation-toggle {
11
34
  display: flex;
12
35
  align-items: center;
13
- gap: 0.75rem;
14
- padding: 1rem 1.25rem;
36
+ gap: 0.6rem;
37
+ padding: 0.75rem 1rem;
15
38
  cursor: pointer;
16
39
  user-select: none;
17
40
  color: var(--text-secondary);
@@ -30,8 +53,10 @@
30
53
  }
31
54
 
32
55
  .toggle-icon {
33
- font-size: 0.75rem;
34
- transition: transform 0.2s;
56
+ width: 0.75rem;
57
+ height: 0.75rem;
58
+ color: var(--text-muted);
59
+ transition: transform 0.18s ease;
35
60
  }
36
61
 
37
62
  .documentation-section[open] .toggle-icon {
@@ -39,24 +64,28 @@
39
64
  }
40
65
 
41
66
  .documentation-content {
42
- padding: 1.25rem;
67
+ padding: 1rem;
43
68
  display: grid;
44
- gap: 1.25rem;
69
+ gap: 1rem;
45
70
  }
46
71
 
47
72
  .doc-block h4 {
48
- font-size: 0.875rem;
73
+ font-size: 0.6875rem;
49
74
  font-weight: 600;
50
- color: var(--accent-purple);
51
- margin-bottom: 0.5rem;
75
+ color: var(--text-muted);
52
76
  text-transform: uppercase;
53
- letter-spacing: 0.03em;
77
+ letter-spacing: 0.06em;
78
+ }
79
+
80
+ /* A heading belongs to the prose under it, not to the block above. */
81
+ .doc-block > h4 + * {
82
+ margin-top: 0.4rem;
54
83
  }
55
84
 
56
85
  .doc-block p {
57
86
  color: var(--text-secondary);
58
- line-height: 1.7;
59
- font-size: 0.9rem;
87
+ line-height: 1.65;
88
+ font-size: 0.8125rem;
60
89
  }
61
90
 
62
91
  .nuances-list {
@@ -70,23 +99,37 @@
70
99
 
71
100
  .nuances-list li {
72
101
  position: relative;
73
- padding-left: 1.5rem;
102
+ padding-left: 1rem;
74
103
  color: var(--text-secondary);
75
- font-size: 0.875rem;
104
+ font-size: 0.8125rem;
76
105
  line-height: 1.6;
77
106
  }
78
107
 
79
108
  .nuances-list li::before {
80
- content: '';
109
+ content: '';
81
110
  position: absolute;
82
- left: 0;
83
- color: var(--accent-amber);
111
+ left: 0.25rem;
112
+ top: 0.6rem;
113
+ width: 3px;
114
+ height: 3px;
115
+ border-radius: 50%;
116
+ background: var(--text-muted);
84
117
  }
85
118
 
86
119
  .thresholds-block {
87
120
  background: var(--bg-tertiary);
88
- padding: 1rem;
89
- border-radius: 8px;
121
+ border: 1px solid var(--border-color);
122
+ padding: 0.75rem 0.875rem;
123
+ border-radius: var(--radius-sm);
124
+ }
125
+
126
+ .thresholds-block h4 {
127
+ font-size: 0.6875rem;
128
+ font-weight: 600;
129
+ color: var(--text-muted);
130
+ margin-bottom: 0.5rem;
131
+ text-transform: uppercase;
132
+ letter-spacing: 0.06em;
90
133
  }
91
134
 
92
135
  .thresholds-grid {
@@ -101,7 +144,7 @@
101
144
  gap: 1rem;
102
145
  flex-wrap: wrap;
103
146
  font-size: 0.8rem;
104
- font-family: 'JetBrains Mono', monospace;
147
+ font-family: var(--font-mono);
105
148
  }
106
149
 
107
150
  .threshold-field {
@@ -138,7 +181,7 @@
138
181
  margin-top: 4px;
139
182
  background: var(--bg-card);
140
183
  border: 1px solid var(--border-color);
141
- border-radius: 6px;
184
+ border-radius: var(--radius);
142
185
  min-width: 160px;
143
186
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
144
187
  z-index: 100;
@@ -175,16 +218,17 @@
175
218
 
176
219
  .dropdown-menu .ai-icon {
177
220
  display: inline-block;
178
- font-size: 0.6rem;
179
- font-weight: 800;
180
- background: #8b5cf6;
181
- color: #fff;
221
+ font-size: 0.5625rem;
222
+ font-weight: 700;
223
+ background: var(--purple-soft);
224
+ border: 1px solid var(--purple-line);
225
+ color: var(--accent-purple);
182
226
  border-radius: 3px;
183
- padding: 0.1rem 0.3rem;
184
- letter-spacing: 0.03em;
185
- line-height: 1.2;
227
+ padding: 0.05rem 0.25rem;
228
+ letter-spacing: 0.06em;
229
+ line-height: 1.4;
186
230
  vertical-align: middle;
187
- margin-right: 0.2rem;
231
+ margin-right: 0.4rem;
188
232
  }
189
233
 
190
234
  /* Clickable rows */
@@ -211,76 +255,60 @@
211
255
 
212
256
  .results-table tbody tr.data-row.expanded td:first-child::before {
213
257
  content: '▾';
214
- color: var(--accent-purple);
258
+ color: var(--text-secondary);
215
259
  }
216
260
 
217
261
  /* Problem row highlighting */
218
- .results-table tbody tr.data-row.warning-row {
219
- background: rgba(245, 158, 11, 0.08);
220
- border-left: 3px solid var(--accent-amber);
262
+ .results-table tbody tr.data-row.warning-row td {
263
+ background: var(--amber-soft);
221
264
  }
222
265
 
223
- .results-table tbody tr.data-row.warning-row:hover {
224
- background: rgba(245, 158, 11, 0.12);
266
+ .results-table tbody tr.data-row.warning-row td:first-child {
267
+ box-shadow: inset 2px 0 0 var(--accent-amber);
225
268
  }
226
269
 
227
- .results-table tbody tr.data-row.critical-row {
228
- background: rgba(244, 63, 94, 0.08);
229
- border-left: 3px solid var(--accent-rose);
270
+ .results-table tbody tr.data-row.critical-row td {
271
+ background: var(--rose-soft);
230
272
  }
231
273
 
232
- .results-table tbody tr.data-row.critical-row:hover {
233
- background: rgba(244, 63, 94, 0.12);
274
+ .results-table tbody tr.data-row.critical-row td:first-child {
275
+ box-shadow: inset 2px 0 0 var(--accent-rose);
234
276
  }
235
277
 
236
278
  /* Problem indicator in row */
237
279
  .problem-indicator {
238
280
  display: inline-flex;
239
281
  align-items: center;
240
- gap: 0.25rem;
241
- margin-left: 0.5rem;
242
- padding: 0.125rem 0.375rem;
243
- border-radius: 4px;
244
- font-size: 0.65rem;
245
- font-weight: 600;
282
+ margin-left: 0.4rem;
283
+ padding: 0.15rem;
284
+ border-radius: var(--radius-sm);
246
285
  cursor: pointer;
247
- transition: all 0.15s;
248
- }
249
-
250
- .problem-indicator.warning {
251
- background: rgba(245, 158, 11, 0.2);
252
- color: var(--accent-amber);
286
+ vertical-align: middle;
287
+ transition: background-color 0.12s ease;
253
288
  }
254
289
 
255
- .problem-indicator.warning:hover {
256
- background: rgba(245, 158, 11, 0.35);
257
- }
290
+ .problem-indicator.warning { color: var(--accent-amber); }
291
+ .problem-indicator.warning:hover { background: var(--amber-soft); }
258
292
 
259
- .problem-indicator.critical {
260
- background: rgba(244, 63, 94, 0.2);
261
- color: var(--accent-rose);
262
- }
263
-
264
- .problem-indicator.critical:hover {
265
- background: rgba(244, 63, 94, 0.35);
266
- }
293
+ .problem-indicator.critical { color: var(--accent-rose); }
294
+ .problem-indicator.critical:hover { background: var(--rose-soft); }
267
295
 
268
296
  /* Problem Modal */
269
297
  .problem-modal {
270
298
  position: fixed;
271
299
  inset: 0;
272
- background: rgba(0, 0, 0, 0.7);
300
+ background: rgba(10, 11, 12, 0.72);
273
301
  display: flex;
274
302
  align-items: center;
275
303
  justify-content: center;
304
+ padding: 1.5rem;
276
305
  z-index: 1000;
277
- backdrop-filter: blur(4px);
278
306
  }
279
307
 
280
308
  .problem-modal-content {
281
309
  background: var(--bg-card);
282
310
  border: 1px solid var(--border-color);
283
- border-radius: 6px;
311
+ border-radius: var(--radius);
284
312
  max-width: 600px;
285
313
  width: 90%;
286
314
  max-height: 80vh;
@@ -295,11 +323,11 @@
295
323
  }
296
324
  .problem-modal-content::-webkit-scrollbar-track {
297
325
  background: var(--bg-secondary);
298
- border-radius: 4px;
326
+ border-radius: var(--radius-sm);
299
327
  }
300
328
  .problem-modal-content::-webkit-scrollbar-thumb {
301
329
  background: var(--border-color);
302
- border-radius: 4px;
330
+ border-radius: var(--radius-sm);
303
331
  }
304
332
  .problem-modal-content::-webkit-scrollbar-thumb:hover {
305
333
  background: var(--text-muted);
@@ -309,13 +337,13 @@
309
337
  display: flex;
310
338
  align-items: center;
311
339
  justify-content: space-between;
312
- padding: 1.25rem 1.5rem;
340
+ padding: 0.875rem 1rem;
313
341
  border-bottom: 1px solid var(--border-color);
314
- background: rgba(244, 63, 94, 0.1);
342
+ background: var(--rose-soft);
315
343
  }
316
344
 
317
345
  .problem-modal-header h3 {
318
- font-size: 1.125rem;
346
+ font-size: 1rem;
319
347
  font-weight: 600;
320
348
  color: var(--accent-rose);
321
349
  }
@@ -336,43 +364,38 @@
336
364
  gap: 0.375rem;
337
365
  }
338
366
 
339
- .problem-field-label {
340
- font-size: 0.75rem;
341
- font-weight: 600;
342
- color: var(--text-muted);
343
- text-transform: uppercase;
344
- }
345
-
346
367
  .problem-field-value {
347
- font-family: 'JetBrains Mono', monospace;
368
+ font-family: var(--font-mono);
348
369
  font-size: 0.9rem;
349
370
  padding: 0.75rem;
350
371
  background: var(--bg-tertiary);
351
- border-radius: 8px;
372
+ border-radius: var(--radius-sm);
352
373
  }
353
374
 
354
375
  .problem-field-value.critical {
355
376
  color: var(--accent-rose);
356
- border-left: 3px solid var(--accent-rose);
377
+ box-shadow: inset 2px 0 0 var(--accent-rose);
357
378
  }
358
379
 
359
380
  .problem-field-value.warning {
360
381
  color: var(--accent-amber);
361
- border-left: 3px solid var(--accent-amber);
382
+ box-shadow: inset 2px 0 0 var(--accent-amber);
362
383
  }
363
384
 
364
385
  .problem-explanation {
365
- padding: 1rem;
386
+ padding: 0.875rem 1rem;
366
387
  background: var(--bg-tertiary);
367
- border-radius: 8px;
388
+ border: 1px solid var(--border-color);
389
+ border-radius: var(--radius-sm);
368
390
  color: var(--text-secondary);
391
+ font-size: 0.8125rem;
369
392
  line-height: 1.6;
370
393
  }
371
394
 
372
395
  .problem-explanation h4 {
373
396
  color: var(--text-primary);
374
- margin-bottom: 0.5rem;
375
- font-size: 0.875rem;
397
+ margin-bottom: 0.4rem;
398
+ font-size: 0.8125rem;
376
399
  }
377
400
 
378
401
  /* Expanded row detail */
@@ -387,7 +410,7 @@
387
410
  .results-table tbody tr.detail-row td {
388
411
  padding: 0;
389
412
  background: var(--bg-primary);
390
- border-bottom: 2px solid var(--accent-purple);
413
+ border-bottom: 1px solid var(--border-strong);
391
414
  }
392
415
 
393
416
  .row-detail {
@@ -407,20 +430,12 @@
407
430
  grid-column: 1 / -1;
408
431
  }
409
432
 
410
- .row-detail-label {
411
- font-size: 0.7rem;
412
- font-weight: 600;
413
- color: var(--text-muted);
414
- text-transform: uppercase;
415
- letter-spacing: 0.05em;
416
- }
417
-
418
433
  .row-detail-value {
419
434
  padding: 0.75rem 1rem;
420
435
  background: var(--bg-card);
421
436
  border: 1px solid var(--border-color);
422
- border-radius: 8px;
423
- font-family: 'JetBrains Mono', monospace;
437
+ border-radius: var(--radius-sm);
438
+ font-family: var(--font-mono);
424
439
  font-size: 0.8rem;
425
440
  color: var(--text-primary);
426
441
  white-space: pre-wrap;
@@ -444,36 +459,82 @@
444
459
  }
445
460
 
446
461
  .row-detail-value.problem-warning {
447
- border-color: var(--accent-amber);
448
- background: rgba(245, 158, 11, 0.1);
462
+ border-color: var(--amber-line);
463
+ background: var(--amber-soft);
449
464
  }
450
465
 
451
466
  .row-detail-value.problem-critical {
452
- border-color: var(--accent-rose);
453
- background: rgba(244, 63, 94, 0.1);
467
+ border-color: var(--rose-line);
468
+ background: var(--rose-soft);
454
469
  }
455
470
 
456
471
  /* Source location badge in table */
457
472
  .source-badge {
458
- display: inline-block;
459
- padding: 0.25rem 0.5rem;
460
- background: rgba(245, 158, 11, 0.15);
461
- border: 1px solid rgba(245, 158, 11, 0.3);
462
- border-radius: 6px;
463
- font-family: 'JetBrains Mono', monospace;
473
+ display: inline-flex;
474
+ align-items: baseline;
475
+ /* Never wider than the cell it sits in, whatever the path looks like. */
476
+ max-width: min(22rem, 100%);
477
+ min-width: 0;
478
+ overflow: hidden;
479
+ padding: 0.15rem 0.4rem;
480
+ background: var(--bg-tertiary);
481
+ border: 1px solid var(--border-color);
482
+ border-radius: var(--radius-sm);
483
+ font-family: var(--font-mono);
464
484
  font-size: 0.7rem;
465
- color: var(--accent-amber);
485
+ color: var(--text-secondary);
466
486
  white-space: nowrap;
467
- max-width: 200px;
468
- overflow: hidden;
469
- text-overflow: ellipsis;
470
487
  text-decoration: none;
471
- transition: all 0.15s;
488
+ vertical-align: middle;
489
+ transition: background-color 0.12s ease, border-color 0.12s ease, color 0.12s ease;
490
+ }
491
+
492
+ /* Both halves are clipped at their *start*: the tail of a path (file name and
493
+ line) is what identifies the call site, so it is the last thing to go.
494
+ justify-content: flex-end pins the inner span's right edge and lets the
495
+ overflow fall off the left, where the parent clips it.
496
+ Not `direction: rtl` + text-overflow — bidi reorders numeric path segments
497
+ (a gem's "3.4.0" jumps out of place). */
498
+ .source-dir,
499
+ .source-file {
500
+ min-width: 0;
501
+ display: flex;
502
+ justify-content: flex-end;
503
+ overflow: hidden;
504
+ }
505
+
506
+ .source-dir > span,
507
+ .source-file > span {
508
+ flex: none;
509
+ white-space: nowrap;
510
+ }
511
+
512
+ /* The directory is given up first and almost entirely; the file name only
513
+ starts losing characters once there is no directory left to drop. */
514
+ .source-dir {
515
+ flex: 0 1000 auto;
516
+ color: var(--text-muted);
517
+ }
518
+
519
+ .source-file {
520
+ flex: 0 1 auto;
521
+ }
522
+
523
+ /* Only shown once layout proves the directory really is cut off. */
524
+ .source-ellipsis {
525
+ flex: none;
526
+ display: none;
527
+ color: var(--text-muted);
528
+ }
529
+
530
+ .source-badge.is-clipped .source-ellipsis {
531
+ display: inline;
472
532
  }
473
533
 
474
534
  .source-badge:hover {
475
- background: rgba(245, 158, 11, 0.25);
476
- border-color: rgba(245, 158, 11, 0.5);
535
+ background: var(--bg-hover);
536
+ border-color: var(--border-strong);
537
+ color: var(--text-primary);
477
538
  }
478
539
 
479
540
  .source-badge.clickable {
@@ -481,8 +542,15 @@
481
542
  }
482
543
 
483
544
  .source-badge.clickable::after {
484
- content: ' ↗';
485
- opacity: 0.7;
545
+ content: '↗';
546
+ flex: none;
547
+ margin-left: 0.25rem;
548
+ opacity: 0.6;
549
+ }
550
+
551
+ .source-badge.clickable:hover .source-dir,
552
+ .source-badge.clickable:hover .source-file {
553
+ color: var(--text-primary);
486
554
  }
487
555
 
488
556
  .source-badge.empty {
@@ -499,7 +567,7 @@
499
567
  padding: 0.25rem 0.625rem;
500
568
  background: var(--bg-tertiary);
501
569
  border: 1px solid var(--border-color);
502
- border-radius: 6px;
570
+ border-radius: var(--radius);
503
571
  color: var(--text-muted);
504
572
  font-size: 0.7rem;
505
573
  cursor: pointer;
@@ -507,9 +575,9 @@
507
575
  }
508
576
 
509
577
  .copy-btn:hover {
510
- background: var(--accent-purple);
511
- border-color: var(--accent-purple);
512
- color: white;
578
+ background: var(--bg-hover);
579
+ border-color: var(--border-strong);
580
+ color: var(--text-primary);
513
581
  }
514
582
 
515
583
  /* Row hint */
@@ -518,7 +586,7 @@
518
586
  margin-left: 0.5rem;
519
587
  padding: 0.125rem 0.5rem;
520
588
  background: var(--bg-tertiary);
521
- border-radius: 4px;
589
+ border-radius: var(--radius-sm);
522
590
  font-size: 0.7rem;
523
591
  color: var(--text-muted);
524
592
  }
@@ -533,7 +601,7 @@
533
601
  position: fixed;
534
602
  background: var(--bg-card);
535
603
  border: 1px solid var(--border-color);
536
- border-radius: 8px;
604
+ border-radius: var(--radius-sm);
537
605
  min-width: 140px;
538
606
  box-shadow: 0 5px 20px rgba(0, 0, 0, 0.4);
539
607
  z-index: 10000;
@@ -595,99 +663,18 @@
595
663
 
596
664
  .results-table th.sorted .sort-indicator {
597
665
  opacity: 1;
598
- color: var(--accent-purple);
666
+ color: var(--text-primary);
599
667
  }
600
668
 
601
669
  .results-table th.sorted {
602
670
  background: var(--bg-secondary);
603
671
  }
604
672
 
605
- /* IDE Settings */
606
- .btn-icon {
607
- width: 40px;
608
- padding: 0;
609
- background: var(--bg-tertiary);
610
- border: 1px solid var(--border-color);
611
- }
612
-
613
- .btn-icon:hover {
614
- background: var(--bg-secondary);
615
- }
616
-
617
- .settings-label {
618
- color: var(--text-secondary);
619
- margin-bottom: 1rem;
620
- font-size: 0.9rem;
621
- }
622
-
623
- .ide-options {
624
- display: flex;
625
- flex-direction: column;
626
- gap: 0.5rem;
627
- }
628
-
629
- .ide-option {
630
- display: flex;
631
- align-items: center;
632
- gap: 0.75rem;
633
- padding: 0.75rem 1rem;
634
- background: var(--bg-tertiary);
635
- border: 1px solid var(--border-color);
636
- border-radius: 8px;
637
- cursor: pointer;
638
- transition: all 0.15s;
639
- }
640
-
641
- .ide-option:hover {
642
- background: var(--bg-secondary);
643
- border-color: var(--accent-purple);
644
- }
645
-
646
- .ide-option:has(input:checked) {
647
- background: rgba(157, 140, 214, 0.15);
648
- border-color: var(--accent-purple);
649
- }
650
-
651
- .ide-option input[type="radio"] {
652
- accent-color: var(--accent-purple);
653
- }
654
-
655
- .ide-option span {
656
- color: var(--text-secondary);
657
- font-size: 0.875rem;
658
- }
659
-
660
- .ide-option:has(input:checked) span {
661
- color: var(--text-primary);
662
- }
663
-
664
- .modal-small {
665
- max-width: 360px;
666
- }
667
-
668
- /* Button variants */
669
- .btn.btn-small {
670
- padding: 0.5rem 1rem;
671
- height: auto;
672
- font-size: 0.8rem;
673
- }
674
-
675
- .btn.btn-muted {
676
- background: var(--bg-tertiary);
677
- border-color: var(--accent-rose);
678
- color: var(--text-secondary);
679
- }
680
-
681
- .btn.btn-muted:hover {
682
- background: var(--bg-card);
683
- color: var(--text-primary);
684
- }
685
-
686
673
  /* Saved Records Section */
687
674
  .saved-records-section {
688
675
  background: var(--bg-card);
689
- border: 1px solid var(--accent-purple);
690
- border-radius: 6px;
676
+ border: 1px solid var(--border-color);
677
+ border-radius: var(--radius);
691
678
  margin-bottom: 1rem;
692
679
  overflow: hidden;
693
680
  }
@@ -696,15 +683,15 @@
696
683
  display: flex;
697
684
  align-items: center;
698
685
  justify-content: space-between;
699
- padding: 0.75rem 1rem;
700
- background: rgba(157, 140, 214, 0.1);
686
+ padding: 0.625rem 1rem;
687
+ background: var(--bg-tertiary);
701
688
  border-bottom: 1px solid var(--border-color);
702
689
  }
703
690
 
704
691
  .saved-records-title {
705
692
  font-weight: 600;
706
- color: var(--accent-purple);
707
- font-size: 0.9rem;
693
+ color: var(--text-primary);
694
+ font-size: 0.875rem;
708
695
  }
709
696
 
710
697
  .saved-records-list {
@@ -719,7 +706,7 @@
719
706
  .saved-record-card {
720
707
  background: var(--bg-tertiary);
721
708
  border: 1px solid var(--border-color);
722
- border-radius: 8px;
709
+ border-radius: var(--radius-sm);
723
710
  padding: 0.75rem;
724
711
  position: relative;
725
712
  cursor: pointer;
@@ -727,13 +714,12 @@
727
714
  }
728
715
 
729
716
  .saved-record-card:hover {
730
- border-color: var(--accent-purple);
731
- background: var(--bg-secondary);
717
+ border-color: var(--border-strong);
732
718
  }
733
719
 
734
720
  .saved-record-card.expanded {
735
721
  background: var(--bg-card);
736
- border-color: var(--accent-purple);
722
+ border-color: var(--border-strong);
737
723
  }
738
724
 
739
725
  .saved-record-header {
@@ -746,7 +732,7 @@
746
732
  .saved-record-time {
747
733
  font-size: 0.7rem;
748
734
  color: var(--text-muted);
749
- font-family: 'JetBrains Mono', monospace;
735
+ font-family: var(--font-mono);
750
736
  }
751
737
 
752
738
  .saved-record-remove {
@@ -755,7 +741,7 @@
755
741
  padding: 0;
756
742
  background: transparent;
757
743
  border: 1px solid transparent;
758
- border-radius: 4px;
744
+ border-radius: var(--radius-sm);
759
745
  color: var(--text-muted);
760
746
  font-size: 1rem;
761
747
  cursor: pointer;
@@ -763,9 +749,9 @@
763
749
  }
764
750
 
765
751
  .saved-record-remove:hover {
766
- background: var(--accent-rose);
767
- border-color: var(--accent-rose);
768
- color: white;
752
+ background: var(--rose-soft);
753
+ border-color: var(--rose-line);
754
+ color: var(--accent-rose);
769
755
  }
770
756
 
771
757
  .saved-record-data {
@@ -781,15 +767,9 @@
781
767
  gap: 0.125rem;
782
768
  }
783
769
 
784
- .saved-record-field-name {
785
- color: var(--text-muted);
786
- font-size: 0.65rem;
787
- text-transform: uppercase;
788
- }
789
-
790
770
  .saved-record-field-value {
791
771
  color: var(--text-primary);
792
- font-family: 'JetBrains Mono', monospace;
772
+ font-family: var(--font-mono);
793
773
  white-space: nowrap;
794
774
  overflow: hidden;
795
775
  text-overflow: ellipsis;
@@ -806,8 +786,8 @@
806
786
  padding: 0.75rem;
807
787
  background: var(--bg-primary);
808
788
  border: 1px solid var(--border-color);
809
- border-radius: 6px;
810
- font-family: 'JetBrains Mono', monospace;
789
+ border-radius: var(--radius);
790
+ font-family: var(--font-mono);
811
791
  font-size: 0.75rem;
812
792
  color: var(--accent-green);
813
793
  white-space: pre-wrap;
@@ -854,18 +834,12 @@
854
834
  grid-column: 1 / -1;
855
835
  }
856
836
 
857
- .saved-record-detail-label {
858
- font-size: 0.65rem;
859
- color: var(--text-muted);
860
- text-transform: uppercase;
861
- }
862
-
863
837
  .saved-record-detail-value {
864
838
  padding: 0.5rem;
865
839
  background: var(--bg-primary);
866
840
  border: 1px solid var(--border-color);
867
- border-radius: 6px;
868
- font-family: 'JetBrains Mono', monospace;
841
+ border-radius: var(--radius);
842
+ font-family: var(--font-mono);
869
843
  font-size: 0.75rem;
870
844
  color: var(--text-primary);
871
845
  }
@@ -887,67 +861,54 @@
887
861
  grid-column: 1 / -1;
888
862
  display: flex;
889
863
  gap: 0.5rem;
864
+ margin-top: 0.75rem;
890
865
  padding-top: 0.75rem;
891
866
  border-top: 1px solid var(--border-color);
892
- margin-top: 0.5rem;
893
867
  }
894
868
 
895
- .btn-save {
896
- padding: 0.375rem 0.75rem;
869
+ /* Row action buttons — one control, differing only by intent. */
870
+ .btn-save,
871
+ .btn-explain,
872
+ .btn-migration {
873
+ display: inline-flex;
874
+ align-items: center;
875
+ gap: 0.35rem;
876
+ height: var(--control-h-sm);
877
+ padding: 0 0.625rem;
897
878
  background: var(--bg-tertiary);
898
- border: 1px solid var(--accent-purple);
899
- border-radius: 6px;
900
- color: var(--accent-purple);
879
+ border: 1px solid var(--border-color);
880
+ border-radius: var(--radius-sm);
881
+ color: var(--text-secondary);
882
+ font-family: inherit;
901
883
  font-size: 0.75rem;
884
+ font-weight: 500;
902
885
  cursor: pointer;
903
- transition: all 0.15s;
886
+ transition: background-color 0.12s ease, border-color 0.12s ease, color 0.12s ease;
904
887
  }
905
888
 
906
- .btn-save:hover {
907
- background: var(--accent-purple);
908
- color: white;
889
+ .btn-save:hover,
890
+ .btn-explain:hover,
891
+ .btn-migration:hover {
892
+ background: var(--bg-hover);
893
+ border-color: var(--border-strong);
894
+ color: var(--text-primary);
909
895
  }
910
896
 
911
897
  .btn-save.saved {
912
- background: var(--accent-purple);
913
- color: white;
914
- }
915
-
916
- .btn-save.saved:hover {
917
- background: var(--accent-rose);
918
- border-color: var(--accent-rose);
919
- }
920
-
921
- .btn-explain {
922
- padding: 0.375rem 0.75rem;
923
- background: var(--bg-tertiary);
924
- border: 1px solid var(--accent-blue);
925
- border-radius: 6px;
926
- color: var(--accent-blue);
927
- font-size: 0.75rem;
928
- cursor: pointer;
929
- transition: all 0.15s;
898
+ background: var(--purple-soft);
899
+ border-color: var(--purple-line);
900
+ color: var(--accent-purple);
930
901
  }
931
902
 
932
- .btn-explain:hover {
933
- background: var(--accent-blue);
934
- color: white;
903
+ .btn-migration:disabled {
904
+ opacity: 0.45;
905
+ cursor: not-allowed;
935
906
  }
936
907
 
937
- .btn-migration {
938
- padding: 0.375rem 0.75rem;
908
+ .btn-migration:disabled:hover {
939
909
  background: var(--bg-tertiary);
940
- border: 1px solid var(--accent-amber);
941
- border-radius: 6px;
942
- color: var(--accent-amber);
943
- font-size: 0.75rem;
944
- cursor: pointer;
945
- transition: all 0.15s;
946
- }
947
-
948
- .btn-migration:hover {
949
- background: var(--accent-amber);
950
- color: var(--bg-primary);
910
+ border-color: var(--border-color);
911
+ color: var(--text-secondary);
951
912
  }
952
913
 
953
914
  /* EXPLAIN Modal */
@@ -955,70 +916,13 @@
955
916
  max-width: 900px;
956
917
  }
957
918
 
958
- .explain-result {
959
- font-family: 'JetBrains Mono', monospace;
960
- font-size: 0.8rem;
961
- background: var(--bg-primary);
962
- border: 1px solid var(--border-color);
963
- border-radius: 8px;
964
- padding: 1rem;
965
- white-space: pre-wrap;
966
- overflow-x: auto;
967
- max-height: 500px;
968
- overflow-y: auto;
969
- color: var(--accent-green);
970
- line-height: 1.5;
971
- }
972
-
973
- .explain-stats {
974
- display: grid;
975
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
976
- gap: 0.75rem;
977
- margin-bottom: 1rem;
978
- padding: 1rem;
979
- background: var(--bg-tertiary);
980
- border-radius: 8px;
981
- }
982
-
983
- .explain-stat {
984
- display: flex;
985
- flex-direction: column;
986
- gap: 0.25rem;
987
- }
988
-
989
- .explain-stat-label {
990
- font-size: 0.7rem;
991
- color: var(--text-muted);
992
- text-transform: uppercase;
993
- }
994
-
995
- .explain-stat-value {
996
- font-family: 'JetBrains Mono', monospace;
997
- font-size: 0.9rem;
998
- color: var(--accent-blue);
999
- font-weight: 600;
1000
- }
1001
-
1002
919
  /* Query Analyzer Modal */
1003
- .explain-query-section {
1004
- margin-bottom: 1rem;
1005
- }
1006
-
1007
- .explain-label {
1008
- display: block;
1009
- font-size: 0.75rem;
1010
- font-weight: 600;
1011
- color: var(--text-muted);
1012
- text-transform: uppercase;
1013
- margin-bottom: 0.5rem;
1014
- }
1015
-
1016
920
  .explain-query {
1017
- font-family: 'JetBrains Mono', monospace;
921
+ font-family: var(--font-mono);
1018
922
  font-size: 0.8rem;
1019
923
  background: var(--bg-primary);
1020
924
  border: 1px solid var(--border-color);
1021
- border-radius: 8px;
925
+ border-radius: var(--radius-sm);
1022
926
  padding: 1rem;
1023
927
  color: var(--accent-green);
1024
928
  white-space: pre-wrap;
@@ -1030,17 +934,16 @@
1030
934
 
1031
935
  .explain-query .query-param {
1032
936
  color: var(--accent-rose);
1033
- background: rgba(217, 112, 132, 0.15);
937
+ background: var(--rose-soft);
1034
938
  padding: 0.1rem 0.3rem;
1035
939
  border-radius: 3px;
1036
940
  font-weight: 600;
1037
941
  }
1038
942
 
1039
943
  .explain-params-section {
1040
- margin-bottom: 1rem;
1041
944
  padding: 1rem;
1042
945
  background: var(--bg-tertiary);
1043
- border-radius: 8px;
946
+ border-radius: var(--radius-sm);
1044
947
  }
1045
948
 
1046
949
  .explain-params-grid {
@@ -1058,24 +961,24 @@
1058
961
  .param-input-label {
1059
962
  font-size: 0.7rem;
1060
963
  color: var(--accent-blue);
1061
- font-family: 'JetBrains Mono', monospace;
964
+ font-family: var(--font-mono);
1062
965
  }
1063
966
 
1064
967
  .param-input {
1065
968
  padding: 0.5rem 0.75rem;
1066
969
  background: var(--bg-primary);
1067
970
  border: 1px solid var(--border-color);
1068
- border-radius: 6px;
971
+ border-radius: var(--radius);
1069
972
  color: var(--text-primary);
1070
- font-family: 'JetBrains Mono', monospace;
973
+ font-family: var(--font-mono);
1071
974
  font-size: 0.8rem;
1072
975
  transition: all 0.15s;
1073
976
  }
1074
977
 
1075
- .param-input:focus {
1076
- outline: none;
978
+ .param-input:focus-visible {
979
+ outline: 2px solid var(--accent-blue);
980
+ outline-offset: -1px;
1077
981
  border-color: var(--accent-blue);
1078
- box-shadow: 0 0 0 2px rgba(107, 159, 232, 0.2);
1079
982
  }
1080
983
 
1081
984
  .param-input::placeholder {
@@ -1085,27 +988,21 @@
1085
988
 
1086
989
  .explain-actions {
1087
990
  display: flex;
1088
- gap: 0.75rem;
1089
- margin-bottom: 1rem;
1090
- }
1091
-
1092
- .explain-actions .btn {
1093
- flex: 1;
991
+ gap: 0.5rem;
1094
992
  }
1095
993
 
1096
994
  /* Query Results Table */
1097
995
  .query-results-wrapper {
1098
- margin-top: 1rem;
1099
996
  max-height: 400px;
1100
997
  overflow: auto;
1101
998
  border: 1px solid var(--border-color);
1102
- border-radius: 8px;
999
+ border-radius: var(--radius-sm);
1103
1000
  }
1104
1001
 
1105
1002
  .query-results-table {
1106
1003
  width: 100%;
1107
1004
  border-collapse: collapse;
1108
- font-family: 'JetBrains Mono', monospace;
1005
+ font-family: var(--font-mono);
1109
1006
  font-size: 0.75rem;
1110
1007
  }
1111
1008
 
@@ -1144,8 +1041,7 @@
1144
1041
  justify-content: space-between;
1145
1042
  padding: 0.75rem 1rem;
1146
1043
  background: var(--bg-tertiary);
1147
- border-radius: 8px;
1148
- margin-top: 1rem;
1044
+ border-radius: var(--radius-sm);
1149
1045
  font-size: 0.8rem;
1150
1046
  color: var(--text-secondary);
1151
1047
  }
@@ -1162,22 +1058,21 @@
1162
1058
 
1163
1059
  /* Migration Modal */
1164
1060
  .migration-code {
1165
- font-family: 'JetBrains Mono', monospace;
1061
+ font-family: var(--font-mono);
1166
1062
  font-size: 0.8rem;
1167
1063
  background: var(--bg-primary);
1168
1064
  border: 1px solid var(--border-color);
1169
- border-radius: 8px;
1065
+ border-radius: var(--radius-sm);
1170
1066
  padding: 1rem;
1171
1067
  white-space: pre;
1172
1068
  overflow-x: auto;
1173
1069
  color: var(--accent-green);
1174
1070
  line-height: 1.5;
1175
- margin-bottom: 1rem;
1176
1071
  }
1177
1072
 
1178
1073
  .migration-actions {
1179
1074
  display: flex;
1180
- gap: 0.75rem;
1075
+ gap: 0.5rem;
1181
1076
  justify-content: flex-end;
1182
1077
  }
1183
1078
 
@@ -1199,7 +1094,7 @@
1199
1094
  .filter-section {
1200
1095
  background: var(--bg-card);
1201
1096
  border: 1px solid var(--border-color);
1202
- border-radius: 6px;
1097
+ border-radius: var(--radius);
1203
1098
  overflow: hidden;
1204
1099
  }
1205
1100
 
@@ -1211,8 +1106,8 @@
1211
1106
  .filter-toggle {
1212
1107
  display: flex;
1213
1108
  align-items: center;
1214
- gap: 0.75rem;
1215
- padding: 1rem 1.25rem;
1109
+ gap: 0.6rem;
1110
+ padding: 0.75rem 1rem;
1216
1111
  margin: 0;
1217
1112
  cursor: pointer;
1218
1113
  user-select: none;
@@ -1264,18 +1159,17 @@
1264
1159
  .filter-label {
1265
1160
  display: flex;
1266
1161
  flex-direction: column;
1267
- gap: 0.25rem;
1162
+ gap: 0.2rem;
1268
1163
  font-weight: 500;
1269
1164
  color: var(--text-primary);
1270
- font-size: 0.9rem;
1165
+ font-size: 0.8125rem;
1271
1166
  line-height: 1.4;
1272
1167
  }
1273
1168
 
1274
1169
  .filter-description {
1275
- font-size: 0.8rem;
1170
+ font-size: 0.75rem;
1276
1171
  font-weight: 400;
1277
- color: var(--text-secondary);
1278
- opacity: 0.8;
1172
+ color: var(--text-muted);
1279
1173
  }
1280
1174
 
1281
1175
  .filter-current-value {
@@ -1286,21 +1180,23 @@
1286
1180
  }
1287
1181
 
1288
1182
  .filter-input {
1289
- padding: 0.625rem 0.875rem;
1183
+ height: var(--control-h);
1184
+ padding: 0 0.625rem;
1290
1185
  border: 1px solid var(--border-color);
1291
- border-radius: 8px;
1292
- font-size: 1rem;
1186
+ border-radius: var(--radius-sm);
1187
+ font-family: var(--font-mono);
1188
+ font-size: 0.8125rem;
1293
1189
  background: var(--bg-primary);
1294
1190
  color: var(--text-primary);
1295
- transition: all 0.15s;
1296
- min-width: 120px;
1297
- max-width: 200px;
1191
+ transition: border-color 0.12s ease;
1192
+ min-width: 100px;
1193
+ max-width: 160px;
1298
1194
  }
1299
1195
 
1300
- .filter-input:focus {
1301
- outline: none;
1196
+ .filter-input:focus-visible {
1197
+ outline: 2px solid var(--accent-blue);
1198
+ outline-offset: -1px;
1302
1199
  border-color: var(--accent-blue);
1303
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
1304
1200
  }
1305
1201
 
1306
1202
  /* ==========================================
@@ -1310,26 +1206,18 @@
1310
1206
  /* Summary card at top */
1311
1207
  .explain-summary {
1312
1208
  background: var(--bg-card);
1313
- border-radius: 6px;
1314
- padding: 1.25rem;
1315
- margin-bottom: 1.5rem;
1316
- border-left: 4px solid var(--accent-blue);
1317
- }
1318
-
1319
- .explain-summary-good {
1320
- border-left-color: var(--accent-green);
1321
- background: linear-gradient(135deg, rgba(16, 185, 129, 0.05) 0%, var(--bg-card) 100%);
1209
+ border: 1px solid var(--border-color);
1210
+ border-radius: var(--radius);
1211
+ padding: 1rem 1.25rem;
1322
1212
  }
1323
1213
 
1324
- .explain-summary-warning {
1325
- border-left-color: var(--accent-amber);
1326
- background: linear-gradient(135deg, rgba(245, 158, 11, 0.05) 0%, var(--bg-card) 100%);
1327
- }
1214
+ .explain-summary-good { border-color: var(--green-line); }
1215
+ .explain-summary-warning { border-color: var(--amber-line); }
1216
+ .explain-summary-critical { border-color: var(--rose-line); }
1328
1217
 
1329
- .explain-summary-critical {
1330
- border-left-color: #ef4444;
1331
- background: linear-gradient(135deg, rgba(239, 68, 68, 0.05) 0%, var(--bg-card) 100%);
1332
- }
1218
+ .explain-summary-good .explain-summary-icon { color: var(--accent-green); }
1219
+ .explain-summary-warning .explain-summary-icon { color: var(--accent-amber); }
1220
+ .explain-summary-critical .explain-summary-icon { color: var(--accent-rose); }
1333
1221
 
1334
1222
  .explain-summary-header {
1335
1223
  display: flex;
@@ -1339,7 +1227,9 @@
1339
1227
  }
1340
1228
 
1341
1229
  .explain-summary-icon {
1342
- font-size: 1.5rem;
1230
+ width: 1.125rem;
1231
+ height: 1.125rem;
1232
+ color: var(--text-muted);
1343
1233
  }
1344
1234
 
1345
1235
  .explain-summary-title {
@@ -1355,19 +1245,25 @@
1355
1245
  }
1356
1246
 
1357
1247
  .explain-summary-stat {
1358
- font-size: 0.875rem;
1359
- padding: 0.375rem 0.75rem;
1360
- border-radius: 6px;
1248
+ display: inline-flex;
1249
+ align-items: center;
1250
+ gap: 0.35rem;
1251
+ font-size: 0.8125rem;
1252
+ padding: 0.25rem 0.5rem;
1253
+ border: 1px solid transparent;
1254
+ border-radius: var(--radius-sm);
1361
1255
  font-weight: 500;
1362
1256
  }
1363
1257
 
1364
1258
  .explain-summary-stat.critical {
1365
- background: rgba(239, 68, 68, 0.1);
1366
- color: #f87171;
1259
+ background: var(--rose-soft);
1260
+ border-color: var(--rose-line);
1261
+ color: var(--accent-rose);
1367
1262
  }
1368
1263
 
1369
1264
  .explain-summary-stat.warning {
1370
- background: rgba(245, 158, 11, 0.1);
1265
+ background: var(--amber-soft);
1266
+ border-color: var(--amber-line);
1371
1267
  color: var(--accent-amber);
1372
1268
  }
1373
1269
 
@@ -1375,14 +1271,13 @@
1375
1271
  .explain-stats {
1376
1272
  display: grid;
1377
1273
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
1378
- gap: 1rem;
1379
- margin-bottom: 1.5rem;
1274
+ gap: 0.75rem;
1380
1275
  }
1381
1276
 
1382
1277
  .explain-stat {
1383
1278
  background: var(--bg-card);
1384
1279
  border: 1px solid var(--border-color);
1385
- border-radius: 6px;
1280
+ border-radius: var(--radius);
1386
1281
  padding: 1rem;
1387
1282
  display: flex;
1388
1283
  flex-direction: column;
@@ -1390,51 +1285,38 @@
1390
1285
  transition: all 0.15s;
1391
1286
  }
1392
1287
 
1393
- .explain-stat:hover {
1394
- border-color: var(--accent-blue);
1395
- transform: translateY(-2px);
1396
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
1397
- }
1398
-
1399
1288
  .explain-stat.stat-warning {
1400
- border-color: var(--accent-amber);
1401
- background: linear-gradient(135deg, rgba(245, 158, 11, 0.03) 0%, var(--bg-card) 100%);
1289
+ border-color: var(--amber-line);
1402
1290
  }
1403
1291
 
1292
+ .explain-stat.stat-warning .explain-stat-value { color: var(--accent-amber); }
1293
+
1404
1294
  .explain-stat.stat-critical {
1405
- border-color: #ef4444;
1406
- background: linear-gradient(135deg, rgba(239, 68, 68, 0.03) 0%, var(--bg-card) 100%);
1295
+ border-color: var(--rose-line);
1407
1296
  }
1408
1297
 
1409
- .explain-stat-label {
1410
- font-size: 0.8rem;
1411
- color: var(--text-secondary);
1412
- text-transform: uppercase;
1413
- letter-spacing: 0.05em;
1414
- font-weight: 500;
1415
- }
1298
+ .explain-stat.stat-critical .explain-stat-value { color: var(--accent-rose); }
1416
1299
 
1417
1300
  .explain-stat-value {
1418
1301
  font-size: 1.5rem;
1419
1302
  font-weight: 600;
1420
1303
  color: var(--text-primary);
1421
- font-family: 'SF Mono', Monaco, Consolas, monospace;
1304
+ font-family: var(--font-mono);
1422
1305
  }
1423
1306
 
1424
1307
  /* Problems list */
1425
1308
  .explain-problems {
1426
1309
  background: var(--bg-card);
1427
1310
  border: 1px solid var(--border-color);
1428
- border-radius: 6px;
1429
- padding: 1.25rem;
1430
- margin-bottom: 1.5rem;
1311
+ border-radius: var(--radius);
1312
+ padding: 1rem 1.25rem;
1431
1313
  }
1432
1314
 
1433
1315
  .explain-problems-header {
1434
- font-size: 1rem;
1316
+ font-size: 0.875rem;
1435
1317
  font-weight: 600;
1436
1318
  color: var(--text-primary);
1437
- margin-bottom: 1rem;
1319
+ margin-bottom: 0.75rem;
1438
1320
  display: flex;
1439
1321
  align-items: center;
1440
1322
  gap: 0.5rem;
@@ -1448,41 +1330,31 @@
1448
1330
 
1449
1331
  .explain-problem {
1450
1332
  background: var(--bg-tertiary);
1451
- border-left: 3px solid var(--border-color);
1452
- border-radius: 8px;
1453
- padding: 1rem;
1454
- transition: all 0.15s;
1333
+ border: 1px solid var(--border-color);
1334
+ border-radius: var(--radius-sm);
1335
+ padding: 0.875rem 1rem;
1455
1336
  }
1456
1337
 
1457
- .explain-problem:hover {
1458
- transform: translateX(4px);
1459
- }
1338
+ .explain-problem.problem-critical { border-color: var(--rose-line); }
1339
+ .explain-problem.problem-critical .explain-problem-icon { color: var(--accent-rose); }
1460
1340
 
1461
- .explain-problem.problem-critical {
1462
- border-left-color: #ef4444;
1463
- background: linear-gradient(90deg, rgba(239, 68, 68, 0.05) 0%, var(--bg-tertiary) 15%);
1464
- }
1341
+ .explain-problem.problem-warning { border-color: var(--amber-line); }
1342
+ .explain-problem.problem-warning .explain-problem-icon { color: var(--accent-amber); }
1465
1343
 
1466
- .explain-problem.problem-warning {
1467
- border-left-color: var(--accent-amber);
1468
- background: linear-gradient(90deg, rgba(245, 158, 11, 0.05) 0%, var(--bg-tertiary) 15%);
1469
- }
1470
-
1471
- .explain-problem.problem-info {
1472
- border-left-color: var(--accent-blue);
1473
- background: linear-gradient(90deg, rgba(59, 130, 246, 0.05) 0%, var(--bg-tertiary) 15%);
1474
- }
1344
+ .explain-problem.problem-info { border-color: var(--blue-line); }
1345
+ .explain-problem.problem-info .explain-problem-icon { color: var(--accent-blue); }
1475
1346
 
1476
1347
  .explain-problem-header {
1477
1348
  display: flex;
1478
1349
  align-items: center;
1479
- gap: 0.75rem;
1480
- margin-bottom: 0.5rem;
1350
+ gap: 0.6rem;
1481
1351
  flex-wrap: wrap;
1482
1352
  }
1483
1353
 
1484
1354
  .explain-problem-icon {
1485
- font-size: 1.125rem;
1355
+ width: 0.9375rem;
1356
+ height: 0.9375rem;
1357
+ color: var(--text-muted);
1486
1358
  }
1487
1359
 
1488
1360
  .explain-problem-message {
@@ -1496,31 +1368,38 @@
1496
1368
  color: var(--text-secondary);
1497
1369
  background: var(--bg-primary);
1498
1370
  padding: 0.25rem 0.5rem;
1499
- border-radius: 4px;
1500
- font-family: 'SF Mono', Monaco, Consolas, monospace;
1371
+ border-radius: var(--radius-sm);
1372
+ font-family: var(--font-mono);
1501
1373
  }
1502
1374
 
1503
1375
  .explain-problem-details {
1504
- font-size: 0.875rem;
1376
+ font-size: 0.8125rem;
1505
1377
  color: var(--text-secondary);
1506
- margin-bottom: 0.5rem;
1507
- margin-left: 2rem;
1378
+ margin-top: 0.4rem;
1379
+ margin-left: 1.55rem;
1508
1380
  }
1509
1381
 
1510
1382
  .explain-problem-recommendation {
1511
- font-size: 0.875rem;
1383
+ display: flex;
1384
+ align-items: flex-start;
1385
+ gap: 0.4rem;
1386
+ font-size: 0.8125rem;
1512
1387
  color: var(--accent-blue);
1513
- background: rgba(59, 130, 246, 0.05);
1514
- padding: 0.5rem 0.75rem;
1515
- border-radius: 6px;
1388
+ background: var(--blue-soft);
1389
+ padding: 0.5rem 0.625rem;
1390
+ border-radius: var(--radius-sm);
1516
1391
  margin-top: 0.5rem;
1517
1392
  }
1518
1393
 
1394
+ .explain-problem-recommendation .icon {
1395
+ margin-top: 0.15rem;
1396
+ }
1397
+
1519
1398
  /* EXPLAIN output display */
1520
1399
  .explain-output {
1521
1400
  background: var(--bg-card);
1522
1401
  border: 1px solid var(--border-color);
1523
- border-radius: 6px;
1402
+ border-radius: var(--radius);
1524
1403
  overflow: hidden;
1525
1404
  }
1526
1405
 
@@ -1541,19 +1420,19 @@
1541
1420
  border: 1px solid var(--border-color);
1542
1421
  background: var(--bg-primary);
1543
1422
  color: var(--text-secondary);
1544
- border-radius: 6px;
1423
+ border-radius: var(--radius);
1545
1424
  cursor: pointer;
1546
1425
  transition: all 0.15s;
1547
1426
  }
1548
1427
 
1549
1428
  .btn-copy-small:hover {
1550
- background: var(--bg-secondary);
1551
- border-color: var(--accent-blue);
1552
- color: var(--accent-blue);
1429
+ background: var(--bg-hover);
1430
+ border-color: var(--border-strong);
1431
+ color: var(--text-primary);
1553
1432
  }
1554
1433
 
1555
1434
  .explain-lines {
1556
- font-family: 'SF Mono', Monaco, Consolas, monospace;
1435
+ font-family: var(--font-mono);
1557
1436
  font-size: 0.875rem;
1558
1437
  line-height: 1.6;
1559
1438
  overflow-x: auto;
@@ -1572,17 +1451,17 @@
1572
1451
  }
1573
1452
 
1574
1453
  .explain-line-problem {
1575
- background: rgba(245, 158, 11, 0.03);
1454
+ background: var(--amber-soft);
1576
1455
  }
1577
1456
 
1578
1457
  .explain-line-problem.problem-critical {
1579
- background: rgba(239, 68, 68, 0.03);
1580
- border-left: 3px solid #ef4444;
1458
+ background: var(--rose-soft);
1459
+ box-shadow: inset 2px 0 0 var(--accent-rose);
1581
1460
  }
1582
1461
 
1583
1462
  .explain-line-problem.problem-warning {
1584
- background: rgba(245, 158, 11, 0.03);
1585
- border-left: 3px solid var(--accent-amber);
1463
+ background: var(--amber-soft);
1464
+ box-shadow: inset 2px 0 0 var(--accent-amber);
1586
1465
  }
1587
1466
 
1588
1467
  .explain-line-timing {
@@ -1664,15 +1543,52 @@
1664
1543
 
1665
1544
  /* Fallback for raw explain output */
1666
1545
  .explain-result {
1667
- font-family: 'SF Mono', Monaco, Consolas, monospace;
1546
+ font-family: var(--font-mono);
1668
1547
  font-size: 0.875rem;
1669
1548
  line-height: 1.6;
1670
1549
  white-space: pre;
1671
1550
  overflow-x: auto;
1672
1551
  background: var(--bg-card);
1673
1552
  border: 1px solid var(--border-color);
1674
- border-radius: 6px;
1553
+ border-radius: var(--radius);
1675
1554
  padding: 1.25rem;
1676
1555
  color: var(--text-secondary);
1677
1556
  }
1557
+
1558
+ /* Responsive */
1559
+ @media (max-width: 768px) {
1560
+ /* The detail of an expanded row is pinned to the viewport: the table
1561
+ scrolls sideways under it, the detail stays readable in one column. */
1562
+ .results-table tbody tr.detail-row td {
1563
+ overflow: visible; /* the generic cell rule clips it, and sticky with it */
1564
+ }
1565
+
1566
+ .row-detail {
1567
+ position: sticky;
1568
+ left: 0;
1569
+ width: min(100%, calc(100vw - 1.875rem));
1570
+ grid-template-columns: 1fr;
1571
+ padding: 1rem;
1572
+ }
1573
+
1574
+ .detail-actions,
1575
+ .explain-actions,
1576
+ .migration-actions,
1577
+ .saved-records-header {
1578
+ flex-wrap: wrap;
1579
+ }
1580
+
1581
+ .filter-item {
1582
+ grid-template-columns: 1fr;
1583
+ gap: 0.4rem;
1584
+ }
1585
+
1586
+ .filter-input {
1587
+ max-width: none;
1588
+ }
1589
+
1590
+ .threshold-field {
1591
+ min-width: 0;
1592
+ }
1593
+ }
1678
1594
  </style>