dbviewer 0.3.16 → 0.4.2

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.
@@ -23,15 +23,31 @@
23
23
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
24
24
  <!-- Bootstrap Icons -->
25
25
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
26
+ <!-- Google Fonts -->
27
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap">
26
28
  <!-- Chart.js for Data Visualization -->
27
29
  <script src="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js"></script>
28
30
 
29
31
  <style>
32
+ /* Base styles and typography */
33
+ body {
34
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
35
+ font-size: 0.95rem;
36
+ line-height: 1.5;
37
+ letter-spacing: -0.01em;
38
+ }
39
+
40
+ h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
41
+ font-weight: 600;
42
+ letter-spacing: -0.02em;
43
+ line-height: 1.25;
44
+ }
45
+
30
46
  /* Core layout styles */
31
47
  .dbviewer-wrapper { display: flex; flex-direction: column; min-height: 100vh; }
32
- .dbviewer-navbar { height: 56px; }
33
- .dbviewer-navbar-spacer { height: 56px; } /* Creates space for the fixed navbar */
34
- .dbviewer-content { display: flex; flex: 1; min-height: calc(100vh - 56px); padding-top: 0; }
48
+ .dbviewer-navbar { height: 60px; }
49
+ .dbviewer-navbar-spacer { height: 60px; } /* Creates space for the fixed navbar */
50
+ .dbviewer-content { display: flex; flex: 1; min-height: calc(100vh - 60px); padding-top: 0; }
35
51
 
36
52
  /* Smooth theme transitions */
37
53
  html {
@@ -51,47 +67,49 @@
51
67
  transition: color 0.2s ease, background-color 0.2s ease;
52
68
  }
53
69
 
54
- /* Sidebar styles */
70
+ /* Sidebar styles - enhanced for elegance */
55
71
  .dbviewer-sidebar {
56
72
  width: 260px;
57
- height: calc(100vh - 56px);
73
+ height: calc(100vh - 60px);
58
74
  position: fixed;
59
- top: 56px; /* Positioned right below the fixed navbar */
75
+ top: 60px; /* Positioned right below the fixed navbar */
60
76
  left: 0;
61
77
  z-index: 1000;
62
78
  display: flex;
63
79
  flex-direction: column;
64
- transition: transform 0.3s ease, background-color 0.2s ease, border-color 0.2s ease;
80
+ transition: transform 0.3s ease-in-out, background-color 0.2s ease, border-color 0.2s ease;
65
81
  overflow: hidden; /* Changed from overflow-y: auto */
82
+ box-shadow: 3px 0 20px rgba(0, 0, 0, 0.05);
66
83
  }
67
84
 
68
85
  /* Dark mode overrides */
69
86
  [data-bs-theme="light"] .dbviewer-sidebar {
70
- background: #f8f9fa;
71
- border-right: 1px solid #dee2e6;
87
+ background: #ffffff;
88
+ border-right: 1px solid rgba(222, 226, 230, 0.6);
72
89
  }
73
90
 
74
91
  [data-bs-theme="dark"] .dbviewer-sidebar {
75
- background: #212529;
76
- border-right: 1px solid #495057;
92
+ background: #1a1d20;
93
+ border-right: 1px solid rgba(73, 80, 87, 0.3);
77
94
  }
78
95
 
79
96
  .dbviewer-sidebar-header {
80
- padding: 1rem 1.25rem;
81
- font-weight: 500;
97
+ padding: 1.2rem 1.25rem;
98
+ font-weight: 600;
82
99
  align-items: center;
83
100
  justify-content: space-between;
84
101
  flex-shrink: 0;
102
+ display: flex;
85
103
  }
86
104
 
87
105
  [data-bs-theme="light"] .dbviewer-sidebar-header {
88
- border-bottom: 1px solid #dee2e6;
89
- background: #f1f3f5;
106
+ border-bottom: 1px solid rgba(222, 226, 230, 0.6);
107
+ background: linear-gradient(to right, #f8f9fa, #f1f3f5);
90
108
  }
91
109
 
92
110
  [data-bs-theme="dark"] .dbviewer-sidebar-header {
93
- border-bottom: 1px solid #495057;
94
- background: #343a40;
111
+ border-bottom: 1px solid rgba(73, 80, 87, 0.3);
112
+ background: linear-gradient(to right, #343a40, #2c3034);
95
113
  }
96
114
 
97
115
  .dbviewer-sidebar-header h5 {
@@ -132,15 +150,35 @@
132
150
  }
133
151
 
134
152
  [data-bs-theme="dark"] .dbviewer-sidebar-top {
135
- background: #212529;
136
- border-bottom: 1px solid #495057;
153
+ background: #1a1d20;
154
+ border-bottom: 1px solid rgba(73, 80, 87, 0.3);
137
155
  }
138
156
 
139
157
  .dbviewer-sidebar-content {
140
158
  flex: 1;
141
159
  overflow-y: auto;
142
- padding: 0;
160
+ padding: 0.5rem 0;
143
161
  height: 100%;
162
+ /* Improved scrollbar */
163
+ scrollbar-width: thin;
164
+ scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
165
+ }
166
+
167
+ .dbviewer-sidebar-content::-webkit-scrollbar {
168
+ width: 4px;
169
+ }
170
+
171
+ .dbviewer-sidebar-content::-webkit-scrollbar-track {
172
+ background: transparent;
173
+ }
174
+
175
+ .dbviewer-sidebar-content::-webkit-scrollbar-thumb {
176
+ background-color: rgba(0, 0, 0, 0.2);
177
+ border-radius: 6px;
178
+ }
179
+
180
+ [data-bs-theme="dark"] .dbviewer-sidebar-content::-webkit-scrollbar-thumb {
181
+ background-color: rgba(255, 255, 255, 0.2);
144
182
  }
145
183
 
146
184
  .dbviewer-main {
@@ -149,34 +187,55 @@
149
187
  padding: 2rem 2.5rem;
150
188
  padding-top: 1.5rem; /* Adjusted for fixed header */
151
189
  min-width: 0;
190
+ animation: fadeIn 0.5s ease-in-out;
191
+ transition: all 0.3s ease;
192
+ background: var(--bs-body-bg);
152
193
  }
153
194
 
154
- /* Mobile responsiveness */
195
+ @keyframes fadeIn {
196
+ from { opacity: 0.6; }
197
+ to { opacity: 1; }
198
+ }
199
+
200
+ /* Enhanced mobile responsiveness with smooth animations */
155
201
  @media (max-width: 991.98px) {
156
- .dbviewer-sidebar { transform: translateX(-100%); }
157
- .dbviewer-sidebar.active { transform: translateX(0); box-shadow: 5px 0 15px rgba(0,0,0,0.1); }
158
- .dbviewer-main { margin-left: 0; padding: 1rem; }
202
+ .dbviewer-sidebar {
203
+ transform: translateX(-100%);
204
+ box-shadow: none;
205
+ transition: transform 0.3s cubic-bezier(0.165, 0.84, 0.44, 1);
206
+ }
207
+
208
+ .dbviewer-sidebar.active {
209
+ transform: translateX(0);
210
+ box-shadow: 5px 0 20px rgba(0, 0, 0, 0.15);
211
+ }
159
212
 
160
- /* Overlay for mobile sidebar */
213
+ .dbviewer-main {
214
+ margin-left: 0;
215
+ padding: 1.25rem;
216
+ transition: padding 0.3s ease;
217
+ }
218
+
219
+ /* Improved overlay for mobile sidebar */
161
220
  .dbviewer-sidebar-overlay {
162
221
  position: fixed;
163
- top: 56px; /* Start below the fixed navbar */
222
+ top: 60px; /* Start below the fixed navbar */
164
223
  left: 0;
165
224
  right: 0;
166
225
  bottom: 0;
167
- background: rgba(0,0,0,0.5);
226
+ backdrop-filter: blur(2px);
168
227
  z-index: 999;
169
228
  opacity: 0;
170
229
  visibility: hidden;
171
- transition: opacity 0.3s, visibility 0.3s;
230
+ transition: all 0.3s cubic-bezier(0.165, 0.84, 0.44, 1);
172
231
  }
173
232
 
174
233
  [data-bs-theme="light"] .dbviewer-sidebar-overlay {
175
- background: rgba(0,0,0,0.5);
234
+ background: rgba(0,0,0,0.3);
176
235
  }
177
236
 
178
237
  [data-bs-theme="dark"] .dbviewer-sidebar-overlay {
179
- background: rgba(0,0,0,0.7);
238
+ background: rgba(0,0,0,0.5);
180
239
  }
181
240
 
182
241
  .dbviewer-sidebar-overlay.active {
@@ -184,54 +243,241 @@
184
243
  visibility: visible;
185
244
  }
186
245
 
246
+ /* Toggle button styling */
247
+ .dbviewer-sidebar-toggle {
248
+ border-radius: 8px;
249
+ padding: 0.4rem 0.8rem;
250
+ box-shadow: 0 2px 5px rgba(0,0,0,0.1);
251
+ border: none;
252
+ background: var(--bs-primary);
253
+ color: white;
254
+ font-weight: 500;
255
+ transition: all 0.2s ease;
256
+ }
257
+
258
+ .dbviewer-sidebar-toggle:hover {
259
+ transform: translateY(-1px);
260
+ box-shadow: 0 4px 8px rgba(0,0,0,0.15);
261
+ }
262
+
187
263
  body.dbviewer-sidebar-open {
188
264
  overflow: hidden;
189
265
  }
190
266
  }
191
267
 
192
268
  @media (max-width: 767.98px) {
193
- .dbviewer-sidebar { width: 210px; }
194
- .dbviewer-main { padding: 0.75rem; }
269
+ .dbviewer-sidebar { width: 230px; }
270
+ .dbviewer-main { padding: 1rem; }
195
271
  .dbviewer-sidebar-header h5 { max-width: 70%; font-size: 1rem; }
272
+
273
+ /* Make tables more responsive */
274
+ .table-responsive {
275
+ overflow-x: auto;
276
+ -webkit-overflow-scrolling: touch;
277
+ }
278
+
279
+ .stat-card-bg {
280
+ margin-bottom: 1rem;
281
+ }
282
+ }
283
+
284
+ /* Extra small screens */
285
+ @media (max-width: 575.98px) {
286
+ .dbviewer-main { padding: 0.75rem; }
287
+ h1, .h1 { font-size: 1.6rem; }
288
+ h2, .h2 { font-size: 1.4rem; }
289
+ h3, .h3 { font-size: 1.2rem; }
290
+
291
+ .btn-sm {
292
+ font-size: 0.8rem;
293
+ }
294
+
295
+ .card-body {
296
+ padding: 1rem;
297
+ }
298
+ }
299
+
300
+ /* Table filter input - enhanced */
301
+ .dbviewer-table-filter-container {
302
+ position: relative;
303
+ padding: 0.75rem 1rem;
304
+ margin-bottom: 0.5rem;
305
+ transition: background-color 0.2s ease;
306
+ }
307
+
308
+ .dbviewer-table-filter-icon {
309
+ position: absolute;
310
+ left: 1.5rem;
311
+ top: 50%;
312
+ transform: translateY(-50%);
313
+ color: #6c757d;
314
+ font-size: 0.85rem;
315
+ padding: 0.25rem;
316
+ width: 1.5rem;
317
+ text-align: center;
318
+ z-index: 2;
319
+ transition: color 0.2s ease;
320
+ }
321
+
322
+ .dbviewer-table-filter {
323
+ border-radius: 8px;
324
+ padding: 0.65rem 0.85rem 0.65rem 2.5rem;
325
+ margin-bottom: 1rem;
326
+ transition: all 0.2s ease;
327
+ border: 1px solid rgba(0, 0, 0, 0.1);
328
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05);
329
+ font-size: 0.9rem;
330
+ }
331
+
332
+ .dbviewer-table-filter:focus {
333
+ box-shadow: 0 0 0 3px rgba(13, 110, 253, 0.15);
334
+ border-color: #86b7fe;
335
+ }
336
+
337
+ [data-bs-theme="dark"] .dbviewer-table-filter {
338
+ background: rgba(255, 255, 255, 0.05);
339
+ border-color: rgba(255, 255, 255, 0.1);
196
340
  }
197
341
 
198
- /* Table filter input */
199
- .dbviewer-table-filter-container { position: relative; padding: 0.5rem 1rem; margin-bottom: 0.25rem; }
200
- .dbviewer-table-filter-icon { position: absolute; left: 1.25rem; top: 50%; transform: translateY(-50%); color: #6c757d; font-size: 0.85rem; padding: 0.25rem; width: 1.5rem; text-align: center; }
201
- .dbviewer-table-filter { border-radius: 20px; padding-left: 2.5rem; margin-bottom: 1rem; }
342
+ [data-bs-theme="dark"] .dbviewer-table-filter:focus {
343
+ border-color: rgba(134, 183, 254, 0.7);
344
+ }
202
345
 
203
346
  /* Table structure and visualization components */
204
- .dbviewer-card { box-shadow: 0 0.125rem 0.25rem rgba(0,0,0,0.075); }
347
+ .dbviewer-card {
348
+ border-radius: 0.5rem;
349
+ transition: all 0.2s ease;
350
+ overflow: hidden;
351
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06), 0 1px 4px rgba(0, 0, 0, 0.08);
352
+ height: 100%;
353
+ }
354
+
355
+ .dbviewer-card:hover {
356
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08), 0 1px 6px rgba(0, 0, 0, 0.1);
357
+ transform: translateY(-2px);
358
+ }
359
+
360
+ /* Improved card headers */
361
+ .dbviewer-card .card-header {
362
+ font-weight: 600;
363
+ padding: 1rem 1.25rem;
364
+ border-bottom-width: 1px;
365
+ }
366
+
367
+ /* Card body padding */
368
+ .dbviewer-card .card-body {
369
+ padding: 1.25rem;
370
+ }
205
371
 
206
372
  [data-bs-theme="light"] .dbviewer-card {
207
- border: 1px solid #eaeaea;
373
+ border: none;
374
+ background: #ffffff;
208
375
  }
209
376
 
210
377
  [data-bs-theme="dark"] .dbviewer-card {
211
- border: 1px solid #495057;
378
+ border: none;
379
+ background: #212529;
212
380
  }
213
381
 
214
- .dbviewer-scrollable { max-height: 700px; overflow-y: auto; }
215
- .dbviewer-scrollable thead { position: sticky; top: 0; z-index: 1; }
382
+ .dbviewer-scrollable {
383
+ max-height: 700px;
384
+ overflow-y: auto;
385
+ scrollbar-width: thin;
386
+ scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
387
+ }
388
+
389
+ .dbviewer-scrollable::-webkit-scrollbar {
390
+ width: 5px;
391
+ height: 8px;
392
+ }
393
+
394
+ .dbviewer-scrollable::-webkit-scrollbar-track {
395
+ background: transparent;
396
+ }
397
+
398
+ .dbviewer-scrollable::-webkit-scrollbar-thumb {
399
+ background-color: rgba(0, 0, 0, 0.2);
400
+ border-radius: 10px;
401
+ }
402
+
403
+ [data-bs-theme="dark"] .dbviewer-scrollable::-webkit-scrollbar-thumb {
404
+ background-color: rgba(255, 255, 255, 0.2);
405
+ }
406
+
407
+ .dbviewer-scrollable thead {
408
+ position: sticky;
409
+ top: 0;
410
+ z-index: 1;
411
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
412
+ width: 100%;
413
+ }
414
+
415
+ /* Ensure the scrollable table headers have solid backgrounds */
416
+ [data-bs-theme="light"] .dbviewer-scrollable thead {
417
+ background-color: #f1f3f5;
418
+ }
419
+
420
+ [data-bs-theme="dark"] .dbviewer-scrollable thead {
421
+ background-color: #343a40;
422
+ }
423
+
424
+ /* Ensure individual th cells also have proper background */
425
+ .dbviewer-scrollable thead th {
426
+ background-color: transparent;
427
+ }
428
+
429
+ /* Specific fix for sticky table headers to ensure solid backgrounds */
430
+ .table-responsive .table thead,
431
+ .dbviewer-scrollable .table thead {
432
+ position: sticky;
433
+ top: 0;
434
+ z-index: 40;
435
+ }
436
+
437
+ /* Additional specificity for table headers in dark mode */
438
+ [data-bs-theme="light"] .table-responsive .table thead th,
439
+ [data-bs-theme="light"] .dbviewer-scrollable .table thead th {
440
+ background-color: #f1f3f5;
441
+ }
442
+
443
+ [data-bs-theme="dark"] .table-responsive .table thead th,
444
+ [data-bs-theme="dark"] .dbviewer-scrollable .table thead th {
445
+ background-color: #343a40;
446
+ }
447
+
448
+ /* Ensure borders appear properly with sticky headers */
449
+ .table thead th {
450
+ box-shadow: inset 0 1px 0 var(--bs-border-color),
451
+ inset 0 -1px 0 var(--bs-border-color);
452
+ }
453
+
454
+ /* Enhanced badge styling */
455
+ .badge {
456
+ font-weight: 500;
457
+ padding: 0.4em 0.6em;
458
+ border-radius: 6px;
459
+ letter-spacing: 0.01em;
460
+ font-size: 0.75em;
461
+ text-transform: none;
462
+ }
216
463
 
217
- /* Badge styling for dark mode */
218
464
  [data-bs-theme="dark"] .bg-secondary-subtle {
219
465
  background-color: rgba(255, 255, 255, 0.15) !important;
220
- color: #e9ecef !important;
466
+ color: #f8f9fa !important;
221
467
  }
222
468
 
223
469
  [data-bs-theme="light"] .bg-secondary-subtle {
224
470
  background-color: #e9ecef !important;
225
- color: #212529 !important;
471
+ color: #495057 !important;
226
472
  }
227
473
 
228
474
  /* Table header styling */
229
475
  .dbviewer-table-header {
230
- background-color: rgba(0, 0, 0, 0.05);
476
+ background-color: #f1f3f5;
231
477
  }
232
478
 
233
479
  [data-bs-theme="dark"] .dbviewer-table-header {
234
- background-color: rgba(255, 255, 255, 0.05);
480
+ background-color: #343a40;
235
481
  }
236
482
 
237
483
  /* List group styling for dark mode */
@@ -244,7 +490,7 @@
244
490
  [data-bs-theme="dark"] .dbviewer-table-header {
245
491
  position: sticky;
246
492
  top: 0;
247
- background: #212529;
493
+ background: #343a40;
248
494
  z-index: 1;
249
495
  }
250
496
 
@@ -269,26 +515,32 @@
269
515
  box-shadow: 0 1px 2px rgba(0,0,0,0.2);
270
516
  }
271
517
 
272
- /* Dark mode toggle */
518
+ /* Enhanced dark mode toggle */
273
519
  .theme-toggle {
274
520
  background: transparent;
275
521
  border: none;
276
- padding: 0.25rem 0.5rem;
522
+ padding: 0.4rem 0.6rem;
523
+ margin-right: 0.25rem;
277
524
  cursor: pointer;
278
525
  display: flex;
279
526
  align-items: center;
527
+ justify-content: center;
280
528
  color: white;
281
- opacity: 0.8;
282
- transition: opacity 0.2s ease, transform 0.3s ease;
529
+ opacity: 0.85;
530
+ transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
531
+ border-radius: 50%;
532
+ width: 36px;
533
+ height: 36px;
283
534
  }
284
535
 
285
536
  .theme-toggle:hover {
286
537
  opacity: 1;
287
- transform: rotate(12deg);
538
+ transform: rotate(15deg) scale(1.1);
539
+ background-color: rgba(255, 255, 255, 0.1);
288
540
  }
289
541
 
290
542
  .theme-toggle:active {
291
- transform: rotate(24deg);
543
+ transform: rotate(30deg) scale(0.9);
292
544
  }
293
545
 
294
546
  .theme-toggle .bi-sun,
@@ -308,35 +560,103 @@
308
560
  font-size: 1.2rem;
309
561
  }
310
562
 
311
- /* Header styles for dark mode */
563
+ /* Header styles for a more professional look */
312
564
  .navbar {
313
- transition: background-color 0.3s ease, border-color 0.3s ease;
565
+ transition: all 0.3s ease;
566
+ padding: 0.5rem 1rem;
567
+ box-shadow: 0 2px 15px rgba(0, 0, 0, 0.08);
568
+ }
569
+
570
+ .navbar-brand {
571
+ font-weight: 600;
572
+ letter-spacing: -0.01em;
573
+ }
574
+
575
+ .nav-link {
576
+ font-weight: 500;
577
+ padding: 0.5rem 0.8rem !important;
578
+ border-radius: 4px;
579
+ transition: all 0.2s ease;
580
+ margin: 0 2px;
581
+ }
582
+
583
+ .nav-link.active {
584
+ background-color: rgba(255, 255, 255, 0.15);
585
+ }
586
+
587
+ .nav-link:hover:not(.active) {
588
+ background-color: rgba(255, 255, 255, 0.1);
314
589
  }
315
590
 
316
591
  [data-bs-theme="light"] .navbar.bg-primary {
317
- background-color: #0d6efd !important;
592
+ background: linear-gradient(to right, #0d6efd, #0b5ed7) !important;
318
593
  }
319
594
 
320
595
  [data-bs-theme="dark"] .navbar.bg-primary {
321
- background-color: #212529 !important;
322
- border-bottom: 1px solid #495057;
596
+ background: linear-gradient(to right, #212529, #1a1e21) !important;
597
+ border-bottom: 1px solid rgba(73, 80, 87, 0.5);
598
+ }
599
+
600
+ /* Enhanced list group styling */
601
+ .list-group-item {
602
+ border-radius: 0;
603
+ border-left: 0;
604
+ border-right: 0;
605
+ padding: 0.75rem 1.25rem;
606
+ transition: all 0.15s ease-in-out;
607
+ position: relative;
608
+ font-weight: 500;
609
+ font-size: 0.9rem;
610
+ }
611
+
612
+ .list-group-item:first-child {
613
+ border-top: 0;
614
+ }
615
+
616
+ .list-group-item-action {
617
+ border-left: 3px solid transparent;
618
+ }
619
+
620
+ .list-group-item-action:hover {
621
+ border-left-color: rgba(13, 110, 253, 0.3);
622
+ }
623
+
624
+ .list-group-item.active {
625
+ border-left-color: #0d6efd;
626
+ font-weight: 600;
627
+ position: relative;
628
+ }
629
+
630
+ [data-bs-theme="light"] .list-group-item {
631
+ background-color: transparent;
632
+ border-color: rgba(0, 0, 0, 0.08);
633
+ }
634
+
635
+ [data-bs-theme="light"] .list-group-item.active {
636
+ background-color: rgba(13, 110, 253, 0.08);
637
+ color: #0d6efd;
638
+ }
639
+
640
+ [data-bs-theme="light"] .list-group-item-action:hover,
641
+ [data-bs-theme="light"] .list-group-item-action:focus {
642
+ background-color: rgba(0, 0, 0, 0.03);
323
643
  }
324
644
 
325
- /* Sidebar list group styling for dark mode */
326
645
  [data-bs-theme="dark"] .list-group-item {
327
- background-color: #212529;
328
- border-color: #495057;
646
+ background-color: transparent;
647
+ border-color: rgba(73, 80, 87, 0.3);
329
648
  color: #e9ecef;
330
649
  }
331
650
 
332
651
  [data-bs-theme="dark"] .list-group-item.active {
333
- background-color: #0d6efd;
334
- border-color: #0d6efd;
652
+ background-color: rgba(13, 110, 253, 0.15);
653
+ border-color: rgba(73, 80, 87, 0.3);
654
+ color: #6ea8fe;
335
655
  }
336
656
 
337
657
  [data-bs-theme="dark"] .list-group-item-action:hover,
338
658
  [data-bs-theme="dark"] .list-group-item-action:focus {
339
- background-color: #343a40;
659
+ background-color: rgba(255, 255, 255, 0.03);
340
660
  color: #f8f9fa;
341
661
  }
342
662
 
@@ -359,6 +679,59 @@
359
679
  color: #adb5bd;
360
680
  }
361
681
 
682
+ /* Enhanced button styling */
683
+ .btn {
684
+ font-weight: 500;
685
+ padding: 0.5rem 1rem;
686
+ border-radius: 0.375rem;
687
+ transition: all 0.2s ease;
688
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
689
+ }
690
+
691
+ .btn-sm {
692
+ padding: 0.35rem 0.75rem;
693
+ font-size: 0.85rem;
694
+ }
695
+
696
+ .btn-lg {
697
+ padding: 0.65rem 1.2rem;
698
+ font-size: 1.05rem;
699
+ }
700
+
701
+ .btn:active {
702
+ transform: translateY(1px);
703
+ }
704
+
705
+ .btn-primary {
706
+ border: none;
707
+ background: linear-gradient(135deg, #0d6efd, #0b5ed7);
708
+ }
709
+
710
+ .btn-primary:hover {
711
+ background: linear-gradient(135deg, #0b5ed7, #0a58ca);
712
+ transform: translateY(-1px);
713
+ box-shadow: 0 4px 8px rgba(13, 110, 253, 0.25);
714
+ }
715
+
716
+ .btn-outline-primary {
717
+ border-width: 1px;
718
+ }
719
+
720
+ .btn-outline-primary:hover {
721
+ transform: translateY(-1px);
722
+ box-shadow: 0 4px 8px rgba(13, 110, 253, 0.15);
723
+ }
724
+
725
+ [data-bs-theme="dark"] .btn-outline-primary {
726
+ border-color: rgba(13, 110, 253, 0.7);
727
+ color: #6ea8fe;
728
+ }
729
+
730
+ [data-bs-theme="dark"] .btn-outline-primary:hover {
731
+ background-color: rgba(13, 110, 253, 0.2);
732
+ color: #6ea8fe;
733
+ }
734
+
362
735
  /* Query timestamp */
363
736
  [data-bs-theme="light"] .query-timestamp {
364
737
  color: #6c757d;
@@ -387,6 +760,25 @@
387
760
  text-decoration: underline;
388
761
  }
389
762
 
763
+ /* Enhanced code blocks and SQL query styling */
764
+ pre, code {
765
+ font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
766
+ border-radius: 4px;
767
+ transition: all 0.2s ease;
768
+ }
769
+
770
+ pre {
771
+ padding: 1rem;
772
+ margin-bottom: 1rem;
773
+ border-radius: 0.5rem;
774
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
775
+ }
776
+
777
+ code {
778
+ font-size: 0.875em;
779
+ padding: 0.2em 0.4em;
780
+ }
781
+
390
782
  /* SQL query code in tables */
391
783
  code.sql-query-code {
392
784
  display: inline-block;
@@ -394,16 +786,38 @@
394
786
  max-width: 100%;
395
787
  overflow: hidden;
396
788
  text-overflow: ellipsis;
397
- padding: 2px 4px;
398
- border-radius: 3px;
789
+ padding: 3px 6px;
790
+ border-radius: 4px;
791
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
792
+ }
793
+
794
+ [data-bs-theme="light"] pre {
795
+ background-color: #f8f9fa;
796
+ border: 1px solid rgba(0, 0, 0, 0.05);
797
+ }
798
+
799
+ [data-bs-theme="light"] code {
800
+ background-color: rgba(0, 0, 0, 0.05);
801
+ color: #d63384;
399
802
  }
400
803
 
401
804
  [data-bs-theme="light"] code.sql-query-code {
402
805
  background-color: rgba(0, 0, 0, 0.05);
806
+ color: #0550a0;
403
807
  }
404
808
 
405
- [data-bs-theme="dark"] code.sql-query-code {
809
+ [data-bs-theme="dark"] pre {
810
+ background-color: #2c3034;
811
+ border: 1px solid rgba(255, 255, 255, 0.05);
812
+ }
813
+
814
+ [data-bs-theme="dark"] code {
406
815
  background-color: rgba(255, 255, 255, 0.1);
816
+ color: #ff8bd0;
817
+ }
818
+
819
+ [data-bs-theme="dark"] code.sql-query-code {
820
+ background-color: rgba(0, 123, 255, 0.1);
407
821
  color: #65cdff;
408
822
  }
409
823
 
@@ -427,29 +841,103 @@
427
841
  font-size: 0.875rem;
428
842
  }
429
843
 
430
- /* Database name badge */
844
+ /* Enhanced database name badge */
431
845
  .database-name-badge {
432
- font-size: 0.95rem;
433
- font-weight: 500;
846
+ font-size: 0.9rem;
847
+ font-weight: 600;
434
848
  text-transform: lowercase;
435
849
  letter-spacing: 0.02em;
850
+ padding: 0.35em 0.65em;
851
+ border-radius: 6px;
852
+ box-shadow: 0 1px 5px rgba(13, 110, 253, 0.3);
853
+ transition: all 0.2s ease;
854
+ }
855
+
856
+ .database-name-badge:hover {
857
+ transform: translateY(-1px);
858
+ box-shadow: 0 2px 8px rgba(13, 110, 253, 0.4);
436
859
  }
437
860
 
438
861
  [data-bs-theme="light"] .database-name-badge {
439
- background-color: #0d6efd;
862
+ background: linear-gradient(135deg, #0d6efd, #0b5ed7);
440
863
  color: #ffffff;
441
864
  }
442
865
 
443
866
  [data-bs-theme="dark"] .database-name-badge {
444
- background-color: #0d6efd;
867
+ background: linear-gradient(135deg, #0d6efd, #0a58ca);
445
868
  color: #ffffff;
446
869
  }
447
870
 
448
- /* Table headings */
871
+ /* Enhanced table styling */
872
+ .table {
873
+ margin-bottom: 0;
874
+ width: 100%;
875
+ border-collapse: separate;
876
+ border-spacing: 0;
877
+ }
878
+
879
+ .table thead {
880
+ background-color: #f1f3f5;
881
+ }
882
+
883
+ .table thead th {
884
+ padding: 1rem;
885
+ font-weight: 600;
886
+ border-top: 0;
887
+ vertical-align: middle;
888
+ letter-spacing: 0.01em;
889
+ font-size: 0.88rem;
890
+ text-transform: uppercase;
891
+ position: sticky;
892
+ top: 0;
893
+ z-index: 5;
894
+ background-color: inherit; /* Ensure it inherits from parent thead */
895
+ }
896
+
897
+ .table tbody td {
898
+ padding: 0.85rem 1rem;
899
+ vertical-align: middle;
900
+ border-color: var(--bs-border-color);
901
+ font-size: 0.92rem;
902
+ }
903
+
904
+ .table tbody tr:hover {
905
+ background-color: rgba(0, 0, 0, 0.02);
906
+ }
907
+
908
+ [data-bs-theme="light"] .table thead {
909
+ background-color: #f1f3f5;
910
+ }
911
+
912
+ [data-bs-theme="light"] .table thead th {
913
+ color: #495057;
914
+ border-color: #dee2e6;
915
+ border-bottom: 2px solid #dee2e6;
916
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);
917
+ }
918
+
919
+ [data-bs-theme="dark"] .table thead {
920
+ background-color: #343a40;
921
+ }
922
+
449
923
  [data-bs-theme="dark"] .table thead th {
450
924
  color: #e9ecef;
451
925
  border-color: #495057;
452
926
  border-bottom: 2px solid #495057;
927
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
928
+ }
929
+
930
+ [data-bs-theme="dark"] .table tbody tr:hover {
931
+ background-color: rgba(255, 255, 255, 0.03);
932
+ }
933
+
934
+ /* Zebra striping */
935
+ .table-striped > tbody > tr:nth-of-type(odd) > * {
936
+ background-color: rgba(0, 0, 0, 0.015);
937
+ }
938
+
939
+ [data-bs-theme="dark"] .table-striped > tbody > tr:nth-of-type(odd) > * {
940
+ background-color: rgba(255, 255, 255, 0.02);
453
941
  }
454
942
 
455
943
  /* Card title colors */
@@ -472,13 +960,64 @@
472
960
  color: #000 !important;
473
961
  }
474
962
 
475
- /* Alert styling in dark mode */
963
+ /* Enhanced alert styling */
964
+ .alert {
965
+ border-radius: 0.5rem;
966
+ border-width: 0;
967
+ padding: 1rem 1.25rem;
968
+ box-shadow: 0 3px 10px rgba(0, 0, 0, 0.08);
969
+ position: relative;
970
+ border-left: 4px solid transparent;
971
+ }
972
+
973
+ .alert-info {
974
+ background-color: rgba(13, 202, 240, 0.1);
975
+ border-left-color: #0dcaf0;
976
+ color: #087990;
977
+ }
978
+
979
+ .alert-danger {
980
+ background-color: rgba(220, 53, 69, 0.1);
981
+ border-left-color: #dc3545;
982
+ color: #b02a37;
983
+ }
984
+
985
+ .alert-success {
986
+ background-color: rgba(25, 135, 84, 0.1);
987
+ border-left-color: #198754;
988
+ color: #146c43;
989
+ }
990
+
991
+ .alert-warning {
992
+ background-color: rgba(255, 193, 7, 0.1);
993
+ border-left-color: #ffc107;
994
+ color: #997404;
995
+ }
996
+
476
997
  [data-bs-theme="dark"] .alert-info {
477
- background-color: rgba(13, 202, 240, 0.2);
478
- border-color: rgba(13, 202, 240, 0.3);
998
+ background-color: rgba(13, 202, 240, 0.15);
999
+ border-left-color: #0dcaf0;
479
1000
  color: #9eeaf9;
480
1001
  }
481
1002
 
1003
+ [data-bs-theme="dark"] .alert-danger {
1004
+ background-color: rgba(220, 53, 69, 0.15);
1005
+ border-left-color: #dc3545;
1006
+ color: #ea868f;
1007
+ }
1008
+
1009
+ [data-bs-theme="dark"] .alert-success {
1010
+ background-color: rgba(25, 135, 84, 0.15);
1011
+ border-left-color: #198754;
1012
+ color: #75b798;
1013
+ }
1014
+
1015
+ [data-bs-theme="dark"] .alert-warning {
1016
+ background-color: rgba(255, 193, 7, 0.15);
1017
+ border-left-color: #ffc107;
1018
+ color: #ffda6a;
1019
+ }
1020
+
482
1021
  /* Background colors for card headers in dark mode */
483
1022
  [data-bs-theme="dark"] .bg-danger-subtle {
484
1023
  background-color: rgba(220, 53, 69, 0.2) !important;
@@ -552,23 +1091,142 @@
552
1091
  background-color: var(--bs-light);
553
1092
  }
554
1093
 
555
- /* Metric icon styling */
1094
+ /* Enhanced stat cards and metric icons */
1095
+ .stat-card-bg {
1096
+ background: #ffffff;
1097
+ border-radius: 0.75rem;
1098
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04);
1099
+ transition: all 0.3s ease;
1100
+ border: none;
1101
+ }
1102
+
1103
+ .stat-card-bg:hover {
1104
+ transform: translateY(-3px);
1105
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08);
1106
+ }
1107
+
1108
+ [data-bs-theme="dark"] .stat-card-bg {
1109
+ background-color: #212529;
1110
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
1111
+ }
1112
+
1113
+ /* Enhanced metric icon styling */
556
1114
  .metric-icon {
557
1115
  display: flex;
558
1116
  align-items: center;
559
1117
  justify-content: center;
560
- border-radius: 50%;
561
- width: 60px;
562
- height: 60px;
563
- min-width: 60px;
1118
+ border-radius: 14px;
1119
+ width: 65px;
1120
+ height: 65px;
1121
+ min-width: 65px;
564
1122
  text-align: center;
565
- background-color: rgba(var(--bs-primary-rgb), 0.1);
1123
+ background: linear-gradient(135deg, rgba(var(--bs-primary-rgb), 0.2) 0%, rgba(var(--bs-primary-rgb), 0.1) 100%);
566
1124
  color: var(--bs-primary);
1125
+ font-size: 1.6rem;
1126
+ transition: all 0.3s ease;
1127
+ box-shadow: 0 3px 10px rgba(var(--bs-primary-rgb), 0.1);
1128
+ }
1129
+
1130
+ .stat-card-bg:hover .metric-icon {
1131
+ transform: scale(1.05);
567
1132
  }
568
1133
 
569
1134
  [data-bs-theme="dark"] .metric-icon {
570
- background-color: rgba(13, 110, 253, 0.2);
1135
+ background: linear-gradient(135deg, rgba(13, 110, 253, 0.3) 0%, rgba(13, 110, 253, 0.15) 100%);
571
1136
  color: #6ea8fe;
1137
+ box-shadow: 0 3px 10px rgba(13, 110, 253, 0.15);
1138
+ }
1139
+
1140
+ /* Enhanced navbar toggler */
1141
+ .navbar-toggler {
1142
+ border: none;
1143
+ padding: 0.25rem 0.5rem;
1144
+ background-color: rgba(255, 255, 255, 0.1);
1145
+ border-radius: 6px;
1146
+ transition: all 0.2s ease;
1147
+ margin-right: 0.5rem;
1148
+ }
1149
+
1150
+ .navbar-toggler:focus {
1151
+ box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.25);
1152
+ }
1153
+
1154
+ .navbar-toggler:hover {
1155
+ background-color: rgba(255, 255, 255, 0.15);
1156
+ }
1157
+
1158
+ .navbar-toggler-icon {
1159
+ width: 1.2em;
1160
+ height: 1.2em;
1161
+ }
1162
+
1163
+ /* Page transitions and animations */
1164
+ .dbviewer-main-content {
1165
+ animation: fadeInContent 0.4s ease-out;
1166
+ }
1167
+
1168
+ @keyframes fadeInContent {
1169
+ from {
1170
+ opacity: 0;
1171
+ transform: translateY(10px);
1172
+ }
1173
+ to {
1174
+ opacity: 1;
1175
+ transform: translateY(0);
1176
+ }
1177
+ }
1178
+
1179
+ /* Subtle hover animations */
1180
+ .nav-link, .list-group-item, .btn, .card, a {
1181
+ transition: all 0.2s ease;
1182
+ }
1183
+
1184
+ /* Improved table hover effect */
1185
+ .table-hover > tbody > tr:hover {
1186
+ transition: all 0.15s ease;
1187
+ }
1188
+
1189
+ [data-bs-theme="light"] .table-hover > tbody > tr:hover {
1190
+ background-color: rgba(13, 110, 253, 0.04);
1191
+ }
1192
+
1193
+ [data-bs-theme="dark"] .table-hover > tbody > tr:hover {
1194
+ background-color: rgba(13, 110, 253, 0.07);
1195
+ }
1196
+
1197
+ /* Button press effect */
1198
+ .btn:active, .nav-link:active, .list-group-item:active {
1199
+ transform: scale(0.97);
1200
+ }
1201
+
1202
+ /* Focus styles for accessibility */
1203
+ :focus-visible {
1204
+ outline: 3px solid rgba(13, 110, 253, 0.25);
1205
+ outline-offset: 2px;
1206
+ border-radius: 4px;
1207
+ }
1208
+
1209
+ /* Improved scrollbar for the entire app */
1210
+ html {
1211
+ scrollbar-width: thin;
1212
+ scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
1213
+ }
1214
+
1215
+ html::-webkit-scrollbar {
1216
+ width: 8px;
1217
+ }
1218
+
1219
+ html::-webkit-scrollbar-track {
1220
+ background: transparent;
1221
+ }
1222
+
1223
+ html::-webkit-scrollbar-thumb {
1224
+ background-color: rgba(0, 0, 0, 0.2);
1225
+ border-radius: 10px;
1226
+ }
1227
+
1228
+ [data-bs-theme="dark"] html::-webkit-scrollbar-thumb {
1229
+ background-color: rgba(255, 255, 255, 0.2);
572
1230
  }
573
1231
  </style>
574
1232
  </head>
@@ -618,7 +1276,7 @@
618
1276
  <div class="dbviewer-content">
619
1277
  <!-- Sidebar (always present) -->
620
1278
  <div class="dbviewer-sidebar">
621
- <%= yield :sidebar %>
1279
+ <%= render 'layouts/dbviewer/shared/sidebar' %>
622
1280
  </div>
623
1281
 
624
1282
  <!-- Main Content Area -->