@youtyan/code-viewer 0.1.50 → 0.1.52

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.
package/web/style.css CHANGED
@@ -172,7 +172,7 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
172
172
  padding: 6px 16px;
173
173
  color: var(--fg-muted);
174
174
  font-size: 12px;
175
- border-bottom: 1px solid var(--border-muted);
175
+ border-bottom: 1px solid var(--border);
176
176
  }
177
177
 
178
178
  .gdp-palette-controls {
@@ -312,7 +312,7 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
312
312
  height: 100%;
313
313
  margin-left: 0;
314
314
  padding-left: 18px;
315
- border-left: 1px solid var(--border-muted);
315
+ border-left: 1px solid var(--border);
316
316
  flex-shrink: 0;
317
317
  }
318
318
  .global-help-link {
@@ -409,6 +409,17 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
409
409
  outline: 2px solid var(--accent);
410
410
  outline-offset: 1px;
411
411
  }
412
+ #auto-update {
413
+ width: auto;
414
+ padding: 0 8px;
415
+ font-size: 11px;
416
+ font-weight: 600;
417
+ }
418
+ #auto-update.active {
419
+ background: var(--success-subtle);
420
+ border-color: var(--success);
421
+ color: var(--success);
422
+ }
412
423
 
413
424
  #meta {
414
425
  display: flex; align-items: center; gap: 10px;
@@ -440,7 +451,7 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
440
451
  gap: 4px;
441
452
  color: var(--fg-muted);
442
453
  background: var(--bg-soft);
443
- border: 1px solid var(--border-muted);
454
+ border: 1px solid var(--border);
444
455
  border-radius: 999px;
445
456
  padding: 3px 8px;
446
457
  font-size: 11px;
@@ -901,6 +912,74 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
901
912
  100% { transform: translateX(450%); }
902
913
  }
903
914
 
915
+ /* ===== Change notification banner ===== */
916
+ #change-banner {
917
+ position: fixed;
918
+ right: 16px;
919
+ bottom: 16px;
920
+ z-index: 80;
921
+ display: flex;
922
+ align-items: center;
923
+ gap: 10px;
924
+ width: max-content;
925
+ max-width: min(380px, calc(100vw - 32px));
926
+ padding: 10px 12px;
927
+ background: var(--accent-subtle);
928
+ border: 1px solid var(--accent-muted);
929
+ border-radius: 6px;
930
+ box-shadow: 0 8px 24px rgba(0,0,0,0.16);
931
+ font-size: 13px;
932
+ color: var(--fg);
933
+ animation: gdp-banner-slide 0.2s ease;
934
+ }
935
+ #change-banner[hidden] { display: none; }
936
+ @keyframes gdp-banner-slide {
937
+ from { opacity: 0; transform: translateY(8px); }
938
+ to { opacity: 1; transform: translateY(0); }
939
+ }
940
+ #change-banner-copy {
941
+ display: grid;
942
+ gap: 2px;
943
+ min-width: 0;
944
+ }
945
+ #change-banner-text {
946
+ overflow: hidden;
947
+ text-overflow: ellipsis;
948
+ white-space: nowrap;
949
+ font-weight: 600;
950
+ }
951
+ #change-banner-age {
952
+ color: var(--fg-muted);
953
+ font-size: 12px;
954
+ white-space: nowrap;
955
+ }
956
+ #change-banner-reload {
957
+ flex: 0 0 auto;
958
+ min-height: 30px;
959
+ padding: 3px 10px;
960
+ border: 1px solid var(--accent);
961
+ border-radius: 4px;
962
+ background: var(--accent);
963
+ color: var(--fg-onemphasis);
964
+ font-size: 12px;
965
+ cursor: pointer;
966
+ white-space: nowrap;
967
+ }
968
+ #change-banner-reload:hover { background: var(--accent-emph); }
969
+ #change-banner-dismiss {
970
+ flex: 0 0 auto;
971
+ width: 30px;
972
+ height: 30px;
973
+ padding: 0;
974
+ border: none;
975
+ background: none;
976
+ color: var(--fg-muted);
977
+ font-size: 16px;
978
+ cursor: pointer;
979
+ line-height: 1;
980
+ }
981
+ #change-banner-dismiss:hover { color: var(--fg); }
982
+
904
983
  /* ===== Commit history panel ===== */
905
984
  #history-panel {
906
985
  display: none;
@@ -990,7 +1069,7 @@ body.gdp-history-page #topbar .ref-pickers {
990
1069
  width: 100%;
991
1070
  height: 32px;
992
1071
  background: color-mix(in srgb, var(--bg) 78%, var(--bg-soft));
993
- border: 1px solid var(--border-muted);
1072
+ border: 1px solid var(--border);
994
1073
  color: var(--fg);
995
1074
  border-radius: 8px;
996
1075
  font: inherit;
@@ -1241,7 +1320,7 @@ body[data-focus-scope="main"] #content {
1241
1320
  gap: 4px;
1242
1321
  margin-left: 8px;
1243
1322
  padding: 3px;
1244
- border: 1px solid var(--border-muted);
1323
+ border: 1px solid var(--border);
1245
1324
  border-radius: 8px;
1246
1325
  background: color-mix(in srgb, var(--bg) 72%, transparent);
1247
1326
  }
@@ -1285,7 +1364,7 @@ body[data-focus-scope="main"] #content {
1285
1364
  top: var(--sidebar-head-h);
1286
1365
  background: var(--bg-soft);
1287
1366
  padding: 7px 12px 9px;
1288
- border-bottom: 1px solid var(--border-muted);
1367
+ border-bottom: 1px solid var(--border);
1289
1368
  z-index: 2;
1290
1369
  }
1291
1370
  .sb-filter-wrap::before {
@@ -1317,7 +1396,7 @@ body[data-focus-scope="main"] #content {
1317
1396
  width: 100%;
1318
1397
  height: 32px;
1319
1398
  background: color-mix(in srgb, var(--bg) 78%, var(--bg-soft));
1320
- border: 1px solid var(--border-muted);
1399
+ border: 1px solid var(--border);
1321
1400
  color: var(--fg);
1322
1401
  border-radius: 8px;
1323
1402
  font: inherit;
@@ -1472,7 +1551,7 @@ body.gdp-resizing * { user-select: none !important; }
1472
1551
  width: 100%;
1473
1552
  min-height: 110px;
1474
1553
  resize: vertical;
1475
- border: 1px solid var(--border-muted);
1554
+ border: 1px solid var(--border);
1476
1555
  border-radius: 6px;
1477
1556
  background: var(--bg-soft);
1478
1557
  color: var(--fg);
@@ -1485,8 +1564,9 @@ body.gdp-resizing * { user-select: none !important; }
1485
1564
  font-size: 11px;
1486
1565
  line-height: 15px;
1487
1566
  }
1488
- #display-settings-source {
1489
- margin: 8px 0 0;
1567
+ #display-settings-source,
1568
+ .scope-settings-help {
1569
+ margin: 4px 0 0;
1490
1570
  color: var(--fg-subtle);
1491
1571
  font-size: 11px;
1492
1572
  line-height: 15px;
@@ -1498,7 +1578,7 @@ body.gdp-resizing * { user-select: none !important; }
1498
1578
  margin-top: 10px;
1499
1579
  }
1500
1580
  .scope-settings-actions button {
1501
- border: 1px solid var(--border-muted);
1581
+ border: 1px solid var(--border);
1502
1582
  border-radius: 6px;
1503
1583
  background: var(--bg-soft);
1504
1584
  color: var(--fg);
@@ -1572,7 +1652,7 @@ body.gdp-help-page #content {
1572
1652
  display: grid;
1573
1653
  gap: 4px;
1574
1654
  padding-right: 16px;
1575
- border-right: 1px solid var(--border-muted);
1655
+ border-right: 1px solid var(--border);
1576
1656
  }
1577
1657
  .gdp-help-nav button {
1578
1658
  appearance: none;
@@ -1640,7 +1720,7 @@ body.gdp-help-page #content {
1640
1720
  .gdp-help-command pre {
1641
1721
  margin: 0;
1642
1722
  overflow-x: auto;
1643
- border: 1px solid var(--border-muted);
1723
+ border: 1px solid var(--border);
1644
1724
  border-radius: 8px;
1645
1725
  background: var(--bg-soft);
1646
1726
  padding: 12px 14px;
@@ -1653,12 +1733,12 @@ body.gdp-help-page #content {
1653
1733
  .gdp-help-group table {
1654
1734
  width: 100%;
1655
1735
  border-collapse: collapse;
1656
- border-top: 1px solid var(--border-muted);
1736
+ border-top: 1px solid var(--border);
1657
1737
  }
1658
1738
  .gdp-help-group th,
1659
1739
  .gdp-help-group td {
1660
1740
  padding: 11px 8px;
1661
- border-bottom: 1px solid var(--border-muted);
1741
+ border-bottom: 1px solid var(--border);
1662
1742
  vertical-align: top;
1663
1743
  }
1664
1744
  .gdp-help-group th {
@@ -1773,7 +1853,7 @@ body.gdp-help-page #content {
1773
1853
  max-width: 62px;
1774
1854
  overflow: hidden;
1775
1855
  text-overflow: ellipsis;
1776
- border: 1px solid var(--border-muted);
1856
+ border: 1px solid var(--border);
1777
1857
  border-radius: 999px;
1778
1858
  padding: 0 5px;
1779
1859
  color: var(--fg-subtle);
@@ -1783,12 +1863,12 @@ body.gdp-help-page #content {
1783
1863
  }
1784
1864
  #filelist.tree .tree-dir .dir-omitted-heavy {
1785
1865
  color: var(--fg-subtle);
1786
- border-color: var(--border-muted);
1866
+ border-color: var(--border);
1787
1867
  background: var(--bg-soft);
1788
1868
  }
1789
1869
  #filelist.tree .tree-dir .dir-omitted-internal {
1790
1870
  color: var(--fg-subtle);
1791
- border-color: var(--border-muted);
1871
+ border-color: var(--border);
1792
1872
  background: var(--bg-soft);
1793
1873
  }
1794
1874
  #filelist.tree .tree-dir .dir-icon {
@@ -1842,7 +1922,7 @@ body.gdp-help-page #content {
1842
1922
  height: 16px;
1843
1923
  border-radius: 999px;
1844
1924
  color: var(--success);
1845
- background: var(--success-subtle);
1925
+ background: color-mix(in srgb, var(--success) 15%, var(--bg));
1846
1926
  font-size: 11px;
1847
1927
  font-weight: 700;
1848
1928
  line-height: 1;
@@ -2230,7 +2310,7 @@ table.d2h-diff-table tr.gdp-diff-line-target .d2h-code-line-ctn {
2230
2310
  background-color: var(--line-hit-bg) !important;
2231
2311
  }
2232
2312
  table.d2h-diff-table tr.gdp-diff-line-target > td:first-child {
2233
- box-shadow: inset 3px 0 0 var(--line-hit-border), inset -1px 0 0 var(--border-muted);
2313
+ box-shadow: inset 3px 0 0 var(--line-hit-border), inset -1px 0 0 var(--border);
2234
2314
  }
2235
2315
 
2236
2316
  /* After-side drag selection (diff screen) — same yellow as the file view. */
@@ -2242,7 +2322,7 @@ table.d2h-diff-table tr.gdp-diff-line-selected .d2h-code-line-ctn {
2242
2322
  background-color: var(--line-hit-bg) !important;
2243
2323
  }
2244
2324
  table.d2h-diff-table tr.gdp-diff-line-selected > td:first-child {
2245
- box-shadow: inset 3px 0 0 var(--line-hit-border), inset -1px 0 0 var(--border-muted);
2325
+ box-shadow: inset 3px 0 0 var(--line-hit-border), inset -1px 0 0 var(--border);
2246
2326
  }
2247
2327
  table.d2h-diff-table td.d2h-code-linenumber,
2248
2328
  table.d2h-diff-table td.d2h-code-side-linenumber {
@@ -2546,6 +2626,11 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2546
2626
  .gdp-source-viewer.media {
2547
2627
  padding: 16px;
2548
2628
  }
2629
+ .gdp-source-viewer.media.pdf {
2630
+ display: flex;
2631
+ flex-direction: column;
2632
+ overflow: hidden;
2633
+ }
2549
2634
  .gdp-source-file-info {
2550
2635
  display: flex;
2551
2636
  flex-wrap: wrap;
@@ -2556,7 +2641,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2556
2641
  }
2557
2642
  .gdp-source-file-info span {
2558
2643
  padding: 2px 7px;
2559
- border: 1px solid var(--border-muted);
2644
+ border: 1px solid var(--border);
2560
2645
  border-radius: 999px;
2561
2646
  background: var(--bg-soft);
2562
2647
  }
@@ -2579,9 +2664,14 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2579
2664
  border: 0;
2580
2665
  background: var(--bg);
2581
2666
  }
2667
+ .gdp-source-viewer.media.pdf iframe {
2668
+ flex: 1 1 auto;
2669
+ height: max(520px, calc(100vh - var(--global-header-h) - 164px));
2670
+ min-height: 0;
2671
+ }
2582
2672
  .gdp-source-meta {
2583
2673
  padding: 8px 12px;
2584
- border-bottom: 1px solid var(--border-muted);
2674
+ border-bottom: 1px solid var(--border);
2585
2675
  background: var(--bg-soft);
2586
2676
  color: var(--fg-muted);
2587
2677
  font-size: 12px;
@@ -2596,7 +2686,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2596
2686
  gap: 4px;
2597
2687
  padding: 8px 12px 0;
2598
2688
  background: var(--bg);
2599
- border-bottom: 1px solid var(--border-muted);
2689
+ border-bottom: 1px solid var(--border);
2600
2690
  }
2601
2691
  .gdp-source-tabs button {
2602
2692
  appearance: none;
@@ -2653,7 +2743,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2653
2743
  .gdp-source-table tr.gdp-source-cursor .gdp-source-line-number,
2654
2744
  .gdp-source-virtual-row.gdp-source-cursor .gdp-source-virtual-line-number {
2655
2745
  color: var(--fg);
2656
- box-shadow: inset 3px 0 0 var(--scope-accent), inset -1px 0 0 var(--border-muted);
2746
+ box-shadow: inset 3px 0 0 var(--scope-accent), inset -1px 0 0 var(--border);
2657
2747
  }
2658
2748
  .gdp-source-table tr.gdp-source-cursor .gdp-source-line-code,
2659
2749
  .gdp-source-virtual-row.gdp-source-cursor .gdp-source-virtual-line-code {
@@ -2682,7 +2772,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2682
2772
  }
2683
2773
  .gdp-source-table tr.gdp-source-line-target .gdp-source-line-number,
2684
2774
  .gdp-source-virtual-row.gdp-source-line-target .gdp-source-virtual-line-number {
2685
- box-shadow: inset 3px 0 0 var(--line-hit-border), inset -1px 0 0 var(--border-muted);
2775
+ box-shadow: inset 3px 0 0 var(--line-hit-border), inset -1px 0 0 var(--border);
2686
2776
  }
2687
2777
  .gdp-source-line-target .gdp-source-line-code,
2688
2778
  .gdp-source-line-target .gdp-source-virtual-line-code {
@@ -2744,7 +2834,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2744
2834
  text-align: right;
2745
2835
  color: var(--fg-muted);
2746
2836
  background: var(--bg);
2747
- box-shadow: inset -1px 0 0 var(--border-muted);
2837
+ box-shadow: inset -1px 0 0 var(--border);
2748
2838
  font-variant-numeric: tabular-nums;
2749
2839
  user-select: none;
2750
2840
  white-space: nowrap;
@@ -2783,7 +2873,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2783
2873
  gap: 8px;
2784
2874
  min-width: 0;
2785
2875
  padding: 8px 12px;
2786
- border-bottom: 1px solid var(--border-muted);
2876
+ border-bottom: 1px solid var(--border);
2787
2877
  color: var(--fg-muted);
2788
2878
  background: var(--bg-soft);
2789
2879
  font-size: 12px;
@@ -2897,7 +2987,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2897
2987
  text-align: right;
2898
2988
  color: var(--fg-muted);
2899
2989
  background: var(--bg);
2900
- box-shadow: inset -1px 0 0 var(--border-muted);
2990
+ box-shadow: inset -1px 0 0 var(--border);
2901
2991
  font-variant-numeric: tabular-nums;
2902
2992
  cursor: pointer;
2903
2993
  user-select: none;
@@ -2940,7 +3030,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2940
3030
  top: var(--global-header-h);
2941
3031
  z-index: 35;
2942
3032
  background: var(--bg);
2943
- border-bottom: 1px solid var(--border-muted);
3033
+ border-bottom: 1px solid var(--border);
2944
3034
  }
2945
3035
  .gdp-file-detail-header {
2946
3036
  display: flex;
@@ -3042,7 +3132,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3042
3132
  align-items: baseline;
3043
3133
  gap: 6px;
3044
3134
  padding: 0 10px;
3045
- border-right: 1px solid var(--border-muted);
3135
+ border-right: 1px solid var(--border);
3046
3136
  white-space: nowrap;
3047
3137
  }
3048
3138
  .gdp-file-detail-meta-item:first-child {
@@ -3094,7 +3184,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3094
3184
  max-height: calc(100vh - var(--global-header-h) - 40px);
3095
3185
  overflow: auto;
3096
3186
  padding: 8px 12px 10px 0;
3097
- border-right: 1px solid var(--border-muted);
3187
+ border-right: 1px solid var(--border);
3098
3188
  background: transparent;
3099
3189
  font-size: 13px;
3100
3190
  line-height: 1.45;
@@ -3114,7 +3204,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3114
3204
  display: block;
3115
3205
  margin: 0 0 10px 2px;
3116
3206
  padding: 0 8px 10px;
3117
- border-bottom: 1px solid var(--border-muted);
3207
+ border-bottom: 1px solid var(--border);
3118
3208
  color: var(--fg-muted);
3119
3209
  font-size: 11px;
3120
3210
  font-weight: 600;
@@ -3182,7 +3272,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3182
3272
  .gdp-markdown-preview h1,
3183
3273
  .gdp-markdown-preview h2 {
3184
3274
  padding-bottom: 0.3em;
3185
- border-bottom: 1px solid var(--border-muted);
3275
+ border-bottom: 1px solid var(--border);
3186
3276
  }
3187
3277
  .gdp-markdown-preview h1 {
3188
3278
  margin: 0 0 16px;
@@ -3621,8 +3711,8 @@ body.gdp-file-detail-page #empty {
3621
3711
  align-items: center;
3622
3712
  min-height: 34px;
3623
3713
  padding: 0 14px;
3624
- border-top: 1px solid var(--border-muted);
3625
- border-bottom: 1px solid var(--border-muted);
3714
+ border-top: 1px solid var(--border);
3715
+ border-bottom: 1px solid var(--border);
3626
3716
  background: var(--bg-soft);
3627
3717
  }
3628
3718
  .gdp-repo-sort-spacer {
@@ -3657,7 +3747,7 @@ body.gdp-file-detail-page #empty {
3657
3747
  width: 100%;
3658
3748
  min-height: 42px;
3659
3749
  border: 0;
3660
- border-bottom: 1px solid var(--border-muted);
3750
+ border-bottom: 1px solid var(--border);
3661
3751
  background: var(--bg);
3662
3752
  color: var(--fg);
3663
3753
  padding: 0 14px;
@@ -3803,7 +3893,7 @@ body.gdp-file-detail-page #empty {
3803
3893
  justify-content: flex-end;
3804
3894
  gap: 8px;
3805
3895
  padding: 12px 16px;
3806
- border-top: 1px solid var(--border-muted);
3896
+ border-top: 1px solid var(--border);
3807
3897
  }
3808
3898
  .gdp-trash-dialog-danger {
3809
3899
  border-color: var(--danger);
@@ -3994,7 +4084,7 @@ body.gdp-file-detail-page #empty {
3994
4084
  background: var(--bg) !important;
3995
4085
  color: var(--fg-muted) !important;
3996
4086
  border-right: 0 !important;
3997
- box-shadow: inset -1px 0 0 var(--border-muted);
4087
+ box-shadow: inset -1px 0 0 var(--border);
3998
4088
  font-size: var(--code-font-size) !important;
3999
4089
  font-variant-numeric: tabular-nums;
4000
4090
  user-select: none;
@@ -4003,7 +4093,7 @@ body.gdp-file-detail-page #empty {
4003
4093
  background: var(--bg) !important;
4004
4094
  color: var(--fg-muted) !important;
4005
4095
  border-right: 0 !important;
4006
- box-shadow: inset -1px 0 0 var(--border-muted);
4096
+ box-shadow: inset -1px 0 0 var(--border);
4007
4097
  font-size: var(--code-font-size) !important;
4008
4098
  font-variant-numeric: tabular-nums;
4009
4099
  }
@@ -4083,12 +4173,12 @@ body.gdp-file-detail-page #empty {
4083
4173
  .d2h-emptyplaceholder,
4084
4174
  .d2h-code-side-emptyplaceholder {
4085
4175
  background: var(--bg-soft) !important;
4086
- border-color: var(--border-muted) !important;
4176
+ border-color: var(--border) !important;
4087
4177
  }
4088
4178
  .d2h-code-side-emptyplaceholder { color: var(--fg-subtle) !important; }
4089
4179
 
4090
4180
  /* Side-by-side divider */
4091
- .d2h-file-side-diff > div { border-color: var(--border-muted) !important; }
4181
+ .d2h-file-side-diff > div { border-color: var(--border) !important; }
4092
4182
  .d2h-files-diff > div { background: var(--bg) !important; }
4093
4183
 
4094
4184
  /* Prefix coloring (use diff2html's default layout) */
@@ -4444,6 +4534,174 @@ body.gdp-help-page #annotation-panel {
4444
4534
  body.annotation-panel-open #content {
4445
4535
  margin-right: min(380px, calc(100vw - 32px));
4446
4536
  }
4537
+
4538
+ /* ---- Query History right-panel ---- */
4539
+ #query-history-panel {
4540
+ position: fixed;
4541
+ left: 0;
4542
+ right: 0;
4543
+ bottom: 0;
4544
+ height: min(45vh, 400px);
4545
+ z-index: 45;
4546
+ display: flex;
4547
+ flex-direction: column;
4548
+ border-top: 1px solid var(--border);
4549
+ background: var(--bg);
4550
+ box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.08);
4551
+ }
4552
+ #query-history-panel[hidden] {
4553
+ display: none !important;
4554
+ }
4555
+ body.query-history-panel-open #content {
4556
+ margin-right: 0;
4557
+ padding-bottom: min(45vh, 400px);
4558
+ }
4559
+ .query-history-panel-head {
4560
+ display: flex;
4561
+ align-items: center;
4562
+ gap: 8px;
4563
+ padding: 10px 12px;
4564
+ border-bottom: 1px solid var(--border);
4565
+ }
4566
+ .query-history-panel-head strong {
4567
+ flex: 1;
4568
+ }
4569
+ #query-history-content {
4570
+ flex: 1;
4571
+ overflow-y: auto;
4572
+ }
4573
+ .db-query-history {
4574
+ height: 100%;
4575
+ display: flex;
4576
+ flex-direction: column;
4577
+ }
4578
+ .db-query-history-toolbar {
4579
+ display: flex;
4580
+ gap: 8px;
4581
+ padding: 8px 12px;
4582
+ border-bottom: 1px solid var(--border);
4583
+ }
4584
+ .db-query-history-action {
4585
+ padding: 4px 10px;
4586
+ border: 1px solid var(--border);
4587
+ border-radius: 4px;
4588
+ background: var(--bg);
4589
+ color: var(--fg);
4590
+ font-size: 12px;
4591
+ cursor: pointer;
4592
+ font-family: inherit;
4593
+ }
4594
+ .db-query-history-action:hover {
4595
+ background: var(--bg-mute);
4596
+ }
4597
+ .db-query-history-danger {
4598
+ color: var(--danger, #d32f2f);
4599
+ }
4600
+ .db-query-history-body-split {
4601
+ flex: 1;
4602
+ display: flex;
4603
+ overflow: hidden;
4604
+ }
4605
+ .db-query-history-list-col {
4606
+ width: 360px;
4607
+ min-width: 260px;
4608
+ max-width: 500px;
4609
+ border-right: 1px solid var(--border);
4610
+ display: flex;
4611
+ flex-direction: column;
4612
+ overflow: hidden;
4613
+ }
4614
+ .db-query-history-detail-col {
4615
+ flex: 1;
4616
+ overflow-y: auto;
4617
+ padding: 12px;
4618
+ }
4619
+ .db-query-history-detail-placeholder {
4620
+ color: var(--fg-muted);
4621
+ text-align: center;
4622
+ padding: 40px 16px;
4623
+ font-size: 13px;
4624
+ }
4625
+ .db-query-history-detail-actions {
4626
+ display: flex;
4627
+ gap: 8px;
4628
+ margin-bottom: 12px;
4629
+ }
4630
+ .db-query-history-list {
4631
+ flex: 1;
4632
+ overflow-y: auto;
4633
+ }
4634
+ .db-query-history-entry {
4635
+ padding: 8px 12px;
4636
+ border-bottom: 1px solid var(--border);
4637
+ cursor: pointer;
4638
+ }
4639
+ .db-query-history-entry:hover {
4640
+ background: var(--bg-mute);
4641
+ }
4642
+ .db-query-history-entry.selected {
4643
+ background: color-mix(in srgb, var(--accent) 12%, var(--bg));
4644
+ border-left: 3px solid var(--accent);
4645
+ padding-left: 9px;
4646
+ }
4647
+ .db-query-history-entry-meta {
4648
+ display: flex;
4649
+ gap: 8px;
4650
+ align-items: center;
4651
+ font-size: 11px;
4652
+ color: var(--fg-muted);
4653
+ }
4654
+ .db-query-history-by {
4655
+ font-weight: 600;
4656
+ font-size: 10px;
4657
+ }
4658
+ .db-query-history-time {
4659
+ font-size: 11px;
4660
+ }
4661
+ .db-query-history-stats {
4662
+ font-size: 11px;
4663
+ }
4664
+ .db-query-history-entry-title {
4665
+ margin-top: 4px;
4666
+ font-size: 12px;
4667
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
4668
+ white-space: nowrap;
4669
+ overflow: hidden;
4670
+ text-overflow: ellipsis;
4671
+ }
4672
+ .db-query-history-detail-col .db-query-history-sql {
4673
+ margin-bottom: 8px;
4674
+ }
4675
+ .db-query-history-sql {
4676
+ padding: 8px;
4677
+ border-radius: 4px;
4678
+ background: var(--bg);
4679
+ border: 1px solid var(--border);
4680
+ font-size: 12px;
4681
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
4682
+ white-space: pre-wrap;
4683
+ word-break: break-all;
4684
+ max-height: 200px;
4685
+ overflow-y: auto;
4686
+ margin: 0;
4687
+ }
4688
+ .db-query-history-body {
4689
+ margin-top: 8px;
4690
+ font-size: 12px;
4691
+ color: var(--fg-muted);
4692
+ }
4693
+ .db-query-history-actions {
4694
+ display: flex;
4695
+ gap: 8px;
4696
+ margin-top: 8px;
4697
+ }
4698
+ .db-query-history-truncated {
4699
+ margin-top: 4px;
4700
+ font-size: 11px;
4701
+ color: var(--fg-muted);
4702
+ text-align: center;
4703
+ }
4704
+
4447
4705
  .annotation-panel-head {
4448
4706
  display: flex;
4449
4707
  align-items: center;
@@ -4888,3 +5146,1814 @@ body.annotation-panel-open #content {
4888
5146
  .gdp-annotation-spacer td > div {
4889
5147
  height: 0;
4890
5148
  }
5149
+
5150
+ /* ============================================================
5151
+ Database Viewer
5152
+ ============================================================ */
5153
+
5154
+ .gdp-database-page #topbar,
5155
+ .gdp-database-page #sidebar,
5156
+ .gdp-database-page #sidebar-toggle,
5157
+ .gdp-database-page #annotation-panel,
5158
+ .gdp-database-page #sidebar-resizer,
5159
+ .gdp-database-page #annotations-toggle,
5160
+ .gdp-database-page #query-history-panel,
5161
+ .gdp-database-page #query-history-toggle {
5162
+ display: none !important;
5163
+ }
5164
+
5165
+ .gdp-database-page #content {
5166
+ margin-left: 0;
5167
+ padding: var(--global-header-h) 0 0;
5168
+ min-height: 0;
5169
+ max-width: none;
5170
+ }
5171
+
5172
+ .db-container {
5173
+ --db-font-sm: 11px;
5174
+ --db-font-base: 12px;
5175
+ --db-font-md: 13px;
5176
+ --db-font-mono: 13px;
5177
+ display: flex;
5178
+ flex-direction: column;
5179
+ height: calc(100vh - var(--global-header-h));
5180
+ overflow: hidden;
5181
+ font-size: var(--db-font-base);
5182
+ }
5183
+ body[data-sidebar-font-size="compact"] .db-container {
5184
+ --db-font-sm: 10px;
5185
+ --db-font-base: 11px;
5186
+ --db-font-md: 12px;
5187
+ --db-font-mono: 12px;
5188
+ }
5189
+ body[data-sidebar-font-size="large"] .db-container {
5190
+ --db-font-sm: 12px;
5191
+ --db-font-base: 14px;
5192
+ --db-font-md: 15px;
5193
+ --db-font-mono: 14px;
5194
+ }
5195
+ body[data-sidebar-font-size="xlarge"] .db-container {
5196
+ --db-font-sm: 13px;
5197
+ --db-font-base: 15px;
5198
+ --db-font-md: 16px;
5199
+ --db-font-mono: 15px;
5200
+ }
5201
+ .db-upper-area {
5202
+ display: flex;
5203
+ flex: 1;
5204
+ overflow: hidden;
5205
+ }
5206
+ .db-history-resizer {
5207
+ height: 5px;
5208
+ cursor: row-resize;
5209
+ background: var(--border);
5210
+ flex-shrink: 0;
5211
+ }
5212
+ .db-history-resizer:hover,
5213
+ .db-history-resizer.active {
5214
+ background: var(--accent);
5215
+ opacity: 0.5;
5216
+ }
5217
+ .db-history-resizer[hidden] { display: none; }
5218
+ .db-history-pane {
5219
+ height: 220px;
5220
+ min-height: 60px;
5221
+ flex-shrink: 0;
5222
+ overflow: hidden;
5223
+ border-top: 1px solid var(--border);
5224
+ background: var(--bg);
5225
+ }
5226
+ .db-history-pane[hidden] { display: none; }
5227
+ .db-tools-section {
5228
+ border-top: 1px solid var(--border);
5229
+ padding: 6px 8px;
5230
+ display: flex;
5231
+ gap: 6px;
5232
+ flex-shrink: 0;
5233
+ }
5234
+ .db-tool-btn {
5235
+ flex: 1;
5236
+ padding: 5px 8px;
5237
+ border: 1px solid var(--border);
5238
+ border-radius: 6px;
5239
+ background: var(--bg);
5240
+ color: var(--fg-muted);
5241
+ font-size: var(--db-font-base);
5242
+ font-family: inherit;
5243
+ cursor: pointer;
5244
+ text-align: center;
5245
+ }
5246
+ .db-tool-btn:hover {
5247
+ background: var(--bg-mute);
5248
+ color: var(--fg);
5249
+ }
5250
+ .db-tool-btn.active {
5251
+ background: color-mix(in srgb, var(--accent) 12%, var(--bg));
5252
+ color: var(--accent);
5253
+ border-color: var(--accent);
5254
+ font-weight: 600;
5255
+ }
5256
+ .db-history-toggle {
5257
+ display: flex;
5258
+ align-items: center;
5259
+ gap: 6px;
5260
+ width: 100%;
5261
+ padding: 8px 12px;
5262
+ border: none;
5263
+ border-top: 1px solid var(--border);
5264
+ background: var(--bg-soft);
5265
+ color: var(--fg-muted);
5266
+ font-size: var(--db-font-base);
5267
+ font-family: inherit;
5268
+ cursor: pointer;
5269
+ text-align: left;
5270
+ flex-shrink: 0;
5271
+ }
5272
+ .db-history-toggle:hover {
5273
+ background: var(--bg-mute);
5274
+ color: var(--fg);
5275
+ }
5276
+ .db-history-toggle.active {
5277
+ color: var(--accent);
5278
+ font-weight: 600;
5279
+ }
5280
+
5281
+ /* ---------- Sidebar ---------- */
5282
+ .db-sidebar {
5283
+ width: 260px;
5284
+ min-width: 120px;
5285
+ max-width: 600px;
5286
+ border-right: 1px solid var(--border);
5287
+ background: var(--bg-soft);
5288
+ display: flex;
5289
+ flex-direction: column;
5290
+ overflow: hidden;
5291
+ position: relative;
5292
+ }
5293
+ .db-sidebar-resize {
5294
+ position: absolute;
5295
+ top: 0;
5296
+ right: -3px;
5297
+ width: 6px;
5298
+ height: 100%;
5299
+ cursor: col-resize;
5300
+ z-index: 10;
5301
+ }
5302
+ .db-sidebar-resize:hover,
5303
+ .db-sidebar-resize.active {
5304
+ background: var(--accent);
5305
+ opacity: 0.3;
5306
+ }
5307
+
5308
+ .db-toolbar {
5309
+ padding: 8px;
5310
+ border-bottom: 1px solid var(--border);
5311
+ }
5312
+
5313
+ .db-file-select {
5314
+ width: 100%;
5315
+ padding: 5px 24px 5px 8px;
5316
+ border: 1px solid var(--border);
5317
+ border-radius: 6px;
5318
+ background: var(--bg);
5319
+ color: var(--fg);
5320
+ font-size: var(--db-font-base);
5321
+ font-family: inherit;
5322
+ cursor: pointer;
5323
+ text-overflow: ellipsis;
5324
+ appearance: none;
5325
+ -webkit-appearance: none;
5326
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M3 4.5L6 8l3-3.5H3z'/%3E%3C/svg%3E");
5327
+ background-repeat: no-repeat;
5328
+ background-position: right 6px center;
5329
+ }
5330
+ .db-file-select:focus {
5331
+ outline: 2px solid var(--accent);
5332
+ outline-offset: -1px;
5333
+ }
5334
+
5335
+ .db-table-filter-wrap {
5336
+ padding: 4px 8px;
5337
+ }
5338
+ .db-table-filter {
5339
+ width: 100%;
5340
+ padding: 4px 8px 4px 24px;
5341
+ border: 1px solid var(--border);
5342
+ border-radius: 6px;
5343
+ background: var(--bg);
5344
+ color: var(--fg);
5345
+ font-size: var(--db-font-base);
5346
+ font-family: inherit;
5347
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'/%3E%3C/svg%3E");
5348
+ background-repeat: no-repeat;
5349
+ background-position: 6px center;
5350
+ }
5351
+ .db-table-filter:focus {
5352
+ outline: 2px solid var(--accent);
5353
+ outline-offset: -1px;
5354
+ border-color: var(--accent);
5355
+ }
5356
+ .db-table-list {
5357
+ flex: 1;
5358
+ overflow-y: auto;
5359
+ padding: 4px 0;
5360
+ }
5361
+
5362
+ .db-table-list-empty {
5363
+ padding: 16px;
5364
+ color: var(--fg-muted);
5365
+ text-align: center;
5366
+ font-size: var(--db-font-md);
5367
+ }
5368
+
5369
+ .db-table-group-header {
5370
+ padding: 6px 12px 2px;
5371
+ font-size: var(--db-font-sm);
5372
+ font-weight: 600;
5373
+ color: var(--fg-subtle);
5374
+ text-transform: uppercase;
5375
+ letter-spacing: 0.5px;
5376
+ }
5377
+
5378
+ .db-table-node {
5379
+ border-bottom: 1px solid var(--border);
5380
+ }
5381
+ .db-table-arrow {
5382
+ flex-shrink: 0;
5383
+ width: 16px;
5384
+ height: 16px;
5385
+ cursor: pointer;
5386
+ user-select: none;
5387
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath fill='%23888' d='M6 4l4 4-4 4z'/%3E%3C/svg%3E") center/contain no-repeat;
5388
+ transition: transform 0.15s;
5389
+ }
5390
+ .db-table-arrow.expanded {
5391
+ transform: rotate(90deg);
5392
+ }
5393
+ .db-table-arrow:hover {
5394
+ opacity: 0.7;
5395
+ }
5396
+ .db-table-item {
5397
+ display: flex;
5398
+ align-items: center;
5399
+ gap: 4px;
5400
+ padding: 4px 8px;
5401
+ cursor: pointer;
5402
+ font-size: var(--db-font-md);
5403
+ color: var(--fg);
5404
+ border-left: 3px solid transparent;
5405
+ transition: background 0.1s;
5406
+ }
5407
+ .db-table-item:hover {
5408
+ background: var(--bg-mute);
5409
+ }
5410
+ .db-table-item.active {
5411
+ background: var(--accent-subtle);
5412
+ border-left-color: var(--accent);
5413
+ font-weight: 500;
5414
+ }
5415
+ .db-table-children {
5416
+ padding-left: 20px;
5417
+ }
5418
+ .db-table-children[hidden] { display: none; }
5419
+ .db-table-col-item {
5420
+ display: flex;
5421
+ align-items: center;
5422
+ gap: 6px;
5423
+ padding: 2px 8px;
5424
+ font-size: var(--db-font-sm);
5425
+ color: var(--fg-muted);
5426
+ }
5427
+ .db-table-col-item.pk {
5428
+ color: var(--fg);
5429
+ font-weight: 500;
5430
+ }
5431
+ .db-table-col-item.pk .db-table-col-name::before {
5432
+ content: "🔑 ";
5433
+ font-size: 9px;
5434
+ }
5435
+ .db-table-col-name {
5436
+ flex: 1;
5437
+ overflow: hidden;
5438
+ text-overflow: ellipsis;
5439
+ white-space: nowrap;
5440
+ }
5441
+ .db-table-col-type {
5442
+ flex-shrink: 0;
5443
+ font-size: var(--db-font-sm);
5444
+ color: var(--fg-subtle);
5445
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5446
+ }
5447
+
5448
+ .db-table-icon {
5449
+ display: inline-flex;
5450
+ align-items: center;
5451
+ justify-content: center;
5452
+ width: 18px;
5453
+ height: 18px;
5454
+ border-radius: 3px;
5455
+ font-size: var(--db-font-sm);
5456
+ font-weight: 700;
5457
+ color: var(--fg-onemphasis);
5458
+ background: var(--accent);
5459
+ flex-shrink: 0;
5460
+ }
5461
+ .db-table-item[data-type="view"] .db-table-icon {
5462
+ background: var(--scope-accent);
5463
+ }
5464
+
5465
+ .db-table-name {
5466
+ flex: 1;
5467
+ overflow: hidden;
5468
+ text-overflow: ellipsis;
5469
+ white-space: nowrap;
5470
+ }
5471
+
5472
+ .db-table-count {
5473
+ font-size: var(--db-font-sm);
5474
+ color: var(--fg-subtle);
5475
+ flex-shrink: 0;
5476
+ }
5477
+
5478
+ /* ---------- Main content ---------- */
5479
+ .db-main-content {
5480
+ flex: 1;
5481
+ display: flex;
5482
+ flex-direction: column;
5483
+ overflow: hidden;
5484
+ background: var(--bg);
5485
+ }
5486
+
5487
+ /* ---------- Tab bar ---------- */
5488
+ .db-tab-bar {
5489
+ display: flex;
5490
+ gap: 0;
5491
+ border-bottom: 1px solid var(--border);
5492
+ background: var(--bg-soft);
5493
+ padding: 0 8px;
5494
+ flex-shrink: 0;
5495
+ }
5496
+
5497
+ .db-tab {
5498
+ padding: 8px 16px;
5499
+ border: none;
5500
+ background: none;
5501
+ color: var(--fg-muted);
5502
+ font-size: var(--db-font-md);
5503
+ font-weight: 500;
5504
+ cursor: pointer;
5505
+ border-bottom: 2px solid transparent;
5506
+ margin-bottom: -1px;
5507
+ transition: color 0.15s;
5508
+ }
5509
+ .db-tab:hover {
5510
+ color: var(--fg);
5511
+ }
5512
+ .db-tab.active {
5513
+ color: var(--fg);
5514
+ border-bottom-color: var(--accent);
5515
+ }
5516
+
5517
+ /* hidden attribute override for flex containers */
5518
+ .db-grid[hidden],
5519
+ .db-query-editor[hidden],
5520
+ .db-schema-view[hidden] {
5521
+ display: none !important;
5522
+ }
5523
+
5524
+ /* ---------- Shared Button Base ---------- */
5525
+ .db-btn {
5526
+ padding: 3px 10px;
5527
+ border: 1px solid var(--border);
5528
+ border-radius: 4px;
5529
+ background: var(--bg);
5530
+ color: var(--fg);
5531
+ font-size: var(--db-font-base);
5532
+ font-family: inherit;
5533
+ cursor: pointer;
5534
+ transition: background 0.15s;
5535
+ white-space: nowrap;
5536
+ }
5537
+ .db-btn:hover {
5538
+ background: var(--bg-mute);
5539
+ }
5540
+ .db-btn:disabled {
5541
+ opacity: 0.6;
5542
+ cursor: default;
5543
+ }
5544
+ .db-btn-primary {
5545
+ border: none;
5546
+ background: var(--accent);
5547
+ color: #fff;
5548
+ font-weight: 600;
5549
+ }
5550
+ .db-btn-primary:hover {
5551
+ background: var(--accent-emph);
5552
+ }
5553
+ .db-btn-sm {
5554
+ padding: 2px 8px;
5555
+ font-size: var(--db-font-sm);
5556
+ }
5557
+ .db-btn-icon {
5558
+ padding: 0 4px;
5559
+ border: none;
5560
+ background: none;
5561
+ line-height: 1;
5562
+ }
5563
+ .db-btn-icon:hover {
5564
+ color: var(--accent);
5565
+ background: none;
5566
+ }
5567
+
5568
+ /* ---------- Data Grid ---------- */
5569
+ .db-grid {
5570
+ flex: 1;
5571
+ display: flex;
5572
+ flex-direction: column;
5573
+ overflow: hidden;
5574
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5575
+ font-size: var(--db-font-base);
5576
+ }
5577
+
5578
+ .db-grid-header-wrap {
5579
+ flex-shrink: 0;
5580
+ overflow: hidden;
5581
+ border-bottom: 2px solid var(--border);
5582
+ background: var(--bg-soft);
5583
+ }
5584
+
5585
+ .db-grid-header {
5586
+ display: flex;
5587
+ min-height: 32px;
5588
+ width: max-content;
5589
+ min-width: 100%;
5590
+ }
5591
+
5592
+ .db-grid-header-cell {
5593
+ display: flex;
5594
+ align-items: center;
5595
+ gap: 4px;
5596
+ cursor: pointer;
5597
+ user-select: none;
5598
+ transition: background 0.1s;
5599
+ }
5600
+ .db-grid-header-cell:hover {
5601
+ background: var(--bg-mute);
5602
+ }
5603
+ .db-grid-header-cell.sorted {
5604
+ background: var(--accent-subtle);
5605
+ }
5606
+
5607
+ .db-grid-header-label {
5608
+ font-weight: 600;
5609
+ overflow: hidden;
5610
+ text-overflow: ellipsis;
5611
+ white-space: nowrap;
5612
+ }
5613
+
5614
+ .db-grid-header-type {
5615
+ font-size: var(--db-font-sm);
5616
+ color: var(--fg-subtle);
5617
+ padding: 1px 4px;
5618
+ border-radius: 3px;
5619
+ background: var(--bg-mute);
5620
+ flex-shrink: 0;
5621
+ }
5622
+ .db-grid-header-type.pk {
5623
+ background: var(--attention-subtle, #fff8c5);
5624
+ color: var(--scope-accent);
5625
+ font-weight: 600;
5626
+ }
5627
+
5628
+ .db-grid-sort-icon {
5629
+ font-size: var(--db-font-sm);
5630
+ color: var(--accent);
5631
+ width: 12px;
5632
+ flex-shrink: 0;
5633
+ }
5634
+
5635
+ .db-grid-viewport {
5636
+ flex: 1;
5637
+ overflow: auto;
5638
+ position: relative;
5639
+ }
5640
+
5641
+ .db-grid-spacer {
5642
+ width: 1px;
5643
+ pointer-events: none;
5644
+ }
5645
+
5646
+ .db-grid-body {
5647
+ position: absolute;
5648
+ left: 0;
5649
+ right: 0;
5650
+ top: 0;
5651
+ will-change: transform;
5652
+ }
5653
+
5654
+ .db-grid-row {
5655
+ display: flex;
5656
+ height: 28px;
5657
+ border-bottom: 1px solid var(--border);
5658
+ width: max-content;
5659
+ min-width: 100%;
5660
+ }
5661
+ .db-grid-row.alt {
5662
+ background: var(--bg-soft);
5663
+ }
5664
+ .db-grid-row:hover {
5665
+ background: var(--accent-subtle);
5666
+ }
5667
+
5668
+ .db-grid-cell {
5669
+ width: 180px;
5670
+ min-width: 80px;
5671
+ flex: 0 0 auto;
5672
+ padding: 4px 8px;
5673
+ overflow: hidden;
5674
+ text-overflow: ellipsis;
5675
+ white-space: nowrap;
5676
+ line-height: 20px;
5677
+ border-right: 1px solid var(--border);
5678
+ }
5679
+ .db-grid-cell:last-child {
5680
+ border-right: 1px solid var(--border);
5681
+ }
5682
+ .db-grid-row.selected {
5683
+ background: var(--accent-subtle) !important;
5684
+ outline: 1px solid var(--accent);
5685
+ outline-offset: -1px;
5686
+ }
5687
+ .db-grid-cell.null {
5688
+ color: var(--fg-subtle);
5689
+ font-style: italic;
5690
+ font-size: var(--db-font-sm);
5691
+ background: rgba(128, 128, 128, 0.06);
5692
+ border-radius: 3px;
5693
+ }
5694
+ .db-grid-cell.empty {
5695
+ color: var(--fg-subtle);
5696
+ font-style: italic;
5697
+ font-size: var(--db-font-sm);
5698
+ }
5699
+ .db-grid-cell.blob {
5700
+ color: var(--fg-subtle);
5701
+ font-size: var(--db-font-sm);
5702
+ }
5703
+ .db-grid-cell.loading {
5704
+ color: var(--fg-subtle);
5705
+ }
5706
+ .db-grid-cell.copied {
5707
+ background: rgba(46, 160, 67, 0.15);
5708
+ transition: background 0.1s;
5709
+ }
5710
+ .db-grid-cell:not(.db-grid-rownum):hover {
5711
+ background: rgba(0, 0, 0, 0.04);
5712
+ }
5713
+
5714
+ .db-grid-rownum-header,
5715
+ .db-grid-rownum {
5716
+ min-width: 50px;
5717
+ max-width: 60px;
5718
+ flex: 0 0 50px;
5719
+ text-align: right;
5720
+ color: var(--fg-subtle);
5721
+ background: var(--bg-soft);
5722
+ font-size: var(--db-font-sm);
5723
+ border-right: 1px solid var(--border);
5724
+ }
5725
+
5726
+ .db-grid-status {
5727
+ padding: 4px 12px;
5728
+ font-size: var(--db-font-base);
5729
+ color: var(--fg-muted);
5730
+ border-top: 1px solid var(--border);
5731
+ background: var(--bg-soft);
5732
+ flex-shrink: 0;
5733
+ }
5734
+
5735
+ /* ---------- Query Editor ---------- */
5736
+ .db-query-editor {
5737
+ flex: 1;
5738
+ display: flex;
5739
+ flex-direction: column;
5740
+ overflow: hidden;
5741
+ }
5742
+
5743
+ .db-query-input {
5744
+ padding: 8px;
5745
+ border-bottom: 1px solid var(--border);
5746
+ flex-shrink: 0;
5747
+ }
5748
+
5749
+ .db-query-editor-wrap {
5750
+ position: relative;
5751
+ border: 1px solid var(--border);
5752
+ border-radius: 6px;
5753
+ overflow: hidden;
5754
+ min-height: 60px;
5755
+ }
5756
+ .db-query-editor-wrap:focus-within {
5757
+ outline: 2px solid var(--accent);
5758
+ outline-offset: -1px;
5759
+ border-color: var(--accent);
5760
+ }
5761
+ .db-query-highlight {
5762
+ position: absolute;
5763
+ inset: 0;
5764
+ margin: 0;
5765
+ padding: 8px;
5766
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5767
+ font-size: var(--db-font-md);
5768
+ line-height: 1.5;
5769
+ white-space: pre-wrap;
5770
+ word-wrap: break-word;
5771
+ overflow: hidden;
5772
+ pointer-events: none;
5773
+ background: var(--bg);
5774
+ color: var(--fg);
5775
+ }
5776
+ .db-query-highlight code {
5777
+ font-family: inherit;
5778
+ font-size: inherit;
5779
+ }
5780
+ .db-query-highlight span[style] {
5781
+ color: var(--shiki-light);
5782
+ }
5783
+ @media (prefers-color-scheme: dark) {
5784
+ .db-query-highlight span[style] {
5785
+ color: var(--shiki-dark);
5786
+ }
5787
+ }
5788
+ html[data-theme="dark"] .db-query-highlight span[style] {
5789
+ color: var(--shiki-dark);
5790
+ }
5791
+ .db-query-textarea {
5792
+ position: relative;
5793
+ width: 100%;
5794
+ padding: 8px;
5795
+ border: none;
5796
+ border-radius: 0;
5797
+ background: transparent;
5798
+ color: transparent;
5799
+ caret-color: var(--fg);
5800
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5801
+ font-size: var(--db-font-md);
5802
+ line-height: 1.5;
5803
+ resize: vertical;
5804
+ min-height: 60px;
5805
+ z-index: 1;
5806
+ }
5807
+ .db-query-textarea::selection {
5808
+ background: var(--accent);
5809
+ color: transparent;
5810
+ }
5811
+ .db-query-textarea:focus {
5812
+ outline: none;
5813
+ }
5814
+
5815
+ .db-query-toolbar {
5816
+ display: flex;
5817
+ align-items: center;
5818
+ gap: 8px;
5819
+ margin-top: 6px;
5820
+ }
5821
+
5822
+ .db-query-run {
5823
+ padding: 4px 16px;
5824
+ border-radius: 6px;
5825
+ }
5826
+
5827
+ .db-query-status {
5828
+ font-size: var(--db-font-base);
5829
+ color: var(--fg-muted);
5830
+ }
5831
+
5832
+ .db-query-result {
5833
+ flex: 1;
5834
+ overflow: auto;
5835
+ padding: 8px;
5836
+ }
5837
+
5838
+ .db-query-error {
5839
+ padding: 12px;
5840
+ border-radius: 6px;
5841
+ background: var(--danger-subtle, #ffebe9);
5842
+ color: var(--danger);
5843
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5844
+ font-size: var(--db-font-base);
5845
+ white-space: pre-wrap;
5846
+ word-break: break-word;
5847
+ }
5848
+
5849
+ .db-query-table-wrap {
5850
+ overflow: auto;
5851
+ max-height: 100%;
5852
+ }
5853
+
5854
+ .db-query-table {
5855
+ border-collapse: collapse;
5856
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5857
+ font-size: var(--db-font-base);
5858
+ width: max-content;
5859
+ min-width: 100%;
5860
+ }
5861
+ .db-query-table th,
5862
+ .db-query-table td {
5863
+ padding: 4px 10px;
5864
+ border: 1px solid var(--border);
5865
+ white-space: nowrap;
5866
+ max-width: 400px;
5867
+ overflow: hidden;
5868
+ text-overflow: ellipsis;
5869
+ }
5870
+ .db-query-table th {
5871
+ background: var(--bg-soft);
5872
+ font-weight: 600;
5873
+ text-align: left;
5874
+ position: sticky;
5875
+ top: 0;
5876
+ z-index: 1;
5877
+ }
5878
+ .db-query-table tr.alt td {
5879
+ background: var(--bg-soft);
5880
+ }
5881
+ .db-query-table tr:hover td {
5882
+ background: var(--accent-subtle);
5883
+ }
5884
+ .db-query-table td.null {
5885
+ color: var(--fg-subtle);
5886
+ font-style: italic;
5887
+ }
5888
+
5889
+ /* ---------- Schema View ---------- */
5890
+ .db-schema-view {
5891
+ flex: 1;
5892
+ overflow: auto;
5893
+ padding: 12px 16px;
5894
+ }
5895
+
5896
+ .db-schema-header {
5897
+ font-size: 14px;
5898
+ font-weight: 600;
5899
+ color: var(--fg);
5900
+ margin: 12px 0 8px;
5901
+ padding-bottom: 4px;
5902
+ border-bottom: 1px solid var(--border);
5903
+ }
5904
+ .db-schema-header:first-child {
5905
+ margin-top: 0;
5906
+ }
5907
+
5908
+ .db-schema-table {
5909
+ border-collapse: collapse;
5910
+ font-size: var(--db-font-md);
5911
+ width: 100%;
5912
+ margin-bottom: 16px;
5913
+ }
5914
+ .db-schema-table th,
5915
+ .db-schema-table td {
5916
+ padding: 5px 10px;
5917
+ border: 1px solid var(--border);
5918
+ text-align: left;
5919
+ }
5920
+ .db-schema-table th {
5921
+ background: var(--bg-soft);
5922
+ font-weight: 600;
5923
+ font-size: var(--db-font-base);
5924
+ }
5925
+ .db-schema-table tr.pk-row {
5926
+ background: var(--attention-subtle, #fff8c5);
5927
+ }
5928
+
5929
+ .db-schema-col-name {
5930
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5931
+ font-weight: 500;
5932
+ }
5933
+ .db-schema-col-type {
5934
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5935
+ color: var(--fg-muted);
5936
+ }
5937
+ .db-schema-pk {
5938
+ color: var(--scope-accent);
5939
+ font-weight: 700;
5940
+ }
5941
+ .db-schema-default {
5942
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5943
+ color: var(--fg-subtle);
5944
+ font-size: var(--db-font-base);
5945
+ }
5946
+
5947
+ /* ---------- Data Grid: Filter Bar ---------- */
5948
+ .db-grid-filter-bar {
5949
+ display: flex;
5950
+ align-items: center;
5951
+ gap: 6px;
5952
+ padding: 6px 8px;
5953
+ border-bottom: 1px solid var(--border);
5954
+ background: var(--bg-soft);
5955
+ flex-shrink: 0;
5956
+ }
5957
+
5958
+ .db-grid-filter-icon {
5959
+ font-size: var(--db-font-md);
5960
+ flex-shrink: 0;
5961
+ }
5962
+
5963
+ .db-grid-filter-input {
5964
+ flex: 1;
5965
+ padding: 4px 8px;
5966
+ border: 1px solid var(--border);
5967
+ border-radius: 4px;
5968
+ background: var(--bg);
5969
+ color: var(--fg);
5970
+ font-size: var(--db-font-base);
5971
+ font-family: inherit;
5972
+ min-width: 0;
5973
+ }
5974
+ .db-grid-filter-input:focus {
5975
+ outline: 2px solid var(--accent);
5976
+ outline-offset: -1px;
5977
+ border-color: var(--accent);
5978
+ }
5979
+
5980
+ .db-grid-filter-clear {
5981
+ border: none;
5982
+ background: none;
5983
+ color: var(--fg-muted);
5984
+ font-size: 16px;
5985
+ cursor: pointer;
5986
+ padding: 0 4px;
5987
+ line-height: 1;
5988
+ }
5989
+ .db-grid-filter-clear:hover {
5990
+ color: var(--danger);
5991
+ }
5992
+
5993
+ /* ---------- Data Grid: Column Filter Row ---------- */
5994
+ .db-grid-filter-row-wrap {
5995
+ flex-shrink: 0;
5996
+ overflow: hidden;
5997
+ border-bottom: 1px solid var(--border);
5998
+ background: var(--bg-soft);
5999
+ }
6000
+
6001
+ .db-grid-filter-row {
6002
+ display: flex;
6003
+ min-height: 28px;
6004
+ width: max-content;
6005
+ min-width: 100%;
6006
+ }
6007
+
6008
+ .db-grid-filter-cell {
6009
+ padding: 2px 4px;
6010
+ }
6011
+
6012
+ .db-grid-filter-spacer {
6013
+ background: var(--bg-soft);
6014
+ }
6015
+
6016
+ .db-grid-col-filter {
6017
+ width: 100%;
6018
+ padding: 2px 6px;
6019
+ border: 1px solid var(--border);
6020
+ border-radius: 3px;
6021
+ background: var(--bg);
6022
+ color: var(--fg);
6023
+ font-size: var(--db-font-sm);
6024
+ font-family: inherit;
6025
+ box-sizing: border-box;
6026
+ }
6027
+ .db-grid-col-filter:focus {
6028
+ outline: 1px solid var(--accent);
6029
+ border-color: var(--accent);
6030
+ }
6031
+ .db-grid-col-filter::placeholder {
6032
+ color: var(--fg-subtle);
6033
+ font-size: var(--db-font-sm);
6034
+ }
6035
+
6036
+ /* ---------- ER Diagram ---------- */
6037
+ .db-er-diagram[hidden] {
6038
+ display: none !important;
6039
+ }
6040
+
6041
+ .db-er-diagram {
6042
+ flex: 1;
6043
+ display: flex;
6044
+ flex-direction: column;
6045
+ overflow: hidden;
6046
+ }
6047
+
6048
+ .db-er-toolbar {
6049
+ display: flex;
6050
+ gap: 4px;
6051
+ padding: 6px 8px;
6052
+ border-bottom: 1px solid var(--border);
6053
+ background: var(--bg-soft);
6054
+ flex-shrink: 0;
6055
+ }
6056
+
6057
+ .db-er-zoom-btn {
6058
+ /* uses .db-btn base */
6059
+ }
6060
+
6061
+ .db-er-container {
6062
+ flex: 1;
6063
+ overflow: auto;
6064
+ cursor: grab;
6065
+ background:
6066
+ radial-gradient(circle, var(--border) 1px, transparent 1px);
6067
+ background-size: 20px 20px;
6068
+ padding: 24px;
6069
+ }
6070
+ .db-er-container:active {
6071
+ cursor: grabbing;
6072
+ }
6073
+
6074
+ .db-er-svg-wrap {
6075
+ display: inline-block;
6076
+ min-width: 100%;
6077
+ }
6078
+
6079
+ .db-er-svg-wrap .mermaid svg {
6080
+ max-width: none !important;
6081
+ }
6082
+
6083
+ /* ---------- Cell Detail Panel ---------- */
6084
+ .db-grid-detail-panel[hidden] {
6085
+ display: none !important;
6086
+ }
6087
+
6088
+ .db-grid-detail-panel {
6089
+ border-top: 1px solid var(--border);
6090
+ background: var(--bg-soft);
6091
+ max-height: 200px;
6092
+ overflow: auto;
6093
+ flex-shrink: 0;
6094
+ }
6095
+
6096
+ .db-grid-detail-header {
6097
+ display: flex;
6098
+ align-items: center;
6099
+ justify-content: space-between;
6100
+ padding: 4px 8px;
6101
+ background: var(--bg-mute);
6102
+ border-bottom: 1px solid var(--border);
6103
+ font-size: var(--db-font-base);
6104
+ font-weight: 600;
6105
+ }
6106
+
6107
+ .db-grid-detail-title {
6108
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
6109
+ }
6110
+
6111
+ .db-grid-detail-close {
6112
+ font-size: 14px;
6113
+ color: var(--fg-muted);
6114
+ }
6115
+ .db-grid-detail-close:hover {
6116
+ color: var(--danger);
6117
+ background: none;
6118
+ }
6119
+
6120
+ .db-grid-detail-content {
6121
+ padding: 8px 12px;
6122
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
6123
+ font-size: var(--db-font-base);
6124
+ white-space: pre-wrap;
6125
+ word-break: break-word;
6126
+ line-height: 1.5;
6127
+ }
6128
+ .db-grid-detail-content.null {
6129
+ color: var(--fg-subtle);
6130
+ font-style: italic;
6131
+ }
6132
+ .db-grid-detail-content.blob {
6133
+ color: var(--fg-subtle);
6134
+ }
6135
+
6136
+ .db-grid-detail-json {
6137
+ margin: 0;
6138
+ font-size: var(--db-font-base);
6139
+ line-height: 1.4;
6140
+ white-space: pre-wrap;
6141
+ word-break: break-word;
6142
+ }
6143
+
6144
+ /* ---------- Export Buttons ---------- */
6145
+ .db-grid-export-btn {
6146
+ margin-left: 6px;
6147
+ }
6148
+
6149
+ /* ---------- Query History ---------- */
6150
+ .db-query-history-btn {
6151
+ border-radius: 6px;
6152
+ }
6153
+
6154
+ .db-query-history-dropdown[hidden] {
6155
+ display: none !important;
6156
+ }
6157
+
6158
+ .db-query-history-dropdown {
6159
+ position: absolute;
6160
+ z-index: 10;
6161
+ top: 100%;
6162
+ left: 0;
6163
+ right: 0;
6164
+ max-height: 250px;
6165
+ overflow-y: auto;
6166
+ background: var(--bg);
6167
+ border: 1px solid var(--border);
6168
+ border-radius: 6px;
6169
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
6170
+ margin-top: 4px;
6171
+ }
6172
+
6173
+ .db-query-history-item {
6174
+ padding: 6px 12px;
6175
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
6176
+ font-size: var(--db-font-base);
6177
+ cursor: pointer;
6178
+ white-space: nowrap;
6179
+ overflow: hidden;
6180
+ text-overflow: ellipsis;
6181
+ border-bottom: 1px solid var(--border);
6182
+ }
6183
+ .db-query-history-item:last-child {
6184
+ border-bottom: none;
6185
+ }
6186
+ .db-query-history-item:hover {
6187
+ background: var(--accent-subtle);
6188
+ }
6189
+
6190
+ .db-query-history-empty {
6191
+ padding: 12px;
6192
+ color: var(--fg-muted);
6193
+ text-align: center;
6194
+ font-size: var(--db-font-base);
6195
+ }
6196
+
6197
+ /* ---------- Explain Button ---------- */
6198
+ .db-query-explain {
6199
+ background: var(--bg-mute);
6200
+ color: var(--fg);
6201
+ border: 1px solid var(--border);
6202
+ }
6203
+ .db-query-explain:hover {
6204
+ background: var(--bg-soft);
6205
+ }
6206
+
6207
+ /* ---------- Query Input (relative positioning for history dropdown) ---------- */
6208
+ .db-query-input {
6209
+ position: relative;
6210
+ }
6211
+
6212
+ /* ---------- Column Resize Handle ---------- */
6213
+ .db-grid-resize-handle {
6214
+ position: absolute;
6215
+ right: 0;
6216
+ top: 0;
6217
+ bottom: 0;
6218
+ width: 6px;
6219
+ cursor: col-resize;
6220
+ background: transparent;
6221
+ z-index: 1;
6222
+ }
6223
+ .db-grid-resize-handle:hover,
6224
+ body.db-resizing .db-grid-resize-handle {
6225
+ background: var(--accent);
6226
+ opacity: 0.5;
6227
+ }
6228
+ .db-grid-header-cell {
6229
+ position: relative;
6230
+ }
6231
+ body.db-resizing {
6232
+ cursor: col-resize !important;
6233
+ user-select: none;
6234
+ }
6235
+ body.db-resizing * {
6236
+ user-select: none !important;
6237
+ }
6238
+
6239
+ /* ---------- Context Menu ---------- */
6240
+ .db-context-menu {
6241
+ z-index: 100;
6242
+ min-width: 200px;
6243
+ background: var(--bg);
6244
+ border: 1px solid var(--border);
6245
+ border-radius: 6px;
6246
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18);
6247
+ padding: 4px 0;
6248
+ font-size: var(--db-font-md);
6249
+ }
6250
+ .db-context-menu-item {
6251
+ padding: 6px 14px;
6252
+ cursor: pointer;
6253
+ color: var(--fg);
6254
+ white-space: nowrap;
6255
+ }
6256
+ .db-context-menu-item:hover {
6257
+ background: var(--accent-subtle);
6258
+ color: var(--accent);
6259
+ }
6260
+
6261
+ /* ---------- Schema Section Headers ---------- */
6262
+ .db-schema-section-header {
6263
+ padding: 8px 12px 4px;
6264
+ font-size: var(--db-font-base);
6265
+ font-weight: 700;
6266
+ color: var(--fg-muted);
6267
+ text-transform: uppercase;
6268
+ letter-spacing: 0.04em;
6269
+ border-bottom: 1px solid var(--border);
6270
+ margin-top: 16px;
6271
+ }
6272
+ .db-schema-section-header:first-of-type {
6273
+ margin-top: 8px;
6274
+ }
6275
+
6276
+ /* ---------- Schema DDL ---------- */
6277
+ .db-schema-ddl-wrap {
6278
+ position: relative;
6279
+ margin: 8px 0;
6280
+ }
6281
+ .db-schema-copy-btn {
6282
+ position: absolute;
6283
+ top: 8px;
6284
+ right: 8px;
6285
+ z-index: 1;
6286
+ }
6287
+ .db-schema-ddl-pre {
6288
+ margin: 0;
6289
+ padding: 12px 14px;
6290
+ background: var(--bg-soft);
6291
+ border: 1px solid var(--border);
6292
+ border-radius: 6px;
6293
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
6294
+ font-size: var(--db-font-base);
6295
+ line-height: 1.5;
6296
+ white-space: pre-wrap;
6297
+ word-break: break-word;
6298
+ overflow-x: auto;
6299
+ }
6300
+
6301
+ /* ---------- Schema Trigger Block ---------- */
6302
+ .db-schema-trigger-block {
6303
+ margin: 8px 0;
6304
+ }
6305
+ .db-schema-trigger-name {
6306
+ padding: 4px 12px;
6307
+ font-size: var(--db-font-base);
6308
+ font-weight: 600;
6309
+ color: var(--fg);
6310
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
6311
+ }
6312
+
6313
+ /* ---------- Docker Notice ---------- */
6314
+ .db-docker-notice {
6315
+ display: flex;
6316
+ flex-direction: column;
6317
+ align-items: center;
6318
+ justify-content: center;
6319
+ flex: 1;
6320
+ padding: 48px 24px;
6321
+ text-align: center;
6322
+ color: var(--fg-muted);
6323
+ }
6324
+ .db-docker-notice-icon {
6325
+ font-size: 48px;
6326
+ margin-bottom: 12px;
6327
+ }
6328
+ .db-docker-notice h3 {
6329
+ font-size: 18px;
6330
+ color: var(--fg);
6331
+ margin: 0 0 8px;
6332
+ }
6333
+ .db-docker-notice p {
6334
+ margin: 4px 0;
6335
+ font-size: var(--db-font-md);
6336
+ max-width: 500px;
6337
+ }
6338
+ .db-docker-notice-hint {
6339
+ color: var(--fg-subtle);
6340
+ }
6341
+ .db-docker-notice-code {
6342
+ margin-top: 12px;
6343
+ padding: 10px 16px;
6344
+ background: var(--bg-soft);
6345
+ border: 1px solid var(--border);
6346
+ border-radius: 6px;
6347
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
6348
+ font-size: var(--db-font-base);
6349
+ color: var(--fg);
6350
+ text-align: left;
6351
+ max-width: 600px;
6352
+ overflow-x: auto;
6353
+ }
6354
+
6355
+ /* ---------- Query History Panel Resizer ---------- */
6356
+ #query-history-resizer {
6357
+ position: absolute;
6358
+ left: -3px;
6359
+ top: 0;
6360
+ bottom: 0;
6361
+ width: 6px;
6362
+ cursor: col-resize;
6363
+ z-index: 50;
6364
+ }
6365
+ #query-history-resizer:hover {
6366
+ background: var(--accent-muted);
6367
+ }
6368
+ body.db-resizing {
6369
+ cursor: col-resize !important;
6370
+ user-select: none;
6371
+ }
6372
+
6373
+ /* --- Global Search --- */
6374
+ .db-global-search {
6375
+ padding: 12px;
6376
+ overflow-y: auto;
6377
+ height: 100%;
6378
+ }
6379
+ .db-global-search-header {
6380
+ display: flex;
6381
+ gap: 6px;
6382
+ margin-bottom: 8px;
6383
+ }
6384
+ .db-global-search-input {
6385
+ flex: 1;
6386
+ padding: 6px 10px;
6387
+ border: 1px solid var(--border);
6388
+ border-radius: 4px;
6389
+ background: var(--bg);
6390
+ color: var(--fg);
6391
+ font-size: var(--db-font-base);
6392
+ }
6393
+ .db-global-search-btn,
6394
+ .db-global-search-cancel {
6395
+ padding: 6px 14px;
6396
+ border: 1px solid var(--border);
6397
+ border-radius: 4px;
6398
+ background: var(--bg-soft);
6399
+ color: var(--fg);
6400
+ cursor: pointer;
6401
+ font-size: var(--db-font-base);
6402
+ }
6403
+ .db-global-search-btn:hover,
6404
+ .db-global-search-cancel:hover {
6405
+ background: var(--bg-mute);
6406
+ }
6407
+ .db-global-search-options {
6408
+ margin-bottom: 8px;
6409
+ font-size: var(--db-font-base);
6410
+ color: var(--fg-muted);
6411
+ }
6412
+ .db-global-search-options label {
6413
+ cursor: pointer;
6414
+ display: flex;
6415
+ align-items: center;
6416
+ gap: 4px;
6417
+ }
6418
+ .db-global-search-progress {
6419
+ padding: 8px;
6420
+ color: var(--fg-muted);
6421
+ font-size: var(--db-font-base);
6422
+ }
6423
+ .db-search-table-section {
6424
+ margin-bottom: 12px;
6425
+ border: 1px solid var(--border);
6426
+ border-radius: 6px;
6427
+ overflow: hidden;
6428
+ }
6429
+ .db-search-table-header {
6430
+ padding: 6px 10px;
6431
+ background: var(--bg-soft);
6432
+ font-weight: 600;
6433
+ font-size: var(--db-font-base);
6434
+ border-bottom: 1px solid var(--border);
6435
+ }
6436
+ .db-search-hits-list {
6437
+ max-height: 300px;
6438
+ overflow-y: auto;
6439
+ }
6440
+ .db-search-hit-row {
6441
+ display: flex;
6442
+ gap: 8px;
6443
+ padding: 4px 10px;
6444
+ border-bottom: 1px solid var(--border);
6445
+ font-size: var(--db-font-base);
6446
+ align-items: baseline;
6447
+ }
6448
+ .db-search-hit-row:last-child {
6449
+ border-bottom: none;
6450
+ }
6451
+ .db-search-hit-col {
6452
+ color: var(--accent);
6453
+ font-weight: 500;
6454
+ min-width: 100px;
6455
+ flex-shrink: 0;
6456
+ }
6457
+ .db-search-hit-val {
6458
+ color: var(--fg);
6459
+ word-break: break-all;
6460
+ flex: 1;
6461
+ }
6462
+ .db-search-more {
6463
+ padding: 6px 10px;
6464
+ color: var(--fg-muted);
6465
+ font-style: italic;
6466
+ font-size: var(--db-font-base);
6467
+ }
6468
+
6469
+ /* --- Snapshot & Diff --- */
6470
+ .db-snapshot-view {
6471
+ padding: 12px;
6472
+ overflow-y: auto;
6473
+ height: 100%;
6474
+ }
6475
+ .db-snapshot-guide {
6476
+ border: 1px solid var(--border);
6477
+ border-radius: 6px;
6478
+ padding: 10px 12px;
6479
+ margin-bottom: 12px;
6480
+ background: var(--bg-soft);
6481
+ }
6482
+ .db-snapshot-guide-title {
6483
+ font-weight: 600;
6484
+ font-size: var(--db-font-base);
6485
+ margin-bottom: 4px;
6486
+ }
6487
+ .db-snapshot-guide-body {
6488
+ font-size: var(--db-font-base);
6489
+ color: var(--fg-muted);
6490
+ line-height: 1.6;
6491
+ }
6492
+ .db-snapshot-guide-note {
6493
+ font-size: calc(var(--db-font-base) - 1px);
6494
+ color: var(--fg-muted);
6495
+ margin-top: 4px;
6496
+ font-style: italic;
6497
+ }
6498
+ .db-snapshot-note-field {
6499
+ display: flex;
6500
+ align-items: center;
6501
+ gap: 4px;
6502
+ flex: 1;
6503
+ min-width: 120px;
6504
+ }
6505
+ .db-snapshot-note-label {
6506
+ font-size: var(--db-font-base);
6507
+ color: var(--fg-muted);
6508
+ white-space: nowrap;
6509
+ font-weight: 500;
6510
+ }
6511
+ .db-snapshot-toolbar {
6512
+ display: flex;
6513
+ gap: 6px;
6514
+ margin-bottom: 12px;
6515
+ }
6516
+ .db-snapshot-create-btn,
6517
+ .db-snapshot-refresh-btn {
6518
+ padding: 6px 14px;
6519
+ border: 1px solid var(--border);
6520
+ border-radius: 4px;
6521
+ background: var(--bg-soft);
6522
+ color: var(--fg);
6523
+ cursor: pointer;
6524
+ font-size: var(--db-font-base);
6525
+ }
6526
+ .db-snapshot-create-btn:hover,
6527
+ .db-snapshot-refresh-btn:hover {
6528
+ background: var(--bg-mute);
6529
+ }
6530
+ .db-snapshot-table-selector {
6531
+ border: 1px solid var(--border);
6532
+ border-radius: 6px;
6533
+ padding: 10px;
6534
+ margin-bottom: 12px;
6535
+ background: var(--bg-soft);
6536
+ }
6537
+ .db-snapshot-table-selector-header {
6538
+ font-weight: 600;
6539
+ margin-bottom: 8px;
6540
+ font-size: var(--db-font-base);
6541
+ }
6542
+ .db-snapshot-table-checkboxes {
6543
+ display: flex;
6544
+ flex-wrap: wrap;
6545
+ gap: 4px 12px;
6546
+ margin-bottom: 8px;
6547
+ max-height: 200px;
6548
+ overflow-y: auto;
6549
+ }
6550
+ .db-snapshot-table-label {
6551
+ display: flex;
6552
+ align-items: center;
6553
+ gap: 4px;
6554
+ font-size: var(--db-font-base);
6555
+ cursor: pointer;
6556
+ }
6557
+ .db-snapshot-select-actions {
6558
+ display: flex;
6559
+ gap: 6px;
6560
+ align-items: center;
6561
+ flex-wrap: wrap;
6562
+ }
6563
+ .db-snapshot-select-actions button {
6564
+ padding: 4px 10px;
6565
+ border: 1px solid var(--border);
6566
+ border-radius: 4px;
6567
+ background: var(--bg);
6568
+ color: var(--fg);
6569
+ cursor: pointer;
6570
+ font-size: var(--db-font-base);
6571
+ }
6572
+ .db-snapshot-select-actions button:hover {
6573
+ background: var(--bg-mute);
6574
+ }
6575
+ .db-snapshot-note-input,
6576
+ .db-snapshot-diff-note-input {
6577
+ padding: 4px 8px;
6578
+ border: 1px solid var(--border);
6579
+ border-radius: 4px;
6580
+ background: var(--bg);
6581
+ color: var(--fg);
6582
+ font-size: var(--db-font-base);
6583
+ flex: 1;
6584
+ min-width: 120px;
6585
+ }
6586
+ .db-snapshot-confirm-btn {
6587
+ background: var(--accent) !important;
6588
+ color: #fff !important;
6589
+ border-color: var(--accent) !important;
6590
+ }
6591
+ .db-snapshot-section-title {
6592
+ font-size: calc(var(--db-font-base) + 1px);
6593
+ font-weight: 600;
6594
+ margin: 0 0 8px;
6595
+ color: var(--fg);
6596
+ }
6597
+ .db-snapshot-empty {
6598
+ color: var(--fg-muted);
6599
+ font-style: italic;
6600
+ padding: 12px 0;
6601
+ font-size: var(--db-font-base);
6602
+ }
6603
+ .db-snapshot-item {
6604
+ display: flex;
6605
+ justify-content: space-between;
6606
+ align-items: flex-start;
6607
+ padding: 8px 10px;
6608
+ border: 1px solid var(--border);
6609
+ border-radius: 6px;
6610
+ margin-bottom: 6px;
6611
+ gap: 8px;
6612
+ }
6613
+ .db-snapshot-info {
6614
+ display: flex;
6615
+ flex-wrap: wrap;
6616
+ gap: 6px 12px;
6617
+ align-items: center;
6618
+ font-size: var(--db-font-base);
6619
+ flex: 1;
6620
+ }
6621
+ .db-snapshot-id {
6622
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
6623
+ color: var(--accent);
6624
+ }
6625
+ .db-snapshot-date {
6626
+ color: var(--fg-muted);
6627
+ }
6628
+ .db-snapshot-status {
6629
+ padding: 1px 6px;
6630
+ border-radius: 10px;
6631
+ font-size: calc(var(--db-font-base) - 1px);
6632
+ }
6633
+ .db-snapshot-status.done {
6634
+ background: color-mix(in srgb, var(--success) 15%, var(--bg));
6635
+ color: var(--success);
6636
+ }
6637
+ .db-snapshot-status.running {
6638
+ background: color-mix(in srgb, var(--warning, #d29922) 15%, var(--bg));
6639
+ color: var(--warning, #d29922);
6640
+ }
6641
+ .db-snapshot-status.error {
6642
+ background: color-mix(in srgb, var(--danger) 15%, var(--bg));
6643
+ color: var(--danger);
6644
+ }
6645
+ .db-snapshot-tables-count {
6646
+ color: var(--fg-muted);
6647
+ }
6648
+ .db-snapshot-note {
6649
+ width: 100%;
6650
+ color: var(--fg-muted);
6651
+ font-style: italic;
6652
+ }
6653
+ .db-snapshot-actions {
6654
+ display: flex;
6655
+ gap: 4px;
6656
+ flex-shrink: 0;
6657
+ }
6658
+ .db-snapshot-actions button {
6659
+ padding: 3px 8px;
6660
+ border: 1px solid var(--border);
6661
+ border-radius: 4px;
6662
+ background: var(--bg);
6663
+ color: var(--fg);
6664
+ cursor: pointer;
6665
+ font-size: calc(var(--db-font-base) - 1px);
6666
+ }
6667
+ .db-snapshot-actions button:hover {
6668
+ background: var(--bg-mute);
6669
+ }
6670
+ .db-snapshot-diff-create {
6671
+ display: flex;
6672
+ align-items: center;
6673
+ gap: 6px;
6674
+ padding: 10px;
6675
+ border: 1px solid var(--border);
6676
+ border-radius: 6px;
6677
+ margin-top: 10px;
6678
+ flex-wrap: wrap;
6679
+ font-size: var(--db-font-base);
6680
+ }
6681
+ .db-snapshot-diff-select {
6682
+ padding: 4px 8px;
6683
+ border: 1px solid var(--border);
6684
+ border-radius: 4px;
6685
+ background: var(--bg);
6686
+ color: var(--fg);
6687
+ font-size: var(--db-font-base);
6688
+ }
6689
+ .db-snapshot-diff-btn {
6690
+ padding: 4px 14px;
6691
+ border: 1px solid var(--accent);
6692
+ border-radius: 4px;
6693
+ background: var(--accent);
6694
+ color: #fff;
6695
+ cursor: pointer;
6696
+ font-size: var(--db-font-base);
6697
+ }
6698
+ .db-snapshot-diff-btn:hover {
6699
+ opacity: 0.9;
6700
+ }
6701
+ .db-snapshot-diff-section {
6702
+ margin-top: 16px;
6703
+ }
6704
+ .db-snapshot-diff-item {
6705
+ display: flex;
6706
+ justify-content: space-between;
6707
+ align-items: flex-start;
6708
+ padding: 8px 10px;
6709
+ border: 1px solid var(--border);
6710
+ border-radius: 6px;
6711
+ margin-bottom: 6px;
6712
+ gap: 8px;
6713
+ }
6714
+ .db-snapshot-diff-info {
6715
+ display: flex;
6716
+ flex-wrap: wrap;
6717
+ gap: 6px 12px;
6718
+ align-items: center;
6719
+ font-size: var(--db-font-base);
6720
+ flex: 1;
6721
+ }
6722
+ .db-snapshot-diff-id {
6723
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
6724
+ color: var(--accent);
6725
+ }
6726
+ .db-snapshot-diff-date {
6727
+ color: var(--fg-muted);
6728
+ }
6729
+ .db-snapshot-diff-status {
6730
+ padding: 1px 6px;
6731
+ border-radius: 10px;
6732
+ font-size: calc(var(--db-font-base) - 1px);
6733
+ }
6734
+ .db-snapshot-diff-status.done {
6735
+ background: color-mix(in srgb, var(--success) 15%, var(--bg));
6736
+ color: var(--success);
6737
+ }
6738
+ .db-snapshot-diff-status.running {
6739
+ background: color-mix(in srgb, var(--warning, #d29922) 15%, var(--bg));
6740
+ color: var(--warning, #d29922);
6741
+ }
6742
+ .db-snapshot-diff-status.error {
6743
+ background: color-mix(in srgb, var(--danger) 15%, var(--bg));
6744
+ color: var(--danger);
6745
+ }
6746
+ .db-snapshot-diff-range {
6747
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
6748
+ color: var(--fg-muted);
6749
+ }
6750
+ .db-snapshot-diff-note-text {
6751
+ width: 100%;
6752
+ color: var(--fg-muted);
6753
+ font-style: italic;
6754
+ }
6755
+ .db-snapshot-diff-actions {
6756
+ display: flex;
6757
+ gap: 4px;
6758
+ flex-shrink: 0;
6759
+ }
6760
+ .db-snapshot-diff-actions button {
6761
+ padding: 3px 8px;
6762
+ border: 1px solid var(--border);
6763
+ border-radius: 4px;
6764
+ background: var(--bg);
6765
+ color: var(--fg);
6766
+ cursor: pointer;
6767
+ font-size: calc(var(--db-font-base) - 1px);
6768
+ }
6769
+ .db-snapshot-diff-actions button:hover {
6770
+ background: var(--bg-mute);
6771
+ }
6772
+ .db-snapshot-back-btn {
6773
+ padding: 4px 10px;
6774
+ border: 1px solid var(--border);
6775
+ border-radius: 4px;
6776
+ background: var(--bg);
6777
+ color: var(--fg);
6778
+ cursor: pointer;
6779
+ font-size: var(--db-font-base);
6780
+ margin-bottom: 8px;
6781
+ }
6782
+ .db-snapshot-back-btn:hover {
6783
+ background: var(--bg-mute);
6784
+ }
6785
+ .db-snapshot-diff-summary {
6786
+ padding: 8px 0;
6787
+ color: var(--fg-muted);
6788
+ font-size: var(--db-font-base);
6789
+ }
6790
+ .db-snapshot-no-changes {
6791
+ padding: 12px 0;
6792
+ color: var(--fg-muted);
6793
+ font-style: italic;
6794
+ font-size: var(--db-font-base);
6795
+ }
6796
+ .db-snapshot-diff-table {
6797
+ border: 1px solid var(--border);
6798
+ border-radius: 6px;
6799
+ margin-bottom: 8px;
6800
+ overflow: hidden;
6801
+ }
6802
+ .db-snapshot-diff-table-header {
6803
+ display: flex;
6804
+ justify-content: space-between;
6805
+ align-items: center;
6806
+ padding: 8px 10px;
6807
+ background: var(--bg-soft);
6808
+ font-size: var(--db-font-base);
6809
+ cursor: pointer;
6810
+ }
6811
+ .db-snapshot-diff-table-header:hover {
6812
+ background: var(--bg-mute);
6813
+ }
6814
+ .db-snapshot-diff-table-name {
6815
+ font-weight: 600;
6816
+ }
6817
+ .db-snapshot-diff-table-stats {
6818
+ color: var(--fg-muted);
6819
+ }
6820
+ .db-snapshot-diff-rows-container {
6821
+ max-height: 400px;
6822
+ overflow-y: auto;
6823
+ }
6824
+ .db-snapshot-diff-row {
6825
+ padding: 6px 10px;
6826
+ border-bottom: 1px solid var(--border);
6827
+ font-size: var(--db-font-base);
6828
+ }
6829
+ .db-snapshot-diff-row:last-child {
6830
+ border-bottom: none;
6831
+ }
6832
+ .db-snapshot-diff-row.inserted {
6833
+ background: var(--diff-addition-bg, rgba(46, 160, 67, 0.05));
6834
+ }
6835
+ .db-snapshot-diff-row.deleted {
6836
+ background: var(--diff-deletion-bg, rgba(248, 81, 73, 0.05));
6837
+ }
6838
+ .db-snapshot-diff-row.updated {
6839
+ background: var(--diff-change-bg, rgba(210, 153, 34, 0.05));
6840
+ }
6841
+ .db-snapshot-diff-type {
6842
+ display: inline-block;
6843
+ padding: 1px 5px;
6844
+ border-radius: 3px;
6845
+ font-size: calc(var(--db-font-base) - 2px);
6846
+ font-weight: 600;
6847
+ margin-right: 6px;
6848
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
6849
+ }
6850
+ .db-snapshot-diff-type.inserted {
6851
+ background: color-mix(in srgb, var(--success) 15%, var(--bg));
6852
+ color: var(--success);
6853
+ }
6854
+ .db-snapshot-diff-type.deleted {
6855
+ background: color-mix(in srgb, var(--danger) 15%, var(--bg));
6856
+ color: var(--danger);
6857
+ }
6858
+ .db-snapshot-diff-type.updated {
6859
+ background: color-mix(in srgb, var(--warning, #d29922) 15%, var(--bg));
6860
+ color: var(--warning, #d29922);
6861
+ }
6862
+ .db-snapshot-diff-key {
6863
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
6864
+ color: var(--fg-muted);
6865
+ font-size: calc(var(--db-font-base) - 1px);
6866
+ }
6867
+ .db-snapshot-diff-changes,
6868
+ .db-snapshot-diff-values {
6869
+ margin-top: 4px;
6870
+ padding-left: 16px;
6871
+ }
6872
+ .db-snapshot-diff-change-row,
6873
+ .db-snapshot-diff-value-entry {
6874
+ margin-bottom: 2px;
6875
+ font-size: calc(var(--db-font-base) - 1px);
6876
+ display: block;
6877
+ }
6878
+ .db-snapshot-diff-change-row .col-name,
6879
+ .db-snapshot-diff-value-entry .col-name {
6880
+ color: var(--accent);
6881
+ font-weight: 500;
6882
+ }
6883
+ .db-snapshot-diff-change-row .old-val,
6884
+ .db-snapshot-diff-value-entry .old-val {
6885
+ color: var(--danger);
6886
+ text-decoration: line-through;
6887
+ }
6888
+ .db-snapshot-diff-change-row .new-val,
6889
+ .db-snapshot-diff-value-entry .new-val {
6890
+ color: var(--success);
6891
+ }
6892
+ .db-snapshot-diff-more {
6893
+ padding: 6px 10px;
6894
+ color: var(--fg-muted);
6895
+ font-style: italic;
6896
+ font-size: var(--db-font-base);
6897
+ }
6898
+ .db-snapshot-loading,
6899
+ .db-snapshot-error {
6900
+ padding: 12px 10px;
6901
+ color: var(--fg-muted);
6902
+ font-size: var(--db-font-base);
6903
+ }
6904
+
6905
+ /* Diff grid table */
6906
+ .db-snap-diff-grid {
6907
+ width: 100%;
6908
+ border-collapse: collapse;
6909
+ font-size: var(--db-font-base);
6910
+ table-layout: auto;
6911
+ }
6912
+ .db-snap-diff-grid th {
6913
+ position: sticky;
6914
+ top: 0;
6915
+ background: var(--bg-soft);
6916
+ border: 1px solid var(--border);
6917
+ padding: 4px 8px;
6918
+ font-weight: 600;
6919
+ text-align: left;
6920
+ white-space: nowrap;
6921
+ z-index: 1;
6922
+ }
6923
+ .db-snap-diff-grid td {
6924
+ border: 1px solid var(--border);
6925
+ padding: 3px 8px;
6926
+ max-width: 300px;
6927
+ overflow: hidden;
6928
+ text-overflow: ellipsis;
6929
+ white-space: nowrap;
6930
+ }
6931
+ .db-snap-diff-grid tr.snap-diff-add {
6932
+ background: var(--diff-add-bg);
6933
+ }
6934
+ .db-snap-diff-grid tr.snap-diff-del {
6935
+ background: var(--diff-del-bg);
6936
+ }
6937
+ .db-snap-diff-grid .snap-diff-type-cell {
6938
+ font-weight: 600;
6939
+ white-space: nowrap;
6940
+ color: var(--fg-muted);
6941
+ background: var(--bg-soft);
6942
+ text-align: center;
6943
+ min-width: 50px;
6944
+ }
6945
+ .db-snap-diff-grid .snap-diff-changed-cell {
6946
+ font-weight: 600;
6947
+ }
6948
+
6949
+ /* Inline dialog (replaces confirm/prompt) */
6950
+ .db-snapshot-inline-dialog {
6951
+ display: flex;
6952
+ gap: 6px;
6953
+ padding: 6px 10px;
6954
+ border: 1px solid var(--accent);
6955
+ border-radius: 6px;
6956
+ margin-bottom: 6px;
6957
+ background: var(--bg-soft);
6958
+ align-items: center;
6959
+ }