fdb2 1.0.35 → 1.0.37

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.
Files changed (41) hide show
  1. package/README.md +20 -1
  2. package/dist/public/explorer.css +1338 -1122
  3. package/dist/public/explorer.js +990 -665
  4. package/dist/public/index.css +797 -120
  5. package/dist/public/index.js +282 -26
  6. package/dist/public/layout.css +201 -202
  7. package/dist/public/layout.js +14 -14
  8. package/dist/server/index.d.ts.map +1 -1
  9. package/dist/server/index.js.map +1 -1
  10. package/dist/server/index.ts +0 -1
  11. package/dist/server/service/database/clickhouse-connection.d.ts.map +1 -1
  12. package/dist/server/service/database/clickhouse-connection.js +3 -3
  13. package/dist/server/service/database/clickhouse-connection.js.map +1 -1
  14. package/dist/server/service/database/clickhouse-connection.ts +3 -3
  15. package/dist/server/service/database/mssql.service.d.ts.map +1 -1
  16. package/dist/server/service/database/mssql.service.js +14 -45
  17. package/dist/server/service/database/mssql.service.js.map +1 -1
  18. package/dist/server/service/database/mssql.service.ts +21 -49
  19. package/dist/server/service/database/mysql.service.d.ts.map +1 -1
  20. package/dist/server/service/database/mysql.service.js +34 -52
  21. package/dist/server/service/database/mysql.service.js.map +1 -1
  22. package/dist/server/service/database/mysql.service.ts +50 -55
  23. package/dist/server/service/database/oracle.service.d.ts.map +1 -1
  24. package/dist/server/service/database/oracle.service.js +16 -53
  25. package/dist/server/service/database/oracle.service.js.map +1 -1
  26. package/dist/server/service/database/oracle.service.ts +23 -56
  27. package/dist/server/service/database/postgres.service.d.ts.map +1 -1
  28. package/dist/server/service/database/postgres.service.js +15 -53
  29. package/dist/server/service/database/postgres.service.js.map +1 -1
  30. package/dist/server/service/database/postgres.service.ts +22 -57
  31. package/dist/server/service/database/sql-type.helper.d.ts +28 -0
  32. package/dist/server/service/database/sql-type.helper.d.ts.map +1 -0
  33. package/dist/server/service/database/sql-type.helper.js +151 -0
  34. package/dist/server/service/database/sql-type.helper.js.map +1 -0
  35. package/dist/server/service/database/sql-type.helper.ts +157 -0
  36. package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
  37. package/dist/server/service/database/sqlite.service.js +58 -67
  38. package/dist/server/service/database/sqlite.service.js.map +1 -1
  39. package/dist/server/service/database/sqlite.service.ts +72 -72
  40. package/package.json +6 -2
  41. package/public/fdb2.png +0 -0
@@ -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,43 @@ 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;
139
+
140
+ /* 语义底色上的文字色(浅色主题用深色阶;暗色主题在下方各暗色块覆写为亮色阶) */
141
+ --db-success-fg: #047857;
142
+ --db-warning-fg: #b45309;
143
+ --db-danger-fg: #b91c1c;
144
+ --db-info-fg: #1d4ed8;
145
+
146
+ /* JSON 语法高亮(浅色:GitHub Light 配色;暗色在各暗色块覆写为 GitHub Dark) */
147
+ --db-json-key: #d04255;
148
+ --db-json-string: #22863a;
149
+ --db-json-number: #005cc5;
150
+ --db-json-boolean: #d73a49;
151
+ --db-json-null: #6f42c1;
115
152
  }
116
153
 
117
154
  /* 全局布局 - 现代桌面应用风格 */
@@ -214,7 +251,7 @@ body {
214
251
 
215
252
  /* 现代表格样式 */
216
253
  .table {
217
- background: white;
254
+ background: var(--db-surface);
218
255
  border-radius: var(--db-radius-lg);
219
256
  overflow: hidden;
220
257
  box-shadow: var(--db-shadow-sm);
@@ -254,52 +291,31 @@ body {
254
291
 
255
292
  /* 现代按钮样式 */
256
293
  .btn {
257
- border-radius: var(--db-radius-md);
294
+ border-radius: var(--db-radius-sm);
258
295
  font-weight: 600;
259
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
296
+ transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
260
297
  border: none;
261
298
  position: relative;
262
- overflow: hidden;
263
299
  letter-spacing: 0.025em;
264
- box-shadow: var(--db-shadow-sm);
265
300
  }
266
301
 
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;
302
+ .btn:hover:not(:disabled) {
303
+ opacity: 0.92;
278
304
  }
279
305
 
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);
306
+ .btn:active:not(:disabled) {
307
+ opacity: 1;
292
308
  }
293
309
 
294
310
  /* 主要按钮 */
295
311
  .btn-primary {
296
312
  background: var(--db-primary-gradient);
297
- color: white;
313
+ color: var(--db-on-accent);
298
314
  }
299
315
 
300
316
  .btn-primary:hover {
301
317
  background: var(--db-primary-dark);
302
- color: white;
318
+ color: var(--db-on-accent);
303
319
  }
304
320
 
305
321
  /* 次要按钮 */
@@ -316,26 +332,26 @@ body {
316
332
 
317
333
  /* 成功按钮 */
318
334
  .btn-success {
319
- background: linear-gradient(135deg, var(--db-accent-color) 0%, #059669 100%);
320
- color: white;
335
+ background: var(--db-accent-color);
336
+ color: var(--db-on-accent);
321
337
  }
322
338
 
323
339
  /* 警告按钮 */
324
340
  .btn-warning {
325
- background: linear-gradient(135deg, var(--db-warning-color) 0%, #d97706 100%);
326
- color: white;
341
+ background: var(--db-warning-color);
342
+ color: var(--db-on-accent);
327
343
  }
328
344
 
329
345
  /* 危险按钮 */
330
346
  .btn-danger {
331
- background: linear-gradient(135deg, var(--db-danger-color) 0%, #dc2626 100%);
332
- color: white;
347
+ background: var(--db-danger-color);
348
+ color: var(--db-on-accent);
333
349
  }
334
350
 
335
351
  /* 信息按钮 */
336
352
  .btn-info {
337
- background: linear-gradient(135deg, var(--db-info-color) 0%, #2563eb 100%);
338
- color: white;
353
+ background: var(--db-info-color);
354
+ color: var(--db-on-accent);
339
355
  }
340
356
 
341
357
  /* 轮廓按钮 */
@@ -347,7 +363,7 @@ body {
347
363
 
348
364
  .btn-outline-primary:hover {
349
365
  background: var(--db-primary-gradient);
350
- color: white;
366
+ color: var(--db-on-accent);
351
367
  border-color: transparent;
352
368
  }
353
369
 
@@ -374,19 +390,19 @@ body {
374
390
  }
375
391
 
376
392
  .badge.bg-success {
377
- background: linear-gradient(135deg, var(--db-accent-color) 0%, #059669 100%) !important;
393
+ background: var(--db-accent-color) !important;
378
394
  }
379
395
 
380
396
  .badge.bg-warning {
381
- background: linear-gradient(135deg, var(--db-warning-color) 0%, #d97706 100%) !important;
397
+ background: var(--db-warning-color) !important;
382
398
  }
383
399
 
384
400
  .badge.bg-danger {
385
- background: linear-gradient(135deg, var(--db-danger-color) 0%, #dc2626 100%) !important;
401
+ background: var(--db-danger-color) !important;
386
402
  }
387
403
 
388
404
  .badge.bg-info {
389
- background: linear-gradient(135deg, var(--db-info-color) 0%, #2563eb 100%) !important;
405
+ background: var(--db-info-color) !important;
390
406
  }
391
407
 
392
408
  /* 现代导航样式 */
@@ -445,7 +461,7 @@ body {
445
461
 
446
462
  .navbar-nav .nav-link.active {
447
463
  background: var(--db-primary-gradient);
448
- color: white;
464
+ color: var(--db-on-accent);
449
465
  font-weight: 700;
450
466
  box-shadow: var(--db-shadow-md);
451
467
  }
@@ -502,7 +518,11 @@ body {
502
518
  }
503
519
 
504
520
  .btn-close {
505
- background: var(--db-gray-light);
521
+ background-color: var(--db-gray-light);
522
+ background-image: var(--bs-btn-close-bg);
523
+ background-position: center;
524
+ background-repeat: no-repeat;
525
+ background-size: 0.8em auto;
506
526
  border: none;
507
527
  border-radius: var(--db-radius-md);
508
528
  width: 32px;
@@ -514,8 +534,7 @@ body {
514
534
  }
515
535
 
516
536
  .btn-close:hover {
517
- background: var(--db-danger-color);
518
- color: white;
537
+ background-color: var(--db-danger-color);
519
538
  transform: rotate(90deg);
520
539
  }
521
540
 
@@ -526,7 +545,7 @@ body {
526
545
  padding: 0.75rem var(--db-spacing-md);
527
546
  font-size: 0.95rem;
528
547
  transition: all 0.3s ease;
529
- background: white;
548
+ background: var(--db-surface);
530
549
  font-weight: 500;
531
550
  }
532
551
 
@@ -543,7 +562,7 @@ body {
543
562
  padding: 0.75rem var(--db-spacing-md);
544
563
  font-size: 0.95rem;
545
564
  transition: all 0.3s ease;
546
- background: white;
565
+ background: var(--db-surface);
547
566
  font-weight: 500;
548
567
  cursor: pointer;
549
568
  }
@@ -557,7 +576,7 @@ body {
557
576
 
558
577
  .form-label {
559
578
  font-weight: 700;
560
- color: #1e293b;
579
+ color: var(--db-dark-color);
561
580
  margin-bottom: var(--db-spacing-sm);
562
581
  font-size: 0.9rem;
563
582
  letter-spacing: 0.025em;
@@ -568,7 +587,7 @@ body {
568
587
 
569
588
  .form-text {
570
589
  font-size: 0.875rem;
571
- color: #334155;
590
+ color: var(--db-darker-color);
572
591
  margin-top: var(--db-spacing-xs);
573
592
  }
574
593
 
@@ -596,7 +615,7 @@ body {
596
615
 
597
616
  /* 代码样式 */
598
617
  code {
599
- background-color: #e2e8f0;
618
+ background-color: var(--db-border);
600
619
  color: #be185d;
601
620
  padding: 0.2rem 0.4rem;
602
621
  border-radius: 3px;
@@ -604,8 +623,8 @@ code {
604
623
  }
605
624
 
606
625
  pre {
607
- background-color: #f1f5f9;
608
- border: 1px solid #cbd5e1;
626
+ background-color: var(--db-gray-light);
627
+ border: 1px solid var(--db-gray-medium);
609
628
  border-radius: 6px;
610
629
  padding: 1rem;
611
630
  margin: 0;
@@ -621,22 +640,22 @@ pre {
621
640
  }
622
641
 
623
642
  .alert-success {
624
- background-color: #dcfce7;
643
+ background-color: var(--db-success-bg);
625
644
  color: #166534;
626
645
  }
627
646
 
628
647
  .alert-danger {
629
- background-color: #fee2e2;
648
+ background-color: var(--db-danger-bg);
630
649
  color: #991b1b;
631
650
  }
632
651
 
633
652
  .alert-warning {
634
- background-color: #fef3c7;
653
+ background-color: var(--db-warning-bg);
635
654
  color: #92400e;
636
655
  }
637
656
 
638
657
  .alert-info {
639
- background-color: #dbeafe;
658
+ background-color: var(--db-info-bg);
640
659
  color: #1e40af;
641
660
  }
642
661
 
@@ -659,7 +678,7 @@ pre {
659
678
  }
660
679
 
661
680
  .dropdown-item:hover {
662
- background-color: #e2e8f0;
681
+ background-color: var(--db-border);
663
682
  transform: translateX(2px);
664
683
  }
665
684
 
@@ -672,14 +691,14 @@ pre {
672
691
  }
673
692
 
674
693
  .list-group-item:hover {
675
- background-color: #e2e8f0;
694
+ background-color: var(--db-border);
676
695
  transform: translateX(4px);
677
696
  }
678
697
 
679
698
  /* 页面头部样式 */
680
699
  .page-header {
681
- background: linear-gradient(135deg, var(--db-primary-color) 0%, #0056b3 100%);
682
- color: white;
700
+ background: var(--db-primary-color);
701
+ color: var(--db-on-accent);
683
702
  padding: 2rem 0;
684
703
  margin-bottom: 2rem;
685
704
  }
@@ -786,17 +805,17 @@ pre {
786
805
  }
787
806
 
788
807
  ::-webkit-scrollbar-track {
789
- background: #f1f1f1;
808
+ background: var(--db-bg-soft);
790
809
  border-radius: 4px;
791
810
  }
792
811
 
793
812
  ::-webkit-scrollbar-thumb {
794
- background: #c1c1c1;
813
+ background: var(--db-border-light);
795
814
  border-radius: 4px;
796
815
  }
797
816
 
798
817
  ::-webkit-scrollbar-thumb:hover {
799
- background: #a8a8a8;
818
+ background: var(--db-border-light);
800
819
  }
801
820
 
802
821
  /* 加载状态 */
@@ -813,7 +832,7 @@ pre {
813
832
  width: 20px;
814
833
  height: 20px;
815
834
  margin: -10px 0 0 -10px;
816
- border: 2px solid #f3f3f3;
835
+ border: 2px solid var(--db-bg-soft);
817
836
  border-top: 2px solid var(--db-primary-color);
818
837
  border-radius: 50%;
819
838
  animation: spin 1s linear infinite;
@@ -833,7 +852,7 @@ pre {
833
852
  }
834
853
 
835
854
  .status-offline {
836
- color: #64748b;
855
+ color: var(--db-text-muted);
837
856
  display: flex;
838
857
  align-items: center;
839
858
  gap: var(--db-spacing-xs);
@@ -857,23 +876,23 @@ pre {
857
876
  /* 数据库类型样式 */
858
877
  .db-icon-mysql {
859
878
  color: #00758f;
860
- background: linear-gradient(135deg, #00758f 0%, #005a70 100%);
879
+ background: #00758f;
861
880
  }
862
881
  .db-icon-postgres {
863
882
  color: #336791;
864
- background: linear-gradient(135deg, #336791 0%, #2a5278 100%);
883
+ background: #336791;
865
884
  }
866
885
  .db-icon-sqlite {
867
886
  color: #003b57;
868
- background: linear-gradient(135deg, #003b57 0%, #002d42 100%);
887
+ background: #003b57;
869
888
  }
870
889
  .db-icon-mssql {
871
890
  color: #cc2927;
872
- background: linear-gradient(135deg, #cc2927 0%, #a62220 100%);
891
+ background: #cc2927;
873
892
  }
874
893
  .db-icon-oracle {
875
894
  color: #f80000;
876
- background: linear-gradient(135deg, #f80000 0%, #d40000 100%);
895
+ background: #f80000;
877
896
  }
878
897
 
879
898
  /* 现代工具类 */
@@ -968,9 +987,13 @@ pre {
968
987
  }
969
988
  }
970
989
 
971
- /* 暗色模式支持 */
990
+ /* 暗色模式支持
991
+ * - 桌面端(Electron/浏览器):跟随 OS,via prefers-color-scheme;
992
+ * 排除 webview(body 带 vscode-* 类),避免 OS 暗色 + 编辑器浅色时错配。
993
+ * - VSCode webview:跟随编辑器主题,由宿主维护的 body.vscode-dark / vscode-high-contrast 类驱动。
994
+ */
972
995
  @media (prefers-color-scheme: dark) {
973
- :root {
996
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) {
974
997
  --db-light-color: #1e293b;
975
998
  --db-gray-light: #334155;
976
999
  --db-gray-medium: #475569;
@@ -978,35 +1001,688 @@ pre {
978
1001
  --db-darker-color: #cbd5e1;
979
1002
  --db-dark-color: #e2e8f0;
980
1003
  --db-black: #f8fafc;
981
-
1004
+
982
1005
  --db-bg-gradient: linear-gradient(135deg, #1e293b 0%, #334155 100%);
983
1006
  --db-card-gradient: linear-gradient(135deg, #334155 0%, #1e293b 100%);
1007
+
1008
+ --db-surface: #1e293b;
1009
+ --db-on-accent: #ffffff;
1010
+ --db-border: #475569;
1011
+ --db-border-gray: #445263;
1012
+ --db-border-light: #4d5b6b;
1013
+ --db-border-lighter: #4d5b6b;
1014
+ --db-border-soft: #3d4a59;
1015
+ --db-bg-soft: #263041;
1016
+ --db-bg-soft2: #263041;
1017
+ --db-bg-soft3: #263041;
1018
+ --db-bg-soft4: #232d3c;
1019
+ --db-bg-soft5: #232d3c;
1020
+ --db-text-body: #cbd5e1;
1021
+ --db-text-muted: #8296ab;
1022
+ --db-text-faint: #64748b;
1023
+ --db-danger-bg: rgba(239, 68, 68, 0.16);
1024
+ --db-success-bg: rgba(16, 185, 129, 0.16);
1025
+ --db-warning-bg: rgba(245, 158, 11, 0.16);
1026
+ --db-info-bg: rgba(59, 130, 246, 0.18);
1027
+ --db-primary-bg: rgba(102, 126, 234, 0.18);
1028
+ --db-code-bg: #1b1f27;
1029
+ --db-code-fg: #abb2bf;
1030
+
1031
+ /* 语义底色上的文字 / JSON 高亮:暗色下统一提亮 */
1032
+ --db-success-fg: #34d399;
1033
+ --db-warning-fg: #fbbf24;
1034
+ --db-danger-fg: #f87171;
1035
+ --db-info-fg: #60a5fa;
1036
+ --db-json-key: #ff7b72;
1037
+ --db-json-string: #a5d6ff;
1038
+ --db-json-number: #79c0ff;
1039
+ --db-json-boolean: #d2a8ff;
1040
+ --db-json-null: #8b949e;
984
1041
  }
985
-
986
- .card {
1042
+
1043
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .card {
987
1044
  border-color: #475569;
988
1045
  }
989
-
990
- .form-control,
991
- .form-select {
1046
+
1047
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .form-control,
1048
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .form-select {
992
1049
  background: #1e293b;
993
1050
  border-color: #475569;
994
1051
  color: #f1f5f9;
995
1052
  }
996
-
997
- .navbar {
1053
+
1054
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .navbar {
998
1055
  background: linear-gradient(135deg, #334155 0%, #1e293b 100%);
999
1056
  }
1000
-
1001
- .table {
1057
+
1058
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .table {
1002
1059
  background: #1e293b;
1003
1060
  }
1004
-
1005
- .table th {
1061
+
1062
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .table th {
1006
1063
  background: #475569;
1007
1064
  color: #f1f5f9;
1008
1065
  }
1066
+
1067
+ /* Bootstrap 浅色工具类在暗色下过于刺眼/对比不足,统一改挂主题令牌
1068
+ (与下方 body.vscode-dark 的同名规则对应,覆盖 OS 暗色入口) */
1069
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .border-light,
1070
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .bg-light {
1071
+ border-color: #475569 !important;
1072
+ background-color: #263041 !important;
1073
+ }
1074
+
1075
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .btn-outline-secondary,
1076
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .btn-outline-light {
1077
+ color: #f1f5f9 !important;
1078
+ border-color: #4d5b6b !important;
1079
+ }
1080
+
1081
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .btn-outline-secondary:hover,
1082
+ body:not(.vscode-light):not(.vscode-dark):not(.vscode-high-contrast) .btn-outline-light:hover {
1083
+ background-color: #263041 !important;
1084
+ color: #f1f5f9 !important;
1085
+ }
1009
1086
  }
1087
+
1088
+ /* VSCode webview:编辑器暗色 / 高对比主题(变量与上面的 OS 暗色保持一致) */
1089
+ body.vscode-dark,
1090
+ body.vscode-high-contrast {
1091
+ --db-light-color: var(--vscode-editor-background, #1e293b);
1092
+ --db-gray-light: var(--vscode-sideBar-background, #334155);
1093
+ --db-gray-medium: var(--vscode-panel-border, #475569);
1094
+ --db-gray-dark: var(--vscode-descriptionForeground, #94a3b8);
1095
+ --db-darker-color: var(--vscode-editor-foreground, #cbd5e1);
1096
+ --db-dark-color: var(--vscode-foreground, #e2e8f0);
1097
+ --db-black: var(--vscode-editor-foreground, #f8fafc);
1098
+
1099
+ --db-bg-gradient: linear-gradient(135deg, var(--vscode-editor-background, #1e293b) 0%, var(--vscode-sideBar-background, #334155) 100%);
1100
+ --db-card-gradient: linear-gradient(135deg, var(--vscode-sideBar-background, #334155) 0%, var(--vscode-editor-background, #1e293b) 100%);
1101
+
1102
+ --db-surface: var(--vscode-editorWidget-background, #1e293b);
1103
+ --db-on-accent: var(--vscode-button-foreground, #ffffff);
1104
+ --db-border: var(--vscode-panel-border, #475569);
1105
+ --db-border-gray: var(--vscode-editorWidget-border, var(--vscode-panel-border, #445263));
1106
+ --db-border-light: var(--vscode-input-border, #4d5b6b);
1107
+ --db-border-lighter: var(--vscode-input-border, #4d5b6b);
1108
+ --db-border-soft: var(--vscode-list-hoverBackground, #3d4a59);
1109
+ --db-bg-soft: var(--vscode-editorWidget-background, #263041);
1110
+ --db-bg-soft2: var(--vscode-sideBar-background, #263041);
1111
+ --db-bg-soft3: var(--vscode-editorWidget-background, #263041);
1112
+ --db-bg-soft4: var(--vscode-editor-background, #232d3c);
1113
+ --db-bg-soft5: var(--vscode-editor-background, #232d3c);
1114
+ --db-text-body: var(--vscode-editor-foreground, #cbd5e1);
1115
+ --db-text-muted: var(--vscode-descriptionForeground, #8296ab);
1116
+ --db-text-faint: var(--vscode-disabledForeground, #64748b);
1117
+ --db-danger-bg: rgba(239, 68, 68, 0.16);
1118
+ --db-success-bg: rgba(16, 185, 129, 0.16);
1119
+ --db-warning-bg: rgba(245, 158, 11, 0.16);
1120
+ --db-info-bg: rgba(59, 130, 246, 0.18);
1121
+ --db-primary-bg: rgba(102, 126, 234, 0.18);
1122
+ --db-code-bg: var(--vscode-textCodeBlock-background, #1b1f27);
1123
+ --db-code-fg: var(--vscode-editor-foreground, #abb2bf);
1124
+
1125
+ /* 语义底色上的文字 / JSON 高亮:暗色下统一提亮 */
1126
+ --db-success-fg: #34d399;
1127
+ --db-warning-fg: #fbbf24;
1128
+ --db-danger-fg: #f87171;
1129
+ --db-info-fg: #60a5fa;
1130
+ --db-json-key: #ff7b72;
1131
+ --db-json-string: #a5d6ff;
1132
+ --db-json-number: #79c0ff;
1133
+ --db-json-boolean: #d2a8ff;
1134
+ --db-json-null: #8b949e;
1135
+ }
1136
+
1137
+ /* 浅色主题:同样桥接到宿主令牌,跟随任意浅色主题(GitHub Light / Quiet Light / Solarized Light…) */
1138
+ body.vscode-light {
1139
+ --db-light-color: var(--vscode-editor-background, #f8fafc);
1140
+ --db-gray-light: var(--vscode-sideBar-background, #f1f5f9);
1141
+ --db-gray-medium: var(--vscode-panel-border, #cbd5e1);
1142
+ --db-gray-dark: var(--vscode-descriptionForeground, #475569);
1143
+ --db-darker-color: var(--vscode-editor-foreground, #334155);
1144
+ --db-dark-color: var(--vscode-foreground, #1e293b);
1145
+ --db-black: var(--vscode-editor-foreground, #0f172a);
1146
+
1147
+ --db-bg-gradient: linear-gradient(135deg, var(--vscode-editor-background, #f8fafc) 0%, var(--vscode-sideBar-background, #e2e8f0) 100%);
1148
+ --db-card-gradient: linear-gradient(135deg, var(--vscode-editorWidget-background, #ffffff) 0%, var(--vscode-editor-background, #f8fafc) 100%);
1149
+
1150
+ --db-surface: var(--vscode-editorWidget-background, #ffffff);
1151
+ --db-on-accent: var(--vscode-button-foreground, #ffffff);
1152
+ --db-border: var(--vscode-panel-border, #e2e8f0);
1153
+ --db-border-gray: var(--vscode-editorWidget-border, var(--vscode-panel-border, #e5e7eb));
1154
+ --db-border-light: var(--vscode-input-border, #d1d5db);
1155
+ --db-border-lighter: var(--vscode-input-border, #dee2e6);
1156
+ --db-border-soft: var(--vscode-list-hoverBackground, #e9ecef);
1157
+ --db-bg-soft: var(--vscode-editorWidget-background, #f3f4f6);
1158
+ --db-bg-soft2: var(--vscode-sideBar-background, #f8f9fa);
1159
+ --db-bg-soft3: var(--vscode-editorWidget-background, #fafbfc);
1160
+ --db-bg-soft4: var(--vscode-editor-background, #fafafa);
1161
+ --db-bg-soft5: var(--vscode-editor-background, #f6f8fa);
1162
+ --db-text-body: var(--vscode-editor-foreground, #374151);
1163
+ --db-text-muted: var(--vscode-descriptionForeground, #64748b);
1164
+ --db-text-faint: var(--vscode-disabledForeground, #94a3b8);
1165
+ --db-code-bg: var(--vscode-textCodeBlock-background, #282c34);
1166
+ --db-code-fg: var(--vscode-editor-foreground, #abb2bf);
1167
+ }
1168
+
1169
+ /* 暗色下的 Bootstrap 默认浅色控件兜底(同样走令牌,跟随任意主题) */
1170
+ body.vscode-dark .card,
1171
+ body.vscode-high-contrast .card {
1172
+ border-color: var(--db-gray-medium);
1173
+ }
1174
+
1175
+ body.vscode-dark .form-control,
1176
+ body.vscode-dark .form-select,
1177
+ body.vscode-high-contrast .form-control,
1178
+ body.vscode-high-contrast .form-select {
1179
+ background: var(--db-surface);
1180
+ border-color: var(--db-border);
1181
+ color: var(--db-text-body);
1182
+ }
1183
+
1184
+ body.vscode-dark .navbar,
1185
+ body.vscode-high-contrast .navbar {
1186
+ background: var(--db-bg-gradient);
1187
+ }
1188
+
1189
+ body.vscode-dark .table,
1190
+ body.vscode-high-contrast .table {
1191
+ background: var(--db-surface);
1192
+ }
1193
+
1194
+ body.vscode-dark .table th,
1195
+ body.vscode-high-contrast .table th {
1196
+ background: var(--db-bg-soft);
1197
+ color: var(--db-text-body);
1198
+ }
1199
+
1200
+ /* Bootstrap 的浅色工具类在暗色下过于刺眼/对比不足,统一改挂主题令牌。
1201
+ 覆盖全部暗色入口:VSCode webview 暗色/高对比、桌面端(body.platform-desktop)。
1202
+ 注意 body.platform-desktop 只在桌面端入口添加(src/platform/index.ts),
1203
+ webview 不带该类,不会误伤浅色编辑器主题。 */
1204
+ body.vscode-dark .border-light,
1205
+ body.vscode-high-contrast .border-light,
1206
+ body.platform-desktop .border-light,
1207
+ body.vscode-dark .bg-light,
1208
+ body.vscode-high-contrast .bg-light,
1209
+ body.platform-desktop .bg-light {
1210
+ border-color: var(--db-border) !important;
1211
+ background-color: var(--db-bg-soft) !important;
1212
+ }
1213
+
1214
+ body.vscode-dark .btn-outline-secondary,
1215
+ body.vscode-high-contrast .btn-outline-secondary,
1216
+ body.platform-desktop .btn-outline-secondary,
1217
+ body.vscode-dark .btn-outline-light,
1218
+ body.vscode-high-contrast .btn-outline-light,
1219
+ body.platform-desktop .btn-outline-light {
1220
+ color: var(--db-text-body) !important;
1221
+ border-color: var(--db-border-light) !important;
1222
+ }
1223
+
1224
+ body.vscode-dark .btn-outline-secondary:hover,
1225
+ body.vscode-high-contrast .btn-outline-secondary:hover,
1226
+ body.platform-desktop .btn-outline-secondary:hover,
1227
+ body.vscode-dark .btn-outline-light:hover,
1228
+ body.vscode-high-contrast .btn-outline-light:hover,
1229
+ body.platform-desktop .btn-outline-light:hover {
1230
+ background-color: var(--db-bg-soft) !important;
1231
+ color: var(--db-text-body) !important;
1232
+ }
1233
+ /* ------------------------------------------------------------------
1234
+ * webview:显式接管 Bootstrap 的基础文本/背景色与标题色。
1235
+ * 之前只靠 data-bs-theme 间接切换,一旦宿主变量未按预期生效,
1236
+ * 表名/标题等继承链上的文字就会保持黑色(--bs-body-color 默认 #212529)。
1237
+ * 这里按主题类直接给出取值,两个方向都锁死。
1238
+ * ------------------------------------------------------------------ */
1239
+ body.vscode-light {
1240
+ color: var(--db-dark-color);
1241
+ --bs-body-bg: var(--db-light-color);
1242
+ --bs-body-color: var(--db-dark-color);
1243
+ --bs-secondary-bg: var(--db-bg-soft);
1244
+ --bs-secondary-color: var(--db-text-muted);
1245
+ --bs-tertiary-bg: var(--db-bg-soft2);
1246
+ --bs-tertiary-color: var(--db-text-muted);
1247
+ --bs-emphasis-color: var(--db-black);
1248
+ --bs-border-color: var(--db-border);
1249
+ --bs-heading-color: var(--db-dark-color);
1250
+ }
1251
+
1252
+ body.vscode-dark,
1253
+ body.vscode-high-contrast {
1254
+ color: var(--db-dark-color);
1255
+ --bs-body-bg: var(--db-light-color);
1256
+ --bs-body-color: var(--db-dark-color);
1257
+ --bs-secondary-bg: var(--db-bg-soft);
1258
+ --bs-secondary-color: var(--db-text-muted);
1259
+ --bs-tertiary-bg: var(--db-bg-soft2);
1260
+ --bs-tertiary-color: var(--db-text-muted);
1261
+ --bs-emphasis-color: var(--db-black);
1262
+ --bs-border-color: var(--db-border);
1263
+ --bs-heading-color: var(--db-dark-color);
1264
+ }
1265
+
1266
+ /* 标题与表格文本兜底:Bootstrap 的 heading / table 走 --bs-*-color,
1267
+ 上面已覆盖变量,这里再兜一层避免个别版本变量缺失 */
1268
+ body.vscode-dark h1,
1269
+ body.vscode-dark h2,
1270
+ body.vscode-dark h3,
1271
+ body.vscode-dark h4,
1272
+ body.vscode-dark h5,
1273
+ body.vscode-dark h6,
1274
+ body.vscode-high-contrast h1,
1275
+ body.vscode-high-contrast h2,
1276
+ body.vscode-high-contrast h3,
1277
+ body.vscode-high-contrast h4,
1278
+ body.vscode-high-contrast h5,
1279
+ body.vscode-high-contrast h6,
1280
+ body.vscode-dark .table,
1281
+ body.vscode-high-contrast .table,
1282
+ body.vscode-dark .table-name,
1283
+ body.vscode-high-contrast .table-name {
1284
+ color: var(--db-dark-color);
1285
+ }
1286
+
1287
+ /* =================================================================
1288
+ * 桌面端(Electron / Web)「编辑器深色」主题
1289
+ *
1290
+ * 对齐 VSCode 插件面板的观感:深色面板、1px 细边框、无渐变、无浮起阴影,
1291
+ * 中性色阶只留三层(内容面 / 面板面 / 悬停面),品牌色只用于图标与选中态,
1292
+ * 同时把按钮、表单、表格、工具栏的尺寸整体收缩一档。
1293
+ *
1294
+ * 选择器刻意写成一串 :not():特异性 (0,4,1) 高于上方
1295
+ * prefers-color-scheme: dark 的 (0,3,1),保证系统切浅色时不会回落到浅色令牌。
1296
+ * 仅作用于 body.platform-desktop,不影响 VSCode webview(走 theme.ts + 宿主主题)。
1297
+ * ================================================================= */
1298
+ body.platform-desktop:not(.vscode-dark):not(.vscode-light):not(.vscode-high-contrast) {
1299
+ color-scheme: dark;
1300
+
1301
+ /* 中性色阶(VSCode Dark Modern 的面板层次) */
1302
+ --db-surface: #1f1f1f;
1303
+ --db-light-color: #1f1f1f;
1304
+ --db-gray-light: #181818;
1305
+ --db-gray-medium: #2f2f2f;
1306
+ --db-gray-dark: #9d9d9d;
1307
+ --db-darker-color: #b8b8b8;
1308
+ --db-dark-color: #e6e6e6;
1309
+ --db-black: #ffffff;
1310
+
1311
+ /* 背景一律压平 */
1312
+ --db-bg-gradient: #1f1f1f;
1313
+ --db-card-gradient: #202020;
1314
+
1315
+ /* 边框 */
1316
+ --db-border: #2f2f2f;
1317
+ --db-border-gray: #2f2f2f;
1318
+ --db-border-light: #3c3c3c;
1319
+ --db-border-lighter: #333333;
1320
+ --db-border-soft: #2a2d2e;
1321
+
1322
+ /* 面 */
1323
+ --db-bg-soft: #252526;
1324
+ --db-bg-soft2: #202020;
1325
+ --db-bg-soft3: #1f1f1f;
1326
+ --db-bg-soft4: #1a1a1a;
1327
+ --db-bg-soft5: #1a1a1a;
1328
+
1329
+ /* 文本 */
1330
+ --db-text-body: #cccccc;
1331
+ --db-text-muted: #9d9d9d;
1332
+ --db-text-faint: #6e6e6e;
1333
+
1334
+ /* 语义底色 */
1335
+ --db-danger-bg: rgba(239, 68, 68, 0.16);
1336
+ --db-success-bg: rgba(16, 185, 129, 0.16);
1337
+ --db-warning-bg: rgba(245, 158, 11, 0.16);
1338
+ --db-info-bg: rgba(59, 130, 246, 0.18);
1339
+ --db-primary-bg: rgba(102, 126, 234, 0.2);
1340
+
1341
+ --db-code-bg: #1b1f27;
1342
+ --db-code-fg: #abb2bf;
1343
+
1344
+ /* 语义底色上的文字 / JSON 高亮:暗色下统一提亮 */
1345
+ --db-success-fg: #34d399;
1346
+ --db-warning-fg: #fbbf24;
1347
+ --db-danger-fg: #f87171;
1348
+ --db-info-fg: #60a5fa;
1349
+ --db-json-key: #ff7b72;
1350
+ --db-json-string: #a5d6ff;
1351
+ --db-json-number: #79c0ff;
1352
+ --db-json-boolean: #d2a8ff;
1353
+ --db-json-null: #8b949e;
1354
+
1355
+ /* 深色下投影几乎不可见,层级改由边框与面色表达 */
1356
+ --db-shadow-sm: none;
1357
+ --db-shadow-md: none;
1358
+ --db-shadow-lg: none;
1359
+ --db-shadow-xl: 0 8px 24px rgba(0, 0, 0, 0.5);
1360
+ --db-shadow-2xl: 0 16px 40px rgba(0, 0, 0, 0.6);
1361
+
1362
+ /* 圆角收紧:编辑器面板不用大圆角 */
1363
+ --db-radius-sm: 4px;
1364
+ --db-radius-md: 6px;
1365
+ --db-radius-lg: 8px;
1366
+ --db-radius-xl: 10px;
1367
+ --db-radius-2xl: 12px;
1368
+
1369
+ /* 间距整体收缩一档(全局 .card / .modal / .table 等共用这套令牌) */
1370
+ --db-spacing-xs: 0.375rem;
1371
+ --db-spacing-sm: 0.5rem;
1372
+ --db-spacing-md: 0.75rem;
1373
+ --db-spacing-lg: 1rem;
1374
+ --db-spacing-xl: 1.25rem;
1375
+ --db-spacing-2xl: 2rem;
1376
+
1377
+ /* Bootstrap 令牌桥接:下拉 / 弹窗 / 分页等组件一并转入深色 */
1378
+ --bs-body-bg: var(--db-surface);
1379
+ --bs-body-color: var(--db-text-body);
1380
+ --bs-secondary-bg: var(--db-bg-soft);
1381
+ --bs-secondary-color: var(--db-text-muted);
1382
+ --bs-tertiary-bg: var(--db-bg-soft2);
1383
+ --bs-tertiary-color: var(--db-text-muted);
1384
+ --bs-emphasis-color: var(--db-black);
1385
+ --bs-border-color: var(--db-border);
1386
+ --bs-heading-color: var(--db-dark-color);
1387
+ }
1388
+
1389
+ /* ---------------- 滚动条 / 选中 / 代码块 ---------------- */
1390
+ body.platform-desktop ::-webkit-scrollbar { width: 10px; height: 10px; }
1391
+ body.platform-desktop ::-webkit-scrollbar-track { background: transparent; border-radius: 0; }
1392
+ body.platform-desktop ::-webkit-scrollbar-thumb {
1393
+ background-color: #424242;
1394
+ background-clip: content-box;
1395
+ border: 2px solid transparent;
1396
+ border-radius: 5px;
1397
+ }
1398
+ body.platform-desktop ::-webkit-scrollbar-thumb:hover { background-color: #4f4f4f; background-clip: content-box; }
1399
+ body.platform-desktop ::selection { background: rgba(102, 126, 234, 0.35); color: #ffffff; }
1400
+ body.platform-desktop code { background-color: var(--db-bg-soft); color: #ce9178; padding: 0.1rem 0.3rem; }
1401
+ body.platform-desktop pre {
1402
+ background-color: var(--db-code-bg);
1403
+ border: 1px solid var(--db-border);
1404
+ color: var(--db-code-fg);
1405
+ padding: 0.625rem;
1406
+ font-size: 12px;
1407
+ }
1408
+
1409
+ /* ---------------- 基础组件密度 ---------------- */
1410
+ body.platform-desktop .btn {
1411
+ padding: 0.25rem 0.6rem;
1412
+ font-size: 12px;
1413
+ line-height: 1.4;
1414
+ font-weight: 500;
1415
+ border-radius: 4px;
1416
+ box-shadow: none;
1417
+ }
1418
+ body.platform-desktop .btn-sm { padding: 0.2rem 0.5rem; font-size: 12px; border-radius: 4px; }
1419
+ body.platform-desktop .btn-group-sm > .btn { padding: 0.15rem 0.4rem; font-size: 12px; }
1420
+ /* 树 / 列表里的纯图标按钮:不能在 .btn 密度下被撑开 */
1421
+ body.platform-desktop .btn-icon {
1422
+ padding: 0;
1423
+ width: 18px;
1424
+ height: 18px;
1425
+ display: inline-flex;
1426
+ align-items: center;
1427
+ justify-content: center;
1428
+ border: none;
1429
+ background: transparent;
1430
+ border-radius: 4px;
1431
+ }
1432
+
1433
+ body.platform-desktop .form-control,
1434
+ body.platform-desktop .form-select {
1435
+ padding: 0.3rem 0.5rem;
1436
+ font-size: 12px;
1437
+ border: 1px solid var(--db-border-light);
1438
+ border-radius: 4px;
1439
+ background-color: var(--db-bg-soft);
1440
+ color: var(--db-text-body);
1441
+ }
1442
+ body.platform-desktop .form-control:focus,
1443
+ body.platform-desktop .form-select:focus {
1444
+ border-color: var(--db-primary-color);
1445
+ box-shadow: 0 0 0 2px rgba(102, 126, 234, 0.25);
1446
+ transform: none;
1447
+ }
1448
+ body.platform-desktop .form-control-sm,
1449
+ body.platform-desktop .form-select-sm { padding: 0.15rem 0.4rem; font-size: 12px; }
1450
+ body.platform-desktop .form-select-sm { padding-right: 1.4rem; }
1451
+ body.platform-desktop .form-label { margin-bottom: 0.25rem; font-size: 12px; font-weight: 600; color: var(--db-text-muted); }
1452
+ body.platform-desktop .form-text { font-size: 11px; color: var(--db-text-muted); }
1453
+ body.platform-desktop .form-check-input { width: 14px; height: 14px; margin-top: 0.2rem; border-width: 1px; border-radius: 3px; }
1454
+ body.platform-desktop .form-check-label { margin-left: 0.375rem; font-size: 12px; }
1455
+
1456
+ body.platform-desktop .table {
1457
+ border-radius: 0;
1458
+ box-shadow: none;
1459
+ --bs-table-bg: transparent;
1460
+ --bs-table-color: var(--db-text-body);
1461
+ --bs-table-border-color: var(--db-border);
1462
+ --bs-table-striped-bg: var(--db-bg-soft2);
1463
+ --bs-table-striped-color: var(--db-text-body);
1464
+ --bs-table-hover-bg: var(--db-bg-soft);
1465
+ --bs-table-hover-color: var(--db-black);
1466
+ }
1467
+ body.platform-desktop .table th {
1468
+ padding: 0.375rem 0.625rem;
1469
+ background-color: var(--db-bg-soft);
1470
+ border-color: var(--db-border);
1471
+ color: var(--db-text-muted);
1472
+ font-size: 11px;
1473
+ font-weight: 600;
1474
+ letter-spacing: 0.04em;
1475
+ text-transform: uppercase;
1476
+ }
1477
+ body.platform-desktop .table td { padding: 0.3rem 0.625rem; border-color: var(--db-border); font-size: 12px; }
1478
+ body.platform-desktop .table-dark { --bs-table-bg: var(--db-bg-soft); --bs-table-color: var(--db-text-muted); }
1479
+ body.platform-desktop .table-striped tbody tr:nth-of-type(odd) { background-color: transparent; }
1480
+ body.platform-desktop .table-hover tbody tr:hover { background-color: var(--db-bg-soft); transform: none; }
1481
+ body.platform-desktop .table-responsive { border-radius: 0; box-shadow: none; }
1482
+
1483
+ body.platform-desktop .dropdown-menu {
1484
+ padding: 0.25rem;
1485
+ background-color: var(--db-bg-soft);
1486
+ border: 1px solid var(--db-border-light);
1487
+ border-radius: 6px;
1488
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.5);
1489
+ font-size: 12px;
1490
+ }
1491
+ body.platform-desktop .dropdown-item { padding: 0.3rem 0.5rem; border-radius: 4px; font-size: 12px; color: var(--db-text-body); }
1492
+ body.platform-desktop .dropdown-item:hover,
1493
+ body.platform-desktop .dropdown-item:focus { background-color: var(--db-primary-bg); color: var(--db-dark-color); transform: none; }
1494
+ body.platform-desktop .dropdown-divider { margin: 0.25rem 0; border-color: var(--db-border); }
1495
+ body.platform-desktop .dropdown-header { padding: 0.25rem 0.5rem; font-size: 11px; color: var(--db-text-faint); }
1496
+
1497
+ body.platform-desktop .modal-content {
1498
+ background-color: var(--db-bg-soft2);
1499
+ border: 1px solid var(--db-border-light);
1500
+ border-radius: 8px;
1501
+ box-shadow: var(--db-shadow-2xl);
1502
+ }
1503
+ body.platform-desktop .modal-header {
1504
+ padding: 0.625rem 0.875rem;
1505
+ background-color: var(--db-bg-soft);
1506
+ border-bottom: 1px solid var(--db-border);
1507
+ }
1508
+ body.platform-desktop .modal-header::before { height: 0; }
1509
+ body.platform-desktop .modal-title { font-size: 14px; font-weight: 600; color: var(--db-dark-color); }
1510
+ body.platform-desktop .modal-body { padding: 0.875rem; max-height: 72vh; color: var(--db-text-body); }
1511
+ body.platform-desktop .modal-footer {
1512
+ padding: 0.625rem 0.875rem;
1513
+ background-color: var(--db-bg-soft);
1514
+ border-top: 1px solid var(--db-border);
1515
+ }
1516
+ body.platform-desktop .btn-close {
1517
+ width: 22px;
1518
+ height: 22px;
1519
+ padding: 0;
1520
+ background-color: transparent;
1521
+ background-image: var(--bs-btn-close-bg);
1522
+ background-position: center;
1523
+ background-repeat: no-repeat;
1524
+ background-size: 0.8em auto;
1525
+ border-radius: 4px;
1526
+ opacity: 0.7;
1527
+ }
1528
+ body.platform-desktop .btn-close:hover { background-color: var(--db-bg-soft); opacity: 1; transform: none; }
1529
+
1530
+ body.platform-desktop .alert { padding: 0.5rem 0.75rem; border: 1px solid transparent; border-radius: 4px; font-size: 12px; }
1531
+ body.platform-desktop .alert-success { background-color: var(--db-success-bg); border-color: rgba(16, 185, 129, 0.35); color: #4ade80; }
1532
+ body.platform-desktop .alert-danger { background-color: var(--db-danger-bg); border-color: rgba(239, 68, 68, 0.35); color: #f87171; }
1533
+ body.platform-desktop .alert-warning { background-color: var(--db-warning-bg); border-color: rgba(245, 158, 11, 0.35); color: #fbbf24; }
1534
+ body.platform-desktop .alert-info { background-color: var(--db-info-bg); border-color: rgba(59, 130, 246, 0.35); color: #60a5fa; }
1535
+
1536
+ body.platform-desktop .card { background-color: var(--db-bg-soft2); border: 1px solid var(--db-border); box-shadow: none; }
1537
+ body.platform-desktop .card:hover { transform: none; box-shadow: none; border-color: var(--db-border-light); }
1538
+ body.platform-desktop .card-header { background-color: var(--db-bg-soft); border-bottom: 1px solid var(--db-border); }
1539
+ body.platform-desktop .card-header::before { display: none; }
1540
+ body.platform-desktop .card-footer { background-color: var(--db-bg-soft); border-top: 1px solid var(--db-border); }
1541
+
1542
+ body.platform-desktop .loading-overlay { background-color: rgba(31, 31, 31, 0.75); }
1543
+ body.platform-desktop .loading-spinner { border-color: var(--db-bg-soft); border-top-color: var(--db-primary-color); }
1544
+ body.platform-desktop .bg-glass { background-color: rgba(31, 31, 31, 0.85); border-color: var(--db-border); }
1545
+ body.platform-desktop .list-group-item { background-color: transparent; color: var(--db-text-body); }
1546
+ body.platform-desktop .list-group-item:hover { background-color: var(--db-bg-soft); transform: none; }
1547
+ body.platform-desktop .page-link {
1548
+ padding: 0.2rem 0.5rem;
1549
+ background-color: transparent;
1550
+ border-color: var(--db-border);
1551
+ color: var(--db-text-body);
1552
+ font-size: 12px;
1553
+ }
1554
+ body.platform-desktop .page-link:hover { background-color: var(--db-bg-soft); border-color: var(--db-border-light); color: var(--db-dark-color); }
1555
+ 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); }
1556
+
1557
+ /* ---------------- 布局紧凑化 ---------------- */
1558
+ /* 连接详情:信息条与快捷操作紧凑化 */
1559
+ body.platform-desktop .connection-detail { gap: 10px !important; padding: 10px !important; }
1560
+ body.platform-desktop .connection-header { margin-bottom: 0 !important; padding: 8px 12px !important; }
1561
+ body.platform-desktop .connection-info { gap: 10px !important; }
1562
+ body.platform-desktop .quick-actions { margin-bottom: 0 !important; padding: 10px 12px !important; }
1563
+ body.platform-desktop .actions-grid { gap: 6px !important; }
1564
+ body.platform-desktop .action-btn {
1565
+ flex-direction: row !important;
1566
+ justify-content: flex-start !important;
1567
+ gap: 8px !important;
1568
+ padding: 6px 10px !important;
1569
+ }
1570
+ body.platform-desktop .action-icon { font-size: 14px !important; }
1571
+
1572
+ /* 表详情页:信息条 / 工具栏 / 页签整体收紧 */
1573
+ body.platform-desktop .table-header { padding: 8px 12px !important; }
1574
+ body.platform-desktop .table-icon { font-size: 20px !important; }
1575
+ body.platform-desktop .table-name { font-size: 0.9375rem !important; }
1576
+ body.platform-desktop .table-breadcrumb { font-size: 0.75rem !important; }
1577
+ body.platform-desktop .table-stats { gap: 14px !important; }
1578
+ body.platform-desktop .table-toolbar { padding: 6px 12px !important; gap: 6px !important; flex-wrap: wrap !important; }
1579
+ body.platform-desktop .toolbar-left,
1580
+ body.platform-desktop .toolbar-right { gap: 6px !important; flex-wrap: wrap !important; }
1581
+ body.platform-desktop .table-toolbar .btn,
1582
+ body.platform-desktop .data-toolbar .btn {
1583
+ padding: 3px 8px !important;
1584
+ font-size: 12px !important;
1585
+ line-height: 1.4 !important;
1586
+ border-radius: 4px !important;
1587
+ }
1588
+ body.platform-desktop .table-toolbar .btn i,
1589
+ body.platform-desktop .data-toolbar .btn i { font-size: 12px !important; }
1590
+ body.platform-desktop .table-toolbar .dropdown-menu { font-size: 12px !important; }
1591
+ body.platform-desktop .table-toolbar .dropdown-item { padding: 4px 10px !important; font-size: 12px !important; }
1592
+ body.platform-desktop .nav-tabs { padding: 0 0.5rem !important; }
1593
+ body.platform-desktop .nav-tabs .nav-link { padding: 6px 12px !important; font-size: 12px !important; }
1594
+ body.platform-desktop .nav-tabs .nav-link .badge { font-size: 10px !important; padding: 2px 5px !important; }
1595
+ body.platform-desktop .tab-content { padding: 10px 12px !important; }
1596
+
1597
+ /* SQL 编辑器工具栏(桌面端独立存在) */
1598
+ body.platform-desktop .sql-toolbar,
1599
+ body.platform-desktop .editor-toolbar { padding: 6px 10px !important; gap: 6px !important; flex-wrap: wrap !important; }
1600
+ body.platform-desktop .sql-toolbar .btn,
1601
+ body.platform-desktop .editor-toolbar .btn {
1602
+ padding: 3px 8px !important;
1603
+ font-size: 12px !important;
1604
+ line-height: 1.4 !important;
1605
+ border-radius: 4px !important;
1606
+ }
1607
+
1608
+ /* ---------------- 配色降噪 ---------------- */
1609
+ body.platform-desktop .btn-primary,
1610
+ body.platform-desktop .btn-info,
1611
+ body.platform-desktop .btn-success,
1612
+ body.platform-desktop .btn-secondary {
1613
+ background-color: var(--db-bg-soft) !important;
1614
+ border-color: var(--db-border-light) !important;
1615
+ color: var(--db-text-body) !important;
1616
+ }
1617
+ body.platform-desktop .btn-primary:hover,
1618
+ body.platform-desktop .btn-info:hover,
1619
+ body.platform-desktop .btn-success:hover,
1620
+ body.platform-desktop .btn-secondary:hover,
1621
+ body.platform-desktop .btn-primary:focus,
1622
+ body.platform-desktop .btn-info:focus,
1623
+ body.platform-desktop .btn-success:focus,
1624
+ body.platform-desktop .btn-secondary:focus {
1625
+ background-color: var(--db-border-soft) !important;
1626
+ border-color: var(--db-border-light) !important;
1627
+ color: var(--db-text-body) !important;
1628
+ }
1629
+ /* 破坏性 / 警告操作保留语义色,但降饱和 */
1630
+ body.platform-desktop .btn-danger,
1631
+ body.platform-desktop .btn-outline-danger {
1632
+ background-color: transparent !important;
1633
+ border-color: rgba(239, 68, 68, 0.55) !important;
1634
+ color: #ef4444 !important;
1635
+ }
1636
+ body.platform-desktop .btn-warning,
1637
+ body.platform-desktop .btn-outline-warning {
1638
+ background-color: transparent !important;
1639
+ border-color: rgba(245, 158, 11, 0.5) !important;
1640
+ color: #f59e0b !important;
1641
+ }
1642
+ /* 工具栏里的主操作保留一点主题色,避免整条工具栏全是灰button */
1643
+ body.platform-desktop .tables-actions .btn-primary,
1644
+ body.platform-desktop .views-actions .btn-success,
1645
+ body.platform-desktop .procedures-actions .btn-info {
1646
+ background-color: var(--db-primary-bg) !important;
1647
+ border-color: var(--db-primary-color) !important;
1648
+ color: var(--db-primary-color) !important;
1649
+ }
1650
+ body.platform-desktop .tables-actions .btn-primary:hover,
1651
+ body.platform-desktop .views-actions .btn-success:hover,
1652
+ body.platform-desktop .procedures-actions .btn-info:hover {
1653
+ background-color: rgba(102, 126, 234, 0.3) !important;
1654
+ color: var(--db-primary-light) !important;
1655
+ border-color: var(--db-primary-light) !important;
1656
+ }
1657
+ /* 徽章统一中性 */
1658
+ body.platform-desktop .badge {
1659
+ background-color: var(--db-bg-soft) !important;
1660
+ color: var(--db-text-muted) !important;
1661
+ font-weight: 500 !important;
1662
+ padding: 0.1rem 0.4rem;
1663
+ font-size: 10px;
1664
+ border-radius: 999px;
1665
+ text-transform: none;
1666
+ letter-spacing: 0;
1667
+ box-shadow: none;
1668
+ }
1669
+ /* 数据库卡片的大块品牌渐变改为中性面,品牌色只保留 logo 小方块 */
1670
+ body.platform-desktop .db-mysql-bg,
1671
+ body.platform-desktop .db-postgres-bg,
1672
+ body.platform-desktop .db-sqlite-bg,
1673
+ body.platform-desktop .db-mssql-bg,
1674
+ body.platform-desktop .db-oracle-bg,
1675
+ body.platform-desktop .db-default-bg {
1676
+ background: var(--db-bg-soft) !important;
1677
+ color: var(--db-text-body) !important;
1678
+ border: 1px solid var(--db-border) !important;
1679
+ }
1680
+ /* 进度指示器收敛为主题色 */
1681
+ body.platform-desktop .spinner-border.text-primary,
1682
+ body.platform-desktop .text-primary.spinner-border {
1683
+ color: var(--db-text-muted) !important;
1684
+ }
1685
+
1010
1686
  /* 覆盖Bootstrap默认样式 */
1011
1687
  .toast-container[data-v-7d639c44] {
1012
1688
  z-index: 1100;
@@ -1036,39 +1712,39 @@ pre {
1036
1712
  text-align: center;
1037
1713
  }
1038
1714
 
1039
- .modal-dialog[data-v-323d35a9] {
1715
+ .modal-dialog[data-v-aa6b0e1f] {
1040
1716
  z-index: var(--bs-modal-zindex);
1041
1717
  max-width:none !important;
1042
1718
  }
1043
- .modal-success .modal-header[data-v-323d35a9] {
1719
+ .modal-success .modal-header[data-v-aa6b0e1f] {
1044
1720
  background-color: var(--bs-success);
1045
1721
  color: white;
1046
1722
  }
1047
- .modal-error .modal-header[data-v-323d35a9] {
1723
+ .modal-error .modal-header[data-v-aa6b0e1f] {
1048
1724
  background-color: var(--bs-danger);
1049
1725
  color: white;
1050
1726
  }
1051
- .modal-warning .modal-header[data-v-323d35a9] {
1727
+ .modal-warning .modal-header[data-v-aa6b0e1f] {
1052
1728
  background-color: var(--bs-warning);
1053
1729
  color: var(--bs-dark);
1054
1730
  }
1055
- .modal-info .modal-header[data-v-323d35a9] {
1731
+ .modal-info .modal-header[data-v-aa6b0e1f] {
1056
1732
  background-color: var(--bs-info);
1057
1733
  color: white;
1058
1734
  }
1059
- .modal-body[data-v-323d35a9] {
1735
+ .modal-body[data-v-aa6b0e1f] {
1060
1736
  min-height: 80px;
1061
1737
  display: flex;
1062
1738
  flex-direction: column;
1063
1739
  align-items: stretch;
1064
1740
  }
1065
- .error-details[data-v-323d35a9] {
1741
+ .error-details[data-v-aa6b0e1f] {
1066
1742
  width: 100%;
1067
1743
  margin-top: 1rem;
1068
1744
  }
1069
- .error-content[data-v-323d35a9] {
1070
- background-color: #f8f9fa;
1071
- border: 1px solid #cbd5e1;
1745
+ .error-content[data-v-aa6b0e1f] {
1746
+ background-color: var(--db-bg-soft2);
1747
+ border: 1px solid var(--db-gray-medium);
1072
1748
  border-radius: 0.375rem;
1073
1749
  padding: 1rem;
1074
1750
  margin: 0;
@@ -1080,19 +1756,19 @@ pre {
1080
1756
  font-size: 0.875rem;
1081
1757
  line-height: 1.5;
1082
1758
  }
1083
- .error-details-toggle[data-v-323d35a9] {
1759
+ .error-details-toggle[data-v-aa6b0e1f] {
1084
1760
  width: 100%;
1085
1761
  }
1086
- .error-details-content[data-v-323d35a9] {
1087
- background-color: #f8f9fa;
1088
- border: 1px solid #cbd5e1;
1762
+ .error-details-content[data-v-aa6b0e1f] {
1763
+ background-color: var(--db-bg-soft2);
1764
+ border: 1px solid var(--db-gray-medium);
1089
1765
  border-radius: 0.375rem;
1090
1766
  padding: 1rem;
1091
1767
  margin-top: 0.5rem;
1092
1768
  }
1093
- .error-json[data-v-323d35a9] {
1094
- background-color: #212529;
1095
- color: #f8f9fa;
1769
+ .error-json[data-v-aa6b0e1f] {
1770
+ background-color: var(--db-text-body);
1771
+ color: var(--db-bg-soft2);
1096
1772
  border-radius: 0.25rem;
1097
1773
  padding: 0.75rem;
1098
1774
  font-size: 0.8rem;
@@ -1102,56 +1778,57 @@ pre {
1102
1778
  white-space: pre-wrap;
1103
1779
  word-break: break-word;
1104
1780
  }
1105
- .error-meta[data-v-323d35a9] {
1106
- border-bottom: 1px solid #cbd5e1;
1781
+ .error-meta[data-v-aa6b0e1f] {
1782
+ border-bottom: 1px solid var(--db-gray-medium);
1107
1783
  padding-bottom: 0.5rem;
1108
1784
  margin-bottom: 0.5rem;
1109
1785
  }
1110
- .modal-body .fs-1[data-v-323d35a9] {
1786
+ .modal-body .fs-1[data-v-aa6b0e1f] {
1111
1787
  font-size: 2.5rem;
1112
1788
  margin-bottom: 1rem;
1113
1789
  }
1114
1790
 
1115
1791
  /* 响应式调整 */
1116
1792
  @media (max-width: 576px) {
1117
- .error-content[data-v-323d35a9],
1118
- .error-json[data-v-323d35a9] {
1793
+ .error-content[data-v-aa6b0e1f],
1794
+ .error-json[data-v-aa6b0e1f] {
1119
1795
  font-size: 0.75rem;
1120
1796
  max-height: 150px;
1121
1797
  }
1122
1798
  }
1123
1799
 
1124
- .datagrid-container[data-v-f249eac8] {
1800
+ .datagrid-container[data-v-6e7b7e09] {
1125
1801
  display: flex;
1126
1802
  flex-direction: column;
1127
1803
  height: 100%;
1128
1804
  }
1129
- .datagrid-inner[data-v-f249eac8] {
1805
+ .datagrid-inner[data-v-6e7b7e09] {
1130
1806
  flex: 1;
1131
1807
  overflow: auto;
1132
1808
  margin-bottom: 10px;
1133
1809
  }
1134
- .datagrid-th[data-v-f249eac8] {
1810
+ .datagrid-th[data-v-6e7b7e09] {
1135
1811
  min-width: 80px;
1136
1812
  white-space: nowrap;
1137
1813
  position: sticky;
1138
1814
  top: 0;
1139
1815
  z-index: 10;
1140
- background-color: #f8f9fa;
1816
+ /* sticky 表头必须有不透明背景,令牌在暗色下自动切换 */
1817
+ background-color: var(--db-bg-soft2, #f8f9fa);
1141
1818
  }
1142
- .datagrid-th.sortable[data-v-f249eac8] {
1819
+ .datagrid-th.sortable[data-v-6e7b7e09] {
1143
1820
  cursor: pointer;
1144
1821
  user-select: none;
1145
1822
  }
1146
- .datagrid-th.sortable[data-v-f249eac8]:hover {
1147
- background-color: #e9ecef;
1823
+ .datagrid-th.sortable[data-v-6e7b7e09]:hover {
1824
+ background-color: var(--db-border-soft, #e9ecef);
1148
1825
  }
1149
- .header-content[data-v-f249eac8] {
1826
+ .header-content[data-v-6e7b7e09] {
1150
1827
  display: flex;
1151
1828
  align-items: center;
1152
1829
  gap: 0.5rem;
1153
1830
  }
1154
- .sort-icon[data-v-f249eac8] {
1831
+ .sort-icon[data-v-6e7b7e09] {
1155
1832
  display: flex;
1156
1833
  align-items: center;
1157
1834
  font-size: 0.75rem;