rails-profiler 0.35.2 → 0.35.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.
@@ -1,3546 +1 @@
1
- @import url("https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700&family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;1,400&display=swap");
2
- :root,
3
- [data-theme=dark] {
4
- --profiler-terminal-bg: #0a0e15;
5
- --profiler-terminal-text: #cdd6e0;
6
- --ansi-red: #f87171;
7
- --ansi-green: #4ade80;
8
- --ansi-yellow: #fbbf24;
9
- --ansi-blue: #60a5fa;
10
- --ansi-purple: #c084fc;
11
- --ansi-cyan: #67e8f9;
12
- --profiler-bg: #080b10;
13
- --profiler-bg-light: #0d1117;
14
- --profiler-bg-lighter: #131920;
15
- --profiler-bg-elevated: #1a2030;
16
- --profiler-bg-overlay: rgba(8, 11, 16, 0.96);
17
- --profiler-text: #eef2f7;
18
- --profiler-text-secondary: #a8b4c2;
19
- --profiler-text-muted: #5e7080;
20
- --profiler-text-subtle: #3d4f5f;
21
- --profiler-text-on-accent: #08090c;
22
- --profiler-accent: #f59e0b;
23
- --profiler-accent-hover: #fbbf24;
24
- --profiler-accent-dim: #92600a;
25
- --profiler-accent-bg: rgba(245, 158, 11, 0.1);
26
- --profiler-accent-glow: rgba(245, 158, 11, 0.35);
27
- --profiler-success: #22c55e;
28
- --profiler-success-bg: rgba(34, 197, 94, 0.1);
29
- --profiler-success-glow: rgba(34, 197, 94, 0.3);
30
- --profiler-warning: #fb923c;
31
- --profiler-warning-bg: rgba(251, 146, 60, 0.1);
32
- --profiler-warning-glow: rgba(251, 146, 60, 0.3);
33
- --profiler-error: #f87171;
34
- --profiler-error-bg: rgba(248, 113, 113, 0.1);
35
- --profiler-error-glow: rgba(248, 113, 113, 0.3);
36
- --profiler-info: #60a5fa;
37
- --profiler-info-bg: rgba(96, 165, 250, 0.1);
38
- --profiler-info-glow: rgba(96, 165, 250, 0.3);
39
- --profiler-border: rgba(255, 255, 255, 0.07);
40
- --profiler-border-strong: rgba(255, 255, 255, 0.14);
41
- --profiler-border-accent: rgba(245, 158, 11, 0.3);
42
- --profiler-shadow-sm: 0 1px 4px rgba(0, 0, 0, 0.4);
43
- --profiler-shadow-md: 0 4px 16px rgba(0, 0, 0, 0.5);
44
- --profiler-shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.6);
45
- --profiler-shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.7);
46
- --profiler-glass-bg: rgba(13, 17, 23, 0.85);
47
- --profiler-glass-border: rgba(255, 255, 255, 0.06);
48
- --profiler-blur: blur(20px) saturate(180%);
49
- }
50
-
51
- [data-theme=light] {
52
- --profiler-terminal-bg: #1c1f26;
53
- --profiler-terminal-text: #d4dbe3;
54
- --ansi-red: #f87171;
55
- --ansi-green: #4ade80;
56
- --ansi-yellow: #fbbf24;
57
- --ansi-blue: #60a5fa;
58
- --ansi-purple: #c084fc;
59
- --ansi-cyan: #67e8f9;
60
- --profiler-bg: #f5f3ef;
61
- --profiler-bg-light: #edeae3;
62
- --profiler-bg-lighter: #e3ded5;
63
- --profiler-bg-elevated: #ffffff;
64
- --profiler-bg-overlay: rgba(245, 243, 239, 0.96);
65
- --profiler-text: #1c1410;
66
- --profiler-text-secondary: #4a3f35;
67
- --profiler-text-muted: #8a7a6e;
68
- --profiler-text-subtle: #b5a898;
69
- --profiler-text-on-accent: #ffffff;
70
- --profiler-accent: #b45309;
71
- --profiler-accent-hover: #92400e;
72
- --profiler-accent-dim: #d97706;
73
- --profiler-accent-bg: rgba(180, 83, 9, 0.08);
74
- --profiler-accent-glow: rgba(180, 83, 9, 0.2);
75
- --profiler-success: #15803d;
76
- --profiler-success-bg: rgba(21, 128, 61, 0.08);
77
- --profiler-success-glow: rgba(21, 128, 61, 0.2);
78
- --profiler-warning: #c2410c;
79
- --profiler-warning-bg: rgba(194, 65, 12, 0.08);
80
- --profiler-warning-glow: rgba(194, 65, 12, 0.2);
81
- --profiler-error: #dc2626;
82
- --profiler-error-bg: rgba(220, 38, 38, 0.08);
83
- --profiler-error-glow: rgba(220, 38, 38, 0.2);
84
- --profiler-info: #1d4ed8;
85
- --profiler-info-bg: rgba(29, 78, 216, 0.08);
86
- --profiler-info-glow: rgba(29, 78, 216, 0.2);
87
- --profiler-border: rgba(28, 20, 16, 0.1);
88
- --profiler-border-strong: rgba(28, 20, 16, 0.2);
89
- --profiler-border-accent: rgba(180, 83, 9, 0.3);
90
- --profiler-shadow-sm: 0 1px 3px rgba(28, 20, 16, 0.08);
91
- --profiler-shadow-md: 0 4px 12px rgba(28, 20, 16, 0.1);
92
- --profiler-shadow-lg: 0 8px 24px rgba(28, 20, 16, 0.12);
93
- --profiler-shadow-xl: 0 16px 40px rgba(28, 20, 16, 0.15);
94
- --profiler-glass-bg: rgba(245, 243, 239, 0.88);
95
- --profiler-glass-border: rgba(28, 20, 16, 0.08);
96
- --profiler-blur: blur(16px) saturate(140%);
97
- }
98
-
99
- @media (prefers-color-scheme: light) {
100
- :root:not([data-theme]) {
101
- --profiler-terminal-bg: #1c1f26;
102
- --profiler-terminal-text: #d4dbe3;
103
- --ansi-red: #f87171;
104
- --ansi-green: #4ade80;
105
- --ansi-yellow: #fbbf24;
106
- --ansi-blue: #60a5fa;
107
- --ansi-purple: #c084fc;
108
- --ansi-cyan: #67e8f9;
109
- --profiler-bg: #f5f3ef;
110
- --profiler-bg-light: #edeae3;
111
- --profiler-bg-lighter: #e3ded5;
112
- --profiler-bg-elevated: #ffffff;
113
- --profiler-bg-overlay: rgba(245, 243, 239, 0.96);
114
- --profiler-text: #1c1410;
115
- --profiler-text-secondary: #4a3f35;
116
- --profiler-text-muted: #8a7a6e;
117
- --profiler-text-subtle: #b5a898;
118
- --profiler-text-on-accent: #ffffff;
119
- --profiler-accent: #b45309;
120
- --profiler-accent-hover: #92400e;
121
- --profiler-accent-dim: #d97706;
122
- --profiler-accent-bg: rgba(180, 83, 9, 0.08);
123
- --profiler-accent-glow: rgba(180, 83, 9, 0.2);
124
- --profiler-success: #15803d;
125
- --profiler-success-bg: rgba(21, 128, 61, 0.08);
126
- --profiler-success-glow: rgba(21, 128, 61, 0.2);
127
- --profiler-warning: #c2410c;
128
- --profiler-warning-bg: rgba(194, 65, 12, 0.08);
129
- --profiler-warning-glow: rgba(194, 65, 12, 0.2);
130
- --profiler-error: #dc2626;
131
- --profiler-error-bg: rgba(220, 38, 38, 0.08);
132
- --profiler-error-glow: rgba(220, 38, 38, 0.2);
133
- --profiler-info: #1d4ed8;
134
- --profiler-info-bg: rgba(29, 78, 216, 0.08);
135
- --profiler-info-glow: rgba(29, 78, 216, 0.2);
136
- --profiler-border: rgba(28, 20, 16, 0.1);
137
- --profiler-border-strong: rgba(28, 20, 16, 0.2);
138
- --profiler-border-accent: rgba(180, 83, 9, 0.3);
139
- --profiler-shadow-sm: 0 1px 3px rgba(28, 20, 16, 0.08);
140
- --profiler-shadow-md: 0 4px 12px rgba(28, 20, 16, 0.1);
141
- --profiler-shadow-lg: 0 8px 24px rgba(28, 20, 16, 0.12);
142
- --profiler-shadow-xl: 0 16px 40px rgba(28, 20, 16, 0.15);
143
- --profiler-glass-bg: rgba(245, 243, 239, 0.88);
144
- --profiler-glass-border: rgba(28, 20, 16, 0.08);
145
- --profiler-blur: blur(16px) saturate(140%);
146
- }
147
- }
148
- :root {
149
- --profiler-font-sans: 'Outfit', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
150
- --profiler-font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
151
- --profiler-text-xs: 10px;
152
- --profiler-text-sm: 11px;
153
- --profiler-text-base: 13px;
154
- --profiler-text-lg: 15px;
155
- --profiler-text-xl: 18px;
156
- --profiler-text-2xl: 22px;
157
- --profiler-text-3xl: 28px;
158
- --profiler-space-1: 4px;
159
- --profiler-space-2: 8px;
160
- --profiler-space-3: 12px;
161
- --profiler-space-4: 16px;
162
- --profiler-space-6: 24px;
163
- --profiler-space-8: 32px;
164
- --profiler-space-12: 48px;
165
- --profiler-radius-sm: 4px;
166
- --profiler-radius-md: 6px;
167
- --profiler-radius-lg: 10px;
168
- --profiler-radius-full: 9999px;
169
- --profiler-transition-fast: 120ms cubic-bezier(0.4, 0, 0.2, 1);
170
- --profiler-transition-base: 220ms cubic-bezier(0.4, 0, 0.2, 1);
171
- --profiler-transition-slow: 350ms cubic-bezier(0.4, 0, 0.2, 1);
172
- --profiler-transition-elastic: 500ms cubic-bezier(0.34, 1.56, 0.64, 1);
173
- --profiler-z-toolbar: 999999;
174
- --profiler-z-panel: 1000000;
175
- --profiler-z-modal: 1000001;
176
- }
177
-
178
- .profiler-theme-toggle {
179
- display: inline-flex;
180
- align-items: center;
181
- justify-content: center;
182
- width: 32px;
183
- height: 32px;
184
- background: var(--profiler-bg-lighter);
185
- border: 1px solid var(--profiler-border);
186
- border-radius: var(--profiler-radius-sm);
187
- cursor: pointer;
188
- transition: all var(--profiler-transition-base);
189
- color: var(--profiler-text-muted);
190
- font-size: 14px;
191
- }
192
- .profiler-theme-toggle:hover {
193
- background: var(--profiler-accent-bg);
194
- border-color: var(--profiler-border-accent);
195
- color: var(--profiler-accent);
196
- transform: scale(1.08);
197
- }
198
- .profiler-theme-toggle:active {
199
- transform: scale(0.94);
200
- }
201
-
202
- *,
203
- *::before,
204
- *::after {
205
- margin: 0;
206
- padding: 0;
207
- box-sizing: border-box;
208
- }
209
-
210
- body {
211
- font-family: var(--profiler-font-sans);
212
- background: var(--profiler-bg);
213
- color: var(--profiler-text);
214
- line-height: 1.6;
215
- font-size: var(--profiler-text-base);
216
- -webkit-font-smoothing: antialiased;
217
- -moz-osx-font-smoothing: grayscale;
218
- }
219
-
220
- .container {
221
- max-width: 1400px;
222
- margin: 0 auto;
223
- padding: var(--profiler-space-8) var(--profiler-space-6);
224
- }
225
- @media (max-width: 768px) {
226
- .container {
227
- padding: var(--profiler-space-6) var(--profiler-space-4);
228
- }
229
- }
230
-
231
- .header {
232
- margin-bottom: var(--profiler-space-8);
233
- padding-bottom: var(--profiler-space-6);
234
- border-bottom: 1px solid var(--profiler-border);
235
- animation: fadeInDown 400ms cubic-bezier(0.4, 0, 0.2, 1) both;
236
- }
237
- .header h1 {
238
- font-size: var(--profiler-text-3xl);
239
- font-weight: 700;
240
- letter-spacing: -0.03em;
241
- line-height: 1.15;
242
- margin-bottom: var(--profiler-space-2);
243
- color: var(--profiler-text);
244
- background: linear-gradient(125deg, var(--profiler-accent) 0%, var(--profiler-accent-hover) 60%, var(--profiler-warning) 100%);
245
- -webkit-background-clip: text;
246
- -webkit-text-fill-color: transparent;
247
- background-clip: text;
248
- }
249
- .header h1 .h1-emoji {
250
- -webkit-text-fill-color: initial;
251
- }
252
- .header h1 a {
253
- color: inherit;
254
- text-decoration: none;
255
- background: inherit;
256
- -webkit-background-clip: inherit;
257
- -webkit-text-fill-color: inherit;
258
- background-clip: inherit;
259
- }
260
- .header h1 a:hover {
261
- opacity: 0.75;
262
- }
263
- @media (max-width: 768px) {
264
- .header h1 {
265
- font-size: var(--profiler-text-2xl);
266
- }
267
- }
268
- .header p {
269
- font-size: var(--profiler-text-sm);
270
- color: var(--profiler-text-muted);
271
- font-family: var(--profiler-font-mono);
272
- letter-spacing: 0.03em;
273
- }
274
-
275
- a {
276
- color: var(--profiler-accent);
277
- text-decoration: none;
278
- transition: color var(--profiler-transition-fast);
279
- }
280
- a:hover {
281
- color: var(--profiler-accent-hover);
282
- }
283
- a:focus-visible {
284
- outline: 2px solid var(--profiler-border-accent);
285
- outline-offset: 2px;
286
- border-radius: var(--profiler-radius-sm);
287
- }
288
-
289
- code,
290
- pre {
291
- font-family: var(--profiler-font-mono);
292
- }
293
-
294
- code {
295
- background: var(--profiler-accent-bg);
296
- color: var(--profiler-accent);
297
- padding: 2px 6px;
298
- border-radius: var(--profiler-radius-sm);
299
- border: 1px solid var(--profiler-border-accent);
300
- font-size: var(--profiler-text-sm);
301
- }
302
-
303
- pre {
304
- background: rgba(0, 0, 0, 0.25);
305
- padding: var(--profiler-space-4);
306
- border-radius: var(--profiler-radius-md);
307
- border: 1px solid var(--profiler-border);
308
- overflow-x: auto;
309
- line-height: 1.65;
310
- color: var(--profiler-text-secondary);
311
- }
312
- pre code {
313
- background: none;
314
- padding: 0;
315
- border: none;
316
- color: inherit;
317
- font-size: inherit;
318
- }
319
-
320
- [data-theme=light] pre {
321
- background: rgba(0, 0, 0, 0.03);
322
- }
323
-
324
- table {
325
- width: 100%;
326
- border-collapse: collapse;
327
- font-size: var(--profiler-text-base);
328
- }
329
- table th {
330
- text-align: left;
331
- font-weight: 600;
332
- font-size: var(--profiler-text-xs);
333
- text-transform: uppercase;
334
- letter-spacing: 0.08em;
335
- color: var(--profiler-text-muted);
336
- padding: var(--profiler-space-2) var(--profiler-space-3);
337
- border-bottom: 1px solid var(--profiler-border-strong);
338
- background: var(--profiler-bg-light);
339
- white-space: nowrap;
340
- }
341
- table td {
342
- padding: var(--profiler-space-3);
343
- border-bottom: 1px solid var(--profiler-border);
344
- color: var(--profiler-text);
345
- vertical-align: middle;
346
- font-size: var(--profiler-text-base);
347
- }
348
- table tr:last-child td {
349
- border-bottom: none;
350
- }
351
- table tr:hover td {
352
- background: var(--profiler-bg-lighter);
353
- }
354
- table a {
355
- font-family: var(--profiler-font-mono);
356
- font-size: var(--profiler-text-sm);
357
- }
358
-
359
- ::-webkit-scrollbar {
360
- width: 8px;
361
- height: 8px;
362
- }
363
-
364
- ::-webkit-scrollbar-track {
365
- background: transparent;
366
- }
367
-
368
- ::-webkit-scrollbar-thumb {
369
- background: var(--profiler-border-strong);
370
- border-radius: var(--profiler-radius-full);
371
- }
372
- ::-webkit-scrollbar-thumb:hover {
373
- background: var(--profiler-text-subtle);
374
- }
375
-
376
- ::selection {
377
- background: var(--profiler-accent-bg);
378
- color: var(--profiler-text);
379
- }
380
-
381
- :focus-visible {
382
- outline: 2px solid var(--profiler-accent);
383
- outline-offset: 2px;
384
- border-radius: var(--profiler-radius-sm);
385
- }
386
-
387
- .card {
388
- background: var(--profiler-bg-light);
389
- border: 1px solid var(--profiler-border);
390
- border-radius: var(--profiler-radius-lg);
391
- padding: var(--profiler-space-6);
392
- box-shadow: var(--profiler-shadow-md);
393
- transition: all var(--profiler-transition-base);
394
- }
395
- .card:hover {
396
- border-color: var(--profiler-border-strong);
397
- box-shadow: var(--profiler-shadow-lg);
398
- transform: translateY(-2px);
399
- }
400
-
401
- .btn {
402
- display: inline-flex;
403
- align-items: center;
404
- justify-content: center;
405
- gap: var(--profiler-space-2);
406
- padding: var(--profiler-space-2) var(--profiler-space-4);
407
- font-family: var(--profiler-font-sans);
408
- font-size: var(--profiler-text-base);
409
- font-weight: 600;
410
- border-radius: var(--profiler-radius-sm);
411
- border: 1px solid transparent;
412
- cursor: pointer;
413
- transition: all var(--profiler-transition-base);
414
- text-decoration: none;
415
- white-space: nowrap;
416
- letter-spacing: 0.01em;
417
- }
418
- .btn:disabled {
419
- opacity: 0.45;
420
- cursor: not-allowed;
421
- }
422
- .btn.btn-primary {
423
- background: var(--profiler-accent-bg);
424
- color: var(--profiler-accent);
425
- border-color: var(--profiler-border-accent);
426
- }
427
- .btn.btn-primary:hover:not(:disabled) {
428
- background: var(--profiler-accent);
429
- color: var(--profiler-text-on-accent);
430
- transform: translateY(-1px);
431
- box-shadow: 0 4px 16px var(--profiler-accent-glow);
432
- }
433
- .btn.btn-secondary {
434
- background: var(--profiler-bg-lighter);
435
- color: var(--profiler-text-secondary);
436
- border-color: var(--profiler-border);
437
- }
438
- .btn.btn-secondary:hover:not(:disabled) {
439
- background: var(--profiler-bg-elevated);
440
- border-color: var(--profiler-border-strong);
441
- color: var(--profiler-text);
442
- }
443
- .btn.btn-sm {
444
- padding: var(--profiler-space-1) var(--profiler-space-3);
445
- font-size: var(--profiler-text-sm);
446
- }
447
- .btn.btn-danger {
448
- background: transparent;
449
- color: var(--profiler-error);
450
- border-color: var(--profiler-error);
451
- }
452
- .btn.btn-danger:hover:not(:disabled) {
453
- background: var(--profiler-error);
454
- color: #fff;
455
- }
456
-
457
- .profiler-load-more {
458
- display: flex;
459
- justify-content: center;
460
- padding: var(--profiler-space-4) 0 var(--profiler-space-2);
461
- }
462
-
463
- .token-copy {
464
- background: none;
465
- border: none;
466
- cursor: pointer;
467
- font-family: var(--profiler-font-mono);
468
- font-size: var(--profiler-text-xs);
469
- color: var(--profiler-text-muted);
470
- padding: 2px 4px;
471
- border-radius: var(--profiler-radius-sm);
472
- transition: color var(--profiler-transition-base), background var(--profiler-transition-base);
473
- }
474
- .token-copy:hover {
475
- color: var(--profiler-accent);
476
- background: var(--profiler-accent-bg);
477
- }
478
-
479
- .btn-row-delete {
480
- background: none;
481
- border: none;
482
- cursor: pointer;
483
- color: var(--profiler-text-muted);
484
- font-size: var(--profiler-text-base);
485
- line-height: 1;
486
- padding: 2px 6px;
487
- border-radius: var(--profiler-radius-sm);
488
- transition: color var(--profiler-transition-base), background var(--profiler-transition-base);
489
- opacity: 0;
490
- }
491
- tr:hover .btn-row-delete {
492
- opacity: 1;
493
- }
494
- .btn-row-delete:hover {
495
- color: var(--profiler-error);
496
- background: var(--profiler-error-bg);
497
- }
498
-
499
- .badge,
500
- [class*=badge-] {
501
- display: inline-flex;
502
- align-items: center;
503
- padding: 2px 7px;
504
- border-radius: var(--profiler-radius-sm);
505
- font-family: var(--profiler-font-mono);
506
- font-size: var(--profiler-text-xs);
507
- font-weight: 600;
508
- letter-spacing: 0.04em;
509
- white-space: nowrap;
510
- }
511
-
512
- .badge {
513
- background: var(--profiler-bg-lighter);
514
- color: var(--profiler-text-secondary);
515
- border: 1px solid var(--profiler-border);
516
- }
517
-
518
- .badge-success {
519
- background: var(--profiler-success-bg);
520
- color: var(--profiler-success);
521
- border: 1px solid rgba(34, 197, 94, 0.2);
522
- }
523
-
524
- .badge-warning {
525
- background: var(--profiler-warning-bg);
526
- color: var(--profiler-warning);
527
- border: 1px solid rgba(251, 146, 60, 0.2);
528
- }
529
-
530
- .badge-error {
531
- background: var(--profiler-error-bg);
532
- color: var(--profiler-error);
533
- border: 1px solid rgba(248, 113, 113, 0.2);
534
- }
535
-
536
- .badge-info {
537
- background: var(--profiler-info-bg);
538
- color: var(--profiler-info);
539
- border: 1px solid rgba(96, 165, 250, 0.2);
540
- }
541
-
542
- .badge-default {
543
- background: var(--profiler-bg-lighter);
544
- color: var(--profiler-text-muted);
545
- border: 1px solid var(--profiler-border);
546
- }
547
-
548
- .profiler-version-badge {
549
- display: inline-flex;
550
- align-items: center;
551
- padding: 1px 6px;
552
- border-radius: var(--profiler-radius-sm);
553
- font-family: var(--profiler-font-mono);
554
- font-size: var(--profiler-text-xs);
555
- color: var(--profiler-text-muted);
556
- background: var(--profiler-bg-lighter);
557
- border: 1px solid var(--profiler-border);
558
- }
559
-
560
- .profiler-version-warn {
561
- margin-left: 6px;
562
- cursor: help;
563
- font-size: var(--profiler-text-xs);
564
- }
565
-
566
- .profiler-version-mismatch {
567
- margin-top: var(--profiler-space-2);
568
- padding: var(--profiler-space-2) var(--profiler-space-3);
569
- border-radius: var(--profiler-radius-sm);
570
- font-size: var(--profiler-text-sm);
571
- background: var(--profiler-warning-bg);
572
- color: var(--profiler-warning);
573
- border: 1px solid rgba(251, 146, 60, 0.3);
574
- }
575
-
576
- @keyframes fadeInDown {
577
- from {
578
- opacity: 0;
579
- transform: translateY(-12px);
580
- }
581
- to {
582
- opacity: 1;
583
- transform: translateY(0);
584
- }
585
- }
586
- @keyframes fadeIn {
587
- from {
588
- opacity: 0;
589
- }
590
- to {
591
- opacity: 1;
592
- }
593
- }
594
- @keyframes fadeInUp {
595
- from {
596
- opacity: 0;
597
- transform: translateY(12px);
598
- }
599
- to {
600
- opacity: 1;
601
- transform: translateY(0);
602
- }
603
- }
604
- @keyframes spin {
605
- to {
606
- transform: rotate(360deg);
607
- }
608
- }
609
- .profiler-spinner {
610
- display: inline-block;
611
- animation: spin 1s linear infinite;
612
- }
613
-
614
- @keyframes pulse {
615
- 0%, 100% {
616
- opacity: 1;
617
- }
618
- 50% {
619
- opacity: 0.45;
620
- }
621
- }
622
- .animate-fade-in {
623
- animation: fadeIn 300ms ease both;
624
- }
625
-
626
- .animate-fade-in-up {
627
- animation: fadeInUp 400ms ease both;
628
- }
629
-
630
- .loading-spinner {
631
- display: inline-block;
632
- width: 18px;
633
- height: 18px;
634
- border: 2px solid var(--profiler-border-strong);
635
- border-top-color: var(--profiler-accent);
636
- border-radius: 50%;
637
- animation: spin 700ms linear infinite;
638
- }
639
-
640
- @media (max-width: 768px) {
641
- .hidden-mobile {
642
- display: none !important;
643
- }
644
- }
645
- @media (min-width: 769px) {
646
- .hidden-desktop {
647
- display: none !important;
648
- }
649
- }
650
- .profiler-flex {
651
- display: flex;
652
- align-items: center;
653
- }
654
- .profiler-flex--center {
655
- justify-content: center;
656
- }
657
- .profiler-flex--between {
658
- justify-content: space-between;
659
- }
660
- .profiler-flex--column {
661
- flex-direction: column;
662
- align-items: flex-start;
663
- }
664
- .profiler-flex--gap-1 {
665
- gap: var(--profiler-space-1);
666
- }
667
- .profiler-flex--gap-2 {
668
- gap: var(--profiler-space-2);
669
- }
670
- .profiler-flex--gap-3 {
671
- gap: var(--profiler-space-3);
672
- }
673
- .profiler-flex--gap-4 {
674
- gap: var(--profiler-space-4);
675
- }
676
- .profiler-flex--gap-6 {
677
- gap: var(--profiler-space-6);
678
- }
679
-
680
- .profiler-grid {
681
- display: grid;
682
- gap: var(--profiler-space-4);
683
- }
684
- .profiler-grid--2 {
685
- grid-template-columns: repeat(2, 1fr);
686
- }
687
- .profiler-grid--3 {
688
- grid-template-columns: repeat(3, 1fr);
689
- }
690
- .profiler-grid--auto {
691
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
692
- }
693
-
694
- .profiler-mt-1 {
695
- margin-top: var(--profiler-space-1);
696
- }
697
-
698
- .profiler-mt-2 {
699
- margin-top: var(--profiler-space-2);
700
- }
701
-
702
- .profiler-mt-3 {
703
- margin-top: var(--profiler-space-3);
704
- }
705
-
706
- .profiler-mt-4 {
707
- margin-top: var(--profiler-space-4);
708
- }
709
-
710
- .profiler-mt-6 {
711
- margin-top: var(--profiler-space-6);
712
- }
713
-
714
- .profiler-mt-8 {
715
- margin-top: var(--profiler-space-8);
716
- }
717
-
718
- .profiler-mb-1 {
719
- margin-bottom: var(--profiler-space-1);
720
- }
721
-
722
- .profiler-mb-2 {
723
- margin-bottom: var(--profiler-space-2);
724
- }
725
-
726
- .profiler-mb-3 {
727
- margin-bottom: var(--profiler-space-3);
728
- }
729
-
730
- .profiler-mb-4 {
731
- margin-bottom: var(--profiler-space-4);
732
- }
733
-
734
- .profiler-mb-6 {
735
- margin-bottom: var(--profiler-space-6);
736
- }
737
-
738
- .profiler-p-2 {
739
- padding: var(--profiler-space-2);
740
- }
741
-
742
- .profiler-p-3 {
743
- padding: var(--profiler-space-3);
744
- }
745
-
746
- .profiler-p-4 {
747
- padding: var(--profiler-space-4);
748
- }
749
-
750
- .profiler-p-6 {
751
- padding: var(--profiler-space-6);
752
- }
753
-
754
- .profiler-text--xs {
755
- font-size: var(--profiler-text-xs);
756
- }
757
- .profiler-text--sm {
758
- font-size: var(--profiler-text-sm);
759
- }
760
- .profiler-text--base {
761
- font-size: var(--profiler-text-base);
762
- }
763
- .profiler-text--lg {
764
- font-size: var(--profiler-text-lg);
765
- }
766
- .profiler-text--xl {
767
- font-size: var(--profiler-text-xl);
768
- }
769
- .profiler-text--2xl {
770
- font-size: var(--profiler-text-2xl);
771
- }
772
- .profiler-text--muted {
773
- color: var(--profiler-text-muted);
774
- }
775
- .profiler-text--subtle {
776
- color: var(--profiler-text-subtle);
777
- }
778
- .profiler-text--secondary {
779
- color: var(--profiler-text-secondary);
780
- }
781
- .profiler-text--success {
782
- color: var(--profiler-success);
783
- }
784
- .profiler-text--warning {
785
- color: var(--profiler-warning);
786
- }
787
- .profiler-text--error {
788
- color: var(--profiler-error);
789
- }
790
- .profiler-text--accent {
791
- color: var(--profiler-accent);
792
- }
793
- .profiler-text--uppercase {
794
- text-transform: uppercase;
795
- letter-spacing: 0.08em;
796
- }
797
- .profiler-text--mono {
798
- font-family: var(--profiler-font-mono);
799
- }
800
- .profiler-text--truncate {
801
- overflow: hidden;
802
- text-overflow: ellipsis;
803
- white-space: nowrap;
804
- }
805
- .profiler-text--break {
806
- word-break: break-all;
807
- }
808
-
809
- .profiler-panel {
810
- background: var(--profiler-bg-elevated);
811
- border: 1px solid var(--profiler-border);
812
- border-radius: var(--profiler-radius-md);
813
- padding: var(--profiler-space-4);
814
- }
815
- .profiler-panel--sm {
816
- padding: var(--profiler-space-3);
817
- }
818
- .profiler-panel--lg {
819
- padding: var(--profiler-space-6);
820
- }
821
-
822
- .profiler-stat-card {
823
- background: var(--profiler-bg-light);
824
- border: 1px solid var(--profiler-border);
825
- border-radius: var(--profiler-radius-md);
826
- padding: var(--profiler-space-4);
827
- transition: all var(--profiler-transition-base);
828
- }
829
- .profiler-stat-card:hover {
830
- border-color: var(--profiler-border-accent);
831
- box-shadow: var(--profiler-shadow-sm);
832
- transform: translateY(-2px);
833
- }
834
- .profiler-stat-card__label {
835
- font-size: var(--profiler-text-xs);
836
- text-transform: uppercase;
837
- letter-spacing: 0.1em;
838
- color: var(--profiler-text-muted);
839
- margin-bottom: var(--profiler-space-2);
840
- font-family: var(--profiler-font-mono);
841
- }
842
- .profiler-stat-card__value {
843
- font-size: var(--profiler-text-2xl);
844
- font-weight: 700;
845
- font-family: var(--profiler-font-mono);
846
- color: var(--profiler-accent);
847
- line-height: 1.1;
848
- }
849
- .profiler-stat-card__value small {
850
- font-size: var(--profiler-text-sm);
851
- color: var(--profiler-text-muted);
852
- font-weight: 500;
853
- margin-left: var(--profiler-space-1);
854
- }
855
-
856
- .profiler-kv-row {
857
- display: flex;
858
- justify-content: space-between;
859
- align-items: center;
860
- padding: var(--profiler-space-2) 0;
861
- border-bottom: 1px solid var(--profiler-border);
862
- gap: var(--profiler-space-4);
863
- }
864
- .profiler-kv-row:last-child {
865
- border-bottom: none;
866
- }
867
- .profiler-kv-row > span:first-child {
868
- color: var(--profiler-text-muted);
869
- font-size: var(--profiler-text-sm);
870
- flex-shrink: 0;
871
- }
872
- .profiler-kv-row > *:last-child {
873
- color: var(--profiler-text);
874
- font-weight: 600;
875
- font-family: var(--profiler-font-mono);
876
- font-size: var(--profiler-text-sm);
877
- text-align: right;
878
- }
879
-
880
- .profiler-query-card {
881
- background: var(--profiler-bg-light);
882
- border: 1px solid var(--profiler-border);
883
- border-radius: var(--profiler-radius-md);
884
- padding: var(--profiler-space-3);
885
- margin-bottom: var(--profiler-space-3);
886
- transition: all var(--profiler-transition-base);
887
- }
888
- .profiler-query-card:hover {
889
- border-color: var(--profiler-border-strong);
890
- transform: translateX(3px);
891
- box-shadow: var(--profiler-shadow-sm);
892
- }
893
- .profiler-query-card--slow {
894
- border-left: 3px solid var(--profiler-error);
895
- background: var(--profiler-error-bg);
896
- }
897
- .profiler-query-card--slow:hover {
898
- box-shadow: 0 0 16px var(--profiler-error-glow);
899
- }
900
- .profiler-query-card--success {
901
- border-left: 3px solid var(--profiler-success);
902
- }
903
- .profiler-query-card__header {
904
- display: flex;
905
- justify-content: space-between;
906
- align-items: center;
907
- margin-bottom: var(--profiler-space-2);
908
- gap: var(--profiler-space-3);
909
- }
910
- .profiler-query-card__duration {
911
- font-weight: 700;
912
- font-family: var(--profiler-font-mono);
913
- font-size: var(--profiler-text-sm);
914
- color: var(--profiler-accent);
915
- }
916
- .profiler-query-card__duration--slow {
917
- color: var(--profiler-error);
918
- }
919
- .profiler-query-card__duration--fast {
920
- color: var(--profiler-success);
921
- }
922
- .profiler-query-card__code {
923
- font-size: var(--profiler-text-sm);
924
- color: var(--profiler-info);
925
- font-family: var(--profiler-font-mono);
926
- overflow: hidden;
927
- text-overflow: ellipsis;
928
- white-space: nowrap;
929
- display: block;
930
- line-height: 1.5;
931
- }
932
-
933
- .profiler-query-card--n1 {
934
- border-left: 3px solid var(--profiler-warning);
935
- background: var(--profiler-warning-bg);
936
- }
937
-
938
- .profiler-n1-group {
939
- border: 1px solid var(--profiler-warning);
940
- border-radius: var(--profiler-radius-md);
941
- overflow: hidden;
942
- }
943
- .profiler-n1-group__header {
944
- display: flex;
945
- align-items: center;
946
- gap: var(--profiler-space-3);
947
- padding: var(--profiler-space-2) var(--profiler-space-3);
948
- background: var(--profiler-warning-bg);
949
- cursor: pointer;
950
- user-select: none;
951
- }
952
- .profiler-n1-group__header:hover {
953
- filter: brightness(0.97);
954
- }
955
- .profiler-n1-group__count {
956
- font-size: var(--profiler-text-xs);
957
- font-weight: 700;
958
- font-family: var(--profiler-font-mono);
959
- color: var(--profiler-warning);
960
- white-space: nowrap;
961
- }
962
- .profiler-n1-group__pattern {
963
- flex: 1;
964
- font-size: var(--profiler-text-xs);
965
- font-family: var(--profiler-font-mono);
966
- color: var(--profiler-text);
967
- overflow: hidden;
968
- text-overflow: ellipsis;
969
- white-space: nowrap;
970
- }
971
- .profiler-n1-group__toggle {
972
- font-size: var(--profiler-text-xs);
973
- color: var(--profiler-text-muted);
974
- white-space: nowrap;
975
- }
976
-
977
- .profiler-n1-backtrace {
978
- background: var(--profiler-bg-lighter);
979
- border-top: 1px solid var(--profiler-border);
980
- padding: var(--profiler-space-2) var(--profiler-space-3);
981
- }
982
- .profiler-n1-backtrace__frame {
983
- font-size: var(--profiler-text-xs);
984
- font-family: var(--profiler-font-mono);
985
- color: var(--profiler-text-muted);
986
- line-height: 1.8;
987
- overflow: hidden;
988
- text-overflow: ellipsis;
989
- white-space: nowrap;
990
- }
991
-
992
- .profiler-alert-banner {
993
- display: flex;
994
- align-items: flex-start;
995
- gap: var(--profiler-space-3);
996
- padding: var(--profiler-space-3) var(--profiler-space-4);
997
- border-radius: var(--profiler-radius-md);
998
- border: 1px solid;
999
- font-size: var(--profiler-text-sm);
1000
- }
1001
- .profiler-alert-banner--warning {
1002
- background: var(--profiler-warning-bg);
1003
- border-color: var(--profiler-warning);
1004
- color: var(--profiler-text);
1005
- }
1006
- .profiler-alert-banner--error {
1007
- background: var(--profiler-error-bg);
1008
- border-color: var(--profiler-error);
1009
- }
1010
- .profiler-alert-banner__icon {
1011
- flex-shrink: 0;
1012
- font-size: var(--profiler-text-base);
1013
- }
1014
-
1015
- .profiler-badge {
1016
- display: inline-block;
1017
- padding: 1px 6px;
1018
- border-radius: var(--profiler-radius-sm);
1019
- font-size: var(--profiler-text-xs);
1020
- font-weight: 600;
1021
- font-family: var(--profiler-font-mono);
1022
- line-height: 1.6;
1023
- }
1024
- .profiler-badge--warning {
1025
- background: var(--profiler-warning-bg);
1026
- color: var(--profiler-warning);
1027
- border: 1px solid rgba(251, 146, 60, 0.3);
1028
- }
1029
- .profiler-badge--error {
1030
- background: var(--profiler-error-bg);
1031
- color: var(--profiler-error);
1032
- }
1033
-
1034
- .profiler-btn {
1035
- display: inline-flex;
1036
- align-items: center;
1037
- gap: var(--profiler-space-1);
1038
- border: 1px solid var(--profiler-border);
1039
- border-radius: var(--profiler-radius-sm);
1040
- background: var(--profiler-bg-elevated);
1041
- color: var(--profiler-text-muted);
1042
- font-size: var(--profiler-text-sm);
1043
- font-family: var(--profiler-font-mono);
1044
- cursor: pointer;
1045
- transition: all var(--profiler-transition-base);
1046
- }
1047
- .profiler-btn:hover {
1048
- border-color: var(--profiler-accent);
1049
- color: var(--profiler-accent);
1050
- }
1051
- .profiler-btn--sm {
1052
- padding: 1px 8px;
1053
- font-size: var(--profiler-text-xs);
1054
- }
1055
-
1056
- .profiler-modal__overlay {
1057
- position: fixed;
1058
- inset: 0;
1059
- background: rgba(0, 0, 0, 0.6);
1060
- z-index: 9000;
1061
- display: flex;
1062
- align-items: center;
1063
- justify-content: center;
1064
- padding: var(--profiler-space-4);
1065
- }
1066
-
1067
- .profiler-modal {
1068
- background: var(--profiler-bg-elevated);
1069
- border: 1px solid var(--profiler-border);
1070
- border-radius: var(--profiler-radius-lg, var(--profiler-radius-md));
1071
- box-shadow: var(--profiler-shadow-lg, var(--profiler-shadow-sm));
1072
- width: 100%;
1073
- max-width: 760px;
1074
- max-height: 80vh;
1075
- display: flex;
1076
- flex-direction: column;
1077
- overflow: hidden;
1078
- }
1079
- .profiler-modal__header {
1080
- display: flex;
1081
- align-items: center;
1082
- gap: var(--profiler-space-3);
1083
- padding: var(--profiler-space-3) var(--profiler-space-4);
1084
- border-bottom: 1px solid var(--profiler-border);
1085
- background: var(--profiler-bg-light);
1086
- flex-shrink: 0;
1087
- }
1088
- .profiler-modal__title {
1089
- font-weight: 600;
1090
- font-family: var(--profiler-font-mono);
1091
- font-size: var(--profiler-text-sm);
1092
- flex: 1;
1093
- }
1094
- .profiler-modal__close {
1095
- background: none;
1096
- border: none;
1097
- color: var(--profiler-text-muted);
1098
- font-size: var(--profiler-text-lg);
1099
- cursor: pointer;
1100
- padding: 0 var(--profiler-space-1);
1101
- line-height: 1;
1102
- }
1103
- .profiler-modal__close:hover {
1104
- color: var(--profiler-text);
1105
- }
1106
- .profiler-modal__body {
1107
- padding: var(--profiler-space-4);
1108
- overflow-y: auto;
1109
- flex: 1;
1110
- }
1111
-
1112
- .profiler-explain-result {
1113
- font-family: var(--profiler-font-mono);
1114
- font-size: var(--profiler-text-xs);
1115
- color: var(--profiler-text);
1116
- white-space: pre-wrap;
1117
- word-break: break-all;
1118
- line-height: 1.6;
1119
- margin: 0;
1120
- }
1121
-
1122
- .profiler-explain-node {
1123
- padding: var(--profiler-space-1) var(--profiler-space-2);
1124
- margin-bottom: 2px;
1125
- border-radius: var(--profiler-radius-sm);
1126
- font-family: var(--profiler-font-mono);
1127
- font-size: var(--profiler-text-xs);
1128
- }
1129
- .profiler-explain-node--expensive {
1130
- background: var(--profiler-error-bg);
1131
- border-left: 2px solid var(--profiler-error);
1132
- }
1133
- .profiler-explain-node__type {
1134
- font-weight: 600;
1135
- color: var(--profiler-accent);
1136
- }
1137
- .profiler-explain-node__stats {
1138
- display: flex;
1139
- gap: var(--profiler-space-3);
1140
- margin-top: 1px;
1141
- flex-wrap: wrap;
1142
- }
1143
-
1144
- .profiler-dump-card {
1145
- background: var(--profiler-bg-light);
1146
- border: 1px solid var(--profiler-border);
1147
- border-left: 3px solid var(--profiler-warning);
1148
- border-radius: var(--profiler-radius-md);
1149
- padding: var(--profiler-space-4);
1150
- margin-bottom: var(--profiler-space-4);
1151
- }
1152
- .profiler-dump-card__header {
1153
- display: flex;
1154
- justify-content: space-between;
1155
- align-items: flex-start;
1156
- margin-bottom: var(--profiler-space-3);
1157
- }
1158
- .profiler-dump-card__label {
1159
- display: inline-block;
1160
- background: var(--profiler-warning-bg);
1161
- color: var(--profiler-warning);
1162
- border: 1px solid rgba(251, 146, 60, 0.3);
1163
- padding: 2px 8px;
1164
- border-radius: var(--profiler-radius-sm);
1165
- font-size: var(--profiler-text-xs);
1166
- font-weight: 600;
1167
- font-family: var(--profiler-font-mono);
1168
- margin-left: var(--profiler-space-2);
1169
- }
1170
- .profiler-dump-card__location {
1171
- font-size: var(--profiler-text-xs);
1172
- color: var(--profiler-info);
1173
- font-family: var(--profiler-font-mono);
1174
- text-align: right;
1175
- }
1176
- .profiler-dump-card__content {
1177
- background: var(--profiler-bg-lighter);
1178
- border: 1px solid var(--profiler-border);
1179
- border-radius: var(--profiler-radius-sm);
1180
- padding: var(--profiler-space-3);
1181
- overflow-x: auto;
1182
- }
1183
- .profiler-dump-card__content pre {
1184
- color: var(--profiler-warning);
1185
- margin: 0;
1186
- font-size: var(--profiler-text-sm);
1187
- line-height: 1.6;
1188
- background: none;
1189
- border: none;
1190
- padding: 0;
1191
- }
1192
-
1193
- .profiler-ajax-card {
1194
- background: var(--profiler-bg-light);
1195
- border: 1px solid var(--profiler-border);
1196
- border-left: 3px solid;
1197
- border-radius: var(--profiler-radius-md);
1198
- padding: var(--profiler-space-3);
1199
- margin-bottom: var(--profiler-space-2);
1200
- transition: all var(--profiler-transition-base);
1201
- }
1202
- .profiler-ajax-card--success {
1203
- border-left-color: var(--profiler-success);
1204
- }
1205
- .profiler-ajax-card--error {
1206
- border-left-color: var(--profiler-error);
1207
- }
1208
- .profiler-ajax-card:hover {
1209
- background: var(--profiler-bg-elevated);
1210
- transform: translateX(3px);
1211
- box-shadow: var(--profiler-shadow-sm);
1212
- }
1213
- .profiler-ajax-card__row {
1214
- display: flex;
1215
- justify-content: space-between;
1216
- align-items: center;
1217
- gap: var(--profiler-space-3);
1218
- }
1219
- .profiler-ajax-card__row + .profiler-ajax-card__row {
1220
- margin-top: var(--profiler-space-2);
1221
- }
1222
- .profiler-ajax-card__path {
1223
- color: var(--profiler-text-secondary);
1224
- font-size: var(--profiler-text-sm);
1225
- font-family: var(--profiler-font-mono);
1226
- overflow: hidden;
1227
- text-overflow: ellipsis;
1228
- white-space: nowrap;
1229
- flex: 1;
1230
- }
1231
- .profiler-ajax-card__time {
1232
- font-size: var(--profiler-text-xs);
1233
- color: var(--profiler-text-muted);
1234
- font-family: var(--profiler-font-mono);
1235
- }
1236
-
1237
- .profiler-empty {
1238
- display: flex;
1239
- flex-direction: column;
1240
- align-items: center;
1241
- padding: var(--profiler-space-12) var(--profiler-space-6);
1242
- text-align: center;
1243
- color: var(--profiler-text-muted);
1244
- }
1245
- .profiler-empty__icon {
1246
- font-size: 52px;
1247
- margin-bottom: var(--profiler-space-4);
1248
- opacity: 0.4;
1249
- filter: grayscale(1);
1250
- }
1251
- .profiler-empty__title {
1252
- font-size: var(--profiler-text-lg);
1253
- font-weight: 600;
1254
- color: var(--profiler-text);
1255
- margin-bottom: var(--profiler-space-3);
1256
- }
1257
- .profiler-empty__description {
1258
- font-size: var(--profiler-text-base);
1259
- line-height: 1.7;
1260
- max-width: 420px;
1261
- color: var(--profiler-text-muted);
1262
- }
1263
- .profiler-empty__description code {
1264
- background: var(--profiler-accent-bg);
1265
- color: var(--profiler-accent);
1266
- border: 1px solid var(--profiler-border-accent);
1267
- }
1268
-
1269
- .profiler-divider {
1270
- border: none;
1271
- border-top: 1px solid var(--profiler-border);
1272
- margin: var(--profiler-space-4) 0;
1273
- }
1274
- .profiler-divider--strong {
1275
- border-top-color: var(--profiler-border-strong);
1276
- }
1277
- .profiler-divider--sm {
1278
- margin: var(--profiler-space-2) 0;
1279
- }
1280
- .profiler-divider--lg {
1281
- margin: var(--profiler-space-6) 0;
1282
- }
1283
-
1284
- .profiler-more {
1285
- text-align: center;
1286
- padding: var(--profiler-space-3) var(--profiler-space-4);
1287
- color: var(--profiler-text-muted);
1288
- font-size: var(--profiler-text-xs);
1289
- font-family: var(--profiler-font-mono);
1290
- letter-spacing: 0.05em;
1291
- border-top: 1px dashed var(--profiler-border);
1292
- margin-top: var(--profiler-space-2);
1293
- }
1294
-
1295
- .profiler-float-right {
1296
- float: right;
1297
- }
1298
-
1299
- .profiler-float-left {
1300
- float: left;
1301
- }
1302
-
1303
- .profiler-clearfix::after {
1304
- content: "";
1305
- display: table;
1306
- clear: both;
1307
- }
1308
-
1309
- .profiler-code {
1310
- background: var(--profiler-bg-light);
1311
- border: 1px solid var(--profiler-border);
1312
- border-radius: var(--profiler-radius-md);
1313
- font-family: var(--profiler-font-mono);
1314
- font-size: var(--profiler-text-xs);
1315
- color: var(--profiler-text);
1316
- padding: var(--profiler-space-3);
1317
- margin: 0;
1318
- white-space: pre-wrap;
1319
- word-break: break-all;
1320
- overflow-x: auto;
1321
- line-height: 1.6;
1322
- }
1323
-
1324
- .profiler-body-csv {
1325
- width: 100%;
1326
- border-collapse: collapse;
1327
- font-size: var(--profiler-text-xs);
1328
- font-family: var(--profiler-font-mono);
1329
- }
1330
- .profiler-body-csv th {
1331
- background: var(--profiler-bg-elevated);
1332
- color: var(--profiler-text-muted);
1333
- font-weight: 600;
1334
- text-align: left;
1335
- padding: 4px 8px;
1336
- border: 1px solid var(--profiler-border);
1337
- white-space: nowrap;
1338
- }
1339
- .profiler-body-csv td {
1340
- padding: 3px 8px;
1341
- border: 1px solid var(--profiler-border);
1342
- color: var(--profiler-text);
1343
- word-break: break-all;
1344
- }
1345
- .profiler-body-csv tbody tr:nth-child(even) {
1346
- background: var(--profiler-bg-elevated);
1347
- }
1348
-
1349
- .profiler-body-binary {
1350
- display: flex;
1351
- flex-direction: column;
1352
- gap: var(--profiler-space-2);
1353
- padding: var(--profiler-space-3);
1354
- background: var(--profiler-bg-elevated);
1355
- border: 1px solid var(--profiler-border);
1356
- border-radius: var(--profiler-radius-md);
1357
- }
1358
-
1359
- .profiler-body-preview-frame {
1360
- width: 100%;
1361
- height: 400px;
1362
- border: 1px solid var(--profiler-border);
1363
- border-radius: var(--profiler-radius-sm);
1364
- }
1365
-
1366
- .profiler-body-download-btn {
1367
- display: inline-flex;
1368
- align-items: center;
1369
- gap: var(--profiler-space-1);
1370
- padding: 4px 10px;
1371
- background: var(--profiler-accent-bg);
1372
- color: var(--profiler-accent);
1373
- border: 1px solid var(--profiler-border-accent);
1374
- border-radius: var(--profiler-radius-sm);
1375
- text-decoration: none;
1376
- font-family: var(--profiler-font-mono);
1377
- transition: all var(--profiler-transition-base);
1378
- }
1379
- .profiler-body-download-btn:hover {
1380
- background: var(--profiler-accent);
1381
- color: #fff;
1382
- }
1383
-
1384
- .profiler-flex-table {
1385
- display: flex;
1386
- flex-direction: column;
1387
- }
1388
- .profiler-flex-table__header {
1389
- display: flex;
1390
- align-items: center;
1391
- gap: var(--profiler-space-3);
1392
- padding: var(--profiler-space-2) var(--profiler-space-3);
1393
- background: var(--profiler-bg-light);
1394
- border-bottom: 1px solid var(--profiler-border-strong);
1395
- font-weight: 600;
1396
- font-size: var(--profiler-text-xs);
1397
- text-transform: uppercase;
1398
- letter-spacing: 0.08em;
1399
- color: var(--profiler-text-muted);
1400
- }
1401
- .profiler-flex-table__row {
1402
- display: flex;
1403
- align-items: center;
1404
- gap: var(--profiler-space-3);
1405
- padding: var(--profiler-space-3);
1406
- border-bottom: 1px solid var(--profiler-border);
1407
- color: var(--profiler-text);
1408
- }
1409
- .profiler-flex-table__row--matched {
1410
- background: var(--profiler-success-bg);
1411
- border-left: 2px solid var(--profiler-success);
1412
- }
1413
- .profiler-flex-table__cell {
1414
- flex: 1;
1415
- min-width: 0;
1416
- overflow: hidden;
1417
- text-overflow: ellipsis;
1418
- white-space: nowrap;
1419
- }
1420
- .profiler-flex-table__cell--fixed {
1421
- flex: 0 0 auto;
1422
- }
1423
- .profiler-flex-table__cell--muted {
1424
- color: var(--profiler-text-muted);
1425
- }
1426
-
1427
- @keyframes pfPop {
1428
- 0% {
1429
- transform: scaleX(1);
1430
- }
1431
- 15% {
1432
- transform: scaleX(1.18);
1433
- }
1434
- 40% {
1435
- transform: scaleX(0.87);
1436
- }
1437
- 65% {
1438
- transform: scaleX(1.08);
1439
- }
1440
- 85% {
1441
- transform: scaleX(0.97);
1442
- }
1443
- 100% {
1444
- transform: scaleX(1);
1445
- }
1446
- }
1447
- #profiler-toolbar {
1448
- position: fixed;
1449
- bottom: 0;
1450
- left: 0;
1451
- right: 0;
1452
- height: 44px;
1453
- background: var(--profiler-glass-bg);
1454
- backdrop-filter: var(--profiler-blur);
1455
- -webkit-backdrop-filter: var(--profiler-blur);
1456
- border-top: 1px solid var(--profiler-border-strong);
1457
- z-index: var(--profiler-z-toolbar);
1458
- font-family: var(--profiler-font-mono);
1459
- font-size: 11px;
1460
- animation: toolbarIn 300ms cubic-bezier(0.4, 0, 0.2, 1) both;
1461
- transition: left 280ms cubic-bezier(0.4, 0, 0.2, 1);
1462
- }
1463
- #profiler-toolbar::before {
1464
- content: "";
1465
- position: absolute;
1466
- top: -1px;
1467
- left: 0;
1468
- right: 0;
1469
- height: 1px;
1470
- background: linear-gradient(90deg, transparent 0%, var(--profiler-accent) 15%, var(--profiler-accent-hover) 50%, var(--profiler-accent) 85%, transparent 100%);
1471
- opacity: 0.65;
1472
- }
1473
- @keyframes toolbarIn {
1474
- from {
1475
- transform: translateY(100%);
1476
- opacity: 0;
1477
- }
1478
- to {
1479
- transform: translateY(0);
1480
- opacity: 1;
1481
- }
1482
- }
1483
-
1484
- .profiler-toolbar-container {
1485
- display: flex;
1486
- align-items: stretch;
1487
- height: 100%;
1488
- }
1489
-
1490
- .profiler-toolbar-item {
1491
- position: relative;
1492
- display: inline-flex;
1493
- align-items: center;
1494
- gap: 5px;
1495
- padding: 0 16px;
1496
- color: var(--profiler-text-muted);
1497
- text-decoration: none;
1498
- white-space: nowrap;
1499
- font-weight: 500;
1500
- letter-spacing: 0.01em;
1501
- cursor: default;
1502
- background: transparent;
1503
- border: none;
1504
- border-right: 1px solid var(--profiler-border);
1505
- transition: color var(--profiler-transition-fast), background var(--profiler-transition-fast);
1506
- }
1507
- .profiler-toolbar-item::after {
1508
- content: "";
1509
- position: absolute;
1510
- bottom: 0;
1511
- left: 0;
1512
- right: 0;
1513
- height: 2px;
1514
- background: var(--profiler-accent);
1515
- transform: scaleX(0);
1516
- transform-origin: left;
1517
- transition: transform 280ms cubic-bezier(0.34, 1.4, 0.64, 1);
1518
- }
1519
- .profiler-toolbar-item:last-child {
1520
- border-right: none;
1521
- }
1522
- .profiler-toolbar-item:hover {
1523
- color: var(--profiler-text);
1524
- background: var(--profiler-accent-bg);
1525
- }
1526
- .profiler-toolbar-item:hover::after {
1527
- transform: scaleX(1);
1528
- }
1529
-
1530
- .profiler-toolbar-collapse-btn {
1531
- margin-left: auto;
1532
- padding: 0 14px;
1533
- border-left: 1px solid var(--profiler-border);
1534
- font-size: 10px;
1535
- color: var(--profiler-text-muted);
1536
- cursor: pointer;
1537
- }
1538
- .profiler-toolbar-collapse-btn:hover {
1539
- color: var(--profiler-text);
1540
- background: var(--profiler-accent-bg);
1541
- animation: pfPop 380ms ease-out both;
1542
- }
1543
-
1544
- a.profiler-toolbar-item {
1545
- cursor: pointer;
1546
- font-family: var(--profiler-font-mono);
1547
- font-size: 11px;
1548
- }
1549
-
1550
- .profiler-toolbar-logo {
1551
- border-right: 1px solid var(--profiler-border) !important;
1552
- }
1553
-
1554
- .profiler-text--success {
1555
- color: var(--profiler-success) !important;
1556
- }
1557
-
1558
- .profiler-text--warning {
1559
- color: var(--profiler-warning) !important;
1560
- }
1561
-
1562
- .profiler-text--error {
1563
- color: var(--profiler-error) !important;
1564
- }
1565
-
1566
- .profiler-text--info {
1567
- color: var(--profiler-info) !important;
1568
- }
1569
-
1570
- .profiler-text--muted {
1571
- color: var(--profiler-text-muted) !important;
1572
- }
1573
-
1574
- .profiler-text--accent {
1575
- color: var(--profiler-accent) !important;
1576
- }
1577
-
1578
- .profiler-toolbar-item.profiler-text--error::after {
1579
- background: var(--profiler-error);
1580
- }
1581
-
1582
- .profiler-toolbar-item.profiler-text--warning::after {
1583
- background: var(--profiler-warning);
1584
- }
1585
-
1586
- .profiler-toolbar-item.profiler-text--success::after {
1587
- background: var(--profiler-success);
1588
- }
1589
-
1590
- .profiler-toolbar-item.profiler-text--info::after {
1591
- background: var(--profiler-info);
1592
- }
1593
-
1594
- .profiler-toolbar-hoverable {
1595
- position: relative;
1596
- }
1597
- .profiler-toolbar-hoverable .profiler-toolbar-panel {
1598
- position: absolute;
1599
- bottom: calc(100% + 12px);
1600
- left: 50%;
1601
- transform: translateX(-50%);
1602
- min-width: 320px;
1603
- max-width: 440px;
1604
- background: var(--profiler-bg-elevated);
1605
- border: 1px solid var(--profiler-border-strong);
1606
- border-radius: var(--profiler-radius-lg);
1607
- box-shadow: var(--profiler-shadow-xl), 0 0 0 1px var(--profiler-border-accent);
1608
- z-index: var(--profiler-z-panel);
1609
- overflow: hidden;
1610
- opacity: 0;
1611
- visibility: hidden;
1612
- pointer-events: none;
1613
- transition: opacity 160ms cubic-bezier(0.4, 0, 0.2, 1), visibility 0s linear 160ms;
1614
- }
1615
- .profiler-toolbar-hoverable .profiler-toolbar-panel.is-visible {
1616
- opacity: 1;
1617
- visibility: visible;
1618
- pointer-events: auto;
1619
- transition: opacity 160ms cubic-bezier(0.4, 0, 0.2, 1), visibility 0s;
1620
- }
1621
- .profiler-toolbar-hoverable .profiler-toolbar-panel::before {
1622
- content: "";
1623
- position: absolute;
1624
- top: 0;
1625
- left: 0;
1626
- right: 0;
1627
- height: 2px;
1628
- background: linear-gradient(90deg, var(--profiler-accent) 0%, var(--profiler-accent-hover) 100%);
1629
- }
1630
- .profiler-toolbar-hoverable .profiler-toolbar-panel::after {
1631
- content: "";
1632
- position: absolute;
1633
- top: 100%;
1634
- left: 50%;
1635
- transform: translateX(-50%);
1636
- border: 6px solid transparent;
1637
- border-top-color: var(--profiler-border-strong);
1638
- }
1639
- .profiler-toolbar-hoverable .profiler-toolbar-panel.profiler-toolbar-panel-large {
1640
- min-width: 440px;
1641
- max-width: 580px;
1642
- }
1643
-
1644
- .profiler-toolbar-panel-header {
1645
- display: flex;
1646
- align-items: center;
1647
- justify-content: space-between;
1648
- padding: 11px 16px 9px;
1649
- font-size: 10px;
1650
- font-weight: 700;
1651
- letter-spacing: 0.12em;
1652
- text-transform: uppercase;
1653
- color: var(--profiler-accent);
1654
- background: var(--profiler-accent-bg);
1655
- border-bottom: 1px solid var(--profiler-border);
1656
- font-family: var(--profiler-font-mono);
1657
- }
1658
-
1659
- .profiler-float-right {
1660
- color: var(--profiler-text-muted);
1661
- font-weight: 400;
1662
- text-transform: none;
1663
- letter-spacing: 0;
1664
- font-size: 10px;
1665
- font-family: var(--profiler-font-mono);
1666
- }
1667
-
1668
- .profiler-toolbar-panel-content {
1669
- padding: 10px 16px 14px;
1670
- max-height: 420px;
1671
- overflow-y: auto;
1672
- font-size: 11px;
1673
- font-family: var(--profiler-font-mono);
1674
- scrollbar-width: thin;
1675
- scrollbar-color: var(--profiler-border-strong) transparent;
1676
- }
1677
- .profiler-toolbar-panel-content::-webkit-scrollbar {
1678
- width: 4px;
1679
- }
1680
- .profiler-toolbar-panel-content::-webkit-scrollbar-thumb {
1681
- background: var(--profiler-border-strong);
1682
- border-radius: var(--profiler-radius-full);
1683
- }
1684
-
1685
- .profiler-toolbar-panel-row {
1686
- display: flex;
1687
- justify-content: space-between;
1688
- align-items: baseline;
1689
- padding: 6px 0;
1690
- border-bottom: 1px solid var(--profiler-border);
1691
- gap: 12px;
1692
- }
1693
- .profiler-toolbar-panel-row:last-child {
1694
- border-bottom: none;
1695
- }
1696
- .profiler-toolbar-panel-row span {
1697
- color: var(--profiler-text-muted);
1698
- font-size: 10px;
1699
- flex-shrink: 0;
1700
- }
1701
- .profiler-toolbar-panel-row strong {
1702
- color: var(--profiler-text);
1703
- font-weight: 600;
1704
- text-align: right;
1705
- font-variant-numeric: tabular-nums;
1706
- word-break: break-all;
1707
- }
1708
-
1709
- .profiler-section__header {
1710
- font-size: 10px;
1711
- font-weight: 700;
1712
- letter-spacing: 0.1em;
1713
- text-transform: uppercase;
1714
- color: var(--profiler-accent);
1715
- padding: 10px 0 4px;
1716
- border-bottom: 1px solid var(--profiler-border-accent);
1717
- margin-bottom: 6px;
1718
- font-family: var(--profiler-font-mono);
1719
- }
1720
- .profiler-section__header:first-child {
1721
- padding-top: 4px;
1722
- }
1723
-
1724
- .profiler-toolbar-panel-query {
1725
- padding: 9px 10px;
1726
- background: var(--profiler-bg-lighter);
1727
- border: 1px solid var(--profiler-border);
1728
- border-radius: var(--profiler-radius-sm);
1729
- margin-bottom: 6px;
1730
- transition: all var(--profiler-transition-fast);
1731
- }
1732
- .profiler-toolbar-panel-query:last-child {
1733
- margin-bottom: 0;
1734
- }
1735
- .profiler-toolbar-panel-query:hover {
1736
- border-color: var(--profiler-border-strong);
1737
- transform: translateX(2px);
1738
- }
1739
- .profiler-toolbar-panel-query.profiler-toolbar-panel-query-slow {
1740
- border-left: 2px solid var(--profiler-error);
1741
- background: var(--profiler-error-bg);
1742
- }
1743
- .profiler-toolbar-panel-query code {
1744
- display: block;
1745
- overflow: hidden;
1746
- text-overflow: ellipsis;
1747
- white-space: nowrap;
1748
- color: var(--profiler-info);
1749
- font-size: 10px;
1750
- line-height: 1.5;
1751
- margin-top: 4px;
1752
- }
1753
-
1754
- .profiler-more {
1755
- text-align: center;
1756
- padding: 8px;
1757
- color: var(--profiler-text-muted);
1758
- font-size: 10px;
1759
- letter-spacing: 0.05em;
1760
- border-top: 1px dashed var(--profiler-border);
1761
- margin-top: 6px;
1762
- }
1763
-
1764
- #profiler-toolbar[data-collapsed=true] .profiler-toolbar-item:not(.profiler-toolbar-collapse-btn) {
1765
- display: none;
1766
- }
1767
- #profiler-toolbar[data-collapsed=true] .profiler-toolbar-collapse-btn {
1768
- margin-left: 0;
1769
- }
1770
- #profiler-toolbar[data-collapsed=true]::before {
1771
- opacity: 0;
1772
- }
1773
-
1774
- .container > table {
1775
- width: 100%;
1776
- border-collapse: collapse;
1777
- background: var(--profiler-bg-light);
1778
- border: 1px solid var(--profiler-border);
1779
- border-radius: var(--profiler-radius-lg);
1780
- overflow: hidden;
1781
- box-shadow: var(--profiler-shadow-md);
1782
- }
1783
- .container > table thead {
1784
- background: var(--profiler-accent-bg);
1785
- border-bottom: 1px solid var(--profiler-border-accent);
1786
- }
1787
- .container > table thead th {
1788
- font-weight: 600;
1789
- font-size: var(--profiler-text-xs);
1790
- letter-spacing: 0.1em;
1791
- text-transform: uppercase;
1792
- color: var(--profiler-accent);
1793
- padding: 14px 20px;
1794
- border-bottom: none;
1795
- background: transparent;
1796
- }
1797
- .container > table tbody td {
1798
- padding: 14px 20px;
1799
- font-size: var(--profiler-text-base);
1800
- color: var(--profiler-text-secondary);
1801
- border-bottom: 1px solid var(--profiler-border);
1802
- vertical-align: middle;
1803
- }
1804
- .container > table tbody tr:last-child td {
1805
- border-bottom: none;
1806
- }
1807
- .container > table tbody tr:hover td {
1808
- background: var(--profiler-accent-bg);
1809
- color: var(--profiler-text);
1810
- }
1811
- .container > table tbody tr:hover td:first-child {
1812
- border-left: 2px solid var(--profiler-accent);
1813
- padding-left: 18px;
1814
- }
1815
- .container > table a {
1816
- font-family: var(--profiler-font-mono);
1817
- font-size: var(--profiler-text-sm);
1818
- color: var(--profiler-accent);
1819
- }
1820
- .container > table a:hover {
1821
- color: var(--profiler-accent-hover);
1822
- }
1823
-
1824
- .tabs {
1825
- display: flex;
1826
- align-items: center;
1827
- border-bottom: 1px solid var(--profiler-border);
1828
- margin-bottom: var(--profiler-space-6);
1829
- gap: 2px;
1830
- overflow-x: auto;
1831
- scrollbar-width: none;
1832
- }
1833
- .tabs::-webkit-scrollbar {
1834
- display: none;
1835
- }
1836
-
1837
- .btn-refresh {
1838
- flex-shrink: 0;
1839
- background: none;
1840
- border: none;
1841
- cursor: pointer;
1842
- color: var(--profiler-text-muted);
1843
- font-size: 1.1rem;
1844
- line-height: 1;
1845
- padding: 4px 8px;
1846
- border-radius: var(--profiler-radius-sm);
1847
- transition: color var(--profiler-transition-base), background var(--profiler-transition-base);
1848
- margin-bottom: -1px;
1849
- }
1850
- .btn-refresh:hover:not(:disabled) {
1851
- color: var(--profiler-accent);
1852
- background: var(--profiler-accent-bg);
1853
- }
1854
- .btn-refresh:disabled {
1855
- cursor: not-allowed;
1856
- }
1857
- .btn-refresh--spinning {
1858
- animation: profiler-spin 0.7s linear infinite;
1859
- }
1860
-
1861
- @keyframes profiler-spin {
1862
- to {
1863
- transform: rotate(360deg);
1864
- }
1865
- }
1866
- .tab {
1867
- position: relative;
1868
- display: flex;
1869
- align-items: center;
1870
- gap: 6px;
1871
- padding: 12px 18px;
1872
- color: var(--profiler-text-muted);
1873
- text-decoration: none;
1874
- font-size: var(--profiler-text-base);
1875
- font-weight: 500;
1876
- white-space: nowrap;
1877
- border-bottom: 2px solid transparent;
1878
- transition: color var(--profiler-transition-fast), border-color var(--profiler-transition-fast);
1879
- font-family: var(--profiler-font-sans);
1880
- cursor: pointer;
1881
- background: none;
1882
- border-top: none;
1883
- border-left: none;
1884
- border-right: none;
1885
- }
1886
- .tab:hover {
1887
- color: var(--profiler-text);
1888
- background: var(--profiler-accent-bg);
1889
- }
1890
- .tab.active {
1891
- color: var(--profiler-accent);
1892
- border-bottom-color: var(--profiler-accent);
1893
- font-weight: 600;
1894
- }
1895
- .tab .tab-icon {
1896
- font-size: 14px;
1897
- line-height: 1;
1898
- }
1899
-
1900
- .tab-content {
1901
- display: none;
1902
- }
1903
- .tab-content.active {
1904
- display: block;
1905
- }
1906
- .tab-content h2 {
1907
- font-size: var(--profiler-text-xl);
1908
- font-weight: 700;
1909
- color: var(--profiler-text);
1910
- margin-bottom: var(--profiler-space-4);
1911
- letter-spacing: -0.02em;
1912
- }
1913
- .tab-content h3 {
1914
- font-size: var(--profiler-text-lg);
1915
- font-weight: 600;
1916
- color: var(--profiler-text);
1917
- margin-bottom: var(--profiler-space-3);
1918
- }
1919
- .tab-content table {
1920
- width: 100%;
1921
- border-collapse: collapse;
1922
- background: var(--profiler-bg-light);
1923
- border: 1px solid var(--profiler-border);
1924
- border-radius: var(--profiler-radius-md);
1925
- overflow: hidden;
1926
- }
1927
- .tab-content table th {
1928
- width: 180px;
1929
- text-align: left;
1930
- padding: 12px 16px;
1931
- font-size: var(--profiler-text-xs);
1932
- font-weight: 600;
1933
- letter-spacing: 0.08em;
1934
- text-transform: uppercase;
1935
- color: var(--profiler-accent);
1936
- background: var(--profiler-accent-bg);
1937
- border-bottom: 1px solid var(--profiler-border);
1938
- border-right: 1px solid var(--profiler-border);
1939
- vertical-align: top;
1940
- }
1941
- .tab-content table td {
1942
- padding: 12px 16px;
1943
- font-size: var(--profiler-text-base);
1944
- color: var(--profiler-text);
1945
- border-bottom: 1px solid var(--profiler-border);
1946
- vertical-align: top;
1947
- }
1948
- .tab-content table tr:last-child th,
1949
- .tab-content table tr:last-child td {
1950
- border-bottom: none;
1951
- }
1952
- .tab-content table pre {
1953
- margin: 0;
1954
- font-size: var(--profiler-text-sm);
1955
- }
1956
-
1957
- .profiler-panel {
1958
- background: var(--profiler-bg-elevated);
1959
- border: 1px solid var(--profiler-border);
1960
- border-radius: var(--profiler-radius-lg);
1961
- overflow: hidden;
1962
- box-shadow: var(--profiler-shadow-md);
1963
- }
1964
- .profiler-panel--sm {
1965
- padding: var(--profiler-space-3);
1966
- border-radius: var(--profiler-radius-md);
1967
- }
1968
-
1969
- .profiler-section__header {
1970
- font-size: var(--profiler-text-xs);
1971
- font-weight: 600;
1972
- letter-spacing: 0.1em;
1973
- text-transform: uppercase;
1974
- color: var(--profiler-accent);
1975
- padding-bottom: var(--profiler-space-2);
1976
- margin-bottom: var(--profiler-space-4);
1977
- border-bottom: 1px solid var(--profiler-border-accent);
1978
- font-family: var(--profiler-font-mono);
1979
- }
1980
-
1981
- .profiler-action-bar {
1982
- display: flex;
1983
- align-items: center;
1984
- justify-content: space-between;
1985
- gap: var(--profiler-space-2);
1986
- flex-wrap: wrap;
1987
- }
1988
-
1989
- .profiler-filter-group {
1990
- display: flex;
1991
- align-items: center;
1992
- gap: var(--profiler-space-2);
1993
- flex-wrap: wrap;
1994
- }
1995
-
1996
- .profiler-filter-count {
1997
- font-size: var(--profiler-text-xs);
1998
- color: var(--profiler-text-muted);
1999
- font-family: var(--profiler-font-mono);
2000
- white-space: nowrap;
2001
- opacity: 0.7;
2002
- }
2003
-
2004
- .profiler-filter-input,
2005
- .profiler-filter-select {
2006
- height: 28px;
2007
- padding: 0 var(--profiler-space-2);
2008
- background: var(--profiler-bg-lighter);
2009
- border: 1px solid var(--profiler-border);
2010
- border-radius: var(--profiler-radius-sm);
2011
- color: var(--profiler-text);
2012
- font-family: var(--profiler-font-mono);
2013
- font-size: var(--profiler-text-xs);
2014
- transition: border-color var(--profiler-transition-base);
2015
- }
2016
- .profiler-filter-input:focus,
2017
- .profiler-filter-select:focus {
2018
- outline: none;
2019
- border-color: var(--profiler-accent);
2020
- }
2021
-
2022
- .profiler-filter-input {
2023
- width: 160px;
2024
- }
2025
-
2026
- .profiler-filter-select {
2027
- cursor: pointer;
2028
- }
2029
-
2030
- .profiler-preset-btn {
2031
- height: 28px;
2032
- padding: 0 10px;
2033
- background: transparent;
2034
- border: 1px solid var(--profiler-border);
2035
- border-radius: var(--profiler-radius-full);
2036
- color: var(--profiler-text-muted);
2037
- font-family: var(--profiler-font-sans);
2038
- font-size: var(--profiler-text-xs);
2039
- font-weight: 500;
2040
- cursor: pointer;
2041
- transition: all var(--profiler-transition-base);
2042
- white-space: nowrap;
2043
- }
2044
- .profiler-preset-btn:hover {
2045
- border-color: var(--profiler-accent);
2046
- color: var(--profiler-accent);
2047
- background: var(--profiler-accent-bg);
2048
- }
2049
- .profiler-preset-btn--active {
2050
- border-color: var(--profiler-accent);
2051
- background: var(--profiler-accent);
2052
- color: var(--profiler-text-on-accent, #fff);
2053
- }
2054
- .profiler-preset-btn--active:hover {
2055
- opacity: 0.85;
2056
- color: var(--profiler-text-on-accent, #fff);
2057
- }
2058
-
2059
- .sortable {
2060
- cursor: pointer;
2061
- user-select: none;
2062
- white-space: nowrap;
2063
- transition: color var(--profiler-transition-base);
2064
- }
2065
- .sortable:hover {
2066
- color: var(--profiler-text) !important;
2067
- }
2068
- .sortable--active {
2069
- color: var(--profiler-text) !important;
2070
- }
2071
-
2072
- .sort-icon {
2073
- font-size: 10px;
2074
- margin-left: 4px;
2075
- vertical-align: middle;
2076
- }
2077
- .sort-icon--idle {
2078
- opacity: 0.35;
2079
- }
2080
- .sort-icon--active {
2081
- color: var(--profiler-accent);
2082
- opacity: 1;
2083
- }
2084
-
2085
- @keyframes profiler-shimmer {
2086
- 0% {
2087
- background-position: 200% 0;
2088
- }
2089
- 100% {
2090
- background-position: -200% 0;
2091
- }
2092
- }
2093
- .profiler-skeleton__row {
2094
- display: flex;
2095
- align-items: center;
2096
- gap: 20px;
2097
- padding: 14px 20px;
2098
- border-bottom: 1px solid var(--profiler-border);
2099
- }
2100
- .profiler-skeleton__row:last-child {
2101
- border-bottom: none;
2102
- }
2103
- .profiler-skeleton__cell {
2104
- height: 12px;
2105
- border-radius: 3px;
2106
- background: linear-gradient(90deg, var(--profiler-bg-lighter, #e5e7eb) 25%, var(--profiler-bg-light, #f3f4f6) 50%, var(--profiler-bg-lighter, #e5e7eb) 75%);
2107
- background-size: 200% 100%;
2108
- animation: profiler-shimmer 1.4s infinite linear;
2109
- }
2110
- .profiler-skeleton__cell--xs {
2111
- width: 40px;
2112
- flex-shrink: 0;
2113
- }
2114
- .profiler-skeleton__cell--sm {
2115
- width: 72px;
2116
- flex-shrink: 0;
2117
- }
2118
- .profiler-skeleton__cell--md {
2119
- width: 120px;
2120
- flex-shrink: 0;
2121
- }
2122
- .profiler-skeleton__cell--lg {
2123
- width: 180px;
2124
- flex-shrink: 0;
2125
- }
2126
- .profiler-skeleton__cell--flex {
2127
- flex: 1;
2128
- min-width: 60px;
2129
- }
2130
-
2131
- .profiler-timeline {
2132
- margin: 24px 0;
2133
- padding: 24px;
2134
- background: linear-gradient(135deg, rgba(21, 25, 31, 0.4) 0%, rgba(31, 35, 41, 0.4) 100%);
2135
- backdrop-filter: blur(12px);
2136
- border: 1px solid var(--profiler-border);
2137
- border-radius: 12px;
2138
- box-shadow: var(--profiler-shadow-md);
2139
- animation: fadeIn 500ms cubic-bezier(0.4, 0, 0.2, 1);
2140
- }
2141
- .profiler-timeline svg {
2142
- display: block;
2143
- width: 100%;
2144
- height: auto;
2145
- filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.2));
2146
- }
2147
- .profiler-timeline .timeline-event {
2148
- cursor: pointer;
2149
- transition: all var(--profiler-transition-base);
2150
- transform-origin: center;
2151
- }
2152
- .profiler-timeline .timeline-event:hover {
2153
- opacity: 0.85;
2154
- transform: scale(1.02);
2155
- filter: drop-shadow(0 4px 12px rgba(0, 217, 255, 0.3));
2156
- }
2157
- .profiler-timeline .timeline-event:active {
2158
- transform: scale(0.98);
2159
- }
2160
- .profiler-timeline .timeline-label {
2161
- font-size: 11px;
2162
- font-family: var(--profiler-font-mono);
2163
- font-weight: 500;
2164
- fill: var(--profiler-text-secondary);
2165
- transition: fill var(--profiler-transition-base);
2166
- }
2167
- .profiler-timeline .timeline-label:hover {
2168
- fill: var(--profiler-text);
2169
- }
2170
- .profiler-timeline .timeline-bar {
2171
- rx: 4;
2172
- transition: all var(--profiler-transition-base);
2173
- stroke-width: 1;
2174
- stroke: rgba(0, 0, 0, 0.3);
2175
- }
2176
- .profiler-timeline .timeline-bar.controller {
2177
- fill: #60a5fa;
2178
- stroke: rgba(96, 165, 250, 0.5);
2179
- }
2180
- .profiler-timeline .timeline-bar.controller:hover {
2181
- fill: #93c5fd;
2182
- filter: drop-shadow(0 0 8px rgba(96, 165, 250, 0.6));
2183
- }
2184
- .profiler-timeline .timeline-bar.view {
2185
- fill: #34d399;
2186
- stroke: rgba(52, 211, 153, 0.5);
2187
- }
2188
- .profiler-timeline .timeline-bar.view:hover {
2189
- fill: #6ee7b7;
2190
- filter: drop-shadow(0 0 8px rgba(52, 211, 153, 0.6));
2191
- }
2192
- .profiler-timeline .timeline-bar.partial {
2193
- fill: #f59e0b;
2194
- stroke: rgba(245, 158, 11, 0.5);
2195
- }
2196
- .profiler-timeline .timeline-bar.partial:hover {
2197
- fill: #fbbf24;
2198
- filter: drop-shadow(0 0 8px rgba(245, 158, 11, 0.6));
2199
- }
2200
- .profiler-timeline .timeline-bar.database {
2201
- fill: #fb923c;
2202
- stroke: rgba(251, 146, 60, 0.5);
2203
- }
2204
- .profiler-timeline .timeline-bar.database:hover {
2205
- fill: #fdba74;
2206
- filter: drop-shadow(0 0 8px rgba(251, 146, 60, 0.6));
2207
- }
2208
- .profiler-timeline .timeline-bar.default {
2209
- fill: #a78bfa;
2210
- stroke: rgba(167, 139, 250, 0.5);
2211
- }
2212
- .profiler-timeline .timeline-bar.default:hover {
2213
- fill: #c4b5fd;
2214
- filter: drop-shadow(0 0 8px rgba(167, 139, 250, 0.6));
2215
- }
2216
- .profiler-timeline .timeline-axis {
2217
- stroke: var(--profiler-border-strong);
2218
- stroke-width: 2;
2219
- stroke-linecap: round;
2220
- }
2221
- .profiler-timeline .timeline-grid {
2222
- stroke: var(--profiler-border);
2223
- stroke-width: 1;
2224
- stroke-dasharray: 4 4;
2225
- opacity: 0.2;
2226
- transition: opacity var(--profiler-transition-base);
2227
- }
2228
- .profiler-timeline .timeline-grid:hover {
2229
- opacity: 0.4;
2230
- }
2231
- .profiler-timeline .timeline-legend {
2232
- display: flex;
2233
- gap: 20px;
2234
- margin-top: 20px;
2235
- padding-top: 20px;
2236
- border-top: 1px solid var(--profiler-border);
2237
- flex-wrap: wrap;
2238
- justify-content: center;
2239
- }
2240
- .profiler-timeline .timeline-legend .legend-item {
2241
- display: flex;
2242
- align-items: center;
2243
- gap: 8px;
2244
- font-size: 12px;
2245
- font-family: var(--profiler-font-sans);
2246
- color: var(--profiler-text-muted);
2247
- padding: 6px 12px;
2248
- background: rgba(255, 255, 255, 0.02);
2249
- border-radius: 8px;
2250
- border: 1px solid var(--profiler-border);
2251
- transition: all var(--profiler-transition-base);
2252
- }
2253
- .profiler-timeline .timeline-legend .legend-item:hover {
2254
- background: rgba(255, 255, 255, 0.05);
2255
- color: var(--profiler-text);
2256
- transform: translateY(-2px);
2257
- }
2258
- .profiler-timeline .timeline-legend .legend-item .legend-color {
2259
- width: 16px;
2260
- height: 16px;
2261
- border-radius: 4px;
2262
- border: 1px solid rgba(0, 0, 0, 0.3);
2263
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2);
2264
- }
2265
- .profiler-timeline .timeline-legend .legend-item .legend-color.controller {
2266
- background: var(--profiler-accent);
2267
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2), 0 0 8px rgba(0, 217, 255, 0.3);
2268
- }
2269
- .profiler-timeline .timeline-legend .legend-item .legend-color.view {
2270
- background: var(--profiler-success);
2271
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2), 0 0 8px rgba(0, 255, 159, 0.3);
2272
- }
2273
- .profiler-timeline .timeline-legend .legend-item .legend-color.partial {
2274
- background: var(--profiler-warning);
2275
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2), 0 0 8px rgba(255, 107, 53, 0.3);
2276
- }
2277
- .profiler-timeline .timeline-legend .legend-item .legend-color.database {
2278
- background: var(--profiler-warning);
2279
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2), 0 0 8px rgba(255, 184, 108, 0.3);
2280
- }
2281
- .profiler-timeline .timeline-legend .legend-item .legend-color.default {
2282
- background: var(--profiler-info);
2283
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2), 0 0 8px rgba(189, 147, 249, 0.3);
2284
- }
2285
- .profiler-timeline .timeline-metrics {
2286
- display: grid;
2287
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
2288
- gap: 16px;
2289
- margin-bottom: 24px;
2290
- }
2291
- .profiler-timeline .timeline-metrics .metric-card {
2292
- background: rgba(0, 0, 0, 0.2);
2293
- border: 1px solid var(--profiler-border);
2294
- border-radius: 8px;
2295
- padding: 16px;
2296
- transition: all var(--profiler-transition-base);
2297
- }
2298
- .profiler-timeline .timeline-metrics .metric-card:hover {
2299
- background: rgba(0, 0, 0, 0.3);
2300
- border-color: var(--profiler-border-strong);
2301
- transform: translateY(-2px);
2302
- box-shadow: var(--profiler-shadow-sm);
2303
- }
2304
- .profiler-timeline .timeline-metrics .metric-card .metric-label {
2305
- font-size: 11px;
2306
- text-transform: uppercase;
2307
- letter-spacing: 0.08em;
2308
- color: var(--profiler-text-muted);
2309
- margin-bottom: 8px;
2310
- font-family: var(--profiler-font-sans);
2311
- }
2312
- .profiler-timeline .timeline-metrics .metric-card .metric-value {
2313
- font-size: 24px;
2314
- font-weight: 700;
2315
- font-family: var(--profiler-font-mono);
2316
- color: var(--profiler-accent);
2317
- line-height: 1;
2318
- }
2319
- .profiler-timeline .timeline-metrics .metric-card .metric-value small {
2320
- font-size: 14px;
2321
- color: var(--profiler-text-muted);
2322
- font-weight: 500;
2323
- margin-left: 4px;
2324
- }
2325
- .profiler-timeline .timeline-metrics .metric-card .metric-change {
2326
- font-size: 11px;
2327
- margin-top: 6px;
2328
- font-family: var(--profiler-font-mono);
2329
- }
2330
- .profiler-timeline .timeline-metrics .metric-card .metric-change.positive {
2331
- color: var(--profiler-success);
2332
- }
2333
- .profiler-timeline .timeline-metrics .metric-card .metric-change.negative {
2334
- color: var(--profiler-error);
2335
- }
2336
- .profiler-timeline .timeline-metrics .metric-card .metric-change.neutral {
2337
- color: var(--profiler-text-muted);
2338
- }
2339
- .profiler-timeline .timeline-tooltip {
2340
- position: absolute;
2341
- background: linear-gradient(135deg, rgba(21, 25, 31, 0.98) 0%, rgba(31, 35, 41, 0.98) 100%);
2342
- backdrop-filter: blur(16px);
2343
- border: 1px solid var(--profiler-border-strong);
2344
- border-radius: 8px;
2345
- padding: 12px 16px;
2346
- font-family: var(--profiler-font-mono);
2347
- font-size: 12px;
2348
- color: var(--profiler-text);
2349
- pointer-events: none;
2350
- z-index: 1000;
2351
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.03);
2352
- opacity: 0;
2353
- transform: translateY(8px);
2354
- transition: all var(--profiler-transition-base);
2355
- }
2356
- .profiler-timeline .timeline-tooltip.visible {
2357
- opacity: 1;
2358
- transform: translateY(0);
2359
- }
2360
- .profiler-timeline .timeline-tooltip .tooltip-header {
2361
- font-weight: 600;
2362
- color: var(--profiler-accent);
2363
- margin-bottom: 6px;
2364
- padding-bottom: 6px;
2365
- border-bottom: 1px solid var(--profiler-border);
2366
- }
2367
- .profiler-timeline .timeline-tooltip .tooltip-row {
2368
- display: flex;
2369
- justify-content: space-between;
2370
- gap: 16px;
2371
- margin: 4px 0;
2372
- }
2373
- .profiler-timeline .timeline-tooltip .tooltip-row .label {
2374
- color: var(--profiler-text-muted);
2375
- }
2376
- .profiler-timeline .timeline-tooltip .tooltip-row .value {
2377
- color: var(--profiler-text);
2378
- font-weight: 600;
2379
- }
2380
-
2381
- @keyframes barSlideIn {
2382
- from {
2383
- transform: scaleX(0);
2384
- opacity: 0;
2385
- }
2386
- to {
2387
- transform: scaleX(1);
2388
- opacity: 1;
2389
- }
2390
- }
2391
- .profiler-timeline .timeline-bar {
2392
- animation: barSlideIn 600ms cubic-bezier(0.4, 0, 0.2, 1) backwards;
2393
- }
2394
- .profiler-timeline .timeline-bar:nth-child(1) {
2395
- animation-delay: 30ms;
2396
- }
2397
- .profiler-timeline .timeline-bar:nth-child(2) {
2398
- animation-delay: 60ms;
2399
- }
2400
- .profiler-timeline .timeline-bar:nth-child(3) {
2401
- animation-delay: 90ms;
2402
- }
2403
- .profiler-timeline .timeline-bar:nth-child(4) {
2404
- animation-delay: 120ms;
2405
- }
2406
- .profiler-timeline .timeline-bar:nth-child(5) {
2407
- animation-delay: 150ms;
2408
- }
2409
- .profiler-timeline .timeline-bar:nth-child(6) {
2410
- animation-delay: 180ms;
2411
- }
2412
- .profiler-timeline .timeline-bar:nth-child(7) {
2413
- animation-delay: 210ms;
2414
- }
2415
- .profiler-timeline .timeline-bar:nth-child(8) {
2416
- animation-delay: 240ms;
2417
- }
2418
- .profiler-timeline .timeline-bar:nth-child(9) {
2419
- animation-delay: 270ms;
2420
- }
2421
- .profiler-timeline .timeline-bar:nth-child(10) {
2422
- animation-delay: 300ms;
2423
- }
2424
- .profiler-timeline .timeline-bar:nth-child(11) {
2425
- animation-delay: 330ms;
2426
- }
2427
- .profiler-timeline .timeline-bar:nth-child(12) {
2428
- animation-delay: 360ms;
2429
- }
2430
- .profiler-timeline .timeline-bar:nth-child(13) {
2431
- animation-delay: 390ms;
2432
- }
2433
- .profiler-timeline .timeline-bar:nth-child(14) {
2434
- animation-delay: 420ms;
2435
- }
2436
- .profiler-timeline .timeline-bar:nth-child(15) {
2437
- animation-delay: 450ms;
2438
- }
2439
- .profiler-timeline .timeline-bar:nth-child(16) {
2440
- animation-delay: 480ms;
2441
- }
2442
- .profiler-timeline .timeline-bar:nth-child(17) {
2443
- animation-delay: 510ms;
2444
- }
2445
- .profiler-timeline .timeline-bar:nth-child(18) {
2446
- animation-delay: 540ms;
2447
- }
2448
- .profiler-timeline .timeline-bar:nth-child(19) {
2449
- animation-delay: 570ms;
2450
- }
2451
- .profiler-timeline .timeline-bar:nth-child(20) {
2452
- animation-delay: 600ms;
2453
- }
2454
-
2455
- .profiler-flamegraph {
2456
- animation: fadeIn 500ms cubic-bezier(0.4, 0, 0.2, 1);
2457
- }
2458
- .profiler-flamegraph__stats {
2459
- display: flex;
2460
- flex-wrap: wrap;
2461
- gap: 12px;
2462
- margin-bottom: 16px;
2463
- }
2464
- .profiler-flamegraph__stats .stat-item {
2465
- display: flex;
2466
- flex-direction: column;
2467
- gap: 2px;
2468
- padding: 10px 14px;
2469
- background: var(--profiler-bg-lighter);
2470
- border: 1px solid var(--profiler-border);
2471
- border-radius: var(--profiler-radius-md);
2472
- min-width: 80px;
2473
- transition: all var(--profiler-transition-base);
2474
- }
2475
- .profiler-flamegraph__stats .stat-item:hover {
2476
- border-color: var(--profiler-border-strong);
2477
- transform: translateY(-1px);
2478
- box-shadow: var(--profiler-shadow-sm);
2479
- }
2480
- .profiler-flamegraph__stats .stat-label {
2481
- font-size: var(--profiler-text-xs);
2482
- text-transform: uppercase;
2483
- letter-spacing: 0.06em;
2484
- color: var(--profiler-text-muted);
2485
- font-family: var(--profiler-font-sans);
2486
- display: flex;
2487
- align-items: center;
2488
- gap: 6px;
2489
- }
2490
- .profiler-flamegraph__stats .stat-value {
2491
- font-size: var(--profiler-text-lg);
2492
- font-weight: 700;
2493
- font-family: var(--profiler-font-mono);
2494
- color: var(--profiler-accent);
2495
- line-height: 1.2;
2496
- }
2497
- .profiler-flamegraph__stats .stat-value small {
2498
- font-size: var(--profiler-text-sm);
2499
- color: var(--profiler-text-muted);
2500
- font-weight: 500;
2501
- }
2502
- .profiler-flamegraph__stats .stat-dot {
2503
- display: inline-block;
2504
- width: 8px;
2505
- height: 8px;
2506
- border-radius: 50%;
2507
- flex-shrink: 0;
2508
- }
2509
- .profiler-flamegraph__legend {
2510
- display: flex;
2511
- gap: 16px;
2512
- margin-bottom: 12px;
2513
- flex-wrap: wrap;
2514
- }
2515
- .profiler-flamegraph__legend .legend-item {
2516
- display: flex;
2517
- align-items: center;
2518
- gap: 6px;
2519
- font-size: var(--profiler-text-sm);
2520
- font-family: var(--profiler-font-sans);
2521
- color: var(--profiler-text-muted);
2522
- }
2523
- .profiler-flamegraph__legend .legend-item .legend-color {
2524
- width: 12px;
2525
- height: 12px;
2526
- border-radius: 3px;
2527
- flex-shrink: 0;
2528
- }
2529
- .profiler-flamegraph__controls {
2530
- display: flex;
2531
- align-items: center;
2532
- gap: 12px;
2533
- margin-bottom: 8px;
2534
- }
2535
- .profiler-flamegraph__reset {
2536
- padding: 4px 12px;
2537
- font-size: var(--profiler-text-sm);
2538
- font-family: var(--profiler-font-sans);
2539
- font-weight: 500;
2540
- background: var(--profiler-accent-bg);
2541
- color: var(--profiler-accent);
2542
- border: 1px solid var(--profiler-border-accent);
2543
- border-radius: var(--profiler-radius-sm);
2544
- cursor: pointer;
2545
- transition: all var(--profiler-transition-base);
2546
- }
2547
- .profiler-flamegraph__reset:hover {
2548
- background: var(--profiler-accent);
2549
- color: var(--profiler-text-on-accent);
2550
- }
2551
- .profiler-flamegraph__hint {
2552
- font-size: var(--profiler-text-xs);
2553
- color: var(--profiler-text-subtle);
2554
- font-family: var(--profiler-font-sans);
2555
- }
2556
- .profiler-flamegraph__search {
2557
- display: flex;
2558
- align-items: center;
2559
- gap: 8px;
2560
- }
2561
- .profiler-flamegraph__search-input {
2562
- height: 28px;
2563
- padding: 0 8px;
2564
- background: var(--profiler-bg-lighter);
2565
- border: 1px solid var(--profiler-border);
2566
- border-radius: var(--profiler-radius-sm);
2567
- color: var(--profiler-text);
2568
- font-family: var(--profiler-font-mono);
2569
- font-size: var(--profiler-text-xs);
2570
- width: 200px;
2571
- transition: border-color var(--profiler-transition-base);
2572
- }
2573
- .profiler-flamegraph__search-input:focus {
2574
- outline: none;
2575
- border-color: var(--profiler-accent);
2576
- }
2577
- .profiler-flamegraph__match-count {
2578
- font-size: var(--profiler-text-xs);
2579
- font-family: var(--profiler-font-mono);
2580
- color: var(--profiler-text-muted);
2581
- white-space: nowrap;
2582
- }
2583
- .profiler-flamegraph__canvas-container {
2584
- position: relative;
2585
- border: 1px solid var(--profiler-border);
2586
- border-radius: var(--profiler-radius-lg);
2587
- overflow: visible;
2588
- background: var(--profiler-bg-light);
2589
- }
2590
- .profiler-flamegraph__canvas {
2591
- display: block;
2592
- width: 100%;
2593
- cursor: default;
2594
- }
2595
- .profiler-flamegraph__breadcrumbs {
2596
- display: none;
2597
- align-items: center;
2598
- gap: 4px;
2599
- padding: 8px 12px;
2600
- background: var(--profiler-bg-lighter);
2601
- border-bottom: 1px solid var(--profiler-border);
2602
- font-size: var(--profiler-text-sm);
2603
- font-family: var(--profiler-font-mono);
2604
- flex-wrap: wrap;
2605
- overflow: hidden;
2606
- }
2607
- .profiler-flamegraph__breadcrumbs .breadcrumb-item {
2608
- background: none;
2609
- border: none;
2610
- padding: 2px 6px;
2611
- font-size: var(--profiler-text-sm);
2612
- font-family: var(--profiler-font-mono);
2613
- color: var(--profiler-text-secondary);
2614
- cursor: pointer;
2615
- border-radius: var(--profiler-radius-sm);
2616
- transition: all var(--profiler-transition-fast);
2617
- white-space: nowrap;
2618
- }
2619
- .profiler-flamegraph__breadcrumbs .breadcrumb-item:hover {
2620
- background: var(--profiler-accent-bg);
2621
- color: var(--profiler-accent);
2622
- }
2623
- .profiler-flamegraph__breadcrumbs .breadcrumb-item:last-child {
2624
- color: var(--profiler-accent);
2625
- font-weight: 600;
2626
- }
2627
- .profiler-flamegraph__breadcrumbs .breadcrumb-separator {
2628
- color: var(--profiler-text-subtle);
2629
- font-size: var(--profiler-text-base);
2630
- user-select: none;
2631
- }
2632
- .profiler-flamegraph__tooltip {
2633
- position: fixed;
2634
- background: var(--profiler-bg-overlay);
2635
- backdrop-filter: blur(16px);
2636
- border: 1px solid var(--profiler-border-strong);
2637
- border-radius: var(--profiler-radius-md);
2638
- padding: 10px 14px;
2639
- font-family: var(--profiler-font-mono);
2640
- font-size: var(--profiler-text-sm);
2641
- color: var(--profiler-text);
2642
- pointer-events: none;
2643
- z-index: 1000;
2644
- box-shadow: var(--profiler-shadow-lg);
2645
- opacity: 0;
2646
- transform: translateY(6px);
2647
- transition: opacity var(--profiler-transition-fast), transform var(--profiler-transition-fast);
2648
- max-width: 400px;
2649
- word-break: break-all;
2650
- }
2651
- .profiler-flamegraph__tooltip.visible {
2652
- opacity: 1;
2653
- transform: translateY(0);
2654
- }
2655
- .profiler-flamegraph__tooltip .tooltip-header {
2656
- font-weight: 600;
2657
- color: var(--profiler-accent);
2658
- margin-bottom: 6px;
2659
- padding-bottom: 6px;
2660
- border-bottom: 1px solid var(--profiler-border);
2661
- white-space: nowrap;
2662
- overflow: hidden;
2663
- text-overflow: ellipsis;
2664
- max-width: 350px;
2665
- }
2666
- .profiler-flamegraph__tooltip .tooltip-row {
2667
- display: flex;
2668
- justify-content: space-between;
2669
- gap: 16px;
2670
- margin: 3px 0;
2671
- }
2672
- .profiler-flamegraph__tooltip .tooltip-row .label {
2673
- color: var(--profiler-text-muted);
2674
- }
2675
- .profiler-flamegraph__tooltip .tooltip-row .value {
2676
- color: var(--profiler-text);
2677
- font-weight: 600;
2678
- }
2679
- .profiler-flamegraph__tooltip .tooltip-badge {
2680
- display: inline-block;
2681
- padding: 1px 8px;
2682
- border-radius: var(--profiler-radius-full);
2683
- font-size: var(--profiler-text-xs);
2684
- font-weight: 600;
2685
- color: #fff;
2686
- }
2687
- .profiler-flamegraph__tooltip .tooltip-payload {
2688
- margin-top: 6px;
2689
- padding-top: 6px;
2690
- border-top: 1px solid var(--profiler-border);
2691
- font-size: var(--profiler-text-xs);
2692
- color: var(--profiler-text-secondary);
2693
- white-space: pre-wrap;
2694
- max-height: 80px;
2695
- overflow: hidden;
2696
- }
2697
-
2698
- .profiler-fn-profiling {
2699
- margin-top: 32px;
2700
- border-top: 1px solid var(--profiler-border);
2701
- padding-top: 24px;
2702
- animation: fadeIn 300ms ease;
2703
- }
2704
- .profiler-fn-profiling__header {
2705
- display: flex;
2706
- align-items: center;
2707
- justify-content: space-between;
2708
- gap: 16px;
2709
- margin-bottom: 16px;
2710
- flex-wrap: wrap;
2711
- }
2712
- .profiler-fn-profiling__title {
2713
- font-size: var(--profiler-text-xs);
2714
- font-weight: 700;
2715
- letter-spacing: 0.12em;
2716
- text-transform: uppercase;
2717
- color: var(--profiler-text-muted);
2718
- font-family: var(--profiler-font-sans);
2719
- display: flex;
2720
- align-items: center;
2721
- gap: 8px;
2722
- }
2723
- .profiler-fn-profiling__title::before {
2724
- content: "";
2725
- display: inline-block;
2726
- width: 8px;
2727
- height: 8px;
2728
- border-radius: 50%;
2729
- background: #94a3b8;
2730
- flex-shrink: 0;
2731
- }
2732
- .profiler-fn-profiling__title--active::before {
2733
- background: var(--profiler-accent);
2734
- box-shadow: 0 0 6px var(--profiler-accent-glow);
2735
- }
2736
- .profiler-fn-profiling__controls {
2737
- display: flex;
2738
- align-items: center;
2739
- gap: 12px;
2740
- flex-wrap: wrap;
2741
- }
2742
- .profiler-fn-profiling__max-frames-label {
2743
- display: flex;
2744
- align-items: center;
2745
- gap: 6px;
2746
- font-size: var(--profiler-text-xs);
2747
- color: var(--profiler-text-muted);
2748
- font-family: var(--profiler-font-sans);
2749
- cursor: default;
2750
- }
2751
- .profiler-fn-profiling__max-frames-input {
2752
- width: 70px;
2753
- height: 26px;
2754
- padding: 0 8px;
2755
- background: var(--profiler-bg-lighter);
2756
- border: 1px solid var(--profiler-border);
2757
- border-radius: var(--profiler-radius-sm);
2758
- color: var(--profiler-text);
2759
- font-family: var(--profiler-font-mono);
2760
- font-size: var(--profiler-text-xs);
2761
- text-align: center;
2762
- transition: border-color var(--profiler-transition-base);
2763
- appearance: textfield;
2764
- }
2765
- .profiler-fn-profiling__max-frames-input::-webkit-inner-spin-button, .profiler-fn-profiling__max-frames-input::-webkit-outer-spin-button {
2766
- -webkit-appearance: none;
2767
- }
2768
- .profiler-fn-profiling__max-frames-input:focus {
2769
- outline: none;
2770
- border-color: var(--profiler-accent);
2771
- box-shadow: 0 0 0 2px var(--profiler-accent-glow);
2772
- }
2773
- .profiler-fn-profiling__max-frames-input:disabled {
2774
- opacity: 0.4;
2775
- cursor: not-allowed;
2776
- }
2777
- .profiler-fn-profiling__updating {
2778
- font-size: var(--profiler-text-xs);
2779
- color: var(--profiler-text-muted);
2780
- font-family: var(--profiler-font-mono);
2781
- animation: pulse 1s ease-in-out infinite;
2782
- }
2783
- .profiler-fn-profiling__toggle {
2784
- display: inline-flex;
2785
- align-items: center;
2786
- gap: 6px;
2787
- height: 28px;
2788
- padding: 0 14px;
2789
- border-radius: var(--profiler-radius-full);
2790
- border: 1px solid var(--profiler-border-strong);
2791
- background: var(--profiler-bg-lighter);
2792
- color: var(--profiler-text-muted);
2793
- font-size: var(--profiler-text-xs);
2794
- font-weight: 600;
2795
- font-family: var(--profiler-font-sans);
2796
- cursor: pointer;
2797
- transition: all var(--profiler-transition-base);
2798
- white-space: nowrap;
2799
- }
2800
- .profiler-fn-profiling__toggle::before {
2801
- content: "";
2802
- width: 6px;
2803
- height: 6px;
2804
- border-radius: 50%;
2805
- background: var(--profiler-text-subtle);
2806
- flex-shrink: 0;
2807
- transition: background var(--profiler-transition-base), box-shadow var(--profiler-transition-base);
2808
- }
2809
- .profiler-fn-profiling__toggle:hover {
2810
- border-color: var(--profiler-border-strong);
2811
- color: var(--profiler-text);
2812
- background: var(--profiler-bg-elevated);
2813
- }
2814
- .profiler-fn-profiling__toggle:disabled {
2815
- opacity: 0.5;
2816
- cursor: not-allowed;
2817
- }
2818
- .profiler-fn-profiling__toggle--active {
2819
- border-color: var(--profiler-border-accent);
2820
- background: var(--profiler-accent-bg);
2821
- color: var(--profiler-accent);
2822
- }
2823
- .profiler-fn-profiling__toggle--active::before {
2824
- background: var(--profiler-accent);
2825
- box-shadow: 0 0 6px var(--profiler-accent-glow);
2826
- }
2827
- .profiler-fn-profiling__toggle--active:hover {
2828
- background: rgba(245, 158, 11, 0.15);
2829
- }
2830
- .profiler-fn-profiling__mode-selector {
2831
- display: inline-flex;
2832
- border: 1px solid var(--profiler-border-strong);
2833
- border-radius: var(--profiler-radius-sm);
2834
- overflow: hidden;
2835
- }
2836
- .profiler-fn-profiling__mode-btn {
2837
- height: 28px;
2838
- padding: 0 12px;
2839
- background: var(--profiler-bg-lighter);
2840
- border: none;
2841
- border-right: 1px solid var(--profiler-border-strong);
2842
- color: var(--profiler-text-muted);
2843
- font-size: var(--profiler-text-xs);
2844
- font-weight: 600;
2845
- font-family: var(--profiler-font-sans);
2846
- cursor: pointer;
2847
- transition: all var(--profiler-transition-base);
2848
- white-space: nowrap;
2849
- }
2850
- .profiler-fn-profiling__mode-btn:last-child {
2851
- border-right: none;
2852
- }
2853
- .profiler-fn-profiling__mode-btn:hover:not(:disabled):not(.profiler-fn-profiling__mode-btn--active) {
2854
- background: var(--profiler-bg-elevated);
2855
- color: var(--profiler-text);
2856
- }
2857
- .profiler-fn-profiling__mode-btn--active {
2858
- background: var(--profiler-accent-bg);
2859
- color: var(--profiler-accent);
2860
- cursor: default;
2861
- }
2862
- .profiler-fn-profiling__mode-btn:disabled {
2863
- opacity: 0.5;
2864
- cursor: not-allowed;
2865
- }
2866
- .profiler-fn-profiling__cpu-pct {
2867
- color: var(--profiler-text-subtle);
2868
- font-size: 0.85em;
2869
- }
2870
- .profiler-fn-profiling__gc--medium {
2871
- color: #f59e0b;
2872
- }
2873
- .profiler-fn-profiling__gc--high {
2874
- color: #ef4444;
2875
- font-weight: 600;
2876
- }
2877
- .profiler-fn-profiling__hint {
2878
- margin: 12px 0 0;
2879
- padding: 10px 14px;
2880
- background: var(--profiler-bg-lighter);
2881
- border: 1px solid var(--profiler-border);
2882
- border-radius: var(--profiler-radius-md);
2883
- font-size: var(--profiler-text-xs);
2884
- color: var(--profiler-text-muted);
2885
- font-family: var(--profiler-font-sans);
2886
- line-height: 1.6;
2887
- }
2888
- .profiler-fn-profiling__flamegraph {
2889
- margin: 16px 0;
2890
- }
2891
- .profiler-fn-profiling__flamegraph .profiler-flamegraph__controls {
2892
- margin-bottom: 6px;
2893
- }
2894
- .profiler-fn-profiling__sort {
2895
- display: flex;
2896
- align-items: center;
2897
- gap: 4px;
2898
- margin: 16px 0 8px;
2899
- padding: 3px;
2900
- background: var(--profiler-bg-lighter);
2901
- border: 1px solid var(--profiler-border);
2902
- border-radius: var(--profiler-radius-md);
2903
- width: fit-content;
2904
- }
2905
- .profiler-fn-profiling__sort-btn {
2906
- padding: 4px 12px;
2907
- border: none;
2908
- border-radius: var(--profiler-radius-sm);
2909
- background: transparent;
2910
- color: var(--profiler-text-muted);
2911
- font-size: var(--profiler-text-xs);
2912
- font-weight: 500;
2913
- font-family: var(--profiler-font-sans);
2914
- cursor: pointer;
2915
- transition: all var(--profiler-transition-fast);
2916
- white-space: nowrap;
2917
- }
2918
- .profiler-fn-profiling__sort-btn:hover {
2919
- color: var(--profiler-text);
2920
- background: var(--profiler-bg-elevated);
2921
- }
2922
- .profiler-fn-profiling__sort-btn--active {
2923
- background: var(--profiler-accent);
2924
- color: var(--profiler-text-on-accent);
2925
- font-weight: 600;
2926
- box-shadow: var(--profiler-shadow-sm);
2927
- }
2928
- .profiler-fn-profiling__sort-btn--active:hover {
2929
- background: var(--profiler-accent-hover);
2930
- color: var(--profiler-text-on-accent);
2931
- }
2932
- .profiler-fn-profiling__table {
2933
- width: 100%;
2934
- border-collapse: collapse;
2935
- font-size: var(--profiler-text-xs);
2936
- font-family: var(--profiler-font-sans);
2937
- margin-top: 8px;
2938
- }
2939
- .profiler-fn-profiling__table thead tr {
2940
- border-bottom: 1px solid var(--profiler-border-strong);
2941
- }
2942
- .profiler-fn-profiling__table th {
2943
- padding: 8px 10px;
2944
- text-align: left;
2945
- font-size: var(--profiler-text-xs);
2946
- font-weight: 600;
2947
- letter-spacing: 0.08em;
2948
- text-transform: uppercase;
2949
- color: var(--profiler-text-subtle);
2950
- }
2951
- .profiler-fn-profiling__table th.profiler-text--right {
2952
- text-align: right;
2953
- }
2954
- .profiler-fn-profiling__table tbody tr {
2955
- border-bottom: 1px solid var(--profiler-border);
2956
- transition: background var(--profiler-transition-fast);
2957
- }
2958
- .profiler-fn-profiling__table tbody tr:hover {
2959
- background: var(--profiler-bg-lighter);
2960
- }
2961
- .profiler-fn-profiling__table tbody tr:last-child {
2962
- border-bottom: none;
2963
- }
2964
- .profiler-fn-profiling__table tbody tr.profiler-fn-profiling__row--highlighted {
2965
- background: rgba(251, 191, 36, 0.08);
2966
- outline: 1px solid rgba(251, 191, 36, 0.35);
2967
- outline-offset: -1px;
2968
- }
2969
- .profiler-fn-profiling__table td {
2970
- padding: 7px 10px;
2971
- vertical-align: middle;
2972
- line-height: 1.4;
2973
- }
2974
- .profiler-fn-profiling__table td.profiler-text--right {
2975
- text-align: right;
2976
- }
2977
- .profiler-fn-profiling__table td.profiler-text--muted {
2978
- color: var(--profiler-text-muted);
2979
- }
2980
- .profiler-fn-profiling__name {
2981
- font-family: var(--profiler-font-mono);
2982
- font-size: var(--profiler-text-xs);
2983
- font-weight: 500;
2984
- color: var(--profiler-text);
2985
- max-width: 280px;
2986
- overflow: hidden;
2987
- text-overflow: ellipsis;
2988
- white-space: nowrap;
2989
- }
2990
- .profiler-fn-profiling__recursive {
2991
- display: inline-flex;
2992
- align-items: center;
2993
- justify-content: center;
2994
- width: 14px;
2995
- height: 14px;
2996
- border-radius: 3px;
2997
- background: var(--profiler-warning-bg);
2998
- color: var(--profiler-warning);
2999
- font-size: 9px;
3000
- font-weight: 700;
3001
- margin-right: 5px;
3002
- vertical-align: middle;
3003
- flex-shrink: 0;
3004
- cursor: help;
3005
- }
3006
- .profiler-fn-profiling__filter-active {
3007
- display: flex;
3008
- align-items: center;
3009
- justify-content: space-between;
3010
- gap: 8px;
3011
- margin: 12px 0 0;
3012
- padding: 8px 14px;
3013
- background: var(--profiler-accent-bg);
3014
- border: 1px solid var(--profiler-border-accent);
3015
- border-radius: var(--profiler-radius-md);
3016
- font-size: var(--profiler-text-xs);
3017
- color: var(--profiler-accent);
3018
- font-family: var(--profiler-font-sans);
3019
- }
3020
- .profiler-fn-profiling__filter-active strong {
3021
- font-family: var(--profiler-font-mono);
3022
- font-weight: 600;
3023
- }
3024
- .profiler-fn-profiling__filter-clear {
3025
- padding: 2px 8px;
3026
- border: 1px solid var(--profiler-border-accent);
3027
- border-radius: var(--profiler-radius-sm);
3028
- background: transparent;
3029
- color: var(--profiler-accent);
3030
- font-size: var(--profiler-text-xs);
3031
- font-family: var(--profiler-font-sans);
3032
- cursor: pointer;
3033
- transition: all var(--profiler-transition-fast);
3034
- white-space: nowrap;
3035
- }
3036
- .profiler-fn-profiling__filter-clear:hover {
3037
- background: var(--profiler-accent);
3038
- color: var(--profiler-text-on-accent);
3039
- }
3040
- .profiler-fn-profiling__cap-warning {
3041
- display: flex;
3042
- align-items: center;
3043
- gap: 8px;
3044
- margin: 12px 0 0;
3045
- padding: 10px 14px;
3046
- background: var(--profiler-warning-bg);
3047
- border: 1px solid rgba(251, 146, 60, 0.3);
3048
- border-radius: var(--profiler-radius-md);
3049
- font-size: var(--profiler-text-xs);
3050
- color: var(--profiler-warning);
3051
- font-family: var(--profiler-font-sans);
3052
- font-weight: 500;
3053
- }
3054
-
3055
- @keyframes pulse {
3056
- 0%, 100% {
3057
- opacity: 1;
3058
- }
3059
- 50% {
3060
- opacity: 0.4;
3061
- }
3062
- }
3063
- pre[data-language=sql],
3064
- .sql-code {
3065
- background: var(--profiler-bg);
3066
- padding: 15px;
3067
- border-radius: 4px;
3068
- overflow-x: auto;
3069
- font-family: "Monaco", "Menlo", "Ubuntu Mono", monospace;
3070
- font-size: 13px;
3071
- line-height: 1.5;
3072
- }
3073
- pre[data-language=sql] .sql-keyword,
3074
- .sql-code .sql-keyword {
3075
- color: #c586c0;
3076
- font-weight: 600;
3077
- }
3078
- pre[data-language=sql] .sql-string,
3079
- .sql-code .sql-string {
3080
- color: #ce9178;
3081
- }
3082
- pre[data-language=sql] .sql-number,
3083
- .sql-code .sql-number {
3084
- color: #b5cea8;
3085
- }
3086
- pre[data-language=sql] .sql-comment,
3087
- .sql-code .sql-comment {
3088
- color: var(--profiler-text-muted);
3089
- font-style: italic;
3090
- }
3091
- pre[data-language=sql] .sql-function,
3092
- .sql-code .sql-function {
3093
- color: #dcdcaa;
3094
- }
3095
- pre[data-language=sql] .sql-operator,
3096
- .sql-code .sql-operator {
3097
- color: var(--profiler-info);
3098
- }
3099
-
3100
- .backtrace {
3101
- font-family: "Monaco", "Menlo", "Ubuntu Mono", monospace;
3102
- font-size: 11px;
3103
- color: var(--profiler-text-muted);
3104
- line-height: 1.6;
3105
- }
3106
- .backtrace .file-path {
3107
- color: var(--profiler-info);
3108
- }
3109
- .backtrace .file-path:hover {
3110
- text-decoration: underline;
3111
- }
3112
- .backtrace .line-number {
3113
- color: var(--profiler-warning);
3114
- }
3115
- .backtrace .method-name {
3116
- color: #dcdcaa;
3117
- }
3118
-
3119
- .profile-header {
3120
- margin-bottom: var(--profiler-space-6);
3121
- padding-bottom: var(--profiler-space-4);
3122
- border-bottom: 1px solid var(--profiler-border);
3123
- }
3124
- .profile-header h2 {
3125
- font-size: var(--profiler-text-xl);
3126
- margin-bottom: var(--profiler-space-3);
3127
- color: var(--profiler-text);
3128
- font-weight: 600;
3129
- }
3130
-
3131
- .stats-grid {
3132
- display: grid;
3133
- grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
3134
- gap: var(--profiler-space-4);
3135
- margin-bottom: var(--profiler-space-6);
3136
- }
3137
-
3138
- .stat {
3139
- background: var(--profiler-bg-lighter);
3140
- padding: var(--profiler-space-3);
3141
- border-radius: var(--profiler-radius-md);
3142
- border: 1px solid var(--profiler-border);
3143
- transition: all var(--profiler-transition-base);
3144
- }
3145
- .stat:hover {
3146
- background: var(--profiler-bg-elevated);
3147
- border-color: var(--profiler-border-strong);
3148
- transform: translateY(-2px);
3149
- box-shadow: var(--profiler-shadow-sm);
3150
- }
3151
-
3152
- .stat-label {
3153
- font-size: var(--profiler-text-xs);
3154
- color: var(--profiler-text-muted);
3155
- margin-bottom: var(--profiler-space-1);
3156
- text-transform: uppercase;
3157
- letter-spacing: 0.08em;
3158
- }
3159
-
3160
- .stat-value {
3161
- font-size: var(--profiler-text-xl);
3162
- font-weight: 600;
3163
- color: var(--profiler-accent);
3164
- font-family: var(--profiler-font-mono);
3165
- }
3166
-
3167
- .tabs {
3168
- display: flex;
3169
- gap: var(--profiler-space-1);
3170
- border-bottom: 1px solid var(--profiler-border);
3171
- margin-bottom: var(--profiler-space-6);
3172
- }
3173
-
3174
- .tab {
3175
- padding: var(--profiler-space-3) var(--profiler-space-4);
3176
- background: transparent;
3177
- border: none;
3178
- color: var(--profiler-text-muted);
3179
- cursor: pointer;
3180
- font-size: var(--profiler-text-base);
3181
- border-bottom: 2px solid transparent;
3182
- display: flex;
3183
- align-items: center;
3184
- gap: var(--profiler-space-2);
3185
- transition: all var(--profiler-transition-fast);
3186
- }
3187
- .tab .tab-icon {
3188
- font-size: var(--profiler-text-lg);
3189
- line-height: 1;
3190
- }
3191
- .tab:hover {
3192
- color: var(--profiler-text);
3193
- background: rgba(0, 0, 0, 0.1);
3194
- }
3195
- .tab.active {
3196
- color: var(--profiler-accent);
3197
- border-bottom-color: var(--profiler-accent);
3198
- }
3199
-
3200
- .tab-content {
3201
- display: none;
3202
- }
3203
- .tab-content.active {
3204
- display: block;
3205
- }
3206
-
3207
- .query-item {
3208
- background: var(--profiler-bg-lighter);
3209
- padding: var(--profiler-space-3);
3210
- margin-bottom: var(--profiler-space-3);
3211
- border-radius: var(--profiler-radius-md);
3212
- border-left: 3px solid var(--profiler-info);
3213
- transition: all var(--profiler-transition-base);
3214
- }
3215
- .query-item:hover {
3216
- background: var(--profiler-bg-elevated);
3217
- transform: translateX(4px);
3218
- box-shadow: var(--profiler-shadow-sm);
3219
- }
3220
- .query-item.slow {
3221
- border-left-color: var(--profiler-error);
3222
- background: var(--profiler-error-bg);
3223
- }
3224
- .query-item.slow:hover {
3225
- box-shadow: 0 0 16px var(--profiler-error-glow);
3226
- }
3227
-
3228
- .query-sql {
3229
- font-family: var(--profiler-font-mono);
3230
- font-size: var(--profiler-text-sm);
3231
- color: var(--profiler-info);
3232
- margin-bottom: var(--profiler-space-2);
3233
- white-space: pre-wrap;
3234
- word-break: break-all;
3235
- line-height: 1.6;
3236
- }
3237
-
3238
- .query-meta {
3239
- display: flex;
3240
- gap: var(--profiler-space-3);
3241
- font-size: var(--profiler-text-xs);
3242
- color: var(--profiler-text-muted);
3243
- }
3244
-
3245
- .badge {
3246
- display: inline-flex;
3247
- padding: var(--profiler-space-1) var(--profiler-space-2);
3248
- border-radius: var(--profiler-radius-sm);
3249
- font-size: var(--profiler-text-xs);
3250
- font-weight: 600;
3251
- background: var(--profiler-info);
3252
- color: var(--profiler-text-on-accent);
3253
- font-family: var(--profiler-font-mono);
3254
- }
3255
-
3256
- .badge-slow {
3257
- background: var(--profiler-error);
3258
- }
3259
-
3260
- .badge-cached {
3261
- background: var(--profiler-success);
3262
- }
3263
-
3264
- .dump-item {
3265
- background: var(--profiler-bg-lighter);
3266
- padding: var(--profiler-space-4);
3267
- margin-bottom: var(--profiler-space-4);
3268
- border-radius: var(--profiler-radius-md);
3269
- border-left: 3px solid var(--profiler-warning);
3270
- }
3271
-
3272
- .dump-header {
3273
- display: flex;
3274
- justify-content: space-between;
3275
- align-items: center;
3276
- margin-bottom: var(--profiler-space-3);
3277
- font-size: var(--profiler-text-sm);
3278
- }
3279
-
3280
- .dump-label {
3281
- color: var(--profiler-accent);
3282
- font-weight: 600;
3283
- }
3284
-
3285
- .dump-location {
3286
- color: var(--profiler-info);
3287
- font-size: var(--profiler-text-xs);
3288
- font-family: var(--profiler-font-mono);
3289
- }
3290
-
3291
- .dump-value {
3292
- font-family: var(--profiler-font-mono);
3293
- font-size: var(--profiler-text-sm);
3294
- color: var(--profiler-warning);
3295
- white-space: pre-wrap;
3296
- background: rgba(0, 0, 0, 0.3);
3297
- padding: var(--profiler-space-3);
3298
- border-radius: var(--profiler-radius-sm);
3299
- max-height: 400px;
3300
- overflow-y: auto;
3301
- line-height: 1.5;
3302
- }
3303
-
3304
- .cache-stats {
3305
- display: grid;
3306
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
3307
- gap: var(--profiler-space-3);
3308
- margin-bottom: var(--profiler-space-6);
3309
- }
3310
-
3311
- .cache-stat {
3312
- background: var(--profiler-bg-lighter);
3313
- padding: var(--profiler-space-3);
3314
- border-radius: var(--profiler-radius-md);
3315
- text-align: center;
3316
- border: 1px solid var(--profiler-border);
3317
- transition: all var(--profiler-transition-base);
3318
- }
3319
- .cache-stat:hover {
3320
- background: var(--profiler-bg-elevated);
3321
- border-color: var(--profiler-border-strong);
3322
- transform: translateY(-2px);
3323
- box-shadow: var(--profiler-shadow-sm);
3324
- }
3325
-
3326
- .cache-stat-label {
3327
- font-size: var(--profiler-text-xs);
3328
- color: var(--profiler-text-muted);
3329
- margin-bottom: var(--profiler-space-1);
3330
- text-transform: uppercase;
3331
- letter-spacing: 0.08em;
3332
- }
3333
-
3334
- .cache-stat-value {
3335
- font-size: var(--profiler-text-xl);
3336
- font-weight: 600;
3337
- color: var(--profiler-accent);
3338
- font-family: var(--profiler-font-mono);
3339
- }
3340
-
3341
- .empty-state {
3342
- display: flex;
3343
- align-items: center;
3344
- justify-content: center;
3345
- min-height: 200px;
3346
- flex-direction: column;
3347
- gap: var(--profiler-space-2);
3348
- color: var(--profiler-text-muted);
3349
- padding: var(--profiler-space-12) var(--profiler-space-6);
3350
- text-align: center;
3351
- }
3352
-
3353
- .loading {
3354
- text-align: center;
3355
- padding: var(--profiler-space-12) var(--profiler-space-6);
3356
- color: var(--profiler-text-muted);
3357
- font-size: var(--profiler-text-base);
3358
- }
3359
-
3360
- .error {
3361
- background: var(--profiler-error-bg);
3362
- color: var(--profiler-error);
3363
- padding: var(--profiler-space-3);
3364
- border-radius: var(--profiler-radius-md);
3365
- margin-bottom: var(--profiler-space-3);
3366
- border-left: 3px solid var(--profiler-error);
3367
- font-size: var(--profiler-text-sm);
3368
- }
3369
-
3370
- .generic-tab pre {
3371
- color: var(--profiler-info);
3372
- font-family: var(--profiler-font-mono);
3373
- font-size: var(--profiler-text-sm);
3374
- line-height: 1.6;
3375
- }
3376
-
3377
- .ajax-breakdown {
3378
- margin: var(--profiler-space-6) 0;
3379
- padding: var(--profiler-space-4);
3380
- background: var(--profiler-bg-light);
3381
- border: 1px solid var(--profiler-border);
3382
- border-radius: var(--profiler-radius-md);
3383
- }
3384
- .ajax-breakdown h3 {
3385
- margin: 0 0 var(--profiler-space-3) 0;
3386
- font-size: var(--profiler-text-base);
3387
- color: var(--profiler-text);
3388
- font-weight: 600;
3389
- }
3390
-
3391
- .ajax-breakdown-items {
3392
- display: flex;
3393
- flex-wrap: wrap;
3394
- gap: var(--profiler-space-3);
3395
- }
3396
-
3397
- .ajax-breakdown-item {
3398
- display: flex;
3399
- align-items: center;
3400
- gap: var(--profiler-space-2);
3401
- padding: var(--profiler-space-1) var(--profiler-space-3);
3402
- background: var(--profiler-bg-elevated);
3403
- border: 1px solid var(--profiler-border);
3404
- border-radius: var(--profiler-radius-md);
3405
- font-size: var(--profiler-text-base);
3406
- color: var(--profiler-text);
3407
- font-family: var(--profiler-font-mono);
3408
- }
3409
-
3410
- .ajax-requests-list {
3411
- margin-top: var(--profiler-space-6);
3412
- }
3413
-
3414
- .ajax-request-item {
3415
- background: var(--profiler-bg-light);
3416
- border: 1px solid var(--profiler-border);
3417
- border-radius: var(--profiler-radius-md);
3418
- padding: var(--profiler-space-3) var(--profiler-space-4);
3419
- margin-bottom: var(--profiler-space-3);
3420
- transition: all var(--profiler-transition-base);
3421
- }
3422
- .ajax-request-item:hover {
3423
- background: var(--profiler-accent-bg);
3424
- border-color: var(--profiler-border-accent);
3425
- transform: translateX(3px);
3426
- box-shadow: var(--profiler-shadow-sm);
3427
- }
3428
-
3429
- .ajax-request-header {
3430
- display: flex;
3431
- justify-content: space-between;
3432
- align-items: center;
3433
- margin-bottom: var(--profiler-space-2);
3434
- }
3435
-
3436
- .ajax-request-method {
3437
- display: flex;
3438
- align-items: center;
3439
- gap: var(--profiler-space-3);
3440
- flex: 1;
3441
- min-width: 0;
3442
- }
3443
-
3444
- .ajax-request-path {
3445
- color: var(--profiler-text);
3446
- font-size: var(--profiler-text-sm);
3447
- font-family: var(--profiler-font-mono);
3448
- overflow: hidden;
3449
- text-overflow: ellipsis;
3450
- white-space: nowrap;
3451
- }
3452
-
3453
- .ajax-request-stats {
3454
- display: flex;
3455
- align-items: center;
3456
- gap: var(--profiler-space-3);
3457
- }
3458
-
3459
- .ajax-request-duration {
3460
- color: var(--profiler-accent);
3461
- font-weight: 700;
3462
- font-size: var(--profiler-text-sm);
3463
- font-family: var(--profiler-font-mono);
3464
- }
3465
-
3466
- .ajax-request-meta {
3467
- display: flex;
3468
- justify-content: space-between;
3469
- align-items: center;
3470
- color: var(--profiler-text-muted);
3471
- font-size: var(--profiler-text-sm);
3472
- }
3473
-
3474
- .ajax-request-time {
3475
- font-family: var(--profiler-font-mono);
3476
- font-size: var(--profiler-text-xs);
3477
- }
3478
-
3479
- .ajax-request-link {
3480
- color: var(--profiler-accent);
3481
- text-decoration: none;
3482
- font-weight: 500;
3483
- font-size: var(--profiler-text-sm);
3484
- font-family: var(--profiler-font-mono);
3485
- transition: color var(--profiler-transition-fast);
3486
- }
3487
- .ajax-request-link:hover {
3488
- color: var(--profiler-accent-hover);
3489
- }
3490
-
3491
- .method-badge {
3492
- display: inline-flex;
3493
- align-items: center;
3494
- padding: 2px 7px;
3495
- border-radius: var(--profiler-radius-sm);
3496
- font-size: var(--profiler-text-xs);
3497
- font-weight: 700;
3498
- text-transform: uppercase;
3499
- font-family: var(--profiler-font-mono);
3500
- letter-spacing: 0.05em;
3501
- color: #fff;
3502
- }
3503
- .method-badge.method-get {
3504
- background: var(--profiler-info);
3505
- }
3506
- .method-badge.method-post {
3507
- background: var(--profiler-success);
3508
- }
3509
- .method-badge.method-put {
3510
- background: var(--profiler-warning);
3511
- }
3512
- .method-badge.method-patch {
3513
- background: var(--profiler-warning);
3514
- }
3515
- .method-badge.method-delete {
3516
- background: var(--profiler-error);
3517
- }
3518
- .method-badge.method-head, .method-badge.method-options {
3519
- background: var(--profiler-text-muted);
3520
- }
3521
-
3522
- .status-badge {
3523
- display: inline-flex;
3524
- align-items: center;
3525
- padding: 2px 7px;
3526
- border-radius: var(--profiler-radius-sm);
3527
- font-size: var(--profiler-text-xs);
3528
- font-weight: 700;
3529
- font-family: var(--profiler-font-mono);
3530
- color: #fff;
3531
- }
3532
- .status-badge.status-2xx {
3533
- background: var(--profiler-success);
3534
- }
3535
- .status-badge.status-3xx {
3536
- background: var(--profiler-info);
3537
- }
3538
- .status-badge.status-4xx {
3539
- background: var(--profiler-warning);
3540
- }
3541
- .status-badge.status-5xx {
3542
- background: var(--profiler-error);
3543
- }
3544
- .status-badge.status-other {
3545
- background: var(--profiler-text-muted);
3546
- }
1
+ @import"https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700&family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;1,400&display=swap";:root,[data-theme=dark]{--profiler-terminal-bg: #0a0e15;--profiler-terminal-text: #cdd6e0;--ansi-red: #f87171;--ansi-green: #4ade80;--ansi-yellow: #fbbf24;--ansi-blue: #60a5fa;--ansi-purple: #c084fc;--ansi-cyan: #67e8f9;--profiler-bg: #080b10;--profiler-bg-light: #0d1117;--profiler-bg-lighter: #131920;--profiler-bg-elevated: #1a2030;--profiler-bg-overlay: rgba(8, 11, 16, 0.96);--profiler-text: #eef2f7;--profiler-text-secondary: #a8b4c2;--profiler-text-muted: #5e7080;--profiler-text-subtle: #3d4f5f;--profiler-text-on-accent: #08090c;--profiler-accent: #f59e0b;--profiler-accent-hover: #fbbf24;--profiler-accent-dim: #92600a;--profiler-accent-bg: rgba(245, 158, 11, 0.1);--profiler-accent-glow: rgba(245, 158, 11, 0.35);--profiler-success: #22c55e;--profiler-success-bg: rgba(34, 197, 94, 0.1);--profiler-success-glow: rgba(34, 197, 94, 0.3);--profiler-warning: #fb923c;--profiler-warning-bg: rgba(251, 146, 60, 0.1);--profiler-warning-glow: rgba(251, 146, 60, 0.3);--profiler-error: #f87171;--profiler-error-bg: rgba(248, 113, 113, 0.1);--profiler-error-glow: rgba(248, 113, 113, 0.3);--profiler-info: #60a5fa;--profiler-info-bg: rgba(96, 165, 250, 0.1);--profiler-info-glow: rgba(96, 165, 250, 0.3);--profiler-border: rgba(255, 255, 255, 0.07);--profiler-border-strong: rgba(255, 255, 255, 0.14);--profiler-border-accent: rgba(245, 158, 11, 0.3);--profiler-shadow-sm: 0 1px 4px rgba(0, 0, 0, 0.4);--profiler-shadow-md: 0 4px 16px rgba(0, 0, 0, 0.5);--profiler-shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.6);--profiler-shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.7);--profiler-glass-bg: rgba(13, 17, 23, 0.85);--profiler-glass-border: rgba(255, 255, 255, 0.06);--profiler-blur: blur(20px) saturate(180%)}[data-theme=light]{--profiler-terminal-bg: #1c1f26;--profiler-terminal-text: #d4dbe3;--ansi-red: #f87171;--ansi-green: #4ade80;--ansi-yellow: #fbbf24;--ansi-blue: #60a5fa;--ansi-purple: #c084fc;--ansi-cyan: #67e8f9;--profiler-bg: #f5f3ef;--profiler-bg-light: #edeae3;--profiler-bg-lighter: #e3ded5;--profiler-bg-elevated: #ffffff;--profiler-bg-overlay: rgba(245, 243, 239, 0.96);--profiler-text: #1c1410;--profiler-text-secondary: #4a3f35;--profiler-text-muted: #8a7a6e;--profiler-text-subtle: #b5a898;--profiler-text-on-accent: #ffffff;--profiler-accent: #b45309;--profiler-accent-hover: #92400e;--profiler-accent-dim: #d97706;--profiler-accent-bg: rgba(180, 83, 9, 0.08);--profiler-accent-glow: rgba(180, 83, 9, 0.2);--profiler-success: #15803d;--profiler-success-bg: rgba(21, 128, 61, 0.08);--profiler-success-glow: rgba(21, 128, 61, 0.2);--profiler-warning: #c2410c;--profiler-warning-bg: rgba(194, 65, 12, 0.08);--profiler-warning-glow: rgba(194, 65, 12, 0.2);--profiler-error: #dc2626;--profiler-error-bg: rgba(220, 38, 38, 0.08);--profiler-error-glow: rgba(220, 38, 38, 0.2);--profiler-info: #1d4ed8;--profiler-info-bg: rgba(29, 78, 216, 0.08);--profiler-info-glow: rgba(29, 78, 216, 0.2);--profiler-border: rgba(28, 20, 16, 0.1);--profiler-border-strong: rgba(28, 20, 16, 0.2);--profiler-border-accent: rgba(180, 83, 9, 0.3);--profiler-shadow-sm: 0 1px 3px rgba(28, 20, 16, 0.08);--profiler-shadow-md: 0 4px 12px rgba(28, 20, 16, 0.1);--profiler-shadow-lg: 0 8px 24px rgba(28, 20, 16, 0.12);--profiler-shadow-xl: 0 16px 40px rgba(28, 20, 16, 0.15);--profiler-glass-bg: rgba(245, 243, 239, 0.88);--profiler-glass-border: rgba(28, 20, 16, 0.08);--profiler-blur: blur(16px) saturate(140%)}@media(prefers-color-scheme: light){:root:not([data-theme]){--profiler-terminal-bg: #1c1f26;--profiler-terminal-text: #d4dbe3;--ansi-red: #f87171;--ansi-green: #4ade80;--ansi-yellow: #fbbf24;--ansi-blue: #60a5fa;--ansi-purple: #c084fc;--ansi-cyan: #67e8f9;--profiler-bg: #f5f3ef;--profiler-bg-light: #edeae3;--profiler-bg-lighter: #e3ded5;--profiler-bg-elevated: #ffffff;--profiler-bg-overlay: rgba(245, 243, 239, 0.96);--profiler-text: #1c1410;--profiler-text-secondary: #4a3f35;--profiler-text-muted: #8a7a6e;--profiler-text-subtle: #b5a898;--profiler-text-on-accent: #ffffff;--profiler-accent: #b45309;--profiler-accent-hover: #92400e;--profiler-accent-dim: #d97706;--profiler-accent-bg: rgba(180, 83, 9, 0.08);--profiler-accent-glow: rgba(180, 83, 9, 0.2);--profiler-success: #15803d;--profiler-success-bg: rgba(21, 128, 61, 0.08);--profiler-success-glow: rgba(21, 128, 61, 0.2);--profiler-warning: #c2410c;--profiler-warning-bg: rgba(194, 65, 12, 0.08);--profiler-warning-glow: rgba(194, 65, 12, 0.2);--profiler-error: #dc2626;--profiler-error-bg: rgba(220, 38, 38, 0.08);--profiler-error-glow: rgba(220, 38, 38, 0.2);--profiler-info: #1d4ed8;--profiler-info-bg: rgba(29, 78, 216, 0.08);--profiler-info-glow: rgba(29, 78, 216, 0.2);--profiler-border: rgba(28, 20, 16, 0.1);--profiler-border-strong: rgba(28, 20, 16, 0.2);--profiler-border-accent: rgba(180, 83, 9, 0.3);--profiler-shadow-sm: 0 1px 3px rgba(28, 20, 16, 0.08);--profiler-shadow-md: 0 4px 12px rgba(28, 20, 16, 0.1);--profiler-shadow-lg: 0 8px 24px rgba(28, 20, 16, 0.12);--profiler-shadow-xl: 0 16px 40px rgba(28, 20, 16, 0.15);--profiler-glass-bg: rgba(245, 243, 239, 0.88);--profiler-glass-border: rgba(28, 20, 16, 0.08);--profiler-blur: blur(16px) saturate(140%)}}:root{--profiler-font-sans: 'Outfit', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;--profiler-font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;--profiler-text-xs: 10px;--profiler-text-sm: 11px;--profiler-text-base: 13px;--profiler-text-lg: 15px;--profiler-text-xl: 18px;--profiler-text-2xl: 22px;--profiler-text-3xl: 28px;--profiler-space-1: 4px;--profiler-space-2: 8px;--profiler-space-3: 12px;--profiler-space-4: 16px;--profiler-space-6: 24px;--profiler-space-8: 32px;--profiler-space-12: 48px;--profiler-radius-sm: 4px;--profiler-radius-md: 6px;--profiler-radius-lg: 10px;--profiler-radius-full: 9999px;--profiler-transition-fast: 120ms cubic-bezier(0.4, 0, 0.2, 1);--profiler-transition-base: 220ms cubic-bezier(0.4, 0, 0.2, 1);--profiler-transition-slow: 350ms cubic-bezier(0.4, 0, 0.2, 1);--profiler-transition-elastic: 500ms cubic-bezier(0.34, 1.56, 0.64, 1);--profiler-z-toolbar: 999999;--profiler-z-panel: 1000000;--profiler-z-modal: 1000001}.profiler-theme-toggle{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;background:var(--profiler-bg-lighter);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-sm);cursor:pointer;transition:all var(--profiler-transition-base);color:var(--profiler-text-muted);font-size:14px}.profiler-theme-toggle:hover{background:var(--profiler-accent-bg);border-color:var(--profiler-border-accent);color:var(--profiler-accent);transform:scale(1.08)}.profiler-theme-toggle:active{transform:scale(0.94)}*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}body{font-family:var(--profiler-font-sans);background:var(--profiler-bg);color:var(--profiler-text);line-height:1.6;font-size:var(--profiler-text-base);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.container{max-width:1400px;margin:0 auto;padding:var(--profiler-space-8) var(--profiler-space-6)}@media(max-width: 768px){.container{padding:var(--profiler-space-6) var(--profiler-space-4)}}.header{margin-bottom:var(--profiler-space-8);padding-bottom:var(--profiler-space-6);border-bottom:1px solid var(--profiler-border);animation:fadeInDown 400ms cubic-bezier(0.4, 0, 0.2, 1) both}.header h1{font-size:var(--profiler-text-3xl);font-weight:700;letter-spacing:-0.03em;line-height:1.15;margin-bottom:var(--profiler-space-2);color:var(--profiler-text);background:linear-gradient(125deg, var(--profiler-accent) 0%, var(--profiler-accent-hover) 60%, var(--profiler-warning) 100%);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}.header h1 .h1-emoji{-webkit-text-fill-color:initial}.header h1 a{color:inherit;text-decoration:none;background:inherit;-webkit-background-clip:inherit;-webkit-text-fill-color:inherit;background-clip:inherit}.header h1 a:hover{opacity:.75}@media(max-width: 768px){.header h1{font-size:var(--profiler-text-2xl)}}.header p{font-size:var(--profiler-text-sm);color:var(--profiler-text-muted);font-family:var(--profiler-font-mono);letter-spacing:.03em}a{color:var(--profiler-accent);text-decoration:none;transition:color var(--profiler-transition-fast)}a:hover{color:var(--profiler-accent-hover)}a:focus-visible{outline:2px solid var(--profiler-border-accent);outline-offset:2px;border-radius:var(--profiler-radius-sm)}code,pre{font-family:var(--profiler-font-mono)}code{background:var(--profiler-accent-bg);color:var(--profiler-accent);padding:2px 6px;border-radius:var(--profiler-radius-sm);border:1px solid var(--profiler-border-accent);font-size:var(--profiler-text-sm)}pre{background:rgba(0,0,0,.25);padding:var(--profiler-space-4);border-radius:var(--profiler-radius-md);border:1px solid var(--profiler-border);overflow-x:auto;line-height:1.65;color:var(--profiler-text-secondary)}pre code{background:none;padding:0;border:none;color:inherit;font-size:inherit}[data-theme=light] pre{background:rgba(0,0,0,.03)}table{width:100%;border-collapse:collapse;font-size:var(--profiler-text-base)}table th{text-align:left;font-weight:600;font-size:var(--profiler-text-xs);text-transform:uppercase;letter-spacing:.08em;color:var(--profiler-text-muted);padding:var(--profiler-space-2) var(--profiler-space-3);border-bottom:1px solid var(--profiler-border-strong);background:var(--profiler-bg-light);white-space:nowrap}table td{padding:var(--profiler-space-3);border-bottom:1px solid var(--profiler-border);color:var(--profiler-text);vertical-align:middle;font-size:var(--profiler-text-base)}table tr:last-child td{border-bottom:none}table tr:hover td{background:var(--profiler-bg-lighter)}table a{font-family:var(--profiler-font-mono);font-size:var(--profiler-text-sm)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:rgba(0,0,0,0)}::-webkit-scrollbar-thumb{background:var(--profiler-border-strong);border-radius:var(--profiler-radius-full)}::-webkit-scrollbar-thumb:hover{background:var(--profiler-text-subtle)}::selection{background:var(--profiler-accent-bg);color:var(--profiler-text)}:focus-visible{outline:2px solid var(--profiler-accent);outline-offset:2px;border-radius:var(--profiler-radius-sm)}.card{background:var(--profiler-bg-light);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-lg);padding:var(--profiler-space-6);box-shadow:var(--profiler-shadow-md);transition:all var(--profiler-transition-base)}.card:hover{border-color:var(--profiler-border-strong);box-shadow:var(--profiler-shadow-lg);transform:translateY(-2px)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--profiler-space-2);padding:var(--profiler-space-2) var(--profiler-space-4);font-family:var(--profiler-font-sans);font-size:var(--profiler-text-base);font-weight:600;border-radius:var(--profiler-radius-sm);border:1px solid rgba(0,0,0,0);cursor:pointer;transition:all var(--profiler-transition-base);text-decoration:none;white-space:nowrap;letter-spacing:.01em}.btn:disabled{opacity:.45;cursor:not-allowed}.btn.btn-primary{background:var(--profiler-accent-bg);color:var(--profiler-accent);border-color:var(--profiler-border-accent)}.btn.btn-primary:hover:not(:disabled){background:var(--profiler-accent);color:var(--profiler-text-on-accent);transform:translateY(-1px);box-shadow:0 4px 16px var(--profiler-accent-glow)}.btn.btn-secondary{background:var(--profiler-bg-lighter);color:var(--profiler-text-secondary);border-color:var(--profiler-border)}.btn.btn-secondary:hover:not(:disabled){background:var(--profiler-bg-elevated);border-color:var(--profiler-border-strong);color:var(--profiler-text)}.btn.btn-sm{padding:var(--profiler-space-1) var(--profiler-space-3);font-size:var(--profiler-text-sm)}.btn.btn-danger{background:rgba(0,0,0,0);color:var(--profiler-error);border-color:var(--profiler-error)}.btn.btn-danger:hover:not(:disabled){background:var(--profiler-error);color:#fff}.profiler-load-more{display:flex;justify-content:center;padding:var(--profiler-space-4) 0 var(--profiler-space-2)}.token-copy{background:none;border:none;cursor:pointer;font-family:var(--profiler-font-mono);font-size:var(--profiler-text-xs);color:var(--profiler-text-muted);padding:2px 4px;border-radius:var(--profiler-radius-sm);transition:color var(--profiler-transition-base),background var(--profiler-transition-base)}.token-copy:hover{color:var(--profiler-accent);background:var(--profiler-accent-bg)}.btn-row-delete{background:none;border:none;cursor:pointer;color:var(--profiler-text-muted);font-size:var(--profiler-text-base);line-height:1;padding:2px 6px;border-radius:var(--profiler-radius-sm);transition:color var(--profiler-transition-base),background var(--profiler-transition-base);opacity:0}tr:hover .btn-row-delete{opacity:1}.btn-row-delete:hover{color:var(--profiler-error);background:var(--profiler-error-bg)}.badge,[class*=badge-]{display:inline-flex;align-items:center;padding:2px 7px;border-radius:var(--profiler-radius-sm);font-family:var(--profiler-font-mono);font-size:var(--profiler-text-xs);font-weight:600;letter-spacing:.04em;white-space:nowrap}.badge{background:var(--profiler-bg-lighter);color:var(--profiler-text-secondary);border:1px solid var(--profiler-border)}.badge-success{background:var(--profiler-success-bg);color:var(--profiler-success);border:1px solid rgba(34,197,94,.2)}.badge-warning{background:var(--profiler-warning-bg);color:var(--profiler-warning);border:1px solid rgba(251,146,60,.2)}.badge-error{background:var(--profiler-error-bg);color:var(--profiler-error);border:1px solid rgba(248,113,113,.2)}.badge-info{background:var(--profiler-info-bg);color:var(--profiler-info);border:1px solid rgba(96,165,250,.2)}.badge-default{background:var(--profiler-bg-lighter);color:var(--profiler-text-muted);border:1px solid var(--profiler-border)}.profiler-version-badge{display:inline-flex;align-items:center;padding:1px 6px;border-radius:var(--profiler-radius-sm);font-family:var(--profiler-font-mono);font-size:var(--profiler-text-xs);color:var(--profiler-text-muted);background:var(--profiler-bg-lighter);border:1px solid var(--profiler-border)}.profiler-version-warn{margin-left:6px;cursor:help;font-size:var(--profiler-text-xs)}.profiler-version-mismatch{margin-top:var(--profiler-space-2);padding:var(--profiler-space-2) var(--profiler-space-3);border-radius:var(--profiler-radius-sm);font-size:var(--profiler-text-sm);background:var(--profiler-warning-bg);color:var(--profiler-warning);border:1px solid rgba(251,146,60,.3)}@keyframes fadeInDown{from{opacity:0;transform:translateY(-12px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeInUp{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{to{transform:rotate(360deg)}}.profiler-spinner{display:inline-block;animation:spin 1s linear infinite}@keyframes pulse{0%,100%{opacity:1}50%{opacity:.45}}.animate-fade-in{animation:fadeIn 300ms ease both}.animate-fade-in-up{animation:fadeInUp 400ms ease both}.loading-spinner{display:inline-block;width:18px;height:18px;border:2px solid var(--profiler-border-strong);border-top-color:var(--profiler-accent);border-radius:50%;animation:spin 700ms linear infinite}@media(max-width: 768px){.hidden-mobile{display:none !important}}@media(min-width: 769px){.hidden-desktop{display:none !important}}.profiler-flex{display:flex;align-items:center}.profiler-flex--center{justify-content:center}.profiler-flex--between{justify-content:space-between}.profiler-flex--column{flex-direction:column;align-items:flex-start}.profiler-flex--gap-1{gap:var(--profiler-space-1)}.profiler-flex--gap-2{gap:var(--profiler-space-2)}.profiler-flex--gap-3{gap:var(--profiler-space-3)}.profiler-flex--gap-4{gap:var(--profiler-space-4)}.profiler-flex--gap-6{gap:var(--profiler-space-6)}.profiler-grid{display:grid;gap:var(--profiler-space-4)}.profiler-grid--2{grid-template-columns:repeat(2, 1fr)}.profiler-grid--3{grid-template-columns:repeat(3, 1fr)}.profiler-grid--auto{grid-template-columns:repeat(auto-fit, minmax(180px, 1fr))}.profiler-mt-1{margin-top:var(--profiler-space-1)}.profiler-mt-2{margin-top:var(--profiler-space-2)}.profiler-mt-3{margin-top:var(--profiler-space-3)}.profiler-mt-4{margin-top:var(--profiler-space-4)}.profiler-mt-6{margin-top:var(--profiler-space-6)}.profiler-mt-8{margin-top:var(--profiler-space-8)}.profiler-mb-1{margin-bottom:var(--profiler-space-1)}.profiler-mb-2{margin-bottom:var(--profiler-space-2)}.profiler-mb-3{margin-bottom:var(--profiler-space-3)}.profiler-mb-4{margin-bottom:var(--profiler-space-4)}.profiler-mb-6{margin-bottom:var(--profiler-space-6)}.profiler-p-2{padding:var(--profiler-space-2)}.profiler-p-3{padding:var(--profiler-space-3)}.profiler-p-4{padding:var(--profiler-space-4)}.profiler-p-6{padding:var(--profiler-space-6)}.profiler-text--xs{font-size:var(--profiler-text-xs)}.profiler-text--sm{font-size:var(--profiler-text-sm)}.profiler-text--base{font-size:var(--profiler-text-base)}.profiler-text--lg{font-size:var(--profiler-text-lg)}.profiler-text--xl{font-size:var(--profiler-text-xl)}.profiler-text--2xl{font-size:var(--profiler-text-2xl)}.profiler-text--muted{color:var(--profiler-text-muted)}.profiler-text--subtle{color:var(--profiler-text-subtle)}.profiler-text--secondary{color:var(--profiler-text-secondary)}.profiler-text--success{color:var(--profiler-success)}.profiler-text--warning{color:var(--profiler-warning)}.profiler-text--error{color:var(--profiler-error)}.profiler-text--accent{color:var(--profiler-accent)}.profiler-text--uppercase{text-transform:uppercase;letter-spacing:.08em}.profiler-text--mono{font-family:var(--profiler-font-mono)}.profiler-text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.profiler-text--break{word-break:break-all}.profiler-panel{background:var(--profiler-bg-elevated);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-md);padding:var(--profiler-space-4)}.profiler-panel--sm{padding:var(--profiler-space-3)}.profiler-panel--lg{padding:var(--profiler-space-6)}.profiler-stat-card{background:var(--profiler-bg-light);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-md);padding:var(--profiler-space-4);transition:all var(--profiler-transition-base)}.profiler-stat-card:hover{border-color:var(--profiler-border-accent);box-shadow:var(--profiler-shadow-sm);transform:translateY(-2px)}.profiler-stat-card__label{font-size:var(--profiler-text-xs);text-transform:uppercase;letter-spacing:.1em;color:var(--profiler-text-muted);margin-bottom:var(--profiler-space-2);font-family:var(--profiler-font-mono)}.profiler-stat-card__value{font-size:var(--profiler-text-2xl);font-weight:700;font-family:var(--profiler-font-mono);color:var(--profiler-accent);line-height:1.1}.profiler-stat-card__value small{font-size:var(--profiler-text-sm);color:var(--profiler-text-muted);font-weight:500;margin-left:var(--profiler-space-1)}.profiler-kv-row{display:flex;justify-content:space-between;align-items:center;padding:var(--profiler-space-2) 0;border-bottom:1px solid var(--profiler-border);gap:var(--profiler-space-4)}.profiler-kv-row:last-child{border-bottom:none}.profiler-kv-row>span:first-child{color:var(--profiler-text-muted);font-size:var(--profiler-text-sm);flex-shrink:0}.profiler-kv-row>*:last-child{color:var(--profiler-text);font-weight:600;font-family:var(--profiler-font-mono);font-size:var(--profiler-text-sm);text-align:right}.profiler-query-card{background:var(--profiler-bg-light);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-md);padding:var(--profiler-space-3);margin-bottom:var(--profiler-space-3);transition:all var(--profiler-transition-base)}.profiler-query-card:hover{border-color:var(--profiler-border-strong);transform:translateX(3px);box-shadow:var(--profiler-shadow-sm)}.profiler-query-card--slow{border-left:3px solid var(--profiler-error);background:var(--profiler-error-bg)}.profiler-query-card--slow:hover{box-shadow:0 0 16px var(--profiler-error-glow)}.profiler-query-card--success{border-left:3px solid var(--profiler-success)}.profiler-query-card__header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--profiler-space-2);gap:var(--profiler-space-3)}.profiler-query-card__duration{font-weight:700;font-family:var(--profiler-font-mono);font-size:var(--profiler-text-sm);color:var(--profiler-accent)}.profiler-query-card__duration--slow{color:var(--profiler-error)}.profiler-query-card__duration--fast{color:var(--profiler-success)}.profiler-query-card__code{font-size:var(--profiler-text-sm);color:var(--profiler-info);font-family:var(--profiler-font-mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;line-height:1.5}.profiler-query-card--n1{border-left:3px solid var(--profiler-warning);background:var(--profiler-warning-bg)}.profiler-n1-group{border:1px solid var(--profiler-warning);border-radius:var(--profiler-radius-md);overflow:hidden}.profiler-n1-group__header{display:flex;align-items:center;gap:var(--profiler-space-3);padding:var(--profiler-space-2) var(--profiler-space-3);background:var(--profiler-warning-bg);cursor:pointer;user-select:none}.profiler-n1-group__header:hover{filter:brightness(0.97)}.profiler-n1-group__count{font-size:var(--profiler-text-xs);font-weight:700;font-family:var(--profiler-font-mono);color:var(--profiler-warning);white-space:nowrap}.profiler-n1-group__pattern{flex:1;font-size:var(--profiler-text-xs);font-family:var(--profiler-font-mono);color:var(--profiler-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.profiler-n1-group__toggle{font-size:var(--profiler-text-xs);color:var(--profiler-text-muted);white-space:nowrap}.profiler-n1-backtrace{background:var(--profiler-bg-lighter);border-top:1px solid var(--profiler-border);padding:var(--profiler-space-2) var(--profiler-space-3)}.profiler-n1-backtrace__frame{font-size:var(--profiler-text-xs);font-family:var(--profiler-font-mono);color:var(--profiler-text-muted);line-height:1.8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.profiler-alert-banner{display:flex;align-items:flex-start;gap:var(--profiler-space-3);padding:var(--profiler-space-3) var(--profiler-space-4);border-radius:var(--profiler-radius-md);border:1px solid;font-size:var(--profiler-text-sm)}.profiler-alert-banner--warning{background:var(--profiler-warning-bg);border-color:var(--profiler-warning);color:var(--profiler-text)}.profiler-alert-banner--error{background:var(--profiler-error-bg);border-color:var(--profiler-error)}.profiler-alert-banner__icon{flex-shrink:0;font-size:var(--profiler-text-base)}.profiler-badge{display:inline-block;padding:1px 6px;border-radius:var(--profiler-radius-sm);font-size:var(--profiler-text-xs);font-weight:600;font-family:var(--profiler-font-mono);line-height:1.6}.profiler-badge--warning{background:var(--profiler-warning-bg);color:var(--profiler-warning);border:1px solid rgba(251,146,60,.3)}.profiler-badge--error{background:var(--profiler-error-bg);color:var(--profiler-error)}.profiler-btn{display:inline-flex;align-items:center;gap:var(--profiler-space-1);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-sm);background:var(--profiler-bg-elevated);color:var(--profiler-text-muted);font-size:var(--profiler-text-sm);font-family:var(--profiler-font-mono);cursor:pointer;transition:all var(--profiler-transition-base)}.profiler-btn:hover{border-color:var(--profiler-accent);color:var(--profiler-accent)}.profiler-btn--sm{padding:1px 8px;font-size:var(--profiler-text-xs)}.profiler-modal__overlay{position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:9000;display:flex;align-items:center;justify-content:center;padding:var(--profiler-space-4)}.profiler-modal{background:var(--profiler-bg-elevated);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-lg, var(--profiler-radius-md));box-shadow:var(--profiler-shadow-lg, var(--profiler-shadow-sm));width:100%;max-width:760px;max-height:80vh;display:flex;flex-direction:column;overflow:hidden}.profiler-modal__header{display:flex;align-items:center;gap:var(--profiler-space-3);padding:var(--profiler-space-3) var(--profiler-space-4);border-bottom:1px solid var(--profiler-border);background:var(--profiler-bg-light);flex-shrink:0}.profiler-modal__title{font-weight:600;font-family:var(--profiler-font-mono);font-size:var(--profiler-text-sm);flex:1}.profiler-modal__close{background:none;border:none;color:var(--profiler-text-muted);font-size:var(--profiler-text-lg);cursor:pointer;padding:0 var(--profiler-space-1);line-height:1}.profiler-modal__close:hover{color:var(--profiler-text)}.profiler-modal__body{padding:var(--profiler-space-4);overflow-y:auto;flex:1}.profiler-explain-result{font-family:var(--profiler-font-mono);font-size:var(--profiler-text-xs);color:var(--profiler-text);white-space:pre-wrap;word-break:break-all;line-height:1.6;margin:0}.profiler-explain-node{padding:var(--profiler-space-1) var(--profiler-space-2);margin-bottom:2px;border-radius:var(--profiler-radius-sm);font-family:var(--profiler-font-mono);font-size:var(--profiler-text-xs)}.profiler-explain-node--expensive{background:var(--profiler-error-bg);border-left:2px solid var(--profiler-error)}.profiler-explain-node__type{font-weight:600;color:var(--profiler-accent)}.profiler-explain-node__stats{display:flex;gap:var(--profiler-space-3);margin-top:1px;flex-wrap:wrap}.profiler-dump-card{background:var(--profiler-bg-light);border:1px solid var(--profiler-border);border-left:3px solid var(--profiler-warning);border-radius:var(--profiler-radius-md);padding:var(--profiler-space-4);margin-bottom:var(--profiler-space-4)}.profiler-dump-card__header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:var(--profiler-space-3)}.profiler-dump-card__label{display:inline-block;background:var(--profiler-warning-bg);color:var(--profiler-warning);border:1px solid rgba(251,146,60,.3);padding:2px 8px;border-radius:var(--profiler-radius-sm);font-size:var(--profiler-text-xs);font-weight:600;font-family:var(--profiler-font-mono);margin-left:var(--profiler-space-2)}.profiler-dump-card__location{font-size:var(--profiler-text-xs);color:var(--profiler-info);font-family:var(--profiler-font-mono);text-align:right}.profiler-dump-card__content{background:var(--profiler-bg-lighter);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-sm);padding:var(--profiler-space-3);overflow-x:auto}.profiler-dump-card__content pre{color:var(--profiler-warning);margin:0;font-size:var(--profiler-text-sm);line-height:1.6;background:none;border:none;padding:0}.profiler-ajax-card{background:var(--profiler-bg-light);border:1px solid var(--profiler-border);border-left:3px solid;border-radius:var(--profiler-radius-md);padding:var(--profiler-space-3);margin-bottom:var(--profiler-space-2);transition:all var(--profiler-transition-base)}.profiler-ajax-card--success{border-left-color:var(--profiler-success)}.profiler-ajax-card--error{border-left-color:var(--profiler-error)}.profiler-ajax-card:hover{background:var(--profiler-bg-elevated);transform:translateX(3px);box-shadow:var(--profiler-shadow-sm)}.profiler-ajax-card__row{display:flex;justify-content:space-between;align-items:center;gap:var(--profiler-space-3)}.profiler-ajax-card__row+.profiler-ajax-card__row{margin-top:var(--profiler-space-2)}.profiler-ajax-card__path{color:var(--profiler-text-secondary);font-size:var(--profiler-text-sm);font-family:var(--profiler-font-mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.profiler-ajax-card__time{font-size:var(--profiler-text-xs);color:var(--profiler-text-muted);font-family:var(--profiler-font-mono)}.profiler-empty{display:flex;flex-direction:column;align-items:center;padding:var(--profiler-space-12) var(--profiler-space-6);text-align:center;color:var(--profiler-text-muted)}.profiler-empty__icon{font-size:52px;margin-bottom:var(--profiler-space-4);opacity:.4;filter:grayscale(1)}.profiler-empty__title{font-size:var(--profiler-text-lg);font-weight:600;color:var(--profiler-text);margin-bottom:var(--profiler-space-3)}.profiler-empty__description{font-size:var(--profiler-text-base);line-height:1.7;max-width:420px;color:var(--profiler-text-muted)}.profiler-empty__description code{background:var(--profiler-accent-bg);color:var(--profiler-accent);border:1px solid var(--profiler-border-accent)}.profiler-divider{border:none;border-top:1px solid var(--profiler-border);margin:var(--profiler-space-4) 0}.profiler-divider--strong{border-top-color:var(--profiler-border-strong)}.profiler-divider--sm{margin:var(--profiler-space-2) 0}.profiler-divider--lg{margin:var(--profiler-space-6) 0}.profiler-more{text-align:center;padding:var(--profiler-space-3) var(--profiler-space-4);color:var(--profiler-text-muted);font-size:var(--profiler-text-xs);font-family:var(--profiler-font-mono);letter-spacing:.05em;border-top:1px dashed var(--profiler-border);margin-top:var(--profiler-space-2)}.profiler-float-right{float:right}.profiler-float-left{float:left}.profiler-clearfix::after{content:"";display:table;clear:both}.profiler-code{background:var(--profiler-bg-light);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-md);font-family:var(--profiler-font-mono);font-size:var(--profiler-text-xs);color:var(--profiler-text);padding:var(--profiler-space-3);margin:0;white-space:pre-wrap;word-break:break-all;overflow-x:auto;line-height:1.6}.profiler-body-csv{width:100%;border-collapse:collapse;font-size:var(--profiler-text-xs);font-family:var(--profiler-font-mono)}.profiler-body-csv th{background:var(--profiler-bg-elevated);color:var(--profiler-text-muted);font-weight:600;text-align:left;padding:4px 8px;border:1px solid var(--profiler-border);white-space:nowrap}.profiler-body-csv td{padding:3px 8px;border:1px solid var(--profiler-border);color:var(--profiler-text);word-break:break-all}.profiler-body-csv tbody tr:nth-child(even){background:var(--profiler-bg-elevated)}.profiler-body-binary{display:flex;flex-direction:column;gap:var(--profiler-space-2);padding:var(--profiler-space-3);background:var(--profiler-bg-elevated);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-md)}.profiler-body-preview-frame{width:100%;height:400px;border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-sm)}.profiler-body-download-btn{display:inline-flex;align-items:center;gap:var(--profiler-space-1);padding:4px 10px;background:var(--profiler-accent-bg);color:var(--profiler-accent);border:1px solid var(--profiler-border-accent);border-radius:var(--profiler-radius-sm);text-decoration:none;font-family:var(--profiler-font-mono);transition:all var(--profiler-transition-base)}.profiler-body-download-btn:hover{background:var(--profiler-accent);color:#fff}.profiler-flex-table{display:flex;flex-direction:column}.profiler-flex-table__header{display:flex;align-items:center;gap:var(--profiler-space-3);padding:var(--profiler-space-2) var(--profiler-space-3);background:var(--profiler-bg-light);border-bottom:1px solid var(--profiler-border-strong);font-weight:600;font-size:var(--profiler-text-xs);text-transform:uppercase;letter-spacing:.08em;color:var(--profiler-text-muted)}.profiler-flex-table__row{display:flex;align-items:center;gap:var(--profiler-space-3);padding:var(--profiler-space-3);border-bottom:1px solid var(--profiler-border);color:var(--profiler-text)}.profiler-flex-table__row--matched{background:var(--profiler-success-bg);border-left:2px solid var(--profiler-success)}.profiler-flex-table__cell{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.profiler-flex-table__cell--fixed{flex:0 0 auto}.profiler-flex-table__cell--muted{color:var(--profiler-text-muted)}@keyframes pfPop{0%{transform:scaleX(1)}15%{transform:scaleX(1.18)}40%{transform:scaleX(0.87)}65%{transform:scaleX(1.08)}85%{transform:scaleX(0.97)}100%{transform:scaleX(1)}}#profiler-toolbar{position:fixed;bottom:0;left:0;right:0;height:44px;background:var(--profiler-glass-bg);backdrop-filter:var(--profiler-blur);-webkit-backdrop-filter:var(--profiler-blur);border-top:1px solid var(--profiler-border-strong);z-index:var(--profiler-z-toolbar);font-family:var(--profiler-font-mono);font-size:11px;animation:toolbarIn 300ms cubic-bezier(0.4, 0, 0.2, 1) both;transition:left 280ms cubic-bezier(0.4, 0, 0.2, 1)}#profiler-toolbar::before{content:"";position:absolute;top:-1px;left:0;right:0;height:1px;background:linear-gradient(90deg, transparent 0%, var(--profiler-accent) 15%, var(--profiler-accent-hover) 50%, var(--profiler-accent) 85%, transparent 100%);opacity:.65}@keyframes toolbarIn{from{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}.profiler-toolbar-container{display:flex;align-items:stretch;height:100%}.profiler-toolbar-item{position:relative;display:inline-flex;align-items:center;gap:5px;padding:0 16px;color:var(--profiler-text-muted);text-decoration:none;white-space:nowrap;font-weight:500;letter-spacing:.01em;cursor:default;background:rgba(0,0,0,0);border:none;border-right:1px solid var(--profiler-border);transition:color var(--profiler-transition-fast),background var(--profiler-transition-fast)}.profiler-toolbar-item::after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--profiler-accent);transform:scaleX(0);transform-origin:left;transition:transform 280ms cubic-bezier(0.34, 1.4, 0.64, 1)}.profiler-toolbar-item:last-child{border-right:none}.profiler-toolbar-item:hover{color:var(--profiler-text);background:var(--profiler-accent-bg)}.profiler-toolbar-item:hover::after{transform:scaleX(1)}.profiler-toolbar-collapse-btn{margin-left:auto;padding:0 14px;border-left:1px solid var(--profiler-border);font-size:10px;color:var(--profiler-text-muted);cursor:pointer}.profiler-toolbar-collapse-btn:hover{color:var(--profiler-text);background:var(--profiler-accent-bg);animation:pfPop 380ms ease-out both}a.profiler-toolbar-item{cursor:pointer;font-family:var(--profiler-font-mono);font-size:11px}.profiler-toolbar-logo{border-right:1px solid var(--profiler-border) !important}.profiler-text--success{color:var(--profiler-success) !important}.profiler-text--warning{color:var(--profiler-warning) !important}.profiler-text--error{color:var(--profiler-error) !important}.profiler-text--info{color:var(--profiler-info) !important}.profiler-text--muted{color:var(--profiler-text-muted) !important}.profiler-text--accent{color:var(--profiler-accent) !important}.profiler-toolbar-item.profiler-text--error::after{background:var(--profiler-error)}.profiler-toolbar-item.profiler-text--warning::after{background:var(--profiler-warning)}.profiler-toolbar-item.profiler-text--success::after{background:var(--profiler-success)}.profiler-toolbar-item.profiler-text--info::after{background:var(--profiler-info)}.profiler-toolbar-hoverable{position:relative}.profiler-toolbar-hoverable .profiler-toolbar-panel{position:absolute;bottom:calc(100% + 12px);left:50%;transform:translateX(-50%);min-width:320px;max-width:440px;background:var(--profiler-bg-elevated);border:1px solid var(--profiler-border-strong);border-radius:var(--profiler-radius-lg);box-shadow:var(--profiler-shadow-xl),0 0 0 1px var(--profiler-border-accent);z-index:var(--profiler-z-panel);overflow:hidden;opacity:0;visibility:hidden;pointer-events:none;transition:opacity 160ms cubic-bezier(0.4, 0, 0.2, 1),visibility 0s linear 160ms}.profiler-toolbar-hoverable .profiler-toolbar-panel.is-visible{opacity:1;visibility:visible;pointer-events:auto;transition:opacity 160ms cubic-bezier(0.4, 0, 0.2, 1),visibility 0s}.profiler-toolbar-hoverable .profiler-toolbar-panel::before{content:"";position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg, var(--profiler-accent) 0%, var(--profiler-accent-hover) 100%)}.profiler-toolbar-hoverable .profiler-toolbar-panel::after{content:"";position:absolute;top:100%;left:50%;transform:translateX(-50%);border:6px solid rgba(0,0,0,0);border-top-color:var(--profiler-border-strong)}.profiler-toolbar-hoverable .profiler-toolbar-panel.profiler-toolbar-panel-large{min-width:440px;max-width:580px}.profiler-toolbar-panel-header{display:flex;align-items:center;justify-content:space-between;padding:11px 16px 9px;font-size:10px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--profiler-accent);background:var(--profiler-accent-bg);border-bottom:1px solid var(--profiler-border);font-family:var(--profiler-font-mono)}.profiler-float-right{color:var(--profiler-text-muted);font-weight:400;text-transform:none;letter-spacing:0;font-size:10px;font-family:var(--profiler-font-mono)}.profiler-toolbar-panel-content{padding:10px 16px 14px;max-height:420px;overflow-y:auto;font-size:11px;font-family:var(--profiler-font-mono);scrollbar-width:thin;scrollbar-color:var(--profiler-border-strong) rgba(0,0,0,0)}.profiler-toolbar-panel-content::-webkit-scrollbar{width:4px}.profiler-toolbar-panel-content::-webkit-scrollbar-thumb{background:var(--profiler-border-strong);border-radius:var(--profiler-radius-full)}.profiler-toolbar-panel-row{display:flex;justify-content:space-between;align-items:baseline;padding:6px 0;border-bottom:1px solid var(--profiler-border);gap:12px}.profiler-toolbar-panel-row:last-child{border-bottom:none}.profiler-toolbar-panel-row span{color:var(--profiler-text-muted);font-size:10px;flex-shrink:0}.profiler-toolbar-panel-row strong{color:var(--profiler-text);font-weight:600;text-align:right;font-variant-numeric:tabular-nums;word-break:break-all}.profiler-section__header{font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--profiler-accent);padding:10px 0 4px;border-bottom:1px solid var(--profiler-border-accent);margin-bottom:6px;font-family:var(--profiler-font-mono)}.profiler-section__header:first-child{padding-top:4px}.profiler-toolbar-panel-query{padding:9px 10px;background:var(--profiler-bg-lighter);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-sm);margin-bottom:6px;transition:all var(--profiler-transition-fast)}.profiler-toolbar-panel-query:last-child{margin-bottom:0}.profiler-toolbar-panel-query:hover{border-color:var(--profiler-border-strong);transform:translateX(2px)}.profiler-toolbar-panel-query.profiler-toolbar-panel-query-slow{border-left:2px solid var(--profiler-error);background:var(--profiler-error-bg)}.profiler-toolbar-panel-query code{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--profiler-info);font-size:10px;line-height:1.5;margin-top:4px}.profiler-more{text-align:center;padding:8px;color:var(--profiler-text-muted);font-size:10px;letter-spacing:.05em;border-top:1px dashed var(--profiler-border);margin-top:6px}#profiler-toolbar[data-collapsed=true] .profiler-toolbar-item:not(.profiler-toolbar-collapse-btn){display:none}#profiler-toolbar[data-collapsed=true] .profiler-toolbar-collapse-btn{margin-left:0}#profiler-toolbar[data-collapsed=true]::before{opacity:0}.container>table{width:100%;border-collapse:collapse;background:var(--profiler-bg-light);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-lg);overflow:hidden;box-shadow:var(--profiler-shadow-md)}.container>table thead{background:var(--profiler-accent-bg);border-bottom:1px solid var(--profiler-border-accent)}.container>table thead th{font-weight:600;font-size:var(--profiler-text-xs);letter-spacing:.1em;text-transform:uppercase;color:var(--profiler-accent);padding:14px 20px;border-bottom:none;background:rgba(0,0,0,0)}.container>table tbody td{padding:14px 20px;font-size:var(--profiler-text-base);color:var(--profiler-text-secondary);border-bottom:1px solid var(--profiler-border);vertical-align:middle}.container>table tbody tr:last-child td{border-bottom:none}.container>table tbody tr:hover td{background:var(--profiler-accent-bg);color:var(--profiler-text)}.container>table tbody tr:hover td:first-child{border-left:2px solid var(--profiler-accent);padding-left:18px}.container>table a{font-family:var(--profiler-font-mono);font-size:var(--profiler-text-sm);color:var(--profiler-accent)}.container>table a:hover{color:var(--profiler-accent-hover)}.tabs{display:flex;align-items:center;border-bottom:1px solid var(--profiler-border);margin-bottom:var(--profiler-space-6);gap:2px;overflow-x:auto;scrollbar-width:none}.tabs::-webkit-scrollbar{display:none}.btn-refresh{flex-shrink:0;background:none;border:none;cursor:pointer;color:var(--profiler-text-muted);font-size:1.1rem;line-height:1;padding:4px 8px;border-radius:var(--profiler-radius-sm);transition:color var(--profiler-transition-base),background var(--profiler-transition-base);margin-bottom:-1px}.btn-refresh:hover:not(:disabled){color:var(--profiler-accent);background:var(--profiler-accent-bg)}.btn-refresh:disabled{cursor:not-allowed}.btn-refresh--spinning{animation:profiler-spin .7s linear infinite}@keyframes profiler-spin{to{transform:rotate(360deg)}}.tab{position:relative;display:flex;align-items:center;gap:6px;padding:12px 18px;color:var(--profiler-text-muted);text-decoration:none;font-size:var(--profiler-text-base);font-weight:500;white-space:nowrap;border-bottom:2px solid rgba(0,0,0,0);transition:color var(--profiler-transition-fast),border-color var(--profiler-transition-fast);font-family:var(--profiler-font-sans);cursor:pointer;background:none;border-top:none;border-left:none;border-right:none}.tab:hover{color:var(--profiler-text);background:var(--profiler-accent-bg)}.tab.active{color:var(--profiler-accent);border-bottom-color:var(--profiler-accent);font-weight:600}.tab .tab-icon{font-size:14px;line-height:1}.tab-content{display:none}.tab-content.active{display:block}.tab-content h2{font-size:var(--profiler-text-xl);font-weight:700;color:var(--profiler-text);margin-bottom:var(--profiler-space-4);letter-spacing:-0.02em}.tab-content h3{font-size:var(--profiler-text-lg);font-weight:600;color:var(--profiler-text);margin-bottom:var(--profiler-space-3)}.tab-content table{width:100%;border-collapse:collapse;background:var(--profiler-bg-light);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-md);overflow:hidden}.tab-content table th{width:180px;text-align:left;padding:12px 16px;font-size:var(--profiler-text-xs);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--profiler-accent);background:var(--profiler-accent-bg);border-bottom:1px solid var(--profiler-border);border-right:1px solid var(--profiler-border);vertical-align:top}.tab-content table td{padding:12px 16px;font-size:var(--profiler-text-base);color:var(--profiler-text);border-bottom:1px solid var(--profiler-border);vertical-align:top}.tab-content table tr:last-child th,.tab-content table tr:last-child td{border-bottom:none}.tab-content table pre{margin:0;font-size:var(--profiler-text-sm)}.profiler-panel{background:var(--profiler-bg-elevated);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-lg);overflow:hidden;box-shadow:var(--profiler-shadow-md)}.profiler-panel--sm{padding:var(--profiler-space-3);border-radius:var(--profiler-radius-md)}.profiler-section__header{font-size:var(--profiler-text-xs);font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--profiler-accent);padding-bottom:var(--profiler-space-2);margin-bottom:var(--profiler-space-4);border-bottom:1px solid var(--profiler-border-accent);font-family:var(--profiler-font-mono)}.profiler-action-bar{display:flex;align-items:center;justify-content:space-between;gap:var(--profiler-space-2);flex-wrap:wrap}.profiler-filter-group{display:flex;align-items:center;gap:var(--profiler-space-2);flex-wrap:wrap}.profiler-filter-count{font-size:var(--profiler-text-xs);color:var(--profiler-text-muted);font-family:var(--profiler-font-mono);white-space:nowrap;opacity:.7}.profiler-filter-input,.profiler-filter-select{height:28px;padding:0 var(--profiler-space-2);background:var(--profiler-bg-lighter);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-sm);color:var(--profiler-text);font-family:var(--profiler-font-mono);font-size:var(--profiler-text-xs);transition:border-color var(--profiler-transition-base)}.profiler-filter-input:focus,.profiler-filter-select:focus{outline:none;border-color:var(--profiler-accent)}.profiler-filter-input{width:160px}.profiler-filter-select{cursor:pointer}.profiler-preset-btn{height:28px;padding:0 10px;background:rgba(0,0,0,0);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-full);color:var(--profiler-text-muted);font-family:var(--profiler-font-sans);font-size:var(--profiler-text-xs);font-weight:500;cursor:pointer;transition:all var(--profiler-transition-base);white-space:nowrap}.profiler-preset-btn:hover{border-color:var(--profiler-accent);color:var(--profiler-accent);background:var(--profiler-accent-bg)}.profiler-preset-btn--active{border-color:var(--profiler-accent);background:var(--profiler-accent);color:var(--profiler-text-on-accent, #fff)}.profiler-preset-btn--active:hover{opacity:.85;color:var(--profiler-text-on-accent, #fff)}.sortable{cursor:pointer;user-select:none;white-space:nowrap;transition:color var(--profiler-transition-base)}.sortable:hover{color:var(--profiler-text) !important}.sortable--active{color:var(--profiler-text) !important}.sort-icon{font-size:10px;margin-left:4px;vertical-align:middle}.sort-icon--idle{opacity:.35}.sort-icon--active{color:var(--profiler-accent);opacity:1}@keyframes profiler-shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}.profiler-skeleton__row{display:flex;align-items:center;gap:20px;padding:14px 20px;border-bottom:1px solid var(--profiler-border)}.profiler-skeleton__row:last-child{border-bottom:none}.profiler-skeleton__cell{height:12px;border-radius:3px;background:linear-gradient(90deg, var(--profiler-bg-lighter, #e5e7eb) 25%, var(--profiler-bg-light, #f3f4f6) 50%, var(--profiler-bg-lighter, #e5e7eb) 75%);background-size:200% 100%;animation:profiler-shimmer 1.4s infinite linear}.profiler-skeleton__cell--xs{width:40px;flex-shrink:0}.profiler-skeleton__cell--sm{width:72px;flex-shrink:0}.profiler-skeleton__cell--md{width:120px;flex-shrink:0}.profiler-skeleton__cell--lg{width:180px;flex-shrink:0}.profiler-skeleton__cell--flex{flex:1;min-width:60px}.profiler-timeline{margin:24px 0;padding:24px;background:linear-gradient(135deg, rgba(21, 25, 31, 0.4) 0%, rgba(31, 35, 41, 0.4) 100%);backdrop-filter:blur(12px);border:1px solid var(--profiler-border);border-radius:12px;box-shadow:var(--profiler-shadow-md);animation:fadeIn 500ms cubic-bezier(0.4, 0, 0.2, 1)}.profiler-timeline svg{display:block;width:100%;height:auto;filter:drop-shadow(0 2px 8px rgba(0, 0, 0, 0.2))}.profiler-timeline .timeline-event{cursor:pointer;transition:all var(--profiler-transition-base);transform-origin:center}.profiler-timeline .timeline-event:hover{opacity:.85;transform:scale(1.02);filter:drop-shadow(0 4px 12px rgba(0, 217, 255, 0.3))}.profiler-timeline .timeline-event:active{transform:scale(0.98)}.profiler-timeline .timeline-label{font-size:11px;font-family:var(--profiler-font-mono);font-weight:500;fill:var(--profiler-text-secondary);transition:fill var(--profiler-transition-base)}.profiler-timeline .timeline-label:hover{fill:var(--profiler-text)}.profiler-timeline .timeline-bar{rx:4;transition:all var(--profiler-transition-base);stroke-width:1;stroke:rgba(0,0,0,.3)}.profiler-timeline .timeline-bar.controller{fill:#60a5fa;stroke:rgba(96,165,250,.5)}.profiler-timeline .timeline-bar.controller:hover{fill:#93c5fd;filter:drop-shadow(0 0 8px rgba(96, 165, 250, 0.6))}.profiler-timeline .timeline-bar.view{fill:#34d399;stroke:rgba(52,211,153,.5)}.profiler-timeline .timeline-bar.view:hover{fill:#6ee7b7;filter:drop-shadow(0 0 8px rgba(52, 211, 153, 0.6))}.profiler-timeline .timeline-bar.partial{fill:#f59e0b;stroke:rgba(245,158,11,.5)}.profiler-timeline .timeline-bar.partial:hover{fill:#fbbf24;filter:drop-shadow(0 0 8px rgba(245, 158, 11, 0.6))}.profiler-timeline .timeline-bar.database{fill:#fb923c;stroke:rgba(251,146,60,.5)}.profiler-timeline .timeline-bar.database:hover{fill:#fdba74;filter:drop-shadow(0 0 8px rgba(251, 146, 60, 0.6))}.profiler-timeline .timeline-bar.default{fill:#a78bfa;stroke:rgba(167,139,250,.5)}.profiler-timeline .timeline-bar.default:hover{fill:#c4b5fd;filter:drop-shadow(0 0 8px rgba(167, 139, 250, 0.6))}.profiler-timeline .timeline-axis{stroke:var(--profiler-border-strong);stroke-width:2;stroke-linecap:round}.profiler-timeline .timeline-grid{stroke:var(--profiler-border);stroke-width:1;stroke-dasharray:4 4;opacity:.2;transition:opacity var(--profiler-transition-base)}.profiler-timeline .timeline-grid:hover{opacity:.4}.profiler-timeline .timeline-legend{display:flex;gap:20px;margin-top:20px;padding-top:20px;border-top:1px solid var(--profiler-border);flex-wrap:wrap;justify-content:center}.profiler-timeline .timeline-legend .legend-item{display:flex;align-items:center;gap:8px;font-size:12px;font-family:var(--profiler-font-sans);color:var(--profiler-text-muted);padding:6px 12px;background:hsla(0,0%,100%,.02);border-radius:8px;border:1px solid var(--profiler-border);transition:all var(--profiler-transition-base)}.profiler-timeline .timeline-legend .legend-item:hover{background:hsla(0,0%,100%,.05);color:var(--profiler-text);transform:translateY(-2px)}.profiler-timeline .timeline-legend .legend-item .legend-color{width:16px;height:16px;border-radius:4px;border:1px solid rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.2)}.profiler-timeline .timeline-legend .legend-item .legend-color.controller{background:var(--profiler-accent);box-shadow:inset 0 1px 2px rgba(0,0,0,.2),0 0 8px rgba(0,217,255,.3)}.profiler-timeline .timeline-legend .legend-item .legend-color.view{background:var(--profiler-success);box-shadow:inset 0 1px 2px rgba(0,0,0,.2),0 0 8px rgba(0,255,159,.3)}.profiler-timeline .timeline-legend .legend-item .legend-color.partial{background:var(--profiler-warning);box-shadow:inset 0 1px 2px rgba(0,0,0,.2),0 0 8px rgba(255,107,53,.3)}.profiler-timeline .timeline-legend .legend-item .legend-color.database{background:var(--profiler-warning);box-shadow:inset 0 1px 2px rgba(0,0,0,.2),0 0 8px rgba(255,184,108,.3)}.profiler-timeline .timeline-legend .legend-item .legend-color.default{background:var(--profiler-info);box-shadow:inset 0 1px 2px rgba(0,0,0,.2),0 0 8px rgba(189,147,249,.3)}.profiler-timeline .timeline-metrics{display:grid;grid-template-columns:repeat(auto-fit, minmax(180px, 1fr));gap:16px;margin-bottom:24px}.profiler-timeline .timeline-metrics .metric-card{background:rgba(0,0,0,.2);border:1px solid var(--profiler-border);border-radius:8px;padding:16px;transition:all var(--profiler-transition-base)}.profiler-timeline .timeline-metrics .metric-card:hover{background:rgba(0,0,0,.3);border-color:var(--profiler-border-strong);transform:translateY(-2px);box-shadow:var(--profiler-shadow-sm)}.profiler-timeline .timeline-metrics .metric-card .metric-label{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--profiler-text-muted);margin-bottom:8px;font-family:var(--profiler-font-sans)}.profiler-timeline .timeline-metrics .metric-card .metric-value{font-size:24px;font-weight:700;font-family:var(--profiler-font-mono);color:var(--profiler-accent);line-height:1}.profiler-timeline .timeline-metrics .metric-card .metric-value small{font-size:14px;color:var(--profiler-text-muted);font-weight:500;margin-left:4px}.profiler-timeline .timeline-metrics .metric-card .metric-change{font-size:11px;margin-top:6px;font-family:var(--profiler-font-mono)}.profiler-timeline .timeline-metrics .metric-card .metric-change.positive{color:var(--profiler-success)}.profiler-timeline .timeline-metrics .metric-card .metric-change.negative{color:var(--profiler-error)}.profiler-timeline .timeline-metrics .metric-card .metric-change.neutral{color:var(--profiler-text-muted)}.profiler-timeline .timeline-tooltip{position:absolute;background:linear-gradient(135deg, rgba(21, 25, 31, 0.98) 0%, rgba(31, 35, 41, 0.98) 100%);backdrop-filter:blur(16px);border:1px solid var(--profiler-border-strong);border-radius:8px;padding:12px 16px;font-family:var(--profiler-font-mono);font-size:12px;color:var(--profiler-text);pointer-events:none;z-index:1000;box-shadow:0 8px 32px rgba(0,0,0,.5),0 0 0 1px hsla(0,0%,100%,.03);opacity:0;transform:translateY(8px);transition:all var(--profiler-transition-base)}.profiler-timeline .timeline-tooltip.visible{opacity:1;transform:translateY(0)}.profiler-timeline .timeline-tooltip .tooltip-header{font-weight:600;color:var(--profiler-accent);margin-bottom:6px;padding-bottom:6px;border-bottom:1px solid var(--profiler-border)}.profiler-timeline .timeline-tooltip .tooltip-row{display:flex;justify-content:space-between;gap:16px;margin:4px 0}.profiler-timeline .timeline-tooltip .tooltip-row .label{color:var(--profiler-text-muted)}.profiler-timeline .timeline-tooltip .tooltip-row .value{color:var(--profiler-text);font-weight:600}@keyframes barSlideIn{from{transform:scaleX(0);opacity:0}to{transform:scaleX(1);opacity:1}}.profiler-timeline .timeline-bar{animation:barSlideIn 600ms cubic-bezier(0.4, 0, 0.2, 1) backwards}.profiler-timeline .timeline-bar:nth-child(1){animation-delay:30ms}.profiler-timeline .timeline-bar:nth-child(2){animation-delay:60ms}.profiler-timeline .timeline-bar:nth-child(3){animation-delay:90ms}.profiler-timeline .timeline-bar:nth-child(4){animation-delay:120ms}.profiler-timeline .timeline-bar:nth-child(5){animation-delay:150ms}.profiler-timeline .timeline-bar:nth-child(6){animation-delay:180ms}.profiler-timeline .timeline-bar:nth-child(7){animation-delay:210ms}.profiler-timeline .timeline-bar:nth-child(8){animation-delay:240ms}.profiler-timeline .timeline-bar:nth-child(9){animation-delay:270ms}.profiler-timeline .timeline-bar:nth-child(10){animation-delay:300ms}.profiler-timeline .timeline-bar:nth-child(11){animation-delay:330ms}.profiler-timeline .timeline-bar:nth-child(12){animation-delay:360ms}.profiler-timeline .timeline-bar:nth-child(13){animation-delay:390ms}.profiler-timeline .timeline-bar:nth-child(14){animation-delay:420ms}.profiler-timeline .timeline-bar:nth-child(15){animation-delay:450ms}.profiler-timeline .timeline-bar:nth-child(16){animation-delay:480ms}.profiler-timeline .timeline-bar:nth-child(17){animation-delay:510ms}.profiler-timeline .timeline-bar:nth-child(18){animation-delay:540ms}.profiler-timeline .timeline-bar:nth-child(19){animation-delay:570ms}.profiler-timeline .timeline-bar:nth-child(20){animation-delay:600ms}.profiler-flamegraph{animation:fadeIn 500ms cubic-bezier(0.4, 0, 0.2, 1)}.profiler-flamegraph__stats{display:flex;flex-wrap:wrap;gap:12px;margin-bottom:16px}.profiler-flamegraph__stats .stat-item{display:flex;flex-direction:column;gap:2px;padding:10px 14px;background:var(--profiler-bg-lighter);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-md);min-width:80px;transition:all var(--profiler-transition-base)}.profiler-flamegraph__stats .stat-item:hover{border-color:var(--profiler-border-strong);transform:translateY(-1px);box-shadow:var(--profiler-shadow-sm)}.profiler-flamegraph__stats .stat-label{font-size:var(--profiler-text-xs);text-transform:uppercase;letter-spacing:.06em;color:var(--profiler-text-muted);font-family:var(--profiler-font-sans);display:flex;align-items:center;gap:6px}.profiler-flamegraph__stats .stat-value{font-size:var(--profiler-text-lg);font-weight:700;font-family:var(--profiler-font-mono);color:var(--profiler-accent);line-height:1.2}.profiler-flamegraph__stats .stat-value small{font-size:var(--profiler-text-sm);color:var(--profiler-text-muted);font-weight:500}.profiler-flamegraph__stats .stat-dot{display:inline-block;width:8px;height:8px;border-radius:50%;flex-shrink:0}.profiler-flamegraph__legend{display:flex;gap:16px;margin-bottom:12px;flex-wrap:wrap}.profiler-flamegraph__legend .legend-item{display:flex;align-items:center;gap:6px;font-size:var(--profiler-text-sm);font-family:var(--profiler-font-sans);color:var(--profiler-text-muted)}.profiler-flamegraph__legend .legend-item .legend-color{width:12px;height:12px;border-radius:3px;flex-shrink:0}.profiler-flamegraph__controls{display:flex;align-items:center;gap:12px;margin-bottom:8px}.profiler-flamegraph__reset{padding:4px 12px;font-size:var(--profiler-text-sm);font-family:var(--profiler-font-sans);font-weight:500;background:var(--profiler-accent-bg);color:var(--profiler-accent);border:1px solid var(--profiler-border-accent);border-radius:var(--profiler-radius-sm);cursor:pointer;transition:all var(--profiler-transition-base)}.profiler-flamegraph__reset:hover{background:var(--profiler-accent);color:var(--profiler-text-on-accent)}.profiler-flamegraph__hint{font-size:var(--profiler-text-xs);color:var(--profiler-text-subtle);font-family:var(--profiler-font-sans)}.profiler-flamegraph__search{display:flex;align-items:center;gap:8px}.profiler-flamegraph__search-input{height:28px;padding:0 8px;background:var(--profiler-bg-lighter);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-sm);color:var(--profiler-text);font-family:var(--profiler-font-mono);font-size:var(--profiler-text-xs);width:200px;transition:border-color var(--profiler-transition-base)}.profiler-flamegraph__search-input:focus{outline:none;border-color:var(--profiler-accent)}.profiler-flamegraph__match-count{font-size:var(--profiler-text-xs);font-family:var(--profiler-font-mono);color:var(--profiler-text-muted);white-space:nowrap}.profiler-flamegraph__canvas-container{position:relative;border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-lg);overflow:visible;background:var(--profiler-bg-light)}.profiler-flamegraph__canvas{display:block;width:100%;cursor:default}.profiler-flamegraph__breadcrumbs{display:none;align-items:center;gap:4px;padding:8px 12px;background:var(--profiler-bg-lighter);border-bottom:1px solid var(--profiler-border);font-size:var(--profiler-text-sm);font-family:var(--profiler-font-mono);flex-wrap:wrap;overflow:hidden}.profiler-flamegraph__breadcrumbs .breadcrumb-item{background:none;border:none;padding:2px 6px;font-size:var(--profiler-text-sm);font-family:var(--profiler-font-mono);color:var(--profiler-text-secondary);cursor:pointer;border-radius:var(--profiler-radius-sm);transition:all var(--profiler-transition-fast);white-space:nowrap}.profiler-flamegraph__breadcrumbs .breadcrumb-item:hover{background:var(--profiler-accent-bg);color:var(--profiler-accent)}.profiler-flamegraph__breadcrumbs .breadcrumb-item:last-child{color:var(--profiler-accent);font-weight:600}.profiler-flamegraph__breadcrumbs .breadcrumb-separator{color:var(--profiler-text-subtle);font-size:var(--profiler-text-base);user-select:none}.profiler-flamegraph__tooltip{position:fixed;background:var(--profiler-bg-overlay);backdrop-filter:blur(16px);border:1px solid var(--profiler-border-strong);border-radius:var(--profiler-radius-md);padding:10px 14px;font-family:var(--profiler-font-mono);font-size:var(--profiler-text-sm);color:var(--profiler-text);pointer-events:none;z-index:1000;box-shadow:var(--profiler-shadow-lg);opacity:0;transform:translateY(6px);transition:opacity var(--profiler-transition-fast),transform var(--profiler-transition-fast);max-width:400px;word-break:break-all}.profiler-flamegraph__tooltip.visible{opacity:1;transform:translateY(0)}.profiler-flamegraph__tooltip .tooltip-header{font-weight:600;color:var(--profiler-accent);margin-bottom:6px;padding-bottom:6px;border-bottom:1px solid var(--profiler-border);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:350px}.profiler-flamegraph__tooltip .tooltip-row{display:flex;justify-content:space-between;gap:16px;margin:3px 0}.profiler-flamegraph__tooltip .tooltip-row .label{color:var(--profiler-text-muted)}.profiler-flamegraph__tooltip .tooltip-row .value{color:var(--profiler-text);font-weight:600}.profiler-flamegraph__tooltip .tooltip-badge{display:inline-block;padding:1px 8px;border-radius:var(--profiler-radius-full);font-size:var(--profiler-text-xs);font-weight:600;color:#fff}.profiler-flamegraph__tooltip .tooltip-payload{margin-top:6px;padding-top:6px;border-top:1px solid var(--profiler-border);font-size:var(--profiler-text-xs);color:var(--profiler-text-secondary);white-space:pre-wrap;max-height:80px;overflow:hidden}.profiler-fn-profiling{margin-top:32px;border-top:1px solid var(--profiler-border);padding-top:24px;animation:fadeIn 300ms ease}.profiler-fn-profiling__header{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:16px;flex-wrap:wrap}.profiler-fn-profiling__title{font-size:var(--profiler-text-xs);font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--profiler-text-muted);font-family:var(--profiler-font-sans);display:flex;align-items:center;gap:8px}.profiler-fn-profiling__title::before{content:"";display:inline-block;width:8px;height:8px;border-radius:50%;background:#94a3b8;flex-shrink:0}.profiler-fn-profiling__title--active::before{background:var(--profiler-accent);box-shadow:0 0 6px var(--profiler-accent-glow)}.profiler-fn-profiling__controls{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.profiler-fn-profiling__max-frames-label{display:flex;align-items:center;gap:6px;font-size:var(--profiler-text-xs);color:var(--profiler-text-muted);font-family:var(--profiler-font-sans);cursor:default}.profiler-fn-profiling__max-frames-input{width:70px;height:26px;padding:0 8px;background:var(--profiler-bg-lighter);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-sm);color:var(--profiler-text);font-family:var(--profiler-font-mono);font-size:var(--profiler-text-xs);text-align:center;transition:border-color var(--profiler-transition-base);appearance:textfield}.profiler-fn-profiling__max-frames-input::-webkit-inner-spin-button,.profiler-fn-profiling__max-frames-input::-webkit-outer-spin-button{-webkit-appearance:none}.profiler-fn-profiling__max-frames-input:focus{outline:none;border-color:var(--profiler-accent);box-shadow:0 0 0 2px var(--profiler-accent-glow)}.profiler-fn-profiling__max-frames-input:disabled{opacity:.4;cursor:not-allowed}.profiler-fn-profiling__updating{font-size:var(--profiler-text-xs);color:var(--profiler-text-muted);font-family:var(--profiler-font-mono);animation:pulse 1s ease-in-out infinite}.profiler-fn-profiling__toggle{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 14px;border-radius:var(--profiler-radius-full);border:1px solid var(--profiler-border-strong);background:var(--profiler-bg-lighter);color:var(--profiler-text-muted);font-size:var(--profiler-text-xs);font-weight:600;font-family:var(--profiler-font-sans);cursor:pointer;transition:all var(--profiler-transition-base);white-space:nowrap}.profiler-fn-profiling__toggle::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--profiler-text-subtle);flex-shrink:0;transition:background var(--profiler-transition-base),box-shadow var(--profiler-transition-base)}.profiler-fn-profiling__toggle:hover{border-color:var(--profiler-border-strong);color:var(--profiler-text);background:var(--profiler-bg-elevated)}.profiler-fn-profiling__toggle:disabled{opacity:.5;cursor:not-allowed}.profiler-fn-profiling__toggle--active{border-color:var(--profiler-border-accent);background:var(--profiler-accent-bg);color:var(--profiler-accent)}.profiler-fn-profiling__toggle--active::before{background:var(--profiler-accent);box-shadow:0 0 6px var(--profiler-accent-glow)}.profiler-fn-profiling__toggle--active:hover{background:rgba(245,158,11,.15)}.profiler-fn-profiling__mode-selector{display:inline-flex;border:1px solid var(--profiler-border-strong);border-radius:var(--profiler-radius-sm);overflow:hidden}.profiler-fn-profiling__mode-btn{height:28px;padding:0 12px;background:var(--profiler-bg-lighter);border:none;border-right:1px solid var(--profiler-border-strong);color:var(--profiler-text-muted);font-size:var(--profiler-text-xs);font-weight:600;font-family:var(--profiler-font-sans);cursor:pointer;transition:all var(--profiler-transition-base);white-space:nowrap}.profiler-fn-profiling__mode-btn:last-child{border-right:none}.profiler-fn-profiling__mode-btn:hover:not(:disabled):not(.profiler-fn-profiling__mode-btn--active){background:var(--profiler-bg-elevated);color:var(--profiler-text)}.profiler-fn-profiling__mode-btn--active{background:var(--profiler-accent-bg);color:var(--profiler-accent);cursor:default}.profiler-fn-profiling__mode-btn:disabled{opacity:.5;cursor:not-allowed}.profiler-fn-profiling__cpu-pct{color:var(--profiler-text-subtle);font-size:.85em}.profiler-fn-profiling__gc--medium{color:#f59e0b}.profiler-fn-profiling__gc--high{color:#ef4444;font-weight:600}.profiler-fn-profiling__hint{margin:12px 0 0;padding:10px 14px;background:var(--profiler-bg-lighter);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-md);font-size:var(--profiler-text-xs);color:var(--profiler-text-muted);font-family:var(--profiler-font-sans);line-height:1.6}.profiler-fn-profiling__flamegraph{margin:16px 0}.profiler-fn-profiling__flamegraph .profiler-flamegraph__controls{margin-bottom:6px}.profiler-fn-profiling__sort{display:flex;align-items:center;gap:4px;margin:16px 0 8px;padding:3px;background:var(--profiler-bg-lighter);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-md);width:fit-content}.profiler-fn-profiling__sort-btn{padding:4px 12px;border:none;border-radius:var(--profiler-radius-sm);background:rgba(0,0,0,0);color:var(--profiler-text-muted);font-size:var(--profiler-text-xs);font-weight:500;font-family:var(--profiler-font-sans);cursor:pointer;transition:all var(--profiler-transition-fast);white-space:nowrap}.profiler-fn-profiling__sort-btn:hover{color:var(--profiler-text);background:var(--profiler-bg-elevated)}.profiler-fn-profiling__sort-btn--active{background:var(--profiler-accent);color:var(--profiler-text-on-accent);font-weight:600;box-shadow:var(--profiler-shadow-sm)}.profiler-fn-profiling__sort-btn--active:hover{background:var(--profiler-accent-hover);color:var(--profiler-text-on-accent)}.profiler-fn-profiling__table{width:100%;border-collapse:collapse;font-size:var(--profiler-text-xs);font-family:var(--profiler-font-sans);margin-top:8px}.profiler-fn-profiling__table thead tr{border-bottom:1px solid var(--profiler-border-strong)}.profiler-fn-profiling__table th{padding:8px 10px;text-align:left;font-size:var(--profiler-text-xs);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--profiler-text-subtle)}.profiler-fn-profiling__table th.profiler-text--right{text-align:right}.profiler-fn-profiling__table tbody tr{border-bottom:1px solid var(--profiler-border);transition:background var(--profiler-transition-fast)}.profiler-fn-profiling__table tbody tr:hover{background:var(--profiler-bg-lighter)}.profiler-fn-profiling__table tbody tr:last-child{border-bottom:none}.profiler-fn-profiling__table tbody tr.profiler-fn-profiling__row--highlighted{background:rgba(251,191,36,.08);outline:1px solid rgba(251,191,36,.35);outline-offset:-1px}.profiler-fn-profiling__table td{padding:7px 10px;vertical-align:middle;line-height:1.4}.profiler-fn-profiling__table td.profiler-text--right{text-align:right}.profiler-fn-profiling__table td.profiler-text--muted{color:var(--profiler-text-muted)}.profiler-fn-profiling__name{font-family:var(--profiler-font-mono);font-size:var(--profiler-text-xs);font-weight:500;color:var(--profiler-text);max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.profiler-fn-profiling__recursive{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:3px;background:var(--profiler-warning-bg);color:var(--profiler-warning);font-size:9px;font-weight:700;margin-right:5px;vertical-align:middle;flex-shrink:0;cursor:help}.profiler-fn-profiling__filter-active{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:12px 0 0;padding:8px 14px;background:var(--profiler-accent-bg);border:1px solid var(--profiler-border-accent);border-radius:var(--profiler-radius-md);font-size:var(--profiler-text-xs);color:var(--profiler-accent);font-family:var(--profiler-font-sans)}.profiler-fn-profiling__filter-active strong{font-family:var(--profiler-font-mono);font-weight:600}.profiler-fn-profiling__filter-clear{padding:2px 8px;border:1px solid var(--profiler-border-accent);border-radius:var(--profiler-radius-sm);background:rgba(0,0,0,0);color:var(--profiler-accent);font-size:var(--profiler-text-xs);font-family:var(--profiler-font-sans);cursor:pointer;transition:all var(--profiler-transition-fast);white-space:nowrap}.profiler-fn-profiling__filter-clear:hover{background:var(--profiler-accent);color:var(--profiler-text-on-accent)}.profiler-fn-profiling__cap-warning{display:flex;align-items:center;gap:8px;margin:12px 0 0;padding:10px 14px;background:var(--profiler-warning-bg);border:1px solid rgba(251,146,60,.3);border-radius:var(--profiler-radius-md);font-size:var(--profiler-text-xs);color:var(--profiler-warning);font-family:var(--profiler-font-sans);font-weight:500}@keyframes pulse{0%,100%{opacity:1}50%{opacity:.4}}pre[data-language=sql],.sql-code{background:var(--profiler-bg);padding:15px;border-radius:4px;overflow-x:auto;font-family:"Monaco","Menlo","Ubuntu Mono",monospace;font-size:13px;line-height:1.5}pre[data-language=sql] .sql-keyword,.sql-code .sql-keyword{color:#c586c0;font-weight:600}pre[data-language=sql] .sql-string,.sql-code .sql-string{color:#ce9178}pre[data-language=sql] .sql-number,.sql-code .sql-number{color:#b5cea8}pre[data-language=sql] .sql-comment,.sql-code .sql-comment{color:var(--profiler-text-muted);font-style:italic}pre[data-language=sql] .sql-function,.sql-code .sql-function{color:#dcdcaa}pre[data-language=sql] .sql-operator,.sql-code .sql-operator{color:var(--profiler-info)}.backtrace{font-family:"Monaco","Menlo","Ubuntu Mono",monospace;font-size:11px;color:var(--profiler-text-muted);line-height:1.6}.backtrace .file-path{color:var(--profiler-info)}.backtrace .file-path:hover{text-decoration:underline}.backtrace .line-number{color:var(--profiler-warning)}.backtrace .method-name{color:#dcdcaa}.profile-header{margin-bottom:var(--profiler-space-6);padding-bottom:var(--profiler-space-4);border-bottom:1px solid var(--profiler-border)}.profile-header h2{font-size:var(--profiler-text-xl);margin-bottom:var(--profiler-space-3);color:var(--profiler-text);font-weight:600}.stats-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(160px, 1fr));gap:var(--profiler-space-4);margin-bottom:var(--profiler-space-6)}.stat{background:var(--profiler-bg-lighter);padding:var(--profiler-space-3);border-radius:var(--profiler-radius-md);border:1px solid var(--profiler-border);transition:all var(--profiler-transition-base)}.stat:hover{background:var(--profiler-bg-elevated);border-color:var(--profiler-border-strong);transform:translateY(-2px);box-shadow:var(--profiler-shadow-sm)}.stat-label{font-size:var(--profiler-text-xs);color:var(--profiler-text-muted);margin-bottom:var(--profiler-space-1);text-transform:uppercase;letter-spacing:.08em}.stat-value{font-size:var(--profiler-text-xl);font-weight:600;color:var(--profiler-accent);font-family:var(--profiler-font-mono)}.tabs{display:flex;gap:var(--profiler-space-1);border-bottom:1px solid var(--profiler-border);margin-bottom:var(--profiler-space-6)}.tab{padding:var(--profiler-space-3) var(--profiler-space-4);background:rgba(0,0,0,0);border:none;color:var(--profiler-text-muted);cursor:pointer;font-size:var(--profiler-text-base);border-bottom:2px solid rgba(0,0,0,0);display:flex;align-items:center;gap:var(--profiler-space-2);transition:all var(--profiler-transition-fast)}.tab .tab-icon{font-size:var(--profiler-text-lg);line-height:1}.tab:hover{color:var(--profiler-text);background:rgba(0,0,0,.1)}.tab.active{color:var(--profiler-accent);border-bottom-color:var(--profiler-accent)}.tab-content{display:none}.tab-content.active{display:block}.query-item{background:var(--profiler-bg-lighter);padding:var(--profiler-space-3);margin-bottom:var(--profiler-space-3);border-radius:var(--profiler-radius-md);border-left:3px solid var(--profiler-info);transition:all var(--profiler-transition-base)}.query-item:hover{background:var(--profiler-bg-elevated);transform:translateX(4px);box-shadow:var(--profiler-shadow-sm)}.query-item.slow{border-left-color:var(--profiler-error);background:var(--profiler-error-bg)}.query-item.slow:hover{box-shadow:0 0 16px var(--profiler-error-glow)}.query-sql{font-family:var(--profiler-font-mono);font-size:var(--profiler-text-sm);color:var(--profiler-info);margin-bottom:var(--profiler-space-2);white-space:pre-wrap;word-break:break-all;line-height:1.6}.query-meta{display:flex;gap:var(--profiler-space-3);font-size:var(--profiler-text-xs);color:var(--profiler-text-muted)}.badge{display:inline-flex;padding:var(--profiler-space-1) var(--profiler-space-2);border-radius:var(--profiler-radius-sm);font-size:var(--profiler-text-xs);font-weight:600;background:var(--profiler-info);color:var(--profiler-text-on-accent);font-family:var(--profiler-font-mono)}.badge-slow{background:var(--profiler-error)}.badge-cached{background:var(--profiler-success)}.dump-item{background:var(--profiler-bg-lighter);padding:var(--profiler-space-4);margin-bottom:var(--profiler-space-4);border-radius:var(--profiler-radius-md);border-left:3px solid var(--profiler-warning)}.dump-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--profiler-space-3);font-size:var(--profiler-text-sm)}.dump-label{color:var(--profiler-accent);font-weight:600}.dump-location{color:var(--profiler-info);font-size:var(--profiler-text-xs);font-family:var(--profiler-font-mono)}.dump-value{font-family:var(--profiler-font-mono);font-size:var(--profiler-text-sm);color:var(--profiler-warning);white-space:pre-wrap;background:rgba(0,0,0,.3);padding:var(--profiler-space-3);border-radius:var(--profiler-radius-sm);max-height:400px;overflow-y:auto;line-height:1.5}.cache-stats{display:grid;grid-template-columns:repeat(auto-fit, minmax(120px, 1fr));gap:var(--profiler-space-3);margin-bottom:var(--profiler-space-6)}.cache-stat{background:var(--profiler-bg-lighter);padding:var(--profiler-space-3);border-radius:var(--profiler-radius-md);text-align:center;border:1px solid var(--profiler-border);transition:all var(--profiler-transition-base)}.cache-stat:hover{background:var(--profiler-bg-elevated);border-color:var(--profiler-border-strong);transform:translateY(-2px);box-shadow:var(--profiler-shadow-sm)}.cache-stat-label{font-size:var(--profiler-text-xs);color:var(--profiler-text-muted);margin-bottom:var(--profiler-space-1);text-transform:uppercase;letter-spacing:.08em}.cache-stat-value{font-size:var(--profiler-text-xl);font-weight:600;color:var(--profiler-accent);font-family:var(--profiler-font-mono)}.empty-state{display:flex;align-items:center;justify-content:center;min-height:200px;flex-direction:column;gap:var(--profiler-space-2);color:var(--profiler-text-muted);padding:var(--profiler-space-12) var(--profiler-space-6);text-align:center}.loading{text-align:center;padding:var(--profiler-space-12) var(--profiler-space-6);color:var(--profiler-text-muted);font-size:var(--profiler-text-base)}.error{background:var(--profiler-error-bg);color:var(--profiler-error);padding:var(--profiler-space-3);border-radius:var(--profiler-radius-md);margin-bottom:var(--profiler-space-3);border-left:3px solid var(--profiler-error);font-size:var(--profiler-text-sm)}.generic-tab pre{color:var(--profiler-info);font-family:var(--profiler-font-mono);font-size:var(--profiler-text-sm);line-height:1.6}.ajax-breakdown{margin:var(--profiler-space-6) 0;padding:var(--profiler-space-4);background:var(--profiler-bg-light);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-md)}.ajax-breakdown h3{margin:0 0 var(--profiler-space-3) 0;font-size:var(--profiler-text-base);color:var(--profiler-text);font-weight:600}.ajax-breakdown-items{display:flex;flex-wrap:wrap;gap:var(--profiler-space-3)}.ajax-breakdown-item{display:flex;align-items:center;gap:var(--profiler-space-2);padding:var(--profiler-space-1) var(--profiler-space-3);background:var(--profiler-bg-elevated);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-md);font-size:var(--profiler-text-base);color:var(--profiler-text);font-family:var(--profiler-font-mono)}.ajax-requests-list{margin-top:var(--profiler-space-6)}.ajax-request-item{background:var(--profiler-bg-light);border:1px solid var(--profiler-border);border-radius:var(--profiler-radius-md);padding:var(--profiler-space-3) var(--profiler-space-4);margin-bottom:var(--profiler-space-3);transition:all var(--profiler-transition-base)}.ajax-request-item:hover{background:var(--profiler-accent-bg);border-color:var(--profiler-border-accent);transform:translateX(3px);box-shadow:var(--profiler-shadow-sm)}.ajax-request-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--profiler-space-2)}.ajax-request-method{display:flex;align-items:center;gap:var(--profiler-space-3);flex:1;min-width:0}.ajax-request-path{color:var(--profiler-text);font-size:var(--profiler-text-sm);font-family:var(--profiler-font-mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ajax-request-stats{display:flex;align-items:center;gap:var(--profiler-space-3)}.ajax-request-duration{color:var(--profiler-accent);font-weight:700;font-size:var(--profiler-text-sm);font-family:var(--profiler-font-mono)}.ajax-request-meta{display:flex;justify-content:space-between;align-items:center;color:var(--profiler-text-muted);font-size:var(--profiler-text-sm)}.ajax-request-time{font-family:var(--profiler-font-mono);font-size:var(--profiler-text-xs)}.ajax-request-link{color:var(--profiler-accent);text-decoration:none;font-weight:500;font-size:var(--profiler-text-sm);font-family:var(--profiler-font-mono);transition:color var(--profiler-transition-fast)}.ajax-request-link:hover{color:var(--profiler-accent-hover)}.method-badge{display:inline-flex;align-items:center;padding:2px 7px;border-radius:var(--profiler-radius-sm);font-size:var(--profiler-text-xs);font-weight:700;text-transform:uppercase;font-family:var(--profiler-font-mono);letter-spacing:.05em;color:#fff}.method-badge.method-get{background:var(--profiler-info)}.method-badge.method-post{background:var(--profiler-success)}.method-badge.method-put{background:var(--profiler-warning)}.method-badge.method-patch{background:var(--profiler-warning)}.method-badge.method-delete{background:var(--profiler-error)}.method-badge.method-head,.method-badge.method-options{background:var(--profiler-text-muted)}.status-badge{display:inline-flex;align-items:center;padding:2px 7px;border-radius:var(--profiler-radius-sm);font-size:var(--profiler-text-xs);font-weight:700;font-family:var(--profiler-font-mono);color:#fff}.status-badge.status-2xx{background:var(--profiler-success)}.status-badge.status-3xx{background:var(--profiler-info)}.status-badge.status-4xx{background:var(--profiler-warning)}.status-badge.status-5xx{background:var(--profiler-error)}.status-badge.status-other{background:var(--profiler-text-muted)}