fluyenta-ruby 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +68 -0
  3. data/LICENSE +11 -0
  4. data/README.md +571 -0
  5. data/lib/brainzlab/beacon/client.rb +227 -0
  6. data/lib/brainzlab/beacon/provisioner.rb +44 -0
  7. data/lib/brainzlab/beacon.rb +215 -0
  8. data/lib/brainzlab/configuration.rb +676 -0
  9. data/lib/brainzlab/context.rb +90 -0
  10. data/lib/brainzlab/cortex/cache.rb +59 -0
  11. data/lib/brainzlab/cortex/client.rb +159 -0
  12. data/lib/brainzlab/cortex/provisioner.rb +49 -0
  13. data/lib/brainzlab/cortex.rb +223 -0
  14. data/lib/brainzlab/debug.rb +305 -0
  15. data/lib/brainzlab/dendrite/client.rb +250 -0
  16. data/lib/brainzlab/dendrite/provisioner.rb +44 -0
  17. data/lib/brainzlab/dendrite.rb +195 -0
  18. data/lib/brainzlab/development/logger.rb +150 -0
  19. data/lib/brainzlab/development/store.rb +121 -0
  20. data/lib/brainzlab/development.rb +72 -0
  21. data/lib/brainzlab/devtools/assets/devtools.css +1329 -0
  22. data/lib/brainzlab/devtools/assets/devtools.js +396 -0
  23. data/lib/brainzlab/devtools/assets/logo.svg +6 -0
  24. data/lib/brainzlab/devtools/assets/templates/debug_panel.html.erb +511 -0
  25. data/lib/brainzlab/devtools/assets/templates/error_page.html.erb +1086 -0
  26. data/lib/brainzlab/devtools/data/collector.rb +248 -0
  27. data/lib/brainzlab/devtools/middleware/asset_server.rb +63 -0
  28. data/lib/brainzlab/devtools/middleware/database_handler.rb +177 -0
  29. data/lib/brainzlab/devtools/middleware/debug_panel.rb +126 -0
  30. data/lib/brainzlab/devtools/middleware/error_page.rb +377 -0
  31. data/lib/brainzlab/devtools/renderers/debug_panel_renderer.rb +159 -0
  32. data/lib/brainzlab/devtools/renderers/error_page_renderer.rb +98 -0
  33. data/lib/brainzlab/devtools.rb +75 -0
  34. data/lib/brainzlab/errors.rb +490 -0
  35. data/lib/brainzlab/flux/buffer.rb +96 -0
  36. data/lib/brainzlab/flux/client.rb +68 -0
  37. data/lib/brainzlab/flux/provisioner.rb +124 -0
  38. data/lib/brainzlab/flux.rb +184 -0
  39. data/lib/brainzlab/instrumentation/action_cable.rb +351 -0
  40. data/lib/brainzlab/instrumentation/action_controller.rb +649 -0
  41. data/lib/brainzlab/instrumentation/action_dispatch.rb +259 -0
  42. data/lib/brainzlab/instrumentation/action_mailbox.rb +197 -0
  43. data/lib/brainzlab/instrumentation/action_mailer.rb +182 -0
  44. data/lib/brainzlab/instrumentation/action_view.rb +380 -0
  45. data/lib/brainzlab/instrumentation/active_job.rb +569 -0
  46. data/lib/brainzlab/instrumentation/active_record.rb +559 -0
  47. data/lib/brainzlab/instrumentation/active_storage.rb +541 -0
  48. data/lib/brainzlab/instrumentation/active_support_cache.rb +730 -0
  49. data/lib/brainzlab/instrumentation/aws.rb +183 -0
  50. data/lib/brainzlab/instrumentation/dalli.rb +108 -0
  51. data/lib/brainzlab/instrumentation/delayed_job.rb +234 -0
  52. data/lib/brainzlab/instrumentation/elasticsearch.rb +209 -0
  53. data/lib/brainzlab/instrumentation/excon.rb +152 -0
  54. data/lib/brainzlab/instrumentation/faraday.rb +181 -0
  55. data/lib/brainzlab/instrumentation/good_job.rb +102 -0
  56. data/lib/brainzlab/instrumentation/grape.rb +293 -0
  57. data/lib/brainzlab/instrumentation/graphql.rb +252 -0
  58. data/lib/brainzlab/instrumentation/httparty.rb +193 -0
  59. data/lib/brainzlab/instrumentation/mongodb.rb +187 -0
  60. data/lib/brainzlab/instrumentation/net_http.rb +114 -0
  61. data/lib/brainzlab/instrumentation/rails_deprecation.rb +139 -0
  62. data/lib/brainzlab/instrumentation/railties.rb +134 -0
  63. data/lib/brainzlab/instrumentation/redis.rb +324 -0
  64. data/lib/brainzlab/instrumentation/resque.rb +114 -0
  65. data/lib/brainzlab/instrumentation/sidekiq.rb +265 -0
  66. data/lib/brainzlab/instrumentation/solid_queue.rb +194 -0
  67. data/lib/brainzlab/instrumentation/stripe.rb +163 -0
  68. data/lib/brainzlab/instrumentation/typhoeus.rb +106 -0
  69. data/lib/brainzlab/instrumentation.rb +360 -0
  70. data/lib/brainzlab/nerve/client.rb +235 -0
  71. data/lib/brainzlab/nerve/provisioner.rb +44 -0
  72. data/lib/brainzlab/nerve.rb +219 -0
  73. data/lib/brainzlab/pulse/client.rb +203 -0
  74. data/lib/brainzlab/pulse/instrumentation.rb +401 -0
  75. data/lib/brainzlab/pulse/propagation.rb +241 -0
  76. data/lib/brainzlab/pulse/provisioner.rb +114 -0
  77. data/lib/brainzlab/pulse/tracer.rb +111 -0
  78. data/lib/brainzlab/pulse.rb +294 -0
  79. data/lib/brainzlab/rails/log_formatter.rb +807 -0
  80. data/lib/brainzlab/rails/log_subscriber.rb +334 -0
  81. data/lib/brainzlab/rails/railtie.rb +606 -0
  82. data/lib/brainzlab/recall/buffer.rb +66 -0
  83. data/lib/brainzlab/recall/client.rb +158 -0
  84. data/lib/brainzlab/recall/logger.rb +116 -0
  85. data/lib/brainzlab/recall/provisioner.rb +130 -0
  86. data/lib/brainzlab/recall.rb +175 -0
  87. data/lib/brainzlab/reflex/breadcrumbs.rb +55 -0
  88. data/lib/brainzlab/reflex/client.rb +150 -0
  89. data/lib/brainzlab/reflex/provisioner.rb +116 -0
  90. data/lib/brainzlab/reflex.rb +421 -0
  91. data/lib/brainzlab/sentinel/client.rb +236 -0
  92. data/lib/brainzlab/sentinel/provisioner.rb +44 -0
  93. data/lib/brainzlab/sentinel.rb +165 -0
  94. data/lib/brainzlab/signal/client.rb +60 -0
  95. data/lib/brainzlab/signal/provisioner.rb +115 -0
  96. data/lib/brainzlab/signal.rb +136 -0
  97. data/lib/brainzlab/synapse/client.rb +308 -0
  98. data/lib/brainzlab/synapse/provisioner.rb +44 -0
  99. data/lib/brainzlab/synapse.rb +270 -0
  100. data/lib/brainzlab/testing/event_store.rb +377 -0
  101. data/lib/brainzlab/testing/helpers.rb +650 -0
  102. data/lib/brainzlab/testing/matchers.rb +391 -0
  103. data/lib/brainzlab/testing.rb +327 -0
  104. data/lib/brainzlab/utilities/circuit_breaker.rb +290 -0
  105. data/lib/brainzlab/utilities/health_check.rb +294 -0
  106. data/lib/brainzlab/utilities/log_formatter.rb +254 -0
  107. data/lib/brainzlab/utilities/rate_limiter.rb +230 -0
  108. data/lib/brainzlab/utilities.rb +17 -0
  109. data/lib/brainzlab/vault/cache.rb +80 -0
  110. data/lib/brainzlab/vault/client.rb +216 -0
  111. data/lib/brainzlab/vault/provisioner.rb +49 -0
  112. data/lib/brainzlab/vault.rb +262 -0
  113. data/lib/brainzlab/version.rb +5 -0
  114. data/lib/brainzlab/vision/client.rb +175 -0
  115. data/lib/brainzlab/vision/provisioner.rb +136 -0
  116. data/lib/brainzlab/vision.rb +155 -0
  117. data/lib/brainzlab-sdk.rb +3 -0
  118. data/lib/brainzlab.rb +306 -0
  119. data/lib/generators/brainzlab/install/install_generator.rb +63 -0
  120. data/lib/generators/brainzlab/install/templates/brainzlab.rb.tt +77 -0
  121. metadata +251 -0
@@ -0,0 +1,1329 @@
1
+ /* BrainzLab DevTools - Brainz Design System */
2
+
3
+ :root {
4
+ --brainz-cream-50: #FFFDFB;
5
+ --brainz-cream-100: #FFF8F0;
6
+ --brainz-cream-200: #F5EDE3;
7
+ --brainz-cream-300: #E8DED3;
8
+ --brainz-orange: #FF6B35;
9
+ --brainz-orange-dark: #E55A2B;
10
+ --brainz-orange-light: #FF8A5C;
11
+ --brainz-text: #2D3748;
12
+ --brainz-text-muted: #718096;
13
+ --brainz-text-light: #A0AEC0;
14
+ --brainz-border: #E2E8F0;
15
+ --brainz-border-dark: #CBD5E0;
16
+ --brainz-error: #E53E3E;
17
+ --brainz-error-light: #FED7D7;
18
+ --brainz-success: #38A169;
19
+ --brainz-success-light: #C6F6D5;
20
+ --brainz-warning: #D69E2E;
21
+ --brainz-warning-light: #FEFCBF;
22
+ --brainz-info: #3182CE;
23
+ --brainz-info-light: #BEE3F8;
24
+ --brainz-code-bg: #1A202C;
25
+ --brainz-code-text: #E2E8F0;
26
+ --brainz-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
27
+ --brainz-mono: "SF Mono", "Monaco", "Inconsolata", "Fira Code", "Droid Sans Mono", monospace;
28
+ --brainz-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
29
+ --brainz-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
30
+
31
+ /* Panel-specific variables (light mode) */
32
+ --brainz-panel-bg: white;
33
+ --brainz-panel-surface: #FAFAFA;
34
+ --brainz-panel-surface-alt: #F5F5F5;
35
+ --brainz-panel-surface-hover: #EEEEEE;
36
+ --brainz-panel-text: #1A1A1A;
37
+ --brainz-panel-text-secondary: #374151;
38
+ --brainz-panel-text-muted: #6B7280;
39
+ --brainz-panel-text-placeholder: #9CA3AF;
40
+ --brainz-panel-border: #E5E5E5;
41
+ --brainz-panel-border-light: #F3F4F6;
42
+
43
+ /* Issue colors (light mode) */
44
+ --brainz-issue-error-bg: #FEF2F2;
45
+ --brainz-issue-error-text: #B91C1C;
46
+ --brainz-issue-warning-bg: #FFFBEB;
47
+ --brainz-issue-warning-text: #B45309;
48
+ --brainz-issue-metric-critical-bg: #FEE2E2;
49
+ --brainz-issue-metric-critical-text: #B91C1C;
50
+ --brainz-issue-metric-slow-bg: #FEF3C7;
51
+ --brainz-issue-metric-slow-text: #B45309;
52
+
53
+ /* Timeline colors (light mode) */
54
+ --brainz-timeline-db: #3B82F6;
55
+ --brainz-timeline-db-bg: #EFF6FF;
56
+ --brainz-timeline-views: #10B981;
57
+ --brainz-timeline-views-bg: #ECFDF5;
58
+ --brainz-timeline-other: #6B7280;
59
+ --brainz-timeline-other-bg: #F3F4F6;
60
+ --brainz-timeline-bar-bg: #F3F4F6;
61
+
62
+ /* Score colors (light mode) */
63
+ --brainz-score-bg: #E5E5E5;
64
+ --brainz-score-excellent: #22C55E;
65
+ --brainz-score-excellent-text: #16A34A;
66
+ --brainz-score-good: #3B82F6;
67
+ --brainz-score-good-text: #2563EB;
68
+ --brainz-score-warning: #F59E0B;
69
+ --brainz-score-warning-text: #D97706;
70
+ --brainz-score-poor: #EF4444;
71
+ --brainz-score-poor-text: #DC2626;
72
+ }
73
+
74
+ /* ============================================
75
+ DARK MODE SUPPORT - Terminal Inspired
76
+ ============================================ */
77
+ html.dark {
78
+ --brainz-cream-50: #111111;
79
+ --brainz-cream-100: #161616;
80
+ --brainz-cream-200: #1c1c1c;
81
+ --brainz-cream-300: #262626;
82
+ --brainz-text: #e4e4e4;
83
+ --brainz-text-muted: #a3a3a3;
84
+ --brainz-text-light: #737373;
85
+ --brainz-border: #262626;
86
+ --brainz-border-dark: #333333;
87
+ --brainz-error: #f87171;
88
+ --brainz-error-light: rgba(248, 113, 113, 0.15);
89
+ --brainz-success: #4ade80;
90
+ --brainz-success-light: rgba(74, 222, 128, 0.15);
91
+ --brainz-warning: #fbbf24;
92
+ --brainz-warning-light: rgba(251, 191, 36, 0.15);
93
+ --brainz-info: #60a5fa;
94
+ --brainz-info-light: rgba(96, 165, 250, 0.15);
95
+ --brainz-code-bg: #000000;
96
+ --brainz-code-text: #e4e4e4;
97
+ --brainz-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -1px rgba(0, 0, 0, 0.3);
98
+ --brainz-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -2px rgba(0, 0, 0, 0.3);
99
+
100
+ /* Panel-specific variables (dark mode - terminal inspired) */
101
+ --brainz-panel-bg: #0a0a0a;
102
+ --brainz-panel-surface: #111111;
103
+ --brainz-panel-surface-alt: #161616;
104
+ --brainz-panel-surface-hover: #1c1c1c;
105
+ --brainz-panel-text: #e4e4e4;
106
+ --brainz-panel-text-secondary: #a3a3a3;
107
+ --brainz-panel-text-muted: #737373;
108
+ --brainz-panel-text-placeholder: #525252;
109
+ --brainz-panel-border: #262626;
110
+ --brainz-panel-border-light: #1f1f1f;
111
+
112
+ /* Issue colors (dark mode) */
113
+ --brainz-issue-error-bg: rgba(248, 113, 113, 0.1);
114
+ --brainz-issue-error-text: #f87171;
115
+ --brainz-issue-warning-bg: rgba(251, 191, 36, 0.1);
116
+ --brainz-issue-warning-text: #fbbf24;
117
+ --brainz-issue-metric-critical-bg: rgba(248, 113, 113, 0.15);
118
+ --brainz-issue-metric-critical-text: #f87171;
119
+ --brainz-issue-metric-slow-bg: rgba(251, 191, 36, 0.15);
120
+ --brainz-issue-metric-slow-text: #fbbf24;
121
+
122
+ /* Timeline colors (dark mode) */
123
+ --brainz-timeline-db: #60a5fa;
124
+ --brainz-timeline-db-bg: rgba(96, 165, 250, 0.15);
125
+ --brainz-timeline-views: #4ade80;
126
+ --brainz-timeline-views-bg: rgba(74, 222, 128, 0.15);
127
+ --brainz-timeline-other: #737373;
128
+ --brainz-timeline-other-bg: rgba(115, 115, 115, 0.15);
129
+ --brainz-timeline-bar-bg: #1c1c1c;
130
+
131
+ /* Score colors (dark mode) */
132
+ --brainz-score-bg: #262626;
133
+ --brainz-score-excellent: #4ade80;
134
+ --brainz-score-excellent-text: #4ade80;
135
+ --brainz-score-good: #60a5fa;
136
+ --brainz-score-good-text: #60a5fa;
137
+ --brainz-score-warning: #fbbf24;
138
+ --brainz-score-warning-text: #fbbf24;
139
+ --brainz-score-poor: #f87171;
140
+ --brainz-score-poor-text: #f87171;
141
+ }
142
+
143
+ /* ============================================
144
+ ERROR PAGE STYLES
145
+ ============================================ */
146
+
147
+ .brainz-error-page {
148
+ font-family: var(--brainz-font);
149
+ background: var(--brainz-cream-100);
150
+ min-height: 100vh;
151
+ padding: 2rem;
152
+ margin: 0;
153
+ color: var(--brainz-text);
154
+ line-height: 1.6;
155
+ }
156
+
157
+ .brainz-error-page * {
158
+ box-sizing: border-box;
159
+ }
160
+
161
+ .brainz-container {
162
+ max-width: 1200px;
163
+ margin: 0 auto;
164
+ }
165
+
166
+ /* Error Header */
167
+ .brainz-error-header {
168
+ background: linear-gradient(135deg, var(--brainz-orange), var(--brainz-orange-dark));
169
+ color: white;
170
+ padding: 2rem;
171
+ border-radius: 12px;
172
+ margin-bottom: 1.5rem;
173
+ box-shadow: var(--brainz-shadow-lg);
174
+ }
175
+
176
+ .brainz-error-header-content {
177
+ display: flex;
178
+ align-items: flex-start;
179
+ gap: 1rem;
180
+ }
181
+
182
+ .brainz-logo {
183
+ flex-shrink: 0;
184
+ }
185
+
186
+ .brainz-logo img {
187
+ width: 40px;
188
+ height: 40px;
189
+ }
190
+
191
+ .brainz-error-title {
192
+ font-size: 1.5rem;
193
+ font-weight: 700;
194
+ margin: 0 0 0.5rem 0;
195
+ letter-spacing: -0.025em;
196
+ }
197
+
198
+ .brainz-error-message {
199
+ font-size: 1rem;
200
+ opacity: 0.95;
201
+ margin: 0;
202
+ word-break: break-word;
203
+ }
204
+
205
+ /* Sections */
206
+ .brainz-section {
207
+ background: var(--brainz-panel-bg);
208
+ border-radius: 12px;
209
+ padding: 1.5rem;
210
+ margin-bottom: 1rem;
211
+ box-shadow: var(--brainz-shadow);
212
+ }
213
+
214
+ .brainz-section h2 {
215
+ font-size: 0.875rem;
216
+ font-weight: 600;
217
+ text-transform: uppercase;
218
+ letter-spacing: 0.05em;
219
+ color: var(--brainz-panel-text-muted);
220
+ margin: 0 0 1rem 0;
221
+ padding-bottom: 0.5rem;
222
+ border-bottom: 1px solid var(--brainz-panel-border);
223
+ }
224
+
225
+ .brainz-section h3 {
226
+ font-size: 0.8125rem;
227
+ font-weight: 600;
228
+ color: var(--brainz-panel-text);
229
+ margin: 1rem 0 0.5rem 0;
230
+ }
231
+
232
+ /* File Path */
233
+ .brainz-file-path {
234
+ font-family: var(--brainz-mono);
235
+ font-size: 0.8125rem;
236
+ color: var(--brainz-text-muted);
237
+ margin-bottom: 0.75rem;
238
+ padding: 0.5rem 0.75rem;
239
+ background: var(--brainz-cream-200);
240
+ border-radius: 6px;
241
+ }
242
+
243
+ /* Source Code */
244
+ .brainz-source-code {
245
+ background: var(--brainz-code-bg);
246
+ border-radius: 8px;
247
+ padding: 1rem;
248
+ overflow-x: auto;
249
+ margin: 0;
250
+ }
251
+
252
+ .brainz-source-line {
253
+ font-family: var(--brainz-mono);
254
+ font-size: 0.8125rem;
255
+ line-height: 1.7;
256
+ color: var(--brainz-code-text);
257
+ display: flex;
258
+ gap: 1rem;
259
+ padding: 0 0.5rem;
260
+ margin: 0 -0.5rem;
261
+ }
262
+
263
+ .brainz-source-line.highlight {
264
+ background: rgba(255, 107, 53, 0.25);
265
+ border-left: 3px solid var(--brainz-orange);
266
+ margin-left: -1rem;
267
+ padding-left: calc(1rem - 3px);
268
+ }
269
+
270
+ .brainz-source-line .line-number {
271
+ color: var(--brainz-text-muted);
272
+ min-width: 3rem;
273
+ text-align: right;
274
+ user-select: none;
275
+ flex-shrink: 0;
276
+ }
277
+
278
+ .brainz-source-line .line-content {
279
+ white-space: pre;
280
+ }
281
+
282
+ /* Backtrace */
283
+ .brainz-backtrace {
284
+ font-family: var(--brainz-mono);
285
+ font-size: 0.8125rem;
286
+ max-height: 400px;
287
+ overflow-y: auto;
288
+ }
289
+
290
+ .brainz-frame {
291
+ padding: 0.5rem 0.75rem;
292
+ margin: 0 -0.75rem;
293
+ border-radius: 4px;
294
+ display: flex;
295
+ gap: 0.25rem;
296
+ flex-wrap: wrap;
297
+ }
298
+
299
+ .brainz-frame:hover {
300
+ background: var(--brainz-cream-200);
301
+ }
302
+
303
+ .brainz-frame.in-app {
304
+ color: var(--brainz-text);
305
+ font-weight: 500;
306
+ }
307
+
308
+ .brainz-frame:not(.in-app) {
309
+ color: var(--brainz-text-muted);
310
+ }
311
+
312
+ .brainz-frame.first {
313
+ background: var(--brainz-error-light);
314
+ color: var(--brainz-error);
315
+ font-weight: 600;
316
+ }
317
+
318
+ .brainz-frame .frame-file {
319
+ word-break: break-all;
320
+ }
321
+
322
+ .brainz-frame .frame-line {
323
+ color: var(--brainz-orange);
324
+ }
325
+
326
+ .brainz-frame .frame-function {
327
+ color: var(--brainz-text-muted);
328
+ }
329
+
330
+ /* Info Tables */
331
+ .brainz-info-table {
332
+ width: 100%;
333
+ font-size: 0.875rem;
334
+ border-collapse: collapse;
335
+ }
336
+
337
+ .brainz-info-table th,
338
+ .brainz-info-table td {
339
+ padding: 0.5rem 0.75rem;
340
+ text-align: left;
341
+ border-bottom: 1px solid var(--brainz-panel-border);
342
+ }
343
+
344
+ .brainz-info-table th {
345
+ width: 140px;
346
+ color: var(--brainz-panel-text-muted);
347
+ font-weight: 500;
348
+ }
349
+
350
+ .brainz-info-table td {
351
+ font-family: var(--brainz-mono);
352
+ font-size: 0.8125rem;
353
+ color: var(--brainz-panel-text);
354
+ word-break: break-all;
355
+ }
356
+
357
+ /* Parameters */
358
+ .brainz-params {
359
+ background: var(--brainz-panel-surface-alt);
360
+ border-radius: 8px;
361
+ padding: 1rem;
362
+ font-family: var(--brainz-mono);
363
+ font-size: 0.8125rem;
364
+ overflow-x: auto;
365
+ white-space: pre-wrap;
366
+ margin: 0;
367
+ color: var(--brainz-panel-text);
368
+ }
369
+
370
+ /* Query Table */
371
+ .brainz-query-table {
372
+ width: 100%;
373
+ font-size: 0.8125rem;
374
+ border-collapse: collapse;
375
+ }
376
+
377
+ .brainz-query-table th,
378
+ .brainz-query-table td {
379
+ padding: 0.5rem;
380
+ text-align: left;
381
+ border-bottom: 1px solid var(--brainz-panel-border);
382
+ }
383
+
384
+ .brainz-query-table th {
385
+ color: var(--brainz-panel-text-muted);
386
+ font-weight: 500;
387
+ background: var(--brainz-panel-surface);
388
+ }
389
+
390
+ .brainz-query-table td {
391
+ color: var(--brainz-panel-text);
392
+ }
393
+
394
+ .brainz-query-duration {
395
+ font-family: var(--brainz-mono);
396
+ font-size: 0.75rem;
397
+ white-space: nowrap;
398
+ color: var(--brainz-panel-text);
399
+ }
400
+
401
+ .brainz-query-duration.slow {
402
+ color: var(--brainz-warning);
403
+ font-weight: 600;
404
+ }
405
+
406
+ .brainz-query-duration.very-slow {
407
+ color: var(--brainz-error);
408
+ font-weight: 600;
409
+ }
410
+
411
+ .brainz-query-sql {
412
+ font-family: var(--brainz-mono);
413
+ font-size: 0.75rem;
414
+ color: var(--brainz-panel-text-muted);
415
+ max-width: 500px;
416
+ overflow: hidden;
417
+ text-overflow: ellipsis;
418
+ white-space: nowrap;
419
+ }
420
+
421
+ /* ============================================
422
+ DEBUG PANEL STYLES
423
+ ============================================ */
424
+
425
+ .brainz-debug-panel {
426
+ position: fixed;
427
+ bottom: 0;
428
+ left: 0;
429
+ right: 0;
430
+ max-height: 50vh;
431
+ background: var(--brainz-panel-bg);
432
+ border-top: 3px solid var(--brainz-orange);
433
+ box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.15);
434
+ font-family: var(--brainz-font);
435
+ z-index: 999999;
436
+ display: flex;
437
+ flex-direction: column;
438
+ transition: max-height 0.2s ease;
439
+ }
440
+
441
+ html.dark .brainz-debug-panel {
442
+ box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.5);
443
+ }
444
+
445
+ .brainz-debug-panel * {
446
+ box-sizing: border-box;
447
+ }
448
+
449
+ .brainz-debug-panel.collapsed {
450
+ max-height: 44px;
451
+ overflow: hidden;
452
+ }
453
+
454
+ .brainz-debug-panel.collapsed .brainz-debug-tabs,
455
+ .brainz-debug-panel.collapsed .brainz-debug-content {
456
+ display: none;
457
+ }
458
+
459
+ /* Minimized State - Panel completely hidden */
460
+ .brainz-debug-panel.minimized {
461
+ max-height: 0;
462
+ border-top-width: 0;
463
+ box-shadow: none;
464
+ overflow: hidden;
465
+ pointer-events: none;
466
+ }
467
+
468
+ .brainz-debug-panel.minimized .brainz-debug-toolbar,
469
+ .brainz-debug-panel.minimized .brainz-debug-tabs,
470
+ .brainz-debug-panel.minimized .brainz-debug-content {
471
+ display: none;
472
+ }
473
+
474
+ /* Restore button is visible when minimized */
475
+ .brainz-debug-panel.minimized .brainz-debug-restore {
476
+ pointer-events: auto;
477
+ }
478
+
479
+ /* Toolbar */
480
+ .brainz-debug-toolbar {
481
+ display: flex;
482
+ align-items: center;
483
+ padding: 0.5rem 1rem;
484
+ background: var(--brainz-panel-surface);
485
+ border-bottom: 1px solid var(--brainz-panel-border);
486
+ gap: 0.75rem;
487
+ cursor: pointer;
488
+ min-height: 44px;
489
+ flex-shrink: 0;
490
+ }
491
+
492
+ .brainz-debug-toolbar:hover {
493
+ background: var(--brainz-panel-surface-alt);
494
+ }
495
+
496
+ .brainz-debug-logo {
497
+ width: 24px;
498
+ height: 24px;
499
+ flex-shrink: 0;
500
+ }
501
+
502
+ .brainz-debug-stat {
503
+ font-size: 0.75rem;
504
+ padding: 0.25rem 0.5rem;
505
+ border-radius: 4px;
506
+ background: var(--brainz-panel-bg);
507
+ border: 1px solid var(--brainz-panel-border);
508
+ display: flex;
509
+ align-items: center;
510
+ gap: 0.25rem;
511
+ color: var(--brainz-panel-text-muted);
512
+ }
513
+
514
+ .brainz-debug-stat strong {
515
+ font-weight: 600;
516
+ color: var(--brainz-panel-text);
517
+ }
518
+
519
+ .brainz-debug-stat.error {
520
+ background: var(--brainz-error-light);
521
+ border-color: var(--brainz-error);
522
+ color: var(--brainz-error);
523
+ }
524
+
525
+ .brainz-debug-stat.warning {
526
+ background: var(--brainz-warning-light);
527
+ border-color: var(--brainz-warning);
528
+ color: var(--brainz-warning);
529
+ }
530
+
531
+ .brainz-debug-stat.success {
532
+ background: var(--brainz-success-light);
533
+ border-color: var(--brainz-success);
534
+ color: var(--brainz-success);
535
+ }
536
+
537
+ .brainz-debug-expand {
538
+ margin-left: auto;
539
+ color: var(--brainz-panel-text-muted);
540
+ transition: transform 0.2s ease;
541
+ }
542
+
543
+ .brainz-debug-panel.collapsed .brainz-debug-expand {
544
+ transform: rotate(180deg);
545
+ }
546
+
547
+ /* Minimize Button (on toolbar) */
548
+ .brainz-debug-minimize {
549
+ display: flex;
550
+ align-items: center;
551
+ justify-content: center;
552
+ width: 24px;
553
+ height: 24px;
554
+ padding: 0;
555
+ margin-left: 0.5rem;
556
+ background: transparent;
557
+ border: 1px solid var(--brainz-panel-border);
558
+ border-radius: 4px;
559
+ color: var(--brainz-panel-text-muted);
560
+ cursor: pointer;
561
+ transition: all 0.15s ease;
562
+ flex-shrink: 0;
563
+ }
564
+
565
+ .brainz-debug-minimize:hover {
566
+ background: var(--brainz-panel-surface-alt);
567
+ border-color: var(--brainz-panel-border);
568
+ color: var(--brainz-panel-text);
569
+ }
570
+
571
+ .brainz-debug-minimize:active {
572
+ transform: scale(0.95);
573
+ }
574
+
575
+ /* Restore Button (floating, visible when minimized) */
576
+ .brainz-debug-restore {
577
+ position: fixed;
578
+ bottom: 16px;
579
+ left: 16px;
580
+ display: none;
581
+ align-items: center;
582
+ justify-content: center;
583
+ width: 40px;
584
+ height: 40px;
585
+ padding: 0;
586
+ background: var(--brainz-panel-bg);
587
+ border: 2px solid var(--brainz-orange);
588
+ border-radius: 50%;
589
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15), 0 4px 16px rgba(255, 107, 53, 0.2);
590
+ cursor: pointer;
591
+ transition: all 0.2s ease;
592
+ z-index: 999999;
593
+ }
594
+
595
+ html.dark .brainz-debug-restore {
596
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4), 0 4px 16px rgba(255, 107, 53, 0.25);
597
+ }
598
+
599
+ .brainz-debug-restore:hover {
600
+ transform: scale(1.1);
601
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2), 0 6px 20px rgba(255, 107, 53, 0.3);
602
+ }
603
+
604
+ html.dark .brainz-debug-restore:hover {
605
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5), 0 6px 20px rgba(255, 107, 53, 0.35);
606
+ }
607
+
608
+ .brainz-debug-restore:active {
609
+ transform: scale(1.05);
610
+ }
611
+
612
+ .brainz-debug-restore img {
613
+ width: 20px;
614
+ height: 20px;
615
+ }
616
+
617
+ /* Show restore button when panel is minimized */
618
+ .brainz-debug-panel.minimized .brainz-debug-restore {
619
+ display: flex;
620
+ }
621
+
622
+ /* Performance Score */
623
+ .brainz-score {
624
+ position: relative;
625
+ width: 32px;
626
+ height: 32px;
627
+ flex-shrink: 0;
628
+ }
629
+
630
+ .brainz-score-ring {
631
+ width: 100%;
632
+ height: 100%;
633
+ }
634
+
635
+ .brainz-score-bg {
636
+ stroke: var(--brainz-score-bg);
637
+ }
638
+
639
+ .brainz-score-progress {
640
+ stroke-linecap: round;
641
+ transition: stroke-dasharray 0.3s ease;
642
+ }
643
+
644
+ .brainz-score-value {
645
+ position: absolute;
646
+ inset: 0;
647
+ display: flex;
648
+ align-items: center;
649
+ justify-content: center;
650
+ font-size: 0.6875rem;
651
+ font-weight: 600;
652
+ color: var(--brainz-panel-text);
653
+ }
654
+
655
+ /* Score grades */
656
+ .brainz-score.excellent .brainz-score-progress { stroke: var(--brainz-score-excellent); }
657
+ .brainz-score.excellent .brainz-score-value { color: var(--brainz-score-excellent-text); }
658
+
659
+ .brainz-score.good .brainz-score-progress { stroke: var(--brainz-score-good); }
660
+ .brainz-score.good .brainz-score-value { color: var(--brainz-score-good-text); }
661
+
662
+ .brainz-score.warning .brainz-score-progress { stroke: var(--brainz-score-warning); }
663
+ .brainz-score.warning .brainz-score-value { color: var(--brainz-score-warning-text); }
664
+
665
+ .brainz-score.poor .brainz-score-progress { stroke: var(--brainz-score-poor); }
666
+ .brainz-score.poor .brainz-score-value { color: var(--brainz-score-poor-text); }
667
+
668
+ /* Tabs */
669
+ .brainz-debug-tabs {
670
+ display: flex;
671
+ background: var(--brainz-panel-surface-alt);
672
+ border-bottom: 1px solid var(--brainz-panel-border);
673
+ flex-shrink: 0;
674
+ overflow-x: auto;
675
+ }
676
+
677
+ .brainz-debug-tab {
678
+ padding: 0.625rem 1rem;
679
+ font-size: 0.8125rem;
680
+ font-weight: 500;
681
+ border: none;
682
+ background: none;
683
+ cursor: pointer;
684
+ color: var(--brainz-panel-text-muted);
685
+ white-space: nowrap;
686
+ transition: all 0.15s ease;
687
+ }
688
+
689
+ .brainz-debug-tab:hover {
690
+ color: var(--brainz-panel-text);
691
+ background: var(--brainz-panel-surface);
692
+ }
693
+
694
+ .brainz-debug-tab.active {
695
+ color: var(--brainz-orange);
696
+ background: var(--brainz-panel-bg);
697
+ box-shadow: inset 0 -2px 0 var(--brainz-orange);
698
+ }
699
+
700
+ .brainz-debug-tab .badge {
701
+ display: inline-flex;
702
+ align-items: center;
703
+ justify-content: center;
704
+ min-width: 18px;
705
+ height: 18px;
706
+ padding: 0 5px;
707
+ margin-left: 0.375rem;
708
+ font-size: 0.6875rem;
709
+ font-weight: 600;
710
+ background: var(--brainz-panel-border);
711
+ border-radius: 9px;
712
+ color: var(--brainz-panel-text-muted);
713
+ }
714
+
715
+ .brainz-debug-tab.active .badge {
716
+ background: var(--brainz-orange);
717
+ color: white;
718
+ }
719
+
720
+ /* Content */
721
+ .brainz-debug-content {
722
+ flex: 1;
723
+ overflow: auto;
724
+ padding: 1rem;
725
+ background: var(--brainz-panel-bg);
726
+ }
727
+
728
+ /* Panes */
729
+ .brainz-debug-pane {
730
+ display: none;
731
+ }
732
+
733
+ .brainz-debug-pane.active {
734
+ display: block;
735
+ }
736
+
737
+ /* Alert Box */
738
+ .brainz-alert {
739
+ padding: 0.75rem 1rem;
740
+ border-radius: 8px;
741
+ margin-bottom: 1rem;
742
+ font-size: 0.8125rem;
743
+ }
744
+
745
+ .brainz-alert.error {
746
+ background: var(--brainz-error-light);
747
+ border-left: 3px solid var(--brainz-error);
748
+ color: var(--brainz-error);
749
+ }
750
+
751
+ .brainz-alert.warning {
752
+ background: var(--brainz-warning-light);
753
+ border-left: 3px solid var(--brainz-warning);
754
+ color: var(--brainz-warning);
755
+ }
756
+
757
+ .brainz-alert strong {
758
+ font-weight: 600;
759
+ }
760
+
761
+ /* N+1 Detection */
762
+ .brainz-n-plus-one {
763
+ background: rgba(229, 62, 62, 0.05);
764
+ border-left: 3px solid var(--brainz-error);
765
+ padding: 0.5rem 0.75rem;
766
+ margin-top: 0.5rem;
767
+ font-size: 0.8125rem;
768
+ border-radius: 0 6px 6px 0;
769
+ }
770
+
771
+ .brainz-n-plus-one-header {
772
+ display: flex;
773
+ align-items: center;
774
+ justify-content: space-between;
775
+ gap: 0.5rem;
776
+ flex-wrap: wrap;
777
+ }
778
+
779
+ .brainz-n-plus-one code {
780
+ display: block;
781
+ margin-top: 0.375rem;
782
+ font-family: var(--brainz-mono);
783
+ font-size: 0.75rem;
784
+ color: var(--brainz-text-muted);
785
+ overflow: hidden;
786
+ text-overflow: ellipsis;
787
+ white-space: nowrap;
788
+ }
789
+
790
+ .brainz-n-plus-one .source {
791
+ color: var(--brainz-text-light);
792
+ font-size: 0.75rem;
793
+ margin-left: 0.5rem;
794
+ }
795
+
796
+ /* Copy to AI Button */
797
+ .brainz-copy-to-ai-btn {
798
+ display: inline-flex;
799
+ align-items: center;
800
+ gap: 0.375rem;
801
+ padding: 0.25rem 0.5rem;
802
+ font-size: 0.6875rem;
803
+ font-weight: 500;
804
+ font-family: var(--brainz-font);
805
+ color: var(--brainz-orange);
806
+ background: white;
807
+ border: 1px solid var(--brainz-orange);
808
+ border-radius: 4px;
809
+ cursor: pointer;
810
+ transition: all 0.15s ease;
811
+ flex-shrink: 0;
812
+ }
813
+
814
+ .brainz-copy-to-ai-btn:hover {
815
+ background: var(--brainz-orange);
816
+ color: white;
817
+ }
818
+
819
+ .brainz-copy-to-ai-btn:active {
820
+ transform: scale(0.95);
821
+ }
822
+
823
+ .brainz-copy-to-ai-btn svg {
824
+ flex-shrink: 0;
825
+ }
826
+
827
+ /* ============================================
828
+ ISSUES TAB - Anthropic/Claude Design
829
+ Clean, minimal, warm, elegant
830
+ ============================================ */
831
+
832
+ /* Issues Tab styling */
833
+ .brainz-debug-tab.has-issues {
834
+ color: var(--brainz-error);
835
+ }
836
+
837
+ .brainz-debug-tab .badge.error {
838
+ background: var(--brainz-error);
839
+ color: white;
840
+ }
841
+
842
+ /* No Issues State */
843
+ .brainz-no-issues {
844
+ display: flex;
845
+ flex-direction: column;
846
+ align-items: center;
847
+ justify-content: center;
848
+ padding: 3rem 2rem;
849
+ text-align: center;
850
+ }
851
+
852
+ .brainz-no-issues svg {
853
+ width: 48px;
854
+ height: 48px;
855
+ margin-bottom: 1rem;
856
+ color: var(--brainz-success);
857
+ }
858
+
859
+ .brainz-no-issues p {
860
+ font-size: 0.9375rem;
861
+ font-weight: 500;
862
+ color: var(--brainz-panel-text);
863
+ margin: 0 0 0.25rem 0;
864
+ }
865
+
866
+ .brainz-no-issues span {
867
+ font-size: 0.8125rem;
868
+ color: var(--brainz-panel-text-muted);
869
+ }
870
+
871
+ /* Issues Container */
872
+ .brainz-issues-container {
873
+ display: flex;
874
+ flex-direction: column;
875
+ gap: 0.75rem;
876
+ }
877
+
878
+ /* Issue Section */
879
+ .brainz-issue-section {
880
+ border: 1px solid var(--brainz-panel-border);
881
+ border-radius: 8px;
882
+ overflow: hidden;
883
+ }
884
+
885
+ /* Issue Header */
886
+ .brainz-issue-header {
887
+ display: flex;
888
+ align-items: center;
889
+ gap: 0.5rem;
890
+ padding: 0.625rem 0.875rem;
891
+ font-size: 0.8125rem;
892
+ font-weight: 500;
893
+ color: var(--brainz-panel-text);
894
+ background: var(--brainz-panel-surface);
895
+ border-bottom: 1px solid var(--brainz-panel-border);
896
+ }
897
+
898
+ .brainz-issue-header.error {
899
+ background: var(--brainz-issue-error-bg);
900
+ color: var(--brainz-issue-error-text);
901
+ }
902
+
903
+ .brainz-issue-header.warning {
904
+ background: var(--brainz-issue-warning-bg);
905
+ color: var(--brainz-issue-warning-text);
906
+ }
907
+
908
+ .brainz-issue-header svg {
909
+ flex-shrink: 0;
910
+ width: 14px;
911
+ height: 14px;
912
+ }
913
+
914
+ .brainz-issue-header .issue-count {
915
+ margin-left: auto;
916
+ font-size: 0.6875rem;
917
+ font-weight: 500;
918
+ color: inherit;
919
+ opacity: 0.7;
920
+ }
921
+
922
+ /* Issue Item */
923
+ .brainz-issue-item {
924
+ display: flex;
925
+ align-items: flex-start;
926
+ justify-content: space-between;
927
+ gap: 1rem;
928
+ padding: 0.75rem 0.875rem;
929
+ background: var(--brainz-panel-bg);
930
+ border-bottom: 1px solid var(--brainz-panel-border-light);
931
+ }
932
+
933
+ .brainz-issue-item:last-child {
934
+ border-bottom: none;
935
+ }
936
+
937
+ /* Issue Content */
938
+ .brainz-issue-content {
939
+ flex: 1;
940
+ min-width: 0;
941
+ font-size: 0.8125rem;
942
+ line-height: 1.5;
943
+ color: var(--brainz-panel-text-secondary);
944
+ }
945
+
946
+ .brainz-issue-content strong {
947
+ color: var(--brainz-panel-text);
948
+ font-weight: 600;
949
+ }
950
+
951
+ .brainz-issue-content code {
952
+ display: block;
953
+ margin-top: 0.5rem;
954
+ padding: 0.5rem;
955
+ font-family: var(--brainz-mono);
956
+ font-size: 0.6875rem;
957
+ color: var(--brainz-panel-text-muted);
958
+ background: var(--brainz-panel-surface);
959
+ border-radius: 4px;
960
+ overflow: hidden;
961
+ text-overflow: ellipsis;
962
+ white-space: nowrap;
963
+ }
964
+
965
+ .brainz-issue-source {
966
+ font-size: 0.6875rem;
967
+ color: var(--brainz-panel-text-placeholder);
968
+ margin-left: 0.25rem;
969
+ }
970
+
971
+ .brainz-issue-source::before {
972
+ content: "·";
973
+ margin-right: 0.25rem;
974
+ }
975
+
976
+ .brainz-issue-name {
977
+ color: var(--brainz-panel-text-muted);
978
+ font-weight: 400;
979
+ }
980
+
981
+ .brainz-issue-hint {
982
+ display: block;
983
+ margin-top: 0.375rem;
984
+ font-size: 0.75rem;
985
+ color: var(--brainz-panel-text-placeholder);
986
+ }
987
+
988
+ /* Issue Metric Badge */
989
+ .brainz-issue-metric {
990
+ display: inline-flex;
991
+ align-items: center;
992
+ padding: 0.125rem 0.375rem;
993
+ font-size: 0.6875rem;
994
+ font-weight: 600;
995
+ border-radius: 4px;
996
+ margin-right: 0.375rem;
997
+ }
998
+
999
+ .brainz-issue-metric.critical {
1000
+ background: var(--brainz-issue-metric-critical-bg);
1001
+ color: var(--brainz-issue-metric-critical-text);
1002
+ }
1003
+
1004
+ .brainz-issue-metric.slow {
1005
+ background: var(--brainz-issue-metric-slow-bg);
1006
+ color: var(--brainz-issue-metric-slow-text);
1007
+ }
1008
+
1009
+ /* Copy to AI Button - Clean minimal style */
1010
+ .brainz-copy-to-ai-btn {
1011
+ display: inline-flex;
1012
+ align-items: center;
1013
+ gap: 0.375rem;
1014
+ padding: 0.375rem 0.625rem;
1015
+ font-size: 0.6875rem;
1016
+ font-weight: 500;
1017
+ font-family: var(--brainz-font);
1018
+ color: var(--brainz-panel-text-muted);
1019
+ background: var(--brainz-panel-bg);
1020
+ border: 1px solid var(--brainz-panel-border);
1021
+ border-radius: 6px;
1022
+ cursor: pointer;
1023
+ transition: all 0.15s ease;
1024
+ flex-shrink: 0;
1025
+ }
1026
+
1027
+ .brainz-copy-to-ai-btn:hover {
1028
+ color: var(--brainz-panel-text);
1029
+ border-color: var(--brainz-panel-text-muted);
1030
+ background: var(--brainz-panel-surface);
1031
+ }
1032
+
1033
+ .brainz-copy-to-ai-btn:active {
1034
+ transform: scale(0.97);
1035
+ }
1036
+
1037
+ .brainz-copy-to-ai-btn.copied {
1038
+ color: var(--brainz-success);
1039
+ border-color: var(--brainz-success);
1040
+ }
1041
+
1042
+ .brainz-copy-to-ai-btn svg {
1043
+ flex-shrink: 0;
1044
+ opacity: 0.7;
1045
+ }
1046
+
1047
+ /* Toast notification */
1048
+ .brainz-toast {
1049
+ position: fixed;
1050
+ bottom: 60px;
1051
+ right: 20px;
1052
+ padding: 0.5rem 1rem;
1053
+ background: var(--brainz-code-bg);
1054
+ color: var(--brainz-code-text);
1055
+ border-radius: 6px;
1056
+ font-size: 0.8125rem;
1057
+ font-family: var(--brainz-font);
1058
+ z-index: 1000001;
1059
+ opacity: 0;
1060
+ transform: translateY(8px);
1061
+ transition: opacity 0.2s ease, transform 0.2s ease;
1062
+ }
1063
+
1064
+ .brainz-toast.visible {
1065
+ opacity: 1;
1066
+ transform: translateY(0);
1067
+ }
1068
+
1069
+ /* Slow indicators */
1070
+ .brainz-query-row.slow {
1071
+ background: var(--brainz-warning-light);
1072
+ }
1073
+
1074
+ .brainz-slow {
1075
+ color: var(--brainz-warning) !important;
1076
+ font-weight: 600;
1077
+ }
1078
+
1079
+ /* View Table */
1080
+ .brainz-view-table {
1081
+ width: 100%;
1082
+ font-size: 0.8125rem;
1083
+ border-collapse: collapse;
1084
+ }
1085
+
1086
+ .brainz-view-table th,
1087
+ .brainz-view-table td {
1088
+ padding: 0.5rem;
1089
+ text-align: left;
1090
+ border-bottom: 1px solid var(--brainz-panel-border);
1091
+ }
1092
+
1093
+ .brainz-view-table th {
1094
+ color: var(--brainz-panel-text-muted);
1095
+ font-weight: 500;
1096
+ background: var(--brainz-panel-surface);
1097
+ }
1098
+
1099
+ .brainz-view-table td {
1100
+ color: var(--brainz-panel-text);
1101
+ }
1102
+
1103
+ /* Log Entry */
1104
+ .brainz-log-entry {
1105
+ display: flex;
1106
+ align-items: flex-start;
1107
+ gap: 0.75rem;
1108
+ padding: 0.375rem 0;
1109
+ font-size: 0.8125rem;
1110
+ border-bottom: 1px solid var(--brainz-panel-border);
1111
+ color: var(--brainz-panel-text);
1112
+ }
1113
+
1114
+ .brainz-log-entry:last-child {
1115
+ border-bottom: none;
1116
+ }
1117
+
1118
+ .brainz-log-entry .log-level {
1119
+ font-size: 0.6875rem;
1120
+ font-weight: 600;
1121
+ padding: 0.125rem 0.375rem;
1122
+ border-radius: 3px;
1123
+ text-transform: uppercase;
1124
+ flex-shrink: 0;
1125
+ min-width: 48px;
1126
+ text-align: center;
1127
+ }
1128
+
1129
+ .brainz-log-entry.error .log-level {
1130
+ background: var(--brainz-error-light);
1131
+ color: var(--brainz-error);
1132
+ }
1133
+
1134
+ .brainz-log-entry.warning .log-level {
1135
+ background: var(--brainz-warning-light);
1136
+ color: var(--brainz-warning);
1137
+ }
1138
+
1139
+ .brainz-log-entry.info .log-level {
1140
+ background: var(--brainz-info-light);
1141
+ color: var(--brainz-info);
1142
+ }
1143
+
1144
+ .brainz-log-entry.debug .log-level {
1145
+ background: var(--brainz-panel-surface-alt);
1146
+ color: var(--brainz-panel-text-muted);
1147
+ }
1148
+
1149
+ .brainz-log-entry .log-time {
1150
+ font-family: var(--brainz-mono);
1151
+ font-size: 0.75rem;
1152
+ color: var(--brainz-panel-text-muted);
1153
+ flex-shrink: 0;
1154
+ }
1155
+
1156
+ .brainz-log-entry .log-message {
1157
+ flex: 1;
1158
+ word-break: break-word;
1159
+ }
1160
+
1161
+ /* Code Block */
1162
+ .brainz-code-block {
1163
+ background: var(--brainz-panel-surface-alt);
1164
+ border-radius: 8px;
1165
+ padding: 0.75rem 1rem;
1166
+ font-family: var(--brainz-mono);
1167
+ font-size: 0.75rem;
1168
+ overflow-x: auto;
1169
+ white-space: pre-wrap;
1170
+ word-break: break-all;
1171
+ margin: 0.5rem 0 0 0;
1172
+ color: var(--brainz-panel-text);
1173
+ }
1174
+
1175
+ /* Timeline */
1176
+ /* ============================================
1177
+ TIMELINE - Clean Anthropic Design
1178
+ ============================================ */
1179
+
1180
+ /* Header with total time */
1181
+ .timeline-header {
1182
+ display: flex;
1183
+ align-items: baseline;
1184
+ gap: 0.5rem;
1185
+ margin-bottom: 1rem;
1186
+ }
1187
+
1188
+ .timeline-total {
1189
+ font-size: 1.75rem;
1190
+ font-weight: 600;
1191
+ color: var(--brainz-panel-text);
1192
+ letter-spacing: -0.02em;
1193
+ }
1194
+
1195
+ .timeline-label {
1196
+ font-size: 0.8125rem;
1197
+ color: var(--brainz-panel-text-placeholder);
1198
+ }
1199
+
1200
+ /* Timeline Bar */
1201
+ .timeline-bar {
1202
+ display: flex;
1203
+ height: 8px;
1204
+ background: var(--brainz-timeline-bar-bg);
1205
+ border-radius: 4px;
1206
+ overflow: hidden;
1207
+ margin-bottom: 1.25rem;
1208
+ }
1209
+
1210
+ .timeline-segment {
1211
+ display: flex;
1212
+ align-items: center;
1213
+ justify-content: center;
1214
+ transition: opacity 0.15s ease;
1215
+ }
1216
+
1217
+ .timeline-segment:hover {
1218
+ opacity: 0.85;
1219
+ }
1220
+
1221
+ .timeline-segment-label {
1222
+ display: none;
1223
+ }
1224
+
1225
+ .timeline-segment.db {
1226
+ background: var(--brainz-timeline-db);
1227
+ }
1228
+
1229
+ .timeline-segment.views {
1230
+ background: var(--brainz-timeline-views);
1231
+ }
1232
+
1233
+ .timeline-segment.other {
1234
+ background: var(--brainz-timeline-other);
1235
+ }
1236
+
1237
+ /* Stats Grid */
1238
+ .timeline-stats {
1239
+ display: flex;
1240
+ flex-direction: column;
1241
+ gap: 0.5rem;
1242
+ }
1243
+
1244
+ .timeline-stat {
1245
+ display: flex;
1246
+ align-items: center;
1247
+ gap: 0.75rem;
1248
+ padding: 0.625rem 0.75rem;
1249
+ background: var(--brainz-panel-surface);
1250
+ border: 1px solid var(--brainz-panel-border-light);
1251
+ border-radius: 8px;
1252
+ }
1253
+
1254
+ .timeline-stat:hover {
1255
+ background: var(--brainz-panel-surface-alt);
1256
+ }
1257
+
1258
+ .timeline-stat-icon {
1259
+ display: flex;
1260
+ align-items: center;
1261
+ justify-content: center;
1262
+ width: 32px;
1263
+ height: 32px;
1264
+ border-radius: 6px;
1265
+ flex-shrink: 0;
1266
+ }
1267
+
1268
+ .timeline-stat-icon.db {
1269
+ background: var(--brainz-timeline-db-bg);
1270
+ color: var(--brainz-timeline-db);
1271
+ }
1272
+
1273
+ .timeline-stat-icon.views {
1274
+ background: var(--brainz-timeline-views-bg);
1275
+ color: var(--brainz-timeline-views);
1276
+ }
1277
+
1278
+ .timeline-stat-icon.other {
1279
+ background: var(--brainz-timeline-other-bg);
1280
+ color: var(--brainz-timeline-other);
1281
+ }
1282
+
1283
+ .timeline-stat-content {
1284
+ flex: 1;
1285
+ min-width: 0;
1286
+ }
1287
+
1288
+ .timeline-stat-value {
1289
+ font-size: 0.9375rem;
1290
+ font-weight: 600;
1291
+ color: var(--brainz-panel-text);
1292
+ }
1293
+
1294
+ .timeline-stat-label {
1295
+ font-size: 0.75rem;
1296
+ color: var(--brainz-panel-text-muted);
1297
+ margin-top: 0.125rem;
1298
+ }
1299
+
1300
+ .timeline-stat-pct {
1301
+ font-size: 0.8125rem;
1302
+ font-weight: 500;
1303
+ color: var(--brainz-panel-text-placeholder);
1304
+ padding: 0.25rem 0.5rem;
1305
+ background: var(--brainz-panel-bg);
1306
+ border-radius: 4px;
1307
+ }
1308
+
1309
+ /* Cached Query Styling */
1310
+ .brainz-query-row.cached {
1311
+ opacity: 0.6;
1312
+ }
1313
+
1314
+ .brainz-query-row.cached td:first-child::after {
1315
+ content: " (cached)";
1316
+ font-size: 0.6875rem;
1317
+ color: var(--brainz-panel-text-muted);
1318
+ }
1319
+
1320
+ /* Keyboard Hint */
1321
+ .brainz-keyboard-hint {
1322
+ font-size: 0.6875rem;
1323
+ color: var(--brainz-panel-text-muted);
1324
+ margin-left: auto;
1325
+ padding: 0.125rem 0.375rem;
1326
+ background: var(--brainz-panel-surface-alt);
1327
+ border-radius: 3px;
1328
+ font-family: var(--brainz-mono);
1329
+ }