fdb2 1.0.34 → 1.0.36

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.
@@ -61,11 +61,11 @@ to { transform: translateY(0);
61
61
 
62
62
  /* 基础变量 - 现代色彩方案 */
63
63
  :root {
64
- /* 主色调 - 紫色渐变 */
64
+ /* 主色调 - 扁平纯色(gradient 变量名保留以兼容既有引用) */
65
65
  --db-primary-color: #667eea;
66
66
  --db-primary-dark: #5a67d8;
67
67
  --db-primary-light: #7c8bf8;
68
- --db-primary-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
68
+ --db-primary-gradient: var(--db-primary-color);
69
69
 
70
70
  /* 辅助色彩 */
71
71
  --db-secondary-color: #6c757d;
@@ -85,7 +85,7 @@ to { transform: translateY(0);
85
85
 
86
86
  /* 背景渐变 */
87
87
  --db-bg-gradient: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
88
- --db-card-gradient: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%);
88
+ --db-card-gradient: linear-gradient(135deg, var(--db-surface) 0%, #f8fafc 100%);
89
89
 
90
90
  /* 阴影 */
91
91
  --db-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.05);
@@ -112,6 +112,30 @@ to { transform: translateY(0);
112
112
  /* 字体 */
113
113
  --db-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
114
114
  --db-font-mono: 'SF Mono', Monaco, Inconsolata, 'Roboto Mono', monospace;
115
+
116
+ /* 表面 / 边框 / 文本令牌(VSCode webview 主题跟随用,暗色值见 body.vscode-dark 块) */
117
+ --db-surface: #ffffff;
118
+ --db-on-accent: #ffffff;
119
+ --db-border: #e2e8f0;
120
+ --db-border-gray: #e5e7eb;
121
+ --db-border-light: #d1d5db;
122
+ --db-border-lighter: #dee2e6;
123
+ --db-border-soft: #e9ecef;
124
+ --db-bg-soft: #f3f4f6;
125
+ --db-bg-soft2: #f8f9fa;
126
+ --db-bg-soft3: #fafbfc;
127
+ --db-bg-soft4: #fafafa;
128
+ --db-bg-soft5: #f6f8fa;
129
+ --db-text-body: #374151;
130
+ --db-text-muted: #64748b;
131
+ --db-text-faint: #94a3b8;
132
+ --db-danger-bg: #fee2e2;
133
+ --db-success-bg: #d1fae5;
134
+ --db-warning-bg: #fef3c7;
135
+ --db-info-bg: #dbeafe;
136
+ --db-primary-bg: #e0e7ff;
137
+ --db-code-bg: #282c34;
138
+ --db-code-fg: #abb2bf;
115
139
  }
116
140
 
117
141
  /* 全局布局 - 现代桌面应用风格 */
@@ -214,7 +238,7 @@ body {
214
238
 
215
239
  /* 现代表格样式 */
216
240
  .table {
217
- background: white;
241
+ background: var(--db-surface);
218
242
  border-radius: var(--db-radius-lg);
219
243
  overflow: hidden;
220
244
  box-shadow: var(--db-shadow-sm);
@@ -254,52 +278,31 @@ body {
254
278
 
255
279
  /* 现代按钮样式 */
256
280
  .btn {
257
- border-radius: var(--db-radius-md);
281
+ border-radius: var(--db-radius-sm);
258
282
  font-weight: 600;
259
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
283
+ transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
260
284
  border: none;
261
285
  position: relative;
262
- overflow: hidden;
263
286
  letter-spacing: 0.025em;
264
- box-shadow: var(--db-shadow-sm);
265
287
  }
266
288
 
267
- .btn::before {
268
- content: '';
269
- position: absolute;
270
- top: 50%;
271
- left: 50%;
272
- width: 0;
273
- height: 0;
274
- border-radius: 50%;
275
- background: rgba(255, 255, 255, 0.2);
276
- transform: translate(-50%, -50%);
277
- transition: width 0.6s, height 0.6s;
289
+ .btn:hover:not(:disabled) {
290
+ opacity: 0.92;
278
291
  }
279
292
 
280
- .btn:active::before {
281
- width: 300px;
282
- height: 300px;
283
- }
284
-
285
- .btn:hover {
286
- transform: translateY(-2px);
287
- box-shadow: var(--db-shadow-lg);
288
- }
289
-
290
- .btn:active {
291
- transform: translateY(0);
293
+ .btn:active:not(:disabled) {
294
+ opacity: 1;
292
295
  }
293
296
 
294
297
  /* 主要按钮 */
295
298
  .btn-primary {
296
299
  background: var(--db-primary-gradient);
297
- color: white;
300
+ color: var(--db-on-accent);
298
301
  }
299
302
 
300
303
  .btn-primary:hover {
301
304
  background: var(--db-primary-dark);
302
- color: white;
305
+ color: var(--db-on-accent);
303
306
  }
304
307
 
305
308
  /* 次要按钮 */
@@ -316,26 +319,26 @@ body {
316
319
 
317
320
  /* 成功按钮 */
318
321
  .btn-success {
319
- background: linear-gradient(135deg, var(--db-accent-color) 0%, #059669 100%);
320
- color: white;
322
+ background: var(--db-accent-color);
323
+ color: var(--db-on-accent);
321
324
  }
322
325
 
323
326
  /* 警告按钮 */
324
327
  .btn-warning {
325
- background: linear-gradient(135deg, var(--db-warning-color) 0%, #d97706 100%);
326
- color: white;
328
+ background: var(--db-warning-color);
329
+ color: var(--db-on-accent);
327
330
  }
328
331
 
329
332
  /* 危险按钮 */
330
333
  .btn-danger {
331
- background: linear-gradient(135deg, var(--db-danger-color) 0%, #dc2626 100%);
332
- color: white;
334
+ background: var(--db-danger-color);
335
+ color: var(--db-on-accent);
333
336
  }
334
337
 
335
338
  /* 信息按钮 */
336
339
  .btn-info {
337
- background: linear-gradient(135deg, var(--db-info-color) 0%, #2563eb 100%);
338
- color: white;
340
+ background: var(--db-info-color);
341
+ color: var(--db-on-accent);
339
342
  }
340
343
 
341
344
  /* 轮廓按钮 */
@@ -347,7 +350,7 @@ body {
347
350
 
348
351
  .btn-outline-primary:hover {
349
352
  background: var(--db-primary-gradient);
350
- color: white;
353
+ color: var(--db-on-accent);
351
354
  border-color: transparent;
352
355
  }
353
356
 
@@ -374,19 +377,19 @@ body {
374
377
  }
375
378
 
376
379
  .badge.bg-success {
377
- background: linear-gradient(135deg, var(--db-accent-color) 0%, #059669 100%) !important;
380
+ background: var(--db-accent-color) !important;
378
381
  }
379
382
 
380
383
  .badge.bg-warning {
381
- background: linear-gradient(135deg, var(--db-warning-color) 0%, #d97706 100%) !important;
384
+ background: var(--db-warning-color) !important;
382
385
  }
383
386
 
384
387
  .badge.bg-danger {
385
- background: linear-gradient(135deg, var(--db-danger-color) 0%, #dc2626 100%) !important;
388
+ background: var(--db-danger-color) !important;
386
389
  }
387
390
 
388
391
  .badge.bg-info {
389
- background: linear-gradient(135deg, var(--db-info-color) 0%, #2563eb 100%) !important;
392
+ background: var(--db-info-color) !important;
390
393
  }
391
394
 
392
395
  /* 现代导航样式 */
@@ -445,7 +448,7 @@ body {
445
448
 
446
449
  .navbar-nav .nav-link.active {
447
450
  background: var(--db-primary-gradient);
448
- color: white;
451
+ color: var(--db-on-accent);
449
452
  font-weight: 700;
450
453
  box-shadow: var(--db-shadow-md);
451
454
  }
@@ -515,7 +518,7 @@ body {
515
518
 
516
519
  .btn-close:hover {
517
520
  background: var(--db-danger-color);
518
- color: white;
521
+ color: var(--db-on-accent);
519
522
  transform: rotate(90deg);
520
523
  }
521
524
 
@@ -526,7 +529,7 @@ body {
526
529
  padding: 0.75rem var(--db-spacing-md);
527
530
  font-size: 0.95rem;
528
531
  transition: all 0.3s ease;
529
- background: white;
532
+ background: var(--db-surface);
530
533
  font-weight: 500;
531
534
  }
532
535
 
@@ -543,7 +546,7 @@ body {
543
546
  padding: 0.75rem var(--db-spacing-md);
544
547
  font-size: 0.95rem;
545
548
  transition: all 0.3s ease;
546
- background: white;
549
+ background: var(--db-surface);
547
550
  font-weight: 500;
548
551
  cursor: pointer;
549
552
  }
@@ -557,7 +560,7 @@ body {
557
560
 
558
561
  .form-label {
559
562
  font-weight: 700;
560
- color: #1e293b;
563
+ color: var(--db-dark-color);
561
564
  margin-bottom: var(--db-spacing-sm);
562
565
  font-size: 0.9rem;
563
566
  letter-spacing: 0.025em;
@@ -568,7 +571,7 @@ body {
568
571
 
569
572
  .form-text {
570
573
  font-size: 0.875rem;
571
- color: #334155;
574
+ color: var(--db-darker-color);
572
575
  margin-top: var(--db-spacing-xs);
573
576
  }
574
577
 
@@ -596,7 +599,7 @@ body {
596
599
 
597
600
  /* 代码样式 */
598
601
  code {
599
- background-color: #e2e8f0;
602
+ background-color: var(--db-border);
600
603
  color: #be185d;
601
604
  padding: 0.2rem 0.4rem;
602
605
  border-radius: 3px;
@@ -604,8 +607,8 @@ code {
604
607
  }
605
608
 
606
609
  pre {
607
- background-color: #f1f5f9;
608
- border: 1px solid #cbd5e1;
610
+ background-color: var(--db-gray-light);
611
+ border: 1px solid var(--db-gray-medium);
609
612
  border-radius: 6px;
610
613
  padding: 1rem;
611
614
  margin: 0;
@@ -621,22 +624,22 @@ pre {
621
624
  }
622
625
 
623
626
  .alert-success {
624
- background-color: #dcfce7;
627
+ background-color: var(--db-success-bg);
625
628
  color: #166534;
626
629
  }
627
630
 
628
631
  .alert-danger {
629
- background-color: #fee2e2;
632
+ background-color: var(--db-danger-bg);
630
633
  color: #991b1b;
631
634
  }
632
635
 
633
636
  .alert-warning {
634
- background-color: #fef3c7;
637
+ background-color: var(--db-warning-bg);
635
638
  color: #92400e;
636
639
  }
637
640
 
638
641
  .alert-info {
639
- background-color: #dbeafe;
642
+ background-color: var(--db-info-bg);
640
643
  color: #1e40af;
641
644
  }
642
645
 
@@ -659,7 +662,7 @@ pre {
659
662
  }
660
663
 
661
664
  .dropdown-item:hover {
662
- background-color: #e2e8f0;
665
+ background-color: var(--db-border);
663
666
  transform: translateX(2px);
664
667
  }
665
668
 
@@ -672,14 +675,14 @@ pre {
672
675
  }
673
676
 
674
677
  .list-group-item:hover {
675
- background-color: #e2e8f0;
678
+ background-color: var(--db-border);
676
679
  transform: translateX(4px);
677
680
  }
678
681
 
679
682
  /* 页面头部样式 */
680
683
  .page-header {
681
- background: linear-gradient(135deg, var(--db-primary-color) 0%, #0056b3 100%);
682
- color: white;
684
+ background: var(--db-primary-color);
685
+ color: var(--db-on-accent);
683
686
  padding: 2rem 0;
684
687
  margin-bottom: 2rem;
685
688
  }
@@ -786,17 +789,17 @@ pre {
786
789
  }
787
790
 
788
791
  ::-webkit-scrollbar-track {
789
- background: #f1f1f1;
792
+ background: var(--db-bg-soft);
790
793
  border-radius: 4px;
791
794
  }
792
795
 
793
796
  ::-webkit-scrollbar-thumb {
794
- background: #c1c1c1;
797
+ background: var(--db-border-light);
795
798
  border-radius: 4px;
796
799
  }
797
800
 
798
801
  ::-webkit-scrollbar-thumb:hover {
799
- background: #a8a8a8;
802
+ background: var(--db-border-light);
800
803
  }
801
804
 
802
805
  /* 加载状态 */
@@ -813,7 +816,7 @@ pre {
813
816
  width: 20px;
814
817
  height: 20px;
815
818
  margin: -10px 0 0 -10px;
816
- border: 2px solid #f3f3f3;
819
+ border: 2px solid var(--db-bg-soft);
817
820
  border-top: 2px solid var(--db-primary-color);
818
821
  border-radius: 50%;
819
822
  animation: spin 1s linear infinite;
@@ -833,7 +836,7 @@ pre {
833
836
  }
834
837
 
835
838
  .status-offline {
836
- color: #64748b;
839
+ color: var(--db-text-muted);
837
840
  display: flex;
838
841
  align-items: center;
839
842
  gap: var(--db-spacing-xs);
@@ -857,23 +860,23 @@ pre {
857
860
  /* 数据库类型样式 */
858
861
  .db-icon-mysql {
859
862
  color: #00758f;
860
- background: linear-gradient(135deg, #00758f 0%, #005a70 100%);
863
+ background: #00758f;
861
864
  }
862
865
  .db-icon-postgres {
863
866
  color: #336791;
864
- background: linear-gradient(135deg, #336791 0%, #2a5278 100%);
867
+ background: #336791;
865
868
  }
866
869
  .db-icon-sqlite {
867
870
  color: #003b57;
868
- background: linear-gradient(135deg, #003b57 0%, #002d42 100%);
871
+ background: #003b57;
869
872
  }
870
873
  .db-icon-mssql {
871
874
  color: #cc2927;
872
- background: linear-gradient(135deg, #cc2927 0%, #a62220 100%);
875
+ background: #cc2927;
873
876
  }
874
877
  .db-icon-oracle {
875
878
  color: #f80000;
876
- background: linear-gradient(135deg, #f80000 0%, #d40000 100%);
879
+ background: #f80000;
877
880
  }
878
881
 
879
882
  /* 现代工具类 */
@@ -968,9 +971,13 @@ pre {
968
971
  }
969
972
  }
970
973
 
971
- /* 暗色模式支持 */
974
+ /* 暗色模式支持
975
+ * - 桌面端(Electron/浏览器):跟随 OS,via prefers-color-scheme;
976
+ * 排除 webview(body 带 vscode-* 类),避免 OS 暗色 + 编辑器浅色时错配。
977
+ * - VSCode webview:跟随编辑器主题,由宿主维护的 body.vscode-dark / vscode-high-contrast 类驱动。
978
+ */
972
979
  @media (prefers-color-scheme: dark) {
973
- :root {
980
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) {
974
981
  --db-light-color: #1e293b;
975
982
  --db-gray-light: #334155;
976
983
  --db-gray-medium: #475569;
@@ -978,35 +985,626 @@ pre {
978
985
  --db-darker-color: #cbd5e1;
979
986
  --db-dark-color: #e2e8f0;
980
987
  --db-black: #f8fafc;
981
-
988
+
982
989
  --db-bg-gradient: linear-gradient(135deg, #1e293b 0%, #334155 100%);
983
990
  --db-card-gradient: linear-gradient(135deg, #334155 0%, #1e293b 100%);
991
+
992
+ --db-surface: #1e293b;
993
+ --db-on-accent: #ffffff;
994
+ --db-border: #475569;
995
+ --db-border-gray: #445263;
996
+ --db-border-light: #4d5b6b;
997
+ --db-border-lighter: #4d5b6b;
998
+ --db-border-soft: #3d4a59;
999
+ --db-bg-soft: #263041;
1000
+ --db-bg-soft2: #263041;
1001
+ --db-bg-soft3: #263041;
1002
+ --db-bg-soft4: #232d3c;
1003
+ --db-bg-soft5: #232d3c;
1004
+ --db-text-body: #cbd5e1;
1005
+ --db-text-muted: #8296ab;
1006
+ --db-text-faint: #64748b;
1007
+ --db-danger-bg: rgba(239, 68, 68, 0.16);
1008
+ --db-success-bg: rgba(16, 185, 129, 0.16);
1009
+ --db-warning-bg: rgba(245, 158, 11, 0.16);
1010
+ --db-info-bg: rgba(59, 130, 246, 0.18);
1011
+ --db-primary-bg: rgba(102, 126, 234, 0.18);
1012
+ --db-code-bg: #1b1f27;
1013
+ --db-code-fg: #abb2bf;
984
1014
  }
985
-
986
- .card {
1015
+
1016
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .card {
987
1017
  border-color: #475569;
988
1018
  }
989
-
990
- .form-control,
991
- .form-select {
1019
+
1020
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .form-control,
1021
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .form-select {
992
1022
  background: #1e293b;
993
1023
  border-color: #475569;
994
1024
  color: #f1f5f9;
995
1025
  }
996
-
997
- .navbar {
1026
+
1027
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .navbar {
998
1028
  background: linear-gradient(135deg, #334155 0%, #1e293b 100%);
999
1029
  }
1000
-
1001
- .table {
1030
+
1031
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .table {
1002
1032
  background: #1e293b;
1003
1033
  }
1004
-
1005
- .table th {
1034
+
1035
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .table th {
1006
1036
  background: #475569;
1007
1037
  color: #f1f5f9;
1008
1038
  }
1009
1039
  }
1040
+
1041
+ /* VSCode webview:编辑器暗色 / 高对比主题(变量与上面的 OS 暗色保持一致) */
1042
+ body.vscode-dark,
1043
+ body.vscode-high-contrast {
1044
+ --db-light-color: var(--vscode-editor-background, #1e293b);
1045
+ --db-gray-light: var(--vscode-sideBar-background, #334155);
1046
+ --db-gray-medium: var(--vscode-panel-border, #475569);
1047
+ --db-gray-dark: var(--vscode-descriptionForeground, #94a3b8);
1048
+ --db-darker-color: var(--vscode-editor-foreground, #cbd5e1);
1049
+ --db-dark-color: var(--vscode-foreground, #e2e8f0);
1050
+ --db-black: var(--vscode-editor-foreground, #f8fafc);
1051
+
1052
+ --db-bg-gradient: linear-gradient(135deg, var(--vscode-editor-background, #1e293b) 0%, var(--vscode-sideBar-background, #334155) 100%);
1053
+ --db-card-gradient: linear-gradient(135deg, var(--vscode-sideBar-background, #334155) 0%, var(--vscode-editor-background, #1e293b) 100%);
1054
+
1055
+ --db-surface: var(--vscode-editorWidget-background, #1e293b);
1056
+ --db-on-accent: var(--vscode-button-foreground, #ffffff);
1057
+ --db-border: var(--vscode-panel-border, #475569);
1058
+ --db-border-gray: var(--vscode-editorWidget-border, var(--vscode-panel-border, #445263));
1059
+ --db-border-light: var(--vscode-input-border, #4d5b6b);
1060
+ --db-border-lighter: var(--vscode-input-border, #4d5b6b);
1061
+ --db-border-soft: var(--vscode-list-hoverBackground, #3d4a59);
1062
+ --db-bg-soft: var(--vscode-editorWidget-background, #263041);
1063
+ --db-bg-soft2: var(--vscode-sideBar-background, #263041);
1064
+ --db-bg-soft3: var(--vscode-editorWidget-background, #263041);
1065
+ --db-bg-soft4: var(--vscode-editor-background, #232d3c);
1066
+ --db-bg-soft5: var(--vscode-editor-background, #232d3c);
1067
+ --db-text-body: var(--vscode-editor-foreground, #cbd5e1);
1068
+ --db-text-muted: var(--vscode-descriptionForeground, #8296ab);
1069
+ --db-text-faint: var(--vscode-disabledForeground, #64748b);
1070
+ --db-danger-bg: rgba(239, 68, 68, 0.16);
1071
+ --db-success-bg: rgba(16, 185, 129, 0.16);
1072
+ --db-warning-bg: rgba(245, 158, 11, 0.16);
1073
+ --db-info-bg: rgba(59, 130, 246, 0.18);
1074
+ --db-primary-bg: rgba(102, 126, 234, 0.18);
1075
+ --db-code-bg: var(--vscode-textCodeBlock-background, #1b1f27);
1076
+ --db-code-fg: var(--vscode-editor-foreground, #abb2bf);
1077
+ }
1078
+
1079
+ /* 浅色主题:同样桥接到宿主令牌,跟随任意浅色主题(GitHub Light / Quiet Light / Solarized Light…) */
1080
+ body.vscode-light {
1081
+ --db-light-color: var(--vscode-editor-background, #f8fafc);
1082
+ --db-gray-light: var(--vscode-sideBar-background, #f1f5f9);
1083
+ --db-gray-medium: var(--vscode-panel-border, #cbd5e1);
1084
+ --db-gray-dark: var(--vscode-descriptionForeground, #475569);
1085
+ --db-darker-color: var(--vscode-editor-foreground, #334155);
1086
+ --db-dark-color: var(--vscode-foreground, #1e293b);
1087
+ --db-black: var(--vscode-editor-foreground, #0f172a);
1088
+
1089
+ --db-bg-gradient: linear-gradient(135deg, var(--vscode-editor-background, #f8fafc) 0%, var(--vscode-sideBar-background, #e2e8f0) 100%);
1090
+ --db-card-gradient: linear-gradient(135deg, var(--vscode-editorWidget-background, #ffffff) 0%, var(--vscode-editor-background, #f8fafc) 100%);
1091
+
1092
+ --db-surface: var(--vscode-editorWidget-background, #ffffff);
1093
+ --db-on-accent: var(--vscode-button-foreground, #ffffff);
1094
+ --db-border: var(--vscode-panel-border, #e2e8f0);
1095
+ --db-border-gray: var(--vscode-editorWidget-border, var(--vscode-panel-border, #e5e7eb));
1096
+ --db-border-light: var(--vscode-input-border, #d1d5db);
1097
+ --db-border-lighter: var(--vscode-input-border, #dee2e6);
1098
+ --db-border-soft: var(--vscode-list-hoverBackground, #e9ecef);
1099
+ --db-bg-soft: var(--vscode-editorWidget-background, #f3f4f6);
1100
+ --db-bg-soft2: var(--vscode-sideBar-background, #f8f9fa);
1101
+ --db-bg-soft3: var(--vscode-editorWidget-background, #fafbfc);
1102
+ --db-bg-soft4: var(--vscode-editor-background, #fafafa);
1103
+ --db-bg-soft5: var(--vscode-editor-background, #f6f8fa);
1104
+ --db-text-body: var(--vscode-editor-foreground, #374151);
1105
+ --db-text-muted: var(--vscode-descriptionForeground, #64748b);
1106
+ --db-text-faint: var(--vscode-disabledForeground, #94a3b8);
1107
+ --db-code-bg: var(--vscode-textCodeBlock-background, #282c34);
1108
+ --db-code-fg: var(--vscode-editor-foreground, #abb2bf);
1109
+ }
1110
+
1111
+ /* 暗色下的 Bootstrap 默认浅色控件兜底(同样走令牌,跟随任意主题) */
1112
+ body.vscode-dark .card,
1113
+ body.vscode-high-contrast .card {
1114
+ border-color: var(--db-gray-medium);
1115
+ }
1116
+
1117
+ body.vscode-dark .form-control,
1118
+ body.vscode-dark .form-select,
1119
+ body.vscode-high-contrast .form-control,
1120
+ body.vscode-high-contrast .form-select {
1121
+ background: var(--db-surface);
1122
+ border-color: var(--db-border);
1123
+ color: var(--db-text-body);
1124
+ }
1125
+
1126
+ body.vscode-dark .navbar,
1127
+ body.vscode-high-contrast .navbar {
1128
+ background: var(--db-bg-gradient);
1129
+ }
1130
+
1131
+ body.vscode-dark .table,
1132
+ body.vscode-high-contrast .table {
1133
+ background: var(--db-surface);
1134
+ }
1135
+
1136
+ body.vscode-dark .table th,
1137
+ body.vscode-high-contrast .table th {
1138
+ background: var(--db-bg-soft);
1139
+ color: var(--db-text-body);
1140
+ }
1141
+
1142
+ /* Bootstrap 的浅色工具类在暗色下过于刺眼/对比不足,统一改挂主题令牌 */
1143
+ body.vscode-dark .border-light,
1144
+ body.vscode-high-contrast .border-light,
1145
+ body.vscode-dark .bg-light,
1146
+ body.vscode-high-contrast .bg-light {
1147
+ border-color: var(--db-border) !important;
1148
+ background-color: var(--db-bg-soft) !important;
1149
+ }
1150
+
1151
+ body.vscode-dark .btn-outline-secondary,
1152
+ body.vscode-high-contrast .btn-outline-secondary,
1153
+ body.vscode-dark .btn-outline-light,
1154
+ body.vscode-high-contrast .btn-outline-light {
1155
+ color: var(--db-text-body) !important;
1156
+ border-color: var(--db-border-light) !important;
1157
+ }
1158
+
1159
+ body.vscode-dark .btn-outline-secondary:hover,
1160
+ body.vscode-high-contrast .btn-outline-secondary:hover,
1161
+ body.vscode-dark .btn-outline-light:hover,
1162
+ body.vscode-high-contrast .btn-outline-light:hover {
1163
+ background-color: var(--db-bg-soft) !important;
1164
+ color: var(--db-text-body) !important;
1165
+ }
1166
+ /* ------------------------------------------------------------------
1167
+ * webview:显式接管 Bootstrap 的基础文本/背景色与标题色。
1168
+ * 之前只靠 data-bs-theme 间接切换,一旦宿主变量未按预期生效,
1169
+ * 表名/标题等继承链上的文字就会保持黑色(--bs-body-color 默认 #212529)。
1170
+ * 这里按主题类直接给出取值,两个方向都锁死。
1171
+ * ------------------------------------------------------------------ */
1172
+ body.vscode-light {
1173
+ color: var(--db-dark-color);
1174
+ --bs-body-bg: var(--db-light-color);
1175
+ --bs-body-color: var(--db-dark-color);
1176
+ --bs-secondary-bg: var(--db-bg-soft);
1177
+ --bs-secondary-color: var(--db-text-muted);
1178
+ --bs-tertiary-bg: var(--db-bg-soft2);
1179
+ --bs-tertiary-color: var(--db-text-muted);
1180
+ --bs-emphasis-color: var(--db-black);
1181
+ --bs-border-color: var(--db-border);
1182
+ --bs-heading-color: var(--db-dark-color);
1183
+ }
1184
+
1185
+ body.vscode-dark,
1186
+ body.vscode-high-contrast {
1187
+ color: var(--db-dark-color);
1188
+ --bs-body-bg: var(--db-light-color);
1189
+ --bs-body-color: var(--db-dark-color);
1190
+ --bs-secondary-bg: var(--db-bg-soft);
1191
+ --bs-secondary-color: var(--db-text-muted);
1192
+ --bs-tertiary-bg: var(--db-bg-soft2);
1193
+ --bs-tertiary-color: var(--db-text-muted);
1194
+ --bs-emphasis-color: var(--db-black);
1195
+ --bs-border-color: var(--db-border);
1196
+ --bs-heading-color: var(--db-dark-color);
1197
+ }
1198
+
1199
+ /* 标题与表格文本兜底:Bootstrap 的 heading / table 走 --bs-*-color,
1200
+ 上面已覆盖变量,这里再兜一层避免个别版本变量缺失 */
1201
+ body.vscode-dark h1,
1202
+ body.vscode-dark h2,
1203
+ body.vscode-dark h3,
1204
+ body.vscode-dark h4,
1205
+ body.vscode-dark h5,
1206
+ body.vscode-dark h6,
1207
+ body.vscode-high-contrast h1,
1208
+ body.vscode-high-contrast h2,
1209
+ body.vscode-high-contrast h3,
1210
+ body.vscode-high-contrast h4,
1211
+ body.vscode-high-contrast h5,
1212
+ body.vscode-high-contrast h6,
1213
+ body.vscode-dark .table,
1214
+ body.vscode-high-contrast .table,
1215
+ body.vscode-dark .table-name,
1216
+ body.vscode-high-contrast .table-name {
1217
+ color: var(--db-dark-color);
1218
+ }
1219
+
1220
+ /* =================================================================
1221
+ * 桌面端(Electron / Web)「编辑器深色」主题
1222
+ *
1223
+ * 对齐 VSCode 插件面板的观感:深色面板、1px 细边框、无渐变、无浮起阴影,
1224
+ * 中性色阶只留三层(内容面 / 面板面 / 悬停面),品牌色只用于图标与选中态,
1225
+ * 同时把按钮、表单、表格、工具栏的尺寸整体收缩一档。
1226
+ *
1227
+ * 选择器刻意写成一串 :not():特异性 (0,4,1) 高于上方
1228
+ * prefers-color-scheme: dark 的 (0,3,1),保证系统切浅色时不会回落到浅色令牌。
1229
+ * 仅作用于 body.platform-desktop,不影响 VSCode webview(走 theme.ts + 宿主主题)。
1230
+ * ================================================================= */
1231
+ body.platform-desktop:not(.vscode-dark):not(.vscode-light):not(.vscode-high-contrast) {
1232
+ color-scheme: dark;
1233
+
1234
+ /* 中性色阶(VSCode Dark Modern 的面板层次) */
1235
+ --db-surface: #1f1f1f;
1236
+ --db-light-color: #1f1f1f;
1237
+ --db-gray-light: #181818;
1238
+ --db-gray-medium: #2f2f2f;
1239
+ --db-gray-dark: #9d9d9d;
1240
+ --db-darker-color: #b8b8b8;
1241
+ --db-dark-color: #e6e6e6;
1242
+ --db-black: #ffffff;
1243
+
1244
+ /* 背景一律压平 */
1245
+ --db-bg-gradient: #1f1f1f;
1246
+ --db-card-gradient: #202020;
1247
+
1248
+ /* 边框 */
1249
+ --db-border: #2f2f2f;
1250
+ --db-border-gray: #2f2f2f;
1251
+ --db-border-light: #3c3c3c;
1252
+ --db-border-lighter: #333333;
1253
+ --db-border-soft: #2a2d2e;
1254
+
1255
+ /* 面 */
1256
+ --db-bg-soft: #252526;
1257
+ --db-bg-soft2: #202020;
1258
+ --db-bg-soft3: #1f1f1f;
1259
+ --db-bg-soft4: #1a1a1a;
1260
+ --db-bg-soft5: #1a1a1a;
1261
+
1262
+ /* 文本 */
1263
+ --db-text-body: #cccccc;
1264
+ --db-text-muted: #9d9d9d;
1265
+ --db-text-faint: #6e6e6e;
1266
+
1267
+ /* 语义底色 */
1268
+ --db-danger-bg: rgba(239, 68, 68, 0.16);
1269
+ --db-success-bg: rgba(16, 185, 129, 0.16);
1270
+ --db-warning-bg: rgba(245, 158, 11, 0.16);
1271
+ --db-info-bg: rgba(59, 130, 246, 0.18);
1272
+ --db-primary-bg: rgba(102, 126, 234, 0.2);
1273
+
1274
+ --db-code-bg: #1b1f27;
1275
+ --db-code-fg: #abb2bf;
1276
+
1277
+ /* 深色下投影几乎不可见,层级改由边框与面色表达 */
1278
+ --db-shadow-sm: none;
1279
+ --db-shadow-md: none;
1280
+ --db-shadow-lg: none;
1281
+ --db-shadow-xl: 0 8px 24px rgba(0, 0, 0, 0.5);
1282
+ --db-shadow-2xl: 0 16px 40px rgba(0, 0, 0, 0.6);
1283
+
1284
+ /* 圆角收紧:编辑器面板不用大圆角 */
1285
+ --db-radius-sm: 4px;
1286
+ --db-radius-md: 6px;
1287
+ --db-radius-lg: 8px;
1288
+ --db-radius-xl: 10px;
1289
+ --db-radius-2xl: 12px;
1290
+
1291
+ /* 间距整体收缩一档(全局 .card / .modal / .table 等共用这套令牌) */
1292
+ --db-spacing-xs: 0.375rem;
1293
+ --db-spacing-sm: 0.5rem;
1294
+ --db-spacing-md: 0.75rem;
1295
+ --db-spacing-lg: 1rem;
1296
+ --db-spacing-xl: 1.25rem;
1297
+ --db-spacing-2xl: 2rem;
1298
+
1299
+ /* Bootstrap 令牌桥接:下拉 / 弹窗 / 分页等组件一并转入深色 */
1300
+ --bs-body-bg: var(--db-surface);
1301
+ --bs-body-color: var(--db-text-body);
1302
+ --bs-secondary-bg: var(--db-bg-soft);
1303
+ --bs-secondary-color: var(--db-text-muted);
1304
+ --bs-tertiary-bg: var(--db-bg-soft2);
1305
+ --bs-tertiary-color: var(--db-text-muted);
1306
+ --bs-emphasis-color: var(--db-black);
1307
+ --bs-border-color: var(--db-border);
1308
+ --bs-heading-color: var(--db-dark-color);
1309
+ }
1310
+
1311
+ /* ---------------- 滚动条 / 选中 / 代码块 ---------------- */
1312
+ body.platform-desktop ::-webkit-scrollbar { width: 10px; height: 10px; }
1313
+ body.platform-desktop ::-webkit-scrollbar-track { background: transparent; border-radius: 0; }
1314
+ body.platform-desktop ::-webkit-scrollbar-thumb {
1315
+ background-color: #424242;
1316
+ background-clip: content-box;
1317
+ border: 2px solid transparent;
1318
+ border-radius: 5px;
1319
+ }
1320
+ body.platform-desktop ::-webkit-scrollbar-thumb:hover { background-color: #4f4f4f; background-clip: content-box; }
1321
+ body.platform-desktop ::selection { background: rgba(102, 126, 234, 0.35); color: #ffffff; }
1322
+ body.platform-desktop code { background-color: var(--db-bg-soft); color: #ce9178; padding: 0.1rem 0.3rem; }
1323
+ body.platform-desktop pre {
1324
+ background-color: var(--db-code-bg);
1325
+ border: 1px solid var(--db-border);
1326
+ color: var(--db-code-fg);
1327
+ padding: 0.625rem;
1328
+ font-size: 12px;
1329
+ }
1330
+
1331
+ /* ---------------- 基础组件密度 ---------------- */
1332
+ body.platform-desktop .btn {
1333
+ padding: 0.25rem 0.6rem;
1334
+ font-size: 12px;
1335
+ line-height: 1.4;
1336
+ font-weight: 500;
1337
+ border-radius: 4px;
1338
+ box-shadow: none;
1339
+ }
1340
+ body.platform-desktop .btn-sm { padding: 0.2rem 0.5rem; font-size: 12px; border-radius: 4px; }
1341
+ body.platform-desktop .btn-group-sm > .btn { padding: 0.15rem 0.4rem; font-size: 12px; }
1342
+ /* 树 / 列表里的纯图标按钮:不能在 .btn 密度下被撑开 */
1343
+ body.platform-desktop .btn-icon {
1344
+ padding: 0;
1345
+ width: 18px;
1346
+ height: 18px;
1347
+ display: inline-flex;
1348
+ align-items: center;
1349
+ justify-content: center;
1350
+ border: none;
1351
+ background: transparent;
1352
+ border-radius: 4px;
1353
+ }
1354
+
1355
+ body.platform-desktop .form-control,
1356
+ body.platform-desktop .form-select {
1357
+ padding: 0.3rem 0.5rem;
1358
+ font-size: 12px;
1359
+ border: 1px solid var(--db-border-light);
1360
+ border-radius: 4px;
1361
+ background-color: var(--db-bg-soft);
1362
+ color: var(--db-text-body);
1363
+ }
1364
+ body.platform-desktop .form-control:focus,
1365
+ body.platform-desktop .form-select:focus {
1366
+ border-color: var(--db-primary-color);
1367
+ box-shadow: 0 0 0 2px rgba(102, 126, 234, 0.25);
1368
+ transform: none;
1369
+ }
1370
+ body.platform-desktop .form-control-sm,
1371
+ body.platform-desktop .form-select-sm { padding: 0.15rem 0.4rem; font-size: 12px; }
1372
+ body.platform-desktop .form-select-sm { padding-right: 1.4rem; }
1373
+ body.platform-desktop .form-label { margin-bottom: 0.25rem; font-size: 12px; font-weight: 600; color: var(--db-text-muted); }
1374
+ body.platform-desktop .form-text { font-size: 11px; color: var(--db-text-muted); }
1375
+ body.platform-desktop .form-check-input { width: 14px; height: 14px; margin-top: 0.2rem; border-width: 1px; border-radius: 3px; }
1376
+ body.platform-desktop .form-check-label { margin-left: 0.375rem; font-size: 12px; }
1377
+
1378
+ body.platform-desktop .table {
1379
+ border-radius: 0;
1380
+ box-shadow: none;
1381
+ --bs-table-bg: transparent;
1382
+ --bs-table-color: var(--db-text-body);
1383
+ --bs-table-border-color: var(--db-border);
1384
+ --bs-table-striped-bg: var(--db-bg-soft2);
1385
+ --bs-table-striped-color: var(--db-text-body);
1386
+ --bs-table-hover-bg: var(--db-bg-soft);
1387
+ --bs-table-hover-color: var(--db-black);
1388
+ }
1389
+ body.platform-desktop .table th {
1390
+ padding: 0.375rem 0.625rem;
1391
+ background-color: var(--db-bg-soft);
1392
+ border-color: var(--db-border);
1393
+ color: var(--db-text-muted);
1394
+ font-size: 11px;
1395
+ font-weight: 600;
1396
+ letter-spacing: 0.04em;
1397
+ text-transform: uppercase;
1398
+ }
1399
+ body.platform-desktop .table td { padding: 0.3rem 0.625rem; border-color: var(--db-border); font-size: 12px; }
1400
+ body.platform-desktop .table-dark { --bs-table-bg: var(--db-bg-soft); --bs-table-color: var(--db-text-muted); }
1401
+ body.platform-desktop .table-striped tbody tr:nth-of-type(odd) { background-color: transparent; }
1402
+ body.platform-desktop .table-hover tbody tr:hover { background-color: var(--db-bg-soft); transform: none; }
1403
+ body.platform-desktop .table-responsive { border-radius: 0; box-shadow: none; }
1404
+
1405
+ body.platform-desktop .dropdown-menu {
1406
+ padding: 0.25rem;
1407
+ background-color: var(--db-bg-soft);
1408
+ border: 1px solid var(--db-border-light);
1409
+ border-radius: 6px;
1410
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.5);
1411
+ font-size: 12px;
1412
+ }
1413
+ body.platform-desktop .dropdown-item { padding: 0.3rem 0.5rem; border-radius: 4px; font-size: 12px; color: var(--db-text-body); }
1414
+ body.platform-desktop .dropdown-item:hover,
1415
+ body.platform-desktop .dropdown-item:focus { background-color: var(--db-primary-bg); color: var(--db-dark-color); transform: none; }
1416
+ body.platform-desktop .dropdown-divider { margin: 0.25rem 0; border-color: var(--db-border); }
1417
+ body.platform-desktop .dropdown-header { padding: 0.25rem 0.5rem; font-size: 11px; color: var(--db-text-faint); }
1418
+
1419
+ body.platform-desktop .modal-content {
1420
+ background-color: var(--db-bg-soft2);
1421
+ border: 1px solid var(--db-border-light);
1422
+ border-radius: 8px;
1423
+ box-shadow: var(--db-shadow-2xl);
1424
+ }
1425
+ body.platform-desktop .modal-header {
1426
+ padding: 0.625rem 0.875rem;
1427
+ background-color: var(--db-bg-soft);
1428
+ border-bottom: 1px solid var(--db-border);
1429
+ }
1430
+ body.platform-desktop .modal-header::before { height: 0; }
1431
+ body.platform-desktop .modal-title { font-size: 14px; font-weight: 600; color: var(--db-dark-color); }
1432
+ body.platform-desktop .modal-body { padding: 0.875rem; max-height: 72vh; color: var(--db-text-body); }
1433
+ body.platform-desktop .modal-footer {
1434
+ padding: 0.625rem 0.875rem;
1435
+ background-color: var(--db-bg-soft);
1436
+ border-top: 1px solid var(--db-border);
1437
+ }
1438
+ body.platform-desktop .btn-close {
1439
+ width: 22px;
1440
+ height: 22px;
1441
+ padding: 0;
1442
+ background-color: transparent;
1443
+ background-image: var(--bs-btn-close-bg);
1444
+ background-position: center;
1445
+ background-repeat: no-repeat;
1446
+ background-size: 0.8em auto;
1447
+ border-radius: 4px;
1448
+ opacity: 0.7;
1449
+ }
1450
+ body.platform-desktop .btn-close:hover { background-color: var(--db-bg-soft); opacity: 1; transform: none; }
1451
+
1452
+ body.platform-desktop .alert { padding: 0.5rem 0.75rem; border: 1px solid transparent; border-radius: 4px; font-size: 12px; }
1453
+ body.platform-desktop .alert-success { background-color: var(--db-success-bg); border-color: rgba(16, 185, 129, 0.35); color: #4ade80; }
1454
+ body.platform-desktop .alert-danger { background-color: var(--db-danger-bg); border-color: rgba(239, 68, 68, 0.35); color: #f87171; }
1455
+ body.platform-desktop .alert-warning { background-color: var(--db-warning-bg); border-color: rgba(245, 158, 11, 0.35); color: #fbbf24; }
1456
+ body.platform-desktop .alert-info { background-color: var(--db-info-bg); border-color: rgba(59, 130, 246, 0.35); color: #60a5fa; }
1457
+
1458
+ body.platform-desktop .card { background-color: var(--db-bg-soft2); border: 1px solid var(--db-border); box-shadow: none; }
1459
+ body.platform-desktop .card:hover { transform: none; box-shadow: none; border-color: var(--db-border-light); }
1460
+ body.platform-desktop .card-header { background-color: var(--db-bg-soft); border-bottom: 1px solid var(--db-border); }
1461
+ body.platform-desktop .card-header::before { display: none; }
1462
+ body.platform-desktop .card-footer { background-color: var(--db-bg-soft); border-top: 1px solid var(--db-border); }
1463
+
1464
+ body.platform-desktop .loading-overlay { background-color: rgba(31, 31, 31, 0.75); }
1465
+ body.platform-desktop .loading-spinner { border-color: var(--db-bg-soft); border-top-color: var(--db-primary-color); }
1466
+ body.platform-desktop .bg-glass { background-color: rgba(31, 31, 31, 0.85); border-color: var(--db-border); }
1467
+ body.platform-desktop .list-group-item { background-color: transparent; color: var(--db-text-body); }
1468
+ body.platform-desktop .list-group-item:hover { background-color: var(--db-bg-soft); transform: none; }
1469
+ body.platform-desktop .page-link {
1470
+ padding: 0.2rem 0.5rem;
1471
+ background-color: transparent;
1472
+ border-color: var(--db-border);
1473
+ color: var(--db-text-body);
1474
+ font-size: 12px;
1475
+ }
1476
+ body.platform-desktop .page-link:hover { background-color: var(--db-bg-soft); border-color: var(--db-border-light); color: var(--db-dark-color); }
1477
+ body.platform-desktop .page-item.active .page-link { background-color: var(--db-primary-color); border-color: var(--db-primary-color); color: var(--db-on-accent); }
1478
+
1479
+ /* ---------------- 布局紧凑化 ---------------- */
1480
+ /* 连接详情:信息条与快捷操作紧凑化 */
1481
+ body.platform-desktop .connection-detail { gap: 10px !important; padding: 10px !important; }
1482
+ body.platform-desktop .connection-header { margin-bottom: 0 !important; padding: 8px 12px !important; }
1483
+ body.platform-desktop .connection-info { gap: 10px !important; }
1484
+ body.platform-desktop .quick-actions { margin-bottom: 0 !important; padding: 10px 12px !important; }
1485
+ body.platform-desktop .actions-grid { gap: 6px !important; }
1486
+ body.platform-desktop .action-btn {
1487
+ flex-direction: row !important;
1488
+ justify-content: flex-start !important;
1489
+ gap: 8px !important;
1490
+ padding: 6px 10px !important;
1491
+ }
1492
+ body.platform-desktop .action-icon { font-size: 14px !important; }
1493
+
1494
+ /* 表详情页:信息条 / 工具栏 / 页签整体收紧 */
1495
+ body.platform-desktop .table-header { padding: 8px 12px !important; }
1496
+ body.platform-desktop .table-icon { font-size: 20px !important; }
1497
+ body.platform-desktop .table-name { font-size: 0.9375rem !important; }
1498
+ body.platform-desktop .table-breadcrumb { font-size: 0.75rem !important; }
1499
+ body.platform-desktop .table-stats { gap: 14px !important; }
1500
+ body.platform-desktop .table-toolbar { padding: 6px 12px !important; gap: 6px !important; flex-wrap: wrap !important; }
1501
+ body.platform-desktop .toolbar-left,
1502
+ body.platform-desktop .toolbar-right { gap: 6px !important; flex-wrap: wrap !important; }
1503
+ body.platform-desktop .table-toolbar .btn,
1504
+ body.platform-desktop .data-toolbar .btn {
1505
+ padding: 3px 8px !important;
1506
+ font-size: 12px !important;
1507
+ line-height: 1.4 !important;
1508
+ border-radius: 4px !important;
1509
+ }
1510
+ body.platform-desktop .table-toolbar .btn i,
1511
+ body.platform-desktop .data-toolbar .btn i { font-size: 12px !important; }
1512
+ body.platform-desktop .table-toolbar .dropdown-menu { font-size: 12px !important; }
1513
+ body.platform-desktop .table-toolbar .dropdown-item { padding: 4px 10px !important; font-size: 12px !important; }
1514
+ body.platform-desktop .nav-tabs { padding: 0 0.5rem !important; }
1515
+ body.platform-desktop .nav-tabs .nav-link { padding: 6px 12px !important; font-size: 12px !important; }
1516
+ body.platform-desktop .nav-tabs .nav-link .badge { font-size: 10px !important; padding: 2px 5px !important; }
1517
+ body.platform-desktop .tab-content { padding: 10px 12px !important; }
1518
+
1519
+ /* SQL 编辑器工具栏(桌面端独立存在) */
1520
+ body.platform-desktop .sql-toolbar,
1521
+ body.platform-desktop .editor-toolbar { padding: 6px 10px !important; gap: 6px !important; flex-wrap: wrap !important; }
1522
+ body.platform-desktop .sql-toolbar .btn,
1523
+ body.platform-desktop .editor-toolbar .btn {
1524
+ padding: 3px 8px !important;
1525
+ font-size: 12px !important;
1526
+ line-height: 1.4 !important;
1527
+ border-radius: 4px !important;
1528
+ }
1529
+
1530
+ /* ---------------- 配色降噪 ---------------- */
1531
+ body.platform-desktop .btn-primary,
1532
+ body.platform-desktop .btn-info,
1533
+ body.platform-desktop .btn-success,
1534
+ body.platform-desktop .btn-secondary {
1535
+ background-color: var(--db-bg-soft) !important;
1536
+ border-color: var(--db-border-light) !important;
1537
+ color: var(--db-text-body) !important;
1538
+ }
1539
+ body.platform-desktop .btn-primary:hover,
1540
+ body.platform-desktop .btn-info:hover,
1541
+ body.platform-desktop .btn-success:hover,
1542
+ body.platform-desktop .btn-secondary:hover,
1543
+ body.platform-desktop .btn-primary:focus,
1544
+ body.platform-desktop .btn-info:focus,
1545
+ body.platform-desktop .btn-success:focus,
1546
+ body.platform-desktop .btn-secondary:focus {
1547
+ background-color: var(--db-border-soft) !important;
1548
+ border-color: var(--db-border-light) !important;
1549
+ color: var(--db-text-body) !important;
1550
+ }
1551
+ /* 破坏性 / 警告操作保留语义色,但降饱和 */
1552
+ body.platform-desktop .btn-danger,
1553
+ body.platform-desktop .btn-outline-danger {
1554
+ background-color: transparent !important;
1555
+ border-color: rgba(239, 68, 68, 0.55) !important;
1556
+ color: #ef4444 !important;
1557
+ }
1558
+ body.platform-desktop .btn-warning,
1559
+ body.platform-desktop .btn-outline-warning {
1560
+ background-color: transparent !important;
1561
+ border-color: rgba(245, 158, 11, 0.5) !important;
1562
+ color: #f59e0b !important;
1563
+ }
1564
+ /* 工具栏里的主操作保留一点主题色,避免整条工具栏全是灰button */
1565
+ body.platform-desktop .tables-actions .btn-primary,
1566
+ body.platform-desktop .views-actions .btn-success,
1567
+ body.platform-desktop .procedures-actions .btn-info {
1568
+ background-color: var(--db-primary-bg) !important;
1569
+ border-color: var(--db-primary-color) !important;
1570
+ color: var(--db-primary-color) !important;
1571
+ }
1572
+ body.platform-desktop .tables-actions .btn-primary:hover,
1573
+ body.platform-desktop .views-actions .btn-success:hover,
1574
+ body.platform-desktop .procedures-actions .btn-info:hover {
1575
+ background-color: rgba(102, 126, 234, 0.3) !important;
1576
+ color: var(--db-primary-light) !important;
1577
+ border-color: var(--db-primary-light) !important;
1578
+ }
1579
+ /* 徽章统一中性 */
1580
+ body.platform-desktop .badge {
1581
+ background-color: var(--db-bg-soft) !important;
1582
+ color: var(--db-text-muted) !important;
1583
+ font-weight: 500 !important;
1584
+ padding: 0.1rem 0.4rem;
1585
+ font-size: 10px;
1586
+ border-radius: 999px;
1587
+ text-transform: none;
1588
+ letter-spacing: 0;
1589
+ box-shadow: none;
1590
+ }
1591
+ /* 数据库卡片的大块品牌渐变改为中性面,品牌色只保留 logo 小方块 */
1592
+ body.platform-desktop .db-mysql-bg,
1593
+ body.platform-desktop .db-postgres-bg,
1594
+ body.platform-desktop .db-sqlite-bg,
1595
+ body.platform-desktop .db-mssql-bg,
1596
+ body.platform-desktop .db-oracle-bg,
1597
+ body.platform-desktop .db-default-bg {
1598
+ background: var(--db-bg-soft) !important;
1599
+ color: var(--db-text-body) !important;
1600
+ border: 1px solid var(--db-border) !important;
1601
+ }
1602
+ /* 进度指示器收敛为主题色 */
1603
+ body.platform-desktop .spinner-border.text-primary,
1604
+ body.platform-desktop .text-primary.spinner-border {
1605
+ color: var(--db-text-muted) !important;
1606
+ }
1607
+
1010
1608
  /* 覆盖Bootstrap默认样式 */
1011
1609
  .toast-container[data-v-7d639c44] {
1012
1610
  z-index: 1100;
@@ -1036,39 +1634,39 @@ pre {
1036
1634
  text-align: center;
1037
1635
  }
1038
1636
 
1039
- .modal-dialog[data-v-323d35a9] {
1637
+ .modal-dialog[data-v-aa6b0e1f] {
1040
1638
  z-index: var(--bs-modal-zindex);
1041
1639
  max-width:none !important;
1042
1640
  }
1043
- .modal-success .modal-header[data-v-323d35a9] {
1641
+ .modal-success .modal-header[data-v-aa6b0e1f] {
1044
1642
  background-color: var(--bs-success);
1045
1643
  color: white;
1046
1644
  }
1047
- .modal-error .modal-header[data-v-323d35a9] {
1645
+ .modal-error .modal-header[data-v-aa6b0e1f] {
1048
1646
  background-color: var(--bs-danger);
1049
1647
  color: white;
1050
1648
  }
1051
- .modal-warning .modal-header[data-v-323d35a9] {
1649
+ .modal-warning .modal-header[data-v-aa6b0e1f] {
1052
1650
  background-color: var(--bs-warning);
1053
1651
  color: var(--bs-dark);
1054
1652
  }
1055
- .modal-info .modal-header[data-v-323d35a9] {
1653
+ .modal-info .modal-header[data-v-aa6b0e1f] {
1056
1654
  background-color: var(--bs-info);
1057
1655
  color: white;
1058
1656
  }
1059
- .modal-body[data-v-323d35a9] {
1657
+ .modal-body[data-v-aa6b0e1f] {
1060
1658
  min-height: 80px;
1061
1659
  display: flex;
1062
1660
  flex-direction: column;
1063
1661
  align-items: stretch;
1064
1662
  }
1065
- .error-details[data-v-323d35a9] {
1663
+ .error-details[data-v-aa6b0e1f] {
1066
1664
  width: 100%;
1067
1665
  margin-top: 1rem;
1068
1666
  }
1069
- .error-content[data-v-323d35a9] {
1070
- background-color: #f8f9fa;
1071
- border: 1px solid #cbd5e1;
1667
+ .error-content[data-v-aa6b0e1f] {
1668
+ background-color: var(--db-bg-soft2);
1669
+ border: 1px solid var(--db-gray-medium);
1072
1670
  border-radius: 0.375rem;
1073
1671
  padding: 1rem;
1074
1672
  margin: 0;
@@ -1080,19 +1678,19 @@ pre {
1080
1678
  font-size: 0.875rem;
1081
1679
  line-height: 1.5;
1082
1680
  }
1083
- .error-details-toggle[data-v-323d35a9] {
1681
+ .error-details-toggle[data-v-aa6b0e1f] {
1084
1682
  width: 100%;
1085
1683
  }
1086
- .error-details-content[data-v-323d35a9] {
1087
- background-color: #f8f9fa;
1088
- border: 1px solid #cbd5e1;
1684
+ .error-details-content[data-v-aa6b0e1f] {
1685
+ background-color: var(--db-bg-soft2);
1686
+ border: 1px solid var(--db-gray-medium);
1089
1687
  border-radius: 0.375rem;
1090
1688
  padding: 1rem;
1091
1689
  margin-top: 0.5rem;
1092
1690
  }
1093
- .error-json[data-v-323d35a9] {
1094
- background-color: #212529;
1095
- color: #f8f9fa;
1691
+ .error-json[data-v-aa6b0e1f] {
1692
+ background-color: var(--db-text-body);
1693
+ color: var(--db-bg-soft2);
1096
1694
  border-radius: 0.25rem;
1097
1695
  padding: 0.75rem;
1098
1696
  font-size: 0.8rem;
@@ -1102,56 +1700,57 @@ pre {
1102
1700
  white-space: pre-wrap;
1103
1701
  word-break: break-word;
1104
1702
  }
1105
- .error-meta[data-v-323d35a9] {
1106
- border-bottom: 1px solid #cbd5e1;
1703
+ .error-meta[data-v-aa6b0e1f] {
1704
+ border-bottom: 1px solid var(--db-gray-medium);
1107
1705
  padding-bottom: 0.5rem;
1108
1706
  margin-bottom: 0.5rem;
1109
1707
  }
1110
- .modal-body .fs-1[data-v-323d35a9] {
1708
+ .modal-body .fs-1[data-v-aa6b0e1f] {
1111
1709
  font-size: 2.5rem;
1112
1710
  margin-bottom: 1rem;
1113
1711
  }
1114
1712
 
1115
1713
  /* 响应式调整 */
1116
1714
  @media (max-width: 576px) {
1117
- .error-content[data-v-323d35a9],
1118
- .error-json[data-v-323d35a9] {
1715
+ .error-content[data-v-aa6b0e1f],
1716
+ .error-json[data-v-aa6b0e1f] {
1119
1717
  font-size: 0.75rem;
1120
1718
  max-height: 150px;
1121
1719
  }
1122
1720
  }
1123
1721
 
1124
- .datagrid-container[data-v-f249eac8] {
1722
+ .datagrid-container[data-v-6e7b7e09] {
1125
1723
  display: flex;
1126
1724
  flex-direction: column;
1127
1725
  height: 100%;
1128
1726
  }
1129
- .datagrid-inner[data-v-f249eac8] {
1727
+ .datagrid-inner[data-v-6e7b7e09] {
1130
1728
  flex: 1;
1131
1729
  overflow: auto;
1132
1730
  margin-bottom: 10px;
1133
1731
  }
1134
- .datagrid-th[data-v-f249eac8] {
1732
+ .datagrid-th[data-v-6e7b7e09] {
1135
1733
  min-width: 80px;
1136
1734
  white-space: nowrap;
1137
1735
  position: sticky;
1138
1736
  top: 0;
1139
1737
  z-index: 10;
1140
- background-color: #f8f9fa;
1738
+ /* sticky 表头必须有不透明背景,令牌在暗色下自动切换 */
1739
+ background-color: var(--db-bg-soft2, #f8f9fa);
1141
1740
  }
1142
- .datagrid-th.sortable[data-v-f249eac8] {
1741
+ .datagrid-th.sortable[data-v-6e7b7e09] {
1143
1742
  cursor: pointer;
1144
1743
  user-select: none;
1145
1744
  }
1146
- .datagrid-th.sortable[data-v-f249eac8]:hover {
1147
- background-color: #e9ecef;
1745
+ .datagrid-th.sortable[data-v-6e7b7e09]:hover {
1746
+ background-color: var(--db-border-soft, #e9ecef);
1148
1747
  }
1149
- .header-content[data-v-f249eac8] {
1748
+ .header-content[data-v-6e7b7e09] {
1150
1749
  display: flex;
1151
1750
  align-items: center;
1152
1751
  gap: 0.5rem;
1153
1752
  }
1154
- .sort-icon[data-v-f249eac8] {
1753
+ .sort-icon[data-v-6e7b7e09] {
1155
1754
  display: flex;
1156
1755
  align-items: center;
1157
1756
  font-size: 0.75rem;