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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +38 -0
- data/app/controllers/pg_reports/dashboard_controller.rb +57 -6
- data/app/views/layouts/pg_reports/application.html.erb +616 -201
- data/app/views/pg_reports/dashboard/_database_selector.html.erb +2 -1
- data/app/views/pg_reports/dashboard/_show_modals.html.erb +10 -7
- data/app/views/pg_reports/dashboard/_show_scripts.html.erb +100 -51
- data/app/views/pg_reports/dashboard/_show_styles.html.erb +392 -476
- data/app/views/pg_reports/dashboard/index.html.erb +190 -388
- data/app/views/pg_reports/dashboard/show.html.erb +13 -11
- data/config/brakeman.ignore +24 -1
- data/config/locales/en.yml +53 -48
- data/config/locales/ru.yml +53 -48
- data/config/locales/uk.yml +53 -48
- data/lib/pg_reports/connection/error_translator.rb +43 -0
- data/lib/pg_reports/dashboard/reports_registry.rb +10 -0
- data/lib/pg_reports/explain_analyzer.rb +0 -3
- data/lib/pg_reports/query_monitor.rb +15 -3
- data/lib/pg_reports/version.rb +1 -1
- metadata +1 -1
|
@@ -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:
|
|
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.
|
|
14
|
-
padding: 1rem
|
|
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
|
-
|
|
34
|
-
|
|
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:
|
|
67
|
+
padding: 1rem;
|
|
43
68
|
display: grid;
|
|
44
|
-
gap:
|
|
69
|
+
gap: 1rem;
|
|
45
70
|
}
|
|
46
71
|
|
|
47
72
|
.doc-block h4 {
|
|
48
|
-
font-size: 0.
|
|
73
|
+
font-size: 0.6875rem;
|
|
49
74
|
font-weight: 600;
|
|
50
|
-
color: var(--
|
|
51
|
-
margin-bottom: 0.5rem;
|
|
75
|
+
color: var(--text-muted);
|
|
52
76
|
text-transform: uppercase;
|
|
53
|
-
letter-spacing: 0.
|
|
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.
|
|
59
|
-
font-size: 0.
|
|
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:
|
|
102
|
+
padding-left: 1rem;
|
|
74
103
|
color: var(--text-secondary);
|
|
75
|
-
font-size: 0.
|
|
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
|
-
|
|
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
|
-
|
|
89
|
-
|
|
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:
|
|
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:
|
|
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.
|
|
179
|
-
font-weight:
|
|
180
|
-
background:
|
|
181
|
-
|
|
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.
|
|
184
|
-
letter-spacing: 0.
|
|
185
|
-
line-height: 1.
|
|
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.
|
|
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(--
|
|
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:
|
|
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:
|
|
224
|
-
|
|
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:
|
|
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:
|
|
233
|
-
|
|
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
|
-
|
|
241
|
-
|
|
242
|
-
|
|
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
|
-
|
|
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:
|
|
256
|
-
|
|
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
|
-
|
|
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(
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
340
|
+
padding: 0.875rem 1rem;
|
|
313
341
|
border-bottom: 1px solid var(--border-color);
|
|
314
|
-
background:
|
|
342
|
+
background: var(--rose-soft);
|
|
315
343
|
}
|
|
316
344
|
|
|
317
345
|
.problem-modal-header h3 {
|
|
318
|
-
font-size:
|
|
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:
|
|
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:
|
|
372
|
+
border-radius: var(--radius-sm);
|
|
352
373
|
}
|
|
353
374
|
|
|
354
375
|
.problem-field-value.critical {
|
|
355
376
|
color: var(--accent-rose);
|
|
356
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
375
|
-
font-size: 0.
|
|
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:
|
|
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:
|
|
423
|
-
font-family:
|
|
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(--
|
|
448
|
-
background:
|
|
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(--
|
|
453
|
-
background:
|
|
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-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
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(--
|
|
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
|
-
|
|
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:
|
|
476
|
-
border-color:
|
|
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
|
-
|
|
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:
|
|
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(--
|
|
511
|
-
border-color: var(--
|
|
512
|
-
color:
|
|
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:
|
|
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:
|
|
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(--
|
|
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(--
|
|
690
|
-
border-radius:
|
|
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.
|
|
700
|
-
background:
|
|
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(--
|
|
707
|
-
font-size: 0.
|
|
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:
|
|
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(--
|
|
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(--
|
|
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:
|
|
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:
|
|
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(--
|
|
767
|
-
border-color: var(--
|
|
768
|
-
color:
|
|
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:
|
|
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:
|
|
810
|
-
font-family:
|
|
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:
|
|
868
|
-
font-family:
|
|
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
|
-
.
|
|
896
|
-
|
|
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(--
|
|
899
|
-
border-radius:
|
|
900
|
-
color: var(--
|
|
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:
|
|
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
|
-
|
|
908
|
-
|
|
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(--
|
|
913
|
-
color:
|
|
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-
|
|
933
|
-
|
|
934
|
-
|
|
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:
|
|
941
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
971
|
+
border-radius: var(--radius);
|
|
1069
972
|
color: var(--text-primary);
|
|
1070
|
-
font-family:
|
|
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:
|
|
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.
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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.
|
|
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:
|
|
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.
|
|
1215
|
-
padding: 1rem
|
|
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.
|
|
1162
|
+
gap: 0.2rem;
|
|
1268
1163
|
font-weight: 500;
|
|
1269
1164
|
color: var(--text-primary);
|
|
1270
|
-
font-size: 0.
|
|
1165
|
+
font-size: 0.8125rem;
|
|
1271
1166
|
line-height: 1.4;
|
|
1272
1167
|
}
|
|
1273
1168
|
|
|
1274
1169
|
.filter-description {
|
|
1275
|
-
font-size: 0.
|
|
1170
|
+
font-size: 0.75rem;
|
|
1276
1171
|
font-weight: 400;
|
|
1277
|
-
color: var(--text-
|
|
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
|
-
|
|
1183
|
+
height: var(--control-h);
|
|
1184
|
+
padding: 0 0.625rem;
|
|
1290
1185
|
border: 1px solid var(--border-color);
|
|
1291
|
-
border-radius:
|
|
1292
|
-
font-
|
|
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:
|
|
1296
|
-
min-width:
|
|
1297
|
-
max-width:
|
|
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:
|
|
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
|
|
1314
|
-
|
|
1315
|
-
|
|
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-
|
|
1325
|
-
|
|
1326
|
-
|
|
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-
|
|
1330
|
-
|
|
1331
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
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:
|
|
1366
|
-
color:
|
|
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:
|
|
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:
|
|
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:
|
|
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(--
|
|
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:
|
|
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-
|
|
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:
|
|
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:
|
|
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:
|
|
1316
|
+
font-size: 0.875rem;
|
|
1435
1317
|
font-weight: 600;
|
|
1436
1318
|
color: var(--text-primary);
|
|
1437
|
-
margin-bottom:
|
|
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
|
|
1452
|
-
border-radius:
|
|
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:
|
|
1458
|
-
|
|
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-
|
|
1462
|
-
|
|
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-
|
|
1467
|
-
|
|
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.
|
|
1480
|
-
margin-bottom: 0.5rem;
|
|
1350
|
+
gap: 0.6rem;
|
|
1481
1351
|
flex-wrap: wrap;
|
|
1482
1352
|
}
|
|
1483
1353
|
|
|
1484
1354
|
.explain-problem-icon {
|
|
1485
|
-
|
|
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:
|
|
1500
|
-
font-family:
|
|
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.
|
|
1376
|
+
font-size: 0.8125rem;
|
|
1505
1377
|
color: var(--text-secondary);
|
|
1506
|
-
margin-
|
|
1507
|
-
margin-left:
|
|
1378
|
+
margin-top: 0.4rem;
|
|
1379
|
+
margin-left: 1.55rem;
|
|
1508
1380
|
}
|
|
1509
1381
|
|
|
1510
1382
|
.explain-problem-recommendation {
|
|
1511
|
-
|
|
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:
|
|
1514
|
-
padding: 0.5rem 0.
|
|
1515
|
-
border-radius:
|
|
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:
|
|
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:
|
|
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-
|
|
1551
|
-
border-color: var(--
|
|
1552
|
-
color: var(--
|
|
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:
|
|
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:
|
|
1454
|
+
background: var(--amber-soft);
|
|
1576
1455
|
}
|
|
1577
1456
|
|
|
1578
1457
|
.explain-line-problem.problem-critical {
|
|
1579
|
-
background:
|
|
1580
|
-
|
|
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:
|
|
1585
|
-
|
|
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:
|
|
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:
|
|
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>
|