rails_error_dashboard 0.1.1 → 0.1.3

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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +66 -21
  3. data/app/assets/stylesheets/rails_error_dashboard/_catppuccin_mocha.scss +107 -0
  4. data/app/assets/stylesheets/rails_error_dashboard/_components.scss +625 -0
  5. data/app/assets/stylesheets/rails_error_dashboard/_layout.scss +257 -0
  6. data/app/assets/stylesheets/rails_error_dashboard/_theme_variables.scss +203 -0
  7. data/app/assets/stylesheets/rails_error_dashboard/application.css +926 -15
  8. data/app/assets/stylesheets/rails_error_dashboard/application.css.map +7 -0
  9. data/app/assets/stylesheets/rails_error_dashboard/application.scss +61 -0
  10. data/app/controllers/rails_error_dashboard/errors_controller.rb +94 -1
  11. data/app/helpers/rails_error_dashboard/application_helper.rb +42 -4
  12. data/app/helpers/rails_error_dashboard/backtrace_helper.rb +91 -0
  13. data/app/helpers/rails_error_dashboard/overview_helper.rb +78 -0
  14. data/app/helpers/rails_error_dashboard/user_agent_helper.rb +118 -0
  15. data/app/models/rails_error_dashboard/error_comment.rb +27 -0
  16. data/app/models/rails_error_dashboard/error_log.rb +145 -0
  17. data/app/views/layouts/rails_error_dashboard.html.erb +796 -299
  18. data/app/views/layouts/rails_error_dashboard_old_backup.html.erb +383 -0
  19. data/app/views/rails_error_dashboard/errors/_error_row.html.erb +2 -0
  20. data/app/views/rails_error_dashboard/errors/_pattern_insights.html.erb +4 -4
  21. data/app/views/rails_error_dashboard/errors/_timeline.html.erb +167 -0
  22. data/app/views/rails_error_dashboard/errors/analytics.html.erb +138 -22
  23. data/app/views/rails_error_dashboard/errors/index.html.erb +83 -4
  24. data/app/views/rails_error_dashboard/errors/overview.html.erb +253 -0
  25. data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +29 -18
  26. data/app/views/rails_error_dashboard/errors/show.html.erb +353 -54
  27. data/config/routes.rb +7 -0
  28. data/db/migrate/20251226020000_add_workflow_fields_to_error_logs.rb +27 -0
  29. data/db/migrate/20251226020100_create_error_comments.rb +18 -0
  30. data/lib/generators/rails_error_dashboard/install/install_generator.rb +8 -2
  31. data/lib/generators/rails_error_dashboard/install/templates/initializer.rb +21 -0
  32. data/lib/rails_error_dashboard/commands/batch_delete_errors.rb +1 -1
  33. data/lib/rails_error_dashboard/commands/batch_resolve_errors.rb +2 -2
  34. data/lib/rails_error_dashboard/commands/log_error.rb +47 -9
  35. data/lib/rails_error_dashboard/commands/resolve_error.rb +1 -1
  36. data/lib/rails_error_dashboard/configuration.rb +8 -0
  37. data/lib/rails_error_dashboard/error_reporter.rb +4 -4
  38. data/lib/rails_error_dashboard/logger.rb +105 -0
  39. data/lib/rails_error_dashboard/middleware/error_catcher.rb +2 -2
  40. data/lib/rails_error_dashboard/plugin.rb +3 -3
  41. data/lib/rails_error_dashboard/plugin_registry.rb +2 -2
  42. data/lib/rails_error_dashboard/plugins/jira_integration_plugin.rb +1 -1
  43. data/lib/rails_error_dashboard/plugins/metrics_plugin.rb +1 -1
  44. data/lib/rails_error_dashboard/queries/dashboard_stats.rb +109 -1
  45. data/lib/rails_error_dashboard/queries/errors_list.rb +61 -6
  46. data/lib/rails_error_dashboard/services/backtrace_parser.rb +113 -0
  47. data/lib/rails_error_dashboard/version.rb +1 -1
  48. data/lib/rails_error_dashboard.rb +2 -0
  49. metadata +18 -2
  50. data/lib/tasks/rails_error_dashboard_tasks.rake +0 -4
@@ -1,15 +1,926 @@
1
- /*
2
- * This is a manifest file that'll be compiled into application.css, which will include all the files
3
- * listed below.
4
- *
5
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
- * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
- *
8
- * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
- * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
- * files in this directory. Styles in this file should be added after the last require_* statement.
11
- * It is generally better to create a new file per style scope.
12
- *
13
- *= require_tree .
14
- *= require_self
15
- */
1
+ :root {
2
+ --ctp-rosewater: #f5e0dc;
3
+ --ctp-flamingo: #f2cdcd;
4
+ --ctp-pink: #f5c2e7;
5
+ --ctp-mauve: #cba6f7;
6
+ --ctp-red: #f38ba8;
7
+ --ctp-maroon: #eba0ac;
8
+ --ctp-peach: #fab387;
9
+ --ctp-yellow: #f9e2af;
10
+ --ctp-green: #a6e3a1;
11
+ --ctp-teal: #94e2d5;
12
+ --ctp-sky: #89dceb;
13
+ --ctp-sapphire: #74c7ec;
14
+ --ctp-blue: #89b4fa;
15
+ --ctp-lavender: #b4befe;
16
+ --ctp-text: #cdd6f4;
17
+ --ctp-subtext1: #bac2de;
18
+ --ctp-subtext0: #a6adc8;
19
+ --ctp-overlay2: #9399b2;
20
+ --ctp-overlay1: #7f849c;
21
+ --ctp-overlay0: #6c7086;
22
+ --ctp-surface2: #585b70;
23
+ --ctp-surface1: #45475a;
24
+ --ctp-surface0: #313244;
25
+ --ctp-base: #1e1e2e;
26
+ --ctp-mantle: #181825;
27
+ --ctp-crust: #11111b; }
28
+
29
+ :root {
30
+ --ctp-rosewater: #f5e0dc;
31
+ --ctp-flamingo: #f2cdcd;
32
+ --ctp-pink: #f5c2e7;
33
+ --ctp-mauve: #cba6f7;
34
+ --ctp-red: #f38ba8;
35
+ --ctp-maroon: #eba0ac;
36
+ --ctp-peach: #fab387;
37
+ --ctp-yellow: #f9e2af;
38
+ --ctp-green: #a6e3a1;
39
+ --ctp-teal: #94e2d5;
40
+ --ctp-sky: #89dceb;
41
+ --ctp-sapphire: #74c7ec;
42
+ --ctp-blue: #89b4fa;
43
+ --ctp-lavender: #b4befe;
44
+ --ctp-text: #cdd6f4;
45
+ --ctp-subtext1: #bac2de;
46
+ --ctp-subtext0: #a6adc8;
47
+ --ctp-overlay2: #9399b2;
48
+ --ctp-overlay1: #7f849c;
49
+ --ctp-overlay0: #6c7086;
50
+ --ctp-surface2: #585b70;
51
+ --ctp-surface1: #45475a;
52
+ --ctp-surface0: #313244;
53
+ --ctp-base: #1e1e2e;
54
+ --ctp-mantle: #181825;
55
+ --ctp-crust: #11111b; }
56
+
57
+ :root {
58
+ --primary-color: #8B5CF6;
59
+ --success-color: #10B981;
60
+ --danger-color: #EF4444;
61
+ --warning-color: #F59E0B;
62
+ --info-color: #3B82F6;
63
+ --secondary-color: #6B7280;
64
+ --bg-color: #F3F4F6;
65
+ --card-bg: #FFFFFF;
66
+ --sidebar-bg: #FFFFFF;
67
+ --sidebar-hover: #F9FAFB;
68
+ --nav-active-bg: #EDE9FE;
69
+ --table-hover: #F9FAFB;
70
+ --code-bg: #F9FAFB;
71
+ --text-color: #1F2937;
72
+ --text-secondary: #4B5563;
73
+ --text-muted: #9CA3AF;
74
+ --text-link: #3B82F6;
75
+ --text-link-hover: #2563EB;
76
+ --border-color: #E5E7EB;
77
+ --border-subtle: #F3F4F6;
78
+ --platform-ios: #000000;
79
+ --platform-android: #3DDC84;
80
+ --platform-web: #3B82F6;
81
+ --platform-api: #8B5CF6;
82
+ --chart-line-1: #EF4444;
83
+ --chart-line-2: #10B981;
84
+ --chart-line-3: #F59E0B;
85
+ --chart-line-4: #3B82F6;
86
+ --chart-line-5: #8B5CF6;
87
+ --chart-grid: rgba(0, 0, 0, 0.1);
88
+ --chart-text: #1F2937;
89
+ --chart-tooltip-bg: #FFFFFF;
90
+ --bs-primary: #8B5CF6;
91
+ --bs-success: #10B981;
92
+ --bs-danger: #EF4444;
93
+ --bs-warning: #F59E0B;
94
+ --bs-info: #3B82F6;
95
+ --bs-secondary: #6B7280; }
96
+
97
+ [data-theme="dark"], .dark-mode {
98
+ --primary-color: var(--ctp-mauve);
99
+ --success-color: var(--ctp-green);
100
+ --danger-color: var(--ctp-red);
101
+ --warning-color: var(--ctp-peach);
102
+ --info-color: var(--ctp-blue);
103
+ --secondary-color: var(--ctp-overlay1);
104
+ --bg-color: var(--ctp-base);
105
+ --card-bg: var(--ctp-surface0);
106
+ --sidebar-bg: var(--ctp-mantle);
107
+ --sidebar-hover: var(--ctp-surface0);
108
+ --nav-active-bg: var(--ctp-surface1);
109
+ --table-hover: var(--ctp-surface0);
110
+ --code-bg: var(--ctp-mantle);
111
+ --text-color: var(--ctp-text);
112
+ --text-secondary: var(--ctp-subtext1);
113
+ --text-muted: var(--ctp-subtext0);
114
+ --text-link: var(--ctp-sky);
115
+ --text-link-hover: var(--ctp-sapphire);
116
+ --border-color: var(--ctp-surface2);
117
+ --border-subtle: var(--ctp-surface1);
118
+ --platform-ios: var(--ctp-text);
119
+ --platform-android: var(--ctp-green);
120
+ --platform-web: var(--ctp-blue);
121
+ --platform-api: var(--ctp-sapphire);
122
+ --severity-critical: var(--ctp-red);
123
+ --severity-high: var(--ctp-peach);
124
+ --severity-medium: var(--ctp-blue);
125
+ --severity-low: var(--ctp-overlay1);
126
+ --chart-line-1: var(--ctp-red);
127
+ --chart-line-2: var(--ctp-green);
128
+ --chart-line-3: var(--ctp-yellow);
129
+ --chart-line-4: var(--ctp-blue);
130
+ --chart-line-5: var(--ctp-mauve);
131
+ --chart-line-6: var(--ctp-teal);
132
+ --chart-line-7: var(--ctp-pink);
133
+ --chart-line-8: var(--ctp-lavender);
134
+ --chart-grid: rgba(88, 91, 112, 0.3);
135
+ --chart-text: var(--ctp-text);
136
+ --chart-tooltip-bg: var(--ctp-surface0);
137
+ --bs-primary: var(--ctp-mauve);
138
+ --bs-success: var(--ctp-green);
139
+ --bs-danger: var(--ctp-red);
140
+ --bs-warning: var(--ctp-peach);
141
+ --bs-info: var(--ctp-blue);
142
+ --bs-secondary: var(--ctp-overlay1);
143
+ --bs-light: var(--ctp-surface1);
144
+ --bs-dark: var(--ctp-mantle);
145
+ --bs-body-bg: var(--ctp-base);
146
+ --bs-body-color: var(--ctp-text);
147
+ --bs-border-color: var(--ctp-surface2);
148
+ --bs-link-color: var(--ctp-sky);
149
+ --bs-link-hover-color: var(--ctp-sapphire); }
150
+
151
+ :root {
152
+ --ctp-rosewater: #f5e0dc;
153
+ --ctp-flamingo: #f2cdcd;
154
+ --ctp-pink: #f5c2e7;
155
+ --ctp-mauve: #cba6f7;
156
+ --ctp-red: #f38ba8;
157
+ --ctp-maroon: #eba0ac;
158
+ --ctp-peach: #fab387;
159
+ --ctp-yellow: #f9e2af;
160
+ --ctp-green: #a6e3a1;
161
+ --ctp-teal: #94e2d5;
162
+ --ctp-sky: #89dceb;
163
+ --ctp-sapphire: #74c7ec;
164
+ --ctp-blue: #89b4fa;
165
+ --ctp-lavender: #b4befe;
166
+ --ctp-text: #cdd6f4;
167
+ --ctp-subtext1: #bac2de;
168
+ --ctp-subtext0: #a6adc8;
169
+ --ctp-overlay2: #9399b2;
170
+ --ctp-overlay1: #7f849c;
171
+ --ctp-overlay0: #6c7086;
172
+ --ctp-surface2: #585b70;
173
+ --ctp-surface1: #45475a;
174
+ --ctp-surface0: #313244;
175
+ --ctp-base: #1e1e2e;
176
+ --ctp-mantle: #181825;
177
+ --ctp-crust: #11111b; }
178
+
179
+ :root {
180
+ --ctp-rosewater: #f5e0dc;
181
+ --ctp-flamingo: #f2cdcd;
182
+ --ctp-pink: #f5c2e7;
183
+ --ctp-mauve: #cba6f7;
184
+ --ctp-red: #f38ba8;
185
+ --ctp-maroon: #eba0ac;
186
+ --ctp-peach: #fab387;
187
+ --ctp-yellow: #f9e2af;
188
+ --ctp-green: #a6e3a1;
189
+ --ctp-teal: #94e2d5;
190
+ --ctp-sky: #89dceb;
191
+ --ctp-sapphire: #74c7ec;
192
+ --ctp-blue: #89b4fa;
193
+ --ctp-lavender: #b4befe;
194
+ --ctp-text: #cdd6f4;
195
+ --ctp-subtext1: #bac2de;
196
+ --ctp-subtext0: #a6adc8;
197
+ --ctp-overlay2: #9399b2;
198
+ --ctp-overlay1: #7f849c;
199
+ --ctp-overlay0: #6c7086;
200
+ --ctp-surface2: #585b70;
201
+ --ctp-surface1: #45475a;
202
+ --ctp-surface0: #313244;
203
+ --ctp-base: #1e1e2e;
204
+ --ctp-mantle: #181825;
205
+ --ctp-crust: #11111b; }
206
+
207
+ :root {
208
+ --primary-color: #8B5CF6;
209
+ --success-color: #10B981;
210
+ --danger-color: #EF4444;
211
+ --warning-color: #F59E0B;
212
+ --info-color: #3B82F6;
213
+ --secondary-color: #6B7280;
214
+ --bg-color: #F3F4F6;
215
+ --card-bg: #FFFFFF;
216
+ --sidebar-bg: #FFFFFF;
217
+ --sidebar-hover: #F9FAFB;
218
+ --nav-active-bg: #EDE9FE;
219
+ --table-hover: #F9FAFB;
220
+ --code-bg: #F9FAFB;
221
+ --text-color: #1F2937;
222
+ --text-secondary: #4B5563;
223
+ --text-muted: #9CA3AF;
224
+ --text-link: #3B82F6;
225
+ --text-link-hover: #2563EB;
226
+ --border-color: #E5E7EB;
227
+ --border-subtle: #F3F4F6;
228
+ --platform-ios: #000000;
229
+ --platform-android: #3DDC84;
230
+ --platform-web: #3B82F6;
231
+ --platform-api: #8B5CF6;
232
+ --chart-line-1: #EF4444;
233
+ --chart-line-2: #10B981;
234
+ --chart-line-3: #F59E0B;
235
+ --chart-line-4: #3B82F6;
236
+ --chart-line-5: #8B5CF6;
237
+ --chart-grid: rgba(0, 0, 0, 0.1);
238
+ --chart-text: #1F2937;
239
+ --chart-tooltip-bg: #FFFFFF;
240
+ --bs-primary: #8B5CF6;
241
+ --bs-success: #10B981;
242
+ --bs-danger: #EF4444;
243
+ --bs-warning: #F59E0B;
244
+ --bs-info: #3B82F6;
245
+ --bs-secondary: #6B7280; }
246
+
247
+ [data-theme="dark"], .dark-mode {
248
+ --primary-color: var(--ctp-mauve);
249
+ --success-color: var(--ctp-green);
250
+ --danger-color: var(--ctp-red);
251
+ --warning-color: var(--ctp-peach);
252
+ --info-color: var(--ctp-blue);
253
+ --secondary-color: var(--ctp-overlay1);
254
+ --bg-color: var(--ctp-base);
255
+ --card-bg: var(--ctp-surface0);
256
+ --sidebar-bg: var(--ctp-mantle);
257
+ --sidebar-hover: var(--ctp-surface0);
258
+ --nav-active-bg: var(--ctp-surface1);
259
+ --table-hover: var(--ctp-surface0);
260
+ --code-bg: var(--ctp-mantle);
261
+ --text-color: var(--ctp-text);
262
+ --text-secondary: var(--ctp-subtext1);
263
+ --text-muted: var(--ctp-subtext0);
264
+ --text-link: var(--ctp-sky);
265
+ --text-link-hover: var(--ctp-sapphire);
266
+ --border-color: var(--ctp-surface2);
267
+ --border-subtle: var(--ctp-surface1);
268
+ --platform-ios: var(--ctp-text);
269
+ --platform-android: var(--ctp-green);
270
+ --platform-web: var(--ctp-blue);
271
+ --platform-api: var(--ctp-sapphire);
272
+ --severity-critical: var(--ctp-red);
273
+ --severity-high: var(--ctp-peach);
274
+ --severity-medium: var(--ctp-blue);
275
+ --severity-low: var(--ctp-overlay1);
276
+ --chart-line-1: var(--ctp-red);
277
+ --chart-line-2: var(--ctp-green);
278
+ --chart-line-3: var(--ctp-yellow);
279
+ --chart-line-4: var(--ctp-blue);
280
+ --chart-line-5: var(--ctp-mauve);
281
+ --chart-line-6: var(--ctp-teal);
282
+ --chart-line-7: var(--ctp-pink);
283
+ --chart-line-8: var(--ctp-lavender);
284
+ --chart-grid: rgba(88, 91, 112, 0.3);
285
+ --chart-text: var(--ctp-text);
286
+ --chart-tooltip-bg: var(--ctp-surface0);
287
+ --bs-primary: var(--ctp-mauve);
288
+ --bs-success: var(--ctp-green);
289
+ --bs-danger: var(--ctp-red);
290
+ --bs-warning: var(--ctp-peach);
291
+ --bs-info: var(--ctp-blue);
292
+ --bs-secondary: var(--ctp-overlay1);
293
+ --bs-light: var(--ctp-surface1);
294
+ --bs-dark: var(--ctp-mantle);
295
+ --bs-body-bg: var(--ctp-base);
296
+ --bs-body-color: var(--ctp-text);
297
+ --bs-border-color: var(--ctp-surface2);
298
+ --bs-link-color: var(--ctp-sky);
299
+ --bs-link-hover-color: var(--ctp-sapphire); }
300
+
301
+ [data-theme="dark"] .badge.badge-ios, .dark-mode .badge.badge-ios {
302
+ background-color: var(--ctp-overlay0);
303
+ color: var(--ctp-text);
304
+ border: 1px solid var(--ctp-surface2); }
305
+ [data-theme="dark"] .badge.badge-android, .dark-mode .badge.badge-android {
306
+ background-color: rgba(166, 227, 161, 0.2);
307
+ color: var(--ctp-green);
308
+ border: 1px solid var(--ctp-green); }
309
+ [data-theme="dark"] .badge.badge-web, .dark-mode .badge.badge-web {
310
+ background-color: rgba(137, 180, 250, 0.2);
311
+ color: var(--ctp-blue);
312
+ border: 1px solid var(--ctp-blue); }
313
+ [data-theme="dark"] .badge.badge-api, .dark-mode .badge.badge-api {
314
+ background-color: rgba(116, 199, 236, 0.2);
315
+ color: var(--ctp-sapphire);
316
+ border: 1px solid var(--ctp-sapphire); }
317
+ [data-theme="dark"] .badge.bg-danger, .dark-mode .badge.bg-danger {
318
+ background-color: var(--ctp-red) !important;
319
+ color: var(--ctp-base) !important; }
320
+ [data-theme="dark"] .badge.bg-warning, .dark-mode .badge.bg-warning {
321
+ background-color: var(--ctp-peach) !important;
322
+ color: var(--ctp-base) !important; }
323
+ [data-theme="dark"] .badge.bg-success, .dark-mode .badge.bg-success {
324
+ background-color: var(--ctp-green) !important;
325
+ color: var(--ctp-base) !important; }
326
+ [data-theme="dark"] .badge.bg-info, .dark-mode .badge.bg-info {
327
+ background-color: var(--ctp-blue) !important;
328
+ color: var(--ctp-base) !important; }
329
+ [data-theme="dark"] .badge.bg-secondary, .dark-mode .badge.bg-secondary {
330
+ background-color: var(--ctp-overlay1) !important;
331
+ color: var(--ctp-text) !important; }
332
+
333
+ [data-theme="dark"] .card, .dark-mode .card {
334
+ background-color: var(--card-bg);
335
+ border-color: var(--border-color);
336
+ color: var(--text-color); }
337
+ [data-theme="dark"] .card .card-header, .dark-mode .card .card-header {
338
+ background-color: var(--card-bg);
339
+ border-bottom-color: var(--border-color);
340
+ color: var(--text-color); }
341
+ [data-theme="dark"] .card .card-header.bg-white, .dark-mode .card .card-header.bg-white {
342
+ background-color: var(--card-bg) !important;
343
+ color: var(--text-color) !important; }
344
+ [data-theme="dark"] .card .card-header.bg-danger, .dark-mode .card .card-header.bg-danger {
345
+ background-color: var(--ctp-red) !important;
346
+ color: var(--ctp-base) !important; }
347
+ [data-theme="dark"] .card .card-header.bg-warning, .dark-mode .card .card-header.bg-warning {
348
+ background-color: var(--ctp-peach) !important;
349
+ color: var(--ctp-base) !important; }
350
+ [data-theme="dark"] .card .card-header.bg-success, .dark-mode .card .card-header.bg-success {
351
+ background-color: var(--ctp-green) !important;
352
+ color: var(--ctp-base) !important; }
353
+ [data-theme="dark"] .card .card-header.bg-info, .dark-mode .card .card-header.bg-info {
354
+ background-color: var(--ctp-blue) !important;
355
+ color: var(--ctp-base) !important; }
356
+ [data-theme="dark"] .card .card-body, .dark-mode .card .card-body {
357
+ color: var(--text-color); }
358
+ [data-theme="dark"] .card .card-footer, .dark-mode .card .card-footer {
359
+ background-color: var(--card-bg);
360
+ border-top-color: var(--border-color);
361
+ color: var(--text-secondary); }
362
+
363
+ [data-theme="dark"] code, .dark-mode code, [data-theme="dark"] pre, .dark-mode pre {
364
+ background-color: var(--code-bg) !important;
365
+ color: var(--text-color) !important;
366
+ border-color: var(--border-color); }
367
+
368
+ [data-theme="dark"] .code-block, .dark-mode .code-block {
369
+ background-color: var(--code-bg);
370
+ color: var(--text-color);
371
+ border: 1px solid var(--border-color); }
372
+
373
+ [data-theme="dark"] .bg-dark.code-block, .dark-mode .bg-dark.code-block {
374
+ background-color: var(--code-bg) !important;
375
+ color: var(--text-color) !important; }
376
+
377
+ [data-theme="dark"] code.bg-dark, .dark-mode code.bg-dark, [data-theme="dark"]
378
+ pre.bg-dark, .dark-mode
379
+ pre.bg-dark {
380
+ background-color: var(--code-bg) !important;
381
+ color: var(--text-color) !important; }
382
+
383
+ [data-theme="dark"] .backtrace-frame, .dark-mode .backtrace-frame {
384
+ padding: 0.5rem 1rem;
385
+ margin-bottom: 2px;
386
+ border-radius: 0.25rem;
387
+ font-family: 'Courier New', monospace;
388
+ font-size: 0.875rem; }
389
+ [data-theme="dark"] .backtrace-frame.frame-app, .dark-mode .backtrace-frame.frame-app {
390
+ background-color: rgba(166, 227, 161, 0.1) !important;
391
+ color: var(--ctp-green) !important;
392
+ border-left: 3px solid var(--ctp-green);
393
+ font-weight: 600; }
394
+ [data-theme="dark"] .backtrace-frame.frame-gem, .dark-mode .backtrace-frame.frame-gem {
395
+ background-color: rgba(137, 180, 250, 0.1) !important;
396
+ color: var(--ctp-blue) !important;
397
+ border-left: 3px solid var(--ctp-blue); }
398
+ [data-theme="dark"] .backtrace-frame.frame-framework, .dark-mode .backtrace-frame.frame-framework {
399
+ background-color: rgba(249, 226, 175, 0.1) !important;
400
+ color: var(--ctp-yellow) !important;
401
+ border-left: 3px solid var(--ctp-yellow); }
402
+ [data-theme="dark"] .backtrace-frame.frame-ruby-core, .dark-mode .backtrace-frame.frame-ruby-core {
403
+ background-color: rgba(108, 112, 134, 0.1) !important;
404
+ color: var(--ctp-subtext0) !important;
405
+ border-left: 3px solid var(--ctp-overlay0); }
406
+
407
+ [data-theme="dark"] .heatmap-cell, .dark-mode .heatmap-cell {
408
+ background-color: var(--ctp-red);
409
+ color: var(--text-color);
410
+ border: 1px solid var(--border-subtle);
411
+ transition: all 150ms ease; }
412
+ [data-theme="dark"] .heatmap-cell:hover, .dark-mode .heatmap-cell:hover {
413
+ border-color: var(--border-color);
414
+ transform: scale(1.05); }
415
+
416
+ [data-theme="dark"] .table, .dark-mode .table {
417
+ color: var(--text-color);
418
+ border-color: var(--border-color); }
419
+ [data-theme="dark"] .table thead th, .dark-mode .table thead th {
420
+ background-color: var(--card-bg);
421
+ border-bottom-color: var(--border-color);
422
+ color: var(--text-color); }
423
+ [data-theme="dark"] .table tbody tr, .dark-mode .table tbody tr {
424
+ background-color: transparent;
425
+ border-bottom-color: var(--border-subtle); }
426
+ [data-theme="dark"] .table tbody tr:hover, .dark-mode .table tbody tr:hover {
427
+ background-color: var(--table-hover); }
428
+ [data-theme="dark"] .table tbody tr td, .dark-mode .table tbody tr td {
429
+ border-color: var(--border-subtle);
430
+ color: var(--text-color); }
431
+ [data-theme="dark"] .table.table-striped tbody tr:nth-of-type(odd), .dark-mode .table.table-striped tbody tr:nth-of-type(odd) {
432
+ background-color: rgba(49, 50, 68, 0.5); }
433
+ [data-theme="dark"] .table.table-bordered, .dark-mode .table.table-bordered {
434
+ border-color: var(--border-color); }
435
+ [data-theme="dark"] .table.table-bordered th, .dark-mode .table.table-bordered th, [data-theme="dark"] .table.table-bordered td, .dark-mode .table.table-bordered td {
436
+ border-color: var(--border-color); }
437
+
438
+ [data-theme="dark"] .form-control, .dark-mode .form-control, [data-theme="dark"]
439
+ .form-select, .dark-mode
440
+ .form-select {
441
+ background-color: var(--card-bg);
442
+ color: var(--text-color);
443
+ border-color: var(--border-color); }
444
+ [data-theme="dark"] .form-control:focus, .dark-mode .form-control:focus, [data-theme="dark"]
445
+ .form-select:focus, .dark-mode
446
+ .form-select:focus {
447
+ background-color: var(--card-bg);
448
+ border-color: var(--primary-color);
449
+ color: var(--text-color);
450
+ box-shadow: 0 0 0 0.2rem rgba(203, 166, 247, 0.25); }
451
+ [data-theme="dark"] .form-control::placeholder, .dark-mode .form-control::placeholder, [data-theme="dark"]
452
+ .form-select::placeholder, .dark-mode
453
+ .form-select::placeholder {
454
+ color: var(--text-muted); }
455
+ [data-theme="dark"] .form-control:disabled, .dark-mode .form-control:disabled, [data-theme="dark"]
456
+ .form-select:disabled, .dark-mode
457
+ .form-select:disabled {
458
+ background-color: var(--ctp-surface1);
459
+ color: var(--text-muted); }
460
+
461
+ [data-theme="dark"] .form-check-input, .dark-mode .form-check-input {
462
+ background-color: var(--card-bg);
463
+ border-color: var(--border-color); }
464
+ [data-theme="dark"] .form-check-input:checked, .dark-mode .form-check-input:checked {
465
+ background-color: var(--primary-color);
466
+ border-color: var(--primary-color); }
467
+ [data-theme="dark"] .form-check-input:focus, .dark-mode .form-check-input:focus {
468
+ border-color: var(--primary-color);
469
+ box-shadow: 0 0 0 0.2rem rgba(203, 166, 247, 0.25); }
470
+
471
+ [data-theme="dark"] .btn.btn-primary, .dark-mode .btn.btn-primary {
472
+ background-color: var(--ctp-mauve);
473
+ border-color: var(--ctp-mauve);
474
+ color: var(--ctp-base); }
475
+ [data-theme="dark"] .btn.btn-primary:hover, .dark-mode .btn.btn-primary:hover {
476
+ background-color: #d9bdf9;
477
+ border-color: #d9bdf9; }
478
+ [data-theme="dark"] .btn.btn-primary:active, .dark-mode .btn.btn-primary:active {
479
+ background-color: #bd8ff5;
480
+ border-color: #bd8ff5; }
481
+ [data-theme="dark"] .btn.btn-danger, .dark-mode .btn.btn-danger {
482
+ background-color: var(--ctp-red);
483
+ border-color: var(--ctp-red);
484
+ color: var(--ctp-base); }
485
+ [data-theme="dark"] .btn.btn-danger:hover, .dark-mode .btn.btn-danger:hover {
486
+ background-color: #f5a2b9;
487
+ border-color: #f5a2b9; }
488
+ [data-theme="dark"] .btn.btn-success, .dark-mode .btn.btn-success {
489
+ background-color: var(--ctp-green);
490
+ border-color: var(--ctp-green);
491
+ color: var(--ctp-base); }
492
+ [data-theme="dark"] .btn.btn-success:hover, .dark-mode .btn.btn-success:hover {
493
+ background-color: #b9e9b5;
494
+ border-color: #b9e9b5; }
495
+ [data-theme="dark"] .btn.btn-warning, .dark-mode .btn.btn-warning {
496
+ background-color: var(--ctp-peach);
497
+ border-color: var(--ctp-peach);
498
+ color: var(--ctp-base); }
499
+ [data-theme="dark"] .btn.btn-warning:hover, .dark-mode .btn.btn-warning:hover {
500
+ background-color: #fbc39f;
501
+ border-color: #fbc39f; }
502
+ [data-theme="dark"] .btn.btn-info, .dark-mode .btn.btn-info {
503
+ background-color: var(--ctp-blue);
504
+ border-color: var(--ctp-blue);
505
+ color: var(--ctp-base); }
506
+ [data-theme="dark"] .btn.btn-info:hover, .dark-mode .btn.btn-info:hover {
507
+ background-color: #a1c4fb;
508
+ border-color: #a1c4fb; }
509
+ [data-theme="dark"] .btn.btn-secondary, .dark-mode .btn.btn-secondary {
510
+ background-color: var(--ctp-overlay1);
511
+ border-color: var(--ctp-overlay1);
512
+ color: var(--ctp-text); }
513
+ [data-theme="dark"] .btn.btn-secondary:hover, .dark-mode .btn.btn-secondary:hover {
514
+ background-color: var(--ctp-overlay2);
515
+ border-color: var(--ctp-overlay2); }
516
+ [data-theme="dark"] .btn.btn-outline-primary, .dark-mode .btn.btn-outline-primary {
517
+ color: var(--ctp-mauve);
518
+ border-color: var(--ctp-mauve); }
519
+ [data-theme="dark"] .btn.btn-outline-primary:hover, .dark-mode .btn.btn-outline-primary:hover {
520
+ background-color: var(--ctp-mauve);
521
+ color: var(--ctp-base); }
522
+
523
+ [data-theme="dark"] .modal .modal-content, .dark-mode .modal .modal-content {
524
+ background-color: var(--card-bg);
525
+ color: var(--text-color);
526
+ border-color: var(--border-color); }
527
+ [data-theme="dark"] .modal .modal-content .modal-header, .dark-mode .modal .modal-content .modal-header {
528
+ background-color: var(--card-bg);
529
+ border-bottom-color: var(--border-color);
530
+ color: var(--text-color); }
531
+ [data-theme="dark"] .modal .modal-content .modal-header .btn-close, .dark-mode .modal .modal-content .modal-header .btn-close {
532
+ filter: invert(1) grayscale(100%) brightness(200%); }
533
+ [data-theme="dark"] .modal .modal-content .modal-body, .dark-mode .modal .modal-content .modal-body {
534
+ color: var(--text-color); }
535
+ [data-theme="dark"] .modal .modal-content .modal-footer, .dark-mode .modal .modal-content .modal-footer {
536
+ background-color: var(--card-bg);
537
+ border-top-color: var(--border-color); }
538
+
539
+ [data-theme="dark"] .dropdown-menu, .dark-mode .dropdown-menu {
540
+ background-color: var(--card-bg);
541
+ border-color: var(--border-color); }
542
+ [data-theme="dark"] .dropdown-menu .dropdown-item, .dark-mode .dropdown-menu .dropdown-item {
543
+ color: var(--text-color); }
544
+ [data-theme="dark"] .dropdown-menu .dropdown-item:hover, .dark-mode .dropdown-menu .dropdown-item:hover, [data-theme="dark"] .dropdown-menu .dropdown-item:focus, .dark-mode .dropdown-menu .dropdown-item:focus {
545
+ background-color: var(--table-hover);
546
+ color: var(--text-color); }
547
+ [data-theme="dark"] .dropdown-menu .dropdown-item.active, .dark-mode .dropdown-menu .dropdown-item.active {
548
+ background-color: var(--primary-color);
549
+ color: var(--ctp-base); }
550
+ [data-theme="dark"] .dropdown-menu .dropdown-divider, .dark-mode .dropdown-menu .dropdown-divider {
551
+ border-top-color: var(--border-color); }
552
+
553
+ [data-theme="dark"] .progress, .dark-mode .progress {
554
+ background-color: var(--ctp-surface1); }
555
+ [data-theme="dark"] .progress .progress-bar.bg-success, .dark-mode .progress .progress-bar.bg-success {
556
+ background-color: var(--ctp-green) !important; }
557
+ [data-theme="dark"] .progress .progress-bar.bg-danger, .dark-mode .progress .progress-bar.bg-danger {
558
+ background-color: var(--ctp-red) !important; }
559
+ [data-theme="dark"] .progress .progress-bar.bg-warning, .dark-mode .progress .progress-bar.bg-warning {
560
+ background-color: var(--ctp-peach) !important; }
561
+ [data-theme="dark"] .progress .progress-bar.bg-info, .dark-mode .progress .progress-bar.bg-info {
562
+ background-color: var(--ctp-blue) !important; }
563
+
564
+ [data-theme="dark"] .alert.alert-danger, .dark-mode .alert.alert-danger {
565
+ background-color: rgba(243, 139, 168, 0.2);
566
+ border-color: var(--ctp-red);
567
+ color: var(--ctp-red); }
568
+ [data-theme="dark"] .alert.alert-warning, .dark-mode .alert.alert-warning {
569
+ background-color: rgba(250, 179, 135, 0.2);
570
+ border-color: var(--ctp-peach);
571
+ color: var(--ctp-peach); }
572
+ [data-theme="dark"] .alert.alert-success, .dark-mode .alert.alert-success {
573
+ background-color: rgba(166, 227, 161, 0.2);
574
+ border-color: var(--ctp-green);
575
+ color: var(--ctp-green); }
576
+ [data-theme="dark"] .alert.alert-info, .dark-mode .alert.alert-info {
577
+ background-color: rgba(137, 180, 250, 0.2);
578
+ border-color: var(--ctp-blue);
579
+ color: var(--ctp-blue); }
580
+
581
+ [data-theme="dark"] .list-group .list-group-item, .dark-mode .list-group .list-group-item {
582
+ background-color: var(--card-bg);
583
+ border-color: var(--border-color);
584
+ color: var(--text-color); }
585
+ [data-theme="dark"] .list-group .list-group-item:hover, .dark-mode .list-group .list-group-item:hover {
586
+ background-color: var(--table-hover); }
587
+ [data-theme="dark"] .list-group .list-group-item.active, .dark-mode .list-group .list-group-item.active {
588
+ background-color: var(--primary-color);
589
+ border-color: var(--primary-color);
590
+ color: var(--ctp-base); }
591
+
592
+ [data-theme="dark"] .text-muted, .dark-mode .text-muted {
593
+ color: var(--text-muted) !important; }
594
+ [data-theme="dark"] .text-primary, .dark-mode .text-primary {
595
+ color: var(--primary-color) !important; }
596
+ [data-theme="dark"] .text-success, .dark-mode .text-success {
597
+ color: var(--success-color) !important; }
598
+ [data-theme="dark"] .text-danger, .dark-mode .text-danger {
599
+ color: var(--danger-color) !important; }
600
+ [data-theme="dark"] .text-warning, .dark-mode .text-warning {
601
+ color: var(--warning-color) !important; }
602
+ [data-theme="dark"] .text-info, .dark-mode .text-info {
603
+ color: var(--info-color) !important; }
604
+ [data-theme="dark"] .text-secondary, .dark-mode .text-secondary {
605
+ color: var(--secondary-color) !important; }
606
+ [data-theme="dark"] .text-light, .dark-mode .text-light {
607
+ color: var(--text-color) !important; }
608
+ [data-theme="dark"] .text-dark, .dark-mode .text-dark {
609
+ color: var(--text-muted) !important; }
610
+
611
+ :root {
612
+ --ctp-rosewater: #f5e0dc;
613
+ --ctp-flamingo: #f2cdcd;
614
+ --ctp-pink: #f5c2e7;
615
+ --ctp-mauve: #cba6f7;
616
+ --ctp-red: #f38ba8;
617
+ --ctp-maroon: #eba0ac;
618
+ --ctp-peach: #fab387;
619
+ --ctp-yellow: #f9e2af;
620
+ --ctp-green: #a6e3a1;
621
+ --ctp-teal: #94e2d5;
622
+ --ctp-sky: #89dceb;
623
+ --ctp-sapphire: #74c7ec;
624
+ --ctp-blue: #89b4fa;
625
+ --ctp-lavender: #b4befe;
626
+ --ctp-text: #cdd6f4;
627
+ --ctp-subtext1: #bac2de;
628
+ --ctp-subtext0: #a6adc8;
629
+ --ctp-overlay2: #9399b2;
630
+ --ctp-overlay1: #7f849c;
631
+ --ctp-overlay0: #6c7086;
632
+ --ctp-surface2: #585b70;
633
+ --ctp-surface1: #45475a;
634
+ --ctp-surface0: #313244;
635
+ --ctp-base: #1e1e2e;
636
+ --ctp-mantle: #181825;
637
+ --ctp-crust: #11111b; }
638
+
639
+ :root {
640
+ --ctp-rosewater: #f5e0dc;
641
+ --ctp-flamingo: #f2cdcd;
642
+ --ctp-pink: #f5c2e7;
643
+ --ctp-mauve: #cba6f7;
644
+ --ctp-red: #f38ba8;
645
+ --ctp-maroon: #eba0ac;
646
+ --ctp-peach: #fab387;
647
+ --ctp-yellow: #f9e2af;
648
+ --ctp-green: #a6e3a1;
649
+ --ctp-teal: #94e2d5;
650
+ --ctp-sky: #89dceb;
651
+ --ctp-sapphire: #74c7ec;
652
+ --ctp-blue: #89b4fa;
653
+ --ctp-lavender: #b4befe;
654
+ --ctp-text: #cdd6f4;
655
+ --ctp-subtext1: #bac2de;
656
+ --ctp-subtext0: #a6adc8;
657
+ --ctp-overlay2: #9399b2;
658
+ --ctp-overlay1: #7f849c;
659
+ --ctp-overlay0: #6c7086;
660
+ --ctp-surface2: #585b70;
661
+ --ctp-surface1: #45475a;
662
+ --ctp-surface0: #313244;
663
+ --ctp-base: #1e1e2e;
664
+ --ctp-mantle: #181825;
665
+ --ctp-crust: #11111b; }
666
+
667
+ :root {
668
+ --primary-color: #8B5CF6;
669
+ --success-color: #10B981;
670
+ --danger-color: #EF4444;
671
+ --warning-color: #F59E0B;
672
+ --info-color: #3B82F6;
673
+ --secondary-color: #6B7280;
674
+ --bg-color: #F3F4F6;
675
+ --card-bg: #FFFFFF;
676
+ --sidebar-bg: #FFFFFF;
677
+ --sidebar-hover: #F9FAFB;
678
+ --nav-active-bg: #EDE9FE;
679
+ --table-hover: #F9FAFB;
680
+ --code-bg: #F9FAFB;
681
+ --text-color: #1F2937;
682
+ --text-secondary: #4B5563;
683
+ --text-muted: #9CA3AF;
684
+ --text-link: #3B82F6;
685
+ --text-link-hover: #2563EB;
686
+ --border-color: #E5E7EB;
687
+ --border-subtle: #F3F4F6;
688
+ --platform-ios: #000000;
689
+ --platform-android: #3DDC84;
690
+ --platform-web: #3B82F6;
691
+ --platform-api: #8B5CF6;
692
+ --chart-line-1: #EF4444;
693
+ --chart-line-2: #10B981;
694
+ --chart-line-3: #F59E0B;
695
+ --chart-line-4: #3B82F6;
696
+ --chart-line-5: #8B5CF6;
697
+ --chart-grid: rgba(0, 0, 0, 0.1);
698
+ --chart-text: #1F2937;
699
+ --chart-tooltip-bg: #FFFFFF;
700
+ --bs-primary: #8B5CF6;
701
+ --bs-success: #10B981;
702
+ --bs-danger: #EF4444;
703
+ --bs-warning: #F59E0B;
704
+ --bs-info: #3B82F6;
705
+ --bs-secondary: #6B7280; }
706
+
707
+ [data-theme="dark"], .dark-mode {
708
+ --primary-color: var(--ctp-mauve);
709
+ --success-color: var(--ctp-green);
710
+ --danger-color: var(--ctp-red);
711
+ --warning-color: var(--ctp-peach);
712
+ --info-color: var(--ctp-blue);
713
+ --secondary-color: var(--ctp-overlay1);
714
+ --bg-color: var(--ctp-base);
715
+ --card-bg: var(--ctp-surface0);
716
+ --sidebar-bg: var(--ctp-mantle);
717
+ --sidebar-hover: var(--ctp-surface0);
718
+ --nav-active-bg: var(--ctp-surface1);
719
+ --table-hover: var(--ctp-surface0);
720
+ --code-bg: var(--ctp-mantle);
721
+ --text-color: var(--ctp-text);
722
+ --text-secondary: var(--ctp-subtext1);
723
+ --text-muted: var(--ctp-subtext0);
724
+ --text-link: var(--ctp-sky);
725
+ --text-link-hover: var(--ctp-sapphire);
726
+ --border-color: var(--ctp-surface2);
727
+ --border-subtle: var(--ctp-surface1);
728
+ --platform-ios: var(--ctp-text);
729
+ --platform-android: var(--ctp-green);
730
+ --platform-web: var(--ctp-blue);
731
+ --platform-api: var(--ctp-sapphire);
732
+ --severity-critical: var(--ctp-red);
733
+ --severity-high: var(--ctp-peach);
734
+ --severity-medium: var(--ctp-blue);
735
+ --severity-low: var(--ctp-overlay1);
736
+ --chart-line-1: var(--ctp-red);
737
+ --chart-line-2: var(--ctp-green);
738
+ --chart-line-3: var(--ctp-yellow);
739
+ --chart-line-4: var(--ctp-blue);
740
+ --chart-line-5: var(--ctp-mauve);
741
+ --chart-line-6: var(--ctp-teal);
742
+ --chart-line-7: var(--ctp-pink);
743
+ --chart-line-8: var(--ctp-lavender);
744
+ --chart-grid: rgba(88, 91, 112, 0.3);
745
+ --chart-text: var(--ctp-text);
746
+ --chart-tooltip-bg: var(--ctp-surface0);
747
+ --bs-primary: var(--ctp-mauve);
748
+ --bs-success: var(--ctp-green);
749
+ --bs-danger: var(--ctp-red);
750
+ --bs-warning: var(--ctp-peach);
751
+ --bs-info: var(--ctp-blue);
752
+ --bs-secondary: var(--ctp-overlay1);
753
+ --bs-light: var(--ctp-surface1);
754
+ --bs-dark: var(--ctp-mantle);
755
+ --bs-body-bg: var(--ctp-base);
756
+ --bs-body-color: var(--ctp-text);
757
+ --bs-border-color: var(--ctp-surface2);
758
+ --bs-link-color: var(--ctp-sky);
759
+ --bs-link-hover-color: var(--ctp-sapphire); }
760
+
761
+ .navbar {
762
+ background: linear-gradient(135deg, var(--primary-color), #6D28D9);
763
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
764
+ color: white; }
765
+ .navbar .navbar-brand,
766
+ .navbar .text-white,
767
+ .navbar small {
768
+ color: white !important; }
769
+
770
+ .theme-toggle {
771
+ cursor: pointer;
772
+ padding: 0.5rem 1rem;
773
+ border-radius: 0.5rem;
774
+ background-color: rgba(255, 255, 255, 0.1);
775
+ color: white;
776
+ border: none;
777
+ transition: background-color 0.2s; }
778
+ .theme-toggle:hover {
779
+ background-color: rgba(255, 255, 255, 0.2); }
780
+
781
+ .sidebar {
782
+ background: var(--sidebar-bg);
783
+ min-height: calc(100vh - 56px);
784
+ box-shadow: 2px 0 4px rgba(0, 0, 0, 0.05); }
785
+ .sidebar .nav-link {
786
+ color: var(--text-color);
787
+ padding: 0.75rem 1.5rem;
788
+ border-left: 3px solid transparent;
789
+ transition: all 0.2s; }
790
+ .sidebar .nav-link:hover {
791
+ background-color: var(--sidebar-hover);
792
+ color: var(--primary-color);
793
+ border-left-color: var(--primary-color); }
794
+ .sidebar .nav-link.active {
795
+ background-color: var(--nav-active-bg);
796
+ color: var(--primary-color);
797
+ border-left-color: var(--primary-color);
798
+ font-weight: 600; }
799
+
800
+ .stat-card {
801
+ border-radius: 0.75rem;
802
+ border: none;
803
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
804
+ transition: transform 0.2s, box-shadow 0.2s; }
805
+ .stat-card:hover {
806
+ transform: translateY(-2px);
807
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); }
808
+ .stat-card.updated {
809
+ animation: statPulse 0.5s ease-out; }
810
+
811
+ .stat-value {
812
+ font-size: 2rem;
813
+ font-weight: 700; }
814
+
815
+ .stat-label {
816
+ font-size: 0.875rem;
817
+ text-transform: uppercase;
818
+ letter-spacing: 0.05em;
819
+ color: #6B7280; }
820
+ [data-theme="dark"] .stat-label, .dark-mode .stat-label {
821
+ color: var(--text-secondary); }
822
+
823
+ .error-status-resolved {
824
+ color: var(--success-color); }
825
+
826
+ .error-status-unresolved {
827
+ color: var(--danger-color); }
828
+
829
+ .chart-container {
830
+ position: relative;
831
+ height: 300px;
832
+ margin: 1rem 0; }
833
+
834
+ [data-theme="dark"] .offcanvas, .dark-mode .offcanvas {
835
+ background-color: var(--sidebar-bg);
836
+ color: var(--text-color); }
837
+ [data-theme="dark"] .offcanvas-header, .dark-mode .offcanvas-header {
838
+ border-color: var(--border-color); }
839
+ [data-theme="dark"] .offcanvas-title, .dark-mode .offcanvas-title {
840
+ color: var(--text-color); }
841
+
842
+ #loading-indicator {
843
+ position: fixed;
844
+ top: 0;
845
+ left: 0;
846
+ right: 0;
847
+ height: 3px;
848
+ background: linear-gradient(90deg, #8B5CF6 0%, #6D28D9 100%);
849
+ transform: scaleX(0);
850
+ transform-origin: left;
851
+ transition: transform 0.3s ease;
852
+ z-index: 9999;
853
+ display: none; }
854
+ #loading-indicator.active {
855
+ display: block;
856
+ animation: loadingProgress 2s ease-in-out forwards; }
857
+
858
+ #live-indicator {
859
+ animation: pulse 2s ease-in-out infinite; }
860
+
861
+ @keyframes loadingProgress {
862
+ 0% {
863
+ transform: scaleX(0); }
864
+ 50% {
865
+ transform: scaleX(0.7); }
866
+ 100% {
867
+ transform: scaleX(1);
868
+ opacity: 0; } }
869
+ @keyframes statPulse {
870
+ 0%, 100% {
871
+ transform: scale(1); }
872
+ 50% {
873
+ transform: scale(1.05); } }
874
+ @keyframes pulse {
875
+ 0%, 100% {
876
+ opacity: 1; }
877
+ 50% {
878
+ opacity: 0.5; } }
879
+ @keyframes slideInFade {
880
+ 0% {
881
+ transform: translateY(-20px);
882
+ opacity: 0;
883
+ background-color: #FEF3C7; }
884
+ 10% {
885
+ transform: translateY(0);
886
+ opacity: 1;
887
+ background-color: #FEF3C7; }
888
+ 100% {
889
+ background-color: transparent; } }
890
+ @keyframes slideInFade {
891
+ 0% {
892
+ transform: translateY(-20px);
893
+ opacity: 0;
894
+ background-color: rgba(249, 226, 175, 0.3); }
895
+ 10% {
896
+ transform: translateY(0);
897
+ opacity: 1;
898
+ background-color: rgba(249, 226, 175, 0.3); }
899
+ 100% {
900
+ background-color: transparent; } }
901
+ #error_list tr:first-child.new-error {
902
+ animation: slideInFade 3s ease-out; }
903
+
904
+ body {
905
+ background-color: var(--bg-color);
906
+ color: var(--text-color);
907
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
908
+ transition: background-color 300ms ease, color 300ms ease; }
909
+
910
+ a {
911
+ color: var(--text-link);
912
+ text-decoration: none;
913
+ transition: color 150ms ease; }
914
+ a:hover {
915
+ color: var(--text-link-hover);
916
+ text-decoration: underline; }
917
+
918
+ * {
919
+ transition-property: background-color, border-color, color;
920
+ transition-duration: 300ms;
921
+ transition-timing-function: ease; }
922
+
923
+ .no-transition * {
924
+ transition: none !important; }
925
+
926
+ /*# sourceMappingURL=application.css.map */