@poncho-ai/cli 0.14.1 → 0.16.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.
@@ -0,0 +1,1340 @@
1
+ export const WEB_UI_STYLES = `
2
+ :root {
3
+ color-scheme: light dark;
4
+
5
+ --bg: #000;
6
+ --bg-alt: #0a0a0a;
7
+ --bg-elevated: #111;
8
+
9
+ --fg: #ededed;
10
+ --fg-strong: #fff;
11
+ --fg-2: #888;
12
+ --fg-3: #999;
13
+ --fg-4: #777;
14
+ --fg-5: #666;
15
+ --fg-6: #555;
16
+ --fg-7: #444;
17
+ --fg-8: #333;
18
+
19
+ --fg-tool: #8a8a8a;
20
+ --fg-tool-code: #bcbcbc;
21
+ --fg-tool-item: #d6d6d6;
22
+ --fg-approval-label: #b0b0b0;
23
+ --fg-approval-input: #cfcfcf;
24
+ --fg-approval-btn: #f0f0f0;
25
+
26
+ --accent: #ededed;
27
+ --accent-fg: #000;
28
+ --accent-hover: #fff;
29
+
30
+ --stop-bg: #4a4a4a;
31
+ --stop-fg: #fff;
32
+ --stop-hover: #565656;
33
+
34
+ --border-1: rgba(255,255,255,0.06);
35
+ --border-2: rgba(255,255,255,0.08);
36
+ --border-3: rgba(255,255,255,0.1);
37
+ --border-4: rgba(255,255,255,0.12);
38
+ --border-5: rgba(255,255,255,0.18);
39
+ --border-focus: rgba(255,255,255,0.2);
40
+ --border-hover: rgba(255,255,255,0.25);
41
+ --border-drag: rgba(255,255,255,0.4);
42
+
43
+ --surface-1: rgba(255,255,255,0.02);
44
+ --surface-2: rgba(255,255,255,0.03);
45
+ --surface-3: rgba(255,255,255,0.04);
46
+ --surface-4: rgba(255,255,255,0.06);
47
+ --surface-5: rgba(255,255,255,0.08);
48
+ --surface-6: rgba(255,255,255,0.1);
49
+ --surface-7: rgba(255,255,255,0.12);
50
+ --surface-8: rgba(255,255,255,0.14);
51
+
52
+ --chip-bg: rgba(0,0,0,0.6);
53
+ --chip-bg-hover: rgba(0,0,0,0.75);
54
+ --backdrop: rgba(0,0,0,0.6);
55
+ --lightbox-bg: rgba(0,0,0,0.85);
56
+ --inset-1: rgba(0,0,0,0.16);
57
+ --inset-2: rgba(0,0,0,0.25);
58
+
59
+ --file-badge-bg: rgba(0,0,0,0.2);
60
+ --file-badge-fg: rgba(255,255,255,0.8);
61
+
62
+ --error: #ff4444;
63
+ --error-soft: #ff6b6b;
64
+ --error-alt: #ff6666;
65
+ --error-bg: rgba(255,68,68,0.08);
66
+ --error-border: rgba(255,68,68,0.25);
67
+
68
+ --tool-done: #6a9955;
69
+ --tool-error: #f48771;
70
+
71
+ --warning: #e8a735;
72
+
73
+ --approve: #78e7a6;
74
+ --approve-border: rgba(58,208,122,0.45);
75
+ --deny: #f59b9b;
76
+ --deny-border: rgba(224,95,95,0.45);
77
+
78
+ --scrollbar: rgba(255,255,255,0.1);
79
+ --scrollbar-hover: rgba(255,255,255,0.16);
80
+ }
81
+
82
+ @media (prefers-color-scheme: light) {
83
+ :root {
84
+ --bg: #ffffff;
85
+ --bg-alt: #f5f5f5;
86
+ --bg-elevated: #e8e8e8;
87
+
88
+ --fg: #1a1a1a;
89
+ --fg-strong: #000;
90
+ --fg-2: #666;
91
+ --fg-3: #555;
92
+ --fg-4: #777;
93
+ --fg-5: #888;
94
+ --fg-6: #888;
95
+ --fg-7: #aaa;
96
+ --fg-8: #bbb;
97
+
98
+ --fg-tool: #666;
99
+ --fg-tool-code: #444;
100
+ --fg-tool-item: #333;
101
+ --fg-approval-label: #666;
102
+ --fg-approval-input: #444;
103
+ --fg-approval-btn: #1a1a1a;
104
+
105
+ --accent: #1a1a1a;
106
+ --accent-fg: #fff;
107
+ --accent-hover: #000;
108
+
109
+ --stop-bg: #d4d4d4;
110
+ --stop-fg: #333;
111
+ --stop-hover: #c4c4c4;
112
+
113
+ --border-1: rgba(0,0,0,0.06);
114
+ --border-2: rgba(0,0,0,0.08);
115
+ --border-3: rgba(0,0,0,0.1);
116
+ --border-4: rgba(0,0,0,0.1);
117
+ --border-5: rgba(0,0,0,0.15);
118
+ --border-focus: rgba(0,0,0,0.2);
119
+ --border-hover: rgba(0,0,0,0.2);
120
+ --border-drag: rgba(0,0,0,0.3);
121
+
122
+ --surface-1: rgba(0,0,0,0.02);
123
+ --surface-2: rgba(0,0,0,0.03);
124
+ --surface-3: rgba(0,0,0,0.03);
125
+ --surface-4: rgba(0,0,0,0.04);
126
+ --surface-5: rgba(0,0,0,0.05);
127
+ --surface-6: rgba(0,0,0,0.07);
128
+ --surface-7: rgba(0,0,0,0.08);
129
+ --surface-8: rgba(0,0,0,0.1);
130
+
131
+ --chip-bg: rgba(255,255,255,0.8);
132
+ --chip-bg-hover: rgba(255,255,255,0.9);
133
+ --backdrop: rgba(0,0,0,0.3);
134
+ --lightbox-bg: rgba(0,0,0,0.75);
135
+ --inset-1: rgba(0,0,0,0.04);
136
+ --inset-2: rgba(0,0,0,0.06);
137
+
138
+ --file-badge-bg: rgba(0,0,0,0.05);
139
+ --file-badge-fg: rgba(0,0,0,0.7);
140
+
141
+ --error: #dc2626;
142
+ --error-soft: #ef4444;
143
+ --error-alt: #ef4444;
144
+ --error-bg: rgba(220,38,38,0.06);
145
+ --error-border: rgba(220,38,38,0.2);
146
+
147
+ --tool-done: #16a34a;
148
+ --tool-error: #dc2626;
149
+
150
+ --warning: #ca8a04;
151
+
152
+ --approve: #16a34a;
153
+ --approve-border: rgba(22,163,74,0.35);
154
+ --deny: #dc2626;
155
+ --deny-border: rgba(220,38,38,0.3);
156
+
157
+ --scrollbar: rgba(0,0,0,0.12);
158
+ --scrollbar-hover: rgba(0,0,0,0.2);
159
+ }
160
+ }
161
+
162
+ * { box-sizing: border-box; margin: 0; padding: 0; }
163
+ html, body { height: 100vh; overflow: hidden; overscroll-behavior: none; touch-action: pan-y; }
164
+ body {
165
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Helvetica Neue", sans-serif;
166
+ background: var(--bg);
167
+ color: var(--fg);
168
+ font-size: 14px;
169
+ line-height: 1.5;
170
+ -webkit-font-smoothing: antialiased;
171
+ -moz-osx-font-smoothing: grayscale;
172
+ }
173
+ button, input, textarea { font: inherit; color: inherit; }
174
+ .hidden { display: none !important; }
175
+ a { color: var(--fg); }
176
+
177
+ /* Auth */
178
+ .auth {
179
+ min-height: 100vh;
180
+ display: grid;
181
+ place-items: center;
182
+ padding: 20px;
183
+ background: var(--bg);
184
+ }
185
+ .auth-card {
186
+ width: min(400px, 90vw);
187
+ }
188
+ .auth-shell {
189
+ background: var(--bg-alt);
190
+ border: 1px solid var(--border-3);
191
+ border-radius: 9999px;
192
+ display: flex;
193
+ align-items: center;
194
+ padding: 4px 6px 4px 18px;
195
+ transition: border-color 0.15s;
196
+ }
197
+ .auth-shell:focus-within { border-color: var(--border-focus); }
198
+ .auth-input {
199
+ flex: 1;
200
+ background: transparent;
201
+ border: 0;
202
+ outline: none;
203
+ color: var(--fg);
204
+ padding: 10px 0 8px;
205
+ font-size: 14px;
206
+ margin-top: -2px;
207
+ }
208
+ .auth-input::placeholder { color: var(--fg-7); }
209
+ .auth-submit {
210
+ width: 32px;
211
+ height: 32px;
212
+ background: var(--accent);
213
+ border: 0;
214
+ border-radius: 50%;
215
+ color: var(--accent-fg);
216
+ cursor: pointer;
217
+ display: grid;
218
+ place-items: center;
219
+ flex-shrink: 0;
220
+ margin-bottom: 2px;
221
+ transition: background 0.15s;
222
+ }
223
+ .auth-submit:hover { background: var(--accent-hover); }
224
+ .error { color: var(--error); font-size: 13px; min-height: 16px; }
225
+ .message-error {
226
+ background: var(--error-bg);
227
+ border: 1px solid var(--error-border);
228
+ border-radius: 10px;
229
+ color: var(--error-soft);
230
+ padding: 12px 16px;
231
+ font-size: 13px;
232
+ line-height: 1.5;
233
+ max-width: 600px;
234
+ }
235
+ .message-error strong { color: var(--error); }
236
+
237
+ /* Layout - use fixed positioning with explicit dimensions */
238
+ .shell {
239
+ position: fixed;
240
+ top: 0;
241
+ left: 0;
242
+ width: 100vw;
243
+ height: 100vh;
244
+ height: 100dvh; /* Dynamic viewport height for normal browsers */
245
+ display: flex;
246
+ overflow: hidden;
247
+ }
248
+ /* PWA standalone mode: use 100vh which works correctly */
249
+ @media (display-mode: standalone) {
250
+ .shell {
251
+ height: 100vh;
252
+ }
253
+ }
254
+
255
+ /* Edge swipe blocker - invisible touch target to intercept right edge gestures */
256
+ .edge-blocker-right {
257
+ position: fixed;
258
+ top: 0;
259
+ bottom: 0;
260
+ right: 0;
261
+ width: 20px;
262
+ z-index: 9999;
263
+ touch-action: none;
264
+ }
265
+ .sidebar {
266
+ width: 260px;
267
+ background: var(--bg);
268
+ border-right: 1px solid var(--border-1);
269
+ display: flex;
270
+ flex-direction: column;
271
+ padding: 12px 8px;
272
+ }
273
+ .new-chat-btn {
274
+ background: transparent;
275
+ border: 0;
276
+ color: var(--fg-2);
277
+ border-radius: 12px;
278
+ height: 36px;
279
+ padding: 0 10px;
280
+ display: flex;
281
+ align-items: center;
282
+ gap: 8px;
283
+ font-size: 13px;
284
+ cursor: pointer;
285
+ transition: background 0.15s, color 0.15s;
286
+ }
287
+ .new-chat-btn:hover { color: var(--fg); }
288
+ .new-chat-btn svg { width: 16px; height: 16px; }
289
+ .conversation-list {
290
+ flex: 1;
291
+ overflow-y: auto;
292
+ margin-top: 12px;
293
+ display: flex;
294
+ flex-direction: column;
295
+ gap: 2px;
296
+ }
297
+ .sidebar-section-label {
298
+ font-size: 11px;
299
+ font-weight: 600;
300
+ color: var(--fg-7);
301
+ text-transform: uppercase;
302
+ letter-spacing: 0.04em;
303
+ padding: 10px 10px 4px;
304
+ }
305
+ .sidebar-section-label:first-child { padding-top: 4px; }
306
+ .sidebar-section-divider {
307
+ height: 1px;
308
+ background: var(--border);
309
+ margin: 6px 10px;
310
+ }
311
+ .conversation-item {
312
+ height: 36px;
313
+ min-height: 36px;
314
+ max-height: 36px;
315
+ flex-shrink: 0;
316
+ padding: 0 16px 0 10px;
317
+ border-radius: 12px;
318
+ cursor: pointer;
319
+ font-size: 13px;
320
+ line-height: 36px;
321
+ color: var(--fg-6);
322
+ white-space: nowrap;
323
+ overflow: hidden;
324
+ text-overflow: ellipsis;
325
+ position: relative;
326
+ transition: color 0.15s;
327
+ }
328
+ .conversation-item .approval-dot {
329
+ display: inline-block;
330
+ width: 6px;
331
+ height: 6px;
332
+ border-radius: 50%;
333
+ background: var(--warning, #e8a735);
334
+ margin-right: 6px;
335
+ flex-shrink: 0;
336
+ vertical-align: middle;
337
+ }
338
+ .conversation-item:hover { color: var(--fg-3); }
339
+ .conversation-item.active {
340
+ color: var(--fg);
341
+ }
342
+ .conversation-item .delete-btn {
343
+ position: absolute;
344
+ right: 0;
345
+ top: 0;
346
+ bottom: 0;
347
+ opacity: 0;
348
+ background: var(--bg);
349
+ border: 0;
350
+ color: var(--fg-7);
351
+ padding: 0 8px;
352
+ border-radius: 0 4px 4px 0;
353
+ cursor: pointer;
354
+ font-size: 16px;
355
+ line-height: 1;
356
+ display: grid;
357
+ place-items: center;
358
+ transition: opacity 0.15s, color 0.15s;
359
+ }
360
+ .conversation-item:hover .delete-btn { opacity: 1; }
361
+ .conversation-item.active .delete-btn { background: var(--bg); }
362
+ .conversation-item .delete-btn::before {
363
+ content: "";
364
+ position: absolute;
365
+ right: 100%;
366
+ top: 0;
367
+ bottom: 0;
368
+ width: 24px;
369
+ background: linear-gradient(to right, transparent, var(--bg));
370
+ pointer-events: none;
371
+ }
372
+ .conversation-item.active .delete-btn::before {
373
+ background: linear-gradient(to right, transparent, var(--bg));
374
+ }
375
+ .conversation-item .delete-btn:hover { color: var(--fg-2); }
376
+ .conversation-item .delete-btn.confirming {
377
+ opacity: 1;
378
+ width: auto;
379
+ padding: 0 8px;
380
+ font-size: 11px;
381
+ color: var(--error);
382
+ border-radius: 3px;
383
+ }
384
+ .conversation-item .delete-btn.confirming:hover {
385
+ color: var(--error-alt);
386
+ }
387
+ .sidebar-footer {
388
+ margin-top: auto;
389
+ padding-top: 8px;
390
+ }
391
+ .logout-btn {
392
+ background: transparent;
393
+ border: 0;
394
+ color: var(--fg-6);
395
+ width: 100%;
396
+ padding: 8px 10px;
397
+ text-align: left;
398
+ border-radius: 6px;
399
+ cursor: pointer;
400
+ font-size: 13px;
401
+ transition: color 0.15s, background 0.15s;
402
+ }
403
+ .logout-btn:hover { color: var(--fg-2); }
404
+
405
+ /* Main */
406
+ .main { flex: 1; display: flex; flex-direction: column; min-width: 0; max-width: 100%; background: var(--bg); overflow: hidden; }
407
+ .main-body { flex: 1; display: flex; min-height: 0; overflow: hidden; }
408
+ .main-chat { flex: 1; display: flex; flex-direction: column; min-width: 0; overflow: hidden; }
409
+ .topbar {
410
+ height: calc(52px + env(safe-area-inset-top, 0px));
411
+ padding-top: env(safe-area-inset-top, 0px);
412
+ display: flex;
413
+ align-items: center;
414
+ justify-content: center;
415
+ font-size: 13px;
416
+ font-weight: 500;
417
+ color: var(--fg-2);
418
+ border-bottom: 1px solid var(--border-1);
419
+ position: relative;
420
+ flex-shrink: 0;
421
+ }
422
+ .topbar-title {
423
+ max-width: calc(100% - 100px);
424
+ overflow: hidden;
425
+ text-overflow: ellipsis;
426
+ white-space: nowrap;
427
+ letter-spacing: -0.01em;
428
+ padding: 0 50px;
429
+ cursor: default;
430
+ }
431
+ .topbar-title-input {
432
+ font: inherit;
433
+ font-weight: inherit;
434
+ letter-spacing: inherit;
435
+ color: inherit;
436
+ background: var(--bg-2);
437
+ border: none;
438
+ border-radius: 4px;
439
+ padding: 2px 6px;
440
+ margin: -3px 0;
441
+ max-width: 100%;
442
+ outline: none;
443
+ box-sizing: border-box;
444
+ text-align: center;
445
+ }
446
+ .sidebar-toggle {
447
+ display: none;
448
+ position: absolute;
449
+ left: 12px;
450
+ bottom: 4px; /* Position from bottom of topbar content area */
451
+ background: transparent;
452
+ border: 0;
453
+ color: var(--fg-5);
454
+ width: 44px;
455
+ height: 44px;
456
+ border-radius: 6px;
457
+ cursor: pointer;
458
+ transition: color 0.15s, background 0.15s;
459
+ font-size: 18px;
460
+ z-index: 10;
461
+ -webkit-tap-highlight-color: transparent;
462
+ }
463
+ .sidebar-toggle:hover { color: var(--fg); }
464
+ .topbar-new-chat {
465
+ display: none;
466
+ position: absolute;
467
+ right: 12px;
468
+ bottom: 4px;
469
+ background: transparent;
470
+ border: 0;
471
+ color: var(--fg-5);
472
+ width: 44px;
473
+ height: 44px;
474
+ border-radius: 6px;
475
+ cursor: pointer;
476
+ transition: color 0.15s, background 0.15s;
477
+ z-index: 10;
478
+ -webkit-tap-highlight-color: transparent;
479
+ }
480
+ .topbar-new-chat:hover { color: var(--fg); }
481
+ .topbar-new-chat svg { width: 16px; height: 16px; }
482
+
483
+ /* Messages */
484
+ .messages { flex: 1; overflow-y: auto; overflow-x: hidden; padding: 24px 24px; }
485
+ .messages-column { max-width: 680px; margin: 0 auto; }
486
+ .message-row { margin-bottom: 24px; display: flex; max-width: 100%; }
487
+ .message-row.user { justify-content: flex-end; }
488
+ .assistant-wrap { display: flex; gap: 12px; max-width: 100%; min-width: 0; }
489
+ .assistant-avatar {
490
+ width: 24px;
491
+ height: 24px;
492
+ background: var(--accent);
493
+ color: var(--accent-fg);
494
+ border-radius: 6px;
495
+ display: grid;
496
+ place-items: center;
497
+ font-size: 11px;
498
+ font-weight: 600;
499
+ flex-shrink: 0;
500
+ margin-top: 2px;
501
+ }
502
+ .assistant-content {
503
+ line-height: 1.65;
504
+ color: var(--fg);
505
+ font-size: 14px;
506
+ min-width: 0;
507
+ max-width: 100%;
508
+ overflow-wrap: break-word;
509
+ word-break: break-word;
510
+ margin-top: 2px;
511
+ }
512
+ .assistant-content p { margin: 0 0 12px; }
513
+ .assistant-content p:last-child { margin-bottom: 0; }
514
+ .assistant-content ul, .assistant-content ol { margin: 8px 0; padding-left: 20px; }
515
+ .assistant-content li { margin: 4px 0; }
516
+ .assistant-content strong { font-weight: 600; color: var(--fg-strong); }
517
+ .assistant-content h2 {
518
+ font-size: 16px;
519
+ font-weight: 600;
520
+ letter-spacing: -0.02em;
521
+ margin: 20px 0 8px;
522
+ color: var(--fg-strong);
523
+ }
524
+ .assistant-content h3 {
525
+ font-size: 14px;
526
+ font-weight: 600;
527
+ letter-spacing: -0.01em;
528
+ margin: 16px 0 6px;
529
+ color: var(--fg-strong);
530
+ }
531
+ .assistant-content code {
532
+ background: var(--surface-4);
533
+ border: 1px solid var(--border-1);
534
+ padding: 2px 5px;
535
+ border-radius: 4px;
536
+ font-family: ui-monospace, "SF Mono", "Fira Code", monospace;
537
+ font-size: 0.88em;
538
+ }
539
+ .assistant-content pre {
540
+ background: var(--bg-alt);
541
+ border: 1px solid var(--border-1);
542
+ padding: 14px 16px;
543
+ border-radius: 8px;
544
+ overflow-x: auto;
545
+ margin: 14px 0;
546
+ }
547
+ .assistant-content pre code {
548
+ background: none;
549
+ border: 0;
550
+ padding: 0;
551
+ font-size: 13px;
552
+ line-height: 1.5;
553
+ }
554
+ .tool-activity-inline {
555
+ margin: 8px 0;
556
+ font-size: 12px;
557
+ line-height: 1.45;
558
+ color: var(--fg-tool);
559
+ }
560
+ .tool-activity-inline code {
561
+ font-family: ui-monospace, "SF Mono", "Fira Code", monospace;
562
+ background: var(--surface-3);
563
+ border: 1px solid var(--border-2);
564
+ padding: 4px 8px;
565
+ border-radius: 6px;
566
+ color: var(--fg-tool-code);
567
+ font-size: 11px;
568
+ }
569
+ .tool-status {
570
+ color: var(--fg-tool);
571
+ font-style: italic;
572
+ }
573
+ .tool-done {
574
+ color: var(--tool-done);
575
+ }
576
+ .tool-error {
577
+ color: var(--tool-error);
578
+ }
579
+ .assistant-content table:not(.approval-request-table) {
580
+ border-collapse: collapse;
581
+ width: 100%;
582
+ margin: 14px 0;
583
+ font-size: 13px;
584
+ border: 1px solid var(--border-2);
585
+ border-radius: 8px;
586
+ overflow: hidden;
587
+ display: block;
588
+ max-width: 100%;
589
+ overflow-x: auto;
590
+ white-space: nowrap;
591
+ }
592
+ .assistant-content table:not(.approval-request-table) th {
593
+ background: var(--surface-4);
594
+ padding: 10px 12px;
595
+ text-align: left;
596
+ font-weight: 600;
597
+ border-bottom: 1px solid var(--border-4);
598
+ color: var(--fg-strong);
599
+ min-width: 100px;
600
+ }
601
+ .assistant-content table:not(.approval-request-table) td {
602
+ padding: 10px 12px;
603
+ border-bottom: 1px solid var(--border-1);
604
+ width: 100%;
605
+ min-width: 100px;
606
+ }
607
+ .assistant-content table:not(.approval-request-table) tr:last-child td {
608
+ border-bottom: none;
609
+ }
610
+ .assistant-content table:not(.approval-request-table) tbody tr:hover {
611
+ background: var(--surface-1);
612
+ }
613
+ .assistant-content hr {
614
+ border: 0;
615
+ border-top: 1px solid var(--border-3);
616
+ margin: 20px 0;
617
+ }
618
+ .tool-activity {
619
+ margin-top: 12px;
620
+ margin-bottom: 12px;
621
+ border: 1px solid var(--border-2);
622
+ background: var(--surface-2);
623
+ border-radius: 10px;
624
+ font-size: 12px;
625
+ line-height: 1.45;
626
+ color: var(--fg-tool-code);
627
+ width: 300px;
628
+ transition: width 0.2s ease;
629
+ }
630
+ .tool-activity.has-approvals {
631
+ width: 100%;
632
+ }
633
+ .assistant-content > .tool-activity:first-child {
634
+ margin-top: 0;
635
+ }
636
+ .tool-activity-disclosure {
637
+ display: block;
638
+ }
639
+ .tool-activity-summary {
640
+ list-style: none;
641
+ display: flex;
642
+ align-items: center;
643
+ gap: 8px;
644
+ cursor: pointer;
645
+ padding: 10px 12px;
646
+ user-select: none;
647
+ }
648
+ .tool-activity-summary::-webkit-details-marker {
649
+ display: none;
650
+ }
651
+ .tool-activity-label {
652
+ font-size: 11px;
653
+ text-transform: uppercase;
654
+ letter-spacing: 0.06em;
655
+ color: var(--fg-tool);
656
+ font-weight: 600;
657
+ }
658
+ .tool-activity-caret {
659
+ margin-left: auto;
660
+ color: var(--fg-tool);
661
+ display: inline-flex;
662
+ align-items: center;
663
+ justify-content: center;
664
+ transition: transform 120ms ease;
665
+ transform: rotate(0deg);
666
+ }
667
+ .tool-activity-caret svg {
668
+ width: 14px;
669
+ height: 14px;
670
+ display: block;
671
+ }
672
+ .tool-activity-disclosure[open] .tool-activity-caret {
673
+ transform: rotate(90deg);
674
+ }
675
+ .tool-activity-list {
676
+ display: grid;
677
+ gap: 6px;
678
+ padding: 0 12px 10px;
679
+ }
680
+ .tool-activity-item {
681
+ font-family: ui-monospace, "SF Mono", "Fira Code", monospace;
682
+ background: var(--surface-3);
683
+ border-radius: 6px;
684
+ padding: 4px 7px;
685
+ color: var(--fg-tool-item);
686
+ }
687
+ .tool-images {
688
+ padding: 10px 12px 4px;
689
+ display: flex;
690
+ flex-wrap: wrap;
691
+ gap: 8px;
692
+ }
693
+ .tool-screenshot {
694
+ max-width: 100%;
695
+ border-radius: 6px;
696
+ border: 1px solid var(--border-2);
697
+ cursor: pointer;
698
+ }
699
+ .approval-requests {
700
+ border-top: 1px solid var(--border-2);
701
+ padding: 10px 12px 12px;
702
+ display: grid;
703
+ gap: 10px;
704
+ }
705
+ .approval-requests-label {
706
+ font-size: 12px;
707
+ text-transform: uppercase;
708
+ letter-spacing: 0.06em;
709
+ color: var(--fg-approval-label);
710
+ font-weight: 600;
711
+ }
712
+ .approval-requests-label code {
713
+ font-family: ui-monospace, "SF Mono", "Fira Code", monospace;
714
+ text-transform: none;
715
+ letter-spacing: 0;
716
+ color: var(--fg-strong);
717
+ }
718
+ .approval-request-item {
719
+ display: grid;
720
+ gap: 8px;
721
+ }
722
+ .approval-request-table {
723
+ width: 100%;
724
+ border-collapse: collapse;
725
+ border: none;
726
+ font-size: 14px;
727
+ line-height: 1.5;
728
+ }
729
+ .approval-request-table tr,
730
+ .approval-request-table td {
731
+ border: none;
732
+ background: none;
733
+ }
734
+ .approval-request-table td {
735
+ padding: 4px 0;
736
+ vertical-align: top;
737
+ }
738
+ .approval-request-table .ak {
739
+ font-weight: 600;
740
+ color: var(--fg-approval-label);
741
+ white-space: nowrap;
742
+ width: 1%;
743
+ padding-right: 20px;
744
+ }
745
+ .approval-request-table .av,
746
+ .approval-request-table .av-complex {
747
+ color: var(--fg);
748
+ overflow-wrap: anywhere;
749
+ white-space: pre-wrap;
750
+ max-height: 200px;
751
+ overflow-y: auto;
752
+ display: block;
753
+ }
754
+ .approval-request-table .av-complex {
755
+ font-family: ui-monospace, "SF Mono", "Fira Code", monospace;
756
+ font-size: 12px;
757
+ }
758
+ .approval-request-actions {
759
+ display: flex;
760
+ gap: 6px;
761
+ }
762
+ .approval-action-btn {
763
+ border-radius: 6px;
764
+ border: 1px solid var(--border-5);
765
+ background: var(--surface-4);
766
+ color: var(--fg-approval-btn);
767
+ font-size: 11px;
768
+ font-weight: 600;
769
+ padding: 4px 8px;
770
+ cursor: pointer;
771
+ }
772
+ .approval-action-btn:hover {
773
+ background: var(--surface-7);
774
+ }
775
+ .approval-action-btn.approve {
776
+ border-color: var(--approve-border);
777
+ color: var(--approve);
778
+ }
779
+ .approval-action-btn.deny {
780
+ border-color: var(--deny-border);
781
+ color: var(--deny);
782
+ }
783
+ .approval-action-btn[disabled] {
784
+ opacity: 0.55;
785
+ cursor: not-allowed;
786
+ }
787
+ .user-bubble {
788
+ background: var(--bg-elevated);
789
+ border: 1px solid var(--border-2);
790
+ padding: 10px 16px;
791
+ border-radius: 18px;
792
+ max-width: 70%;
793
+ font-size: 14px;
794
+ line-height: 1.5;
795
+ overflow-wrap: break-word;
796
+ word-break: break-word;
797
+ white-space: pre-wrap;
798
+ }
799
+ .empty-state {
800
+ display: flex;
801
+ flex-direction: column;
802
+ align-items: center;
803
+ justify-content: center;
804
+ height: 100%;
805
+ gap: 16px;
806
+ color: var(--fg-6);
807
+ }
808
+ .empty-state .assistant-avatar {
809
+ width: 36px;
810
+ height: 36px;
811
+ font-size: 14px;
812
+ border-radius: 8px;
813
+ }
814
+ .empty-state-text {
815
+ font-size: 14px;
816
+ color: var(--fg-6);
817
+ }
818
+ .thinking-indicator {
819
+ display: inline-block;
820
+ font-family: Inconsolata, monospace;
821
+ font-size: 20px;
822
+ line-height: 1;
823
+ vertical-align: middle;
824
+ color: var(--fg);
825
+ opacity: 0.5;
826
+ }
827
+ .thinking-status {
828
+ display: inline-flex;
829
+ align-items: center;
830
+ gap: 8px;
831
+ margin-top: 2px;
832
+ color: var(--fg-tool);
833
+ font-size: 14px;
834
+ line-height: 1.65;
835
+ font-weight: 400;
836
+ }
837
+ .thinking-status-label {
838
+ color: var(--fg-tool);
839
+ font-size: 14px;
840
+ line-height: 1.65;
841
+ font-weight: 400;
842
+ white-space: nowrap;
843
+ }
844
+
845
+ /* Composer */
846
+ .composer {
847
+ padding: 12px 24px 24px;
848
+ position: relative;
849
+ }
850
+ /* PWA standalone mode - extra bottom padding */
851
+ @media (display-mode: standalone), (-webkit-touch-callout: none) {
852
+ .composer {
853
+ padding-bottom: 32px;
854
+ }
855
+ }
856
+ @supports (-webkit-touch-callout: none) {
857
+ /* iOS Safari standalone check via JS class */
858
+ .standalone .composer {
859
+ padding-bottom: 32px;
860
+ }
861
+ }
862
+ .composer::before {
863
+ content: "";
864
+ position: absolute;
865
+ left: 0;
866
+ right: 0;
867
+ bottom: 100%;
868
+ height: 48px;
869
+ background: linear-gradient(to top, var(--bg) 0%, transparent 100%);
870
+ pointer-events: none;
871
+ }
872
+ .composer-inner { max-width: 680px; margin: 0 auto; }
873
+ .composer-shell {
874
+ background: var(--bg-alt);
875
+ border: 1px solid var(--border-3);
876
+ border-radius: 24px;
877
+ display: flex;
878
+ align-items: end;
879
+ padding: 4px 6px 4px 6px;
880
+ transition: border-color 0.15s;
881
+ }
882
+ .composer-shell:focus-within { border-color: var(--border-focus); }
883
+ .composer-input {
884
+ flex: 1;
885
+ background: transparent;
886
+ border: 0;
887
+ outline: none;
888
+ color: var(--fg);
889
+ min-height: 40px;
890
+ max-height: 200px;
891
+ resize: none;
892
+ padding: 11px 0 8px;
893
+ font-size: 14px;
894
+ line-height: 1.5;
895
+ margin-top: -4px;
896
+ }
897
+ .composer-input::placeholder { color: var(--fg-7); }
898
+ .send-btn {
899
+ width: 32px;
900
+ height: 32px;
901
+ background: var(--accent);
902
+ border: 0;
903
+ border-radius: 50%;
904
+ color: var(--accent-fg);
905
+ cursor: pointer;
906
+ display: grid;
907
+ place-items: center;
908
+ flex-shrink: 0;
909
+ margin-bottom: 2px;
910
+ transition: background 0.15s, opacity 0.15s;
911
+ }
912
+ .send-btn:hover { background: var(--accent-hover); }
913
+ .send-btn.stop-mode {
914
+ background: var(--stop-bg);
915
+ color: var(--stop-fg);
916
+ }
917
+ .send-btn.stop-mode:hover { background: var(--stop-hover); }
918
+ .send-btn:disabled { opacity: 0.2; cursor: default; }
919
+ .send-btn:disabled:hover { background: var(--accent); }
920
+ .send-btn-wrapper {
921
+ position: relative;
922
+ width: 36px;
923
+ height: 36px;
924
+ display: grid;
925
+ place-items: center;
926
+ flex-shrink: 0;
927
+ margin-bottom: 0;
928
+ }
929
+ .send-btn-wrapper .send-btn {
930
+ margin-bottom: 0;
931
+ }
932
+ .context-ring {
933
+ position: absolute;
934
+ inset: 0;
935
+ width: 36px;
936
+ height: 36px;
937
+ pointer-events: none;
938
+ transform: rotate(-90deg);
939
+ }
940
+ .context-ring-fill {
941
+ fill: none;
942
+ stroke: var(--bg-alt);
943
+ stroke-width: 3;
944
+ stroke-linecap: butt;
945
+ transition: stroke-dashoffset 0.4s ease, stroke 0.3s ease;
946
+ }
947
+ .send-btn-wrapper.stop-mode .context-ring-fill {
948
+ stroke: var(--fg-3);
949
+ }
950
+ .context-ring-fill.warning {
951
+ stroke: #e5a33d;
952
+ }
953
+ .context-ring-fill.critical {
954
+ stroke: #e55d4a;
955
+ }
956
+ .context-tooltip {
957
+ position: absolute;
958
+ bottom: calc(100% + 8px);
959
+ right: 0;
960
+ background: var(--bg-elevated);
961
+ border: 1px solid var(--border-3);
962
+ border-radius: 8px;
963
+ padding: 6px 10px;
964
+ font-size: 12px;
965
+ color: var(--fg-2);
966
+ white-space: nowrap;
967
+ pointer-events: none;
968
+ opacity: 0;
969
+ transform: translateY(4px);
970
+ transition: opacity 0.15s, transform 0.15s;
971
+ z-index: 10;
972
+ }
973
+ .send-btn-wrapper:hover .context-tooltip,
974
+ .send-btn-wrapper:focus-within .context-tooltip {
975
+ opacity: 1;
976
+ transform: translateY(0);
977
+ }
978
+ .attach-btn {
979
+ width: 32px;
980
+ height: 32px;
981
+ background: var(--surface-5);
982
+ border: 0;
983
+ border-radius: 50%;
984
+ color: var(--fg-3);
985
+ cursor: pointer;
986
+ display: grid;
987
+ place-items: center;
988
+ flex-shrink: 0;
989
+ margin-bottom: 2px;
990
+ margin-right: 8px;
991
+ transition: color 0.15s, background 0.15s;
992
+ }
993
+ .attach-btn:hover { color: var(--fg); background: var(--surface-8); }
994
+ .attachment-preview {
995
+ display: flex;
996
+ gap: 8px;
997
+ padding: 8px 0;
998
+ flex-wrap: wrap;
999
+ }
1000
+ .attachment-chip {
1001
+ display: inline-flex;
1002
+ align-items: center;
1003
+ gap: 6px;
1004
+ background: var(--chip-bg);
1005
+ border: 1px solid var(--border-4);
1006
+ border-radius: 9999px;
1007
+ padding: 4px 10px 4px 6px;
1008
+ font-size: 11px;
1009
+ color: var(--fg-4);
1010
+ max-width: 200px;
1011
+ cursor: pointer;
1012
+ backdrop-filter: blur(6px);
1013
+ -webkit-backdrop-filter: blur(6px);
1014
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
1015
+ }
1016
+ .attachment-chip:hover {
1017
+ color: var(--fg);
1018
+ border-color: var(--border-hover);
1019
+ background: var(--chip-bg-hover);
1020
+ }
1021
+ .attachment-chip img {
1022
+ width: 20px;
1023
+ height: 20px;
1024
+ object-fit: cover;
1025
+ border-radius: 50%;
1026
+ flex-shrink: 0;
1027
+ cursor: pointer;
1028
+ }
1029
+ .attachment-chip .file-icon {
1030
+ width: 20px;
1031
+ height: 20px;
1032
+ border-radius: 50%;
1033
+ background: var(--surface-6);
1034
+ display: grid;
1035
+ place-items: center;
1036
+ font-size: 11px;
1037
+ flex-shrink: 0;
1038
+ }
1039
+ .attachment-chip .remove-attachment {
1040
+ cursor: pointer;
1041
+ color: var(--fg-6);
1042
+ font-size: 14px;
1043
+ margin-left: 2px;
1044
+ line-height: 1;
1045
+ transition: color 0.15s;
1046
+ }
1047
+ .attachment-chip .remove-attachment:hover { color: var(--fg-strong); }
1048
+ .attachment-chip .filename { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100px; }
1049
+ .user-bubble .user-file-attachments {
1050
+ display: flex;
1051
+ gap: 6px;
1052
+ flex-wrap: wrap;
1053
+ margin-top: 8px;
1054
+ }
1055
+ .user-file-attachments img {
1056
+ max-width: 200px;
1057
+ max-height: 160px;
1058
+ border-radius: 8px;
1059
+ object-fit: cover;
1060
+ cursor: pointer;
1061
+ transition: opacity 0.15s;
1062
+ }
1063
+ .user-file-attachments img:hover { opacity: 0.85; }
1064
+ .lightbox {
1065
+ position: fixed;
1066
+ inset: 0;
1067
+ z-index: 9999;
1068
+ display: flex;
1069
+ align-items: center;
1070
+ justify-content: center;
1071
+ background: rgba(0,0,0,0);
1072
+ backdrop-filter: blur(0px);
1073
+ cursor: zoom-out;
1074
+ transition: background 0.25s ease, backdrop-filter 0.25s ease;
1075
+ }
1076
+ .lightbox.active {
1077
+ background: var(--lightbox-bg);
1078
+ backdrop-filter: blur(8px);
1079
+ }
1080
+ .lightbox img {
1081
+ max-width: 90vw;
1082
+ max-height: 90vh;
1083
+ border-radius: 8px;
1084
+ object-fit: contain;
1085
+ transform: scale(0.4);
1086
+ opacity: 0;
1087
+ transition: transform 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94), opacity 0.25s ease;
1088
+ }
1089
+ .lightbox.active img {
1090
+ transform: scale(1);
1091
+ opacity: 1;
1092
+ }
1093
+ .user-file-badge {
1094
+ display: inline-flex;
1095
+ align-items: center;
1096
+ gap: 4px;
1097
+ background: var(--file-badge-bg);
1098
+ border-radius: 6px;
1099
+ padding: 4px 8px;
1100
+ font-size: 12px;
1101
+ color: var(--file-badge-fg);
1102
+ }
1103
+ .drag-overlay {
1104
+ position: fixed;
1105
+ inset: 0;
1106
+ background: var(--backdrop);
1107
+ z-index: 9999;
1108
+ display: none;
1109
+ align-items: center;
1110
+ justify-content: center;
1111
+ pointer-events: none;
1112
+ }
1113
+ .drag-overlay.active { display: flex; }
1114
+ .drag-overlay-inner {
1115
+ border: 2px dashed var(--border-drag);
1116
+ border-radius: 16px;
1117
+ padding: 40px 60px;
1118
+ color: var(--fg-strong);
1119
+ font-size: 16px;
1120
+ }
1121
+ .disclaimer {
1122
+ text-align: center;
1123
+ color: var(--fg-8);
1124
+ font-size: 12px;
1125
+ margin-top: 10px;
1126
+ }
1127
+ .poncho-badge {
1128
+ position: absolute;
1129
+ right: 12px;
1130
+ top: 50%;
1131
+ transform: translateY(-50%);
1132
+ margin-top: calc(env(safe-area-inset-top, 0px) / 2);
1133
+ z-index: 10;
1134
+ display: inline-flex;
1135
+ align-items: center;
1136
+ gap: 6px;
1137
+ font-size: 11px;
1138
+ color: var(--fg-4);
1139
+ text-decoration: none;
1140
+ background: var(--chip-bg);
1141
+ border: 1px solid var(--border-4);
1142
+ border-radius: 9999px;
1143
+ padding: 4px 10px 4px 6px;
1144
+ backdrop-filter: blur(6px);
1145
+ -webkit-backdrop-filter: blur(6px);
1146
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
1147
+ }
1148
+ .poncho-badge:hover {
1149
+ color: var(--fg);
1150
+ border-color: var(--border-hover);
1151
+ background: var(--chip-bg-hover);
1152
+ }
1153
+ .poncho-badge-avatar {
1154
+ width: 16px;
1155
+ height: 16px;
1156
+ border-radius: 50%;
1157
+ object-fit: cover;
1158
+ display: block;
1159
+ flex-shrink: 0;
1160
+ }
1161
+
1162
+ /* Scrollbar */
1163
+ ::-webkit-scrollbar { width: 6px; }
1164
+ ::-webkit-scrollbar-track { background: transparent; }
1165
+ ::-webkit-scrollbar-thumb { background: var(--scrollbar); border-radius: 3px; }
1166
+ ::-webkit-scrollbar-thumb:hover { background: var(--scrollbar-hover); }
1167
+
1168
+ /* Mobile */
1169
+ @media (max-width: 768px) {
1170
+ .sidebar {
1171
+ position: fixed;
1172
+ inset: 0 auto 0 0;
1173
+ z-index: 100;
1174
+ transform: translateX(-100%);
1175
+ padding-top: calc(env(safe-area-inset-top, 0px) + 12px);
1176
+ will-change: transform;
1177
+ }
1178
+ .sidebar.dragging { transition: none; }
1179
+ .sidebar:not(.dragging) { transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); }
1180
+ .shell.sidebar-open .sidebar { transform: translateX(0); }
1181
+ .sidebar-toggle { display: grid; place-items: center; }
1182
+ .topbar-new-chat { display: grid; place-items: center; }
1183
+ .poncho-badge {
1184
+ display: none;
1185
+ position: fixed;
1186
+ top: calc(12px + env(safe-area-inset-top, 0px));
1187
+ right: 12px;
1188
+ transform: none;
1189
+ margin-top: 0;
1190
+ z-index: 200;
1191
+ }
1192
+ .shell.sidebar-open .poncho-badge { display: inline-flex; }
1193
+ .sidebar-backdrop {
1194
+ position: fixed;
1195
+ inset: 0;
1196
+ background: var(--backdrop);
1197
+ z-index: 50;
1198
+ backdrop-filter: blur(2px);
1199
+ -webkit-backdrop-filter: blur(2px);
1200
+ opacity: 0;
1201
+ pointer-events: none;
1202
+ will-change: opacity;
1203
+ }
1204
+ .sidebar-backdrop:not(.dragging) { transition: opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1); }
1205
+ .sidebar-backdrop.dragging { transition: none; }
1206
+ .shell.sidebar-open .sidebar-backdrop { opacity: 1; pointer-events: auto; }
1207
+ .messages { padding: 16px; }
1208
+ .composer { padding: 8px 16px 16px; }
1209
+ /* Always show delete button on mobile (no hover) */
1210
+ .conversation-item .delete-btn { opacity: 1; }
1211
+ }
1212
+
1213
+ /* Browser viewport panel */
1214
+ .browser-panel-resize {
1215
+ width: 1px;
1216
+ cursor: col-resize;
1217
+ background: var(--border-1);
1218
+ flex-shrink: 0;
1219
+ position: relative;
1220
+ z-index: 10;
1221
+ }
1222
+ .browser-panel-resize::after {
1223
+ content: "";
1224
+ position: absolute;
1225
+ inset: 0 -3px;
1226
+ }
1227
+ .browser-panel-resize:hover,
1228
+ .browser-panel-resize.dragging {
1229
+ background: var(--fg-5);
1230
+ }
1231
+ .browser-panel {
1232
+ flex: 2 1 0%;
1233
+ min-width: 280px;
1234
+ background: var(--bg);
1235
+ display: flex;
1236
+ flex-direction: column;
1237
+ overflow: hidden;
1238
+ }
1239
+ .main-chat.has-browser {
1240
+ flex: 1 1 0%;
1241
+ min-width: 280px;
1242
+ }
1243
+ .browser-panel-header {
1244
+ display: flex;
1245
+ align-items: center;
1246
+ gap: 8px;
1247
+ padding: 8px 12px;
1248
+ border-bottom: 1px solid var(--border);
1249
+ min-height: 40px;
1250
+ }
1251
+ .browser-panel-title {
1252
+ font-size: 12px;
1253
+ font-weight: 600;
1254
+ text-transform: uppercase;
1255
+ letter-spacing: 0.06em;
1256
+ color: var(--fg-tool);
1257
+ white-space: nowrap;
1258
+ }
1259
+ .browser-nav-btn {
1260
+ background: none;
1261
+ border: none;
1262
+ color: var(--fg-3);
1263
+ cursor: pointer;
1264
+ padding: 4px;
1265
+ border-radius: 4px;
1266
+ display: flex;
1267
+ align-items: center;
1268
+ justify-content: center;
1269
+ transition: color 0.15s, background 0.15s;
1270
+ flex-shrink: 0;
1271
+ }
1272
+ .browser-nav-btn:hover:not(:disabled) { color: var(--fg); background: var(--bg-bubble-user); }
1273
+ .browser-nav-btn:disabled { opacity: 0.3; cursor: default; }
1274
+ .browser-panel-url {
1275
+ flex: 1;
1276
+ font-size: 11px;
1277
+ color: var(--fg-3);
1278
+ overflow: hidden;
1279
+ text-overflow: ellipsis;
1280
+ white-space: nowrap;
1281
+ }
1282
+ .browser-panel-close {
1283
+ background: none;
1284
+ border: none;
1285
+ color: var(--fg-3);
1286
+ font-size: 18px;
1287
+ cursor: pointer;
1288
+ padding: 0 4px;
1289
+ line-height: 1;
1290
+ }
1291
+ .browser-panel-close:hover {
1292
+ color: var(--fg);
1293
+ }
1294
+ .browser-panel-viewport {
1295
+ flex: 1;
1296
+ position: relative;
1297
+ overflow: auto;
1298
+ display: flex;
1299
+ align-items: flex-start;
1300
+ justify-content: center;
1301
+ padding: 8px;
1302
+ }
1303
+ .browser-panel-viewport img {
1304
+ max-width: 100%;
1305
+ border-radius: 4px;
1306
+ display: block;
1307
+ outline: none;
1308
+ }
1309
+ .browser-panel-viewport img:focus {
1310
+ box-shadow: 0 0 0 2px var(--accent);
1311
+ }
1312
+ .browser-panel-placeholder {
1313
+ position: absolute;
1314
+ inset: 0;
1315
+ display: flex;
1316
+ align-items: center;
1317
+ justify-content: center;
1318
+ color: var(--fg-3);
1319
+ font-size: 13px;
1320
+ }
1321
+ @media (max-width: 768px) {
1322
+ .browser-panel {
1323
+ position: fixed;
1324
+ inset: 0;
1325
+ width: 100% !important;
1326
+ flex: none !important;
1327
+ z-index: 200;
1328
+ }
1329
+ .browser-panel-resize { display: none !important; }
1330
+ .main-chat.has-browser { flex: 1 1 auto !important; min-width: 0; }
1331
+ }
1332
+
1333
+ /* Reduced motion */
1334
+ @media (prefers-reduced-motion: reduce) {
1335
+ *, *::before, *::after {
1336
+ animation-duration: 0.01ms !important;
1337
+ transition-duration: 0.01ms !important;
1338
+ }
1339
+ }
1340
+ `;