sidekiq 7.3.8 → 8.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +24 -0
  3. data/README.md +16 -13
  4. data/bin/sidekiqload +10 -10
  5. data/bin/webload +69 -0
  6. data/lib/active_job/queue_adapters/sidekiq_adapter.rb +5 -18
  7. data/lib/sidekiq/api.rb +108 -36
  8. data/lib/sidekiq/capsule.rb +1 -1
  9. data/lib/sidekiq/cli.rb +15 -19
  10. data/lib/sidekiq/client.rb +13 -16
  11. data/lib/sidekiq/component.rb +30 -2
  12. data/lib/sidekiq/config.rb +18 -15
  13. data/lib/sidekiq/embedded.rb +1 -0
  14. data/lib/sidekiq/job/iterable.rb +3 -5
  15. data/lib/sidekiq/job_retry.rb +2 -2
  16. data/lib/sidekiq/job_util.rb +5 -1
  17. data/lib/sidekiq/launcher.rb +1 -1
  18. data/lib/sidekiq/logger.rb +6 -10
  19. data/lib/sidekiq/manager.rb +0 -1
  20. data/lib/sidekiq/metrics/query.rb +1 -3
  21. data/lib/sidekiq/middleware/current_attributes.rb +5 -17
  22. data/lib/sidekiq/paginator.rb +8 -1
  23. data/lib/sidekiq/processor.rb +21 -14
  24. data/lib/sidekiq/profiler.rb +59 -0
  25. data/lib/sidekiq/rails.rb +12 -2
  26. data/lib/sidekiq/redis_client_adapter.rb +0 -1
  27. data/lib/sidekiq/testing.rb +2 -2
  28. data/lib/sidekiq/version.rb +2 -2
  29. data/lib/sidekiq/web/action.rb +101 -85
  30. data/lib/sidekiq/web/application.rb +339 -333
  31. data/lib/sidekiq/web/config.rb +116 -0
  32. data/lib/sidekiq/web/helpers.rb +40 -15
  33. data/lib/sidekiq/web/router.rb +60 -76
  34. data/lib/sidekiq/web.rb +51 -156
  35. data/sidekiq.gemspec +5 -4
  36. data/web/assets/javascripts/application.js +6 -13
  37. data/web/assets/javascripts/base-charts.js +30 -18
  38. data/web/assets/javascripts/dashboard-charts.js +2 -0
  39. data/web/assets/javascripts/dashboard.js +6 -0
  40. data/web/assets/javascripts/metrics.js +1 -1
  41. data/web/assets/stylesheets/style.css +750 -0
  42. data/web/locales/ar.yml +1 -0
  43. data/web/locales/cs.yml +1 -0
  44. data/web/locales/da.yml +1 -0
  45. data/web/locales/de.yml +1 -0
  46. data/web/locales/el.yml +1 -0
  47. data/web/locales/en.yml +9 -0
  48. data/web/locales/es.yml +24 -2
  49. data/web/locales/fa.yml +1 -0
  50. data/web/locales/fr.yml +1 -0
  51. data/web/locales/gd.yml +1 -0
  52. data/web/locales/he.yml +1 -0
  53. data/web/locales/hi.yml +1 -0
  54. data/web/locales/it.yml +1 -0
  55. data/web/locales/ja.yml +1 -0
  56. data/web/locales/ko.yml +1 -0
  57. data/web/locales/lt.yml +1 -0
  58. data/web/locales/nb.yml +1 -0
  59. data/web/locales/nl.yml +1 -0
  60. data/web/locales/pl.yml +1 -0
  61. data/web/locales/{pt-br.yml → pt-BR.yml} +2 -1
  62. data/web/locales/pt.yml +1 -0
  63. data/web/locales/ru.yml +1 -0
  64. data/web/locales/sv.yml +1 -0
  65. data/web/locales/ta.yml +1 -0
  66. data/web/locales/tr.yml +1 -0
  67. data/web/locales/uk.yml +1 -0
  68. data/web/locales/ur.yml +1 -0
  69. data/web/locales/vi.yml +1 -0
  70. data/web/locales/{zh-cn.yml → zh-CN.yml} +85 -73
  71. data/web/locales/{zh-tw.yml → zh-TW.yml} +2 -1
  72. data/web/views/_footer.erb +31 -34
  73. data/web/views/_job_info.erb +91 -89
  74. data/web/views/_metrics_period_select.erb +1 -1
  75. data/web/views/_nav.erb +14 -21
  76. data/web/views/_paging.erb +23 -21
  77. data/web/views/_poll_link.erb +2 -2
  78. data/web/views/_summary.erb +16 -16
  79. data/web/views/busy.erb +124 -122
  80. data/web/views/dashboard.erb +62 -64
  81. data/web/views/dead.erb +31 -27
  82. data/web/views/filtering.erb +3 -3
  83. data/web/views/layout.erb +5 -21
  84. data/web/views/metrics.erb +83 -80
  85. data/web/views/metrics_for_job.erb +39 -42
  86. data/web/views/morgue.erb +61 -70
  87. data/web/views/profiles.erb +43 -0
  88. data/web/views/queue.erb +54 -52
  89. data/web/views/queues.erb +43 -41
  90. data/web/views/retries.erb +66 -75
  91. data/web/views/retry.erb +32 -27
  92. data/web/views/scheduled.erb +58 -54
  93. data/web/views/scheduled_job_info.erb +1 -1
  94. metadata +32 -22
  95. data/web/assets/stylesheets/application-dark.css +0 -147
  96. data/web/assets/stylesheets/application-rtl.css +0 -163
  97. data/web/assets/stylesheets/application.css +0 -759
  98. data/web/assets/stylesheets/bootstrap-rtl.min.css +0 -9
  99. data/web/assets/stylesheets/bootstrap.css +0 -5
  100. data/web/views/_status.erb +0 -4
@@ -0,0 +1,750 @@
1
+ :root {
2
+ --color-primary: oklch(48% 0.2 13);
3
+ --color-bg: oklch(99% 0.005 256);
4
+ --color-elevated: oklch(100% 0 256);
5
+ --color-border: oklch(95% 0.005 256);
6
+ --color-input-border: oklch(90% 0.005 256);
7
+ --color-selected: oklch(93% 0.005 256);
8
+ --color-table-bg-alt: oklch(99% 0.005 256);
9
+ --color-shadow: oklch(27% 0.005 256 / 5%);
10
+ --color-text: oklch(27% 0.005 256);
11
+ --color-text-light: oklch(52% 0.005 256);
12
+ --color-success: oklch(from var(--color-primary) calc(l + 0.35) c calc(h + 120));
13
+ --color-info: oklch(from var(--color-primary) calc(l + 0.35) c calc(h - 120));
14
+ --color-danger: oklch(from var(--color-primary) calc(l + 0.35) c h);
15
+ --color-warning: oklch(from var(--color-primary) calc(l + 0.35) c calc(h + 75));
16
+
17
+ --space-1-2: 4px;
18
+ --space: 8px;
19
+ --space-2x: 16px;
20
+ --space-3x: 24px;
21
+ --space-4x: 32px;
22
+
23
+ --font-sans: system-ui, sans-serif;
24
+ --font-mono: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace;
25
+ --font-size: 16px;
26
+ --font-size-large: 1.728rem;
27
+ --font-size-small: 0.833rem;
28
+ }
29
+
30
+ *, *::before, *::after { box-sizing: border-box; }
31
+
32
+ ::selection { background: var(--color-selected); }
33
+
34
+ :focus-visible {
35
+ outline: 1px solid oklch(from var(--color-primary) l c h / 50%);
36
+ }
37
+
38
+ .sr-only {
39
+ border: 0 !important;
40
+ clip: rect(1px, 1px, 1px, 1px) !important;
41
+ -webkit-clip-path: inset(50%) !important;
42
+ clip-path: inset(50%) !important;
43
+ height: 1px !important;
44
+ margin: -1px !important;
45
+ overflow: hidden !important;
46
+ padding: 0 !important;
47
+ position: absolute !important;
48
+ width: 1px !important;
49
+ white-space: nowrap !important;
50
+ }
51
+
52
+ html {
53
+ font-family: var(--font-sans);
54
+ font-size: var(--font-size);
55
+ font-weight: normal;
56
+ line-height: 1.5;
57
+ }
58
+
59
+ body {
60
+ background: var(--color-bg);
61
+ color: var(--color-text);
62
+ font-variant-numeric: tabular-nums;
63
+ margin: 0;
64
+ overflow-x: hidden;
65
+ padding: 64px 0;
66
+ position: relative;
67
+ -webkit-font-smoothing: antialiased;
68
+ }
69
+
70
+ .container {
71
+ margin: 0 auto;
72
+ max-width: 1440px;
73
+ padding: var(--space-2x);
74
+ }
75
+
76
+ h1, h2, h3 {
77
+ font-size: var(--font-size-large);
78
+ font-weight: normal;
79
+ overflow-wrap: break-word;
80
+ margin: var(--space-3x) 0 var(--space);
81
+ padding: 0;
82
+ }
83
+
84
+ code {
85
+ background-color: var(--color-bg);
86
+ border-radius: 2px;
87
+ box-shadow: 0 0 0 1px var(--color-border);
88
+ color: var(--color-text-light);
89
+ display: inline-block;
90
+ font-family: var(--font-mono);
91
+ font-size: var(--font-size-small);
92
+ padding: var(--space-1-2);
93
+ }
94
+
95
+ time { color: var(--color-text-light); }
96
+
97
+ :any-link time { color: inherit; }
98
+
99
+ /* links and buttons */
100
+ :any-link { color: inherit; }
101
+
102
+ :any-link:hover { color: oklch(from var(--color-primary) calc(l + 0.06) c h); }
103
+
104
+ .btn,
105
+ .btn-primary,
106
+ input[type="submit"] {
107
+ background: linear-gradient(oklch(from var(--color-text) calc(l + 0.06) c h), var(--color-text));
108
+ border: none;
109
+ border-radius: var(--space-1-2);
110
+ box-shadow: 0 1px 1px 1px var(--color-shadow);
111
+ color: var(--color-bg);
112
+ cursor: pointer;
113
+ display: inline-block;
114
+ font-size: var(--font-size-small);
115
+ font-weight: 700;
116
+ line-height: var(--space-3x);
117
+ padding: var(--space) var(--space-2x);
118
+ text-decoration: none;
119
+ white-space: nowrap;
120
+ }
121
+
122
+ .btn:hover,
123
+ input[type="submit"]:hover {
124
+ background: linear-gradient(oklch(from var(--color-text) calc(l + 0.16) c h), oklch(from var(--color-text) calc(l + 0.1) c h));
125
+ color: var(--color-bg);
126
+ }
127
+
128
+ .btn-danger,
129
+ input[type="submit"].btn-danger {
130
+ background: linear-gradient(oklch(from var(--color-primary) calc(l + 0.06) c h), var(--color-primary));
131
+ }
132
+
133
+ .btn-danger:hover,
134
+ input[type="submit"].btn-danger:hover {
135
+ background: linear-gradient(oklch(from var(--color-primary) calc(l + 0.16) c h), oklch(from var(--color-primary) calc(l + 0.1) c h));
136
+ color: var(--color-bg);
137
+ }
138
+
139
+ .btn-warn,
140
+ input[type="submit"].btn-warn {
141
+ background: linear-gradient(oklch(from var(--color-primary) calc(l + 0.06) c calc(h + 75)), oklch(from var(--color-primary) l c calc(h + 90)));
142
+ }
143
+
144
+ .btn-warn:hover,
145
+ input[type="submit"].btn-warn:hover {
146
+ background: linear-gradient(oklch(from var(--color-primary) calc(l + 0.16) c calc(h + 75)), oklch(from var(--color-primary) calc(l + 0.1) c calc(h + 90)));
147
+ color: var(--color-bg);
148
+ }
149
+
150
+ .btn-inverse {
151
+ background: transparent;
152
+ box-shadow: 0 0 0 1px var(--color-input-border) inset;
153
+ color: inherit;
154
+ }
155
+
156
+ .btn-inverse:hover {
157
+ background: transparent;
158
+ box-shadow: 0 0 0 1px oklch(from var(--color-input-border) calc(l - 0.1) c h) inset;
159
+ color: var(--color-primary);
160
+ }
161
+
162
+ .live-poll { display: none; }
163
+
164
+ .live-poll.active {
165
+ display: inline-block;
166
+ }
167
+
168
+ /* nav */
169
+ .nav {
170
+ display: flex;
171
+ align-items: center;
172
+ list-style-type: none;
173
+ margin: 0;
174
+ padding: 0;
175
+ width: 100%;
176
+ }
177
+
178
+ .nav p { margin: 0; }
179
+
180
+ body > header {
181
+ background: var(--color-elevated);
182
+ box-shadow: 0 2px 4px 0 var(--color-shadow);
183
+ height: 56px;
184
+ overflow: hidden;
185
+ position: fixed;
186
+ left: 0;
187
+ right: 0;
188
+ top: 0;
189
+ overflow-x: auto;
190
+ z-index: 10;
191
+ }
192
+
193
+ body > header .container {
194
+ display: flex;
195
+ padding: var(--space) var(--space-2x)
196
+ }
197
+
198
+ .navbar-header {
199
+ display: flex;
200
+ gap: var(--space);
201
+ position: relative;
202
+ }
203
+
204
+ .navbar-toggle,
205
+ .navbar-header .navbar-livereload {
206
+ display: none;
207
+ }
208
+
209
+ .navbar-brand {
210
+ color: var(--color-primary);
211
+ font-size: 1.125rem;
212
+ line-height: 24px;
213
+ font-weight: 700;
214
+ margin: var(--space) var(--space-2x) 0 0;
215
+ text-decoration: none;
216
+ }
217
+
218
+ body > header .nav li {
219
+ padding: 0 var(--space);
220
+ line-height: 40px;
221
+ white-space: nowrap;
222
+ }
223
+
224
+ body > header .nav li.active {
225
+ border-radius: var(--space-1-2);
226
+ background: var(--color-selected);
227
+ }
228
+
229
+ body > header .nav li :any-link:not(.btn) {
230
+ color: inherit;
231
+ text-decoration: none;
232
+ }
233
+
234
+ body > header .nav li :any-link:not(.btn):hover { color: oklch(from var(--color-primary) calc(l + 0.06) c h); }
235
+
236
+ body > header .nav li.navbar-livereload {
237
+ margin-left: auto;
238
+ padding-right: 0;
239
+ }
240
+
241
+ .navbar-collapse { flex: 1; }
242
+
243
+ /* main */
244
+ section + section {
245
+ margin-top: var(--space-3x);
246
+ }
247
+
248
+ section > header {
249
+ display: flex;
250
+ align-items: center;
251
+ gap: var(--space);
252
+ margin: var(--space-3x) 0 var(--space);
253
+ }
254
+
255
+ section + section > header {
256
+ margin-top: 0;
257
+ }
258
+
259
+ section > header h1,
260
+ section > header h2,
261
+ section > header h3 {
262
+ margin: 0;
263
+ }
264
+
265
+ section > header .filter { margin-left: auto; }
266
+
267
+ section > header .filter:has(.history-graph) { display: inline-flex; }
268
+
269
+ .beacon {
270
+ background-color: var(--color-border);
271
+ border-radius: 50%;
272
+ display: inline-block;
273
+ height: 8px;
274
+ width: 8px;
275
+ transition: all 0.1s;
276
+ }
277
+
278
+ .pulse {
279
+ animation: pulse-animation 2s infinite;
280
+ background-color: var(--color-primary);
281
+ }
282
+
283
+ .info-circle {
284
+ background: var(--color-border);
285
+ border-radius: 50%;
286
+ display: inline-block;
287
+ font-size: var(--font-size-small);
288
+ line-height: 16px;
289
+ height: 16px;
290
+ width: 16px;
291
+ text-align: center;
292
+ }
293
+
294
+ @keyframes pulse-animation {
295
+ 0% { box-shadow: 0 0 0 0px oklch(from var(--color-primary) l c h / 20%); }
296
+ 100% { box-shadow: 0 0 0 8px rgba(0, 0, 0, 0); }
297
+ }
298
+
299
+ .history-graph {
300
+ border-radius: 4px;
301
+ font-size: var(--font-size-small);
302
+ padding: 4px 8px;
303
+ text-decoration: none;
304
+ }
305
+
306
+ .history-graph.active {
307
+ background: var(--color-selected);
308
+ color: var(--color-text);
309
+ }
310
+
311
+ form label {
312
+ color: var(--color-text-light);
313
+ font-size: var(--font-size-small);
314
+ }
315
+
316
+ input,
317
+ select {
318
+ background-color: var(--color-elevated);
319
+ color: var(--color-text);
320
+ border-radius: 4px;
321
+ box-shadow: 0 0 0 1px var(--color-border);
322
+ }
323
+
324
+ input[type=search] {
325
+ border-radius: 1em;
326
+ }
327
+
328
+ select {
329
+ appearance: none;
330
+ font-weight: 700;
331
+ background-color: var(--color-selected);
332
+ box-shadow: 0 0 0 1px var(--color-input-border);
333
+ }
334
+
335
+ .form-control {
336
+ border: none;
337
+ border-radius: var(--space-1-2);
338
+ display: inline-block;
339
+ height: 24px;
340
+ line-height: var(--space-2x);
341
+ padding: var(--space-1-2) var(--space);
342
+ }
343
+
344
+ .form-control:hover {
345
+ box-shadow: 0 0 0 1px oklch(from var(--color-input-border) calc(l - 0.1) c h);
346
+ }
347
+
348
+ ::placeholder {
349
+ color: var(--color-text-light);
350
+ opacity: 0.6
351
+ }
352
+
353
+ .interval-slider {
354
+ color: var(--color-text-light);
355
+ font-size: var(--font-size-small);
356
+ text-align: right;
357
+ }
358
+
359
+ .interval-slider .current-interval {
360
+ color: var(--color-text);
361
+ font-weight: 700;
362
+ }
363
+
364
+ input[type="range"] {
365
+ appearance: none;
366
+ accent-color: var(--color-text);
367
+ width: 160px;
368
+ height: 0.5em;
369
+ }
370
+
371
+ #realtime-legend {
372
+ color: var(--color-text-light);
373
+ font-size: var(--font-size-small);
374
+ display: flex;
375
+ gap: var(--space);
376
+ }
377
+
378
+ #realtime-legend .swatch {
379
+ border-radius: 50%;
380
+ display: inline-block;
381
+ margin-right: 4px;
382
+ height: 8px;
383
+ width: 8px;
384
+ }
385
+
386
+ /* cards for stats */
387
+ .cards-container {
388
+ background: var(--color-border);
389
+ border: 1px solid var(--color-border);
390
+ box-shadow: 0 2px 4px 0 var(--color-shadow);
391
+ display: flex;
392
+ flex-wrap: wrap;
393
+ gap: 1px;
394
+ align-items: center;
395
+ justify-content: center;
396
+ list-style-type: none;
397
+ margin: 0;
398
+ padding: 0;
399
+ }
400
+
401
+ article {
402
+ background-color: var(--color-elevated);
403
+ font-size: var(--font-size-small);
404
+ flex: 1;
405
+ padding: var(--space);
406
+ text-align: center;
407
+ white-space: nowrap;
408
+ }
409
+
410
+ article h3 {
411
+ display: block;
412
+ font-size: var(--font-size-large);
413
+ line-height: 1.125;
414
+ margin: 0;
415
+ padding: 0;
416
+ white-space: nowrap;
417
+ }
418
+
419
+ article p {
420
+ margin: 0;
421
+ padding: 0;
422
+ white-space: nowrap;
423
+ }
424
+
425
+ article a {
426
+ color: inherit;
427
+ text-decoration: none;
428
+ }
429
+
430
+ article a .desc { text-decoration: underline; }
431
+
432
+ article .count {
433
+ color: var(--color-primary);
434
+ display: block;
435
+ font-size: var(--font-size);
436
+ font-weight: 700;
437
+ }
438
+
439
+ /* table */
440
+ .table_container { overflow-x: auto; }
441
+
442
+ .table_container + form,
443
+ .table_container + input,
444
+ canvas + .table_container {
445
+ margin-top: var(--space-4x);
446
+ }
447
+
448
+ .buttons-row {
449
+ margin-top: var(--space-3x);
450
+ display: flex;
451
+ flex-wrap: wrap;
452
+ gap: 8px;
453
+ }
454
+
455
+ table {
456
+ background-color: var(--color-elevated);
457
+ border: 1px solid var(--color-border);
458
+ border-collapse: collapse;
459
+ width: 100%;
460
+ box-shadow: 0 2px 4px 0 var(--color-shadow);
461
+ }
462
+
463
+ thead { border-bottom: 2px solid var(--color-border); }
464
+
465
+ th {
466
+ color: var(--color-text-light);
467
+ font-size: var(--font-size-small);
468
+ font-weight: bold;
469
+ text-align: left;
470
+ padding: var(--space);
471
+ }
472
+
473
+ tr { border-top: 1px solid var(--color-border); }
474
+
475
+ tbody tr:nth-child(odd) { background-color: var(--color-table-bg-alt); }
476
+
477
+ tbody tr:hover { background-color: var(--color-border); }
478
+
479
+ td { padding: var(--space); }
480
+
481
+ td .btn {
482
+ font-size: var(--font-size-small);
483
+ line-height: 1.5;
484
+ padding: var(--space-1-2) var(--space);
485
+ }
486
+
487
+ td .btn:hover { color: inherit; }
488
+
489
+ td.num {
490
+ color: var(--color-text-light);
491
+ font-size: var(--font-size-small);
492
+ }
493
+
494
+ td.num span {
495
+ color: var(--color-text);
496
+ font-size: 1rem;
497
+ font-weight: 700;
498
+ }
499
+
500
+ .label:not(:empty) {
501
+ border-radius: 4px;
502
+ box-shadow: 0 0 0 1px var(--color-shadow);
503
+ font-size: var(--font-size-small);
504
+ padding: 0 var(--space);
505
+ }
506
+
507
+ .label-default { background: var(--color-selected); }
508
+ .label-success { background: var(--color-success); }
509
+ .label-info { background: var(--color-info); }
510
+ .label-danger { background: var(--color-danger); }
511
+ .label-warning { background: var(--color-warning); }
512
+
513
+ input[type="checkbox"] { accent-color: var(--color-primary); }
514
+
515
+ .alert {
516
+ background-color: var(--color-table-bg-alt);
517
+ border: 1px solid var(--color-border);
518
+ border-radius: 2px;
519
+ color: var(--color-text-light);
520
+ padding: var(--space);
521
+ }
522
+
523
+ .pagination {
524
+ display: flex;
525
+ gap: var(--space);
526
+ list-style-type: none;
527
+ margin: 0;
528
+ padding: var(--space) 0 0;
529
+ }
530
+
531
+ .pagination a { text-decoration: none; }
532
+
533
+ .pagination .disabled { opacity: 0.3; }
534
+
535
+ div:has(.pagination.pull-right) { margin-left: auto; }
536
+
537
+ /* footer */
538
+ body > footer {
539
+ background: var(--color-elevated);
540
+ box-shadow: -1px 0 4px 2px var(--color-shadow);
541
+ height: 56px;
542
+ overflow: hidden;
543
+ position: fixed;
544
+ bottom: 0;
545
+ left: 0;
546
+ right: 0;
547
+ }
548
+
549
+ body > footer .nav {
550
+ align-items: center;
551
+ color: var(--color-text-light);
552
+ font-size: var(--font-size-small);
553
+ gap: var(--space-2x);
554
+ }
555
+
556
+ /* media queries */
557
+ @media (prefers-color-scheme: dark) {
558
+ :root {
559
+ /* --color-primary: oklch(65% 0.15 13); */
560
+ --color-primary: oklch(60% 0.22 13);
561
+ --color-bg: oklch(22% 0.01 256);
562
+ --color-elevated: oklch(19% 0.01 256);
563
+ --color-border: oklch(25% 0.01 256);
564
+ --color-input-border: oklch(31% 0.01 256);
565
+ --color-selected: oklch(27% 0.01 256);
566
+ --color-table-bg-alt: oklch(24% 0.01 256);
567
+ --color-shadow: oklch(9% 0.01 256 / 10%);
568
+ --color-text: oklch(75% 0.01 256);
569
+ --color-text-light: oklch(65% 0.01 256);
570
+ --color-success: oklch(from var(--color-primary) calc(l - 0.3) c calc(h + 120));
571
+ --color-info: oklch(from var(--color-primary) calc(l - 0.3) c calc(h - 120));
572
+ --color-danger: oklch(from var(--color-primary) calc(l - 0.3) c h);
573
+ --color-warning: oklch(55% 0.11 45);
574
+ }
575
+
576
+ .btn-danger,
577
+ input[type="submit"].btn-danger {
578
+ background: linear-gradient(oklch(from var(--color-primary) calc(l - 0.2) c h), oklch(from var(--color-primary) calc(l - 0.25) c h));
579
+ color: var(--color-text);
580
+ }
581
+
582
+ .btn-danger:hover,
583
+ input[type="submit"].btn-danger:hover {
584
+ background: linear-gradient(oklch(from var(--color-primary) calc(l - 0.15) c h), oklch(from var(--color-primary) calc(l - 0.2) c h));
585
+ color: var(--color-text);
586
+ }
587
+
588
+ .btn-warn,
589
+ input[type="submit"].btn-warn {
590
+ background: linear-gradient(oklch(from var(--color-primary) calc(l - 0.2) c calc(h + 75)), oklch(from var(--color-primary) calc(l - 0.25) c calc(h + 75)));
591
+ color: var(--color-text);
592
+ }
593
+
594
+ .btn-warn:hover,
595
+ input[type="submit"].btn-warn:hover {
596
+ background: linear-gradient(oklch(from var(--color-primary) calc(l - 0.15) c calc(h + 75)), oklch(from var(--color-primary) calc(l - 0.2) c calc(h + 75)));
597
+ color: var(--color-text);
598
+ }
599
+
600
+ .btn-inverse {
601
+ background: transparent;
602
+ box-shadow: 0 0 0 1px var(--color-input-border) inset;
603
+ color: inherit;
604
+ }
605
+
606
+ .btn-inverse:hover { box-shadow: 0 0 0 1px oklch(from var(--color-input-border) calc(l + 0.1) c h) inset; }
607
+
608
+ .form-control:hover { box-shadow: 0 0 0 1px oklch(from var(--color-input-border) calc(l + 0.1) c h); }
609
+
610
+ .label-success { background: var(--color-success); }
611
+ .label-info { background: var(--color-info); }
612
+ .label-danger { background: var(--color-danger); }
613
+ .label-warning { background: var(--color-warning); }
614
+ }
615
+
616
+ @media (max-width: 800px) { :root { --font-size: 14px; } }
617
+
618
+ @media (max-width: 1000px) {
619
+ body { padding-bottom: 0; }
620
+
621
+ main {
622
+ min-height: calc(100vh - 256px);
623
+ padding: 0 0 32px;
624
+ }
625
+
626
+ body > header .container { flex-wrap: wrap; }
627
+
628
+ .nav { flex-direction: column; }
629
+
630
+ .navbar-toggle {
631
+ display: inline-flex;
632
+ align-items: center;
633
+ justify-content: center;
634
+ flex-direction: column;
635
+ gap: 4px;
636
+ min-height: 40px;
637
+ margin: 0;
638
+ padding: var(--space);
639
+ background: transparent;
640
+ box-shadow: 0 0 0 1px var(--color-border) inset;
641
+ }
642
+
643
+ .navbar-toggle .icon-bar {
644
+ display: inline-block;
645
+ width: 24px;
646
+ height: 2px;
647
+ background-color: var(--color-text-light);
648
+ }
649
+
650
+ .navbar-toggle:hover .icon-bar { background-color: var(--color-bg); }
651
+
652
+ .navbar-header .navbar-livereload { display: none; }
653
+
654
+ .navbar-collapse {
655
+ display: none;
656
+ position: fixed;
657
+ background-color: var(--color-bg);
658
+ border-bottom: 1px solid var(--color-border);
659
+ padding-top: var(--space);
660
+ top: 56px;
661
+ left: 0;
662
+ right: 0;
663
+ }
664
+
665
+ .navbar-collapse.is-open {
666
+ box-shadow: 0 2px 4px 0 var(--color-shadow);
667
+ display: flex;
668
+ padding-bottom: var(--space-2x);
669
+ max-height: calc(100svh - 56px);
670
+ overflow: auto;
671
+ }
672
+
673
+ body > header .nav li.navbar-livereload { margin: var(--space) 0 0; }
674
+
675
+ body > footer {
676
+ position: relative;
677
+ height: auto;
678
+ }
679
+ }
680
+
681
+ [dir="rtl"] {
682
+ .navbar-brand { margin: var(--space-2x) 0 0 var(--space-2x); }
683
+
684
+ body > header .nav li.navbar-livereload {
685
+ margin: 0 auto 0 0;
686
+ padding-left: 0;
687
+ }
688
+
689
+ section > header .filter {
690
+ margin-right: auto;
691
+ margin-left: 0;
692
+ }
693
+
694
+ th { text-align: right; }
695
+
696
+ #realtime-legend .swatch { margin: 0 0 0 4px; }
697
+
698
+ .interval-slider { text-align: left; }
699
+ }
700
+
701
+ /* progress bars */
702
+ @keyframes progress-bar-stripes {
703
+ from {
704
+ background-position: 40px 0;
705
+ }
706
+ to {
707
+ background-position: 0 0;
708
+ }
709
+ }
710
+ .progress {
711
+ width: 100%;
712
+ display: inline-block;
713
+ vertical-align: baseline;
714
+ height: 20px;
715
+ margin-bottom: 0px;
716
+ overflow: hidden;
717
+ background-color: #f5f5f5;
718
+ border-radius: 1em;
719
+ }
720
+ .progress-bar {
721
+ float: left;
722
+ width: 0;
723
+ height: 100%;
724
+ font-size: 12px;
725
+ line-height: 20px;
726
+ color: #fff;
727
+ text-align: center;
728
+ background-color: #337ab7;
729
+ }
730
+ .progress-striped .progress-bar,
731
+ .progress-bar-striped {
732
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
733
+ background-size: 40px 40px;
734
+ }
735
+ .bg-success {
736
+ background-color: var(--color-success);
737
+ }
738
+ .bg-warning {
739
+ background-color: var(--color-warning);
740
+ }
741
+ .bg-danger {
742
+ background-color: var(--color-danger);
743
+ }
744
+ .bg-info {
745
+ background-color: var(--color-info);
746
+ }
747
+
748
+ .w-50 {
749
+ width: 50%;
750
+ }