buddy-builder 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,754 @@
1
+ /* ═══ Chat header ═════════════════════════════════════════════ */
2
+
3
+ /* ─── Back button ─── */
4
+
5
+ .chat-header-back {
6
+ display: flex;
7
+ align-items: center;
8
+ justify-content: center;
9
+ background: none;
10
+ border: none;
11
+ color: var(--text-muted);
12
+ cursor: pointer;
13
+ padding: 4px;
14
+ margin-right: 4px;
15
+ border-radius: var(--radius);
16
+ transition: color 0.15s, background 0.15s;
17
+ }
18
+
19
+ .chat-header-back:hover {
20
+ color: var(--text);
21
+ background: var(--bg-3);
22
+ }
23
+
24
+ /* ─── Chat header bar ─── */
25
+
26
+ #chat-header {
27
+ display: flex;
28
+ align-items: center;
29
+ justify-content: space-between;
30
+ padding: 8px 20px;
31
+ background: var(--bg-1);
32
+ border-bottom: 1px solid var(--border);
33
+ flex-shrink: 0;
34
+ min-height: 48px;
35
+ }
36
+
37
+ .chat-header-left {
38
+ display: flex;
39
+ align-items: center;
40
+ gap: 8px;
41
+ min-width: 0;
42
+ }
43
+
44
+ .chat-header-star {
45
+ background: none;
46
+ border: none;
47
+ font-size: 20px;
48
+ cursor: pointer;
49
+ color: var(--text-muted);
50
+ padding: 2px;
51
+ line-height: 1;
52
+ transition: color 0.15s, transform 0.15s;
53
+ flex-shrink: 0;
54
+ }
55
+
56
+ .chat-header-star:hover { color: var(--text-secondary); transform: scale(1.15); }
57
+ .chat-header-star.starred { color: #f5c518; }
58
+ .chat-header-star.starred:hover { color: #e0b000; }
59
+
60
+ .chat-header-info {
61
+ display: flex;
62
+ flex-direction: column;
63
+ min-width: 0;
64
+ }
65
+
66
+ .chat-header-name {
67
+ font-size: 15px;
68
+ font-weight: 700;
69
+ color: var(--text);
70
+ white-space: nowrap;
71
+ overflow: hidden;
72
+ text-overflow: ellipsis;
73
+ }
74
+
75
+ .chat-header-project {
76
+ font-size: 11px;
77
+ color: var(--text-muted);
78
+ white-space: nowrap;
79
+ overflow: hidden;
80
+ text-overflow: ellipsis;
81
+ margin-top: 1px;
82
+ }
83
+
84
+ .chat-header-right {
85
+ display: flex;
86
+ align-items: center;
87
+ gap: 4px;
88
+ flex-shrink: 0;
89
+ }
90
+
91
+ /* ─── Model badge + token counter ─── */
92
+
93
+ .model-badge {
94
+ font-size: 10px;
95
+ font-family: var(--font-mono);
96
+ color: var(--text-muted);
97
+ background: var(--bg-3);
98
+ padding: 2px 6px;
99
+ border-radius: 3px;
100
+ white-space: nowrap;
101
+ flex-shrink: 0;
102
+ margin-left: 8px;
103
+ }
104
+
105
+ .token-counter {
106
+ font-size: 11px;
107
+ font-family: var(--font-mono);
108
+ color: var(--text-muted);
109
+ padding: 2px 8px;
110
+ white-space: nowrap;
111
+ }
112
+
113
+ /* ─── Rate limit banner ─── */
114
+
115
+ .rate-limit-banner {
116
+ display: flex;
117
+ align-items: center;
118
+ gap: 8px;
119
+ padding: 8px 20px;
120
+ background: rgba(236, 178, 46, 0.12);
121
+ border-bottom: 1px solid rgba(236, 178, 46, 0.3);
122
+ color: var(--warning);
123
+ font-size: 13px;
124
+ font-weight: 500;
125
+ flex-shrink: 0;
126
+ animation: fadeIn 0.2s ease;
127
+ }
128
+ .rate-limit-icon { font-size: 16px; }
129
+
130
+ /* ─── Resume banner (sticky top, centered) ─── */
131
+
132
+ .resume-banner {
133
+ display: flex;
134
+ flex-direction: column;
135
+ align-items: center;
136
+ gap: 10px;
137
+ padding: 14px 20px;
138
+ background: var(--bg-2);
139
+ border-bottom: 1px solid var(--border);
140
+ flex-shrink: 0;
141
+ position: sticky;
142
+ top: 0;
143
+ z-index: 5;
144
+ }
145
+
146
+ .resume-banner-label {
147
+ font-size: 13px;
148
+ color: var(--text-muted);
149
+ }
150
+
151
+ .resume-banner .session-action-btns {
152
+ justify-content: center;
153
+ }
154
+
155
+ /* ─── Chat header icon buttons ─── */
156
+
157
+ .chat-header-icon-btn {
158
+ display: flex;
159
+ align-items: center;
160
+ gap: 3px;
161
+ background: none;
162
+ border: 1px solid var(--border);
163
+ border-radius: var(--radius);
164
+ color: var(--text-secondary);
165
+ padding: 5px 8px;
166
+ cursor: pointer;
167
+ font-size: 14px;
168
+ transition: background 0.15s, border-color 0.15s;
169
+ }
170
+
171
+ .chat-header-icon-btn:hover {
172
+ background: var(--hover-bg);
173
+ border-color: var(--border-strong);
174
+ }
175
+
176
+ .popout-btn svg {
177
+ display: block;
178
+ }
179
+
180
+ .pin-btn.pinned {
181
+ color: var(--accent);
182
+ border-color: var(--accent);
183
+ background: var(--accent-bg);
184
+ }
185
+
186
+ /* ─── PolicyPicker (shared component) ─── */
187
+
188
+ .policy-picker-wrap {
189
+ position: relative;
190
+ }
191
+
192
+ .policy-picker-trigger {
193
+ display: flex;
194
+ align-items: center;
195
+ gap: 6px;
196
+ border: none;
197
+ background: none;
198
+ cursor: pointer;
199
+ font-family: inherit;
200
+ }
201
+
202
+ /* icon-only variant (chat header) */
203
+ .policy-picker-trigger.icon {
204
+ border-radius: var(--radius);
205
+ border: 1px solid transparent;
206
+ color: var(--text-secondary);
207
+ padding: 5px 8px;
208
+ font-size: 14px;
209
+ transition: background 0.15s, border-color 0.15s;
210
+ }
211
+ .policy-picker-trigger.icon .policy-picker-icon {
212
+ display: flex;
213
+ align-items: center;
214
+ color: var(--text-primary);
215
+ }
216
+ .policy-picker-trigger.icon .policy-picker-icon svg {
217
+ width: 16px;
218
+ height: 16px;
219
+ }
220
+ .policy-picker-trigger.icon:hover {
221
+ background: var(--hover-bg);
222
+ border-color: var(--border-strong);
223
+ }
224
+
225
+ /* full variant (sidebar / settings modal) */
226
+ .policy-picker-trigger.full {
227
+ padding: 6px 10px;
228
+ border-radius: var(--radius);
229
+ background: rgba(255, 255, 255, 0.06);
230
+ border: 1px solid var(--border);
231
+ color: var(--text-secondary);
232
+ font-size: 12px;
233
+ width: 100%;
234
+ }
235
+ .policy-picker-trigger.full:hover {
236
+ border-color: var(--border-strong);
237
+ color: var(--text);
238
+ }
239
+
240
+ .policy-picker-icon { display: flex; align-items: center; }
241
+ .policy-picker-icon svg { width: 14px; height: 14px; }
242
+ .policy-picker-label { flex: 1; text-align: left; }
243
+
244
+ /* sidebar context: fill available space */
245
+ #sidebar-actions .policy-picker-wrap { flex: 1; min-width: 0; }
246
+
247
+ .policy-chevron { font-size: 10px; color: var(--text-muted); margin-left: auto; }
248
+
249
+ .policy-dropdown {
250
+ position: absolute;
251
+ top: calc(100% + 4px);
252
+ left: 0;
253
+ background: var(--bg-3);
254
+ border: 1px solid var(--border-strong);
255
+ border-radius: var(--radius-lg);
256
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
257
+ z-index: 50;
258
+ min-width: 200px;
259
+ padding: 4px;
260
+ animation: dropdown-in 0.12s ease-out;
261
+ }
262
+
263
+ .policy-dropdown-item {
264
+ display: flex;
265
+ align-items: center;
266
+ gap: 10px;
267
+ width: 100%;
268
+ padding: 8px 12px;
269
+ border: none;
270
+ background: none;
271
+ color: var(--text-secondary);
272
+ font-size: 13px;
273
+ font-family: inherit;
274
+ cursor: pointer;
275
+ border-radius: var(--radius);
276
+ transition: background 0.1s;
277
+ }
278
+
279
+ .policy-dropdown-item:hover {
280
+ background: var(--hover-bg);
281
+ color: var(--text);
282
+ }
283
+
284
+ .policy-dropdown-item.active {
285
+ color: var(--text);
286
+ font-weight: 600;
287
+ }
288
+
289
+ .policy-dropdown-icon { display: flex; align-items: center; justify-content: center; width: 20px; }
290
+ .policy-dropdown-icon svg { width: 14px; height: 14px; }
291
+ .policy-dropdown-label { flex: 1; text-align: left; }
292
+ .policy-dropdown-check { color: var(--accent); font-size: 14px; }
293
+
294
+ /* icon variant: right-align dropdown */
295
+ .policy-picker-wrap.icon .policy-dropdown { left: auto; right: 0; }
296
+
297
+ /* sidebar: open upward (picker is at bottom of screen) */
298
+ #sidebar-actions .policy-dropdown { top: auto; bottom: calc(100% + 4px); }
299
+
300
+ /* ═══ Chat area ═════════════════════════════════════════════════ */
301
+
302
+ #chat {
303
+ flex: 1;
304
+ overflow-y: auto;
305
+ overscroll-behavior: contain;
306
+ padding: 8px 0;
307
+ min-height: 0;
308
+ }
309
+
310
+ #chat.chat-empty {
311
+ display: flex;
312
+ align-items: center;
313
+ justify-content: center;
314
+ background: var(--bg-0);
315
+ }
316
+
317
+ .messages {
318
+ display: flex;
319
+ flex-direction: column;
320
+ gap: 0;
321
+ padding-bottom: 16px;
322
+ }
323
+
324
+ .empty-state {
325
+ display: flex;
326
+ align-items: center;
327
+ justify-content: center;
328
+ flex: 1;
329
+ min-height: 100%;
330
+ color: var(--text-muted);
331
+ font-size: 15px;
332
+ text-align: center;
333
+ }
334
+
335
+ .empty-state strong { color: var(--accent); }
336
+
337
+ /* ─── Message rows (Slack-style) ─── */
338
+
339
+ .msg-row {
340
+ display: flex;
341
+ gap: 12px;
342
+ padding: 4px 24px;
343
+ transition: background 0.1s;
344
+ width: 100%;
345
+ }
346
+
347
+ .msg-row:hover {
348
+ background: var(--hover-bg);
349
+ }
350
+
351
+ .msg-row-first {
352
+ padding-top: 10px;
353
+ margin-top: 6px;
354
+ }
355
+
356
+ .msg-row-continuation {
357
+ padding-top: 2px;
358
+ padding-bottom: 2px;
359
+ }
360
+
361
+ .msg-row-system {
362
+ padding: 8px 24px;
363
+ }
364
+
365
+ /* ─── Avatar ─── */
366
+
367
+ .msg-avatar {
368
+ width: 30px;
369
+ height: 30px;
370
+ border-radius: 8px;
371
+ display: flex;
372
+ align-items: center;
373
+ justify-content: center;
374
+ flex-shrink: 0;
375
+ line-height: 1;
376
+ }
377
+
378
+ .msg-avatar svg {
379
+ width: 16px;
380
+ height: 16px;
381
+ }
382
+
383
+ .msg-avatar-user {
384
+ background: linear-gradient(135deg, #1d9bd1, #1580b0);
385
+ color: #fff;
386
+ }
387
+ .msg-avatar-user svg { fill: #fff; }
388
+
389
+ .msg-avatar-claude {
390
+ background: linear-gradient(135deg, #da7756, #c9553a);
391
+ color: #fff;
392
+ }
393
+ .msg-avatar-claude svg { fill: #fff; }
394
+
395
+ .msg-avatar-system {
396
+ background: linear-gradient(135deg, #6e7a8a, #525d6b);
397
+ color: #fff;
398
+ }
399
+ .msg-avatar-system svg { fill: #fff; }
400
+
401
+ .msg-avatar-spacer {
402
+ width: 30px;
403
+ flex-shrink: 0;
404
+ }
405
+
406
+ /* Thinking avatar animation */
407
+ .thinking-row .msg-avatar-thinking {
408
+ animation: thinking-glow 2s ease-in-out infinite;
409
+ }
410
+
411
+ .thinking-row .msg-avatar-thinking svg {
412
+ animation: thinking-spin 3s ease-in-out infinite;
413
+ }
414
+
415
+ @keyframes thinking-glow {
416
+ 0%, 100% {
417
+ box-shadow: 0 0 0 0 rgba(218, 119, 86, 0);
418
+ }
419
+ 50% {
420
+ box-shadow: 0 0 16px 4px rgba(218, 119, 86, 0.4);
421
+ }
422
+ }
423
+
424
+ @keyframes thinking-spin {
425
+ 0% { transform: rotate(0deg) scale(1); }
426
+ 25% { transform: rotate(90deg) scale(1.15); }
427
+ 50% { transform: rotate(180deg) scale(1); }
428
+ 75% { transform: rotate(270deg) scale(1.15); }
429
+ 100% { transform: rotate(360deg) scale(1); }
430
+ }
431
+
432
+ /* ─── Thinking dots ─── */
433
+
434
+ .thinking-indicator {
435
+ display: flex;
436
+ align-items: center;
437
+ gap: 4px;
438
+ padding: 8px 0;
439
+ }
440
+
441
+ .thinking-dot {
442
+ width: 7px;
443
+ height: 7px;
444
+ border-radius: 50%;
445
+ background: var(--text-muted);
446
+ animation: thinking-bounce 1.4s ease-in-out infinite;
447
+ }
448
+
449
+ .thinking-dot:nth-child(2) { animation-delay: 0.16s; }
450
+ .thinking-dot:nth-child(3) { animation-delay: 0.32s; }
451
+
452
+ @keyframes thinking-bounce {
453
+ 0%, 60%, 100% { transform: translateY(0); opacity: 0.3; }
454
+ 30% { transform: translateY(-6px); opacity: 1; }
455
+ }
456
+
457
+ /* ─── Content column ─── */
458
+
459
+ .msg-content {
460
+ flex: 1;
461
+ min-width: 0;
462
+ }
463
+
464
+ .msg-header {
465
+ display: flex;
466
+ align-items: baseline;
467
+ gap: 8px;
468
+ margin-bottom: 3px;
469
+ }
470
+
471
+ .msg-sender {
472
+ font-weight: 800;
473
+ font-size: 14px;
474
+ color: var(--text);
475
+ line-height: 1.4;
476
+ letter-spacing: -0.01em;
477
+ }
478
+
479
+ .msg-sender-tag {
480
+ font-size: 10px;
481
+ font-weight: 600;
482
+ color: #8a929c;
483
+ background: rgba(138, 146, 156, 0.15);
484
+ padding: 1px 6px;
485
+ border-radius: 3px;
486
+ text-transform: uppercase;
487
+ letter-spacing: 0.04em;
488
+ }
489
+
490
+ .msg-timestamp {
491
+ font-size: 11px;
492
+ color: var(--text-muted);
493
+ font-weight: 400;
494
+ }
495
+
496
+ /* Hover timestamp for continuation rows */
497
+ .msg-timestamp-hover {
498
+ opacity: 0;
499
+ font-size: 10px;
500
+ color: var(--text-muted);
501
+ min-width: 30px;
502
+ text-align: center;
503
+ transition: opacity 0.1s;
504
+ flex-shrink: 0;
505
+ line-height: 1.46667;
506
+ padding-top: 2px;
507
+ }
508
+
509
+ .msg-row-continuation:hover .msg-timestamp-hover {
510
+ opacity: 1;
511
+ }
512
+
513
+ /* ─── Text ─── */
514
+
515
+ .msg-text {
516
+ white-space: pre-wrap;
517
+ word-break: break-word;
518
+ line-height: 1.46667;
519
+ color: var(--text);
520
+ }
521
+
522
+ /* ─── Streaming indicator ─── */
523
+
524
+ .streaming-block {
525
+ display: flex;
526
+ align-items: flex-start;
527
+ gap: 10px;
528
+ padding: 6px 0;
529
+ color: var(--text-secondary);
530
+ font-size: 0.92em;
531
+ line-height: 1.5;
532
+ min-height: 28px;
533
+ }
534
+
535
+ .streaming-bar {
536
+ flex-shrink: 0;
537
+ width: 3px;
538
+ min-height: 20px;
539
+ align-self: stretch;
540
+ border-radius: 2px;
541
+ background: var(--accent);
542
+ animation: streaming-bar-pulse 1.5s ease-in-out infinite;
543
+ }
544
+
545
+ @keyframes streaming-bar-pulse {
546
+ 0%, 100% { opacity: 0.3; }
547
+ 50% { opacity: 1; }
548
+ }
549
+
550
+ .streaming-preview {
551
+ white-space: pre-wrap;
552
+ word-break: break-word;
553
+ opacity: 0.85;
554
+ }
555
+
556
+ .streaming-cursor {
557
+ display: inline-block;
558
+ width: 2px;
559
+ height: 1em;
560
+ background: var(--accent);
561
+ margin-left: 1px;
562
+ vertical-align: text-bottom;
563
+ animation: cursor-blink 0.8s step-end infinite;
564
+ }
565
+
566
+ @keyframes cursor-blink {
567
+ 0%, 100% { opacity: 1; }
568
+ 50% { opacity: 0; }
569
+ }
570
+
571
+ /* ─── Markdown prose ─── */
572
+
573
+ .prose {
574
+ white-space: normal;
575
+ }
576
+
577
+ .prose p {
578
+ margin: 0 0 0.5em;
579
+ }
580
+
581
+ .prose p:last-child {
582
+ margin-bottom: 0;
583
+ }
584
+
585
+ .prose h1, .prose h2, .prose h3, .prose h4, .prose h5, .prose h6 {
586
+ color: #fff;
587
+ font-weight: 700;
588
+ margin: 1em 0 0.4em;
589
+ line-height: 1.3;
590
+ }
591
+
592
+ .prose h1:first-child, .prose h2:first-child, .prose h3:first-child {
593
+ margin-top: 0.2em;
594
+ }
595
+
596
+ .prose h1 { font-size: 1.4em; }
597
+ .prose h2 { font-size: 1.2em; }
598
+ .prose h3 { font-size: 1.05em; }
599
+ .prose h4, .prose h5, .prose h6 { font-size: 1em; }
600
+
601
+ .prose strong { color: #fff; font-weight: 700; }
602
+ .prose em { font-style: italic; }
603
+
604
+ .prose code {
605
+ background: var(--bg-3);
606
+ padding: 0.15em 0.4em;
607
+ border-radius: 3px;
608
+ font-family: var(--font-mono);
609
+ font-size: 0.88em;
610
+ color: var(--accent);
611
+ }
612
+
613
+ .prose pre {
614
+ background: var(--bg-2);
615
+ border: 1px solid var(--border);
616
+ border-radius: var(--radius);
617
+ padding: 12px 14px;
618
+ overflow-x: auto;
619
+ margin: 0.6em 0;
620
+ line-height: 1.5;
621
+ }
622
+
623
+ .prose pre code {
624
+ background: none;
625
+ padding: 0;
626
+ border-radius: 0;
627
+ font-size: 13px;
628
+ color: var(--text-secondary);
629
+ }
630
+
631
+ .prose blockquote {
632
+ border-left: 3px solid var(--accent);
633
+ padding: 4px 0 4px 14px;
634
+ margin: 0.5em 0;
635
+ color: var(--text-secondary);
636
+ }
637
+
638
+ .prose ul, .prose ol {
639
+ padding-left: 1.6em;
640
+ margin: 0.4em 0;
641
+ }
642
+
643
+ .prose li {
644
+ margin: 0.15em 0;
645
+ }
646
+
647
+ .prose table {
648
+ border-collapse: collapse;
649
+ margin: 0.6em 0;
650
+ font-size: 14px;
651
+ width: 100%;
652
+ }
653
+
654
+ .prose th, .prose td {
655
+ border: 1px solid var(--border-strong);
656
+ padding: 6px 12px;
657
+ text-align: left;
658
+ }
659
+
660
+ .prose th {
661
+ background: var(--bg-3);
662
+ font-weight: 600;
663
+ color: #fff;
664
+ }
665
+
666
+ .prose td {
667
+ background: var(--bg-2);
668
+ }
669
+
670
+ .prose hr {
671
+ border: none;
672
+ border-top: 1px solid var(--border);
673
+ margin: 0.8em 0;
674
+ }
675
+
676
+ .prose a {
677
+ color: var(--accent);
678
+ text-decoration: none;
679
+ }
680
+
681
+ .prose a:hover {
682
+ text-decoration: underline;
683
+ }
684
+
685
+ .prose img {
686
+ max-width: 100%;
687
+ border-radius: var(--radius);
688
+ }
689
+
690
+ /* ─── System messages ─── */
691
+
692
+ .msg-system-block {
693
+ display: flex;
694
+ align-items: flex-start;
695
+ gap: 10px;
696
+ padding: 6px 0;
697
+ }
698
+
699
+ .msg-system-bar {
700
+ flex-shrink: 0;
701
+ width: 3px;
702
+ min-height: 18px;
703
+ align-self: stretch;
704
+ border-radius: 2px;
705
+ background: var(--text-muted);
706
+ opacity: 0.5;
707
+ }
708
+
709
+ .msg-system-content {
710
+ color: var(--text-secondary);
711
+ font-size: 13px;
712
+ line-height: 1.46667;
713
+ }
714
+
715
+ .msg-compact {
716
+ font-size: 12px;
717
+ color: var(--accent);
718
+ text-align: center;
719
+ padding: 4px 14px;
720
+ background: var(--accent-bg);
721
+ border: 1px solid rgba(29, 155, 209, 0.2);
722
+ border-radius: 12px;
723
+ display: inline-flex;
724
+ align-items: center;
725
+ gap: 6px;
726
+ animation: compact-appear 0.4s ease-out;
727
+ }
728
+
729
+ .compact-icon {
730
+ flex-shrink: 0;
731
+ stroke: var(--accent);
732
+ }
733
+
734
+ @keyframes compact-appear {
735
+ from { opacity: 0; transform: scaleX(0.8); }
736
+ to { opacity: 1; transform: scaleX(1); }
737
+ }
738
+
739
+ /* ─── Message images ─── */
740
+
741
+ .msg-images {
742
+ display: flex;
743
+ flex-wrap: wrap;
744
+ gap: 8px;
745
+ margin-bottom: 6px;
746
+ }
747
+
748
+ .msg-image {
749
+ max-width: 300px;
750
+ max-height: 300px;
751
+ border-radius: var(--radius);
752
+ border: 1px solid var(--border);
753
+ object-fit: contain;
754
+ }