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