pglens 1.1.0 → 2.0.1

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 {
@@ -728,6 +1229,7 @@ tr:hover {
728
1229
  from {
729
1230
  opacity: 0;
730
1231
  }
1232
+
731
1233
  to {
732
1234
  opacity: 1;
733
1235
  }
@@ -755,6 +1257,7 @@ tr:hover {
755
1257
  transform: translateY(20px);
756
1258
  opacity: 0;
757
1259
  }
1260
+
758
1261
  to {
759
1262
  transform: translateY(0);
760
1263
  opacity: 1;
@@ -966,27 +1469,49 @@ tr:hover {
966
1469
  display: flex;
967
1470
  justify-content: center;
968
1471
  align-items: center;
969
- gap: var(--space-5);
970
- padding: var(--space-5) var(--space-6);
1472
+ padding: var(--space-4) var(--space-6);
971
1473
  border-top: 1px solid var(--border-subtle);
972
- 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;
973
1484
  }
974
1485
 
975
1486
  .pagination-button {
1487
+ display: flex;
1488
+ align-items: center;
1489
+ justify-content: center;
1490
+ gap: var(--space-2);
976
1491
  padding: var(--space-2) var(--space-4);
977
1492
  font-size: var(--font-size-sm);
978
1493
  font-weight: var(--font-weight-medium);
979
- color: var(--color-primary);
1494
+ color: var(--text-primary);
980
1495
  background-color: var(--bg-base);
981
1496
  border: 1px solid var(--border-subtle);
982
- border-radius: var(--radius-sm);
1497
+ border-radius: var(--radius-md);
983
1498
  cursor: pointer;
984
1499
  transition: all var(--transition-fast);
1500
+ white-space: nowrap;
1501
+ min-width: 100px;
985
1502
  }
986
1503
 
987
1504
  .pagination-button:hover:not(:disabled) {
988
1505
  background-color: var(--bg-hover);
989
- 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;
990
1515
  }
991
1516
 
992
1517
  .pagination-button:disabled {
@@ -994,13 +1519,82 @@ tr:hover {
994
1519
  border-color: var(--border-subtle);
995
1520
  cursor: not-allowed;
996
1521
  background-color: var(--bg-elevated);
997
- 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;
998
1546
  }
999
1547
 
1000
1548
  .pagination-info {
1549
+ display: flex;
1550
+ align-items: center;
1551
+ gap: var(--space-3);
1001
1552
  color: var(--text-secondary);
1002
1553
  font-size: var(--font-size-sm);
1003
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
+ }
1004
1598
  }
1005
1599
 
1006
1600
  .theme-selector {
@@ -1096,3 +1690,43 @@ tr:hover {
1096
1690
  .error-state {
1097
1691
  color: var(--color-error);
1098
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
+ }