iris-chatbot 0.2.4

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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/bin/iris.mjs +267 -0
  4. package/package.json +61 -0
  5. package/template/LICENSE +21 -0
  6. package/template/README.md +49 -0
  7. package/template/eslint.config.mjs +18 -0
  8. package/template/next.config.ts +7 -0
  9. package/template/package-lock.json +9193 -0
  10. package/template/package.json +46 -0
  11. package/template/postcss.config.mjs +7 -0
  12. package/template/public/file.svg +1 -0
  13. package/template/public/globe.svg +1 -0
  14. package/template/public/next.svg +1 -0
  15. package/template/public/vercel.svg +1 -0
  16. package/template/public/window.svg +1 -0
  17. package/template/src/app/api/chat/route.ts +2445 -0
  18. package/template/src/app/api/connections/models/route.ts +255 -0
  19. package/template/src/app/api/connections/test/route.ts +124 -0
  20. package/template/src/app/api/local-sync/route.ts +74 -0
  21. package/template/src/app/api/tool-approval/route.ts +47 -0
  22. package/template/src/app/favicon.ico +0 -0
  23. package/template/src/app/globals.css +808 -0
  24. package/template/src/app/layout.tsx +74 -0
  25. package/template/src/app/page.tsx +444 -0
  26. package/template/src/components/ChatView.tsx +1537 -0
  27. package/template/src/components/Composer.tsx +160 -0
  28. package/template/src/components/MapView.tsx +244 -0
  29. package/template/src/components/MessageCard.tsx +955 -0
  30. package/template/src/components/SearchModal.tsx +72 -0
  31. package/template/src/components/SettingsModal.tsx +1257 -0
  32. package/template/src/components/Sidebar.tsx +153 -0
  33. package/template/src/components/TopBar.tsx +164 -0
  34. package/template/src/lib/connections.ts +275 -0
  35. package/template/src/lib/data.ts +324 -0
  36. package/template/src/lib/db.ts +49 -0
  37. package/template/src/lib/hooks.ts +76 -0
  38. package/template/src/lib/local-sync.ts +192 -0
  39. package/template/src/lib/memory.ts +695 -0
  40. package/template/src/lib/model-presets.ts +251 -0
  41. package/template/src/lib/store.ts +36 -0
  42. package/template/src/lib/tooling/approvals.ts +78 -0
  43. package/template/src/lib/tooling/providers/anthropic.ts +155 -0
  44. package/template/src/lib/tooling/providers/ollama.ts +73 -0
  45. package/template/src/lib/tooling/providers/openai.ts +267 -0
  46. package/template/src/lib/tooling/providers/openai_compatible.ts +16 -0
  47. package/template/src/lib/tooling/providers/types.ts +44 -0
  48. package/template/src/lib/tooling/registry.ts +103 -0
  49. package/template/src/lib/tooling/runtime.ts +189 -0
  50. package/template/src/lib/tooling/safety.ts +165 -0
  51. package/template/src/lib/tooling/tools/apps.ts +108 -0
  52. package/template/src/lib/tooling/tools/apps_plus.ts +153 -0
  53. package/template/src/lib/tooling/tools/communication.ts +883 -0
  54. package/template/src/lib/tooling/tools/files.ts +395 -0
  55. package/template/src/lib/tooling/tools/music.ts +988 -0
  56. package/template/src/lib/tooling/tools/notes.ts +461 -0
  57. package/template/src/lib/tooling/tools/notes_plus.ts +294 -0
  58. package/template/src/lib/tooling/tools/numbers.ts +175 -0
  59. package/template/src/lib/tooling/tools/schedule.ts +579 -0
  60. package/template/src/lib/tooling/tools/system.ts +142 -0
  61. package/template/src/lib/tooling/tools/web.ts +212 -0
  62. package/template/src/lib/tooling/tools/workflow.ts +218 -0
  63. package/template/src/lib/tooling/types.ts +27 -0
  64. package/template/src/lib/types.ts +309 -0
  65. package/template/src/lib/utils.ts +108 -0
  66. package/template/tsconfig.json +34 -0
@@ -0,0 +1,808 @@
1
+ @import "tailwindcss";
2
+ @import "reactflow/dist/style.css";
3
+
4
+ :root {
5
+ --topbar-height: 64px;
6
+ --bg: #171819;
7
+ --bg-alt: #1b1c1d;
8
+ --sidebar: #181818;
9
+ --sidebar-border: #202020;
10
+ --panel: #202122;
11
+ --panel-2: #242526;
12
+ --panel-3: #2b2d2f;
13
+ --text-primary: #f8fafc;
14
+ --text-secondary: #d8dce0;
15
+ --text-muted: #b1b7bf;
16
+ --accent: #10a37f;
17
+ --accent-2: #0e8e6f;
18
+ --danger: #ef4444;
19
+ --border: #2a2a2a;
20
+ --border-strong: #3a3a3a;
21
+ --shadow: 0 20px 50px rgba(0, 0, 0, 0.35);
22
+ --user-bubble: #0f2f28;
23
+ }
24
+
25
+ @theme inline {
26
+ --color-background: var(--bg);
27
+ --color-foreground: var(--text-primary);
28
+ --font-sans: var(--font-sans);
29
+ --font-mono: var(--font-mono);
30
+ }
31
+
32
+ * {
33
+ box-sizing: border-box;
34
+ scrollbar-width: thin;
35
+ scrollbar-color: var(--border-strong) transparent;
36
+ }
37
+
38
+ body {
39
+ background: var(--bg);
40
+ color: var(--text-primary);
41
+ font-family: var(--app-font, var(--font-sans));
42
+ min-height: 100vh;
43
+ -webkit-font-smoothing: antialiased;
44
+ text-rendering: optimizeLegibility;
45
+ }
46
+
47
+ a {
48
+ color: var(--accent);
49
+ }
50
+
51
+ .chat-shell {
52
+ display: grid;
53
+ grid-template-columns: 248px minmax(0, 1fr);
54
+ min-height: 100vh;
55
+ transition: grid-template-columns 0.25s ease;
56
+ }
57
+
58
+ .chat-shell.collapsed {
59
+ grid-template-columns: 56px minmax(0, 1fr);
60
+ }
61
+
62
+ .sidebar {
63
+ background: var(--sidebar);
64
+ border-right: 1px solid var(--sidebar-border);
65
+ position: sticky;
66
+ top: 0;
67
+ height: 100vh;
68
+ overflow-y: auto;
69
+ transition: background 0.25s ease, width 0.25s ease;
70
+ }
71
+
72
+ .sidebar.collapsed {
73
+ background: var(--bg);
74
+ }
75
+
76
+ .sidebar.collapsed .sidebar-text {
77
+ display: none;
78
+ }
79
+
80
+ .topbar {
81
+ border-bottom: none;
82
+ background: transparent !important;
83
+ backdrop-filter: none;
84
+ box-shadow: none;
85
+ position: sticky;
86
+ top: 0;
87
+ z-index: 40;
88
+ height: var(--topbar-height);
89
+ }
90
+
91
+
92
+ .message-card {
93
+ border-radius: 14px;
94
+ padding: 8px 18px;
95
+ border: 1px solid var(--border);
96
+ background: var(--panel);
97
+ box-shadow: 0 1px 0 rgba(255, 255, 255, 0.02);
98
+ max-width: 70%;
99
+ }
100
+
101
+ .message-card.user {
102
+ background: var(--accent);
103
+ border-color: var(--accent);
104
+ border-radius: 18px 18px 6px 18px;
105
+ max-width: 80%;
106
+ padding-top: 10px;
107
+ padding-bottom: 10px;
108
+ padding-left: 16px;
109
+ padding-right: 16px;
110
+ }
111
+
112
+ .message-card.user .message-content {
113
+ display: flex;
114
+ align-items: center;
115
+ min-height: 1.4em;
116
+ line-height: 1.45;
117
+ }
118
+
119
+ .message-row.user .message-content p {
120
+ margin: 0;
121
+ }
122
+
123
+ .message-row.user .message-content > :first-child,
124
+ .message-row.user .message-content > :last-child {
125
+ margin-top: 0;
126
+ margin-bottom: 0;
127
+ }
128
+
129
+ .assistant-card {
130
+ max-width: 100%;
131
+ width: 100%;
132
+ padding: 0;
133
+ border: none;
134
+ background: transparent;
135
+ position: relative;
136
+ }
137
+
138
+ .assistant-tool-timeline {
139
+ width: 100%;
140
+ max-width: 100%;
141
+ }
142
+
143
+ .assistant-collapse-row {
144
+ position: absolute;
145
+ top: 2px;
146
+ right: 0;
147
+ opacity: 0;
148
+ pointer-events: none;
149
+ transition: opacity 0.2s ease;
150
+ }
151
+
152
+ .assistant-card:hover .assistant-collapse-row {
153
+ opacity: 1;
154
+ pointer-events: auto;
155
+ }
156
+
157
+ .assistant-collapse-toggle {
158
+ border: 1px solid var(--border);
159
+ background: transparent;
160
+ color: var(--text-secondary);
161
+ border-radius: 999px;
162
+ width: 28px;
163
+ height: 28px;
164
+ display: inline-flex;
165
+ align-items: center;
166
+ justify-content: center;
167
+ transition: border-color 0.2s ease, color 0.2s ease, background 0.2s ease;
168
+ }
169
+
170
+ .assistant-collapse-toggle:hover {
171
+ border-color: var(--border-strong);
172
+ color: var(--text-primary);
173
+ background: var(--panel-2);
174
+ }
175
+
176
+ .assistant-collapsed-preview {
177
+ color: var(--text-secondary);
178
+ margin: 0;
179
+ cursor: pointer;
180
+ transition: color 0.15s ease;
181
+ }
182
+
183
+ .assistant-collapsed-preview:hover,
184
+ .assistant-collapsed-preview:focus-visible {
185
+ color: var(--text-primary);
186
+ outline: none;
187
+ }
188
+
189
+ .assistant-card .message-content {
190
+ padding-right: 42px;
191
+ }
192
+
193
+ .message-row {
194
+ display: flex;
195
+ width: 100%;
196
+ }
197
+
198
+ .message-row.user {
199
+ justify-content: flex-end;
200
+ }
201
+
202
+ .message-row.assistant {
203
+ justify-content: flex-start;
204
+ }
205
+
206
+ .message-stack {
207
+ display: flex;
208
+ flex-direction: column;
209
+ gap: 12px;
210
+ padding: 0 12px;
211
+ width: 100%;
212
+ }
213
+
214
+ .message-row.user .message-stack {
215
+ align-items: flex-end;
216
+ padding-right: 0;
217
+ padding-left: 0;
218
+ }
219
+
220
+ .message-row.assistant .message-stack {
221
+ align-items: flex-start;
222
+ }
223
+
224
+ .message-row.user .message-actions,
225
+ .message-row.user .message-card {
226
+ align-self: flex-end;
227
+ }
228
+
229
+ .message-actions {
230
+ display: flex;
231
+ gap: 10px;
232
+ }
233
+
234
+ .message-actions.user {
235
+ justify-content: flex-end;
236
+ }
237
+
238
+ .message-actions.assistant {
239
+ justify-content: flex-start;
240
+ }
241
+
242
+ .message-content {
243
+ line-height: 1.6;
244
+ font-size: 15px;
245
+ color: var(--text-primary);
246
+ overflow-wrap: anywhere;
247
+ word-break: break-word;
248
+ min-width: 0;
249
+ }
250
+
251
+ .assistant-card .message-content {
252
+ color: #f8fafc;
253
+ }
254
+
255
+ .message-loading-spinner {
256
+ width: 20px;
257
+ height: 20px;
258
+ border-radius: 999px;
259
+ border: 2px solid var(--border-strong);
260
+ border-top-color: var(--accent);
261
+ animation: message-spinner-rotate 0.8s linear infinite;
262
+ margin: 4px 0;
263
+ }
264
+
265
+ @keyframes message-spinner-rotate {
266
+ to {
267
+ transform: rotate(360deg);
268
+ }
269
+ }
270
+
271
+ .composer-bar {
272
+ position: sticky;
273
+ bottom: 0;
274
+ background: transparent;
275
+ z-index: 30;
276
+ }
277
+
278
+ .empty-hero {
279
+ min-height: calc(100vh - var(--topbar-height) - 140px);
280
+ display: flex;
281
+ flex-direction: column;
282
+ align-items: center;
283
+ justify-content: center;
284
+ text-align: center;
285
+ gap: 18px;
286
+ }
287
+
288
+ .empty-hero-title {
289
+ transform: translateY(-34px);
290
+ }
291
+
292
+ .empty-composer {
293
+ width: min(720px, 90%);
294
+ }
295
+
296
+ [data-theme="light"] {
297
+ --bg: #f4f4f4;
298
+ --bg-alt: #f8f8f8;
299
+ --sidebar: #ffffff;
300
+ --sidebar-border: #e5e5e5;
301
+ --panel: #ffffff;
302
+ --panel-2: #f0f0f0;
303
+ --panel-3: #e8e8e8;
304
+ --text-primary: #111111;
305
+ --text-secondary: #4a4a4a;
306
+ --text-muted: #6f6f6f;
307
+ --accent: #0e8e6f;
308
+ --accent-2: #0b7a5f;
309
+ --danger: #dc2626;
310
+ --border: #d5d5d5;
311
+ --border-strong: #bdbdbd;
312
+ --shadow: 0 18px 40px rgba(0, 0, 0, 0.15);
313
+ --user-bubble: #d7f2ea;
314
+ }
315
+
316
+ .message-content h1,
317
+ .message-content h2,
318
+ .message-content h3,
319
+ .message-content h4 {
320
+ font-weight: 760;
321
+ color: var(--text-primary);
322
+ line-height: 1.25;
323
+ margin: 1.05em 0 0.55em;
324
+ }
325
+
326
+ .message-content h1 { font-size: 1.5rem; }
327
+ .message-content h2 { font-size: 1.3rem; }
328
+ .message-content h3 { font-size: 1.14rem; }
329
+ .message-content h4 { font-size: 1.03rem; }
330
+
331
+ .message-content > :first-child {
332
+ margin-top: 0;
333
+ }
334
+
335
+ .message-content p {
336
+ margin: 0.6em 0;
337
+ }
338
+
339
+ .message-content ul,
340
+ .message-content ol {
341
+ margin: 0.6em 0;
342
+ padding-left: 1.5rem;
343
+ }
344
+
345
+ .message-content ul { list-style: disc; }
346
+ .message-content ol { list-style: decimal; }
347
+
348
+ .message-content li {
349
+ margin: 0.28em 0;
350
+ }
351
+
352
+ .message-content li > ul,
353
+ .message-content li > ol {
354
+ margin: 0.35em 0 0.15em;
355
+ }
356
+
357
+ .message-content .md-table-wrap {
358
+ position: relative;
359
+ margin: 0.9em 0;
360
+ border: 1px solid var(--border-strong);
361
+ border-radius: 12px;
362
+ overflow-x: auto;
363
+ overflow-y: hidden;
364
+ }
365
+
366
+ .message-content table {
367
+ width: 100%;
368
+ border-collapse: separate;
369
+ border-spacing: 0;
370
+ margin: 0;
371
+ }
372
+
373
+ .message-content th,
374
+ .message-content td {
375
+ padding: 8px 10px;
376
+ text-align: left;
377
+ border-right: 1px solid var(--border-strong);
378
+ border-bottom: 1px solid var(--border-strong);
379
+ }
380
+
381
+ .message-content tr > :last-child {
382
+ border-right: 0;
383
+ }
384
+
385
+ .message-content tbody tr:last-child td {
386
+ border-bottom: 0;
387
+ }
388
+
389
+ .message-content thead {
390
+ background: var(--panel-3);
391
+ }
392
+
393
+ .message-content code {
394
+ font-family: var(--font-mono);
395
+ background: rgba(255, 255, 255, 0.08);
396
+ padding: 2px 4px;
397
+ border-radius: 6px;
398
+ font-size: 0.9em;
399
+ }
400
+
401
+ .message-content pre {
402
+ background: #101010;
403
+ border: 1px solid var(--border-strong);
404
+ border-radius: 12px;
405
+ padding: 14px 16px;
406
+ overflow: auto;
407
+ margin: 0.8em 0;
408
+ }
409
+
410
+ .message-content pre code {
411
+ background: transparent;
412
+ padding: 0;
413
+ }
414
+
415
+ .message-content strong {
416
+ font-weight: 760;
417
+ color: var(--text-primary);
418
+ }
419
+
420
+ .message-content em {
421
+ font-style: italic;
422
+ }
423
+
424
+ .message-content blockquote {
425
+ border-left: 3px solid var(--border-strong);
426
+ padding-left: 12px;
427
+ color: var(--text-secondary);
428
+ margin: 0.8em 0;
429
+ }
430
+
431
+ .message-content a {
432
+ color: var(--accent);
433
+ text-decoration: underline;
434
+ text-decoration-thickness: 1px;
435
+ text-underline-offset: 2px;
436
+ }
437
+
438
+ .source-badge-row {
439
+ margin-top: 10px;
440
+ display: flex;
441
+ flex-wrap: wrap;
442
+ gap: 8px;
443
+ }
444
+
445
+ .source-badge {
446
+ display: inline-flex;
447
+ align-items: center;
448
+ gap: 6px;
449
+ padding: 5px 10px;
450
+ border-radius: 999px;
451
+ border: 1px solid var(--border);
452
+ background: var(--panel-2);
453
+ color: var(--text-secondary);
454
+ text-decoration: none;
455
+ font-size: 12px;
456
+ line-height: 1;
457
+ max-width: 220px;
458
+ transition: border-color 0.18s ease, color 0.18s ease, background 0.18s ease;
459
+ }
460
+
461
+ .source-badge:hover {
462
+ border-color: var(--border-strong);
463
+ color: var(--text-primary);
464
+ background: var(--panel-3);
465
+ }
466
+
467
+ .source-badge-index {
468
+ display: inline-flex;
469
+ align-items: center;
470
+ justify-content: center;
471
+ min-width: 16px;
472
+ height: 16px;
473
+ border-radius: 999px;
474
+ border: 1px solid var(--border-strong);
475
+ color: var(--text-muted);
476
+ font-size: 10px;
477
+ font-weight: 700;
478
+ }
479
+
480
+ .source-badge-title {
481
+ overflow: hidden;
482
+ text-overflow: ellipsis;
483
+ white-space: nowrap;
484
+ }
485
+
486
+ .message-content hr {
487
+ border: 0;
488
+ border-top: 1px solid var(--border);
489
+ margin: 1.1em 0;
490
+ }
491
+
492
+ .composer {
493
+ background: var(--panel);
494
+ border: 1px solid var(--border);
495
+ border-radius: 18px;
496
+ padding: 10px 12px;
497
+ }
498
+
499
+ .thread-shelf {
500
+ margin-top: 12px;
501
+ padding-top: 8px;
502
+ display: flex;
503
+ align-items: center;
504
+ gap: 10px;
505
+ flex-wrap: nowrap;
506
+ overflow-x: auto;
507
+ scrollbar-width: none;
508
+ }
509
+
510
+ .thread-shelf::-webkit-scrollbar {
511
+ display: none;
512
+ }
513
+
514
+ .thread-box-wrap {
515
+ position: relative;
516
+ display: inline-flex;
517
+ align-items: center;
518
+ z-index: 0;
519
+ }
520
+
521
+ .thread-box {
522
+ border: 1px solid var(--border);
523
+ border-radius: 12px;
524
+ padding: 10px 14px;
525
+ background: var(--panel-3);
526
+ font-size: 13px;
527
+ color: var(--text-secondary);
528
+ display: inline-flex;
529
+ align-items: center;
530
+ gap: 8px;
531
+ width: fit-content;
532
+ margin-right: 6px;
533
+ }
534
+
535
+ .thread-box.active {
536
+ border-color: var(--accent);
537
+ color: var(--text-primary);
538
+ }
539
+
540
+ .thread-delete {
541
+ position: absolute;
542
+ top: -6px;
543
+ right: -2px;
544
+ height: 18px;
545
+ width: 18px;
546
+ border-radius: 999px;
547
+ border: 1px solid var(--border-strong);
548
+ background: var(--panel);
549
+ color: var(--text-secondary);
550
+ display: inline-flex;
551
+ align-items: center;
552
+ justify-content: center;
553
+ z-index: 3;
554
+ transition: color 0.15s ease, border-color 0.15s ease;
555
+ }
556
+
557
+ .thread-delete:hover {
558
+ color: var(--danger);
559
+ border-color: var(--danger);
560
+ }
561
+
562
+ .composer-textarea {
563
+ background: transparent;
564
+ resize: none;
565
+ outline: none;
566
+ line-height: 1.4;
567
+ padding-top: 7px;
568
+ padding-bottom: 9px;
569
+ /* One line by default; height grows with content in Composer.tsx */
570
+ min-height: calc(1.4em + 7px + 9px);
571
+ }
572
+
573
+ .send-button {
574
+ height: 40px;
575
+ width: 40px;
576
+ border-radius: 999px;
577
+ border: 1px solid var(--border);
578
+ background: var(--panel-2);
579
+ color: var(--text-secondary);
580
+ display: flex;
581
+ align-items: center;
582
+ justify-content: center;
583
+ transition: border 0.2s ease, background 0.2s ease, color 0.2s ease;
584
+ }
585
+
586
+ .send-button:hover {
587
+ border-color: var(--border-strong);
588
+ }
589
+
590
+ .send-button.active {
591
+ background: #ffffff;
592
+ color: #111111;
593
+ border-color: transparent;
594
+ }
595
+
596
+ .mic-button {
597
+ background: transparent;
598
+ color: var(--text-secondary);
599
+ border-color: transparent;
600
+ }
601
+
602
+ .mic-button:hover {
603
+ background: transparent;
604
+ color: var(--text-primary);
605
+ border-color: transparent;
606
+ }
607
+
608
+ .mic-button.active {
609
+ background: #ffffff;
610
+ color: #111111;
611
+ border-color: transparent;
612
+ }
613
+
614
+ .mic-button:disabled {
615
+ opacity: 0.75;
616
+ cursor: not-allowed;
617
+ }
618
+
619
+ .node-base {
620
+ border: 1px solid var(--border-strong);
621
+ border-radius: 10px;
622
+ padding: 10px 12px;
623
+ background: var(--panel-2);
624
+ font-size: 12px;
625
+ color: var(--text-primary);
626
+ width: 220px;
627
+ box-shadow: var(--shadow);
628
+ }
629
+
630
+ .node-user {
631
+ background: color-mix(in srgb, var(--accent) 20%, var(--panel-2));
632
+ border-color: color-mix(in srgb, var(--accent) 40%, var(--border-strong));
633
+ }
634
+
635
+ .node-assistant {
636
+ background: var(--panel-2);
637
+ border-color: var(--border-strong);
638
+ }
639
+
640
+ .node-system {
641
+ background: color-mix(in srgb, var(--panel-2) 80%, #9ca3af 20%);
642
+ border-color: color-mix(in srgb, var(--border-strong) 70%, #9ca3af 30%);
643
+ }
644
+
645
+ .node-active {
646
+ border-color: var(--accent);
647
+ box-shadow: 0 0 0 1px var(--accent-2);
648
+ }
649
+
650
+ .react-flow__controls button {
651
+ background: var(--panel-2) !important;
652
+ border: 1px solid var(--border) !important;
653
+ color: var(--text-primary) !important;
654
+ }
655
+
656
+ .react-flow__attribution {
657
+ display: none !important;
658
+ }
659
+
660
+ .react-flow__minimap {
661
+ background: var(--panel) !important;
662
+ }
663
+
664
+ .react-flow__background {
665
+ background: var(--bg) !important;
666
+ }
667
+
668
+ .map-shell {
669
+ margin-top: calc(-1 * var(--topbar-height));
670
+ height: calc(100% + var(--topbar-height));
671
+ }
672
+
673
+ @media (max-width: 980px) {
674
+ .chat-shell {
675
+ --mobile-sidebar-width: min(248px, 82vw);
676
+ position: relative;
677
+ }
678
+
679
+ .chat-shell {
680
+ grid-template-columns: 56px minmax(0, 1fr);
681
+ }
682
+
683
+ .sidebar {
684
+ display: block;
685
+ width: 56px;
686
+ min-width: 56px;
687
+ max-width: 56px;
688
+ position: sticky;
689
+ top: 0;
690
+ z-index: 45;
691
+ }
692
+
693
+ .chat-shell:not(.collapsed) {
694
+ grid-template-columns: 56px minmax(0, 1fr);
695
+ }
696
+
697
+ .sidebar:not(.collapsed) {
698
+ position: fixed;
699
+ left: 0;
700
+ top: 0;
701
+ width: var(--mobile-sidebar-width);
702
+ min-width: var(--mobile-sidebar-width);
703
+ max-width: var(--mobile-sidebar-width);
704
+ height: 100vh;
705
+ z-index: 60;
706
+ border-right: 1px solid var(--sidebar-border);
707
+ box-shadow: 4px 0 14px rgba(0, 0, 0, 0.16);
708
+ background: var(--sidebar);
709
+ }
710
+
711
+ .chat-shell:not(.collapsed)::after {
712
+ content: "";
713
+ position: fixed;
714
+ top: 0;
715
+ left: var(--mobile-sidebar-width);
716
+ right: 0;
717
+ bottom: 0;
718
+ background: rgba(0, 0, 0, 0.18);
719
+ pointer-events: none;
720
+ z-index: 50;
721
+ }
722
+
723
+ .chat-scroll {
724
+ padding-left: 12px;
725
+ padding-right: 12px;
726
+ }
727
+
728
+ .composer-bar {
729
+ padding-left: 12px;
730
+ padding-right: 12px;
731
+ }
732
+
733
+ .message-stack {
734
+ padding-left: 4px;
735
+ padding-right: 4px;
736
+ }
737
+
738
+ .message-card {
739
+ max-width: 88%;
740
+ }
741
+
742
+ .message-card.user {
743
+ max-width: 92%;
744
+ }
745
+ }
746
+ .model-menu {
747
+ position: absolute;
748
+ top: calc(100% + 10px);
749
+ left: 0;
750
+ min-width: 200px;
751
+ max-height: 260px;
752
+ overflow: auto;
753
+ background: var(--panel);
754
+ border: 1px solid var(--border);
755
+ border-radius: 12px;
756
+ padding: 6px;
757
+ z-index: 50;
758
+ box-shadow: var(--shadow);
759
+ }
760
+
761
+ .model-menu-item {
762
+ width: 100%;
763
+ text-align: left;
764
+ padding: 8px 10px;
765
+ border-radius: 10px;
766
+ font-size: 12px;
767
+ color: var(--text-secondary);
768
+ }
769
+
770
+ .model-menu-item:hover,
771
+ .model-menu-item.active {
772
+ background: var(--panel-2);
773
+ color: var(--text-primary);
774
+ }
775
+
776
+ .sidebar-collapsed-stack {
777
+ display: flex;
778
+ flex-direction: column;
779
+ align-items: center;
780
+ gap: 14px;
781
+ margin-top: 6px;
782
+ }
783
+
784
+ .sidebar-icon-button {
785
+ height: 38px;
786
+ width: 38px;
787
+ border-radius: 12px;
788
+ border: 1px solid var(--border);
789
+ background: var(--panel-2);
790
+ color: var(--text-secondary);
791
+ display: flex;
792
+ align-items: center;
793
+ justify-content: center;
794
+ transition: border 0.2s ease, color 0.2s ease, transform 0.2s ease;
795
+ }
796
+
797
+ .sidebar-icon-button:hover {
798
+ border-color: var(--border-strong);
799
+ color: var(--text-primary);
800
+ transform: translateY(-1px);
801
+ }
802
+ .chat-scroll {
803
+ padding-top: calc(var(--topbar-height) - 20px);
804
+ }
805
+
806
+ .chat-scroll.empty {
807
+ padding-top: var(--topbar-height);
808
+ }