adonisjs-server-stats 1.2.1 → 1.3.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.
Files changed (95) hide show
  1. package/README.md +144 -9
  2. package/dist/src/dashboard/chart_aggregator.d.ts +21 -0
  3. package/dist/src/dashboard/chart_aggregator.d.ts.map +1 -0
  4. package/dist/src/dashboard/chart_aggregator.js +89 -0
  5. package/dist/src/dashboard/dashboard_controller.d.ts +147 -0
  6. package/dist/src/dashboard/dashboard_controller.d.ts.map +1 -0
  7. package/dist/src/dashboard/dashboard_controller.js +1008 -0
  8. package/dist/src/dashboard/dashboard_routes.d.ts +16 -0
  9. package/dist/src/dashboard/dashboard_routes.d.ts.map +1 -0
  10. package/dist/src/dashboard/dashboard_routes.js +88 -0
  11. package/dist/src/dashboard/dashboard_store.d.ts +158 -0
  12. package/dist/src/dashboard/dashboard_store.d.ts.map +1 -0
  13. package/dist/src/dashboard/dashboard_store.js +723 -0
  14. package/dist/src/dashboard/integrations/cache_inspector.d.ts +88 -0
  15. package/dist/src/dashboard/integrations/cache_inspector.d.ts.map +1 -0
  16. package/dist/src/dashboard/integrations/cache_inspector.js +215 -0
  17. package/dist/src/dashboard/integrations/config_inspector.d.ts +33 -0
  18. package/dist/src/dashboard/integrations/config_inspector.d.ts.map +1 -0
  19. package/dist/src/dashboard/integrations/config_inspector.js +155 -0
  20. package/dist/src/dashboard/integrations/index.d.ts +7 -0
  21. package/dist/src/dashboard/integrations/index.d.ts.map +1 -0
  22. package/dist/src/dashboard/integrations/index.js +3 -0
  23. package/dist/src/dashboard/integrations/queue_inspector.d.ts +106 -0
  24. package/dist/src/dashboard/integrations/queue_inspector.d.ts.map +1 -0
  25. package/dist/src/dashboard/integrations/queue_inspector.js +182 -0
  26. package/dist/src/dashboard/migrator.d.ts +18 -0
  27. package/dist/src/dashboard/migrator.d.ts.map +1 -0
  28. package/dist/src/dashboard/migrator.js +144 -0
  29. package/dist/src/dashboard/models/stats_email.d.ts +19 -0
  30. package/dist/src/dashboard/models/stats_email.d.ts.map +1 -0
  31. package/dist/src/dashboard/models/stats_email.js +66 -0
  32. package/dist/src/dashboard/models/stats_event.d.ts +14 -0
  33. package/dist/src/dashboard/models/stats_event.d.ts.map +1 -0
  34. package/dist/src/dashboard/models/stats_event.js +43 -0
  35. package/dist/src/dashboard/models/stats_log.d.ts +12 -0
  36. package/dist/src/dashboard/models/stats_log.d.ts.map +1 -0
  37. package/dist/src/dashboard/models/stats_log.js +42 -0
  38. package/dist/src/dashboard/models/stats_metric.d.ts +15 -0
  39. package/dist/src/dashboard/models/stats_metric.d.ts.map +1 -0
  40. package/dist/src/dashboard/models/stats_metric.js +50 -0
  41. package/dist/src/dashboard/models/stats_query.d.ts +20 -0
  42. package/dist/src/dashboard/models/stats_query.d.ts.map +1 -0
  43. package/dist/src/dashboard/models/stats_query.js +67 -0
  44. package/dist/src/dashboard/models/stats_request.d.ts +21 -0
  45. package/dist/src/dashboard/models/stats_request.d.ts.map +1 -0
  46. package/dist/src/dashboard/models/stats_request.js +61 -0
  47. package/dist/src/dashboard/models/stats_saved_filter.d.ts +11 -0
  48. package/dist/src/dashboard/models/stats_saved_filter.d.ts.map +1 -0
  49. package/dist/src/dashboard/models/stats_saved_filter.js +38 -0
  50. package/dist/src/dashboard/models/stats_trace.d.ts +19 -0
  51. package/dist/src/dashboard/models/stats_trace.d.ts.map +1 -0
  52. package/dist/src/dashboard/models/stats_trace.js +67 -0
  53. package/dist/src/debug/debug_store.d.ts +5 -0
  54. package/dist/src/debug/debug_store.d.ts.map +1 -1
  55. package/dist/src/debug/debug_store.js +10 -0
  56. package/dist/src/debug/email_collector.d.ts +2 -0
  57. package/dist/src/debug/email_collector.d.ts.map +1 -1
  58. package/dist/src/debug/email_collector.js +4 -0
  59. package/dist/src/debug/event_collector.d.ts +2 -0
  60. package/dist/src/debug/event_collector.d.ts.map +1 -1
  61. package/dist/src/debug/event_collector.js +11 -2
  62. package/dist/src/debug/query_collector.d.ts +2 -0
  63. package/dist/src/debug/query_collector.d.ts.map +1 -1
  64. package/dist/src/debug/query_collector.js +11 -0
  65. package/dist/src/debug/ring_buffer.d.ts +3 -0
  66. package/dist/src/debug/ring_buffer.d.ts.map +1 -1
  67. package/dist/src/debug/ring_buffer.js +6 -0
  68. package/dist/src/debug/trace_collector.d.ts +4 -2
  69. package/dist/src/debug/trace_collector.d.ts.map +1 -1
  70. package/dist/src/debug/trace_collector.js +7 -2
  71. package/dist/src/debug/types.d.ts +8 -0
  72. package/dist/src/debug/types.d.ts.map +1 -1
  73. package/dist/src/edge/client/dashboard.css +1504 -0
  74. package/dist/src/edge/client/dashboard.js +2378 -0
  75. package/dist/src/edge/client/debug-panel.css +530 -110
  76. package/dist/src/edge/client/debug-panel.js +663 -22
  77. package/dist/src/edge/client/stats-bar.css +115 -41
  78. package/dist/src/edge/client/stats-bar.js +37 -3
  79. package/dist/src/edge/plugin.d.ts.map +1 -1
  80. package/dist/src/edge/plugin.js +21 -0
  81. package/dist/src/edge/views/dashboard.edge +382 -0
  82. package/dist/src/edge/views/debug-panel.edge +60 -14
  83. package/dist/src/edge/views/stats-bar.edge +9 -0
  84. package/dist/src/index.d.ts +2 -0
  85. package/dist/src/index.d.ts.map +1 -1
  86. package/dist/src/index.js +1 -0
  87. package/dist/src/middleware/request_tracking_middleware.d.ts +20 -0
  88. package/dist/src/middleware/request_tracking_middleware.d.ts.map +1 -1
  89. package/dist/src/middleware/request_tracking_middleware.js +66 -2
  90. package/dist/src/provider/server_stats_provider.d.ts +13 -0
  91. package/dist/src/provider/server_stats_provider.d.ts.map +1 -1
  92. package/dist/src/provider/server_stats_provider.js +175 -1
  93. package/dist/src/types.d.ts +42 -0
  94. package/dist/src/types.d.ts.map +1 -1
  95. package/package.json +14 -1
@@ -1,21 +1,134 @@
1
1
  /* Scoped CSS for the debug panel overlay.
2
2
  * All classes use the `.ss-dbg-` prefix to avoid conflicts.
3
+ * Theme via CSS custom properties scoped to .ss-dbg-panel.
3
4
  */
4
5
 
6
+ /* ── Theme: Dark (default) ────────────────────────────────────── */
5
7
  .ss-dbg-panel {
8
+ --ss-bg: #0f0f0f;
9
+ --ss-surface: #171717;
10
+ --ss-surface-alt: #141414;
11
+ --ss-input-bg: #1a1a1a;
12
+ --ss-text: #d4d4d4;
13
+ --ss-text-bright: #e5e5e5;
14
+ --ss-text-secondary: #a3a3a3;
15
+ --ss-muted: #737373;
16
+ --ss-dim: #525252;
17
+ --ss-accent: #34d399;
18
+ --ss-accent-dim: #064e3b;
19
+ --ss-border: #333;
20
+ --ss-border-dim: #262626;
21
+ --ss-border-faint: #1f1f1f;
22
+ --ss-border-strong: #404040;
23
+ --ss-hover: rgba(38,38,38,0.4);
24
+ --ss-hover-accent: rgba(52,211,153,0.08);
25
+ --ss-shadow: rgb(0 0 0 / 0.4);
26
+ --ss-green-bg: #064e3b;
27
+ --ss-green-fg: #34d399;
28
+ --ss-blue-bg: #1e3a5f;
29
+ --ss-blue-fg: #60a5fa;
30
+ --ss-amber-bg: #422006;
31
+ --ss-amber-fg: #fbbf24;
32
+ --ss-red-bg: #450a0a;
33
+ --ss-red-fg: #f87171;
34
+ --ss-purple-bg: #2e1065;
35
+ --ss-purple-fg: #c084fc;
36
+ --ss-sql-color: #93c5fd;
37
+ --ss-reqid-bg: #1e1b2e;
38
+ --ss-reqid-fg: #6d28d9;
39
+ --ss-reqid-hover-bg: #2e2644;
40
+ --ss-reqid-hover-fg: #a78bfa;
41
+
6
42
  position: fixed;
7
43
  inset-inline: 0;
8
44
  bottom: 28px;
9
- z-index: 49;
45
+ z-index: 147;
10
46
  height: 50vh;
11
47
  display: none;
12
48
  flex-direction: column;
13
- background: #0f0f0f;
14
- border-top: 1px solid #333;
49
+ background: var(--ss-bg);
50
+ border-top: 1px solid var(--ss-border);
15
51
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
16
- color: #d4d4d4;
17
- box-shadow: 0 -8px 24px rgb(0 0 0 / 0.4);
52
+ color: var(--ss-text);
53
+ box-shadow: 0 -8px 24px var(--ss-shadow);
54
+ }
55
+
56
+ /* ── Theme: Light (auto via system preference) ────────────────── */
57
+ @media (prefers-color-scheme: light) {
58
+ .ss-dbg-panel:not([data-ss-theme="dark"]) {
59
+ --ss-bg: #fafafa;
60
+ --ss-surface: #ffffff;
61
+ --ss-surface-alt: #f5f5f5;
62
+ --ss-input-bg: #ffffff;
63
+ --ss-text: #171717;
64
+ --ss-text-bright: #0f0f0f;
65
+ --ss-text-secondary: #525252;
66
+ --ss-muted: #6b7280;
67
+ --ss-dim: #9ca3af;
68
+ --ss-accent: #059669;
69
+ --ss-accent-dim: #d1fae5;
70
+ --ss-border: #e5e5e5;
71
+ --ss-border-dim: #e5e5e5;
72
+ --ss-border-faint: #f0f0f0;
73
+ --ss-border-strong: #d4d4d4;
74
+ --ss-hover: rgba(0,0,0,0.03);
75
+ --ss-hover-accent: rgba(5,150,105,0.06);
76
+ --ss-shadow: rgb(0 0 0 / 0.08);
77
+ --ss-green-bg: #d1fae5;
78
+ --ss-green-fg: #059669;
79
+ --ss-blue-bg: #dbeafe;
80
+ --ss-blue-fg: #2563eb;
81
+ --ss-amber-bg: #fef3c7;
82
+ --ss-amber-fg: #b45309;
83
+ --ss-red-bg: #fee2e2;
84
+ --ss-red-fg: #dc2626;
85
+ --ss-purple-bg: #ede9fe;
86
+ --ss-purple-fg: #7c3aed;
87
+ --ss-sql-color: #2563eb;
88
+ --ss-reqid-bg: #ede9fe;
89
+ --ss-reqid-fg: #7c3aed;
90
+ --ss-reqid-hover-bg: #ddd6fe;
91
+ --ss-reqid-hover-fg: #6d28d9;
92
+ }
93
+ }
94
+
95
+ /* ── Theme: Light (manual override) ───────────────────────────── */
96
+ .ss-dbg-panel[data-ss-theme="light"] {
97
+ --ss-bg: #fafafa;
98
+ --ss-surface: #ffffff;
99
+ --ss-surface-alt: #f5f5f5;
100
+ --ss-input-bg: #ffffff;
101
+ --ss-text: #171717;
102
+ --ss-text-bright: #0f0f0f;
103
+ --ss-text-secondary: #525252;
104
+ --ss-muted: #6b7280;
105
+ --ss-dim: #9ca3af;
106
+ --ss-accent: #059669;
107
+ --ss-accent-dim: #d1fae5;
108
+ --ss-border: #e5e5e5;
109
+ --ss-border-dim: #e5e5e5;
110
+ --ss-border-faint: #f0f0f0;
111
+ --ss-border-strong: #d4d4d4;
112
+ --ss-hover: rgba(0,0,0,0.03);
113
+ --ss-hover-accent: rgba(5,150,105,0.06);
114
+ --ss-shadow: rgb(0 0 0 / 0.08);
115
+ --ss-green-bg: #d1fae5;
116
+ --ss-green-fg: #059669;
117
+ --ss-blue-bg: #dbeafe;
118
+ --ss-blue-fg: #2563eb;
119
+ --ss-amber-bg: #fef3c7;
120
+ --ss-amber-fg: #b45309;
121
+ --ss-red-bg: #fee2e2;
122
+ --ss-red-fg: #dc2626;
123
+ --ss-purple-bg: #ede9fe;
124
+ --ss-purple-fg: #7c3aed;
125
+ --ss-sql-color: #2563eb;
126
+ --ss-reqid-bg: #ede9fe;
127
+ --ss-reqid-fg: #7c3aed;
128
+ --ss-reqid-hover-bg: #ddd6fe;
129
+ --ss-reqid-hover-fg: #6d28d9;
18
130
  }
131
+
19
132
  .ss-dbg-panel.ss-dbg-open { display: flex; }
20
133
 
21
134
  /* Tab bar */
@@ -23,17 +136,35 @@
23
136
  display: flex;
24
137
  align-items: center;
25
138
  gap: 0;
26
- border-bottom: 1px solid #333;
27
- background: #171717;
139
+ border-bottom: 1px solid var(--ss-border);
140
+ background: var(--ss-surface);
28
141
  flex-shrink: 0;
29
- padding: 0 8px;
142
+ padding: 0;
143
+ min-height: 0;
30
144
  }
145
+ .ss-dbg-tabs-scroll {
146
+ display: flex;
147
+ align-items: center;
148
+ overflow-x: auto;
149
+ overflow-y: hidden;
150
+ flex: 1;
151
+ min-width: 0;
152
+ padding-left: 8px;
153
+ scrollbar-width: none;
154
+ -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
+ }
158
+ .ss-dbg-tabs-scroll::-webkit-scrollbar { display: none; }
31
159
  .ss-dbg-tab {
32
- padding: 8px 16px;
160
+ display: inline-flex;
161
+ align-items: center;
162
+ gap: 5px;
163
+ padding: 8px 14px;
33
164
  font-size: 11px;
34
165
  font-weight: 500;
35
166
  letter-spacing: 0.03em;
36
- color: #737373;
167
+ color: var(--ss-muted);
37
168
  cursor: pointer;
38
169
  border: none;
39
170
  background: none;
@@ -41,28 +172,42 @@
41
172
  transition: color 0.15s, border-color 0.15s;
42
173
  font-family: inherit;
43
174
  text-transform: uppercase;
175
+ white-space: nowrap;
176
+ flex-shrink: 0;
177
+ }
178
+ .ss-dbg-tab-icon {
179
+ width: 12px;
180
+ height: 12px;
181
+ flex-shrink: 0;
182
+ fill: none;
183
+ stroke: currentColor;
184
+ stroke-width: 2;
185
+ stroke-linecap: round;
186
+ stroke-linejoin: round;
44
187
  }
45
- .ss-dbg-tab:hover { color: #a3a3a3; }
188
+ .ss-dbg-tab:hover { color: var(--ss-text-secondary); }
46
189
  .ss-dbg-tab.ss-dbg-active {
47
- color: #34d399;
48
- border-bottom-color: #34d399;
190
+ color: var(--ss-accent);
191
+ border-bottom-color: var(--ss-accent);
49
192
  }
50
193
  .ss-dbg-tabs-right {
51
- margin-left: auto;
52
194
  display: flex;
53
195
  align-items: center;
54
196
  gap: 8px;
197
+ flex-shrink: 0;
198
+ padding: 0 8px 0 12px;
199
+ border-left: 1px solid var(--ss-border-dim);
55
200
  }
56
201
  .ss-dbg-close {
57
202
  padding: 4px 8px;
58
203
  font-size: 14px;
59
- color: #737373;
204
+ color: var(--ss-muted);
60
205
  cursor: pointer;
61
206
  border: none;
62
207
  background: none;
63
208
  font-family: inherit;
64
209
  }
65
- .ss-dbg-close:hover { color: #e5e5e5; }
210
+ .ss-dbg-close:hover { color: var(--ss-text-bright); }
66
211
 
67
212
  /* Tab content */
68
213
  .ss-dbg-content {
@@ -86,25 +231,25 @@
86
231
  align-items: center;
87
232
  gap: 8px;
88
233
  padding: 8px 12px;
89
- border-bottom: 1px solid #262626;
90
- background: #141414;
234
+ border-bottom: 1px solid var(--ss-border-dim);
235
+ background: var(--ss-surface-alt);
91
236
  }
92
237
  .ss-dbg-search {
93
238
  flex: 1;
94
239
  padding: 4px 8px;
95
240
  font-size: 11px;
96
241
  font-family: inherit;
97
- color: #d4d4d4;
98
- background: #1a1a1a;
99
- border: 1px solid #333;
242
+ color: var(--ss-text);
243
+ background: var(--ss-input-bg);
244
+ border: 1px solid var(--ss-border);
100
245
  border-radius: 4px;
101
246
  outline: none;
102
247
  }
103
- .ss-dbg-search:focus { border-color: #34d399; }
104
- .ss-dbg-search::placeholder { color: #525252; }
248
+ .ss-dbg-search:focus { border-color: var(--ss-accent); }
249
+ .ss-dbg-search::placeholder { color: var(--ss-dim); }
105
250
  .ss-dbg-summary {
106
251
  font-size: 11px;
107
- color: #737373;
252
+ color: var(--ss-muted);
108
253
  white-space: nowrap;
109
254
  padding: 0 4px;
110
255
  }
@@ -112,14 +257,14 @@
112
257
  padding: 3px 8px;
113
258
  font-size: 10px;
114
259
  font-family: inherit;
115
- color: #737373;
116
- background: #262626;
117
- border: 1px solid #404040;
260
+ color: var(--ss-muted);
261
+ background: var(--ss-border-dim);
262
+ border: 1px solid var(--ss-border-strong);
118
263
  border-radius: 4px;
119
264
  cursor: pointer;
120
265
  text-transform: uppercase;
121
266
  }
122
- .ss-dbg-btn-clear:hover { color: #d4d4d4; border-color: #525252; }
267
+ .ss-dbg-btn-clear:hover { color: var(--ss-text); border-color: var(--ss-dim); }
123
268
 
124
269
  /* Table */
125
270
  .ss-dbg-table {
@@ -136,23 +281,23 @@
136
281
  font-size: 10px;
137
282
  text-transform: uppercase;
138
283
  letter-spacing: 0.05em;
139
- color: #737373;
140
- background: #171717;
141
- border-bottom: 1px solid #333;
284
+ color: var(--ss-muted);
285
+ background: var(--ss-surface);
286
+ border-bottom: 1px solid var(--ss-border);
142
287
  white-space: nowrap;
143
288
  }
144
289
  .ss-dbg-table td {
145
290
  padding: 5px 10px;
146
- border-bottom: 1px solid #1f1f1f;
291
+ border-bottom: 1px solid var(--ss-border-faint);
147
292
  vertical-align: top;
148
293
  max-width: 0;
149
294
  }
150
- .ss-dbg-table tr:hover td { background: rgba(38, 38, 38, 0.4); }
295
+ .ss-dbg-table tr:hover td { background: var(--ss-hover); }
151
296
 
152
297
  /* Query-specific styles */
153
298
  .ss-dbg-sql {
154
299
  font-size: 11px;
155
- color: #93c5fd;
300
+ color: var(--ss-sql-color);
156
301
  word-break: break-all;
157
302
  cursor: pointer;
158
303
  max-width: 500px;
@@ -165,9 +310,9 @@
165
310
  max-width: none;
166
311
  }
167
312
  .ss-dbg-duration { font-variant-numeric: tabular-nums; }
168
- .ss-dbg-slow { color: #fbbf24; }
169
- .ss-dbg-very-slow { color: #f87171; }
170
- .ss-dbg-dup { color: #c084fc; font-size: 10px; }
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; }
171
316
 
172
317
  /* Method badges */
173
318
  .ss-dbg-method {
@@ -179,31 +324,31 @@
179
324
  letter-spacing: 0.03em;
180
325
  text-transform: uppercase;
181
326
  }
182
- .ss-dbg-method-get { background: #064e3b; color: #34d399; }
183
- .ss-dbg-method-post { background: #1e3a5f; color: #60a5fa; }
184
- .ss-dbg-method-put, .ss-dbg-method-patch { background: #422006; color: #fbbf24; }
185
- .ss-dbg-method-delete { background: #450a0a; color: #f87171; }
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); }
186
331
 
187
332
  /* Route highlight */
188
- .ss-dbg-current-route td { background: rgba(52, 211, 153, 0.08) !important; }
333
+ .ss-dbg-current-route td { background: var(--ss-hover-accent) !important; }
189
334
 
190
335
  /* Event list */
191
- .ss-dbg-event-name { color: #93c5fd; }
192
- .ss-dbg-event-data { color: #737373; font-size: 10px; position: relative; }
193
- .ss-dbg-event-time { color: #525252; font-size: 10px; font-variant-numeric: tabular-nums; }
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; }
194
339
  .ss-dbg-data-preview {
195
340
  cursor: pointer;
196
- color: #a3a3a3;
197
- border-bottom: 1px dashed #525252;
341
+ color: var(--ss-text-secondary);
342
+ border-bottom: 1px dashed var(--ss-dim);
198
343
  }
199
- .ss-dbg-data-preview:hover { color: #d4d4d4; }
344
+ .ss-dbg-data-preview:hover { color: var(--ss-text); }
200
345
  .ss-dbg-data-full {
201
346
  margin: 4px 0 0;
202
347
  padding: 8px;
203
- background: #1a1a1a;
204
- border: 1px solid #333;
348
+ background: var(--ss-input-bg);
349
+ border: 1px solid var(--ss-border);
205
350
  border-radius: 4px;
206
- color: #a3a3a3;
351
+ color: var(--ss-text-secondary);
207
352
  font-size: 10px;
208
353
  font-family: inherit;
209
354
  white-space: pre-wrap;
@@ -219,7 +364,7 @@
219
364
  margin-left: 6px;
220
365
  padding: 1px 5px;
221
366
  font-size: 11px;
222
- color: #525252;
367
+ color: var(--ss-dim);
223
368
  background: none;
224
369
  border: 1px solid transparent;
225
370
  border-radius: 3px;
@@ -227,34 +372,34 @@
227
372
  font-family: inherit;
228
373
  vertical-align: middle;
229
374
  }
230
- .ss-dbg-copy-btn:hover { color: #a3a3a3; border-color: #404040; }
375
+ .ss-dbg-copy-btn:hover { color: var(--ss-text-secondary); border-color: var(--ss-border-strong); }
231
376
 
232
377
  /* Logs */
233
378
  .ss-dbg-log-filters {
234
379
  display: flex;
235
380
  gap: 4px;
236
381
  padding: 8px 12px;
237
- border-bottom: 1px solid #262626;
238
- background: #141414;
382
+ border-bottom: 1px solid var(--ss-border-dim);
383
+ background: var(--ss-surface-alt);
239
384
  }
240
385
  .ss-dbg-log-filter {
241
386
  padding: 3px 10px;
242
387
  font-size: 10px;
243
388
  font-family: inherit;
244
- border: 1px solid #333;
389
+ border: 1px solid var(--ss-border);
245
390
  border-radius: 4px;
246
391
  cursor: pointer;
247
392
  background: none;
248
- color: #737373;
393
+ color: var(--ss-muted);
249
394
  text-transform: uppercase;
250
395
  }
251
- .ss-dbg-log-filter:hover { border-color: #525252; color: #a3a3a3; }
252
- .ss-dbg-log-filter.ss-dbg-active { border-color: #34d399; color: #34d399; }
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); }
253
398
 
254
399
  .ss-dbg-log-entry {
255
400
  padding: 4px 12px;
256
401
  font-size: 11px;
257
- border-bottom: 1px solid #1a1a1a;
402
+ border-bottom: 1px solid var(--ss-input-bg);
258
403
  display: flex;
259
404
  gap: 8px;
260
405
  align-items: baseline;
@@ -268,16 +413,16 @@
268
413
  padding: 1px 0;
269
414
  border-radius: 3px;
270
415
  }
271
- .ss-dbg-log-level-info { background: #064e3b; color: #34d399; }
272
- .ss-dbg-log-level-warn { background: #422006; color: #fbbf24; }
273
- .ss-dbg-log-level-error, .ss-dbg-log-level-fatal { background: #450a0a; color: #f87171; }
274
- .ss-dbg-log-level-debug { background: #1e1e1e; color: #737373; }
275
- .ss-dbg-log-level-trace { background: #1e1e1e; color: #525252; }
276
- .ss-dbg-log-time { color: #525252; font-size: 10px; font-variant-numeric: tabular-nums; flex-shrink: 0; }
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; }
277
422
  .ss-dbg-log-reqid {
278
423
  font-size: 10px;
279
- color: #6d28d9;
280
- background: #1e1b2e;
424
+ color: var(--ss-reqid-fg);
425
+ background: var(--ss-reqid-bg);
281
426
  padding: 1px 5px;
282
427
  border-radius: 3px;
283
428
  cursor: pointer;
@@ -285,10 +430,10 @@
285
430
  font-family: inherit;
286
431
  letter-spacing: 0.02em;
287
432
  }
288
- .ss-dbg-log-reqid:hover { color: #a78bfa; background: #2e2644; }
289
- .ss-dbg-log-reqid-empty { font-size: 10px; color: #333; flex-shrink: 0; width: 58px; text-align: center; }
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; }
290
435
  .ss-dbg-reqid-input { max-width: 200px; margin-left: auto; }
291
- .ss-dbg-log-msg { color: #d4d4d4; word-break: break-word; }
436
+ .ss-dbg-log-msg { color: var(--ss-text); word-break: break-word; }
292
437
 
293
438
  /* Empty state */
294
439
  .ss-dbg-empty {
@@ -297,18 +442,18 @@
297
442
  justify-content: center;
298
443
  height: 100%;
299
444
  min-height: 120px;
300
- color: #525252;
445
+ color: var(--ss-dim);
301
446
  font-size: 12px;
302
447
  }
303
448
 
304
449
  /* Badge format */
305
450
  .ss-dbg-badge { display: inline-block; padding: 1px 6px; border-radius: 3px; font-size: 10px; font-weight: 600; text-transform: uppercase; }
306
- .ss-dbg-badge-green { background: #064e3b; color: #34d399; }
307
- .ss-dbg-badge-amber { background: #422006; color: #fbbf24; }
308
- .ss-dbg-badge-red { background: #450a0a; color: #f87171; }
309
- .ss-dbg-badge-blue { background: #1e3a5f; color: #60a5fa; }
310
- .ss-dbg-badge-purple { background: #2e1065; color: #c084fc; }
311
- .ss-dbg-badge-muted { background: #262626; color: #737373; }
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); }
312
457
 
313
458
  /* Email preview overlay */
314
459
  .ss-dbg-email-preview {
@@ -316,8 +461,8 @@
316
461
  inset: 0;
317
462
  display: flex;
318
463
  flex-direction: column;
319
- background: #0f0f0f;
320
- z-index: 10;
464
+ background: var(--ss-bg);
465
+ z-index: 30;
321
466
  }
322
467
  .ss-dbg-email-preview-header {
323
468
  display: flex;
@@ -325,17 +470,17 @@
325
470
  justify-content: space-between;
326
471
  gap: 12px;
327
472
  padding: 10px 12px;
328
- border-bottom: 1px solid #262626;
329
- background: #141414;
473
+ border-bottom: 1px solid var(--ss-border-dim);
474
+ background: var(--ss-surface-alt);
330
475
  flex-shrink: 0;
331
476
  }
332
477
  .ss-dbg-email-preview-meta {
333
478
  font-size: 11px;
334
- color: #a3a3a3;
479
+ color: var(--ss-text-secondary);
335
480
  line-height: 1.6;
336
481
  overflow: hidden;
337
482
  }
338
- .ss-dbg-email-preview-meta strong { color: #d4d4d4; font-weight: 600; }
483
+ .ss-dbg-email-preview-meta strong { color: var(--ss-text); font-weight: 600; }
339
484
  .ss-dbg-email-iframe {
340
485
  flex: 1;
341
486
  border: none;
@@ -344,7 +489,7 @@
344
489
 
345
490
  /* Email row */
346
491
  .ss-dbg-email-row { cursor: pointer; }
347
- .ss-dbg-email-row:hover td { background: rgba(52, 211, 153, 0.06) !important; }
492
+ .ss-dbg-email-row:hover td { background: var(--ss-hover-accent) !important; }
348
493
 
349
494
  /* Email status badges */
350
495
  .ss-dbg-email-status {
@@ -355,13 +500,13 @@
355
500
  font-weight: 600;
356
501
  text-transform: uppercase;
357
502
  }
358
- .ss-dbg-email-status-sent { background: #064e3b; color: #34d399; }
359
- .ss-dbg-email-status-sending { background: #422006; color: #fbbf24; }
360
- .ss-dbg-email-status-queued { background: #1e3a5f; color: #60a5fa; }
361
- .ss-dbg-email-status-failed { background: #450a0a; color: #f87171; }
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); }
362
507
 
363
508
  /* Filterable cell */
364
- .ss-dbg-filterable:hover { background: rgba(52, 211, 153, 0.08); }
509
+ .ss-dbg-filterable:hover { background: var(--ss-hover-accent); }
365
510
 
366
511
  /* Timeline */
367
512
  .ss-dbg-tl-detail-header {
@@ -369,8 +514,8 @@
369
514
  align-items: center;
370
515
  gap: 12px;
371
516
  padding: 8px 12px;
372
- border-bottom: 1px solid #262626;
373
- background: #141414;
517
+ border-bottom: 1px solid var(--ss-border-dim);
518
+ background: var(--ss-surface-alt);
374
519
  flex-shrink: 0;
375
520
  }
376
521
  #ss-dbg-tl-waterfall {
@@ -386,9 +531,9 @@
386
531
  align-items: center;
387
532
  height: 24px;
388
533
  font-size: 11px;
389
- border-bottom: 1px solid #1a1a1a;
534
+ border-bottom: 1px solid var(--ss-input-bg);
390
535
  }
391
- .ss-dbg-tl-row:hover { background: rgba(38, 38, 38, 0.4); }
536
+ .ss-dbg-tl-row:hover { background: var(--ss-hover); }
392
537
  .ss-dbg-tl-label {
393
538
  width: 280px;
394
539
  min-width: 280px;
@@ -396,7 +541,7 @@
396
541
  overflow: hidden;
397
542
  text-overflow: ellipsis;
398
543
  white-space: nowrap;
399
- color: #a3a3a3;
544
+ color: var(--ss-text-secondary);
400
545
  font-size: 10px;
401
546
  }
402
547
  .ss-dbg-tl-track {
@@ -412,6 +557,7 @@
412
557
  min-width: 2px;
413
558
  cursor: default;
414
559
  }
560
+ /* Timeline bar colors are semantic category indicators — kept as fixed values */
415
561
  .ss-dbg-tl-bar-request { background: #1e3a5f; }
416
562
  .ss-dbg-tl-bar-middleware { background: #1e3a5f; opacity: 0.7; }
417
563
  .ss-dbg-tl-bar-db { background: #6d28d9; }
@@ -422,7 +568,7 @@
422
568
 
423
569
  .ss-dbg-tl-dur {
424
570
  font-size: 10px;
425
- color: #525252;
571
+ color: var(--ss-dim);
426
572
  margin-left: 4px;
427
573
  white-space: nowrap;
428
574
  font-variant-numeric: tabular-nums;
@@ -432,10 +578,10 @@
432
578
  display: flex;
433
579
  gap: 12px;
434
580
  padding: 6px 12px;
435
- border-bottom: 1px solid #262626;
436
- background: #141414;
581
+ border-bottom: 1px solid var(--ss-border-dim);
582
+ background: var(--ss-surface-alt);
437
583
  font-size: 10px;
438
- color: #737373;
584
+ color: var(--ss-muted);
439
585
  }
440
586
  .ss-dbg-tl-legend-item {
441
587
  display: flex;
@@ -452,34 +598,279 @@
452
598
  .ss-dbg-tl-warnings {
453
599
  margin-top: 12px;
454
600
  padding: 8px 12px;
455
- border-top: 1px solid #262626;
601
+ border-top: 1px solid var(--ss-border-dim);
456
602
  }
457
603
  .ss-dbg-tl-warnings-title {
458
604
  font-size: 10px;
459
605
  font-weight: 600;
460
- color: #fbbf24;
606
+ color: var(--ss-amber-fg);
461
607
  text-transform: uppercase;
462
608
  letter-spacing: 0.05em;
463
609
  margin-bottom: 4px;
464
610
  }
465
611
  .ss-dbg-tl-warning {
466
612
  font-size: 11px;
467
- color: #fbbf24;
613
+ color: var(--ss-amber-fg);
468
614
  padding: 2px 0;
469
615
  }
470
616
 
471
617
  .ss-dbg-tl-meta {
472
618
  font-size: 10px;
473
- color: #525252;
619
+ color: var(--ss-dim);
474
620
  margin-left: 8px;
475
621
  }
476
622
 
477
623
  /* Status code badges */
478
624
  .ss-dbg-status { font-size: 10px; font-weight: 600; padding: 1px 5px; border-radius: 3px; }
479
- .ss-dbg-status-2xx { background: #064e3b; color: #34d399; }
480
- .ss-dbg-status-3xx { background: #1e3a5f; color: #60a5fa; }
481
- .ss-dbg-status-4xx { background: #422006; color: #fbbf24; }
482
- .ss-dbg-status-5xx { background: #450a0a; color: #f87171; }
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); }
629
+
630
+ /* Dashboard deep link button in tab bar */
631
+ .ss-dbg-dashboard-link {
632
+ display: flex;
633
+ align-items: center;
634
+ justify-content: center;
635
+ padding: 4px 6px;
636
+ color: var(--ss-muted);
637
+ border-radius: 4px;
638
+ text-decoration: none;
639
+ transition: color 0.15s, background 0.15s;
640
+ }
641
+ .ss-dbg-dashboard-link:hover { color: var(--ss-accent); background: var(--ss-hover-accent); }
642
+
643
+ /* Row-level deep link icon (visible on hover) */
644
+ .ss-dbg-deeplink {
645
+ display: inline-flex;
646
+ align-items: center;
647
+ justify-content: center;
648
+ width: 18px;
649
+ height: 18px;
650
+ color: var(--ss-border-strong);
651
+ text-decoration: none;
652
+ border-radius: 3px;
653
+ opacity: 0;
654
+ transition: opacity 0.15s, color 0.15s;
655
+ vertical-align: middle;
656
+ margin-left: 4px;
657
+ flex-shrink: 0;
658
+ }
659
+ .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; }
663
+
664
+ /* Connection mode indicator */
665
+ .ss-dbg-conn-mode {
666
+ font-size: 9px;
667
+ font-weight: 600;
668
+ text-transform: uppercase;
669
+ letter-spacing: 0.05em;
670
+ padding: 1px 6px;
671
+ border-radius: 3px;
672
+ flex-shrink: 0;
673
+ }
674
+ .ss-dbg-conn-polling {
675
+ background: var(--ss-border-dim);
676
+ color: var(--ss-muted);
677
+ }
678
+ .ss-dbg-conn-live {
679
+ background: var(--ss-green-bg);
680
+ color: var(--ss-green-fg);
681
+ }
682
+
683
+ /* Mini stats bar */
684
+ .ss-dbg-mini-stats {
685
+ display: flex;
686
+ align-items: center;
687
+ gap: 10px;
688
+ font-size: 10px;
689
+ color: var(--ss-muted);
690
+ padding: 0 4px;
691
+ }
692
+ .ss-dbg-mini-stat {
693
+ display: inline-flex;
694
+ align-items: center;
695
+ gap: 3px;
696
+ white-space: nowrap;
697
+ }
698
+ .ss-dbg-mini-stat-value {
699
+ font-variant-numeric: tabular-nums;
700
+ font-weight: 600;
701
+ }
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); }
705
+
706
+ /* Cache tab */
707
+ .ss-dbg-cache-stats {
708
+ display: flex;
709
+ gap: 16px;
710
+ padding: 8px 12px;
711
+ border-bottom: 1px solid var(--ss-border-dim);
712
+ background: var(--ss-surface-alt);
713
+ font-size: 11px;
714
+ }
715
+ .ss-dbg-cache-stat {
716
+ display: inline-flex;
717
+ align-items: center;
718
+ gap: 4px;
719
+ }
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; }
722
+
723
+ /* Cache detail overlay */
724
+ .ss-dbg-cache-detail {
725
+ padding: 12px;
726
+ }
727
+ .ss-dbg-cache-detail strong { color: var(--ss-text); }
728
+ .ss-dbg-cache-detail pre {
729
+ margin: 8px 0 0;
730
+ padding: 8px;
731
+ background: var(--ss-input-bg);
732
+ border: 1px solid var(--ss-border);
733
+ border-radius: 4px;
734
+ color: var(--ss-text-secondary);
735
+ font-size: 10px;
736
+ font-family: inherit;
737
+ white-space: pre-wrap;
738
+ word-break: break-all;
739
+ max-height: 300px;
740
+ overflow: auto;
741
+ scrollbar-width: none;
742
+ -ms-overflow-style: none;
743
+ }
744
+ .ss-dbg-cache-detail pre::-webkit-scrollbar { display: none; }
745
+
746
+ /* Jobs tab */
747
+ .ss-dbg-job-stats-area {
748
+ border-bottom: 1px solid var(--ss-border-dim);
749
+ }
750
+ .ss-dbg-job-stats {
751
+ display: flex;
752
+ gap: 16px;
753
+ padding: 8px 12px;
754
+ background: var(--ss-surface-alt);
755
+ font-size: 11px;
756
+ }
757
+ .ss-dbg-job-stat {
758
+ display: inline-flex;
759
+ align-items: center;
760
+ gap: 4px;
761
+ }
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; }
764
+
765
+ .ss-dbg-job-filter {
766
+ padding: 3px 10px;
767
+ font-size: 10px;
768
+ font-family: inherit;
769
+ border: 1px solid var(--ss-border);
770
+ border-radius: 4px;
771
+ cursor: pointer;
772
+ background: none;
773
+ color: var(--ss-muted);
774
+ text-transform: uppercase;
775
+ }
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); }
778
+
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); }
784
+
785
+ .ss-dbg-retry-btn {
786
+ padding: 2px 8px;
787
+ font-size: 10px;
788
+ font-family: inherit;
789
+ color: var(--ss-muted);
790
+ background: var(--ss-border-dim);
791
+ border: 1px solid var(--ss-border-strong);
792
+ border-radius: 4px;
793
+ cursor: pointer;
794
+ text-transform: uppercase;
795
+ }
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; }
798
+
799
+ /* Config tab */
800
+ .ss-dbg-config-tab {
801
+ padding: 3px 10px;
802
+ font-size: 10px;
803
+ font-family: inherit;
804
+ border: 1px solid var(--ss-border);
805
+ border-radius: 4px;
806
+ cursor: pointer;
807
+ background: none;
808
+ color: var(--ss-muted);
809
+ text-transform: uppercase;
810
+ }
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); }
813
+
814
+ .ss-dbg-config-sections { padding: 0; }
815
+ .ss-dbg-config-section { border-bottom: 1px solid var(--ss-border-faint); }
816
+ .ss-dbg-config-section-header {
817
+ display: flex;
818
+ align-items: center;
819
+ gap: 6px;
820
+ padding: 6px 12px;
821
+ cursor: pointer;
822
+ font-size: 11px;
823
+ }
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; }
835
+ .ss-dbg-redacted-wrap {
836
+ display: inline-flex;
837
+ align-items: center;
838
+ gap: 4px;
839
+ font-style: italic;
840
+ color: var(--ss-dim);
841
+ }
842
+ .ss-dbg-redacted-real {
843
+ font-style: normal;
844
+ color: var(--ss-text-secondary);
845
+ font-family: 'SF Mono', SFMono-Regular, ui-monospace, Menlo, monospace;
846
+ font-size: 11px;
847
+ word-break: break-all;
848
+ }
849
+ .ss-dbg-redacted-reveal,
850
+ .ss-dbg-redacted-copy {
851
+ background: none;
852
+ border: 1px solid var(--ss-border);
853
+ border-radius: 3px;
854
+ padding: 2px 4px;
855
+ cursor: pointer;
856
+ color: var(--ss-dim);
857
+ display: inline-flex;
858
+ align-items: center;
859
+ line-height: 1;
860
+ transition: color 0.15s, border-color 0.15s;
861
+ }
862
+ .ss-dbg-redacted-reveal:hover,
863
+ .ss-dbg-redacted-copy:hover {
864
+ color: var(--ss-text);
865
+ border-color: var(--ss-dim);
866
+ }
867
+ .ss-dbg-config-match { background: var(--ss-amber-bg); color: var(--ss-amber-fg); border-radius: 2px; padding: 0 1px; }
868
+
869
+ .ss-dbg-config-leaf { cursor: default; }
870
+ .ss-dbg-config-leaf:hover { background: transparent; }
871
+
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; }
483
874
 
484
875
  /* Wrench button in stats bar */
485
876
  .ss-dbg-btn {
@@ -488,7 +879,7 @@
488
879
  gap: 4px;
489
880
  padding: 2px 6px;
490
881
  font-size: 12px;
491
- color: #737373;
882
+ color: var(--ss-muted);
492
883
  cursor: pointer;
493
884
  border: none;
494
885
  background: none;
@@ -496,5 +887,34 @@
496
887
  border-radius: 4px;
497
888
  flex-shrink: 0;
498
889
  }
499
- .ss-dbg-btn:hover { color: #d4d4d4; background: rgba(38, 38, 38, 0.6); }
500
- .ss-dbg-btn.ss-dbg-active { color: #34d399; }
890
+ .ss-dbg-btn:hover { color: var(--ss-text); background: var(--ss-hover); }
891
+ .ss-dbg-btn.ss-dbg-active { color: var(--ss-accent); }
892
+
893
+ /* Theme toggle button */
894
+ .ss-dbg-theme-toggle {
895
+ display: flex;
896
+ align-items: center;
897
+ justify-content: center;
898
+ padding: 4px 6px;
899
+ color: var(--ss-muted);
900
+ border: none;
901
+ background: none;
902
+ cursor: pointer;
903
+ font-size: 14px;
904
+ border-radius: 4px;
905
+ transition: color 0.15s, background 0.15s;
906
+ }
907
+ .ss-dbg-theme-toggle:hover {
908
+ color: var(--ss-accent);
909
+ background: var(--ss-hover-accent);
910
+ }
911
+
912
+ /* 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); }