pglens 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/client/styles.css CHANGED
@@ -55,7 +55,258 @@
55
55
  --transition-base: 200ms ease;
56
56
  }
57
57
 
58
- [data-theme="dark"] {
58
+ /* Connection Dialog */
59
+ .connection-dialog-overlay {
60
+ position: fixed;
61
+ top: 0;
62
+ left: 0;
63
+ right: 0;
64
+ bottom: 0;
65
+ background-color: rgba(0, 0, 0, 0.5);
66
+ z-index: 1000;
67
+ display: flex;
68
+ align-items: center;
69
+ justify-content: center;
70
+ backdrop-filter: blur(4px);
71
+ }
72
+
73
+ .connection-dialog {
74
+ background-color: var(--bg-base);
75
+ border-radius: var(--radius-lg);
76
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
77
+ width: 100%;
78
+ max-width: 480px;
79
+ border: 1px solid var(--border-subtle);
80
+ overflow: hidden;
81
+ animation: dialogSlideIn 0.3s ease-out;
82
+ }
83
+
84
+ @keyframes dialogSlideIn {
85
+ from {
86
+ opacity: 0;
87
+ transform: translateY(20px);
88
+ }
89
+
90
+ to {
91
+ opacity: 1;
92
+ transform: translateY(0);
93
+ }
94
+ }
95
+
96
+ .connection-dialog-header {
97
+ padding: var(--space-6);
98
+ border-bottom: 1px solid var(--border-subtle);
99
+ background-color: var(--bg-elevated);
100
+ display: flex;
101
+ justify-content: space-between;
102
+ align-items: center;
103
+ }
104
+
105
+ .connection-dialog-header h2 {
106
+ font-size: var(--font-size-xl);
107
+ font-weight: var(--font-weight-semibold);
108
+ color: var(--text-primary);
109
+ margin: 0;
110
+ }
111
+
112
+ .close-dialog-button {
113
+ background: none;
114
+ border: none;
115
+ cursor: pointer;
116
+ font-size: 20px;
117
+ line-height: 1;
118
+ padding: var(--space-2);
119
+ border-radius: var(--radius-sm);
120
+ color: var(--text-secondary);
121
+ transition: all var(--transition-fast);
122
+ }
123
+
124
+ .close-dialog-button:hover {
125
+ background-color: var(--bg-hover);
126
+ color: var(--text-primary);
127
+ }
128
+
129
+ .connection-dialog-body {
130
+ padding: var(--space-6);
131
+ }
132
+
133
+ .form-group {
134
+ margin-bottom: var(--space-5);
135
+ }
136
+
137
+ .form-group:last-child {
138
+ margin-bottom: 0;
139
+ }
140
+
141
+ .connection-type-tabs {
142
+ display: flex;
143
+ background-color: var(--bg-elevated);
144
+ border: 1px solid var(--border-subtle);
145
+ border-radius: var(--radius-md);
146
+ padding: 4px;
147
+ margin-bottom: var(--space-5);
148
+ gap: 4px;
149
+ }
150
+
151
+ .connection-type-tab {
152
+ flex: 1;
153
+ background: none;
154
+ border: none;
155
+ padding: var(--space-2);
156
+ border-radius: var(--radius-sm);
157
+ font-size: var(--font-size-sm);
158
+ font-weight: var(--font-weight-medium);
159
+ color: var(--text-secondary);
160
+ cursor: pointer;
161
+ transition: all var(--transition-fast);
162
+ }
163
+
164
+ .connection-type-tab:hover {
165
+ color: var(--text-primary);
166
+ }
167
+
168
+ .connection-type-tab.active {
169
+ background-color: var(--bg-base);
170
+ color: var(--color-primary);
171
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
172
+ }
173
+
174
+ .form-row {
175
+ display: flex;
176
+ gap: var(--space-3);
177
+ margin-bottom: var(--space-5);
178
+ }
179
+
180
+ .form-row .form-group {
181
+ margin-bottom: 0;
182
+ }
183
+
184
+ .flex-1 {
185
+ flex: 1;
186
+ }
187
+
188
+ .flex-2 {
189
+ flex: 2;
190
+ }
191
+
192
+ .form-group label {
193
+ display: block;
194
+ margin-bottom: var(--space-2);
195
+ font-size: var(--font-size-sm);
196
+ font-weight: var(--font-weight-medium);
197
+ color: var(--text-secondary);
198
+ }
199
+
200
+ .form-group input[type="text"],
201
+ .form-group input[type="password"],
202
+ .form-group input[type="number"],
203
+ .form-group select {
204
+ width: 100%;
205
+ padding: var(--space-3);
206
+ border: 1px solid var(--border-default);
207
+ border-radius: var(--radius-md);
208
+ font-size: var(--font-size-base);
209
+ background-color: var(--bg-base);
210
+ color: var(--text-primary);
211
+ transition: border-color var(--transition-fast);
212
+ }
213
+
214
+ .form-group input[type="text"]:focus,
215
+ .form-group select:focus {
216
+ outline: none;
217
+ border-color: var(--color-primary);
218
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
219
+ }
220
+
221
+ .connection-dialog-footer {
222
+ padding: var(--space-6);
223
+ background-color: var(--bg-elevated);
224
+ border-top: 1px solid var(--border-subtle);
225
+ display: flex;
226
+ justify-content: flex-end;
227
+ }
228
+
229
+ .error-message {
230
+ background-color: rgba(239, 68, 68, 0.1);
231
+ color: var(--color-error);
232
+ padding: var(--space-3);
233
+ border-radius: var(--radius-md);
234
+ font-size: var(--font-size-sm);
235
+ margin-top: var(--space-4);
236
+ border: 1px solid rgba(239, 68, 68, 0.2);
237
+ }
238
+
239
+ .button-primary {
240
+ background-color: var(--color-primary);
241
+ color: white;
242
+ border: none;
243
+ padding: var(--space-2) var(--space-4);
244
+ border-radius: var(--radius-md);
245
+ font-weight: var(--font-weight-medium);
246
+ cursor: pointer;
247
+ transition: background-color var(--transition-fast);
248
+ font-size: var(--font-size-base);
249
+ }
250
+
251
+ .button-primary:hover {
252
+ background-color: var(--color-primary-hover);
253
+ }
254
+
255
+ .button-primary:disabled {
256
+ opacity: 0.7;
257
+ cursor: not-allowed;
258
+ }
259
+
260
+ /* Connection Status Indicator */
261
+ .connection-status {
262
+ width: 8px;
263
+ height: 8px;
264
+ border-radius: 50%;
265
+ background-color: var(--color-error);
266
+ display: inline-block;
267
+ margin-left: var(--space-2);
268
+ transition: background-color var(--transition-base);
269
+ position: relative;
270
+ top: -1px;
271
+ }
272
+
273
+ .connection-status.connected {
274
+ background-color: var(--color-success);
275
+ box-shadow: 0 0 0 2px rgba(16, 185, 129, 0.2);
276
+ }
277
+
278
+ .sidebar-actions {
279
+ display: flex;
280
+ align-items: center;
281
+ gap: var(--space-1);
282
+ }
283
+
284
+ .icon-button {
285
+ background: transparent;
286
+ border: none;
287
+ cursor: pointer;
288
+ padding: var(--space-1);
289
+ border-radius: var(--radius-sm);
290
+ color: var(--text-secondary);
291
+ display: flex;
292
+ align-items: center;
293
+ justify-content: center;
294
+ transition: background-color var(--transition-fast), color var(--transition-fast);
295
+ width: 28px;
296
+ height: 28px;
297
+ }
298
+
299
+ .icon-button:hover {
300
+ background-color: var(--bg-hover);
301
+ color: var(--text-primary);
302
+ }
303
+
304
+ .icon-button .icon {
305
+ font-size: 16px;
306
+ line-height: 1;
307
+ }
308
+
309
+ html[data-theme="dark"] {
59
310
  --color-primary: #3b82f6;
60
311
  --color-primary-hover: #60a5fa;
61
312
  --color-secondary: #94a3b8;
@@ -139,7 +390,8 @@ code {
139
390
  }
140
391
 
141
392
  .sidebar.minimized .sidebar-header-top h2,
142
- .sidebar.minimized .sidebar-header-top .table-count,
393
+ .sidebar.minimized .connections-section,
394
+ .sidebar.minimized .tables-section h3,
143
395
  .sidebar.minimized .sidebar-search-container,
144
396
  .sidebar.minimized .sidebar-content {
145
397
  display: none;
@@ -162,7 +414,10 @@ code {
162
414
  border-bottom: 1px solid var(--border-subtle);
163
415
  display: flex;
164
416
  flex-direction: column;
165
- gap: var(--space-3);
417
+ gap: var(--space-4);
418
+ flex: 1;
419
+ min-height: 0;
420
+ overflow: hidden;
166
421
  }
167
422
 
168
423
  .sidebar-header-top {
@@ -178,8 +433,10 @@ code {
178
433
  }
179
434
 
180
435
  .sidebar-header h2 {
181
- font-size: var(--font-size-lg);
182
- font-weight: var(--font-weight-semibold);
436
+ font-family: "Asimovian", cursive;
437
+ font-size: 28px;
438
+ /* Slightly larger for display font */
439
+ font-weight: 400;
183
440
  color: var(--text-primary);
184
441
  margin: 0;
185
442
  letter-spacing: -0.01em;
@@ -218,6 +475,111 @@ code {
218
475
  display: inline-block;
219
476
  }
220
477
 
478
+ /* Connections Section */
479
+ .connections-section {
480
+ display: flex;
481
+ flex-direction: column;
482
+ gap: var(--space-2);
483
+ }
484
+
485
+ .section-header {
486
+ display: flex;
487
+ justify-content: space-between;
488
+ align-items: center;
489
+ color: var(--text-secondary);
490
+ font-size: var(--font-size-xs);
491
+ font-weight: var(--font-weight-medium);
492
+ text-transform: uppercase;
493
+ letter-spacing: 0.05em;
494
+ padding-right: var(--space-1);
495
+ }
496
+
497
+ .add-connection-button {
498
+ width: 20px;
499
+ height: 20px;
500
+ font-size: 14px;
501
+ }
502
+
503
+ .connections-list {
504
+ list-style: none;
505
+ margin: 0;
506
+ padding: 0;
507
+ max-height: 150px;
508
+ overflow-y: auto;
509
+ }
510
+
511
+ .connection-item {
512
+ display: flex;
513
+ align-items: center;
514
+ justify-content: space-between;
515
+ padding: var(--space-2) var(--space-3);
516
+ border-radius: var(--radius-md);
517
+ cursor: pointer;
518
+ transition: background-color var(--transition-fast);
519
+ color: var(--text-secondary);
520
+ font-size: var(--font-size-sm);
521
+ margin-bottom: 2px;
522
+ }
523
+
524
+ .connection-item:hover {
525
+ background-color: var(--bg-hover);
526
+ color: var(--text-primary);
527
+ }
528
+
529
+ .connection-item.active {
530
+ background-color: var(--bg-active);
531
+ color: var(--color-primary);
532
+ font-weight: var(--font-weight-medium);
533
+ }
534
+
535
+ .connection-name {
536
+ flex: 1;
537
+ overflow: hidden;
538
+ text-overflow: ellipsis;
539
+ white-space: nowrap;
540
+ margin-right: var(--space-2);
541
+ }
542
+
543
+ .connection-disconnect {
544
+ background: none;
545
+ border: none;
546
+ cursor: pointer;
547
+ padding: 2px;
548
+ border-radius: var(--radius-sm);
549
+ color: var(--text-secondary);
550
+ display: flex;
551
+ align-items: center;
552
+ justify-content: center;
553
+ width: 16px;
554
+ height: 16px;
555
+ font-size: 14px;
556
+ line-height: 1;
557
+ opacity: 0;
558
+ transition: all var(--transition-fast);
559
+ }
560
+
561
+ .connection-item:hover .connection-disconnect {
562
+ opacity: 1;
563
+ }
564
+
565
+ .connection-disconnect:hover {
566
+ background-color: rgba(0, 0, 0, 0.05);
567
+ color: var(--color-error);
568
+ }
569
+
570
+ [data-theme="dark"] .connection-disconnect:hover {
571
+ background-color: rgba(255, 255, 255, 0.1);
572
+ }
573
+
574
+ /* Tables Section */
575
+ .tables-section {
576
+ display: flex;
577
+ flex-direction: column;
578
+ flex: 1;
579
+ min-height: 0;
580
+ gap: var(--space-3);
581
+ }
582
+
221
583
  .sidebar-search-container {
222
584
  width: 100%;
223
585
  display: flex;
@@ -246,16 +608,37 @@ code {
246
608
  .table-count {
247
609
  background-color: var(--bg-elevated);
248
610
  color: var(--text-secondary);
249
- padding: var(--space-1) var(--space-2);
611
+ padding: 2px 6px;
250
612
  border-radius: var(--radius-full);
251
- font-size: var(--font-size-xs);
613
+ font-size: 10px;
252
614
  font-weight: var(--font-weight-medium);
615
+ margin-left: var(--space-2);
616
+ border: 1px solid var(--border-subtle);
253
617
  }
254
618
 
255
619
  .sidebar-content {
256
620
  flex: 1;
257
621
  overflow-y: auto;
258
- padding: var(--space-2) 0;
622
+ padding: 0;
623
+ scrollbar-width: thin;
624
+ scrollbar-color: var(--border-default) transparent;
625
+ }
626
+
627
+ .sidebar-content::-webkit-scrollbar {
628
+ width: 6px;
629
+ }
630
+
631
+ .sidebar-content::-webkit-scrollbar-track {
632
+ background: transparent;
633
+ }
634
+
635
+ .sidebar-content::-webkit-scrollbar-thumb {
636
+ background-color: var(--border-default);
637
+ border-radius: var(--radius-full);
638
+ }
639
+
640
+ .sidebar-content::-webkit-scrollbar-thumb:hover {
641
+ background-color: var(--border-subtle);
259
642
  }
260
643
 
261
644
  .table-list {
@@ -265,12 +648,14 @@ code {
265
648
  }
266
649
 
267
650
  .table-list li {
268
- padding: var(--space-2) var(--space-5);
651
+ padding: var(--space-2) var(--space-3);
269
652
  cursor: pointer;
270
653
  color: var(--text-primary);
271
654
  font-size: var(--font-size-sm);
272
655
  transition: background-color var(--transition-fast);
273
656
  border-left: 3px solid transparent;
657
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
658
+ margin-right: var(--space-2);
274
659
  }
275
660
 
276
661
  .table-list li:hover {
@@ -424,12 +809,23 @@ code {
424
809
  display: flex;
425
810
  justify-content: space-between;
426
811
  align-items: center;
812
+ background-color: var(--bg-base);
813
+ gap: var(--space-4);
427
814
  }
428
815
 
429
816
  .table-header-left {
430
817
  display: flex;
431
818
  align-items: center;
432
- gap: var(--space-3);
819
+ gap: var(--space-4);
820
+ flex: 1;
821
+ }
822
+
823
+ .table-header-actions {
824
+ display: flex;
825
+ align-items: center;
826
+ gap: var(--space-2);
827
+ padding-left: var(--space-4);
828
+ border-left: 1px solid var(--border-subtle);
433
829
  }
434
830
 
435
831
  .table-header h2 {
@@ -440,63 +836,168 @@ code {
440
836
  letter-spacing: -0.02em;
441
837
  }
442
838
 
443
- .refresh-button,
444
- .column-button {
445
- background: none;
446
- border: none;
839
+ .refresh-button {
840
+ background: var(--bg-elevated);
841
+ border: 1px solid var(--border-subtle);
447
842
  cursor: pointer;
448
- padding: var(--space-2);
449
- border-radius: var(--radius-sm);
843
+ padding: var(--space-2) var(--space-3);
844
+ border-radius: var(--radius-md);
450
845
  color: var(--text-secondary);
451
846
  transition: all var(--transition-fast);
452
847
  display: flex;
453
848
  align-items: center;
454
849
  justify-content: center;
455
- width: 32px;
456
- height: 32px;
850
+ gap: var(--space-2);
851
+ font-size: var(--font-size-sm);
852
+ font-weight: var(--font-weight-medium);
853
+ white-space: nowrap;
457
854
  }
458
855
 
459
- .refresh-button:hover,
460
- .column-button:hover {
856
+ .refresh-button:hover {
461
857
  background-color: var(--bg-hover);
858
+ border-color: var(--border-default);
462
859
  color: var(--text-primary);
463
860
  }
464
861
 
862
+ .refresh-button:active {
863
+ transform: scale(0.98);
864
+ }
865
+
866
+ .refresh-icon {
867
+ width: 16px;
868
+ height: 16px;
869
+ display: inline-block;
870
+ transition: transform var(--transition-base);
871
+ flex-shrink: 0;
872
+ }
873
+
874
+ .refresh-icon.spinning {
875
+ animation: spin 1s linear infinite;
876
+ }
877
+
878
+ .refresh-text {
879
+ display: inline-block;
880
+ }
881
+
465
882
  .column-button {
883
+ background: var(--bg-elevated);
884
+ border: 1px solid var(--border-subtle);
885
+ cursor: pointer;
466
886
  padding: var(--space-2) var(--space-3);
467
- width: auto;
468
- height: auto;
887
+ border-radius: var(--radius-md);
888
+ color: var(--text-secondary);
889
+ transition: all var(--transition-fast);
890
+ display: flex;
891
+ align-items: center;
892
+ justify-content: center;
893
+ gap: var(--space-2);
894
+ font-size: var(--font-size-sm);
895
+ font-weight: var(--font-weight-medium);
896
+ white-space: nowrap;
469
897
  }
470
898
 
471
- .column-label {
899
+ .column-button:hover {
900
+ background-color: var(--bg-hover);
901
+ border-color: var(--border-default);
902
+ color: var(--text-primary);
903
+ }
904
+
905
+ .column-icon {
906
+ width: 16px;
907
+ height: 16px;
908
+ display: inline-block;
909
+ flex-shrink: 0;
910
+ }
911
+
912
+ .limit-selector {
913
+ display: flex;
914
+ align-items: center;
915
+ }
916
+
917
+ .limit-select {
918
+ padding: var(--space-2) var(--space-3);
919
+ border: 1px solid var(--border-subtle);
920
+ border-radius: var(--radius-md);
472
921
  font-size: var(--font-size-sm);
473
922
  font-weight: var(--font-weight-medium);
923
+ background-color: var(--bg-elevated);
924
+ color: var(--text-primary);
925
+ cursor: pointer;
926
+ transition: all var(--transition-fast);
927
+ min-width: 100px;
928
+ appearance: none;
929
+ background-image: url("data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1.5L6 6.5L11 1.5' stroke='%2364748b' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
930
+ background-repeat: no-repeat;
931
+ background-position: right var(--space-2) center;
932
+ padding-right: var(--space-8);
474
933
  }
475
934
 
476
- .refresh-icon {
477
- font-size: 16px;
478
- line-height: 1;
479
- display: inline-block;
480
- transition: transform var(--transition-base);
935
+ [data-theme="dark"] .limit-select {
936
+ background-image: url("data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1.5L6 6.5L11 1.5' stroke='%23a3a3a3' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
481
937
  }
482
938
 
483
- .refresh-icon.spinning {
484
- animation: spin 1s linear;
939
+ .limit-select:hover {
940
+ border-color: var(--border-default);
941
+ background-color: var(--bg-hover);
942
+ }
943
+
944
+ .limit-select:focus {
945
+ outline: none;
946
+ border-color: var(--color-primary);
947
+ box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.1);
948
+ }
949
+
950
+ .column-label {
951
+ font-size: var(--font-size-sm);
952
+ font-weight: var(--font-weight-medium);
485
953
  }
486
954
 
487
955
  @keyframes spin {
488
956
  from {
489
957
  transform: rotate(0deg);
490
958
  }
959
+
491
960
  to {
492
961
  transform: rotate(360deg);
493
962
  }
494
963
  }
495
964
 
965
+ .row-info-container {
966
+ display: flex;
967
+ align-items: center;
968
+ padding-left: var(--space-4);
969
+ border-left: 1px solid var(--border-subtle);
970
+ }
971
+
496
972
  .row-info {
497
973
  color: var(--text-secondary);
498
974
  font-size: var(--font-size-sm);
499
975
  font-weight: var(--font-weight-normal);
976
+ display: flex;
977
+ align-items: center;
978
+ gap: var(--space-2);
979
+ white-space: nowrap;
980
+ }
981
+
982
+ .row-info-range {
983
+ color: var(--text-primary);
984
+ font-weight: var(--font-weight-semibold);
985
+ }
986
+
987
+ .row-info-separator {
988
+ color: var(--text-tertiary);
989
+ }
990
+
991
+ .row-info-total {
992
+ color: var(--text-primary);
993
+ font-weight: var(--font-weight-medium);
994
+ }
995
+
996
+ .row-info-approx {
997
+ color: var(--text-tertiary);
998
+ font-size: var(--font-size-xs);
999
+ font-style: italic;
1000
+ margin-left: var(--space-1);
500
1001
  }
501
1002
 
502
1003
  .table-container {
@@ -520,17 +1021,94 @@ thead {
520
1021
  z-index: 10;
521
1022
  }
522
1023
 
523
- th {
524
- padding: var(--space-3) var(--space-4);
525
- text-align: left;
526
- font-weight: var(--font-weight-semibold);
527
- color: var(--text-primary);
528
- border-bottom: 1px solid var(--border-subtle);
529
- white-space: nowrap;
530
- font-size: var(--font-size-xs);
531
- text-transform: uppercase;
532
- letter-spacing: 0.05em;
533
- position: relative;
1024
+ th {
1025
+ padding: var(--space-3) var(--space-4);
1026
+ text-align: left;
1027
+ font-weight: var(--font-weight-semibold);
1028
+ color: var(--text-primary);
1029
+ border-bottom: 1px solid var(--border-subtle);
1030
+ white-space: normal;
1031
+ font-size: var(--font-size-xs);
1032
+ letter-spacing: 0.05em;
1033
+ position: relative;
1034
+ vertical-align: bottom;
1035
+ }
1036
+
1037
+ .column-header {
1038
+ display: flex;
1039
+ flex-direction: column;
1040
+ gap: var(--space-1);
1041
+ min-height: 100%;
1042
+ }
1043
+
1044
+ .column-name-row {
1045
+ display: flex;
1046
+ align-items: center;
1047
+ gap: var(--space-1);
1048
+ line-height: 1.2;
1049
+ }
1050
+
1051
+ .column-name {
1052
+ line-height: 1.2;
1053
+ }
1054
+
1055
+ .key-badges {
1056
+ display: flex;
1057
+ align-items: center;
1058
+ gap: 2px;
1059
+ flex-shrink: 0;
1060
+ }
1061
+
1062
+ .key-badge {
1063
+ display: inline-block;
1064
+ padding: 2px 4px;
1065
+ font-size: 9px;
1066
+ font-weight: var(--font-weight-bold);
1067
+ border-radius: 3px;
1068
+ line-height: 1;
1069
+ text-transform: uppercase;
1070
+ letter-spacing: 0.05em;
1071
+ white-space: nowrap;
1072
+ }
1073
+
1074
+ .key-badge-pk {
1075
+ background-color: #3b82f6;
1076
+ color: #ffffff;
1077
+ }
1078
+
1079
+ [data-theme="dark"] .key-badge-pk {
1080
+ background-color: #60a5fa;
1081
+ color: #0f172a;
1082
+ }
1083
+
1084
+ .key-badge-fk {
1085
+ background-color: #f59e0b;
1086
+ color: #ffffff;
1087
+ }
1088
+
1089
+ [data-theme="dark"] .key-badge-fk {
1090
+ background-color: #fbbf24;
1091
+ color: #0f172a;
1092
+ }
1093
+
1094
+ .key-badge-uq {
1095
+ background-color: #10b981;
1096
+ color: #ffffff;
1097
+ }
1098
+
1099
+ [data-theme="dark"] .key-badge-uq {
1100
+ background-color: #34d399;
1101
+ color: #0f172a;
1102
+ }
1103
+
1104
+ .column-datatype {
1105
+ font-size: 10px;
1106
+ font-weight: var(--font-weight-normal);
1107
+ color: var(--text-secondary);
1108
+ text-transform: none;
1109
+ letter-spacing: 0;
1110
+ line-height: 1.2;
1111
+ opacity: 0.8;
534
1112
  }
535
1113
 
536
1114
  th.resizable {
@@ -591,9 +1169,10 @@ td {
591
1169
  padding: var(--space-3) var(--space-4);
592
1170
  border-bottom: 1px solid var(--border-subtle);
593
1171
  color: var(--text-primary);
594
- word-break: break-word;
1172
+ white-space: nowrap;
595
1173
  overflow: hidden;
596
1174
  text-overflow: ellipsis;
1175
+ max-width: 200px;
597
1176
  }
598
1177
 
599
1178
  tr:hover {
@@ -605,6 +1184,200 @@ tr:hover {
605
1184
  font-style: italic;
606
1185
  }
607
1186
 
1187
+ .json-value {
1188
+ margin: 0;
1189
+ padding: 0;
1190
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas,
1191
+ "Courier New", monospace;
1192
+ font-size: var(--font-size-xs);
1193
+ line-height: 1.4;
1194
+ color: var(--text-primary);
1195
+ white-space: nowrap;
1196
+ overflow: hidden;
1197
+ text-overflow: ellipsis;
1198
+ max-width: 100%;
1199
+ }
1200
+
1201
+ /* JSON value in popup - preserve formatting */
1202
+ .json-value-popup {
1203
+ white-space: pre-wrap;
1204
+ word-break: break-word;
1205
+ overflow-wrap: break-word;
1206
+ }
1207
+
1208
+ /* Cell Content Popup Dialog */
1209
+ .cell-popup-overlay {
1210
+ position: fixed;
1211
+ top: 0;
1212
+ left: 0;
1213
+ right: 0;
1214
+ bottom: 0;
1215
+ background-color: rgba(0, 0, 0, 0.5);
1216
+ z-index: 10000;
1217
+ display: flex;
1218
+ align-items: center;
1219
+ justify-content: center;
1220
+ padding: var(--space-4);
1221
+ animation: fadeIn var(--transition-base);
1222
+ }
1223
+
1224
+ [data-theme="dark"] .cell-popup-overlay {
1225
+ background-color: rgba(0, 0, 0, 0.7);
1226
+ }
1227
+
1228
+ @keyframes fadeIn {
1229
+ from {
1230
+ opacity: 0;
1231
+ }
1232
+
1233
+ to {
1234
+ opacity: 1;
1235
+ }
1236
+ }
1237
+
1238
+ .cell-popup-dialog {
1239
+ background-color: var(--bg-base);
1240
+ border-radius: var(--radius-lg);
1241
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
1242
+ max-width: 90vw;
1243
+ max-height: 90vh;
1244
+ width: 600px;
1245
+ display: flex;
1246
+ flex-direction: column;
1247
+ animation: slideUp var(--transition-base);
1248
+ border: 1px solid var(--border-subtle);
1249
+ }
1250
+
1251
+ [data-theme="dark"] .cell-popup-dialog {
1252
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
1253
+ }
1254
+
1255
+ @keyframes slideUp {
1256
+ from {
1257
+ transform: translateY(20px);
1258
+ opacity: 0;
1259
+ }
1260
+
1261
+ to {
1262
+ transform: translateY(0);
1263
+ opacity: 1;
1264
+ }
1265
+ }
1266
+
1267
+ .cell-popup-header {
1268
+ padding: var(--space-4) var(--space-6);
1269
+ border-bottom: 1px solid var(--border-subtle);
1270
+ display: flex;
1271
+ align-items: center;
1272
+ justify-content: space-between;
1273
+ background-color: var(--bg-elevated);
1274
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
1275
+ }
1276
+
1277
+ .cell-popup-title {
1278
+ font-size: var(--font-size-lg);
1279
+ font-weight: var(--font-weight-semibold);
1280
+ color: var(--text-primary);
1281
+ margin: 0;
1282
+ flex: 1;
1283
+ }
1284
+
1285
+ .cell-popup-actions {
1286
+ display: flex;
1287
+ align-items: center;
1288
+ gap: var(--space-2);
1289
+ }
1290
+
1291
+ .cell-popup-timezone {
1292
+ padding: var(--space-2) var(--space-3);
1293
+ font-size: var(--font-size-sm);
1294
+ font-family: inherit;
1295
+ color: var(--text-primary);
1296
+ background-color: var(--bg-base);
1297
+ border: 1px solid var(--border-subtle);
1298
+ border-radius: var(--radius-sm);
1299
+ cursor: pointer;
1300
+ transition: all var(--transition-fast);
1301
+ min-width: 200px;
1302
+ }
1303
+
1304
+ .cell-popup-timezone:hover {
1305
+ border-color: var(--border-default);
1306
+ background-color: var(--bg-hover);
1307
+ }
1308
+
1309
+ .cell-popup-timezone:focus {
1310
+ outline: none;
1311
+ border-color: var(--color-primary);
1312
+ box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.1);
1313
+ }
1314
+
1315
+ .cell-popup-copy,
1316
+ .cell-popup-close {
1317
+ background: none;
1318
+ border: none;
1319
+ cursor: pointer;
1320
+ padding: var(--space-2);
1321
+ color: var(--text-secondary);
1322
+ font-size: var(--font-size-xl);
1323
+ line-height: 1;
1324
+ border-radius: var(--radius-sm);
1325
+ transition: all var(--transition-fast);
1326
+ display: flex;
1327
+ align-items: center;
1328
+ justify-content: center;
1329
+ width: 32px;
1330
+ height: 32px;
1331
+ }
1332
+
1333
+ .cell-popup-copy:hover,
1334
+ .cell-popup-close:hover {
1335
+ background-color: var(--bg-hover);
1336
+ color: var(--text-primary);
1337
+ }
1338
+
1339
+ .cell-popup-copy.copied {
1340
+ color: var(--color-success);
1341
+ background-color: var(--bg-hover);
1342
+ }
1343
+
1344
+ .cell-popup-body {
1345
+ padding: var(--space-6);
1346
+ overflow-y: auto;
1347
+ flex: 1;
1348
+ min-height: 0;
1349
+ }
1350
+
1351
+ .cell-popup-content {
1352
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas,
1353
+ "Courier New", monospace;
1354
+ font-size: var(--font-size-sm);
1355
+ line-height: 1.6;
1356
+ color: var(--text-primary);
1357
+ white-space: pre-wrap;
1358
+ word-break: break-word;
1359
+ overflow-wrap: break-word;
1360
+ background-color: var(--bg-elevated);
1361
+ padding: var(--space-4);
1362
+ border-radius: var(--radius-md);
1363
+ border: 1px solid var(--border-subtle);
1364
+ max-height: 60vh;
1365
+ overflow-y: auto;
1366
+ }
1367
+
1368
+ .cell-popup-content.null-content {
1369
+ color: var(--text-tertiary);
1370
+ font-style: italic;
1371
+ font-family: inherit;
1372
+ }
1373
+
1374
+ .cell-popup-content.datetime-value-popup {
1375
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas,
1376
+ "Courier New", monospace;
1377
+ line-height: 1.8;
1378
+ white-space: pre-wrap;
1379
+ }
1380
+
608
1381
  .column-selector {
609
1382
  position: relative;
610
1383
  }
@@ -632,6 +1405,33 @@ tr:hover {
632
1405
  color: var(--text-primary);
633
1406
  border-bottom: 1px solid var(--border-subtle);
634
1407
  background-color: var(--bg-elevated);
1408
+ display: flex;
1409
+ align-items: center;
1410
+ justify-content: space-between;
1411
+ gap: var(--space-3);
1412
+ }
1413
+
1414
+ .column-menu-header-title {
1415
+ flex: 1;
1416
+ }
1417
+
1418
+ .column-select-all-button {
1419
+ padding: var(--space-1) var(--space-3);
1420
+ font-size: var(--font-size-xs);
1421
+ font-weight: var(--font-weight-medium);
1422
+ color: var(--color-primary);
1423
+ background-color: transparent;
1424
+ border: 1px solid var(--border-subtle);
1425
+ border-radius: var(--radius-sm);
1426
+ cursor: pointer;
1427
+ transition: all var(--transition-fast);
1428
+ white-space: nowrap;
1429
+ }
1430
+
1431
+ .column-select-all-button:hover {
1432
+ background-color: var(--bg-hover);
1433
+ border-color: var(--color-primary);
1434
+ color: var(--color-primary);
635
1435
  }
636
1436
 
637
1437
  .column-menu-options {
@@ -669,27 +1469,49 @@ tr:hover {
669
1469
  display: flex;
670
1470
  justify-content: center;
671
1471
  align-items: center;
672
- gap: var(--space-5);
673
- padding: var(--space-5) var(--space-6);
1472
+ padding: var(--space-4) var(--space-6);
674
1473
  border-top: 1px solid var(--border-subtle);
675
- background-color: var(--bg-base);
1474
+ background-color: var(--bg-elevated);
1475
+ }
1476
+
1477
+ .pagination-content {
1478
+ display: flex;
1479
+ align-items: center;
1480
+ gap: var(--space-4);
1481
+ width: 100%;
1482
+ max-width: 800px;
1483
+ justify-content: space-between;
676
1484
  }
677
1485
 
678
1486
  .pagination-button {
1487
+ display: flex;
1488
+ align-items: center;
1489
+ justify-content: center;
1490
+ gap: var(--space-2);
679
1491
  padding: var(--space-2) var(--space-4);
680
1492
  font-size: var(--font-size-sm);
681
1493
  font-weight: var(--font-weight-medium);
682
- color: var(--color-primary);
1494
+ color: var(--text-primary);
683
1495
  background-color: var(--bg-base);
684
1496
  border: 1px solid var(--border-subtle);
685
- border-radius: var(--radius-sm);
1497
+ border-radius: var(--radius-md);
686
1498
  cursor: pointer;
687
1499
  transition: all var(--transition-fast);
1500
+ white-space: nowrap;
1501
+ min-width: 100px;
688
1502
  }
689
1503
 
690
1504
  .pagination-button:hover:not(:disabled) {
691
1505
  background-color: var(--bg-hover);
692
- border-color: var(--color-primary);
1506
+ border-color: var(--border-default);
1507
+ color: var(--color-primary);
1508
+ transform: translateY(-1px);
1509
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
1510
+ }
1511
+
1512
+ .pagination-button:active:not(:disabled) {
1513
+ transform: translateY(0);
1514
+ box-shadow: none;
693
1515
  }
694
1516
 
695
1517
  .pagination-button:disabled {
@@ -697,13 +1519,82 @@ tr:hover {
697
1519
  border-color: var(--border-subtle);
698
1520
  cursor: not-allowed;
699
1521
  background-color: var(--bg-elevated);
700
- opacity: 0.6;
1522
+ opacity: 0.5;
1523
+ }
1524
+
1525
+ .pagination-icon {
1526
+ width: 16px;
1527
+ height: 16px;
1528
+ flex-shrink: 0;
1529
+ transition: transform var(--transition-fast);
1530
+ }
1531
+
1532
+ .pagination-button-prev:hover:not(:disabled) .pagination-icon {
1533
+ transform: translateX(-2px);
1534
+ }
1535
+
1536
+ .pagination-button-next:hover:not(:disabled) .pagination-icon {
1537
+ transform: translateX(2px);
1538
+ }
1539
+
1540
+ .pagination-info-container {
1541
+ display: flex;
1542
+ align-items: center;
1543
+ justify-content: center;
1544
+ flex: 1;
1545
+ min-width: 0;
701
1546
  }
702
1547
 
703
1548
  .pagination-info {
1549
+ display: flex;
1550
+ align-items: center;
1551
+ gap: var(--space-3);
704
1552
  color: var(--text-secondary);
705
1553
  font-size: var(--font-size-sm);
706
1554
  font-weight: var(--font-weight-normal);
1555
+ white-space: nowrap;
1556
+ }
1557
+
1558
+ .pagination-page {
1559
+ display: flex;
1560
+ align-items: center;
1561
+ gap: var(--space-1);
1562
+ }
1563
+
1564
+ .pagination-page strong {
1565
+ color: var(--text-primary);
1566
+ font-weight: var(--font-weight-semibold);
1567
+ }
1568
+
1569
+ .pagination-separator {
1570
+ color: var(--text-tertiary);
1571
+ font-weight: var(--font-weight-normal);
1572
+ }
1573
+
1574
+ .pagination-rows {
1575
+ color: var(--text-secondary);
1576
+ }
1577
+
1578
+ @media (max-width: 640px) {
1579
+ .pagination-content {
1580
+ flex-direction: column;
1581
+ gap: var(--space-3);
1582
+ }
1583
+
1584
+ .pagination-button {
1585
+ width: 100%;
1586
+ max-width: 200px;
1587
+ }
1588
+
1589
+ .pagination-info {
1590
+ flex-direction: column;
1591
+ gap: var(--space-1);
1592
+ text-align: center;
1593
+ }
1594
+
1595
+ .pagination-separator {
1596
+ display: none;
1597
+ }
707
1598
  }
708
1599
 
709
1600
  .theme-selector {
@@ -799,3 +1690,43 @@ tr:hover {
799
1690
  .error-state {
800
1691
  color: var(--color-error);
801
1692
  }
1693
+
1694
+ /* Loading Overlay */
1695
+ .loading-overlay {
1696
+ position: fixed;
1697
+ top: 0;
1698
+ left: 0;
1699
+ right: 0;
1700
+ bottom: 0;
1701
+ background-color: rgba(255, 255, 255, 0.5);
1702
+ /* Semi-transparent */
1703
+ z-index: 2000;
1704
+ /* Higher than connection dialog */
1705
+ display: flex;
1706
+ align-items: center;
1707
+ justify-content: center;
1708
+ backdrop-filter: blur(2px);
1709
+ }
1710
+
1711
+ html[data-theme="dark"] .loading-overlay {
1712
+ background-color: rgba(0, 0, 0, 0.5);
1713
+ }
1714
+
1715
+ .loading-spinner {
1716
+ width: 40px;
1717
+ height: 40px;
1718
+ border: 4px solid var(--border-subtle);
1719
+ border-top: 4px solid var(--color-primary);
1720
+ border-radius: 50%;
1721
+ animation: spin 1s linear infinite;
1722
+ }
1723
+
1724
+ @keyframes spin {
1725
+ 0% {
1726
+ transform: rotate(0deg);
1727
+ }
1728
+
1729
+ 100% {
1730
+ transform: rotate(360deg);
1731
+ }
1732
+ }