beast-devtools 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/.claude/launch.json +11 -0
  2. package/CHANGELOG.md +37 -0
  3. package/README.md +87 -0
  4. package/devtools/CHANGELOG.md +26 -0
  5. package/devtools/LICENSE +15 -0
  6. package/devtools/README.md +164 -0
  7. package/devtools/client/BeastDevtools.btsx +185 -0
  8. package/devtools/client/CodeView.btsx +61 -0
  9. package/devtools/client/ComponentsPanel.btsx +212 -0
  10. package/devtools/client/FileList.btsx +35 -0
  11. package/devtools/client/InspectorPanel.btsx +131 -0
  12. package/devtools/client/RefactorPanel.btsx +304 -0
  13. package/devtools/client/api.ts +69 -0
  14. package/devtools/client/compile.test.ts +22 -0
  15. package/devtools/client/devtools.css +1279 -0
  16. package/devtools/client/highlight.ts +210 -0
  17. package/devtools/client/mount.ts +16 -0
  18. package/devtools/client/runtime.ts +168 -0
  19. package/devtools/client/util.ts +136 -0
  20. package/devtools/package.json +73 -0
  21. package/devtools/server/analyze.test.ts +148 -0
  22. package/devtools/server/analyze.ts +737 -0
  23. package/devtools/server/diff.ts +82 -0
  24. package/devtools/server/line-map.ts +63 -0
  25. package/devtools/server/octane-bundler.d.ts +17 -0
  26. package/devtools/server/project.ts +369 -0
  27. package/devtools/server/refactor.test.ts +224 -0
  28. package/devtools/server/refactor.ts +224 -0
  29. package/devtools/server/source-scan.ts +377 -0
  30. package/devtools/shared/types.ts +208 -0
  31. package/devtools/test/fixtures/App.btsx +193 -0
  32. package/devtools/tsconfig.build.json +17 -0
  33. package/devtools/vite.ts +159 -0
  34. package/favicon.ico +0 -0
  35. package/index.html +14 -0
  36. package/package.json +34 -0
  37. package/public/beast.svg +1 -0
  38. package/src/App.btsx +144 -0
  39. package/src/AppHeader.btsx +24 -0
  40. package/src/LeftArticle.btsx +22 -0
  41. package/src/RightArticle.btsx +19 -0
  42. package/src/env.d.ts +8 -0
  43. package/src/lib/utils.ts +6 -0
  44. package/src/main.ts +8 -0
  45. package/src/style.css +44 -0
  46. package/tsconfig.json +39 -0
  47. package/vite.config.ts +19 -0
@@ -0,0 +1,1279 @@
1
+ /*
2
+ * Beast DevTools overlay. Every selector is prefixed with `bdt-` and the root
3
+ * resets its subtree, so the overlay renders the same with or without the host
4
+ * app's Tailwind preflight or global element styles.
5
+ */
6
+
7
+ .bdt-root {
8
+ --bdt-bg: #121312;
9
+ --bdt-bg-2: #181818;
10
+ --bdt-bg-3: #202020;
11
+ --bdt-bg-4: #2a2a2a;
12
+ --bdt-line: rgba(255, 255, 255, 0.07);
13
+ --bdt-line-2: rgba(255, 255, 255, 0.13);
14
+ --bdt-text: #f2f2ee;
15
+ --bdt-muted: #a4a5a0;
16
+ --bdt-dim: #8b8b8b;
17
+ --bdt-accent: #ff415a;
18
+ --bdt-accent-soft: rgba(255, 65, 90, 0.14);
19
+ --bdt-ok: #5fd39a;
20
+ --bdt-warn: #ffb86b;
21
+ --bdt-bad: #ff5d6c;
22
+ --bdt-info: #7cb7ff;
23
+ --bdt-focus: #45c195;
24
+ --bdt-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
25
+ --bdt-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
26
+
27
+ position: fixed;
28
+ z-index: 2147483000;
29
+ color: var(--bdt-text);
30
+ font-family: var(--bdt-sans);
31
+ font-size: 12px;
32
+ line-height: 1.45;
33
+ font-synthesis: none;
34
+ -webkit-font-smoothing: antialiased;
35
+ text-align: left;
36
+ letter-spacing: normal;
37
+ }
38
+
39
+ .bdt-root *,
40
+ .bdt-root *::before,
41
+ .bdt-root *::after {
42
+ box-sizing: border-box;
43
+ margin: 0;
44
+ padding: 0;
45
+ border: 0 solid transparent;
46
+ font: inherit;
47
+ color: inherit;
48
+ background: none;
49
+ text-transform: none;
50
+ letter-spacing: inherit;
51
+ }
52
+
53
+ .bdt-root ::selection {
54
+ background: rgba(255, 65, 90, 0.35);
55
+ }
56
+
57
+ .bdt-root button,
58
+ .bdt-root input,
59
+ .bdt-root select {
60
+ cursor: pointer;
61
+ outline: none;
62
+ }
63
+
64
+ .bdt-root :focus-visible {
65
+ outline: 2px solid var(--bdt-focus);
66
+ outline-offset: 1px;
67
+ border-radius: 6px;
68
+ }
69
+
70
+ .bdt-root ::-webkit-scrollbar {
71
+ width: 10px;
72
+ height: 10px;
73
+ }
74
+
75
+ .bdt-root ::-webkit-scrollbar-thumb {
76
+ background: rgba(255, 255, 255, 0.1);
77
+ border: 3px solid transparent;
78
+ background-clip: padding-box;
79
+ border-radius: 999px;
80
+ }
81
+
82
+ .bdt-root ::-webkit-scrollbar-track,
83
+ .bdt-root ::-webkit-scrollbar-corner {
84
+ background: transparent;
85
+ }
86
+
87
+ /* ------------------------------------------------------------------------ */
88
+ /* Launcher and dock */
89
+
90
+ .bdt-launcher-host {
91
+ right: 16px;
92
+ bottom: 16px;
93
+ }
94
+
95
+ .bdt-launcher {
96
+ display: inline-flex;
97
+ align-items: center;
98
+ gap: 8px;
99
+ height: 36px;
100
+ padding: 0 14px 0 10px;
101
+ border: 1px solid var(--bdt-line-2);
102
+ border-radius: 999px;
103
+ background: linear-gradient(145deg, #2a2b29, #111211 72%);
104
+ box-shadow: 0 10px 28px rgba(15, 16, 14, 0.28);
105
+ font-weight: 600;
106
+ color: var(--bdt-text);
107
+ transition:
108
+ transform 120ms ease,
109
+ box-shadow 120ms ease;
110
+ }
111
+
112
+ .bdt-launcher:hover {
113
+ transform: translateY(-1px);
114
+ box-shadow: 0 14px 32px rgba(15, 16, 14, 0.34);
115
+ }
116
+
117
+ .bdt-launcher-dot {
118
+ width: 7px;
119
+ height: 7px;
120
+ border-radius: 999px;
121
+ background: var(--bdt-dim);
122
+ }
123
+
124
+ .bdt-launcher-dot.is-live {
125
+ background: var(--bdt-ok);
126
+ box-shadow: 0 0 0 3px rgba(95, 211, 154, 0.18);
127
+ }
128
+
129
+ .bdt-logo {
130
+ display: block;
131
+ width: 18px;
132
+ height: 18px;
133
+ color: var(--bdt-accent);
134
+ flex: none;
135
+ }
136
+
137
+ .bdt-dock {
138
+ left: 0;
139
+ right: 0;
140
+ bottom: 0;
141
+ display: flex;
142
+ flex-direction: column;
143
+ min-width: 320px;
144
+ background: var(--bdt-bg);
145
+ border-top: 1px solid var(--bdt-line-2);
146
+ box-shadow: 0 -18px 40px rgba(0, 0, 0, 0.25);
147
+ }
148
+
149
+ .bdt-resize {
150
+ position: absolute;
151
+ top: -4px;
152
+ left: 0;
153
+ right: 0;
154
+ height: 8px;
155
+ cursor: ns-resize;
156
+ touch-action: none;
157
+ }
158
+
159
+ .bdt-resize:hover,
160
+ .bdt-resize:active {
161
+ background: linear-gradient(
162
+ to bottom,
163
+ transparent 3px,
164
+ var(--bdt-accent) 3px,
165
+ var(--bdt-accent) 5px,
166
+ transparent 5px
167
+ );
168
+ }
169
+
170
+ .bdt-topbar {
171
+ display: flex;
172
+ align-items: center;
173
+ gap: 12px;
174
+ height: 40px;
175
+ padding: 0 8px 0 12px;
176
+ border-bottom: 1px solid var(--bdt-line);
177
+ background: var(--bdt-bg-2);
178
+ flex: none;
179
+ overflow: hidden;
180
+ }
181
+
182
+ .bdt-brand {
183
+ display: flex;
184
+ align-items: center;
185
+ gap: 8px;
186
+ font-weight: 600;
187
+ white-space: nowrap;
188
+ letter-spacing: -0.4px;
189
+ }
190
+
191
+ .bdt-brand-sub {
192
+ color: var(--bdt-dim);
193
+ font-weight: 500;
194
+ }
195
+
196
+ .bdt-tabs {
197
+ display: flex;
198
+ align-items: center;
199
+ flex: 0 1 auto;
200
+ min-width: 0;
201
+ overflow-x: auto;
202
+ scrollbar-width: none;
203
+ gap: 3px;
204
+ padding: 4px;
205
+ background: var(--bdt-bg);
206
+ border: 0.5px solid var(--bdt-bg-2);
207
+ }
208
+
209
+ .bdt-tab {
210
+ display: inline-flex;
211
+ align-items: center;
212
+ gap: 6px;
213
+ height: 26px;
214
+ padding: 0 12px;
215
+ border-radius: 999px;
216
+ color: var(--bdt-muted);
217
+ font-weight: 600;
218
+ white-space: nowrap;
219
+ letter-spacing: -0.4px;
220
+ }
221
+
222
+ .bdt-tab:hover {
223
+ color: var(--bdt-text);
224
+ }
225
+
226
+ .bdt-tab.is-active {
227
+ background: var(--bdt-bg-4);
228
+ color: var(--bdt-text);
229
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
230
+ }
231
+
232
+ .bdt-tab-count {
233
+ min-width: 18px;
234
+ padding: 0 5px;
235
+ border-radius: 999px;
236
+ /*background: var(--bdt-accent-soft);*/
237
+ color: var(--bdt-warn);
238
+ font-size: 12px;
239
+ line-height: 16px;
240
+ text-align: center;
241
+ }
242
+
243
+ .bdt-spacer {
244
+ flex: 1;
245
+ }
246
+
247
+ .bdt-status {
248
+ display: inline-flex;
249
+ align-items: center;
250
+ gap: 6px;
251
+ color: var(--bdt-muted);
252
+ white-space: nowrap;
253
+ }
254
+
255
+ .bdt-icon-button {
256
+ display: inline-grid;
257
+ place-items: center;
258
+ width: 28px;
259
+ height: 28px;
260
+ border-radius: 8px;
261
+ color: var(--bdt-muted);
262
+ flex: none;
263
+ }
264
+
265
+ .bdt-icon-button:hover {
266
+ background: var(--bdt-bg-4);
267
+ color: var(--bdt-text);
268
+ }
269
+
270
+ .bdt-icon-button svg {
271
+ display: block;
272
+ width: 14px;
273
+ height: 14px;
274
+ }
275
+
276
+ .bdt-body {
277
+ flex: 1;
278
+ min-height: 0;
279
+ display: flex;
280
+ }
281
+
282
+ /* ------------------------------------------------------------------------ */
283
+ /* Shared building blocks */
284
+
285
+ .bdt-sidebar {
286
+ width: 220px;
287
+ flex: none;
288
+ border-right: 1px solid var(--bdt-line);
289
+ display: flex;
290
+ flex-direction: column;
291
+ min-height: 0;
292
+ background: var(--bdt-bg);
293
+ overflow: hidden;
294
+ }
295
+
296
+ .bdt-pane {
297
+ flex: 1;
298
+ min-width: 0;
299
+ min-height: 0;
300
+ display: flex;
301
+ flex-direction: column;
302
+ }
303
+
304
+ .bdt-toolbar {
305
+ display: flex;
306
+ align-items: center;
307
+ gap: 8px;
308
+ min-height: 36px;
309
+ padding: 4px 10px;
310
+ border-bottom: 1px solid var(--bdt-line);
311
+ flex: none;
312
+ flex-wrap: wrap;
313
+ }
314
+
315
+ .bdt-toolbar-title {
316
+ font-weight: 600;
317
+ white-space: nowrap;
318
+ overflow: hidden;
319
+ text-overflow: ellipsis;
320
+ }
321
+
322
+ .bdt-section-label {
323
+ padding: 12px 12px 10px;
324
+ color: var(--bdt-dim);
325
+ font-size: 10px;
326
+ font-weight: 400;
327
+ letter-spacing: 0.1em;
328
+ text-transform: uppercase;
329
+ }
330
+
331
+ .bdt-scroll {
332
+ flex: 1;
333
+ min-height: 0;
334
+ overflow: auto;
335
+ padding: 0 6px;
336
+ }
337
+
338
+ .bdt-button {
339
+ display: inline-flex;
340
+ align-items: center;
341
+ gap: 6px;
342
+ height: 24px;
343
+ padding: 0 6px;
344
+ border: 0.33px solid var(--bdt-line-2);
345
+ border-radius: 6px;
346
+ background: var(--bdt-bg-3);
347
+ color: var(--bdt-text);
348
+ font-size: 12px;
349
+ font-weight: 500;
350
+ white-space: nowrap;
351
+ }
352
+
353
+ .bdt-button:hover {
354
+ color: var(--bdt-warn);
355
+ }
356
+
357
+ .bdt-button-critical {
358
+ display: inline-flex;
359
+ align-items: center;
360
+ gap: 6px;
361
+ height: 24px;
362
+ padding: 0 6px;
363
+ border: 0.33px solid var(--bdt-line-2);
364
+ border-radius: 6px;
365
+ background: var(--bdt-bg-3);
366
+ color: var(--bdt-text);
367
+ font-size: 12px;
368
+ font-weight: 500;
369
+ white-space: nowrap;
370
+ }
371
+
372
+ .bdt-button-critical:hover {
373
+ background: var(--bdt-accent);
374
+ color: white;
375
+ }
376
+
377
+ .bdt-button.is-primary {
378
+ border-color: rgba(255, 65, 90, 0.45);
379
+ background: var(--bdt-accent-soft);
380
+ color: #ffd5db;
381
+ }
382
+
383
+ .bdt-input {
384
+ height: 24px;
385
+ padding: 0 8px;
386
+ border: 1px solid var(--bdt-line-2);
387
+ border-radius: 7px;
388
+ background: var(--bdt-bg);
389
+ color: var(--bdt-text);
390
+ cursor: text;
391
+ }
392
+
393
+ .bdt-input::placeholder {
394
+ color: var(--bdt-dim);
395
+ }
396
+
397
+ .bdt-input.is-number {
398
+ width: 52px;
399
+ font-family: var(--bdt-mono);
400
+ }
401
+
402
+ .bdt-field {
403
+ display: inline-flex;
404
+ align-items: center;
405
+ gap: 6px;
406
+ color: var(--bdt-muted);
407
+ white-space: nowrap;
408
+ }
409
+
410
+ .bdt-check {
411
+ display: inline-flex;
412
+ align-items: center;
413
+ gap: 6px;
414
+ padding: 1px;
415
+ color: var(--bdt-muted);
416
+ white-space: nowrap;
417
+ cursor: pointer;
418
+ }
419
+
420
+ .bdt-check input {
421
+ appearance: auto;
422
+ scale: 1.4;
423
+ accent-color: var(--bdt-focus);
424
+ width: 10px;
425
+ height: 9px;
426
+ }
427
+
428
+ .bdt-badge {
429
+ display: inline-flex;
430
+ align-items: center;
431
+ height: 18px;
432
+ padding: 0 5px;
433
+ border-radius: 999px;
434
+ border: 0.33px solid var(--bdt-line-2);
435
+ color: var(--bdt-muted);
436
+ font-size: 10px;
437
+ font-weight: 600;
438
+ white-space: nowrap;
439
+ letter-spacing: -0.03em;
440
+ }
441
+
442
+ .bdt-badge.is-accent {
443
+ border-color: rgba(255, 65, 90, 0.35);
444
+ color: #ff8b9b;
445
+ }
446
+
447
+ .bdt-badge.is-ok {
448
+ border-color: rgba(95, 211, 154, 0.35);
449
+ color: var(--bdt-ok);
450
+ }
451
+
452
+ .bdt-badge.is-warn {
453
+ border-color: rgba(245, 184, 61, 0.35);
454
+ color: var(--bdt-warn);
455
+ }
456
+
457
+ .bdt-badge.is-bad {
458
+ border-color: rgba(255, 93, 108, 0.4);
459
+ color: var(--bdt-bad);
460
+ }
461
+
462
+ .bdt-badge.is-info {
463
+ border-color: rgba(124, 183, 255, 0.35);
464
+ color: var(--bdt-info);
465
+ }
466
+
467
+ .bdt-mono {
468
+ font-family: var(--bdt-mono);
469
+ }
470
+
471
+ .bdt-muted {
472
+ color: var(--bdt-muted);
473
+ }
474
+
475
+ .bdt-dim {
476
+ color: var(--bdt-dim);
477
+ }
478
+
479
+ .bdt-link {
480
+ justify-self: start;
481
+ color: var(--bdt-info);
482
+ font-family: var(--bdt-mono);
483
+ text-decoration: underline dotted;
484
+ text-underline-offset: 3px;
485
+ }
486
+
487
+ .bdt-link:hover {
488
+ color: #b3d4ff;
489
+ }
490
+
491
+ .bdt-empty {
492
+ display: grid;
493
+ place-items: center;
494
+ flex: 1;
495
+ padding: 24px;
496
+ color: var(--bdt-muted);
497
+ text-align: center;
498
+ }
499
+
500
+ .bdt-empty-card {
501
+ max-width: 460px;
502
+ display: grid;
503
+ gap: 10px;
504
+ justify-items: center;
505
+ }
506
+
507
+ .bdt-empty-title {
508
+ color: var(--bdt-text);
509
+ font-size: 14px;
510
+ font-weight: 600;
511
+ }
512
+
513
+ .bdt-pre {
514
+ padding: 10px 12px;
515
+ border: 1px solid var(--bdt-line);
516
+ border-radius: 8px;
517
+ background: var(--bdt-bg-2);
518
+ font-family: var(--bdt-mono);
519
+ font-size: 11px;
520
+ line-height: 1.55;
521
+ white-space: pre;
522
+ overflow: auto;
523
+ text-align: left;
524
+ }
525
+
526
+ /* File list (inspector and refactor sidebars) */
527
+
528
+ .bdt-file {
529
+ display: flex;
530
+ align-items: center;
531
+ gap: 8px;
532
+ width: 100%;
533
+ padding: 6px 12px;
534
+ color: var(--bdt-muted);
535
+ text-align: left;
536
+ }
537
+
538
+ .bdt-file:hover {
539
+ background: var(--bdt-bg-3);
540
+ color: var(--bdt-text);
541
+ }
542
+
543
+ .bdt-file.is-active {
544
+ background: var(--bdt-bg-4);
545
+ color: var(--bdt-text);
546
+ box-shadow: inset 2px 0 0 var(--bdt-accent);
547
+ }
548
+
549
+ .bdt-file-name {
550
+ flex: 1;
551
+ min-width: 0;
552
+ overflow: hidden;
553
+ text-overflow: ellipsis;
554
+ white-space: nowrap;
555
+ font-family: var(--bdt-mono);
556
+ font-size: 11px;
557
+ direction: rtl;
558
+ text-align: left;
559
+ }
560
+
561
+ /* ------------------------------------------------------------------------ */
562
+ /* Components panel */
563
+
564
+ .bdt-tree {
565
+ padding: 4px 0 12px;
566
+ font-family: var(--bdt-mono);
567
+ font-size: 11.5px;
568
+ }
569
+
570
+ .bdt-tree-row {
571
+ display: flex;
572
+ align-items: center;
573
+ gap: 2px;
574
+ width: 100%;
575
+ height: 24px;
576
+ padding-right: 10px;
577
+ text-align: left;
578
+ white-space: nowrap;
579
+ }
580
+
581
+ .bdt-tree-row:hover {
582
+ background: var(--bdt-bg-3);
583
+ }
584
+
585
+ .bdt-tree-row.is-selected {
586
+ background: var(--bdt-bg-4);
587
+ box-shadow: inset 2px 0 0 var(--bdt-warn);
588
+ }
589
+
590
+ .bdt-caret {
591
+ display: inline-grid;
592
+ place-items: center;
593
+ width: 16px;
594
+ height: 16px;
595
+ color: var(--bdt-dim);
596
+ flex: none;
597
+ transition: transform 100ms ease;
598
+ }
599
+
600
+ .bdt-caret.is-open {
601
+ transform: rotate(90deg);
602
+ }
603
+
604
+ .bdt-tree-name {
605
+ color: #ffb86b;
606
+ }
607
+
608
+ .bdt-tree-name.is-flow {
609
+ color: var(--bdt-dim);
610
+ font-style: italic;
611
+ }
612
+
613
+ .bdt-tree-id {
614
+ margin-left: 8px;
615
+ color: var(--bdt-dim);
616
+ font-size: 10px;
617
+ }
618
+
619
+ .bdt-detail {
620
+ width: 44%;
621
+ min-width: 280px;
622
+ flex: none;
623
+ border-left: 1px solid var(--bdt-line);
624
+ display: flex;
625
+ flex-direction: column;
626
+ min-height: 0;
627
+ }
628
+
629
+ .bdt-detail-head {
630
+ display: grid;
631
+ gap: 6px;
632
+ padding: 12px 14px;
633
+ border-bottom: 1px solid var(--bdt-line);
634
+ }
635
+
636
+ .bdt-detail-name {
637
+ display: flex;
638
+ align-items: center;
639
+ gap: 8px;
640
+ font-family: var(--bdt-mono);
641
+ font-size: 14px;
642
+ font-weight: 600;
643
+ color: #ffb86b;
644
+ }
645
+
646
+ .bdt-detail-actions {
647
+ display: flex;
648
+ flex-wrap: wrap;
649
+ gap: 6px;
650
+ }
651
+
652
+ .bdt-props {
653
+ display: grid;
654
+ padding: 0 6px 12px;
655
+ }
656
+
657
+ .bdt-prop {
658
+ display: grid;
659
+ grid-template-columns: minmax(84px, max-content) 1fr;
660
+ align-items: start;
661
+ column-gap: 10px;
662
+ padding: 5px 8px;
663
+ border-radius: 6px;
664
+ font-family: var(--bdt-mono);
665
+ font-size: 11.5px;
666
+ }
667
+
668
+ .bdt-prop:hover {
669
+ background: var(--bdt-bg-2);
670
+ }
671
+
672
+ .bdt-prop-key {
673
+ display: inline-flex;
674
+ align-items: center;
675
+ gap: 6px;
676
+ color: #c9a7ff;
677
+ white-space: nowrap;
678
+ }
679
+
680
+ .bdt-prop-kind {
681
+ color: var(--bdt-dim);
682
+ font-size: 10px;
683
+ }
684
+
685
+ .bdt-prop-value {
686
+ min-width: 0;
687
+ overflow-wrap: anywhere;
688
+ text-align: left;
689
+ }
690
+
691
+ .bdt-prop-value.is-toggle {
692
+ cursor: pointer;
693
+ }
694
+
695
+ .bdt-prop-value.is-toggle:hover {
696
+ text-decoration: underline dotted;
697
+ text-underline-offset: 3px;
698
+ }
699
+
700
+ .bdt-prop .bdt-pre {
701
+ grid-column: 1 / -1;
702
+ margin-top: 6px;
703
+ }
704
+
705
+ .bdt-v-string {
706
+ color: #b5e08d;
707
+ }
708
+ .bdt-v-number {
709
+ color: var(--bdt-warn);
710
+ }
711
+ .bdt-v-boolean {
712
+ color: var(--bdt-info);
713
+ }
714
+ .bdt-v-nil {
715
+ color: var(--bdt-dim);
716
+ }
717
+ .bdt-v-special {
718
+ color: var(--bdt-dim);
719
+ font-style: italic;
720
+ }
721
+ .bdt-v-object {
722
+ color: var(--bdt-text);
723
+ }
724
+
725
+ /* ------------------------------------------------------------------------ */
726
+ /* Code view */
727
+
728
+ .bdt-code {
729
+ position: relative;
730
+ flex: 1;
731
+ min-height: 0;
732
+ overflow: auto;
733
+ background: var(--bdt-bg);
734
+ font-family: var(--bdt-mono);
735
+ font-size: 11.5px;
736
+ line-height: 19px;
737
+ }
738
+
739
+ .bdt-code-inner {
740
+ min-width: max-content;
741
+ padding: 6px 0 24px;
742
+ }
743
+
744
+ .bdt-line {
745
+ display: flex;
746
+ min-height: 19px;
747
+ white-space: pre;
748
+ }
749
+
750
+ .bdt-line:hover {
751
+ background: rgba(255, 255, 255, 0.035);
752
+ }
753
+
754
+ .bdt-line.is-range {
755
+ background: rgba(124, 183, 255, 0.07);
756
+ }
757
+
758
+ .bdt-line.is-linked {
759
+ background: rgba(255, 65, 90, 0.13);
760
+ }
761
+
762
+ .bdt-line.is-active {
763
+ background: rgba(255, 65, 90, 0.22);
764
+ }
765
+
766
+ .bdt-line.is-error {
767
+ background: rgba(255, 93, 108, 0.16);
768
+ }
769
+
770
+ .bdt-ln {
771
+ position: sticky;
772
+ left: 0;
773
+ width: 46px;
774
+ padding-right: 10px;
775
+ flex: none;
776
+ color: var(--bdt-dim);
777
+ text-align: center;
778
+ letter-spacing: 0.5px;
779
+ user-select: none;
780
+ background: var(--bdt-bg);
781
+ cursor: pointer;
782
+ opacity: 0.5;
783
+ }
784
+
785
+ .bdt-line.is-linked .bdt-ln,
786
+ .bdt-line.is-active .bdt-ln {
787
+ color: var(--bdt-accent);
788
+ background: #251417;
789
+ }
790
+
791
+ .bdt-depth {
792
+ position: sticky;
793
+ left: 46px;
794
+ display: flex;
795
+ align-items: center;
796
+ width: 64px;
797
+ padding-right: 8px;
798
+ flex: none;
799
+ background: var(--bdt-bg);
800
+ user-select: none;
801
+ }
802
+
803
+ .bdt-depth-bar {
804
+ height: 11px;
805
+ border-radius: 3px;
806
+ background: var(--bdt-ok);
807
+ opacity: 0.75;
808
+ }
809
+
810
+ .bdt-depth-bar.is-near {
811
+ background: var(--bdt-warn);
812
+ }
813
+
814
+ .bdt-depth-bar.is-over {
815
+ background: var(--bdt-bad);
816
+ opacity: 0.95;
817
+ }
818
+
819
+ .bdt-depth-num {
820
+ width: 14px;
821
+ margin-left: 4px;
822
+ color: var(--bdt-dim);
823
+ font-size: 10px;
824
+ text-align: right;
825
+ }
826
+
827
+ .bdt-src {
828
+ padding: 0 16px 0 4px;
829
+ }
830
+
831
+ .tk-keyword {
832
+ color: #ff7a90;
833
+ }
834
+ .tk-string {
835
+ color: #b5e08d;
836
+ }
837
+ .tk-number {
838
+ color: var(--bdt-warn);
839
+ }
840
+ .tk-comment {
841
+ color: var(--bdt-dim);
842
+ font-style: italic;
843
+ }
844
+ .tk-tag {
845
+ color: var(--bdt-info);
846
+ }
847
+ .tk-component {
848
+ color: #ffb86b;
849
+ }
850
+ .tk-selector {
851
+ color: #8fd3ff;
852
+ }
853
+ .tk-attr {
854
+ color: #c9a7ff;
855
+ }
856
+ .tk-directive {
857
+ color: var(--bdt-accent);
858
+ font-weight: 600;
859
+ }
860
+ .tk-interp {
861
+ color: var(--bdt-warn);
862
+ }
863
+ .tk-punct {
864
+ color: #8b8c86;
865
+ }
866
+ .tk-type {
867
+ color: #7fe0d0;
868
+ }
869
+
870
+ /* ------------------------------------------------------------------------ */
871
+ /* Inspector panel */
872
+
873
+ .bdt-split {
874
+ flex: 1;
875
+ min-height: 0;
876
+ display: grid;
877
+ grid-template-columns: 1fr 1fr;
878
+ }
879
+
880
+ .bdt-split > .bdt-pane + .bdt-pane {
881
+ border-left: 1px solid var(--bdt-line);
882
+ }
883
+
884
+ .bdt-pane-head {
885
+ display: flex;
886
+ align-items: center;
887
+ gap: 8px;
888
+ height: 30px;
889
+ padding: 0 10px;
890
+ border-bottom: 1px solid var(--bdt-line);
891
+ background: var(--bdt-bg-4);
892
+ color: var(--bdt-muted);
893
+ font-size: 11px;
894
+ font-weight: 600;
895
+ flex: none;
896
+ }
897
+
898
+ .bdt-diagnostic {
899
+ display: grid;
900
+ gap: 8px;
901
+ padding: 12px;
902
+ border-bottom: 1px solid var(--bdt-line);
903
+ background: rgba(255, 93, 108, 0.06);
904
+ }
905
+
906
+ .bdt-diagnostic.is-warning {
907
+ background: rgba(245, 184, 61, 0.06);
908
+ }
909
+
910
+ /* ------------------------------------------------------------------------ */
911
+ /* Refactor panel */
912
+
913
+ .bdt-metrics {
914
+ display: flex;
915
+ flex-wrap: wrap;
916
+ align-items: stretch;
917
+ gap: 8px;
918
+ padding: 10px 12px;
919
+ border-bottom: 1px solid var(--bdt-line);
920
+ }
921
+
922
+ .bdt-metric {
923
+ display: grid;
924
+ gap: 2px;
925
+ min-width: 78px;
926
+ padding: 6px 10px;
927
+ border: 0.33px solid var(--bdt-line);
928
+ border-radius: 6px;
929
+ background: var(--bdt-bg-2);
930
+ }
931
+
932
+ .bdt-metric-value {
933
+ font-family: var(--bdt-mono);
934
+ font-size: 15px;
935
+ font-weight: 600;
936
+ }
937
+
938
+ .bdt-metric-value.is-over {
939
+ color: var(--bdt-bad);
940
+ }
941
+
942
+ .bdt-metric-label {
943
+ color: var(--bdt-dim);
944
+ font-size: 10px;
945
+ font-weight: 500;
946
+ text-transform: uppercase;
947
+ letter-spacing: -0.03em;
948
+ }
949
+ .metric-alert {
950
+ background: var(--bdt-bg-4);
951
+ }
952
+
953
+ .bdt-histogram {
954
+ display: flex;
955
+ align-items: flex-end;
956
+ gap: 3px;
957
+ height: 54px;
958
+ padding: 6px 10px 0;
959
+ border: 0.33px solid var(--bdt-line);
960
+ border-radius: 6px;
961
+ background: var(--bdt-bg-2);
962
+ }
963
+
964
+ .bdt-histogram:hover {
965
+ background: var(--bdt-bg-4);
966
+ cursor: pointer;
967
+ }
968
+
969
+ .bdt-histogram-col {
970
+ display: grid;
971
+ justify-items: center;
972
+ align-content: end;
973
+ gap: 2px;
974
+ height: 100%;
975
+ }
976
+
977
+ .bdt-histogram-bar {
978
+ width: 14px;
979
+ min-height: 2px;
980
+ border-radius: 3px 3px 0 0;
981
+ background: var(--bdt-ok);
982
+ opacity: 0.8;
983
+ }
984
+
985
+ .bdt-histogram-bar.is-near {
986
+ background: var(--bdt-warn);
987
+ }
988
+
989
+ .bdt-histogram-bar.is-over {
990
+ background: var(--bdt-bad);
991
+ }
992
+
993
+ .bdt-histogram-label {
994
+ color: var(--bdt-dim);
995
+ font-family: var(--bdt-mono);
996
+ font-size: 9px;
997
+ line-height: 12px;
998
+ }
999
+
1000
+ .bdt-refactor {
1001
+ flex: 1;
1002
+ min-height: 0;
1003
+ display: grid;
1004
+ grid-template-columns: minmax(300px, 42%) 1fr;
1005
+ }
1006
+
1007
+ .bdt-suggestions {
1008
+ min-height: 0;
1009
+ overflow: auto;
1010
+ padding: 4px;
1011
+ display: grid;
1012
+ align-content: start;
1013
+ gap: 8px;
1014
+ border-right: 1px solid var(--bdt-line);
1015
+ }
1016
+
1017
+ .bdt-card {
1018
+ display: grid;
1019
+ gap: 16px;
1020
+ padding: 16px 10px;
1021
+ border: 0px solid var(--bdt-line);
1022
+ border-radius: 6px;
1023
+ background: var(--bdt-bg-2);
1024
+ cursor: pointer;
1025
+ transition: background-color 200ms ease-out;
1026
+ }
1027
+
1028
+ .bdt-card:hover {
1029
+ background: var(--bdt-bg-3);
1030
+ }
1031
+
1032
+ .bdt-card.is-selected {
1033
+ background: var(--bdt-bg-4);
1034
+ }
1035
+
1036
+ .bdt-card-head {
1037
+ display: flex;
1038
+ align-items: center;
1039
+ gap: 8px;
1040
+ }
1041
+
1042
+ .bdt-card-title {
1043
+ flex: 1;
1044
+ min-width: 0;
1045
+ font-family: var(--bdt-mono);
1046
+ font-weight: 600;
1047
+ font-size: 12.5px;
1048
+ color: #ffb86b;
1049
+ overflow: hidden;
1050
+ text-overflow: ellipsis;
1051
+ white-space: nowrap;
1052
+ }
1053
+
1054
+ .bdt-severity {
1055
+ width: 8px;
1056
+ height: 8px;
1057
+ border-radius: 999px;
1058
+ flex: none;
1059
+ background: var(--bdt-info);
1060
+ }
1061
+
1062
+ .bdt-severity.is-warning {
1063
+ background: var(--bdt-warn);
1064
+ }
1065
+
1066
+ .bdt-severity.is-critical {
1067
+ background: var(--bdt-bad);
1068
+ }
1069
+
1070
+ .bdt-card-reason {
1071
+ color: var(--bdt-muted);
1072
+ line-height: 1.5;
1073
+ }
1074
+
1075
+ .bdt-card-meta {
1076
+ display: flex;
1077
+ flex-wrap: wrap;
1078
+ gap: 6px;
1079
+ }
1080
+
1081
+ .bdt-chip {
1082
+ display: inline-flex;
1083
+ align-items: center;
1084
+ max-width: 100%;
1085
+ height: 20px;
1086
+ padding: 0 7px;
1087
+ border-radius: 6px;
1088
+ background: var(--bdt-bg-4);
1089
+ font-family: var(--bdt-mono);
1090
+ font-size: 10.5px;
1091
+ overflow: hidden;
1092
+ text-overflow: ellipsis;
1093
+ white-space: nowrap;
1094
+ }
1095
+
1096
+ .bdt-chip-type {
1097
+ color: #7fe0d0;
1098
+ }
1099
+
1100
+ .bdt-card-actions {
1101
+ display: flex;
1102
+ flex-wrap: wrap;
1103
+ gap: 6px;
1104
+ }
1105
+
1106
+ .bdt-card .bdt-pre {
1107
+ max-height: 260px;
1108
+ }
1109
+
1110
+ /* ------------------------------------------------------------------------ */
1111
+ /* Narrow viewports */
1112
+
1113
+ @media (max-width: 760px) {
1114
+ .bdt-body {
1115
+ flex-direction: column;
1116
+ }
1117
+
1118
+ .bdt-sidebar {
1119
+ width: auto;
1120
+ max-height: 96px;
1121
+ border-right: 0;
1122
+ border-bottom: 1px solid var(--bdt-line);
1123
+ }
1124
+
1125
+ .bdt-detail {
1126
+ width: auto;
1127
+ min-width: 0;
1128
+ max-height: 50%;
1129
+ border-left: 0;
1130
+ border-top: 1px solid var(--bdt-line);
1131
+ }
1132
+
1133
+ .bdt-brand > span,
1134
+ .bdt-hint {
1135
+ display: none;
1136
+ }
1137
+
1138
+ .bdt-split,
1139
+ .bdt-refactor {
1140
+ grid-template-columns: 1fr;
1141
+ grid-template-rows: 1fr 1fr;
1142
+ }
1143
+
1144
+ .bdt-suggestions {
1145
+ border-right: 0;
1146
+ border-bottom: 1px solid var(--bdt-line);
1147
+ }
1148
+
1149
+ .bdt-brand-sub,
1150
+ .bdt-status {
1151
+ display: none;
1152
+ }
1153
+ }
1154
+ .infinite-lines {
1155
+ width: 100%;
1156
+ height: 100vh;
1157
+ background: repeating-linear-gradient(
1158
+ 45deg,
1159
+ /* slant angle: adjust for steeper/shallower lines */ transparent,
1160
+ transparent 10px,
1161
+ #18181810 10px,
1162
+ /* line color */ #2a2a2a 12px /* line thickness: 1px wide */
1163
+ );
1164
+ }
1165
+
1166
+ /* ------------------------------------------------------------------------ */
1167
+ /* Auto-refactor */
1168
+
1169
+ .bdt-button:disabled {
1170
+ opacity: 0.45;
1171
+ cursor: not-allowed;
1172
+ }
1173
+
1174
+ .bdt-card-note {
1175
+ color: var(--bdt-dim);
1176
+ font-size: 11px;
1177
+ line-height: 1.45;
1178
+ }
1179
+
1180
+ .bdt-toast {
1181
+ display: flex;
1182
+ align-items: center;
1183
+ gap: 8px;
1184
+ min-height: 34px;
1185
+ padding: 4px 8px 4px 12px;
1186
+ border-bottom: 1px solid var(--bdt-line);
1187
+ background: rgba(95, 211, 154, 0.08);
1188
+ color: #bff0d6;
1189
+ flex: none;
1190
+ }
1191
+
1192
+ .bdt-toast.is-error {
1193
+ background: rgba(255, 93, 108, 0.08);
1194
+ color: #ffc2c8;
1195
+ }
1196
+
1197
+ .bdt-plan {
1198
+ display: grid;
1199
+ gap: 8px;
1200
+ padding: 10px;
1201
+ border: 1px solid rgba(255, 65, 90, 0.35);
1202
+ border-radius: 9px;
1203
+ background: var(--bdt-bg);
1204
+ cursor: default;
1205
+ }
1206
+
1207
+ .bdt-plan-title {
1208
+ font-weight: 600;
1209
+ }
1210
+
1211
+ .bdt-plan-error {
1212
+ color: var(--bdt-bad);
1213
+ font-family: var(--bdt-mono);
1214
+ font-size: 11px;
1215
+ white-space: pre-wrap;
1216
+ }
1217
+
1218
+ .bdt-plan-file {
1219
+ display: grid;
1220
+ gap: 4px;
1221
+ min-width: 0;
1222
+ }
1223
+
1224
+ .bdt-plan-file-head {
1225
+ display: flex;
1226
+ align-items: center;
1227
+ gap: 8px;
1228
+ font-family: var(--bdt-mono);
1229
+ font-size: 11px;
1230
+ }
1231
+
1232
+ .bdt-added {
1233
+ color: var(--bdt-ok);
1234
+ }
1235
+
1236
+ .bdt-removed {
1237
+ color: var(--bdt-bad);
1238
+ }
1239
+
1240
+ .bdt-diff {
1241
+ max-height: 240px;
1242
+ overflow: auto;
1243
+ border: 1px solid var(--bdt-line);
1244
+ border-radius: 7px;
1245
+ background: var(--bdt-bg-2);
1246
+ font-family: var(--bdt-mono);
1247
+ font-size: 10.5px;
1248
+ line-height: 16px;
1249
+ }
1250
+
1251
+ .bdt-diff-inner {
1252
+ min-width: max-content;
1253
+ padding: 2px 0;
1254
+ }
1255
+
1256
+ .bdt-diff-head {
1257
+ padding: 2px 8px;
1258
+ color: var(--bdt-info);
1259
+ background: rgba(124, 183, 255, 0.06);
1260
+ }
1261
+
1262
+ .bdt-diff-line {
1263
+ padding: 0 8px;
1264
+ white-space: pre;
1265
+ }
1266
+
1267
+ .bdt-diff-line.is-context {
1268
+ color: var(--bdt-muted);
1269
+ }
1270
+
1271
+ .bdt-diff-line.is-add {
1272
+ background: rgba(95, 211, 154, 0.12);
1273
+ color: #bff0d6;
1274
+ }
1275
+
1276
+ .bdt-diff-line.is-remove {
1277
+ background: rgba(255, 93, 108, 0.12);
1278
+ color: #ffc2c8;
1279
+ }