@symbo.ls/connect 3.2.7

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 (77) hide show
  1. package/build.js +205 -0
  2. package/dist/assets/1024x1024.png +0 -0
  3. package/dist/assets/128x128.png +0 -0
  4. package/dist/assets/144x144.png +0 -0
  5. package/dist/assets/192x192.png +0 -0
  6. package/dist/assets/48x48.png +0 -0
  7. package/dist/assets/512x512.png +0 -0
  8. package/dist/assets/72x72.png +0 -0
  9. package/dist/assets/96x96.png +0 -0
  10. package/dist/assets/active_cursor.png +0 -0
  11. package/dist/assets/favicon.svg +6 -0
  12. package/dist/assets/old/144x144.png +0 -0
  13. package/dist/assets/old/192x192.png +0 -0
  14. package/dist/assets/old/48x48.png +0 -0
  15. package/dist/assets/old/48x48_faint.png +0 -0
  16. package/dist/assets/old/512x512.png +0 -0
  17. package/dist/assets/old/72x72.png +0 -0
  18. package/dist/assets/old/96x96.png +0 -0
  19. package/dist/auth.js +373 -0
  20. package/dist/content.css +46 -0
  21. package/dist/content.js +1171 -0
  22. package/dist/content.js.map +7 -0
  23. package/dist/devtools.html +7 -0
  24. package/dist/devtools.js +5 -0
  25. package/dist/manifest.json +87 -0
  26. package/dist/page-agent.js +727 -0
  27. package/dist/panel.css +2239 -0
  28. package/dist/panel.html +235 -0
  29. package/dist/panel.js +4973 -0
  30. package/dist/picker.html +111 -0
  31. package/dist/picker.js +300 -0
  32. package/dist/service_worker.js +219 -0
  33. package/dist/service_worker.js.map +7 -0
  34. package/dist/settings.css +128 -0
  35. package/dist/settings.html +26 -0
  36. package/dist/settings_ui.js +57 -0
  37. package/dist/settings_ui.js.map +7 -0
  38. package/package.json +20 -0
  39. package/src/content.js +104 -0
  40. package/src/grabber/clean.js +605 -0
  41. package/src/grabber/computed.js +78 -0
  42. package/src/grabber/parse.js +268 -0
  43. package/src/grabber/stylesheets.js +117 -0
  44. package/src/grabber/utils.js +238 -0
  45. package/src/service_worker.js +246 -0
  46. package/src/settings/settings_ui.js +52 -0
  47. package/src/settings/settings_utils.js +70 -0
  48. package/static/assets/1024x1024.png +0 -0
  49. package/static/assets/128x128.png +0 -0
  50. package/static/assets/144x144.png +0 -0
  51. package/static/assets/192x192.png +0 -0
  52. package/static/assets/48x48.png +0 -0
  53. package/static/assets/512x512.png +0 -0
  54. package/static/assets/72x72.png +0 -0
  55. package/static/assets/96x96.png +0 -0
  56. package/static/assets/active_cursor.png +0 -0
  57. package/static/assets/favicon.svg +6 -0
  58. package/static/assets/old/144x144.png +0 -0
  59. package/static/assets/old/192x192.png +0 -0
  60. package/static/assets/old/48x48.png +0 -0
  61. package/static/assets/old/48x48_faint.png +0 -0
  62. package/static/assets/old/512x512.png +0 -0
  63. package/static/assets/old/72x72.png +0 -0
  64. package/static/assets/old/96x96.png +0 -0
  65. package/static/auth.js +373 -0
  66. package/static/content.css +46 -0
  67. package/static/devtools.html +7 -0
  68. package/static/devtools.js +5 -0
  69. package/static/manifest.json +56 -0
  70. package/static/page-agent.js +727 -0
  71. package/static/panel.css +2239 -0
  72. package/static/panel.html +235 -0
  73. package/static/panel.js +4973 -0
  74. package/static/picker.html +111 -0
  75. package/static/picker.js +300 -0
  76. package/static/settings.css +128 -0
  77. package/static/settings.html +26 -0
package/dist/panel.css ADDED
@@ -0,0 +1,2239 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ :root {
8
+ --bg: #141416;
9
+ --bg-alt: #242428;
10
+ --bg-hover: #34343a;
11
+ --bg-active: #45454b;
12
+ --border: #34343a;
13
+ --text: #bcbcc2;
14
+ --text-dim: #65656f;
15
+ --text-bright: #e0e0e2;
16
+ --accent: #0085FF;
17
+ --key-color: #50E1FF;
18
+ --string-color: #E8CC56;
19
+ --number-color: #BCD835;
20
+ --boolean-color: #0085FF;
21
+ --null-color: #65656f;
22
+ --function-color: #EE90BD;
23
+ --type-color: #59AC56;
24
+ --error-color: #EB6650;
25
+ --tag-color: #757581;
26
+ }
27
+
28
+ body {
29
+ font-family: 'DmSansVariable', 'Helvetica Neue', 'Helvetica', system-ui, sans-serif;
30
+ font-size: 12px;
31
+ background: var(--bg);
32
+ color: var(--text);
33
+ height: 100vh;
34
+ overflow: hidden;
35
+ display: flex;
36
+ flex-direction: column;
37
+ }
38
+
39
+ /* ============================================================
40
+ Top-level mode tabs (Chat / Editor)
41
+ ============================================================ */
42
+ #mode-tabs {
43
+ display: flex;
44
+ align-items: center;
45
+ background: var(--bg-alt);
46
+ border-bottom: 1px solid var(--border);
47
+ flex-shrink: 0;
48
+ padding: 0 4px;
49
+ }
50
+
51
+ .mode-tab {
52
+ background: transparent;
53
+ border: none;
54
+ border-bottom: 2px solid transparent;
55
+ color: var(--text-dim);
56
+ padding: 7px 16px;
57
+ cursor: pointer;
58
+ font-size: 12px;
59
+ font-weight: 500;
60
+ font-family: inherit;
61
+ }
62
+
63
+ .mode-tab:hover {
64
+ color: var(--text);
65
+ background: var(--bg-hover);
66
+ }
67
+
68
+ .mode-tab.active {
69
+ color: var(--text-bright);
70
+ border-bottom-color: var(--accent);
71
+ }
72
+
73
+ .mode-tab-spacer {
74
+ flex: 1;
75
+ }
76
+
77
+ #app-connection-badge {
78
+ font-size: 10px;
79
+ color: var(--type-color);
80
+ padding: 2px 6px;
81
+ border: 1px solid var(--type-color);
82
+ border-radius: 3px;
83
+ white-space: nowrap;
84
+ overflow: hidden;
85
+ text-overflow: ellipsis;
86
+ max-width: 160px;
87
+ }
88
+
89
+ #btn-app-disconnect {
90
+ background: transparent;
91
+ border: none;
92
+ color: var(--text-dim);
93
+ font-size: 13px;
94
+ cursor: pointer;
95
+ padding: 4px 8px;
96
+ line-height: 1;
97
+ }
98
+
99
+ #btn-app-disconnect:hover {
100
+ color: var(--error-color);
101
+ }
102
+
103
+ /* ============================================================
104
+ Mode panels
105
+ ============================================================ */
106
+ #app {
107
+ display: flex;
108
+ flex-direction: column;
109
+ height: 100vh;
110
+ }
111
+
112
+ .mode-panel {
113
+ display: none;
114
+ flex-direction: column;
115
+ flex: 1;
116
+ overflow: hidden;
117
+ }
118
+
119
+ .mode-panel.active {
120
+ display: flex;
121
+ }
122
+
123
+ /* ============================================================
124
+ Editor toolbar
125
+ ============================================================ */
126
+ #toolbar {
127
+ display: flex;
128
+ align-items: center;
129
+ gap: 6px;
130
+ padding: 4px 8px;
131
+ background: var(--bg-alt);
132
+ border-bottom: 1px solid var(--border);
133
+ flex-shrink: 0;
134
+ }
135
+
136
+ #toolbar button {
137
+ background: transparent;
138
+ border: 1px solid var(--border);
139
+ color: var(--text);
140
+ padding: 3px 10px;
141
+ border-radius: 3px;
142
+ cursor: pointer;
143
+ font-size: 11px;
144
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
145
+ }
146
+
147
+ #toolbar button:hover {
148
+ background: var(--bg-hover);
149
+ }
150
+
151
+ #toolbar button.active,
152
+ #btn-pick.active {
153
+ background: var(--accent);
154
+ color: #fff;
155
+ border-color: var(--accent);
156
+ }
157
+
158
+ #btn-sync {
159
+ background: var(--type-color) !important;
160
+ color: #fff !important;
161
+ border-color: var(--type-color) !important;
162
+ font-weight: 600;
163
+ }
164
+
165
+ #btn-sync:hover {
166
+ opacity: 0.85;
167
+ }
168
+
169
+ #status {
170
+ color: var(--text-dim);
171
+ font-size: 11px;
172
+ margin-left: auto;
173
+ }
174
+
175
+ #btn-undo,
176
+ #btn-redo {
177
+ font-size: 13px;
178
+ line-height: 1;
179
+ padding: 2px 6px !important;
180
+ }
181
+
182
+ #btn-undo:disabled,
183
+ #btn-redo:disabled {
184
+ opacity: 0.25;
185
+ cursor: default;
186
+ pointer-events: none;
187
+ }
188
+
189
+ #btn-reload {
190
+ margin-left: 4px;
191
+ font-size: 14px;
192
+ line-height: 1;
193
+ padding: 2px 6px !important;
194
+ opacity: 0.6;
195
+ }
196
+
197
+ #btn-reload:hover {
198
+ opacity: 1;
199
+ }
200
+
201
+ /* ============================================================
202
+ Main layout
203
+ ============================================================ */
204
+ #main {
205
+ display: flex;
206
+ flex: 1;
207
+ overflow: hidden;
208
+ }
209
+
210
+ #tree-pane {
211
+ width: 300px;
212
+ min-width: 150px;
213
+ overflow: hidden;
214
+ border-right: 1px solid var(--border);
215
+ display: flex;
216
+ flex-direction: column;
217
+ }
218
+
219
+ #tree-pane-tabs {
220
+ display: flex;
221
+ border-bottom: 1px solid var(--border);
222
+ flex-shrink: 0;
223
+ }
224
+
225
+ .tree-pane-tab {
226
+ flex: 1;
227
+ padding: 5px 8px;
228
+ font-size: 11px;
229
+ color: var(--text-dim);
230
+ background: transparent;
231
+ border: none;
232
+ border-bottom: 2px solid transparent;
233
+ cursor: pointer;
234
+ font-family: inherit;
235
+ }
236
+
237
+ .tree-pane-tab:hover { color: var(--text); }
238
+
239
+ .tree-pane-tab.active {
240
+ color: var(--text-bright);
241
+ border-bottom-color: var(--accent);
242
+ }
243
+
244
+ .tree-pane-panel {
245
+ display: none;
246
+ flex: 1;
247
+ overflow: auto;
248
+ padding: 4px 0;
249
+ }
250
+
251
+ .tree-pane-panel.active {
252
+ display: block;
253
+ }
254
+
255
+ /* State tree */
256
+ .state-tree-key {
257
+ color: var(--key-color);
258
+ font-weight: 500;
259
+ }
260
+
261
+ .state-tree-badge {
262
+ display: inline-block;
263
+ margin-left: 4px;
264
+ padding: 0 4px;
265
+ font-size: 9px;
266
+ background: var(--accent);
267
+ color: #fff;
268
+ border-radius: 8px;
269
+ line-height: 14px;
270
+ vertical-align: middle;
271
+ }
272
+
273
+ .state-tree-value {
274
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
275
+ font-size: 11px;
276
+ line-height: 18px;
277
+ opacity: 0.85;
278
+ }
279
+
280
+ .state-tree-value:hover {
281
+ background: var(--bg-hover);
282
+ opacity: 1;
283
+ }
284
+
285
+ /* Design System tab */
286
+ .ds-category {
287
+ border-bottom: 1px solid var(--border);
288
+ }
289
+ .ds-category-header {
290
+ display: flex;
291
+ align-items: center;
292
+ gap: 4px;
293
+ padding: 6px 8px;
294
+ font-size: 12px;
295
+ font-weight: 500;
296
+ color: var(--key-color);
297
+ }
298
+ .ds-category-header:hover {
299
+ background: var(--bg-hover);
300
+ }
301
+ .ds-category-name {
302
+ display: flex;
303
+ align-items: center;
304
+ gap: 4px;
305
+ }
306
+ .ds-category-count {
307
+ display: inline-block;
308
+ padding: 0 4px;
309
+ font-size: 9px;
310
+ background: var(--accent);
311
+ color: #fff;
312
+ border-radius: 8px;
313
+ line-height: 14px;
314
+ font-weight: 400;
315
+ }
316
+ .ds-category-body {
317
+ padding-bottom: 4px;
318
+ }
319
+ .ds-value-row {
320
+ display: flex;
321
+ align-items: center;
322
+ gap: 4px;
323
+ padding: 2px 8px;
324
+ font-size: 11px;
325
+ line-height: 20px;
326
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
327
+ }
328
+ .ds-value-row:hover {
329
+ background: var(--bg-hover);
330
+ }
331
+ .ds-color-swatch {
332
+ display: inline-block;
333
+ width: 12px;
334
+ height: 12px;
335
+ border-radius: 2px;
336
+ border: 1px solid rgba(128,128,128,0.3);
337
+ flex-shrink: 0;
338
+ }
339
+
340
+ /* Header connect button */
341
+ .btn-header-connect {
342
+ background: var(--accent);
343
+ color: #fff;
344
+ border: none;
345
+ border-radius: 4px;
346
+ padding: 2px 10px;
347
+ font-size: 11px;
348
+ cursor: pointer;
349
+ margin-right: 4px;
350
+ }
351
+ .btn-header-connect:hover {
352
+ opacity: 0.85;
353
+ }
354
+
355
+ /* Connect dialog */
356
+ .connect-dialog {
357
+ position: absolute;
358
+ top: 32px;
359
+ right: 8px;
360
+ z-index: 100;
361
+ display: flex;
362
+ }
363
+ .connect-dialog-inner {
364
+ background: var(--bg-panel);
365
+ border: 1px solid var(--border);
366
+ border-radius: 6px;
367
+ padding: 12px;
368
+ box-shadow: 0 4px 16px rgba(0,0,0,0.3);
369
+ min-width: 180px;
370
+ }
371
+ .connect-dialog-title {
372
+ font-size: 12px;
373
+ font-weight: 500;
374
+ margin-bottom: 8px;
375
+ color: var(--text);
376
+ }
377
+ .connect-dialog-btn {
378
+ display: block;
379
+ width: 100%;
380
+ padding: 6px 10px;
381
+ margin-bottom: 4px;
382
+ border: 1px solid var(--border);
383
+ border-radius: 4px;
384
+ background: var(--bg);
385
+ color: var(--text);
386
+ cursor: pointer;
387
+ font-size: 12px;
388
+ text-align: left;
389
+ }
390
+ .connect-dialog-btn:hover {
391
+ background: var(--bg-hover);
392
+ }
393
+ .connect-dialog-close {
394
+ position: absolute;
395
+ top: 4px;
396
+ right: 4px;
397
+ background: none;
398
+ border: none;
399
+ color: var(--text-dim);
400
+ cursor: pointer;
401
+ font-size: 14px;
402
+ }
403
+
404
+ #resizer {
405
+ width: 4px;
406
+ cursor: col-resize;
407
+ background: transparent;
408
+ flex-shrink: 0;
409
+ }
410
+
411
+ #resizer:hover,
412
+ #resizer.active {
413
+ background: var(--accent);
414
+ }
415
+
416
+ #detail-pane {
417
+ flex: 1;
418
+ display: flex;
419
+ flex-direction: column;
420
+ overflow: hidden;
421
+ }
422
+
423
+ /* ============================================================
424
+ Detail header and tabs
425
+ ============================================================ */
426
+ #detail-header {
427
+ padding: 8px 12px;
428
+ background: var(--bg-alt);
429
+ border-bottom: 1px solid var(--border);
430
+ display: flex;
431
+ align-items: center;
432
+ gap: 8px;
433
+ flex-shrink: 0;
434
+ }
435
+
436
+ #detail-key {
437
+ color: var(--key-color);
438
+ font-weight: bold;
439
+ font-size: 13px;
440
+ }
441
+
442
+ #detail-tag {
443
+ color: var(--tag-color);
444
+ font-size: 11px;
445
+ }
446
+
447
+ #detail-path {
448
+ color: var(--text-dim);
449
+ font-size: 10px;
450
+ margin-left: auto;
451
+ }
452
+
453
+ #detail-tabs {
454
+ display: flex;
455
+ gap: 0;
456
+ background: var(--bg-alt);
457
+ border-bottom: 1px solid var(--border);
458
+ flex-shrink: 0;
459
+ }
460
+
461
+ .tab {
462
+ background: transparent;
463
+ border: none;
464
+ border-bottom: 2px solid transparent;
465
+ color: var(--text-dim);
466
+ padding: 6px 14px;
467
+ cursor: pointer;
468
+ font-size: 11px;
469
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
470
+ }
471
+
472
+ .tab:hover {
473
+ color: var(--text);
474
+ background: var(--bg-hover);
475
+ }
476
+
477
+ .tab.active {
478
+ color: var(--text-bright);
479
+ border-bottom-color: var(--accent);
480
+ }
481
+
482
+ /* Props sub-tabs (Computed / Original) */
483
+ #props-subtabs {
484
+ display: flex;
485
+ gap: 0;
486
+ margin-bottom: 6px;
487
+ border-bottom: 1px solid var(--border);
488
+ }
489
+
490
+ .props-subtab {
491
+ padding: 3px 10px;
492
+ font-size: 10px;
493
+ color: var(--text-dim);
494
+ background: transparent;
495
+ border: none;
496
+ border-bottom: 2px solid transparent;
497
+ cursor: pointer;
498
+ font-family: inherit;
499
+ text-transform: uppercase;
500
+ letter-spacing: 0.5px;
501
+ }
502
+
503
+ .props-subtab:hover { color: var(--text); }
504
+ .props-subtab.active {
505
+ color: var(--text-bright);
506
+ border-bottom-color: var(--accent);
507
+ }
508
+
509
+ .props-subpanel { display: none; }
510
+ .props-subpanel.active { display: block; }
511
+
512
+ /* Function prop indicator */
513
+ .prop-fn-badge {
514
+ display: inline-block;
515
+ font-size: 9px;
516
+ color: #C586C0;
517
+ margin-left: 4px;
518
+ font-style: italic;
519
+ opacity: 0.8;
520
+ }
521
+
522
+ .prop-row.is-function .prop-value {
523
+ opacity: 0.6;
524
+ cursor: default;
525
+ }
526
+
527
+ .prop-fn-tooltip {
528
+ font-size: 10px;
529
+ color: var(--text-dim);
530
+ padding: 4px 8px;
531
+ background: var(--bg-alt);
532
+ border: 1px solid var(--border);
533
+ border-radius: 4px;
534
+ margin-top: 2px;
535
+ font-style: italic;
536
+ }
537
+
538
+ .tab-spacer {
539
+ flex: 1;
540
+ }
541
+
542
+ #detail-content {
543
+ flex: 1;
544
+ overflow: auto;
545
+ padding: 8px 0;
546
+ position: relative;
547
+ }
548
+
549
+ .tab-panel {
550
+ display: none;
551
+ padding: 0 12px;
552
+ }
553
+
554
+ .tab-panel.active {
555
+ display: block;
556
+ }
557
+
558
+ #tab-source.active {
559
+ display: flex;
560
+ flex-direction: column;
561
+ height: 100%;
562
+ padding: 0;
563
+ overflow: hidden;
564
+ }
565
+
566
+ /* ============================================================
567
+ Tree view
568
+ ============================================================ */
569
+ .tree-item {
570
+ display: flex;
571
+ align-items: center;
572
+ padding: 2px 0 2px 0;
573
+ cursor: pointer;
574
+ white-space: nowrap;
575
+ user-select: none;
576
+ }
577
+
578
+ .tree-item:hover {
579
+ background: var(--bg-hover);
580
+ }
581
+
582
+ .tree-item.selected {
583
+ background: var(--bg-active);
584
+ }
585
+
586
+ .tree-arrow {
587
+ width: 16px;
588
+ text-align: center;
589
+ color: var(--text-dim);
590
+ font-size: 10px;
591
+ flex-shrink: 0;
592
+ }
593
+
594
+ .tree-arrow.has-children {
595
+ cursor: pointer;
596
+ }
597
+
598
+ .tree-label {
599
+ color: var(--key-color);
600
+ }
601
+
602
+ .tree-tag {
603
+ color: var(--tag-color);
604
+ margin-left: 6px;
605
+ font-size: 11px;
606
+ }
607
+
608
+ .tree-children {
609
+ display: none;
610
+ }
611
+
612
+ .tree-children.expanded {
613
+ display: block;
614
+ }
615
+
616
+ /* ============================================================
617
+ Property rows — Chrome DevTools CSS panel style
618
+ ============================================================ */
619
+ .prop-row {
620
+ display: flex;
621
+ align-items: baseline;
622
+ padding: 1px 0 1px 16px;
623
+ min-height: 20px;
624
+ line-height: 18px;
625
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
626
+ font-size: 12px;
627
+ }
628
+
629
+ .prop-row:hover {
630
+ background: var(--bg-hover);
631
+ }
632
+
633
+ .prop-key {
634
+ color: var(--key-color);
635
+ flex-shrink: 0;
636
+ white-space: nowrap;
637
+ }
638
+
639
+ .prop-colon {
640
+ color: var(--text-dim);
641
+ margin-right: 6px;
642
+ }
643
+
644
+ .prop-value {
645
+ flex: 1;
646
+ word-break: break-all;
647
+ position: relative;
648
+ }
649
+
650
+ .prop-semi {
651
+ color: var(--text-dim);
652
+ margin-left: 1px;
653
+ opacity: 0.4;
654
+ }
655
+
656
+ .prop-value.editable {
657
+ cursor: text;
658
+ padding: 0 2px;
659
+ border-radius: 2px;
660
+ min-width: 20px;
661
+ }
662
+
663
+ .prop-value.editable:hover {
664
+ background: rgba(0, 133, 255, 0.08);
665
+ box-shadow: 0 0 0 1px rgba(0, 133, 255, 0.2);
666
+ }
667
+
668
+ .prop-value.editing {
669
+ background: var(--bg);
670
+ box-shadow: 0 0 0 1px var(--accent);
671
+ border-radius: 2px;
672
+ }
673
+
674
+ .prop-edit-input {
675
+ background: transparent;
676
+ border: none;
677
+ color: var(--string-color);
678
+ font-family: inherit;
679
+ font-size: inherit;
680
+ line-height: inherit;
681
+ padding: 0;
682
+ width: 100%;
683
+ outline: none;
684
+ min-width: 30px;
685
+ }
686
+
687
+ /* Object/array editor */
688
+ .obj-editor {
689
+ padding: 4px 0;
690
+ width: 100%;
691
+ }
692
+ .obj-editor-row {
693
+ display: flex;
694
+ align-items: center;
695
+ gap: 4px;
696
+ padding: 1px 0;
697
+ }
698
+ .obj-key-input {
699
+ max-width: 80px;
700
+ color: var(--key-color) !important;
701
+ opacity: 0.8;
702
+ }
703
+ .obj-editor-del {
704
+ background: none;
705
+ border: none;
706
+ color: var(--text-dim);
707
+ cursor: pointer;
708
+ font-size: 12px;
709
+ padding: 0 2px;
710
+ opacity: 0.5;
711
+ }
712
+ .obj-editor-del:hover {
713
+ opacity: 1;
714
+ color: var(--error-color);
715
+ }
716
+ .obj-editor-actions {
717
+ display: flex;
718
+ gap: 4px;
719
+ padding: 4px 0 2px;
720
+ }
721
+ .obj-editor-save,
722
+ .obj-editor-cancel {
723
+ padding: 2px 8px;
724
+ border: 1px solid var(--border);
725
+ border-radius: 3px;
726
+ font-size: 10px;
727
+ cursor: pointer;
728
+ background: var(--bg);
729
+ color: var(--text);
730
+ }
731
+ .obj-editor-save {
732
+ background: var(--accent);
733
+ color: #fff;
734
+ border-color: var(--accent);
735
+ }
736
+ .obj-editor-save:hover { opacity: 0.85; }
737
+ .obj-editor-cancel:hover { background: var(--bg-hover); }
738
+
739
+ /* Value type colors */
740
+ .v-string { color: var(--string-color); }
741
+ .v-number { color: var(--number-color); }
742
+ .v-boolean { color: var(--boolean-color); }
743
+ .v-null { color: var(--null-color); font-style: italic; }
744
+ .v-function { color: var(--function-color); font-style: italic; }
745
+ .v-type { color: var(--type-color); font-style: italic; }
746
+ .v-error { color: var(--error-color); }
747
+
748
+ /* ============================================================
749
+ Property dropdown suggestions
750
+ ============================================================ */
751
+ .prop-dropdown {
752
+ position: absolute;
753
+ top: 100%;
754
+ left: 0;
755
+ right: 0;
756
+ z-index: 100;
757
+ background: var(--bg-alt);
758
+ border: 1px solid var(--border);
759
+ border-radius: 4px;
760
+ max-height: 180px;
761
+ overflow: auto;
762
+ box-shadow: 0 4px 12px rgba(0,0,0,0.4);
763
+ margin-top: 2px;
764
+ }
765
+
766
+ .prop-dropdown-item {
767
+ display: flex;
768
+ align-items: center;
769
+ justify-content: space-between;
770
+ padding: 4px 8px;
771
+ cursor: pointer;
772
+ font-size: 11px;
773
+ }
774
+
775
+ .prop-dropdown-item:hover,
776
+ .prop-dropdown-item.active {
777
+ background: var(--bg-hover);
778
+ }
779
+
780
+ .prop-dropdown-item .dd-label {
781
+ color: var(--text-bright);
782
+ }
783
+
784
+ .prop-dropdown-item .dd-hint {
785
+ color: var(--text-dim);
786
+ font-size: 10px;
787
+ margin-left: 8px;
788
+ }
789
+
790
+ .prop-dropdown-item .dd-swatch {
791
+ width: 12px;
792
+ height: 12px;
793
+ border-radius: 2px;
794
+ border: 1px solid var(--border);
795
+ margin-right: 6px;
796
+ flex-shrink: 0;
797
+ }
798
+
799
+ /* Nested object view */
800
+ .nested-obj {
801
+ margin-left: 16px;
802
+ border-left: 1px solid var(--border);
803
+ padding-left: 8px;
804
+ }
805
+
806
+ .nested-toggle {
807
+ cursor: pointer;
808
+ color: var(--text-dim);
809
+ }
810
+
811
+ .nested-toggle:hover {
812
+ color: var(--text);
813
+ }
814
+
815
+ /* ============================================================
816
+ Methods
817
+ ============================================================ */
818
+ .method-item {
819
+ display: flex;
820
+ align-items: center;
821
+ gap: 8px;
822
+ padding: 4px 0;
823
+ }
824
+
825
+ .method-name {
826
+ color: var(--function-color);
827
+ }
828
+
829
+ .method-btn {
830
+ background: transparent;
831
+ border: 1px solid var(--border);
832
+ color: var(--accent);
833
+ padding: 2px 8px;
834
+ border-radius: 3px;
835
+ cursor: pointer;
836
+ font-size: 11px;
837
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
838
+ }
839
+
840
+ .method-btn:hover {
841
+ background: var(--bg-hover);
842
+ }
843
+
844
+ .method-args {
845
+ background: var(--bg);
846
+ border: 1px solid var(--border);
847
+ color: var(--text);
848
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
849
+ font-size: 11px;
850
+ padding: 2px 6px;
851
+ border-radius: 3px;
852
+ width: 200px;
853
+ }
854
+
855
+ .method-result {
856
+ color: var(--text-dim);
857
+ font-size: 11px;
858
+ margin-left: 8px;
859
+ }
860
+
861
+ /* ============================================================
862
+ Children list
863
+ ============================================================ */
864
+ .child-item {
865
+ display: flex;
866
+ align-items: center;
867
+ gap: 8px;
868
+ padding: 4px 0;
869
+ cursor: pointer;
870
+ }
871
+
872
+ .child-item:hover {
873
+ background: var(--bg-hover);
874
+ }
875
+
876
+ .child-key {
877
+ color: var(--key-color);
878
+ }
879
+
880
+ .child-tag {
881
+ color: var(--tag-color);
882
+ font-size: 11px;
883
+ }
884
+
885
+ .child-arrow {
886
+ color: var(--text-dim);
887
+ margin-left: auto;
888
+ font-size: 10px;
889
+ }
890
+
891
+ /* ============================================================
892
+ Section headers
893
+ ============================================================ */
894
+ .section-header {
895
+ color: var(--text-dim);
896
+ font-size: 10px;
897
+ text-transform: uppercase;
898
+ letter-spacing: 1px;
899
+ padding: 8px 0 4px;
900
+ border-bottom: 1px solid var(--border);
901
+ margin-bottom: 4px;
902
+ }
903
+
904
+ .prop-source-header {
905
+ display: flex;
906
+ align-items: center;
907
+ justify-content: space-between;
908
+ color: var(--function-color);
909
+ font-size: 10px;
910
+ letter-spacing: 0.5px;
911
+ padding: 6px 0 3px;
912
+ margin-top: 6px;
913
+ border-bottom: 1px solid var(--border);
914
+ opacity: 0.75;
915
+ }
916
+
917
+ .prop-source-header:first-child {
918
+ margin-top: 0;
919
+ }
920
+
921
+ .empty-message {
922
+ color: var(--text-dim);
923
+ font-style: italic;
924
+ padding: 8px 0;
925
+ }
926
+
927
+ /* ============================================================
928
+ Connect Screen
929
+ ============================================================ */
930
+ #connect-screen {
931
+ display: flex;
932
+ align-items: center;
933
+ justify-content: center;
934
+ height: 100vh;
935
+ background: var(--bg);
936
+ }
937
+
938
+ .connect-inner {
939
+ text-align: center;
940
+ max-width: 420px;
941
+ padding: 40px;
942
+ }
943
+
944
+ .connect-logo {
945
+ width: 56px;
946
+ height: 56px;
947
+ margin: 0 auto 16px;
948
+ display: flex;
949
+ align-items: center;
950
+ justify-content: center;
951
+ }
952
+
953
+ .connect-logo svg {
954
+ width: 56px;
955
+ height: 56px;
956
+ fill: var(--accent);
957
+ }
958
+
959
+ .connect-title {
960
+ font-family: 'DmSansVariable', 'Helvetica Neue', 'Helvetica', system-ui, sans-serif;
961
+ font-size: 20px;
962
+ font-weight: 600;
963
+ color: var(--text-bright);
964
+ margin-bottom: 6px;
965
+ }
966
+
967
+ .connect-desc {
968
+ font-family: 'DmSansVariable', 'Helvetica Neue', 'Helvetica', system-ui, sans-serif;
969
+ font-size: 13px;
970
+ color: var(--text-dim);
971
+ margin-bottom: 32px;
972
+ line-height: 1.4;
973
+ }
974
+
975
+ .connect-error {
976
+ background: rgba(235, 102, 80, 0.1);
977
+ border: 1px solid var(--error-color);
978
+ color: var(--error-color);
979
+ padding: 10px 14px;
980
+ border-radius: 8px;
981
+ font-size: 12px;
982
+ line-height: 1.4;
983
+ margin-bottom: 16px;
984
+ text-align: left;
985
+ }
986
+
987
+ .connect-options {
988
+ display: flex;
989
+ flex-direction: column;
990
+ gap: 12px;
991
+ }
992
+
993
+ .connect-btn {
994
+ display: flex;
995
+ align-items: center;
996
+ gap: 12px;
997
+ width: 100%;
998
+ padding: 14px 16px;
999
+ background: var(--bg-alt);
1000
+ border: 1px solid var(--border);
1001
+ border-radius: 8px;
1002
+ cursor: pointer;
1003
+ text-align: left;
1004
+ transition: border-color 0.15s, background 0.15s;
1005
+ }
1006
+
1007
+ .connect-btn:hover {
1008
+ background: var(--bg-hover);
1009
+ border-color: var(--accent);
1010
+ }
1011
+
1012
+ .connect-btn-icon {
1013
+ font-size: 24px;
1014
+ flex-shrink: 0;
1015
+ width: 36px;
1016
+ text-align: center;
1017
+ }
1018
+
1019
+ .connect-btn-label {
1020
+ font-family: 'DmSansVariable', 'Helvetica Neue', 'Helvetica', system-ui, sans-serif;
1021
+ font-size: 14px;
1022
+ font-weight: 500;
1023
+ color: var(--text-bright);
1024
+ display: block;
1025
+ }
1026
+
1027
+ .connect-btn-hint {
1028
+ font-family: 'DmSansVariable', 'Helvetica Neue', 'Helvetica', system-ui, sans-serif;
1029
+ font-size: 11px;
1030
+ color: var(--text-dim);
1031
+ display: block;
1032
+ margin-top: 2px;
1033
+ }
1034
+
1035
+ .connect-recent {
1036
+ margin-top: 24px;
1037
+ text-align: left;
1038
+ }
1039
+
1040
+ .recent-item {
1041
+ display: flex;
1042
+ align-items: center;
1043
+ gap: 8px;
1044
+ padding: 8px 10px;
1045
+ cursor: pointer;
1046
+ border-radius: 4px;
1047
+ margin-top: 4px;
1048
+ }
1049
+
1050
+ .recent-item:hover {
1051
+ background: var(--bg-hover);
1052
+ }
1053
+
1054
+ .recent-item.matching {
1055
+ border: 1px solid var(--type-color);
1056
+ background: rgba(89, 172, 86, 0.08);
1057
+ }
1058
+
1059
+ .recent-name {
1060
+ color: var(--text-bright);
1061
+ font-family: 'DmSansVariable', 'Helvetica Neue', 'Helvetica', system-ui, sans-serif;
1062
+ font-size: 12px;
1063
+ }
1064
+
1065
+ .recent-type {
1066
+ color: var(--text-dim);
1067
+ font-size: 10px;
1068
+ margin-left: auto;
1069
+ }
1070
+
1071
+ /* ============================================================
1072
+ Inspector layout (when connected)
1073
+ ============================================================ */
1074
+ #connection-badge {
1075
+ font-size: 11px;
1076
+ color: var(--type-color);
1077
+ padding: 2px 8px;
1078
+ border: 1px solid var(--type-color);
1079
+ border-radius: 3px;
1080
+ white-space: nowrap;
1081
+ overflow: hidden;
1082
+ text-overflow: ellipsis;
1083
+ max-width: 200px;
1084
+ }
1085
+
1086
+ #btn-disconnect {
1087
+ color: var(--text-dim) !important;
1088
+ border-color: transparent !important;
1089
+ font-size: 10px !important;
1090
+ }
1091
+
1092
+ #btn-disconnect:hover {
1093
+ color: var(--error-color) !important;
1094
+ }
1095
+
1096
+ /* Tree section headers */
1097
+ .tree-section-label {
1098
+ display: block;
1099
+ padding: 6px 8px 4px;
1100
+ color: var(--text-dim);
1101
+ font-size: 10px;
1102
+ text-transform: uppercase;
1103
+ letter-spacing: 1px;
1104
+ border-bottom: 1px solid var(--border);
1105
+ }
1106
+
1107
+ #active-section {
1108
+ padding: 4px 0;
1109
+ }
1110
+
1111
+ #symbols-section {
1112
+ border-top: 1px solid var(--border);
1113
+ padding: 4px 0;
1114
+ }
1115
+
1116
+ /* File tree */
1117
+ .file-item {
1118
+ display: flex;
1119
+ align-items: center;
1120
+ padding: 2px 0;
1121
+ cursor: pointer;
1122
+ white-space: nowrap;
1123
+ user-select: none;
1124
+ font-size: 11px;
1125
+ }
1126
+
1127
+ .file-item:hover {
1128
+ background: var(--bg-hover);
1129
+ }
1130
+
1131
+ .file-item.selected {
1132
+ background: var(--bg-active);
1133
+ }
1134
+
1135
+ .file-icon {
1136
+ width: 16px;
1137
+ text-align: center;
1138
+ color: var(--text-dim);
1139
+ font-size: 10px;
1140
+ flex-shrink: 0;
1141
+ }
1142
+
1143
+ .file-name {
1144
+ color: var(--text);
1145
+ }
1146
+
1147
+ .file-name.dir {
1148
+ color: var(--key-color);
1149
+ }
1150
+
1151
+ .file-children {
1152
+ display: none;
1153
+ }
1154
+
1155
+ .file-children.expanded {
1156
+ display: block;
1157
+ }
1158
+
1159
+ /* ============================================================
1160
+ Source tab
1161
+ ============================================================ */
1162
+ #tab-source {
1163
+ position: relative;
1164
+ }
1165
+
1166
+ .source-path {
1167
+ color: var(--text-dim);
1168
+ font-size: 10px;
1169
+ padding: 4px 0 8px;
1170
+ border-bottom: 1px solid var(--border);
1171
+ margin-bottom: 8px;
1172
+ }
1173
+
1174
+ /* Code editor */
1175
+ .ce-header {
1176
+ display: flex;
1177
+ align-items: center;
1178
+ gap: 8px;
1179
+ padding: 4px 8px;
1180
+ border-bottom: 1px solid var(--border);
1181
+ background: var(--bg-alt);
1182
+ flex-shrink: 0;
1183
+ }
1184
+
1185
+ .ce-path {
1186
+ font-size: 11px;
1187
+ color: var(--text-dim);
1188
+ flex: 1;
1189
+ overflow: hidden;
1190
+ text-overflow: ellipsis;
1191
+ white-space: nowrap;
1192
+ }
1193
+
1194
+ .ce-status {
1195
+ font-size: 10px;
1196
+ color: var(--text-dim);
1197
+ }
1198
+
1199
+ .ce-status.ce-modified { color: var(--string-color); }
1200
+ .ce-status.ce-saved { color: var(--type-color); }
1201
+ .ce-status.ce-error { color: var(--error-color); }
1202
+
1203
+ .ce-save {
1204
+ background: var(--accent);
1205
+ color: #fff;
1206
+ border: none;
1207
+ padding: 2px 12px;
1208
+ border-radius: 3px;
1209
+ cursor: pointer;
1210
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
1211
+ font-size: 10px;
1212
+ }
1213
+
1214
+ .ce-save:hover { opacity: 0.85; }
1215
+ .ce-save:disabled { opacity: 0.35; cursor: default; }
1216
+
1217
+ .ce-wrap {
1218
+ position: relative;
1219
+ flex: 1;
1220
+ overflow: hidden;
1221
+ background: var(--bg);
1222
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
1223
+ font-size: 12px;
1224
+ line-height: 18px;
1225
+ }
1226
+
1227
+ .ce-gutter {
1228
+ position: absolute;
1229
+ top: 0;
1230
+ left: 0;
1231
+ width: 44px;
1232
+ height: 100%;
1233
+ overflow: hidden;
1234
+ background: var(--bg-alt);
1235
+ border-right: 1px solid var(--border);
1236
+ z-index: 2;
1237
+ user-select: none;
1238
+ }
1239
+
1240
+ .ce-ln {
1241
+ height: 18px;
1242
+ text-align: right;
1243
+ padding-right: 8px;
1244
+ color: var(--text-dim);
1245
+ opacity: 0.5;
1246
+ font-size: 11px;
1247
+ }
1248
+
1249
+ .ce-highlight {
1250
+ position: absolute;
1251
+ top: 0;
1252
+ left: 44px;
1253
+ right: 0;
1254
+ height: 100%;
1255
+ overflow: hidden;
1256
+ pointer-events: none;
1257
+ z-index: 1;
1258
+ padding: 0 8px;
1259
+ white-space: pre;
1260
+ color: var(--text);
1261
+ }
1262
+
1263
+ .ce-line {
1264
+ height: 18px;
1265
+ white-space: pre;
1266
+ }
1267
+
1268
+ .ce-line.ce-active {
1269
+ background: rgba(0, 133, 255, 0.12);
1270
+ box-shadow: inset 3px 0 0 var(--accent);
1271
+ }
1272
+
1273
+ .ce-textarea {
1274
+ position: absolute;
1275
+ top: 0;
1276
+ left: 44px;
1277
+ right: 0;
1278
+ height: 100%;
1279
+ width: calc(100% - 44px);
1280
+ background: transparent;
1281
+ color: transparent;
1282
+ caret-color: var(--text-bright);
1283
+ border: none;
1284
+ outline: none;
1285
+ resize: none;
1286
+ font: inherit;
1287
+ line-height: inherit;
1288
+ padding: 0 8px;
1289
+ tab-size: 2;
1290
+ z-index: 3;
1291
+ white-space: pre;
1292
+ overflow: auto;
1293
+ }
1294
+
1295
+ .ce-textarea::selection {
1296
+ background: rgba(0, 133, 255, 0.3);
1297
+ }
1298
+
1299
+ /* Syntax highlight tokens */
1300
+ .sh-keyword { color: #C586C0; }
1301
+ .sh-string { color: var(--string-color); }
1302
+ .sh-number { color: var(--number-color); }
1303
+ .sh-boolean { color: var(--boolean-color); }
1304
+ .sh-comment { color: #6A9955; font-style: italic; }
1305
+
1306
+ /* Prop source badges */
1307
+ .prop-source-file {
1308
+ font-size: 9px;
1309
+ color: var(--accent);
1310
+ opacity: 0.7;
1311
+ cursor: pointer;
1312
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
1313
+ }
1314
+
1315
+ .prop-source-file:hover {
1316
+ opacity: 1;
1317
+ text-decoration: underline;
1318
+ }
1319
+
1320
+ .prop-key.has-source {
1321
+ cursor: pointer;
1322
+ text-decoration: underline;
1323
+ text-decoration-style: dotted;
1324
+ text-underline-offset: 2px;
1325
+ text-decoration-color: var(--text-dim);
1326
+ }
1327
+
1328
+ .prop-key.has-source:hover {
1329
+ color: var(--accent);
1330
+ text-decoration-color: var(--accent);
1331
+ }
1332
+
1333
+ /* Save bar */
1334
+ .prop-save-bar {
1335
+ margin-top: 12px;
1336
+ padding-top: 8px;
1337
+ border-top: 1px solid var(--border);
1338
+ }
1339
+
1340
+ .prop-save-btn {
1341
+ background: var(--type-color);
1342
+ color: #fff;
1343
+ border: none;
1344
+ padding: 6px 16px;
1345
+ border-radius: 4px;
1346
+ cursor: pointer;
1347
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
1348
+ font-size: 11px;
1349
+ width: 100%;
1350
+ }
1351
+
1352
+ .prop-save-btn:hover {
1353
+ opacity: 0.9;
1354
+ }
1355
+
1356
+ /* Add prop/state button */
1357
+ .prop-add-row {
1358
+ padding: 4px 16px;
1359
+ margin-top: 4px;
1360
+ }
1361
+
1362
+ .prop-add-btn {
1363
+ background: transparent;
1364
+ border: 1px dashed var(--border);
1365
+ color: var(--text-dim);
1366
+ padding: 4px 12px;
1367
+ border-radius: 4px;
1368
+ font-size: 11px;
1369
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
1370
+ cursor: pointer;
1371
+ width: 100%;
1372
+ }
1373
+
1374
+ .prop-add-btn:hover {
1375
+ border-color: var(--accent);
1376
+ color: var(--text);
1377
+ }
1378
+
1379
+ /* ============================================================
1380
+ AI Bar (Editor bottom bar)
1381
+ ============================================================ */
1382
+ #ai-bar {
1383
+ border-top: 1px solid var(--border);
1384
+ background: var(--bg-alt);
1385
+ padding: 8px 12px;
1386
+ flex-shrink: 0;
1387
+ }
1388
+
1389
+ #ai-result {
1390
+ font-size: 11px;
1391
+ color: var(--text-dim);
1392
+ min-height: 0;
1393
+ padding: 0;
1394
+ margin-bottom: 4px;
1395
+ max-height: 80px;
1396
+ overflow: auto;
1397
+ line-height: 1.4;
1398
+ }
1399
+
1400
+ #ai-result:empty {
1401
+ display: none;
1402
+ margin: 0;
1403
+ }
1404
+
1405
+ #ai-input-row,
1406
+ #chat-input-row {
1407
+ display: flex;
1408
+ gap: 6px;
1409
+ align-items: center;
1410
+ }
1411
+
1412
+ #ai-input,
1413
+ #chat-input {
1414
+ flex: 1;
1415
+ background: var(--bg);
1416
+ border: 1px solid var(--border);
1417
+ color: var(--text);
1418
+ font-family: inherit;
1419
+ font-size: 12px;
1420
+ padding: 6px 10px;
1421
+ border-radius: 4px;
1422
+ outline: none;
1423
+ }
1424
+
1425
+ #ai-input:focus,
1426
+ #chat-input:focus {
1427
+ border-color: var(--accent);
1428
+ }
1429
+
1430
+ #ai-input::placeholder,
1431
+ #chat-input::placeholder {
1432
+ color: var(--text-dim);
1433
+ }
1434
+
1435
+ #ai-send,
1436
+ #chat-send {
1437
+ background: var(--accent);
1438
+ color: #fff;
1439
+ border: none;
1440
+ padding: 6px 14px;
1441
+ border-radius: 4px;
1442
+ font-size: 11px;
1443
+ font-family: inherit;
1444
+ cursor: pointer;
1445
+ flex-shrink: 0;
1446
+ }
1447
+
1448
+ #ai-send:hover,
1449
+ #chat-send:hover {
1450
+ opacity: 0.9;
1451
+ }
1452
+
1453
+ /* AI model selector */
1454
+ .ai-model-select {
1455
+ background: var(--bg);
1456
+ border: 1px solid var(--border);
1457
+ color: var(--text-dim);
1458
+ font-size: 10px;
1459
+ padding: 5px 6px;
1460
+ border-radius: 4px;
1461
+ outline: none;
1462
+ cursor: pointer;
1463
+ font-family: inherit;
1464
+ flex-shrink: 0;
1465
+ }
1466
+
1467
+ .ai-model-select:focus {
1468
+ border-color: var(--accent);
1469
+ }
1470
+
1471
+ .ai-settings-btn {
1472
+ background: transparent;
1473
+ border: none;
1474
+ color: var(--text-dim);
1475
+ font-size: 13px;
1476
+ cursor: pointer;
1477
+ padding: 2px 4px;
1478
+ flex-shrink: 0;
1479
+ line-height: 1;
1480
+ }
1481
+
1482
+ .ai-settings-btn:hover { color: var(--text-bright); }
1483
+
1484
+ /* AI Settings Dialog */
1485
+ .ai-dialog-overlay {
1486
+ position: fixed;
1487
+ inset: 0;
1488
+ background: rgba(0,0,0,0.5);
1489
+ z-index: 1000;
1490
+ display: flex;
1491
+ align-items: center;
1492
+ justify-content: center;
1493
+ }
1494
+
1495
+ .ai-dialog {
1496
+ background: var(--bg-alt);
1497
+ border: 1px solid var(--border);
1498
+ border-radius: 8px;
1499
+ width: 340px;
1500
+ max-height: 80vh;
1501
+ overflow: auto;
1502
+ box-shadow: 0 8px 32px rgba(0,0,0,0.4);
1503
+ }
1504
+
1505
+ .ai-dialog-header {
1506
+ display: flex;
1507
+ align-items: center;
1508
+ justify-content: space-between;
1509
+ padding: 10px 14px;
1510
+ border-bottom: 1px solid var(--border);
1511
+ font-size: 13px;
1512
+ font-weight: 600;
1513
+ color: var(--text-bright);
1514
+ }
1515
+
1516
+ .ai-dialog-header button {
1517
+ background: none;
1518
+ border: none;
1519
+ color: var(--text-dim);
1520
+ font-size: 16px;
1521
+ cursor: pointer;
1522
+ padding: 0 4px;
1523
+ font-family: inherit;
1524
+ }
1525
+
1526
+ .ai-dialog-header button:hover { color: var(--text-bright); }
1527
+
1528
+ .ai-dialog-body {
1529
+ padding: 14px;
1530
+ }
1531
+
1532
+ .ai-dialog-section {
1533
+ margin-bottom: 12px;
1534
+ }
1535
+
1536
+ .ai-dialog-label {
1537
+ font-size: 12px;
1538
+ font-weight: 600;
1539
+ color: var(--text-bright);
1540
+ margin-bottom: 4px;
1541
+ }
1542
+
1543
+ .ai-dialog-hint {
1544
+ font-size: 11px;
1545
+ color: var(--text-dim);
1546
+ line-height: 1.4;
1547
+ margin-bottom: 10px;
1548
+ }
1549
+
1550
+ .ai-dialog-auth-status {
1551
+ font-size: 11px;
1552
+ padding: 6px 10px;
1553
+ border-radius: 4px;
1554
+ margin-bottom: 10px;
1555
+ }
1556
+
1557
+ .ai-dialog-auth-status.signed-in {
1558
+ background: rgba(89, 172, 86, 0.12);
1559
+ color: #59AC56;
1560
+ border: 1px solid rgba(89, 172, 86, 0.2);
1561
+ }
1562
+
1563
+ .ai-dialog-auth-status.signed-out {
1564
+ background: rgba(0, 133, 255, 0.08);
1565
+ color: var(--accent);
1566
+ border: 1px solid rgba(0, 133, 255, 0.15);
1567
+ }
1568
+
1569
+ .ai-dialog-field {
1570
+ margin-bottom: 10px;
1571
+ }
1572
+
1573
+ .ai-dialog-field label {
1574
+ display: block;
1575
+ font-size: 11px;
1576
+ color: var(--text-dim);
1577
+ margin-bottom: 4px;
1578
+ }
1579
+
1580
+ .ai-dialog-input {
1581
+ width: 100%;
1582
+ background: var(--bg);
1583
+ border: 1px solid var(--border);
1584
+ color: var(--text);
1585
+ padding: 7px 10px;
1586
+ border-radius: 4px;
1587
+ font-size: 12px;
1588
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
1589
+ outline: none;
1590
+ box-sizing: border-box;
1591
+ }
1592
+
1593
+ .ai-dialog-input:focus {
1594
+ border-color: var(--accent);
1595
+ }
1596
+
1597
+ .ai-dialog-actions {
1598
+ display: flex;
1599
+ justify-content: flex-end;
1600
+ gap: 8px;
1601
+ padding-top: 8px;
1602
+ border-top: 1px solid var(--border);
1603
+ }
1604
+
1605
+ .ai-dialog-save {
1606
+ background: var(--accent);
1607
+ color: #fff;
1608
+ border: none;
1609
+ padding: 6px 20px;
1610
+ border-radius: 4px;
1611
+ font-size: 12px;
1612
+ cursor: pointer;
1613
+ font-family: inherit;
1614
+ }
1615
+
1616
+ .ai-dialog-save:hover { opacity: 0.9; }
1617
+
1618
+ /* Scope toggle (Element / Section) */
1619
+ .ai-scope-toggle {
1620
+ display: flex;
1621
+ border: 1px solid var(--border);
1622
+ border-radius: 4px;
1623
+ overflow: hidden;
1624
+ flex-shrink: 0;
1625
+ }
1626
+
1627
+ .ai-scope-btn {
1628
+ background: transparent;
1629
+ border: none;
1630
+ color: var(--text-dim);
1631
+ font-size: 10px;
1632
+ padding: 4px 8px;
1633
+ cursor: pointer;
1634
+ font-family: inherit;
1635
+ white-space: nowrap;
1636
+ }
1637
+
1638
+ .ai-scope-btn:first-child {
1639
+ border-right: 1px solid var(--border);
1640
+ }
1641
+
1642
+ .ai-scope-btn:hover {
1643
+ color: var(--text);
1644
+ }
1645
+
1646
+ .ai-scope-btn.active {
1647
+ background: var(--accent);
1648
+ color: #fff;
1649
+ }
1650
+
1651
+ /* ============================================================
1652
+ Chat mode
1653
+ ============================================================ */
1654
+ #mode-chat {
1655
+ background: var(--bg);
1656
+ }
1657
+
1658
+ /* Thread bar */
1659
+ #chat-threads-bar {
1660
+ display: flex;
1661
+ align-items: center;
1662
+ gap: 4px;
1663
+ padding: 4px 8px;
1664
+ border-bottom: 1px solid var(--border);
1665
+ background: var(--bg-alt);
1666
+ overflow-x: auto;
1667
+ flex-shrink: 0;
1668
+ }
1669
+
1670
+ #chat-threads-list {
1671
+ display: flex;
1672
+ gap: 2px;
1673
+ flex: 1;
1674
+ overflow-x: auto;
1675
+ scrollbar-width: none;
1676
+ }
1677
+
1678
+ #chat-threads-list::-webkit-scrollbar { display: none; }
1679
+
1680
+ .thread-tab {
1681
+ display: flex;
1682
+ align-items: center;
1683
+ gap: 4px;
1684
+ padding: 3px 8px;
1685
+ border-radius: 4px;
1686
+ font-size: 11px;
1687
+ color: var(--text-dim);
1688
+ background: transparent;
1689
+ border: 1px solid transparent;
1690
+ cursor: pointer;
1691
+ white-space: nowrap;
1692
+ max-width: 140px;
1693
+ font-family: inherit;
1694
+ }
1695
+
1696
+ .thread-tab:hover {
1697
+ background: var(--bg-hover);
1698
+ color: var(--text);
1699
+ }
1700
+
1701
+ .thread-tab.active {
1702
+ background: var(--bg);
1703
+ color: var(--text-bright);
1704
+ border-color: var(--border);
1705
+ }
1706
+
1707
+ .thread-tab .thread-title {
1708
+ overflow: hidden;
1709
+ text-overflow: ellipsis;
1710
+ }
1711
+
1712
+ .thread-tab .thread-close {
1713
+ font-size: 10px;
1714
+ opacity: 0;
1715
+ color: var(--text-dim);
1716
+ cursor: pointer;
1717
+ padding: 0 2px;
1718
+ line-height: 1;
1719
+ }
1720
+
1721
+ .thread-tab:hover .thread-close { opacity: 0.6; }
1722
+ .thread-tab .thread-close:hover { opacity: 1; color: var(--error-color, #e15c55); }
1723
+
1724
+ #chat-thread-history,
1725
+ #chat-new-thread {
1726
+ padding: 3px 8px;
1727
+ border-radius: 4px;
1728
+ font-size: 11px;
1729
+ color: var(--text-dim);
1730
+ background: transparent;
1731
+ border: 1px solid var(--border);
1732
+ cursor: pointer;
1733
+ white-space: nowrap;
1734
+ font-family: inherit;
1735
+ flex-shrink: 0;
1736
+ }
1737
+
1738
+ #chat-thread-history:hover,
1739
+ #chat-new-thread:hover {
1740
+ color: var(--text-bright);
1741
+ border-color: var(--accent);
1742
+ }
1743
+
1744
+ /* Thread history panel */
1745
+ #chat-thread-history-panel {
1746
+ background: var(--bg-alt);
1747
+ border-bottom: 1px solid var(--border);
1748
+ max-height: 200px;
1749
+ overflow: auto;
1750
+ flex-shrink: 0;
1751
+ }
1752
+
1753
+ .thread-history-header {
1754
+ display: flex;
1755
+ align-items: center;
1756
+ justify-content: space-between;
1757
+ padding: 6px 10px;
1758
+ font-size: 11px;
1759
+ font-weight: 600;
1760
+ color: var(--text-dim);
1761
+ text-transform: uppercase;
1762
+ border-bottom: 1px solid var(--border);
1763
+ }
1764
+
1765
+ .thread-history-header button {
1766
+ background: none;
1767
+ border: none;
1768
+ color: var(--text-dim);
1769
+ font-size: 14px;
1770
+ cursor: pointer;
1771
+ padding: 0 4px;
1772
+ font-family: inherit;
1773
+ }
1774
+
1775
+ .thread-history-header button:hover { color: var(--text-bright); }
1776
+
1777
+ .thread-history-item {
1778
+ display: flex;
1779
+ align-items: center;
1780
+ padding: 6px 10px;
1781
+ font-size: 11px;
1782
+ color: var(--text);
1783
+ cursor: pointer;
1784
+ border-bottom: 1px solid var(--border);
1785
+ gap: 8px;
1786
+ }
1787
+
1788
+ .thread-history-item:hover { background: var(--bg-hover); }
1789
+ .thread-history-item.active { background: var(--bg); color: var(--text-bright); }
1790
+
1791
+ .thread-history-item .thread-history-title {
1792
+ flex: 1;
1793
+ overflow: hidden;
1794
+ text-overflow: ellipsis;
1795
+ white-space: nowrap;
1796
+ }
1797
+
1798
+ .thread-history-item .thread-history-date {
1799
+ font-size: 10px;
1800
+ color: var(--text-dim);
1801
+ flex-shrink: 0;
1802
+ }
1803
+
1804
+ .thread-history-item .thread-history-delete {
1805
+ font-size: 10px;
1806
+ opacity: 0;
1807
+ color: var(--text-dim);
1808
+ cursor: pointer;
1809
+ padding: 0 4px;
1810
+ }
1811
+
1812
+ .thread-history-item:hover .thread-history-delete { opacity: 0.6; }
1813
+ .thread-history-item .thread-history-delete:hover { opacity: 1; color: var(--error-color, #e15c55); }
1814
+
1815
+ #chat-messages {
1816
+ flex: 1;
1817
+ overflow: auto;
1818
+ padding: 16px 16px 8px;
1819
+ display: flex;
1820
+ flex-direction: column;
1821
+ gap: 12px;
1822
+ }
1823
+
1824
+ .chat-msg {
1825
+ max-width: 90%;
1826
+ padding: 8px 12px;
1827
+ border-radius: 8px;
1828
+ font-size: 12px;
1829
+ line-height: 1.5;
1830
+ word-break: break-word;
1831
+ }
1832
+
1833
+ .chat-msg.user {
1834
+ align-self: flex-end;
1835
+ background: var(--accent);
1836
+ color: #fff;
1837
+ border-bottom-right-radius: 2px;
1838
+ }
1839
+
1840
+ .chat-msg.assistant {
1841
+ align-self: flex-start;
1842
+ background: var(--bg-alt);
1843
+ color: var(--text);
1844
+ border: 1px solid var(--border);
1845
+ border-bottom-left-radius: 2px;
1846
+ }
1847
+
1848
+ .chat-msg.assistant pre {
1849
+ background: var(--bg);
1850
+ padding: 6px 8px;
1851
+ border-radius: 4px;
1852
+ margin: 6px 0;
1853
+ overflow-x: auto;
1854
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
1855
+ font-size: 11px;
1856
+ }
1857
+
1858
+ .chat-msg.assistant code {
1859
+ font-family: 'Droid Sans Mono for Powerline', 'SF Mono', 'Menlo', monospace;
1860
+ font-size: 11px;
1861
+ background: var(--bg);
1862
+ padding: 1px 4px;
1863
+ border-radius: 2px;
1864
+ }
1865
+
1866
+ .chat-msg.system {
1867
+ align-self: center;
1868
+ color: var(--text-dim);
1869
+ font-size: 11px;
1870
+ font-style: italic;
1871
+ padding: 4px 8px;
1872
+ }
1873
+
1874
+ .chat-msg .chat-actions {
1875
+ margin-top: 8px;
1876
+ display: flex;
1877
+ gap: 6px;
1878
+ }
1879
+
1880
+ .chat-msg .chat-apply-btn {
1881
+ background: var(--type-color);
1882
+ color: #fff;
1883
+ border: none;
1884
+ padding: 3px 10px;
1885
+ border-radius: 3px;
1886
+ font-size: 10px;
1887
+ cursor: pointer;
1888
+ font-family: inherit;
1889
+ }
1890
+
1891
+ .chat-msg .chat-apply-btn:hover {
1892
+ opacity: 0.9;
1893
+ }
1894
+
1895
+ .chat-thinking {
1896
+ color: var(--text-dim);
1897
+ font-style: italic;
1898
+ animation: auth-pulse 2s ease-in-out infinite;
1899
+ }
1900
+
1901
+ /* Chat context bar */
1902
+ #chat-context-bar {
1903
+ display: flex;
1904
+ align-items: center;
1905
+ gap: 8px;
1906
+ padding: 6px 12px;
1907
+ border-top: 1px solid var(--border);
1908
+ background: var(--bg-alt);
1909
+ flex-shrink: 0;
1910
+ }
1911
+
1912
+ .chat-context-label {
1913
+ font-size: 11px;
1914
+ color: var(--text-dim);
1915
+ flex: 1;
1916
+ overflow: hidden;
1917
+ text-overflow: ellipsis;
1918
+ white-space: nowrap;
1919
+ }
1920
+
1921
+ .chat-context-label.has-element {
1922
+ color: var(--key-color);
1923
+ }
1924
+
1925
+ .chat-pick-btn {
1926
+ background: transparent;
1927
+ border: 1px solid var(--border);
1928
+ color: var(--text);
1929
+ padding: 3px 10px;
1930
+ border-radius: 3px;
1931
+ cursor: pointer;
1932
+ font-size: 10px;
1933
+ font-family: inherit;
1934
+ flex-shrink: 0;
1935
+ }
1936
+
1937
+ .chat-pick-btn:hover {
1938
+ background: var(--bg-hover);
1939
+ border-color: var(--accent);
1940
+ }
1941
+
1942
+ .chat-pick-btn.active {
1943
+ background: var(--accent);
1944
+ color: #fff;
1945
+ border-color: var(--accent);
1946
+ }
1947
+
1948
+ #chat-input-row {
1949
+ padding: 8px 12px;
1950
+ border-top: 1px solid var(--border);
1951
+ background: var(--bg-alt);
1952
+ flex-shrink: 0;
1953
+ }
1954
+
1955
+ /* ============================================================
1956
+ Auth section
1957
+ ============================================================ */
1958
+ #auth-section {
1959
+ margin-bottom: 20px;
1960
+ }
1961
+
1962
+ .auth-form {
1963
+ display: flex;
1964
+ flex-direction: column;
1965
+ gap: 8px;
1966
+ }
1967
+
1968
+ .auth-input {
1969
+ background: var(--bg-alt);
1970
+ border: 1px solid var(--border);
1971
+ color: var(--text);
1972
+ font-family: inherit;
1973
+ font-size: 13px;
1974
+ padding: 10px 12px;
1975
+ border-radius: 6px;
1976
+ outline: none;
1977
+ }
1978
+
1979
+ .auth-input:focus {
1980
+ border-color: var(--accent);
1981
+ }
1982
+
1983
+ .auth-input::placeholder {
1984
+ color: var(--text-dim);
1985
+ }
1986
+
1987
+ .auth-btn {
1988
+ background: var(--accent);
1989
+ color: #fff;
1990
+ border: none;
1991
+ padding: 10px 16px;
1992
+ border-radius: 6px;
1993
+ font-family: inherit;
1994
+ font-size: 13px;
1995
+ font-weight: 500;
1996
+ cursor: pointer;
1997
+ }
1998
+
1999
+ .auth-btn-primary {
2000
+ background: var(--accent);
2001
+ font-weight: 600;
2002
+ font-size: 14px;
2003
+ padding: 12px 16px;
2004
+ }
2005
+
2006
+ .auth-btn:hover {
2007
+ opacity: 0.9;
2008
+ }
2009
+
2010
+ .auth-btn:disabled {
2011
+ opacity: 0.5;
2012
+ cursor: default;
2013
+ }
2014
+
2015
+ .auth-divider {
2016
+ display: flex;
2017
+ align-items: center;
2018
+ gap: 10px;
2019
+ margin: 4px 0;
2020
+ }
2021
+
2022
+ .auth-divider::before,
2023
+ .auth-divider::after {
2024
+ content: '';
2025
+ flex: 1;
2026
+ height: 1px;
2027
+ background: var(--border);
2028
+ }
2029
+
2030
+ .auth-divider span {
2031
+ color: var(--text-dim);
2032
+ font-size: 11px;
2033
+ white-space: nowrap;
2034
+ }
2035
+
2036
+ .auth-status {
2037
+ color: var(--text-dim);
2038
+ font-size: 12px;
2039
+ padding: 8px 12px;
2040
+ background: var(--bg-alt);
2041
+ border-radius: 6px;
2042
+ border: 1px solid var(--border);
2043
+ text-align: center;
2044
+ line-height: 1.4;
2045
+ }
2046
+
2047
+ .auth-status.waiting {
2048
+ color: var(--string-color);
2049
+ border-color: var(--string-color);
2050
+ animation: auth-pulse 2s ease-in-out infinite;
2051
+ }
2052
+
2053
+ @keyframes auth-pulse {
2054
+ 0%, 100% { opacity: 0.7; }
2055
+ 50% { opacity: 1; }
2056
+ }
2057
+
2058
+ .auth-error {
2059
+ color: var(--error-color);
2060
+ font-size: 12px;
2061
+ padding: 4px 0;
2062
+ }
2063
+
2064
+ .auth-user-row {
2065
+ display: flex;
2066
+ align-items: center;
2067
+ justify-content: space-between;
2068
+ padding: 8px 12px;
2069
+ background: var(--bg-alt);
2070
+ border-radius: 6px;
2071
+ border: 1px solid var(--border);
2072
+ }
2073
+
2074
+ .auth-user-name {
2075
+ color: var(--text-bright);
2076
+ font-size: 13px;
2077
+ font-weight: 500;
2078
+ }
2079
+
2080
+ .auth-sign-out {
2081
+ background: transparent;
2082
+ border: 1px solid var(--border);
2083
+ color: var(--text-dim);
2084
+ padding: 4px 10px;
2085
+ border-radius: 4px;
2086
+ font-size: 11px;
2087
+ cursor: pointer;
2088
+ font-family: inherit;
2089
+ }
2090
+
2091
+ .auth-sign-out:hover {
2092
+ color: var(--error-color);
2093
+ border-color: var(--error-color);
2094
+ }
2095
+
2096
+ /* ============================================================
2097
+ JSON Tree Editor
2098
+ ============================================================ */
2099
+ .json-editor {
2100
+ padding: 0 12px;
2101
+ overflow: auto;
2102
+ flex: 1;
2103
+ }
2104
+
2105
+ .json-row {
2106
+ display: flex;
2107
+ align-items: flex-start;
2108
+ padding: 2px 0;
2109
+ min-height: 22px;
2110
+ }
2111
+
2112
+ .json-indent {
2113
+ flex-shrink: 0;
2114
+ }
2115
+
2116
+ .json-toggle {
2117
+ width: 14px;
2118
+ flex-shrink: 0;
2119
+ cursor: pointer;
2120
+ color: var(--text-dim);
2121
+ font-size: 10px;
2122
+ text-align: center;
2123
+ user-select: none;
2124
+ }
2125
+
2126
+ .json-toggle:hover {
2127
+ color: var(--text);
2128
+ }
2129
+
2130
+ .json-key {
2131
+ color: var(--key-color);
2132
+ margin-right: 6px;
2133
+ flex-shrink: 0;
2134
+ }
2135
+
2136
+ .json-colon {
2137
+ color: var(--text-dim);
2138
+ margin-right: 6px;
2139
+ }
2140
+
2141
+ .json-value {
2142
+ flex: 1;
2143
+ word-break: break-all;
2144
+ }
2145
+
2146
+ .json-value.editable {
2147
+ cursor: text;
2148
+ padding: 0 4px;
2149
+ border-radius: 2px;
2150
+ }
2151
+
2152
+ .json-value.editable:hover {
2153
+ background: var(--bg-hover);
2154
+ outline: 1px solid var(--border);
2155
+ }
2156
+
2157
+ .json-children {
2158
+ display: none;
2159
+ }
2160
+
2161
+ .json-children.expanded {
2162
+ display: block;
2163
+ }
2164
+
2165
+ .json-bracket {
2166
+ color: var(--text-dim);
2167
+ }
2168
+
2169
+ /* Platform data tab */
2170
+ #tab-data {
2171
+ position: relative;
2172
+ }
2173
+
2174
+ .data-path-bar {
2175
+ display: flex;
2176
+ align-items: center;
2177
+ gap: 4px;
2178
+ padding: 6px 0 8px;
2179
+ border-bottom: 1px solid var(--border);
2180
+ margin-bottom: 8px;
2181
+ flex-wrap: wrap;
2182
+ }
2183
+
2184
+ .data-path-segment {
2185
+ color: var(--accent);
2186
+ font-size: 11px;
2187
+ cursor: pointer;
2188
+ padding: 1px 4px;
2189
+ border-radius: 2px;
2190
+ }
2191
+
2192
+ .data-path-segment:hover {
2193
+ background: var(--bg-hover);
2194
+ }
2195
+
2196
+ .data-path-sep {
2197
+ color: var(--text-dim);
2198
+ font-size: 10px;
2199
+ }
2200
+
2201
+ /* Project list items */
2202
+ .project-item {
2203
+ display: flex;
2204
+ align-items: center;
2205
+ gap: 8px;
2206
+ padding: 8px 10px;
2207
+ cursor: pointer;
2208
+ border-radius: 4px;
2209
+ margin-top: 4px;
2210
+ }
2211
+
2212
+ .project-item:hover {
2213
+ background: var(--bg-hover);
2214
+ }
2215
+
2216
+ .project-item.matching {
2217
+ border: 1px solid var(--type-color);
2218
+ background: rgba(89, 172, 86, 0.08);
2219
+ }
2220
+
2221
+ .project-name {
2222
+ color: var(--text-bright);
2223
+ font-size: 12px;
2224
+ }
2225
+
2226
+ .project-key {
2227
+ color: var(--text-dim);
2228
+ font-size: 10px;
2229
+ margin-left: auto;
2230
+ }
2231
+
2232
+ .project-match-badge {
2233
+ font-size: 9px;
2234
+ color: var(--type-color);
2235
+ border: 1px solid var(--type-color);
2236
+ border-radius: 3px;
2237
+ padding: 1px 5px;
2238
+ margin-left: 4px;
2239
+ }