claude-relay 2.4.2 → 2.5.0

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 (75) hide show
  1. package/bin/cli.js +1 -2350
  2. package/package.json +7 -42
  3. package/LICENSE +0 -21
  4. package/README.md +0 -281
  5. package/lib/cli-sessions.js +0 -270
  6. package/lib/config.js +0 -222
  7. package/lib/daemon.js +0 -423
  8. package/lib/ipc.js +0 -112
  9. package/lib/pages.js +0 -714
  10. package/lib/project.js +0 -1224
  11. package/lib/public/app.js +0 -2157
  12. package/lib/public/apple-touch-icon.png +0 -0
  13. package/lib/public/css/base.css +0 -145
  14. package/lib/public/css/diff.css +0 -128
  15. package/lib/public/css/filebrowser.css +0 -1076
  16. package/lib/public/css/highlight.css +0 -144
  17. package/lib/public/css/input.css +0 -512
  18. package/lib/public/css/menus.css +0 -683
  19. package/lib/public/css/messages.css +0 -1159
  20. package/lib/public/css/overlays.css +0 -731
  21. package/lib/public/css/rewind.css +0 -529
  22. package/lib/public/css/sidebar.css +0 -794
  23. package/lib/public/favicon.svg +0 -26
  24. package/lib/public/icon-192.png +0 -0
  25. package/lib/public/icon-512.png +0 -0
  26. package/lib/public/icon-mono.svg +0 -19
  27. package/lib/public/index.html +0 -460
  28. package/lib/public/manifest.json +0 -27
  29. package/lib/public/modules/diff.js +0 -398
  30. package/lib/public/modules/events.js +0 -21
  31. package/lib/public/modules/filebrowser.js +0 -1375
  32. package/lib/public/modules/fileicons.js +0 -172
  33. package/lib/public/modules/icons.js +0 -54
  34. package/lib/public/modules/input.js +0 -578
  35. package/lib/public/modules/markdown.js +0 -149
  36. package/lib/public/modules/notifications.js +0 -643
  37. package/lib/public/modules/qrcode.js +0 -70
  38. package/lib/public/modules/rewind.js +0 -334
  39. package/lib/public/modules/sidebar.js +0 -628
  40. package/lib/public/modules/state.js +0 -3
  41. package/lib/public/modules/terminal.js +0 -658
  42. package/lib/public/modules/theme.js +0 -622
  43. package/lib/public/modules/tools.js +0 -1410
  44. package/lib/public/modules/utils.js +0 -56
  45. package/lib/public/style.css +0 -10
  46. package/lib/public/sw.js +0 -75
  47. package/lib/push.js +0 -125
  48. package/lib/sdk-bridge.js +0 -771
  49. package/lib/server.js +0 -577
  50. package/lib/sessions.js +0 -402
  51. package/lib/terminal-manager.js +0 -187
  52. package/lib/terminal.js +0 -24
  53. package/lib/themes/ayu-light.json +0 -9
  54. package/lib/themes/catppuccin-latte.json +0 -9
  55. package/lib/themes/catppuccin-mocha.json +0 -9
  56. package/lib/themes/claude-light.json +0 -9
  57. package/lib/themes/claude.json +0 -9
  58. package/lib/themes/dracula.json +0 -9
  59. package/lib/themes/everforest-light.json +0 -9
  60. package/lib/themes/everforest.json +0 -9
  61. package/lib/themes/github-light.json +0 -9
  62. package/lib/themes/gruvbox-dark.json +0 -9
  63. package/lib/themes/gruvbox-light.json +0 -9
  64. package/lib/themes/monokai.json +0 -9
  65. package/lib/themes/nord-light.json +0 -9
  66. package/lib/themes/nord.json +0 -9
  67. package/lib/themes/one-dark.json +0 -9
  68. package/lib/themes/one-light.json +0 -9
  69. package/lib/themes/rose-pine-dawn.json +0 -9
  70. package/lib/themes/rose-pine.json +0 -9
  71. package/lib/themes/solarized-dark.json +0 -9
  72. package/lib/themes/solarized-light.json +0 -9
  73. package/lib/themes/tokyo-night-light.json +0 -9
  74. package/lib/themes/tokyo-night.json +0 -9
  75. package/lib/updater.js +0 -96
@@ -1,683 +0,0 @@
1
- /* ==========================================================================
2
- Header
3
- ========================================================================== */
4
-
5
- #header {
6
- flex-shrink: 0;
7
- display: flex;
8
- align-items: center;
9
- justify-content: space-between;
10
- padding: calc(var(--safe-top) + 12px) 20px 12px;
11
- min-height: 48px;
12
- }
13
-
14
- #header-left {
15
- display: flex;
16
- align-items: center;
17
- overflow: hidden;
18
- min-width: 0;
19
- }
20
-
21
- .header-title {
22
- font-weight: 600;
23
- font-size: 15px;
24
- color: var(--text);
25
- overflow: hidden;
26
- text-overflow: ellipsis;
27
- white-space: nowrap;
28
- }
29
-
30
- #header-rename-btn {
31
- display: none;
32
- align-items: center;
33
- justify-content: center;
34
- width: 24px;
35
- height: 24px;
36
- border: none;
37
- background: transparent;
38
- color: var(--text-dimmer);
39
- cursor: pointer;
40
- border-radius: 6px;
41
- flex-shrink: 0;
42
- padding: 0;
43
- margin-left: 4px;
44
- transition: color 0.15s, background 0.15s;
45
- }
46
-
47
- #header-left:hover #header-rename-btn { display: flex; }
48
- #header-rename-btn:hover { color: var(--text); background: rgba(var(--overlay-rgb), 0.06); }
49
- #header-rename-btn .lucide { width: 13px; height: 13px; }
50
-
51
- .header-rename-input {
52
- font-weight: 600;
53
- font-size: 15px;
54
- color: var(--text);
55
- background: var(--input-bg);
56
- border: 1px solid var(--accent);
57
- border-radius: 6px;
58
- padding: 2px 8px;
59
- font-family: inherit;
60
- outline: none;
61
- min-width: 0;
62
- flex: 1;
63
- }
64
-
65
- .status {
66
- display: flex;
67
- align-items: center;
68
- gap: 6px;
69
- font-size: 12px;
70
- color: var(--text-muted);
71
- flex-shrink: 0;
72
- }
73
-
74
- /* --- Debug menu --- */
75
- #debug-menu-wrap {
76
- position: relative;
77
- }
78
-
79
- #debug-menu-wrap.hidden { display: none; }
80
-
81
- #debug-btn {
82
- display: flex;
83
- align-items: center;
84
- justify-content: center;
85
- background: none;
86
- border: 1px solid transparent;
87
- border-radius: 8px;
88
- color: var(--error);
89
- cursor: pointer;
90
- padding: 4px;
91
- opacity: 0.6;
92
- transition: opacity 0.15s, background 0.15s, border-color 0.15s;
93
- }
94
-
95
- #debug-btn .lucide { width: 15px; height: 15px; }
96
- #debug-btn:hover { opacity: 1; background: var(--error-8); border-color: var(--error-25); }
97
- #debug-btn.active { opacity: 1; background: var(--error-12); border-color: var(--error-25); }
98
-
99
- #debug-menu {
100
- position: absolute;
101
- top: calc(100% + 6px);
102
- right: 0;
103
- background: var(--bg-alt);
104
- border: 1px solid var(--border);
105
- border-radius: 10px;
106
- padding: 8px 0;
107
- min-width: 200px;
108
- box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
109
- z-index: 200;
110
- }
111
-
112
- #debug-menu.hidden { display: none; }
113
-
114
- .status-dot {
115
- width: 7px;
116
- height: 7px;
117
- border-radius: 50%;
118
- background: var(--error);
119
- transition: background 0.3s;
120
- flex-shrink: 0;
121
- }
122
-
123
- /* --- Terminal toggle button --- */
124
- #terminal-toggle-btn {
125
- display: flex;
126
- align-items: center;
127
- justify-content: center;
128
- background: none;
129
- border: 1px solid transparent;
130
- border-radius: 8px;
131
- color: var(--text-dimmer);
132
- cursor: pointer;
133
- padding: 4px;
134
- transition: color 0.15s, background 0.15s, border-color 0.15s;
135
- }
136
- #terminal-toggle-btn .lucide { width: 15px; height: 15px; }
137
- #terminal-toggle-btn:hover { color: var(--text-secondary); background: rgba(var(--overlay-rgb),0.04); border-color: var(--border); }
138
- #terminal-toggle-btn { position: relative; }
139
- #terminal-count {
140
- position: absolute;
141
- top: -4px;
142
- right: -4px;
143
- background: var(--success);
144
- color: #fff;
145
- font-size: 9px;
146
- font-weight: 700;
147
- min-width: 14px;
148
- height: 14px;
149
- border-radius: 7px;
150
- display: inline-flex;
151
- align-items: center;
152
- justify-content: center;
153
- padding: 0 3px;
154
- font-family: "SF Mono", Menlo, Monaco, monospace;
155
- }
156
- #terminal-count.hidden { display: none; }
157
-
158
- /* --- QR code button & overlay --- */
159
- #qr-btn {
160
- display: flex;
161
- align-items: center;
162
- justify-content: center;
163
- background: none;
164
- border: 1px solid transparent;
165
- border-radius: 8px;
166
- color: var(--text-dimmer);
167
- cursor: pointer;
168
- padding: 4px;
169
- transition: color 0.15s, background 0.15s, border-color 0.15s;
170
- }
171
- #qr-btn .lucide { width: 15px; height: 15px; }
172
- #qr-btn:hover { color: var(--text-secondary); background: rgba(var(--overlay-rgb),0.04); border-color: var(--border); }
173
- #qr-btn.active { color: var(--text); background: rgba(var(--overlay-rgb),0.06); border-color: var(--border); }
174
-
175
- #qr-overlay {
176
- position: fixed;
177
- inset: 0;
178
- background: rgba(var(--shadow-rgb), 0.6);
179
- display: flex;
180
- align-items: center;
181
- justify-content: center;
182
- z-index: 500;
183
- }
184
- #qr-overlay.hidden { display: none; }
185
-
186
- #qr-overlay-inner {
187
- background: #fff;
188
- border-radius: 16px;
189
- padding: 28px;
190
- display: flex;
191
- flex-direction: column;
192
- align-items: center;
193
- gap: 14px;
194
- box-shadow: 0 8px 32px rgba(var(--shadow-rgb), 0.5);
195
- }
196
-
197
- #qr-canvas table { border-collapse: collapse; }
198
- #qr-canvas td { width: 4px; height: 4px; padding: 0; }
199
-
200
- #qr-url {
201
- font-size: 13px;
202
- color: #555;
203
- word-break: break-all;
204
- text-align: center;
205
- max-width: 260px;
206
- font-family: system-ui, sans-serif;
207
- cursor: pointer;
208
- padding: 4px 10px;
209
- border-radius: 6px;
210
- transition: background 0.15s, color 0.15s;
211
- }
212
- #qr-url:hover { background: #eee; color: #222; }
213
- #qr-url:active { background: #ddd; }
214
- #qr-url.copied { color: #16a34a; font-weight: 600; }
215
- .qr-hint {
216
- display: block;
217
- font-size: 11px;
218
- color: #999;
219
- margin-top: 2px;
220
- font-weight: 400;
221
- }
222
-
223
- /* --- Notification menu --- */
224
- #notif-menu-wrap {
225
- position: relative;
226
- }
227
-
228
- #notif-btn {
229
- display: flex;
230
- align-items: center;
231
- justify-content: center;
232
- background: none;
233
- border: 1px solid transparent;
234
- border-radius: 8px;
235
- color: var(--text-dimmer);
236
- cursor: pointer;
237
- padding: 4px;
238
- transition: color 0.15s, background 0.15s, border-color 0.15s;
239
- }
240
-
241
- #notif-btn .lucide { width: 15px; height: 15px; }
242
- #notif-btn:hover { color: var(--text-secondary); background: rgba(var(--overlay-rgb),0.04); border-color: var(--border); }
243
- #notif-btn.active { color: var(--text); background: rgba(var(--overlay-rgb),0.06); border-color: var(--border); }
244
-
245
- #notif-menu {
246
- position: absolute;
247
- top: calc(100% + 6px);
248
- right: 0;
249
- background: var(--bg-alt);
250
- border: 1px solid var(--border);
251
- border-radius: 10px;
252
- padding: 8px 0;
253
- min-width: 200px;
254
- box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
255
- z-index: 200;
256
- }
257
-
258
- #notif-menu.hidden { display: none; }
259
-
260
- .notif-option {
261
- display: flex;
262
- align-items: center;
263
- justify-content: space-between;
264
- padding: 8px 14px;
265
- font-size: 13px;
266
- color: var(--text-secondary);
267
- cursor: pointer;
268
- transition: background 0.15s;
269
- }
270
-
271
- .notif-option > span:first-child {
272
- display: flex;
273
- align-items: center;
274
- gap: 8px;
275
- }
276
-
277
- .notif-option > span:first-child .lucide {
278
- width: 14px;
279
- height: 14px;
280
- flex-shrink: 0;
281
- }
282
-
283
- .notif-option:hover { background: rgba(var(--overlay-rgb), 0.03); }
284
- .notif-option input { display: none; }
285
-
286
- #notif-blocked-hint {
287
- padding: 6px 14px;
288
- font-size: 11px;
289
- line-height: 1.5;
290
- color: var(--warning);
291
- }
292
-
293
- #notif-blocked-hint.hidden { display: none; }
294
- #notif-blocked-hint a { color: var(--accent); text-decoration: none; }
295
- #notif-blocked-hint a:hover { text-decoration: underline; }
296
-
297
- .toggle-track {
298
- width: 34px;
299
- height: 20px;
300
- background: var(--input-bg);
301
- border: 1px solid var(--border);
302
- border-radius: 10px;
303
- position: relative;
304
- transition: background 0.2s, border-color 0.2s;
305
- flex-shrink: 0;
306
- }
307
-
308
- .toggle-thumb {
309
- position: absolute;
310
- top: 2px;
311
- left: 2px;
312
- width: 14px;
313
- height: 14px;
314
- background: var(--text-dimmer);
315
- border-radius: 50%;
316
- transition: transform 0.2s, background 0.2s;
317
- }
318
-
319
- .notif-option input:checked + .toggle-track {
320
- background: var(--accent);
321
- border-color: var(--accent);
322
- }
323
-
324
- .notif-option input:checked + .toggle-track .toggle-thumb {
325
- transform: translateX(14px);
326
- background: #fff;
327
- }
328
-
329
- /* --- Notification menu items --- */
330
- .notif-divider {
331
- height: 1px;
332
- background: var(--border-subtle);
333
- margin: 4px 0;
334
- }
335
-
336
- #notif-push-row {
337
- display: none;
338
- }
339
-
340
- /* iOS Safari notification info */
341
- .notif-ios-info { cursor: default; }
342
- .notif-ios-info-btn {
343
- background: none;
344
- border: none;
345
- color: var(--text-dimmer);
346
- cursor: pointer;
347
- padding: 2px;
348
- display: flex;
349
- align-items: center;
350
- transition: color 0.15s;
351
- }
352
- .notif-ios-info-btn:hover { color: var(--text-secondary); }
353
-
354
- #notif-ios-hint {
355
- padding: 6px 14px;
356
- font-size: 11px;
357
- line-height: 1.5;
358
- color: var(--text-muted);
359
- }
360
- #notif-ios-hint .lucide { flex-shrink: 0; }
361
- #notif-ios-hint strong { color: var(--text-secondary); }
362
- #notif-ios-hint.hidden { display: none; }
363
-
364
- .notif-action {
365
- display: flex;
366
- align-items: center;
367
- gap: 8px;
368
- width: 100%;
369
- padding: 8px 14px;
370
- font-size: 13px;
371
- color: var(--text-secondary);
372
- background: none;
373
- border: none;
374
- font-family: inherit;
375
- cursor: pointer;
376
- transition: background 0.15s;
377
- }
378
-
379
- .notif-action:hover { background: rgba(var(--overlay-rgb), 0.03); }
380
- .notif-action .lucide { flex-shrink: 0; }
381
-
382
- .notif-action.copied { color: var(--success); }
383
-
384
- #client-count {
385
- background: var(--accent);
386
- color: #fff;
387
- font-size: 10px;
388
- font-weight: 600;
389
- min-width: 18px;
390
- height: 18px;
391
- border-radius: 9px;
392
- display: inline-flex;
393
- align-items: center;
394
- justify-content: center;
395
- padding: 0 5px;
396
- }
397
-
398
- #client-count.hidden { display: none; }
399
- #client-count { cursor: pointer; }
400
-
401
- .tooltip {
402
- position: fixed;
403
- background: var(--code-bg);
404
- border: 1px solid var(--border);
405
- border-radius: 8px;
406
- padding: 6px 12px;
407
- font-size: 12px;
408
- color: var(--text-secondary);
409
- white-space: nowrap;
410
- pointer-events: none;
411
- opacity: 0;
412
- transition: opacity 0.15s;
413
- z-index: 200;
414
- }
415
-
416
- .tooltip.visible { opacity: 1; }
417
-
418
- /* --- Model selector (inline in input bottom bar) --- */
419
- #model-menu-wrap {
420
- position: relative;
421
- }
422
-
423
- #model-menu-wrap.hidden { display: none; }
424
-
425
- #model-btn {
426
- display: inline-flex;
427
- align-items: center;
428
- gap: 2px;
429
- height: 36px;
430
- padding: 0 8px;
431
- border-radius: 10px;
432
- border: none;
433
- background: none;
434
- color: var(--text-muted);
435
- font-family: inherit;
436
- font-size: 12px;
437
- font-weight: 500;
438
- cursor: pointer;
439
- transition: color 0.15s, background 0.15s;
440
- white-space: nowrap;
441
- }
442
-
443
- #model-btn .lucide { width: 10px; height: 10px; }
444
- #model-btn:hover { color: var(--text-secondary); background: rgba(var(--overlay-rgb),0.06); }
445
- #model-btn.active { color: var(--text-secondary); background: rgba(var(--overlay-rgb),0.06); }
446
-
447
- #model-menu {
448
- position: absolute;
449
- bottom: calc(100% + 4px);
450
- right: 0;
451
- background: var(--bg-alt);
452
- border: 1px solid var(--border);
453
- border-radius: 12px;
454
- padding: 4px 0;
455
- min-width: 200px;
456
- box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
457
- z-index: 200;
458
- }
459
-
460
- #model-menu.hidden { display: none; }
461
-
462
- .model-menu-item {
463
- display: flex;
464
- align-items: center;
465
- gap: 8px;
466
- width: 100%;
467
- padding: 8px 14px;
468
- border: none;
469
- background: none;
470
- color: var(--text-secondary);
471
- font-family: inherit;
472
- font-size: 13px;
473
- cursor: pointer;
474
- transition: background 0.15s, color 0.15s;
475
- white-space: nowrap;
476
- }
477
-
478
- .model-menu-item:hover { background: rgba(var(--overlay-rgb),0.05); color: var(--text); }
479
- .model-menu-item.active { color: var(--accent); font-weight: 600; }
480
-
481
- /* --- Info panels container --- */
482
- #info-panels {
483
- position: fixed;
484
- top: 80px;
485
- right: 16px;
486
- width: 280px;
487
- max-height: calc(100vh - 160px);
488
- overflow-y: auto;
489
- z-index: 50;
490
- display: flex;
491
- flex-direction: column;
492
- gap: 8px;
493
- pointer-events: none;
494
- }
495
-
496
- #info-panels:empty { display: none; }
497
-
498
- /* --- Usage panel --- */
499
- #usage-panel, #status-panel, #context-panel {
500
- background: var(--bg-alt);
501
- border: 1px solid var(--border);
502
- border-radius: 12px;
503
- box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.3);
504
- font-size: 12px;
505
- pointer-events: auto;
506
- }
507
-
508
- #usage-panel.hidden, #status-panel.hidden, #context-panel.hidden { display: none; }
509
-
510
- .usage-panel-header {
511
- display: flex;
512
- align-items: center;
513
- justify-content: space-between;
514
- padding: 10px 14px;
515
- border-bottom: 1px solid var(--border-subtle);
516
- font-weight: 600;
517
- font-size: 13px;
518
- color: var(--text);
519
- }
520
-
521
- .usage-panel-actions {
522
- display: flex;
523
- gap: 2px;
524
- }
525
-
526
- .usage-panel-header button {
527
- display: flex;
528
- align-items: center;
529
- justify-content: center;
530
- background: none;
531
- border: none;
532
- color: var(--text-muted);
533
- cursor: pointer;
534
- padding: 2px;
535
- border-radius: 4px;
536
- }
537
-
538
- .usage-panel-header button:hover { color: var(--text); background: rgba(var(--overlay-rgb),0.06); }
539
- .usage-panel-header button .lucide { width: 14px; height: 14px; }
540
-
541
- .usage-panel-body {
542
- padding: 8px 14px 12px;
543
- }
544
-
545
- /* --- Plan usage link --- */
546
- .usage-external-link {
547
- display: flex;
548
- align-items: center;
549
- justify-content: center;
550
- gap: 6px;
551
- padding: 8px 12px;
552
- border-radius: 6px;
553
- border: 1px solid var(--border-subtle);
554
- background: var(--input-bg);
555
- color: var(--text-secondary);
556
- font-size: 12px;
557
- text-decoration: none;
558
- transition: background 0.15s, color 0.15s;
559
- }
560
- .usage-external-link:hover {
561
- background: var(--hover-bg);
562
- color: var(--text-primary);
563
- }
564
- .usage-external-link svg {
565
- width: 13px;
566
- height: 13px;
567
- flex-shrink: 0;
568
- }
569
-
570
- .usage-divider {
571
- height: 1px;
572
- background: var(--border-subtle);
573
- margin: 8px 0;
574
- }
575
-
576
- .usage-section-label {
577
- font-size: 10px;
578
- font-weight: 600;
579
- color: var(--text-muted);
580
- text-transform: uppercase;
581
- letter-spacing: 0.05em;
582
- margin-bottom: 4px;
583
- }
584
-
585
- .usage-row {
586
- display: flex;
587
- justify-content: space-between;
588
- padding: 3px 0;
589
- color: var(--text-secondary);
590
- }
591
-
592
- .usage-label {
593
- color: var(--text-muted);
594
- }
595
-
596
- .usage-value {
597
- font-family: "SF Mono", Menlo, Monaco, monospace;
598
- font-weight: 500;
599
- }
600
-
601
- /* --- Context bar --- */
602
- .context-bar-wrap {
603
- display: flex;
604
- align-items: center;
605
- gap: 8px;
606
- margin: 6px 0 8px;
607
- }
608
- .context-bar {
609
- flex: 1;
610
- height: 6px;
611
- background: var(--border);
612
- border-radius: 3px;
613
- overflow: hidden;
614
- }
615
- .context-bar-fill {
616
- height: 100%;
617
- width: 0%;
618
- background: var(--success);
619
- border-radius: 3px;
620
- transition: width 0.3s ease, background 0.3s ease;
621
- }
622
- .context-bar-fill.warn { background: var(--warning); }
623
- .context-bar-fill.danger { background: var(--error); }
624
- .context-bar-pct {
625
- font-family: "SF Mono", Menlo, Monaco, monospace;
626
- font-size: 11px;
627
- font-weight: 600;
628
- color: var(--text-secondary);
629
- min-width: 32px;
630
- text-align: right;
631
- }
632
-
633
- /* --- Context mini bar (in input area) --- */
634
- #context-mini {
635
- display: flex;
636
- align-items: center;
637
- gap: 8px;
638
- padding: 6px 14px 2px;
639
- cursor: pointer;
640
- transition: opacity 0.15s;
641
- }
642
- #context-mini:hover { opacity: 0.8; }
643
- #context-mini.hidden { display: none; }
644
- .context-mini-bar {
645
- flex: 1;
646
- height: 4px;
647
- background: var(--border);
648
- border-radius: 2px;
649
- overflow: hidden;
650
- }
651
- .context-mini-fill {
652
- height: 100%;
653
- width: 0%;
654
- border-radius: 2px;
655
- background: var(--success);
656
- transition: width 0.3s ease, background 0.3s ease;
657
- }
658
- .context-mini-fill.warn { background: var(--warning); }
659
- .context-mini-fill.danger { background: var(--error); }
660
- .context-mini-label {
661
- font-family: "SF Mono", Menlo, Monaco, monospace;
662
- font-size: 10px;
663
- font-weight: 600;
664
- color: var(--text-dimmer);
665
- min-width: 24px;
666
- text-align: right;
667
- }
668
-
669
- @media (max-width: 768px) {
670
- #info-panels {
671
- top: auto;
672
- bottom: calc(var(--safe-bottom, 0px) + 64px);
673
- right: 12px;
674
- left: 12px;
675
- width: auto;
676
- max-height: 60vh;
677
- }
678
- }
679
-
680
- .status-dot.connected { background: var(--success); }
681
- .status-dot.processing { background: var(--success); }
682
- .status-dot.io { opacity: 0.15; }
683
-