sidekiq_queue_manager 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1018 @@
1
+ /*
2
+ * Sidekiq Queue Manager - shadcn-Inspired Professional Interface
3
+ *
4
+ * A comprehensive stylesheet for the Sidekiq Queue Manager gem
5
+ * Inspired by shadcn/ui design principles: minimal, accessible, beautiful
6
+ *
7
+ * Version: 2.0.0 (Redesigned)
8
+ * Design Philosophy: Compact minimalism with perfect dark/light mode
9
+ *
10
+ *= require_self
11
+ *= require sidekiq_queue_manager/modals
12
+ */
13
+
14
+ /* ========================================
15
+ Design System Foundation - shadcn Inspired
16
+ ======================================== */
17
+
18
+ :root {
19
+ /* ===== Color System - Light Mode ===== */
20
+ --sqm-background: hsl(0 0% 100%);
21
+ --sqm-foreground: hsl(222.2 84% 4.9%);
22
+
23
+ --sqm-card: hsl(0 0% 100%);
24
+ --sqm-card-foreground: hsl(222.2 84% 4.9%);
25
+
26
+ --sqm-popover: hsl(0 0% 100%);
27
+ --sqm-popover-foreground: hsl(222.2 84% 4.9%);
28
+
29
+ --sqm-primary: hsl(221.2 83.2% 53.3%);
30
+ --sqm-primary-foreground: hsl(210 40% 98%);
31
+
32
+ --sqm-secondary: hsl(210 40% 96%);
33
+ --sqm-secondary-foreground: hsl(222.2 84% 4.9%);
34
+
35
+ --sqm-muted: hsl(210 40% 96%);
36
+ --sqm-muted-foreground: hsl(215.4 16.3% 46.9%);
37
+
38
+ --sqm-accent: hsl(210 40% 96%);
39
+ --sqm-accent-foreground: hsl(222.2 84% 4.9%);
40
+
41
+ --sqm-destructive: hsl(0 84.2% 60.2%);
42
+ --sqm-destructive-foreground: hsl(210 40% 98%);
43
+
44
+ --sqm-border: hsl(214.3 31.8% 91.4%);
45
+ --sqm-input: hsl(214.3 31.8% 91.4%);
46
+ --sqm-ring: hsl(221.2 83.2% 53.3%);
47
+
48
+ /* ===== Semantic Colors ===== */
49
+ --sqm-success: hsl(142.1 76.2% 36.3%);
50
+ --sqm-success-foreground: hsl(355.7 100% 97.3%);
51
+ --sqm-warning: hsl(32.8 95% 44%);
52
+ --sqm-warning-foreground: hsl(355.7 100% 97.3%);
53
+ --sqm-info: hsl(199.1 89.1% 48%);
54
+ --sqm-info-foreground: hsl(355.7 100% 97.3%);
55
+
56
+ /* ===== Typography Scale ===== */
57
+ --sqm-font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
58
+ --sqm-font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
59
+
60
+ /* ===== Spacing & Sizing ===== */
61
+ --sqm-radius: 0.5rem;
62
+ --sqm-radius-sm: 0.375rem;
63
+ --sqm-radius-lg: 0.75rem;
64
+ --sqm-radius-xl: 1rem;
65
+
66
+ /* ===== Shadows - Refined ===== */
67
+ --sqm-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
68
+ --sqm-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
69
+ --sqm-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
70
+ --sqm-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
71
+
72
+ /* ===== Animation & Transitions ===== */
73
+ --sqm-transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
74
+ --sqm-transition-fast: all 100ms cubic-bezier(0.4, 0, 0.2, 1);
75
+
76
+ /* ===== Z-index Scale ===== */
77
+ --sqm-z-dropdown: 1000;
78
+ --sqm-z-sticky: 1020;
79
+ --sqm-z-modal: 1050;
80
+ --sqm-z-notification: 1100;
81
+ }
82
+
83
+ /* ===== Dark Mode Variables ===== */
84
+ [data-theme="dark"] {
85
+ --sqm-background: hsl(222.2 84% 4.9%);
86
+ --sqm-foreground: hsl(210 40% 98%);
87
+
88
+ --sqm-card: hsl(222.2 84% 4.9%);
89
+ --sqm-card-foreground: hsl(210 40% 98%);
90
+
91
+ --sqm-popover: hsl(222.2 84% 4.9%);
92
+ --sqm-popover-foreground: hsl(210 40% 98%);
93
+
94
+ --sqm-primary: hsl(217.2 91.2% 59.8%);
95
+ --sqm-primary-foreground: hsl(222.2 84% 4.9%);
96
+
97
+ --sqm-secondary: hsl(217.2 32.6% 17.5%);
98
+ --sqm-secondary-foreground: hsl(210 40% 98%);
99
+
100
+ --sqm-muted: hsl(217.2 32.6% 17.5%);
101
+ --sqm-muted-foreground: hsl(215 20.2% 65.1%);
102
+
103
+ --sqm-accent: hsl(217.2 32.6% 17.5%);
104
+ --sqm-accent-foreground: hsl(210 40% 98%);
105
+
106
+ --sqm-destructive: hsl(0 62.8% 30.6%);
107
+ --sqm-destructive-foreground: hsl(210 40% 98%);
108
+
109
+ --sqm-border: hsl(217.2 32.6% 17.5%);
110
+ --sqm-input: hsl(217.2 32.6% 17.5%);
111
+ --sqm-ring: hsl(224.3 76.3% 94.1%);
112
+
113
+ /* Dark mode semantic colors */
114
+ --sqm-success: hsl(142.1 70.6% 45.3%);
115
+ --sqm-warning: hsl(32.8 95% 60%);
116
+ --sqm-info: hsl(199.1 89.1% 60%);
117
+ }
118
+
119
+ /* ===== Auto Theme Detection ===== */
120
+ @media (prefers-color-scheme: dark) {
121
+ :root:not([data-theme="light"]) {
122
+ --sqm-background: hsl(222.2 84% 4.9%);
123
+ --sqm-foreground: hsl(210 40% 98%);
124
+ --sqm-card: hsl(222.2 84% 4.9%);
125
+ --sqm-card-foreground: hsl(210 40% 98%);
126
+ --sqm-popover: hsl(222.2 84% 4.9%);
127
+ --sqm-popover-foreground: hsl(210 40% 98%);
128
+ --sqm-primary: hsl(217.2 91.2% 59.8%);
129
+ --sqm-primary-foreground: hsl(222.2 84% 4.9%);
130
+ --sqm-secondary: hsl(217.2 32.6% 17.5%);
131
+ --sqm-secondary-foreground: hsl(210 40% 98%);
132
+ --sqm-muted: hsl(217.2 32.6% 17.5%);
133
+ --sqm-muted-foreground: hsl(215 20.2% 65.1%);
134
+ --sqm-accent: hsl(217.2 32.6% 17.5%);
135
+ --sqm-accent-foreground: hsl(210 40% 98%);
136
+ --sqm-destructive: hsl(0 62.8% 30.6%);
137
+ --sqm-destructive-foreground: hsl(210 40% 98%);
138
+ --sqm-border: hsl(217.2 32.6% 17.5%);
139
+ --sqm-input: hsl(217.2 32.6% 17.5%);
140
+ --sqm-ring: hsl(224.3 76.3% 94.1%);
141
+ --sqm-success: hsl(142.1 70.6% 45.3%);
142
+ --sqm-warning: hsl(32.8 95% 60%);
143
+ --sqm-info: hsl(199.1 89.1% 60%);
144
+ }
145
+ }
146
+
147
+ /* ========================================
148
+ Base Styles & Layout
149
+ ======================================== */
150
+
151
+ * {
152
+ box-sizing: border-box;
153
+ }
154
+
155
+ .sidekiq-queue-manager {
156
+ font-family: var(--sqm-font-sans);
157
+ background: var(--sqm-background);
158
+ color: var(--sqm-foreground);
159
+ line-height: 1.5;
160
+ -webkit-font-smoothing: antialiased;
161
+ -moz-osx-font-smoothing: grayscale;
162
+ transition: var(--sqm-transition);
163
+ }
164
+
165
+ .sqm-container {
166
+ max-width: 1400px;
167
+ margin: 0 auto;
168
+ padding: 1.5rem;
169
+ }
170
+
171
+ /* ========================================
172
+ Header - Compact & Clean
173
+ ======================================== */
174
+
175
+ .sqm-header {
176
+ display: flex;
177
+ align-items: center;
178
+ justify-content: space-between;
179
+ margin-bottom: 1.5rem;
180
+ padding-bottom: 1rem;
181
+ border-bottom: 1px solid var(--sqm-border);
182
+ }
183
+
184
+ .sqm-title {
185
+ font-size: 1.5rem;
186
+ font-weight: 600;
187
+ color: var(--sqm-foreground);
188
+ margin: 0;
189
+ line-height: 1.2;
190
+ }
191
+
192
+ .sqm-subtitle {
193
+ font-size: 0.875rem;
194
+ color: var(--sqm-muted-foreground);
195
+ margin: 0.25rem 0 0 0;
196
+ }
197
+
198
+ .sqm-header-info {
199
+ text-align: right;
200
+ font-size: 0.75rem;
201
+ color: var(--sqm-muted-foreground);
202
+ }
203
+
204
+ /* Theme Toggle Button */
205
+ .sqm-theme-toggle {
206
+ position: fixed;
207
+ top: 1rem;
208
+ right: 1rem;
209
+ z-index: var(--sqm-z-sticky);
210
+ width: 2.5rem;
211
+ height: 2.5rem;
212
+ border-radius: var(--sqm-radius);
213
+ border: 1px solid var(--sqm-border);
214
+ background: var(--sqm-background);
215
+ color: var(--sqm-foreground);
216
+ display: flex;
217
+ align-items: center;
218
+ justify-content: center;
219
+ cursor: pointer;
220
+ transition: var(--sqm-transition);
221
+ box-shadow: var(--sqm-shadow-sm);
222
+ }
223
+
224
+ .sqm-theme-toggle:hover {
225
+ background: var(--sqm-accent);
226
+ box-shadow: var(--sqm-shadow);
227
+ }
228
+
229
+ /* ========================================
230
+ Statistics Grid - Compact Cards
231
+ ======================================== */
232
+
233
+ .sqm-stats-section {
234
+ margin-bottom: 1.5rem;
235
+ }
236
+
237
+ .sqm-stats-grid {
238
+ display: grid;
239
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
240
+ gap: 1rem;
241
+ }
242
+
243
+ .sqm-stat-card {
244
+ background: var(--sqm-card);
245
+ border: 1px solid var(--sqm-border);
246
+ border-radius: var(--sqm-radius);
247
+ padding: 1rem;
248
+ transition: var(--sqm-transition);
249
+ position: relative;
250
+ overflow: hidden;
251
+ }
252
+
253
+ .sqm-stat-card:hover {
254
+ box-shadow: var(--sqm-shadow-md);
255
+ }
256
+
257
+ .sqm-stat-label {
258
+ font-size: 0.75rem;
259
+ font-weight: 500;
260
+ color: var(--sqm-muted-foreground);
261
+ text-transform: uppercase;
262
+ letter-spacing: 0.05em;
263
+ margin-bottom: 0.5rem;
264
+ }
265
+
266
+ .sqm-stat-value {
267
+ font-size: 1.875rem;
268
+ font-weight: 700;
269
+ color: var(--sqm-foreground);
270
+ font-family: var(--sqm-font-mono);
271
+ line-height: 1;
272
+ }
273
+
274
+ /* ========================================
275
+ Controls Panel - Clean & Minimal
276
+ ======================================== */
277
+
278
+ .sqm-controls-section {
279
+ margin-bottom: 1.5rem;
280
+ }
281
+
282
+ .sqm-controls {
283
+ display: flex;
284
+ align-items: center;
285
+ justify-content: space-between;
286
+ gap: 1rem;
287
+ padding: 1rem;
288
+ background: var(--sqm-card);
289
+ border: 1px solid var(--sqm-border);
290
+ border-radius: var(--sqm-radius);
291
+ flex-wrap: wrap;
292
+ }
293
+
294
+ .sqm-controls-left,
295
+ .sqm-controls-right {
296
+ display: flex;
297
+ align-items: center;
298
+ gap: 0.75rem;
299
+ }
300
+
301
+ /* ========================================
302
+ Live Pull Toggle - shadcn Style
303
+ ======================================== */
304
+
305
+ .sqm-live-pull-container {
306
+ display: flex;
307
+ align-items: center;
308
+ gap: 0.75rem;
309
+ }
310
+
311
+ .sqm-live-pull-toggle {
312
+ display: flex;
313
+ align-items: center;
314
+ gap: 0.5rem;
315
+ padding: 0.5rem 0.75rem;
316
+ background: var(--sqm-muted);
317
+ border-radius: var(--sqm-radius-sm);
318
+ font-size: 0.875rem;
319
+ font-weight: 500;
320
+ }
321
+
322
+ .sqm-live-icon {
323
+ width: 1rem;
324
+ height: 1rem;
325
+ color: var(--sqm-info);
326
+ }
327
+
328
+ .sqm-toggle-text {
329
+ color: var(--sqm-muted-foreground);
330
+ }
331
+
332
+ .sqm-live-status {
333
+ display: flex;
334
+ align-items: center;
335
+ gap: 0.375rem;
336
+ margin-left: 0.5rem;
337
+ }
338
+
339
+ .sqm-status-dot {
340
+ width: 0.5rem;
341
+ height: 0.5rem;
342
+ border-radius: 50%;
343
+ background: var(--sqm-muted-foreground);
344
+ transition: var(--sqm-transition);
345
+ }
346
+
347
+ .sqm-status-dot.active {
348
+ background: var(--sqm-success);
349
+ animation: sqm-pulse 2s infinite;
350
+ }
351
+
352
+ .sqm-status-text {
353
+ font-size: 0.75rem;
354
+ font-weight: 600;
355
+ color: var(--sqm-muted-foreground);
356
+ }
357
+
358
+ .sqm-toggle-switch {
359
+ position: relative;
360
+ width: 2.75rem;
361
+ height: 1.5rem;
362
+ background: var(--sqm-input);
363
+ border-radius: 0.75rem;
364
+ border: none;
365
+ cursor: pointer;
366
+ transition: var(--sqm-transition);
367
+ outline: none;
368
+ }
369
+
370
+ .sqm-toggle-switch:focus-visible {
371
+ outline: 2px solid var(--sqm-ring);
372
+ outline-offset: 2px;
373
+ }
374
+
375
+ .sqm-toggle-switch[data-enabled="true"] {
376
+ background: var(--sqm-primary);
377
+ }
378
+
379
+ .sqm-toggle-thumb {
380
+ position: absolute;
381
+ top: 0.125rem;
382
+ left: 0.125rem;
383
+ width: 1.25rem;
384
+ height: 1.25rem;
385
+ background: var(--sqm-background);
386
+ border-radius: 50%;
387
+ transition: var(--sqm-transition);
388
+ display: flex;
389
+ align-items: center;
390
+ justify-content: center;
391
+ box-shadow: var(--sqm-shadow-sm);
392
+ }
393
+
394
+ .sqm-toggle-switch[data-enabled="true"] .sqm-toggle-thumb {
395
+ transform: translateX(1.25rem);
396
+ }
397
+
398
+ .sqm-toggle-icon {
399
+ width: 0.75rem;
400
+ height: 0.75rem;
401
+ color: var(--sqm-muted-foreground);
402
+ }
403
+
404
+ .sqm-toggle-icon-off {
405
+ display: block;
406
+ }
407
+
408
+ .sqm-toggle-icon-on {
409
+ display: none;
410
+ }
411
+
412
+ .sqm-toggle-switch[data-enabled="true"] .sqm-toggle-icon-off {
413
+ display: none;
414
+ }
415
+
416
+ .sqm-toggle-switch[data-enabled="true"] .sqm-toggle-icon-on {
417
+ display: block;
418
+ color: var(--sqm-success);
419
+ }
420
+
421
+ /* ========================================
422
+ Refresh Button - Clean Design
423
+ ======================================== */
424
+
425
+ .sqm-refresh-container {
426
+ position: relative;
427
+ }
428
+
429
+ .sqm-refresh-button {
430
+ display: flex;
431
+ align-items: center;
432
+ gap: 0.5rem;
433
+ padding: 0.5rem 0.75rem;
434
+ background: var(--sqm-secondary);
435
+ border: 1px solid var(--sqm-border);
436
+ border-radius: var(--sqm-radius-sm);
437
+ color: var(--sqm-secondary-foreground);
438
+ font-weight: 500;
439
+ font-size: 0.875rem;
440
+ cursor: pointer;
441
+ transition: var(--sqm-transition);
442
+ outline: none;
443
+ }
444
+
445
+ .sqm-refresh-button:hover {
446
+ background: var(--sqm-accent);
447
+ }
448
+
449
+ .sqm-refresh-button:focus-visible {
450
+ outline: 2px solid var(--sqm-ring);
451
+ outline-offset: 2px;
452
+ }
453
+
454
+ .sqm-refresh-icon {
455
+ width: 1rem;
456
+ height: 1rem;
457
+ transition: var(--sqm-transition);
458
+ }
459
+
460
+ .sqm-refresh-container[data-loading="true"] .sqm-refresh-icon {
461
+ animation: sqm-spin 1s linear infinite;
462
+ }
463
+
464
+ /* ========================================
465
+ Buttons - shadcn Style System
466
+ ======================================== */
467
+
468
+ .sqm-btn {
469
+ display: inline-flex;
470
+ align-items: center;
471
+ justify-content: center;
472
+ gap: 0.5rem;
473
+ padding: 0.5rem 1rem;
474
+ font-size: 0.875rem;
475
+ font-weight: 500;
476
+ border-radius: var(--sqm-radius-sm);
477
+ border: 1px solid transparent;
478
+ cursor: pointer;
479
+ transition: var(--sqm-transition);
480
+ text-decoration: none;
481
+ outline: none;
482
+ white-space: nowrap;
483
+ }
484
+
485
+ .sqm-btn:disabled {
486
+ opacity: 0.5;
487
+ cursor: not-allowed;
488
+ }
489
+
490
+ .sqm-btn:focus-visible {
491
+ outline: 2px solid var(--sqm-ring);
492
+ outline-offset: 2px;
493
+ }
494
+
495
+ /* Primary Button */
496
+ .sqm-btn-primary {
497
+ background: var(--sqm-primary);
498
+ color: var(--sqm-primary-foreground);
499
+ border-color: var(--sqm-primary);
500
+ }
501
+
502
+ .sqm-btn-primary:hover:not(:disabled) {
503
+ background: hsl(from var(--sqm-primary) h s calc(l - 5%));
504
+ }
505
+
506
+ /* Secondary Button */
507
+ .sqm-btn-secondary {
508
+ background: var(--sqm-secondary);
509
+ color: var(--sqm-secondary-foreground);
510
+ border-color: var(--sqm-border);
511
+ }
512
+
513
+ .sqm-btn-secondary:hover:not(:disabled) {
514
+ background: var(--sqm-accent);
515
+ }
516
+
517
+ /* Success Button */
518
+ .sqm-btn-success {
519
+ background: var(--sqm-success);
520
+ color: var(--sqm-success-foreground);
521
+ border-color: var(--sqm-success);
522
+ }
523
+
524
+ .sqm-btn-success:hover:not(:disabled) {
525
+ background: hsl(from var(--sqm-success) h s calc(l - 5%));
526
+ }
527
+
528
+ /* Warning Button */
529
+ .sqm-btn-warning {
530
+ background: var(--sqm-warning);
531
+ color: var(--sqm-warning-foreground);
532
+ border-color: var(--sqm-warning);
533
+ }
534
+
535
+ .sqm-btn-warning:hover:not(:disabled) {
536
+ background: hsl(from var(--sqm-warning) h s calc(l - 5%));
537
+ }
538
+
539
+ /* Destructive Button */
540
+ .sqm-btn-danger {
541
+ background: var(--sqm-destructive);
542
+ color: var(--sqm-destructive-foreground);
543
+ border-color: var(--sqm-destructive);
544
+ }
545
+
546
+ .sqm-btn-danger:hover:not(:disabled) {
547
+ background: hsl(from var(--sqm-destructive) h s calc(l - 5%));
548
+ }
549
+
550
+ /* Ghost Button */
551
+ .sqm-btn-ghost {
552
+ background: transparent;
553
+ color: var(--sqm-foreground);
554
+ border-color: transparent;
555
+ }
556
+
557
+ .sqm-btn-ghost:hover:not(:disabled) {
558
+ background: var(--sqm-accent);
559
+ }
560
+
561
+ /* Button Sizes */
562
+ .sqm-btn-sm {
563
+ padding: 0.375rem 0.75rem;
564
+ font-size: 0.75rem;
565
+ }
566
+
567
+ .sqm-btn-lg {
568
+ padding: 0.75rem 1.5rem;
569
+ font-size: 1rem;
570
+ }
571
+
572
+ /* ========================================
573
+ Queue Summary Cards
574
+ ======================================== */
575
+
576
+ .sqm-queue-summary {
577
+ margin-bottom: 1.5rem;
578
+ }
579
+
580
+ /* ========================================
581
+ Table - Clean & Minimal
582
+ ======================================== */
583
+
584
+ .sqm-table-container {
585
+ background: var(--sqm-card);
586
+ border: 1px solid var(--sqm-border);
587
+ border-radius: var(--sqm-radius);
588
+ overflow: hidden;
589
+ box-shadow: var(--sqm-shadow-sm);
590
+ }
591
+
592
+ .sqm-table {
593
+ width: 100%;
594
+ border-collapse: collapse;
595
+ background: transparent;
596
+ font-size: 0.875rem;
597
+ }
598
+
599
+ .sqm-table thead {
600
+ background: var(--sqm-muted);
601
+ }
602
+
603
+ .sqm-table th {
604
+ padding: 0.75rem 1rem;
605
+ text-align: left;
606
+ font-weight: 600;
607
+ font-size: 0.75rem;
608
+ color: var(--sqm-muted-foreground);
609
+ text-transform: uppercase;
610
+ letter-spacing: 0.05em;
611
+ border-bottom: 1px solid var(--sqm-border);
612
+ }
613
+
614
+ .sqm-table td {
615
+ padding: 0.75rem 1rem;
616
+ border-bottom: 1px solid var(--sqm-border);
617
+ vertical-align: middle;
618
+ }
619
+
620
+ .sqm-table tbody tr {
621
+ transition: var(--sqm-transition);
622
+ }
623
+
624
+ .sqm-table tbody tr:hover {
625
+ background: var(--sqm-muted);
626
+ }
627
+
628
+ .sqm-table tbody tr:last-child td {
629
+ border-bottom: none;
630
+ }
631
+
632
+ /* Queue Row States */
633
+ .sqm-queue-row.sqm-status-paused {
634
+ background: hsl(from var(--sqm-warning) h s l / 0.1);
635
+ }
636
+
637
+ .sqm-queue-row.sqm-status-blocked {
638
+ background: hsl(from var(--sqm-destructive) h s l / 0.1);
639
+ }
640
+
641
+ /* Queue Name Column */
642
+ .sqm-col-name {
643
+ font-weight: 500;
644
+ min-width: 200px;
645
+ }
646
+
647
+ .sqm-queue-name {
648
+ font-family: var(--sqm-font-mono);
649
+ color: var(--sqm-foreground);
650
+ margin-left: 0.5rem;
651
+ }
652
+
653
+ /* Badges */
654
+ .sqm-critical-badge,
655
+ .sqm-blocked-badge {
656
+ display: inline-block;
657
+ margin-left: 0.5rem;
658
+ padding: 0.125rem 0.375rem;
659
+ font-size: 0.6875rem;
660
+ font-weight: 600;
661
+ border-radius: var(--sqm-radius-sm);
662
+ text-transform: uppercase;
663
+ letter-spacing: 0.05em;
664
+ }
665
+
666
+ .sqm-critical-badge {
667
+ background: var(--sqm-destructive);
668
+ color: var(--sqm-destructive-foreground);
669
+ }
670
+
671
+ .sqm-blocked-badge {
672
+ background: var(--sqm-muted);
673
+ color: var(--sqm-muted-foreground);
674
+ }
675
+
676
+ .sqm-limits-info {
677
+ display: inline-block;
678
+ margin-left: 0.5rem;
679
+ padding: 0.125rem 0.375rem;
680
+ font-size: 0.6875rem;
681
+ font-weight: 500;
682
+ background: hsl(from var(--sqm-info) h s l / 0.1);
683
+ color: var(--sqm-info);
684
+ border-radius: var(--sqm-radius-sm);
685
+ font-family: var(--sqm-font-mono);
686
+ }
687
+
688
+ /* Data Columns */
689
+ .sqm-col-size,
690
+ .sqm-col-workers,
691
+ .sqm-col-latency {
692
+ font-family: var(--sqm-font-mono);
693
+ font-weight: 500;
694
+ text-align: right;
695
+ min-width: 80px;
696
+ font-variant-numeric: tabular-nums;
697
+ }
698
+
699
+ .sqm-col-actions {
700
+ text-align: right;
701
+ min-width: 120px;
702
+ }
703
+
704
+ .sqm-worker-info {
705
+ text-align: right;
706
+ font-family: var(--sqm-font-mono);
707
+ font-size: 0.875rem;
708
+ line-height: 1.2;
709
+ }
710
+
711
+ .sqm-worker-busy {
712
+ font-weight: 500;
713
+ color: var(--sqm-foreground);
714
+ }
715
+
716
+ .sqm-process-limit {
717
+ color: var(--sqm-muted-foreground);
718
+ margin-top: 0.125rem;
719
+ font-size: 0.75rem;
720
+ }
721
+
722
+ .sqm-status-indicator {
723
+ display: inline-block;
724
+ font-size: 0.75rem;
725
+ margin-left: 0.25rem;
726
+ opacity: 0.8;
727
+ }
728
+
729
+ /* ========================================
730
+ Loading & Error States
731
+ ======================================== */
732
+
733
+ .sqm-loading {
734
+ display: flex;
735
+ flex-direction: column;
736
+ align-items: center;
737
+ justify-content: center;
738
+ padding: 3rem 2rem;
739
+ text-align: center;
740
+ }
741
+
742
+ .sqm-loading-spinner {
743
+ width: 2rem;
744
+ height: 2rem;
745
+ border: 2px solid var(--sqm-border);
746
+ border-top: 2px solid var(--sqm-primary);
747
+ border-radius: 50%;
748
+ animation: sqm-spin 1s linear infinite;
749
+ margin-bottom: 1rem;
750
+ }
751
+
752
+ .sqm-loading-text {
753
+ color: var(--sqm-muted-foreground);
754
+ font-size: 0.875rem;
755
+ font-weight: 500;
756
+ }
757
+
758
+ .sqm-error {
759
+ display: flex;
760
+ flex-direction: column;
761
+ align-items: center;
762
+ justify-content: center;
763
+ padding: 3rem 2rem;
764
+ text-align: center;
765
+ background: hsl(from var(--sqm-destructive) h s l / 0.1);
766
+ border: 1px solid hsl(from var(--sqm-destructive) h s l / 0.2);
767
+ border-radius: var(--sqm-radius);
768
+ margin: 1rem 0;
769
+ }
770
+
771
+ .sqm-error-icon {
772
+ width: 3rem;
773
+ height: 3rem;
774
+ color: var(--sqm-destructive);
775
+ margin-bottom: 1rem;
776
+ }
777
+
778
+ .sqm-error-title {
779
+ font-size: 1.25rem;
780
+ font-weight: 600;
781
+ color: var(--sqm-destructive);
782
+ margin-bottom: 0.5rem;
783
+ }
784
+
785
+ .sqm-error-message {
786
+ color: var(--sqm-muted-foreground);
787
+ margin-bottom: 1.5rem;
788
+ }
789
+
790
+ /* ========================================
791
+ Notifications - Toast Style
792
+ ======================================== */
793
+
794
+ .sqm-notification {
795
+ position: fixed;
796
+ top: 1rem;
797
+ right: 1rem;
798
+ padding: 0.75rem 1rem;
799
+ background: var(--sqm-card);
800
+ border: 1px solid var(--sqm-border);
801
+ border-radius: var(--sqm-radius);
802
+ box-shadow: var(--sqm-shadow-lg);
803
+ font-weight: 600;
804
+ color: var(--sqm-card-foreground);
805
+ z-index: var(--sqm-z-notification);
806
+ animation: sqm-slide-in 0.2s ease-out;
807
+ max-width: 400px;
808
+ font-size: 0.875rem;
809
+ backdrop-filter: blur(8px);
810
+ -webkit-backdrop-filter: blur(8px);
811
+ }
812
+
813
+ .sqm-notification-success {
814
+ border-color: var(--sqm-success);
815
+ background: hsl(from var(--sqm-success) h s l / 0.2);
816
+ color: var(--sqm-success);
817
+ }
818
+
819
+ .sqm-notification-error {
820
+ border-color: var(--sqm-destructive);
821
+ background: hsl(from var(--sqm-destructive) h s l / 0.2);
822
+ color: var(--sqm-destructive);
823
+ }
824
+
825
+ .sqm-notification-warning {
826
+ border-color: var(--sqm-warning);
827
+ background: hsl(from var(--sqm-warning) h s l / 0.2);
828
+ color: var(--sqm-warning);
829
+ }
830
+
831
+ .sqm-notification-info {
832
+ border-color: var(--sqm-info);
833
+ background: hsl(from var(--sqm-info) h s l / 0.2);
834
+ color: var(--sqm-info);
835
+ }
836
+
837
+ /* ========================================
838
+ Utility Classes
839
+ ======================================== */
840
+
841
+ .sqm-hidden {
842
+ display: none !important;
843
+ }
844
+
845
+ .sqm-invisible {
846
+ visibility: hidden;
847
+ }
848
+
849
+ .sqm-sr-only {
850
+ position: absolute;
851
+ width: 1px;
852
+ height: 1px;
853
+ padding: 0;
854
+ margin: -1px;
855
+ overflow: hidden;
856
+ clip: rect(0, 0, 0, 0);
857
+ white-space: nowrap;
858
+ border: 0;
859
+ }
860
+
861
+ .sqm-text-center {
862
+ text-align: center;
863
+ }
864
+
865
+ .sqm-text-right {
866
+ text-align: right;
867
+ }
868
+
869
+ .sqm-font-mono {
870
+ font-family: var(--sqm-font-mono);
871
+ }
872
+
873
+ .sqm-truncate {
874
+ overflow: hidden;
875
+ text-overflow: ellipsis;
876
+ white-space: nowrap;
877
+ }
878
+
879
+ /* ========================================
880
+ Animations
881
+ ======================================== */
882
+
883
+ @keyframes sqm-spin {
884
+ from {
885
+ transform: rotate(0deg);
886
+ }
887
+ to {
888
+ transform: rotate(360deg);
889
+ }
890
+ }
891
+
892
+ @keyframes sqm-pulse {
893
+ 0%, 100% {
894
+ opacity: 1;
895
+ }
896
+ 50% {
897
+ opacity: 0.5;
898
+ }
899
+ }
900
+
901
+ @keyframes sqm-slide-in {
902
+ from {
903
+ transform: translateX(100%);
904
+ opacity: 0;
905
+ }
906
+ to {
907
+ transform: translateX(0);
908
+ opacity: 1;
909
+ }
910
+ }
911
+
912
+ @keyframes sqm-fade-in {
913
+ from {
914
+ opacity: 0;
915
+ }
916
+ to {
917
+ opacity: 1;
918
+ }
919
+ }
920
+
921
+ /* ========================================
922
+ Responsive Design
923
+ ======================================== */
924
+
925
+ @media (max-width: 768px) {
926
+ .sqm-container {
927
+ padding: 1rem;
928
+ }
929
+
930
+ .sqm-header {
931
+ flex-direction: column;
932
+ align-items: flex-start;
933
+ gap: 0.75rem;
934
+ }
935
+
936
+ .sqm-stats-grid {
937
+ grid-template-columns: 1fr;
938
+ gap: 0.75rem;
939
+ }
940
+
941
+ .sqm-controls {
942
+ flex-direction: column;
943
+ align-items: stretch;
944
+ gap: 0.75rem;
945
+ }
946
+
947
+ .sqm-controls-left,
948
+ .sqm-controls-right {
949
+ justify-content: center;
950
+ flex-wrap: wrap;
951
+ }
952
+
953
+ .sqm-table-container {
954
+ overflow-x: auto;
955
+ }
956
+
957
+ .sqm-table {
958
+ min-width: 600px;
959
+ }
960
+
961
+ .sqm-notification {
962
+ top: 1rem;
963
+ right: 1rem;
964
+ left: 1rem;
965
+ max-width: none;
966
+ }
967
+
968
+ .sqm-theme-toggle {
969
+ top: 0.75rem;
970
+ right: 0.75rem;
971
+ }
972
+ }
973
+
974
+ @media (max-width: 480px) {
975
+ .sqm-container {
976
+ padding: 0.75rem;
977
+ }
978
+
979
+ .sqm-stat-value {
980
+ font-size: 1.5rem;
981
+ }
982
+
983
+ .sqm-btn {
984
+ padding: 0.5rem 0.75rem;
985
+ font-size: 0.8125rem;
986
+ }
987
+
988
+ .sqm-table th,
989
+ .sqm-table td {
990
+ padding: 0.5rem 0.75rem;
991
+ }
992
+ }
993
+
994
+ /* ========================================
995
+ Focus Management & Accessibility
996
+ ======================================== */
997
+
998
+ .sqm-focus-trap {
999
+ outline: none;
1000
+ }
1001
+
1002
+ /* Enhanced focus indicators for better accessibility */
1003
+ *:focus-visible {
1004
+ outline: 2px solid var(--sqm-ring);
1005
+ outline-offset: 2px;
1006
+ }
1007
+
1008
+ /* Reduced motion support */
1009
+ @media (prefers-reduced-motion: reduce) {
1010
+ *,
1011
+ *::before,
1012
+ *::after {
1013
+ animation-duration: 0.01ms !important;
1014
+ animation-iteration-count: 1 !important;
1015
+ transition-duration: 0.01ms !important;
1016
+ scroll-behavior: auto !important;
1017
+ }
1018
+ }