bunnyquery 1.2.2 → 1.3.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.
package/src/widget.css ADDED
@@ -0,0 +1,874 @@
1
+ /* ============================================================================
2
+ * BunnyQuery — embeddable AI chat widget
3
+ * Ported from the bunnyquery (www.skapi.com) agent.vue chatbox + login views.
4
+ *
5
+ * Theming: tokens live on the widget root `.bq-agent[data-bq-theme]` and on
6
+ * any modal root appended to <body> (which carries its own data-bq-theme).
7
+ * All selectors are scoped under `.bq-agent` / `.bq-modal-root` so the widget
8
+ * never leaks styles into the host page.
9
+ * ==========================================================================*/
10
+
11
+ /* ---- Tokens: light (default) ---------------------------------------------*/
12
+ .bq-agent,
13
+ .bq-modal-root {
14
+ --bq-mono: "IBM Plex Mono", "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
15
+ --bq-ink: #111;
16
+ --bq-paper: #fff;
17
+ --bq-muted: #666;
18
+ --bq-line: #c8c8c8;
19
+ --bq-hover-bg: #ebebeb;
20
+ --bq-main: #c2185b;
21
+ --bq-light-main: #f06292;
22
+ --bq-danger: #c44;
23
+ --bq-danger-bg: #fff5f5;
24
+ --bq-main-bg: #fff8fa;
25
+ --bq-success: #2a7d29;
26
+ --bq-success-bg: #eef9f0;
27
+ --bq-success-border: #b8dcbc;
28
+ --bq-warning: #8a6d00;
29
+ --bq-warning-bg: #fff8e1;
30
+ --bq-warning-border: #e2a300;
31
+ --bq-info: #1a5bb5;
32
+ --bq-info-bg: #e8f0fb;
33
+ --bq-info-border: #3c94ff;
34
+ --bq-placeholder: #aaaaaa;
35
+ --bq-code-bg: #1e1e1e;
36
+ --bq-code-fg: #f5f5f5;
37
+ --bq-icon-invert: 0;
38
+ }
39
+
40
+ /* ---- Tokens: dark --------------------------------------------------------*/
41
+ .bq-agent[data-bq-theme="dark"],
42
+ .bq-modal-root[data-bq-theme="dark"] {
43
+ --bq-ink: #ebebeb;
44
+ --bq-paper: #000;
45
+ --bq-muted: #a0a0a0;
46
+ --bq-line: #3d3d3d;
47
+ --bq-hover-bg: #252525;
48
+ --bq-main: #f06292;
49
+ --bq-light-main: #f48fb1;
50
+ --bq-danger: #ef5350;
51
+ --bq-danger-bg: #2d1616;
52
+ --bq-main-bg: #2b1520;
53
+ --bq-success: #6abf66;
54
+ --bq-success-bg: #192e1e;
55
+ --bq-success-border: #4caf50;
56
+ --bq-warning: #ffca28;
57
+ --bq-warning-bg: #2d2516;
58
+ --bq-warning-border: #f9a825;
59
+ --bq-info: #64b5f6;
60
+ --bq-info-bg: #162230;
61
+ --bq-info-border: #42a5f5;
62
+ --bq-placeholder: #787878;
63
+ --bq-icon-invert: 1;
64
+ }
65
+
66
+ /* ---- Root container ------------------------------------------------------*/
67
+ .bq-agent {
68
+ box-sizing: border-box;
69
+ display: flex;
70
+ flex-direction: column;
71
+ width: 100%;
72
+ height: 100%;
73
+ min-height: 0;
74
+ margin: 0;
75
+ font-family: var(--bq-mono);
76
+ font-size: 16px;
77
+ line-height: 1.5;
78
+ color: var(--bq-ink);
79
+ background: var(--bq-paper);
80
+ -webkit-text-size-adjust: 100%;
81
+ }
82
+
83
+ .bq-agent *,
84
+ .bq-agent *::before,
85
+ .bq-agent *::after,
86
+ .bq-modal-root *,
87
+ .bq-modal-root *::before,
88
+ .bq-modal-root *::after {
89
+ box-sizing: border-box;
90
+ }
91
+
92
+ /* ---- Base button ---------------------------------------------------------*/
93
+ .bq-agent .btn,
94
+ .bq-modal-root .btn {
95
+ appearance: none;
96
+ -webkit-appearance: none;
97
+ display: inline-flex;
98
+ align-items: center;
99
+ justify-content: center;
100
+ min-width: 5.5rem;
101
+ padding: 0.6rem 1rem;
102
+ border: 1px solid var(--bq-ink);
103
+ background: var(--bq-ink);
104
+ color: var(--bq-paper);
105
+ font-family: var(--bq-mono);
106
+ font-size: 0.85rem;
107
+ line-height: 1;
108
+ cursor: pointer;
109
+ border-radius: 0;
110
+ box-shadow: 2px 2px rgba(0, 0, 0, 0.12);
111
+ transition: opacity 0.15s, background 0.15s, color 0.15s;
112
+ }
113
+
114
+ .bq-agent .btn:hover:not(:disabled),
115
+ .bq-modal-root .btn:hover:not(:disabled) {
116
+ opacity: 0.85;
117
+ }
118
+
119
+ .bq-agent .btn:disabled,
120
+ .bq-modal-root .btn:disabled {
121
+ opacity: 0.4;
122
+ cursor: not-allowed;
123
+ }
124
+
125
+ .bq-agent .btn--outline,
126
+ .bq-modal-root .btn--outline {
127
+ background: var(--bq-paper);
128
+ color: var(--bq-ink);
129
+ }
130
+
131
+ /* dot-trail loader (".", "..", "...") */
132
+ .bq-loader {
133
+ font-size: inherit;
134
+ letter-spacing: 0.2em;
135
+ }
136
+ .bq-loader::after {
137
+ content: '.';
138
+ animation: bq-dots 1.2s steps(1) infinite;
139
+ }
140
+ @keyframes bq-dots {
141
+ 0% { content: '.'; }
142
+ 33% { content: '..'; }
143
+ 66% { content: '...'; }
144
+ }
145
+
146
+ /* spinner used inside primary buttons */
147
+ .bq-btn-spinner {
148
+ display: inline-block;
149
+ width: 1rem;
150
+ height: 1rem;
151
+ border: 2px solid currentColor;
152
+ border-right-color: transparent;
153
+ border-radius: 50%;
154
+ animation: bq-spin 0.7s linear infinite;
155
+ }
156
+ @keyframes bq-spin {
157
+ to { transform: rotate(360deg); }
158
+ }
159
+
160
+ /* ============================================================================
161
+ * AUTH VIEWS (login / signup / forgot / verify / settings)
162
+ * ==========================================================================*/
163
+ /* padded parent that nests a standalone page (login / signup / verify / …) */
164
+ .bq-page {
165
+ flex: 1;
166
+ min-height: 0;
167
+ overflow-y: auto;
168
+ display: flex;
169
+ flex-direction: column;
170
+ padding: 2.5rem 1.5rem;
171
+ }
172
+ .bq-settings {
173
+ flex: 1;
174
+ width: 100%;
175
+ max-width: 440px;
176
+ margin: 0 auto;
177
+ font-family: var(--bq-mono);
178
+ color: var(--bq-ink);
179
+ }
180
+
181
+ .bq-page-footer {
182
+ flex-shrink: 0;
183
+ text-align: center;
184
+ padding-top: 2rem;
185
+ }
186
+ .bq-page-footer-link {
187
+ font-family: var(--bq-mono);
188
+ font-size: 0.75rem;
189
+ color: var(--bq-muted);
190
+ text-decoration: none;
191
+ }
192
+ .bq-page-footer-link:hover { text-decoration: underline; }
193
+
194
+ .bq-settings-title {
195
+ font-size: 1.5rem;
196
+ font-weight: 700;
197
+ margin: 1.5rem 0 1.25rem;
198
+ letter-spacing: -0.01em;
199
+ }
200
+
201
+ .bq-settings-sub {
202
+ font-size: 0.82rem;
203
+ color: var(--bq-muted);
204
+ line-height: 1.6;
205
+ }
206
+
207
+ .bq-form {
208
+ display: flex;
209
+ flex-direction: column;
210
+ gap: 1.1rem;
211
+ }
212
+
213
+ .bq-label {
214
+ display: flex;
215
+ flex-direction: column;
216
+ gap: 0.4rem;
217
+ font-size: 0.8rem;
218
+ font-weight: 600;
219
+ letter-spacing: 0.04em;
220
+ }
221
+
222
+ .bq-input-text {
223
+ width: 100%;
224
+ padding: 0.7rem 0.8rem;
225
+ border: 1px solid var(--bq-line);
226
+ background: var(--bq-paper);
227
+ color: var(--bq-ink);
228
+ font-family: var(--bq-mono);
229
+ font-size: 0.9rem;
230
+ border-radius: 0;
231
+ outline: none;
232
+ transition: border-color 0.15s;
233
+ }
234
+ .bq-input-text::placeholder { color: var(--bq-placeholder); }
235
+ .bq-input-text:focus { border-color: var(--bq-ink); }
236
+ .bq-input-text:disabled { opacity: 0.5; cursor: default; }
237
+
238
+ .bq-actions {
239
+ display: flex;
240
+ justify-content: space-between;
241
+ align-items: center;
242
+ flex-wrap: wrap;
243
+ gap: 0.5rem;
244
+ font-size: 0.8rem;
245
+ }
246
+
247
+ .bq-link {
248
+ color: var(--bq-main);
249
+ cursor: pointer;
250
+ font-size: 0.8rem;
251
+ background: none;
252
+ border: 0;
253
+ padding: 0;
254
+ font-family: var(--bq-mono);
255
+ text-decoration: underline;
256
+ }
257
+ .bq-link:hover { text-decoration: none; }
258
+ .bq-link.disabled { opacity: 0.4; pointer-events: none; }
259
+
260
+ .bq-checkbox {
261
+ display: inline-flex;
262
+ align-items: center;
263
+ gap: 0.4rem;
264
+ font-size: 0.8rem;
265
+ cursor: pointer;
266
+ }
267
+
268
+ .bq-error {
269
+ padding: 0.75rem 1rem;
270
+ border: 1px solid var(--bq-danger);
271
+ background: var(--bq-danger-bg);
272
+ color: var(--bq-danger);
273
+ font-size: 0.8rem;
274
+ line-height: 1.5;
275
+ }
276
+
277
+ .bq-success-box {
278
+ padding: 0.75rem 1rem;
279
+ border: 1px solid var(--bq-success-border);
280
+ background: var(--bq-success-bg);
281
+ color: var(--bq-success);
282
+ font-size: 0.8rem;
283
+ line-height: 1.5;
284
+ }
285
+
286
+ .bq-form-bottom {
287
+ display: flex;
288
+ flex-direction: column;
289
+ gap: 1.25rem;
290
+ margin-top: 0.25rem;
291
+ }
292
+ .bq-form-bottom .btn { width: 100%; }
293
+
294
+ /* divider "OR" */
295
+ .bq-divider {
296
+ display: flex;
297
+ align-items: center;
298
+ gap: 1rem;
299
+ margin: 1.75rem 0;
300
+ }
301
+ .bq-divider-line { flex: 1; height: 1px; background: var(--bq-line); }
302
+ .bq-divider-text {
303
+ font-size: 0.7rem;
304
+ color: var(--bq-muted);
305
+ letter-spacing: 0.14em;
306
+ text-transform: uppercase;
307
+ }
308
+
309
+ /* Google button */
310
+ .bq-google {
311
+ display: flex;
312
+ align-items: center;
313
+ justify-content: center;
314
+ gap: 0.75rem;
315
+ width: 100%;
316
+ padding: 0.75rem 1rem;
317
+ border: 1px solid var(--bq-line);
318
+ background: var(--bq-paper);
319
+ font-family: var(--bq-mono);
320
+ font-size: 0.85rem;
321
+ color: var(--bq-ink);
322
+ cursor: pointer;
323
+ border-radius: 0;
324
+ box-shadow: 2px 2px rgba(0, 0, 0, 0.12);
325
+ transition: border-color 0.15s;
326
+ }
327
+ .bq-google:hover:not(:disabled) { border-color: var(--bq-ink); }
328
+ .bq-google:disabled { opacity: 0.4; pointer-events: none; }
329
+
330
+ /* small top nav inside setting views (back link + theme toggle) */
331
+ .bq-settings-top {
332
+ display: flex;
333
+ align-items: center;
334
+ justify-content: space-between;
335
+ margin-bottom: 0.5rem;
336
+ }
337
+
338
+ /* multi-step indicator text */
339
+ .bq-step-note {
340
+ font-size: 0.78rem;
341
+ color: var(--bq-muted);
342
+ margin-bottom: 1rem;
343
+ line-height: 1.6;
344
+ }
345
+
346
+ /* ---- settings ------------------------------------------------------------ */
347
+ .bq-settings-section-title {
348
+ font-size: 0.72rem;
349
+ font-weight: 700;
350
+ letter-spacing: 0.1em;
351
+ text-transform: uppercase;
352
+ color: var(--bq-ink);
353
+ margin: 1.75rem 0 0.25rem;
354
+ }
355
+ .bq-link--danger { color: var(--bq-danger); }
356
+ .bq-account-tip {
357
+ padding: 0.85rem 1rem;
358
+ margin-bottom: 1.5rem;
359
+ border: 1px solid var(--bq-warning-border);
360
+ background: var(--bq-warning-bg);
361
+ color: var(--bq-warning);
362
+ font-size: 0.82rem;
363
+ line-height: 1.5;
364
+ }
365
+ .bq-account-section { display: flex; flex-direction: column; }
366
+ .bq-account-row {
367
+ display: flex;
368
+ align-items: center;
369
+ justify-content: space-between;
370
+ gap: 1rem;
371
+ padding: 0.85rem 0;
372
+ border-bottom: 1px solid var(--bq-line);
373
+ }
374
+ .bq-account-row:last-child { border-bottom: 0; }
375
+ .bq-account-row-main { min-width: 0; }
376
+ .bq-theme-radios {
377
+ display: flex;
378
+ gap: 1rem;
379
+ flex-wrap: wrap;
380
+ justify-content: flex-end;
381
+ }
382
+ .bq-account-label {
383
+ font-size: 0.7rem;
384
+ font-weight: 600;
385
+ letter-spacing: 0.06em;
386
+ color: var(--bq-muted);
387
+ text-transform: uppercase;
388
+ }
389
+ .bq-account-value {
390
+ font-size: 0.9rem;
391
+ margin-top: 0.25rem;
392
+ overflow: hidden;
393
+ text-overflow: ellipsis;
394
+ white-space: nowrap;
395
+ }
396
+ .bq-account-value.is-muted { color: var(--bq-muted); }
397
+ .bq-verify-badge {
398
+ display: inline-block;
399
+ margin-left: 0.5rem;
400
+ padding: 0.05rem 0.4rem;
401
+ font-size: 0.66rem;
402
+ letter-spacing: 0.04em;
403
+ border: 1px solid var(--bq-line);
404
+ vertical-align: middle;
405
+ }
406
+ .bq-verify-badge.is-verified { color: var(--bq-success); border-color: var(--bq-success-border); background: var(--bq-success-bg); }
407
+ .bq-verify-badge.is-unverified { color: var(--bq-warning); border-color: var(--bq-warning-border); background: var(--bq-warning-bg); }
408
+ .bq-account-logout {
409
+ margin-top: 2rem;
410
+ text-align: right;
411
+ }
412
+ .bq-account-danger {
413
+ margin-top: 2rem;
414
+ padding: 1.25rem;
415
+ border: 1px solid var(--bq-danger);
416
+ background: var(--bq-danger-bg);
417
+ }
418
+ .bq-account-danger-title {
419
+ font-size: 0.72rem;
420
+ font-weight: 700;
421
+ letter-spacing: 0.1em;
422
+ text-transform: uppercase;
423
+ color: var(--bq-danger);
424
+ margin-bottom: 1rem;
425
+ }
426
+ .bq-account-danger-desc { font-size: 0.8rem; color: var(--bq-muted); line-height: 1.5; margin: 0 0 1rem; }
427
+ .bq-danger-item {
428
+ padding: 0.85rem 0;
429
+ border-top: 1px solid var(--bq-danger);
430
+ }
431
+ .bq-danger-item:first-of-type { border-top: 0; padding-top: 0; }
432
+ .bq-danger-item:last-child { padding-bottom: 0; }
433
+ .bq-danger-item-title { font-size: 0.85rem; font-weight: 600; color: var(--bq-danger); margin-bottom: 0.35rem; }
434
+ .bq-danger-item-desc { font-size: 0.78rem; color: var(--bq-muted); line-height: 1.5; margin: 0 0 0.85rem; }
435
+ .bq-danger-item .btn { min-width: 0; }
436
+
437
+ /* ============================================================================
438
+ * CHAT VIEW
439
+ * ==========================================================================*/
440
+ .bq-meta {
441
+ display: flex;
442
+ flex-direction: column;
443
+ flex: 1;
444
+ min-height: 0;
445
+ }
446
+
447
+ .bq-section-title {
448
+ display: flex;
449
+ flex-direction: column;
450
+ gap: 0.5rem;
451
+ font-size: 1.1rem;
452
+ font-weight: 700;
453
+ padding: 1rem 1.25rem 0.75rem;
454
+ flex-shrink: 0;
455
+ }
456
+
457
+ .bq-title-row {
458
+ display: flex;
459
+ justify-content: space-between;
460
+ align-items: center;
461
+ gap: 0.5rem;
462
+ }
463
+ .bq-title-left,
464
+ .bq-title-right {
465
+ display: flex;
466
+ align-items: center;
467
+ gap: 0.5rem;
468
+ }
469
+
470
+ /* read-only agent (platform + model) badge */
471
+ .bq-agent-badge {
472
+ display: inline-flex;
473
+ align-items: center;
474
+ gap: 0.45rem;
475
+ padding: 0.3rem 0.6rem;
476
+ border: 1px solid var(--bq-line);
477
+ background: var(--bq-paper);
478
+ font-size: 0.75rem;
479
+ font-family: var(--bq-mono);
480
+ color: var(--bq-ink);
481
+ max-width: 100%;
482
+ overflow: hidden;
483
+ }
484
+ .bq-agent-badge-logo {
485
+ width: 1.1rem;
486
+ height: 1.1rem;
487
+ object-fit: contain;
488
+ flex: 0 0 auto;
489
+ }
490
+ .bq-agent-badge-model {
491
+ color: var(--bq-muted);
492
+ overflow: hidden;
493
+ text-overflow: ellipsis;
494
+ white-space: nowrap;
495
+ }
496
+
497
+ /* header icon buttons (theme, clear, account) */
498
+ .bq-icon-btn {
499
+ display: inline-flex;
500
+ align-items: center;
501
+ justify-content: center;
502
+ width: 2rem;
503
+ height: 2rem;
504
+ padding: 0;
505
+ border: none;
506
+ background: transparent;
507
+ color: var(--bq-muted);
508
+ cursor: pointer;
509
+ transition: color 0.15s;
510
+ border-radius: 0;
511
+ }
512
+ .bq-icon-btn:hover { color: var(--bq-main); }
513
+ .bq-icon-btn.is-active { color: var(--bq-main); }
514
+ .bq-icon-btn--danger:hover { color: var(--bq-danger); }
515
+ .bq-icon-btn:disabled { opacity: 0.3; pointer-events: none; }
516
+ .bq-icon-btn svg { width: 1.25rem; height: 1.25rem; display: block; }
517
+
518
+ /* settings shown in place inside the chat's messages area */
519
+ .bq-chat-settings {
520
+ width: 100%;
521
+ max-width: 440px;
522
+ margin: 0 auto;
523
+ padding: 1.25rem 0 2rem;
524
+ }
525
+ .bq-chat-settings-loading { text-align: center; padding: 2.5rem 0; color: var(--bq-muted); }
526
+
527
+ /* chat container + scroll area */
528
+ .bq-chat {
529
+ position: relative;
530
+ display: flex;
531
+ flex-direction: column;
532
+ flex: 1;
533
+ min-height: 0;
534
+ }
535
+ .bq-messages {
536
+ position: relative;
537
+ overflow-y: auto;
538
+ overflow-x: hidden;
539
+ flex: 1;
540
+ min-height: 0;
541
+ padding: 0.25rem 1.25rem;
542
+ background: var(--bq-paper);
543
+ }
544
+
545
+ .bq-history-loading {
546
+ position: sticky;
547
+ top: 0;
548
+ z-index: 1;
549
+ display: flex;
550
+ justify-content: center;
551
+ gap: 0.1em;
552
+ padding: 0.5rem 0 1rem;
553
+ font-size: 0.8rem;
554
+ color: var(--bq-muted);
555
+ background: var(--bq-paper);
556
+ }
557
+ /* initial first-page load: center it in the (empty) messages area */
558
+ .bq-history-loading.is-initial {
559
+ position: absolute;
560
+ inset: 0;
561
+ align-items: center;
562
+ padding: 0;
563
+ }
564
+
565
+ /* "admin hasn't set up the agent" / disabled overlay */
566
+ .bq-disabled-overlay {
567
+ position: absolute;
568
+ inset: 0;
569
+ z-index: 4;
570
+ display: flex;
571
+ align-items: center;
572
+ justify-content: center;
573
+ background: var(--bq-paper);
574
+ padding: 1.5rem;
575
+ }
576
+ .bq-disabled-inner {
577
+ display: flex;
578
+ flex-direction: column;
579
+ align-items: center;
580
+ gap: 0.85rem;
581
+ text-align: center;
582
+ max-width: 28rem;
583
+ color: var(--bq-muted);
584
+ font-size: 0.88rem;
585
+ line-height: 1.5;
586
+ }
587
+
588
+ /* drag-drop overlay */
589
+ .bq-drop-overlay {
590
+ position: absolute;
591
+ inset: 0;
592
+ z-index: 5;
593
+ display: flex;
594
+ align-items: center;
595
+ justify-content: center;
596
+ background: var(--bq-paper);
597
+ border: 2px dashed var(--bq-main);
598
+ pointer-events: none;
599
+ opacity: 0.92;
600
+ }
601
+ .bq-drop-overlay-inner {
602
+ display: flex;
603
+ flex-direction: column;
604
+ align-items: center;
605
+ gap: 0.5rem;
606
+ color: var(--bq-main);
607
+ font-size: 0.9rem;
608
+ font-weight: 600;
609
+ }
610
+
611
+ /* messages + bubbles: the CORE conversation styling (bubble padding/colors,
612
+ rendered markdown, in-bubble link anchors, queue/cancel affordances) is
613
+ authored ONCE in @skapi/chat-engine/styles/chat.css and concatenated onto
614
+ this file by the build (scripts/build-css.mjs). Only the widget-specific
615
+ container bits stay here. */
616
+ .bq-bubble { max-width: 85%; }
617
+ .bq-empty-greeting .bq-bubble { color: var(--bq-muted); }
618
+
619
+ /* ---- composer / input row ------------------------------------------------*/
620
+ .bq-input-row {
621
+ --chat-control-height: 2.6rem;
622
+ display: flex;
623
+ flex-shrink: 0;
624
+ gap: 0.65rem;
625
+ padding: 0.65rem 1.25rem 1.25rem;
626
+ background: var(--bq-paper);
627
+ flex-wrap: wrap;
628
+ }
629
+ .bq-input-wrap {
630
+ position: relative;
631
+ flex: 1;
632
+ display: flex;
633
+ min-width: 0;
634
+ }
635
+ .bq-attach-btn {
636
+ position: absolute;
637
+ top: 0;
638
+ left: 0;
639
+ display: inline-flex;
640
+ align-items: center;
641
+ justify-content: center;
642
+ width: var(--chat-control-height);
643
+ height: var(--chat-control-height);
644
+ padding: 0;
645
+ border: none;
646
+ background: transparent;
647
+ color: var(--bq-muted);
648
+ cursor: pointer;
649
+ z-index: 1;
650
+ }
651
+ .bq-attach-btn:hover:not(:disabled) { color: var(--bq-main); }
652
+ .bq-attach-btn:disabled { opacity: 0.5; cursor: not-allowed; }
653
+ .bq-attach-input { display: none; }
654
+ .bq-input {
655
+ flex: 1;
656
+ min-height: var(--chat-control-height);
657
+ max-height: 12rem;
658
+ box-sizing: border-box;
659
+ overflow-y: hidden; /* autoGrowInput switches to auto only at the max-height cap */
660
+ resize: none;
661
+ border: 1px solid var(--bq-line);
662
+ background: var(--bq-paper);
663
+ color: var(--bq-ink);
664
+ padding: 0.7rem 0.7rem 0.7rem var(--chat-control-height);
665
+ font-family: var(--bq-mono);
666
+ font-size: 0.83rem;
667
+ line-height: 1.4;
668
+ border-radius: 0;
669
+ }
670
+ .bq-input::placeholder { color: var(--bq-placeholder); }
671
+ .bq-input:focus { outline: none; border-color: var(--bq-ink); }
672
+ .bq-input:disabled { opacity: 0.5; cursor: default; }
673
+ .bq-input-row .btn {
674
+ align-self: flex-end;
675
+ min-width: 5.5rem;
676
+ height: var(--chat-control-height);
677
+ }
678
+
679
+ /* ---- attachment chips ----------------------------------------------------*/
680
+ .bq-attachments {
681
+ flex-basis: 100%;
682
+ display: flex;
683
+ flex-wrap: wrap;
684
+ gap: 0.4rem;
685
+ padding: 0 0 0.5rem;
686
+ }
687
+ .bq-attachment {
688
+ display: inline-flex;
689
+ align-items: center;
690
+ gap: 0.35rem;
691
+ max-width: 18rem;
692
+ padding: 0.3rem 0.5rem;
693
+ border: 1px solid var(--bq-line);
694
+ background: var(--bq-paper);
695
+ font-size: 0.78rem;
696
+ font-family: var(--bq-mono);
697
+ position: relative;
698
+ overflow: hidden;
699
+ isolation: isolate;
700
+ }
701
+ .bq-attachment.is-uploading::before {
702
+ content: "";
703
+ position: absolute;
704
+ inset: 0 auto 0 0;
705
+ width: var(--att-progress, 0%);
706
+ /* theme-reactive tint (matches agent.vue's fade()→color-mix() change) */
707
+ background: color-mix(in srgb, var(--bq-main) 18%, transparent);
708
+ transition: width 0.15s linear;
709
+ z-index: 0;
710
+ pointer-events: none;
711
+ }
712
+ .bq-attachment.is-uploading > * { position: relative; z-index: 1; }
713
+ .bq-attachment.is-error { border-color: var(--bq-danger); background: var(--bq-danger-bg); }
714
+ .bq-attachment.is-error .bq-attachment-meta,
715
+ .bq-attachment.is-error .bq-attachment-name { color: var(--bq-danger); }
716
+ .bq-attachment.is-index-error { border-color: var(--bq-warning-border); background: var(--bq-warning-bg); }
717
+ .bq-attachment.is-index-error .bq-attachment-meta,
718
+ .bq-attachment.is-index-error .bq-attachment-name { color: var(--bq-warning); }
719
+ .bq-attachment.is-done { border-color: var(--bq-success-border); background: var(--bq-success-bg); }
720
+ .bq-attachment.is-done .bq-attachment-meta { color: var(--bq-success); }
721
+ .bq-attachment.is-clickable { cursor: pointer; transition: background 0.12s, border-color 0.12s; }
722
+ .bq-attachment.is-clickable:hover { background: var(--bq-hover-bg); border-color: var(--bq-ink); }
723
+ .bq-attachment-icon { flex: 0 0 16px; color: var(--bq-muted); display: inline-flex; }
724
+ .bq-attachment-icon svg { width: 16px; height: 16px; }
725
+ .bq-attachment-arrow { flex: 0 0 auto; font-size: 0.95rem; line-height: 1; color: var(--bq-muted); }
726
+ .bq-attachment.is-done .bq-attachment-arrow { color: var(--bq-ink); }
727
+ .bq-attachment-name {
728
+ overflow: hidden;
729
+ text-overflow: ellipsis;
730
+ white-space: nowrap;
731
+ max-width: 12rem;
732
+ }
733
+ .bq-attachment-meta { color: var(--bq-muted); flex-shrink: 0; }
734
+ .bq-attachment-more { color: var(--bq-muted); font-style: italic; }
735
+ .bq-attachment-remove-all {
736
+ display: inline-flex;
737
+ align-items: center;
738
+ gap: 0.2rem;
739
+ padding: 0.3rem 0.5rem;
740
+ border: 1px dashed var(--bq-line);
741
+ background: transparent;
742
+ color: var(--bq-muted);
743
+ font-family: var(--bq-mono);
744
+ font-size: 0.72rem;
745
+ cursor: pointer;
746
+ align-self: center;
747
+ }
748
+ .bq-attachment-remove-all:hover { color: var(--bq-danger); border-color: var(--bq-danger); }
749
+ .bq-attachment-remove {
750
+ display: inline-flex;
751
+ align-items: center;
752
+ justify-content: center;
753
+ width: 1.2rem;
754
+ height: 1.2rem;
755
+ margin-left: 0.15rem;
756
+ padding: 0;
757
+ border: none;
758
+ background: transparent;
759
+ color: var(--bq-muted);
760
+ font-size: 1rem;
761
+ cursor: pointer;
762
+ }
763
+ .bq-attachment-remove:hover { color: var(--bq-ink); }
764
+
765
+ .bq-attachment-warning {
766
+ flex-basis: 100%;
767
+ display: flex;
768
+ align-items: flex-start;
769
+ gap: 0.4rem;
770
+ padding: 0.4rem 0.5rem;
771
+ margin-bottom: 0.4rem;
772
+ border: 1px solid var(--bq-danger);
773
+ background: var(--bq-danger-bg);
774
+ color: var(--bq-danger);
775
+ font-size: 0.75rem;
776
+ line-height: 1.3;
777
+ }
778
+
779
+ /* ============================================================================
780
+ * MODALS (appended to <body> under .bq-modal-root)
781
+ * ==========================================================================*/
782
+ .bq-modal-root {
783
+ position: fixed;
784
+ inset: 0;
785
+ z-index: 2147483000;
786
+ display: flex;
787
+ align-items: center;
788
+ justify-content: center;
789
+ padding: 1rem;
790
+ font-family: var(--bq-mono);
791
+ }
792
+ .bq-modal-backdrop {
793
+ position: absolute;
794
+ inset: 0;
795
+ background: rgba(0, 0, 0, 0.45);
796
+ }
797
+ .bq-modal {
798
+ position: relative;
799
+ z-index: 1;
800
+ width: 28rem;
801
+ max-width: 100%;
802
+ max-height: 90vh;
803
+ overflow-y: auto;
804
+ background: var(--bq-paper);
805
+ color: var(--bq-ink);
806
+ border: 1px solid var(--bq-line);
807
+ box-shadow: 4px 4px rgba(0, 0, 0, 0.2);
808
+ padding: 2rem;
809
+ }
810
+ .bq-modal-close {
811
+ position: absolute;
812
+ top: 1rem;
813
+ right: 1.25rem;
814
+ font-size: 1.5rem;
815
+ line-height: 1;
816
+ cursor: pointer;
817
+ color: var(--bq-muted);
818
+ background: none;
819
+ border: 0;
820
+ }
821
+ .bq-modal-close:hover { color: var(--bq-ink); }
822
+ .bq-modal-title { margin: 0 0 0.75rem; font-size: 1.2rem; font-weight: 700; }
823
+ .bq-modal-desc { margin: 0 0 1.25rem; font-size: 0.85rem; color: var(--bq-muted); line-height: 1.6; }
824
+ .bq-modal-btns { display: flex; gap: 0.75rem; justify-content: flex-end; align-items: center; }
825
+
826
+ /* delete/clear (danger) modal accents */
827
+ .bq-modal-delete-header {
828
+ display: flex;
829
+ align-items: center;
830
+ gap: 0.5rem;
831
+ font-size: 0.95rem;
832
+ font-weight: 600;
833
+ color: var(--bq-danger);
834
+ margin-bottom: 1rem;
835
+ }
836
+ .bq-modal-delete-warn { color: var(--bq-muted); font-size: 0.78rem; }
837
+ .btn--danger {
838
+ background: var(--bq-danger);
839
+ border-color: var(--bq-danger);
840
+ color: var(--bq-paper);
841
+ }
842
+
843
+ /* "apply to all remaining files" checkbox in the overwrite/reindex prompt */
844
+ .bq-overwrite-applyall {
845
+ display: flex;
846
+ align-items: center;
847
+ gap: 0.4rem;
848
+ margin: -0.5rem 0 1.25rem;
849
+ font-size: 0.82rem;
850
+ color: var(--bq-ink);
851
+ cursor: pointer;
852
+ user-select: none;
853
+ }
854
+ .bq-overwrite-applyall input { cursor: pointer; margin: 0; }
855
+
856
+ /* ============================================================================
857
+ * RESPONSIVE
858
+ * ==========================================================================*/
859
+ @media (max-width: 600px) {
860
+ /* .bq-meta { padding: 0.75rem; } */
861
+ .bq-input-row { flex-direction: column; padding: 0.65rem 0.75rem 0.75rem; }
862
+ .bq-input-wrap { width: 100%; flex: 0 0 auto; }
863
+ .bq-input-row .btn { width: 100%; }
864
+ .bq-bubble { max-width: 100%; }
865
+ .bq-page { padding: 2rem 1.25rem; }
866
+ .bq-section-title { padding: 0.75rem; }
867
+ .bq-messages { padding: 0.25rem 0.75rem; }
868
+ }
869
+
870
+ /* dark-mode: brighten any inline dark SVG icons (e.g. provider logos) */
871
+ .bq-agent[data-bq-theme="dark"] .bq-icon-invertible,
872
+ .bq-modal-root[data-bq-theme="dark"] .bq-icon-invertible {
873
+ filter: invert(var(--bq-icon-invert));
874
+ }