@youtyan/code-viewer 0.1.51 → 0.1.53

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 {
@@ -2561,7 +2641,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2561
2641
  }
2562
2642
  .gdp-source-file-info span {
2563
2643
  padding: 2px 7px;
2564
- border: 1px solid var(--border-muted);
2644
+ border: 1px solid var(--border);
2565
2645
  border-radius: 999px;
2566
2646
  background: var(--bg-soft);
2567
2647
  }
@@ -2591,7 +2671,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2591
2671
  }
2592
2672
  .gdp-source-meta {
2593
2673
  padding: 8px 12px;
2594
- border-bottom: 1px solid var(--border-muted);
2674
+ border-bottom: 1px solid var(--border);
2595
2675
  background: var(--bg-soft);
2596
2676
  color: var(--fg-muted);
2597
2677
  font-size: 12px;
@@ -2606,7 +2686,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2606
2686
  gap: 4px;
2607
2687
  padding: 8px 12px 0;
2608
2688
  background: var(--bg);
2609
- border-bottom: 1px solid var(--border-muted);
2689
+ border-bottom: 1px solid var(--border);
2610
2690
  }
2611
2691
  .gdp-source-tabs button {
2612
2692
  appearance: none;
@@ -2663,7 +2743,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2663
2743
  .gdp-source-table tr.gdp-source-cursor .gdp-source-line-number,
2664
2744
  .gdp-source-virtual-row.gdp-source-cursor .gdp-source-virtual-line-number {
2665
2745
  color: var(--fg);
2666
- 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);
2667
2747
  }
2668
2748
  .gdp-source-table tr.gdp-source-cursor .gdp-source-line-code,
2669
2749
  .gdp-source-virtual-row.gdp-source-cursor .gdp-source-virtual-line-code {
@@ -2692,7 +2772,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2692
2772
  }
2693
2773
  .gdp-source-table tr.gdp-source-line-target .gdp-source-line-number,
2694
2774
  .gdp-source-virtual-row.gdp-source-line-target .gdp-source-virtual-line-number {
2695
- 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);
2696
2776
  }
2697
2777
  .gdp-source-line-target .gdp-source-line-code,
2698
2778
  .gdp-source-line-target .gdp-source-virtual-line-code {
@@ -2754,7 +2834,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2754
2834
  text-align: right;
2755
2835
  color: var(--fg-muted);
2756
2836
  background: var(--bg);
2757
- box-shadow: inset -1px 0 0 var(--border-muted);
2837
+ box-shadow: inset -1px 0 0 var(--border);
2758
2838
  font-variant-numeric: tabular-nums;
2759
2839
  user-select: none;
2760
2840
  white-space: nowrap;
@@ -2793,7 +2873,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2793
2873
  gap: 8px;
2794
2874
  min-width: 0;
2795
2875
  padding: 8px 12px;
2796
- border-bottom: 1px solid var(--border-muted);
2876
+ border-bottom: 1px solid var(--border);
2797
2877
  color: var(--fg-muted);
2798
2878
  background: var(--bg-soft);
2799
2879
  font-size: 12px;
@@ -2907,7 +2987,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2907
2987
  text-align: right;
2908
2988
  color: var(--fg-muted);
2909
2989
  background: var(--bg);
2910
- box-shadow: inset -1px 0 0 var(--border-muted);
2990
+ box-shadow: inset -1px 0 0 var(--border);
2911
2991
  font-variant-numeric: tabular-nums;
2912
2992
  cursor: pointer;
2913
2993
  user-select: none;
@@ -2950,7 +3030,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2950
3030
  top: var(--global-header-h);
2951
3031
  z-index: 35;
2952
3032
  background: var(--bg);
2953
- border-bottom: 1px solid var(--border-muted);
3033
+ border-bottom: 1px solid var(--border);
2954
3034
  }
2955
3035
  .gdp-file-detail-header {
2956
3036
  display: flex;
@@ -3052,7 +3132,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3052
3132
  align-items: baseline;
3053
3133
  gap: 6px;
3054
3134
  padding: 0 10px;
3055
- border-right: 1px solid var(--border-muted);
3135
+ border-right: 1px solid var(--border);
3056
3136
  white-space: nowrap;
3057
3137
  }
3058
3138
  .gdp-file-detail-meta-item:first-child {
@@ -3104,7 +3184,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3104
3184
  max-height: calc(100vh - var(--global-header-h) - 40px);
3105
3185
  overflow: auto;
3106
3186
  padding: 8px 12px 10px 0;
3107
- border-right: 1px solid var(--border-muted);
3187
+ border-right: 1px solid var(--border);
3108
3188
  background: transparent;
3109
3189
  font-size: 13px;
3110
3190
  line-height: 1.45;
@@ -3124,7 +3204,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3124
3204
  display: block;
3125
3205
  margin: 0 0 10px 2px;
3126
3206
  padding: 0 8px 10px;
3127
- border-bottom: 1px solid var(--border-muted);
3207
+ border-bottom: 1px solid var(--border);
3128
3208
  color: var(--fg-muted);
3129
3209
  font-size: 11px;
3130
3210
  font-weight: 600;
@@ -3192,7 +3272,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3192
3272
  .gdp-markdown-preview h1,
3193
3273
  .gdp-markdown-preview h2 {
3194
3274
  padding-bottom: 0.3em;
3195
- border-bottom: 1px solid var(--border-muted);
3275
+ border-bottom: 1px solid var(--border);
3196
3276
  }
3197
3277
  .gdp-markdown-preview h1 {
3198
3278
  margin: 0 0 16px;
@@ -3631,8 +3711,8 @@ body.gdp-file-detail-page #empty {
3631
3711
  align-items: center;
3632
3712
  min-height: 34px;
3633
3713
  padding: 0 14px;
3634
- border-top: 1px solid var(--border-muted);
3635
- border-bottom: 1px solid var(--border-muted);
3714
+ border-top: 1px solid var(--border);
3715
+ border-bottom: 1px solid var(--border);
3636
3716
  background: var(--bg-soft);
3637
3717
  }
3638
3718
  .gdp-repo-sort-spacer {
@@ -3667,7 +3747,7 @@ body.gdp-file-detail-page #empty {
3667
3747
  width: 100%;
3668
3748
  min-height: 42px;
3669
3749
  border: 0;
3670
- border-bottom: 1px solid var(--border-muted);
3750
+ border-bottom: 1px solid var(--border);
3671
3751
  background: var(--bg);
3672
3752
  color: var(--fg);
3673
3753
  padding: 0 14px;
@@ -3813,7 +3893,7 @@ body.gdp-file-detail-page #empty {
3813
3893
  justify-content: flex-end;
3814
3894
  gap: 8px;
3815
3895
  padding: 12px 16px;
3816
- border-top: 1px solid var(--border-muted);
3896
+ border-top: 1px solid var(--border);
3817
3897
  }
3818
3898
  .gdp-trash-dialog-danger {
3819
3899
  border-color: var(--danger);
@@ -4004,7 +4084,7 @@ body.gdp-file-detail-page #empty {
4004
4084
  background: var(--bg) !important;
4005
4085
  color: var(--fg-muted) !important;
4006
4086
  border-right: 0 !important;
4007
- box-shadow: inset -1px 0 0 var(--border-muted);
4087
+ box-shadow: inset -1px 0 0 var(--border);
4008
4088
  font-size: var(--code-font-size) !important;
4009
4089
  font-variant-numeric: tabular-nums;
4010
4090
  user-select: none;
@@ -4013,7 +4093,7 @@ body.gdp-file-detail-page #empty {
4013
4093
  background: var(--bg) !important;
4014
4094
  color: var(--fg-muted) !important;
4015
4095
  border-right: 0 !important;
4016
- box-shadow: inset -1px 0 0 var(--border-muted);
4096
+ box-shadow: inset -1px 0 0 var(--border);
4017
4097
  font-size: var(--code-font-size) !important;
4018
4098
  font-variant-numeric: tabular-nums;
4019
4099
  }
@@ -4093,12 +4173,12 @@ body.gdp-file-detail-page #empty {
4093
4173
  .d2h-emptyplaceholder,
4094
4174
  .d2h-code-side-emptyplaceholder {
4095
4175
  background: var(--bg-soft) !important;
4096
- border-color: var(--border-muted) !important;
4176
+ border-color: var(--border) !important;
4097
4177
  }
4098
4178
  .d2h-code-side-emptyplaceholder { color: var(--fg-subtle) !important; }
4099
4179
 
4100
4180
  /* Side-by-side divider */
4101
- .d2h-file-side-diff > div { border-color: var(--border-muted) !important; }
4181
+ .d2h-file-side-diff > div { border-color: var(--border) !important; }
4102
4182
  .d2h-files-diff > div { background: var(--bg) !important; }
4103
4183
 
4104
4184
  /* Prefix coloring (use diff2html's default layout) */
@@ -4454,6 +4534,174 @@ body.gdp-help-page #annotation-panel {
4454
4534
  body.annotation-panel-open #content {
4455
4535
  margin-right: min(380px, calc(100vw - 32px));
4456
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
+
4457
4705
  .annotation-panel-head {
4458
4706
  display: flex;
4459
4707
  align-items: center;
@@ -4898,3 +5146,1814 @@ body.annotation-panel-open #content {
4898
5146
  .gdp-annotation-spacer td > div {
4899
5147
  height: 0;
4900
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
+ }