baqueue 0.1.0__py3-none-any.whl

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.
@@ -0,0 +1,1415 @@
1
+ /* ═══════════════════════════════════════════════════════════
2
+ BaQueue Dashboard - Modern Design System
3
+ ═══════════════════════════════════════════════════════════ */
4
+
5
+ :root {
6
+ --bg-base: #05060f;
7
+ --bg-surface: #0c0e1a;
8
+ --bg-elevated: #131627;
9
+ --bg-hover: #1a1e35;
10
+ --bg-active: #232848;
11
+ --border: rgba(255, 255, 255, 0.06);
12
+ --border-hover: rgba(255, 255, 255, 0.12);
13
+ --text-primary: #e8eaf6;
14
+ --text-secondary: #8b90b0;
15
+ --text-muted: #565b7e;
16
+
17
+ --accent: #6c63ff;
18
+ --accent-glow: rgba(108, 99, 255, 0.25);
19
+ --accent-surface: rgba(108, 99, 255, 0.08);
20
+
21
+ --blue: #3b82f6;
22
+ --blue-surface: rgba(59, 130, 246, 0.1);
23
+ --purple: #a855f7;
24
+ --purple-surface: rgba(168, 85, 247, 0.1);
25
+ --green: #10b981;
26
+ --green-surface: rgba(16, 185, 129, 0.1);
27
+ --red: #ef4444;
28
+ --red-surface: rgba(239, 68, 68, 0.1);
29
+ --amber: #f59e0b;
30
+ --amber-surface: rgba(245, 158, 11, 0.1);
31
+
32
+ --radius: 14px;
33
+ --radius-sm: 10px;
34
+ --radius-xs: 6px;
35
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.3);
36
+ --shadow-md: 0 4px 16px rgba(0,0,0,0.3);
37
+ --shadow-lg: 0 12px 48px rgba(0,0,0,0.4);
38
+ --transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
39
+
40
+ --sidebar-w: 240px;
41
+ --sidebar-w-collapsed: 64px;
42
+ --topbar-h: 64px;
43
+ }
44
+
45
+ [data-theme="light"] {
46
+ --bg-base: #f0f2f5;
47
+ --bg-surface: #ffffff;
48
+ --bg-elevated: #ffffff;
49
+ --bg-hover: #f5f6fa;
50
+ --bg-active: #ebedf5;
51
+ --border: rgba(0, 0, 0, 0.08);
52
+ --border-hover: rgba(0, 0, 0, 0.15);
53
+ --text-primary: #111827;
54
+ --text-secondary: #4b5563;
55
+ --text-muted: #9ca3af;
56
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.06);
57
+ --shadow-md: 0 4px 16px rgba(0,0,0,0.08);
58
+ --shadow-lg: 0 12px 48px rgba(0,0,0,0.12);
59
+ --accent-glow: rgba(108, 99, 255, 0.12);
60
+ --accent-surface: rgba(108, 99, 255, 0.06);
61
+ }
62
+
63
+ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
64
+
65
+ body {
66
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
67
+ background: var(--bg-base);
68
+ color: var(--text-primary);
69
+ min-height: 100vh;
70
+ line-height: 1.5;
71
+ -webkit-font-smoothing: antialiased;
72
+ }
73
+
74
+ /* ── Sidebar ────────────────────────────────────────────── */
75
+
76
+ .sidebar {
77
+ position: fixed;
78
+ left: 0; top: 0;
79
+ width: var(--sidebar-w);
80
+ height: 100vh;
81
+ background: var(--bg-surface);
82
+ border-right: 1px solid var(--border);
83
+ display: flex;
84
+ flex-direction: column;
85
+ z-index: 50;
86
+ transition: width var(--transition);
87
+ overflow: hidden;
88
+ }
89
+
90
+ .sidebar.collapsed { width: var(--sidebar-w-collapsed); }
91
+ .sidebar.collapsed .nav-label { display: none; }
92
+ .sidebar.collapsed .sidebar-brand { justify-content: center; padding: 0; }
93
+ .sidebar.collapsed .nav-item { justify-content: center; padding: 10px; }
94
+ .sidebar.collapsed .collapse-icon { transition: transform 0.2s ease; }
95
+
96
+ .sidebar-brand {
97
+ height: var(--topbar-h);
98
+ display: flex;
99
+ align-items: center;
100
+ padding: 0 16px;
101
+ gap: 12px;
102
+ border-bottom: 1px solid var(--border);
103
+ flex-shrink: 0;
104
+ }
105
+
106
+ .brand-icon {
107
+ width: 32px; height: 32px;
108
+ background: linear-gradient(135deg, var(--accent), #a855f7);
109
+ border-radius: var(--radius-xs);
110
+ display: flex;
111
+ align-items: center;
112
+ justify-content: center;
113
+ flex-shrink: 0;
114
+ }
115
+
116
+ .brand-icon svg { width: 18px; height: 18px; color: white; }
117
+
118
+ .brand-text {
119
+ font-size: 18px;
120
+ font-weight: 700;
121
+ background: linear-gradient(135deg, var(--accent), #a855f7);
122
+ -webkit-background-clip: text;
123
+ -webkit-text-fill-color: transparent;
124
+ background-clip: text;
125
+ white-space: nowrap;
126
+ letter-spacing: -0.3px;
127
+ }
128
+
129
+ .sidebar-nav {
130
+ flex: 1;
131
+ padding: 12px 8px;
132
+ display: flex;
133
+ flex-direction: column;
134
+ gap: 4px;
135
+ }
136
+
137
+ .sidebar-footer {
138
+ padding: 12px 8px;
139
+ border-top: 1px solid var(--border);
140
+ }
141
+
142
+ .nav-item {
143
+ display: flex;
144
+ align-items: center;
145
+ gap: 12px;
146
+ padding: 10px 12px;
147
+ border-radius: var(--radius-sm);
148
+ border: none;
149
+ background: transparent;
150
+ color: var(--text-secondary);
151
+ cursor: pointer;
152
+ font-size: 14px;
153
+ font-weight: 500;
154
+ transition: var(--transition);
155
+ white-space: nowrap;
156
+ width: 100%;
157
+ text-align: left;
158
+ }
159
+
160
+ .nav-item svg {
161
+ width: 20px; height: 20px;
162
+ flex-shrink: 0;
163
+ stroke-width: 1.8;
164
+ }
165
+
166
+ .nav-item:hover {
167
+ background: var(--bg-hover);
168
+ color: var(--text-primary);
169
+ }
170
+
171
+ .nav-item.active {
172
+ background: var(--accent-surface);
173
+ color: var(--accent);
174
+ }
175
+
176
+ .nav-item.active svg { color: var(--accent); }
177
+
178
+ .nav-label { white-space: nowrap; overflow: hidden; }
179
+
180
+ /* ── Main Content ───────────────────────────────────────── */
181
+
182
+ .main-content {
183
+ margin-left: var(--sidebar-w);
184
+ min-height: 100vh;
185
+ transition: margin-left var(--transition);
186
+ }
187
+
188
+ .main-content.expanded { margin-left: var(--sidebar-w-collapsed); }
189
+
190
+ /* ── Top Bar ────────────────────────────────────────────── */
191
+
192
+ .topbar {
193
+ height: var(--topbar-h);
194
+ padding: 0 28px;
195
+ display: flex;
196
+ align-items: center;
197
+ justify-content: space-between;
198
+ border-bottom: 1px solid var(--border);
199
+ background: var(--bg-surface);
200
+ position: sticky;
201
+ top: 0;
202
+ z-index: 40;
203
+ backdrop-filter: blur(12px);
204
+ }
205
+
206
+ .topbar-left {
207
+ display: flex;
208
+ align-items: center;
209
+ gap: 16px;
210
+ }
211
+
212
+ .page-title {
213
+ font-size: 18px;
214
+ font-weight: 700;
215
+ letter-spacing: -0.3px;
216
+ }
217
+
218
+ .connection-badge {
219
+ display: flex;
220
+ align-items: center;
221
+ gap: 6px;
222
+ padding: 4px 12px;
223
+ border-radius: 20px;
224
+ font-size: 12px;
225
+ font-weight: 600;
226
+ }
227
+
228
+ .connection-badge.online {
229
+ background: var(--green-surface);
230
+ color: var(--green);
231
+ }
232
+
233
+ .connection-badge.offline {
234
+ background: var(--red-surface);
235
+ color: var(--red);
236
+ }
237
+
238
+ .conn-dot {
239
+ width: 6px; height: 6px;
240
+ border-radius: 50%;
241
+ background: currentColor;
242
+ animation: pulse 2s infinite;
243
+ }
244
+
245
+ @keyframes pulse {
246
+ 0%, 100% { opacity: 1; }
247
+ 50% { opacity: 0.4; }
248
+ }
249
+
250
+ .topbar-right {
251
+ display: flex;
252
+ align-items: center;
253
+ gap: 16px;
254
+ }
255
+
256
+ /* ── Date Filter ────────────────────────────────────────── */
257
+
258
+ .date-filter-group {
259
+ display: flex;
260
+ align-items: center;
261
+ gap: 8px;
262
+ font-size: 12px;
263
+ color: var(--text-muted);
264
+ }
265
+
266
+ .date-filter-group label {
267
+ font-weight: 600;
268
+ text-transform: uppercase;
269
+ letter-spacing: 0.5px;
270
+ }
271
+
272
+ .date-input {
273
+ padding: 6px 10px;
274
+ border-radius: var(--radius-xs);
275
+ border: 1px solid var(--border);
276
+ background: var(--bg-elevated);
277
+ color: var(--text-primary);
278
+ font-size: 12px;
279
+ font-family: inherit;
280
+ outline: none;
281
+ transition: var(--transition);
282
+ }
283
+
284
+ .date-input:focus { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-glow); }
285
+
286
+ .btn-preset {
287
+ padding: 4px 10px;
288
+ border-radius: var(--radius-xs);
289
+ border: 1px solid var(--border);
290
+ background: var(--bg-elevated);
291
+ color: var(--text-secondary);
292
+ font-size: 11px;
293
+ font-weight: 600;
294
+ cursor: pointer;
295
+ transition: var(--transition);
296
+ }
297
+
298
+ .btn-preset:hover {
299
+ background: var(--accent-surface);
300
+ color: var(--accent);
301
+ border-color: var(--accent);
302
+ }
303
+
304
+ .btn-icon {
305
+ display: flex;
306
+ align-items: center;
307
+ justify-content: center;
308
+ width: 32px; height: 32px;
309
+ border-radius: var(--radius-xs);
310
+ border: 1px solid var(--border);
311
+ background: var(--bg-elevated);
312
+ color: var(--text-secondary);
313
+ cursor: pointer;
314
+ transition: var(--transition);
315
+ }
316
+
317
+ .btn-icon:hover { background: var(--bg-hover); color: var(--text-primary); }
318
+
319
+ .theme-btn {
320
+ display: flex;
321
+ align-items: center;
322
+ justify-content: center;
323
+ width: 36px; height: 36px;
324
+ border-radius: var(--radius-sm);
325
+ border: 1px solid var(--border);
326
+ background: var(--bg-elevated);
327
+ color: var(--text-secondary);
328
+ cursor: pointer;
329
+ transition: var(--transition);
330
+ }
331
+
332
+ .theme-btn svg { width: 18px; height: 18px; }
333
+ .theme-btn:hover { background: var(--accent); color: white; border-color: var(--accent); }
334
+
335
+ /* ── Mobile Menu Toggle ─────────────────────────────────── */
336
+
337
+ .menu-toggle {
338
+ display: none;
339
+ align-items: center;
340
+ justify-content: center;
341
+ width: 38px; height: 38px;
342
+ border-radius: var(--radius-sm);
343
+ border: 1px solid var(--border);
344
+ background: var(--bg-elevated);
345
+ color: var(--text-secondary);
346
+ cursor: pointer;
347
+ transition: var(--transition);
348
+ flex-shrink: 0;
349
+ }
350
+
351
+ .menu-toggle svg { width: 20px; height: 20px; }
352
+ .menu-toggle:hover { background: var(--bg-hover); color: var(--text-primary); }
353
+
354
+ .sidebar-backdrop {
355
+ position: fixed;
356
+ inset: 0;
357
+ background: rgba(0, 0, 0, 0.55);
358
+ backdrop-filter: blur(2px);
359
+ z-index: 49;
360
+ opacity: 0;
361
+ pointer-events: none;
362
+ transition: opacity var(--transition);
363
+ }
364
+
365
+ .sidebar-backdrop.visible {
366
+ opacity: 1;
367
+ pointer-events: auto;
368
+ }
369
+
370
+ /* ── Content ────────────────────────────────────────────── */
371
+
372
+ .content-area {
373
+ padding: 24px 28px;
374
+ max-width: 1600px;
375
+ }
376
+
377
+ /* ── Metric Cards ───────────────────────────────────────── */
378
+
379
+ .metric-cards {
380
+ display: grid;
381
+ grid-template-columns: repeat(5, 1fr);
382
+ gap: 16px;
383
+ margin-bottom: 24px;
384
+ }
385
+
386
+ .metric-card {
387
+ background: var(--bg-surface);
388
+ border: 1px solid var(--border);
389
+ border-radius: var(--radius);
390
+ padding: 20px;
391
+ transition: var(--transition);
392
+ position: relative;
393
+ overflow: hidden;
394
+ }
395
+
396
+ .metric-card::before {
397
+ content: '';
398
+ position: absolute;
399
+ top: 0; left: 0; right: 0;
400
+ height: 2px;
401
+ background: var(--accent);
402
+ opacity: 0;
403
+ transition: var(--transition);
404
+ }
405
+
406
+ .metric-card:hover { border-color: var(--border-hover); transform: translateY(-1px); box-shadow: var(--shadow-md); }
407
+ .metric-card:hover::before { opacity: 1; }
408
+
409
+ .metric-card.accent-blue::before { background: var(--blue); }
410
+ .metric-card.accent-purple::before { background: var(--purple); }
411
+ .metric-card.accent-green::before { background: var(--green); }
412
+ .metric-card.accent-red::before { background: var(--red); }
413
+ .metric-card:hover::before { opacity: 1; }
414
+
415
+ .metric-header {
416
+ display: flex;
417
+ justify-content: space-between;
418
+ align-items: flex-start;
419
+ margin-bottom: 12px;
420
+ }
421
+
422
+ .metric-label {
423
+ font-size: 13px;
424
+ color: var(--text-secondary);
425
+ font-weight: 500;
426
+ }
427
+
428
+ .metric-icon {
429
+ width: 36px; height: 36px;
430
+ border-radius: var(--radius-xs);
431
+ display: flex;
432
+ align-items: center;
433
+ justify-content: center;
434
+ }
435
+
436
+ .metric-icon svg { width: 18px; height: 18px; }
437
+
438
+ .metric-icon.total { background: var(--accent-surface); color: var(--accent); }
439
+ .metric-icon.pending { background: var(--blue-surface); color: var(--blue); }
440
+ .metric-icon.processing { background: var(--purple-surface); color: var(--purple); }
441
+ .metric-icon.completed { background: var(--green-surface); color: var(--green); }
442
+ .metric-icon.failed { background: var(--red-surface); color: var(--red); }
443
+
444
+ .metric-value {
445
+ font-size: 32px;
446
+ font-weight: 800;
447
+ letter-spacing: -1.5px;
448
+ line-height: 1;
449
+ margin-bottom: 8px;
450
+ }
451
+
452
+ .metric-sub {
453
+ font-size: 12px;
454
+ color: var(--text-muted);
455
+ }
456
+
457
+ .metric-bar {
458
+ height: 4px;
459
+ background: var(--bg-hover);
460
+ border-radius: 2px;
461
+ margin-top: 12px;
462
+ overflow: hidden;
463
+ }
464
+
465
+ .metric-bar-fill {
466
+ height: 100%;
467
+ border-radius: 2px;
468
+ transition: width 0.8s cubic-bezier(0.4, 0, 0.2, 1);
469
+ }
470
+
471
+ .metric-bar-fill.pending { background: var(--blue); }
472
+ .metric-bar-fill.processing { background: var(--purple); }
473
+ .metric-bar-fill.completed { background: var(--green); }
474
+ .metric-bar-fill.failed { background: var(--red); }
475
+
476
+ /* ── Panel ──────────────────────────────────────────────── */
477
+
478
+ .panel {
479
+ background: var(--bg-surface);
480
+ border: 1px solid var(--border);
481
+ border-radius: var(--radius);
482
+ margin-bottom: 24px;
483
+ overflow: hidden;
484
+ }
485
+
486
+ .panel-header {
487
+ padding: 16px 24px;
488
+ border-bottom: 1px solid var(--border);
489
+ display: flex;
490
+ align-items: center;
491
+ justify-content: space-between;
492
+ flex-wrap: wrap;
493
+ gap: 12px;
494
+ }
495
+
496
+ .panel-header h2 {
497
+ font-size: 15px;
498
+ font-weight: 700;
499
+ letter-spacing: -0.2px;
500
+ }
501
+
502
+ .panel-badge {
503
+ padding: 3px 10px;
504
+ border-radius: 20px;
505
+ font-size: 11px;
506
+ font-weight: 600;
507
+ background: var(--bg-hover);
508
+ color: var(--text-secondary);
509
+ margin-left: 8px;
510
+ }
511
+
512
+ .panel-badge.green { background: var(--green-surface); color: var(--green); }
513
+ .panel-badge.red { background: var(--red-surface); color: var(--red); }
514
+
515
+ .panel-body { padding: 20px 24px; }
516
+ .panel-body.no-pad { padding: 0; }
517
+
518
+ .panel-footer {
519
+ padding: 12px 24px;
520
+ border-top: 1px solid var(--border);
521
+ display: flex;
522
+ align-items: center;
523
+ justify-content: space-between;
524
+ }
525
+
526
+ /* ── Queue Breakdown ────────────────────────────────────── */
527
+
528
+ .queue-row {
529
+ display: grid;
530
+ grid-template-columns: 160px 1fr 240px;
531
+ align-items: center;
532
+ gap: 20px;
533
+ padding: 14px 24px;
534
+ border-bottom: 1px solid var(--border);
535
+ transition: var(--transition);
536
+ }
537
+
538
+ .queue-row:hover { background: var(--bg-hover); }
539
+ .queue-row:last-child { border-bottom: none; }
540
+
541
+ .queue-info { display: flex; flex-direction: column; gap: 2px; }
542
+ .queue-name { font-weight: 600; font-size: 14px; }
543
+ .queue-total { font-size: 12px; color: var(--text-muted); }
544
+
545
+ .queue-bars { width: 100%; }
546
+
547
+ .queue-bar-track {
548
+ height: 8px;
549
+ background: var(--bg-hover);
550
+ border-radius: 4px;
551
+ display: flex;
552
+ overflow: hidden;
553
+ }
554
+
555
+ .queue-bar-seg {
556
+ height: 100%;
557
+ transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);
558
+ }
559
+
560
+ .queue-bar-seg.completed { background: var(--green); }
561
+ .queue-bar-seg.processing { background: var(--purple); }
562
+ .queue-bar-seg.pending { background: var(--blue); }
563
+ .queue-bar-seg.failed { background: var(--red); }
564
+
565
+ .queue-stats { display: flex; gap: 14px; }
566
+
567
+ .qs-item {
568
+ display: flex;
569
+ align-items: center;
570
+ gap: 5px;
571
+ font-size: 13px;
572
+ font-weight: 600;
573
+ }
574
+
575
+ .qs-dot {
576
+ width: 8px; height: 8px;
577
+ border-radius: 50%;
578
+ }
579
+
580
+ .qs-dot.pending { background: var(--blue); }
581
+ .qs-dot.processing { background: var(--purple); }
582
+ .qs-dot.completed { background: var(--green); }
583
+ .qs-dot.failed { background: var(--red); }
584
+
585
+ /* ── Activity / Recent Jobs ─────────────────────────────── */
586
+
587
+ .activity-list { max-height: 400px; overflow-y: auto; }
588
+
589
+ .activity-item {
590
+ display: flex;
591
+ align-items: center;
592
+ gap: 14px;
593
+ padding: 12px 24px;
594
+ border-bottom: 1px solid var(--border);
595
+ cursor: pointer;
596
+ transition: var(--transition);
597
+ }
598
+
599
+ .activity-item:hover { background: var(--bg-hover); }
600
+ .activity-item:last-child { border-bottom: none; }
601
+
602
+ .activity-status {
603
+ width: 10px; height: 10px;
604
+ border-radius: 50%;
605
+ flex-shrink: 0;
606
+ }
607
+
608
+ .activity-status.pending { background: var(--blue); }
609
+ .activity-status.processing { background: var(--purple); animation: pulse 1.5s infinite; }
610
+ .activity-status.completed { background: var(--green); }
611
+ .activity-status.failed { background: var(--red); }
612
+
613
+ .activity-info { flex: 1; min-width: 0; }
614
+
615
+ .activity-title { display: flex; align-items: center; gap: 8px; }
616
+
617
+ .activity-class { font-weight: 600; font-size: 14px; }
618
+
619
+ .activity-queue {
620
+ padding: 2px 8px;
621
+ border-radius: 4px;
622
+ font-size: 11px;
623
+ font-weight: 600;
624
+ background: var(--bg-hover);
625
+ color: var(--text-muted);
626
+ }
627
+
628
+ .activity-meta {
629
+ display: flex;
630
+ gap: 12px;
631
+ font-size: 12px;
632
+ color: var(--text-muted);
633
+ margin-top: 2px;
634
+ }
635
+
636
+ .activity-time {
637
+ font-size: 12px;
638
+ color: var(--text-muted);
639
+ white-space: nowrap;
640
+ flex-shrink: 0;
641
+ }
642
+
643
+ /* ── Jobs Table ─────────────────────────────────────────── */
644
+
645
+ .filter-bar {
646
+ display: flex;
647
+ align-items: center;
648
+ gap: 16px;
649
+ flex-wrap: wrap;
650
+ }
651
+
652
+ .filter-group { display: flex; gap: 8px; flex-wrap: wrap; }
653
+
654
+ .filter-select, .filter-input {
655
+ padding: 7px 12px;
656
+ border-radius: var(--radius-xs);
657
+ border: 1px solid var(--border);
658
+ background: var(--bg-elevated);
659
+ color: var(--text-primary);
660
+ font-size: 13px;
661
+ font-family: inherit;
662
+ outline: none;
663
+ transition: var(--transition);
664
+ min-width: 120px;
665
+ }
666
+
667
+ .filter-select:focus, .filter-input:focus {
668
+ border-color: var(--accent);
669
+ box-shadow: 0 0 0 2px var(--accent-glow);
670
+ }
671
+
672
+ .jobs-count { font-size: 13px; color: var(--text-muted); display: inline-flex; align-items: center; gap: 10px; }
673
+
674
+ .live-indicator {
675
+ display: inline-flex;
676
+ align-items: center;
677
+ gap: 6px;
678
+ font-size: 11px;
679
+ font-weight: 700;
680
+ letter-spacing: 0.5px;
681
+ color: var(--green);
682
+ background: var(--green-surface);
683
+ padding: 2px 8px;
684
+ border-radius: 999px;
685
+ }
686
+
687
+ .live-indicator .live-dot {
688
+ width: 6px; height: 6px;
689
+ border-radius: 50%;
690
+ background: var(--green);
691
+ animation: pulse 1.5s infinite;
692
+ }
693
+
694
+ .jobs-table { width: 100%; border-collapse: collapse; }
695
+
696
+ .jobs-table th {
697
+ text-align: left;
698
+ padding: 10px 16px;
699
+ font-size: 11px;
700
+ font-weight: 700;
701
+ color: var(--text-muted);
702
+ text-transform: uppercase;
703
+ letter-spacing: 0.6px;
704
+ border-bottom: 1px solid var(--border);
705
+ background: var(--bg-elevated);
706
+ }
707
+
708
+ .jobs-table td {
709
+ padding: 10px 16px;
710
+ font-size: 13px;
711
+ border-bottom: 1px solid var(--border);
712
+ transition: var(--transition);
713
+ }
714
+
715
+ .clickable-row { cursor: pointer; }
716
+ .clickable-row:hover td { background: var(--bg-hover); }
717
+ .clickable-row:last-child td { border-bottom: none; }
718
+
719
+ @keyframes row-enter-anim {
720
+ 0% { background: var(--blue-surface); transform: translateY(-4px); opacity: 0; }
721
+ 60% { background: var(--blue-surface); transform: translateY(0); opacity: 1; }
722
+ 100% { background: transparent; transform: translateY(0); opacity: 1; }
723
+ }
724
+
725
+ @keyframes row-flash-anim {
726
+ 0% { background: var(--purple-surface); }
727
+ 100% { background: transparent; }
728
+ }
729
+
730
+ .clickable-row.row-enter td { animation: row-enter-anim 700ms ease-out; }
731
+ .clickable-row.row-flash td { animation: row-flash-anim 700ms ease-out; }
732
+
733
+ .cell-id { font-size: 12px; }
734
+ .cell-class { font-weight: 600; max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
735
+ .cell-time { font-size: 12px; color: var(--text-muted); white-space: nowrap; }
736
+
737
+ .cell-attempts { font-size: 13px; }
738
+
739
+ .attempt-bar {
740
+ height: 3px;
741
+ background: var(--bg-hover);
742
+ border-radius: 2px;
743
+ margin-top: 4px;
744
+ width: 60px;
745
+ overflow: hidden;
746
+ }
747
+
748
+ .attempt-fill {
749
+ height: 100%;
750
+ background: var(--amber);
751
+ border-radius: 2px;
752
+ transition: width 0.4s ease;
753
+ max-width: 100%;
754
+ }
755
+
756
+ .attempt-fill.over { background: var(--red); }
757
+
758
+ /* ── Status & Queue Pills ───────────────────────────────── */
759
+
760
+ .status-pill {
761
+ display: inline-flex;
762
+ align-items: center;
763
+ gap: 6px;
764
+ padding: 4px 12px;
765
+ border-radius: 20px;
766
+ font-size: 12px;
767
+ font-weight: 600;
768
+ text-transform: capitalize;
769
+ }
770
+
771
+ .status-pill.lg { font-size: 14px; padding: 6px 16px; }
772
+
773
+ .status-dot-sm {
774
+ width: 6px; height: 6px;
775
+ border-radius: 50%;
776
+ background: currentColor;
777
+ }
778
+
779
+ .status-pill.pending { background: var(--blue-surface); color: var(--blue); }
780
+ .status-pill.processing { background: var(--purple-surface); color: var(--purple); }
781
+ .status-pill.completed { background: var(--green-surface); color: var(--green); }
782
+ .status-pill.failed { background: var(--red-surface); color: var(--red); }
783
+
784
+ .queue-pill {
785
+ display: inline-block;
786
+ padding: 3px 10px;
787
+ border-radius: 4px;
788
+ font-size: 12px;
789
+ font-weight: 600;
790
+ background: var(--bg-hover);
791
+ color: var(--text-secondary);
792
+ }
793
+
794
+ .queue-pill.lg { font-size: 14px; padding: 5px 14px; }
795
+
796
+ /* ── Scheduled Badge ────────────────────────────────────── */
797
+
798
+ .status-cell {
799
+ display: inline-flex;
800
+ align-items: center;
801
+ gap: 8px;
802
+ flex-wrap: wrap;
803
+ }
804
+
805
+ .scheduled-badge {
806
+ display: inline-flex;
807
+ align-items: center;
808
+ gap: 4px;
809
+ padding: 3px 8px;
810
+ border-radius: 20px;
811
+ font-size: 11px;
812
+ font-weight: 600;
813
+ background: var(--amber-surface);
814
+ color: var(--amber);
815
+ border: 1px solid transparent;
816
+ cursor: help;
817
+ white-space: nowrap;
818
+ line-height: 1;
819
+ }
820
+
821
+ .scheduled-badge svg {
822
+ width: 11px;
823
+ height: 11px;
824
+ stroke-width: 2.2;
825
+ }
826
+
827
+ .scheduled-badge:hover {
828
+ border-color: var(--amber);
829
+ }
830
+
831
+ .dc-scheduled {
832
+ display: flex;
833
+ align-items: center;
834
+ gap: 10px;
835
+ flex-wrap: wrap;
836
+ }
837
+
838
+ .dc-scheduled .dc-value {
839
+ font-family: 'JetBrains Mono', monospace;
840
+ font-size: 13px;
841
+ font-weight: 500;
842
+ color: var(--text-secondary);
843
+ }
844
+
845
+ .tl-dot.scheduled { border-color: var(--amber); background: var(--amber); }
846
+
847
+ /* ── Tooltip ────────────────────────────────────────────── */
848
+
849
+ .tooltip-host { position: relative; }
850
+
851
+ .tooltip-host::after {
852
+ content: attr(data-tooltip);
853
+ position: absolute;
854
+ bottom: calc(100% + 8px);
855
+ left: 50%;
856
+ transform: translateX(-50%) translateY(4px);
857
+ padding: 6px 10px;
858
+ background: var(--bg-active);
859
+ border: 1px solid var(--border-hover);
860
+ border-radius: var(--radius-xs);
861
+ font-size: 11px;
862
+ font-weight: 500;
863
+ color: var(--text-primary);
864
+ white-space: nowrap;
865
+ opacity: 0;
866
+ pointer-events: none;
867
+ transition: opacity 0.15s ease, transform 0.15s ease;
868
+ z-index: 100;
869
+ box-shadow: var(--shadow-md);
870
+ }
871
+
872
+ .tooltip-host::before {
873
+ content: '';
874
+ position: absolute;
875
+ bottom: calc(100% + 4px);
876
+ left: 50%;
877
+ transform: translateX(-50%);
878
+ border: 4px solid transparent;
879
+ border-top-color: var(--border-hover);
880
+ opacity: 0;
881
+ pointer-events: none;
882
+ transition: opacity 0.15s ease;
883
+ z-index: 100;
884
+ }
885
+
886
+ .tooltip-host:hover::after,
887
+ .tooltip-host:hover::before {
888
+ opacity: 1;
889
+ }
890
+
891
+ .tooltip-host:hover::after {
892
+ transform: translateX(-50%) translateY(0);
893
+ }
894
+
895
+ .btn-action {
896
+ display: flex;
897
+ align-items: center;
898
+ justify-content: center;
899
+ width: 28px; height: 28px;
900
+ border-radius: var(--radius-xs);
901
+ border: none;
902
+ background: transparent;
903
+ color: var(--text-muted);
904
+ cursor: pointer;
905
+ transition: var(--transition);
906
+ }
907
+
908
+ .btn-action:hover { background: var(--bg-active); color: var(--text-primary); }
909
+
910
+ /* ── Pagination ─────────────────────────────────────────── */
911
+
912
+ .page-info { font-size: 13px; color: var(--text-muted); }
913
+
914
+ .page-btns { display: flex; gap: 8px; }
915
+
916
+ .btn-page {
917
+ display: flex;
918
+ align-items: center;
919
+ gap: 4px;
920
+ padding: 6px 14px;
921
+ border-radius: var(--radius-xs);
922
+ border: 1px solid var(--border);
923
+ background: var(--bg-elevated);
924
+ color: var(--text-secondary);
925
+ font-size: 13px;
926
+ font-weight: 500;
927
+ cursor: pointer;
928
+ transition: var(--transition);
929
+ }
930
+
931
+ .btn-page:hover:not(:disabled) { background: var(--bg-hover); color: var(--text-primary); }
932
+ .btn-page:disabled { opacity: 0.3; cursor: not-allowed; }
933
+
934
+ .btn-sm {
935
+ padding: 5px 14px;
936
+ border-radius: var(--radius-xs);
937
+ border: 1px solid var(--border);
938
+ background: var(--bg-elevated);
939
+ color: var(--text-secondary);
940
+ font-size: 12px;
941
+ font-weight: 600;
942
+ cursor: pointer;
943
+ transition: var(--transition);
944
+ }
945
+
946
+ .btn-sm:hover { background: var(--bg-hover); color: var(--text-primary); }
947
+
948
+ .btn-bulk-retry {
949
+ display: inline-flex;
950
+ align-items: center;
951
+ gap: 6px;
952
+ padding: 6px 12px;
953
+ border-radius: var(--radius-xs);
954
+ border: 1px solid transparent;
955
+ background: var(--amber-surface);
956
+ color: var(--amber);
957
+ font-size: 12px;
958
+ font-weight: 600;
959
+ cursor: pointer;
960
+ transition: var(--transition);
961
+ }
962
+
963
+ .btn-bulk-retry svg { width: 14px; height: 14px; stroke-width: 2.2; }
964
+
965
+ .btn-bulk-retry:hover {
966
+ background: var(--amber);
967
+ color: white;
968
+ border-color: var(--amber);
969
+ }
970
+
971
+ /* ── Queue Cards ────────────────────────────────────────── */
972
+
973
+ .queue-cards {
974
+ display: grid;
975
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
976
+ gap: 16px;
977
+ }
978
+
979
+ .queue-card {
980
+ background: var(--bg-surface);
981
+ border: 1px solid var(--border);
982
+ border-radius: var(--radius);
983
+ padding: 24px;
984
+ cursor: pointer;
985
+ transition: var(--transition);
986
+ }
987
+
988
+ .queue-card:hover { border-color: var(--accent); transform: translateY(-2px); box-shadow: var(--shadow-md); }
989
+
990
+ .qc-header {
991
+ display: flex;
992
+ justify-content: space-between;
993
+ align-items: center;
994
+ margin-bottom: 16px;
995
+ }
996
+
997
+ .qc-header h3 { font-size: 16px; font-weight: 700; }
998
+
999
+ .qc-total {
1000
+ font-size: 28px;
1001
+ font-weight: 800;
1002
+ letter-spacing: -1px;
1003
+ color: var(--accent);
1004
+ }
1005
+
1006
+ .qc-bar-track {
1007
+ height: 6px;
1008
+ background: var(--bg-hover);
1009
+ border-radius: 3px;
1010
+ display: flex;
1011
+ overflow: hidden;
1012
+ margin-bottom: 20px;
1013
+ }
1014
+
1015
+ .qc-stats {
1016
+ display: grid;
1017
+ grid-template-columns: repeat(4, 1fr);
1018
+ gap: 12px;
1019
+ }
1020
+
1021
+ .qc-stat { text-align: center; }
1022
+
1023
+ .qc-stat-val {
1024
+ display: block;
1025
+ font-size: 20px;
1026
+ font-weight: 700;
1027
+ letter-spacing: -0.5px;
1028
+ }
1029
+
1030
+ .qc-stat-val.pending { color: var(--blue); }
1031
+ .qc-stat-val.processing { color: var(--purple); }
1032
+ .qc-stat-val.completed { color: var(--green); }
1033
+ .qc-stat-val.failed { color: var(--red); }
1034
+
1035
+ .qc-stat-lbl {
1036
+ display: block;
1037
+ font-size: 11px;
1038
+ color: var(--text-muted);
1039
+ text-transform: uppercase;
1040
+ letter-spacing: 0.5px;
1041
+ margin-top: 2px;
1042
+ }
1043
+
1044
+ .qc-stat-rate {
1045
+ display: block;
1046
+ font-size: 11px;
1047
+ font-weight: 600;
1048
+ color: var(--text-muted);
1049
+ margin-top: 4px;
1050
+ font-variant-numeric: tabular-nums;
1051
+ }
1052
+
1053
+ /* ── Worker Tiles ───────────────────────────────────────── */
1054
+
1055
+ .workers-grid {
1056
+ display: grid;
1057
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
1058
+ gap: 16px;
1059
+ padding: 20px 24px;
1060
+ }
1061
+
1062
+ .worker-tile {
1063
+ background: var(--bg-elevated);
1064
+ border: 1px solid var(--border);
1065
+ border-radius: var(--radius-sm);
1066
+ padding: 16px;
1067
+ transition: var(--transition);
1068
+ }
1069
+
1070
+ .worker-tile.active { border-color: var(--green); border-left: 3px solid var(--green); }
1071
+ .worker-tile:hover { border-color: var(--border-hover); }
1072
+
1073
+ .wt-header {
1074
+ display: flex;
1075
+ justify-content: space-between;
1076
+ align-items: center;
1077
+ margin-bottom: 12px;
1078
+ }
1079
+
1080
+ .wt-name { font-weight: 600; font-size: 14px; }
1081
+
1082
+ .wt-status {
1083
+ font-size: 11px;
1084
+ font-weight: 700;
1085
+ padding: 2px 8px;
1086
+ border-radius: 4px;
1087
+ text-transform: uppercase;
1088
+ letter-spacing: 0.5px;
1089
+ }
1090
+
1091
+ .wt-status.running { background: var(--green-surface); color: var(--green); }
1092
+ .wt-status.idle { background: var(--bg-hover); color: var(--text-muted); }
1093
+
1094
+ .wt-stats { display: flex; gap: 20px; }
1095
+
1096
+ .wt-stat { display: flex; flex-direction: column; }
1097
+ .wt-stat-val { font-size: 18px; font-weight: 700; }
1098
+ .wt-stat-val.failed { color: var(--red); }
1099
+ .wt-stat-lbl { font-size: 11px; color: var(--text-muted); }
1100
+
1101
+ .wt-current {
1102
+ margin-top: 12px;
1103
+ padding-top: 12px;
1104
+ border-top: 1px solid var(--border);
1105
+ font-size: 12px;
1106
+ color: var(--text-muted);
1107
+ display: flex;
1108
+ gap: 6px;
1109
+ }
1110
+
1111
+ .wt-current-label { font-weight: 600; }
1112
+
1113
+ /* ── Modal ──────────────────────────────────────────────── */
1114
+
1115
+ .modal-overlay {
1116
+ position: fixed;
1117
+ inset: 0;
1118
+ background: rgba(0, 0, 0, 0.65);
1119
+ backdrop-filter: blur(6px);
1120
+ display: flex;
1121
+ align-items: center;
1122
+ justify-content: center;
1123
+ z-index: 200;
1124
+ padding: 20px;
1125
+ }
1126
+
1127
+ .modal-panel {
1128
+ background: var(--bg-surface);
1129
+ border: 1px solid var(--border);
1130
+ border-radius: var(--radius);
1131
+ width: 100%;
1132
+ max-width: 680px;
1133
+ max-height: 85vh;
1134
+ display: flex;
1135
+ flex-direction: column;
1136
+ box-shadow: var(--shadow-lg);
1137
+ animation: modalIn 0.25s ease;
1138
+ }
1139
+
1140
+ @keyframes modalIn {
1141
+ from { opacity: 0; transform: translateY(12px) scale(0.97); }
1142
+ to { opacity: 1; transform: translateY(0) scale(1); }
1143
+ }
1144
+
1145
+ .modal-top {
1146
+ padding: 20px 24px;
1147
+ border-bottom: 1px solid var(--border);
1148
+ display: flex;
1149
+ justify-content: space-between;
1150
+ align-items: flex-start;
1151
+ flex-shrink: 0;
1152
+ }
1153
+
1154
+ .modal-top h2 { font-size: 18px; font-weight: 700; margin-bottom: 4px; }
1155
+
1156
+ .modal-content {
1157
+ padding: 20px 24px;
1158
+ overflow-y: auto;
1159
+ flex: 1;
1160
+ }
1161
+
1162
+ .modal-actions {
1163
+ padding: 16px 24px;
1164
+ border-top: 1px solid var(--border);
1165
+ display: flex;
1166
+ gap: 10px;
1167
+ justify-content: flex-end;
1168
+ flex-shrink: 0;
1169
+ }
1170
+
1171
+ /* ── Detail Grid ────────────────────────────────────────── */
1172
+
1173
+ .detail-grid {
1174
+ display: grid;
1175
+ grid-template-columns: repeat(2, 1fr);
1176
+ gap: 12px;
1177
+ margin-bottom: 20px;
1178
+ }
1179
+
1180
+ .detail-card {
1181
+ background: var(--bg-elevated);
1182
+ border: 1px solid var(--border);
1183
+ border-radius: var(--radius-sm);
1184
+ padding: 12px 16px;
1185
+ display: flex;
1186
+ flex-direction: column;
1187
+ gap: 6px;
1188
+ }
1189
+
1190
+ .dc-label { font-size: 11px; color: var(--text-muted); font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; }
1191
+ .dc-value { font-size: 15px; font-weight: 600; }
1192
+
1193
+ /* ── Detail Sections ────────────────────────────────────── */
1194
+
1195
+ .detail-section { margin-bottom: 20px; }
1196
+ .detail-section h4 {
1197
+ font-size: 12px;
1198
+ font-weight: 700;
1199
+ color: var(--text-muted);
1200
+ text-transform: uppercase;
1201
+ letter-spacing: 0.5px;
1202
+ margin-bottom: 10px;
1203
+ }
1204
+
1205
+ .code-block {
1206
+ display: block;
1207
+ padding: 10px 14px;
1208
+ background: var(--bg-elevated);
1209
+ border: 1px solid var(--border);
1210
+ border-radius: var(--radius-xs);
1211
+ font-family: 'JetBrains Mono', monospace;
1212
+ font-size: 13px;
1213
+ word-break: break-all;
1214
+ }
1215
+
1216
+ .code-pre {
1217
+ display: block;
1218
+ padding: 14px;
1219
+ background: var(--bg-elevated);
1220
+ border: 1px solid var(--border);
1221
+ border-radius: var(--radius-xs);
1222
+ font-family: 'JetBrains Mono', monospace;
1223
+ font-size: 12px;
1224
+ white-space: pre-wrap;
1225
+ max-height: 200px;
1226
+ overflow-y: auto;
1227
+ line-height: 1.6;
1228
+ }
1229
+
1230
+ .code-pre.error { color: var(--red); border-color: var(--red-surface); }
1231
+
1232
+ .error-section h4 { color: var(--red); }
1233
+
1234
+ /* ── Timeline ───────────────────────────────────────────── */
1235
+
1236
+ .timeline { padding-left: 8px; }
1237
+
1238
+ .tl-item {
1239
+ display: flex;
1240
+ align-items: flex-start;
1241
+ gap: 14px;
1242
+ padding: 8px 0;
1243
+ position: relative;
1244
+ }
1245
+
1246
+ .tl-item:not(:last-child)::before {
1247
+ content: '';
1248
+ position: absolute;
1249
+ left: 5px;
1250
+ top: 22px;
1251
+ bottom: -8px;
1252
+ width: 1px;
1253
+ background: var(--border);
1254
+ }
1255
+
1256
+ .tl-dot {
1257
+ width: 11px; height: 11px;
1258
+ border-radius: 50%;
1259
+ flex-shrink: 0;
1260
+ margin-top: 4px;
1261
+ border: 2px solid;
1262
+ }
1263
+
1264
+ .tl-dot.created { border-color: var(--text-muted); background: var(--bg-surface); }
1265
+ .tl-dot.processing { border-color: var(--purple); background: var(--purple); }
1266
+ .tl-dot.completed { border-color: var(--green); background: var(--green); }
1267
+ .tl-dot.failed { border-color: var(--red); background: var(--red); }
1268
+
1269
+ .tl-content { display: flex; flex-direction: column; gap: 1px; }
1270
+ .tl-label { font-size: 13px; font-weight: 600; }
1271
+ .tl-time { font-size: 12px; color: var(--text-muted); font-family: 'JetBrains Mono', monospace; }
1272
+
1273
+ /* ── Tags ───────────────────────────────────────────────── */
1274
+
1275
+ .tags-list { display: flex; gap: 6px; flex-wrap: wrap; }
1276
+
1277
+ .tag-chip {
1278
+ padding: 3px 10px;
1279
+ border-radius: 4px;
1280
+ font-size: 12px;
1281
+ font-weight: 600;
1282
+ background: var(--accent-surface);
1283
+ color: var(--accent);
1284
+ }
1285
+
1286
+ /* ── Buttons ────────────────────────────────────────────── */
1287
+
1288
+ .btn-primary {
1289
+ display: inline-flex;
1290
+ align-items: center;
1291
+ gap: 6px;
1292
+ padding: 8px 18px;
1293
+ border-radius: var(--radius-xs);
1294
+ border: none;
1295
+ background: var(--accent);
1296
+ color: white;
1297
+ font-size: 13px;
1298
+ font-weight: 600;
1299
+ cursor: pointer;
1300
+ transition: var(--transition);
1301
+ }
1302
+
1303
+ .btn-primary:hover { background: #5a52e0; }
1304
+
1305
+ .btn-danger {
1306
+ display: inline-flex;
1307
+ align-items: center;
1308
+ gap: 6px;
1309
+ padding: 8px 18px;
1310
+ border-radius: var(--radius-xs);
1311
+ border: 1px solid transparent;
1312
+ background: var(--red-surface);
1313
+ color: var(--red);
1314
+ font-size: 13px;
1315
+ font-weight: 600;
1316
+ cursor: pointer;
1317
+ transition: var(--transition);
1318
+ }
1319
+
1320
+ .btn-danger:hover { background: var(--red); color: white; }
1321
+
1322
+ /* ── Empty State ────────────────────────────────────────── */
1323
+
1324
+ .empty-state {
1325
+ text-align: center;
1326
+ padding: 60px 20px;
1327
+ color: var(--text-muted);
1328
+ }
1329
+
1330
+ .empty-state.small { padding: 40px 20px; }
1331
+
1332
+ .empty-icon {
1333
+ width: 48px; height: 48px;
1334
+ margin: 0 auto 16px;
1335
+ opacity: 0.4;
1336
+ color: var(--text-muted);
1337
+ }
1338
+
1339
+ .empty-state p { font-size: 14px; font-weight: 500; color: var(--text-secondary); margin-bottom: 4px; }
1340
+ .empty-state span { font-size: 13px; }
1341
+
1342
+ /* ── Utilities ──────────────────────────────────────────── */
1343
+
1344
+ .mono { font-family: 'JetBrains Mono', monospace; font-size: 12px; }
1345
+ .text-muted { color: var(--text-muted); }
1346
+
1347
+ /* ── Scrollbar ──────────────────────────────────────────── */
1348
+
1349
+ ::-webkit-scrollbar { width: 5px; height: 5px; }
1350
+ ::-webkit-scrollbar-track { background: transparent; }
1351
+ ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
1352
+ ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); }
1353
+
1354
+ /* ── Responsive ─────────────────────────────────────────── */
1355
+
1356
+ @media (max-width: 1200px) {
1357
+ .metric-cards { grid-template-columns: repeat(3, 1fr); }
1358
+ .queue-row { grid-template-columns: 120px 1fr; }
1359
+ .queue-stats { display: none; }
1360
+ }
1361
+
1362
+ @media (max-width: 900px) {
1363
+ /* Sidebar becomes a slide-in drawer */
1364
+ .sidebar {
1365
+ transform: translateX(-100%);
1366
+ transition: transform var(--transition);
1367
+ box-shadow: var(--shadow-lg);
1368
+ }
1369
+ .sidebar.mobile-open { transform: translateX(0); }
1370
+ /* Disable desktop "collapsed" mode on mobile — drawer is full width */
1371
+ .sidebar.collapsed { width: var(--sidebar-w); }
1372
+ .sidebar.collapsed .nav-label { display: inline; }
1373
+ .sidebar.collapsed .sidebar-brand { justify-content: flex-start; padding: 0 16px; }
1374
+ .sidebar.collapsed .nav-item { justify-content: flex-start; padding: 10px 12px; }
1375
+ /* Hide the desktop collapse button on mobile */
1376
+ .sidebar-footer { display: none; }
1377
+
1378
+ .main-content { margin-left: 0 !important; }
1379
+ .menu-toggle { display: inline-flex; }
1380
+
1381
+ .metric-cards { grid-template-columns: repeat(2, 1fr); gap: 12px; }
1382
+ .content-area { padding: 16px; }
1383
+ .topbar { padding: 0 12px; gap: 8px; }
1384
+ .topbar-left { gap: 10px; min-width: 0; }
1385
+ .topbar-right { gap: 8px; }
1386
+ .page-title { font-size: 16px; }
1387
+ .date-filter-group { display: none; }
1388
+ .detail-grid { grid-template-columns: 1fr; }
1389
+
1390
+ .panel-header { padding: 14px 16px; }
1391
+ .panel-body { padding: 16px; }
1392
+ .panel-footer { padding: 12px 16px; }
1393
+ .workers-grid { padding: 16px; gap: 12px; }
1394
+ }
1395
+
1396
+ @media (max-width: 640px) {
1397
+ .metric-cards { grid-template-columns: 1fr; }
1398
+ .filter-group { flex-direction: column; width: 100%; }
1399
+ .filter-select, .filter-input { width: 100%; }
1400
+
1401
+ /* Make jobs table horizontally scrollable so it stays readable */
1402
+ .jobs-table { min-width: 720px; }
1403
+ .panel-body.no-pad { overflow-x: auto; }
1404
+
1405
+ .queue-cards { grid-template-columns: 1fr; }
1406
+ .qc-stats { grid-template-columns: repeat(2, 1fr); gap: 14px 12px; }
1407
+
1408
+ .modal-panel { max-height: 92vh; }
1409
+ .modal-top { padding: 16px; }
1410
+ .modal-content { padding: 16px; }
1411
+ .modal-actions { padding: 12px 16px; flex-wrap: wrap; }
1412
+
1413
+ .connection-badge { padding: 4px 8px; font-size: 11px; }
1414
+ .page-title { font-size: 15px; }
1415
+ }