adonisjs-server-stats 1.4.0 → 1.5.1

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 (83) hide show
  1. package/README.md +114 -116
  2. package/dist/configure.d.ts.map +1 -1
  3. package/dist/src/controller/debug_controller.d.ts +2 -2
  4. package/dist/src/controller/debug_controller.d.ts.map +1 -1
  5. package/dist/src/controller/server_stats_controller.d.ts +1 -1
  6. package/dist/src/controller/server_stats_controller.d.ts.map +1 -1
  7. package/dist/src/dashboard/chart_aggregator.d.ts.map +1 -1
  8. package/dist/src/dashboard/chart_aggregator.js +8 -8
  9. package/dist/src/dashboard/dashboard_controller.d.ts +12 -97
  10. package/dist/src/dashboard/dashboard_controller.d.ts.map +1 -1
  11. package/dist/src/dashboard/dashboard_controller.js +244 -522
  12. package/dist/src/dashboard/dashboard_routes.d.ts.map +1 -1
  13. package/dist/src/dashboard/dashboard_routes.js +7 -2
  14. package/dist/src/dashboard/dashboard_store.d.ts +6 -3
  15. package/dist/src/dashboard/dashboard_store.d.ts.map +1 -1
  16. package/dist/src/dashboard/dashboard_store.js +54 -78
  17. package/dist/src/dashboard/integrations/cache_inspector.d.ts.map +1 -1
  18. package/dist/src/dashboard/integrations/queue_inspector.d.ts.map +1 -1
  19. package/dist/src/dashboard/migrator.d.ts.map +1 -1
  20. package/dist/src/dashboard/migrator.js +3 -1
  21. package/dist/src/dashboard/models/stats_event.d.ts +1 -1
  22. package/dist/src/dashboard/models/stats_event.d.ts.map +1 -1
  23. package/dist/src/dashboard/models/stats_query.d.ts +1 -1
  24. package/dist/src/dashboard/models/stats_query.d.ts.map +1 -1
  25. package/dist/src/dashboard/models/stats_request.d.ts +2 -2
  26. package/dist/src/dashboard/models/stats_request.d.ts.map +1 -1
  27. package/dist/src/dashboard/models/stats_request.js +1 -1
  28. package/dist/src/dashboard/models/stats_trace.d.ts +1 -1
  29. package/dist/src/dashboard/models/stats_trace.d.ts.map +1 -1
  30. package/dist/src/debug/debug_store.d.ts +6 -6
  31. package/dist/src/debug/debug_store.d.ts.map +1 -1
  32. package/dist/src/debug/debug_store.js +10 -10
  33. package/dist/src/debug/email_collector.d.ts +0 -9
  34. package/dist/src/debug/email_collector.d.ts.map +1 -1
  35. package/dist/src/debug/email_collector.js +6 -28
  36. package/dist/src/debug/event_collector.d.ts +1 -1
  37. package/dist/src/debug/event_collector.d.ts.map +1 -1
  38. package/dist/src/debug/event_collector.js +17 -17
  39. package/dist/src/debug/query_collector.d.ts +1 -1
  40. package/dist/src/debug/query_collector.d.ts.map +1 -1
  41. package/dist/src/debug/query_collector.js +13 -14
  42. package/dist/src/debug/ring_buffer.d.ts.map +1 -1
  43. package/dist/src/debug/route_inspector.d.ts +1 -1
  44. package/dist/src/debug/route_inspector.d.ts.map +1 -1
  45. package/dist/src/debug/route_inspector.js +12 -12
  46. package/dist/src/debug/trace_collector.d.ts.map +1 -1
  47. package/dist/src/debug/trace_collector.js +6 -5
  48. package/dist/src/edge/client/dashboard.css +516 -171
  49. package/dist/src/edge/client/dashboard.js +2756 -1662
  50. package/dist/src/edge/client/debug-panel.css +476 -133
  51. package/dist/src/edge/client/debug-panel.js +1496 -1043
  52. package/dist/src/edge/client/stats-bar.css +64 -30
  53. package/dist/src/edge/client/stats-bar.js +598 -319
  54. package/dist/src/edge/plugin.d.ts +1 -1
  55. package/dist/src/edge/plugin.d.ts.map +1 -1
  56. package/dist/src/edge/plugin.js +41 -59
  57. package/dist/src/edge/views/stats-bar.edge +1 -1
  58. package/dist/src/index.d.ts +1 -1
  59. package/dist/src/index.d.ts.map +1 -1
  60. package/dist/src/middleware/request_tracking_middleware.d.ts +4 -4
  61. package/dist/src/middleware/request_tracking_middleware.d.ts.map +1 -1
  62. package/dist/src/middleware/request_tracking_middleware.js +7 -6
  63. package/dist/src/prometheus/prometheus_collector.d.ts +1 -1
  64. package/dist/src/prometheus/prometheus_collector.d.ts.map +1 -1
  65. package/dist/src/provider/server_stats_provider.d.ts +1 -1
  66. package/dist/src/provider/server_stats_provider.d.ts.map +1 -1
  67. package/dist/src/provider/server_stats_provider.js +31 -31
  68. package/dist/src/utils/json_helpers.d.ts +8 -0
  69. package/dist/src/utils/json_helpers.d.ts.map +1 -0
  70. package/dist/src/utils/json_helpers.js +21 -0
  71. package/dist/src/utils/mail_helpers.d.ts +13 -0
  72. package/dist/src/utils/mail_helpers.d.ts.map +1 -0
  73. package/dist/src/utils/mail_helpers.js +26 -0
  74. package/dist/src/utils/math_helpers.d.ts +8 -0
  75. package/dist/src/utils/math_helpers.d.ts.map +1 -0
  76. package/dist/src/utils/math_helpers.js +11 -0
  77. package/dist/src/utils/time_helpers.d.ts +12 -0
  78. package/dist/src/utils/time_helpers.d.ts.map +1 -0
  79. package/dist/src/utils/time_helpers.js +32 -0
  80. package/dist/src/utils/transmit_client.d.ts +9 -0
  81. package/dist/src/utils/transmit_client.d.ts.map +1 -0
  82. package/dist/src/utils/transmit_client.js +20 -0
  83. package/package.json +35 -29
@@ -20,8 +20,8 @@
20
20
  --ss-border-dim: #262626;
21
21
  --ss-border-faint: #1f1f1f;
22
22
  --ss-border-strong: #404040;
23
- --ss-hover: rgba(38,38,38,0.4);
24
- --ss-hover-accent: rgba(52,211,153,0.08);
23
+ --ss-hover: rgba(38, 38, 38, 0.4);
24
+ --ss-hover-accent: rgba(52, 211, 153, 0.08);
25
25
  --ss-shadow: rgb(0 0 0 / 0.4);
26
26
  --ss-green-bg: #064e3b;
27
27
  --ss-green-fg: #34d399;
@@ -55,7 +55,7 @@
55
55
 
56
56
  /* ── Theme: Light (auto via system preference) ────────────────── */
57
57
  @media (prefers-color-scheme: light) {
58
- .ss-dbg-panel:not([data-ss-theme="dark"]) {
58
+ .ss-dbg-panel:not([data-ss-theme='dark']) {
59
59
  --ss-bg: #fafafa;
60
60
  --ss-surface: #ffffff;
61
61
  --ss-surface-alt: #f5f5f5;
@@ -71,8 +71,8 @@
71
71
  --ss-border-dim: #e5e5e5;
72
72
  --ss-border-faint: #f0f0f0;
73
73
  --ss-border-strong: #d4d4d4;
74
- --ss-hover: rgba(0,0,0,0.03);
75
- --ss-hover-accent: rgba(5,150,105,0.06);
74
+ --ss-hover: rgba(0, 0, 0, 0.03);
75
+ --ss-hover-accent: rgba(5, 150, 105, 0.06);
76
76
  --ss-shadow: rgb(0 0 0 / 0.08);
77
77
  --ss-green-bg: #d1fae5;
78
78
  --ss-green-fg: #059669;
@@ -93,7 +93,7 @@
93
93
  }
94
94
 
95
95
  /* ── Theme: Light (manual override) ───────────────────────────── */
96
- .ss-dbg-panel[data-ss-theme="light"] {
96
+ .ss-dbg-panel[data-ss-theme='light'] {
97
97
  --ss-bg: #fafafa;
98
98
  --ss-surface: #ffffff;
99
99
  --ss-surface-alt: #f5f5f5;
@@ -109,8 +109,8 @@
109
109
  --ss-border-dim: #e5e5e5;
110
110
  --ss-border-faint: #f0f0f0;
111
111
  --ss-border-strong: #d4d4d4;
112
- --ss-hover: rgba(0,0,0,0.03);
113
- --ss-hover-accent: rgba(5,150,105,0.06);
112
+ --ss-hover: rgba(0, 0, 0, 0.03);
113
+ --ss-hover-accent: rgba(5, 150, 105, 0.06);
114
114
  --ss-shadow: rgb(0 0 0 / 0.08);
115
115
  --ss-green-bg: #d1fae5;
116
116
  --ss-green-fg: #059669;
@@ -129,7 +129,9 @@
129
129
  --ss-reqid-hover-fg: #6d28d9;
130
130
  }
131
131
 
132
- .ss-dbg-panel.ss-dbg-open { display: flex; }
132
+ .ss-dbg-panel.ss-dbg-open {
133
+ display: flex;
134
+ }
133
135
 
134
136
  /* Tab bar */
135
137
  .ss-dbg-tabs {
@@ -152,10 +154,24 @@
152
154
  padding-left: 8px;
153
155
  scrollbar-width: none;
154
156
  -ms-overflow-style: none;
155
- mask-image: linear-gradient(to right, transparent 0, black 0, black calc(100% - 24px), transparent 100%);
156
- -webkit-mask-image: linear-gradient(to right, transparent 0, black 0, black calc(100% - 24px), transparent 100%);
157
+ mask-image: linear-gradient(
158
+ to right,
159
+ transparent 0,
160
+ black 0,
161
+ black calc(100% - 24px),
162
+ transparent 100%
163
+ );
164
+ -webkit-mask-image: linear-gradient(
165
+ to right,
166
+ transparent 0,
167
+ black 0,
168
+ black calc(100% - 24px),
169
+ transparent 100%
170
+ );
171
+ }
172
+ .ss-dbg-tabs-scroll::-webkit-scrollbar {
173
+ display: none;
157
174
  }
158
- .ss-dbg-tabs-scroll::-webkit-scrollbar { display: none; }
159
175
  .ss-dbg-tab {
160
176
  display: inline-flex;
161
177
  align-items: center;
@@ -169,7 +185,9 @@
169
185
  border: none;
170
186
  background: none;
171
187
  border-bottom: 2px solid transparent;
172
- transition: color 0.15s, border-color 0.15s;
188
+ transition:
189
+ color 0.15s,
190
+ border-color 0.15s;
173
191
  font-family: inherit;
174
192
  text-transform: uppercase;
175
193
  white-space: nowrap;
@@ -185,7 +203,9 @@
185
203
  stroke-linecap: round;
186
204
  stroke-linejoin: round;
187
205
  }
188
- .ss-dbg-tab:hover { color: var(--ss-text-secondary); }
206
+ .ss-dbg-tab:hover {
207
+ color: var(--ss-text-secondary);
208
+ }
189
209
  .ss-dbg-tab.ss-dbg-active {
190
210
  color: var(--ss-accent);
191
211
  border-bottom-color: var(--ss-accent);
@@ -207,7 +227,9 @@
207
227
  background: none;
208
228
  font-family: inherit;
209
229
  }
210
- .ss-dbg-close:hover { color: var(--ss-text-bright); }
230
+ .ss-dbg-close:hover {
231
+ color: var(--ss-text-bright);
232
+ }
211
233
 
212
234
  /* Tab content */
213
235
  .ss-dbg-content {
@@ -222,8 +244,12 @@
222
244
  scrollbar-width: none;
223
245
  -ms-overflow-style: none;
224
246
  }
225
- .ss-dbg-pane::-webkit-scrollbar { display: none; }
226
- .ss-dbg-pane.ss-dbg-active { display: block; }
247
+ .ss-dbg-pane::-webkit-scrollbar {
248
+ display: none;
249
+ }
250
+ .ss-dbg-pane.ss-dbg-active {
251
+ display: block;
252
+ }
227
253
 
228
254
  /* Search */
229
255
  .ss-dbg-search-bar {
@@ -245,8 +271,12 @@
245
271
  border-radius: 4px;
246
272
  outline: none;
247
273
  }
248
- .ss-dbg-search:focus { border-color: var(--ss-accent); }
249
- .ss-dbg-search::placeholder { color: var(--ss-dim); }
274
+ .ss-dbg-search:focus {
275
+ border-color: var(--ss-accent);
276
+ }
277
+ .ss-dbg-search::placeholder {
278
+ color: var(--ss-dim);
279
+ }
250
280
  .ss-dbg-summary {
251
281
  font-size: 11px;
252
282
  color: var(--ss-muted);
@@ -264,7 +294,10 @@
264
294
  cursor: pointer;
265
295
  text-transform: uppercase;
266
296
  }
267
- .ss-dbg-btn-clear:hover { color: var(--ss-text); border-color: var(--ss-dim); }
297
+ .ss-dbg-btn-clear:hover {
298
+ color: var(--ss-text);
299
+ border-color: var(--ss-dim);
300
+ }
268
301
 
269
302
  /* Table */
270
303
  .ss-dbg-table {
@@ -292,7 +325,9 @@
292
325
  vertical-align: top;
293
326
  max-width: 0;
294
327
  }
295
- .ss-dbg-table tr:hover td { background: var(--ss-hover); }
328
+ .ss-dbg-table tr:hover td {
329
+ background: var(--ss-hover);
330
+ }
296
331
 
297
332
  /* Query-specific styles */
298
333
  .ss-dbg-sql {
@@ -309,10 +344,19 @@
309
344
  white-space: pre-wrap;
310
345
  max-width: none;
311
346
  }
312
- .ss-dbg-duration { font-variant-numeric: tabular-nums; }
313
- .ss-dbg-slow { color: var(--ss-amber-fg); }
314
- .ss-dbg-very-slow { color: var(--ss-red-fg); }
315
- .ss-dbg-dup { color: var(--ss-purple-fg); font-size: 10px; }
347
+ .ss-dbg-duration {
348
+ font-variant-numeric: tabular-nums;
349
+ }
350
+ .ss-dbg-slow {
351
+ color: var(--ss-amber-fg);
352
+ }
353
+ .ss-dbg-very-slow {
354
+ color: var(--ss-red-fg);
355
+ }
356
+ .ss-dbg-dup {
357
+ color: var(--ss-purple-fg);
358
+ font-size: 10px;
359
+ }
316
360
 
317
361
  /* Method badges */
318
362
  .ss-dbg-method {
@@ -324,24 +368,51 @@
324
368
  letter-spacing: 0.03em;
325
369
  text-transform: uppercase;
326
370
  }
327
- .ss-dbg-method-get { background: var(--ss-green-bg); color: var(--ss-green-fg); }
328
- .ss-dbg-method-post { background: var(--ss-blue-bg); color: var(--ss-blue-fg); }
329
- .ss-dbg-method-put, .ss-dbg-method-patch { background: var(--ss-amber-bg); color: var(--ss-amber-fg); }
330
- .ss-dbg-method-delete { background: var(--ss-red-bg); color: var(--ss-red-fg); }
371
+ .ss-dbg-method-get {
372
+ background: var(--ss-green-bg);
373
+ color: var(--ss-green-fg);
374
+ }
375
+ .ss-dbg-method-post {
376
+ background: var(--ss-blue-bg);
377
+ color: var(--ss-blue-fg);
378
+ }
379
+ .ss-dbg-method-put,
380
+ .ss-dbg-method-patch {
381
+ background: var(--ss-amber-bg);
382
+ color: var(--ss-amber-fg);
383
+ }
384
+ .ss-dbg-method-delete {
385
+ background: var(--ss-red-bg);
386
+ color: var(--ss-red-fg);
387
+ }
331
388
 
332
389
  /* Route highlight */
333
- .ss-dbg-current-route td { background: var(--ss-hover-accent) !important; }
390
+ .ss-dbg-current-route td {
391
+ background: var(--ss-hover-accent) !important;
392
+ }
334
393
 
335
394
  /* Event list */
336
- .ss-dbg-event-name { color: var(--ss-sql-color); }
337
- .ss-dbg-event-data { color: var(--ss-muted); font-size: 10px; position: relative; }
338
- .ss-dbg-event-time { color: var(--ss-dim); font-size: 10px; font-variant-numeric: tabular-nums; }
395
+ .ss-dbg-event-name {
396
+ color: var(--ss-sql-color);
397
+ }
398
+ .ss-dbg-event-data {
399
+ color: var(--ss-muted);
400
+ font-size: 10px;
401
+ position: relative;
402
+ }
403
+ .ss-dbg-event-time {
404
+ color: var(--ss-dim);
405
+ font-size: 10px;
406
+ font-variant-numeric: tabular-nums;
407
+ }
339
408
  .ss-dbg-data-preview {
340
409
  cursor: pointer;
341
410
  color: var(--ss-text-secondary);
342
411
  border-bottom: 1px dashed var(--ss-dim);
343
412
  }
344
- .ss-dbg-data-preview:hover { color: var(--ss-text); }
413
+ .ss-dbg-data-preview:hover {
414
+ color: var(--ss-text);
415
+ }
345
416
  .ss-dbg-data-full {
346
417
  margin: 4px 0 0;
347
418
  padding: 8px;
@@ -359,7 +430,9 @@
359
430
  scrollbar-width: none;
360
431
  -ms-overflow-style: none;
361
432
  }
362
- .ss-dbg-data-full::-webkit-scrollbar { display: none; }
433
+ .ss-dbg-data-full::-webkit-scrollbar {
434
+ display: none;
435
+ }
363
436
  .ss-dbg-copy-btn {
364
437
  margin-left: 6px;
365
438
  padding: 1px 5px;
@@ -372,7 +445,10 @@
372
445
  font-family: inherit;
373
446
  vertical-align: middle;
374
447
  }
375
- .ss-dbg-copy-btn:hover { color: var(--ss-text-secondary); border-color: var(--ss-border-strong); }
448
+ .ss-dbg-copy-btn:hover {
449
+ color: var(--ss-text-secondary);
450
+ border-color: var(--ss-border-strong);
451
+ }
376
452
 
377
453
  /* Logs */
378
454
  .ss-dbg-log-filters {
@@ -393,8 +469,14 @@
393
469
  color: var(--ss-muted);
394
470
  text-transform: uppercase;
395
471
  }
396
- .ss-dbg-log-filter:hover { border-color: var(--ss-dim); color: var(--ss-text-secondary); }
397
- .ss-dbg-log-filter.ss-dbg-active { border-color: var(--ss-accent); color: var(--ss-accent); }
472
+ .ss-dbg-log-filter:hover {
473
+ border-color: var(--ss-dim);
474
+ color: var(--ss-text-secondary);
475
+ }
476
+ .ss-dbg-log-filter.ss-dbg-active {
477
+ border-color: var(--ss-accent);
478
+ color: var(--ss-accent);
479
+ }
398
480
 
399
481
  .ss-dbg-log-entry {
400
482
  padding: 4px 12px;
@@ -413,12 +495,33 @@
413
495
  padding: 1px 0;
414
496
  border-radius: 3px;
415
497
  }
416
- .ss-dbg-log-level-info { background: var(--ss-green-bg); color: var(--ss-green-fg); }
417
- .ss-dbg-log-level-warn { background: var(--ss-amber-bg); color: var(--ss-amber-fg); }
418
- .ss-dbg-log-level-error, .ss-dbg-log-level-fatal { background: var(--ss-red-bg); color: var(--ss-red-fg); }
419
- .ss-dbg-log-level-debug { background: var(--ss-surface-alt); color: var(--ss-muted); }
420
- .ss-dbg-log-level-trace { background: var(--ss-surface-alt); color: var(--ss-dim); }
421
- .ss-dbg-log-time { color: var(--ss-dim); font-size: 10px; font-variant-numeric: tabular-nums; flex-shrink: 0; }
498
+ .ss-dbg-log-level-info {
499
+ background: var(--ss-green-bg);
500
+ color: var(--ss-green-fg);
501
+ }
502
+ .ss-dbg-log-level-warn {
503
+ background: var(--ss-amber-bg);
504
+ color: var(--ss-amber-fg);
505
+ }
506
+ .ss-dbg-log-level-error,
507
+ .ss-dbg-log-level-fatal {
508
+ background: var(--ss-red-bg);
509
+ color: var(--ss-red-fg);
510
+ }
511
+ .ss-dbg-log-level-debug {
512
+ background: var(--ss-surface-alt);
513
+ color: var(--ss-muted);
514
+ }
515
+ .ss-dbg-log-level-trace {
516
+ background: var(--ss-surface-alt);
517
+ color: var(--ss-dim);
518
+ }
519
+ .ss-dbg-log-time {
520
+ color: var(--ss-dim);
521
+ font-size: 10px;
522
+ font-variant-numeric: tabular-nums;
523
+ flex-shrink: 0;
524
+ }
422
525
  .ss-dbg-log-reqid {
423
526
  font-size: 10px;
424
527
  color: var(--ss-reqid-fg);
@@ -430,10 +533,25 @@
430
533
  font-family: inherit;
431
534
  letter-spacing: 0.02em;
432
535
  }
433
- .ss-dbg-log-reqid:hover { color: var(--ss-reqid-hover-fg); background: var(--ss-reqid-hover-bg); }
434
- .ss-dbg-log-reqid-empty { font-size: 10px; color: var(--ss-border); flex-shrink: 0; width: 58px; text-align: center; }
435
- .ss-dbg-reqid-input { max-width: 200px; margin-left: auto; }
436
- .ss-dbg-log-msg { color: var(--ss-text); word-break: break-word; }
536
+ .ss-dbg-log-reqid:hover {
537
+ color: var(--ss-reqid-hover-fg);
538
+ background: var(--ss-reqid-hover-bg);
539
+ }
540
+ .ss-dbg-log-reqid-empty {
541
+ font-size: 10px;
542
+ color: var(--ss-border);
543
+ flex-shrink: 0;
544
+ width: 58px;
545
+ text-align: center;
546
+ }
547
+ .ss-dbg-reqid-input {
548
+ max-width: 200px;
549
+ margin-left: auto;
550
+ }
551
+ .ss-dbg-log-msg {
552
+ color: var(--ss-text);
553
+ word-break: break-word;
554
+ }
437
555
 
438
556
  /* Empty state */
439
557
  .ss-dbg-empty {
@@ -447,13 +565,38 @@
447
565
  }
448
566
 
449
567
  /* Badge format */
450
- .ss-dbg-badge { display: inline-block; padding: 1px 6px; border-radius: 3px; font-size: 10px; font-weight: 600; text-transform: uppercase; }
451
- .ss-dbg-badge-green { background: var(--ss-green-bg); color: var(--ss-green-fg); }
452
- .ss-dbg-badge-amber { background: var(--ss-amber-bg); color: var(--ss-amber-fg); }
453
- .ss-dbg-badge-red { background: var(--ss-red-bg); color: var(--ss-red-fg); }
454
- .ss-dbg-badge-blue { background: var(--ss-blue-bg); color: var(--ss-blue-fg); }
455
- .ss-dbg-badge-purple { background: var(--ss-purple-bg); color: var(--ss-purple-fg); }
456
- .ss-dbg-badge-muted { background: var(--ss-border-dim); color: var(--ss-muted); }
568
+ .ss-dbg-badge {
569
+ display: inline-block;
570
+ padding: 1px 6px;
571
+ border-radius: 3px;
572
+ font-size: 10px;
573
+ font-weight: 600;
574
+ text-transform: uppercase;
575
+ }
576
+ .ss-dbg-badge-green {
577
+ background: var(--ss-green-bg);
578
+ color: var(--ss-green-fg);
579
+ }
580
+ .ss-dbg-badge-amber {
581
+ background: var(--ss-amber-bg);
582
+ color: var(--ss-amber-fg);
583
+ }
584
+ .ss-dbg-badge-red {
585
+ background: var(--ss-red-bg);
586
+ color: var(--ss-red-fg);
587
+ }
588
+ .ss-dbg-badge-blue {
589
+ background: var(--ss-blue-bg);
590
+ color: var(--ss-blue-fg);
591
+ }
592
+ .ss-dbg-badge-purple {
593
+ background: var(--ss-purple-bg);
594
+ color: var(--ss-purple-fg);
595
+ }
596
+ .ss-dbg-badge-muted {
597
+ background: var(--ss-border-dim);
598
+ color: var(--ss-muted);
599
+ }
457
600
 
458
601
  /* Email preview overlay */
459
602
  .ss-dbg-email-preview {
@@ -480,7 +623,10 @@
480
623
  line-height: 1.6;
481
624
  overflow: hidden;
482
625
  }
483
- .ss-dbg-email-preview-meta strong { color: var(--ss-text); font-weight: 600; }
626
+ .ss-dbg-email-preview-meta strong {
627
+ color: var(--ss-text);
628
+ font-weight: 600;
629
+ }
484
630
  .ss-dbg-email-iframe {
485
631
  flex: 1;
486
632
  border: none;
@@ -488,8 +634,12 @@
488
634
  }
489
635
 
490
636
  /* Email row */
491
- .ss-dbg-email-row { cursor: pointer; }
492
- .ss-dbg-email-row:hover td { background: var(--ss-hover-accent) !important; }
637
+ .ss-dbg-email-row {
638
+ cursor: pointer;
639
+ }
640
+ .ss-dbg-email-row:hover td {
641
+ background: var(--ss-hover-accent) !important;
642
+ }
493
643
 
494
644
  /* Email status badges */
495
645
  .ss-dbg-email-status {
@@ -500,13 +650,27 @@
500
650
  font-weight: 600;
501
651
  text-transform: uppercase;
502
652
  }
503
- .ss-dbg-email-status-sent { background: var(--ss-green-bg); color: var(--ss-green-fg); }
504
- .ss-dbg-email-status-sending { background: var(--ss-amber-bg); color: var(--ss-amber-fg); }
505
- .ss-dbg-email-status-queued { background: var(--ss-blue-bg); color: var(--ss-blue-fg); }
506
- .ss-dbg-email-status-failed { background: var(--ss-red-bg); color: var(--ss-red-fg); }
653
+ .ss-dbg-email-status-sent {
654
+ background: var(--ss-green-bg);
655
+ color: var(--ss-green-fg);
656
+ }
657
+ .ss-dbg-email-status-sending {
658
+ background: var(--ss-amber-bg);
659
+ color: var(--ss-amber-fg);
660
+ }
661
+ .ss-dbg-email-status-queued {
662
+ background: var(--ss-blue-bg);
663
+ color: var(--ss-blue-fg);
664
+ }
665
+ .ss-dbg-email-status-failed {
666
+ background: var(--ss-red-bg);
667
+ color: var(--ss-red-fg);
668
+ }
507
669
 
508
670
  /* Filterable cell */
509
- .ss-dbg-filterable:hover { background: var(--ss-hover-accent); }
671
+ .ss-dbg-filterable:hover {
672
+ background: var(--ss-hover-accent);
673
+ }
510
674
 
511
675
  /* Timeline */
512
676
  .ss-dbg-tl-detail-header {
@@ -524,7 +688,9 @@
524
688
  scrollbar-width: none;
525
689
  -ms-overflow-style: none;
526
690
  }
527
- #ss-dbg-tl-waterfall::-webkit-scrollbar { display: none; }
691
+ #ss-dbg-tl-waterfall::-webkit-scrollbar {
692
+ display: none;
693
+ }
528
694
 
529
695
  .ss-dbg-tl-row {
530
696
  display: flex;
@@ -533,7 +699,9 @@
533
699
  font-size: 11px;
534
700
  border-bottom: 1px solid var(--ss-input-bg);
535
701
  }
536
- .ss-dbg-tl-row:hover { background: var(--ss-hover); }
702
+ .ss-dbg-tl-row:hover {
703
+ background: var(--ss-hover);
704
+ }
537
705
  .ss-dbg-tl-label {
538
706
  width: 280px;
539
707
  min-width: 280px;
@@ -558,13 +726,28 @@
558
726
  cursor: default;
559
727
  }
560
728
  /* Timeline bar colors are semantic category indicators — kept as fixed values */
561
- .ss-dbg-tl-bar-request { background: #1e3a5f; }
562
- .ss-dbg-tl-bar-middleware { background: #1e3a5f; opacity: 0.7; }
563
- .ss-dbg-tl-bar-db { background: #6d28d9; }
564
- .ss-dbg-tl-bar-view { background: #0e7490; }
565
- .ss-dbg-tl-bar-mail { background: #059669; }
566
- .ss-dbg-tl-bar-event { background: #b45309; }
567
- .ss-dbg-tl-bar-custom { background: #525252; }
729
+ .ss-dbg-tl-bar-request {
730
+ background: #1e3a5f;
731
+ }
732
+ .ss-dbg-tl-bar-middleware {
733
+ background: #1e3a5f;
734
+ opacity: 0.7;
735
+ }
736
+ .ss-dbg-tl-bar-db {
737
+ background: #6d28d9;
738
+ }
739
+ .ss-dbg-tl-bar-view {
740
+ background: #0e7490;
741
+ }
742
+ .ss-dbg-tl-bar-mail {
743
+ background: #059669;
744
+ }
745
+ .ss-dbg-tl-bar-event {
746
+ background: #b45309;
747
+ }
748
+ .ss-dbg-tl-bar-custom {
749
+ background: #525252;
750
+ }
568
751
 
569
752
  .ss-dbg-tl-dur {
570
753
  font-size: 10px;
@@ -621,11 +804,28 @@
621
804
  }
622
805
 
623
806
  /* Status code badges */
624
- .ss-dbg-status { font-size: 10px; font-weight: 600; padding: 1px 5px; border-radius: 3px; }
625
- .ss-dbg-status-2xx { background: var(--ss-green-bg); color: var(--ss-green-fg); }
626
- .ss-dbg-status-3xx { background: var(--ss-blue-bg); color: var(--ss-blue-fg); }
627
- .ss-dbg-status-4xx { background: var(--ss-amber-bg); color: var(--ss-amber-fg); }
628
- .ss-dbg-status-5xx { background: var(--ss-red-bg); color: var(--ss-red-fg); }
807
+ .ss-dbg-status {
808
+ font-size: 10px;
809
+ font-weight: 600;
810
+ padding: 1px 5px;
811
+ border-radius: 3px;
812
+ }
813
+ .ss-dbg-status-2xx {
814
+ background: var(--ss-green-bg);
815
+ color: var(--ss-green-fg);
816
+ }
817
+ .ss-dbg-status-3xx {
818
+ background: var(--ss-blue-bg);
819
+ color: var(--ss-blue-fg);
820
+ }
821
+ .ss-dbg-status-4xx {
822
+ background: var(--ss-amber-bg);
823
+ color: var(--ss-amber-fg);
824
+ }
825
+ .ss-dbg-status-5xx {
826
+ background: var(--ss-red-bg);
827
+ color: var(--ss-red-fg);
828
+ }
629
829
 
630
830
  /* Dashboard deep link button in tab bar */
631
831
  .ss-dbg-dashboard-link {
@@ -636,9 +836,14 @@
636
836
  color: var(--ss-muted);
637
837
  border-radius: 4px;
638
838
  text-decoration: none;
639
- transition: color 0.15s, background 0.15s;
839
+ transition:
840
+ color 0.15s,
841
+ background 0.15s;
842
+ }
843
+ .ss-dbg-dashboard-link:hover {
844
+ color: var(--ss-accent);
845
+ background: var(--ss-hover-accent);
640
846
  }
641
- .ss-dbg-dashboard-link:hover { color: var(--ss-accent); background: var(--ss-hover-accent); }
642
847
 
643
848
  /* Row-level deep link icon (visible on hover) */
644
849
  .ss-dbg-deeplink {
@@ -651,15 +856,25 @@
651
856
  text-decoration: none;
652
857
  border-radius: 3px;
653
858
  opacity: 0;
654
- transition: opacity 0.15s, color 0.15s;
859
+ transition:
860
+ opacity 0.15s,
861
+ color 0.15s;
655
862
  vertical-align: middle;
656
863
  margin-left: 4px;
657
864
  flex-shrink: 0;
658
865
  }
659
866
  .ss-dbg-table tr:hover .ss-dbg-deeplink,
660
- .ss-dbg-email-row:hover .ss-dbg-deeplink { opacity: 1; }
661
- .ss-dbg-deeplink:hover { color: var(--ss-accent); background: var(--ss-hover-accent); }
662
- .ss-dbg-deeplink svg { width: 12px; height: 12px; }
867
+ .ss-dbg-email-row:hover .ss-dbg-deeplink {
868
+ opacity: 1;
869
+ }
870
+ .ss-dbg-deeplink:hover {
871
+ color: var(--ss-accent);
872
+ background: var(--ss-hover-accent);
873
+ }
874
+ .ss-dbg-deeplink svg {
875
+ width: 12px;
876
+ height: 12px;
877
+ }
663
878
 
664
879
  /* Connection mode indicator */
665
880
  .ss-dbg-conn-mode {
@@ -699,9 +914,15 @@
699
914
  font-variant-numeric: tabular-nums;
700
915
  font-weight: 600;
701
916
  }
702
- .ss-dbg-mini-stat-value.ss-dbg-stat-green { color: var(--ss-green-fg); }
703
- .ss-dbg-mini-stat-value.ss-dbg-stat-amber { color: var(--ss-amber-fg); }
704
- .ss-dbg-mini-stat-value.ss-dbg-stat-red { color: var(--ss-red-fg); }
917
+ .ss-dbg-mini-stat-value.ss-dbg-stat-green {
918
+ color: var(--ss-green-fg);
919
+ }
920
+ .ss-dbg-mini-stat-value.ss-dbg-stat-amber {
921
+ color: var(--ss-amber-fg);
922
+ }
923
+ .ss-dbg-mini-stat-value.ss-dbg-stat-red {
924
+ color: var(--ss-red-fg);
925
+ }
705
926
 
706
927
  /* Cache tab */
707
928
  .ss-dbg-cache-stats {
@@ -717,14 +938,22 @@
717
938
  align-items: center;
718
939
  gap: 4px;
719
940
  }
720
- .ss-dbg-cache-stat-label { color: var(--ss-muted); }
721
- .ss-dbg-cache-stat-value { color: var(--ss-text); font-weight: 600; font-variant-numeric: tabular-nums; }
941
+ .ss-dbg-cache-stat-label {
942
+ color: var(--ss-muted);
943
+ }
944
+ .ss-dbg-cache-stat-value {
945
+ color: var(--ss-text);
946
+ font-weight: 600;
947
+ font-variant-numeric: tabular-nums;
948
+ }
722
949
 
723
950
  /* Cache detail overlay */
724
951
  .ss-dbg-cache-detail {
725
952
  padding: 12px;
726
953
  }
727
- .ss-dbg-cache-detail strong { color: var(--ss-text); }
954
+ .ss-dbg-cache-detail strong {
955
+ color: var(--ss-text);
956
+ }
728
957
  .ss-dbg-cache-detail pre {
729
958
  margin: 8px 0 0;
730
959
  padding: 8px;
@@ -741,7 +970,9 @@
741
970
  scrollbar-width: none;
742
971
  -ms-overflow-style: none;
743
972
  }
744
- .ss-dbg-cache-detail pre::-webkit-scrollbar { display: none; }
973
+ .ss-dbg-cache-detail pre::-webkit-scrollbar {
974
+ display: none;
975
+ }
745
976
 
746
977
  /* Jobs tab */
747
978
  .ss-dbg-job-stats-area {
@@ -759,8 +990,14 @@
759
990
  align-items: center;
760
991
  gap: 4px;
761
992
  }
762
- .ss-dbg-job-stat-label { color: var(--ss-muted); }
763
- .ss-dbg-job-stat-value { color: var(--ss-text); font-weight: 600; font-variant-numeric: tabular-nums; }
993
+ .ss-dbg-job-stat-label {
994
+ color: var(--ss-muted);
995
+ }
996
+ .ss-dbg-job-stat-value {
997
+ color: var(--ss-text);
998
+ font-weight: 600;
999
+ font-variant-numeric: tabular-nums;
1000
+ }
764
1001
 
765
1002
  .ss-dbg-job-filter {
766
1003
  padding: 3px 10px;
@@ -773,14 +1010,35 @@
773
1010
  color: var(--ss-muted);
774
1011
  text-transform: uppercase;
775
1012
  }
776
- .ss-dbg-job-filter:hover { border-color: var(--ss-dim); color: var(--ss-text-secondary); }
777
- .ss-dbg-job-filter.ss-dbg-active { border-color: var(--ss-accent); color: var(--ss-accent); }
1013
+ .ss-dbg-job-filter:hover {
1014
+ border-color: var(--ss-dim);
1015
+ color: var(--ss-text-secondary);
1016
+ }
1017
+ .ss-dbg-job-filter.ss-dbg-active {
1018
+ border-color: var(--ss-accent);
1019
+ color: var(--ss-accent);
1020
+ }
778
1021
 
779
- .ss-dbg-job-status-completed { background: var(--ss-green-bg); color: var(--ss-green-fg); }
780
- .ss-dbg-job-status-failed { background: var(--ss-red-bg); color: var(--ss-red-fg); }
781
- .ss-dbg-job-status-active { background: var(--ss-blue-bg); color: var(--ss-blue-fg); }
782
- .ss-dbg-job-status-waiting { background: var(--ss-amber-bg); color: var(--ss-amber-fg); }
783
- .ss-dbg-job-status-delayed { background: var(--ss-purple-bg); color: var(--ss-purple-fg); }
1022
+ .ss-dbg-job-status-completed {
1023
+ background: var(--ss-green-bg);
1024
+ color: var(--ss-green-fg);
1025
+ }
1026
+ .ss-dbg-job-status-failed {
1027
+ background: var(--ss-red-bg);
1028
+ color: var(--ss-red-fg);
1029
+ }
1030
+ .ss-dbg-job-status-active {
1031
+ background: var(--ss-blue-bg);
1032
+ color: var(--ss-blue-fg);
1033
+ }
1034
+ .ss-dbg-job-status-waiting {
1035
+ background: var(--ss-amber-bg);
1036
+ color: var(--ss-amber-fg);
1037
+ }
1038
+ .ss-dbg-job-status-delayed {
1039
+ background: var(--ss-purple-bg);
1040
+ color: var(--ss-purple-fg);
1041
+ }
784
1042
 
785
1043
  .ss-dbg-retry-btn {
786
1044
  padding: 2px 8px;
@@ -793,8 +1051,14 @@
793
1051
  cursor: pointer;
794
1052
  text-transform: uppercase;
795
1053
  }
796
- .ss-dbg-retry-btn:hover { color: var(--ss-text); border-color: var(--ss-dim); }
797
- .ss-dbg-retry-btn:disabled { opacity: 0.5; cursor: default; }
1054
+ .ss-dbg-retry-btn:hover {
1055
+ color: var(--ss-text);
1056
+ border-color: var(--ss-dim);
1057
+ }
1058
+ .ss-dbg-retry-btn:disabled {
1059
+ opacity: 0.5;
1060
+ cursor: default;
1061
+ }
798
1062
 
799
1063
  /* Config tab */
800
1064
  .ss-dbg-config-tab {
@@ -808,11 +1072,21 @@
808
1072
  color: var(--ss-muted);
809
1073
  text-transform: uppercase;
810
1074
  }
811
- .ss-dbg-config-tab:hover { border-color: var(--ss-dim); color: var(--ss-text-secondary); }
812
- .ss-dbg-config-tab.ss-dbg-active { border-color: var(--ss-accent); color: var(--ss-accent); }
1075
+ .ss-dbg-config-tab:hover {
1076
+ border-color: var(--ss-dim);
1077
+ color: var(--ss-text-secondary);
1078
+ }
1079
+ .ss-dbg-config-tab.ss-dbg-active {
1080
+ border-color: var(--ss-accent);
1081
+ color: var(--ss-accent);
1082
+ }
813
1083
 
814
- .ss-dbg-config-sections { padding: 0; }
815
- .ss-dbg-config-section { border-bottom: 1px solid var(--ss-border-faint); }
1084
+ .ss-dbg-config-sections {
1085
+ padding: 0;
1086
+ }
1087
+ .ss-dbg-config-section {
1088
+ border-bottom: 1px solid var(--ss-border-faint);
1089
+ }
816
1090
  .ss-dbg-config-section-header {
817
1091
  display: flex;
818
1092
  align-items: center;
@@ -821,17 +1095,46 @@
821
1095
  cursor: pointer;
822
1096
  font-size: 11px;
823
1097
  }
824
- .ss-dbg-config-section-header:hover { background: var(--ss-hover); }
825
- .ss-dbg-config-toggle { color: var(--ss-dim); font-size: 9px; width: 12px; text-align: center; flex-shrink: 0; }
826
- .ss-dbg-config-key { color: var(--ss-sql-color); }
827
- .ss-dbg-config-count { color: var(--ss-dim); font-size: 10px; margin-left: auto; }
828
- .ss-dbg-config-val { color: var(--ss-text-secondary); }
829
- .ss-dbg-config-val-true { color: var(--ss-accent); }
830
- .ss-dbg-config-val-false { color: var(--ss-red-fg); }
831
- .ss-dbg-config-val-number { color: var(--ss-amber-fg); }
832
- .ss-dbg-config-val-array { color: var(--ss-purple-fg); }
833
- .ss-dbg-config-val-null { color: var(--ss-dim); }
834
- .ss-dbg-config-redacted { color: var(--ss-dim); font-style: italic; }
1098
+ .ss-dbg-config-section-header:hover {
1099
+ background: var(--ss-hover);
1100
+ }
1101
+ .ss-dbg-config-toggle {
1102
+ color: var(--ss-dim);
1103
+ font-size: 9px;
1104
+ width: 12px;
1105
+ text-align: center;
1106
+ flex-shrink: 0;
1107
+ }
1108
+ .ss-dbg-config-key {
1109
+ color: var(--ss-sql-color);
1110
+ }
1111
+ .ss-dbg-config-count {
1112
+ color: var(--ss-dim);
1113
+ font-size: 10px;
1114
+ margin-left: auto;
1115
+ }
1116
+ .ss-dbg-config-val {
1117
+ color: var(--ss-text-secondary);
1118
+ }
1119
+ .ss-dbg-config-val-true {
1120
+ color: var(--ss-accent);
1121
+ }
1122
+ .ss-dbg-config-val-false {
1123
+ color: var(--ss-red-fg);
1124
+ }
1125
+ .ss-dbg-config-val-number {
1126
+ color: var(--ss-amber-fg);
1127
+ }
1128
+ .ss-dbg-config-val-array {
1129
+ color: var(--ss-purple-fg);
1130
+ }
1131
+ .ss-dbg-config-val-null {
1132
+ color: var(--ss-dim);
1133
+ }
1134
+ .ss-dbg-config-redacted {
1135
+ color: var(--ss-dim);
1136
+ font-style: italic;
1137
+ }
835
1138
  .ss-dbg-redacted-wrap {
836
1139
  display: inline-flex;
837
1140
  align-items: center;
@@ -857,20 +1160,37 @@
857
1160
  display: inline-flex;
858
1161
  align-items: center;
859
1162
  line-height: 1;
860
- transition: color 0.15s, border-color 0.15s;
1163
+ transition:
1164
+ color 0.15s,
1165
+ border-color 0.15s;
861
1166
  }
862
1167
  .ss-dbg-redacted-reveal:hover,
863
1168
  .ss-dbg-redacted-copy:hover {
864
1169
  color: var(--ss-text);
865
1170
  border-color: var(--ss-dim);
866
1171
  }
867
- .ss-dbg-config-match { background: var(--ss-amber-bg); color: var(--ss-amber-fg); border-radius: 2px; padding: 0 1px; }
1172
+ .ss-dbg-config-match {
1173
+ background: var(--ss-amber-bg);
1174
+ color: var(--ss-amber-fg);
1175
+ border-radius: 2px;
1176
+ padding: 0 1px;
1177
+ }
868
1178
 
869
- .ss-dbg-config-leaf { cursor: default; }
870
- .ss-dbg-config-leaf:hover { background: transparent; }
1179
+ .ss-dbg-config-leaf {
1180
+ cursor: default;
1181
+ }
1182
+ .ss-dbg-config-leaf:hover {
1183
+ background: transparent;
1184
+ }
871
1185
 
872
- .ss-dbg-config-table-wrap { overflow: auto; scrollbar-width: none; -ms-overflow-style: none; }
873
- .ss-dbg-config-table-wrap::-webkit-scrollbar { display: none; }
1186
+ .ss-dbg-config-table-wrap {
1187
+ overflow: auto;
1188
+ scrollbar-width: none;
1189
+ -ms-overflow-style: none;
1190
+ }
1191
+ .ss-dbg-config-table-wrap::-webkit-scrollbar {
1192
+ display: none;
1193
+ }
874
1194
 
875
1195
  /* Wrench button in stats bar */
876
1196
  .ss-dbg-btn {
@@ -887,8 +1207,13 @@
887
1207
  border-radius: 4px;
888
1208
  flex-shrink: 0;
889
1209
  }
890
- .ss-dbg-btn:hover { color: var(--ss-text); background: var(--ss-hover); }
891
- .ss-dbg-btn.ss-dbg-active { color: var(--ss-accent); }
1210
+ .ss-dbg-btn:hover {
1211
+ color: var(--ss-text);
1212
+ background: var(--ss-hover);
1213
+ }
1214
+ .ss-dbg-btn.ss-dbg-active {
1215
+ color: var(--ss-accent);
1216
+ }
892
1217
 
893
1218
  /* Theme toggle button */
894
1219
  .ss-dbg-theme-toggle {
@@ -902,7 +1227,9 @@
902
1227
  cursor: pointer;
903
1228
  font-size: 14px;
904
1229
  border-radius: 4px;
905
- transition: color 0.15s, background 0.15s;
1230
+ transition:
1231
+ color 0.15s,
1232
+ background 0.15s;
906
1233
  }
907
1234
  .ss-dbg-theme-toggle:hover {
908
1235
  color: var(--ss-accent);
@@ -910,11 +1237,27 @@
910
1237
  }
911
1238
 
912
1239
  /* Utility classes for JS-rendered inline content */
913
- .ss-dbg-c-dim { color: var(--ss-dim); }
914
- .ss-dbg-c-muted { color: var(--ss-muted); }
915
- .ss-dbg-c-secondary { color: var(--ss-text-secondary); }
916
- .ss-dbg-c-text { color: var(--ss-text); }
917
- .ss-dbg-c-sql { color: var(--ss-sql-color); }
918
- .ss-dbg-c-amber { color: var(--ss-amber-fg); }
919
- .ss-dbg-c-red { color: var(--ss-red-fg); }
920
- .ss-dbg-c-border { color: var(--ss-border); }
1240
+ .ss-dbg-c-dim {
1241
+ color: var(--ss-dim);
1242
+ }
1243
+ .ss-dbg-c-muted {
1244
+ color: var(--ss-muted);
1245
+ }
1246
+ .ss-dbg-c-secondary {
1247
+ color: var(--ss-text-secondary);
1248
+ }
1249
+ .ss-dbg-c-text {
1250
+ color: var(--ss-text);
1251
+ }
1252
+ .ss-dbg-c-sql {
1253
+ color: var(--ss-sql-color);
1254
+ }
1255
+ .ss-dbg-c-amber {
1256
+ color: var(--ss-amber-fg);
1257
+ }
1258
+ .ss-dbg-c-red {
1259
+ color: var(--ss-red-fg);
1260
+ }
1261
+ .ss-dbg-c-border {
1262
+ color: var(--ss-border);
1263
+ }