dbviewer 0.6.7 → 0.6.8

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 (27) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/dbviewer/entity_relationship_diagram.js +553 -0
  3. data/app/assets/javascripts/dbviewer/home.js +287 -0
  4. data/app/assets/javascripts/dbviewer/layout.js +194 -0
  5. data/app/assets/javascripts/dbviewer/query.js +277 -0
  6. data/app/assets/javascripts/dbviewer/table.js +1563 -0
  7. data/app/assets/stylesheets/dbviewer/application.css +1460 -21
  8. data/app/assets/stylesheets/dbviewer/entity_relationship_diagram.css +181 -0
  9. data/app/assets/stylesheets/dbviewer/home.css +229 -0
  10. data/app/assets/stylesheets/dbviewer/logs.css +64 -0
  11. data/app/assets/stylesheets/dbviewer/query.css +171 -0
  12. data/app/assets/stylesheets/dbviewer/table.css +1144 -0
  13. data/app/views/dbviewer/connections/index.html.erb +0 -30
  14. data/app/views/dbviewer/entity_relationship_diagrams/index.html.erb +14 -713
  15. data/app/views/dbviewer/home/index.html.erb +9 -499
  16. data/app/views/dbviewer/logs/index.html.erb +5 -220
  17. data/app/views/dbviewer/tables/index.html.erb +0 -65
  18. data/app/views/dbviewer/tables/query.html.erb +129 -565
  19. data/app/views/dbviewer/tables/show.html.erb +4 -2429
  20. data/app/views/layouts/dbviewer/application.html.erb +13 -1544
  21. data/lib/dbviewer/version.rb +1 -1
  22. metadata +12 -7
  23. data/app/assets/javascripts/dbviewer/connections.js +0 -70
  24. data/app/assets/stylesheets/dbviewer/dbviewer.css +0 -0
  25. data/app/assets/stylesheets/dbviewer/enhanced.css +0 -0
  26. data/app/views/dbviewer/connections/new.html.erb +0 -79
  27. data/app/views/dbviewer/tables/mini_erd.html.erb +0 -517
@@ -1,21 +1,1460 @@
1
- /*
2
- * This is a manifest file that'll be compiled into application.css, which will include all the files
3
- * listed below.
4
- *
5
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
- * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
- *
8
- * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
- * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
- * files in this directory. Styles in this file should be added after the last require_* statement.
11
- * It is generally better to create a new file per style scope.
12
- *
13
- *= require_self
14
- *= require dbviewer/enhanced
15
- *= require dbviewer/dbviewer
16
- */
17
-
18
- /*
19
- * Note: Critical styles are also included inline in the application layout
20
- * to ensure the UI is functional even if asset compilation fails
21
- */
1
+ /* Base styles and typography */
2
+ body {
3
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
4
+ "Helvetica Neue", Arial, sans-serif;
5
+ font-size: 0.875rem;
6
+ line-height: 1.5;
7
+ letter-spacing: -0.01em;
8
+ color: #464c54; /* More subdued text color for light theme */
9
+ background-color: #f5f6f9; /* Subtle gray background */
10
+ }
11
+
12
+ h1,
13
+ h2,
14
+ h3,
15
+ h4,
16
+ h5,
17
+ h6,
18
+ .h1,
19
+ .h2,
20
+ .h3,
21
+ .h4,
22
+ .h5,
23
+ .h6 {
24
+ font-weight: 600;
25
+ letter-spacing: -0.02em;
26
+ line-height: 1.25;
27
+ }
28
+
29
+ /* Core layout styles - Grafana-like compact layout */
30
+ .dbviewer-wrapper {
31
+ display: flex;
32
+ flex-direction: column;
33
+ min-height: 100vh;
34
+ }
35
+ .dbviewer-navbar {
36
+ height: 48px;
37
+ } /* Reduced height for more compact header */
38
+ .dbviewer-navbar-spacer {
39
+ height: 48px;
40
+ } /* Creates space for the fixed navbar */
41
+ .dbviewer-content {
42
+ display: flex;
43
+ flex: 1;
44
+ min-height: calc(100vh - 48px);
45
+ padding-top: 0;
46
+ }
47
+
48
+ /* Smooth theme transitions */
49
+ html {
50
+ transition: background-color 0.2s ease;
51
+ }
52
+
53
+ body {
54
+ transition: color 0.2s ease, background-color 0.2s ease;
55
+ }
56
+
57
+ /* Smooth theme transitions */
58
+ html {
59
+ transition: background-color 0.2s ease;
60
+ }
61
+
62
+ body {
63
+ transition: color 0.2s ease, background-color 0.2s ease;
64
+ }
65
+
66
+ /* Sidebar styles - enhanced for elegance with Grafana-like compact design */
67
+ .dbviewer-sidebar {
68
+ width: 240px; /* More compact sidebar width */
69
+ height: calc(100vh - 48px);
70
+ position: fixed;
71
+ top: 48px; /* Positioned right below the fixed navbar */
72
+ left: 0;
73
+ z-index: 1000;
74
+ display: flex;
75
+ flex-direction: column;
76
+ transition: transform 0.3s ease-in-out, background-color 0.2s ease,
77
+ border-color 0.2s ease;
78
+ overflow: hidden;
79
+ box-shadow: 2px 0 10px rgba(0, 0, 0, 0.04); /* Subtler shadow */
80
+ }
81
+
82
+ /* Dark mode overrides */
83
+ [data-bs-theme="light"] .dbviewer-sidebar {
84
+ background: #ffffff;
85
+ border-right: 1px solid rgba(222, 226, 230, 0.6);
86
+ }
87
+
88
+ [data-bs-theme="dark"] .dbviewer-sidebar {
89
+ background: #1a1d20;
90
+ border-right: 1px solid rgba(73, 80, 87, 0.3);
91
+ }
92
+
93
+ .dbviewer-sidebar-header {
94
+ padding: 0.8rem 1rem; /* Reduced padding for more compact header */
95
+ font-weight: 600;
96
+ align-items: center;
97
+ justify-content: space-between;
98
+ flex-shrink: 0;
99
+ display: flex;
100
+ }
101
+
102
+ [data-bs-theme="light"] .dbviewer-sidebar-header {
103
+ border-bottom: 1px solid rgba(222, 226, 230, 0.6);
104
+ background: linear-gradient(to right, #f8f9fa, #f1f3f5);
105
+ }
106
+
107
+ [data-bs-theme="dark"] .dbviewer-sidebar-header {
108
+ border-bottom: 1px solid rgba(73, 80, 87, 0.3);
109
+ background: linear-gradient(to right, #343a40, #2c3034);
110
+ }
111
+
112
+ .dbviewer-sidebar-header h5 {
113
+ overflow: hidden;
114
+ text-overflow: ellipsis;
115
+ white-space: nowrap;
116
+ max-width: 80%;
117
+ cursor: default;
118
+ position: relative;
119
+ }
120
+
121
+ /* Tooltip for database name */
122
+ .dbviewer-sidebar-header h5[title]:hover::after {
123
+ content: attr(title);
124
+ position: absolute;
125
+ left: 0;
126
+ top: 100%;
127
+ z-index: 1000;
128
+ background-color: #343a40;
129
+ color: white;
130
+ padding: 0.375rem 0.75rem;
131
+ border-radius: 0.25rem;
132
+ font-size: 0.875rem;
133
+ white-space: normal;
134
+ max-width: 250px;
135
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
136
+ margin-top: 6px;
137
+ }
138
+
139
+ .dbviewer-sidebar-top {
140
+ flex-shrink: 0;
141
+ padding-bottom: 0.25rem;
142
+ }
143
+
144
+ [data-bs-theme="light"] .dbviewer-sidebar-top {
145
+ background: #f8f9fa;
146
+ border-bottom: 1px solid #eaeaea;
147
+ }
148
+
149
+ [data-bs-theme="dark"] .dbviewer-sidebar-top {
150
+ background: #1a1d20;
151
+ border-bottom: 1px solid rgba(73, 80, 87, 0.3);
152
+ }
153
+
154
+ .dbviewer-sidebar-content {
155
+ flex: 1;
156
+ overflow-y: auto;
157
+ padding: 0.25rem 0; /* Reduced padding */
158
+ height: 100%;
159
+ /* Improved scrollbar */
160
+ scrollbar-width: thin;
161
+ scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
162
+ }
163
+
164
+ .dbviewer-sidebar-content::-webkit-scrollbar {
165
+ width: 4px;
166
+ }
167
+
168
+ .dbviewer-sidebar-content::-webkit-scrollbar-track {
169
+ background: transparent;
170
+ }
171
+
172
+ .dbviewer-sidebar-content::-webkit-scrollbar-thumb {
173
+ background-color: rgba(0, 0, 0, 0.2);
174
+ border-radius: 6px;
175
+ }
176
+
177
+ [data-bs-theme="dark"] .dbviewer-sidebar-content::-webkit-scrollbar-thumb {
178
+ background-color: rgba(255, 255, 255, 0.2);
179
+ }
180
+
181
+ .dbviewer-main {
182
+ flex: 1;
183
+ margin-left: 240px; /* Reduced sidebar width */
184
+ padding: 1.2rem 1.5rem; /* Reduced padding for more compact look */
185
+ padding-top: 0.8rem; /* Adjusted for fixed header */
186
+ min-width: 0;
187
+ animation: fadeIn 0.5s ease-in-out;
188
+ transition: all 0.3s ease;
189
+ background: var(--bs-body-bg);
190
+ }
191
+
192
+ @keyframes fadeIn {
193
+ from {
194
+ opacity: 0.6;
195
+ }
196
+ to {
197
+ opacity: 1;
198
+ }
199
+ }
200
+
201
+ /* Enhanced mobile responsiveness with smooth animations */
202
+ @media (max-width: 991.98px) {
203
+ .dbviewer-sidebar {
204
+ transform: translateX(-100%);
205
+ box-shadow: none;
206
+ transition: transform 0.3s cubic-bezier(0.165, 0.84, 0.44, 1);
207
+ }
208
+
209
+ .dbviewer-sidebar.active {
210
+ transform: translateX(0);
211
+ box-shadow: 5px 0 20px rgba(0, 0, 0, 0.15);
212
+ }
213
+
214
+ .dbviewer-main {
215
+ margin-left: 0;
216
+ padding: 1.25rem;
217
+ transition: padding 0.3s ease;
218
+ }
219
+
220
+ /* Improved overlay for mobile sidebar */
221
+ .dbviewer-sidebar-overlay {
222
+ position: fixed;
223
+ top: 60px; /* Start below the fixed navbar */
224
+ left: 0;
225
+ right: 0;
226
+ bottom: 0;
227
+ backdrop-filter: blur(2px);
228
+ z-index: 999;
229
+ opacity: 0;
230
+ visibility: hidden;
231
+ transition: all 0.3s cubic-bezier(0.165, 0.84, 0.44, 1);
232
+ }
233
+
234
+ [data-bs-theme="light"] .dbviewer-sidebar-overlay {
235
+ background: rgba(0, 0, 0, 0.3);
236
+ }
237
+
238
+ [data-bs-theme="dark"] .dbviewer-sidebar-overlay {
239
+ background: rgba(0, 0, 0, 0.5);
240
+ }
241
+
242
+ .dbviewer-sidebar-overlay.active {
243
+ opacity: 1;
244
+ visibility: visible;
245
+ }
246
+
247
+ /* Toggle button styling */
248
+ .dbviewer-sidebar-toggle {
249
+ border-radius: 8px;
250
+ padding: 0.4rem 0.8rem;
251
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
252
+ border: none;
253
+ background: var(--bs-primary);
254
+ color: white;
255
+ font-weight: 500;
256
+ transition: all 0.2s ease;
257
+ }
258
+
259
+ .dbviewer-sidebar-toggle:hover {
260
+ transform: translateY(-1px);
261
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
262
+ }
263
+
264
+ body.dbviewer-sidebar-open {
265
+ overflow: hidden;
266
+ }
267
+ }
268
+
269
+ @media (max-width: 767.98px) {
270
+ .dbviewer-sidebar {
271
+ width: 230px;
272
+ }
273
+ .dbviewer-main {
274
+ padding: 1rem;
275
+ }
276
+ .dbviewer-sidebar-header h5 {
277
+ max-width: 70%;
278
+ font-size: 1rem;
279
+ }
280
+
281
+ /* Make tables more responsive */
282
+ .table-responsive {
283
+ overflow-x: auto;
284
+ -webkit-overflow-scrolling: touch;
285
+ }
286
+
287
+ .stat-card-bg {
288
+ margin-bottom: 1rem;
289
+ }
290
+ }
291
+
292
+ /* Extra small screens - more compact for small devices */
293
+ @media (max-width: 575.98px) {
294
+ .dbviewer-main {
295
+ padding: 0.6rem;
296
+ }
297
+ h1,
298
+ .h1 {
299
+ font-size: 1.6rem;
300
+ }
301
+ h2,
302
+ .h2 {
303
+ font-size: 1.4rem;
304
+ }
305
+ h3,
306
+ .h3 {
307
+ font-size: 1.2rem;
308
+ }
309
+
310
+ .btn-sm {
311
+ font-size: 0.75rem;
312
+ padding: 0.2rem 0.5rem;
313
+ }
314
+
315
+ .card-body {
316
+ padding: 0.75rem;
317
+ }
318
+ }
319
+
320
+ /* Table filter input - enhanced */
321
+ .dbviewer-table-filter-container {
322
+ position: relative;
323
+ padding: 0.75rem 1rem;
324
+ margin-bottom: 0.5rem;
325
+ transition: background-color 0.2s ease;
326
+ }
327
+
328
+ .dbviewer-table-filter-icon {
329
+ position: absolute;
330
+ left: 1.5rem;
331
+ top: 50%;
332
+ transform: translateY(-50%);
333
+ color: #6c757d;
334
+ font-size: 0.85rem;
335
+ padding: 0.25rem;
336
+ width: 1.5rem;
337
+ text-align: center;
338
+ z-index: 2;
339
+ transition: color 0.2s ease;
340
+ }
341
+
342
+ .dbviewer-table-filter {
343
+ border-radius: 8px;
344
+ padding: 0.65rem 0.85rem 0.65rem 2.5rem;
345
+ margin-bottom: 1rem;
346
+ transition: all 0.2s ease;
347
+ border: 1px solid rgba(0, 0, 0, 0.1);
348
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05);
349
+ font-size: 0.9rem;
350
+ }
351
+
352
+ .dbviewer-table-filter:focus {
353
+ box-shadow: 0 0 0 3px rgba(13, 110, 253, 0.15);
354
+ border-color: #86b7fe;
355
+ }
356
+
357
+ [data-bs-theme="dark"] .dbviewer-table-filter {
358
+ background: rgba(255, 255, 255, 0.05);
359
+ border-color: rgba(255, 255, 255, 0.1);
360
+ }
361
+
362
+ [data-bs-theme="dark"] .dbviewer-table-filter:focus {
363
+ border-color: rgba(134, 183, 254, 0.7);
364
+ }
365
+
366
+ /* Table structure and visualization components - Grafana-inspired */
367
+ .dbviewer-card {
368
+ border-radius: 3px; /* Smaller border radius for Grafana look */
369
+ transition: all 0.2s ease;
370
+ overflow: hidden;
371
+ box-shadow: 0 1px 5px rgba(0, 0, 0, 0.05); /* Subtler shadow */
372
+ height: 100%;
373
+ }
374
+
375
+ .dbviewer-card:hover {
376
+ box-shadow: 0 3px 10px rgba(0, 0, 0, 0.07), 0 1px 3px rgba(0, 0, 0, 0.06);
377
+ transform: translateY(-1px); /* Subtler hover effect */
378
+ }
379
+
380
+ /* Improved card headers - more compact */
381
+ .dbviewer-card .card-header {
382
+ font-weight: 600;
383
+ padding: 0.7rem 1rem; /* Reduced padding */
384
+ border-bottom-width: 1px;
385
+ font-size: 0.95rem; /* Slightly smaller font */
386
+ }
387
+
388
+ /* Card body padding - more compact */
389
+ .dbviewer-card .card-body {
390
+ padding: 0.9rem 1rem; /* Reduced padding */
391
+ }
392
+
393
+ [data-bs-theme="light"] .dbviewer-card {
394
+ border: none;
395
+ background: #ffffff;
396
+ }
397
+
398
+ [data-bs-theme="dark"] .dbviewer-card {
399
+ border: none;
400
+ background: #212529;
401
+ }
402
+
403
+ .dbviewer-scrollable {
404
+ max-height: 700px;
405
+ overflow-y: auto;
406
+ scrollbar-width: thin;
407
+ scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
408
+ }
409
+
410
+ .dbviewer-scrollable::-webkit-scrollbar {
411
+ width: 5px;
412
+ height: 8px;
413
+ }
414
+
415
+ .dbviewer-scrollable::-webkit-scrollbar-track {
416
+ background: transparent;
417
+ }
418
+
419
+ .dbviewer-scrollable::-webkit-scrollbar-thumb {
420
+ background-color: rgba(0, 0, 0, 0.2);
421
+ border-radius: 10px;
422
+ }
423
+
424
+ [data-bs-theme="dark"] .dbviewer-scrollable::-webkit-scrollbar-thumb {
425
+ background-color: rgba(255, 255, 255, 0.2);
426
+ }
427
+
428
+ .dbviewer-scrollable thead {
429
+ position: sticky;
430
+ top: 0;
431
+ z-index: 1;
432
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
433
+ width: 100%;
434
+ }
435
+
436
+ /* Ensure the scrollable table headers have solid backgrounds */
437
+ [data-bs-theme="light"] .dbviewer-scrollable thead {
438
+ background-color: #f1f3f5;
439
+ }
440
+
441
+ [data-bs-theme="dark"] .dbviewer-scrollable thead {
442
+ background-color: #343a40;
443
+ }
444
+
445
+ /* Ensure individual th cells also have proper background */
446
+ .dbviewer-scrollable thead th {
447
+ background-color: transparent;
448
+ }
449
+
450
+ /* Specific fix for sticky table headers to ensure solid backgrounds */
451
+ .table-responsive .table thead,
452
+ .dbviewer-scrollable .table thead {
453
+ position: sticky;
454
+ top: 0;
455
+ z-index: 40;
456
+ }
457
+
458
+ /* Additional specificity for table headers in dark mode */
459
+ [data-bs-theme="light"] .table-responsive .table thead th,
460
+ [data-bs-theme="light"] .dbviewer-scrollable .table thead th {
461
+ background-color: #f1f3f5;
462
+ }
463
+
464
+ [data-bs-theme="dark"] .table-responsive .table thead th,
465
+ [data-bs-theme="dark"] .dbviewer-scrollable .table thead th {
466
+ background-color: #343a40;
467
+ }
468
+
469
+ /* Ensure borders appear properly with sticky headers */
470
+ .table thead th {
471
+ box-shadow: inset 0 1px 0 var(--bs-border-color),
472
+ inset 0 -1px 0 var(--bs-border-color);
473
+ }
474
+
475
+ /* Enhanced badge styling */
476
+ .badge {
477
+ font-weight: 500;
478
+ padding: 0.4em 0.6em;
479
+ border-radius: 6px;
480
+ letter-spacing: 0.01em;
481
+ font-size: 0.75em;
482
+ text-transform: none;
483
+ }
484
+
485
+ [data-bs-theme="dark"] .bg-secondary-subtle {
486
+ background-color: rgba(255, 255, 255, 0.15) !important;
487
+ color: #f8f9fa !important;
488
+ }
489
+
490
+ [data-bs-theme="light"] .bg-secondary-subtle {
491
+ background-color: #e9ecef !important;
492
+ color: #495057 !important;
493
+ }
494
+
495
+ /* Table header styling */
496
+ .dbviewer-table-header {
497
+ background-color: #f1f3f5;
498
+ }
499
+
500
+ [data-bs-theme="dark"] .dbviewer-table-header {
501
+ background-color: #343a40;
502
+ }
503
+
504
+ /* List group styling for dark mode */
505
+ [data-bs-theme="dark"] .list-group-item {
506
+ background-color: var(--bs-dark);
507
+ border-color: rgba(255, 255, 255, 0.08); /* Subtler border */
508
+ color: var(--bs-light);
509
+ }
510
+
511
+ [data-bs-theme="dark"] .dbviewer-table-header {
512
+ position: sticky;
513
+ top: 0;
514
+ background: #343a40;
515
+ z-index: 1;
516
+ }
517
+
518
+ /* Equal height for timeline and structure cards - Grafana-inspired compact layout */
519
+ .two-column-layout .card {
520
+ height: 100%;
521
+ display: flex;
522
+ flex-direction: column;
523
+ }
524
+ .two-column-layout .card-body {
525
+ flex: 1;
526
+ display: flex;
527
+ flex-direction: column;
528
+ padding: 0.75rem;
529
+ } /* Reduced padding */
530
+ .two-column-layout .chart-container {
531
+ flex: 1;
532
+ min-height: 220px;
533
+ } /* Reduced min-height */
534
+ .two-column-layout .structure-container {
535
+ padding: 0;
536
+ }
537
+ .two-column-layout .tab-content {
538
+ flex: 1;
539
+ overflow: hidden;
540
+ display: flex;
541
+ flex-direction: column;
542
+ }
543
+ .two-column-layout .tab-pane {
544
+ flex: 1;
545
+ overflow: hidden;
546
+ }
547
+ .two-column-layout .table-responsive {
548
+ overflow-x: auto;
549
+ }
550
+
551
+ [data-bs-theme="light"] .two-column-layout .sticky-top {
552
+ top: 0;
553
+ z-index: 999;
554
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
555
+ }
556
+
557
+ [data-bs-theme="dark"] .two-column-layout .sticky-top {
558
+ top: 0;
559
+ z-index: 999;
560
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
561
+ }
562
+
563
+ /* Enhanced dark mode toggle */
564
+ .theme-toggle {
565
+ background: transparent;
566
+ border: none;
567
+ padding: 0.4rem 0.6rem;
568
+ margin-right: 0.25rem;
569
+ cursor: pointer;
570
+ display: flex;
571
+ align-items: center;
572
+ justify-content: center;
573
+ color: white;
574
+ opacity: 0.85;
575
+ transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
576
+ border-radius: 50%;
577
+ width: 36px;
578
+ height: 36px;
579
+ }
580
+
581
+ .theme-toggle:hover {
582
+ opacity: 1;
583
+ transform: rotate(15deg) scale(1.1);
584
+ background-color: rgba(255, 255, 255, 0.1);
585
+ }
586
+
587
+ .theme-toggle:active {
588
+ transform: rotate(30deg) scale(0.9);
589
+ }
590
+
591
+ .theme-toggle .bi-sun,
592
+ [data-bs-theme="dark"] .theme-toggle .bi-moon {
593
+ display: none;
594
+ }
595
+
596
+ [data-bs-theme="dark"] .theme-toggle .bi-sun {
597
+ display: inline-block;
598
+ }
599
+
600
+ .theme-toggle .bi-moon {
601
+ display: inline-block;
602
+ }
603
+
604
+ .theme-toggle i {
605
+ font-size: 1.2rem;
606
+ }
607
+
608
+ /* Header styles for a more professional Grafana-like look */
609
+ .navbar {
610
+ transition: all 0.3s ease;
611
+ padding: 0 0.75rem; /* Reduced horizontal padding */
612
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.05); /* Subtler shadow */
613
+ min-height: 48px; /* Fixed height */
614
+ }
615
+
616
+ .navbar-brand {
617
+ font-weight: 600;
618
+ letter-spacing: -0.01em;
619
+ font-size: 1.1rem; /* Smaller brand */
620
+ padding: 0.1rem 0; /* Reduced padding */
621
+ }
622
+
623
+ .nav-link {
624
+ font-weight: 500;
625
+ padding: 0.35rem 0.65rem !important; /* Reduced padding */
626
+ border-radius: 2px; /* Smaller radius for Grafana look */
627
+ transition: all 0.2s ease;
628
+ margin: 0 1px; /* Reduced margin */
629
+ font-size: 0.9rem; /* Smaller font */
630
+ }
631
+
632
+ .nav-link.active {
633
+ background-color: rgba(255, 255, 255, 0.15);
634
+ }
635
+
636
+ .nav-link:hover:not(.active) {
637
+ background-color: rgba(255, 255, 255, 0.1);
638
+ }
639
+
640
+ [data-bs-theme="light"] .navbar.bg-primary {
641
+ background: linear-gradient(to right, #0d6efd, #0b5ed7) !important;
642
+ }
643
+
644
+ [data-bs-theme="dark"] .navbar.bg-primary {
645
+ background: linear-gradient(to right, #161819, #1a1d20) !important;
646
+ border-bottom: 1px solid rgba(73, 80, 87, 0.5);
647
+ }
648
+
649
+ /* Enhanced list group styling */
650
+ .list-group-item {
651
+ border-radius: 0;
652
+ border-left: 0;
653
+ border-right: 0;
654
+ padding: 0.5rem 0.85rem; /* Reduced padding for compact look */
655
+ transition: all 0.15s ease-in-out;
656
+ position: relative;
657
+ font-weight: 500;
658
+ font-size: 0.85rem; /* Smaller font for Grafana-like appearance */
659
+ }
660
+
661
+ .list-group-item:first-child {
662
+ border-top: 0;
663
+ }
664
+
665
+ .list-group-item-action {
666
+ border-left: 3px solid transparent;
667
+ }
668
+
669
+ .list-group-item-action:hover {
670
+ border-left-color: rgba(13, 110, 253, 0.3);
671
+ }
672
+
673
+ .list-group-item.active {
674
+ border-left-color: #0d6efd;
675
+ font-weight: 600;
676
+ position: relative;
677
+ }
678
+
679
+ [data-bs-theme="light"] .list-group-item {
680
+ background-color: transparent;
681
+ border-color: rgba(0, 0, 0, 0.08);
682
+ }
683
+
684
+ [data-bs-theme="light"] .list-group-item.active {
685
+ background-color: rgba(13, 110, 253, 0.08);
686
+ color: #0d6efd;
687
+ }
688
+
689
+ [data-bs-theme="light"] .list-group-item-action:hover,
690
+ [data-bs-theme="light"] .list-group-item-action:focus {
691
+ background-color: rgba(0, 0, 0, 0.03);
692
+ }
693
+
694
+ [data-bs-theme="dark"] .list-group-item {
695
+ background-color: #1a1d20;
696
+ border-color: rgba(73, 80, 87, 0.3);
697
+ color: #e9ecef;
698
+ }
699
+
700
+ [data-bs-theme="dark"] .list-group-item.active,
701
+ [data-bs-theme="dark"] .list-group-item.active:hover {
702
+ background-color: rgba(13, 110, 253, 0.15);
703
+ border-color: rgba(73, 80, 87, 0.3);
704
+ color: #6ea8fe;
705
+ }
706
+
707
+ [data-bs-theme="dark"] .list-group-item-action:hover,
708
+ [data-bs-theme="dark"] .list-group-item-action:focus {
709
+ background-color: rgba(255, 255, 255, 0.05);
710
+ color: #f8f9fa;
711
+ }
712
+
713
+ [data-bs-theme="dark"] .list-group-item.text-muted {
714
+ color: #adb5bd !important;
715
+ }
716
+
717
+ /* Make card headers in dark mode look better */
718
+ [data-bs-theme="dark"] .card-header {
719
+ background-color: #2c3034;
720
+ border-bottom: 1px solid #495057;
721
+ }
722
+
723
+ /* Empty data messages */
724
+ [data-bs-theme="light"] .empty-data-message {
725
+ color: #6c757d;
726
+ }
727
+
728
+ [data-bs-theme="dark"] .empty-data-message {
729
+ color: #adb5bd;
730
+ }
731
+
732
+ /* Enhanced button styling - Grafana-inspired */
733
+ .btn {
734
+ font-weight: 500;
735
+ padding: 0.4rem 0.85rem; /* Reduced padding */
736
+ border-radius: 2px; /* Smaller radius for Grafana look */
737
+ transition: all 0.2s ease;
738
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
739
+ }
740
+
741
+ .btn-sm {
742
+ padding: 0.25rem 0.6rem; /* Reduced padding */
743
+ font-size: 0.8rem; /* Smaller font size */
744
+ }
745
+
746
+ .btn-lg {
747
+ padding: 0.5rem 1rem; /* Reduced padding */
748
+ font-size: 0.95rem; /* Smaller font size */
749
+ }
750
+
751
+ .btn:active {
752
+ transform: translateY(1px);
753
+ }
754
+
755
+ .btn-primary {
756
+ border: none;
757
+ background: linear-gradient(135deg, #0d6efd, #0b5ed7);
758
+ }
759
+
760
+ .btn-primary:hover {
761
+ background: linear-gradient(135deg, #0b5ed7, #0a58ca);
762
+ transform: translateY(-1px);
763
+ box-shadow: 0 4px 8px rgba(13, 110, 253, 0.25);
764
+ }
765
+
766
+ .btn-outline-primary {
767
+ border-width: 1px;
768
+ }
769
+
770
+ .btn-outline-primary:hover {
771
+ transform: translateY(-1px);
772
+ box-shadow: 0 4px 8px rgba(13, 110, 253, 0.15);
773
+ }
774
+
775
+ [data-bs-theme="dark"] .btn-outline-primary {
776
+ border-color: rgba(13, 110, 253, 0.7);
777
+ color: #6ea8fe;
778
+ }
779
+
780
+ [data-bs-theme="dark"] .btn-outline-primary:hover {
781
+ background-color: rgba(13, 110, 253, 0.2);
782
+ color: #6ea8fe;
783
+ }
784
+
785
+ /* Query timestamp */
786
+ [data-bs-theme="light"] .query-timestamp {
787
+ color: #6c757d;
788
+ }
789
+
790
+ [data-bs-theme="dark"] .query-timestamp {
791
+ color: #adb5bd;
792
+ }
793
+
794
+ /* Code blocks in tables */
795
+ [data-bs-theme="dark"] table code {
796
+ color: #e685b5;
797
+ background-color: rgba(230, 133, 181, 0.1);
798
+ padding: 2px 4px;
799
+ border-radius: 3px;
800
+ }
801
+
802
+ /* Table links */
803
+ [data-bs-theme="dark"] .table a {
804
+ color: #6ea8fe;
805
+ text-decoration: none;
806
+ }
807
+
808
+ [data-bs-theme="dark"] .table a:hover {
809
+ color: #8bb9fe;
810
+ text-decoration: underline;
811
+ }
812
+
813
+ /* Enhanced code blocks and SQL query styling - Grafana-inspired */
814
+ pre,
815
+ code {
816
+ font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
817
+ border-radius: 2px; /* Smaller radius */
818
+ transition: all 0.2s ease;
819
+ }
820
+
821
+ pre {
822
+ padding: 0.75rem; /* Reduced padding */
823
+ margin-bottom: 0.75rem; /* Reduced margin */
824
+ border-radius: 2px; /* Smaller radius */
825
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
826
+ }
827
+
828
+ code {
829
+ font-size: 0.825em; /* Smaller font */
830
+ padding: 0.15em 0.3em; /* Reduced padding */
831
+ }
832
+
833
+ /* SQL query code in tables */
834
+ code.sql-query-code {
835
+ display: inline-block;
836
+ white-space: nowrap;
837
+ max-width: 100%;
838
+ overflow: hidden;
839
+ text-overflow: ellipsis;
840
+ padding: 3px 6px;
841
+ border-radius: 4px;
842
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
843
+ }
844
+
845
+ [data-bs-theme="light"] pre {
846
+ background-color: #f8f9fa;
847
+ border: 1px solid rgba(0, 0, 0, 0.05);
848
+ }
849
+
850
+ [data-bs-theme="light"] code {
851
+ background-color: rgba(0, 0, 0, 0.05);
852
+ color: #d63384;
853
+ }
854
+
855
+ [data-bs-theme="light"] code.sql-query-code {
856
+ background-color: rgba(0, 0, 0, 0.05);
857
+ color: #0550a0;
858
+ }
859
+
860
+ [data-bs-theme="dark"] pre {
861
+ background-color: #2c3034;
862
+ border: 1px solid rgba(255, 255, 255, 0.05);
863
+ }
864
+
865
+ [data-bs-theme="dark"] code {
866
+ background-color: rgba(255, 255, 255, 0.1);
867
+ color: #ff8bd0;
868
+ }
869
+
870
+ [data-bs-theme="dark"] code.sql-query-code {
871
+ background-color: rgba(0, 123, 255, 0.1);
872
+ color: #65cdff;
873
+ }
874
+
875
+ /* Query duration styling */
876
+ .query-duration {
877
+ font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
878
+ "Courier New", monospace;
879
+ font-size: 0.875rem;
880
+ }
881
+
882
+ [data-bs-theme="light"] .query-duration-slow {
883
+ color: #dc3545;
884
+ font-weight: 500;
885
+ font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
886
+ "Courier New", monospace;
887
+ font-size: 0.875rem;
888
+ }
889
+
890
+ [data-bs-theme="dark"] .query-duration-slow {
891
+ color: #ff6b6b;
892
+ font-weight: 500;
893
+ font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
894
+ "Courier New", monospace;
895
+ font-size: 0.875rem;
896
+ }
897
+
898
+ /* Enhanced database name badge */
899
+ .database-name-badge {
900
+ font-size: 0.9rem;
901
+ font-weight: 600;
902
+ text-transform: lowercase;
903
+ letter-spacing: 0.02em;
904
+ padding: 0.35em 0.65em;
905
+ border-radius: 6px;
906
+ box-shadow: 0 1px 5px rgba(13, 110, 253, 0.3);
907
+ transition: all 0.2s ease;
908
+ }
909
+
910
+ .database-name-badge:hover {
911
+ transform: translateY(-1px);
912
+ box-shadow: 0 2px 8px rgba(13, 110, 253, 0.4);
913
+ }
914
+
915
+ [data-bs-theme="light"] .database-name-badge {
916
+ background: linear-gradient(135deg, #0d6efd, #0b5ed7);
917
+ color: #ffffff;
918
+ }
919
+
920
+ [data-bs-theme="dark"] .database-name-badge {
921
+ background: linear-gradient(135deg, #0d6efd, #0a58ca);
922
+ color: #ffffff;
923
+ }
924
+
925
+ [data-bs-theme="light"] .offcanvas .nav-link {
926
+ color: rgb(78, 86, 95);
927
+ }
928
+
929
+ [data-bs-theme="dark"] .offcanvas .nav-link {
930
+ color: rgb(191, 191, 191);
931
+ }
932
+
933
+ /* Enhanced table styling - Grafana-like compact design */
934
+ .table {
935
+ margin-bottom: 0;
936
+ width: 100%;
937
+ border-collapse: separate;
938
+ border-spacing: 0;
939
+ }
940
+
941
+ .table thead {
942
+ background-color: #f1f3f5;
943
+ }
944
+
945
+ .table thead th {
946
+ padding: 0.65rem 0.75rem; /* Reduced padding */
947
+ font-weight: 600;
948
+ border-top: 0;
949
+ vertical-align: middle;
950
+ letter-spacing: 0.01em;
951
+ font-size: 0.78rem; /* Smaller font */
952
+ text-transform: uppercase;
953
+ position: sticky;
954
+ top: 0;
955
+ z-index: 5;
956
+ background-color: inherit; /* Ensure it inherits from parent thead */
957
+ }
958
+
959
+ .table tbody td {
960
+ padding: 0.5rem 0.75rem; /* Reduced padding */
961
+ vertical-align: middle;
962
+ border-color: var(--bs-border-color);
963
+ font-size: 0.85rem; /* Smaller font */
964
+ }
965
+
966
+ .table tbody tr:hover {
967
+ background-color: rgba(0, 0, 0, 0.02);
968
+ }
969
+
970
+ [data-bs-theme="light"] .table thead {
971
+ background-color: #f1f3f5;
972
+ }
973
+
974
+ [data-bs-theme="light"] .table thead th {
975
+ color: #495057;
976
+ border-color: #dee2e6;
977
+ border-bottom: 2px solid #dee2e6;
978
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);
979
+ }
980
+
981
+ [data-bs-theme="dark"] .table thead {
982
+ background-color: #343a40;
983
+ }
984
+
985
+ [data-bs-theme="dark"] .table thead th {
986
+ color: #e9ecef;
987
+ border-color: #495057;
988
+ border-bottom: 2px solid #495057;
989
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
990
+ }
991
+
992
+ [data-bs-theme="dark"] .table tbody tr:hover {
993
+ background-color: rgba(255, 255, 255, 0.03);
994
+ }
995
+
996
+ /* Zebra striping */
997
+ .table-striped > tbody > tr:nth-of-type(odd) > * {
998
+ background-color: rgba(0, 0, 0, 0.015);
999
+ }
1000
+
1001
+ [data-bs-theme="dark"] .table-striped > tbody > tr:nth-of-type(odd) > * {
1002
+ background-color: rgba(255, 255, 255, 0.02);
1003
+ }
1004
+
1005
+ /* Card title colors */
1006
+ [data-bs-theme="dark"] .card-title {
1007
+ color: #f8f9fa;
1008
+ }
1009
+
1010
+ /* SQL logs specific styling */
1011
+ [data-bs-theme="dark"] pre.sql-query {
1012
+ background-color: #2c3034;
1013
+ border-color: #495057;
1014
+ }
1015
+
1016
+ [data-bs-theme="dark"] pre.sql-query code {
1017
+ color: #ff8bd0;
1018
+ }
1019
+
1020
+ /* Badge text colors for better contrast in dark mode */
1021
+ [data-bs-theme="dark"] .badge.bg-info {
1022
+ color: #000 !important;
1023
+ }
1024
+
1025
+ /* Badge styling - More Grafana-like */
1026
+ .badge {
1027
+ padding: 0.3em 0.5em;
1028
+ font-size: 0.75em;
1029
+ border-radius: 2px;
1030
+ }
1031
+
1032
+ /* Enhanced alert styling - Grafana-inspired */
1033
+ .alert {
1034
+ border-radius: 2px; /* Smaller radius for Grafana look */
1035
+ border-width: 0;
1036
+ padding: 0.7rem 1rem; /* Reduced padding */
1037
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.05);
1038
+ position: relative;
1039
+ border-left: 3px solid transparent; /* Thinner border */
1040
+ }
1041
+
1042
+ .alert-info {
1043
+ background-color: rgba(13, 202, 240, 0.1);
1044
+ border-left-color: #0dcaf0;
1045
+ color: #087990;
1046
+ }
1047
+
1048
+ .alert-danger {
1049
+ background-color: rgba(220, 53, 69, 0.1);
1050
+ border-left-color: #dc3545;
1051
+ color: #b02a37;
1052
+ }
1053
+
1054
+ .alert-success {
1055
+ background-color: rgba(25, 135, 84, 0.1);
1056
+ border-left-color: #198754;
1057
+ color: #146c43;
1058
+ }
1059
+
1060
+ .alert-warning {
1061
+ background-color: rgba(255, 193, 7, 0.1);
1062
+ border-left-color: #ffc107;
1063
+ color: #997404;
1064
+ }
1065
+
1066
+ [data-bs-theme="dark"] .alert-info {
1067
+ background-color: rgba(13, 202, 240, 0.15);
1068
+ border-left-color: #0dcaf0;
1069
+ color: #9eeaf9;
1070
+ }
1071
+
1072
+ [data-bs-theme="dark"] .alert-danger {
1073
+ background-color: rgba(220, 53, 69, 0.15);
1074
+ border-left-color: #dc3545;
1075
+ color: #ea868f;
1076
+ }
1077
+
1078
+ [data-bs-theme="dark"] .alert-success {
1079
+ background-color: rgba(25, 135, 84, 0.15);
1080
+ border-left-color: #198754;
1081
+ color: #75b798;
1082
+ }
1083
+
1084
+ [data-bs-theme="dark"] .alert-warning {
1085
+ background-color: rgba(255, 193, 7, 0.15);
1086
+ border-left-color: #ffc107;
1087
+ color: #ffda6a;
1088
+ }
1089
+
1090
+ /* Background colors for card headers in dark mode */
1091
+ [data-bs-theme="dark"] .bg-danger-subtle {
1092
+ background-color: rgba(220, 53, 69, 0.2) !important;
1093
+ }
1094
+
1095
+ [data-bs-theme="dark"] .bg-info-subtle {
1096
+ background-color: rgba(13, 202, 240, 0.2) !important;
1097
+ }
1098
+
1099
+ /* Text colors for card headers in dark mode */
1100
+ [data-bs-theme="dark"] .text-info {
1101
+ color: #0dcaf0 !important;
1102
+ }
1103
+
1104
+ [data-bs-theme="dark"] .text-danger {
1105
+ color: #ff6b6b !important;
1106
+ }
1107
+
1108
+ /* Code block styling for SQL logs */
1109
+ [data-bs-theme="light"] .code-block {
1110
+ background-color: #f8f9fa;
1111
+ }
1112
+
1113
+ [data-bs-theme="dark"] .code-block {
1114
+ background-color: #2c3034;
1115
+ }
1116
+
1117
+ /* Pattern code styling */
1118
+ [data-bs-theme="dark"] .pattern-code {
1119
+ color: #f783ac;
1120
+ }
1121
+
1122
+ /* Query binds styling */
1123
+ [data-bs-theme="light"] .query-binds-summary {
1124
+ color: #6c757d;
1125
+ }
1126
+
1127
+ [data-bs-theme="dark"] .query-binds-summary {
1128
+ color: #adb5bd;
1129
+ }
1130
+
1131
+ [data-bs-theme="dark"] .query-binds {
1132
+ color: #20c997;
1133
+ }
1134
+
1135
+ /* Enhanced code syntax highlighting */
1136
+ [data-bs-theme="dark"] code.syntax-highlighted {
1137
+ color: #ff8bd0;
1138
+ }
1139
+
1140
+ /* Request ID styling */
1141
+ [data-bs-theme="light"] .request-id {
1142
+ color: #6c757d;
1143
+ }
1144
+
1145
+ [data-bs-theme="dark"] .request-id {
1146
+ color: #adb5bd;
1147
+ }
1148
+
1149
+ [data-bs-theme="dark"] .stat-card-bg {
1150
+ background-color: #2c3034;
1151
+ }
1152
+
1153
+ .stat-card-bg {
1154
+ background-color: var(--bs-light);
1155
+ }
1156
+
1157
+ /* Enhanced stat cards and metric icons - Grafana-inspired */
1158
+ .stat-card-bg {
1159
+ background: #ffffff;
1160
+ border-radius: 3px; /* Smaller radius for Grafana look */
1161
+ box-shadow: 0 1px 5px rgba(0, 0, 0, 0.03);
1162
+ transition: all 0.3s ease;
1163
+ border: none;
1164
+ }
1165
+
1166
+ .stat-card-bg:hover {
1167
+ transform: translateY(-1px); /* Subtler hover */
1168
+ box-shadow: 0 3px 8px rgba(0, 0, 0, 0.06);
1169
+ }
1170
+
1171
+ [data-bs-theme="dark"] .stat-card-bg {
1172
+ background-color: #212529;
1173
+ box-shadow: 0 1px 5px rgba(0, 0, 0, 0.08);
1174
+ }
1175
+
1176
+ /* Enhanced metric icon styling - Grafana-inspired */
1177
+ .metric-icon {
1178
+ display: flex;
1179
+ align-items: center;
1180
+ justify-content: center;
1181
+ border-radius: 3px; /* Smaller radius */
1182
+ width: 50px; /* Smaller icon */
1183
+ height: 50px; /* Smaller icon */
1184
+ min-width: 50px; /* Smaller icon */
1185
+ text-align: center;
1186
+ background: linear-gradient(
1187
+ 135deg,
1188
+ rgba(var(--bs-primary-rgb), 0.15) 0%,
1189
+ rgba(var(--bs-primary-rgb), 0.08) 100%
1190
+ );
1191
+ color: var(--bs-primary);
1192
+ font-size: 1.4rem; /* Smaller icon */
1193
+ transition: all 0.3s ease;
1194
+ box-shadow: 0 1px 5px rgba(var(--bs-primary-rgb), 0.08);
1195
+ }
1196
+
1197
+ .stat-card-bg:hover .metric-icon {
1198
+ transform: scale(1.05);
1199
+ }
1200
+
1201
+ [data-bs-theme="dark"] .metric-icon {
1202
+ background: linear-gradient(
1203
+ 135deg,
1204
+ rgba(13, 110, 253, 0.3) 0%,
1205
+ rgba(13, 110, 253, 0.15) 100%
1206
+ );
1207
+ color: #6ea8fe;
1208
+ box-shadow: 0 3px 10px rgba(13, 110, 253, 0.15);
1209
+ }
1210
+
1211
+ /* Enhanced navbar toggler */
1212
+ .navbar-toggler {
1213
+ border: none;
1214
+ padding: 0.25rem 0.5rem;
1215
+ background-color: rgba(255, 255, 255, 0.1);
1216
+ border-radius: 6px;
1217
+ transition: all 0.2s ease;
1218
+ margin-right: 0.5rem;
1219
+ }
1220
+
1221
+ .navbar-toggler:focus {
1222
+ box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.25);
1223
+ }
1224
+
1225
+ .navbar-toggler:hover {
1226
+ background-color: rgba(255, 255, 255, 0.15);
1227
+ }
1228
+
1229
+ .navbar-toggler-icon {
1230
+ width: 1.2em;
1231
+ height: 1.2em;
1232
+ }
1233
+
1234
+ /* Page transitions and animations */
1235
+ .dbviewer-main-content {
1236
+ animation: fadeInContent 0.4s ease-out;
1237
+ }
1238
+
1239
+ @keyframes fadeInContent {
1240
+ from {
1241
+ opacity: 0;
1242
+ transform: translateY(10px);
1243
+ }
1244
+ to {
1245
+ opacity: 1;
1246
+ transform: translateY(0);
1247
+ }
1248
+ }
1249
+
1250
+ /* Subtle hover animations */
1251
+ .nav-link,
1252
+ .list-group-item,
1253
+ .btn,
1254
+ .card,
1255
+ a {
1256
+ transition: all 0.2s ease;
1257
+ }
1258
+
1259
+ /* Improved table hover effect - Grafana-like */
1260
+ .table-hover > tbody > tr:hover {
1261
+ transition: all 0.15s ease;
1262
+ }
1263
+
1264
+ [data-bs-theme="light"] .table-hover > tbody > tr:hover {
1265
+ background-color: rgba(13, 110, 253, 0.03); /* Subtler hover */
1266
+ }
1267
+
1268
+ [data-bs-theme="dark"] .table-hover > tbody > tr:hover {
1269
+ background-color: rgba(13, 110, 253, 0.05); /* Subtler hover */
1270
+ }
1271
+
1272
+ /* Grafana-inspired grid layout adjustments */
1273
+ .row {
1274
+ margin-right: -0.5rem;
1275
+ margin-left: -0.5rem;
1276
+ }
1277
+
1278
+ .row > [class^="col-"] {
1279
+ padding-right: 0.5rem;
1280
+ padding-left: 0.5rem;
1281
+ }
1282
+
1283
+ /* Button press effect */
1284
+ .btn:active,
1285
+ .nav-link:active,
1286
+ .list-group-item:active {
1287
+ transform: scale(0.97);
1288
+ }
1289
+
1290
+ /* Focus styles for accessibility */
1291
+ :focus-visible {
1292
+ outline: 3px solid rgba(13, 110, 253, 0.25);
1293
+ outline-offset: 2px;
1294
+ border-radius: 4px;
1295
+ }
1296
+
1297
+ /* Improved scrollbar for the entire app */
1298
+ html {
1299
+ scrollbar-width: thin;
1300
+ scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
1301
+ }
1302
+
1303
+ html::-webkit-scrollbar {
1304
+ width: 8px;
1305
+ }
1306
+
1307
+ html::-webkit-scrollbar-track {
1308
+ background: transparent;
1309
+ }
1310
+
1311
+ html::-webkit-scrollbar-thumb {
1312
+ background-color: rgba(0, 0, 0, 0.2);
1313
+ border-radius: 10px;
1314
+ }
1315
+
1316
+ [data-bs-theme="dark"] html::-webkit-scrollbar-thumb {
1317
+ background-color: rgba(255, 255, 255, 0.2);
1318
+ }
1319
+
1320
+ /* Grafana-like panel enhancements */
1321
+ body {
1322
+ color: #464c54; /* More subdued text color for light theme */
1323
+ background-color: #f5f6f9; /* Subtle gray background */
1324
+ }
1325
+
1326
+ [data-bs-theme="dark"] body {
1327
+ background-color: #161719; /* Darker background for dark theme */
1328
+ color: #d8d9da; /* Softer text color for dark theme */
1329
+ }
1330
+
1331
+ /* Make font sizes consistently smaller for more compact look */
1332
+ body {
1333
+ font-size: 0.875rem;
1334
+ }
1335
+
1336
+ h1,
1337
+ .h1 {
1338
+ font-size: 1.6rem;
1339
+ }
1340
+ h2,
1341
+ .h2 {
1342
+ font-size: 1.4rem;
1343
+ }
1344
+ h3,
1345
+ .h3 {
1346
+ font-size: 1.2rem;
1347
+ }
1348
+ h4,
1349
+ .h4 {
1350
+ font-size: 1.1rem;
1351
+ }
1352
+ h5,
1353
+ .h5 {
1354
+ font-size: 1rem;
1355
+ }
1356
+
1357
+ /* Unify panel appearance */
1358
+ .card,
1359
+ .list-group {
1360
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.06);
1361
+ border: none;
1362
+ border-radius: 2px;
1363
+ }
1364
+
1365
+ [data-bs-theme="dark"] .card,
1366
+ [data-bs-theme="dark"] .list-group {
1367
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.15);
1368
+ background-color: #212124;
1369
+ }
1370
+
1371
+ /* Improved tab styling */
1372
+ .nav-tabs {
1373
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
1374
+ }
1375
+
1376
+ .nav-tabs .nav-link {
1377
+ border: none;
1378
+ border-bottom: 2px solid transparent;
1379
+ background-color: transparent;
1380
+ padding: 0.5rem 0.75rem;
1381
+ margin-bottom: -1px;
1382
+ font-size: 0.9rem;
1383
+ }
1384
+
1385
+ .nav-tabs .nav-link.active {
1386
+ border-bottom-color: var(--bs-primary);
1387
+ color: var(--bs-primary);
1388
+ }
1389
+
1390
+ [data-bs-theme="dark"] .nav-tabs {
1391
+ border-color: rgba(255, 255, 255, 0.1);
1392
+ }
1393
+
1394
+ /* Remove excessive margins between elements */
1395
+ .row + .row,
1396
+ .card + .card {
1397
+ margin-top: 0.75rem;
1398
+ }
1399
+
1400
+ /* Elegant form controls */
1401
+ .form-control,
1402
+ .form-select {
1403
+ padding: 0.4rem 0.6rem;
1404
+ font-size: 0.875rem;
1405
+ height: auto;
1406
+ border-radius: 2px;
1407
+ }
1408
+
1409
+ /* Add this right above the style closing tag */
1410
+
1411
+ /* Toast styling customizations */
1412
+ .toastify {
1413
+ padding: 12px 20px;
1414
+ color: white;
1415
+ border-radius: 6px;
1416
+ display: flex;
1417
+ align-items: center;
1418
+ justify-content: space-between;
1419
+ font-family: var(--bs-body-font-family);
1420
+ font-size: 0.95rem;
1421
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.15);
1422
+ max-width: 350px;
1423
+ }
1424
+
1425
+ .toast-factory-bot {
1426
+ background: linear-gradient(135deg, #28a745, #20c997);
1427
+ }
1428
+
1429
+ .toast-icon {
1430
+ margin-right: 10px;
1431
+ font-size: 1.25em;
1432
+ }
1433
+
1434
+ /* Dark mode toast styling */
1435
+ [data-bs-theme="dark"] .toast-factory-bot {
1436
+ background: linear-gradient(135deg, #157347, #13795b);
1437
+ }
1438
+
1439
+ /* Toast animations */
1440
+ @keyframes slideInRight {
1441
+ from {
1442
+ transform: translateX(100%);
1443
+ opacity: 0;
1444
+ }
1445
+ to {
1446
+ transform: translateX(0);
1447
+ opacity: 1;
1448
+ }
1449
+ }
1450
+
1451
+ @keyframes slideOutRight {
1452
+ from {
1453
+ transform: translateX(0);
1454
+ opacity: 1;
1455
+ }
1456
+ to {
1457
+ transform: translateX(100%);
1458
+ opacity: 0;
1459
+ }
1460
+ }